diff --git a/.gitignore b/.gitignore index 9af706d0a..ed69e7013 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ experiments/ test/test_.*.py +# mrg32k3a folder (only used during mrg32k3a co-development) +mrg32k3a/ + # VS Code environment .vscode/ @@ -83,6 +86,7 @@ instance/ # Sphinx documentation docs/_build/ +docs/source/autoapi/ # PyBuilder .pybuilder/ diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7368eb2a0..af6809745 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,8 +1,7 @@ version: 2 -# Build from the docs/ directory with Sphinx sphinx: - configuration: docs/conf.py + configuration: docs/source/conf.py build: os: ubuntu-lts-latest @@ -10,4 +9,4 @@ build: python: miniconda-latest conda: - environment: environment.yml \ No newline at end of file + environment: docs/environment.yml \ No newline at end of file diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..cc50bffc6 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,36 @@ +# This CITATION.cff file was generated with cffinit. +# Visit https://bit.ly/cffinit to generate yours today! + +cff-version: 1.2.0 +title: SimOpt +version: 1.2.0 +message: >- + If you use this software, please cite it using the + metadata from this file +type: software +authors: + - given-names: David + family-names: Eckman + affiliation: Texas A&M University + email: eckman@tamu.edu + - email: sgh9@cornell.edu + given-names: Shane + family-names: Henderson + affiliation: Cornell University + - given-names: Sara + family-names: Shashaani + orcid: 'https://orcid.org/0000-0001-8515-5877' + affiliation: North Carolina State University + email: sshasha2@ncsu.edu + - given-names: Raghu + family-names: Pasupathy + email: pasupath@purdue.edu + affiliation: Purdue University +repository-code: 'https://github.com/simopt-admin/simopt' +url: 'https://simopt.org' +abstract: >- + SimOpt is a testbed of simulation-optimization problems + and solvers. Its purpose is to encourage the development + and constructive comparison of simulation-optimization + (SO) solvers (algorithms) +license: MIT diff --git a/LICENSE b/LICENSE index a211841f9..c928e0551 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2019 simopt-admin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2025 simopt-admin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 0726db1df..2b1fb2318 100644 --- a/README.md +++ b/README.md @@ -31,37 +31,59 @@ Full documentation for the source code can be found on our **[readthedocs page]( ## Getting Started ### Requirements -- Python >= 3.8 - - To check your Python version, open a terminal and run `python --version`. If you see a message along the lines of `Command not found`, then you likely don't have Python installed. If you know you have it installed but are getting a `Command not found` error, then you may need to [add Python to your PATH](https://realpython.com/add-python-to-path/). - - For new installs, [Miniconda or Anaconda](https://www.anaconda.com/download) is recommended ([read about the differences between Miniconda and Anaconda](https://docs.anaconda.com/distro-or-miniconda/)). If you already have a compatible IDE (such as VS Code), we've found that Miniconda will work fine at 1/10 of the size of Anaconda. It is ***highly recommended*** to check the box during installation to add Python/Miniconda/Anaconda to your system PATH. -- Ruby >= 2.5 (required for datafarming) - - Included on MacOS, but Windows users will need to grab it from [here](https://rubyinstaller.org/). -- `datafarming` gem < 2.0 (required for datafarming) - - This can be installed via `gem install datafarming -v 1.4` once Ruby is installed/configured. - - If experiencing issues, make sure that you are not using version 2.0 or later as those releases does not include the required files. -- Python packages for `numpy`, `scipy`, `matplotlib`, `pandas`, `seaborn`, `sphinx`, `mrg32k3a`, and `jupyter`. - - If using conda/miniconda, run `conda env create -f environment.yml` to create the `simopt` environment. Then run `conda activate simopt` to load the environment. - - Otherwise, run `pip install numpy scipy matplotlib pandas seaborn sphinx mrg32k3a jupyter`. +- [Miniconda or Anaconda](https://www.anaconda.com/download) + - If you already have a compatible IDE (such as VS Code), we've found that Miniconda will work fine at 1/10 of the size of Anaconda. Otherwise, you may need the Spyder IDE that comes with the full Anaconda distribution. +- [VS Code](https://code.visualstudio.com/download) (optional) + - This is a lightweight IDE that is compatible with Miniconda and is recommended for running the GUI +- [Git](https://git-scm.com/downloads) (optional) + - If you don't have Git installed, you can download the code as a zip file instead ### Downloading Source Code There are two ways to download a copy of the source code onto your machine: 1. Download the code in a zip file by clicking the green `<> Code` button above repo contents and clicking the `Download ZIP` option, then unzip the code to a folder on your computer. This does not require `git` to be installed but makes downloading updates to the repository more challenging. ![image](https://github.com/user-attachments/assets/3c45804c-f8b0-48ed-b32c-a443550c6ef5) -3. [Clone](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) the branch you'd like to download to a folder on your computer. This requires `git` to be installed but makes downloading updates to the repository much easier. +1. [Clone](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) the branch you'd like to download to a folder on your computer. This requires `git` to be installed but makes downloading updates to the repository much easier. If you do not need the source code for SimOpt, you may install the library as a Python package instead. See the [Package](#package) and [Basic Example](#basic-example) sections for more details about this option. The `demo` folder contains a handful of useful scripts that can be easily modified, as directed in the comments: -| File | Description | -| ---------------------------------------- | ----------- | -| `demo_model.py` | Run multiple replications of a simulation model and report its responses | -| `demo_problem.py` | Run multiple replications of a given solution for an SO problem and report its objective function values and left-hand sides of stochastic constraints | +| File | Description | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `demo_model.py` | Run multiple replications of a simulation model and report its responses | +| `demo_problem.py` | Run multiple replications of a given solution for an SO problem and report its objective function values and left-hand sides of stochastic constraints | | `demo_problem_solver.py` | Run multiple macroreplications of a solver on a problem, save the outputs to a `.pickle` file in the `experiments/outputs` folder, and save plots of the results to `.png` files in the `experiments/plots` folder | -| `demo_problems_solvers.py` | Run multiple macroreplications of groups of problem-solver pairs and save the outputs and plots | -| `demo_data_farming_model.py` | Create a design over model factors, run multiple replications at each design point, and save the results to a comma separated value (`.csv`) file in the `data_farming_experiments` folder | -| `demo_san-sscont-ironorecont_experiment` | Run multiple solvers on multiple versions of (s, S) inventory, iron ore, and stochastic activiy network problems and produce plots | +| `demo_problems_solvers.py` | Run multiple macroreplications of groups of problem-solver pairs and save the outputs and plots | +| `demo_data_farming_model.py` | Create a design over model factors, run multiple replications at each design point, and save the results to a comma separated value (`.csv`) file in the `data_farming_experiments` folder | +| `demo_san-sscont-ironorecont_experiment` | Run multiple solvers on multiple versions of (s, S) inventory, iron ore, and stochastic activiy network problems and produce plots | + +### Environment Setup + +After downloading the source code, you will need to configure the conda environment to run the code. This can be done by running the following command in the terminal: + +#### Windows (Command Prompt) +```cmd +setup_simopt.bat +``` + +#### Windows (PowerShell) +```powershell +cmd /c setup_simopt.bat +``` + +#### MacOS/Linux +```bash +chmod +x setup_simopt.sh && ./setup_simopt.sh +``` + +This script will create a new conda environment called `simopt` and install all necessary packages. To activate the environment, run the following command in the terminal: + +```bash +conda activate simopt +``` + +If you wish to update the environment with the latest compatible packages, you can simply rerun the setup script. ## Graphical User Interface (GUI) - User Guide @@ -208,18 +230,9 @@ The core development team currently consists of - [**William Grochocinski**](https://github.com/Grochocinski) (North Carolina State University) ## Citation -To cite this work, please use -``` -@misc{simoptgithub, - author = {D. J. Eckman and S. G. Henderson and S. Shashaani and R. Pasupathy}, - title = {{SimOpt}}, - year = {2024}, - publisher = {GitHub}, - journal = {GitHub repository}, - howpublished = {\url{https://github.com/simopt-admin/simopt}}, - commit = {21802a685ec394fed048820e692209628f40dd4e} -} -``` +To cite this work, please use the `CITATION.cff` file or use the built-in citation generator: +![GitHub's built-in citation generator](https://github.com/user-attachments/assets/b8b49544-eb74-469e-aa37-68c2c0c3708b) + ## Acknowledgments An earlier website for SimOpt ([http://www.simopt.org](http://www.simopt.org)) was developed through work supported by the following grants: diff --git a/demo/demo_data_farming_model.py b/demo/demo_data_farming_model.py index a693910e4..3687e1373 100644 --- a/demo/demo_data_farming_model.py +++ b/demo/demo_data_farming_model.py @@ -1,73 +1,79 @@ -""" +"""Demo for Data Farming Models. + This script is intended to help with running a data-farming experiment on a simulation model. It creates a design of model factors and runs multiple replications at each configuration of the model. Outputs are printed to a file. """ import sys -import os.path as o - -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +from pathlib import Path +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) from simopt.data_farming_base import DataFarmingExperiment -# Specify the name of the model as it appears in directory.py -model_name = "CNTNEWS" - -# Specify the names of the model factors (in order) that will be varied. -factor_headers = [ - "purchase_price", - "sales_price", - "salvage_price", - "order_quantity", -] - -# If creating the design, provide the name of a .txt file containing -# the following: -# - one row corresponding to each model factor being varied -# - three columns: -# - first column: lower bound for factor value -# - second column: upper bound for factor value -# - third column: (integer) number of digits for discretizing values -# (e.g., 0 corresponds to integral values for the factor) -# factor_settings_filename = "model_factor_settings" -factor_settings_filename = None - -# OR, if the design has been created, provide the name of a .text file -# containing the following: -# - one row corresponding to each design point -# - the number of columns equal to the number of factors being varied -# - each value in the table gives the value of the factor (col index) -# for the design point (row index) -# E.g., design_filename = "model_factor_settings_design" -# design_filename = None -design_filename = "model_factor_settings_design" - -# Specify a common number of replications to run of the model at each -# design point. -n_reps = 10 - -# Specify whether to use common random numbers across different versions -# of the model. -crn_across_design_pts = True - -# Specify filename for outputs. -output_filename = "cntnews_data_farming_output" - -# No code beyond this point needs to be edited. - -# Create DataFarmingExperiment object. -myexperiment = DataFarmingExperiment( - model_name=model_name, - factor_settings_filename=factor_settings_filename, - factor_headers=factor_headers, - design_filepath=design_filename, - model_fixed_factors={}, -) - -# Run replications and print results to file. -myexperiment.run(n_reps=n_reps, crn_across_design_pts=crn_across_design_pts) -myexperiment.print_to_csv(csv_filename=output_filename) + +def main() -> None: + """Main function to run the data farming experiment.""" + # Specify the name of the model as it appears in directory.py + model_name = "CNTNEWS" + + # Specify the names of the model factors (in order) that will be varied. + factor_headers = [ + "purchase_price", + "sales_price", + "salvage_price", + "order_quantity", + ] + + # If creating the design, provide the name of a .txt file containing + # the following: + # - one row corresponding to each model factor being varied + # - three columns: + # - first column: lower bound for factor value + # - second column: upper bound for factor value + # - third column: (integer) number of digits for discretizing values + # (e.g., 0 corresponds to integral values for the factor) + # factor_settings_filename = "model_factor_settings" + factor_settings_filename = None + + # OR, if the design has been created, provide the name of a .text file + # containing the following: + # - one row corresponding to each design point + # - the number of columns equal to the number of factors being varied + # - each value in the table gives the value of the factor (col index) + # for the design point (row index) + # E.g., design_filename = "model_factor_settings_design" + # design_filename = None + design_filename = "model_factor_settings_design" + + # Specify a common number of replications to run of the model at each + # design point. + n_reps = 10 + + # Specify whether to use common random numbers across different versions + # of the model. + crn_across_design_pts = True + + # Specify filename for outputs. + output_filename = "cntnews_data_farming_output" + + # No code beyond this point needs to be edited. + + # Create DataFarmingExperiment object. + myexperiment = DataFarmingExperiment( + model_name=model_name, + factor_settings_file_name=factor_settings_filename, + factor_headers=factor_headers, + design_path=design_filename, + model_fixed_factors={}, + ) + + # Run replications and print results to file. + myexperiment.run(n_reps=n_reps, crn_across_design_pts=crn_across_design_pts) + myexperiment.print_to_csv(csv_file_name=output_filename) + + +if __name__ == "__main__": + main() diff --git a/demo/demo_data_farming_over_solver_and_problem.py b/demo/demo_data_farming_over_solver_and_problem.py index 0bf0cbb7f..a8a1a5330 100644 --- a/demo/demo_data_farming_over_solver_and_problem.py +++ b/demo/demo_data_farming_over_solver_and_problem.py @@ -1,20 +1,21 @@ -""" +"""Demo for Data Farming over Solvers and Problems. + This script is intended to help with running a data-farming experiment on a solver. It creates a design of solver factors and runs multiple macroreplications at each version of the solver. Outputs are printed to a file. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) -from simopt.experiment_base import create_design, ProblemsSolvers +from simopt.experiment_base import ProblemsSolvers, create_design def main() -> None: + """Main function to run the data farming experiment.""" # Specify the name of the solver as it appears in directory.py solver_name = "ASTRODF" # Specify the name of the problem as it appears in directory.py @@ -37,8 +38,8 @@ def main() -> None: solver_fixed_factors = {} model_fixed_factors = {"salvage_price": 5, "Burr_c": 1} - # Provide the name of a file .txt locatated in the datafarming_experiments folder containing - # the following: + # Provide the name of a file .txt locatated in the datafarming_experiments folder + # containing the following: # - one row corresponding to each solver factor being varied # - three columns: # - first column: lower bound for factor value @@ -52,8 +53,8 @@ def main() -> None: solver_n_stacks = 1 problem_n_stacks = 1 - # Specify a common number of macroreplications of each unique solver/problem combination - # i.e., the number of runs at each design point. + # Specify a common number of macroreplications of each unique solver/problem + # combination (i.e., the number of runs at each design point.) n_macroreps = 3 # Specify the number of postreplications to take at each recommended solution diff --git a/demo/demo_data_farming_problem.py b/demo/demo_data_farming_problem.py index f1dfe2a3d..12c696521 100644 --- a/demo/demo_data_farming_problem.py +++ b/demo/demo_data_farming_problem.py @@ -1,20 +1,21 @@ -""" +"""Demo for Data Farming over Problems. + This script is intended to help with running a data-farming experiment on a problem. It creates a design of problem factors and runs multiple macroreplications at each version of the problem. Outputs are printed to a file. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) -from simopt.experiment_base import create_design, ProblemsSolvers # type:ignore +from simopt.experiment_base import ProblemsSolvers, create_design def main() -> None: + """Main function to run the data farming experiment.""" # Specify the name of the problem as it appears in directory.py problem_name = "CNTNEWS-1" # Specify the name of the model as it appears in directory.py @@ -35,15 +36,16 @@ def main() -> None: # OPTIONAL: Provide additional overrides for solver default factors. # If empty, default factor settings are used. - # list of dictionaries that provide fixed factors for problems when you don't want to use the default values - # if you want to use all default values use empty dictionary, order must match problem names + # list of dictionaries that provide fixed factors for problems when you don't want + # to use the default values. if you want to use all default values use empty + # dictionary, order must match problem names solver_fixed_factors = [{"eta_1": 0.5, "eta_2": 0.4}, {"sample_size": 15}] # uncomment this version to run w/ only default solver factors # sp;ver_fixed_factors = [{},{}] - # Provide the name of a file .txt locatated in the datafarming_experiments folder containing - # the following: + # Provide the name of a file .txt locatated in the datafarming_experiments folder + # containing the following: # - one row corresponding to each solver factor being varied # - three columns: # - first column: lower bound for factor value @@ -55,8 +57,8 @@ def main() -> None: # Specify the number stacks to use for ruby design creation problem_n_stacks = 1 - # Specify a common number of macroreplications of each unique solver/problem combination - # i.e., the number of runs at each design point. + # Specify a common number of macroreplications of each unique solver/problem + # combination (i.e., the number of runs at each design point.) n_macroreps = 3 # Specify the number of postreplications to take at each recommended solution diff --git a/demo/demo_data_farming_solver.py b/demo/demo_data_farming_solver.py index d6af54180..f36a132f9 100644 --- a/demo/demo_data_farming_solver.py +++ b/demo/demo_data_farming_solver.py @@ -1,23 +1,25 @@ -""" +"""Demo for Data Farming over Solvers. + This script is intended to help with running a data-farming experiment on a solver. It creates a design of solver factors and runs multiple macroreplications at each version of the solver. Outputs are printed to a file. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) -from simopt.experiment_base import create_design, ProblemsSolvers +from simopt.experiment_base import ProblemsSolvers, create_design def main() -> None: + """Main function to run the data farming experiment.""" # Specify the name of the solver as it appears in directory.py solver_name = "ASTRODF" - # list of problem names for solver design to be run on (if more than one version of same problem, repeat name) + # list of problem names for solver design to be run on + # (if more than one version of same problem, repeat name) # Specify the name of the problem as it appears in directory.py problem_names = ["SSCONT-1", "SAN-1"] @@ -33,14 +35,16 @@ def main() -> None: solver_fixed_factors = {} # OPTIONAL: Provide additional overrides for problem default factors. # If empty, default factor settings are used. - # list of dictionaries that provide fixed factors for problems when you don't want to use the default values - # if you want to use all default values use empty dictionary, order must match problem names + # list of dictionaries that provide fixed factors for problems when you don't want + # to use the default values. if you want to use all default values use empty + # dictionary, order must match problem names problem_fixed_factors = [ {"budget": 2000, "demand_mean": 90.0, "fixed_cost": 25}, {"budget": 500}, ] - # Provide the name of a file .txt locatated in the datafarming_experiments folder containing + # Provide the name of a file .txt locatated in the datafarming_experiments + # folder containing # the following: # - one row corresponding to each solver factor being varied # - three columns: @@ -53,8 +57,8 @@ def main() -> None: # Specify the number stacks to use for ruby design creation solver_n_stacks = 1 - # Specify a common number of macroreplications of each unique solver/problem combination - # i.e., the number of runs at each design point. + # Specify a common number of macroreplications of each unique solver/problem + # combination (i.e., the number of runs at each design point.) n_macroreps = 3 # Specify the number of postreplications to take at each recommended solution diff --git a/demo/demo_load_solver_design.py b/demo/demo_load_solver_design.py index fe06e3998..6007ed98b 100644 --- a/demo/demo_load_solver_design.py +++ b/demo/demo_load_solver_design.py @@ -1,35 +1,44 @@ -""" +"""Demo for Loading Solver Design Points. + This script is intended to help with loading a design of solver factors -to run on one or more problems. If more than one problem are used a cross-design of problems -will be run. The design file should be a txt or csv file with headers as factor names and each row -representing an individual design point. Design files generated by the simopt GUI can also be run -using this script. Outputs are printed to the experiments folder in simopt. +to run on one or more problems. If more than one problem are used a cross-design of +problems will be run. The design file should be a txt or csv file with headers as +factor names and each row representing an individual design point. Design files +generated by the simopt GUI can also be run using this script. Outputs are printed to +the experiments folder in simopt. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) +import pandas as pd +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) from simopt.experiment_base import ProblemsSolvers -import pandas as pd def main() -> None: + """Main function to run the data farming experiment.""" # run this script in the terminal from the simopt directory - solver_name = "RNDSRCH" # name of solver that design was created on + # name of solver that design was created on + solver_name = "RNDSRCH" + # list of problem names for solver design to be run on + # (if more than one version of same problem, repeat name) problem_names = [ "SSCONT-1", "SAN-1", - ] # list of problem names for solver design to be run on (if more than one version of same problem, repeat name) + ] - # name of file containing design points (csv or excel): column headers must exactly match names of solver factors w/ each row representing a design point (can also use csv's generated by GUI) - design_filename = ".\data_farming_experiments\RNDSRCH_design.csv" + # name of file containing design points (csv or excel): column headers must exactly + # match names of solver factors w/ each row representing a design point + # (can also use csv's generated by GUI) + design_filename = Path("data_farming_experiments", "RNDSRCH_design.csv") - # list of dictionaries that provide fixed factors for problems when you don't want to use the default values, if you want to use all default values use empty dictionary, order must match problem names + # list of dictionaries that provide fixed factors for problems when you don't want + # to use the default values, if you want to use all default values use empty + # dictionary, order must match problem names problem_fixed_factors = [ {"budget": 2000, "demand_mean": 90.0, "fixed_cost": 25}, {"budget": 500}, @@ -38,22 +47,25 @@ def main() -> None: # uncomment this version to run w/ only default problem factors # problem_fixed_factors = [{},{}] - solver_fixed_factors = {} # use this dictionary to change any default solver factors that were not included in the design + # use this dictionary to change any default solver factors that were not included + # in the design + solver_fixed_factors = {} - n_macroreps = ( - 2 # number of macroreplication to run and each solver design point - ) - n_postreps = ( - 100 # number of post replications to run on each macro replication - ) - n_postreps_init_opt = 200 # number of normalization postreplications to run at initial solution and optimal solution + # number of macroreplication to run and each solver design point + n_macroreps = 2 + # number of post replications to run on each macro replication + n_postreps = 100 + # number of normalization postreplications to run at initial solution and optimal + # solution + n_postreps_init_opt = 200 # turn design file into df & retrive dp information design_table = pd.read_csv(design_filename) design_factor_names = design_table.columns.tolist() - # remove GUI columns from list if present (ignore if not using design files generated by GUI) + # remove GUI columns from list if present (ignore if not using design files + # generated by GUI) design_factor_names.remove("Design #") design_factor_names.remove("Solver Name") design_factor_names.remove("Design Type") diff --git a/demo/demo_model.py b/demo/demo_model.py index 54e792a83..92a5e3015 100644 --- a/demo/demo_model.py +++ b/demo/demo_model.py @@ -1,68 +1,71 @@ -""" +"""Demo for Model Debugging. + This script is intended to help with debugging a model. It imports a model, initializes a model object with given factors, sets up pseudorandom number generators, and runs one or more replications. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) # Import random number generator. from mrg32k3a.mrg32k3a import MRG32k3a -# Import model. - -# from models. import -# Replace with name of .py file containing model class. -# Replace with name of model class. - -# Fix factors of model. Specify a dictionary of factors. - -# fixed_factors = {} # Resort to all default values. -# Look at Model class definition to get names of factors. -# Initialize an instance of the specified model class. +def main() -> None: + """Main function to run the data farming experiment.""" + # Import model. + # from models. import + # Replace with name of .py file containing model class. + # Replace with name of model class. + # Fix factors of model. Specify a dictionary of factors. + # fixed_factors = {} # Resort to all default values. + # Look at Model class definition to get names of factors. + # Initialize an instance of the specified model class. + # mymodel = (fixed_factors) + # Replace with name of model class. + # Working example for MM1 model. + # ----------------------------------------------- + from simopt.models.mm1queue import MM1Queue -# mymodel = (fixed_factors) -# Replace with name of model class. + fixed_factors = {"lambda": 3.0, "mu": 8.0} + mymodel = MM1Queue(fixed_factors=fixed_factors) + # ----------------------------------------------- -# Working example for MM1 model. -# ----------------------------------------------- -from simopt.models.mm1queue import MM1Queue + # The rest of this script requires no changes. -fixed_factors = {"lambda": 3.0, "mu": 8.0} -mymodel = MM1Queue(fixed_factors) -# ----------------------------------------------- - -# The rest of this script requires no changes. - -# Check that all factors describe a simulatable model. -# Check fixed factors individually. -for key, value in mymodel.factors.items(): + # Check that all factors describe a simulatable model. + # Check fixed factors individually. + for key, value in mymodel.factors.items(): + print( + f"The factor {key} is set as {value}. " + f"Is this simulatable? {bool(mymodel.check_simulatable_factor(key))}." + ) + # Check all factors collectively. print( - f"The factor {key} is set as {value}. Is this simulatable? {bool(mymodel.check_simulatable_factor(key))}." + "Is the specified model simulatable? " + f"{bool(mymodel.check_simulatable_factors())}." ) -# Check all factors collectively. -print( - f"Is the specified model simulatable? {bool(mymodel.check_simulatable_factors())}." -) -# Create a list of RNG objects for the simulation model to use when -# running replications. -rng_list = [MRG32k3a(s_ss_sss_index=[0, ss, 0]) for ss in range(mymodel.n_rngs)] + # Create a list of RNG objects for the simulation model to use when + # running replications. + rng_list = [MRG32k3a(s_ss_sss_index=[0, ss, 0]) for ss in range(mymodel.n_rngs)] + + # Run a single replication of the model. + responses, gradients = mymodel.replicate(rng_list) + print("\nFor a single replication:") + print("\nResponses:") + for key, value in responses.items(): + print(f"\t {key} is {value}.") + print("\n Gradients:") + for outerkey in gradients: + print(f"\tFor the response {outerkey}:") + for innerkey, value in gradients[outerkey].items(): + print(f"\t\tThe gradient w.r.t. {innerkey} is {value}.") + -# Run a single replication of the model. -responses, gradients = mymodel.replicate(rng_list) -print("\nFor a single replication:") -print("\nResponses:") -for key, value in responses.items(): - print(f"\t {key} is {value}.") -print("\n Gradients:") -for outerkey in gradients: - print(f"\tFor the response {outerkey}:") - for innerkey, value in gradients[outerkey].items(): - print(f"\t\tThe gradient w.r.t. {innerkey} is {value}.") +if __name__ == "__main__": + main() diff --git a/demo/demo_plots.py b/demo/demo_plots.py index d9e1546fe..ce8d88f97 100644 --- a/demo/demo_plots.py +++ b/demo/demo_plots.py @@ -1,98 +1,98 @@ -""" +"""Demo Plotting Script. + This script is intended to help with debugging problems and solvers. It create a problem-solver pairing (using the directory) and runs multiple macroreplications of the solver on the problem. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) # Import the ProblemSolver class and other useful functions from simopt.experiment_base import ( + PlotType, ProblemSolver, - read_experiment_results, - post_normalize, plot_terminal_progress, + post_normalize, + read_experiment_results, ) -solver_names = {"RNDSRCH", "ASTRODF", "NELDMD"} -problem_names = {"SAN-1"} # CNTNEWS-1"} #, "SAN-1"} -# solver_name = "RNDSRCH" # Random search solver -# problem_name = "CNTNEWS-1" # Continuous newsvendor problem -# solver_name = -# problem_name = -for problem_name in problem_names: - problem_experiments = [] - for solver_name in solver_names: - print(f"Testing solver {solver_name} on problem {problem_name}.") - # Initialize an instance of the experiment class. - myexperiment = ProblemSolver(solver_name, problem_name) - - file_name_path = ( - "experiments/outputs/" - + solver_name - + "_on_" - + problem_name - + ".pickle" - ) - - # Run a fixed number of macroreplications of the solver on the problem. - # myexperiment.run(n_macroreps=10) - - # If the solver runs have already been performed, uncomment the - # following pair of lines (and uncommmen the myexperiment.run(...) - # line above) to read in results from a .pickle file. - myexperiment = read_experiment_results(file_name_path) - - print("Post-processing results.") - # Run a fixed number of postreplications at all recommended solutions. - myexperiment.post_replicate(n_postreps=200) - - problem_experiments.append(myexperiment) - - # Find an optimal solution x* for normalization. - post_normalize(problem_experiments, n_postreps_init_opt=200) - -# Re-compile problem-solver results. -myexperiments = [] -for solver_name in solver_names: - # solver_experiments = [] +def main() -> None: + """Main function to run the data farming experiment.""" + solver_names = {"RNDSRCH", "ASTRODF", "NELDMD"} + problem_names = {"SAN-1"} # CNTNEWS-1"} #, "SAN-1"} + # solver_name = "RNDSRCH" # Random search solver + # problem_name = "CNTNEWS-1" # Continuous newsvendor problem + # solver_name = + # problem_name = + for problem_name in problem_names: - file_name_path = ( - "experiments/outputs/" - + solver_name - + "_on_" - + problem_name - + ".pickle" - ) - myexperiment = read_experiment_results(file_name_path) - myexperiments.append(myexperiment) -# solver_experiments.append(myexperiment) -# myexperiments.append(solver_experiments) - -print("Plotting results.") -# Produce basic plots. -plot_terminal_progress( - experiments=myexperiments, plot_type="box", normalize=False -) -plot_terminal_progress( - experiments=myexperiments, plot_type="box", normalize=True -) -plot_terminal_progress( - experiments=myexperiments, - plot_type="violin", - normalize=False, - all_in_one=False, -) -plot_terminal_progress( - experiments=myexperiments, plot_type="violin", normalize=True -) -# plot_terminal_scatterplots(experiments = myexperiments, all_in_one=False) + problem_experiments = [] + for solver_name in solver_names: + print(f"Testing solver {solver_name} on problem {problem_name}.") + # Initialize an instance of the experiment class. + myexperiment = ProblemSolver(solver_name, problem_name) + + file_name_path = ( + "experiments/outputs/" + solver_name + "_on_" + problem_name + ".pickle" + ) + + # Run a fixed number of macroreplications of the solver on the problem. + # myexperiment.run(n_macroreps=10) + + # If the solver runs have already been performed, uncomment the + # following pair of lines (and uncommmen the myexperiment.run(...) + # line above) to read in results from a .pickle file. + myexperiment = read_experiment_results(file_name_path) + + print("Post-processing results.") + # Run a fixed number of postreplications at all recommended solutions. + myexperiment.post_replicate(n_postreps=200) + + problem_experiments.append(myexperiment) + + # Find an optimal solution x* for normalization. + post_normalize(problem_experiments, n_postreps_init_opt=200) + + # Re-compile problem-solver results. + myexperiments = [] + for solver_name in solver_names: + # solver_experiments = [] + for problem_name in problem_names: + file_name_path = ( + "experiments/outputs/" + solver_name + "_on_" + problem_name + ".pickle" + ) + myexperiment = read_experiment_results(file_name_path) + myexperiments.append(myexperiment) + # solver_experiments.append(myexperiment) + # myexperiments.append(solver_experiments) + + print("Plotting results.") + # Produce basic plots. + plot_terminal_progress( + experiments=myexperiments, plot_type=PlotType.BOX, normalize=False + ) + plot_terminal_progress( + experiments=myexperiments, plot_type=PlotType.BOX, normalize=True + ) + plot_terminal_progress( + experiments=myexperiments, + plot_type=PlotType.VIOLIN, + normalize=False, + all_in_one=False, + ) + plot_terminal_progress( + experiments=myexperiments, plot_type=PlotType.VIOLIN, normalize=True + ) + # plot_terminal_scatterplots(experiments = myexperiments, all_in_one=False) + + # Plots will be saved in the folder experiments/plots. + print("Finished. Plots can be found in experiments/plots folder.") + -# Plots will be saved in the folder experiments/plots. -print("Finished. Plots can be found in experiments/plots folder.") +if __name__ == "__main__": + main() diff --git a/demo/demo_problem.py b/demo/demo_problem.py index a4cd58298..5755d10cb 100644 --- a/demo/demo_problem.py +++ b/demo/demo_problem.py @@ -1,4 +1,5 @@ -""" +"""Demo script for the Problem class. + This script is intended to help with debugging a problem. It imports a problem, initializes a problem object with given factors, sets up pseudorandom number generators, and runs multiple replications @@ -6,11 +7,10 @@ """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) # Import random number generator. from mrg32k3a.mrg32k3a import MRG32k3a @@ -18,96 +18,105 @@ # Import the Solution class. from simopt.base import Solution -# Import problem. - -# from models. import -# Replace with name of .py file containing problem class. -# Replace with name of problem class. - -# Fix factors of problem. Specify a dictionary of factors. - -# fixed_factors = {} # Resort to all default values. -# Look at Problem class definition to get names of factors. - -# Initialize an instance of the specified problem class. - -# myproblem = (fixed_factors=fixed_factors) -# Replace with name of problem class. - -# Initialize a solution x corresponding to the problem. - -# x = (,) -# Look at the Problem class definition to identify the decision variables. -# x will be a tuple consisting of the decision variables. - -# The following line does not need to be changed. -# mysolution = Solution(x, myproblem) - -# Working example for CntNVMaxProfit problem. -# ----------------------------------------------- -from simopt.models.cntnv import CntNVMaxProfit - -fixed_factors = {"initial_solution": (2,), "budget": 500} -myproblem = CntNVMaxProfit(fixed_factors=fixed_factors) -x = (3,) -mysolution = Solution(x, myproblem) -# ----------------------------------------------- -# Another working example for FacilitySizingTotalCost problem. (Commented out) -# This example has stochastic constraints. -# ----------------------------------------------- -# from models.facilitysizing import FacilitySizingTotalCost -# fixed_factors = {"epsilon": 0.1} -# myproblem = FacilitySizingTotalCost(fixed_factors=fixed_factors) -# x = (200, 200, 200) -# mysolution = Solution(x, myproblem) -# ----------------------------------------------- - - -# The rest of this script requires no changes. - -# Create and attach rngs to solution -rng_list = [ - MRG32k3a(s_ss_sss_index=[0, ss, 0]) for ss in range(myproblem.model.n_rngs) -] -mysolution.attach_rngs(rng_list, copy=False) - -# Simulate a fixed number of replications (n_reps) at the solution x. -n_reps = 10 -myproblem.simulate(mysolution, num_macroreps=n_reps) - -# Print results to console. -print( - f"Ran {n_reps} replications of the {myproblem.name} problem at solution x = {x}.\n" -) -print( - f"The mean objective estimate was {round(mysolution.objectives_mean[0], 4)} with standard error {round(mysolution.objectives_stderr[0], 4)}." -) -print("The individual observations of the objective were:") -for idx in range(n_reps): - print(f"\t {round(mysolution.objectives[idx][0], 4)}") -if myproblem.gradient_available: +def main() -> None: + """Main function to run the data farming experiment.""" + # Import problem. + # from models. import + # Replace with name of .py file containing problem class. + # Replace with name of problem class. + # Fix factors of problem. Specify a dictionary of factors. + # fixed_factors = {} # Resort to all default values. + # Look at Problem class definition to get names of factors. + # Initialize an instance of the specified problem class. + # myproblem = (fixed_factors=fixed_factors) + # Replace with name of problem class. + # Initialize a solution x corresponding to the problem. + # x = (,) + # Look at the Problem class definition to identify the decision variables. + # x will be a tuple consisting of the decision variables. + # The following line does not need to be changed. + # mysolution = Solution(x, myproblem) + # Working example for CntNVMaxProfit problem. + # ----------------------------------------------- + from simopt.models.cntnv import CntNVMaxProfit + + fixed_factors = {"initial_solution": (2,), "budget": 500} + myproblem = CntNVMaxProfit(fixed_factors=fixed_factors) + x = (3,) + mysolution = Solution(x, myproblem) + # ----------------------------------------------- + + # Another working example for FacilitySizingTotalCost problem. (Commented out) + # This example has stochastic constraints. + # ----------------------------------------------- + # from models.facilitysizing import FacilitySizingTotalCost + # fixed_factors = {"epsilon": 0.1} + # myproblem = FacilitySizingTotalCost(fixed_factors=fixed_factors) + # x = (200, 200, 200) + # mysolution = Solution(x, myproblem) + # ----------------------------------------------- + + # The rest of this script requires no changes. + + # Create and attach rngs to solution + rng_list = [ + MRG32k3a(s_ss_sss_index=[0, ss, 0]) for ss in range(myproblem.model.n_rngs) + ] + mysolution.attach_rngs(rng_list, copy=False) + + # Simulate a fixed number of replications (n_reps) at the solution x. + n_reps = 10 + myproblem.simulate(mysolution, num_macroreps=n_reps) + + # Print results to console. print( - "\nThe individual observations of the gradients of the objective were:" + f"Ran {n_reps} replications of the {myproblem.name} problem " + f"at solution x = {x}.\n" ) - for idx in range(n_reps): - print( - f"\t {[round(g, 4) for g in mysolution.objectives_gradients[idx][0]]}" - ) -else: - print("\nThis problem has no known gradients.") -if myproblem.n_stochastic_constraints > 0: + obj_mean = round(mysolution.objectives_mean[0], 4) + obj_stderr = round(mysolution.objectives_stderr[0], 4) print( - f"\nThis problem has {myproblem.n_stochastic_constraints} stochastic constraints of the form E[LHS] <= 0." + f"The mean objective estimate was {obj_mean} with standard error {obj_stderr}." ) - for stc_idx in range(myproblem.n_stochastic_constraints): + print("The individual observations of the objective were:") + for idx in range(n_reps): + print(f"\t {round(mysolution.objectives[idx][0], 4)}") + if myproblem.gradient_available: + print("\nThe individual observations of the gradients of the objective were:") + for idx in range(n_reps): + grads = mysolution.objectives_gradients[idx][0] + print(f"\t {[round(g, 4) for g in grads]}") + else: + print("\nThis problem has no known gradients.") + if myproblem.n_stochastic_constraints > 0: print( - f"\tFor stochastic constraint #{stc_idx + 1}, the mean of the LHS was {round(mysolution.stoch_constraints_mean[stc_idx], 4)} with standard error {round(mysolution.stoch_constraints_stderr[stc_idx], 4)}." + f"\nThis problem has {myproblem.n_stochastic_constraints} stochastic " + "constraints of the form E[LHS] <= 0." ) - print("\tThe observations of the LHSs were:") - for idx in range(n_reps): + for stc_idx in range(myproblem.n_stochastic_constraints): + stoch_const_mean = mysolution.stoch_constraints_mean[stc_idx] + stoch_const_mean_round = round(stoch_const_mean, 4) + stoch_const_stderr = mysolution.stoch_constraints_stderr[stc_idx] + stoch_const_stderr_round = round(stoch_const_stderr, 4) print( - f"\t\t {round(mysolution.stoch_constraints[idx][stc_idx], 4)}" + f"\tFor stochastic constraint #{stc_idx + 1}, " + f"the mean of the LHS was {stoch_const_mean_round} " + f"with standard error {stoch_const_stderr_round}." ) -else: - print("\nThis problem has no stochastic constraints.") + print("\tThe observations of the LHSs were:") + for idx in range(n_reps): + # Quick check to make sure the stochastic constraints are not None. + if mysolution.stoch_constraints is None: + error_msg = "Stochastic constraints should not be None." + raise ValueError(error_msg) + # Print out the current stochastic constraint value. + stoch_const = mysolution.stoch_constraints[stc_idx][idx] + stoch_const_round = round(stoch_const, 4) + print(f"\t\t {stoch_const_round}") + else: + print("\nThis problem has no stochastic constraints.") + + +if __name__ == "__main__": + main() diff --git a/demo/demo_problem_solver.py b/demo/demo_problem_solver.py index 70af5fd6e..ba704895f 100644 --- a/demo/demo_problem_solver.py +++ b/demo/demo_problem_solver.py @@ -1,26 +1,28 @@ -""" +"""Demo script for the ProblemSolver class. + This script is intended to help with debugging problems and solvers. It create a problem-solver pairing (using the directory) and runs multiple macroreplications of the solver on the problem. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) # Import the ProblemSolver class and other useful functions from simopt.experiment_base import ( + PlotType, ProblemSolver, - post_normalize, plot_progress_curves, plot_solvability_cdfs, + post_normalize, ) def main() -> None: + """Main function to run the demo script.""" # !! When testing a new solver/problem, first go to directory.py. # There you should add the import statement and an entry in the respective # dictionary (or dictionaries). @@ -68,14 +70,14 @@ def main() -> None: print("Plotting results.") # Produce basic plots of the solver on the problem. plot_progress_curves( - experiments=[myexperiment], plot_type="all", normalize=False + experiments=[myexperiment], plot_type=PlotType.ALL, normalize=False ) plot_progress_curves( - experiments=[myexperiment], plot_type="mean", normalize=False + experiments=[myexperiment], plot_type=PlotType.MEAN, normalize=False ) plot_progress_curves( experiments=[myexperiment], - plot_type="quantile", + plot_type=PlotType.QUANTILE, beta=0.90, normalize=False, ) diff --git a/demo/demo_problems_solvers.py b/demo/demo_problems_solvers.py index c4e218b9f..3e583cbcc 100644 --- a/demo/demo_problems_solvers.py +++ b/demo/demo_problems_solvers.py @@ -1,21 +1,22 @@ -""" +"""Demo for the ProblemsSolvers class. + This script is intended to help with debugging problems and solvers. It create problem-solver groups (using the directory) and runs multiple macroreplications of each problem-solver pair. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) # Import the ProblemsSolvers class and other useful functions -from simopt.experiment_base import ProblemsSolvers, plot_solvability_profiles +from simopt.experiment_base import PlotType, ProblemsSolvers, plot_solvability_profiles def main() -> None: + """Main function to run the demo script.""" # !! When testing a new solver/problem, first go to directory.py. # There you should add the import statement and an entry in the respective # dictionary (or dictionaries). @@ -47,7 +48,7 @@ def main() -> None: print("Plotting results.") # Produce basic plots of the solvers on the problems. plot_solvability_profiles( - experiments=mymetaexperiment.experiments, plot_type="cdf_solvability" + experiments=mymetaexperiment.experiments, plot_type=PlotType.CDF_SOLVABILITY ) # Plots will be saved in the folder experiments/plots. diff --git a/demo/demo_san-sscont-ironorecont_experiment.py b/demo/demo_san-sscont-ironorecont_experiment.py index f1ba9a708..a8e7a6449 100644 --- a/demo/demo_san-sscont-ironorecont_experiment.py +++ b/demo/demo_san-sscont-ironorecont_experiment.py @@ -1,4 +1,5 @@ -""" +"""Demo for an Experiment with SAN, SSCONT, and IRONORECONT problems. + This script is intended to help with a large experiment with 5 solvers (two versions of random search, ASTRO-DF, STRONG, and Nelder-Mead) and 60 problems (20 unique instances of problems from @@ -7,26 +8,27 @@ """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) from simopt.experiment_base import ( + PlotType, ProblemSolver, plot_area_scatterplots, - post_normalize, plot_progress_curves, plot_solvability_cdfs, - read_experiment_results, plot_solvability_profiles, - plot_terminal_scatterplots, plot_terminal_progress, + plot_terminal_scatterplots, + post_normalize, + read_experiment_results, ) def main() -> None: + """Main function to run the demo script.""" # Problems factors used in experiments # SAN all_random_costs = [ @@ -181,7 +183,8 @@ def main() -> None: problem_fixed_factors = {"budget": 1000} problem_rename = f"IRONORECONT-1_sd={sd}_hc={hc}_inv={inv}" - # Temporarily store experiments on the same problem for post-normalization. + # Temporarily store experiments on the same problem for + # post-normalization. experiments_same_problem = [] solver_fixed_factors = {} for solver in solvers: @@ -272,7 +275,10 @@ def main() -> None: f"experiments/outputs/{file_name}.pickle" ) # Rename problem to produce nicer plot labels. - new_experiment.problem.name = rf"{problem}-1 with $\mu_D={round(dm)}$ and $\mu_L={round(lm)}$" + new_experiment.problem.name = ( + f"{problem}-1 with " + rf"$\mu_D={round(dm)}$ and $\mu_L={round(lm)}$" + ) new_experiment.solver.name = solver_display experiments_same_solver.append(new_experiment) @@ -281,16 +287,17 @@ def main() -> None: for sd in st_devs: for hc in holding_costs: for inv in inven_stops: - problem_rename = ( - f"{problem}-1_sd={sd}_hc={hc}_inv={inv}" - ) + problem_rename = f"{problem}-1_sd={sd}_hc={hc}_inv={inv}" file_name = f"{solver}_on_{problem_rename}" # Load experiment. new_experiment = read_experiment_results( f"experiments/outputs/{file_name}.pickle" ) # Rename problem to produce nicer plot labels. - new_experiment.problem.name = rf"{problem}-1 with $\sigma={sd}$ and hc={hc} and inv={inv}" + new_experiment.problem.name = ( + f"{problem}-1 with " + rf"$\sigma={sd}$ and hc={hc} and inv={inv}" + ) new_experiment.solver.name = solver_display experiments_same_solver.append(new_experiment) @@ -306,7 +313,7 @@ def main() -> None: plot_solvability_profiles( experiments, - plot_type="cdf_solvability", + plot_type=PlotType.CDF_SOLVABILITY, solve_tol=alpha, all_in_one=True, plot_conf_ints=enable_confidence_intervals, @@ -314,7 +321,7 @@ def main() -> None: ) plot_solvability_profiles( experiments, - plot_type="quantile_solvability", + plot_type=PlotType.QUANTILE_SOLVABILITY, solve_tol=alpha, beta=0.5, all_in_one=True, @@ -323,7 +330,7 @@ def main() -> None: ) plot_solvability_profiles( experiments=experiments, - plot_type="diff_cdf_solvability", + plot_type=PlotType.DIFF_CDF_SOLVABILITY, solve_tol=alpha, ref_solver="ASTRO-DF", all_in_one=True, @@ -332,7 +339,7 @@ def main() -> None: ) plot_solvability_profiles( experiments=experiments, - plot_type="diff_quantile_solvability", + plot_type=PlotType.DIFF_QUANTILE_SOLVABILITY, solve_tol=alpha, beta=0.5, ref_solver="ASTRO-DF", @@ -351,36 +358,42 @@ def main() -> None: for i in range(n_problems): plot_progress_curves( [experiments[solver_idx][i] for solver_idx in range(n_solvers)], - plot_type="mean", + plot_type=PlotType.MEAN, all_in_one=True, plot_conf_ints=enable_confidence_intervals, print_max_hw=True, ) plot_terminal_progress( [experiments[solver_idx][i] for solver_idx in range(n_solvers)], - plot_type="violin", + plot_type=PlotType.VIOLIN, normalize=True, all_in_one=True, ) - # plot_solvability_cdfs([experiments[solver_idx][i] for solver_idx in range(n_solvers)], solve_tol=0.2, all_in_one=True, plot_CIs=True, print_max_hw=True) + # plot_solvability_cdfs( + # [experiments[solver_idx][i] for solver_idx in range(n_solvers)], + # solve_tol=0.2, + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=True, + # ) # Plots for mu_D = 400 and mu_L = 6 (appreared in the paper) plot_progress_curves( [experiments[solver_idx][0] for solver_idx in range(n_solvers)], - plot_type="all", + plot_type=PlotType.ALL, all_in_one=True, ) plot_progress_curves( [experiments[solver_idx][0] for solver_idx in range(3, 4)], - plot_type="all", + plot_type=PlotType.ALL, all_in_one=True, normalize=False, ) plot_progress_curves( [experiments[solver_idx][0] for solver_idx in range(n_solvers)], - plot_type="mean", + plot_type=PlotType.ALL, all_in_one=True, plot_conf_ints=True, print_max_hw=False, @@ -388,9 +401,7 @@ def main() -> None: ) plot_solvability_cdfs( - experiments=[ - experiments[solver_idx][0] for solver_idx in range(n_solvers) - ], + experiments=[experiments[solver_idx][0] for solver_idx in range(n_solvers)], solve_tol=0.2, all_in_one=True, plot_conf_ints=True, @@ -399,7 +410,7 @@ def main() -> None: plot_terminal_progress( [experiments[solver_idx][0] for solver_idx in range(n_solvers)], - plot_type="violin", + plot_type=PlotType.VIOLIN, normalize=False, all_in_one=True, ) diff --git a/demo/demo_sscont_experiment.py b/demo/demo_sscont_experiment.py index 6413c8a20..9b5947bbc 100644 --- a/demo/demo_sscont_experiment.py +++ b/demo/demo_sscont_experiment.py @@ -4,25 +4,26 @@ """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) from simopt.experiment_base import ( + PlotType, ProblemSolver, plot_area_scatterplots, - post_normalize, plot_progress_curves, - read_experiment_results, plot_solvability_profiles, - plot_terminal_scatterplots, plot_terminal_progress, + plot_terminal_scatterplots, + post_normalize, + read_experiment_results, ) def main() -> None: + """Main function to run the demo script.""" # Default values of the (s, S) model: # "demand_mean": 100.0 # "lead_mean": 6.0 @@ -150,7 +151,9 @@ def main() -> None: ) # Rename problem and solver to produce nicer plot labels. new_experiment.solver.name = f"RS{rs_ss}" - new_experiment.problem.name = rf"SSCONT-1 with $\mu_D={round(dm)}$ and $\mu_L={round(lm)}$" + new_experiment.problem.name = ( + rf"SSCONT-1 with $\mu_D={round(dm)}$ and $\mu_L={round(lm)}$" + ) experiments_same_solver.append(new_experiment) experiments.append(experiments_same_solver) # Load ASTRO-DF results. @@ -217,7 +220,7 @@ def main() -> None: ) plot_solvability_profiles( experiments, - plot_type="cdf_solvability", + plot_type=PlotType.CDF_SOLVABILITY, solve_tol=0.1, all_in_one=True, plot_conf_ints=True, @@ -225,7 +228,7 @@ def main() -> None: ) plot_solvability_profiles( experiments, - plot_type="quantile_solvability", + plot_type=PlotType.QUANTILE_SOLVABILITY, solve_tol=0.1, beta=0.5, all_in_one=True, @@ -234,7 +237,7 @@ def main() -> None: ) plot_solvability_profiles( experiments=experiments, - plot_type="diff_cdf_solvability", + plot_type=PlotType.DIFF_CDF_SOLVABILITY, solve_tol=0.1, ref_solver="ASTRO-DF", all_in_one=True, @@ -243,7 +246,7 @@ def main() -> None: ) plot_solvability_profiles( experiments=experiments, - plot_type="diff_quantile_solvability", + plot_type=PlotType.DIFF_QUANTILE_SOLVABILITY, solve_tol=0.1, beta=0.5, ref_solver="ASTRO-DF", @@ -256,7 +259,7 @@ def main() -> None: for i in range(n_problems): plot_progress_curves( [experiments[solver_idx][i] for solver_idx in range(n_solvers)], - plot_type="mean", + plot_type=PlotType.MEAN, all_in_one=True, plot_conf_ints=True, print_max_hw=True, @@ -264,127 +267,154 @@ def main() -> None: ) plot_terminal_progress( [experiments[solver_idx][i] for solver_idx in range(n_solvers)], - plot_type="violin", + plot_type=PlotType.VIOLIN, normalize=True, all_in_one=True, ) - # from math import exp, log, sqrt - # import numpy as np + # from math import log, sqrt # import matplotlib.pyplot as plt + # import numpy as np # for mu_d in demand_means: # for mu_l in lead_means: - # lq = mu_d*mu_l/3 - # uq = mu_d*mu_l+2*sqrt(2*mu_d**2*mu_l) - # mu = (log(lq)+log(uq))/2 - # sigma = (log(uq)-mu)/1.96 - # print(round(mu_d,0), round(mu_l,0), round(lq,2), round(uq,2), round(mu,2), round(sigma,2)) + # lq = mu_d * mu_l / 3 + # uq = mu_d * mu_l + 2 * sqrt(2 * mu_d**2 * mu_l) + # mu = (log(lq) + log(uq)) / 2 + # sigma = (log(uq) - mu) / 1.96 + # print( + # round(mu_d, 0), + # round(mu_l, 0), + # round(lq, 2), + # round(uq, 2), + # round(mu, 2), + # round(sigma, 2), + # ) # s = np.random.lognormal(mu, sigma, 1000) - # plt.hist(s, density=True, alpha=0.5, label=str(round(mu_d,0))+','+str(round(mu_l,0)), bins=50, color='blue') - # plt.axvline(lq,color='red') - # plt.axvline(uq,color='red') - # plt.axis('tight') + # plt.hist( + # s, + # density=True, + # alpha=0.5, + # label=str(round(mu_d, 0)) + "," + str(round(mu_l, 0)), + # bins=50, + # color="blue", + # ) + # plt.axvline(lq, color="red") + # plt.axvline(uq, color="red") + # plt.axis("tight") # plt.legend() # plt.show() # # Mean progress curves from all solvers on one problem. Problem instance 0. - # plot_progress_curves(experiments=[experiments[solver_idx][0] for solver_idx in range(n_solvers)], - # plot_type="mean", - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False - # ) + # plot_progress_curves( + # experiments=[experiments[solver_idx][0] for solver_idx in range(n_solvers)], + # plot_type="mean", + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # ) # # Mean progress curves from all solvers on one problem. Problem instance 22. - # plot_progress_curves(experiments=[experiments[solver_idx][22] for solver_idx in range(n_solvers)], - # plot_type="mean", - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False - # ) - - # # Plot 0.9-quantile progress curves from all solvers on one problem. Problem instance 0. - # plot_progress_curves(experiments=[experiments[solver_idx][0] for solver_idx in range(n_solvers)], - # plot_type="quantile", - # beta=0.9, - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False - # ) - - # # Plot 0.9-quantile progress curves from all solvers on one problem. Problem instance 22. - # plot_progress_curves(experiments=[experiments[solver_idx][22] for solver_idx in range(n_solvers)], - # plot_type="quantile", - # beta=0.9, - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False - # ) - - # # Plot cdf of 0.2-solve times for all solvers on one problem. Problem instance 0. - # plot_solvability_cdfs(experiments=[experiments[solver_idx][0] for solver_idx in range(n_solvers)], - # solve_tol=0.2, - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False - # ) - - # # Plot cdf of 0.2-solve times for all solvers on one problem. Problem instance 22. - # plot_solvability_cdfs(experiments=[experiments[solver_idx][22] for solver_idx in range(n_solvers)], - # solve_tol=0.2, - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False - # ) + # plot_progress_curves( + # experiments=[experiments[solver_idx][22] for solver_idx in range(n_solvers)], + # plot_type="mean", + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # ) + + # # Plot 0.9-quantile progress curves from all solvers on one problem. + # # Problem instance 0. + # plot_progress_curves( + # experiments=[experiments[solver_idx][0] for solver_idx in range(n_solvers)], + # plot_type="quantile", + # beta=0.9, + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # ) + + # # Plot 0.9-quantile progress curves from all solvers on one problem. + # # Problem instance 22. + # plot_progress_curves( + # experiments=[experiments[solver_idx][22] for solver_idx in range(n_solvers)], + # plot_type="quantile", + # beta=0.9, + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # ) + + # # Plot cdf of 0.2-solve times for all solvers on one problem. + # # Problem instance 0. + # plot_solvability_cdfs( + # experiments=[experiments[solver_idx][0] for solver_idx in range(n_solvers)], + # solve_tol=0.2, + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # ) + + # # Plot cdf of 0.2-solve times for all solvers on one problem. + # # Problem instance 22. + # plot_solvability_cdfs( + # experiments=[experiments[solver_idx][22] for solver_idx in range(n_solvers)], + # solve_tol=0.2, + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # ) # # Plot area scatterplots of all solvers on all problems. - # plot_area_scatterplots(experiments=experiments, - # all_in_one=True, - # plot_CIs=False, - # print_max_hw=False - # ) + # plot_area_scatterplots( + # experiments=experiments, all_in_one=True, plot_CIs=False, print_max_hw=False + # ) # # Plot cdf 0.1-solvability profiles of all solvers on all problems. - # plot_solvability_profiles(experiments=experiments, - # plot_type="cdf_solvability", - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False, - # solve_tol=0.1 - # ) + # plot_solvability_profiles( + # experiments=experiments, + # plot_type="cdf_solvability", + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # solve_tol=0.1, + # ) # # Plot 0.5-quantile 0.1-solvability profiles of all solvers on all problems. - # plot_solvability_profiles(experiments=experiments, - # plot_type="quantile_solvability", - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False, - # solve_tol=0.1, - # beta=0.5 - # ) + # plot_solvability_profiles( + # experiments=experiments, + # plot_type="quantile_solvability", + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # solve_tol=0.1, + # beta=0.5, + # ) # # Plot difference of cdf 0.1-solvability profiles of all solvers on all problems. # # Reference solver = ASTRO-DF. - # plot_solvability_profiles(experiments=experiments, - # plot_type="diff_cdf_solvability", - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False, - # solve_tol=0.1, - # ref_solver="ASTRO-DF" - # ) - - # # Plot difference of 0.5-quantile 0.1-solvability profiles of all solvers on all problems. + # plot_solvability_profiles( + # experiments=experiments, + # plot_type="diff_cdf_solvability", + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # solve_tol=0.1, + # ref_solver="ASTRO-DF", + # ) + + # # Plot difference of 0.5-quantile 0.1-solvability profiles of all solvers on + # # all problems. # # Reference solver = ASTRO-DF. - # plot_solvability_profiles(experiments=experiments, - # plot_type="diff_quantile_solvability", - # all_in_one=True, - # plot_CIs=True, - # print_max_hw=False, - # solve_tol=0.1, - # beta=0.5, - # ref_solver="ASTRO-DF" - # ) + # plot_solvability_profiles( + # experiments=experiments, + # plot_type="diff_quantile_solvability", + # all_in_one=True, + # plot_CIs=True, + # print_max_hw=False, + # solve_tol=0.1, + # beta=0.5, + # ref_solver="ASTRO-DF", + # ) if __name__ == "__main__": diff --git a/demo/exp_base_testing.py b/demo/exp_base_testing.py index 1f8e4ad89..d1525c1a3 100644 --- a/demo/exp_base_testing.py +++ b/demo/exp_base_testing.py @@ -1,20 +1,21 @@ -""" +"""Demo for the ProblemsSolvers class. + This script is intended to help with running a data-farming experiment on a solver. It creates a design of solver factors and runs multiple macroreplications at each version of the solver. Outputs are printed to a file. """ import sys -import os.path as o +from pathlib import Path -sys.path.append( - o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")) -) # type:ignore +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) from simopt.experiment_base import ProblemsSolvers def main() -> None: + """Main function to run the demo script.""" # Specify the name of the solver as it appears in directory.py solver_names = ["RNDSRCH", "RNDSRCH", "ASTRODF"] diff --git a/docs/GUI.rst b/docs/GUI.rst deleted file mode 100644 index fd027b9bc..000000000 --- a/docs/GUI.rst +++ /dev/null @@ -1,7 +0,0 @@ -GUI module -========== - -.. automodule:: GUI - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/Makefile b/docs/Makefile index 7cc625883..359015108 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,20 +1,20 @@ -# Minimal makefile for Sphinx documentation -# +# Sphinx Makefile with catch-all support and apidocs generation -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= +SPHINXOPTS ?= -j auto # Use parallel build SPHINXBUILD ?= sphinx-build -SOURCEDIR = . +SOURCEDIR = source BUILDDIR = _build -# Put it first so that "make" without argument is like "make help". +.PHONY: help clean apidocs Makefile + +# Show Sphinx options help: - @$(SPHINXBUILD) -M -E -a help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) -.PHONY: help Makefile +# Clean build artifacts +clean: + rm -rf "$(BUILDDIR)"/* -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M -E -a $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) +# Catch-all: routes all other targets to sphinx-build -M +%: + @$(SPHINXBUILD) -M $@ $(SOURCEDIR) $(BUILDDIR) -E -a $(SPHINXOPTS) diff --git a/docs/amusementpark.png b/docs/amusementpark.png deleted file mode 100644 index c5c6d6f07..000000000 Binary files a/docs/amusementpark.png and /dev/null differ diff --git a/docs/base.rst b/docs/base.rst deleted file mode 100644 index 38206cd9f..000000000 --- a/docs/base.rst +++ /dev/null @@ -1,7 +0,0 @@ -base module -=========== - -.. automodule:: base - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index dc15780c8..000000000 --- a/docs/conf.py +++ /dev/null @@ -1,97 +0,0 @@ -# If you have added/deleted files/modules, you will need to run the following sphinx commands from simopt/simopt/docs and push to github -# for those changes to be reflected on readthedocs - -# sphinx-apidoc -o . .. -f # pushing after running this should be enough for readthedocs to be able to generate documentation -# make clean # this command and the next one are for building the html locally -# make html - - -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -from sphinx.ext.apidoc import main - -sys.path.insert(0, os.path.abspath("../simopt")) -sys.path.insert(0, os.path.abspath("..")) - - -# -- Project information ----------------------------------------------------- - -project = "SimOpt" -copyright = "2021, simopt-admin" # noqa: A001 -author = "simopt-admin" - -# The full version, including alpha/beta/rc tags -release = "1.0" - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. - - -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.intersphinx", - "sphinx.ext.napoleon", -] - -intersphinx_mapping = {"python": ("https://docs.python.org/3", None)} - -# Napoleon settings -napoleon_google_docstring = True -napoleon_numpy_docstring = True -napoleon_include_init_with_doc = False -napoleon_include_private_with_doc = False -napoleon_include_special_with_doc = True -napoleon_use_admonition_for_examples = False -napoleon_use_admonition_for_notes = False -napoleon_use_admonition_for_references = False -napoleon_use_ivar = False -napoleon_use_param = True -napoleon_use_rtype = True -napoleon_preprocess_types = False -napoleon_type_aliases = None -napoleon_attr_annotations = True - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "*test*", "*main*"] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "default" - - -latex_engine = "xelatex" - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". - -# html_static_path = ['_static'] -html_static_path = [] - - -main(["-o", os.path.abspath("."), os.path.abspath(".."), "-f"]) diff --git a/docs/data_farming_base.rst b/docs/data_farming_base.rst deleted file mode 100644 index 213f88976..000000000 --- a/docs/data_farming_base.rst +++ /dev/null @@ -1,7 +0,0 @@ -data\_farming\_base module -========================== - -.. automodule:: data_farming_base - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/directory.rst b/docs/directory.rst deleted file mode 100644 index 66d2384a8..000000000 --- a/docs/directory.rst +++ /dev/null @@ -1,7 +0,0 @@ -directory module -================ - -.. automodule:: directory - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/environment.yml b/docs/environment.yml new file mode 100644 index 000000000..906349904 --- /dev/null +++ b/docs/environment.yml @@ -0,0 +1,22 @@ +name: simopt-docs +channels: + - conda-forge +dependencies: + # Base Python + - python=3.12 + # Sphinx and its dependencies + - sphinx + - sphinx_rtd_theme + # SimOpt dependencies + - numpy + - scipy + - jupyter + - matplotlib + - pandas + - seaborn + - pillow + - pip + - ruff + - pip: + - mrg32k3a + - sphinx-autoapi diff --git a/docs/experiment_base.rst b/docs/experiment_base.rst deleted file mode 100644 index 70dd04ceb..000000000 --- a/docs/experiment_base.rst +++ /dev/null @@ -1,7 +0,0 @@ -experiment\_base module -======================= - -.. automodule:: experiment_base - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 47a4be7fb..000000000 --- a/docs/index.rst +++ /dev/null @@ -1,46 +0,0 @@ -.. SimOpt documentation master file, created by - sphinx-quickstart on Tue May 4 15:52:46 2021. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to SimOpt's documentation! -================================== - -The purpose of the SimOpt testbed is to encourage development and constructive comparison of simulation-optimization (SO) solvers (algorithms). We are particularly interested in the finite-time performance of solvers, rather than the asymptotic results that one often finds in related literature. - -For the purposes of this site, we define simulation as a very general technique for estimating statistical measures of complex systems. A system is modeled as if the probability distributions of the underlying random variables were known. Realizations of these random variables are then drawn randomly from these distributions. Each replication gives one observation of the system response, i.e., an evaluation of the objective function. By simulating a system in this fashion for multiple replications and aggregating the responses, one can compute statistics and use them for evaluation and design. - -The paper `Pasupathy and Henderson (2006) `_ explains the original motivation for the testbed, and the follow-up paper `Pasupathy and Henderson (2011) `_ describes an earlier interface for MATLAB implementations of problems and solvers. The paper `Dong et al. (2017) `_ conducts an experimental comparison of several solvers in SimOpt and analyzes their relative performance. The recent Winter Simulation Conference paper `Eckman et al. (2019) `_ describes in detail the recent changes to the architecture of SimOpt and the control of random number streams. - -The `models `_ library contains the simulation logic to simulate a variety of systems and SO test problems built around these models. The `solvers `_ library provides users with the latest SO solvers to solve different types of SO problems. The two libraries are intended to help researchers evaluate and compare the finite-time performance of existing solvers. - -The source code consists of the following modules: - -* The `base.py `_ module contains class definitions for models, problems, and solvers. - -* The `experiment_base.py `_ module contains class definitions and functions for running experiments with simulation-optimization solvers. - -* The `data_farming_base.py `_ module contains class definitions and functions for running data-farming experiments. - -* The `directory.py `_ module contains a listing of models, problems, and solvers in the library. - -Getting Started ----------------- - -Please make sure you have the following dependencies installed: Python 3, numpy, scipy, matplotlib, seaborn, and mrg32k3a. Then clone the repo. To see an example of how to run an experiment on a solver and problem pair, please view or run demo/demo\_problem\_solver.py. - -Contents --------- - -.. toctree:: - :maxdepth: 4 - - modules - - -Acknowledgments -------------------- - -An earlier website for `SimOpt `_ was developed through work supported by the National Science Foundation under grant nos. DMI-0400287, CMMI-0800688 and CMMI-1200315. -Recent work on the development of SimOpt has been supported by the National Science Foundation under grant nos. DGE-1650441, CMMI-1537394, CMMI-1254298, CMMI-1536895, IIS-1247696, and TRIPODS+X DMS-1839346, by the Air Force Office of Scientific Research under grant nos. FA9550-12-1-0200, FA9550-15-1-0038, and FA9550-16-1-0046, and by the Army Research Office under grant no. W911NF-17-1-0094. -Any opinions, findings and conclusions or recommendations expressed in this material are those of the authors and do not necessarily reflect the views of the National Science Foundation (NSF). diff --git a/docs/main.rst b/docs/main.rst deleted file mode 100644 index eace87b83..000000000 --- a/docs/main.rst +++ /dev/null @@ -1,7 +0,0 @@ -main module -=========== - -.. automodule:: main - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/make.bat b/docs/make.bat index 922152e96..447b8bdbe 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -1,35 +1,35 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/models.rst b/docs/models.rst deleted file mode 100644 index 2f13c6697..000000000 --- a/docs/models.rst +++ /dev/null @@ -1,133 +0,0 @@ -models package -============== - -Submodules ----------- - -models.chessmm module ---------------------- - -.. automodule:: models.chessmm - :members: - :undoc-members: - :show-inheritance: - -models.cntnv module -------------------- - -.. automodule:: models.cntnv - :members: - :undoc-members: - :show-inheritance: - -models.contam module --------------------- - -.. automodule:: models.contam - :members: - :undoc-members: - :show-inheritance: - -models.dualsourcing module --------------------------- - -.. automodule:: models.dualsourcing - :members: - :undoc-members: - :show-inheritance: - -models.dynamnews module ------------------------ - -.. automodule:: models.dynamnews - :members: - :undoc-members: - :show-inheritance: - -models.facilitysizing module ----------------------------- - -.. automodule:: models.facilitysizing - :members: - :undoc-members: - :show-inheritance: - -models.fixedsan module ----------------------- - -.. automodule:: models.fixedsan - :members: - :undoc-members: - :show-inheritance: - -models.hotel module -------------------- - -.. automodule:: models.hotel - :members: - :undoc-members: - :show-inheritance: - -models.ironore module ---------------------- - -.. automodule:: models.ironore - :members: - :undoc-members: - :show-inheritance: - -models.mm1queue module ----------------------- - -.. automodule:: models.mm1queue - :members: - :undoc-members: - :show-inheritance: - -models.paramesti module ------------------------ - -.. automodule:: models.paramesti - :members: - :undoc-members: - :show-inheritance: - -models.rmitd module -------------------- - -.. automodule:: models.rmitd - :members: - :undoc-members: - :show-inheritance: - -models.san module ------------------ - -.. automodule:: models.san - :members: - :undoc-members: - :show-inheritance: - -models.sscont module --------------------- - -.. automodule:: models.sscont - :members: - :undoc-members: - :show-inheritance: - -models.tableallocation module ------------------------------ - -.. automodule:: models.tableallocation - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: models - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/modules.rst b/docs/modules.rst deleted file mode 100644 index f483d72ec..000000000 --- a/docs/modules.rst +++ /dev/null @@ -1,8 +0,0 @@ -simopt -====== - -.. toctree:: - :maxdepth: 4 - - simopt - test diff --git a/docs/prodsys.rst b/docs/prodsys.rst deleted file mode 100644 index 489aed8ec..000000000 --- a/docs/prodsys.rst +++ /dev/null @@ -1,149 +0,0 @@ -Model: Production System (ProdSys) -================================== - -Description: ------------- -Let :math:`G = (V, A)` be a production network with a set of nodes :math:`V = {1, 2,..., n}`. :math:`num_products` -different final products correspond to the nodes with outdegree 0. Each node in :math:`V` represents a state of -the product while each arc denotes the process of transforming one intermediate product to another. - -Every transformation process uses one of the :math:`num_machines` machines. All processing times are random with given distributions, -and orders for each of the :math:`num_products` final products are also random and arrive at random intervals. -Assume that the time horizon is :math:`H`, and that the available sets of raw material equals -the expected value of the total demand of all :math:`num_products` final products. - -Sources of Randomness: ----------------------- -3 sources of randomness exist: - -1. Normally distributed order inter-arrival times. - -2. Product type of the order. - -3. Normally distributed machine processing times. - -Model Factors: --------------- -* :math:`num_products`: Number of products. - - * Default: 3 - -* :math:`interarrival_time_mean`: Mean of interarrival times of orders for each product. - - * Default: 30 - -* :math:`interarrival_time_stdev`: Standard deviation of interarrival times of orders for each product. - - * Default: 5 - -* :math:`num_machines`: Number of machines. - - * Default: 2 - -* :math:`num_edges`: Number of edges. - - * Default: 6 - -* :math:`total_inventory`: Total inventory. - - * Default: 200 - -* :math:`interm_product`: Product quantities to be processed ahead of time; number of intermediate products presently at each node. - - * Default: [200, 0, 0, 0, 0, 0] - -* :math:`routing_layout`: Layout matrix. List of edges sequences for each product type. - - * Default: [[1, 2], - [1, 3], - [2, 4], - [2, 5], - [3, 5], - [3, 6]] - -* :math:`machine_layout`: List of machines. Each element is the index for the machine that processes the task on each edge. - - * Default: [1, 2, 2, 2, 1, 1] - -* :math:`processing_time_mean`: Mean of normally distributed processing times. Each element is associated with a task (edge). - * Default: [4, 3, 5, 4, 4, 3] - -* :math:`processing_time_stdev`: Standard deviation of normally distributed processing times. Each element is associated with a task (edge). - - * Default: [1, 1, 2, 1, 1, 1] - -* :math:`product_batch_prob`: Batch order probabilities of each product. - - * Default: [0.5, 0.35, 0.15] - -* :math:`time_horizon`: Time horizon. - - * Default: 600 - -* :math:`batch`: Batch size. - - * Default: 10 - -Responses: ----------- -* :math:`avg_lead_time`: Average lead time. - -* :math:`service_level`: Service level. - - -References: -=========== -This model is adapted from the article Azadivar, F., Shu, J., & Ahmad, M. (1996). Simulation Optimization in Strategic Location of Semi-Finished Products in a Pull-Type Production System. -*Proceedings of the 1996 Winter Simulation Conference (WSC)*, 1123-1128. - - - -Optimization Problem: Minimize Lead Time (ProdSysMinLeadTime) -============================================================= -Our objective is to minimize the expected lead time, -while satisfying a tolerable service level, :math:`b` with high probability :math:`1 − α`. - -Decision Variables: -------------------- -* :math:`interm_products` - -Objectives: ------------ -Minimize expected :math:`avg_lead_time`. - -Constraints: ------------- -interm_products must be non-negative vector of length equal to number of nodes. -1 deterministic constraint: interm_products must sum to total inventory. -1 stochastic constraint: :math:`P[{service_level} ≥ b] ≥ 1 − α`. - -Problem Factors: ----------------- -* :math:`alpha`: Risk level parameter. - - * Default: 0.10 - -* :math:`min_sslevel`: Minimum tolerable service level (b). - - * Default: 0.5 - -Fixed Model Factors: --------------------- -None - -Starting Solution: ------------------- -* interm_product: [200, 0, 0, 0, 0, 0] - -Random Solutions: ------------------- -Generate initial inventory vectors uniformly at random from the set of vectors (of length equal to the number of nodes) whose values sum to the total inventory. - - -Optimal Solution: ------------------ -N/A - -Optimal Objective Function Value: ---------------------------------- -N/A diff --git a/docs/simopt.models.rst b/docs/simopt.models.rst deleted file mode 100644 index 9c6c89937..000000000 --- a/docs/simopt.models.rst +++ /dev/null @@ -1,157 +0,0 @@ -simopt.models package -===================== - -Submodules ----------- - -simopt.models.amusementpark module ----------------------------------- - -.. automodule:: simopt.models.amusementpark - :members: - :undoc-members: - :show-inheritance: - -simopt.models.chessmm module ----------------------------- - -.. automodule:: simopt.models.chessmm - :members: - :undoc-members: - :show-inheritance: - -simopt.models.cntnv module --------------------------- - -.. automodule:: simopt.models.cntnv - :members: - :undoc-members: - :show-inheritance: - -simopt.models.contam module ---------------------------- - -.. automodule:: simopt.models.contam - :members: - :undoc-members: - :show-inheritance: - -simopt.models.dualsourcing module ---------------------------------- - -.. automodule:: simopt.models.dualsourcing - :members: - :undoc-members: - :show-inheritance: - -simopt.models.dynamnews module ------------------------------- - -.. automodule:: simopt.models.dynamnews - :members: - :undoc-members: - :show-inheritance: - -simopt.models.example module ----------------------------- - -.. automodule:: simopt.models.example - :members: - :undoc-members: - :show-inheritance: - -simopt.models.facilitysizing module ------------------------------------ - -.. automodule:: simopt.models.facilitysizing - :members: - :undoc-members: - :show-inheritance: - -simopt.models.fixedsan module ------------------------------ - -.. automodule:: simopt.models.fixedsan - :members: - :undoc-members: - :show-inheritance: - -simopt.models.hotel module --------------------------- - -.. automodule:: simopt.models.hotel - :members: - :undoc-members: - :show-inheritance: - -simopt.models.ironore module ----------------------------- - -.. automodule:: simopt.models.ironore - :members: - :undoc-members: - :show-inheritance: - -simopt.models.mm1queue module ------------------------------ - -.. automodule:: simopt.models.mm1queue - :members: - :undoc-members: - :show-inheritance: - -simopt.models.network module ----------------------------- - -.. automodule:: simopt.models.network - :members: - :undoc-members: - :show-inheritance: - -simopt.models.paramesti module ------------------------------- - -.. automodule:: simopt.models.paramesti - :members: - :undoc-members: - :show-inheritance: - -simopt.models.rmitd module --------------------------- - -.. automodule:: simopt.models.rmitd - :members: - :undoc-members: - :show-inheritance: - -simopt.models.san module ------------------------- - -.. automodule:: simopt.models.san - :members: - :undoc-members: - :show-inheritance: - -simopt.models.sscont module ---------------------------- - -.. automodule:: simopt.models.sscont - :members: - :undoc-members: - :show-inheritance: - -simopt.models.tableallocation module ------------------------------------- - -.. automodule:: simopt.models.tableallocation - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: simopt.models - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/simopt.rst b/docs/simopt.rst deleted file mode 100644 index 95e537949..000000000 --- a/docs/simopt.rst +++ /dev/null @@ -1,62 +0,0 @@ -simopt package -============== - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - simopt.models - simopt.solvers - -Submodules ----------- - -simopt.GUI module ------------------ - -.. automodule:: simopt.GUI - :members: - :undoc-members: - :show-inheritance: - -simopt.base module ------------------- - -.. automodule:: simopt.base - :members: - :undoc-members: - :show-inheritance: - -simopt.data\_farming\_base module ---------------------------------- - -.. automodule:: simopt.data_farming_base - :members: - :undoc-members: - :show-inheritance: - -simopt.directory module ------------------------ - -.. automodule:: simopt.directory - :members: - :undoc-members: - :show-inheritance: - -simopt.experiment\_base module ------------------------------- - -.. automodule:: simopt.experiment_base - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: simopt - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/simopt.solvers.rst b/docs/simopt.solvers.rst deleted file mode 100644 index 9bd5a49e3..000000000 --- a/docs/simopt.solvers.rst +++ /dev/null @@ -1,69 +0,0 @@ -simopt.solvers package -====================== - -Submodules ----------- - -simopt.solvers.adam module --------------------------- - -.. automodule:: simopt.solvers.adam - :members: - :undoc-members: - :show-inheritance: - -simopt.solvers.aloe module --------------------------- - -.. automodule:: simopt.solvers.aloe - :members: - :undoc-members: - :show-inheritance: - -simopt.solvers.astrodf module ------------------------------ - -.. automodule:: simopt.solvers.astrodf - :members: - :undoc-members: - :show-inheritance: - -simopt.solvers.neldmd module ----------------------------- - -.. automodule:: simopt.solvers.neldmd - :members: - :undoc-members: - :show-inheritance: - -simopt.solvers.randomsearch module ----------------------------------- - -.. automodule:: simopt.solvers.randomsearch - :members: - :undoc-members: - :show-inheritance: - -simopt.solvers.spsa module --------------------------- - -.. automodule:: simopt.solvers.spsa - :members: - :undoc-members: - :show-inheritance: - -simopt.solvers.strong module ----------------------------- - -.. automodule:: simopt.solvers.strong - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: simopt.solvers - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/solvers.rst b/docs/solvers.rst deleted file mode 100644 index c95a4d817..000000000 --- a/docs/solvers.rst +++ /dev/null @@ -1,45 +0,0 @@ -solvers package -=============== - -Submodules ----------- - -solvers.astrodf module ----------------------- - -.. automodule:: solvers.astrodf - :members: - :undoc-members: - :show-inheritance: - -solvers.neldmd module ---------------------- - -.. automodule:: solvers.neldmd - :members: - :undoc-members: - :show-inheritance: - -solvers.randomsearch module ---------------------------- - -.. automodule:: solvers.randomsearch - :members: - :undoc-members: - :show-inheritance: - -solvers.strong module ---------------------- - -.. automodule:: solvers.strong - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: solvers - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/_static/simopt_logo.png b/docs/source/_static/simopt_logo.png new file mode 100644 index 000000000..3d07ff383 Binary files /dev/null and b/docs/source/_static/simopt_logo.png differ diff --git a/docs/source/_static/version_dropdown.png b/docs/source/_static/version_dropdown.png new file mode 100644 index 000000000..07c62ad91 Binary files /dev/null and b/docs/source/_static/version_dropdown.png differ diff --git a/docs/source/_static/version_preview.png b/docs/source/_static/version_preview.png new file mode 100644 index 000000000..865521a32 Binary files /dev/null and b/docs/source/_static/version_preview.png differ diff --git a/docs/model_template.rst b/docs/source/_templates/model_template.rst similarity index 60% rename from docs/model_template.rst rename to docs/source/_templates/model_template.rst index e35aba088..e5beb3f82 100644 --- a/docs/model_template.rst +++ b/docs/source/_templates/model_template.rst @@ -1,104 +1,106 @@ -Model: () -========================================== - -Description: ------------- - - -Sample math... :math:`S = 1500` - -Sample math... - -.. math:: - - \frac{ \sum_{t=0}^{N}f(t,k) }{N} - -Sources of Randomness: ----------------------- - - -Model Factors: --------------- -* : - - * Default: - -* : - - * Default: - -* : - - * Default: - -Responses: ----------- -* : - -* : - -* : - - -References: -=========== -This model is adapted from the article
- - - - -Optimization Problem: () -======================================================== - -Decision Variables: -------------------- -* -* - -Objectives: ------------ - - -Constraints: ------------- - - -Problem Factors: ----------------- -* : - - * Default: - -* : - - * Default: - -Fixed Model Factors: --------------------- -* : - -* : - -Starting Solution: ------------------- -* : - -* : - -Random Solutions: ------------------- - - -Optimal Solution: ------------------ - - -Optimal Objective Function Value: ---------------------------------- - - - -Optimization Problem: () -======================================================== - -... + +=================== + +See the :mod:`simopt.models.` module for API details. + +Model: () +------------------------------------------ + +Description +^^^^^^^^^^^ + + + +Sample math... :math:`S = 1500` + +Sample math... + +.. math:: + + \frac{ \sum_{t=0}^{N}f(t,k) }{N} + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + + + +Model Factors +^^^^^^^^^^^^^ + +* : + * Default: +* : + * Default: +* : + * Default: + +Responses +^^^^^^^^^ + +* : +* : +* : + +References +^^^^^^^^^^ + +This model is adapted from the article
+ +Optimization Problem: () +------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* +* + +Objectives +^^^^^^^^^^ + + + +Constraints +^^^^^^^^^^^ + + + +Problem Factors +^^^^^^^^^^^^^^^ + +* : + * Default: +* : + * Default: + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* : +* : + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* : +* : + +Random Solutions +^^^^^^^^^^^^^^^^ + + + +Optimal Solution +^^^^^^^^^^^^^^^^ + + + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + +Optimization Problem: () +------------------------------------------------------- + +... diff --git a/docs/solver_template.rst b/docs/source/_templates/solver_template.rst similarity index 71% rename from docs/solver_template.rst rename to docs/source/_templates/solver_template.rst index 8105517d0..48a36b224 100644 --- a/docs/solver_template.rst +++ b/docs/source/_templates/solver_template.rst @@ -1,42 +1,42 @@ -Solver: () -============================================= - -Description: ------------- - - -Sample math... :math:`S = 1500` - -Sample math... - -.. math:: - - \frac{ \sum_{t=0}^{N}f(t,k) }{N} - - -Modifications & Implementation: -------------------------------- - - -Scope: ------- - - -Solver Factors: ---------------- -* : - - * Default: - -* : - - * Default: - -* : - - * Default: - - -References: -=========== -This solver is adapted from the article
\ No newline at end of file +Solver: () +============================================= + +See the :mod:`simopt.solvers.` module for API details. + +Description +----------- + + + +Sample math... :math:`S = 1500` + +Sample math... + +.. math:: + + \frac{ \sum_{t=0}^{N}f(t,k) }{N} + +Modifications & Implementation +------------------------------ + + + +Scope +----- + + + +Solver Factors +-------------- + +* : + * Default: +* : + * Default: +* : + * Default: + +References +---------- + +This solver is adapted from the article
diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 000000000..1d6dc4d88 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,89 @@ +# noqa: D100 +# If you have added/deleted files/modules, you will need to run the following sphinx +# commands from simopt/simopt/docs and push to github for those changes to be reflected +# on readthedocs + +# pushing after running this should be enough for readthedocs to be able to +# generate documentation: +# `sphinx-apidoc -o . .. -f` + +# This command and the next one are for building the html locally +# `make clean` +# `make html` + +import sys +from pathlib import Path + +# -- Path setup -------------------------------------------------------------- + +# Figure out the top-level directory and add it to the system path +# This is necessary to import the simopt package +src_path = Path(__file__).resolve().parent +project_path = src_path.parents[1] +sys.path.insert(0, str(project_path)) + +# -- Project information ----------------------------------------------------- + +project = "SimOpt" +copyright = "2025, simopt-admin" # noqa: A001 +author = "simopt-admin" +release = "1.2.0" + +# -- General configuration --------------------------------------------------- + +master_doc = "index" +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", # Google/Numpy-style docstrings + "autoapi.extension", # main AutoAPI extension +] +templates_path = ["_templates"] + +# AutoAPI settings +autoapi_type = "python" +autoapi_dirs = [str(project_path / "simopt")] +main_path = str(project_path / "simopt" / "__main__.py") +gui_file_path = str(project_path / "simopt" / "GUI.py") +gui_folder_path = str(project_path / "simopt" / "gui") +autoapi_ignore = [main_path, gui_file_path, gui_folder_path] +autoapi_keep_files = False +autoapi_add_toctree_entry = False +autoapi_python_class_content = "both" # Include docstring from __init__ & class-level +autoapi_options = ["members", "undoc-members", "show-inheritance"] + +# Napoleon settings +napoleon_google_docstring = True +napoleon_numpy_docstring = True +napoleon_include_init_with_doc = False +napoleon_include_private_with_doc = False +napoleon_include_special_with_doc = True +napoleon_use_admonition_for_examples = False +napoleon_use_admonition_for_notes = False +napoleon_use_admonition_for_references = False +napoleon_use_ivar = False +napoleon_use_param = True +napoleon_use_rtype = True +napoleon_attr_annotations = True + +# Be careful not to exclude important files +exclude_patterns = [ + "_build", + "Thumbs.db", + ".DS_Store", + "/test/", + "/dev_tools/", + "*main*", +] + +# -- HTML output ------------------------------------------------------------- + +html_theme = "sphinx_rtd_theme" +html_static_path = ["_static"] +html_logo = "_static/simopt_logo.png" +html_theme_options = { + "logo_only": True, # No name since it is in the logo + "style_nav_header_background": "#343131", # Same color as accent color +} + +# LaTeX config (if using) +latex_engine = "xelatex" diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst new file mode 100644 index 000000000..08f675967 --- /dev/null +++ b/docs/source/contributing.rst @@ -0,0 +1,107 @@ +:orphan: + +Contributing and Developer Guide +================================ + +This guide is intended for developers working with the source code directly. It includes setup instructions for cloning the repository, configuring the local environment, and setting up the recommended development environment in VS Code. + +Environment Setup +----------------- + +Required Tools +^^^^^^^^^^^^^^ + +- `Miniconda (recommended) or Anaconda `__ + + - Miniconda is a minimal installer for Conda, which is a package manager for Python and other languages. + - Anaconda is a larger distribution that includes many pre-installed packages, but since we are using a custom environment, Anaconda is not necessary. + +- `Git `__ & `GitHub Desktop `__ + + - Git is a version control system that allows you to track changes in your code and collaborate with others. + - GitHub Desktop is a GUI for Git that simplifies the process of cloning repositories and managing branches. + +- `Visual Studio Code `__ + + - A lightweight code editor that supports many programming languages and has a rich ecosystem of extensions. + - It is recommended to use VS Code for development due to its integrated terminal, debugging capabilities, and support for Python development. + +Installation Steps +^^^^^^^^^^^^^^^^^^ + +1. **Install Miniconda or Anaconda** + + - The default installer settings are generally fine. + - *Tip:* Check `Add Anaconda/Miniconda to my PATH` during installation if Python isn't already on your system. + +2. **Install Git** + + - During setup, avoid selecting `Vim` as the default editor unless you are familiar with it. + - Choose `Visual Studio Code` as the default editor when prompted. + +3. **Install GitHub Desktop** + + - Once installed, choose `Clone a repository from the Internet`, then paste the following URL: ``https://github.com/simopt-admin/simopt.git`` + - Remember the local directory you cloned the repository to. This is where you will find the `simopt` folder. + +4. **Install Visual Studio Code** + + - Open the `simopt` folder in VS Code (`File > Open Folder...`). + +5. **Setup the SimOpt Environment** + + - Open the terminal in VS Code (`View > Terminal`) + - Run the following command(s): + + - Windows (cmd): ``setup_simopt.bat`` + - Windows (PowerShell): ``cmd /c setup_simopt.bat`` + - MacOS/Linux: ``chmod +x setup_simopt.sh && ./setup_simopt.sh`` + + - The setup script should automatically activate the environment. If needed later, you can manually activate it with: ``conda activate simopt`` + - You can re-run the setup script at any time to update dependencies in the environment. + +6. **Install recommended VS Code extensions** + + - Python (`ms-python.python`) + + - This will also automatically install the following extensions: + + - Pylance (`ms-python.vscode-pylance`) + - Debugger (`ms-python.debugpy`) + + - Ruff (`charliermarsh.ruff`) + - GitHub Copilot (`GitHub.copilot`, optional but helpful) + + - This extension requires a GitHub account with Copilot access. + - Access to Copilot is free for students and educators. + - You can request access to Copilot through the `GitHub Student Developer Pack `__. + +7. **Set the Python interpreter** + + - Open any `.py` file and look at the bottom-left corner of VS Code. + + .. image:: ./_static/version_preview.png + :alt: A preview of the Python version in the lower right corner of VS Code + :align: center + + - If the Python environment doesn’t show `(simopt)`, click the interpreter name and select one that includes `simopt`. + + .. image:: ./_static/version_dropdown.png + :alt: A dropdown of Python interpreters visible in VS Code + :align: center + +Running the GUI +--------------- + +To run the GUI with debugging, use one of the following methods: + +- From the menu bar, choosing `Run > Start Debugging` +- Pressing `F5` + +Alternatively, you can run the application without debugging using one of the following methods: + +- From the menu bar, choosing `Run > Run Without Debugging` +- Pressing `Ctrl + F5` +- Running ``python -m simopt.GUI`` in the terminal + +NOTE: If launching via VS Code, you may be prompted to configure a launch environment. Choose `Python Module` and input ``simopt.GUI`` as the module name. diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 000000000..611dc86e2 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,55 @@ +Welcome to SimOpt's documentation! +================================== + +The purpose of the SimOpt testbed is to encourage development and constructive comparison of simulation-optimization (SO) solvers (algorithms). +We are particularly interested in the finite-time performance of solvers, rather than the asymptotic results that one often finds in related literature. + +For the purposes of this site, we define simulation as a very general technique for estimating statistical measures of complex systems. +A system is modeled as if the probability distributions of the underlying random variables were known. +Realizations of these random variables are then drawn randomly from these distributions. +Each replication gives one observation of the system response, i.e., an evaluation of the objective function. +By simulating a system in this fashion for multiple replications and aggregating the responses, one can compute statistics and use them for evaluation and design. + +The paper `Pasupathy and Henderson (2006) `_ explains the original motivation for the testbed, and the follow-up paper `Pasupathy and Henderson (2011) `_ describes an earlier interface for MATLAB implementations of problems and solvers. +The paper `Dong et al. (2017) `_ conducts an experimental comparison of several solvers in SimOpt and analyzes their relative performance. +The recent Winter Simulation Conference paper `Eckman et al. (2019) `_ describes in detail the recent changes to the architecture of SimOpt and the control of random number streams. + +The :mod:`simopt.models` module contains the simulation logic to simulate a variety of systems and SO test problems built around these models. +The :mod:`simopt.solvers` module provides users with the latest SO solvers to solve different types of SO problems. +The two modules are intended to help researchers evaluate and compare the finite-time performance of existing solvers. + +The source code consists of the following modules: + +* The :mod:`simopt.base` module contains class definitions for models, problems, and solvers. +* The :mod:`simopt.experiment_base` module contains class definitions and functions for running experiments with simulation-optimization solvers. +* The :mod:`simopt.data_farming_base` module contains class definitions and functions for running data-farming experiments. + +Contents +-------- + +.. toctree:: + :maxdepth: 2 + :caption: Component Descriptions + + models + solvers + +.. toctree:: + :maxdepth: 2 + :caption: API Reference + + autoapi/simopt/index + +.. toctree:: + :maxdepth: 1 + :caption: External Resources + + SimOpt Repo + MRG32k3a RNG Repo + +Acknowledgments +--------------- + +An earlier website for `SimOpt `_ was developed through work supported by the National Science Foundation under grant nos. DMI-0400287, CMMI-0800688 and CMMI-1200315. +Recent work on the development of SimOpt has been supported by the National Science Foundation under grant nos. DGE-1650441, CMMI-1537394, CMMI-1254298, CMMI-1536895, IIS-1247696, and TRIPODS+X DMS-1839346, by the Air Force Office of Scientific Research under grant nos. FA9550-12-1-0200, FA9550-15-1-0038, and FA9550-16-1-0046, and by the Army Research Office under grant no. W911NF-17-1-0094. +Any opinions, findings and conclusions or recommendations expressed in this material are those of the authors and do not necessarily reflect the views of the National Science Foundation (NSF). diff --git a/docs/source/models.rst b/docs/source/models.rst new file mode 100644 index 000000000..bde644e75 --- /dev/null +++ b/docs/source/models.rst @@ -0,0 +1,25 @@ +Models & Problems +================= + +.. toctree:: + :maxdepth: 1 + :titlesonly: + + models/amusementpark + models/chessmm + models/cntnv + models/contam + models/dualsourcing + models/dynamnews + models/example + models/facilitysizing + models/fixedsan + models/hotel + models/ironore + models/mm1queue + models/network + models/paramesti + models/rmitd + models/san + models/sscont + models/tableallocation diff --git a/docs/contam.PNG b/docs/source/models/_static/contam.PNG similarity index 100% rename from docs/contam.PNG rename to docs/source/models/_static/contam.PNG diff --git a/docs/hotel.PNG b/docs/source/models/_static/hotel.PNG similarity index 100% rename from docs/hotel.PNG rename to docs/source/models/_static/hotel.PNG diff --git a/docs/hotel2.PNG b/docs/source/models/_static/hotel2.PNG similarity index 100% rename from docs/hotel2.PNG rename to docs/source/models/_static/hotel2.PNG diff --git a/docs/san.PNG b/docs/source/models/_static/san.PNG similarity index 100% rename from docs/san.PNG rename to docs/source/models/_static/san.PNG diff --git a/docs/sscont.png b/docs/source/models/_static/sscont.png similarity index 100% rename from docs/sscont.png rename to docs/source/models/_static/sscont.png diff --git a/docs/amusementpark.rst b/docs/source/models/amusementpark.rst similarity index 52% rename from docs/amusementpark.rst rename to docs/source/models/amusementpark.rst index 6ccdacd56..f7b213467 100644 --- a/docs/amusementpark.rst +++ b/docs/source/models/amusementpark.rst @@ -1,153 +1,181 @@ -Model: Amusement Park Queues (AMUSEMENT) -========================================== - -Description: ------------- -This model simulates an amusement park with 7 attractions. Visitors arrive at -each attraction according to a poisson distribution with a rate :math:`\gamma_i = 1`, -:math:`i = 1,. . . , 7`. Each attraction can only take one visitor at a time, while -others wait in a queue with capacity :math:`c_i`. If a visitor finds a queue full, -they will immediately leave the park. - -After visiting each attraction, a visitor leaves the park with probability 0.2. -Otherwise, the visitor goes to another attraction according to the transition -matrix: - -.. image:: amusementpark.png - :alt: The transition matrix has failed to display - :width: 700 - -The time that a visitor spends at an attraction follows an Erlang -distribution with shape parameter :math:`k = 2`` and rate :math:`\lambda = 9`. -The park opens at 9AM and closes at 5PM, and time is measured in minutes. -When the park closes, all visitors in the queue leave immediately. - -Sources of Randomness: ----------------------- -There are 3 sources of randomness in this model: - -* The arrival rate of visitors as a poisson distribution with rate of 1 for all :math:`i = 1, . . . , 7`. - -* The transition probabiliyt matrix that visitors follow after visiting each attraction. - -* The time spent at each attraction as an Erlang distribution with the shape parameter :math:`k = 2` and rate = 9. - -The Erlang distribution is the distribution representing a sum of :math:`k` independent exponential variables with mean :math:`1/\lambda` each. -It is a special case of the gamma distribution wherein the shape of the distribution is discretized. The probability density function -of the Erlang distribution is - -:math:`f(x;k,\lambda) = \frac{\lambda^{k}x^{k-1}e^{-\lambda x}}{(k-1)!} \quad for \ x, \beta >= 0` - -where :math:`k` is the shape parameter, :math:`\lambda` is the rate parameter. - -Alternatively, the pdf can be expressed as - -:math:`f(x;k,\beta) = \frac{x^{k-1}e^{-x/\beta}}{\beta^k(k-1)!} \quad for \ x, \beta >= 0` - -where :math:`\beta` is the scale parameter, which is the reciprocal of the rate parameter. - -* Note: In this model, Erlang variates are generated through the gamma distribution with the scale (:math:`\beta:`) parameter set to 1/9. -Accordingly, the reciprocal of desired rate values should be used in the erlang_scale parameter. - - -Model Factors: --------------- -* park_capacity: The total number of visitors waiting for attractions that can be maintained through park facilities, distributed across the attractions. - - * Default: 350 - -* number_attractions: The number of attractions in the park. - - * Default: 7 - -* time_open: The number of minutes per day the park is open. - - * Default: 480 - -* erlang_shape: The shape parameter of the Erlang distribution for each attraction duration. - - * Default: [2, 2, 2, 2, 2, 2, 2] - -* erlang_scale: The scale parameter of the Erlang distribution for each attraction duration (reciprocal of the rate value). - - * Default: [1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9] - -* depart_probabilities: The probability that a visitor will depart the park after visiting an attraction. - - * Default: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2] - -* queue_capacities: The capacity of the queues for the attractions based on the portion of facilities allocated. - - * Default: [50, 50, 50, 50, 50, 50, 50] - -* arrival_gammas: The gamma values for the poisson distributions dictating the rates at which visitors entering the park arrive at each attraction. - - * Default: [1, 1, 1, 1, 1, 1, 1] - -* transition_probabilities: The transition matrix that describes the probability of a visitor visiting each attraction after their current attraction. - - * Default: - .. image:: amusementpark.png - :alt: The transition matrix has failed to display - :width: 700 - -Responses: ----------- -* total_departed: The total number of visitors to leave the park due to full queues. - -* percent_departed: The percentage of visitors to leave the park due to full queues. - -* average_number_in_system: The time average of the number of visitors in the system. - -* attraction_utilization_percentages: The percent utilizations for each attraction. - -References: -=========== -This model is adapted from the article: -Vill’en-Altamirano, J. (2009). Restart Simulation of Networks of Queues with -Erlang Service Times. *Proceedings of the 2009 Winter Simulation Conference.* - -Optimization Problem: Minimize Total Departed Visitors (AMUSEMENT-1) -==================================================================== - -Decision Variables: -------------------- -* queue_capacities - -Objectives: ------------ -Minimize total number of departed visitors. - -Constraints: ------------- -* park_capacity = 350 - -* :math:`\sum_{i=1}^{7}` queue_capacities = park_capacity - -* queue_capacities :math:`\ge` 0 - -Problem Factors: ----------------- -* Budget: Max # of replications for a solver to take. - - * Default: 1000 - -Fixed Model Factors: --------------------- -* N/A - -Starting Solution: ------------------- -* queue_capacities = [50, 50, 50, 50, 50, 50, 50] - -Random Solutions: ------------------- -Generate a solution uniformly from a space of vectors of length 7 that sum up to 350. - -Optimal Solution: ------------------ -unknown - -Optimal Objective Function Value: ---------------------------------- -unknown +Amusement Park Queueing +======================= + +See the :mod:`simopt.models.amusementpark` module for API details. + +Model: Amusement Park Queues (AMUSEMENT) +---------------------------------------- + +Description +^^^^^^^^^^^ + +This model simulates an amusement park with 7 attractions. Visitors arrive at +each attraction according to a poisson distribution with a rate :math:`\gamma_i = 1`, +:math:`i = 1,. . . , 7`. Each attraction can only take one visitor at a time, while +others wait in a queue with capacity :math:`c_i`. If a visitor finds a queue full, +they will immediately leave the park. + +After visiting each attraction, a visitor goes to another attraction (or leaves) +according to the transition matrix: + ++---+-----+-----+-----+-----+-----+-----+-----+--------+ +| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Leave | ++===+=====+=====+=====+=====+=====+=====+=====+========+ +| 1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | ++---+-----+-----+-----+-----+-----+-----+-----+--------+ +| 2 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | ++---+-----+-----+-----+-----+-----+-----+-----+--------+ +| 3 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | ++---+-----+-----+-----+-----+-----+-----+-----+--------+ +| 4 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | ++---+-----+-----+-----+-----+-----+-----+-----+--------+ +| 5 | 0.1 | 0.1 | 0.1 | 0.1 | 0.0 | 0.1 | 0.3 | 0.2 | ++---+-----+-----+-----+-----+-----+-----+-----+--------+ +| 6 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.0 | 0.3 | 0.2 | ++---+-----+-----+-----+-----+-----+-----+-----+--------+ +| 7 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | ++---+-----+-----+-----+-----+-----+-----+-----+--------+ + +* **Rows** represent the ride a tourist is currently at (i.e., the ride they just completed). +* **Columns** represent the next ride the tourist chooses to go to. + +The time that a visitor spends at an attraction follows an Erlang +distribution with shape parameter :math:`k = 2`` and rate :math:`\lambda = 9`. +The park opens at 9AM and closes at 5PM, and time is measured in minutes. +When the park closes, all visitors in the queue leave immediately. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +There are 3 sources of randomness in this model: + +1. The arrival rate of visitors as a poisson distribution with rate of 1 for all :math:`i = 1, . . . , 7`. +2. The transition probabiliyt matrix that visitors follow after visiting each attraction. +3. The time spent at each attraction as an Erlang distribution with the shape parameter :math:`k = 2` and rate = 9. + +The Erlang distribution is the distribution representing a sum of :math:`k` independent exponential variables with mean :math:`1/\lambda` each. +It is a special case of the gamma distribution wherein the shape of the distribution is discretized. The probability density function +of the Erlang distribution is + +:math:`f(x;k,\lambda) = \frac{\lambda^{k}x^{k-1}e^{-\lambda x}}{(k-1)!} \quad for \ x, \beta >= 0` + +where :math:`k` is the shape parameter, :math:`\lambda` is the rate parameter. + +Alternatively, the pdf can be expressed as + +:math:`f(x;k,\beta) = \frac{x^{k-1}e^{-x/\beta}}{\beta^k(k-1)!} \quad for \ x, \beta >= 0` + +where :math:`\beta` is the scale parameter, which is the reciprocal of the rate parameter. + +* Note: In this model, Erlang variates are generated through the gamma distribution with the scale (:math:`\beta:`) parameter set to 1/9. + +Accordingly, the reciprocal of desired rate values should be used in the erlang_scale parameter. + +Model Factors +^^^^^^^^^^^^^ + +* park_capacity: The total number of visitors waiting for attractions that can be maintained through park facilities, distributed across the attractions. + * Default: 350 +* number_attractions: The number of attractions in the park. + * Default: 7 +* time_open: The number of minutes per day the park is open. + * Default: 480 +* erlang_shape: The shape parameter of the Erlang distribution for each attraction duration. + * Default: [2, 2, 2, 2, 2, 2, 2] +* erlang_scale: The scale parameter of the Erlang distribution for each attraction duration (reciprocal of the rate value). + * Default: [1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9] +* depart_probabilities: The probability that a visitor will depart the park after visiting an attraction. + * Default: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2] +* queue_capacities: The capacity of the queues for the attractions based on the portion of facilities allocated. + * Default: [50, 50, 50, 50, 50, 50, 50] +* arrival_gammas: The gamma values for the poisson distributions dictating the rates at which visitors entering the park arrive at each attraction. + * Default: [1, 1, 1, 1, 1, 1, 1] +* transition_probabilities: The transition matrix that describes the probability of a visitor visiting each attraction after their current attraction. + * Default: + + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Leave | + +===+=====+=====+=====+=====+=====+=====+=====+========+ + | 1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + | 2 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + | 3 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + | 4 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.0 | 0.2 | + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + | 5 | 0.1 | 0.1 | 0.1 | 0.1 | 0.0 | 0.1 | 0.3 | 0.2 | + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + | 6 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.0 | 0.3 | 0.2 | + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + | 7 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | + +---+-----+-----+-----+-----+-----+-----+-----+--------+ + + * **Rows** represent the ride a tourist is currently at (i.e., the ride they just completed). + * **Columns** represent the next ride the tourist chooses to go to. + +Responses +^^^^^^^^^ + +* total_departed: The total number of visitors to leave the park due to full queues. +* percent_departed: The percentage of visitors to leave the park due to full queues. +* average_number_in_system: The time average of the number of visitors in the system. +* attraction_utilization_percentages: The percent utilizations for each attraction. + +References +^^^^^^^^^^ + +This model is adapted from the article: +Vill’en-Altamirano, J. (2009). Restart Simulation of Networks of Queues with +Erlang Service Times. *Proceedings of the 2009 Winter Simulation Conference.* + +Optimization Problem: Minimize Total Departed Visitors (AMUSEMENT-1) +-------------------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* queue_capacities + +Objectives +^^^^^^^^^^ + +Minimize total number of departed visitors. + +Constraints +^^^^^^^^^^^ + +* park_capacity = 350 +* :math:`\sum_{i=1}^{7}` queue_capacities = park_capacity +* queue_capacities :math:`\ge` 0 + +Problem Factors +^^^^^^^^^^^^^^^ + +* Budget: Max # of replications for a solver to take. + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* queue_capacities = [50, 50, 50, 50, 50, 50, 50] + +Random Solutions +^^^^^^^^^^^^^^^^ + +Generate a solution uniformly from a space of vectors of length 7 that sum up to 350. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +unknown diff --git a/docs/chessmm.rst b/docs/source/models/chessmm.rst similarity index 75% rename from docs/chessmm.rst rename to docs/source/models/chessmm.rst index bc2a40b5e..485f31b75 100644 --- a/docs/chessmm.rst +++ b/docs/source/models/chessmm.rst @@ -1,108 +1,111 @@ -Model: Chess Matchmaking Optimization (CHESS) -============================================= - -Description: ------------- -Chess players are rated using the Elo rating system, which assigns a (non-unique) -number to each player based on their level of skill. The model simulates an online -chess-matchmaking platform, which tries to match players of similar skill level. - -The platform uses a search width :math:`x`, which is the maximum allowable difference -in Elo rating between two matched players. :math:`N` players are drawn from a distribution -of Elo ratings and arrive (independent of their rating) according to a stationary -Poisson process with rate :math:`\lambda`. When a player arrives, and there is an existing, -unmatched player with Elo rating within :math:`x` of the first player's Elo rating, they -are matched. If not, then the player waits for an opponent with an appropriate Elo -rating to arrive. - -Sources of Randomness: ----------------------- -1. To create the Elo distribution, first generate a normal distribution with mean -:math:`1200` and standard deviation :math:`\frac{1200}{\sqrt(2)*\text{erfcinv}(\frac{1}{50})}`, -where erfcinv is the inverse complementary error function. This results in a distribution -where the 1st percentile is at :math:`0`, and the 99th percentile is at :math:`2400`. -Next, truncate the distribution at :math:`0` and :math:`2400`. -2. A stationary Poisson process with rate :math:`\lambda` for arrivals. - -Model Factors: --------------- -* elo_mean: Mean of normal distribution for Elo rating. - - * Default: 1200.0 - -* elo_sd: Standard deviation of normal distribution for Elo rating. - - * Default: 1200 / (np.sqrt(2) * special.erfcinv(1 / 50)) - -* poisson_rate: Rate of Poisson process for player arrivals. - - * Default: 1.0 - -* num_players: Number of players. - - * Default: 1000 - -* allowable_diff: Maximum allowable difference between Elo ratings. - - * Default: 150.0 - -Responses: ----------- -* avg_diff: The average Elo difference between all pairs. - -* avg_wait_time: The average waiting time. - -References: -=========== -Original author of this problem is Bryan Chong (March 15, 2015). - - - - -Optimization Problem: Minimize Average Elo Difference (CHESS-1) -=============================================================== - -Decision Variables: -------------------- -* allowable_diff - -Objectives: ------------ -Minimize the average Elo difference between all pairs of matched players. - -Constraints: ------------- -Maximum allowable difference is between 0 and 2400. - -The average waiting time is :math:`\leq \delta`. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 1000 - -* upper_time: Upper bound on wait time. - - * Default: 5.0 - -Fixed Model Factors: --------------------- -* N/A - -Starting Solution: ------------------- -* initial_solution: (150,) - -Random Solutions: ------------------ -First draw :math:`x` from a normal distribution with mean :math:`150` and standard -deviation :math:`50`, then set :math:`x = \min(\max(x, 0), 2400)`. - -Optimal Solution: ------------------ -Unknown - -Optimal Objective Function Value: ---------------------------------- +Chess Matchmaking +================= + +See the :mod:`simopt.models.chessmm` module for API details. + +Model: Chess Matchmaking Optimization (CHESS) +--------------------------------------------- + +Description +^^^^^^^^^^^ + +Chess players are rated using the Elo rating system, which assigns a (non-unique) +number to each player based on their level of skill. The model simulates an online +chess-matchmaking platform, which tries to match players of similar skill level. + +The platform uses a search width :math:`x`, which is the maximum allowable difference +in Elo rating between two matched players. :math:`N` players are drawn from a distribution +of Elo ratings and arrive (independent of their rating) according to a stationary +Poisson process with rate :math:`\lambda`. When a player arrives, and there is an existing, +unmatched player with Elo rating within :math:`x` of the first player's Elo rating, they +are matched. If not, then the player waits for an opponent with an appropriate Elo +rating to arrive. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. To create the Elo distribution, first generate a normal distribution with mean +:math:`1200` and standard deviation :math:`\frac{1200}{\sqrt(2)*\text{erfcinv}(\frac{1}{50})}`, +where erfcinv is the inverse complementary error function. This results in a distribution +where the 1st percentile is at :math:`0`, and the 99th percentile is at :math:`2400`. +Next, truncate the distribution at :math:`0` and :math:`2400`. +2. A stationary Poisson process with rate :math:`\lambda` for arrivals. + +Model Factors +^^^^^^^^^^^^^ + +* elo_mean: Mean of normal distribution for Elo rating. + * Default: 1200.0 +* elo_sd: Standard deviation of normal distribution for Elo rating. + * Default: 1200 / (np.sqrt(2) * special.erfcinv(1 / 50)) +* poisson_rate: Rate of Poisson process for player arrivals. + * Default: 1.0 +* num_players: Number of players. + * Default: 1000 +* allowable_diff: Maximum allowable difference between Elo ratings. + * Default: 150.0 + +Responses +^^^^^^^^^ + +* avg_diff: The average Elo difference between all pairs. +* avg_wait_time: The average waiting time. + +References +^^^^^^^^^^ + +Original author of this problem is Bryan Chong (March 15, 2015). + +Optimization Problem: Minimize Average Elo Difference (CHESS-1) +--------------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* allowable_diff + +Objectives +^^^^^^^^^^ + +Minimize the average Elo difference between all pairs of matched players. + +Constraints +^^^^^^^^^^^ + +Maximum allowable difference is between 0 and 2400. + +The average waiting time is :math:`\leq \delta`. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 1000 +* upper_time: Upper bound on wait time. + * Default: 5.0 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* initial_solution: (150,) + +Random Solutions +^^^^^^^^^^^^^^^^ + +First draw :math:`x` from a normal distribution with mean :math:`150` and standard +deviation :math:`50`, then set :math:`x = \min(\max(x, 0), 2400)`. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Unknown \ No newline at end of file diff --git a/docs/cntnv.rst b/docs/source/models/cntnv.rst similarity index 74% rename from docs/cntnv.rst rename to docs/source/models/cntnv.rst index 8fb8f3931..f426a06e7 100644 --- a/docs/cntnv.rst +++ b/docs/source/models/cntnv.rst @@ -1,111 +1,101 @@ - -Model: Continuous Newsvendor Problem (CNTNV) -============================================ - -Description: ------------- - -A vendor orders a fixed quantity of liquid at the beginning of a day to be -sold to customers throughout the day. The vendor pays a per-unit order cost -:math:`c` for the initial inventory and sells it the product to customers at a per-unit price -:math:`s`. At the end of the day, any unsold liquid can be salvaged at a per-unit price, :math:`w`. - -Sources of Randomness: ----------------------- - -Each day's random demand for liquid product follows Burr Type XII distribution and is denoted by :math:`D`. -The parameters of the Burr Type XII distribution are :math:`α` and :math:`β` so that its cumulative -distribution function is given by :math:`F(x) = 1 - (1+x^α)^{-β}` where :math:`x, α,` and -:math:`β` are all positive. - -Model Factors: --------------- - -* Cost (:math:`c`): The price at which the newsvendor purchases one unit volume of liquid. - - * Default: 5 - -* Price (:math:`s`): The price at which the newsvendor sells one unit volume of liquid. - - * Default: 9 - -* Salvage Price (:math:`w`): The price at which any unsold liquid is sold for salvage. - - * Default: 1 - -* Alpha (:math:`α`): Parameter for the demand distribution. - - * Default: 2 - -* Beta (:math:`β`): Parameter for the demand distribution. - - * Default: 20 - -* Quantity of Liquid (:math:`x`): Amount (volume) of liquid ordered at the beginning of the day. - - * Default: 0.5 - -Responses: ----------- - -* Profit: The daily profit; can be negative if a loss is incurred. - -References: -=========== - -Evan L. Porteus. Stochastic inventory theory. In D. P. Heyman and M. J. Sobel, editors, -Stochastic Models, volume 2 of Handbooks in Operations Research and Management Science, -chapter 12, pages 605–652. Elsevier, New York, 1990. - - -Optimization Problem: Maximize Profit -===================================== - -Decision Variables: -------------------- - -* Quantity of Liquid (:math:`x`): Amount (volume) of liquid ordered at the beginning of the day. - -Objectives: ------------ - -Maximizes the vendor's expected profit. - -Constraints: ------------- - -Quantity of Liquid must be non-negative: :math:`x > 0` - -Problem Factors: ----------------- - -* Budget: Max # of replications for a solver to take. - - * Default: 1000 - -Fixed Model Factors: --------------------- - -* N/A - -Starting Solution: ------------------- - -* :math:`x = 0` - - -Random Solutions: ------------------ - -If random solutions are needed, generate :math:`x` from an Exponential distribution with mean 1. - -Optimal Solution: ------------------ - -Global minimum at :math:`x^* = (1/((1-r)^{1/β})-1)^{1/α}`. -For the default factors, the optimal solution is :math:`x^*` = 0.1878. - -Optimal Objective Function Value: ---------------------------------- - -For the default factors, the maximum expected profit is 0.4635. +Continuous Newsvendor +===================== + +See the :mod:`simopt.models.cntnv` module for API details. + +Model: Continuous Newsvendor Problem (CNTNV) +-------------------------------------------- + +Description +^^^^^^^^^^^ + +A vendor orders a fixed quantity of liquid at the beginning of a day to be +sold to customers throughout the day. The vendor pays a per-unit order cost +:math:`c` for the initial inventory and sells it the product to customers at a per-unit price +:math:`s`. At the end of the day, any unsold liquid can be salvaged at a per-unit price, :math:`w`. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +Each day's random demand for liquid product follows Burr Type XII distribution and is denoted by :math:`D`. +The parameters of the Burr Type XII distribution are :math:`α` and :math:`β` so that its cumulative +distribution function is given by :math:`F(x) = 1 - (1+x^α)^{-β}` where :math:`x, α,` and +:math:`β` are all positive. + +Model Factors +^^^^^^^^^^^^^ + +* Cost (:math:`c`): The price at which the newsvendor purchases one unit volume of liquid. + * Default: 5 +* Price (:math:`s`): The price at which the newsvendor sells one unit volume of liquid. + * Default: 9 +* Salvage Price (:math:`w`): The price at which any unsold liquid is sold for salvage. + * Default: 1 +* Alpha (:math:`α`): Parameter for the demand distribution. + * Default: 2 +* Beta (:math:`β`): Parameter for the demand distribution. + * Default: 20 +* Quantity of Liquid (:math:`x`): Amount (volume) of liquid ordered at the beginning of the day. + * Default: 0.5 + +Responses +^^^^^^^^^ + +* Profit: The daily profit; can be negative if a loss is incurred. + +References +^^^^^^^^^^ + +Evan L. Porteus. Stochastic inventory theory. In D. P. Heyman and M. J. Sobel, editors, +Stochastic Models, volume 2 of Handbooks in Operations Research and Management Science, +chapter 12, pages 605–652. Elsevier, New York, 1990. + +Optimization Problem: Maximize Profit +------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* Quantity of Liquid (:math:`x`): Amount (volume) of liquid ordered at the beginning of the day. + +Objectives +^^^^^^^^^^ + +Maximizes the vendor's expected profit. + +Constraints +^^^^^^^^^^^ + +Quantity of Liquid must be non-negative: :math:`x > 0` + +Problem Factors +^^^^^^^^^^^^^^^ + +* Budget: Max # of replications for a solver to take. + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* :math:`x = 0` + +Random Solutions +^^^^^^^^^^^^^^^^ + +If random solutions are needed, generate :math:`x` from an Exponential distribution with mean 1. + +Optimal Solution +^^^^^^^^^^^^^^^^^ + +Global minimum at :math:`x^* = (1/((1-r)^{1/β})-1)^{1/α}`. +For the default factors, the optimal solution is :math:`x^*` = 0.1878. + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For the default factors, the maximum expected profit is 0.4635. diff --git a/docs/contam.rst b/docs/source/models/contam.rst similarity index 71% rename from docs/contam.rst rename to docs/source/models/contam.rst index c44ba7f56..54be81a10 100644 --- a/docs/contam.rst +++ b/docs/source/models/contam.rst @@ -1,188 +1,182 @@ -Model: Contamination Control Problem (CONTAM) -============================================= - -Description: ------------- -Consider a food supply chain consisting of :math:`n` stages. Pathogenic microorganisms -and other poisonous elements can contaminate some fraction of the food supply at each -stage. Specifically, let the growth rate of contamination at stage :math:`i` of the -chain be denoted by the random variable :math:`\Lambda_i`, :math:`0 \leq \Lambda_i \leq 1` -for :math:`i = 1, 2, ..., n`. If a prevention effort is made at stage :math:`i`, -the contamination decreases by the random rate :math:`\Gamma_i`, :math:`0 \leq \Gamma_i \leq 1` -with associated prevention cost :math:`c_i`. Let the binary variable :math:`u_i` represent -whether a prevention measure is executed at stage :math:`i`. - - -Sources of Randomness: ----------------------- -1. Contamination rate :math:`\Lambda_i ~ Beta(1, \frac{17}{3})` for :math:`i = 1, 2, ..., n`; -2. Restoration rate :math:`\Gamma_i ~ Beta(1, \frac{3}{7})` for :math:`i = 1, 2, ..., n`; - -Model Factors: --------------- -* contam_rate_alpha: Alpha parameter of beta distribution for growth rate of contamination at each stage. - - * Default: 1.0 - -* contam_rate_beta: Beta parameter of beta distribution for growth rate of contamination at each stage. - - * Default: 17/3 - -* restore_rate_alpha: Alpha parameter of beta distribution for rate that contamination decreases by after prevention effort. - - * Default: 1.0 - -* restore_rate_beta: Beta parameter of beta distribution for rate that contamination decreases by after prevention effort. - - * Default: 3/7 - -* initial_rate_alpha: Alpha parameter of beta distribution for initial contamination fraction. - - * Default: 1.0 - -* initial_rate_beta: Beta parameter of beta distribution for initial contamination fraction. - - * Default: 30.0 - -* stages: Stage of food supply chain. - - * Default: 5 - -* prev_decision: Prevention decision. - - * Default: (0, 0, 0, 0, 0) - -Responses: ----------- -* level: A list of contamination levels over time. - - -References: -=========== -This model is adapted from the article "Contamination control in food supply chain" [1]. -Prepared by Kaeyoung Shin and Raghu Pasupathy of Virginia Tech, 12/18/2010. - -[1] Y. Hu, J. Hu, Y. Xu, and F. Wang. Contamination control in food supply -chain. In *Proceedings of the 2010 Winter Simulation Conference*, 2010. -https://dl.acm.org/doi/abs/10.5555/2433508.2433840 - - - -Optimization Problem: Minimize Prevention Costs (CONTAM-1) -========================================================== - -Decision Variables: -------------------- -* prev_decision - -Objectives: ------------ -Minimize the (deterministic) total cost of prevention efforts (prev_cost * prev_decision). - -.. image:: contam.PNG - :alt: The CONTAM formulation has failed to display - :width: 400 - -Constraints: ------------- -Each element of `prev_decision` is binary. (See above.) - -The contaminated fraction :math:`X_i` at the stage :math:`i` -should not exceed a pre-specified upper limit :math:`p_i` with -probability at least :math:`1 - \epsilon_i`. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 10000 - -* prev_cost: Cost of prevention in each stage. - - * Default: [1, 1, 1, 1, 1] - -* error_prob: Allowable error probability in each stage. - - * Default: [0.2, 0.2, 0.2, 0.2, 0.2] - -* upper_thres: Upper limit of amount of contamination in each stage. - - * Default: [0.1, 0.1, 0.1, 0.1, 0.1] - -Fixed Model Factors: --------------------- -* N/A - -Starting Solution: ------------------- -* initial_solution: (1, 1, 1, 1, 1) - -Random Solutions: ------------------ -Generate a tuple of Bernoulli(0.5) random variables. - -Optimal Solution: ------------------ -Unknown - -Optimal Objective Function Value: ---------------------------------- -Unknown - - -Optimization Problem: ContaminationTotalCostCont (CONTAM-2) -=========================================================== - -Decision Variables: -------------------- -* prev_decision - -Objectives: ------------ -Minimize the (deterministic) total cost of prevention efforts (prev_cost * prev_decision). - -Constraints: ------------- -Each element of `prev_decision` in the interval [0, 1]. - -The contaminated fraction :math:`X_i` at the stage :math:`i` -should not exceed a pre-specified upper limit :math:`p_i` with -probability at least :math:`1 - \epsilon_i`. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 10000 - -* prev_cost: Cost of prevention in each stage. - - * Default: [1, 1, 1, 1, 1] - -* error_prob: Allowable error probability in each stage. - - * Default: [0.2, 0.2, 0.2, 0.2, 0.2] - -* upper_thres: Upper limit of amount of contamination in each stage. - - * Default: [0.1, 0.1, 0.1, 0.1, 0.1] - -Fixed Model Factors: --------------------- -* N/A - -Starting Solution: ------------------- -* initial_solution: (1, 1, 1, 1, 1) - -Random Solutions: ------------------ -Generate a tuple of Uniform(0, 1) random variables. - -Optimal Solution: ------------------ -Unknown - -Optimal Objective Function Value: ---------------------------------- +Contamination Control +===================== + +See the :mod:`simopt.models.contam` module for API details. + +Model: Contamination Control Problem (CONTAM) +--------------------------------------------- + +Description +^^^^^^^^^^^ + +Consider a food supply chain consisting of :math:`n` stages. Pathogenic microorganisms +and other poisonous elements can contaminate some fraction of the food supply at each +stage. Specifically, let the growth rate of contamination at stage :math:`i` of the +chain be denoted by the random variable :math:`\Lambda_i`, :math:`0 \leq \Lambda_i \leq 1` +for :math:`i = 1, 2, ..., n`. If a prevention effort is made at stage :math:`i`, +the contamination decreases by the random rate :math:`\Gamma_i`, :math:`0 \leq \Gamma_i \leq 1` +with associated prevention cost :math:`c_i`. Let the binary variable :math:`u_i` represent +whether a prevention measure is executed at stage :math:`i`. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. Contamination rate :math:`\Lambda_i ~ Beta(1, \frac{17}{3})` for :math:`i = 1, 2, ..., n`; +2. Restoration rate :math:`\Gamma_i ~ Beta(1, \frac{3}{7})` for :math:`i = 1, 2, ..., n`; + +Model Factors +^^^^^^^^^^^^^ + +* contam_rate_alpha: Alpha parameter of beta distribution for growth rate of contamination at each stage. + * Default: 1.0 +* contam_rate_beta: Beta parameter of beta distribution for growth rate of contamination at each stage. + * Default: 17/3 +* restore_rate_alpha: Alpha parameter of beta distribution for rate that contamination decreases by after prevention effort. + * Default: 1.0 +* restore_rate_beta: Beta parameter of beta distribution for rate that contamination decreases by after prevention effort. + * Default: 3/7 +* initial_rate_alpha: Alpha parameter of beta distribution for initial contamination fraction. + * Default: 1.0 +* initial_rate_beta: Beta parameter of beta distribution for initial contamination fraction. + * Default: 30.0 +* stages: Stage of food supply chain. + * Default: 5 +* prev_decision: Prevention decision. + * Default: (0, 0, 0, 0, 0) + +Responses +^^^^^^^^^ + +* level: A list of contamination levels over time. + +References +^^^^^^^^^^ + +This model is adapted from the article "Contamination control in food supply chain" [1]. +Prepared by Kaeyoung Shin and Raghu Pasupathy of Virginia Tech, 12/18/2010. + +[1] Y. Hu, J. Hu, Y. Xu, and F. Wang. Contamination control in food supply +chain. In *Proceedings of the 2010 Winter Simulation Conference*, 2010. +https://dl.acm.org/doi/abs/10.5555/2433508.2433840 + +Optimization Problem: Minimize Prevention Costs (CONTAM-1) +---------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* prev_decision + +Objectives +^^^^^^^^^^ + +Minimize the (deterministic) total cost of prevention efforts (prev_cost * prev_decision). + +.. image:: _static/contam.PNG + :alt: The CONTAM formulation has failed to display + :width: 400 + +Constraints +^^^^^^^^^^^ + +Each element of `prev_decision` is binary. (See above.) + +The contaminated fraction :math:`X_i` at the stage :math:`i` +should not exceed a pre-specified upper limit :math:`p_i` with +probability at least :math:`1 - \epsilon_i`. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 10000 +* prev_cost: Cost of prevention in each stage. + * Default: [1, 1, 1, 1, 1] +* error_prob: Allowable error probability in each stage. + * Default: [0.2, 0.2, 0.2, 0.2, 0.2] +* upper_thres: Upper limit of amount of contamination in each stage. + * Default: [0.1, 0.1, 0.1, 0.1, 0.1] + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* initial_solution: (1, 1, 1, 1, 1) + +Random Solutions +^^^^^^^^^^^^^^^^ + +Generate a tuple of Bernoulli(0.5) random variables. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Unknown + +Optimization Problem: ContaminationTotalCostCont (CONTAM-2) +----------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* prev_decision + +Objectives +^^^^^^^^^^ + +Minimize the (deterministic) total cost of prevention efforts (prev_cost * prev_decision). + +Constraints +^^^^^^^^^^^ + +Each element of `prev_decision` in the interval [0, 1]. + +The contaminated fraction :math:`X_i` at the stage :math:`i` +should not exceed a pre-specified upper limit :math:`p_i` with +probability at least :math:`1 - \epsilon_i`. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 10000 +* prev_cost: Cost of prevention in each stage. + * Default: [1, 1, 1, 1, 1] +* error_prob: Allowable error probability in each stage. + * Default: [0.2, 0.2, 0.2, 0.2, 0.2] +* upper_thres: Upper limit of amount of contamination in each stage. + * Default: [0.1, 0.1, 0.1, 0.1, 0.1] + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* initial_solution: (1, 1, 1, 1, 1) + +Random Solutions +^^^^^^^^^^^^^^^^ + +Generate a tuple of Uniform(0, 1) random variables. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Unknown \ No newline at end of file diff --git a/docs/dualsourcing.rst b/docs/source/models/dualsourcing.rst similarity index 81% rename from docs/dualsourcing.rst rename to docs/source/models/dualsourcing.rst index 14f3dbfc6..4dd7ef3d3 100644 --- a/docs/dualsourcing.rst +++ b/docs/source/models/dualsourcing.rst @@ -1,139 +1,130 @@ -Model: Dual Sourcing System (DUALSOURCING) -========================================== - -Description: ------------- -Consider a single-stage, incapacitated, manufacturing location facing stochastic demand. -The manufacturer can buy the material from a “regular” supplier at cost :math:`c_r` per unit, or, -if needed, she can get some or all of the material “expedited” at some premium cost :math:`c_e` -per unit with :math:`c_e > c_r`. -Regular orders arrive after :math:`l_r` periods while expedited orders arrive after :math:`l_e` periods with -:math:`l_e < l_r`. Let the difference in lead times be :math:`l = l_r − l_e ≥ 1`. - -If there is remaining on-hand inventory at the end of period :math:`n` (after demand :math:`d_n` is satisfied), -these items are carried over to the next period (i.e., :math:`I_n+1 > 0`) at a holding cost per unit. -However, if there is a stock-out (i.e., :math:`In + 1 < 0`), there is a penalty cost per unit -of unsatisfied demand. - -We will let the period :math:`n` expediting order be based on the on-hand inventory plus the orders that -will arrive within :math:`l_e` periods (both regular and expedited). Regular orders that are due to arrive -after :math:`l_e` periods are not considered in expedited ordering decisions. -The expedited order is placed to restore the expedited inventory position :math:`IP_n^e`, -to some target parameter level :math:`z_e`. The regular order :math:`X_n^r`, on the other hand, -is based on the regular inventory position (sum of on-hand inventory and all outstanding orders, -including the expedited order placed in the current period). Similarly, it tries to restore the regular -inventory position :math:`IP_n^r` to the target parameter :math:`z_r`. Thus, under this model, we carry two inventory positions, -one for regular orders and another for expedited orders. - -Sources of Randomness: ----------------------- -Demand follows a normal distribution. - -Model Factors: --------------- -* n_days: Number of days to simulate. - - * Default: 1000 - -* initial_inv: Initial inventory. - - * Default: 40 - -* cost_reg: Regular ordering cost per unit. - - * Default: 100.00 - -* cost_exp: Expedited ordering cost per unit. - - * Default: 110.00 - -* lead_reg: Lead time for regular orders in days. - - * Default: 110.00 - -* lead_exp: Lead time for expedited orders in days. - - * Default: 0 - -* holding_cost: Holding cost per unit per period. - - * Default: 5.00 - -* penalty_cost: Penalty cost per unit per period for backlogging. - - * Default: 495.00 - -* st_dev: Standard deviation of demand distribution. - - * Default: 10.0 - -* mu: Mean of demand distribution. - - * Default: 30.0 - -* order_level_reg: Order-up-to level for regular orders. - - * Default: 80 - -* order_level_exp: Order-up-to level for expedited orders. - - * Default: 50 - -Responses: ----------- -* average_holding_cost: The average holding cost over the time period. - -* average_penalty_cost: The average penalty cost over the time period. - -* average_ordering_cost: The average ordering cost over the time period. - -References: -=========== -This model is adapted from the article `Veeraraghavan, S and Scheller-Wolf, A. Now or Later: -A simple policy for Effective Dual Sourcing in Capacitated Systems. Operations Research (4), 850- 864. -`_ - - -Optimization Problem: Minimize total cost (DUALSOURCING-1) -========================================================== - -Decision Variables: -------------------- -* order_level_exp -* order_level_reg - -Objectives: ------------ -Minimize the expected total cost: sum of average_holding_cost, average_penalty_cost, average_ordering_cost. - -Constraints: ------------- -order_level_exp and order_level_reg are both non-negative. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 1000 - -Fixed Model Factors: --------------------- -N/A - -Starting Solution: ------------------- -* order_level_exp: 50 - -* order_level_reg: 80 - -Random Solutions: ------------------ -Draw order_level_exp from Uniform(40,60) and order_level_reg from Uniform(70,90). - -Optimal Solution: ------------------ -Unknown. - -Optimal Objective Function Value: ---------------------------------- +Dual Sourcing System +==================== + +See the :mod:`simopt.models.dualsourcing` module for API details. + +Model: Dual Sourcing System (DUALSOURCING) +------------------------------------------ + +Description +^^^^^^^^^^^ + +Consider a single-stage, incapacitated, manufacturing location facing stochastic demand. +The manufacturer can buy the material from a “regular” supplier at cost :math:`c_r` per unit, or, +if needed, she can get some or all of the material “expedited” at some premium cost :math:`c_e` +per unit with :math:`c_e > c_r`. +Regular orders arrive after :math:`l_r` periods while expedited orders arrive after :math:`l_e` periods with +:math:`l_e < l_r`. Let the difference in lead times be :math:`l = l_r − l_e ≥ 1`. + +If there is remaining on-hand inventory at the end of period :math:`n` (after demand :math:`d_n` is satisfied), +these items are carried over to the next period (i.e., :math:`I_n+1 > 0`) at a holding cost per unit. +However, if there is a stock-out (i.e., :math:`In + 1 < 0`), there is a penalty cost per unit +of unsatisfied demand. + +We will let the period :math:`n` expediting order be based on the on-hand inventory plus the orders that +will arrive within :math:`l_e` periods (both regular and expedited). Regular orders that are due to arrive +after :math:`l_e` periods are not considered in expedited ordering decisions. +The expedited order is placed to restore the expedited inventory position :math:`IP_n^e`, +to some target parameter level :math:`z_e`. The regular order :math:`X_n^r`, on the other hand, +is based on the regular inventory position (sum of on-hand inventory and all outstanding orders, +including the expedited order placed in the current period). Similarly, it tries to restore the regular +inventory position :math:`IP_n^r` to the target parameter :math:`z_r`. Thus, under this model, we carry two inventory positions, +one for regular orders and another for expedited orders. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +Demand follows a normal distribution. + +Model Factors +^^^^^^^^^^^^^ + +* n_days: Number of days to simulate. + * Default: 1000 +* initial_inv: Initial inventory. + * Default: 40 +* cost_reg: Regular ordering cost per unit. + * Default: 100.00 +* cost_exp: Expedited ordering cost per unit. + * Default: 110.00 +* lead_reg: Lead time for regular orders in days. + * Default: 110.00 +* lead_exp: Lead time for expedited orders in days. + * Default: 0 +* holding_cost: Holding cost per unit per period. + * Default: 5.00 +* penalty_cost: Penalty cost per unit per period for backlogging. + * Default: 495.00 +* st_dev: Standard deviation of demand distribution. + * Default: 10.0 +* mu: Mean of demand distribution. + * Default: 30.0 +* order_level_reg: Order-up-to level for regular orders. + * Default: 80 +* order_level_exp: Order-up-to level for expedited orders. + * Default: 50 + +Responses +^^^^^^^^^ + +* average_holding_cost: The average holding cost over the time period. +* average_penalty_cost: The average penalty cost over the time period. +* average_ordering_cost: The average ordering cost over the time period. + +References +^^^^^^^^^^ + +This model is adapted from the article `Veeraraghavan, S and Scheller-Wolf, A. Now or Later: +A simple policy for Effective Dual Sourcing in Capacitated Systems. Operations Research (4), 850- 864. +`_ + +Optimization Problem: Minimize total cost (DUALSOURCING-1) +---------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* order_level_exp +* order_level_reg + +Objectives +^^^^^^^^^^ + +Minimize the expected total cost: sum of average_holding_cost, average_penalty_cost, average_ordering_cost. + +Constraints +^^^^^^^^^^^ + +order_level_exp and order_level_reg are both non-negative. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* order_level_exp: 50 +* order_level_reg: 80 + +Random Solutions +^^^^^^^^^^^^^^^^ + +Draw order_level_exp from Uniform(40,60) and order_level_reg from Uniform(70,90). + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown. + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Unknown. \ No newline at end of file diff --git a/docs/dynamnews.rst b/docs/source/models/dynamnews.rst similarity index 78% rename from docs/dynamnews.rst rename to docs/source/models/dynamnews.rst index 8e5d62bac..89529ca06 100644 --- a/docs/dynamnews.rst +++ b/docs/source/models/dynamnews.rst @@ -1,125 +1,126 @@ -Model: Newsvendor under Dynamic Consumer Substitution (DYNAMNEWS) -================================================================= - -Description: ------------- -A retailer sells :math:`n` substitutable products :math:`j = 1, \ldots, n`, each with price :math:`p^j` and cost :math:`c^j`. -The initial inventory levels are denoted by :math:`x = (x_1, \ldots, x_n)`. - -Unlike in the classical newsvendor problem, the demand is not given by a predetermined distribution, -but depends on the initial inventory levels :math:`x` as well. The customers :math:`t = 1, \ldots, T` -arrive in order and each can choose one product that is in-stock when he/she arrives, namely any element in -:math:`S(x_t) = \{j : x^j_t > 0\} \cup \{0\}` where :math:`0` denotes the no-purchase option. - -Each customer :math:`t` assigns a utility :math:`U^j_t` to option :math:`j = 0, \ldots, n`, and thus :math:`U_t = (U^0_t, U^1_t, \ldots, U^n_t)` is his/her -vector of utilities. Note that :math:`U^j_t` is the utility of product :math:`j` net of the price :math:`p^j`, and therefore could be -negative. Since the *no-purchase* option :math:`0` incurs neither utility nor cost, one can assume :math:`U^0_t = 0`. -Customer :math:`t` makes their choice to maximize his/her utility - -.. math:: - d(x_t,U_t) = \argmax_{j\in S(x_t)} U^j_t - -Sources of Randomness: ----------------------- -1. Use the Multinomial Logit (MNL) model. :math:`U^0_t, U^1_t, \ldots, U^n_t` are mutually independent random variables -of the form - -.. math:: - U^j_t = u^j + \epsilon^j_t - -where :math:`u^j` is a constant and :math:`\epsilon^j_t`, :math:`j = 0, 1, \ldots, n` are mutually independent Gumbel random variables with -:math:`P(\epsilon^j_t \leq z) = \exp(-e^{-(z/\mu+\gamma)})` (:math:`\gamma` is Euler's constant, :math:`\gamma \approx 0.5772`.) - - -Model Factors: --------------- -* num_prod: Number of Products - - * Default: 2 - -* num_customer: Number of Customers - - * Default: 5 - -* c_utility: Constant of each product's utility - - * Default: (1.0, 1.0) - -* mu: Mu for calculating Gumbel random variable - - * Default: 1.0 - -* init_level: Initial inventory level - - * Default: (2, 3) - -* price: Sell price of products - - * Default: (9, 9) - -* cost: Cost of prodcuts - - * Default: (5, 5) - -An alternative setting has 10 products, 30 customers, linearly increasing utilities -(:math:`u^j = 5 + j`) and initial inventory levels :math:`(3, 3, \ldots, 3)`. - -Respones: ---------- -* profit: profit in this scenario - -* n_prod_stockout: number of products which are out of stock - - -References: -=========== -This model is adapted from the article Mahajan, S., & van Ryzin, G. (2001). -Stocking Retail Assortments under Dynamic Consumer Substitution. -*Operations Research*, 49(3), 334-351. -(https://pubsonline.informs.org/doi/abs/10.1287/opre.49.3.334.11210) - - -Optimization Problem: Maximize Profit ( 0\} \cup \{0\}` where :math:`0` denotes the no-purchase option. + +Each customer :math:`t` assigns a utility :math:`U^j_t` to option :math:`j = 0, \ldots, n`, and thus :math:`U_t = (U^0_t, U^1_t, \ldots, U^n_t)` is his/her +vector of utilities. Note that :math:`U^j_t` is the utility of product :math:`j` net of the price :math:`p^j`, and therefore could be +negative. Since the *no-purchase* option :math:`0` incurs neither utility nor cost, one can assume :math:`U^0_t = 0`. +Customer :math:`t` makes their choice to maximize his/her utility + +.. math:: + d(x_t,U_t) = \argmax_{j\in S(x_t)} U^j_t + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. Use the Multinomial Logit (MNL) model. :math:`U^0_t, U^1_t, \ldots, U^n_t` are mutually independent random variables +of the form + +.. math:: + U^j_t = u^j + \epsilon^j_t + +where :math:`u^j` is a constant and :math:`\epsilon^j_t`, :math:`j = 0, 1, \ldots, n` are mutually independent Gumbel random variables with +:math:`P(\epsilon^j_t \leq z) = \exp(-e^{-(z/\mu+\gamma)})` (:math:`\gamma` is Euler's constant, :math:`\gamma \approx 0.5772`.) + +Model Factors +^^^^^^^^^^^^^ + +* num_prod: Number of Products + * Default: 2 +* num_customer: Number of Customers + * Default: 5 +* c_utility: Constant of each product's utility + * Default: (1.0, 1.0) +* mu: Mu for calculating Gumbel random variable + * Default: 1.0 +* init_level: Initial inventory level + * Default: (2, 3) +* price: Sell price of products + * Default: (9, 9) +* cost: Cost of prodcuts + * Default: (5, 5) + +An alternative setting has 10 products, 30 customers, linearly increasing utilities +(:math:`u^j = 5 + j`) and initial inventory levels :math:`(3, 3, \ldots, 3)`. + +Responses +^^^^^^^^^ + +* profit: profit in this scenario +* n_prod_stockout: number of products which are out of stock + +References +^^^^^^^^^^ + +This model is adapted from the article Mahajan, S., & van Ryzin, G. (2001). +Stocking Retail Assortments under Dynamic Consumer Substitution. +*Operations Research*, 49(3), 334-351. +(https://pubsonline.informs.org/doi/abs/10.1287/opre.49.3.334.11210) + +Optimization Problem: Maximize Profit (DYNAMNEWS-1) +--------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* init_level + +Objectives +^^^^^^^^^^ + +Let :math:`\omega = \{U_t : t = 1, \ldots, T\}`denote the sample path, +and assume that `\omega` follows the probability distribution :math:`P`. +We consider a one-period inventory model and assume :math:`P(T < +\infty) = 1`. +The retailer knows the probability measure :math:`P`. +His/her objective is to choose the initial inventory level :math:`x` that maximizes profit. + +Constraints +^^^^^^^^^^^ + +* Initial inventory levels must be non-negative. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* initial_solution: (2, 3) or :math:`(3, 3, \ldots, 3)` + +Random Solutions +^^^^^^^^^^^^^^^^ + +Sample uniformly from (0, 10) in the dimension of num_prod. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Unknown diff --git a/docs/source/models/example.rst b/docs/source/models/example.rst new file mode 100644 index 000000000..7b4d6dc70 --- /dev/null +++ b/docs/source/models/example.rst @@ -0,0 +1,6 @@ +Example +======= + +See the :mod:`simopt.models.example` module for API details. + +Documentation for this model is not yet available. diff --git a/docs/facilitysizing.rst b/docs/source/models/facilitysizing.rst similarity index 68% rename from docs/facilitysizing.rst rename to docs/source/models/facilitysizing.rst index d30e89ad5..ae2d5abf5 100644 --- a/docs/facilitysizing.rst +++ b/docs/source/models/facilitysizing.rst @@ -1,154 +1,166 @@ -Model: Facility Sizing -====================== - -Description: ------------- - -The facility-sizing problem is formulated as follows: :math:`m` facilities are to be installed, each with capacity -:math:`xi ≥ 0, i = 1, . . . , m`. Then the random demand :math:`ξi` arrives at facility :math:`i`, with a known joint distribution -of the random vector :math:`ξ = (ξ1, . . . , ξm)`. - -A realization of the demand, :math:`ξ = (ξ1, . . . , ξm)`, is said to be satisfied by the capacity :math:`x` if :math:`xi ≥ ξi, ∀i = 1, . . . , m`. - -Sources of Randomness: ----------------------- -1. random demand vector :math:`ξ` follows a multivariate normal distribution and correlation coefficients :math:`ρi,j` , :math:`i != j` . - -Model Factors: --------------- -* :math:`\mu`: Mean vector of the multivariate normal distribution. - * Default: [100, 100, 100] - -* :math:`\Sigma`: Variance-covariance matrix of multivariate normal distribution. - * Default: [[2000, 1500, 500], [1500, 2000, 750], [500, 750, 2000]] - -* :math:`capacity`: Inventory capacities of the facilities. - * Default: [150, 300, 400] - -* :math:`n_facility`: The number of facilities. - * Default: 3 - - -Respones: ---------- -* :math:`stockout_flag`: - 0: all facilities satisfy the demand - 1: at least one of the facilities did not satisfy the demand - -* :math:`n_stockout`: - the number of facilities which cannot satisfy the demand - -* :math:`n_cut`: - the amount of total demand which cannot be satisfied - - -References: -=========== -This model is adapted from the article Rengarajan, T., & Morton, D.P. (2009). Estimating the Efficient Frontier of a Probabilistic Bicriteria Model. Proceedings of the 2009 Winter Simulation Conference. `(https://www.informs-sim.org/wsc09papers/048.pdf)` - - -Optimization Problem: Minimize Total Cost (FACSIZE-1) -===================================================== - -Our goal is to minimize the total costs of installing capacity while keeping the probability of stocking out low. - -The probability of failing to satisfy demand :math:`ξ = (ξ_1, . . . , ξ_m)` is :math:`p(x) = P(ξ !<= x)`. Let :math:`epsilon ∈ [0, 1]` be a risk-level parameter, then we obtain the probabilistic constraint: - -:math:`P(ξ !<= x) ≤ epsilon` - -Meanwhile, the unit cost of installing facility i is :math:`ci`, and hence the total cost is :math:`\sum_{i=1}^n c_i x_i`. - -Decision Variables: -------------------- -* :math:`capacity` - -Objectives: ------------ -Minimize the (deterministic) total cost of installing capacity. - -Constraints: ------------- -1 stochastic constraint: :math:`P(Stockout) <= epsilon`. -Box constraints: 0 < :math:`x_i` < infinity for all :math:`i`. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - * Default: 10000 - -* epsilon: Maximum allowed probability of stocking out. - * Default: 0.05 - -* installation_costs: Cost to install a unit of capacity at each facility - * Default: (1, 1, 1) - -Fixed Model Factors: --------------------- -None - -Starting Solution: ------------------- -* capacity: (300, 300, 300) - -Random Solutions: ------------------ -* Each facility's capacity is Uniform(0, 300). - -Optimal Solution: ------------------ -None - -Optimal Objective Function Value: ---------------------------------- -None - - -Optimization Problem: Maximize Service Level (FACSIZE-2) -======================================================== - -Our goal is to maximize the probability of not stocking out subject to a budget -constraint on the total cost of installing capacity. - -Decision Variables: -------------------- -* :math:`capacity` - -Objectives: ------------ -Maximize the probability of not stocking out. - -Constraints: ------------- -1 deterministic constraint: sum of facility capacity installation costs less than an installation budget. -Box constraints: 0 < :math:`x_i` < infinity for all :math:`i`. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - * Default: 10000 - -* installation_costs: Cost to install a unit of capacity at each facility. - * Default: (1, 1, 1) - -* installation_budget: Total budget for installation costs. - * Default: 500.0 - -Fixed Model Factors: --------------------- -None - -Starting Solution: ------------------- -* capacity: (100, 100, 100) - -Random Solutions: ------------------ -* Use acceptance rejection to generate capacity vectors uniformly from space of vectors summing to less than installation budget. - -Optimal Solution: ------------------ -None - -Optimal Objective Function Value: ---------------------------------- -None +Facility Sizing +=============== + +See the :mod:`simopt.models.facilitysizing` module for API details. + +Model: Facility Sizing +---------------------- + +Description +^^^^^^^^^^^ + +The facility-sizing problem is formulated as follows: :math:`m` facilities are to be installed, each with capacity +:math:`xi ≥ 0, i = 1, . . . , m`. Then the random demand :math:`ξi` arrives at facility :math:`i`, with a known joint distribution +of the random vector :math:`ξ = (ξ1, . . . , ξm)`. + +A realization of the demand, :math:`ξ = (ξ1, . . . , ξm)`, is said to be satisfied by the capacity :math:`x` if :math:`xi ≥ ξi, ∀i = 1, . . . , m`. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. random demand vector :math:`ξ` follows a multivariate normal distribution and correlation coefficients :math:`ρi,j` , :math:`i != j` . + +Model Factors +^^^^^^^^^^^^^ + +* :math:`\mu`: Mean vector of the multivariate normal distribution. + * Default: [100, 100, 100] +* :math:`\Sigma`: Variance-covariance matrix of multivariate normal distribution. + * Default: [[2000, 1500, 500], [1500, 2000, 750], [500, 750, 2000]] +* :math:`capacity`: Inventory capacities of the facilities. + * Default: [150, 300, 400] +* :math:`n\_facility`: The number of facilities. + * Default: 3 + +Responses +^^^^^^^^^ + +* :math:`stockout\_flag`: + * 0, if all facilities satisfy the demand + * 1, if at least one of the facilities did not satisfy the demand +* :math:`n\_stockout`: the number of facilities which cannot satisfy the demand +* :math:`n\_cut`: the amount of total demand which cannot be satisfied + +References +^^^^^^^^^^ + +This model is adapted from the article Rengarajan, T., & Morton, D.P. (2009). Estimating the Efficient Frontier of a Probabilistic Bicriteria Model. Proceedings of the 2009 Winter Simulation Conference. `(https://www.informs-sim.org/wsc09papers/048.pdf)` + +Optimization Problem: Minimize Total Cost (FACSIZE-1) +----------------------------------------------------- + +Our goal is to minimize the total costs of installing capacity while keeping the probability of stocking out low. + +The probability of failing to satisfy demand :math:`ξ = (ξ_1, . . . , ξ_m)` is :math:`p(x) = P(ξ !<= x)`. Let :math:`epsilon ∈ [0, 1]` be a risk-level parameter, then we obtain the probabilistic constraint: + +:math:`P(ξ !<= x) ≤ epsilon` + +Meanwhile, the unit cost of installing facility i is :math:`ci`, and hence the total cost is :math:`\sum_{i=1}^n c_i x_i`. + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* :math:`capacity` + +Objectives +^^^^^^^^^^ + +Minimize the (deterministic) total cost of installing capacity. + +Constraints +^^^^^^^^^^^ + +1 stochastic constraint: :math:`P(Stockout) <= epsilon`. +Box constraints: 0 < :math:`x_i` < infinity for all :math:`i`. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 10000 +* epsilon: Maximum allowed probability of stocking out. + * Default: 0.05 +* installation_costs: Cost to install a unit of capacity at each facility + * Default: (1, 1, 1) + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +None + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* capacity: (300, 300, 300) + +Random Solutions +^^^^^^^^^^^^^^^^ + +* Each facility's capacity is Uniform(0, 300). + +Optimal Solution +^^^^^^^^^^^^^^^^ + +None + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +None + +Optimization Problem: Maximize Service Level (FACSIZE-2) +-------------------------------------------------------- + +Our goal is to maximize the probability of not stocking out subject to a budget +constraint on the total cost of installing capacity. + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* :math:`capacity` + +Objectives +^^^^^^^^^^ + +Maximize the probability of not stocking out. + +Constraints +^^^^^^^^^^^ + +1 deterministic constraint: sum of facility capacity installation costs less than an installation budget. +Box constraints: 0 < :math:`x_i` < infinity for all :math:`i`. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 10000 +* installation_costs: Cost to install a unit of capacity at each facility. + * Default: (1, 1, 1) +* installation_budget: Total budget for installation costs. + * Default: 500.0 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +None + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* capacity: (100, 100, 100) + +Random Solutions +^^^^^^^^^^^^^^^^ + +* Use acceptance rejection to generate capacity vectors uniformly from space of vectors summing to less than installation budget. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +None + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +None diff --git a/docs/source/models/fixedsan.rst b/docs/source/models/fixedsan.rst new file mode 100644 index 000000000..3d17ce9fd --- /dev/null +++ b/docs/source/models/fixedsan.rst @@ -0,0 +1,6 @@ +Fixed Stochastic Activity Network +================================= + +See the :mod:`simopt.models.fixedsan` module for API details. + +Documentation for this model is not yet available. diff --git a/docs/hotel.rst b/docs/source/models/hotel.rst similarity index 87% rename from docs/hotel.rst rename to docs/source/models/hotel.rst index 894d5d6d0..ce045f0d8 100644 --- a/docs/hotel.rst +++ b/docs/source/models/hotel.rst @@ -1,191 +1,188 @@ -Model: Hotel Revenue Management (HOTEL) -======================================= - -Description: ------------- -Most of the revenue for a hotel comes from guests staying in its rooms. Assume a -given hotel has only two rates: rack rate and discount rate, which pay :math:`p_f` -and :math:`p_d` per night, respectively. Furthermore, let each different combination -of length of stay, arrival date and rate paid be a "product" so that the following -56 products are available to satisfy one week's worth of capacity (14 arriving Monday, -12 arriving Tuesday, ..., 2 Arriving Sunday): - -1. One night stay, rack rate arriving Monday -2. One night stay, discount rate arriving Monday -3. Two night stay, rack rate arriving Monday -4. Two night stay, discount rate arriving Monday -5. ... -55. One night stay, rack rate arriving Sunday -56. One night stay, discount rate arriving Sunday - -For a given stay, the hotel collects revenue equal to the (rate paid) x (length of stay). -Lastly, let the arrival processes for each product be a stationary Poisson process with -rate :math:`\lambda_i`, noting that orders for a Monday night stay stop arriving at -3 AM Tuesday night, for a Tuesday night stay at 3 AM Wednesday, and so on. - -Booking limits (:math:`b_1, ..., b_{56}`) are controls -that limit the amount of capacity that can be sold to any particular product; i.e., -they represent the maximum number of requests of product :math:`i` we are willing to -accept. The booking limits do not represent the number of rooms -reserved for each product, rather, they represent the number of rooms available to -this product and all products that use the same resources and have a higher booking limit. -For example, if we have five products and all of them require the same resource (say capacity -:math:`C = 10`) and their corresponding booking limits are :math:`b_1 = 10`, :math:`b_2 = 8`, -:math:`b_3 = 4`, :math:`b_4 = 2`, :math:`b_5 = 1`, we know we can only take 1 request for product 5, 2 requests -for product 4 and so on. However, this **does not mean that 2 rooms will be saved** -until 2 requests for product 4 arrive; **rather**, it means that, **out of all requests -accepted, at most 2 can be of product 4**. Note also that the maximum number of requests -accepted in this case would be 10, as they all use the same resource, which has :math:`C = 10`. -Doing this ensures that those products with higher booking limits are always accepted -if capacity is available while also accounting for the interconnectedness of the system. - -Now, once the booking limits are set, a request for product :math:`i` is accepted if -and only if :math:`b_i > 0` and rejected otherwise. When a request for product :math:`i` is -accepted, all of the booking limits that require the resources used by product :math:`i` -must be updated to account for the decrease in available resources. For example, -if a request for a 3-night stay arriving Monday is accepted, all products using a night -on either Monday, Tuesday, or Wednesday must have their booking limits decreased by one. - -We may see that :math:`b_i \leq C` (to avoid overbooking) and -that the highest booking limit must equal capacity (we want to rent as many rooms as -possible without going over capacity, thus, all rooms must be available to at least one -product). Furthermore, since requests are only accepted when rooms are available -(:math:`b_i > 0`), we are guaranteed to never go over capacity. - -In summary, a booking limit represents the maximum number of requests of product :math:`i` -that we are willing to accept given that we start with full availability. As soon as -a request is accepted, available capacity changes and booking limits must be updated -to account for this change. Although our interest is in modeling the full 56 products -to find the optimal set of booking limits, to illustrate how booking limits are updated, -one may look at the following, small-scale example: - -Assume a hotel offers only the following 5 products: -1. Two night stay arriving Monday. -2. Two night stay arriving Tuesday. -3. Two night stay arriving Wednesday. -4. Three night stay arriving Wednesday. -5. Two night stay arriving Thursday. - -If the booking limits for each product are :math:`b_1 = 10`, :math:`b_2 = 8`, :math:`b_3 = 4`, :math:`b_4 = 7`, -:math:`b_5 = 1` and the following requests are received, the booking limits would be updated -in the following way as decisions to accept or reject a given order are made: - -.. image:: hotel.PNG - :alt: The HOTEL table has failed to display - :width: 800 - -Note that, in this case, product 1 has a final booking limit of 9 as only one room -has been sold on either Monday or Tuesday, which means that 9 rooms are still available -on Monday night. - -To simplify this, one may create a binary matrix `A` showing which products use which -resources. Thus, we will let each row be a resource available and each column a product, -having a 1 in entry :math:`(i,j)` if product :math:`j` uses resource :math:`i`, and 0 -otherwise. Then, if we accept a request for product :math:`i`, we must update the booking -limits of all products :math:`j` such that :math:`A_j^T \cdot A_i \geq 1` (they share -at least one of the resources). For this small example, we have: - -.. image:: hotel2.PNG - :alt: The HOTEL matrix has failed to display - :width: 300 - -Sources of Randomness: ----------------------- -1. Stationary Poisson process with rate :math:`\lambda_i` for guest arrivals for product :math:`i`. - -Model Factors: --------------- -* num_products: Number of products: (rate, length of stay). - - * Default: 56 - -* lambda: Arrival rates for each product. - - * Default: Take :math:`\lambda_i = \frac{1}{168}, \frac{2}{168}, \frac{3}{168}, \frac{2}{168}, \frac{1}{168}, \frac{0.5}{168}, \frac{0.25}{168}` for 1-night, 2-night, ..., 7-night stay respectively. - -* num_rooms: Hotel capacity. - - * Default: 100 - -* discount_rate: Discount rate. - - * Default: 100 - -* rack_rate: Rack rate (full price). - - * Default: 200 - -* product_incidence: Incidence matrix. - - * Default: Let each row be a resource available and each column a product, having a 1 in entry :math:`(i,j)` if product :math:`j` uses resource :math:`i`, and 0 otherwise. - -* time_limit: Time after which orders of each product no longer arrive (e.g. Mon night stops at 3am Tues or t=27). - - * Default: list of 14 27's, 12 51's, 10 75's, 8 99's, 6 123's, 4 144's, and 2 168's - -* time_before: Hours before :math:`t=0` to start running (e.g. 168 means start at time -168). - - * Default: 168 - -* runlength: Runlength of simulation (in hours) after t=0. - - * Default: 168 - -* booking_limits: Booking limits. - - * Default: tuple of 56 100's - -Responses: ----------- -* revenue: Expected revenue. - - -References: -=========== -N/A - - - - -Optimization Problem: Maximize Revenue (HOTEL-1) -================================================ - -Decision Variables: -------------------- -* booking_limits - -Objectives: ------------ -Maximize the expected revenue. - -Constraints: ------------- -Lower bounded by 0 and upper bounded by the total number of rooms. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 10000 - -Fixed Model Factors: --------------------- -* N/A - -Starting Solution: ------------------- -* initial_solution: Initial solution. - - * Default: tuple of 56 zeros - -Random Solutions: ------------------ -Let each :math:`b_i` (element in tuple) be distributed Uniformly :math:`(0, C)`. - -Optimal Solution: ------------------ -Unknown - -Optimal Objective Function Value: ---------------------------------- +Hotel Revenue Management +======================== + +See the :mod:`simopt.models.hotel` module for API details. + +Model: Hotel Revenue Management (HOTEL) +--------------------------------------- + +Description +^^^^^^^^^^^ + +Most of the revenue for a hotel comes from guests staying in its rooms. Assume a +given hotel has only two rates: rack rate and discount rate, which pay :math:`p_f` +and :math:`p_d` per night, respectively. Furthermore, let each different combination +of length of stay, arrival date and rate paid be a "product" so that the following +56 products are available to satisfy one week's worth of capacity (14 arriving Monday, +12 arriving Tuesday, ..., 2 Arriving Sunday): + +1. One night stay, rack rate arriving Monday +2. One night stay, discount rate arriving Monday +3. Two night stay, rack rate arriving Monday +4. Two night stay, discount rate arriving Monday + +... + +55. One night stay, rack rate arriving Sunday +56. One night stay, discount rate arriving Sunday + +For a given stay, the hotel collects revenue equal to the (rate paid) x (length of stay). +Lastly, let the arrival processes for each product be a stationary Poisson process with +rate :math:`\lambda_i`, noting that orders for a Monday night stay stop arriving at +3 AM Tuesday night, for a Tuesday night stay at 3 AM Wednesday, and so on. + +Booking limits (:math:`b_1, ..., b_{56}`) are controls +that limit the amount of capacity that can be sold to any particular product; i.e., +they represent the maximum number of requests of product :math:`i` we are willing to +accept. The booking limits do not represent the number of rooms +reserved for each product, rather, they represent the number of rooms available to +this product and all products that use the same resources and have a higher booking limit. +For example, if we have five products and all of them require the same resource (say capacity +:math:`C = 10`) and their corresponding booking limits are :math:`b_1 = 10`, :math:`b_2 = 8`, +:math:`b_3 = 4`, :math:`b_4 = 2`, :math:`b_5 = 1`, we know we can only take 1 request for product 5, 2 requests +for product 4 and so on. However, this **does not mean that 2 rooms will be saved** +until 2 requests for product 4 arrive; **rather**, it means that, **out of all requests +accepted, at most 2 can be of product 4**. Note also that the maximum number of requests +accepted in this case would be 10, as they all use the same resource, which has :math:`C = 10`. +Doing this ensures that those products with higher booking limits are always accepted +if capacity is available while also accounting for the interconnectedness of the system. + +Now, once the booking limits are set, a request for product :math:`i` is accepted if +and only if :math:`b_i > 0` and rejected otherwise. When a request for product :math:`i` is +accepted, all of the booking limits that require the resources used by product :math:`i` +must be updated to account for the decrease in available resources. For example, +if a request for a 3-night stay arriving Monday is accepted, all products using a night +on either Monday, Tuesday, or Wednesday must have their booking limits decreased by one. + +We may see that :math:`b_i \leq C` (to avoid overbooking) and +that the highest booking limit must equal capacity (we want to rent as many rooms as +possible without going over capacity, thus, all rooms must be available to at least one +product). Furthermore, since requests are only accepted when rooms are available +(:math:`b_i > 0`), we are guaranteed to never go over capacity. + +In summary, a booking limit represents the maximum number of requests of product :math:`i` +that we are willing to accept given that we start with full availability. As soon as +a request is accepted, available capacity changes and booking limits must be updated +to account for this change. Although our interest is in modeling the full 56 products +to find the optimal set of booking limits, to illustrate how booking limits are updated, +one may look at the following, small-scale example: + +Assume a hotel offers only the following 5 products: + +1. Two night stay arriving Monday. +2. Two night stay arriving Tuesday. +3. Two night stay arriving Wednesday. +4. Three night stay arriving Wednesday. +5. Two night stay arriving Thursday. + +If the booking limits for each product are :math:`b_1 = 10`, :math:`b_2 = 8`, :math:`b_3 = 4`, :math:`b_4 = 7`, +:math:`b_5 = 1` and the following requests are received, the booking limits would be updated +in the following way as decisions to accept or reject a given order are made: + +.. image:: _static/hotel.PNG + :alt: The HOTEL table has failed to display + :width: 800 + +Note that, in this case, product 1 has a final booking limit of 9 as only one room +has been sold on either Monday or Tuesday, which means that 9 rooms are still available +on Monday night. + +To simplify this, one may create a binary matrix `A` showing which products use which +resources. Thus, we will let each row be a resource available and each column a product, +having a 1 in entry :math:`(i,j)` if product :math:`j` uses resource :math:`i`, and 0 +otherwise. Then, if we accept a request for product :math:`i`, we must update the booking +limits of all products :math:`j` such that :math:`A_j^T \cdot A_i \geq 1` (they share +at least one of the resources). For this small example, we have: + +.. image:: _static/hotel2.PNG + :alt: The HOTEL matrix has failed to display + :width: 300 + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. Stationary Poisson process with rate :math:`\lambda_i` for guest arrivals for product :math:`i`. + +Model Factors +^^^^^^^^^^^^^ + +* num_products: Number of products: (rate, length of stay). + * Default: 56 +* lambda: Arrival rates for each product. + * Default: Take :math:`\lambda_i = \frac{1}{168}, \frac{2}{168}, \frac{3}{168}, \frac{2}{168}, \frac{1}{168}, \frac{0.5}{168}, \frac{0.25}{168}` for 1-night, 2-night, ..., 7-night stay respectively. +* num_rooms: Hotel capacity. + * Default: 100 +* discount_rate: Discount rate. + * Default: 100 +* rack_rate: Rack rate (full price). + * Default: 200 +* product_incidence: Incidence matrix. + * Default: Let each row be a resource available and each column a product, having a 1 in entry :math:`(i,j)` if product :math:`j` uses resource :math:`i`, and 0 otherwise. +* time_limit: Time after which orders of each product no longer arrive (e.g. Mon night stops at 3am Tues or t=27). + * Default: list of 14 27's, 12 51's, 10 75's, 8 99's, 6 123's, 4 144's, and 2 168's +* time_before: Hours before :math:`t=0` to start running (e.g. 168 means start at time -168). + * Default: 168 +* runlength: Runlength of simulation (in hours) after t=0. + * Default: 168 +* booking_limits: Booking limits. + * Default: tuple of 56 100's + +Responses +^^^^^^^^^ + +* revenue: Expected revenue. + +References +^^^^^^^^^^ + +N/A + +Optimization Problem: Maximize Revenue (HOTEL-1) +------------------------------------------------ + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* booking_limits + +Objectives +^^^^^^^^^^ + +Maximize the expected revenue. + +Constraints +^^^^^^^^^^^ + +Lower bounded by 0 and upper bounded by the total number of rooms. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 10000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* initial_solution: Initial solution. + * Default: tuple of 56 zeros + +Random Solutions +^^^^^^^^^^^^^^^^ + +Let each :math:`b_i` (element in tuple) be distributed Uniformly :math:`(0, C)`. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Unknown \ No newline at end of file diff --git a/docs/ironore.rst b/docs/source/models/ironore.rst similarity index 83% rename from docs/ironore.rst rename to docs/source/models/ironore.rst index 32528e66a..8ec8ad97b 100644 --- a/docs/ironore.rst +++ b/docs/source/models/ironore.rst @@ -1,154 +1,137 @@ -Model: Iron Ore Production with Exogenous Stochastic Price (IRONORE) -==================================================================== - -Description: ------------- -Iron ore is traded on the spot market, facing an exogenous, stochastic price. There -is enormous demand for iron, and so for the purposes of a small or medium-sized iron ore mine, we assume -that any quantity of ore can be instantaneously sold at current market rates. - -Let there be :math:`T` time periods (days), holding cost of :math:`h` per unit, production cost of :math:`c` per unit, -maximum production per day of :math:`m` units, and maximum holding capacity of :math:`K` units. Let the iron ore market price for -the day be :math:`P_t`. - -Let :math:`x_1` be the price at which to begin production, :math:`x_2` be the inventory level at which to cease production, -:math:`x_3` be the price at which to cease production, and :math:`x_4` be the price at which to sell all current stock. - -The daily order of operations in the simulation is as follows: - - 1. Sample the market price, :math:`P_t`. Let current stock be :math:`s_t`. - - 2. If production is already underway, - - (a) if :math:`P_t` ≤ :math:`x_3` or :math:`s_t` ≥ :math:`x_2`, cease production. - - (b) else, produce :math:`min(m, K − s_t)` at cost :math:`c` per unit. - - 3. If production is not currently underway, and if :math:`P_t` ≥ :math:`x_1` and :math:`s_t` < :math:`x_2`, begin production. - - 4. If :math:`P_t` ≥ :math:`x_4`, sell all stock (after production) at price :math:`P_t`. - - 5. Charge a holding cost of :math:`h` per unit (after production and sales). - -Sources of Randomness: ----------------------- -1. Let :math:`P_t` be a meanreverting random walk, such that :math:`P_t = \mbox{trunc}(P_t - 1 + N_t (\mu,\sigma))`, -where :math:`N_t` is a normal random variable with standard deviation :math:`\sigma` and mean :math:`\mu_t = \mbox{sgn}(\mu_0 − P_t−1) * (| \mu_0 − P_t − 1 |)^{\frac{1}{4}}`. -Here :math:`\mbox{trunc}(x)` truncates the price to lie between a specified minimum and maximum price. - -Model Factors: --------------- -* mean_price: Mean iron ore price per unit. - - * Default: 100.0 - -* max_price: Maximum iron ore price per unit. - - * Default: 200.0 - -* min_price: Minimum iron ore price per unit. - - * Default: 0.0 - -* capacity: Maximum holding capacity. - - * Default: 10000 - -* st_dev: Standard deviation of random walk steps for price. - - * Default: 7.5 - -* holding_cost: Holding cost per unit per period. - - * Default: 1.0 - -* prod_cost: Production cost per unit. - - * Default: 100.0 - -* max_prod_perday: Maximum units produced per day. - - * Default: 100 - -* price_prod: Price level to start production. - - * Default: 80.0 - -* inven_stop: Inventory level to cease production. - - * Default: 7000 - -* price_stop: Price level to stop production. - - * Default: 40 - -* price_sell: Price level to sell all stock. - - * Default: 100 - -* n_days: Number of days to simulate. - - * Default: 365 - - -Respones: ---------- -* total_profit: The total profit over the time period - -* frac_producing: The fraction of days spent producing iron ore - -* mean_stock: The average stocks over the time period - - -References: -=========== -N/A - - -Optimization Problem: Maximize Profit (IRONORE-1) -================================================= - -Decision Variables: -------------------- -* price_prod -* inven_stop -* price_stop -* price_sell - -Objectives: ------------ -Maximize total_profit over the :math:`T` time periods. - -Constraints: ------------- -All decision variables should be non-negative. -Logically, we should also have price_stop <= price_prod <= price_sell, but this is not enforced. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take - - * Default: 1000 - -Fixed Model Factors: --------------------- -* N/A - -Starting Solution: ------------------- -* initial_solution: :math:`x_1 = 80`, :math:`x_2 = 7000`, :math:`x_3 = 40`, :math:`x_4=100` - -Random Solutions: ------------------ -* :math:`x_1`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 10 and 200. -* :math:`x_2`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 1000 and 10000. -* :math:`x_3`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 10 and 200. -* :math:`x_4`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 10 and 200. - -Optimal Solution: ------------------ -Unknown - -Optimal Objective Function Value: ---------------------------------- -Unknown +Iron Ore Production +=================== + +See the :mod:`simopt.models.ironore` module for API details. + +Model: Iron Ore Production with Exogenous Stochastic Price (IRONORE) +-------------------------------------------------------------------- + +Description +^^^^^^^^^^^ + +Iron ore is traded on the spot market, facing an exogenous, stochastic price. There +is enormous demand for iron, and so for the purposes of a small or medium-sized iron ore mine, we assume +that any quantity of ore can be instantaneously sold at current market rates. + +Let there be :math:`T` time periods (days), holding cost of :math:`h` per unit, production cost of :math:`c` per unit, +maximum production per day of :math:`m` units, and maximum holding capacity of :math:`K` units. Let the iron ore market price for +the day be :math:`P_t`. + +Let :math:`x_1` be the price at which to begin production, :math:`x_2` be the inventory level at which to cease production, +:math:`x_3` be the price at which to cease production, and :math:`x_4` be the price at which to sell all current stock. + +The daily order of operations in the simulation is as follows: + + 1. Sample the market price, :math:`P_t`. Let current stock be :math:`s_t`. + 2. If production is already underway, + + (a) if :math:`P_t` ≤ :math:`x_3` or :math:`s_t` ≥ :math:`x_2`, cease production. + (b) else, produce :math:`min(m, K − s_t)` at cost :math:`c` per unit. + + 3. If production is not currently underway, and if :math:`P_t` ≥ :math:`x_1` and :math:`s_t` < :math:`x_2`, begin production. + 4. If :math:`P_t` ≥ :math:`x_4`, sell all stock (after production) at price :math:`P_t`. + 5. Charge a holding cost of :math:`h` per unit (after production and sales). + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. Let :math:`P_t` be a meanreverting random walk, such that :math:`P_t = \mbox{trunc}(P_t - 1 + N_t (\mu,\sigma))`, +where :math:`N_t` is a normal random variable with standard deviation :math:`\sigma` and mean :math:`\mu_t = \mbox{sgn}(\mu_0 − P_t−1) * (| \mu_0 − P_t − 1 |)^{\frac{1}{4}}`. +Here :math:`\mbox{trunc}(x)` truncates the price to lie between a specified minimum and maximum price. + +Model Factors +^^^^^^^^^^^^^ + +* mean_price: Mean iron ore price per unit. + * Default: 100.0 +* max_price: Maximum iron ore price per unit. + * Default: 200.0 +* min_price: Minimum iron ore price per unit. + * Default: 0.0 +* capacity: Maximum holding capacity. + * Default: 10000 +* st_dev: Standard deviation of random walk steps for price. + * Default: 7.5 +* holding_cost: Holding cost per unit per period. + * Default: 1.0 +* prod_cost: Production cost per unit. + * Default: 100.0 +* max_prod_perday: Maximum units produced per day. + * Default: 100 +* price_prod: Price level to start production. + * Default: 80.0 +* inven_stop: Inventory level to cease production. + * Default: 7000 +* price_stop: Price level to stop production. + * Default: 40 +* price_sell: Price level to sell all stock. + * Default: 100 +* n_days: Number of days to simulate. + * Default: 365 + +Responses +^^^^^^^^^ + +* total_profit: The total profit over the time period +* frac_producing: The fraction of days spent producing iron ore +* mean_stock: The average stocks over the time period + +References +^^^^^^^^^^ +N/A + +Optimization Problem: Maximize Profit (IRONORE-1) +------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* price_prod +* inven_stop +* price_stop +* price_sell + +Objectives +^^^^^^^^^^ + +Maximize total_profit over the :math:`T` time periods. + +Constraints +^^^^^^^^^^^ + +All decision variables should be non-negative. +Logically, we should also have price_stop <= price_prod <= price_sell, but this is not enforced. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* initial_solution: :math:`x_1 = 80`, :math:`x_2 = 7000`, :math:`x_3 = 40`, :math:`x_4=100` + +Random Solutions +^^^^^^^^^^^^^^^^ + +* :math:`x_1`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 10 and 200. +* :math:`x_2`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 1000 and 10000. +* :math:`x_3`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 10 and 200. +* :math:`x_4`: Sample an lognormal random variate with 2.5- and 97.5-percentiles of 10 and 200. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Unknown diff --git a/docs/mm1queue.rst b/docs/source/models/mm1queue.rst similarity index 72% rename from docs/mm1queue.rst rename to docs/source/models/mm1queue.rst index a21147b51..8b53c9624 100644 --- a/docs/mm1queue.rst +++ b/docs/source/models/mm1queue.rst @@ -1,94 +1,96 @@ -Model: M/M/1 Queue -================== - -Description: ------------- -This is a model simulates an M/M/1 queue with an Exponential -interarrival time distribution and an Exponential service time -distribution. - -Sources of Randomness: ----------------------- -1. Exponential interarrival times. -2. Exponential service times. - -Model Factors: --------------- -* lambda: Rate parameter of interarrival time distribution. - - * Default: 1.5 - -* mu: Rate parameter of service time distribution. - - * Default 3.0 - -* warmup: Represents the number of people as warmup before collecting statistics - - * Default: 50 - -* people: Represents the number of people from which to calculate the average sojourn time. - - * Default: 200 - -Respones: ---------- -* avg_sojourn_time: The average of sojourn time of customers (time customers spend in the system). - -* avg_waiting_time: The average of waiting time of customers. - -* frac_cust_wait: The fraction of customers who wait. - - -References: -=========== -This example is adapted from Cheng, R and Kleijnen,J.(1999). Improved Design of Queueing Simulation Experience with Highly Heteroscedastic Responses. Operations Research, v. 47, n. 5, pp. 762-777 (https://pubsonline.informs.org/doi/abs/10.1287/opre.47.5.762) - - - -Optimization Problem: Minimize average sojourn time plus penalty (MM1-1) -======================================================================== - - -Decision Variables: -------------------- -* mu (service rate parameter) - - -Objectives: ------------ -Minimize the expected average sojourn time plus a penalty for increasing the rate :math:`c\mu^2`. - -Constraints: ------------- -No deterministic or stochastic constraints. -Box constraints for non-negativity of mu. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 1000 - -* cost: Cost for increasing service rate. - - * Default: 0.1 - -Fixed Model Factors: --------------------- -None - -Starting Solution: ------------------- -* mu: 3.0 - -Random Solutions: ------------------ -Generate mu from an exponential distribution with mean 3. - -Optimal Solution: ------------------ -None. - -Optimal Objective Function Value: ---------------------------------- -None. +M/M/1 Queue +=========== + +See the :mod:`simopt.models.mm1queue` module for API details. + +Model: M/M/1 Queue +------------------ + +Description +^^^^^^^^^^^ + +This is a model simulates an M/M/1 queue with an Exponential +interarrival time distribution and an Exponential service time +distribution. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. Exponential interarrival times. +2. Exponential service times. + +Model Factors +^^^^^^^^^^^^^ + +* lambda: Rate parameter of interarrival time distribution. + * Default: 1.5 +* mu: Rate parameter of service time distribution. + * Default 3.0 +* warmup: Represents the number of people as warmup before collecting statistics + * Default: 50 +* people: Represents the number of people from which to calculate the average sojourn time. + * Default: 200 + +Responses +^^^^^^^^^ + +* avg_sojourn_time: The average of sojourn time of customers (time customers spend in the system). +* avg_waiting_time: The average of waiting time of customers. +* frac_cust_wait: The fraction of customers who wait. + +References +^^^^^^^^^^ + +This example is adapted from Cheng, R and Kleijnen,J.(1999). Improved Design of Queueing Simulation Experience with Highly Heteroscedastic Responses. Operations Research, v. 47, n. 5, pp. 762-777 (https://pubsonline.informs.org/doi/abs/10.1287/opre.47.5.762) + +Optimization Problem: Minimize average sojourn time plus penalty (MM1-1) +------------------------------------------------------------------------ + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* mu (service rate parameter) + +Objectives +^^^^^^^^^^ + +Minimize the expected average sojourn time plus a penalty for increasing the rate :math:`c\mu^2`. + +Constraints +^^^^^^^^^^^ + +No deterministic or stochastic constraints. +Box constraints for non-negativity of mu. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 1000 +* cost: Cost for increasing service rate. + * Default: 0.1 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +None + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* mu: 3.0 + +Random Solutions +^^^^^^^^^^^^^^^^ + +Generate mu from an exponential distribution with mean 3. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +None. + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +None. diff --git a/docs/network.rst b/docs/source/models/network.rst similarity index 75% rename from docs/network.rst rename to docs/source/models/network.rst index 66f42de0b..e39403ad1 100644 --- a/docs/network.rst +++ b/docs/source/models/network.rst @@ -1,110 +1,106 @@ -Model: Network Queueing System Design (Network) -=============================================== - -Description: ------------- -This model represents a communication system where arriving messages are routed through a network based on chosen routing percentages. There are :math:`N` random messages that arrive following a Poisson process with a rate of :math:`λ` that need to go to a particular destination, and there are :math:`n` networks available to process these messages. When a message arrives there is a :math:`p_i%` chance that it will be processed by network :math:`i`. The per message processing cost is :math:`c_1, c_2,..., c_i` depending on which network the message is routed through. It also takes time for a message to go through a network. This transit time is denoted by :math:`S_i` for each network :math:`i` and :math:`S_i` follows a triangular distribution with lower limit :math:`a_i`, upper limit :math:`b_i`, and mode :math:`c_i`. Each network behaves like a single-server queue with first-in-first-out service discipline.There is a cost for the length of time a message spends in network :math:`i` measured by :math:`c_i` per unit of time. - -Sources of Randomness: ----------------------- - 1. Interarrival time of a message. - 2. The network a message is routed to. - 3. The transit time of a message; depends on the network. - -Model Factors: --------------- -* process_prob: Probability that a message will go through a particular network i. - - * Default: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] - -* cost_process: Message processing cost of network i. - - * Default: [1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10] - -* cost_time: Cost for the length of time a message spends in a network i per unit of time. - - * Default: [0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005] - -* mode_transit_time: Mode time of transit for network i following a triangular distribution. - - * Default: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - -* lower_limits_transit_time: Lower limits for the triangular distribution for the transit time. - - * Default: [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5] - -* upper_limits_transit_time: Upper limits for the triangular distribution for the transit time. - - * Default: [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5] - -* arrival_rate: Arrival rate of messages following a Poisson process. - - * Default: 1 - -* n_messages: Number of messages that arrive and need to be routed. - - * Default: 1000 - -* n_networks: Number of networks. - - * Default: 10 - - -Responses: ----------- -* total_cost: Total cost spent to route and process all messages. - - -References: -=========== -Barton, R. R., & Meckesheimer, M. (2006). Metamodel-Based Simulation Optimization. -S.G. Henderson and B.L. Nelson (Eds.), Handbook in OR & MS, Vol. 13. - -Optimization Problem: Minimize Total Cost (NETWORK-1) -======================================================== - -Decision Variables: -------------------- -* process_prob - -Objectives: ------------ -The objective is to minimize total costs, the sum of time costs and network costs for all messages. - -Constraints: ------------- -* :math:`0 \le p_i \le 1` for all :math:`i = 1, 2, ..., n` -* :math:`\sum_{i=1}^n p_i = 1` - -:math:`p_1, p_2,..., p_n \in [0, 1]` are the routing probabilities. - -Problem Factors: ----------------- -* initial_solution: Initial solution from which solvers start. - - * Default: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] - -* budget: Max # of replications for a solver to take. - - * Default: 1000 - -Fixed Model Factors: --------------------- -N/A - -Starting Solution: ------------------- -* process_prob: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] - - -Random Solutions: ------------------- -Generate allocations uniformly at random from the set of vectors of length equal to the number of networks whose values are greater than 0 and less than 1. - -Optimal Solution: ------------------ -Unknown - -Optimal Objective Function Value: ---------------------------------- -Unknown +Network Queueing System Design +============================== + +See the :mod:`simopt.models.network` module for API details. + +Model: Network Queueing System Design (Network) +----------------------------------------------- + +Description +^^^^^^^^^^^ + +This model represents a communication system where arriving messages are routed through a network based on chosen routing percentages. There are :math:`N` random messages that arrive following a Poisson process with a rate of :math:`λ` that need to go to a particular destination, and there are :math:`n` networks available to process these messages. When a message arrives there is a :math:`p_i%` chance that it will be processed by network :math:`i`. The per message processing cost is :math:`c_1, c_2,..., c_i` depending on which network the message is routed through. It also takes time for a message to go through a network. This transit time is denoted by :math:`S_i` for each network :math:`i` and :math:`S_i` follows a triangular distribution with lower limit :math:`a_i`, upper limit :math:`b_i`, and mode :math:`c_i`. Each network behaves like a single-server queue with first-in-first-out service discipline.There is a cost for the length of time a message spends in network :math:`i` measured by :math:`c_i` per unit of time. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. Interarrival time of a message. +2. The network a message is routed to. +3. The transit time of a message; depends on the network. + +Model Factors +^^^^^^^^^^^^^ + +* process_prob: Probability that a message will go through a particular network i. + * Default: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] +* cost_process: Message processing cost of network i. + * Default: [1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10] +* cost_time: Cost for the length of time a message spends in a network i per unit of time. + * Default: [0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005] +* mode_transit_time: Mode time of transit for network i following a triangular distribution. + * Default: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +* lower_limits_transit_time: Lower limits for the triangular distribution for the transit time. + * Default: [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5] +* upper_limits_transit_time: Upper limits for the triangular distribution for the transit time. + * Default: [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5] +* arrival_rate: Arrival rate of messages following a Poisson process. + * Default: 1 +* n_messages: Number of messages that arrive and need to be routed. + * Default: 1000 +* n_networks: Number of networks. + * Default: 10 + +Responses +^^^^^^^^^ + +* total_cost: Total cost spent to route and process all messages. + +References +^^^^^^^^^^ + +Barton, R. R., & Meckesheimer, M. (2006). Metamodel-Based Simulation Optimization. +S.G. Henderson and B.L. Nelson (Eds.), Handbook in OR & MS, Vol. 13. + +Optimization Problem: Minimize Total Cost (NETWORK-1) +----------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* process_prob + +Objectives +^^^^^^^^^^ + +The objective is to minimize total costs, the sum of time costs and network costs for all messages. + +Constraints +^^^^^^^^^^^ + +* :math:`0 \le p_i \le 1` for all :math:`i = 1, 2, ..., n` +* :math:`\sum_{i=1}^n p_i = 1` + +:math:`p_1, p_2,..., p_n \in [0, 1]` are the routing probabilities. + +Problem Factors +^^^^^^^^^^^^^^^ + +* initial_solution: Initial solution from which solvers start. + * Default: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] +* budget: Max # of replications for a solver to take. + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* process_prob: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] + +Random Solutions +^^^^^^^^^^^^^^^^ + +Generate allocations uniformly at random from the set of vectors of length equal to the number of networks whose values are greater than 0 and less than 1. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Unknown diff --git a/docs/paramesti.rst b/docs/source/models/paramesti.rst similarity index 67% rename from docs/paramesti.rst rename to docs/source/models/paramesti.rst index f1b996be9..683194da0 100644 --- a/docs/paramesti.rst +++ b/docs/source/models/paramesti.rst @@ -1,89 +1,103 @@ -Model: Parameter Estimation (PARAMESTI) -======================================= - -Description: ------------- -A model that simulates maximum likelihood estimation for the parameters of -a two-dimensional gamma distribution. - -Say a simulation generates output data :math:`{Y_j}`, :math:`Y_j \in [0, \infty] \times [0, \infty]`, -that are i.i.d and known to come from a distribution with the two-dimensional density function - -.. math:: f(y1, y2; x^*) = \frac{e^{-y1} y_1^{x^*_1 y_2 - 1}{\Gamma(x^*_1 y_2)} \frac{e^{-y2} y_2^{x^*_2 - 1}{\Gamma(x^*_2)}, y1, y2 > 0, - -where :math:`x^* ≡ (x^*_1, x^*_2)`` is the unknown vector of parameters. - -Noting that :math:`x_star` maximizes the function - -.. math:: g(x) = E [log (f(Y ; x))] = \int_0^\infty \log (f(y; x)) f(y; x^*)dy, - -and that - -.. math:: G_m(x) = \frac{1}{m} \sum_{j=1}^m \log(f(Y_j ; x)) - -is a consistent estimator of :math:`g(x)`. -Observations are generated from the distribution specified by a given :math:`x_star`. - -Sources of Randomness: ----------------------- -y is a 2-D vector that contributes randomness. Both elements of y are gamma random variables. - -Model Factors: --------------- -* x_star: the unknown 2-D parameter that maximizes the expected log likelihood function. - - * Default: [2, 5] - -* x: a 2-D variable in the probability density function. - - * Default: [1, 1] - -Respones: ---------- -* loglik: log likelihood of the pdf. - -References: -=========== -This model is designed by Raghu Pasupathy (Virginia Tech) and Shane G. Henderson (Cornell) in 2007. - - -Optimization Problem: Max Log Likelihood (ParamEstiMaxLogLik) -============================================================= - -Decision Variables: -------------------- -* x - -Objectives: ------------ -Minimize the log likelihood of a 2-D gamma random variable. - -Constraints: ------------- -x is in the square (0, 10) × (0, 10). - -Problem Factors: ----------------- -* budget: Maximum number of replications for a solver to take. - - * Default: 1000 - -Fixed Model Factors: --------------------- -N/A - -Starting Solution: ------------------- -* x: [1, 1] - -Random Solutions: ------------------ -Generate :math:`x` i.i.d. uniformly in the square (0, 10) × (0, 10). - -Optimal Solution: ------------------ -x = [2, 5] - -Optimal Objective Function Value: ---------------------------------- -Known, but not evaluated. +Parameter Estimation +==================== + +See the :mod:`simopt.models.paramesti` module for API details. + +Model: Parameter Estimation (PARAMESTI) +--------------------------------------- + +Description +^^^^^^^^^^^ + +A model that simulates maximum likelihood estimation for the parameters of +a two-dimensional gamma distribution. + +Say a simulation generates output data :math:`{Y_j}`, :math:`Y_j \in [0, \infty] \times [0, \infty]`, +that are i.i.d and known to come from a distribution with the two-dimensional density function + +.. math:: f(y1, y2; x^*) = \frac{e^{-y1} y_1^{x^*_1 y_2 - 1}{\Gamma(x^*_1 y_2)} \frac{e^{-y2} y_2^{x^*_2 - 1}{\Gamma(x^*_2)}, y1, y2 > 0, + +where :math:`x^* ≡ (x^*_1, x^*_2)`` is the unknown vector of parameters. + +Noting that :math:`x_star` maximizes the function + +.. math:: g(x) = E [log (f(Y ; x))] = \int_0^\infty \log (f(y; x)) f(y; x^*)dy, + +and that + +.. math:: G_m(x) = \frac{1}{m} \sum_{j=1}^m \log(f(Y_j ; x)) + +is a consistent estimator of :math:`g(x)`. +Observations are generated from the distribution specified by a given :math:`x_star`. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +y is a 2-D vector that contributes randomness. Both elements of y are gamma random variables. + +Model Factors +^^^^^^^^^^^^^ + +* x_star: the unknown 2-D parameter that maximizes the expected log likelihood function. + * Default: [2, 5] +* x: a 2-D variable in the probability density function. + * Default: [1, 1] + +Responses +^^^^^^^^^ + +* loglik: log likelihood of the pdf. + +References +^^^^^^^^^^ + +This model is designed by Raghu Pasupathy (Virginia Tech) and Shane G. Henderson (Cornell) in 2007. + +Optimization Problem: Max Log Likelihood (ParamEstiMaxLogLik) +------------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* x + +Objectives +^^^^^^^^^^ + +Minimize the log likelihood of a 2-D gamma random variable. + +Constraints +^^^^^^^^^^^ + +x is in the square (0, 10) × (0, 10). + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Maximum number of replications for a solver to take. + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* x: [1, 1] + +Random Solutions +^^^^^^^^^^^^^^^^ + +Generate :math:`x` i.i.d. uniformly in the square (0, 10) × (0, 10). + +Optimal Solution +^^^^^^^^^^^^^^^^ + +x = [2, 5] + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Known, but not evaluated. diff --git a/docs/rmitd.rst b/docs/source/models/rmitd.rst similarity index 76% rename from docs/rmitd.rst rename to docs/source/models/rmitd.rst index 7bdad0be1..78fc96a9d 100644 --- a/docs/rmitd.rst +++ b/docs/source/models/rmitd.rst @@ -1,131 +1,118 @@ -Model: Multi-Stage Revenue Management with Inter-Temporal Dependence (RMITD) -============================================================================ - -Description: ------------- - -Consider the following inventory system: A businessperson initially purchases -:math:`b` units of a product to sell to customers over a fixed time horizon. -In the first period, a businessperson receives a certain demand for units at a -low price :math:`p_{low}`. The businessperson decision can choose how many units -to sell right now. The businessperson may wish to reserve some units for -customers arriving later who are willing to pay more for the product. The number -of units reserved for the start of period :math:`t` is denoted by :math:`r_t`. This -process of observing demand and choosing how many units to sell is repeated over -:math:`T` time periods. In order to make wise decisions about how much inventory -to reserve in each time period, the businessperson must consider future demand for -the product. - -The demand in period :math:`t` is denoted by :math:`D_t = μ_tXY_t` where :math:`X` -has a gamma distribution with parameters :math:`k > 0` and :math:`θ > 0` such that -it has mean :math:`kθ = 1` and standard deviation :math:`{\sqrt{k}}θ = 1/ {\sqrt{k}}.` -:math:` Y_1, . . . , Y_T` are i.i.d. exponential with mean 1 and -:math:`μ_t` are positive constants for all :math:`t`. - -Sources of Randomness: ----------------------- -Two sources of randomness are used to generate the :math:`X`s and :math:`Y`s that -form demands. - -Model Factors: --------------- -* Time Horizon (T): Period of time that is considered. - - * Default: 3 - -* Prices: Prices for each period. - - * Default: (100, 300, 400) - -* Demand Mean (μ): Mean demand for each period. - - * Default: (50, 20, 30) - -* Cost (c): Cost per unit of capacity at :math:`t = 0`. - - * Default: 80 - -* Gamma Shape (k): Shape parameter of gamma distribution. - - * Default: 1 - -* Gamma Scale (θ): Scale parameter of gamma distribution. - - * Default: 1 - -* Initial Inventory (b): Initial inventory. - - * Default: 100 - -* Reservation Quantity (r): Inventory to reserve going into periods :math:`2, 3, ..., T`. - - * Default: :math:`r_2 = 50`, :math:`r_3 = 30`. - - -Responses: ----------- - -* Revenue: Total revenue of given model - -References: -=========== -This example is adapted (almost verbatim) from test problem 2 by Prof. J.M. Harrison for class OIT 603 -at Stanford University. (https://www.gsb.stanford.edu/faculty-research/faculty/j-michael-harrison) - - -Optimization Problem: Maximize Total Revenue -============================================ - -Decision Variables: -------------------- - -* Initial Inventory (b) - -* Reservation Quantities (:math:`r_t`) - -Objectives: ------------ - -Maximize total revenue. - -Constraints: ------------- - -The reserve quantities are decreasing and less than the initial capacity, i.e., -:math:`b >= r_2 >= r_3` - -Problem Factors: ----------------- - -* Budget: Max # of replications for a solver to take. - - * Default: 10000 - -Fixed Model Factors: --------------------- - -* N/A - -Starting Solution: ------------------- - -* :math:`b = 100` - -* :math:`r_2 = 50` - -* :math:`r_3 = 30` - -Random Solutions: ------------------ - -If multiple solutions are needed for Reservation Quantity (r), use :math:`r_2` ∼ Uniform(40,60) and :math:`r_3` ∼ Uniform(20,40). - -Optimal Solution: ------------------ - -Unknown - -Optimal Objective Function Value: ---------------------------------- - -Unknown +Revenue Management +================== + +See the :mod:`simopt.models.rmitd` module for API details. + +Model: Multi-Stage Revenue Management with Inter-Temporal Dependence (RMITD) +---------------------------------------------------------------------------- + +Description +^^^^^^^^^^^ + +Consider the following inventory system: A businessperson initially purchases +:math:`b` units of a product to sell to customers over a fixed time horizon. +In the first period, a businessperson receives a certain demand for units at a +low price :math:`p_{low}`. The businessperson decision can choose how many units +to sell right now. The businessperson may wish to reserve some units for +customers arriving later who are willing to pay more for the product. The number +of units reserved for the start of period :math:`t` is denoted by :math:`r_t`. This +process of observing demand and choosing how many units to sell is repeated over +:math:`T` time periods. In order to make wise decisions about how much inventory +to reserve in each time period, the businessperson must consider future demand for +the product. + +The demand in period :math:`t` is denoted by :math:`D_t = μ_tXY_t` where :math:`X` +has a gamma distribution with parameters :math:`k > 0` and :math:`θ > 0` such that +it has mean :math:`kθ = 1` and standard deviation :math:`{\sqrt{k}}θ = 1/ {\sqrt{k}}.` +:math:` Y_1, . . . , Y_T` are i.i.d. exponential with mean 1 and +:math:`μ_t` are positive constants for all :math:`t`. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +Two sources of randomness are used to generate the :math:`X`'s and :math:`Y`'s that +form demands. + +Model Factors +^^^^^^^^^^^^^ + +* Time Horizon (T): Period of time that is considered. + * Default: 3 +* Prices: Prices for each period. + * Default: (100, 300, 400) +* Demand Mean (μ): Mean demand for each period. + * Default: (50, 20, 30) +* Cost (c): Cost per unit of capacity at :math:`t = 0`. + * Default: 80 +* Gamma Shape (k): Shape parameter of gamma distribution. + * Default: 1 +* Gamma Scale (θ): Scale parameter of gamma distribution. + * Default: 1 +* Initial Inventory (b): Initial inventory. + * Default: 100 +* Reservation Quantity (r): Inventory to reserve going into periods :math:`2, 3, ..., T`. + * Default: :math:`r_2 = 50`, :math:`r_3 = 30`. + +Responses +^^^^^^^^^ + +* Revenue: Total revenue of given model + +References +^^^^^^^^^^ + +This example is adapted (almost verbatim) from test problem 2 by Prof. J.M. Harrison for class OIT 603 +at Stanford University. (https://www.gsb.stanford.edu/faculty-research/faculty/j-michael-harrison) + +Optimization Problem: Maximize Total Revenue +-------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* Initial Inventory (b) +* Reservation Quantities (:math:`r_t`) + +Objectives +^^^^^^^^^^ + +Maximize total revenue. + +Constraints +^^^^^^^^^^^ + +The reserve quantities are decreasing and less than the initial capacity, i.e., +:math:`b >= r_2 >= r_3` + +Problem Factors +^^^^^^^^^^^^^^^ + +* Budget: Max # of replications for a solver to take. + * Default: 10000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* :math:`b = 100` +* :math:`r_2 = 50` +* :math:`r_3 = 30` + +Random Solutions +^^^^^^^^^^^^^^^^ + +If multiple solutions are needed for Reservation Quantity (r), use :math:`r_2` ∼ Uniform(40,60) and :math:`r_3` ∼ Uniform(20,40). + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Unknown diff --git a/docs/san.rst b/docs/source/models/san.rst similarity index 70% rename from docs/san.rst rename to docs/source/models/san.rst index ee8bf0324..c1df1b666 100644 --- a/docs/san.rst +++ b/docs/source/models/san.rst @@ -1,98 +1,108 @@ -Model: Stochastic Activity Network (SAN) -======================================== - -Description: ------------- -Consider a stochastic activity network (SAN) where each arc :math:`i` -is associated with a task with random duration :math:`X_i`. Task durations -are independent. SANs are also known as PERT networks and are used in planning -large-scale projects. - -An example SAN with 13 arcs is given in the following figure: - -.. image:: san.PNG - :alt: The SAN diagram has failed to display - :width: 500 - -Sources of Randomness: ----------------------- -1. Task durations are exponentially distributed with mean :math:`\theta_i`. - -Model Factors: --------------- -* num_nodes: Number of nodes. - - * Default: 9 - -* arcs: List of arcs. - - * Default: [(1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (3, 6), (4, 5), - (4, 7), (5, 6), (5, 8), (6, 9), (7, 8), (8, 9)] - -* arc_means: Mean task durations for each arc. - - * Default: (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) - -Responses: ----------- -* longest_path_length: Length/duration of the longest path. - - -References: -=========== -This model is adapted from Avramidis, A.N., Wilson, J.R. (1996). -Integrated variance reduction strategies for simulation. *Operations Research* 44, 327-346. -(https://pubsonline.informs.org/doi/abs/10.1287/opre.44.2.327) - -Optimization Problem: Minimize Longest Path Plus Penalty (SAN-1) -================================================================ - -Decision Variables: -------------------- -* arc_means - -Objectives: ------------ -Suppose that we can select :math:`\theta_i > 0` for each :math:`i`, -but there is an associated cost. In particular, we want to minimize :math:`ET(\theta) + f(\theta)`, -where :math:`T(\theta)` is the (random) duration of the longest path from :math:`a` -to :math:`i` and :math:`f(\theta) = \sum_{i=1}^{n}\theta_i^{-1}` where :math:`n` -is the number of arcs. - -The objective function is convex in :math:`\theta`. An IPA estimator of the gradient -is also given in the code. - -Constraints: ------------- -We require that :math:`theta_i > 0` for each :math:`i`. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 10000 - -* arc_costs: Cost associated to each arc. - - * Default: (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) - -Fixed Model Factors: --------------------- -* N/A - -Starting Solution: ------------------- -* initial_solution: (8,) * 13 - -Random Solutions: ------------------ -Sample each arc mean uniformly from a lognormal distribution with -2.5- and 97.5-percentiles at 0.1 and 10 respectively. - -Optimal Solution: ------------------ -Unknown - -Optimal Objective Function Value: ---------------------------------- +Stochastic Activity Network +=========================== + +See the :mod:`simopt.models.san` module for API details. + +Model: Stochastic Activity Network (SAN) +---------------------------------------- + +Description +^^^^^^^^^^^ + +Consider a stochastic activity network (SAN) where each arc :math:`i` +is associated with a task with random duration :math:`X_i`. Task durations +are independent. SANs are also known as PERT networks and are used in planning +large-scale projects. + +An example SAN with 13 arcs is given in the following figure: + +.. image:: _static/san.PNG + :alt: The SAN diagram has failed to display + :width: 500 + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +1. Task durations are exponentially distributed with mean :math:`\theta_i`. + +Model Factors +^^^^^^^^^^^^^ + +* num_nodes: Number of nodes. + * Default: 9 +* arcs: List of arcs. + * Default: [(1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (3, 6), (4, 5), + (4, 7), (5, 6), (5, 8), (6, 9), (7, 8), (8, 9)] +* arc_means: Mean task durations for each arc. + * Default: (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) + +Responses +^^^^^^^^^ + +* longest_path_length: Length/duration of the longest path. + +References +^^^^^^^^^^ + +This model is adapted from Avramidis, A.N., Wilson, J.R. (1996). +Integrated variance reduction strategies for simulation. *Operations Research* 44, 327-346. +(https://pubsonline.informs.org/doi/abs/10.1287/opre.44.2.327) + +Optimization Problem: Minimize Longest Path Plus Penalty (SAN-1) +---------------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* arc_means + +Objectives +^^^^^^^^^^ + +Suppose that we can select :math:`\theta_i > 0` for each :math:`i`, +but there is an associated cost. In particular, we want to minimize :math:`ET(\theta) + f(\theta)`, +where :math:`T(\theta)` is the (random) duration of the longest path from :math:`a` +to :math:`i` and :math:`f(\theta) = \sum_{i=1}^{n}\theta_i^{-1}` where :math:`n` +is the number of arcs. + +The objective function is convex in :math:`\theta`. An IPA estimator of the gradient +is also given in the code. + +Constraints +^^^^^^^^^^^ + +We require that :math:`theta_i > 0` for each :math:`i`. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 10000 +* arc_costs: Cost associated to each arc. + * Default: (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +* N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* initial_solution: (8,) * 13 + +Random Solutions +^^^^^^^^^^^^^^^^ + +Sample each arc mean uniformly from a lognormal distribution with +2.5- and 97.5-percentiles at 0.1 and 10 respectively. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Unknown \ No newline at end of file diff --git a/docs/sscont.rst b/docs/source/models/sscont.rst similarity index 92% rename from docs/sscont.rst rename to docs/source/models/sscont.rst index ad73b49e9..60bcc80fb 100644 --- a/docs/sscont.rst +++ b/docs/source/models/sscont.rst @@ -1,39 +1,43 @@ - -(s,S) Inventory System -====================== - -This example is adapted (almost verbatim) from the article Kleijnen, J.P.C. et al. Constrained Optimization in Simulation: A Novel Approach, Discussion Paper 2008-95, Tilburg University, Center for Economic Research. - -Consider a (s,S) inventory model with full backlogging. Demand during each period, :math:`D_t` is distributed -exponential with mean :math:`\mu`. At the end of each period, the inventory position :math:`(IP_t = \text{Stock on hand} - -\text{Backorders + Outstanding Orders})` is calculated and, if it is below :math:`s`, an order to get back up to :math:`S` is placed :math:`(O_t = \max(\mathbb{I}(IP_t < s)(S − IP_t), 0)`. Lead times have a Poisson distribution with mean :math:`\theta` days and all -replenishment orders are received at the beginning of the period. Note that, since orders are placed at the -end of the day, an order with lead time :math:`l` placed in period :math:`n` will arrive at the beginning of period :math:`n + l + 1`. - -A per unit holding cost :math:`h` is charged for inventory on-hand; furthermore, there is a fixed order cost :math:`f` -and a variable, per unit, cost :math:`c`. Our goal is to find :math:`s` and :math:`S` in order to minimize the :math:`\mathbb{E}[\text{Total cost per period}]` such that the stockout rate :math:`\delta`, the fraction of demand not supplied from stock on-hand, is at most -:math:`10\%`. To further clarify the order of events and the calculation of costs, a 5-day example in which :math:`s = 1000` -and :math:`S = 1500`, the initial inventory on hand is :math:`1000` and there are no outstanding orders is provided below. - -*Recommended Parameter Settings:* Take :math:`\mu = 100`, :math:`\theta = 6`, :math:`h = 1`, :math:`f = 36` and :math:`c = 2`. - -*Starting Solutions:* :math:`s = 1000`, :math:`S = 2000`. - -If multiple solutions are needed, use :math:`s ∼Uniform(700,1000)`, :math:`S ∼Uniform(1500,2000)`. - -*Measurement of Time:* Days simulated - -*Optimal Solution:* Unknown - -.. image:: sscont.png - :alt: The example table has failed to display - :width: 800 - - -.. examples of using math, first is for centered math on its own line, second is for inline - -.. .. math:: - - \frac{ \sum_{t=0}^{N}f(t,k) }{N} - + +(s,S) Inventory System +====================== + +See the :mod:`simopt.models.sscont` module for API details. + +Model: (s,S) Inventory System +----------------------------- + +This example is adapted (almost verbatim) from the article Kleijnen, J.P.C. et al. Constrained Optimization in Simulation: A Novel Approach, Discussion Paper 2008-95, Tilburg University, Center for Economic Research. + +Consider a (s,S) inventory model with full backlogging. Demand during each period, :math:`D_t` is distributed +exponential with mean :math:`\mu`. At the end of each period, the inventory position :math:`(IP_t = \text{Stock on hand} - +\text{Backorders + Outstanding Orders})` is calculated and, if it is below :math:`s`, an order to get back up to :math:`S` is placed :math:`(O_t = \max(\mathbb{I}(IP_t < s)(S − IP_t), 0)`. Lead times have a Poisson distribution with mean :math:`\theta` days and all +replenishment orders are received at the beginning of the period. Note that, since orders are placed at the +end of the day, an order with lead time :math:`l` placed in period :math:`n` will arrive at the beginning of period :math:`n + l + 1`. + +A per unit holding cost :math:`h` is charged for inventory on-hand; furthermore, there is a fixed order cost :math:`f` +and a variable, per unit, cost :math:`c`. Our goal is to find :math:`s` and :math:`S` in order to minimize the :math:`\mathbb{E}[\text{Total cost per period}]` such that the stockout rate :math:`\delta`, the fraction of demand not supplied from stock on-hand, is at most +:math:`10\%`. To further clarify the order of events and the calculation of costs, a 5-day example in which :math:`s = 1000` +and :math:`S = 1500`, the initial inventory on hand is :math:`1000` and there are no outstanding orders is provided below. + +*Recommended Parameter Settings:* Take :math:`\mu = 100`, :math:`\theta = 6`, :math:`h = 1`, :math:`f = 36` and :math:`c = 2`. + +*Starting Solutions:* :math:`s = 1000`, :math:`S = 2000`. + +If multiple solutions are needed, use :math:`s ∼Uniform(700,1000)`, :math:`S ∼Uniform(1500,2000)`. + +*Measurement of Time:* Days simulated + +*Optimal Solution:* Unknown + +.. image:: _static/sscont.png + :alt: The example table has failed to display + :width: 800 + +.. examples of using math, first is for centered math on its own line, second is for inline + +.. .. math:: + + \frac{ \sum_{t=0}^{N}f(t,k) }{N} + .. Since Pythagoras, we know that :math:`\frac{ \sum_{t=0}^{N}f(t,k) }{N}` \ No newline at end of file diff --git a/docs/tableallocation.rst b/docs/source/models/tableallocation.rst similarity index 74% rename from docs/tableallocation.rst rename to docs/source/models/tableallocation.rst index 99d477110..e0b68f91e 100644 --- a/docs/tableallocation.rst +++ b/docs/source/models/tableallocation.rst @@ -1,104 +1,107 @@ -Model: Restaurant Table Management (TABLEALLOCATION) -==================================================== - -Description: ------------- -Floor space in a restaurant is allocated to N different sizes of tables, with capacities -:math:`c = [c_1, c_2,..., c_N ], c_i \in Z_+^{n}`. A table of capacity :math:`c_i` can seat -:math:`c_i` customers or fewer. -The restaurant can seat a maximum of :math:`K` customers at a time, -regardless of table allocation, and is open for :math:`T` consecutive hours. -The decision variable is the vector :math:`x` representing -the number of tables allocated to each size. - -Customers arrive in groups of size :math:`j \in \{1, ..., max_i(c_i)\}` according to a homogeneous -Poisson process with rate :math:`\lambda_j`. A group of customers is seated at the smallest possible -available table. If there are no available tables large enough, the group of customers -leaves immediately. Service time per group is exponential and revenue per group is fixed. - -Sources of Randomness: ----------------------- -Groups of customers arrive according to a homogenrous Poisson process. Group size is randomly generated -with probability proportional to each group's average arrival rate. Service time per group is exponential. - -Model Factors: --------------- -* n_hour: Number of hours to simulate. - - * Default: 3 - -* capacity: Maximum total capacity. - - * Default: 80 - -* table_cap: Capacity of each type of table. - - * Default: [2, 4, 6, 8] - -* lambda: Average number of arrivals per hour. - - * Default: [3, 6, 3, 3, 2, 4/3, 6/5, 1] - -* service_time_means: Mean service time in minutes. - - * Default: [20, 25, 30, 35, 40, 45, 50, 60] - -* table_revenue: Revenue earned for each group size. - - * Default: [15, 30, 45, 60, 75, 90, 105, 120] - -* num_tables: Number of tables of each capacity. - - * Default: [10,5,4,2] - -Responses: ----------- -* total_revenue: Total revenue earned over the simulation period. - -* service_rate: Fraction of customer arrivals that are seated. - -References: -=========== -Original author of this problem is Bryan Chong (March 10, 2015). - - -Optimization Problem: Maximize Revenue (TABLEALLOCATION-1) -========================================================== - -Decision Variables: -------------------- -* num_tables - -Objectives: ------------ -Maximize the total expected revenue for a restaurant operation. - -Constraints: ------------- -Number of seats in the restaurant :math:`<= capacity`. - -Problem Factors: ----------------- -* budget: Max # of replications for a solver to take. - - * Default: 1000 - -Fixed Model Factors: --------------------- -N/A - -Starting Solution: ------------------- -* num_tables: [10, 5, 4, 2]. Corresponds to 10 tables of size 2, 5 tables of size 4, 4 tables of size 6, and 2 tables of size 8. - -Random Solutions: ------------------ -Distribute total capacity uniformly across table sizes. If the remaining capacity is smaller than the smallest table size, keep the last table allocation as a starting solution. - -Optimal Solution: ------------------ -Unknown. - -Optimal Objective Function Value: ---------------------------------- +Restaurant Table Management +=========================== + +See the :mod:`simopt.models.tableallocation` module for API details. + +Model: Restaurant Table Management (TABLEALLOCATION) +---------------------------------------------------- + +Description +^^^^^^^^^^^ + +Floor space in a restaurant is allocated to N different sizes of tables, with capacities +:math:`c = [c_1, c_2,..., c_N ], c_i \in Z_+^{n}`. A table of capacity :math:`c_i` can seat +:math:`c_i` customers or fewer. +The restaurant can seat a maximum of :math:`K` customers at a time, +regardless of table allocation, and is open for :math:`T` consecutive hours. +The decision variable is the vector :math:`x` representing +the number of tables allocated to each size. + +Customers arrive in groups of size :math:`j \in \{1, ..., max_i(c_i)\}` according to a homogeneous +Poisson process with rate :math:`\lambda_j`. A group of customers is seated at the smallest possible +available table. If there are no available tables large enough, the group of customers +leaves immediately. Service time per group is exponential and revenue per group is fixed. + +Sources of Randomness +^^^^^^^^^^^^^^^^^^^^^ + +Groups of customers arrive according to a homogenrous Poisson process. Group size is randomly generated +with probability proportional to each group's average arrival rate. Service time per group is exponential. + +Model Factors +^^^^^^^^^^^^^ + +* n_hour: Number of hours to simulate. + * Default: 3 +* capacity: Maximum total capacity. + * Default: 80 +* table_cap: Capacity of each type of table. + * Default: [2, 4, 6, 8] +* lambda: Average number of arrivals per hour. + * Default: [3, 6, 3, 3, 2, 4/3, 6/5, 1] +* service_time_means: Mean service time in minutes. + * Default: [20, 25, 30, 35, 40, 45, 50, 60] +* table_revenue: Revenue earned for each group size. + * Default: [15, 30, 45, 60, 75, 90, 105, 120] +* num_tables: Number of tables of each capacity. + * Default: [10,5,4,2] + +Responses +^^^^^^^^^ + +* total_revenue: Total revenue earned over the simulation period. +* service_rate: Fraction of customer arrivals that are seated. + +References +^^^^^^^^^^ + +Original author of this problem is Bryan Chong (March 10, 2015). + +Optimization Problem: Maximize Revenue (TABLEALLOCATION-1) +---------------------------------------------------------- + +Decision Variables +^^^^^^^^^^^^^^^^^^ + +* num_tables + +Objectives +^^^^^^^^^^ + +Maximize the total expected revenue for a restaurant operation. + +Constraints +^^^^^^^^^^^ + +Number of seats in the restaurant :math:`<= capacity`. + +Problem Factors +^^^^^^^^^^^^^^^ + +* budget: Max # of replications for a solver to take. + * Default: 1000 + +Fixed Model Factors +^^^^^^^^^^^^^^^^^^^ + +N/A + +Starting Solution +^^^^^^^^^^^^^^^^^ + +* num_tables: [10, 5, 4, 2]. Corresponds to 10 tables of size 2, 5 tables of size 4, 4 tables of size 6, and 2 tables of size 8. + +Random Solutions +^^^^^^^^^^^^^^^^ + +Distribute total capacity uniformly across table sizes. If the remaining capacity is smaller than the smallest table size, keep the last table allocation as a starting solution. + +Optimal Solution +^^^^^^^^^^^^^^^^ + +Unknown. + +Optimal Objective Function Value +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Unknown. \ No newline at end of file diff --git a/docs/source/solvers.rst b/docs/source/solvers.rst new file mode 100644 index 000000000..56a46a88e --- /dev/null +++ b/docs/source/solvers.rst @@ -0,0 +1,14 @@ +Solvers +======= + +.. toctree:: + :maxdepth: 1 + :titlesonly: + + solvers/adam + solvers/aloe + solvers/astrodf + solvers/neldmd + solvers/randomsearch + solvers/spsa + solvers/strong diff --git a/docs/adam.rst b/docs/source/solvers/adam.rst similarity index 88% rename from docs/adam.rst rename to docs/source/solvers/adam.rst index f95981bf7..1f4e00bfb 100644 --- a/docs/adam.rst +++ b/docs/source/solvers/adam.rst @@ -1,71 +1,59 @@ -Solver: ADAM -============ - -Description: ------------- -The solver is for efficient stochastic optimization that only requires first-order gradients -with little memory requirement. The method computes individual adaptive learning rates for -different parameters from estimates of first and second moments of the gradients. - - -Modifications & Implementation: -------------------------------- -At each timestep :math:`t`, we first evaluate the gradient w.r.t the current solution :math:`x`, either using -the IPA gradient estimates or finite difference estimates. -Then, the algorithm updates exponential moving averages of the gradient :math:`m_t` and the squared gradient -:math:`v_t` where the hyper-parameters :math:`\beta_1` and :math:`\beta_2` control the exponential decay rates of -these moving averages. The moving averages themselves are estimates of the 1st moment (the mean) and the -2nd raw moment (the uncentered variance) of the gradient. These moving averages are -initialized as (vectors of) 0's, leading to moment estimates that are biased towards zero, especially -during the initial timesteps, and especially when the decay rates are small (i.e., the :math:`\beta` are close to 1). -The bias-corrected estimates :math:`\hat{m_t}` and :math:`\hat{v_t}`. Lastly, the new solution can be found via -current solution, the bias-corrected first and second moment estimate, and the step size. - -Helper functions: -The finite_diff function uses finite difference methods to estimate the gradient of the -objective function. - - -Scope: ------- -* objective_type: single - -* constraint_type: box - -* variable_type: continuous - - -Solver Factors: ---------------- -* crn_across_solns: Use CRN across solutions? - - * Default: True - -* r: Number of replications taken at each solution. - - * Default: 30 - -* beta_1: Exponential decay of the rate for the first moment estimates. - - * Default: 0.9 - -* beta_2: Exponential decay rate for the second-moment estimates. - - * Default: 0.999 - -* alpha: Step size. - - * Default: 0.5 - -* epsilon: A small value to prevent zero-division. - - * Default: 10^(-8) - -* sensitivity: shrinking scale for VarBds - - * Default: 10^(-7) - - -References: -=========== -This solver is adapted from the article Kingma, D. P., & Ba, J. (2014). Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980. +ADAM +==== + +See the :mod:`simopt.solvers.adam` module for API details. + +Description +----------- + +The solver is for efficient stochastic optimization that only requires first-order gradients +with little memory requirement. The method computes individual adaptive learning rates for +different parameters from estimates of first and second moments of the gradients. + +Modifications & Implementation +------------------------------ + +At each timestep :math:`t`, we first evaluate the gradient w.r.t the current solution :math:`x`, either using +the IPA gradient estimates or finite difference estimates. +Then, the algorithm updates exponential moving averages of the gradient :math:`m_t` and the squared gradient +:math:`v_t` where the hyper-parameters :math:`\beta_1` and :math:`\beta_2` control the exponential decay rates of +these moving averages. The moving averages themselves are estimates of the 1st moment (the mean) and the +2nd raw moment (the uncentered variance) of the gradient. These moving averages are +initialized as (vectors of) 0's, leading to moment estimates that are biased towards zero, especially +during the initial timesteps, and especially when the decay rates are small (i.e., the :math:`\beta` are close to 1). +The bias-corrected estimates :math:`\hat{m_t}` and :math:`\hat{v_t}`. Lastly, the new solution can be found via +current solution, the bias-corrected first and second moment estimate, and the step size. + +Helper functions: +The finite_diff function uses finite difference methods to estimate the gradient of the +objective function. + +Scope +----- + +* objective_type: single +* constraint_type: box +* variable_type: continuous + +Solver Factors +-------------- + +* crn_across_solns: Use CRN across solutions? + * Default: True +* r: Number of replications taken at each solution. + * Default: 30 +* beta_1: Exponential decay of the rate for the first moment estimates. + * Default: 0.9 +* beta_2: Exponential decay rate for the second-moment estimates. + * Default: 0.999 +* alpha: Step size. + * Default: 0.5 +* epsilon: A small value to prevent zero-division. + * Default: 10^(-8) +* sensitivity: shrinking scale for VarBds + * Default: 10^(-7) + +References +---------- + +This solver is adapted from the article Kingma, D. P., & Ba, J. (2014). Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980. diff --git a/docs/aloe.rst b/docs/source/solvers/aloe.rst similarity index 83% rename from docs/aloe.rst rename to docs/source/solvers/aloe.rst index e46dc0a28..9f7a6bd46 100644 --- a/docs/aloe.rst +++ b/docs/source/solvers/aloe.rst @@ -1,75 +1,60 @@ -Solver: Adaptive Line-search with Oracle Estimations (ALOE) -=========================================================== - -Description: ------------- -The solver is a stochastic line search algorithm with the gradient estimate recomputed in each iteration, -whether or not a step is accepted. The algorithm includes the relaxation of the Armijo condition by -an additive constant :math:`2\epsilon_f`. - - -Modifications & Implementation: -------------------------------- -For each iteration, first compute the gradient approximation :math:`g_k` using either -the IPA gradient estimates or finite difference estimates. -Then, the algorithm checks for sufficient decrease. Let :math:`x_k^{+} = x_k - \alpha_k g_k`. Estimate the objective -values :math:`f(x_k^{+})` and :math:`f(x_k)`. Check the modified Arimjo condition: - -.. math:: - - f(x_k^{+}) \leq f(x_k) - \alpha_k \theta ||g_k||^2 + 2\epsilon_f. - -If the condition holds, then set :math:`x_{k+1} \leftarrow x_{k}` and :math:`\alpha_{k+1} \leftarrow \min\{ \alpha_{max}, \gamma^{-1}\alpha_k \}`. -Otherwise, set :math:`x_{k+1} \leftarrow x_{k}` and :math:`\alpha_{k+1} \leftarrow \gamma \alpha_k` - -Helper functions: -The finite_diff function uses finite difference methods to estimate the gradient of the objective function. - - -Scope: ------- -* objective_type: single - -* constraint_type: box - -* variable_type: continuous - - -Solver Factors: ---------------- -* crn_across_solns: Use CRN across solutions? - - * Default: True - -* r: Number of replications taken at each solution. - - * Default: 30 - -* theta: Constant in the Armijo condition. - - * Default: 0.2 - -* gamma: Constant for shrinking the step size. - - * Default: 0.8 - -* alpha_max: Maximum step size. - - * Default: 10 - -* alpha_0: Initial step size. - - * Default: 1 - -* epsilon_f: Additive constant in the Armijo condition. - - * Default: 1 - -* sensitivity: Shrinking scale for variable bounds. - - * Default: 10^(-7) - - -References: -=========== -This solver is adapted from the article Jin, B., Scheinberg, K., & Xie, M. (2021). High probability complexity bounds for line search based on stochastic oracles. Advances in Neural Information Processing Systems, 34, 9193-9203. +Adaptive Line-search with Oracle Estimations (ALOE) +=================================================== + +See the :mod:`simopt.solvers.aloe` module for API details. + +Description +----------- + +The solver is a stochastic line search algorithm with the gradient estimate recomputed in each iteration, +whether or not a step is accepted. The algorithm includes the relaxation of the Armijo condition by +an additive constant :math:`2\epsilon_f`. + +Modifications & Implementation +------------------------------ + +For each iteration, first compute the gradient approximation :math:`g_k` using either +the IPA gradient estimates or finite difference estimates. +Then, the algorithm checks for sufficient decrease. Let :math:`x_k^{+} = x_k - \alpha_k g_k`. Estimate the objective +values :math:`f(x_k^{+})` and :math:`f(x_k)`. Check the modified Arimjo condition: + +.. math:: + f(x_k^{+}) \leq f(x_k) - \alpha_k \theta ||g_k||^2 + 2\epsilon_f. + +If the condition holds, then set :math:`x_{k+1} \leftarrow x_{k}` and :math:`\alpha_{k+1} \leftarrow \min\{ \alpha_{max}, \gamma^{-1}\alpha_k \}`. +Otherwise, set :math:`x_{k+1} \leftarrow x_{k}` and :math:`\alpha_{k+1} \leftarrow \gamma \alpha_k` + +Helper functions: +The finite_diff function uses finite difference methods to estimate the gradient of the objective function. + +Scope +----- + +* objective_type: single +* constraint_type: box +* variable_type: continuous + +Solver Factors +-------------- + +* crn_across_solns: Use CRN across solutions? + * Default: True +* r: Number of replications taken at each solution. + * Default: 30 +* theta: Constant in the Armijo condition. + * Default: 0.2 +* gamma: Constant for shrinking the step size. + * Default: 0.8 +* alpha_max: Maximum step size. + * Default: 10 +* alpha_0: Initial step size. + * Default: 1 +* epsilon_f: Additive constant in the Armijo condition. + * Default: 1 +* sensitivity: Shrinking scale for variable bounds. + * Default: 10^(-7) + +References +---------- + +This solver is adapted from the article Jin, B., Scheinberg, K., & Xie, M. (2021). High probability complexity bounds for line search based on stochastic oracles. Advances in Neural Information Processing Systems, 34, 9193-9203. diff --git a/docs/astrodf.rst b/docs/source/solvers/astrodf.rst similarity index 89% rename from docs/astrodf.rst rename to docs/source/solvers/astrodf.rst index 0406b571b..b771b7721 100644 --- a/docs/astrodf.rst +++ b/docs/source/solvers/astrodf.rst @@ -1,83 +1,68 @@ -Solver: Adaptive Sampling Trust-Region Optimization for Derivative-Free Simulations (ASTRODF) -============================================================================================= - -Description: ------------- -The solver progressively builds local models (quadratic with diagonal Hessian) using interpolation on a set of points on the coordinate bases of the best (incumbent) solution. Solving the local models within a trust region (closed ball around the incumbent solution) at each iteration suggests a candidate solution for the next iteration. If the candidate solution is worse than the best interpolation point, it is replaced with the latter (a.k.a. direct search). The solver then decides whether to accept the candidate solution and expand the trust-region or reject it and shrink the trust-region based on a success ratio test. The sample size at each visited point is determined adaptively and based on closeness to optimality. - -Modifications & Implementation: -------------------------------- - -**construct_model**: Construct the "qualified" local model for each iteration k with the center point x_k, reconstruct with new points in a shrunk trust-region if the model fails the criticality condition. The criticality condition keeps the model gradient norm and the trust-region size in lock-step. - -**evaluate_model**: Find (proxy to) the subproblem solution. - -**get_stopping_time**: Decide whether to stop at the existing sample size for a given solution. - -**get_coordinate_vector**: Form the coordinate basis. - -**get_rotated_basis**: Form the rotated coordinates, where the first vector comes from the visited design points. - -**get_model_coefficients**: Compute the model coefficients using (2d+1) design points and their function estimates by solving a system of linear equations (interpolation). - -**get_coordinate_basis_interpolation_points**: Compute the interpolation points (2d+1) using the coordinate basis. - -**get_rotated_basis_interpolation_points**: Compute the interpolation points (2d+1) using the rotated coordinate basis to allow reusing one design point. - -**iterate**: Run one iteration of trust-region algorithm by bulding and solving a local model and updating the current incumbent and trust-region radius, and saving the data. - -Scope: ------- -* objective_type: single - -* constraint_type: box - -* variable_type: continuous - -* gradient_observations: not available - -Solver Factors: ---------------- -* crn_across_solns: Use CRN across solutions? - - * Default: True - -* eta_1: Threshhold for a successful iteration > 0, < 1. - - * Default: 0.1 - -* eta_2: Threshhold for a very successful iteration > eta_1, < 1. - - * Default: 0.8 - -* gamma_1: Trust-region radius increase rate after a very successful iteration > 1. - - * Default: 1.5 - -* gamma_2: Trust-region radius decrease rate after an unsuccessful iteration < 1, > 0. - - * Default: 0.5 - -* lambda_min: Minimum sample size value, integer > 2. - - * Default: 4 - -* seasy_solve: Solve the subproblem approximately with Cauchy point. - - * Default: True - -* reuse_points: Reuse the previously visited points. - - * Default: True - -* ps_sufficient_reduction: Use pattern search if with sufficient reduction, 0 always allows it, large value never does. - - * Default: 0.1 - - -References: -=========== -This solver is adapted from the article Ha, Y., Shashaani, S., and Tran-Dinh, Q. (2021). -Improved Complexity Of Trust-Region Optimization For Zeroth-Order Stochastic Oracles with Adaptive Sampling -*Proceedings of 2021 Winter Simulation Conference*, doi: 10.1109/WSC52266.2021.9715529. +Adaptive Sampling Trust-Region Optimization for Derivative-Free Simulations (ASTRODF) +===================================================================================== + +See the :mod:`simopt.solvers.astrodf` module for API details. + +Description +----------- + +The solver progressively builds local models (quadratic with diagonal Hessian) using interpolation on a set of points on the coordinate bases of the best (incumbent) solution. Solving the local models within a trust region (closed ball around the incumbent solution) at each iteration suggests a candidate solution for the next iteration. If the candidate solution is worse than the best interpolation point, it is replaced with the latter (a.k.a. direct search). The solver then decides whether to accept the candidate solution and expand the trust-region or reject it and shrink the trust-region based on a success ratio test. The sample size at each visited point is determined adaptively and based on closeness to optimality. + +Modifications & Implementation +------------------------------ + +**construct_model**: Construct the "qualified" local model for each iteration k with the center point x_k, reconstruct with new points in a shrunk trust-region if the model fails the criticality condition. The criticality condition keeps the model gradient norm and the trust-region size in lock-step. + +**evaluate_model**: Find (proxy to) the subproblem solution. + +**get_stopping_time**: Decide whether to stop at the existing sample size for a given solution. + +**get_coordinate_vector**: Form the coordinate basis. + +**get_rotated_basis**: Form the rotated coordinates, where the first vector comes from the visited design points. + +**get_model_coefficients**: Compute the model coefficients using (2d+1) design points and their function estimates by solving a system of linear equations (interpolation). + +**get_coordinate_basis_interpolation_points**: Compute the interpolation points (2d+1) using the coordinate basis. + +**get_rotated_basis_interpolation_points**: Compute the interpolation points (2d+1) using the rotated coordinate basis to allow reusing one design point. + +**iterate**: Run one iteration of trust-region algorithm by bulding and solving a local model and updating the current incumbent and trust-region radius, and saving the data. + +Scope +----- + +* objective_type: single +* constraint_type: box +* variable_type: continuous +* gradient_observations: not available + +Solver Factors +-------------- + +* crn_across_solns: Use CRN across solutions? + * Default: True +* eta_1: Threshhold for a successful iteration > 0, < 1. + * Default: 0.1 +* eta_2: Threshhold for a very successful iteration > eta_1, < 1. + * Default: 0.8 +* gamma_1: Trust-region radius increase rate after a very successful iteration > 1. + * Default: 1.5 +* gamma_2: Trust-region radius decrease rate after an unsuccessful iteration < 1, > 0. + * Default: 0.5 +* lambda_min: Minimum sample size value, integer > 2. + * Default: 4 +* seasy_solve: Solve the subproblem approximately with Cauchy point. + * Default: True +* reuse_points: Reuse the previously visited points. + * Default: True +* ps_sufficient_reduction: Use pattern search if with sufficient reduction, 0 always allows it, large value never does. + * Default: 0.1 + +References +---------- + +This solver is adapted from the article Ha, Y., Shashaani, S., and Tran-Dinh, Q. (2021). +Improved Complexity Of Trust-Region Optimization For Zeroth-Order Stochastic Oracles with Adaptive Sampling +*Proceedings of 2021 Winter Simulation Conference*, doi: 10.1109/WSC52266.2021.9715529. (https://ieeexplore.ieee.org/abstract/document/9715529) \ No newline at end of file diff --git a/docs/neldmd.rst b/docs/source/solvers/neldmd.rst similarity index 87% rename from docs/neldmd.rst rename to docs/source/solvers/neldmd.rst index 9b19e82a1..ff551fbee 100644 --- a/docs/neldmd.rst +++ b/docs/source/solvers/neldmd.rst @@ -1,66 +1,55 @@ -Solver: Nelder-Mead (NELDMD) -============================ - -Description: ------------- -The algorithm maintains a simplex of points that moves around the feasible -region according to certain geometric operations: reflection, expansion, -scontraction, and shrinking. - -Modifications & Implementation: -------------------------------- -Initial (dimension + 1) points: -Include the initial solution from the model. Generate the remaining points using the .get_random_solution() method provided by the model. If there are box constraints, then the remaining points are instead generated by taking the initial solution and shifting it in a different dimension for each point by some value; the value is a fraction of the distance between the bounds. The direction of shift is towards smaller for minimization and larger for maximization unless it is out of bounds, for which the opposite direction is tried. If neither direction produces a valid solution, then that dimension is set to the lower bound for minimization or upper bound for maximization problems. - -Box constraints: -Nelder-Mead checks for box constraints in the solver and modifies the parts of a solution that go out of bounds by setting them to their respective closest bound. For example, if a tentative solution is (2,4) and the upper bound is (3,3), then the point is modified to (2,3). Additionally, if the reflected point goes out of bounds, all the points will be shrinked towards the best point. - -Scope: ------- -* objective_type: single - -* constraint_type: box - -* variable_type: continuous - -Solver Factors: ---------------- -* crn_across_solns: Use CRN across solutions? - - * Default: True - -* r: Number of replications taken at each solution. - - * Default: 30 - -* alpha: Reflection coefficient > 0. - - * Default: 1.0 - -* gammap: Expansion coefficient > 1. - - * Default: 2.0 - -* betap: Contraction coefficient > 0, < 1. - - * Default: 0.5 - -* delta: Shrink factor > 0, < 1. - - * Default: 0.5 - -* sensitivity: Shrinking scale for bounds to avoid floating and/or rounding errors. - - * Default: :math:`10^{-7}` - -* initial_spread: Fraction of the distance between bounds used to select initial points. - - * Default: 0.1 - - -References: -=========== -This solver is adapted from the article Russell R. Barton and John S. Ivey, Jr., (1996). -Nelder-Mead Simplex Modifications for Simulation Optimization. -*Management Science*, 42(7):954-973. +Nelder-Mead (NELDMD) +==================== + +See the :mod:`simopt.solvers.neldmd` module for API details. + +Description +----------- + +The algorithm maintains a simplex of points that moves around the feasible +region according to certain geometric operations: reflection, expansion, +scontraction, and shrinking. + +Modifications & Implementation +------------------------------ + +Initial (dimension + 1) points: +Include the initial solution from the model. Generate the remaining points using the .get_random_solution() method provided by the model. If there are box constraints, then the remaining points are instead generated by taking the initial solution and shifting it in a different dimension for each point by some value; the value is a fraction of the distance between the bounds. The direction of shift is towards smaller for minimization and larger for maximization unless it is out of bounds, for which the opposite direction is tried. If neither direction produces a valid solution, then that dimension is set to the lower bound for minimization or upper bound for maximization problems. + +Box constraints: +Nelder-Mead checks for box constraints in the solver and modifies the parts of a solution that go out of bounds by setting them to their respective closest bound. For example, if a tentative solution is (2,4) and the upper bound is (3,3), then the point is modified to (2,3). Additionally, if the reflected point goes out of bounds, all the points will be shrinked towards the best point. + +Scope +----- + +* objective_type: single +* constraint_type: box +* variable_type: continuous + +Solver Factors +-------------- + +* crn_across_solns: Use CRN across solutions? + * Default: True +* r: Number of replications taken at each solution. + * Default: 30 +* alpha: Reflection coefficient > 0. + * Default: 1.0 +* gammap: Expansion coefficient > 1. + * Default: 2.0 +* betap: Contraction coefficient > 0, < 1. + * Default: 0.5 +* delta: Shrink factor > 0, < 1. + * Default: 0.5 +* sensitivity: Shrinking scale for bounds to avoid floating and/or rounding errors. + * Default: :math:`10^{-7}` +* initial_spread: Fraction of the distance between bounds used to select initial points. + * Default: 0.1 + +References +---------- + +This solver is adapted from the article Russell R. Barton and John S. Ivey, Jr., (1996). +Nelder-Mead Simplex Modifications for Simulation Optimization. +*Management Science*, 42(7):954-973. (https://pubsonline.informs.org/doi/abs/10.1287/mnsc.42.7.954) \ No newline at end of file diff --git a/docs/randomsearch.rst b/docs/source/solvers/randomsearch.rst similarity index 74% rename from docs/randomsearch.rst rename to docs/source/solvers/randomsearch.rst index f87234d95..6434c147b 100644 --- a/docs/randomsearch.rst +++ b/docs/source/solvers/randomsearch.rst @@ -1,38 +1,38 @@ -Solver: Random Search (RNDSRCH) -=============================== - -Description: ------------- -Randomly sample solutions from the feasible region and use a fixed number of replications at each solution. The sampling distribution is specified inside each problem class in **get_random_solution**. - -Modifications & Implementation: -------------------------------- -The new random solutions maintain the type of each variable based on the sampling distributions that are discrete for integer decisions and otherwise continuous. - -Scope: ------- -* objective_type: single - -* constraint_type: stochastic - -* variable_type: mixed - -* gradient_observations: not available - -Solver Factors: ---------------- -* crn_across_solns: Use CRN across solutions? - - * Default: True - -* sample_size: Sample size per solution > 1. - - * Default: 10 - - -References: -=========== -This solver is adapted from the article Chia, Y.L. and Glynn, P.W., (2013). -Limit Theorems for Simulation-Based Optimization via Random Search. -*ACM Transactions on Modeling and Computer Simulation (TOMACS)*, 23(3), pp.1-18. +Random Search (RNDSRCH) +======================= + +See the :mod:`simopt.solvers.randomsearch` module for API details. + +Description +----------- + +Randomly sample solutions from the feasible region and use a fixed number of replications at each solution. The sampling distribution is specified inside each problem class in **get_random_solution**. + +Modifications & Implementation +------------------------------ + +The new random solutions maintain the type of each variable based on the sampling distributions that are discrete for integer decisions and otherwise continuous. + +Scope +----- + +* objective_type: single +* constraint_type: stochastic +* variable_type: mixed +* gradient_observations: not available + +Solver Factors +-------------- + +* crn_across_solns: Use CRN across solutions? + * Default: True +* sample_size: Sample size per solution > 1. + * Default: 10 + +References +---------- + +This solver is adapted from the article Chia, Y.L. and Glynn, P.W., (2013). +Limit Theorems for Simulation-Based Optimization via Random Search. +*ACM Transactions on Modeling and Computer Simulation (TOMACS)*, 23(3), pp.1-18. (https://dl.acm.org/doi/abs/10.1145/2499913.2499915) \ No newline at end of file diff --git a/docs/spsa.rst b/docs/source/solvers/spsa.rst similarity index 81% rename from docs/spsa.rst rename to docs/source/solvers/spsa.rst index 2497e7510..9ab6a91f2 100644 --- a/docs/spsa.rst +++ b/docs/source/solvers/spsa.rst @@ -1,65 +1,52 @@ -Solver: Simultaneous Perturbation Stochastic Approximation (SPSA) -================================================================= - -Description: ------------- -SPSA is an iterative algorithm that approximates the gradient based on function evaluations taken at two points: one in a random direction and the other in the opposite direction. - -Modifications & Implementation: -------------------------------- -SPSA's main feature is the gradient approximation that requires only two objective function measurements per iteration. -The gradient approximtation calculation used in this solver is the weigthed average of the two objective function measurements, -with the weights reflecting the distances between the two neighbors and the incumbent solution. - -Scope: ------- -* objective_type: single - -* constraint_type: box - -* variable_type: continuous - -* gradient_observations: not available - -Solver Factors: ---------------- -* crn_across_solns: Use CRN across solutions? - - * Default: True - -* alpha: Non-negative coefficient in the SPSA gain sequecence ak. - - * Default: 0.602 - -* gamma: Non-negative coefficient in the SPSA gain sequecence ck. - - * Default: 0.101 - -* step: The initial desired magnitude of change in the theta elements. - - * Default: 0.1 - -* gavg: Averaged SP gradients used per iteration. - - * Default: 1 - -* n_reps: Number of replications takes at each solution. - - * Default: 30 - -* n_loss: Number of loss function evaluations used in this gain calculation. - - * Default: 2 - -* eval_pct: Percentage of the expected number of loss evaluations per run. - - * Default: 2 / 3 - -* iter_pct: Percentage of the maximum expected number of iterations. - - * Default: 0.1 - -References: -=========== -This solver is adapted from the article Spall, J. C. (1998). Implementation of simultaneous perturbation algorithm for stochastic optimization. IEEE Transactions on Aerospace and Electronic Systems 34(3):817-823. +Simultaneous Perturbation Stochastic Approximation (SPSA) +========================================================= + +See the :mod:`simopt.solvers.spsa` module for API details. + +Description +----------- + +SPSA is an iterative algorithm that approximates the gradient based on function evaluations taken at two points: one in a random direction and the other in the opposite direction. + +Modifications & Implementation +------------------------------ + +SPSA's main feature is the gradient approximation that requires only two objective function measurements per iteration. +The gradient approximtation calculation used in this solver is the weigthed average of the two objective function measurements, +with the weights reflecting the distances between the two neighbors and the incumbent solution. + +Scope +----- + +* objective_type: single +* constraint_type: box +* variable_type: continuous +* gradient_observations: not available + +Solver Factors +-------------- + +* crn_across_solns: Use CRN across solutions? + * Default: True +* alpha: Non-negative coefficient in the SPSA gain sequecence ak. + * Default: 0.602 +* gamma: Non-negative coefficient in the SPSA gain sequecence ck. + * Default: 0.101 +* step: The initial desired magnitude of change in the theta elements. + * Default: 0.1 +* gavg: Averaged SP gradients used per iteration. + * Default: 1 +* n_reps: Number of replications takes at each solution. + * Default: 30 +* n_loss: Number of loss function evaluations used in this gain calculation. + * Default: 2 +* eval_pct: Percentage of the expected number of loss evaluations per run. + * Default: 2 / 3 +* iter_pct: Percentage of the maximum expected number of iterations. + * Default: 0.1 + +References +---------- + +This solver is adapted from the article Spall, J. C. (1998). Implementation of simultaneous perturbation algorithm for stochastic optimization. IEEE Transactions on Aerospace and Electronic Systems 34(3):817-823. (https://ieeexplore.ieee.org/document/705889) \ No newline at end of file diff --git a/docs/strong.rst b/docs/source/solvers/strong.rst similarity index 71% rename from docs/strong.rst rename to docs/source/solvers/strong.rst index dfe31a0ed..dd4eaad64 100644 --- a/docs/strong.rst +++ b/docs/source/solvers/strong.rst @@ -1,94 +1,72 @@ -Solver: Stochastic Trust-Region Response-Surface Method (STRONG) -================================================================ - -Description: ------------- -The solver estimates the shape of the underlying response distribution, -through function evaluations taken within a neighborhood of the incumbent solution. -STRONG has two stages in each iteration where a sub trust region is defined: -stage I optimizes a first-order polynomial, and stage II optimizes a second-order -polynomial. If stage II fails to generate a good solution, an inner loop is initiated -where value, gradient, and Hessian of the center point are further calculated. - - -Modifications & Implementation: -------------------------------- -Process within a stage: -We first find the Cauchy Point and the new solution in order to create a polynomial. -Then, the solver either shrinks trust region size, or moves the center point while the -trust region size stays constant, or moves the center point while the trust region enlarges. - -Helper functions: -There are 3 helper functions in addition to the main algorithm. - - * **cauchy_point** finds the Cauchy Point by using the gradient and Hessian matrix to find the steepest descent direction. - - * **check_cons** checks the feasibility of the Cauchy point and updates the point accordingly. - - * **finite_diff** uses finite difference to estimate gradients and BFGS to estimate the Hessian matrix. - -Scope: ------- -* objective_type: single - -* constraint_type: box - -* variable_type: continuous - - -Solver Factors: ---------------- -* crn_across_solns: Use CRN across solutions? - - * Default: True - -* n0: Initial sample size - - * Default: 10 - -* n_r: Number of replications taken at each solution - - * Default: 10 - -* sensitivity: shrinking scale for VarBds - - * Default: 10**(-7) - -* delta_threshold: maximum value of the radius - - * Default: 1.2 - -* delta_T: initial size of trust region - - * Default: 2 - -* eta_0: the constant of accepting - - * Default: 0.01 - -* eta_1: the constant of more confident accepting - - * Default: 0.3 - -* gamma_1: the constant of shrinking the trust regionthe new solution - - * Default: 0.9 - -* gamma_2: the constant of expanding the trust region - - * Default: 1.11 - -* lambda: multiplicative factor for n_r within finite difference - - * Default: 2 - -* lambda_2: magnifying factor for n_r in stage I and stage II - - * Default: 1.01 - -References: -=========== -This solver is adapted from the article Kuo-Hao Chang, L. Jeff Hong, Hong Wan, (2013). -Stochastic Trust-Region Response-Surface Method (STRONG) - A New Response-Surface Framework for Simulation Optimization. -*INFORMS Journal on Computing*, 25(2):230-243. -(https://doi.org/10.1287/ijoc.1120.0498) +Stochastic Trust-Region Response-Surface Method (STRONG) +======================================================== + +See the :mod:`simopt.solvers.strong` module for API details. + +Description +----------- + +The solver estimates the shape of the underlying response distribution, +through function evaluations taken within a neighborhood of the incumbent solution. +STRONG has two stages in each iteration where a sub trust region is defined: +stage I optimizes a first-order polynomial, and stage II optimizes a second-order +polynomial. If stage II fails to generate a good solution, an inner loop is initiated +where value, gradient, and Hessian of the center point are further calculated. + +Modifications & Implementation +------------------------------ + +Process within a stage: +We first find the Cauchy Point and the new solution in order to create a polynomial. +Then, the solver either shrinks trust region size, or moves the center point while the +trust region size stays constant, or moves the center point while the trust region enlarges. + +Helper functions: +There are 3 helper functions in addition to the main algorithm: + +* **cauchy_point** finds the Cauchy Point by using the gradient and Hessian matrix to find the steepest descent direction. +* **check_cons** checks the feasibility of the Cauchy point and updates the point accordingly. +* **finite_diff** uses finite difference to estimate gradients and BFGS to estimate the Hessian matrix. + +Scope +----- + +* objective_type: single +* constraint_type: box +* variable_type: continuous + +Solver Factors +-------------- + +* crn_across_solns: Use CRN across solutions? + * Default: True +* n0: Initial sample size + * Default: 10 +* n_r: Number of replications taken at each solution + * Default: 10 +* sensitivity: shrinking scale for VarBds + * Default: 10**(-7) +* delta_threshold: maximum value of the radius + * Default: 1.2 +* delta_T: initial size of trust region + * Default: 2 +* eta_0: the constant of accepting + * Default: 0.01 +* eta_1: the constant of more confident accepting + * Default: 0.3 +* gamma_1: the constant of shrinking the trust regionthe new solution + * Default: 0.9 +* gamma_2: the constant of expanding the trust region + * Default: 1.11 +* lambda: multiplicative factor for n_r within finite difference + * Default: 2 +* lambda_2: magnifying factor for n_r in stage I and stage II + * Default: 1.01 + +References +---------- + +This solver is adapted from the article Kuo-Hao Chang, L. Jeff Hong, Hong Wan, (2013). +Stochastic Trust-Region Response-Surface Method (STRONG) - A New Response-Surface Framework for Simulation Optimization. +*INFORMS Journal on Computing*, 25(2):230-243. +(https://doi.org/10.1287/ijoc.1120.0498) diff --git a/docs/test.rst b/docs/test.rst deleted file mode 100644 index f539c2381..000000000 --- a/docs/test.rst +++ /dev/null @@ -1,29 +0,0 @@ -test package -============ - -Submodules ----------- - -test.run\_template module -------------------------- - -.. automodule:: test.run_template - :members: - :undoc-members: - :show-inheritance: - -test.test\_runner module ------------------------- - -.. automodule:: test.test_runner - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: test - :members: - :undoc-members: - :show-inheritance: diff --git a/environment.yml b/environment.yml index ae923615b..88dbd916e 100644 --- a/environment.yml +++ b/environment.yml @@ -2,14 +2,16 @@ name: simopt channels: - conda-forge dependencies: - - python>=3.8 + - python>=3.9,<3.14 + - ruby>=2.5 - numpy - scipy - jupyter - matplotlib - pandas - seaborn - - sphinx + - pillow - pip + - ruff - pip: - - mrg32k3a + - -e . diff --git a/pyproject.toml b/pyproject.toml index 7daedd7d5..5bb89403f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,37 +7,27 @@ packages = ["simopt", "simopt.gui", "simopt.models", "simopt.solvers"] [project] name = "simoptlib" -version = "1.1.1" +version = "1.2.0" authors = [ - { name="David Eckman", email="eckman@tamu.edu" }, - { name="Shane Henderson", email="sgh9@cornell.edu" }, - { name="Sara Shashaani", email="sshasha2@ncsu.edu" }, - { name="William Grochocinski", email="wagrocho@ncsu.edu" }, + { name = "David Eckman", email = "eckman@tamu.edu" }, + { name = "Shane Henderson", email = "sgh9@cornell.edu" }, + { name = "Sara Shashaani", email = "sshasha2@ncsu.edu" }, + { name = "William Grochocinski", email = "wagrocho@ncsu.edu" }, ] description = "A testbed for simulation-optimization experiments." readme = "README.md" -license = { file="LICENSE" } -requires-python = ">=3.8" +license = { file = "LICENSE" } +requires-python = ">=3.9,<3.14" classifiers = [ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", -] -dependencies = [ - "numpy >= 1.21.6", - "scipy >= 1.7.3", - "matplotlib >= 3.2.2", - "pandas >= 1.3.5", - "seaborn >= 0.11.2", - "mrg32k3a >= 1.0.0" + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", ] +dependencies = ["numpy", "scipy", "matplotlib", "pandas", "seaborn", "mrg32k3a"] + +[project.optional-dependencies] +dev = ["sphinx"] [project.urls] "Homepage" = "https://github.com/simopt-admin/simopt" "Documentation" = "https://simopt.readthedocs.io/en/latest/" - -[tool.ruff] -line-length = 80 - -[tool.ruff.lint] -select = ["E4", "E7", "E9", "F", "B", "N", "UP", "ANN0", "ANN2", "ANN4", "ASYNC", "A", "RUF", "NPY201"] \ No newline at end of file diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 000000000..7b3348008 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,49 @@ +# ruff.toml +line-length = 88 +exclude = ["simopt/gui/*"] + +[lint] +select = [ + # Base style and correctness + "E", # pycodestyle formatting rules + "F", # pyflakes (undefined names, unused imports, etc.) + "B", # flake8-bugbear + "N", # pep8-naming + "UP", # pyupgrade (modern Python syntax) + "A", # flake8-builtins + "I", # isort + + # Type hints and async code + "ANN", # flake8-annotations (required type hints) + "ASYNC", # flake8-async + + # SimOpt-specific tech + "NPY201", # NumPy 2.0 compatibility + + # Code Quality + "SIM", # flake8-simplify + "RET", # flake8-return + "PTH", # flake8-use-pathlib + "ARG", # flake8-unused-arguments + "C4", # flake8-comprehensions + # "C90", # mccabe complexity + + # Ruff-specific + "RUF", # Ruff-exclusive rules + + # Docs and structure + "D", # pydocstyle (docstring conventions) +] + +[lint.mccabe] +max-complexity = 8 + +[lint.pydocstyle] +convention = "google" +ignore-decorators = ["simopt.utils.override"] + +[lint.isort] +known-first-party = ["simopt", "mrg32k3a"] + +[lint.pep8-naming] +classmethod-decorators = ["simopt.utils.classproperty"] diff --git a/scripts/generate_experiment_results.py b/scripts/generate_experiment_results.py new file mode 100644 index 000000000..56d7c868c --- /dev/null +++ b/scripts/generate_experiment_results.py @@ -0,0 +1,126 @@ +"""Create test cases for all compatible problem-solver pairs.""" + +import sys +from pathlib import Path + +import yaml + +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) + +import simopt.directory as directory +from simopt.experiment_base import ProblemSolver, post_normalize + +# Workaround for AutoAPI +problem_directory = directory.problem_directory +solver_directory = directory.solver_directory + +NUM_MACROREPS = 10 +NUM_POSTREPS = 100 + +# Setup the SimOpt directory structure +HOME_DIR = Path(__file__).resolve().parent.parent +EXPECTED_RESULTS_DIR = HOME_DIR / "test" / "expected_results" + + +# Based off the similar function in simopt/experiment_base.py +def is_compatible(problem_name: str, solver_name: str) -> bool: + """Check if a solver is compatible with a problem. + + Args: + problem_name (str): Name of the problem. + solver_name (str): Name of the solver. + + Returns: + bool: Whether the solver is compatible with the problem. + """ + # Create a ProblemSolver object + myexperiment = ProblemSolver(solver_name, problem_name) + # Check if the solver is compatible with the problem + output = myexperiment.check_compatibility() + return len(output) == 0 + + +def create_test(problem_name: str, solver_name: str) -> None: + """Create a test case for a problem and solver. + + Args: + problem_name (str): Name of the problem. + solver_name (str): Name of the solver. + """ + # Run the experiment to get the expected results + myexperiment = ProblemSolver(solver_name, problem_name) + myexperiment.run(n_macroreps=NUM_MACROREPS) + myexperiment.post_replicate(n_postreps=NUM_POSTREPS) + post_normalize([myexperiment], n_postreps_init_opt=NUM_POSTREPS) + + # Loop through each curve object and convert it into a tuple + # This is done to avoid packing custom classes into the YAML file + for i in range(len(myexperiment.objective_curves)): + myexperiment.objective_curves[i] = ( # type: ignore + myexperiment.objective_curves[i].x_vals, + myexperiment.objective_curves[i].y_vals, + ) + for i in range(len(myexperiment.progress_curves)): + myexperiment.progress_curves[i] = ( # type: ignore + myexperiment.progress_curves[i].x_vals, + myexperiment.progress_curves[i].y_vals, + ) + + results_dict = { + "num_macroreps": NUM_MACROREPS, + "num_postreps": NUM_POSTREPS, + "problem_name": problem_name, + "solver_name": solver_name, + "all_recommended_xs": myexperiment.all_recommended_xs, + "all_intermediate_budgets": myexperiment.all_intermediate_budgets, + "all_est_objectives": myexperiment.all_est_objectives, + "objective_curves": myexperiment.objective_curves, + "progress_curves": myexperiment.progress_curves, + } + + # Define the directory and output file + file_problem_name = "".join(e for e in problem_name if e.isalnum()) + file_solver_name = "".join(e for e in solver_name if e.isalnum()) + results_filename = f"{file_problem_name}_{file_solver_name}.yaml" + results_filepath = EXPECTED_RESULTS_DIR / results_filename + # Write the results to the file + with Path.open(results_filepath, "w") as f: + yaml.dump(results_dict, f) + + +def main() -> None: + """Create test cases for all compatible problem-solver pairs.""" + # Create a list of compatible problem-solver pairs + compatible_pairs = [ + (problem_name, solver_name) + for problem_name in problem_directory + for solver_name in solver_directory + if is_compatible(problem_name, solver_name) + ] + + # Create the test directory if it doesn't exist + # Create the expected directory if it doesn't exist + Path.mkdir(EXPECTED_RESULTS_DIR, parents=True, exist_ok=True) + existing_results = [path.name for path in EXPECTED_RESULTS_DIR.glob("*.yaml")] + + # Don't generate any tests for pairs that already have tests generated + for pair in compatible_pairs: + problem_name = pair[0] + solver_name = pair[1] + # Generate the expected filenames + file_problem_name = "".join(e for e in problem_name if e.isalnum()) + file_solver_name = "".join(e for e in solver_name if e.isalnum()) + results_filename = f"{file_problem_name}_{file_solver_name}.yaml" + # If file exists, skip it + if results_filename in existing_results: + print(f"Test for {pair} already exists") + continue + # If file doesn't exist, create it + print(f"Creating test for {pair}") + create_test(problem_name, solver_name) + print("All tests created!") + + +if __name__ == "__main__": + main() diff --git a/scripts/run_experiment.py b/scripts/run_experiment.py new file mode 100644 index 000000000..401f397fe --- /dev/null +++ b/scripts/run_experiment.py @@ -0,0 +1,294 @@ +"""Script to run experiments from the command line.""" + +# Sample usage for running a single experiment with viztracer: +# `viztracer --min_duration 0.05ms utils/run_experiment.py --problems=CHESS-1 --num_macroreps=1` # noqa: E501 + +import argparse +import logging +import sys +import time +from collections.abc import Callable +from functools import partial +from pathlib import Path + +# Append the parent directory (simopt package) to the system path +sys.path.append(str(Path(__file__).resolve().parent.parent)) + +import simopt.directory as directory +from simopt.experiment_base import ProblemSolver, post_normalize + +# Workaround for AutoAPI +problem_directory = directory.problem_directory +solver_directory = directory.solver_directory + + +def load_arguments() -> tuple[str, list[str], list[str], str, int, int]: + """Load command line arguments. + + Returns: + tuple: A tuple containing the problems, solvers, method, log level, + number of macroreplications, and number of postreplications. + """ + parser = argparse.ArgumentParser(description="Execute problem-solver experiments.") + parser.add_argument( + "--method", + type=str, + default="all", + help=( + "Methods to run " + "(`run`, `post_replicate`, `post_normalize`, or `all`) " + "[default: all]" + ), + ) + parser.add_argument( + "--problems", + type=str, + default="all", + help=( + "Abbreviated names of problems to run " + "(comma-separated or `all`) " + "[default: all]" + ), + ) + parser.add_argument( + "--solvers", + type=str, + default="all", + help=( + "Abbreviated names of solvers to run " + "(comma-separated or `all`) " + "[default: all]" + ), + ) + parser.add_argument( + "--log", + type=str, + default="INFO", + help=( + "Logging level " + "(`DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`) " + "[default: INFO]" + ), + ) + parser.add_argument( + "--num_macroreps", + type=int, + default=10, + help="Number of macroreplications [default: 10]", + ) + parser.add_argument( + "--num_postreps", + type=int, + default=100, + help="Number of postreplications [default: 100]", + ) + + args = parser.parse_args() + return ( + args.method, + args.problems.split(","), + args.solvers.split(","), + args.log.upper(), + args.num_macroreps, + args.num_postreps, + ) + + +def is_compatible(problem_name: str, solver_name: str) -> bool: + """Check if a solver is compatible with a problem. + + Args: + problem_name (str): Name of the problem. + solver_name (str): Name of the solver. + + Returns: + bool: True if the solver is compatible with the problem, False otherwise. + """ + myexperiment = ProblemSolver(solver_name, problem_name) + output = myexperiment.check_compatibility() + return len(output) == 0 + + +def gen_partial_funcs( + experiments: list[ProblemSolver], method: str, n_macroreps: int, n_postreps: int +) -> list[tuple[str, str, partial]]: + """Generate partial functions for the experiment. + + Args: + experiments (list[ProblemSolver]): List of valid problem-solver pairs. + method (str): Method to run. + n_macroreps (int): Number of macroreplications. + n_postreps (int): Number of postreplications. + + Returns: + list[tuple[str, str, partial]]: List of tuples containing the solver name, + problem name, and the partial function. + """ + # Each append needs to call the function that runs before it, otherwise it won't be + # properly configured. This could be avoided in the future if loading from a file + # (similar to how the tests work). + # TODO: Refactor this to avoid the need for a chain of partials. + + def append(part: partial, exp: ProblemSolver) -> None: + """Append the partial function to the list with problem/solver names. + + Args: + part (partial): The partial function to append. + exp (ProblemSolver): The experiment object. + """ + prob_name = exp.problem.class_name_abbr + solv_name = exp.solver.class_name_abbr + exp_partials.append((prob_name, solv_name, part)) + + exp_partials = [] + + methods = ["run", "post_replicate", "post_normalize", "all"] + try: + method_idx = methods.index(method) + except ValueError as e: + raise ValueError(f"Invalid method '{method}'. Choose from {methods}.") from e + + for exp in experiments: + # We always need to run the exp + append(partial(exp.run, n_macroreps=n_macroreps), exp) + # Only replicate if the method is post_rep or later + if method_idx >= 1: + append(partial(exp.post_replicate, n_postreps=n_postreps), exp) + # Only normalize if the method is post_norm or later + if method_idx >= 2: + append(partial(post_normalize, [exp], n_postreps_init_opt=n_postreps), exp) + + return exp_partials + + +def create_experiments(problems: list[str], solvers: list[str]) -> list[ProblemSolver]: + """Generate valid problem-solver pairs. + + Args: + problems (list[str]): List of problem names. + solvers (list[str]): List of solver names. + + Returns: + list[ProblemSolver]: List of valid ProblemSolver objects. + """ + return [ + ProblemSolver(solver_name, problem_name) + for problem_name in problem_directory + if problems == ["all"] or problem_name in problems + for solver_name in solver_directory + if solvers == ["all"] or solver_name in solvers + if is_compatible(problem_name, solver_name) + ] + + +def time_function(func: Callable) -> float: + """Decorator to print the runtime of a function. + + Args: + func (Callable): The function to time. + """ + start_time = time.time() + func() + end_time = time.time() + return end_time - start_time + + +def run_partials( + partial_funcs: list[tuple[str, str, partial]], +) -> list[tuple[str, str, str, float]]: + """Run the partial functions and return their runtimes. + + Args: + partial_funcs (list[tuple[str, str, partial]]): List of tuples containing + the solver name, + problem name, and the + partial function. + + Returns: + list[tuple[str, str, str, float]]: List of tuples containing the + problem name, solver name, + function name, and elapsed time. + """ + runtimes = [] + for problem_name, solver_name, part_func in partial_funcs: + logging.info(f"Experimenting with {solver_name} on {problem_name}.") + + elapsed = time_function(part_func) + logging.info( + f"Elapsed time for {solver_name} on {problem_name}: {elapsed:.2f}s" + ) + + runtime_tuple = ( + problem_name, + solver_name, + part_func.func.__name__, + elapsed, + ) + runtimes.append(runtime_tuple) + return runtimes + + +def print_runtimes(runtimes: list[tuple[str, str, str, float]]) -> None: + """Print the runtimes of the experiments. + + Args: + runtimes (list[tuple[str, str, str, float]]): List of tuples containing + the problem name, + solver name, function + name, and elapsed time. + """ + # Extra blank line to make it clear where the results start + print() + # Print header row + header_fields = [ + f"{'Problem Name':<20}", + f"{'Solver Name':<20}", + f"{'Function Name':<20}", + f"{'Elapsed Time (s)':<20}", + ] + print(" │ ".join(header_fields)) + # Print the separator + bars = ["─" * 20] * len(header_fields) + print("─┼─".join(bars)) + # Print each runtime + for problem_name, solver_name, func_name, elapsed in runtimes: + fields = [ + f"{problem_name:<20}", + f"{solver_name:<20}", + f"{func_name:<20}", + f"{elapsed:.2f}", + ] + print(" │ ".join(fields)) + + +# Main loop to iterate through problem/solver pairs +def main() -> None: + """Main function to run the experiment. + + Args: + valid_pairs (list[tuple[str, str]]): List of valid problem-solver pairs. + methods (list[str]): List of methods to run. + num_macroreps (int): Number of macroreplications. + num_postreps (int): Number of postreplications. + """ + # Load the arguments + method, problems, solvers, log_level, num_macroreps, num_postreps = load_arguments() + + # Set logging level + logging.basicConfig( + format="%(levelname)s: %(message)s", + level=getattr(logging, log_level, logging.INFO), + ) + + valid_pairs = create_experiments(problems, solvers) + if len(valid_pairs) == 0: + logging.warning("No valid problem-solver pairs found.") + return + partial_funcs = gen_partial_funcs(valid_pairs, method, num_macroreps, num_postreps) + runtimes = run_partials(partial_funcs) + logging.info("Execution complete.") + print_runtimes(runtimes) + + +if __name__ == "__main__": + main() diff --git a/setup_simopt.bat b/setup_simopt.bat new file mode 100644 index 000000000..3ca2e43ef --- /dev/null +++ b/setup_simopt.bat @@ -0,0 +1,39 @@ +@echo off +set ENV_NAME=simopt +set YML_FILE=environment.yml + +echo Checking for Conda installation... +where conda >nul 2>nul +if %errorlevel% neq 0 ( + echo Conda not found! Please install Miniconda or Anaconda first. + exit /b 1 +) + +:: Ensure Conda is initialized +call "%USERPROFILE%\miniconda3\Scripts\activate.bat" + +:: Check if environment already exists +conda env list | findstr /C:"%ENV_NAME%" >nul +if %errorlevel% == 0 ( + echo Environment "%ENV_NAME%" exists. Updating... + call conda env update --name "%ENV_NAME%" --file "%YML_FILE%" --prune +) else ( + echo Creating new environment "%ENV_NAME%"... + call conda env create -f "%YML_FILE%" +) + +:: Activate environment +call conda activate %ENV_NAME% + +:: Ensure activation persists by checking Ruby version +call ruby -v >nul 2>nul +if %errorlevel% neq 0 ( + echo Ruby installation not found in Conda environment. Please check installation. + exit /b 1 +) + +:: Install datafarming gem inside the activated environment +echo Installing Ruby 'datafarming' gem... +call gem install datafarming -v 1.4 + +echo Setup complete! Run: conda activate %ENV_NAME% diff --git a/setup_simopt.sh b/setup_simopt.sh new file mode 100644 index 000000000..6ccdad094 --- /dev/null +++ b/setup_simopt.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +ENV_NAME="simopt" +YML_FILE="environment.yml" + +echo "Checking for Conda installation..." +if ! command -v conda &> /dev/null; then + echo "Conda not found! Please install Miniconda or Anaconda first." + exit 1 +fi + +# Ensure Conda is initialized +source "$(conda info --base)/etc/profile.d/conda.sh" + +# Check if environment exists +if conda env list | grep -q "$ENV_NAME"; then + echo "Environment '$ENV_NAME' exists. Updating..." + conda env update --name "$ENV_NAME" --file "$YML_FILE" --prune +else + echo "Creating new environment '$ENV_NAME'..." + conda env create -f "$YML_FILE" +fi + +# Activate the Conda environment +echo "Activating environment..." +source activate "$ENV_NAME" + +# Ensure activation persists by checking Ruby installation +if ! command -v ruby &> /dev/null; then + echo "Ruby installation not found in Conda environment. Please check installation." + exit 1 +fi + +# Install datafarming gem +echo "Installing Ruby 'datafarming' gem..." +gem install datafarming -v 1.4 + +echo "Setup complete! Run: conda activate $ENV_NAME" diff --git a/simopt/GUI.py b/simopt/GUI.py index 71ee06ea2..aed104a5c 100644 --- a/simopt/GUI.py +++ b/simopt/GUI.py @@ -1,7 +1,11 @@ """GUI for SimOpt Library.""" # noqa: N999 +import logging +import sys import tkinter as tk +from numpy import seterr + from simopt.gui.main_menu import MainMenuWindow @@ -21,6 +25,21 @@ def main() -> None: root.title("SimOpt Library Graphical User Interface") root.pack_propagate(False) + # Parse command line + log_level = logging.INFO + for arg in sys.argv: + if arg == "--debug": + log_level = logging.DEBUG + seterr(all="raise") + break + if arg == "--silent": + log_level = logging.CRITICAL + break + + debug_format = "%(levelname)s: %(message)s" + logging.basicConfig(level=log_level, format=debug_format) + logging.debug("GUI started") + # app = Experiment_Window(root) MainMenuWindow(root) root.mainloop() diff --git a/simopt/base.py b/simopt/base.py index 960dae650..fea471859 100644 --- a/simopt/base.py +++ b/simopt/base.py @@ -9,7 +9,9 @@ from typing import Callable import numpy as np + from mrg32k3a.mrg32k3a import MRG32k3a +from simopt.utils import classproperty def _factor_check(self: Solver | Problem | Model, factor_name: str) -> bool: @@ -22,10 +24,10 @@ def _factor_check(self: Solver | Problem | Model, factor_name: str) -> bool: # If the factor is a boolean, it's fine if self.specifications[factor_name]["datatype"] is bool: return True - else: - # Raise an error since there's an error in the check list - error_msg = f"Missing check for factor {factor_name} of type {self.specifications[factor_name]['datatype']}" - raise ValueError(error_msg) + # Raise an error since there's an error in the check list + datatype = self.specifications[factor_name]["datatype"] + error_msg = f"Missing check for factor {factor_name} of type {datatype}" + raise ValueError(error_msg) # Otherwise, the factor exists in the check list and should be checked # This will raise an error if the factor is not permissible self.check_factor_list[factor_name]() @@ -39,6 +41,11 @@ class ObjectiveType(Enum): SINGLE = 1 MULTI = 2 + def symbol(self) -> str: + """Return the symbol of the objective type.""" + symbol_mapping = {ObjectiveType.SINGLE: "S", ObjectiveType.MULTI: "M"} + return symbol_mapping.get(self, "?") + class ConstraintType(Enum): """Enum class for constraint types.""" @@ -48,6 +55,16 @@ class ConstraintType(Enum): DETERMINISTIC = 3 STOCHASTIC = 4 + def symbol(self) -> str: + """Return the symbol of the constraint type.""" + symbol_mapping = { + ConstraintType.UNCONSTRAINED: "U", + ConstraintType.BOX: "B", + ConstraintType.DETERMINISTIC: "D", + ConstraintType.STOCHASTIC: "S", + } + return symbol_mapping.get(self, "?") + class VariableType(Enum): """Enum class for variable types.""" @@ -56,38 +73,48 @@ class VariableType(Enum): CONTINUOUS = 2 MIXED = 3 + def symbol(self) -> str: + """Return the symbol of the variable type.""" + symbol_mapping = { + VariableType.DISCRETE: "D", + VariableType.CONTINUOUS: "C", + VariableType.MIXED: "M", + } + return symbol_mapping.get(self, "?") + class Solver(ABC): """Base class to implement simulation-optimization solvers. - Attributes - ---------- - name : str - Name of solver. - objective_type : str - Description of objective types: "single" or "multi". - constraint_type : str - Description of constraints types: "unconstrained", "box", "deterministic", "stochastic". - variable_type : str - Description of variable types: "discrete", "continuous", "mixed". - gradient_needed : bool - True if gradient of objective function is needed, otherwise False. - factors : dict[str, int | float | bool] - Changeable factors (i.e., parameters) of the solver. - specifications : dict[str, dict[str, str | type | int | float | bool]] - Details of each factor (for GUI, data validation, and defaults). - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - List of RNGs used for the solver's internal purposes. - solution_progenitor_rngs : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - List of RNGs used as a baseline for simulating solutions. - - Parameters - ---------- - fixed_factors : dict - Dictionary of user-specified solver factors. + This class defines the core structure for simulation-optimization + solvers in SimOpt. Subclasses must implement the required methods + for running simulations and updating solutions. + Args: + name (str): Name of the solver. + fixed_factors (dict): Dictionary of user-specified solver factors. """ + @classproperty + def class_name_abbr(cls) -> str: + """Short name of the solver class.""" + return cls.__name__ + + @classproperty + def class_name(cls) -> str: + """Long name of the solver class.""" + return cls.__name__.replace("_", " ") + + @classproperty + def compatibility(cls) -> str: + """Compatibility of the solver.""" + return ( + f"{cls.objective_type.symbol()}" + f"{cls.constraint_type.symbol()}" + f"{cls.variable_type.symbol()}" + f"{'G' if cls.gradient_needed else 'N'}" + ) + @property def name(self) -> str: """Name of solver.""" @@ -95,29 +122,40 @@ def name(self) -> str: @name.setter def name(self, value: str) -> None: + if len(value) == 0: + raise ValueError("Name must not be empty.") self.__name = value - @property + @classproperty @abstractmethod - def objective_type(self) -> ObjectiveType: - """Description of objective types: "single" or "multi".""" + def objective_type(cls) -> ObjectiveType: + """Description of objective types. + + One of: "single" or "multi". + """ raise NotImplementedError - @property + @classproperty @abstractmethod - def constraint_type(self) -> ConstraintType: - """Description of constraints types: "unconstrained", "box", "deterministic", "stochastic".""" + def constraint_type(cls) -> ConstraintType: + """Description of constraint types. + + One of: "unconstrained", "box", "deterministic", or "stochastic". + """ raise NotImplementedError - @property + @classproperty @abstractmethod - def variable_type(self) -> VariableType: - """Description of variable types: "discrete", "continuous", "mixed".""" + def variable_type(cls) -> VariableType: + """Description of variable types. + + One of: "discrete", "continuous", "mixed". + """ raise NotImplementedError - @property + @classproperty @abstractmethod - def gradient_needed(self) -> bool: + def gradient_needed(cls) -> bool: """True if gradient of objective function is needed, otherwise False.""" raise NotImplementedError @@ -132,10 +170,10 @@ def factors(self, value: dict | None) -> None: value = {} self.__factors = value - @property + @classproperty @abstractmethod def specifications( - self, + cls, ) -> dict[str, dict]: """Details of each factor (for GUI, data validation, and defaults).""" raise NotImplementedError @@ -164,18 +202,14 @@ def check_factor_list(self) -> dict[str, Callable]: """Dictionary of functions to check if a factor is permissible.""" raise NotImplementedError - def __init__( - self, name: str = "", fixed_factors: dict | None = None - ) -> None: + def __init__(self, name: str = "", fixed_factors: dict | None = None) -> None: """Initialize a solver object. - Parameters - ---------- - fixed_factors : dict - Dictionary of user-specified solver factors. - + Args: + name (str, optional): Name of the solver. Defaults to an empty string. + fixed_factors (dict | None, optional): Dictionary of user-specified solver + factors. Defaults to None. """ - assert len(name) > 0, "Name must be specified." self.name = name # Add all the fixed factors to the solver self.factors = fixed_factors @@ -191,16 +225,11 @@ def __init__( def __eq__(self, other: object) -> bool: """Check if two solvers are equivalent. - Parameters - ---------- - other : object - Other object to compare to self. - - Returns - ------- - bool - True if the two objects are equivalent, otherwise False. + Args: + other (object): Other object to compare to self. + Returns: + bool: True if the two objects are equivalent, otherwise False. """ if not isinstance(other, Solver): return False @@ -209,22 +238,17 @@ def __eq__(self, other: object) -> bool: def __hash__(self) -> int: """Return the hash value of the solver. - Returns - ------- - int - Hash value of the solver. - + Returns: + int: Hash value of the solver. """ return hash((self.name, tuple(self.factors.items()))) def attach_rngs(self, rng_list: list[MRG32k3a]) -> None: """Attach a list of random-number generators to the solver. - Parameters - ---------- - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - List of random-number generators used for the solver's internal purposes. - + Args: + rng_list (list[``mrg32k3a.mrg32k3a.MRG32k3a``]): List of random-number + generators used for the solver's internal purposes. """ self.rng_list = rng_list @@ -232,49 +256,34 @@ def attach_rngs(self, rng_list: list[MRG32k3a]) -> None: def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: """Run a single macroreplication of a solver on a problem. - Parameters - ---------- - problem : ``base.Problem`` - Simulation-optimization problem to solve. - - Returns - ------- - list [``Solution``] - List of solutions recommended throughout the budget. - list [int] - List of intermediate budgets when recommended solutions changes. + Args: + problem (Problem): Simulation-optimization problem to solve. + Returns: + tuple: + - list [Solution]: List of solutions recommended throughout the budget. + - list [int]: List of intermediate budgets when recommended solutions + change. """ raise NotImplementedError def check_crn_across_solns(self) -> bool: """Check solver factor crn_across_solns. - Notes - ----- - Currently implemented to always return True. - - Returns - ------- - bool - True if the solver factor is permissible, otherwise False. - + Returns: + bool: True if the solver factor is permissible, otherwise False. """ + # NOTE: Currently implemented to always return True return True def check_solver_factor(self, factor_name: str) -> bool: """Determine if the setting of a solver factor is permissible. - Parameters - ---------- - factor_name : str - Name of factor for dictionary lookup (i.e., key). - - Returns - ------- - bool - True if the solver factor is permissible, otherwise False. + Args: + factor_name (str): Name of factor for dictionary lookup (i.e., key). + Returns: + bool: True if the solver factor is permissible, otherwise False. """ return _factor_check(self, factor_name) @@ -283,28 +292,19 @@ def check_solver_factor(self, factor_name: str) -> bool: def check_solver_factors(self) -> bool: """Determine if the joint settings of solver factors are permissible. - Returns - ------- - is_simulatable : bool - True if the solver factors are permissible, otherwise False. - + Returns: + bool: True if the solver factors are permissible, otherwise False. """ return True - raise NotImplementedError def check_factor_datatype(self, factor_name: str) -> bool: """Determine if a factor's data type matches its specification. - Parameters - ---------- - factor_name : str - String corresponding to name of factor to check. - - Returns - ------- - bool - True if factor is of specified data type, otherwise False. + Args: + factor_name (str): The name of the factor to check. + Returns: + bool: True if factor is of specified data type, otherwise False. """ expected_data_type = self.specifications[factor_name]["datatype"] return isinstance(self.factors[factor_name], expected_data_type) @@ -312,32 +312,27 @@ def check_factor_datatype(self, factor_name: str) -> bool: def run_all_checks(self, factor_names: list[str]) -> bool: """Run all checks for the solver factors. - Parameters - ---------- - factor_names : list - list of str names of factors to check. - - Returns - ------- - bool - defines if all checks came back as true. + Args: + factor_names (list[str]): A list of factor names to check. + Returns: + bool: True if all checks are passed, otherwise False. """ is_joint_factors = ( self.check_solver_factors() ) # check all joint factor settings if not is_joint_factors: - error_msg = "There is a joint setting of a solver factor that is not permissible" + error_msg = ( + "There is a joint setting of a solver factor that is not permissible" + ) raise ValueError(error_msg) # check datatypes for all factors for factor in factor_names: is_right_type = self.check_factor_datatype(factor) if not is_right_type: - error_msg = ( - f"Solver factor {factor} is not the correct data type." - ) + error_msg = f"Solver factor {factor} is not the correct data type." raise ValueError(error_msg) is_permissible = self.check_solver_factor(factor) @@ -349,29 +344,22 @@ def run_all_checks(self, factor_names: list[str]) -> bool: return True def create_new_solution(self, x: tuple, problem: Problem) -> Solution: - """Create a new solution object with attached RNGs primed to simulate replications. - - Parameters - ---------- - x : tuple - Vector of decision variables. - problem : ``base.Problem`` - Problem being solved by the solvers. + """Create a new solution object with attached RNGs. - Returns - ------- - ``base.Solution`` - New solution. + Args: + x (tuple): A vector of decision variables. + problem (Problem): The problem instance associated with the solution. + Returns: + Solution: New solution object for the given decision variables and problem. """ # Create new solution with attached rngs. new_solution = Solution(x, problem) - new_solution.attach_rngs( - rng_list=self.solution_progenitor_rngs, copy=True - ) + new_solution.attach_rngs(rng_list=self.solution_progenitor_rngs, copy=True) # Manipulate progenitor rngs to prepare for next new solution. if not self.factors["crn_across_solns"]: # If CRN are not used ... - # ...advance each rng to start of the substream = current substream + # of model RNGs. + # ...advance each rng to start of the substream + # substream = current substream + # of model RNGs. for rng in self.solution_progenitor_rngs: for _ in range(problem.model.n_rngs): rng.advance_substream() @@ -380,11 +368,8 @@ def create_new_solution(self, x: tuple, problem: Problem) -> Solution: def rebase(self, n_reps: int) -> None: """Rebase the progenitor rngs to start at a later subsubstream index. - Parameters - ---------- - n_reps : int - Substream index to skip to. - + Args: + n_reps (int): Substream index to skip to. """ new_rngs = [] for rng in self.solution_progenitor_rngs: @@ -395,115 +380,37 @@ def rebase(self, n_reps: int) -> None: ) self.solution_progenitor_rngs = new_rngs - def get_extended_name(self) -> str: - """Get the extended name of the solver. - - Returns - ------- - str - Extended name of the solver. - - """ - # Single (S) - # Multiple (M) - objective = "" - # Unconstrained (U) - # Box (B) - # Deterministic (D) - # Stochastic (S) - constraint = "" - # Discrete (D) - # Continuous (C) - # Mixed (M) - variable = "" - # Available (G) - # Not Available (N) - direct_gradient_observations = "" - # Set the string values - if self.objective_type == "single": - objective = "S" - elif self.objective_type == "multi": - objective = "M" - if self.constraint_type == "unconstrained": - constraint = "U" - elif self.constraint_type == "box": - constraint = "B" - elif self.constraint_type == "deterministic": - constraint = "D" - elif self.constraint_type == "stochastic": - constraint = "S" - if self.variable_type == "discrete": - variable = "D" - elif self.variable_type == "continuous": - variable = "C" - elif self.variable_type == "mixed": - variable = "M" - if self.gradient_needed: - direct_gradient_observations = "G" - else: - direct_gradient_observations = "N" - - return f"{self.name} ({objective}{constraint}{variable}{direct_gradient_observations})" - class Problem(ABC): - """Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : str - Name of problem. - dim : int - Number of decision variables. - n_objectives : int - Number of objectives. - n_stochastic_constraints : int - Number of stochastic constraints. - minmax : tuple [int] - Indicators of maximization (+1) or minimization (-1) for each objective. - constraint_type : str - Description of constraints types: "unconstrained", "box", "deterministic", "stochastic". - variable_type : str - Description of variable types: "discrete", "continuous", "mixed". - lower_bounds : tuple - Lower bound for each decision variable. - upper_bounds : tuple - Upper bound for each decision variable. - gradient_available : bool - True if direct gradient of objective function is available, otherwise False. - optimal_value : float - Optimal objective function value. - optimal_solution : tuple - Optimal solution. - model : ``base.Model`` - Associated simulation model that generates replications. - model_default_factors : dict - Default values for overriding model-level default factors. - model_fixed_factors : dict - Combination of overriden model-level factors and defaults. - model_decision_factors : set [str] - Set of keys for factors that are decision variables. - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - List of RNGs used to generate a random initial solution - or a random problem instance. - factors : dict - Changeable factors of the problem: - initial_solution : tuple - Default initial solution from which solvers start. - budget : int - Max number of replications (fn evals) for a solver to take. - specifications : dict - Details of each factor (for GUI, data validation, and defaults). - - Parameters - ---------- - fixed_factors : dict - Dictionary of user-specified problem factors. - model_fixed_factors : dict - Subset of user-specified non-decision factors to pass through to the model. + """Base class for simulation-optimization problems. + Args: + name (str): Problem name. + fixed_factors (dict): User-defined factors that affect the problem setup. + model_fixed_factors (dict): Subset of non-decision factors passed to the model. + model (Callable[..., Model]): Simulation model that generates replications. """ + @classproperty + def class_name_abbr(cls) -> str: + """Short name of the solver class.""" + return cls.__name__ + + @classproperty + def class_name(cls) -> str: + """Long name of the solver class.""" + return cls.__name__.replace("_", " ") + + @classproperty + def compatibility(cls) -> str: + """Compatibility of the solver.""" + return ( + "S" + f"{cls.constraint_type.symbol()}" + f"{cls.variable_type.symbol()}" + f"{'G' if cls.gradient_available else 'N'}" + ) + @property def name(self) -> str: """Name of the problem.""" @@ -511,71 +418,79 @@ def name(self) -> str: @name.setter def name(self, value: str) -> None: + if len(value) == 0: + raise ValueError("Name must not be empty.") self.__name = value - @property + @classproperty @abstractmethod - def dim(self) -> int: + def dim(cls) -> int: """Number of decision variables.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def n_objectives(self) -> int: + def n_objectives(cls) -> int: """Number of objectives.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def n_stochastic_constraints(self) -> int: + def n_stochastic_constraints(cls) -> int: """Number of stochastic constraints.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def minmax(self) -> tuple[int]: + def minmax(cls) -> tuple[int]: """Indicators of maximization (+1) or minimization (-1) for each objective.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def constraint_type(self) -> ConstraintType: - """Description of constraints types: "unconstrained", "box", "deterministic", "stochastic".""" + def constraint_type(cls) -> ConstraintType: + """Description of constraints types. + + One of: "unconstrained", "box", "deterministic", "stochastic". + """ raise NotImplementedError - @property + @classproperty @abstractmethod - def variable_type(self) -> VariableType: - """Description of variable types: "discrete", "continuous", "mixed".""" + def variable_type(cls) -> VariableType: + """Description of variable types. + + One of: "discrete", "continuous", "mixed". + """ raise NotImplementedError - @property + @classproperty @abstractmethod - def lower_bounds(self) -> tuple: + def lower_bounds(cls) -> tuple: """Lower bound for each decision variable.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def upper_bounds(self) -> tuple: + def upper_bounds(cls) -> tuple: """Upper bound for each decision variable.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def gradient_available(self) -> bool: - """True if direct gradient of objective function is available, otherwise False.""" + def gradient_available(cls) -> bool: + """Indicates whether the solver provides direct gradient information.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def optimal_value(self) -> float | None: + def optimal_value(cls) -> float | None: """Optimal objective function value.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def optimal_solution(self) -> tuple | None: + def optimal_solution(cls) -> tuple | None: """Optimal solution.""" raise NotImplementedError @@ -588,9 +503,9 @@ def model(self) -> Model: def model(self, value: Model) -> None: self.__model = value - @property + @classproperty @abstractmethod - def model_default_factors(self) -> dict: + def model_default_factors(cls) -> dict: """Default values for overriding model-level default factors.""" raise NotImplementedError @@ -605,15 +520,15 @@ def model_fixed_factors(self, value: dict | None) -> None: value = {} self.__model_fixed_factors = value - @property + @classproperty @abstractmethod - def model_decision_factors(self) -> set[str]: + def model_decision_factors(cls) -> set[str]: """Set of keys for factors that are decision variables.""" raise NotImplementedError @property def rng_list(self) -> list[MRG32k3a]: - """List of RNGs used to generate a random initial solution or a random problem instance.""" + """List of RNGs used to generate a random initial solution/problem instance.""" return self.__rng_list @rng_list.setter @@ -631,9 +546,9 @@ def factors(self, value: dict | None) -> None: value = {} self.__factors = value - @property + @classproperty @abstractmethod - def specifications(self) -> dict: + def specifications(cls) -> dict: """Details of each factor (for GUI, data validation, and defaults).""" raise NotImplementedError @@ -652,17 +567,16 @@ def __init__( ) -> None: """Initialize a problem object. - Parameters - ---------- - fixed_factors : dict - Dictionary of user-specified problem factors. - model_fixed_factors : dict - Subset of user-specified non-decision factors to pass through to the model. - + Args: + name (str): Name of the problem. + fixed_factors (dict | None): Dictionary of user-specified problem factors. + model_fixed_factors (dict | None): Subset of user-specified non-decision + factors passed to the model. + model (Callable[..., Model] | None): Simulation model that generates + replications. """ - assert len(name) > 0, "Name must be specified." - assert model is not None, "Model must be specified." - + if model is None: + raise ValueError("Model must be specified.") # Assign the name of the problem self.name = name @@ -680,9 +594,7 @@ def __init__( present_model_factors = set(self.model_fixed_factors.keys()) missing_model_factors = all_model_factors - present_model_factors for factor in missing_model_factors: - self.model_fixed_factors[factor] = self.model_default_factors[ - factor - ] + self.model_fixed_factors[factor] = self.model_default_factors[factor] # Set the model self.model = model(self.model_fixed_factors) @@ -693,16 +605,11 @@ def __init__( def __eq__(self, other: object) -> bool: """Check if two problems are equivalent. - Parameters - ---------- - other : object - Other ``base.Problem`` objects to compare to self. - - Returns - ------- - bool - True if the two problems are equivalent, otherwise False. + Args: + other (object): Other object to compare to self. + Returns: + bool: True if the two problems are equivalent, otherwise False. """ if not isinstance(other, Problem): return False @@ -715,17 +622,13 @@ def __eq__(self, other: object) -> bool: if self.model.factors[factor] != other.model.factors[factor]: return False return True - else: - return False + return False def __hash__(self) -> int: """Return the hash value of the solver. - Returns - ------- - int - Hash value of the solver. - + Returns: + int: Hash value of the solver. """ non_decision_factors = ( set(self.model.factors.keys()) - self.model_decision_factors @@ -734,56 +637,35 @@ def __hash__(self) -> int: ( self.name, tuple(self.factors.items()), - tuple( - [ - (key, self.model.factors[key]) - for key in non_decision_factors - ] - ), + tuple([(key, self.model.factors[key]) for key in non_decision_factors]), ) ) def check_initial_solution(self) -> bool: """Check if initial solution is feasible and of correct dimension. - Returns - ------- - bool - True if initial solution is feasible and of correct dimension, otherwise False. - + Returns: + bool: True if initial solution is feasible and of correct dimension; + False otherwise. """ - # return len( - # self.factors["initial_solution"] - # ) == self.dim and self.check_deterministic_constraints( - # decision_variables=self.factors["initial_solution"] - # ) return True def check_budget(self) -> bool: """Check if budget is strictly positive. - Returns - ------- - bool - True if budget is strictly positive, otherwise False. - + Returns: + bool: True if budget is strictly positive, otherwise False. """ - is_positive = self.factors["budget"] > 0 - return is_positive + return self.factors["budget"] > 0 def check_problem_factor(self, factor_name: str) -> bool: """Determine if the setting of a problem factor is permissible. - Parameters - ---------- - factor_name : str - Name of factor for dictionary lookup (i.e., key). - - Returns - ------- - is_permissible : bool - True if problem factor is permissible, otherwise False. + Args: + factor_name (str): The name of the factor to check + Returns: + bool: True if the factor setting is permissible; False otherwise. """ return _factor_check(self, factor_name) @@ -794,28 +676,19 @@ def check_problem_factor(self, factor_name: str) -> bool: def check_problem_factors(self) -> bool: """Determine if the joint settings of problem factors are permissible. - Returns - ------- - is_simulatable : bool - True if problem factors are permissible, otherwise False. - + Returns: + bool: True if problem factors are permissible; False otherwise. """ return True - raise NotImplementedError def check_factor_datatype(self, factor_name: str) -> bool: """Determine if a factor's data type matches its specification. - Parameters - ---------- - factor_name : str - String corresponding to name of factor to check. - - Returns - ------- - is_right_type : bool - True if factor is of specified data type, otherwise False. + Args: + factor_name (str): The name of the factor to check. + Returns: + bool: True if factor is of specified data type, otherwise False. """ return isinstance( self.factors[factor_name], @@ -825,35 +698,31 @@ def check_factor_datatype(self, factor_name: str) -> bool: def run_all_checks(self, factor_names: list[str]) -> bool: """Run all checks for the problem factors. - Parameters - ---------- - factor_names : list[str] - list of str names of factors to check. - - Returns - ------- - bool - defines if all checks came back as true. + Args: + factor_names (list[str]): A list of factor names to check. + Returns: + bool: True if all checks are passed, otherwise False. """ is_joint_factors = ( self.check_problem_factors() ) # check all joint factor settings if not is_joint_factors: - error_msg = "There is a joint setting of a problem factor that is not permissible" + error_msg = ( + "There is a joint setting of a problem factor that is not permissible" + ) raise ValueError(error_msg) is_initial_sol = self.check_initial_solution() if not is_initial_sol: - error_msg = "The initial solution is not feasible and/or not correct dimension" + error_msg = ( + "The initial solution is not feasible and/or not correct dimension" + ) raise ValueError(error_msg) # TODO: investigate why this is not working # is_budget = self.check_budget() - if ( - isinstance(self.factors["budget"], int) - and self.factors["budget"] <= 0 - ): + if isinstance(self.factors["budget"], int) and self.factors["budget"] <= 0: error_msg = "The budget is not positive." raise ValueError(error_msg) @@ -863,9 +732,7 @@ def run_all_checks(self, factor_names: list[str]) -> bool: is_right_type = self.check_factor_datatype(factor) if not is_right_type: - error_msg = ( - f"Problem factor {factor} is not a permissible data type." - ) + error_msg = f"Problem factor {factor} is not a permissible data type." raise ValueError(error_msg) if not is_permissible: @@ -877,12 +744,10 @@ def run_all_checks(self, factor_names: list[str]) -> bool: def attach_rngs(self, rng_list: list[MRG32k3a]) -> None: """Attach a list of random-number generators to the problem. - Parameters - ---------- - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - List of random-number generators used to generate a random initial solution - or a random problem instance. - + Args: + rng_list (list[``mrg32k3a.mrg32k3a.MRG32k3a``]): List of random-number + generators used to generate a random initial solution or a random + problem instance. """ self.rng_list = rng_list @@ -890,16 +755,11 @@ def attach_rngs(self, rng_list: list[MRG32k3a]) -> None: def vector_to_factor_dict(self, vector: tuple) -> dict: """Convert a vector of variables to a dictionary with factor keys. - Parameters - ---------- - vector : tuple - Vector of values associated with decision variables. - - Returns - ------- - dict - Dictionary with factor keys and associated values. + Args: + vector (tuple): A vector of values associated with decision variables. + Returns: + dict: Dictionary with factor keys and associated values. """ raise NotImplementedError @@ -907,36 +767,25 @@ def vector_to_factor_dict(self, vector: tuple) -> dict: def factor_dict_to_vector(self, factor_dict: dict) -> tuple: """Convert a dictionary with factor keys to a vector of variables. - Parameters - ---------- - factor_dict : dict - Dictionary with factor keys and associated values. - - Returns - ------- - tuple - Vector of values associated with decision variables. + Args: + factor_dict (dict): Dictionary with factor keys and associated values. + Returns: + tuple: Vector of values associated with decision variables. """ raise NotImplementedError def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: """Convert a dictionary with factor keys to a gradient vector. - Notes - ----- - A subclass of ``base.Problem`` can have its own custom ``factor_dict_to_vector_gradients`` method if the objective is deterministic. + A subclass of ``base.Problem`` can have its own custom + ``factor_dict_to_vector_gradients`` method if the objective is deterministic. - Parameters - ---------- - factor_dict : dict - Dictionary with factor keys and associated values. - - Returns - ------- - tuple - Vector of partial derivatives associated with decision variables. + Args: + factor_dict (dict): A dictionary with factor keys and associated values. + Returns: + tuple: Vector of partial derivatives associated with decision variables. """ return self.factor_dict_to_vector(factor_dict) @@ -944,75 +793,55 @@ def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: def response_dict_to_objectives(self, response_dict: dict) -> tuple: """Convert a dictionary with response keys to a vector of objectives. - Parameters - ---------- - response_dict : dict - Dictionary with response keys and associated values. - - Returns - ------- - tuple - Vector of objectives. + Args: + response_dict (dict): A dictionary containing response keys and their + associated values. + Returns: + tuple: Vector of objectives. """ raise NotImplementedError - def response_dict_to_objectives_gradients( - self, response_dict: dict - ) -> tuple: + def response_dict_to_objectives_gradients(self, _response_dict: dict) -> tuple: """Convert a dictionary with response keys to a vector of gradients. - Notes - ----- Can be overridden by subclasses if the objective is deterministic. - Parameters - ---------- - response_dict : dict - Dictionary with response keys and associated values. - - Returns - ------- - tuple - Vector of gradients. + Args: + response_dict (dict): A dictionary containing response keys and their + associated values. + Returns: + tuple: Vector of gradients. """ - return self.response_dict_to_objectives(response_dict) + return self.response_dict_to_objectives(_response_dict) - @abstractmethod - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """Convert a dictionary with response keys to a vector of left-hand sides of stochastic constraints: E[Y] <= 0. + def response_dict_to_stoch_constraints(self, _response_dict: dict) -> tuple: + """Convert a response dictionary to a vector of stochastic constraint values. - Parameters - ---------- - response_dict : dict - Dictionary with response keys and associated values. + Each returned value represents the left-hand side of a constraint of the form + E[Y] ≤ 0. - Returns - ------- - tuple - Vector of LHSs of stochastic constraints. + Args: + response_dict (dict): A dictionary containing response keys and their + associated values. + Returns: + tuple: A tuple representing the left-hand sides of the stochastic + constraints. """ - raise NotImplementedError + return () - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: """Compute deterministic components of objectives for a solution `x`. - Parameters - ---------- - x : tuple - Vector of decision variables. - - Returns - ------- - det_objectives : tuple - Vector of deterministic components of objectives. - det_objectives_gradients : tuple - Vector of gradients of deterministic components of objectives. + Args: + x (tuple): A vector of decision variables. + Returns: + tuple: + - tuple: The deterministic components of the objective values. + - tuple: The gradients of those deterministic components. """ det_objectives = (0,) * self.n_objectives det_objectives_gradients = tuple( @@ -1020,23 +849,13 @@ def deterministic_objectives_and_gradients( ) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """Compute deterministic components of stochastic constraints for a solution `x`. - - Parameters - ---------- - x : tuple - Vector of decision variables. - - Returns - ------- - det_stoch_constraints : tuple - Vector of deterministic components of stochastic constraints. - det_stoch_constraints_gradients : tuple - Vector of gradients of deterministic components of stochastic constraints. + def deterministic_stochastic_constraints_and_gradients(self) -> tuple[tuple, tuple]: + """Compute deterministic components of stochastic constraints. + Returns: + tuple: + - tuple: The deterministic components of the stochastic constraints. + - tuple: The gradients of those deterministic components. """ det_stoch_constraints = (0,) * self.n_stochastic_constraints det_stoch_constraints_gradients = tuple( @@ -1044,74 +863,52 @@ def deterministic_stochastic_constraints_and_gradients( ) return det_stoch_constraints, det_stoch_constraints_gradients - def check_deterministic_constraints(self, x: tuple) -> bool: + def check_deterministic_constraints(self, _x: tuple) -> bool: """Check if a solution `x` satisfies the problem's deterministic constraints. - Parameters - ---------- - x : tuple - Vector of decision variables. - - Returns - ------- - bool - True if solution `x` satisfies the deterministic constraints, otherwise False. + Args: + x (tuple): A vector of decision variables. + Returns: + bool: True if the solution satisfies all deterministic constraints; + False otherwise. """ # Check box constraints. - return bool( - np.prod( - [ - self.lower_bounds[idx] <= x[idx] <= self.upper_bounds[idx] - for idx in range(len(x)) - ] - ) + return all( + lb <= x_i <= ub + for x_i, lb, ub in zip(_x, self.lower_bounds, self.upper_bounds) ) @abstractmethod def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: """Generate a random solution for starting or restarting solvers. - Parameters - ---------- - rand_sol_rng : ``mrg32k3a.mrg32k3a.MRG32k3a`` - Random-number generator used to sample a new random solution. - - Returns - ------- - tuple - vector of decision variables + Args: + rand_sol_rng (MRG32k3a): Random number generator used to sample the + solution. + Returns: + tuple: A tuple representing a randomly generated vector of decision + variables. """ raise NotImplementedError def simulate(self, solution: Solution, num_macroreps: int = 1) -> None: """Simulate `m` i.i.d. replications at solution `x`. - Notes - ----- - Gradients of objective function and stochastic constraint LHSs are temporarily commented out. Under development. - - Parameters - ---------- - solution : ``base.Solution`` - Solution to evalaute. - num_macroreps : int, default=1 - Number of replications to simulate at `x`. - + Args: + solution (Solution): Solution to evaluate. + num_macroreps (int, optional): Number of macroreplications to simulate at + `x`. Defaults to 1. """ - # Type checking - if not isinstance(solution, Solution): - error_msg = "Input solution must be of type Solution." - raise TypeError(error_msg) - if not isinstance(num_macroreps, int): - error_msg = "Number of replications must be an integer." - raise TypeError(error_msg) + # NOTE: + # Gradients of objective function and stochastic constraint LHSs are temporarily + # commented out. Under development. + # Value checking if num_macroreps <= 0: error_msg = "Number of replications must be at least 1." raise ValueError(error_msg) - # Pad numpy arrays if necessary. if solution.n_reps + num_macroreps > solution.storage_size: solution.pad_storage(num_macroreps) @@ -1127,7 +924,10 @@ def simulate(self, solution: Solution, num_macroreps: int = 1) -> None: keys: self.factor_dict_to_vector_gradients(gradient_dict) for (keys, gradient_dict) in gradients.items() } - # vector_gradients = {keys: self.factor_dict_to_vector(gradient_dict) for (keys, gradient_dict) in gradients.items()} + # vector_gradients = { + # keys: self.factor_dict_to_vector(gradient_dict) + # for (keys, gradient_dict) in gradients.items() + # } # Convert responses and gradients to objectives and gradients and add # to those of deterministic components of objectives. solution.objectives[solution.n_reps] = [ @@ -1138,28 +938,27 @@ def simulate(self, solution: Solution, num_macroreps: int = 1) -> None: ) ] if self.gradient_available: - # print(self.response_dict_to_objectives_gradients(vector_gradients)) - # print(solution.det_objectives_gradients) - # TODO: Ensure that this never happens - if "vector_gradients" not in locals(): - raise ValueError("vector_gradients not defined") - else: - solution.objectives_gradients[solution.n_reps] = [ - [sum(pairs) for pairs in zip(stoch_obj, det_obj)] - for stoch_obj, det_obj in zip( - self.response_dict_to_objectives_gradients( - vector_gradients - ), - solution.det_objectives_gradients, - ) - ] - # solution.objectives_gradients[solution.n_reps] = [[sum(pairs) for pairs in zip(stoch_obj, det_obj)] for stoch_obj, det_obj in zip(self.response_dict_to_objectives(vector_gradients), solution.det_objectives_gradients)] + solution.objectives_gradients[solution.n_reps] = [ + [sum(pairs) for pairs in zip(stoch_obj, det_obj)] + for stoch_obj, det_obj in zip( + self.response_dict_to_objectives_gradients(vector_gradients), + solution.det_objectives_gradients, + ) + ] + # solution.objectives_gradients[solution.n_reps] = [ + # [sum(pairs) for pairs in zip(stoch_obj, det_obj)] + # for stoch_obj, det_obj in zip( + # self.response_dict_to_objectives(vector_gradients), + # solution.det_objectives_gradients, + # ) + # ] if ( self.n_stochastic_constraints > 0 and solution.stoch_constraints is not None ): - # Convert responses and gradients to stochastic constraints and gradients and add - # to those of deterministic components of stochastic constraints. + # Convert responses and gradients to stochastic constraints and + # gradients and addto those of deterministic components of stochastic + # constraints. solution.stoch_constraints[solution.n_reps] = [ sum(pairs) for pairs in zip( @@ -1167,25 +966,30 @@ def simulate(self, solution: Solution, num_macroreps: int = 1) -> None: solution.det_stoch_constraints, ) ] - # solution.stoch_constraints_gradients[solution.n_reps] = [[sum(pairs) for pairs in zip(stoch_stoch_cons, det_stoch_cons)] for stoch_stoch_cons, det_stoch_cons in zip(self.response_dict_to_stoch_constraints(vector_gradients), solution.det_stoch_constraints_gradients)] + # solution.stoch_constraints_gradients[solution.n_reps] = [ + # [sum(pairs) for pairs in zip(stoch_stoch_cons, det_stoch_cons)] + # for stoch_stoch_cons, det_stoch_cons in zip( + # self.response_dict_to_stoch_constraints(vector_gradients), + # solution.det_stoch_constraints_gradients, + # ) + # ] # Increment counter. solution.n_reps += 1 # Advance rngs to start of next subsubstream. for rng in solution.rng_list: rng.advance_subsubstream() - # Update summary statistics. - solution.recompute_summary_statistics() def simulate_up_to(self, solutions: list[Solution], n_reps: int) -> None: """Simulate a list of solutions up to a given number of replications. - Parameters - ---------- - solutions : list [``base.Solution``] - A list of ``base.Solution`` objects. - n_reps : int - Common number of replications to simulate each solution up to. + Args: + solutions (list[Solution]): List of Solution objects to simulate. + n_reps (int): Common number of replications to simulate each solution up to. + Raises: + TypeError: If `solutions` is not a list of Solution objects or if `n_reps` + is not an integer. + ValueError: If `n_reps` is less than or equal to 0. """ # Type checking if not isinstance(solutions, list) or not all( @@ -1209,51 +1013,44 @@ def simulate_up_to(self, solutions: list[Solution], n_reps: int) -> None: class Model(ABC): - """Base class to implement simulation models (models) featured in simulation-optimization problems. - - Attributes - ---------- - name : str - Name of model. - n_rngs : int - Number of random-number generators used to run a simulation replication. - n_responses : int - Number of responses (performance measures). - factors : dict - Changeable factors of the simulation model. - specifications : dict - Details of each factor (for GUI, data validation, and defaults). - check_factor_list : dict - Switch case for checking factor simulatability. - - Parameters - ---------- - fixed_factors : dict - Dictionary of user-specified model factors. + """Base class for simulation models used in simulation-optimization problems. + Each model defines the simulation logic behind a given problem instance. """ - @property - @abstractmethod - def name(self) -> str: + @classproperty + def class_name_abbr(cls) -> str: + """Short name of the model class.""" + return cls.__name__.capitalize() + + @classproperty + def class_name(cls) -> str: + """Long name of the model class.""" + # Insert spaces before capital letters + import re + + return re.sub(r"(? str: """Name of model.""" - raise NotImplementedError + return cls.__name__.replace("_", " ") - @property + @classproperty @abstractmethod - def n_rngs(self) -> int: + def n_rngs(cls) -> int: """Number of random-number generators used to run a simulation replication.""" raise NotImplementedError - @property + @classproperty @abstractmethod - def n_responses(self) -> int: + def n_responses(cls) -> int: """Number of responses (performance measures).""" raise NotImplementedError - @property + @classproperty @abstractmethod - def specifications(self) -> dict[str, dict]: + def specifications(cls) -> dict[str, dict]: """Details of each factor (for GUI, data validation, and defaults).""" raise NotImplementedError @@ -1277,11 +1074,9 @@ def factors(self, value: dict | None) -> None: def __init__(self, fixed_factors: dict | None = None) -> None: """Initialize a model object. - Parameters - ---------- - fixed_factors : dict - Dictionary of user-specified model factors. - + Args: + fixed_factors (dict | None, optional): Dictionary of user-specified model + factors. """ # Add all the fixed factors to the model self.factors = fixed_factors @@ -1297,16 +1092,11 @@ def __init__(self, fixed_factors: dict | None = None) -> None: def __eq__(self, other: object) -> bool: """Check if two models are equivalent. - Parameters - ---------- - other : object - Other object to compare to self. - - Returns - ------- - bool - True if the two models are equivalent, otherwise False. + Args: + other (object): Other object to compare to self. + Returns: + bool: True if the two models are equivalent, otherwise False. """ if not isinstance(other, Model): return False @@ -1315,95 +1105,76 @@ def __eq__(self, other: object) -> bool: def __hash__(self) -> int: """Return the hash value of the model. - Returns - ------- - int - Hash value of the model. - + Returns: + int: Hash value of the model. """ return hash((self.name, tuple(self.factors.items()))) def check_simulatable_factor(self, factor_name: str) -> bool: """Determine if a simulation replication can be run with the given factor. - Parameters - ---------- - factor_name : str - Name of factor for dictionary lookup (i.e., key). - - Returns - ------- - bool - True if model specified by factors is simulatable, otherwise False. + Args: + factor_name (str): Name of factor for dictionary lookup (i.e., key). + Returns: + bool: True if the model specified by factors is simulatable; + False otherwise. """ return _factor_check(self, factor_name) def check_simulatable_factors(self) -> bool: - """Determine if a simulation replication can be run with the given factors. + """Determine whether a simulation can be run with the current factor settings. - Notes - ----- - Each subclass of ``base.Model`` has its own custom ``check_simulatable_factors`` method. - If the model does not override this method, it will return True. - - Returns - ------- - bool - True if model specified by factors is simulatable, otherwise False. + Each subclass of `Model` can override this method to implement custom logic. + If not overridden, this base implementation returns True. + Returns: + bool: True if the model configuration is considered simulatable; + False otherwise. """ return True def check_factor_datatype(self, factor_name: str) -> bool: """Determine if a factor's data type matches its specification. - Parameters - ---------- - factor_name : str - String corresponding to name of factor to check. - - Returns - ------- - bool - True if factor is of specified data type, otherwise False. + Args: + factor_name (str): The name of the factor to check. + Returns: + bool: True if factor is of specified data type, otherwise False. """ datatype = self.specifications[factor_name]["datatype"] if datatype is float: datatype = (int, float) - is_right_type = isinstance(self.factors[factor_name], datatype) - return is_right_type + return isinstance(self.factors[factor_name], datatype) def run_all_checks(self, factor_names: list[str]) -> bool: """Run all checks for the model factors. - Parameters - ---------- - factor_names : list - list of str names of factors to check. + Args: + factor_names (list[str]): A list of factor names to check. - Returns - ------- - check_all : bool - defines if all checks came back as true. + Returns: + bool: True if all checks are passed, otherwise False. + Raises: + ValueError: If any of the checks fail. """ is_joint_factors = ( self.check_simulatable_factors() ) # check all joint factor settings if not is_joint_factors: - error_msg = "There is a joint setting of a model factor that is not permissible" + error_msg = ( + "There is a joint setting of a model factor that is not permissible" + ) raise ValueError(error_msg) # check datatypes for all factors for factor in factor_names: is_right_type = self.check_factor_datatype(factor) if not is_right_type: - error_msg = ( - f"Model factor {factor} is not a permissible data type." - ) + error_msg = f"Model factor {factor} is not a permissible data type." raise ValueError(error_msg) is_permissible = self.check_simulatable_factor(factor) @@ -1417,69 +1188,23 @@ def run_all_checks(self, factor_names: list[str]) -> bool: def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: """Simulate a single replication for the current model factors. - Parameters - ---------- - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - RNGs for model to use when simulating a replication. - - Returns - ------- - responses : dict - Performance measures of interest. - gradients : dict [dict] - Gradient estimate for each response. + Args: + rng_list (list[``mrg32k3a.mrg32k3a.MRG32k3a``]): List of random-number + generators used to generate a random replication. + Returns: + tuple: + - dict: Performance measures of interest. + - dict: Gradient estimates for each response. """ raise NotImplementedError class Solution: - """Base class for solutions represented as vectors of decision variables and dictionaries of decision factors. - - Attributes - ---------- - x : tuple - Vector of decision variables. - dim : int - Number of decision variables describing `x`. - decision_factors : dict - Decision factor names and values. - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - RNGs for model to use when running replications at the solution. - n_reps : int - Number of replications run at the solution. - det_objectives : tuple - Deterministic components added to objectives. - det_objectives_gradients : tuple [tuple] - Gradients of deterministic components added to objectives; - # objectives x dimension. - det_stoch_constraints : tuple - Deterministic components added to LHS of stochastic constraints. - det_stoch_constraints_gradients : tuple [tuple] - Gradients of deterministics components added to LHS stochastic constraints; - # stochastic constraints x dimension. - storage_size : int - Max number of replications that can be recorded in current storage. - objectives : numpy array - Objective(s) estimates from each replication; - # replications x # objectives. - objectives_gradients : numpy array - Gradient estimates of objective(s) from each replication; - # replications x # objectives x dimension. - stochastic_constraints : numpy array - Stochastic constraint estimates from each replication; - # replications x # stochastic constraints. - stochastic_constraints_gradients : numpy array - Gradient estimates of stochastic constraints from each replication; - # replications x # stochastic constraints x dimension. - - Parameters - ---------- - x : tuple - Vector of decision variables. - problem : ``base.Problem`` - Problem to which `x` is a solution. + """Base class for solutions in simulation-optimization problems. + Solutions are represented by a vector of decision variables and a dictionary of + associated decision factors. """ @property @@ -1490,11 +1215,12 @@ def x(self) -> tuple: @x.setter def x(self, value: tuple) -> None: self.__x = value + self.__dim = len(value) @property def dim(self) -> int: """Number of decision variables describing `x`.""" - return len(self.__x) + return self.__dim @property def decision_factors(self) -> dict: @@ -1534,7 +1260,10 @@ def det_objectives(self, value: tuple) -> None: @property def det_objectives_gradients(self) -> tuple[tuple]: - """Gradients of deterministic components added to objectives; # objectives x dimension.""" + """Gradients of deterministic components added to objectives. + + # objectives x dimension. + """ return self.__det_objectives_gradients @det_objectives_gradients.setter @@ -1552,7 +1281,10 @@ def det_stoch_constraints(self, value: tuple) -> None: @property def det_stoch_constraints_gradients(self) -> tuple[tuple]: - """Gradients of deterministic components added to LHS stochastic constraints; # stochastic constraints x dimension.""" + """Gradients of deterministic components added to LHS stochastic constraints. + + # stochastic constraints x dimension. + """ return self.__det_stoch_constraints_gradients @det_stoch_constraints_gradients.setter @@ -1570,7 +1302,10 @@ def storage_size(self, value: int) -> None: @property def objectives(self) -> np.ndarray: - """Objective(s) estimates from each replication; # replications x # objectives.""" + """Objective(s) estimates from each replication. + + # replications x # objectives. + """ return self.__objectives @objectives.setter @@ -1579,7 +1314,10 @@ def objectives(self, value: np.ndarray) -> None: @property def objectives_gradients(self) -> np.ndarray: - """Gradient estimates of objective(s) from each replication; # replications x # objectives x dimension.""" + """Gradient estimates of objective(s) from each replication. + + # replications x # objectives x dimension. + """ return self.__objectives_gradients @objectives_gradients.setter @@ -1588,7 +1326,10 @@ def objectives_gradients(self, value: np.ndarray) -> None: @property def stochastic_constraints(self) -> np.ndarray: - """Stochastic constraint estimates from each replication; # replications x # stochastic constraints.""" + """Stochastic constraint estimates from each replication. + + # replications x # stochastic constraints. + """ return self.__stochastic_constraints @stochastic_constraints.setter @@ -1597,23 +1338,148 @@ def stochastic_constraints(self, value: np.ndarray) -> None: @property def stochastic_constraints_gradients(self) -> np.ndarray: - """Gradient estimates of stochastic constraints from each replication; # replications x # stochastic constraints x dimension.""" + """Gradient estimates of stochastic constraints from each replication. + + # replications x # stochastic constraints x dimension. + """ return self.__stochastic_constraints_gradients @stochastic_constraints_gradients.setter def stochastic_constraints_gradients(self, value: np.ndarray) -> None: self.__stochastic_constraints_gradients = value + @property + def objectives_mean(self) -> np.ndarray: + """Mean of objectives.""" + mean = np.mean(self.objectives[: self.n_reps], axis=0) + return np.round(mean, 15) + + @property + def objectives_var(self) -> np.ndarray: + """Variance of objectives.""" + if self.n_reps == 1: + return np.zeros(self.objectives.shape[1]) + var = np.var(self.objectives[: self.n_reps], axis=0, ddof=1) + return np.round(var, 15) + + @property + def objectives_stderr(self) -> np.ndarray: + """Standard error of objectives.""" + if self.n_reps == 1: + return np.zeros(self.objectives.shape[1]) + std = np.std(self.objectives[: self.n_reps], axis=0, ddof=1) + sqrt = np.sqrt(self.n_reps) + return np.round(std / sqrt, 15) + + @property + def objectives_cov(self) -> np.ndarray: + """Covariance of objectives.""" + if self.n_reps == 1: + return np.zeros(self.objectives.shape[1]) + cov = np.cov(self.objectives[: self.n_reps], rowvar=False, ddof=1) + return np.round(cov, 15) + + @property + def objectives_gradients_mean(self) -> np.ndarray: + """Mean of gradients of objectives.""" + if self.n_reps == 1: + return np.zeros(self.objectives.shape[1]) + mean = np.mean(self.objectives_gradients[: self.n_reps], axis=0) + return np.round(mean, 15) + + @property + def objectives_gradients_var(self) -> np.ndarray: + """Variance of gradients of objectives.""" + if self.n_reps == 1: + return np.zeros(self.objectives.shape[1]) + var = np.var(self.objectives_gradients[: self.n_reps], axis=0, ddof=1) + return np.round(var, 15) + + @property + def objectives_gradients_stderr(self) -> np.ndarray: + """Standard error of gradients of objectives.""" + if self.n_reps == 1: + return np.zeros(self.objectives.shape[1]) + std = np.std(self.objectives_gradients[: self.n_reps], axis=0, ddof=1) + sqrt = np.sqrt(self.n_reps) + return np.round(std / sqrt, 15) + + @property + def objectives_gradients_cov(self) -> np.ndarray: + """Covariance of gradients of objectives.""" + if self.n_reps == 1: + return np.zeros(self.objectives.shape[1]) + return np.array( + [ + np.cov( + self.objectives_gradients[: self.n_reps, obj], + rowvar=False, + ddof=1, + ) + for obj in range(len(self.det_objectives)) + ] + ) + + @property + def stoch_constraints_mean(self) -> np.ndarray: + """Mean of stochastic constraints.""" + if self.stoch_constraints is None: + return np.array([]) + mean = np.mean(self.stoch_constraints[: self.n_reps], axis=0) + return np.round(mean, 15) + + @property + def stoch_constraints_var(self) -> np.ndarray: + """Variance of stochastic constraints.""" + if self.stoch_constraints is None: + return np.array([]) + var = np.var(self.stoch_constraints[: self.n_reps], axis=0, ddof=1) + return np.round(var, 15) + + @property + def stoch_constraints_stderr(self) -> np.ndarray: + """Standard error of stochastic constraints.""" + if self.stoch_constraints is None: + return np.array([]) + std = np.std(self.stoch_constraints[: self.n_reps], axis=0, ddof=1) + sqrt = np.sqrt(self.n_reps) + return np.round(std / sqrt, 15) + + @property + def stoch_constraints_cov(self) -> np.ndarray: + """Covariance of stochastic constraints.""" + if self.stoch_constraints is None: + return np.array([]) + cov = np.cov(self.stoch_constraints[: self.n_reps], rowvar=False, ddof=1) + return np.round(cov, 15) + + # TODO: implement these properties + # self.stoch_constraints_gradients_mean = np.mean( + # self.stoch_constraints_gradients[: self.n_reps], axis=0 + # ) + # self.stoch_constraints_gradients_var = np.var( + # self.stoch_constraints_gradients[: self.n_reps], axis=0, ddof=1 + # ) + # self.stoch_constraints_gradients_stderr = np.std( + # self.stoch_constraints_gradients[: self.n_reps], axis=0, ddof=1 + # ) / np.sqrt(self.n_reps) + # self.stoch_constraints_gradients_cov = np.array( + # [ + # np.cov( + # self.stoch_constraints_gradients[: self.n_reps, stcon], + # rowvar=False, + # ddof=1, + # ) + # for stcon in range(len(self.det_stoch_constraints)) + # ] + # ) + def __init__(self, x: tuple, problem: Problem) -> None: """Initialize a solution object. - Parameters - ---------- - x : tuple - Vector of decision variables. - problem : ``base.Problem`` - Problem to which `x` is a solution. - + Args: + x (tuple): Vector of decision variables. + problem (Problem): Problem to which `x` is a solution. """ super().__init__() self.x = x @@ -1623,11 +1489,10 @@ def __init__(self, x: tuple, problem: Problem) -> None: problem.deterministic_objectives_and_gradients(self.x) ) self.det_stoch_constraints, self.det_stoch_constraints_gradients = ( - problem.deterministic_stochastic_constraints_and_gradients(self.x) - ) - init_size = ( - 100 # Initialize numpy arrays to store up to 100 replications. + problem.deterministic_stochastic_constraints_and_gradients() ) + # Initialize numpy arrays to store up to 100 replications. + init_size = 100 self.storage_size = init_size # Raw data. self.objectives = np.zeros((init_size, problem.n_objectives)) @@ -1648,30 +1513,54 @@ def __init__(self, x: tuple, problem: Problem) -> None: # self.objectives_mean = np.full((problem.n_objectives), np.nan) # self.objectives_var = np.full((problem.n_objectives), np.nan) # self.objectives_stderr = np.full((problem.n_objectives), np.nan) - # self.objectives_cov = np.full((problem.n_objectives, problem.n_objectives), np.nan) - # self.objectives_gradients_mean = np.full((problem.n_objectives, problem.dim), np.nan) - # self.objectives_gradients_var = np.full((problem.n_objectives, problem.dim), np.nan) - # self.objectives_gradients_stderr = np.full((problem.n_objectives, problem.dim), np.nan) - # self.objectives_gradients_cov = np.full((problem.n_objectives, problem.dim, problem.dim), np.nan) - # self.stoch_constraints_mean = np.full((problem.n_stochastic_constraints), np.nan) - # self.stoch_constraints_var = np.full((problem.n_stochastic_constraints), np.nan) - # self.stoch_constraints_stderr = np.full((problem.n_stochastic_constraints), np.nan) - # self.stoch_constraints_cov = np.full((problem.n_stochastic_constraints, problem.n_stochastic_constraints), np.nan) - # self.stoch_constraints_gradients_mean = np.full((problem.n_stochastic_constraints, problem.dim), np.nan) - # self.stoch_constraints_gradients_var = np.full((problem.n_stochastic_constraints, problem.dim), np.nan) - # self.stoch_constraints_gradients_stderr = np.full((problem.n_stochastic_constraints, problem.dim), np.nan) - # self.stoch_constraints_gradients_cov = np.full((problem.n_stochastic_constraints, problem.dim, problem.dim), np.nan) + # self.objectives_cov = np.full( + # (problem.n_objectives, problem.n_objectives), np.nan + # ) + # self.objectives_gradients_mean = np.full( + # (problem.n_objectives, problem.dim), np.nan + # ) + # self.objectives_gradients_var = np.full( + # (problem.n_objectives, problem.dim), np.nan + # ) + # self.objectives_gradients_stderr = np.full( + # (problem.n_objectives, problem.dim), np.nan + # ) + # self.objectives_gradients_cov = np.full( + # (problem.n_objectives, problem.dim, problem.dim), np.nan + # ) + # self.stoch_constraints_mean = np.full( + # (problem.n_stochastic_constraints), np.nan + # ) + # self.stoch_constraints_var = np.full( + # (problem.n_stochastic_constraints), np.nan + # ) + # self.stoch_constraints_stderr = np.full( + # (problem.n_stochastic_constraints), np.nan + # ) + # self.stoch_constraints_cov = np.full( + # (problem.n_stochastic_constraints, problem.n_stochastic_constraints), + # np.nan + # ) + # self.stoch_constraints_gradients_mean = np.full( + # (problem.n_stochastic_constraints, problem.dim), np.nan + # ) + # self.stoch_constraints_gradients_var = np.full( + # (problem.n_stochastic_constraints, problem.dim), np.nan + # ) + # self.stoch_constraints_gradients_stderr = np.full( + # (problem.n_stochastic_constraints, problem.dim), np.nan + # ) + # self.stoch_constraints_gradients_cov = np.full( + # (problem.n_stochastic_constraints, problem.dim, problem.dim), np.nan + # ) def attach_rngs(self, rng_list: list[MRG32k3a], copy: bool = True) -> None: """Attach a list of random-number generators to the solution. - Parameters - ---------- - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - List of random-number generators used to run simulation replications. - copy : bool, default=True - True if we want to copy the ``mrg32k3a.mrg32k3a.MRG32k3a`` objects, otherwise False. - + Args: + rng_list (list[MRG32k3a]): List of RNGs used to run simulation replications. + copy (bool, optional): If True (default), copies the RNGs before attaching + them. If False, attaches the original RNG objects directly. """ if copy: self.rng_list = [deepcopy(rng) for rng in rng_list] @@ -1681,11 +1570,8 @@ def attach_rngs(self, rng_list: list[MRG32k3a], copy: bool = True) -> None: def pad_storage(self, num_macroreps: int) -> None: """Append zeros to numpy arrays for summary statistics. - Parameters - ---------- - num_macroreps : int - Number of replications to simulate. - + Args: + num_macroreps (int): Number of replications to simulate. """ # Size of data storage. n_objectives = len(self.det_objectives) @@ -1715,69 +1601,10 @@ def pad_storage(self, num_macroreps: int) -> None: self.stoch_constraints_gradients = np.concatenate( ( self.stoch_constraints_gradients, - np.zeros( - (pad_size, n_stochastic_constraints, self.dim) - ), + np.zeros((pad_size, n_stochastic_constraints, self.dim)), ) ) else: self.stoch_constraints_gradients = np.zeros( (pad_size, n_stochastic_constraints, self.dim) ) - - def recompute_summary_statistics(self) -> None: - """Recompute summary statistics of the solution. - - Notes - ----- - Statistics for gradients of objectives and stochastic constraint LHSs are temporarily commented out. Under development. - - """ - self.objectives_mean = np.mean(self.objectives[: self.n_reps], axis=0) - if self.n_reps > 1: - self.objectives_var = np.var( - self.objectives[: self.n_reps], axis=0, ddof=1 - ) - self.objectives_stderr = np.std( - self.objectives[: self.n_reps], axis=0, ddof=1 - ) / np.sqrt(self.n_reps) - self.objectives_cov = np.cov( - self.objectives[: self.n_reps], rowvar=False, ddof=1 - ) - self.objectives_gradients_mean = np.mean( - self.objectives_gradients[: self.n_reps], axis=0 - ) - if self.n_reps > 1: - self.objectives_gradients_var = np.var( - self.objectives_gradients[: self.n_reps], axis=0, ddof=1 - ) - self.objectives_gradients_stderr = np.std( - self.objectives_gradients[: self.n_reps], axis=0, ddof=1 - ) / np.sqrt(self.n_reps) - self.objectives_gradients_cov = np.array( - [ - np.cov( - self.objectives_gradients[: self.n_reps, obj], - rowvar=False, - ddof=1, - ) - for obj in range(len(self.det_objectives)) - ] - ) - if self.stoch_constraints is not None: - self.stoch_constraints_mean = np.mean( - self.stoch_constraints[: self.n_reps], axis=0 - ) - self.stoch_constraints_var = np.var( - self.stoch_constraints[: self.n_reps], axis=0, ddof=1 - ) - self.stoch_constraints_stderr = np.std( - self.stoch_constraints[: self.n_reps], axis=0, ddof=1 - ) / np.sqrt(self.n_reps) - self.stoch_constraints_cov = np.cov( - self.stoch_constraints[: self.n_reps], rowvar=False, ddof=1 - ) - # self.stoch_constraints_gradients_mean = np.mean(self.stoch_constraints_gradients[:self.n_reps], axis=0) - # self.stoch_constraints_gradients_var = np.var(self.stoch_constraints_gradients[:self.n_reps], axis=0, ddof=1) - # self.stoch_constraints_gradients_stderr = np.std(self.stoch_constraints_gradients[:self.n_reps], axis=0, ddof=1) / np.sqrt(self.n_reps) - # self.stoch_constraints_gradients_cov = np.array([np.cov(self.stoch_constraints_gradients[:self.n_reps, stcon], rowvar=False, ddof=1) for stcon in range(len(self.det_stoch_constraints))]) diff --git a/simopt/curve.py b/simopt/curve.py new file mode 100644 index 000000000..8c11a4865 --- /dev/null +++ b/simopt/curve.py @@ -0,0 +1,235 @@ +"""Curve class for plotting and analysis.""" + +from __future__ import annotations + +import logging +import math +from enum import Enum +from typing import TYPE_CHECKING + +# Imports exclusively used when type checking +# Prevents imports from being executed at runtime +if TYPE_CHECKING: + from collections.abc import Iterable, Sequence + + from matplotlib.lines import Line2D as Line2D + + +class CurveType(Enum): + """Enumeration for different curve styles.""" + + REGULAR = "regular" + CONF_BOUND = "conf_bound" + + @property + def style(self) -> tuple[str, int]: + """Returns linestyle and linewidth for the curve type.""" + return { + CurveType.REGULAR: ("-", 2), + CurveType.CONF_BOUND: ("--", 1), + }[self] + + +class Curve: + """Base class for all curves.""" + + @property + def x_vals(self) -> tuple[float, ...]: + """Values of horizontal components.""" + return self.__x_vals + + @property + def y_vals(self) -> tuple[float, ...]: + """Values of vertical components.""" + return self.__y_vals + + @property + def n_points(self) -> int: + """Number of points in the curve.""" + return self.__n_points + + def __init__( + self, x_vals: Sequence[int | float], y_vals: Sequence[int | float] + ) -> None: + """Initialize a curve with x- and y-values. + + Args: + x_vals (Sequence[int | float]): Values of horizontal components. + y_vals (Sequence[int | float]): Values of vertical components. + + Raises: + TypeError: If x_vals or y_vals are not numeric. + ValueError: If x_vals and y_vals have different lengths or if they contain + non-numeric values. + """ + try: + # Ensure x_vals and y_vals have the same length before conversion + if len(x_vals) != len(y_vals): + error_msg = ( + f"Length of x ({len(x_vals)}) and y ({len(y_vals)}) must be equal." + ) + raise ValueError(error_msg) + + # Convert to immutable tuples only after validation + self.__x_vals = tuple(float(x) for x in x_vals) + self.__y_vals = tuple(float(y) for y in y_vals) + + # Store the number of points + self.__n_points = len(self.__x_vals) + + except (TypeError, ValueError) as e: + error_msg = f"Invalid input for Curve initialization: {e}" + logging.error(error_msg) + raise ValueError(error_msg) from e # Keep the original error type + + def lookup(self, x_val: float) -> float: + """Lookup the y-value of the curve at an intermediate x-value. + + Args: + x_val (float): X-value to lookup. + + Returns: + float: Y-value corresponding to x, or NaN if x_val is out of range. + + Raises: + TypeError: If x_val is not numeric. + """ + from bisect import bisect_right + + try: + # Return NaN if x_val is out of range (before first or after last x-value) + if x_val < self.x_vals[0] or x_val > self.x_vals[-1]: + return math.nan + + # Use binary search (O(log n)) instead of linear search (O(n)) + idx = bisect_right(self.x_vals, x_val) - 1 + return self.y_vals[idx] + + except TypeError as e: + raise TypeError(f"x_val must be a numeric value: {e}") from e + + def compute_crossing_time(self, threshold: float) -> float: + """Compute the first time at which a curve drops below a given threshold. + + Args: + threshold (float): Value for which to find the first crossing time. + + Returns: + float: First time at which the curve drops below the threshold. + + Raises: + TypeError: If threshold is not numeric. + """ + from bisect import bisect_right + + try: + # Find the first index where y_vals < threshold using binary search + index = bisect_right(self.y_vals, threshold) + + # If all y-values are above the threshold, return infinity + if index == self.n_points: + return math.inf + + # Return corresponding x-value + return self.x_vals[index] + + except TypeError as e: + raise TypeError(f"Threshold must be a numeric value: {e}") from e + + def compute_area_under_curve(self) -> float: + """Compute the area under a curve. + + Returns: + float: Area under the curve. + """ + x_diffs = (x_next - x for x, x_next in zip(self.x_vals[:-1], self.x_vals[1:])) + area_contributions = (y * dx for y, dx in zip(self.y_vals[:-1], x_diffs)) + + return sum(area_contributions) + + def curve_to_mesh(self, mesh: Iterable[float]) -> Curve: + """Create a curve defined at equally spaced x values. + + Args: + mesh (Iterable[float]): Collection of uniformly spaced x-values. + + Returns: + Curve: A curve with equally spaced x-values. + + Raises: + TypeError: If mesh is not an iterable of numeric values. + """ + try: + # Ensure mesh contains valid numeric values + mesh_x_vals = tuple(float(x) for x in mesh) + + # Generate corresponding y-values using lookup + mesh_y_vals = tuple(self.lookup(x) for x in mesh_x_vals) + + return Curve(x_vals=mesh_x_vals, y_vals=mesh_y_vals) + + except (TypeError, ValueError) as e: + error_msg = "Mesh must be an iterable of numeric values." + logging.error(error_msg) + raise TypeError(error_msg) from e + + def curve_to_full_curve(self) -> Curve: + """Create a curve with duplicate x- and y-values to indicate steps. + + Returns: + Curve: A curve with duplicate x- and y-values. + """ + from itertools import chain, repeat + + full_curve = Curve( + x_vals=list(chain.from_iterable(repeat(x, 2) for x in self.x_vals)), + y_vals=list(chain.from_iterable(repeat(y, 2) for y in self.y_vals)), + ) + return Curve( + x_vals=list(full_curve.x_vals)[1:], + y_vals=list(full_curve.y_vals)[:-1], + ) + + def plot( + self, + color_str: str = "C0", + curve_type: CurveType = CurveType.REGULAR, + ) -> Line2D: + """Plot a curve. + + Args: + color_str (str): String indicating line color, e.g., "C0", "C1", etc. + curve_type (CurveType): Type of line. + + Returns: + Line2D: Curve handle, useful when creating legends. + + Raises: + ValueError: If an invalid curve type is provided. + """ + from matplotlib.pyplot import step + + try: + # Ensure curve_type is a valid Enum member + if not isinstance(curve_type, CurveType): + error_msg = ( + f"Invalid curve type: {curve_type}. Must be a member of CurveType." + ) + raise ValueError(error_msg) + + linestyle, linewidth = curve_type.style + + # Plot the step curve + return step( + self.x_vals, + self.y_vals, + color=color_str, + linestyle=linestyle, + linewidth=linewidth, + where="post", + )[0] + + except Exception as e: + error_msg = f"Error in plot function: {e}" + logging.error(error_msg) + raise diff --git a/simopt/curve_utils.py b/simopt/curve_utils.py new file mode 100644 index 000000000..48c7e21f7 --- /dev/null +++ b/simopt/curve_utils.py @@ -0,0 +1,242 @@ +"""Curve utility functions. + +This module provides utility functions for manipulating and analyzing curves. +""" + +from __future__ import annotations + +import logging +import math +from typing import TYPE_CHECKING + +from simopt.curve import Curve + +# Imports exclusively used when type checking +# Prevents imports from being executed at runtime +if TYPE_CHECKING: + from collections.abc import Iterable + + +def mean_of_curves(curves: Iterable[Curve]) -> Curve: + """Compute the pointwise mean of a collection of curves. + + All curves must have identical starting and ending x-values. + + Args: + curves (Iterable[Curve]): A collection of curves to aggregate. + + Returns: + Curve: A curve representing the pointwise mean across all input curves. + + Raises: + TypeError: If the input is not an iterable of Curve objects. + """ + from statistics import mean + + try: + # Collect unique x-values across all curves + unique_x_vals = sorted({x_val for curve in curves for x_val in curve.x_vals}) + + # Compute pointwise means using generator expressions + mean_y_vals = [ + mean(curve.lookup(x_val) for curve in curves) for x_val in unique_x_vals + ] + + return Curve(x_vals=unique_x_vals, y_vals=mean_y_vals) + + except AttributeError as e: + error_msg = "Curves must be an iterable of Curve objects." + logging.error(error_msg) + raise TypeError(error_msg) from e + + +def quantile_of_curves(curves: Iterable[Curve], beta: float) -> Curve: + """Compute the pointwise quantile of a collection of curves. + + All curves must have identical starting and ending x-values. + + Args: + curves (Iterable[Curve]): A collection of curves to aggregate. + beta (float): The quantile level to compute (e.g., 0.5 for median). + + Returns: + Curve: A curve representing the pointwise quantile across the input curves. + + Raises: + TypeError: If input is not a valid collection of Curve objects. + """ + from statistics import quantiles + + try: + # Collect unique x-values across all curves + unique_x_vals = sorted({x_val for curve in curves for x_val in curve.x_vals}) + + # Precompute quantile index + quantile_idx = int(beta * 99) + + # Compute pointwise quantiles + quantile_y_vals = [ + quantiles((curve.lookup(x_val) for curve in curves), n=100)[quantile_idx] + for x_val in unique_x_vals + ] + + return Curve(x_vals=unique_x_vals, y_vals=quantile_y_vals) + + except AttributeError as e: + error_msg = "Curves must be an iterable of Curve objects." + logging.error(error_msg) + raise TypeError(error_msg) from e + except TypeError as e: + error_msg = "Beta must be a numeric value (int or float)." + logging.error(error_msg) + raise TypeError(error_msg) from e + + +def cdf_of_curves_crossing_times(curves: Iterable[Curve], threshold: float) -> Curve: + """Compute the CDF of crossing times from a collection of curves. + + The crossing time is defined as the first x-value where a curve crosses a given + threshold. + + Args: + curves (list[Curve]): A list of curves to analyze. + threshold (float): The y-value at which to detect the first crossing. + + Returns: + Curve: A curve representing the cumulative distribution of crossing times. + + Raises: + TypeError: If input is not a list of Curve objects. + """ + from bisect import bisect_right + + try: + # Compute crossing times once + crossing_times = [curve.compute_crossing_time(threshold) for curve in curves] + + # Collect unique crossing times (excluding infinity) + finite_crossing_times = {t for t in crossing_times if t < float("inf")} + + # Construct sorted unique x-values with 0 and 1 at the edges + unique_x_vals = [0, *sorted(finite_crossing_times), 1] + + # Use binary search (`bisect_right`) for efficient cumulative sum calculation + n_curves = len(crossing_times) + sorted_crossings = sorted(crossing_times) + + cdf_y_vals = [ + bisect_right(sorted_crossings, x) / n_curves for x in unique_x_vals + ] + + return Curve(x_vals=unique_x_vals, y_vals=cdf_y_vals) + + except AttributeError as e: + error_msg = "Curves must be an iterable of Curve objects." + logging.error(error_msg) + raise TypeError(error_msg) from e + except TypeError as e: + error_msg = "Threshold must be a float." + logging.error(error_msg) + raise TypeError(error_msg) from e + + +def quantile_cross_jump( + curves: Iterable[Curve], threshold: float, beta: float +) -> Curve: + """Compute a curve with a jump at the quantile of the crossing times. + + The curve is piecewise-constant with a single jump located at the specified quantile + of the first crossing times across the input curves. + + Args: + curves (list[Curve]): A list of curves to analyze. + threshold (float): The y-value at which to detect the first crossing. + beta (float): The quantile level (e.g., 0.5 for median crossing time). + + Returns: + Curve: A piecewise-constant curve with a jump at the quantile crossing time, + if finite. + + Raises: + TypeError: If input types are incorrect. + """ + from statistics import quantiles + + try: + # Compute crossing times once + crossing_times = [ + curve.compute_crossing_time(threshold=threshold) for curve in curves + ] + + # Convert beta into an index (assuming n=100 quantiles) + quantile_idx = int(beta * 99) + solve_time_quantile = quantiles(crossing_times, n=100)[quantile_idx] + + # Handle NaN and infinity cases + if math.isinf(solve_time_quantile) or math.isnan(solve_time_quantile): + return Curve(x_vals=[0, 1], y_vals=[0, 0]) + return Curve(x_vals=[0, solve_time_quantile, 1], y_vals=[0, 1, 1]) + + except AttributeError as e: + error_msg = "Curves must be an iterable of Curve objects." + logging.error(error_msg) + raise TypeError(error_msg) from e + except TypeError as e: + error_msg = "Threshold and Beta must be numeric (int or float)." + logging.error(error_msg) + raise TypeError(error_msg) from e + + +def difference_of_curves(curve_1: Curve, curve_2: Curve) -> Curve: + """Compute the difference between two curves (curve_1 - curve_2). + + The x-values of both curves must align exactly. + + Args: + curve_1 (Curve): The first curve (minuend). + curve_2 (Curve): The second curve (subtrahend). + + Returns: + Curve: A curve representing the pointwise difference. + + Raises: + TypeError: If inputs are not Curve instances or are incompatible. + """ + try: + # Collect unique x-values from both curves + unique_x_vals = sorted(set(curve_1.x_vals) | set(curve_2.x_vals)) + + # Compute difference in y-values + difference_y_vals = [ + curve_1.lookup(x_val) - curve_2.lookup(x_val) for x_val in unique_x_vals + ] + + return Curve(x_vals=unique_x_vals, y_vals=difference_y_vals) + + except AttributeError as e: + error_msg = "Both curve_1 and curve_2 must be Curve objects." + logging.error(error_msg) + raise TypeError(error_msg) from e + + +def max_difference_of_curves(curve_1: Curve, curve_2: Curve) -> float: + """Compute the maximum pointwise difference between two curves (curve_1 - curve_2). + + Args: + curve_1 (Curve): The first curve (minuend). + curve_2 (Curve): The second curve (subtrahend). + + Returns: + float: The maximum difference between the two curves at any x-value. + + Raises: + TypeError: If the inputs are not Curve instances or are incompatible. + """ + try: + # Compute the difference curve and return the max y-value + return max(difference_of_curves(curve_1, curve_2).y_vals) + + except AttributeError as e: + error_msg = "Both curve_1 and curve_2 must be Curve objects." + logging.error(error_msg) + raise TypeError(error_msg) from e diff --git a/simopt/data_farming_base.py b/simopt/data_farming_base.py index b545ad3b1..dcad5905a 100644 --- a/simopt/data_farming_base.py +++ b/simopt/data_farming_base.py @@ -5,64 +5,100 @@ import ast import csv import itertools -import os +import logging import subprocess from copy import deepcopy from enum import Enum +from pathlib import Path from typing import Literal -import numpy as np import pandas as pd -from mrg32k3a.mrg32k3a import MRG32k3a +from numpy import inf +import simopt.directory as directory +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import Model -from simopt.directory import model_directory, solver_directory from simopt.experiment_base import EXPERIMENT_DIR, ProblemSolver, post_normalize +from simopt.utils import resolve_file_path + +DATA_FARMING_DIR = EXPERIMENT_DIR / "data_farming" -DATA_FARMING_DIR = os.path.join(EXPERIMENT_DIR, "data_farming") +# Workaround for AutoAPI +model_directory = directory.model_directory +solver_directory = directory.solver_directory class DesignType(Enum): - nolhs = "nolhs" + """Enum for design types.""" + + NOLHS = "nolhs" class DesignPoint: - """Base class for design points represented as dictionaries of factors. - - Attributes - ---------- - model : ``base.Model`` - Model to simulate. - model_factors : dict - Model factor names and values. - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - Rngs for model to use when running replications at the solution. - n_reps : int - Number of replications run at a design point. - responses : dict - Responses observed from replications. - gradients : dict [dict] - Gradients of responses (w.r.t. model factors) observed from replications. - - Parameters - ---------- - model : ``base.Model`` - Model with factors model_factors. - - """ + """Base class for design points represented as dictionaries of factors.""" + + @property + def model(self) -> Model: + """Model to simulate.""" + return self._model + + @model.setter + def model(self, model: Model) -> None: + self._model = model + + @property + def model_factors(self) -> dict: + """Model factor names and values.""" + return self._model_factors + + @model_factors.setter + def model_factors(self, model_factors: dict) -> None: + self._model_factors = model_factors + + @property + def rng_list(self) -> list[MRG32k3a]: + """RNGs for use when running replications at the solution.""" + return self._rng_list + + @rng_list.setter + def rng_list(self, rng_list: list[MRG32k3a]) -> None: + self._rng_list = rng_list + + @property + def n_reps(self) -> int: + """Number of replications run at a design point.""" + return self._n_reps + + @n_reps.setter + def n_reps(self, n_reps: int) -> None: + self._n_reps = n_reps + + @property + def responses(self) -> dict: + """Responses observed from replications.""" + return self._responses + + @responses.setter + def responses(self, responses: dict) -> None: + self._responses = responses + + @property + def gradients(self) -> dict: + """Gradients of responses (with respect to model factors) from replications.""" + return self._gradients + + @gradients.setter + def gradients(self, gradients: dict) -> None: + self._gradients = gradients def __init__(self, model: Model) -> None: - """Initialize design point with a model object. - - Parameters - ---------- - model : ``base.Model`` - Model with factors model_factors. + """Initialize a design point with a model object. - Raises - ------ - TypeError + Args: + model (Model): Model with factors `model_factors`. + Raises: + TypeError: If `model` is not an instance of the `Model` class. """ # Type checking if not isinstance(model, Model): @@ -80,51 +116,24 @@ def __init__(self, model: Model) -> None: def attach_rngs(self, rng_list: list[MRG32k3a], copy: bool = True) -> None: """Attach a list of random-number generators to the design point. - Parameters - ---------- - rng_list : list [``mrg32k3a.mrg32k3a.MRG32k3a``] - List of random-number generators used to run simulation replications. - copy : bool, default=True - True if rng_list should be copied, otherwise False. - - Raises - ------ - TypeError - + Args: + rng_list (list[MRG32k3a]): List of random-number generators used to run + simulation replications. + copy (bool, optional): Whether to copy the provided `rng_list`. + Defaults to True. """ - # Type checking - if not isinstance(rng_list, list) or not all( - isinstance(rng, MRG32k3a) for rng in rng_list - ): - error_msg = "rng_list must be a list of MRG32k3a objects." - raise TypeError(error_msg) - if not isinstance(copy, bool): - error_msg = "copy must be a boolean." - raise TypeError(error_msg) - - if copy: - self.rng_list = [deepcopy(rng) for rng in rng_list] - else: - self.rng_list = rng_list + self.rng_list = [deepcopy(rng) for rng in rng_list] if copy else rng_list def simulate(self, num_macroreps: int = 1) -> None: - """Simulate m replications for the current model factors and append results to the responses and gradients dictionaries. + """Simulate macroreplications and update response and gradient data. - Parameters - ---------- - num_macroreps : int, default=1 - Number of macroreplications to run at the design point; > 0. - - Raises - ------ - TypeError - ValueError + Args: + num_macroreps (int, optional): Number of macroreplications to run (> 0). + Defaults to 1. + Raises: + ValueError: If `num_macroreps` is not positive. """ - # Type checking - if not isinstance(num_macroreps, int): - error_msg = "num_macroreps must be an integer." - raise TypeError(error_msg) # Value checking if num_macroreps <= 0: error_msg = "Number of macroreplications must be greater than 0." @@ -135,9 +144,7 @@ def simulate(self, num_macroreps: int = 1) -> None: responses, gradients = self.model.replicate(rng_list=self.rng_list) # If first replication, set up recording responses and gradients. if self.n_reps == 0: - self.responses = { - response_key: [] for response_key in responses - } + self.responses = {response_key: [] for response_key in responses} self.gradients = { response_key: { factor_key: [] for factor_key in gradients[response_key] @@ -159,125 +166,84 @@ def simulate(self, num_macroreps: int = 1) -> None: class DataFarmingExperiment: - """Base class for data-farming experiments consisting of an model and design of associated factors. - - Attributes - ---------- - model : ``base.Model`` - Model on which the experiment is run. - design : list [``data_farming_base.DesignPoint``] - List of design points forming the design. - n_design_pts : int - Number of design points in the design. - - Parameters - ---------- - model_name : str - Name of model on which the experiment is run. - factor_settings_filename : str - Name of .txt file containing factor ranges and # of digits. - factor_headers : list [str] - Ordered list of factor names appearing in factor settings/design file. - design_filename : str - Name of .txt file containing design matrix. - model_fixed_factors : dict - Non-default values of model factors that will not be varied. - - """ + """Base class for data-farming experiments with a model and factor design.""" def __init__( self, model_name: str, - factor_settings_filename: str | os.PathLike, + factor_settings_file_name: Path | str | None, factor_headers: list[str], - design_filepath: str | os.PathLike | None = None, + design_path: Path | str | None = None, model_fixed_factors: dict | None = None, stacks: int = 1, design_type: Literal["nolhs"] = "nolhs", ) -> None: - """Initialize data-farming experiment with a model object and design of associated factors. - - Parameters - ---------- - model_name : str - Name of model on which the experiment is run. - factor_settings_filename : str | os.PathLike - Name of .txt file containing factor ranges and # of digits. - factor_headers : list [str] - Ordered list of factor names appearing in factor settings/design file. - design_filepath : str, optional - Name of .txt file containing design matrix. - model_fixed_factors : dict, optional - Non-default values of model factors that will not be varied. - stacks : int, default=1 - Number of stacks in the design. - design_type: Literal["nolhs"], default="nolhs" - Type of design to be used. - - Raises - ------ - TypeError - ValueError - + """Initializes a data-farming experiment with a model and factor design. + + Args: + model_name (str): Name of the model to run. + factor_settings_file_name (Path | str | None): Path to the .txt file + containing factor ranges and precision digits. + factor_headers (list[str]): Ordered list of factor names in the + settings/design file. + design_path (Path | str | None, optional): Path to the design matrix file. + Defaults to None. + model_fixed_factors (dict, optional): Fixed model factor values that are + not varied. + stacks (int, optional): Number of stacks in the design. Must be > 0. + Defaults to 1. + design_type (Literal["nolhs"], optional): Design type to use. + Defaults to "nolhs". + + Raises: + ValueError: If `model_name` is invalid or `stacks` is not positive. + FileNotFoundError: If any specified file path does not exist. """ - # Type checking - if not isinstance(model_name, str): - error_msg = "model_name must be a string." - raise TypeError(error_msg) - if not isinstance(factor_settings_filename, (str, os.PathLike)): - error_msg = ( - "factor_settings_filename must be a string or path-like object." - ) - raise TypeError(error_msg) - if not isinstance(factor_headers, list) or not all( - isinstance(header, str) for header in factor_headers - ): - error_msg = "factor_headers must be a list of strings." - raise TypeError(error_msg) - if not isinstance(design_filepath, (str, os.PathLike, type(None))): - error_msg = "design_filename must be a string or path-like object." - raise TypeError(error_msg) - if not isinstance(model_fixed_factors, (dict, type(None))): - error_msg = "model_fixed_factors must be a dictionary." - raise TypeError(error_msg) - if not isinstance(stacks, int): - error_msg = "stacks must be an integer." - raise TypeError(error_msg) # Value checking if model_name not in model_directory: error_msg = "model_name must be a valid model name." raise ValueError(error_msg) - if not os.path.exists(factor_settings_filename): - error_msg = f"{factor_settings_filename} is not a valid file path." - raise ValueError(error_msg) # Change to FileNotFoundError? - if design_filepath is not None and not os.path.exists(design_filepath): - error_msg = f"{design_filepath} is not a valid file path." - raise ValueError(error_msg) # Change to FileNotFoundError? if stacks <= 0: error_msg = "Number of stacks must be greater than 0." raise ValueError(error_msg) + # Make sure the file_names resolve to valid paths + if factor_settings_file_name is not None: + factor_settings_file_name = resolve_file_path( + factor_settings_file_name, DATA_FARMING_DIR + ) + if not factor_settings_file_name.exists(): + error_msg = f"{factor_settings_file_name} is not a valid file path." + raise FileNotFoundError(error_msg) + if design_path is not None: + design_path = resolve_file_path(design_path, DATA_FARMING_DIR) + if not design_path.exists(): + error_msg = f"{design_path} is not a valid file path." + raise FileNotFoundError(error_msg) if model_fixed_factors is None: model_fixed_factors = {} # Initialize model object with fixed factors. - self.model = model_directory[model_name]( - fixed_factors=model_fixed_factors - ) - if design_filepath is None: + self.model = model_directory[model_name](fixed_factors=model_fixed_factors) + if design_path is None: + if factor_settings_file_name is None: + error_msg = ( + "factor_settings_file_name must be provided if " + "design_file_path is None." + ) + raise ValueError(error_msg) # Create model factor design from .txt file of factor settings. - # Hard-coded for a single-stack NOLHS. - filepath_core = os.path.join( - DATA_FARMING_DIR, factor_settings_filename + partial_file_path = DATA_FARMING_DIR / factor_settings_file_name + source_path = partial_file_path.with_suffix(".txt") + design_path = partial_file_path.with_suffix("_design.txt") + command = ( + f"stack_{design_type}.rb -s {stacks} {source_path} > {design_path}" ) - source_filepath = filepath_core + ".txt" - design_filepath = filepath_core + "_design.txt" - command = f"stack_{design_type}.rb -s {stacks} {source_filepath} > {design_filepath}" subprocess.run(command) - # Append design to base filename. + # Append design to base file name. # Read in design matrix from .txt file. Result is a pandas DataFrame. design_table = pd.read_csv( - design_filepath, + design_path, header=None, delimiter="\t", encoding="utf-8", @@ -298,29 +264,21 @@ def __init__( # Create new design point and add to design. self.design.append(DesignPoint(self.model)) + # Ensure that the data-farming directory exists. + DATA_FARMING_DIR.mkdir(parents=True, exist_ok=True) + def run(self, n_reps: int = 10, crn_across_design_pts: bool = True) -> None: """Run a fixed number of macroreplications at each design point. - Parameters - ---------- - n_reps : int, default=10 - Number of replications run at each design point. - crn_across_design_pts : bool, default=True - True if CRN are to be used across design points, otherwise False. - - Raises - ------ - TypeError - ValueError + Args: + n_reps (int, optional): Number of replications run at each design point. + Defaults to 10. + crn_across_design_pts (bool, optional): Whether to use common random numbers + (CRN) across design points. Defaults to True. + Raises: + ValueError: If `n_reps` is not positive. """ - # Type checking - if not isinstance(n_reps, int): - error_msg = "n_reps must be an integer." - raise TypeError(error_msg) - if not isinstance(crn_across_design_pts, bool): - error_msg = "crn_across_design_pts must be a boolean." - raise TypeError(error_msg) # Value checking if n_reps <= 0: error_msg = "Number of replications must be greater than 0." @@ -329,8 +287,7 @@ def run(self, n_reps: int = 10, crn_across_design_pts: bool = True) -> None: # Setup random number generators for model. # Use stream 0 for all runs; start with substreams 0, 1, ..., model.n_rngs-1. main_rng_list = [ - MRG32k3a(s_ss_sss_index=[0, ss, 0]) - for ss in range(self.model.n_rngs) + MRG32k3a(s_ss_sss_index=[0, ss, 0]) for ss in range(self.model.n_rngs) ] # All design points will share the same random number generator objects. # Simulate n_reps replications from each design point. @@ -350,40 +307,20 @@ def run(self, n_reps: int = 10, crn_across_design_pts: bool = True) -> None: for _ in range(len(main_rng_list)): rng.advance_substream() - def print_to_csv( - self, csv_filename: str | os.PathLike = "raw_results" - ) -> None: - """Extract observed responses from simulated design points and publish to .csv output file. - - Parameters - ---------- - csv_filename : str, default="raw_results" - Name of .csv file to print output to. - - Raises - ------ - TypeError + def print_to_csv(self, csv_file_name: Path | str = "raw_results") -> None: + """Writes simulated responses for all design points to a CSV file. + Args: + csv_file_name (Path | str, optional): Output file name (with or without + .csv extension). Defaults to "raw_results". """ - # Type checking - if not isinstance(csv_filename, (str, os.PathLike)): - error_msg = "csv_filename must be a string or path-like object." - raise TypeError(error_msg) - + # Resolve the file path + csv_file_name = resolve_file_path(csv_file_name, DATA_FARMING_DIR) # Add CSV extension if not present. - csv_filename = str(csv_filename) - if not csv_filename.endswith(".csv"): - csv_filename += ".csv" - # Check if there's a directory in the file path. - if os.path.dirname(csv_filename) == "": - # If not, add the default directory. - csv_filename = os.path.join(DATA_FARMING_DIR, csv_filename) - # Create directory if they do no exist. - if not os.path.exists(DATA_FARMING_DIR): - os.makedirs(DATA_FARMING_DIR) + csv_file_name = csv_file_name.with_suffix(".csv") # Write results to csv file. - with open(csv_filename, mode="x", newline="") as output_file: + with csv_file_name.open(mode="x", newline="") as output_file: csv_writer = csv.writer( output_file, delimiter=",", @@ -419,39 +356,7 @@ def print_to_csv( class DataFarmingMetaExperiment: - """Base class for data-farming meta experiments consisting of problem-solver pairs and a design of associated factors. - - Attributes - ---------- - design : list [``experiment_base.ProblemSolver``] - List of design points forming the design. - n_design_pts : int - Number of design points in the design. - - Parameters - ---------- - solver_name : str - Name of solver. - n_stacks : int, default = 1 - Number of stacks in the design. - design_type : str, default = "nolhs" - Type of design to use. - solver_factor_headers : list [str] - Ordered list of solver factor names appearing in factor settings/design file. - solver_factor_settings_filename : str | None, default=None - Name of .txt file containing solver factor ranges and # of digits. - design_filename : str, default=None - Name of .txt file containing design matrix. - csv_filename : str, default=None - Name of .csv file to print output to. - solver_fixed_factors : dict, default=None - Dictionary of user-specified solver factors that will not be varied. - problem_fixed_factors : dict, default=None - Dictionary of user-specified problem factors that will not be varied. - model_fixed_factors : dict, default=None - Dictionary of user-specified model factors that will not be varied. - - """ + """Base class for data-farming meta-experiments with problem-solver designs.""" def __init__( self, @@ -459,74 +364,36 @@ def __init__( solver_factor_headers: list[str] | None = None, n_stacks: int = 1, design_type: Literal["nolhs"] = "nolhs", - solver_factor_settings_filename: str | None = None, - design_filename: str | None = None, - csv_filename: str | None = None, + solver_factor_settings_file_path: Path | str | None = None, + design_file_path: Path | str | None = None, + csv_file_path: Path | str | None = None, solver_fixed_factors: dict | None = None, cross_design_factors: dict | None = None, ) -> None: - """Initialize data-farming meta experiment with a solver object and design of associated factors. - - Parameters - ---------- - solver_name : str, optional - Name of solver. - solver_factor_headers : list [str], optional - Ordered list of solver factor names appearing in factor settings/design file. - n_stacks : int - Number of stacks in the design. - design_type : Litreral["nolhs"], default = "nolhs" - Type of design to be used. - solver_factor_settings_filename : str, optional - Name of .txt file containing solver factor ranges and # of digits. - design_filename : str, optional - Name of .txt file containing design matrix. - csv_filename : str, optional - Name of .csv file containing design matrix. - solver_fixed_factors : dict, optional - Dictionary of user-specified solver factors that will not be varied. - cross_design_factors : dict, optional - Dictionary of user-specified solver factors that will not be varied. - - Raises - ------ - ValueError - If n_stacks is less than or equal to 0. - + """Initializes a meta-experiment with a solver and a factor design. + + Args: + solver_name (str, optional): Name of the solver. + solver_factor_headers (list[str], optional): Ordered list of solver factor + names from the settings/design file. + n_stacks (int): Number of stacks in the design. Must be > 0. + design_type (Literal["nolhs"], optional): Design type to use. + Defaults to "nolhs". + solver_factor_settings_file_path (Path | str | None, optional): Path to + the .txt file defining solver factor ranges and precision. + design_file_path (Path | str | None, optional): Path to the design + matrix file. + csv_file_path (Path | str | None, optional): Path to the CSV file + containing design data. + solver_fixed_factors (dict, optional): Solver factors to hold fixed. + cross_design_factors (dict, optional): Cross-design factor values + to include. + + Raises: + ValueError: If solver name is invalid, stacks ≤ 0, or design type is + unsupported. + FileNotFoundError: If any given path does not exist. """ - # Type checking - if not isinstance(solver_name, (str, type(None))): - error_msg = "solver_name must be a string." - raise TypeError(error_msg) - if not isinstance(solver_factor_headers, (list, type(None))) or ( - isinstance(solver_factor_headers, list) - and not all( - isinstance(header, str) for header in solver_factor_headers - ) - ): - error_msg = "solver_factor_headers must be a dictionary." - raise TypeError(error_msg) - if not isinstance(n_stacks, int): - error_msg = "n_stacks must be an integer." - raise TypeError(error_msg) - if not isinstance(design_type, str): - error_msg = "design_type must be a string." - raise TypeError(error_msg) - if not isinstance(solver_factor_settings_filename, (str, type(None))): - error_msg = "solver_factor_settings_filename must be a string." - raise TypeError(error_msg) - if not isinstance(design_filename, (str, type(None))): - error_msg = "design_filename must be a string." - raise TypeError(error_msg) - if not isinstance(csv_filename, (str, type(None))): - error_msg = "csv_filename must be a string." - raise TypeError(error_msg) - if not isinstance(solver_fixed_factors, (dict, type(None))): - error_msg = "solver_fixed_factors must be a dictionary." - raise TypeError(error_msg) - if not isinstance(cross_design_factors, (dict, type(None))): - error_msg = "cross_design_factors must be a dictionary." - raise TypeError(error_msg) # Value checking if solver_name is not None and solver_name not in solver_directory: error_msg = "solver_name must be a valid solver name." @@ -537,19 +404,27 @@ def __init__( if design_type not in ["nolhs"]: error_msg = "design_type must be a valid design type." raise ValueError(error_msg) - if solver_factor_settings_filename is not None and not os.path.exists( - solver_factor_settings_filename - ): - error_msg = ( - f"{solver_factor_settings_filename} is not a valid file path." + + # Make sure the file_names resolve to valid paths + if solver_factor_settings_file_path is not None: + solver_factor_settings_file_path = resolve_file_path( + solver_factor_settings_file_path, DATA_FARMING_DIR ) - raise ValueError(error_msg) # Change to FileNotFoundError? - if design_filename is not None and not os.path.exists(design_filename): - error_msg = f"{design_filename} is not a valid file path." - raise ValueError(error_msg) # Change to FileNotFoundError? - if csv_filename is not None and not os.path.exists(csv_filename): - error_msg = f"{csv_filename} is not a valid file path." - raise ValueError(error_msg) # Change to FileNotFoundError? + if not solver_factor_settings_file_path.exists(): + error_msg = ( + f"{solver_factor_settings_file_path} is not a valid file path." + ) + raise FileNotFoundError(error_msg) + if design_file_path is not None: + design_file_path = resolve_file_path(design_file_path, DATA_FARMING_DIR) + if not design_file_path.exists(): + error_msg = f"{design_file_path} is not a valid file path." + raise FileNotFoundError(error_msg) + if csv_file_path is not None: + csv_file_path = resolve_file_path(csv_file_path, DATA_FARMING_DIR) + if not csv_file_path.exists(): + error_msg = f"{csv_file_path} is not a valid file path." + raise FileNotFoundError(error_msg) if solver_fixed_factors is None: solver_fixed_factors = {} @@ -565,71 +440,68 @@ def __init__( ]() # creates solver object # TO DO: Extend to allow a design on problem/model factors too. # Currently supports designs on solver factors only. - if design_filename is None and csv_filename is None: - if solver_factor_settings_filename is None: - error_msg = "solver_factor_settings_filename must be provided." + if design_file_path is None and csv_file_path is None: + if solver_factor_settings_file_path is None: + error_msg = "solver_factor_settings_file_name must be provided." raise ValueError(error_msg) # Create solver factor design from .txt file of factor settings. - input_file = ( - os.path.join(DATA_FARMING_DIR, solver_factor_settings_filename) - + ".txt" - ) - output_file = ( - os.path.join(DATA_FARMING_DIR, solver_factor_settings_filename) - + "_design.txt" + partial_file_path = DATA_FARMING_DIR / solver_factor_settings_file_path + source_path = partial_file_path.with_suffix(".txt") + design_path = partial_file_path.with_suffix("_design.txt") + command = ( + f"stack_{design_type}.rb -s {n_stacks} {source_path} > {design_path}" ) - command = f"stack_{design_type}.rb -s {n_stacks} {input_file} > {output_file}" subprocess.run(command) - # Append design to base filename. - design_filename = f"{solver_factor_settings_filename}_design" - # # Read in design matrix from .txt file. Result is a pandas DataFrame. - # design_table = pd.read_csv(f"./data_farming_experiments/{design_filename}.txt", header=None, delimiter="\t", encoding="utf-8") + # Append design to base file name. + design_file_path = f"{solver_factor_settings_file_path}_design" - if csv_filename is None: + if csv_file_path is None: # Read in design matrix from .txt file. Result is a pandas DataFrame. + design_path = DATA_FARMING_DIR / f"{design_file_path}.txt" design_table = pd.read_csv( - f"./data_farming_experiments/{design_filename}.txt", + design_path, header=None, delimiter="\t", encoding="utf-8", ) # Create design csv file from design table + csv_file_path = DATA_FARMING_DIR / f"{design_file_path}.csv" - csv_filename = f"./data_farming_experiments/{design_filename}.csv" - - # self.solver_object = solver_directory[solver_name]() #creates solver object if solver_factor_headers is not None: column_names = zip( range(len(solver_factor_headers)), solver_factor_headers ) design_table.rename(columns=dict(column_names), inplace=True) - solver_fixed_str = {} - for factor in ( - solver_fixed_factors - ): # make new dict containing strings of solver factors - solver_fixed_str[factor] = str(solver_fixed_factors[factor]) + # make new dict containing strings of solver factors + solver_fixed_str = { + factor: str(value) for factor, value in solver_fixed_factors.items() + } for factor in ( self.solver_object.specifications ): # add default values to str dict for unspecified factors - default = self.solver_object.specifications[factor].get( - "default" - ) + default = self.solver_object.specifications[factor].get("default") if ( factor not in solver_fixed_str and solver_factor_headers is not None and factor not in solver_factor_headers ): - print("default from df base", default) + logging.debug("default from df base", default) solver_fixed_str[factor] = str(default) # all_solver_factor_names = solver_factor_headers + list( # solver_fixed_str.keys() # ) # list of all solver factor names - # all_solver_factor_names = solver_factor_headers + list(cross_design_factors.keys()) + list(solver_fixed_factors.keys()) #creates list of all solver factors in order of design, cross-design, then fixed factors + # # creates list of all solver factors in order of design, cross-design, + # # then fixed factors + # all_solver_factor_names = ( + # solver_factor_headers + # + list(cross_design_factors.keys()) + # + list(solver_fixed_factors.keys()) + # ) # Add fixed factors to dt for factor in solver_fixed_str: @@ -647,9 +519,9 @@ def __init__( new_design_table = pd.DataFrame() # temp empty value for combination in combinations: - combination_dict = dict( - zip(cross_factor_names, combination) - ) # dictionary containing current combination of cross design factor values + # dictionary containing current combination of cross design + # factor values + combination_dict = dict(zip(cross_factor_names, combination)) working_design_table = design_table.copy() for factor in combination_dict: @@ -660,7 +532,7 @@ def __init__( [new_design_table, working_design_table], ignore_index=True, ) - print(new_design_table) + logging.debug(new_design_table) design_table = new_design_table @@ -670,11 +542,9 @@ def __init__( design_table["Design Type"] = design_type design_table["Number Stacks"] = str(n_stacks) - design_table.to_csv( - csv_filename, mode="w", header=True, index=False - ) + design_table.to_csv(csv_file_path, mode="w", header=True, index=False) - self.csv_filename = csv_filename + self.design_table_path = csv_file_path # Largely taken from MetaExperiment class in wrapper_base.py. def run( @@ -684,38 +554,19 @@ def run( model_fixed_factors: dict | None = None, n_macroreps: int = 10, ) -> None: - """Run n_macroreps of each problem-solver design point. - - Parameters - ---------- - problem_name : str - Name of problem. - problem_fixed_factors : dict, default=None - Dictionary of user-specified problem factors that will not be varied. - model_fixed_factors : dict, default=None - Dictionary of user-specified model factors that will not be varied. - n_macroreps : int - Number of macroreplications for each design point. - - Raises - ------ - ValueError - If n_macroreps is less than or equal to 0. - + """Run `n_macroreps` of each problem-solver design point. + + Args: + problem_name (str): Name of the problem. + problem_fixed_factors (dict | None, optional): Dictionary of user-specified + problem factors that will not be varied. + model_fixed_factors (dict | None, optional): Dictionary of user-specified + model factors that will not be varied. + n_macroreps (int): Number of macroreplications for each design point. + + Raises: + ValueError: If `n_macroreps` is less than or equal to 0. """ - # Type checking - if not isinstance(problem_name, str): - error_msg = "problem_name must be a string." - raise TypeError(error_msg) - if not isinstance(problem_fixed_factors, (dict, type(None))): - error_msg = "problem_fixed_factors must be a dictionary." - raise TypeError(error_msg) - if not isinstance(model_fixed_factors, (dict, type(None))): - error_msg = "model_fixed_factors must be a dictionary." - raise TypeError(error_msg) - if not isinstance(n_macroreps, int): - error_msg = "n_macroreps must be an integer." - raise TypeError(error_msg) # Value checking if n_macroreps <= 0: error_msg = "Number of macroreplications must be greater than 0." @@ -732,7 +583,7 @@ def run( # Read design points from csv file solver_factors_str = {} # holds design points as string for all factors - with open(self.csv_filename) as file: + with self.design_table_path.open() as file: reader = csv.reader(file) first_row = next(reader) # next(reader) @@ -741,7 +592,6 @@ def run( all_solver_factor_names = first_row[1 : -1 * num_extra_col] # second_row = next(reader) # solver_name = second_row[-1*num_extra_col] - row_index = 0 solver_name = "" for row in reader: @@ -749,9 +599,8 @@ def run( dp = row[1 : -1 * num_extra_col] dp_index = 0 self.solver_object = solver_directory[solver_name]() - for factor in all_solver_factor_names: + for dp_index, factor in enumerate(all_solver_factor_names): solver_factors_str[factor] = dp[dp_index] - dp_index += 1 # Convert str to proper data type for factor in solver_factors_str: val_str = str(solver_factors_str[factor]) @@ -760,23 +609,14 @@ def run( solver_factors_insert = solver_factors.copy() solver_factors_across_design.append(solver_factors_insert) - row_index += 1 - self.n_design_pts = len(solver_factors_across_design) if self.n_design_pts == 0: raise ValueError("No design points found in csv file.") for i in range(self.n_design_pts): # Create design point on problem solver + file_name = f"{solver_name}_on_{problem_name}_designpt_{i}.pickle" + file_path = DATA_FARMING_DIR / "outputs" / file_name - file_name_path = ( - "./data_farming_experiments/outputs/" - + solver_name - + "_on_" - + problem_name - + "_designpt_" - + str(i) - + ".pickle" - ) current_solver_factors = solver_factors_across_design[i] new_design_pt = ProblemSolver( solver_name=solver_name, @@ -784,7 +624,7 @@ def run( solver_fixed_factors=current_solver_factors, problem_fixed_factors=problem_fixed_factors, model_fixed_factors=model_fixed_factors, - file_name_path=file_name_path, + file_name_path=file_path, ) self.design.append(new_design_pt) @@ -797,43 +637,30 @@ def run( experiment = self.design[design_pt_index] if getattr(experiment, "n_macroreps", None) != n_macroreps: - print("Running Design Point " + str(design_pt_index) + ".") + logging.info(f"Running Design Point {design_pt_index}.") experiment.clear_run() - print(experiment.solver.name) - print(experiment.problem.name) + logging.debug(experiment.solver.name) + logging.debug(experiment.problem.name) experiment.run(n_macroreps) - # Largely taken from MetaExperiment class in wrapper_base.py. def post_replicate( self, n_postreps: int, crn_across_budget: bool = True, crn_across_macroreps: bool = False, ) -> None: - """For each design point, run postreplications at solutions recommended by the solver on each macroreplication. - - Parameters - ---------- - n_postreps : int - Number of postreplications to take at each recommended solution. - crn_across_budget : bool, default=True - True if CRN are to be used for post-replications at solutions recommended at - different times, otherwise False. - crn_across_macroreps : bool, default=False - True if CRN are to be used for post-replications at solutions recommended on - different macroreplications, otherwise False. + """Runs postreplications for each design point on all macroreplications. + + Args: + n_postreps (int): Number of postreplications per recommended solution. + crn_across_budget (bool, optional): If True, use CRN across solutions from + different time budgets. Defaults to True. + crn_across_macroreps (bool, optional): If True, use CRN across different + macroreplications. Defaults to False. + Raises: + ValueError: If `n_postreps` is not positive. """ - # Type checking - if not isinstance(n_postreps, int): - error_msg = "n_postreps must be an integer." - raise TypeError(error_msg) - if not isinstance(crn_across_budget, bool): - error_msg = "crn_across_budget must be a boolean." - raise TypeError(error_msg) - if not isinstance(crn_across_macroreps, bool): - error_msg = "crn_across_macroreps must be a boolean." - raise TypeError(error_msg) # Value checking if n_postreps <= 0: error_msg = "Number of postreplications must be greater than 0." @@ -845,14 +672,11 @@ def post_replicate( # post-process it now. if ( getattr(experiment, "n_postreps", None) != n_postreps - or getattr(experiment, "crn_across_budget", None) - != crn_across_budget + or getattr(experiment, "crn_across_budget", None) != crn_across_budget or getattr(experiment, "crn_across_macroreps", None) != crn_across_macroreps ): - print( - "Post-processing Design Point " + str(design_pt_index) + "." - ) + logging.info(f"Post-processing Design Point {design_pt_index}.") experiment.clear_postreplicate() experiment.post_replicate( n_postreps, @@ -860,27 +684,19 @@ def post_replicate( crn_across_macroreps=crn_across_macroreps, ) - # Largely taken from MetaExperiment class in wrapper_base.py. def post_normalize( self, n_postreps_init_opt: int, crn_across_init_opt: bool = True ) -> None: - """Post-normalize problem-solver pairs. + """Post-normalizes all problem-solver pairs in the design. - Parameters - ---------- - n_postreps_init_opt : int - Number of postreplications to take at initial x0 and optimal x*. - crn_across_init_opt : bool, default=True - True if CRN are to be used for post-replications at solutions x0 and x*, otherwise False. + Args: + n_postreps_init_opt (int): Number of postreplications at x0 and x*. + crn_across_init_opt (bool, optional): If True, use CRN across x0 and x*. + Defaults to True. + Raises: + ValueError: If `n_postreps_init_opt` is not positive. """ - # Type checking - if not isinstance(n_postreps_init_opt, int): - error_msg = "n_postreps_init_opt must be an integer." - raise TypeError(error_msg) - if not isinstance(crn_across_init_opt, bool): - error_msg = "crn_across_init_opt must be a boolean." - raise TypeError(error_msg) # Value checking if n_postreps_init_opt <= 0: error_msg = "Number of postreplications must be greater than 0." @@ -895,52 +711,36 @@ def post_normalize( def report_statistics( self, solve_tols: list[float] | None = None, - csv_filename: str | None = None, + csv_file_name: Path | str | None = None, ) -> None: - """For each design point, calculate statistics from each macoreplication and print to csv. - - Parameters - ---------- - solve_tols : list [float], default = [0.05, 0.10, 0.20, 0.50] - Relative optimality gap(s) definining when a problem is solved; in (0,1]. - csv_filename : str, default="df_solver_results" - Name of .csv file to print output to. + """Calculates and writes macroreplication statistics for each design point. + Args: + solve_tols (list[float], optional): Optimality gaps for considering a + problem solved (values in (0, 1]). Defaults to [0.05, 0.10, 0.20, 0.50]. + csv_file_name (Path | str | None, optional): Name of the output CSV file. + Defaults to "df_solver_results.csv". """ - # Type checking - if not isinstance(solve_tols, (list, type(None))) or ( - isinstance(solve_tols, list) - and not all(isinstance(tol, float) for tol in solve_tols) - ): - error_msg = "solve_tols must be a list of floats." - raise TypeError(error_msg) - if not isinstance(csv_filename, (str, type(None))): - error_msg = "csv_filename must be a string." - raise TypeError(error_msg) + if solve_tols is None: + solve_tols = [0.05, 0.10, 0.20, 0.50] # Value checking - if solve_tols is not None and not all( - 0 < tol <= 1 for tol in solve_tols - ): + if solve_tols is not None and not all(0 < tol <= 1 for tol in solve_tols): error_msg = "Relative optimality gap must be in (0,1]." raise ValueError(error_msg) - # TODO: Figure out if this is a path or just a name - if csv_filename is not None and not os.path.exists(csv_filename): - error_msg = f"{csv_filename} is not a valid file path." - raise ValueError(error_msg) # Change to FileNotFoundError? - - if solve_tols is None: - solve_tols = [0.05, 0.10, 0.20, 0.50] - if csv_filename is None: - file_path = os.path.join(DATA_FARMING_DIR, "df_solver_results.csv") + # Make sure the file name resolves if it isn't None + if csv_file_name is not None: + csv_file_name = resolve_file_path(csv_file_name, DATA_FARMING_DIR) + if not csv_file_name.exists(): + error_msg = f"{csv_file_name} does not exist." + raise FileNotFoundError(error_msg) else: - file_path = csv_filename + ".csv" + csv_file_name = DATA_FARMING_DIR / "df_solver_results.csv" - # Create folder(s) for file if needed - dir_path = os.path.dirname(file_path) - if not os.path.exists(dir_path): - os.makedirs(dir_path) + # Set the file path + file_path = csv_file_name.with_suffix(".csv") + file_path.mkdir(parents=True, exist_ok=True) - with open(file_path) as output_file: + with file_path.open() as output_file: csv_writer = csv.writer( output_file, delimiter=",", @@ -948,12 +748,8 @@ def report_statistics( quoting=csv.QUOTE_MINIMAL, ) base_experiment = self.design[0] - solver_factor_names = list( - base_experiment.solver.specifications.keys() - ) - problem_factor_names = list( - base_experiment.problem.specifications.keys() - ) + solver_factor_names = list(base_experiment.solver.specifications.keys()) + problem_factor_names = list(base_experiment.problem.specifications.keys()) model_factor_names = list( set(base_experiment.problem.model.specifications.keys()) - base_experiment.problem.model_decision_factors @@ -963,9 +759,7 @@ def report_statistics( [f"{solve_tol}-Solve Time", f"{solve_tol}-Solved? (Y/N)"] for solve_tol in solve_tols ] - solve_time_headers = list( - itertools.chain.from_iterable(solve_time_headers) - ) + solve_time_headers = list(itertools.chain.from_iterable(solve_time_headers)) # Print headers. csv_writer.writerow( [ @@ -1000,14 +794,12 @@ def report_statistics( # Parse list of statistics. solve_time_values = [ [ - progress_curve.compute_crossing_time( - threshold=solve_tol - ), + progress_curve.compute_crossing_time(threshold=solve_tol), int( progress_curve.compute_crossing_time( threshold=solve_tol ) - < np.inf + < inf ), ] for solve_tol in solve_tols diff --git a/simopt/directory.py b/simopt/directory.py index 37d21f6e7..6f61b35b7 100644 --- a/simopt/directory.py +++ b/simopt/directory.py @@ -1,199 +1,81 @@ #!/usr/bin/env python -"""Provide dictionary directories listing solvers, problems, and models.""" +"""Provide dynamically discovered dictionary directories. -from __future__ import annotations +Lists solvers, problems, and models found in the SimOpt package. +""" -# Import the base classes +import importlib +import pkgutil + +import simopt.models +import simopt.solvers from simopt.base import Model, Problem, Solver -# Import Models -from simopt.models.amusementpark import AmusementPark, AmusementParkMinDepart -from simopt.models.chessmm import ChessAvgDifference, ChessMatchmaking -from simopt.models.cntnv import CntNV, CntNVMaxProfit -from simopt.models.contam import ( - Contamination, - ContaminationTotalCostCont, - ContaminationTotalCostDisc, + +def load_models_and_problems() -> tuple[ + dict[str, type[Model]], dict[str, type[Problem]] +]: + """Dynamically load models and problems from simopt.models.""" + models = {} + problems = {} + + for _, modname, _ in pkgutil.iter_modules( + simopt.models.__path__, simopt.models.__name__ + "." + ): + mod = importlib.import_module(modname) + for attr_name in dir(mod): + attr = getattr(mod, attr_name) + if isinstance(attr, type): + if issubclass(attr, Model) and attr is not Model: + models[attr.class_name_abbr] = attr + elif issubclass(attr, Problem) and attr is not Problem: + problems[attr.class_name_abbr] = attr + + return models, problems + + +def load_solvers() -> dict[str, type[Solver]]: + """Dynamically load solvers from simopt.solvers.""" + solvers = {} + + for _, modname, _ in pkgutil.iter_modules( + simopt.solvers.__path__, simopt.solvers.__name__ + "." + ): + mod = importlib.import_module(modname) + for attr_name in dir(mod): + attr = getattr(mod, attr_name) + if ( + isinstance(attr, type) + and issubclass(attr, Solver) + and attr is not Solver + ): + solvers[attr.class_name_abbr] = attr + + return solvers + + +def generate_unabbreviated_mapping( + class_dict: dict[str, type], include_compatibility: bool = False +) -> dict[str, type]: + """Generate dictionary with full names (and compatibility for solvers/problems).""" + mapping = {} + for cls in class_dict.values(): + if include_compatibility: + mapping[f"{cls.class_name} ({cls.compatibility})"] = cls + else: + mapping[cls.class_name] = cls + return mapping + + +# Load classes dynamically +model_directory, problem_directory = load_models_and_problems() +solver_directory = load_solvers() + +# Generate unabbreviated mappings +solver_unabbreviated_directory = generate_unabbreviated_mapping( + solver_directory, include_compatibility=True ) -from simopt.models.dualsourcing import DualSourcing, DualSourcingMinCost -from simopt.models.dynamnews import DynamNews, DynamNewsMaxProfit -from simopt.models.example import ExampleModel, ExampleProblem -from simopt.models.facilitysizing import ( - FacilitySize, - FacilitySizingMaxService, - FacilitySizingTotalCost, +problem_unabbreviated_directory = generate_unabbreviated_mapping( + problem_directory, include_compatibility=True ) -from simopt.models.fixedsan import FixedSAN, FixedSANLongestPath -from simopt.models.hotel import Hotel, HotelRevenue -from simopt.models.ironore import IronOre, IronOreMaxRev, IronOreMaxRevCnt -from simopt.models.mm1queue import MM1MinMeanSojournTime, MM1Queue -from simopt.models.network import Network, NetworkMinTotalCost -from simopt.models.paramesti import ParamEstiMaxLogLik, ParameterEstimation -from simopt.models.rmitd import RMITD, RMITDMaxRevenue -from simopt.models.san import SAN, SANLongestPath -from simopt.models.sscont import SSCont, SSContMinCost -from simopt.models.tableallocation import TableAllocation, TableAllocationMaxRev - -# Import Solvers -from simopt.solvers.adam import ADAM -from simopt.solvers.aloe import ALOE -from simopt.solvers.astrodf import ASTRODF -from simopt.solvers.neldmd import NelderMead -from simopt.solvers.randomsearch import RandomSearch -from simopt.solvers.spsa import SPSA -from simopt.solvers.strong import STRONG - -# directory dictionaries -solver_directory: dict[str, type[Solver]] = { - "ASTRODF": ASTRODF, - "RNDSRCH": RandomSearch, - "NELDMD": NelderMead, - "STRONG": STRONG, - "SPSA": SPSA, - "ADAM": ADAM, - "ALOE": ALOE, -} - -solver_unabbreviated_directory: dict[str, type[Solver]] = { - "ASTRO-DF (SBCN)": ASTRODF, - "Random Search (SSMN)": RandomSearch, - "Nelder-Mead (SBCN)": NelderMead, - "STRONG (SBCN)": STRONG, - "SPSA (SBCN)": SPSA, - "ADAM (SBCN)": ADAM, - "ALOE (SBCN)": ALOE, -} - -problem_directory: dict[str, type[Problem]] = { - "EXAMPLE-1": ExampleProblem, - "CNTNEWS-1": CntNVMaxProfit, - "MM1-1": MM1MinMeanSojournTime, - "FACSIZE-1": FacilitySizingTotalCost, - "FACSIZE-2": FacilitySizingMaxService, - "RMITD-1": RMITDMaxRevenue, - "SSCONT-1": SSContMinCost, - "IRONORE-1": IronOreMaxRev, - "IRONORECONT-1": IronOreMaxRevCnt, - "DYNAMNEWS-1": DynamNewsMaxProfit, - "DUALSOURCING-1": DualSourcingMinCost, - "CONTAM-1": ContaminationTotalCostDisc, - "CONTAM-2": ContaminationTotalCostCont, - "CHESS-1": ChessAvgDifference, - "SAN-1": SANLongestPath, - "HOTEL-1": HotelRevenue, - "TABLEALLOCATION-1": TableAllocationMaxRev, - "PARAMESTI-1": ParamEstiMaxLogLik, - "FIXEDSAN-1": FixedSANLongestPath, - "NETWORK-1": NetworkMinTotalCost, - "AMUSEMENTPARK-1": AmusementParkMinDepart, -} - -problem_unabbreviated_directory: dict[str, type[Problem]] = { - "Min Deterministic Function + Noise (SUCG)": ExampleProblem, - "Max Profit for Continuous Newsvendor (SBCG)": CntNVMaxProfit, - "Min Mean Sojourn Time for MM1 Queue (SBCG)": MM1MinMeanSojournTime, - "Min Total Cost for Facility Sizing (SSCG)": FacilitySizingTotalCost, - "Max Service for Facility Sizing (SDCN)": FacilitySizingMaxService, - "Max Revenue for Revenue Management Temporal Demand (SDDN)": RMITDMaxRevenue, - "Min Total Cost for (s, S) Inventory (SBCN)": SSContMinCost, - "Max Revenue for Iron Ore (SBDN)": IronOreMaxRev, - "Max Revenue for Continuous Iron Ore (SBCN)": IronOreMaxRevCnt, - "Max Profit for Dynamic Newsvendor (SBDN)": DynamNewsMaxProfit, - "Min Cost for Dual Sourcing (SBDN)": DualSourcingMinCost, - "Min Total Cost for Discrete Contamination (SSDN)": ContaminationTotalCostDisc, - "Min Total Cost for Continuous Contamination (SSCN)": ContaminationTotalCostCont, - "Min Avg Difference for Chess Matchmaking (SSCN)": ChessAvgDifference, - "Min Mean Longest Path for Stochastic Activity Network (SBCG)": SANLongestPath, - "Max Revenue for Hotel Booking (SBDN)": HotelRevenue, - "Max Revenue for Restaurant Table Allocation (SDDN)": TableAllocationMaxRev, - "Max Log Likelihood for Gamma Parameter Estimation (SBCN)": ParamEstiMaxLogLik, - "Min Mean Longest Path for Fixed Stochastic Activity Network (SBCG)": FixedSANLongestPath, - "Min Total Cost for Communication Networks System (SDCN)": NetworkMinTotalCost, - "Min Total Departed Visitors for Amusement Park (SDDN)": AmusementParkMinDepart, -} -model_directory: dict[str, type[Model]] = { - "EXAMPLE": ExampleModel, - "CNTNEWS": CntNV, - "MM1": MM1Queue, - "FACSIZE": FacilitySize, - "RMITD": RMITD, - "SSCONT": SSCont, - "IRONORE": IronOre, - "DYNAMNEWS": DynamNews, - "DUALSOURCING": DualSourcing, - "CONTAM": Contamination, - "CHESS": ChessMatchmaking, - "SAN": SAN, - "HOTEL": Hotel, - "TABLEALLOCATION": TableAllocation, - "PARAMESTI": ParameterEstimation, - "FIXEDSAN": FixedSAN, - "NETWORK": Network, - "AMUSEMENTPARK": AmusementPark, -} -model_problem_unabbreviated_directory: dict[str, str] = { - "Min Deterministic Function + Noise (SUCG)": "EXAMPLE", - "Max Profit for Continuous Newsvendor (SBCG)": "CNTNEWS", - "Min Mean Sojourn Time for MM1 Queue (SBCG)": "MM1", - "Min Total Cost for Facility Sizing (SSCG)": "FACSIZE", - "Max Service for Facility Sizing (SDCN)": "FACSIZE", - "Max Revenue for Revenue Management Temporal Demand (SDDN)": "RMITD", - "Min Total Cost for (s, S) Inventory (SBCN)": "SSCONT", - "Max Revenue for Iron Ore (SBDN)": "IRONORE", - "Max Revenue for Continuous Iron Ore (SBCN)": "IRONORE", - "Max Profit for Dynamic Newsvendor (SBDN)": "DYNAMNEWS", - "Min Cost for Dual Sourcing (SBDN)": "DUALSOURCING", - "Min Total Cost for Discrete Contamination (SSDN)": "CONTAM", - "Min Total Cost for Continuous Contamination (SSCN)": "CONTAM", - "Min Avg Difference for Chess Matchmaking (SSCN)": "CHESS", - "Min Mean Longest Path for Stochastic Activity Network (SBCG)": "SAN", - "Max Revenue for Hotel Booking (SBDN)": "HOTEL", - "Max Revenue for Restaurant Table Allocation (SDDN)": "TABLEALLOCATION", - "Max Log Likelihood for Gamma Parameter Estimation (SBCN)": "PARAMESTI", - "Min Mean Longest Path for Fixed Stochastic Activity Network (SBCG)": "FIXEDSAN", - "Min Total Cost for Communication Networks System (SDCN)": "NETWORK", - "Min Total Departed Visitors for Amusement Park (SDDN)": "AMUSEMENTPARK", -} -model_problem_class_directory: dict[str, type[Model]] = { - "Min Deterministic Function + Noise (SUCG)": ExampleModel, - "Max Profit for Continuous Newsvendor (SBCG)": CntNV, - "Min Mean Sojourn Time for MM1 Queue (SBCG)": MM1Queue, - "Min Total Cost for Facility Sizing (SSCG)": FacilitySize, - "Max Service for Facility Sizing (SDCN)": FacilitySize, - "Max Revenue for Revenue Management Temporal Demand (SDDN)": RMITD, - "Min Total Cost for (s, S) Inventory (SBCN)": SSCont, - "Max Revenue for Iron Ore (SBDN)": IronOre, - "Max Revenue for Continuous Iron Ore (SBCN)": IronOre, - "Max Profit for Dynamic Newsvendor (SBDN)": DynamNews, - "Min Cost for Dual Sourcing (SBDN)": DualSourcing, - "Min Total Cost for Discrete Contamination (SSDN)": Contamination, - "Min Total Cost for Continuous Contamination (SSCN)": Contamination, - "Min Avg Difference for Chess Matchmaking (SSCN)": ChessMatchmaking, - "Min Mean Longest Path for Stochastic Activity Network (SBCG)": SAN, - "Max Revenue for Hotel Booking (SBDN)": Hotel, - "Max Revenue for Restaurant Table Allocation (SDDN)": TableAllocation, - "Max Log Likelihood for Gamma Parameter Estimation (SBCN)": ParameterEstimation, - "Min Mean Longest Path for Fixed Stochastic Activity Network (SBCG)": FixedSAN, - "Min Total Cost for Communication Networks System (SDCN)": Network, - "Min Total Departed Visitors for Amusement Park (SDDN)": AmusementPark, -} -model_unabbreviated_directory: dict[str, type[Model]] = { - "Deterministic Function + Noise": ExampleModel, - "Continuous Newsvendor": CntNV, - "MM1 Queue": MM1Queue, - "Facility Sizing": FacilitySize, - "Revenue Management Temporal Demand": RMITD, - "(s, S) Inventory": SSCont, - "Iron Ore": IronOre, - "Dynamic Newsvendor": DynamNews, - "Dual Sourcing": DualSourcing, - "Contamination": Contamination, - "Chess Matchmaking": ChessMatchmaking, - "Stochastic Activity Network": SAN, - "Hotel Booking": Hotel, - "Restaurant Table Allocation": TableAllocation, - "Gamma Parameter Estimation": ParameterEstimation, - "Fixed Stochastic Activity Network": FixedSAN, - "Communication Networks System": Network, - "Amusement Park (SDDN)": AmusementPark, -} +model_unabbreviated_directory = generate_unabbreviated_mapping(model_directory) diff --git a/simopt/experiment_base.py b/simopt/experiment_base.py index 6f4ff4e47..b13ceab88 100644 --- a/simopt/experiment_base.py +++ b/simopt/experiment_base.py @@ -1,634 +1,55 @@ -"""Provide base classes for problem-solver pairs and helper functions for reading/writing data and plotting.""" +"""Base classes for problem-solver pairs and I/O/plotting helper functions.""" from __future__ import annotations -import ast -import csv import importlib import itertools +import logging import os import pickle -import re -import shutil import subprocess import time -from multiprocessing import Pool -from typing import Literal +from enum import Enum +from pathlib import Path +from typing import TYPE_CHECKING -import matplotlib.lines as mpl_lines import matplotlib.pyplot as plt import numpy as np import pandas as pd -import seaborn as sns -from mrg32k3a.mrg32k3a import MRG32k3a -from scipy.stats import norm +import simopt.curve_utils as curve_utils +import simopt.directory as directory +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ObjectiveType, Problem, Solution, Solver, VariableType -from simopt.directory import ( - model_directory, - problem_directory, - solver_directory, -) - -"""Set the default directory for saving experiment results.""" -EXPERIMENT_DIR = os.path.join( - os.getcwd(), "experiments", time.strftime("%Y-%m-%d_%H-%M-%S") +from simopt.curve import ( + Curve, + CurveType, ) +from simopt.utils import make_nonzero, resolve_file_path +# Workaround for AutoAPI +model_directory = directory.model_directory +problem_directory = directory.problem_directory +solver_directory = directory.solver_directory -class Curve: - """Base class for all curves. - - Attributes - ---------- - x_vals : list [float] - Values of horizontal components. - y_vals : list [float] - Values of vertical components. - n_points : int - Number of values in x- and y- vectors. - - Parameters - ---------- - x_vals : list [float] - Values of horizontal components. - y_vals : list [float] - Values of vertical components. - - """ - - @property - def x_vals(self) -> list[float]: - """Values of horizontal components.""" - return self.__x_vals - - @property - def y_vals(self) -> list[float]: - """Values of vertical components.""" - return self.__y_vals - - @property - def n_points(self) -> int: - """Number of values in x- and y- vectors.""" - return len(self.x_vals) - - def __init__(self, x_vals: list[float], y_vals: list[float]) -> None: - """Initialize a curve with x- and y-values. - - Parameters - ---------- - x_vals : list[float] - Values of horizontal components. - y_vals : list[float] - Values of vertical components. - - Raises - ------ - TypeError - ValueError - - """ - # Type checking - if not isinstance(x_vals, list) or not all( - [isinstance(x, (int, float)) for x in x_vals] - ): - error_msg = "x_vals must be a list of floats." - raise TypeError(error_msg) - if not isinstance(y_vals, list) or not all( - [isinstance(y, (int, float)) for y in y_vals] - ): - error_msg = "y_vals must be a list of floats." - raise TypeError(error_msg) - # Value checking - if len(x_vals) != len(y_vals): - error_msg = f"Length of x- {len(x_vals)} and y-values {len(y_vals)} must be equal." - raise ValueError(error_msg) - - # Each attribute is read-only - self.__x_vals = x_vals - self.__y_vals = y_vals - - def lookup(self, x_val: float) -> float: - """Lookup the y-value of the curve at an intermediate x-value. - - Parameters - ---------- - x_val : float - X-value at which to lookup the y-value. - - Returns - ------- - float - Y-value corresponding to x. - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(x_val, (int, float)): - error_msg = "x_val must be a float." - raise TypeError(error_msg) - - if x_val < self.x_vals[0]: - return np.nan - else: - idx = np.max(np.where(np.array(self.x_vals) <= x_val)) - return self.y_vals[idx] - - def compute_crossing_time(self, threshold: float) -> float: - """Compute the first time at which a curve drops below a given threshold. - - Parameters - ---------- - threshold : float - Value for which to find first crossing time. - - Returns - ------- - float - First time at which a curve drops below threshold. - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(threshold, (int, float)): - error_msg = "Threshold must be a float." - raise TypeError(error_msg) - - # Use binary search to find the first x-value below threshold. - # TODO: Test this - # index = bisect.bisect_left(self.y_vals, threshold) - # if index == self.n_points: - # return np.inf - # else: - # return self.x_vals[index] - - for i in range(self.n_points): - if self.y_vals[i] < threshold: - return self.x_vals[i] - # If threshold is never crossed, return infinity. - return np.inf - - def compute_area_under_curve(self) -> float: - """Compute the area under a curve. - - Returns - ------- - float - Area under the curve. - - """ - area = np.dot(self.y_vals[:-1], np.diff(self.x_vals)) - return area - - def curve_to_mesh(self, mesh: list[float]) -> Curve: - """Create a curve defined at equally spaced x values. - - Parameters - ---------- - mesh : list[float] - List of uniformly spaced x-values. - - Returns - ------- - ``experiment_base.Curve`` - Curve with equally spaced x-values. - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(mesh, list) or not all( - [isinstance(x, (int, float)) for x in mesh] - ): - error_msg = "Mesh must be a list of floats." - raise TypeError(error_msg) - - mesh_curve = Curve(x_vals=mesh, y_vals=[self.lookup(x) for x in mesh]) - return mesh_curve - - def curve_to_full_curve(self) -> Curve: - """Create a curve with duplicate x- and y-values to indicate steps. - - Returns - ------- - ``experiment_base.Curve`` - Curve with duplicate x- and y-values. - - """ - duplicate_x_vals = [x for x in self.x_vals for _ in (0, 1)] - duplicate_y_vals = [y for y in self.y_vals for _ in (0, 1)] - full_curve = Curve( - x_vals=duplicate_x_vals[1:], y_vals=duplicate_y_vals[:-1] - ) - return full_curve - - def plot( - self, - color_str: str = "C0", - curve_type: Literal["regular", "conf_bound"] = "regular", - ) -> mpl_lines.Line2D: - """Plot a curve. - - Parameters - ---------- - color_str : str, default="C0" - String indicating line color, e.g., "C0", "C1", etc. - curve_type : str, default="regular" - String indicating type of line: "regular" or "conf_bound". - - Returns - ------- - ``matplotlib.lines.Line2D`` - Curve handle, to use when creating legends. - - Raises - ------ - TypeError - ValueError - - """ - # Type checking - if not isinstance(color_str, str): - error_msg = "Color must be a string." - raise TypeError(error_msg) - if not isinstance(curve_type, str): - error_msg = "Curve type must be a string." - raise TypeError(error_msg) - # Value checking - if curve_type not in ["regular", "conf_bound"]: - error_msg = "Invalid curve type." - raise ValueError(error_msg) - - if curve_type == "regular": - linestyle = "-" - linewidth = 2 - elif curve_type == "conf_bound": - linestyle = "--" - linewidth = 1 - (handle,) = plt.step( - self.x_vals, - self.y_vals, - color=color_str, - linestyle=linestyle, - linewidth=linewidth, - where="post", - ) - return handle - - -def mean_of_curves(curves: list[Curve]) -> Curve: - """Compute pointwise (w.r.t. x-values) mean of curves. - - Starting and ending x-values must coincide for all curves. - Parameters - ---------- - curves : list [``experiment_base.Curve``] - Collection of curves to aggregate. +# Imports exclusively used when type checking +# Prevents imports from being executed at runtime +if TYPE_CHECKING: + from typing import Literal - Returns - ------- - ``experiment_base.Curve object`` - Mean curve. + from matplotlib.lines import Line2D as Line2D + from pandas import DataFrame as DataFrame - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(curves, list) or not all( - [isinstance(curve, Curve) for curve in curves] - ): - error_msg = "Curves must be a list of Curve objects." - raise TypeError(error_msg) - - unique_x_vals = np.unique( - [x_val for curve in curves for x_val in curve.x_vals] - ) - mean_y_vals = [ - float(np.mean([curve.lookup(float(x_val)) for curve in curves])) - for x_val in unique_x_vals - ] - mean_curve = Curve(x_vals=unique_x_vals.tolist(), y_vals=mean_y_vals) # type: ignore - return mean_curve - - -def quantile_of_curves(curves: list[Curve], beta: float) -> Curve: - """Compute pointwise (w.r.t. x values) quantile of curves. - - Starting and ending x values must coincide for all curves. - - Parameters - ---------- - curves : list [``experiment_base.Curve``] - Collection of curves to aggregate. - beta : float - Quantile level. - - Returns - ------- - ``experiment_base.Curve`` - Quantile curve. - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(curves, list) or not all( - [isinstance(curve, Curve) for curve in curves] - ): - error_msg = "Curves must be a list of Curve objects." - raise TypeError(error_msg) - if not isinstance(beta, (int, float)): - error_msg = "Beta must be a float." - raise TypeError(error_msg) - - unique_x_vals = np.unique( - [x_val for curve in curves for x_val in curve.x_vals] - ) - quantile_y_vals = [ - float(np.quantile([curve.lookup(x_val) for curve in curves], q=beta)) - for x_val in unique_x_vals - ] - quantile_curve = Curve( - x_vals=unique_x_vals.tolist(), # type: ignore - y_vals=quantile_y_vals, - ) - return quantile_curve - - -def cdf_of_curves_crossing_times( - curves: list[Curve], threshold: float -) -> Curve: - """Compute the cdf of crossing times of curves. - - Parameters - ---------- - curves : list [``experiment_base.Curve``] - Collection of curves to aggregate. - threshold : float - Value for which to find first crossing time. - - Returns - ------- - ``experiment_base.Curve`` - CDF of crossing times. - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(curves, list) or not all( - [isinstance(curve, Curve) for curve in curves] - ): - error_msg = "Curves must be a list of Curve objects." - raise TypeError(error_msg) - if not isinstance(threshold, (int, float)): - error_msg = "Threshold must be a float." - raise TypeError(error_msg) - - n_curves = len(curves) - crossing_times = [ - curve.compute_crossing_time(threshold) for curve in curves - ] - unique_x_vals = [ - 0, - *list( - np.unique( - [ - crossing_time - for crossing_time in crossing_times - if crossing_time < np.inf - ] - ) - ), - 1, - ] - cdf_y_vals = [ - sum(crossing_time <= x_val for crossing_time in crossing_times) - / n_curves - for x_val in unique_x_vals - ] - cdf_curve = Curve(x_vals=unique_x_vals, y_vals=cdf_y_vals) - return cdf_curve - - -def quantile_cross_jump( - curves: list[Curve], threshold: float, beta: float -) -> Curve: - """Compute a simple curve with a jump at the quantile of the crossing times. - - Parameters - ---------- - curves : list [``experiment_base.Curve``] - Collection of curves to aggregate. - threshold : float - Value for which to find first crossing time. - beta : float - Quantile level. - - Returns - ------- - ``experiment_base.Curve`` - Piecewise-constant curve with a jump at the quantile crossing time (if finite). - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(curves, list) or not all( - [isinstance(curve, Curve) for curve in curves] - ): - error_msg = "Curves must be a list of Curve objects." - raise TypeError(error_msg) - if not isinstance(threshold, (int, float)): - error_msg = "Threshold must be a float." - raise TypeError(error_msg) - if not isinstance(beta, (int, float)): - error_msg = "Beta must be a float." - raise TypeError(error_msg) - - solve_time_quantile = float( - np.quantile( - [ - curve.compute_crossing_time(threshold=threshold) - for curve in curves - ], - q=beta, - ) - ) - # Note: np.quantile will evaluate to np.nan if forced to interpolate - # between a finite and infinite value. These are rare cases. Since - # crossing times must be non-negative, the quantile should be mapped - # to positive infinity. - if solve_time_quantile == np.inf or np.isnan(solve_time_quantile): - return Curve(x_vals=[0, 1], y_vals=[0, 0]) - else: - return Curve(x_vals=[0, solve_time_quantile, 1], y_vals=[0, 1, 1]) - - -def difference_of_curves(curve_1: Curve, curve_2: Curve) -> Curve: - """Compute the difference of two curves (Curve 1 - Curve 2). - - Parameters - ---------- - curve_1: ``experiment_base.Curve`` - First curve to take the difference of. - curve_2 : ``experiment_base.Curve`` - Curves to take the difference of. - - Returns - ------- - ``experiment_base.Curve`` - Difference of curves. - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(curve_1, Curve): - error_msg = "curve_1 must be a Curve object." - raise TypeError(error_msg) - if not isinstance(curve_2, Curve): - error_msg = "curve_2 must be a Curve object." - raise TypeError(error_msg) - - unique_x_vals_np = np.unique(curve_1.x_vals + curve_2.x_vals) - unique_x_vals = [float(x_val) for x_val in unique_x_vals_np] - difference_y_vals = [ - (curve_1.lookup(x_val) - curve_2.lookup(x_val)) - for x_val in unique_x_vals - ] - difference_curve = Curve(x_vals=unique_x_vals, y_vals=difference_y_vals) - return difference_curve - - -def max_difference_of_curves(curve_1: Curve, curve_2: Curve) -> float: - """Compute the maximum difference of two curves (Curve 1 - Curve 2). - - Parameters - ---------- - curve_1: ``experiment_base.Curve`` - First curve to take the difference of. - curve_2 : ``experiment_base.Curve`` - Curves to take the difference of. - - Returns - ------- - float - Maximum difference of curves. - - Raises - ------ - TypeError - - """ - # Type checking - if not isinstance(curve_1, Curve): - error_msg = "curve_1 must be a Curve object." - raise TypeError(error_msg) - if not isinstance(curve_2, Curve): - error_msg = "curve_2 must be a Curve object." - raise TypeError(error_msg) - - difference_curve = difference_of_curves(curve_1, curve_2) - max_diff = max(difference_curve.y_vals) - return max_diff +# Setup the experiment directory +SIMOPT_TOPLEVEL = Path(__file__).resolve().parent.parent +EXPERIMENT_DIR = SIMOPT_TOPLEVEL / "experiments" / time.strftime("%Y-%m-%d_%H-%M-%S") +# Make sure the experiment directory gets created +# TODO: move this into __init__ class ProblemSolver: - """Base class for running one solver on one problem. - - Attributes - ---------- - solver : ``base.Solver`` - Simulation-optimization solver. - problem : ``base.Problem`` - Simulation-optimization problem. - n_macroreps : int - Number of macroreplications run. - file_name_path : str - Path of .pickle file for saving ``experiment_base.ProblemSolver`` object. - all_recommended_xs : list [list [tuple]] - Sequences of recommended solutions from each macroreplication. - all_intermediate_budgets : list [list] - Sequences of intermediate budgets from each macroreplication. - timings : list [float] - Runtimes (in seconds) for each macroreplication. - n_postreps : int - Number of postreplications to take at each recommended solution. - crn_across_budget : bool - True if CRN used for post-replications at solutions recommended at - different times, otherwise False. - crn_across_macroreps : bool - True if CRN used for post-replications at solutions recommended on - different macroreplications, otherwise False. - all_post_replicates : list [list [list]] - All post-replicates from all solutions from all macroreplications. - all_est_objectives : numpy array [numpy array] - Estimated objective values of all solutions from all macroreplications. - n_postreps_init_opt : int - Number of postreplications to take at initial solution (x0) and - optimal solution (x*). - crn_across_init_opt : bool - True if CRN used for post-replications at solutions x0 and x*, otherwise False. - x0 : tuple - Initial solution (x0). - x0_postreps : list - Post-replicates at x0. - xstar : tuple - Proxy for optimal solution (x*). - xstar_postreps : list - Post-replicates at x*. - objective_curves : list [``experiment_base.Curve``] - Curves of estimated objective function values, - one for each macroreplication. - progress_curves : list [``experiment_base.Curve``] - Progress curves, one for each macroreplication. - - Parameters - ---------- - solver_name : str, optional - Name of solver. - problem_name : str, optional - Name of problem. - solver_rename : str, optional - User-specified name for solver. - problem_rename : str, optional - User-specified name for problem. - solver : ``base.Solver``, optional - Simulation-optimization solver. - problem : ``base.Problem``, optional - Simulation-optimization problem. - solver_fixed_factors : dict, optional - Dictionary of user-specified solver factors. - problem_fixed_factors : dict, optional - Dictionary of user-specified problem factors. - model_fixed_factors : dict, optional - Dictionary of user-specified model factors. - file_name_path : str | os.PathLike, optional - Path of .pickle file for saving ``experiment_base.ProblemSolver`` objects. - create_pickle : bool, optional - True if creating pickle file to store ProblemSolver object, False otherwise. - - """ + """Base class for running one solver on one problem.""" @property def solver(self) -> Solver: @@ -658,12 +79,12 @@ def n_macroreps(self, n_macroreps: int) -> None: self.__n_macroreps = n_macroreps @property - def file_name_path(self) -> str | os.PathLike: - """Path of .pickle file for saving ``experiment_base.ProblemSolver`` object.""" + def file_name_path(self) -> Path: + """Path of .pickle file for saving ProblemSolver object.""" return self.__file_name_path @file_name_path.setter - def file_name_path(self, file_name_path: str | os.PathLike) -> None: + def file_name_path(self, file_name_path: Path) -> None: self.__file_name_path = file_name_path @property @@ -681,9 +102,7 @@ def all_intermediate_budgets(self) -> list[list]: return self.__all_intermediate_budgets @all_intermediate_budgets.setter - def all_intermediate_budgets( - self, all_intermediate_budgets: list[list] - ) -> None: + def all_intermediate_budgets(self, all_intermediate_budgets: list[list]) -> None: self.__all_intermediate_budgets = all_intermediate_budgets @property @@ -706,7 +125,7 @@ def n_postreps(self, n_postreps: int) -> None: @property def crn_across_budget(self) -> bool: - """True if CRN used for post-replications at solutions recommended at different times, otherwise False.""" + """Whether CRN is used across solutions recommended at different times.""" return self.__crn_across_budget @crn_across_budget.setter @@ -715,7 +134,7 @@ def crn_across_budget(self, crn_across_budget: bool) -> None: @property def crn_across_macroreps(self) -> bool: - """True if CRN used for post-replications at solutions recommended on different macroreplications, otherwise False.""" + """Whether CRN is used across solutions from different macroreplications.""" return self.__crn_across_macroreps @crn_across_macroreps.setter @@ -728,9 +147,7 @@ def all_post_replicates(self) -> list[list[list]]: return self.__all_post_replicates @all_post_replicates.setter - def all_post_replicates( - self, all_post_replicates: list[list[list]] - ) -> None: + def all_post_replicates(self, all_post_replicates: list[list[list]]) -> None: self.__all_post_replicates = all_post_replicates @property @@ -744,7 +161,7 @@ def all_est_objectives(self, all_est_objectives: list[list[float]]) -> None: @property def n_postreps_init_opt(self) -> int: - """Number of postreps to take at initial solution (x0) and optimal solution (x*).""" + """Number of postreplications at initial (x0) and optimal (x*) solutions.""" return self.__n_postreps_init_opt @n_postreps_init_opt.setter @@ -753,7 +170,7 @@ def n_postreps_init_opt(self, n_postreps_init_opt: int) -> None: @property def crn_across_init_opt(self) -> bool: - """True if CRN used for post-replications at solutions x0 and x*, otherwise False.""" + """Whether CRN is used for postreplications at x0 and x* solutions.""" return self.__crn_across_init_opt @crn_across_init_opt.setter @@ -798,7 +215,7 @@ def xstar_postreps(self, xstar_postreps: list) -> None: @property def objective_curves(self) -> list[Curve]: - """Curves of estimated objective function values, one for each macroreplication.""" + """Estimated objective function curves, one per macroreplication.""" return self.__objective_curves @objective_curves.setter @@ -852,45 +269,28 @@ def __init__( solver_fixed_factors: dict | None = None, problem_fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, - file_name_path: str | os.PathLike | None = None, + file_name_path: Path | str | None = None, create_pickle: bool = True, ) -> None: - """Create a ProblemSolver object. - - There are two ways to create a ProblemSolver object: - 1. Provide the names of the solver and problem to look up in ``directory.py``. - 2. Provide the solver and problem objects to pair. - - Parameters - ---------- - solver_name : str, optional - Name of solver. - problem_name : str, optional - Name of problem. - solver_rename : str, optional - User-specified name for solver. - problem_rename : str, optional - User-specified name for problem. - solver : ``base.Solver``, optional - Simulation-optimization solver. - problem : ``base.Problem``, optional - Simulation-optimization problem. - solver_fixed_factors : dict, optional - Dictionary of user-specified solver factors. - problem_fixed_factors : dict, optional - Dictionary of user-specified problem factors. - model_fixed_factors : dict, optional - Dictionary of user-specified model factors. - file_name_path : str | os.PathLike, optional - Path of .pickle file for saving ``experiment_base.ProblemSolver`` objects. - create_pickle : bool, optional - True if creating pickle file to store ProblemSolver object, False otherwise. - - Raises - ------ - TypeError - ValueError - + """Initializes a ProblemSolver object. + + You can either: + 1. Provide solver and problem names to look them up via `directory.py`, or + 2. Provide solver and problem objects directly. + + Args: + solver_name (str, optional): Name of the solver. + problem_name (str, optional): Name of the problem. + solver_rename (str, optional): User-defined name for the solver. + problem_rename (str, optional): User-defined name for the problem. + solver (Solver, optional): Simulation-optimization solver object. + problem (Problem, optional): Simulation-optimization problem object. + solver_fixed_factors (dict, optional): Fixed solver parameters. + problem_fixed_factors (dict, optional): Fixed problem parameters. + model_fixed_factors (dict, optional): Fixed model parameters. + file_name_path (Path | str, optional): Path to save a pickled ProblemSolver + object. + create_pickle (bool, optional): Whether to save the object as a pickle file. """ # Default arguments if solver_fixed_factors is None: @@ -899,40 +299,10 @@ def __init__( problem_fixed_factors = {} if model_fixed_factors is None: model_fixed_factors = {} - # Type checking - if not isinstance(solver_name, (str, type(None))): - error_msg = "Solver name must be a string or None." - raise TypeError(error_msg) - if not isinstance(problem_name, (str, type(None))): - error_msg = "Problem name must be a string or None." - raise TypeError(error_msg) - if not isinstance(solver_rename, (str, type(None))): - error_msg = "Solver rename must be a string or None." - raise TypeError(error_msg) - if not isinstance(problem_rename, (str, type(None))): - error_msg = "Problem rename must be a string or None." - raise TypeError(error_msg) - if not isinstance(solver, (Solver, type(None))): - error_msg = "Solver must be a Solver object or None." - raise TypeError(error_msg) - if not isinstance(problem, (Problem, type(None))): - error_msg = "Problem must be a Problem object or None." - raise TypeError(error_msg) - if not isinstance(solver_fixed_factors, dict): - error_msg = "Solver fixed factors must be a dictionary or None." - raise TypeError(error_msg) - if not isinstance(problem_fixed_factors, dict): - error_msg = "Problem fixed factors must be a dictionary or None." - raise TypeError(error_msg) - if not isinstance(model_fixed_factors, dict): - error_msg = "Model fixed factors must be a dictionary or None." - raise TypeError(error_msg) - if not isinstance(file_name_path, (str, os.PathLike, type(None))): - error_msg = "File name path must be a string or None." - raise TypeError(error_msg) - if not isinstance(create_pickle, bool): - error_msg = "Create pickle must be a boolean." - raise TypeError(error_msg) + + # Resolve file name path + if file_name_path is not None: + file_name_path = resolve_file_path(file_name_path, directory=EXPERIMENT_DIR) # Initialize values self.create_pickle = create_pickle @@ -946,7 +316,9 @@ def __init__( self.solver = solver else: # Method 1 if solver_name is None: - error_msg = "Solver name must be provided if solver object is not provided." + error_msg = ( + "Solver name must be provided if solver object is not provided." + ) raise ValueError(error_msg) if solver_name not in solver_directory: error_msg = "Solver name not found in solver directory." @@ -966,7 +338,9 @@ def __init__( self.problem = problem else: # Method #1 if problem_name is None: - error_msg = "Problem name must be provided if problem object is not provided." + error_msg = ( + "Problem name must be provided if problem object is not provided." + ) raise ValueError(error_msg) if problem_name not in problem_directory: error_msg = "Problem name not found in problem directory." @@ -983,24 +357,23 @@ def __init__( self.problem.name = problem_rename # Initialize file path. - if file_name_path is None: - self.file_name_path = os.path.join( - EXPERIMENT_DIR, - f"{self.solver.name}_on_{self.problem.name}.pickle", - ) + if not isinstance(file_name_path, Path): + if file_name_path is None: + file_name_path_str = f"{self.solver.name}_on_{self.problem.name}.pickle" + self.file_name_path = EXPERIMENT_DIR / file_name_path_str else: self.file_name_path = file_name_path + # Make sure the experiment directory exists + EXPERIMENT_DIR.mkdir(parents=True, exist_ok=True) + # TODO: Convert this to throwing exceptions? # TODO: Convert this functionality to run automatically def check_compatibility(self) -> str: """Check whether the experiment's solver and problem are compatible. - Returns - ------- - str - Error message in the event problem and solver are incompatible. - + Returns: + str: Error message in the event problem and solver are incompatible. """ # make a string builder error_messages = [] @@ -1018,13 +391,13 @@ def check_compatibility(self) -> str: error_message = "Solver cannot solve a single-objective problem" error_messages.append(error_message) # Check constraint types. - if ( - self.solver.constraint_type.value - < self.problem.constraint_type.value - ): + if self.solver.constraint_type.value < self.problem.constraint_type.value: solver_str = self.solver.constraint_type.name.lower() problem_str = self.problem.constraint_type.name.lower() - error_message = f"Solver can handle {solver_str} constraints, but problem has {problem_str} constraints." + error_message = ( + f"Solver can handle {solver_str} constraints, " + f"but problem has {problem_str} constraints." + ) error_messages.append(error_message) # Check variable types. if ( @@ -1032,57 +405,54 @@ def check_compatibility(self) -> str: and self.problem.variable_type != VariableType.DISCRETE ): problem_type = self.problem.variable_type.name.lower() - error_message = f"Solver is for discrete variables but problem variables are {problem_type}." + error_message = ( + "Solver is for discrete variables, " + f"but problem variables are {problem_type}." + ) error_messages.append(error_message) elif ( self.solver.variable_type == VariableType.CONTINUOUS and self.problem.variable_type != VariableType.CONTINUOUS ): problem_type = self.problem.variable_type.name.lower() - error_message = f"Solver is for continuous variables but problem variables are {problem_type}." + error_message = ( + "Solver is for continuous variables, " + f"but problem variables are {problem_type}." + ) error_messages.append(error_message) # Check for existence of gradient estimates. if self.solver.gradient_needed and not self.problem.gradient_available: - error_message = "Solver requires gradient estimates but problem does not have them." + error_message = ( + "Solver requires gradient estimates but problem does not have them." + ) error_messages.append(error_message) # Strip trailing newline character. - error_str = "\n".join(error_messages) - return error_str + return "\n".join(error_messages) def run(self, n_macroreps: int) -> None: - """Run n_macroreps of the solver on the problem. + """Runs the solver on the problem for a given number of macroreplications. - Notes - ----- - RNGs dedicated for random problem instances and temporarily unused. - Under development. + Note: + RNGs for random problem instances are reserved but currently unused. + This method is under development. - Parameters - ---------- - n_macroreps : int - Number of macroreplications of the solver to run on the problem. - - Raises - ------ - TypeError - ValueError + Args: + n_macroreps (int): Number of macroreplications to run. + Raises: + ValueError: If `n_macroreps` is not positive. """ - # Type checking - if not isinstance(n_macroreps, int): - error_msg = "Number of macroreplications must be an integer." - raise TypeError(error_msg) + # Local Imports + from functools import partial + from multiprocessing import Pool + # Value checking if n_macroreps <= 0: error_msg = "Number of macroreplications must be positive." raise ValueError(error_msg) - print( - "Running Solver", - self.solver.name, - "on Problem", - self.problem.name + ".", - ) + msg = f"Running Solver {self.solver.name} on Problem {self.problem.name}." + logging.info(msg) # Initialize variables self.n_macroreps = n_macroreps @@ -1108,28 +478,29 @@ def run(self, n_macroreps: int) -> None: # Start a timer function_start = time.time() - print("Starting macroreplications in parallel") - with Pool() as process_pool: - # Start the macroreplications in parallel (async) - result = process_pool.map_async( - self.run_multithread, range(n_macroreps) - ) - # Wait for the results to be returned (or 1 second) - while not result.ready(): - # Update status bar here - result.wait(1) + logging.debug("Starting macroreplications") - print( - f"Finished running {n_macroreps} macroreplications in {round(time.time() - function_start, 3)} seconds." + num_processes = min(n_macroreps, os.cpu_count() or 1) + with Pool(num_processes) as process_pool: + # Start the macroreplications in parallel (async) + run_multithread_partial = partial( + self.run_multithread, solver=self.solver, problem=self.problem ) - - # Grab all the data out of the result - for mrep in range(n_macroreps): - ( - self.all_recommended_xs[mrep], - self.all_intermediate_budgets[mrep], - self.timings[mrep], - ) = result.get()[mrep] + for num_completed, ( + mrep, + recommended_xs, + intermediate_budgets, + timing, + ) in enumerate( + process_pool.imap_unordered(run_multithread_partial, range(n_macroreps)) + ): + self.all_recommended_xs[mrep] = recommended_xs + self.all_intermediate_budgets[mrep] = intermediate_budgets + self.timings[mrep] = timing + self.num_completed = num_completed + 1 + + runtime = round(time.time() - function_start, 3) + logging.info(f"Finished running {n_macroreps} mreps in {runtime} seconds.") self.has_run = True self.has_postreplicated = False @@ -1137,83 +508,87 @@ def run(self, n_macroreps: int) -> None: # Save ProblemSolver object to .pickle file if specified. if self.create_pickle: - file_name = os.path.basename(self.file_name_path) + file_name = self.file_name_path.name self.record_experiment_results(file_name=file_name) - def run_multithread(self, mrep: int) -> tuple: - """Run a single macroreplication of the solver on the problem. - - Parameters - ---------- - mrep : int - Index of the macroreplication. + def run_multithread(self, mrep: int, solver: Solver, problem: Problem) -> tuple: + """Runs one macroreplication of the solver on the problem. - Returns - ------- - tuple - Tuple of recommended solutions, intermediate budgets, and runtime. + Args: + mrep (int): Index of the macroreplication. + solver (Solver): The simulation-optimization solver to run. + problem (Problem): The problem to solve. - Raises - ------ - TypeError - ValueError + Returns: + tuple: A tuple containing: + - int: Macroreplication index. + - list: Recommended solutions. + - list: Intermediate budgets. + - float: Runtime for the macroreplication. + Raises: + ValueError: If `mrep` is negative. """ - # Type checking - if not isinstance(mrep, int): - error_msg = "Macroreplication index must be an integer." - raise TypeError(error_msg) # Value checking if mrep < 0: error_msg = "Macroreplication index must be non-negative." raise ValueError(error_msg) - print( - f"Macroreplication {mrep + 1}: Starting Solver {self.solver.name} on Problem {self.problem.name}." + logging.debug( + f"Macroreplication {mrep + 1}: " + f"Starting Solver {solver.name} on Problem {problem.name}." ) # Create, initialize, and attach RNGs used for simulating solutions. progenitor_rngs = [ MRG32k3a(s_ss_sss_index=[mrep + 3, ss, 0]) - for ss in range(self.problem.model.n_rngs) + for ss in range(problem.model.n_rngs) ] # Create a new set of RNGs for the solver based on the current macroreplication. - # Tried re-using the progentior RNGs, but we need to match the number needed by the solver, not the problem + # Tried re-using the progentior RNGs, but we need to match the number needed by + # the solver, not the problem solver_rngs = [ MRG32k3a( s_ss_sss_index=[ mrep + 3, - self.problem.model.n_rngs + rng_index, + problem.model.n_rngs + rng_index, 0, ] ) - for rng_index in range(len(self.solver.rng_list)) + for rng_index in range(len(solver.rng_list)) ] # Set progenitor_rngs and rng_list for solver. - self.solver.solution_progenitor_rngs = progenitor_rngs - self.solver.rng_list = solver_rngs + solver.solution_progenitor_rngs = progenitor_rngs + solver.rng_list = solver_rngs - # print([rng.s_ss_sss_index for rng in progenitor_rngs]) + # logging.debug([rng.s_ss_sss_index for rng in progenitor_rngs]) # Run the solver on the problem. tic = time.perf_counter() - recommended_solns, intermediate_budgets = self.solver.solve( - problem=self.problem - ) + recommended_solns, intermediate_budgets = solver.solve(problem=problem) toc = time.perf_counter() runtime = toc - tic - print( - f"Macroreplication {mrep + 1}: Finished Solver {self.solver.name} on Problem {self.problem.name} in {runtime:0.4f} seconds." + logging.debug( + f"Macroreplication {mrep + 1}: " + f"Finished Solver {solver.name} on Problem {problem.name} " + f"in {runtime:0.4f} seconds." ) # Trim the recommended solutions and intermediate budgets recommended_solns, intermediate_budgets = trim_solver_results( - problem=self.problem, + problem=problem, recommended_solutions=recommended_solns, intermediate_budgets=intermediate_budgets, ) + # Sometimes we end up with numpy scalar values in the solutions, + # so we convert them to Python scalars. This is especially problematic + # when trying to dump the solutions to human-readable files as numpy + # scalars just spit out binary data. + # TODO: figure out where numpy scalars are coming from and fix it + solutions = [tuple([float(x) for x in soln.x]) for soln in recommended_solns] # Return tuple (rec_solns, int_budgets, runtime) return ( - [solution.x for solution in recommended_solns], + mrep, + solutions, intermediate_budgets, runtime, ) @@ -1224,42 +599,29 @@ def post_replicate( crn_across_budget: bool = True, crn_across_macroreps: bool = False, ) -> None: - """Run postreplications at solutions recommended by the solver. - - Parameters - ---------- - n_postreps : int - Number of postreplications to take at each recommended solution. - crn_across_budget : bool, default=True - True if CRN used for post-replications at solutions recommended at different times, - otherwise False. - crn_across_macroreps : bool, default=False - True if CRN used for post-replications at solutions recommended on different - macroreplications, otherwise False. - - Raises - ------ - TypeError - ValueError + """Runs postreplications at the solver's recommended solutions. + + Args: + n_postreps (int): Number of postreplications at each recommended solution. + crn_across_budget (bool, optional): If True, use CRN across solutions from + different time budgets. Defaults to True. + crn_across_macroreps (bool, optional): If True, use CRN across solutions + from different macroreplications. Defaults to False. + Raises: + ValueError: If `n_postreps` is not positive. """ - # Type checking - if not isinstance(n_postreps, int): - error_msg = "Number of postreplications must be an integer." - raise TypeError(error_msg) - if not isinstance(crn_across_budget, bool): - error_msg = "CRN across budget must be a boolean." - raise TypeError(error_msg) - if not isinstance(crn_across_macroreps, bool): - error_msg = "CRN across macroreplications must be a boolean." - raise TypeError(error_msg) + # Local Imports + from multiprocessing import Pool + # Value checking if n_postreps <= 0: error_msg = "Number of postreplications must be positive." raise ValueError(error_msg) - print( - f"Setting up {n_postreps} postreplications for {self.n_macroreps} macroreplications of {self.solver.name} on {self.problem.name}." + logging.debug( + f"Setting up {n_postreps} postreplications for {self.n_macroreps} mreps of " + f"{self.solver.name} on {self.problem.name}." ) self.n_postreps = n_postreps @@ -1273,91 +635,72 @@ def post_replicate( ) self.timings = [0.0 for _ in range(self.n_macroreps)] - self.function_start = time.time() - - print("Starting postreplications in parallel") - with Pool() as process_pool: - # Start the macroreplications in parallel (async) - result = process_pool.map_async( - self.post_replicate_multithread, range(self.n_macroreps) - ) - # Wait for the results to be returned (or 1 second) - while not result.ready(): - # Update status bar here - result.wait(1) + function_start = time.time() - # Grab all the data out of the result - for mrep in range(self.n_macroreps): - self.all_post_replicates[mrep], self.timings[mrep] = ( - result.get()[mrep] + logging.info("Starting postreplications") + num_processes = min(self.n_macroreps, os.cpu_count() or 1) + with Pool(num_processes) as process_pool: + for num_completed, (mrep, post_rep, timing) in enumerate( + process_pool.imap_unordered( + self.post_replicate_multithread, range(self.n_macroreps) ) + ): + self.all_post_replicates[mrep] = post_rep + self.timings[mrep] = timing + self.num_completed = num_completed + 1 - # # The all post replicates is tricky because it is a dictionary of lists of lists - # # We need to convert it to a list of lists of lists - # self.all_post_replicates = [self.all_post_replicates[i] for i in range(len(self.all_post_replicates.keys()))] # Store estimated objective for each macrorep for each budget. self.all_est_objectives = [ [ float(np.mean(self.all_post_replicates[mrep][budget_index])) - for budget_index in range( - len(self.all_intermediate_budgets[mrep]) - ) + for budget_index in range(len(self.all_intermediate_budgets[mrep])) ] for mrep in range(self.n_macroreps) ] - print( - f"Finished running {self.n_macroreps} postreplications in {round(time.time() - self.function_start, 3)} seconds." - ) - # Delete stuff we don't need to save - del self.function_start + runtime = round(time.time() - function_start, 3) + logging.info( + f"Finished running {self.n_macroreps} postreplications " + f"in {runtime} seconds." + ) self.has_postreplicated = True self.has_postnormalized = False # Save ProblemSolver object to .pickle file if specified. if self.create_pickle: - file_name = os.path.basename(self.file_name_path) + file_name = self.file_name_path.name self.record_experiment_results(file_name=file_name) def post_replicate_multithread(self, mrep: int) -> tuple: - """Run postreplications at solutions recommended by the solver. - - Parameters - ---------- - mrep : int - Index of the macroreplication. + """Runs postreplications for a given macroreplication's recommended solutions. - Returns - ------- - tuple - Tuple of post-replicates and runtime. + Args: + mrep (int): Index of the macroreplication. - Raises - ------ - TypeError - ValueError + Returns: + tuple: A tuple containing: + - int: Macroreplication index. + - list: Postreplicates for each recommended solution. + - float: Runtime for the macroreplication. + Raises: + ValueError: If `mrep` is negative. """ - # Type checking - if not isinstance(mrep, int): - error_msg = "Macroreplication index must be an integer." - raise TypeError(error_msg) # Value checking if mrep < 0: error_msg = "Macroreplication index must be non-negative." raise ValueError(error_msg) - print( - f"Macroreplication {mrep + 1}: Starting postreplications for {self.solver.name} on {self.problem.name}." + logging.debug( + f"Macroreplication {mrep + 1}: Starting postreplications for " + f"{self.solver.name} on {self.problem.name}." ) # Create RNG list for the macroreplication. if self.crn_across_macroreps: # Use the same RNGs for all macroreps. baseline_rngs = [ - MRG32k3a( - s_ss_sss_index=[0, self.problem.model.n_rngs + rng_index, 0] - ) + MRG32k3a(s_ss_sss_index=[0, self.problem.model.n_rngs + rng_index, 0]) for rng_index in range(self.problem.model.n_rngs) ] else: @@ -1387,51 +730,31 @@ def post_replicate_multithread(self, mrep: int) -> tuple: fresh_soln.attach_rngs(rng_list=baseline_rngs, copy=True) else: fresh_soln.attach_rngs(rng_list=baseline_rngs, copy=False) - self.problem.simulate( - solution=fresh_soln, num_macroreps=self.n_postreps - ) + self.problem.simulate(solution=fresh_soln, num_macroreps=self.n_postreps) # Store results post_replicates.append( list(fresh_soln.objectives[: fresh_soln.n_reps][:, 0]) ) # 0 <- assuming only one objective toc = time.perf_counter() runtime = toc - tic - print(f"\t{mrep + 1}: Finished in {round(runtime, 3)} seconds") + logging.debug(f"\t{mrep + 1}: Finished in {round(runtime, 3)} seconds") - # Return tuple (post_replicates, runtime) - return (post_replicates, runtime) + return (mrep, post_replicates, runtime) def bootstrap_sample( self, bootstrap_rng: MRG32k3a, normalize: bool = True ) -> list[Curve]: - """Generate a bootstrap sample of estimated objective curves or estimated progress curves. - - Parameters - ---------- - bootstrap_rng : ``mrg32k3a.mrg32k3a.MRG32k3a`` - Random number generator to use for bootstrapping. - normalize : bool, default=True - True if progress curves are to be normalized w.r.t. - optimality gaps, otherwise False. + """Generates a bootstrap sample of estimated objective or progress curves. - Returns - ------- - bootstrap_curves : list [``experiment_base.Curve``] - Bootstrapped estimated objective curves or estimated progress curves of all solutions from all bootstrapped macroreplications. - - Raises - ------ - TypeError + Args: + bootstrap_rng (MRG32k3a): Random number generator used for bootstrapping. + normalize (bool, optional): If True, normalize progress curves by optimality + gaps. Defaults to True. + Returns: + list[Curve]: Bootstrapped objective or progress curves from all + macroreplications. """ - # Type checking - if not isinstance(bootstrap_rng, MRG32k3a): - error_msg = "Bootstrap RNG must be an MRG32k3a object." - raise TypeError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) - bootstrap_curves = [] # Uniformly resample M macroreplications (with replacement) from 0, 1, ..., M-1. # Subsubstream 0: reserved for this outer-level bootstrapping. @@ -1451,7 +774,8 @@ def bootstrap_sample( [self.x0_postreps[postrep] for postrep in bs_postrep_idxs] ) # Reset subsubstream if using CRN across budgets. - # This means the same postreplication indices will be used for resampling at x0 and x*. + # This means the same postreplication indices will be used for resampling at + # x0 and x*. if self.crn_across_init_opt: bootstrap_rng.reset_subsubstream() # Bootstrap sample postreplicates at reference optimal solution x*. @@ -1493,9 +817,7 @@ def bootstrap_sample( est_objectives.append( np.mean( [ - self.all_post_replicates[mrep][budget][ - postrep - ] + self.all_post_replicates[mrep][budget][postrep] for postrep in bs_postrep_idxs ] ) @@ -1507,8 +829,7 @@ def bootstrap_sample( for budget in self.all_intermediate_budgets[mrep] ] norm_est_objectives = [ - (est_objective - bs_optimal_obj_val) - / bs_initial_opt_gap + (est_objective - bs_optimal_obj_val) / bs_initial_opt_gap for est_objective in est_objectives ] new_progress_curve = Curve( @@ -1537,7 +858,8 @@ def bootstrap_sample( est_objectives.append(bs_optimal_obj_val) # ... else solution other than x0 or x*. else: - # Uniformly resample N postreps (with replacement) from 0, 1, ..., N-1. + # Uniformly resample N postreps (with replacement) + # from 0, 1, ..., N-1. bs_postrep_idxs = bootstrap_rng.choices( range(self.n_postreps), k=self.n_postreps ) @@ -1545,9 +867,7 @@ def bootstrap_sample( est_objectives.append( np.mean( [ - self.all_post_replicates[mrep][budget][ - postrep - ] + self.all_post_replicates[mrep][budget][postrep] for postrep in bs_postrep_idxs ] ) @@ -1570,8 +890,7 @@ def bootstrap_sample( for budget in self.all_intermediate_budgets[mrep] ] norm_est_objectives = [ - (est_objective - bs_optimal_obj_val) - / bs_initial_opt_gap + (est_objective - bs_optimal_obj_val) / bs_initial_opt_gap for est_objective in est_objectives ] new_progress_curve = Curve( @@ -1587,67 +906,39 @@ def bootstrap_sample( bootstrap_curves.append(new_objective_curve) return bootstrap_curves - def record_experiment_results(self, file_name: os.PathLike | str) -> None: - """Save ``experiment_base.ProblemSolver`` object to .pickle file. - - Parameters - ---------- - file_name : str - Name of .pickle file for saving ``experiment_base.ProblemSolver`` objects. - File name is appended to the ``EXPERIMENT_DIR`` directory path. - - Raises - ------ - FileNotFoundError + def record_experiment_results(self, file_name: str) -> None: + """Saves the ProblemSolver object to a .pickle file. + Args: + file_name (str): Name of the pickle file. It is saved under the + EXPERIMENT_DIR path. """ - # Type checking - if not isinstance(file_name, (str, os.PathLike)): - error_msg = "File name must be a string or os.PathLike object." - raise TypeError(error_msg) + file_path = EXPERIMENT_DIR / file_name + folder_name = file_path.parent - file_path = os.path.join(EXPERIMENT_DIR, file_name) - folder_name = os.path.dirname(file_path) - - print(f"File Name: {file_name}") - print(f"Folder Name: {folder_name}") - print(f"File Path: {file_path}") + logging.debug(f"Saving ProblemSolver object to {file_path}") # Create the directory if it does not exist. - if not os.path.exists(folder_name): - os.makedirs(folder_name) + folder_name.mkdir(parents=True, exist_ok=True) # Delete the file if it already exists. - elif os.path.exists(file_path): - os.remove(file_path) + if file_path.exists(): + file_path.unlink() # Create and dump the object to the file - with open(file_path, "xb") as file: + with file_path.open("xb") as file: pickle.dump(self, file, pickle.HIGHEST_PROTOCOL) - def log_experiment_results(self, print_solutions: bool = True) -> None: - """Create readable .txt file from a problem-solver pair's .pickle file. - - Parameters - ---------- - print_solutions : bool, optional - True if recommended solutions are to be printed in the .txt file, otherwise False. + logging.info(f"Saved experiment results to {file_path}") - Raises - ------ - TypeError + def log_experiment_results(self, print_solutions: bool = True) -> None: + """Creates a readable .txt log file from a problem-solver pair's .pickle file. + Args: + print_solutions (bool, optional): If True, include recommended solutions in + the .txt file. Defaults to True. """ - # Type checking - if not isinstance(print_solutions, bool): - error_msg = "Print solutions must be a boolean." - raise TypeError(error_msg) - - if not os.path.exists(EXPERIMENT_DIR): - os.makedirs(EXPERIMENT_DIR) - results_filepath = os.path.join( - EXPERIMENT_DIR, "experiment_results.txt" - ) + results_file_path = EXPERIMENT_DIR / "experiment_results.txt" - with open(results_filepath, "w") as file: + with results_file_path.open("w") as file: # Title txt file with experiment information. file.write(str(self.file_name_path)) file.write("\n") @@ -1677,45 +968,57 @@ def log_experiment_results(self, print_solutions: bool = True) -> None: # If results have been postreplicated, list the number of post-replications. if self.has_postreplicated: file.write( - f"{self.n_postreps} postreplications were run at each recommended solution.\n\n" + f"{self.n_postreps} postreplications were run " + "at each recommended solution.\n\n" ) - # If post-normalized, state initial solution (x0) and proxy optimal solution (x_star) - # and how many replications were taken of them (n_postreps_init_opt). + # If post-normalized, state initial solution (x0) and + # proxy optimal solution (x_star) and how many replications + # were taken of them (n_postreps_init_opt). if self.has_postnormalized: + init_sol = tuple([round(x, 4) for x in self.x0]) + est_obj = round(np.mean(self.x0_postreps), 4) file.write( - f"The initial solution is {tuple([round(x, 4) for x in self.x0])}. Its estimated objective is {round(np.mean(self.x0_postreps), 4)}.\n" + f"The initial solution is {init_sol}. " + f"Its estimated objective is {est_obj}.\n" ) if self.xstar is None: file.write( - f"No proxy optimal solution was used. A proxy optimal objective function value of {self.problem.optimal_value} was provided.\n" + "No proxy optimal solution was used. " + "A proxy optimal objective function value of " + f"{self.problem.optimal_value} was provided.\n" ) else: + proxy_opt = tuple([round(x, 4) for x in self.xstar]) + est_obj = round(np.mean(self.xstar_postreps), 4) file.write( - f"The proxy optimal solution is {tuple([round(x, 4) for x in self.xstar])}. Its estimated objective is {round(np.mean(self.xstar_postreps), 4)}.\n" + f"The proxy optimal solution is {proxy_opt}. " + f"Its estimated objective is {est_obj}.\n" ) file.write( - f"{self.n_postreps_init_opt} postreplications were taken at x0 and x_star.\n\n" + f"{self.n_postreps_init_opt} postreplications were taken " + "at x0 and x_star.\n\n" ) - # Display recommended solution at each budget value for each macroreplication. + # Display recommended solution at each budget value for + # each macroreplication. file.write("Macroreplication Results:\n") for mrep in range(self.n_macroreps): file.write(f"\nMacroreplication {mrep + 1}:\n") - for budget in range(len(self.all_intermediate_budgets[mrep])): - file.write( - f"\tBudget: {round(self.all_intermediate_budgets[mrep][budget], 4)}" - ) + mrep_int_budgets = self.all_intermediate_budgets[mrep] + for budget in range(len(mrep_int_budgets)): + file.write(f"\tBudget: {round(mrep_int_budgets[budget], 4)}") # Optionally print solutions. if print_solutions: - file.write( - f"\tRecommended Solution: {tuple([round(x, 4) for x in self.all_recommended_xs[mrep][budget]])}" - ) + all_rec_xs = self.all_recommended_xs[mrep][budget] + rec_xs_tup = tuple([round(x, 4) for x in all_rec_xs]) + file.write(f"\tRecommended Solution: {rec_xs_tup}") # If postreplicated, add estimated objective function values. if self.has_postreplicated: - file.write( - f"\tEstimated Objective: {round(self.all_est_objectives[mrep][budget], 4)}\n" - ) - # file.write(f"\tThe time taken to complete this macroreplication was {round(self.timings[mrep], 2)} s.\n") - file.close() + est_obj = self.all_est_objectives[mrep][budget] + file.write(f"\tEstimated Objective: {round(est_obj, 4)}\n") + # file.write( + # "\tThe time taken to complete this macroreplication was " + # f"{round(self.timings[mrep], 2)} s.\n" + # ) def trim_solver_results( @@ -1723,50 +1026,18 @@ def trim_solver_results( recommended_solutions: list[Solution], intermediate_budgets: list[int], ) -> tuple[list[Solution], list[int]]: - """Trim solutions recommended by solver after problem's max budget. - - Parameters - ---------- - problem : ``base.Problem`` - Problem object on which the solver was run. - recommended_solutions : list [``base.Solution``] - Solutions recommended by the solver. - intermediate_budgets : list [int] - Intermediate budgets at which solver recommended different solutions. - - Returns - ------- - list [``base.Solution``] - Solutions recommended by the solver after trimming. - list [int] - Intermediate budgets at which solver recommended different solutions after trimming. - - Raises - ------ - TypeError + """Trims solver-recommended solutions beyond the problem's maximum budget. - """ - # Type checking - if not isinstance(problem, Problem): - error_msg = "Problem must be a Problem object." - raise TypeError(error_msg) - if not isinstance(recommended_solutions, list) or not all( - isinstance(solution, Solution) for solution in recommended_solutions - ): - error_msg = "Recommended solutions must be a list of Solution objects." - raise TypeError(error_msg) - if not isinstance(intermediate_budgets, list) or not all( - isinstance(budget, int) for budget in intermediate_budgets - ): - error_msg = "Intermediate budgets must be a list of integers." - if not isinstance(intermediate_budgets, list): - error_msg += f" Found {type(intermediate_budgets)}." - else: - error_msg += ( - f" Found {[type(budget) for budget in intermediate_budgets]}." - ) - raise TypeError(error_msg) + Args: + problem (Problem): The problem the solver was run on. + recommended_solutions (list[Solution]): Solutions recommended by the solver. + intermediate_budgets (list[int]): Budgets at which solutions were recommended. + Returns: + tuple: A tuple containing: + - list[Solution]: Trimmed list of recommended solutions. + - list[int]: Trimmed list of corresponding intermediate budgets. + """ # Remove solutions corresponding to intermediate budgets exceeding max budget. invalid_idxs = [ idx @@ -1785,36 +1056,22 @@ def trim_solver_results( return recommended_solutions, intermediate_budgets -def read_experiment_results(file_name_path: str | os.PathLike) -> ProblemSolver: - """Read in ``experiment_base.ProblemSolver`` object from .pickle file. +def read_experiment_results(file_name_path: Path | str) -> ProblemSolver: + """Reads a ProblemSolver object from a .pickle file. - Parameters - ---------- - file_name_path : str - Path of .pickle file for reading ``experiment_base.ProblemSolver`` object. + Args: + file_name_path (Path | str): Path to the .pickle file. - Returns - ------- - experiment : ``experiment_base.ProblemSolver`` - Problem-solver pair that has been run or has been post-processed. - - Raises - ------ - TypeError + Returns: + ProblemSolver: Loaded problem-solver pair that was previously run or + post-processed. + Raises: + ValueError: If the file does not exist. """ - # Type checking - if not isinstance(file_name_path, (str, os.PathLike)): - error_msg = "File name path must be a string or os.PathLike object." - raise TypeError(error_msg) - # Value checking - if not os.path.exists(file_name_path): - error_msg = f"File {file_name_path} does not exist." - raise ValueError(error_msg) # Change to FileNotFoundError? - - with open(file_name_path, "rb") as file: - experiment = pickle.load(file) - return experiment + file_name_path = resolve_file_path(file_name_path, EXPERIMENT_DIR) + with file_name_path.open("rb") as file: + return pickle.load(file) def post_normalize( @@ -1826,58 +1083,21 @@ def post_normalize( proxy_opt_x: tuple | None = None, create_pair_pickles: bool = False, ) -> None: - """Construct objective curves and (normalized) progress curves for a collection of experiments on a given problem. - - Parameters - ---------- - experiments : list [``experiment_base.ProblemSolver``] - Problem-solver pairs of different solvers on a common problem. - n_postreps_init_opt : int - Number of postreplications to take at initial x0 and optimal x*. - crn_across_init_opt : bool, default=True - True if CRN used for post-replications at solutions x0 and x*, otherwise False. - proxy_init_val : float, optional - Known objective function value of initial solution. - proxy_opt_val : float, optional - Proxy for or bound on optimal objective function value. - proxy_opt_x : tuple, optional - Proxy for optimal solution. - create_pair_pickles : bool, default = False - True if creating pickle files for each problem-solver pair, False otherwise. - - Raises - ------ - TypeError - Exception - + """Constructs objective and normalized progress curves for a set of experiments. + + Args: + experiments (list[ProblemSolver]): Problem-solver pairs for different solvers on + the same problem. + n_postreps_init_opt (int): Number of postreplications at initial (x0) and + optimal (x*) solutions. + crn_across_init_opt (bool, optional): If True, use CRN for postreplications at + x0 and x*. Defaults to True. + proxy_init_val (float, optional): Known objective value of the initial solution. + proxy_opt_val (float, optional): Proxy or bound for the optimal objective value. + proxy_opt_x (tuple, optional): Proxy for the optimal solution. + create_pair_pickles (bool, optional): If True, create a pickle file for each + problem-solver pair. Defaults to False. """ - # Type checking - if not isinstance(experiments, list) or not all( - isinstance(experiment, ProblemSolver) for experiment in experiments - ): - error_msg = "Experiments must be a list of ProblemSolver objects." - raise TypeError(error_msg) - if not isinstance(n_postreps_init_opt, int): - error_msg = ( - "Number of postreplications at x0 and x* must be an integer." - ) - raise TypeError(error_msg) - if not isinstance(crn_across_init_opt, bool): - error_msg = "CRN across x0 and x* must be a boolean." - raise TypeError(error_msg) - if not isinstance(proxy_init_val, (int, float, type(None))): - error_msg = "Proxy initial value must be a float or None." - raise TypeError(error_msg) - if not isinstance(proxy_opt_val, (int, float, type(None))): - error_msg = "Proxy optimal value must be a float or None." - raise TypeError(error_msg) - if not isinstance(proxy_opt_x, (tuple, type(None))): - error_msg = "Proxy optimal solution must be a tuple or None." - raise TypeError(error_msg) - if not isinstance(create_pair_pickles, bool): - error_msg = "Create pair pickles must be a boolean." - raise TypeError(error_msg) - # Check that all experiments have the same problem and same # post-experimental setup. ref_experiment = experiments[0] @@ -1888,21 +1108,35 @@ def post_normalize( raise Exception(error_msg) # Check if experiments have common number of macroreps. if experiment.n_macroreps != ref_experiment.n_macroreps: - error_msg = "At least two experiments have different numbers of macro-replications." + error_msg = ( + "At least two experiments have different numbers of macro-replications." + ) raise Exception(error_msg) - # Check if experiment has been post-replicated and with common number of postreps. + # Check if experiment has been post-replicated if not experiment.has_run: - error_msg = f"The experiment of {experiment.solver.name} on {experiment.problem.name} has not been run." + error_msg = ( + f"The experiment of {experiment.solver.name} on " + f"{experiment.problem.name} has not been run." + ) raise Exception(error_msg) - elif not experiment.has_postreplicated: - error_msg = f"The experiment of {experiment.solver.name} on {experiment.problem.name} has not been post-replicated." + if not experiment.has_postreplicated: + error_msg = ( + f"The experiment of {experiment.solver.name} on " + f"{experiment.problem.name} has not been post-replicated." + ) raise Exception(error_msg) - elif getattr(experiment, "n_postreps", None) != getattr( + # Check if experiments have common number of post-replications. + if getattr(experiment, "n_postreps", None) != getattr( ref_experiment, "n_postreps", None ): - error_msg = "At least two experiments have different numbers of post-replications.\nEstimation of optimal solution x* may be based on different numbers of post-replications." + error_msg = ( + "At least two experiments have different numbers of " + "post-replications.\n" + "Estimation of optimal solution x* may be based on different numbers " + "of post-replications." + ) raise Exception(error_msg) - print(f"Postnormalizing on Problem {ref_experiment.problem.name}.") + logging.info(f"Postnormalizing on Problem {ref_experiment.problem.name}.") # Take post-replications at common x0. # Create, initialize, and attach RNGs for model. # Stream 0: reserved for post-replications. @@ -1936,19 +1170,15 @@ def post_normalize( # objective function value. If deterministic (proxy for) f(x*), # create duplicate post-replicates to facilitate later bootstrapping. # If proxy for f(x*) is specified... - print("Finding f(x*)...") + fstar_log_msg = "Finding f(x*) using " if proxy_opt_val is not None: - if proxy_opt_x is None: - xstar = None - else: - xstar = ( - proxy_opt_x # Assuming the provided x is optimal in this case. - ) - print("\t...using provided proxy f(x*).") + # Assumes the provided x is optimal if provided + xstar = None if proxy_opt_x is None else proxy_opt_x + logging.info(fstar_log_msg + "provided proxy f(x*).") xstar_postreps = [proxy_opt_val] * n_postreps_init_opt # ...else if proxy for x* is specified... elif proxy_opt_x is not None: - print("\t...using provided proxy x*.") + logging.info(fstar_log_msg + "provided proxy x*.") xstar = proxy_opt_x # Take post-replications at xstar. opt_soln = Solution(xstar, ref_experiment.problem) @@ -1961,16 +1191,14 @@ def post_normalize( ) # 0 <- assuming only one objective # ...else if f(x*) is known... elif ref_experiment.problem.optimal_value is not None: - print("\t...using coded f(x*).") + logging.info(fstar_log_msg + "coded f(x*).") xstar = None # NOTE: optimal_value is a tuple. # Currently hard-coded for single objective case, i.e., optimal_value[0]. - xstar_postreps = [ - ref_experiment.problem.optimal_value - ] * n_postreps_init_opt + xstar_postreps = [ref_experiment.problem.optimal_value] * n_postreps_init_opt # ...else if x* is known... elif ref_experiment.problem.optimal_solution is not None: - print("\t...using coded x*.") + logging.info(fstar_log_msg + "using coded x*.") xstar = ref_experiment.problem.optimal_solution # Take post-replications at xstar. opt_soln = Solution(xstar, ref_experiment.problem) @@ -1984,7 +1212,9 @@ def post_normalize( # ...else determine x* empirically as estimated best solution # found by any solver on any macroreplication. else: - print("\t...using best postreplicated solution as proxy for x*.") + logging.info( + fstar_log_msg + "using best postreplicated solution as proxy for x*." + ) # TODO: Simplify this block of code. best_est_objectives = np.zeros(len(experiments)) for experiment_idx in range(len(experiments)): @@ -1995,9 +1225,7 @@ def post_normalize( experiment.problem.minmax[0] * np.array(experiment.all_est_objectives[mrep]) ) - best_est_objectives[experiment_idx] = np.max( - exp_best_est_objectives - ) + best_est_objectives[experiment_idx] = np.max(exp_best_est_objectives) best_experiment_idx = np.argmax(best_est_objectives) best_experiment = experiments[best_experiment_idx] best_exp_best_est_objectives = np.zeros(ref_experiment.n_macroreps) @@ -2024,7 +1252,8 @@ def post_normalize( # Compute signed initial optimality gap = f(x0) - f(x*). initial_obj_val = np.mean(x0_postreps) opt_obj_val = np.mean(xstar_postreps) - initial_opt_gap = initial_obj_val - opt_obj_val + initial_opt_gap = float(initial_obj_val - opt_obj_val) + initial_opt_gap = make_nonzero(initial_opt_gap, "initial_opt_gap") # Store x0 and x* info and compute progress curves for each ProblemSolver. for experiment in experiments: # DOUBLE-CHECK FOR SHALLOW COPY ISSUES. @@ -2040,58 +1269,42 @@ def post_normalize( experiment.progress_curves = [] for mrep in range(experiment.n_macroreps): est_objectives = [] + budgets = experiment.all_intermediate_budgets[mrep] # Substitute estimates at x0 and x* (based on N postreplicates) # with new estimates (based on L postreplicates). - for budget in range(len(experiment.all_intermediate_budgets[mrep])): - if experiment.all_recommended_xs[mrep][budget] == x0: + for budget in range(len(budgets)): + soln = experiment.all_recommended_xs[mrep][budget] + if np.equal(soln, x0).all(): est_objectives.append(np.mean(x0_postreps)) - elif experiment.all_recommended_xs[mrep][budget] == xstar: + # TODO: ensure xstar is not None. + elif np.equal(soln, xstar).all(): # type: ignore est_objectives.append(np.mean(xstar_postreps)) else: - est_objectives.append( - experiment.all_est_objectives[mrep][budget] - ) + est_objectives.append(experiment.all_est_objectives[mrep][budget]) experiment.objective_curves.append( Curve( - x_vals=experiment.all_intermediate_budgets[mrep], + x_vals=budgets, y_vals=est_objectives, ) ) # Normalize by initial optimality gap. - if initial_opt_gap == 0: - print( - "Warning: Divide by zero during post-normalization (initial_opt_gap is 0)." - ) - norm_est_objectives = [] - for est_objective in est_objectives: - est_diff = est_objective - opt_obj_val - # Follow IEEE 754 standard for division by zero. - if est_diff < 0: - norm_est_objectives.append(-np.inf) - elif est_diff > 0: - norm_est_objectives.append(np.inf) - else: - norm_est_objectives.append(np.nan) - else: - norm_est_objectives = [ - (est_objective - opt_obj_val) / initial_opt_gap - for est_objective in est_objectives - ] + norm_est_objectives = [ + (est_objective - opt_obj_val) / initial_opt_gap + for est_objective in est_objectives + ] frac_intermediate_budgets = [ budget / experiment.problem.factors["budget"] for budget in experiment.all_intermediate_budgets[mrep] ] experiment.progress_curves.append( - Curve( - x_vals=frac_intermediate_budgets, y_vals=norm_est_objectives - ) + Curve(x_vals=frac_intermediate_budgets, y_vals=norm_est_objectives) ) experiment.has_postnormalized = True # Save ProblemSolver object to .pickle file if specified. if create_pair_pickles: - file_name = os.path.basename(experiment.file_name_path) + file_name = experiment.file_name_path.name experiment.record_experiment_results(file_name=file_name) @@ -2100,65 +1313,28 @@ def bootstrap_sample_all( bootstrap_rng: MRG32k3a, normalize: bool = True, ) -> list[list[list[Curve]]]: - """Generate bootstrap samples of estimated progress curves (normalized and unnormalized) from a set of experiments. - - Parameters - ---------- - experiments : list [list [``experiment_base.ProblemSolver``]] - Problem-solver pairs of different solvers and/or problems. - bootstrap_rng : ``mrg32k3a.mrg32k3a.MRG32k3a`` - Random number generator to use for bootstrapping. - normalize : bool, default=True - True if progress curves are to be normalized w.r.t. optimality gaps, - otherwise False. - - Returns - ------- - list [list [list [``experiment_base.Curve``]]] - Bootstrapped estimated objective curves or estimated progress curves - of all solutions from all macroreplications. - - Raises - ------ - TypeError - + """Generates bootstrap samples of progress curves from multiple experiments. + + Args: + experiments (list[list[ProblemSolver]]): Grid of problem-solver pairs, where + each inner list corresponds to different problems for a given solver. + bootstrap_rng (MRG32k3a): Random number generator used for bootstrapping. + normalize (bool, optional): If True, normalize progress curves by optimality + gaps. Defaults to True. + + Returns: + list[list[list[Curve]]]: Bootstrapped progress or objective curves for all + solutions from all macroreplications, grouped by solver and problem. """ - # Type checking - if ( - not isinstance(experiments, list) - or not all( - isinstance(experiment_list, list) for experiment_list in experiments - ) - or not all( - [ - isinstance(experiment, ProblemSolver) - for experiment in experiment_list - ] - for experiment_list in experiments - ) - ): - error_msg = ( - "Experiments must be a list of lists of ProblemSolver objects." - ) - raise TypeError(error_msg) - if not isinstance(bootstrap_rng, MRG32k3a): - error_msg = "Bootstrap RNG must be an MRG32k3a object." - raise TypeError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) - n_solvers = len(experiments) n_problems = len(experiments[0]) - bootstrap_curves = [ - [[] for _ in range(n_problems)] for _ in range(n_solvers) - ] + bootstrap_curves = [[[] for _ in range(n_problems)] for _ in range(n_solvers)] # Obtain a bootstrap sample from each experiment. for solver_idx in range(n_solvers): for problem_idx in range(n_problems): experiment = experiments[solver_idx][problem_idx] - bootstrap_curves[solver_idx][problem_idx] = ( - experiment.bootstrap_sample(bootstrap_rng, normalize) + bootstrap_curves[solver_idx][problem_idx] = experiment.bootstrap_sample( + bootstrap_rng, normalize ) # Reset substream for next solver-problem pair. bootstrap_rng.reset_substream() @@ -2167,118 +1343,55 @@ def bootstrap_sample_all( return bootstrap_curves +class PlotType(Enum): + """Enum class for different types of plots and metrics.""" + + ALL = "all" + MEAN = "mean" + QUANTILE = "quantile" + AREA_MEAN = "area_mean" + AREA_STD_DEV = "area_std_dev" + SOLVE_TIME_QUANTILE = "solve_time_quantile" + SOLVE_TIME_CDF = "solve_time_cdf" + CDF_SOLVABILITY = "cdf_solvability" + QUANTILE_SOLVABILITY = "quantile_solvability" + DIFF_CDF_SOLVABILITY = "diff_cdf_solvability" + DIFF_QUANTILE_SOLVABILITY = "diff_quantile_solvability" + AREA = "area" + BOX = "box" + VIOLIN = "violin" + TERMINAL_SCATTER = "terminal_scatter" + + def bootstrap_procedure( experiments: list[list[ProblemSolver]], n_bootstraps: int, conf_level: float, - plot_type: Literal[ - "mean", - "quantile", - "area_mean", - "area_std_dev", - "solve_time_quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - ], + plot_type: PlotType, beta: float | None = None, solve_tol: float | None = None, estimator: float | Curve | None = None, normalize: bool = True, ) -> tuple[float, float] | tuple[Curve, Curve]: - """Obtain bootstrap sample and compute confidence intervals. - - Parameters - ---------- - experiments : list [list [``experiment_base.ProblemSolver``]] - Problem-solver pairs of different solvers and/or problems. - n_bootstraps : int - Number of times to generate a bootstrap sample of estimated progress curves. - conf_level : float - Confidence level for confidence intervals, i.e., 1-gamma; in (0, 1). - plot_type : str - "mean" : estimated mean progress curve; - - "quantile" : estimated beta quantile progress curve; - - "area_mean" : mean of area under progress curve; - - "area_std_dev" : standard deviation of area under progress curve; - - "solve_time_quantile" : beta quantile of solve time; - - "solve_time_cdf" : cdf of solve time; - - "cdf_solvability" : cdf solvability profile; - - "quantile_solvability" : quantile solvability profile; - - "diff_cdf_solvability" : difference of cdf solvability profiles; - - "diff_quantile_solvability" : difference of quantile solvability profiles. - beta : float, optional - Quantile to plot, e.g., beta quantile; in (0, 1). - solve_tol : float, optional - Relative optimality gap definining when a problem is solved; in (0, 1]. - estimator : float or ``experiment_base.Curve``, optional - Main estimator, e.g., mean convergence curve from an experiment. - normalize : bool, default=True - True if progress curves are to be normalized w.r.t. optimality gaps, otherwise False. - - Returns - ------- - float | ``experiment_base.Curve`` - Lower bound of bootstrap CI, as a float or curve. - float | ``experiment_base.Curve``] - Upper bound of bootstrap CI, as a float or curve. - - Raises - ------ - TypeError - ValueError - + """Performs bootstrapping and computes confidence intervals for progress curves. + + Args: + experiments (list[list[ProblemSolver]]): Grid of problem-solver pairs. + n_bootstraps (int): Number of bootstrap samples to generate. + conf_level (float): Confidence level for the interval (0 < conf_level < 1). + plot_type (PlotType): Type of plot/metric for which to compute the interval. + beta (float, optional): Quantile level (0 < beta < 1), used with some plot + types. + solve_tol (float, optional): Relative optimality gap that defines a "solved" + instance. + estimator (float or Curve, optional): Reference estimator for difference plot + types. + normalize (bool, optional): Whether to normalize progress curves. Defaults to + True. + + Returns: + tuple[float, float] or tuple[Curve, Curve]: Lower and upper bounds of the CI. """ - # Type checking - if ( - not isinstance(experiments, list) - or not all( - isinstance(experiment_list, list) for experiment_list in experiments - ) - or not all( - [ - isinstance(experiment, ProblemSolver) - for experiment in experiment_list - ] - for experiment_list in experiments - ) - ): - error_msg = ( - "Experiments must be a list of lists of ProblemSolver objects." - ) - raise TypeError(error_msg) - if not isinstance(n_bootstraps, int): - error_msg = "Number of bootstraps must be an integer." - raise TypeError(error_msg) - if not isinstance(conf_level, (int, float)): - error_msg = "Confidence level must be a float." - raise TypeError(error_msg) - if not isinstance(plot_type, str): - error_msg = "Plot type must be a string." - raise TypeError(error_msg) - if not isinstance(beta, (int, float, type(None))): - error_msg = "Beta quantile must be a float or None." - raise TypeError(error_msg) - if not isinstance(solve_tol, (int, float, type(None))): - error_msg = "Solve tolerance must be a float or None." - raise TypeError(error_msg) - if not isinstance(estimator, (int, float, Curve, type(None))): - error_msg = "Estimator must be a float, Curve, or None." - raise TypeError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) # Value checking if n_bootstraps < 1: error_msg = "Number of bootstraps must be a positive integer." @@ -2286,26 +1399,29 @@ def bootstrap_procedure( if not 0 < conf_level < 1: error_msg = "Confidence level must be in (0, 1)." raise ValueError(error_msg) - if plot_type not in [ - "mean", - "quantile", - "area_mean", - "area_std_dev", - "solve_time_quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - ]: - error_msg = "Plot type must be a valid string." - raise ValueError(error_msg) if beta is not None and not 0 < beta < 1: error_msg = "Beta quantile must be in (0, 1)." raise ValueError(error_msg) if solve_tol is not None and not 0 < solve_tol <= 1: error_msg = "Solve tolerance must be in (0, 1]." raise ValueError(error_msg) + acceptable_plot_types = [ + PlotType.MEAN, + PlotType.QUANTILE, + PlotType.AREA_MEAN, + PlotType.AREA_STD_DEV, + PlotType.SOLVE_TIME_QUANTILE, + PlotType.SOLVE_TIME_CDF, + PlotType.CDF_SOLVABILITY, + PlotType.QUANTILE_SOLVABILITY, + PlotType.DIFF_CDF_SOLVABILITY, + PlotType.DIFF_QUANTILE_SOLVABILITY, + ] + if plot_type not in acceptable_plot_types: + error_msg = ( + f"Plot type must be one of {acceptable_plot_types}.\nReceived: {plot_type}" + ) + raise ValueError(error_msg) # Create random number generator for bootstrap sampling. # Stream 1 dedicated for bootstrapping. @@ -2324,12 +1440,20 @@ def bootstrap_procedure( ) ) # Distinguish cases where functional returns a scalar vs a curve. - if plot_type in ["area_mean", "area_std_dev", "solve_time_quantile"]: + if plot_type in [ + PlotType.AREA_MEAN, + PlotType.AREA_STD_DEV, + PlotType.SOLVE_TIME_QUANTILE, + ]: if estimator is None: - error_msg = "Estimator must be provided for functional that returns a scalar." + error_msg = ( + "Estimator must be provided for functional that returns a scalar." + ) raise ValueError(error_msg) if isinstance(estimator, Curve): - error_msg = "Estimator must be a scalar for functional that returns a scalar." + error_msg = ( + "Estimator must be a scalar for functional that returns a scalar." + ) raise ValueError(error_msg) # Functional returns a scalar. computed_bootstrap = compute_bootstrap_conf_int( @@ -2347,167 +1471,90 @@ def bootstrap_procedure( while not isinstance(float_2, (int, float)): float_2 = float_2[0] return float_1, float_2 - else: - # Functional returns a curve. - unique_budget_list = list( - np.unique( - [ - budget - for curve in bootstrap_replications - for budget in curve.x_vals - ] - ) + # Functional returns a curve. + unique_budget_list = list( + np.unique( + [budget for curve in bootstrap_replications for budget in curve.x_vals] ) - bs_conf_int_lower_bound_list: list[np.ndarray] = [] - bs_conf_int_upper_bound_list: list[np.ndarray] = [] - for budget in unique_budget_list: - budget_float = float(budget) - bootstrap_subreplications = [ - curve.lookup(budget_float) for curve in bootstrap_replications - ] - if estimator is None: - error_msg = "Estimator must be provided for functional that returns a curve." - raise ValueError(error_msg) - if isinstance(estimator, (int, float)): - error_msg = "Estimator must be a Curve object for functional that returns a curve." - raise ValueError(error_msg) - sub_estimator = estimator.lookup(budget_float) - bs_conf_int_lower_bound, bs_conf_int_upper_bound = ( - compute_bootstrap_conf_int( - bootstrap_subreplications, - conf_level=conf_level, - bias_correction=True, - overall_estimator=sub_estimator, - ) + ) + bs_conf_int_lower_bound_list: list[np.ndarray] = [] + bs_conf_int_upper_bound_list: list[np.ndarray] = [] + for budget in unique_budget_list: + budget_float = float(budget) + bootstrap_subreplications = [ + curve.lookup(budget_float) for curve in bootstrap_replications + ] + if estimator is None: + error_msg = ( + "Estimator must be provided for functional that returns a curve." ) - bs_conf_int_lower_bound_list.append(bs_conf_int_lower_bound) - bs_conf_int_upper_bound_list.append(bs_conf_int_upper_bound) - # Create the curves for the lower and upper bounds of the bootstrap - # confidence intervals. - unique_budget_list_floats = [float(val) for val in unique_budget_list] - lower_bound_list = [float(val) for val in bs_conf_int_lower_bound_list] - bs_conf_int_lower_bounds = Curve( - x_vals=unique_budget_list_floats, y_vals=lower_bound_list - ) - upper_bound_list = [float(val) for val in bs_conf_int_upper_bound_list] - bs_conf_int_upper_bounds = Curve( - x_vals=unique_budget_list_floats, y_vals=upper_bound_list + raise ValueError(error_msg) + if isinstance(estimator, (int, float)): + error_msg = ( + "Estimator must be a Curve object for functional that returns a curve." + ) + raise ValueError(error_msg) + sub_estimator = estimator.lookup(budget_float) + bs_conf_int_lower_bound, bs_conf_int_upper_bound = compute_bootstrap_conf_int( + bootstrap_subreplications, + conf_level=conf_level, + bias_correction=True, + overall_estimator=sub_estimator, ) - return bs_conf_int_lower_bounds, bs_conf_int_upper_bounds + bs_conf_int_lower_bound_list.append(bs_conf_int_lower_bound) + bs_conf_int_upper_bound_list.append(bs_conf_int_upper_bound) + # Create the curves for the lower and upper bounds of the bootstrap + # confidence intervals. + unique_budget_list_floats = [float(val) for val in unique_budget_list] + lower_bound_list = [float(val) for val in bs_conf_int_lower_bound_list] + bs_conf_int_lower_bounds = Curve( + x_vals=unique_budget_list_floats, y_vals=lower_bound_list + ) + upper_bound_list = [float(val) for val in bs_conf_int_upper_bound_list] + bs_conf_int_upper_bounds = Curve( + x_vals=unique_budget_list_floats, y_vals=upper_bound_list + ) + return bs_conf_int_lower_bounds, bs_conf_int_upper_bounds def functional_of_curves( bootstrap_curves: list[list[list[Curve]]], - plot_type: Literal[ - "mean", - "quantile", - "area_mean", - "area_std_dev", - "solve_time_quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - ], + plot_type: PlotType, beta: float | None = 0.5, solve_tol: float | None = 0.1, ) -> float | Curve: - """Compute a functional of the bootstrapped objective/progress curves. - - Parameters - ---------- - bootstrap_curves : list [list [list [``experiment_base.Curve``]]] - Bootstrapped estimated objective curves or estimated progress curves - of all solutions from all macroreplications. - plot_type : str - String indicating which type of plot to produce: - "mean" : estimated mean progress curve; - - "quantile" : estimated beta quantile progress curve; - - "area_mean" : mean of area under progress curve; - - "area_std_dev" : standard deviation of area under progress curve; - - "solve_time_quantile" : beta quantile of solve time; - - "solve_time_cdf" : cdf of solve time; - - "cdf_solvability" : cdf solvability profile; - - "quantile_solvability" : quantile solvability profile; - - "diff_cdf_solvability" : difference of cdf solvability profiles; - - "diff_quantile_solvability" : difference of quantile solvability profiles; - beta : float, default=0.5 - Quantile to plot, e.g., beta quantile; in (0, 1). - solve_tol : float, default=0.1 - Relative optimality gap definining when a problem is solved; in (0, 1]. - - Returns - ------- - "Curve" | float - Functional of bootstrapped curves, e.g, mean progress curves, - mean area under progress curve, quantile of crossing time, etc. - - Raises - ------ - TypeError - ValueError - + """Computes a functional of bootstrapped objective or progress curves. + + Args: + bootstrap_curves (list[list[list[Curve]]]): Bootstrapped curves for all + solutions across all macroreplications. + plot_type (PlotType): Type of functional to compute: + - PlotType.MEAN + - PlotType.QUANTILE + - PlotType.AREA_MEAN + - PlotType.AREA_STD_DEV + - PlotType.SOLVE_TIME_QUANTILE + - PlotType.SOLVE_TIME_CDF + - PlotType.CDF_SOLVABILITY + - PlotType.QUANTILE_SOLVABILITY + - PlotType.DIFF_CDF_SOLVABILITY + - PlotType.DIFF_QUANTILE_SOLVABILITY + beta (float, optional): Quantile level (0 < beta < 1). Defaults to 0.5. + solve_tol (float, optional): Optimality gap for defining a solved instance + (0 < solve_tol ≤ 1). Defaults to 0.1. + + Returns: + Curve or float: The computed functional of the curves. + + Raises: + ValueError: If input values are invalid or unsupported for the given plot_type. """ # Set default arguments if beta is None: beta = 0.5 if solve_tol is None: solve_tol = 0.1 - # Type checking - if ( - not isinstance(bootstrap_curves, list) - or not all( - isinstance(experiment_list_list, list) - for experiment_list_list in bootstrap_curves - ) - or not all( - [isinstance(curve_list, list) for curve_list in curve_list_list] - for curve_list_list in bootstrap_curves - ) - or not all( - [ - [isinstance(curve, Curve) for curve in curve_list] - for curve_list in curve_list_list - ] - for curve_list_list in bootstrap_curves - ) - ): - error_msg = "Bootstrap curves must be a list of lists of lists of Curve objects." - raise TypeError(error_msg) - if not isinstance(plot_type, str): - error_msg = "Plot type must be a string." - raise TypeError(error_msg) - if not isinstance(beta, (int, float, type(None))): - error_msg = "Beta quantile must be a float." - raise TypeError(error_msg) - if not isinstance(solve_tol, (int, float, type(None))): - error_msg = "Solve tolerance must be a float." - raise TypeError(error_msg) # Value checking - if plot_type not in [ - "mean", - "quantile", - "area_mean", - "area_std_dev", - "solve_time_quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - ]: - error_msg = f"Plot type '{plot_type}' is not valid." - raise ValueError(error_msg) if not 0 < beta < 1: error_msg = "Beta quantile must be in (0, 1)." raise ValueError(error_msg) @@ -2515,111 +1562,84 @@ def functional_of_curves( error_msg = "Solve tolerance must be in (0, 1]." raise ValueError(error_msg) - if plot_type == "mean": - # Single experiment --> returns a curve. - return mean_of_curves(bootstrap_curves[0][0]) - elif plot_type == "quantile": - # Single experiment --> returns a curve. - return quantile_of_curves(bootstrap_curves[0][0], beta=beta) - elif plot_type == "area_mean": - # Single experiment --> returns a scalar. - area_mean = np.mean( - [ - curve.compute_area_under_curve() - for curve in bootstrap_curves[0][0] - ] - ) - return float(area_mean) - elif plot_type == "area_std_dev": - # Single experiment --> returns a scalar. - area_std_dev = np.std( - [ - curve.compute_area_under_curve() - for curve in bootstrap_curves[0][0] - ], - ddof=1, - ) - return float(area_std_dev) - elif plot_type == "solve_time_quantile": - # Single experiment --> returns a scalar - solve_time_quantile = np.quantile( - [ - curve.compute_crossing_time(threshold=solve_tol) - for curve in bootstrap_curves[0][0] - ], - q=beta, - ) - return float(solve_time_quantile) - elif plot_type == "solve_time_cdf": - # Single experiment --> returns a curve. - return cdf_of_curves_crossing_times( - bootstrap_curves[0][0], threshold=solve_tol - ) - elif plot_type == "cdf_solvability": - # One solver, multiple problems --> returns a curve. - return mean_of_curves( - [ - cdf_of_curves_crossing_times( - curves=progress_curves, threshold=solve_tol - ) - for progress_curves in bootstrap_curves[0] - ] - ) - elif plot_type == "quantile_solvability": - # One solver, multiple problems --> returns a curve. - return mean_of_curves( - [ - quantile_cross_jump( - curves=progress_curves, threshold=solve_tol, beta=beta - ) - for progress_curves in bootstrap_curves[0] - ] - ) - elif plot_type == "diff_cdf_solvability": - # Two solvers, multiple problems --> returns a curve. - solvability_profile_1 = mean_of_curves( - [ - cdf_of_curves_crossing_times( - curves=progress_curves, threshold=solve_tol - ) - for progress_curves in bootstrap_curves[0] - ] - ) - solvability_profile_2 = mean_of_curves( - [ - cdf_of_curves_crossing_times( - curves=progress_curves, threshold=solve_tol - ) - for progress_curves in bootstrap_curves[1] - ] - ) - return difference_of_curves( - solvability_profile_1, solvability_profile_2 - ) - elif plot_type == "diff_quantile_solvability": - # Two solvers, multiple problems --> returns a curve. - solvability_profile_1 = mean_of_curves( + single_curves = bootstrap_curves[0][0] + solver_1_curves = bootstrap_curves[0] + solver_2_curves = bootstrap_curves[1] if len(bootstrap_curves) > 1 else None + + dispatch = { + PlotType.MEAN: lambda: curve_utils.mean_of_curves(single_curves), + PlotType.QUANTILE: lambda: curve_utils.quantile_of_curves( + single_curves, beta=beta + ), + PlotType.AREA_MEAN: lambda: float( + np.mean([c.compute_area_under_curve() for c in single_curves]) + ), + PlotType.AREA_STD_DEV: lambda: float( + np.std([c.compute_area_under_curve() for c in single_curves], ddof=1) + ), + PlotType.SOLVE_TIME_QUANTILE: lambda: float( + np.quantile( + [c.compute_crossing_time(threshold=solve_tol) for c in single_curves], + q=beta, + ) + ), + PlotType.SOLVE_TIME_CDF: lambda: curve_utils.cdf_of_curves_crossing_times( + single_curves, threshold=solve_tol + ), + PlotType.CDF_SOLVABILITY: lambda: curve_utils.mean_of_curves( [ - quantile_cross_jump( - curves=progress_curves, threshold=solve_tol, beta=beta - ) - for progress_curves in bootstrap_curves[0] + curve_utils.cdf_of_curves_crossing_times(curves, threshold=solve_tol) + for curves in solver_1_curves ] - ) - solvability_profile_2 = mean_of_curves( + ), + PlotType.QUANTILE_SOLVABILITY: lambda: curve_utils.mean_of_curves( [ - quantile_cross_jump( - curves=progress_curves, threshold=solve_tol, beta=beta - ) - for progress_curves in bootstrap_curves[1] + curve_utils.quantile_cross_jump(curves, threshold=solve_tol, beta=beta) + for curves in solver_1_curves ] - ) - return difference_of_curves( - solvability_profile_1, solvability_profile_2 - ) - else: - error_msg = "'{plot_type}' is not implemented." - raise NotImplementedError(error_msg) + ), + PlotType.DIFF_CDF_SOLVABILITY: lambda: curve_utils.difference_of_curves( + curve_utils.mean_of_curves( + [ + curve_utils.cdf_of_curves_crossing_times( + curves, threshold=solve_tol + ) + for curves in solver_1_curves + ] + ), + curve_utils.mean_of_curves( + [ + curve_utils.cdf_of_curves_crossing_times( + curves, threshold=solve_tol + ) + for curves in solver_2_curves # type: ignore + ] + ), + ), + PlotType.DIFF_QUANTILE_SOLVABILITY: lambda: curve_utils.difference_of_curves( + curve_utils.mean_of_curves( + [ + curve_utils.quantile_cross_jump( + curves, threshold=solve_tol, beta=beta + ) + for curves in solver_1_curves + ] + ), + curve_utils.mean_of_curves( + [ + curve_utils.quantile_cross_jump( + curves, threshold=solve_tol, beta=beta + ) + for curves in solver_2_curves # type: ignore + ] + ), + ), + } + + try: + return dispatch[plot_type]() + except KeyError as e: + raise NotImplementedError(f"'{plot_type.value}' is not implemented.") from e # TODO: double check observations type and return type @@ -2631,45 +1651,23 @@ def compute_bootstrap_conf_int( ) -> tuple[np.ndarray, np.ndarray]: """Construct a bootstrap confidence interval for an estimator. - Parameters - ---------- - observations : list[float | int] - Estimators from all bootstrap instances. - conf_level : float - Confidence level for confidence intervals, i.e., 1-gamma; in (0, 1). - bias_correction : bool, default=True - True if bias-corrected bootstrap CIs (via percentile method) are to be used, - otherwise False. - overall_estimator : float, optional - Estimator to compute bootstrap confidence interval of; - required for bias corrected CI. - - Returns - ------- - ndarray[float] - Lower bound of bootstrap CI. - ndarray[float] - Upper bound of bootstrap CI. - - Raises - ------ - TypeError - ValueError - + Args: + observations (list[float | int]): Estimators from all bootstrap instances. + conf_level (float): Confidence level for confidence intervals, i.e., 1 - gamma; + must be in (0, 1). + bias_correction (bool, optional): Whether to use bias-corrected bootstrap CIs + (via the percentile method). Defaults to True. + overall_estimator (float | None, optional): The estimator to compute the CI + around. Required if`bias_correction` is True. + + Returns: + tuple[np.ndarray, np.ndarray]: A tuple containing the lower and upper bounds of + the bootstrap confidence interval. + + Raises: + ValueError: If `conf_level` is not in (0, 1), or if `overall_estimator` is None + when `bias_correction` is True. """ - # Type checking - if not isinstance(observations, list): - error_msg = "Observations must be a list." - raise TypeError(error_msg) - if not isinstance(conf_level, (int, float)): - error_msg = "Confidence level must be a float." - raise TypeError(error_msg) - if not isinstance(bias_correction, bool): - error_msg = "Bias correction must be a boolean." - raise TypeError(error_msg) - if not isinstance(overall_estimator, (int, float, type(None))): - error_msg = "Overall estimator must be a float or None." - raise TypeError(error_msg) # Value checking if not 0 < conf_level < 1: error_msg = "Confidence level must be in (0, 1)." @@ -2682,14 +1680,13 @@ def compute_bootstrap_conf_int( # See Efron (1981) "Nonparameteric Standard Errors and Confidence Intervals." if bias_correction: if overall_estimator is None: - error_msg = ( - "Overall estimator must be provided for bias correction." - ) + error_msg = "Overall estimator must be provided for bias correction." raise ValueError(error_msg) + # Lazy imports + from scipy.stats import norm + # For biased-corrected CIs, see equation (4.4) on page 146. - z0 = norm.ppf( - np.mean([obs < overall_estimator for obs in observations]) - ) + z0 = norm.ppf(np.mean([obs < overall_estimator for obs in observations])) zconflvl = norm.ppf(conf_level) q_lower = norm.cdf(2 * z0 - zconflvl) q_upper = norm.cdf(2 * z0 + zconflvl) @@ -2714,33 +1711,16 @@ def plot_bootstrap_conf_ints( ) -> None: """Plot bootstrap confidence intervals. - Parameters - ---------- - bs_conf_int_lower_bounds : ``experiment_base.Curve`` - Lower bounds of bootstrap CIs, as curves. - bs_conf_int_upper_bounds : ``experiment_base.Curve`` - Upper bounds of bootstrap CIs, as curves. - color_str : str, default="C0" - String indicating line color, e.g., "C0", "C1", etc. - - Raises - ------ - TypeError - + Args: + bs_conf_int_lower_bounds (Curve): Lower bounds of bootstrap confidence + intervals, as curves. + bs_conf_int_upper_bounds (Curve): Upper bounds of bootstrap confidence + intervals, as curves. + color_str (str, optional): String indicating line color, e.g., "C0", "C1", etc. + Defaults to "C0". """ - # Type checking - if not isinstance(bs_conf_int_lower_bounds, Curve): - error_msg = "Lower bounds must be a Curve object." - raise TypeError(error_msg) - if not isinstance(bs_conf_int_upper_bounds, Curve): - error_msg = "Upper bounds must be a Curve object." - raise TypeError(error_msg) - if not isinstance(color_str, str): - error_msg = "Color string must be a string." - raise TypeError(error_msg) - - bs_conf_int_lower_bounds.plot(color_str=color_str, curve_type="conf_bound") - bs_conf_int_upper_bounds.plot(color_str=color_str, curve_type="conf_bound") + bs_conf_int_lower_bounds.plot(color_str=color_str, curve_type=CurveType.CONF_BOUND) + bs_conf_int_upper_bounds.plot(color_str=color_str, curve_type=CurveType.CONF_BOUND) # Shade space between curves. # Convert to full curves to get piecewise-constant shaded areas. plt.fill_between( @@ -2758,46 +1738,20 @@ def report_max_halfwidth( conf_level: float, difference: bool = False, ) -> None: - """Compute and print caption for max halfwidth of one or more bootstrap CI curves. - - Parameters - ---------- - curve_pairs : list [list [``experiment_base.Curve``]] - List of paired bootstrap CI curves. - normalize : bool - True if progress curves are to be normalized w.r.t. optimality gaps, - otherwise False. - conf_level : float - Confidence level for confidence intervals, i.e., 1-gamma; in (0, 1). - difference : bool - True if the plot is for difference profiles, otherwise False. - - Raises - ------ - TypeError - ValueError - + """Print caption for the max halfwidth of bootstrap confidence interval curves. + + Args: + curve_pairs (list[list[Curve]]): A list of paired bootstrap CI curves. + normalize (bool): Whether to normalize progress curves with respect to + optimality gaps. + conf_level (float): Confidence level for confidence intervals + (must be in (0, 1)). + difference (bool, optional): Whether the plot is for difference profiles. + Defaults to False. + + Raises: + ValueError: If `conf_level` is not in (0, 1) or if `curve_pairs` is empty. """ - # Type checking - if ( - not isinstance(curve_pairs, list) - or not all([isinstance(curve_pair, list) for curve_pair in curve_pairs]) - or not all( - [isinstance(curve, Curve) for curve in curve_pair] - for curve_pair in curve_pairs - ) - ): - error_msg = "Curve pairs must be a list of lists of Curve objects." - raise TypeError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) - if not isinstance(conf_level, (int, float)): - error_msg = "Confidence level must be a float." - raise TypeError(error_msg) - if not isinstance(difference, bool): - error_msg = "Difference must be a boolean." - raise TypeError(error_msg) # Value checking if not 0 < conf_level < 1: error_msg = "Confidence level must be in (0, 1)." @@ -2808,14 +1762,14 @@ def report_max_halfwidth( raise ValueError(error_msg) # Compute max halfwidth of bootstrap confidence intervals. - min_lower_bound = np.inf - max_upper_bound = -np.inf + min_lower_bound = float("inf") + max_upper_bound = -float("inf") max_halfwidths = [] for curve_pair in curve_pairs: min_lower_bound = min(min_lower_bound, min(curve_pair[0].y_vals)) max_upper_bound = max(max_upper_bound, max(curve_pair[1].y_vals)) max_halfwidths.append( - 0.5 * max_difference_of_curves(curve_pair[1], curve_pair[0]) + 0.5 * curve_utils.max_difference_of_curves(curve_pair[1], curve_pair[0]) ) max_halfwidth = max(max_halfwidths) # Print caption about max halfwidth. @@ -2830,52 +1784,44 @@ def report_max_halfwidth( # xloc = 0.05 * budget of the problem xloc = 0.05 * curve_pairs[0][0].x_vals[-1] yloc = min_lower_bound - 0.25 * (max_upper_bound - min_lower_bound) - txt = f"The max halfwidth of the bootstrap {round(conf_level * 100)}% CIs is {round(max_halfwidth, 2)}." + boot_cis = round(conf_level * 100) + max_hw_round = round(max_halfwidth, 2) + txt = f"The max halfwidth of the bootstrap {boot_cis}% CIs is {max_hw_round}." plt.text(x=xloc, y=yloc, s=txt) def check_common_problem_and_reference( experiments: list[ProblemSolver], ) -> None: - """Check if a collection of experiments have the same problem, x0, and x*. - - Parameters - ---------- - experiments : list [``experiment_base.ProblemSolver``] - Problem-solver pairs of different solvers on a common problem. + """Check if a collection of experiments share the same problem, x0, and x*. - Raises - ------ - TypeError - ValueError - If at least two experiments have different problem instances, starting solutions, or optimal solutions. + Args: + experiments (list[ProblemSolver]): Problem-solver pairs of different solvers + on a common problem. + Raises: + ValueError: If any experiments have different problem instances, + starting solutions (`x0`), or optimal solutions (`x*`). """ - # Type checking - if not isinstance(experiments, list) or not all( - [isinstance(experiment, ProblemSolver) for experiment in experiments] - ): - error_msg = "Experiments must be a list of ProblemSolver objects." - raise TypeError(error_msg) - problem_list = [experiment.problem for experiment in experiments] - problem_err_msg = "All experiments must have the same problem." - assert all(elem == problem_list[0] for elem in problem_list), ( - problem_err_msg - ) + if not all(prob == problem_list[0] for prob in problem_list[1:]): + error_msg = "All experiments must have the same problem." + raise ValueError(error_msg) x0_list = [experiment.x0 for experiment in experiments] - x0_err_msg = "All experiments must have the same starting solution." - assert all(elem == x0_list[0] for elem in x0_list), x0_err_msg + if not all(start_sol == x0_list[0] for start_sol in x0_list[1:]): + error_msg = "All experiments must have the same starting solution." + raise ValueError(error_msg) xstar_list = [experiment.xstar for experiment in experiments] - xstar_err_msg = "All experiments must have the same optimal solution." - assert all(elem == xstar_list[0] for elem in xstar_list), xstar_err_msg + if not all(opt_sol == xstar_list[0] for opt_sol in xstar_list[1:]): + error_msg = "All experiments must have the same optimal solution." + raise ValueError(error_msg) def plot_progress_curves( experiments: list[ProblemSolver], - plot_type: Literal["all", "mean", "quantile"], + plot_type: PlotType, beta: float = 0.50, normalize: bool = True, all_in_one: bool = True, @@ -2888,120 +1834,55 @@ def plot_progress_curves( ext: str = ".png", save_as_pickle: bool = False, solver_set_name: str = "SOLVER_SET", -) -> list[str | os.PathLike]: - """Plot individual or aggregate progress curves for one or more solvers on a single problem. - - Parameters - ---------- - experiments : list [``experiment_base.ProblemSolver``] - Problem-solver pairs of different solvers on a common problem. - plot_type : str - String indicating which type of plot to produce: - "all" : all estimated progress curves - "mean" : estimated mean progress curve - "quantile" : estimated beta quantile progress curve. - beta : float, default=0.50 - Quantile to plot, e.g., beta quantile; in (0, 1). - normalize : bool, default=True - True if progress curves are to be normalized w.r.t. optimality gaps, - otherwise False. - all_in_one : bool, default=True - True if curves are to be plotted together, otherwise False. - n_bootstraps : int, default = 100 - Number of bootstrap samples. - conf_level : float, default = 0.95 - Confidence level for confidence intervals, i.e., 1-gamma; in (0, 1). - plot_conf_ints : bool, default=True - True if bootstrapping confidence intervals are to be plotted, otherwise False. - print_max_hw : bool, default=True - True if caption with max half-width is to be printed, otherwise False. - plot_title : str, opt - Optional title to override the one that is autmatically generated, only applies if all_in_one is True. - legend_loc : str, default="best" - specificies location of legend - ext: str, default = '.png' - Extension to add to image file path to change file type - save_as_pickle: bool, default = False - True if plot should be saved to pickle file, False otherwise. - solver_set_name: str, default = "SOLVER_SET" - Use to change name of solver groups for plot titles. - - Returns - ------- - file_list : list [str] - List compiling path names for plots produced. - - Raises - ------ - TypeError - ValueError - +) -> list[Path]: + """Plots individual or aggregate progress curves for solvers on a single problem. + + Args: + experiments (list[ProblemSolver]): Problem-solver pairs for different solvers + on the same problem. + plot_type (PlotType): Type of plot to produce (ALL, MEAN, or QUANTILE). + beta (float, optional): Quantile level to plot (0 < beta < 1). Defaults to 0.50. + normalize (bool, optional): If True, normalize curves by optimality gaps. + Defaults to True. + all_in_one (bool, optional): If True, plot all curves in one figure. + Defaults to True. + n_bootstraps (int, optional): Number of bootstrap samples. Defaults to 100. + conf_level (float, optional): Confidence level for CIs (0 < conf_level < 1). + Defaults to 0.95. + plot_conf_ints (bool, optional): If True, plot bootstrapped confidence + intervals. Defaults to True. + print_max_hw (bool, optional): If True, print caption with max half-width. + Defaults to True. + plot_title (str, optional): Custom title for the plot + (used only if `all_in_one=True`). + legend_loc (str, optional): Location of legend (e.g., "best", "lower right"). + ext (str, optional): File extension for saved plots (e.g., ".png"). + Defaults to ".png". + save_as_pickle (bool, optional): If True, save plot as a pickle file. + Defaults to False. + solver_set_name (str, optional): Label for solver group in plot titles. + Defaults to "SOLVER_SET". + + Returns: + list[Path]: List of file paths where the plots were saved. + + Raises: + ValueError: If beta, conf_level, or n_bootstraps have invalid values. """ - # Type checking - if not isinstance(experiments, list) or not all( - [isinstance(experiment, ProblemSolver) for experiment in experiments] - ): - error_msg = "Experiments must be a list of ProblemSolver objects." - raise TypeError(error_msg) - if not isinstance(plot_type, str): - error_msg = "Plot type must be a string." - raise TypeError(error_msg) - if not isinstance(beta, (int, float)): - error_msg = "Beta quantile must be a float." - raise TypeError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) - if not isinstance(all_in_one, bool): - error_msg = "All in one must be a boolean." - raise TypeError(error_msg) - if not isinstance(n_bootstraps, int): - error_msg = "Number of bootstraps must be an integer." - raise TypeError(error_msg) - if not isinstance(conf_level, (int, float)): - error_msg = "Confidence level must be a float." - raise TypeError(error_msg) - if not isinstance(plot_conf_ints, bool): - error_msg = "Plot confidence intervals must be a boolean." - raise TypeError(error_msg) - if not isinstance(print_max_hw, bool): - error_msg = "Print max halfwidth must be a boolean." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) - if not isinstance(legend_loc, (str, type(None))): - error_msg = "Legend location must be a string or None." - raise TypeError(error_msg) - if not isinstance(ext, str): - error_msg = "Extension must be a string." - raise TypeError(error_msg) - if not isinstance(save_as_pickle, bool): - error_msg = "Save as pickle must be a boolean." - raise TypeError(error_msg) - if not isinstance(solver_set_name, str): - error_msg = "Solver set name must be a string." - raise TypeError(error_msg) # Value checking - if plot_type not in ["all", "mean", "quantile"]: - error_msg = f"Plot type '{plot_type}' is not valid." - raise ValueError(error_msg) if not 0 < beta < 1: - error_msg = "Beta quantile must be in (0, 1)." - raise ValueError(error_msg) + raise ValueError("Beta quantile must be in (0, 1).") if n_bootstraps < 1: - error_msg = "Number of bootstraps must be a positive integer." - raise ValueError(error_msg) + raise ValueError("Number of bootstraps must be a positive integer.") if not 0 < conf_level < 1: - error_msg = "Confidence level must be in (0, 1)." - raise ValueError(error_msg) + raise ValueError("Confidence level must be in (0, 1).") if legend_loc is None: legend_loc = "best" # Check if problems are the same with the same x0 and x*. check_common_problem_and_reference(experiments) - file_list = [] + file_list: list[Path] = [] # Set up plot. n_experiments = len(experiments) if all_in_one: @@ -3021,57 +1902,56 @@ def plot_progress_curves( experiment = experiments[exp_idx] color_str = "C" + str(exp_idx) estimator = None - if plot_type == "all": + if plot_type == PlotType.ALL: # Plot all estimated progress curves. if normalize: - handle = experiment.progress_curves[0].plot( - color_str=color_str - ) + handle = experiment.progress_curves[0].plot(color_str=color_str) for curve in experiment.progress_curves[1:]: curve.plot(color_str=color_str) else: - handle = experiment.objective_curves[0].plot( - color_str=color_str - ) + handle = experiment.objective_curves[0].plot(color_str=color_str) for curve in experiment.objective_curves[1:]: curve.plot(color_str=color_str) - elif plot_type == "mean": + elif plot_type == PlotType.MEAN: # Plot estimated mean progress curve. if normalize: - estimator = mean_of_curves(experiment.progress_curves) + estimator = curve_utils.mean_of_curves(experiment.progress_curves) else: - estimator = mean_of_curves(experiment.objective_curves) + estimator = curve_utils.mean_of_curves(experiment.objective_curves) handle = estimator.plot(color_str=color_str) - else: # Must be quantile. + elif plot_type == PlotType.QUANTILE: # Plot estimated beta-quantile progress curve. if normalize: - estimator = quantile_of_curves( + estimator = curve_utils.quantile_of_curves( experiment.progress_curves, beta ) else: - estimator = quantile_of_curves( + estimator = curve_utils.quantile_of_curves( experiment.objective_curves, beta ) handle = estimator.plot(color_str=color_str) + else: + error_msg = f"'{plot_type.value}' is not implemented." + raise NotImplementedError(error_msg) solver_curve_handles.append(handle) - if (plot_conf_ints or print_max_hw) and plot_type != "all": - # Note: "experiments" needs to be a list of list of ProblemSolver objects. - bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( - bootstrap_procedure( - experiments=[[experiment]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type=plot_type, - beta=beta, - estimator=estimator, - normalize=normalize, - ) + if (plot_conf_ints or print_max_hw) and plot_type != PlotType.ALL: + bs_conf_int_lb_curve, bs_conf_int_ub_curve = bootstrap_procedure( + experiments=[[experiment]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=plot_type, + beta=beta, + estimator=estimator, + normalize=normalize, ) if plot_conf_ints: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) plot_bootstrap_conf_ints( bs_conf_int_lb_curve, @@ -3079,15 +1959,13 @@ def plot_progress_curves( color_str=color_str, ) if print_max_hw: - curve_pairs.append( - [bs_conf_int_lb_curve, bs_conf_int_ub_curve] - ) + curve_pairs.append([bs_conf_int_lb_curve, bs_conf_int_ub_curve]) plt.legend( handles=solver_curve_handles, labels=[experiment.solver.name for experiment in experiments], loc=legend_loc, ) - if print_max_hw and plot_type != "all": + if print_max_hw and plot_type != PlotType.ALL: report_max_halfwidth( curve_pairs=curve_pairs, normalize=normalize, @@ -3116,7 +1994,7 @@ def plot_progress_curves( beta=beta, ) estimator = None - if plot_type == "all": + if plot_type == PlotType.ALL: # Plot all estimated progress curves. if normalize: for curve in experiment.progress_curves: @@ -3124,56 +2002,55 @@ def plot_progress_curves( else: for curve in experiment.objective_curves: curve.plot() - elif plot_type == "mean": + elif plot_type == PlotType.MEAN: # Plot estimated mean progress curve. if normalize: - estimator = mean_of_curves(experiment.progress_curves) + estimator = curve_utils.mean_of_curves(experiment.progress_curves) else: - estimator = mean_of_curves(experiment.objective_curves) + estimator = curve_utils.mean_of_curves(experiment.objective_curves) estimator.plot() else: # Must be quantile. # Plot estimated beta-quantile progress curve. if normalize: - estimator = quantile_of_curves( + estimator = curve_utils.quantile_of_curves( experiment.progress_curves, beta ) else: - estimator = quantile_of_curves( + estimator = curve_utils.quantile_of_curves( experiment.objective_curves, beta ) estimator.plot() - if (plot_conf_ints or print_max_hw) and plot_type != "all": + if (plot_conf_ints or print_max_hw) and plot_type != PlotType.ALL: # Note: "experiments" needs to be a list of list of ProblemSolvers. - bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( - bootstrap_procedure( - experiments=[[experiment]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type=plot_type, - beta=beta, - estimator=estimator, - normalize=normalize, - ) + bs_conf_int_lb_curve, bs_conf_int_ub_curve = bootstrap_procedure( + experiments=[[experiment]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=plot_type, + beta=beta, + estimator=estimator, + normalize=normalize, ) if plot_conf_ints: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) - plot_bootstrap_conf_ints( - bs_conf_int_lb_curve, bs_conf_int_ub_curve - ) + plot_bootstrap_conf_ints(bs_conf_int_lb_curve, bs_conf_int_ub_curve) if print_max_hw: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Max halfwidth is not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Max halfwidth is not available for scalar estimators." + ) raise ValueError(error_msg) report_max_halfwidth( - curve_pairs=[ - [bs_conf_int_lb_curve, bs_conf_int_ub_curve] - ], + curve_pairs=[[bs_conf_int_lb_curve, bs_conf_int_ub_curve]], normalize=normalize, conf_level=conf_level, ) @@ -3204,86 +2081,38 @@ def plot_solvability_cdfs( ext: str = ".png", save_as_pickle: bool = False, solver_set_name: str = "SOLVER_SET", -) -> list[str | os.PathLike]: - """Plot the solvability cdf for one or more solvers on a single problem. - - Parameters - ---------- - experiments : list [``experiment_base.ProblemSolver``] - Problem-solver pairs of different solvers on a common problem. - solve_tol : float, default=0.1 - Relative optimality gap definining when a problem is solved; in (0, 1]. - all_in_one : bool, default=True - True if curves are to be plotted together, otherwise False. - n_bootstraps : int, default=100 - Number of bootstrap samples. - conf_level : float, default=0.95 - Confidence level for confidence intervals, i.e., 1-gamma; in (0, 1). - plot_conf_ints : bool, default=True - True if bootstrapping confidence intervals are to be plotted, otherwise False. - print_max_hw : bool, default=True - True if caption with max half-width is to be printed, otherwise False. - plot_title : str, opt - Optional title to override the one that is autmatically generated, only applies if all_in_one is True. - legend_loc : str, default="best" - specificies location of legend - ext: str, default = '.png' - Extension to add to image file path to change file type - save_as_pickle: bool, default = False - True if plot should be saved to pickle file, False otherwise. - solver_set_name: str, default = "SOLVER_SET" - Use to change name of solver groups for plot titles. - - Returns - ------- - file_list : list [str | os.PathLike] - List compiling path names for plots produced. - - Raises - ------ - TypeError - ValueError - +) -> list[Path]: + """Plots solvability CDFs for one or more solvers on a single problem. + + Args: + experiments (list[ProblemSolver]): Problem-solver pairs for different solvers + on a common problem. + solve_tol (float, optional): Optimality gap that defines when a problem is + considered solved (0 < solve_tol ≤ 1). Defaults to 0.1. + all_in_one (bool, optional): If True, plot all curves together. + Defaults to True. + n_bootstraps (int, optional): Number of bootstrap samples. Defaults to 100. + conf_level (float, optional): Confidence level for intervals + (0 < conf_level < 1). Defaults to 0.95. + plot_conf_ints (bool, optional): If True, include bootstrapped confidence + intervals. Defaults to True. + print_max_hw (bool, optional): If True, print the max half-width in the caption. + Defaults to True. + plot_title (str, optional): Custom title to override the generated one + (used only if all_in_one is True). + legend_loc (str, optional): Location of the plot legend (e.g., "best"). + ext (str, optional): File extension for saved plots. Defaults to ".png". + save_as_pickle (bool, optional): If True, save plots as pickle files. + Defaults to False. + solver_set_name (str, optional): Label for solver group in plot titles. + Defaults to "SOLVER_SET". + + Returns: + list[Path]: List of file paths for the generated plots. + + Raises: + ValueError: If any input parameter is out of bounds or invalid. """ - # Type checking - if not isinstance(experiments, list) or not all( - [isinstance(experiment, ProblemSolver) for experiment in experiments] - ): - error_msg = "Experiments must be a list of ProblemSolver objects." - raise TypeError(error_msg) - if not isinstance(solve_tol, (int, float)): - error_msg = "Solve tolerance must be a float." - raise TypeError(error_msg) - if not isinstance(all_in_one, bool): - error_msg = "All in one must be a boolean." - raise TypeError(error_msg) - if not isinstance(n_bootstraps, int): - error_msg = "Number of bootstraps must be an integer." - raise TypeError(error_msg) - if not isinstance(conf_level, (int, float)): - error_msg = "Confidence level must be a float." - raise TypeError(error_msg) - if not isinstance(plot_conf_ints, bool): - error_msg = "Plot confidence intervals must be a boolean." - raise TypeError(error_msg) - if not isinstance(print_max_hw, bool): - error_msg = "Print max halfwidth must be a boolean." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) - if not isinstance(legend_loc, (str, type(None))): - error_msg = "Legend location must be a string or None." - raise TypeError(error_msg) - if not isinstance(ext, str): - error_msg = "Extension must be a string." - raise TypeError(error_msg) - if not isinstance(save_as_pickle, bool): - error_msg = "Save as pickle must be a boolean." - raise TypeError(error_msg) - if not isinstance(solver_set_name, str): - error_msg = "Solver set name must be a string." - raise TypeError(error_msg) # Value checking if not 0 < solve_tol <= 1: error_msg = "Solve tolerance must be in (0, 1]." @@ -3306,7 +2135,7 @@ def plot_solvability_cdfs( if all_in_one: ref_experiment = experiments[0] setup_plot( - plot_type="solve_time_cdf", + plot_type=PlotType.SOLVE_TIME_CDF, solver_name=solver_set_name, problem_name=ref_experiment.problem.name, solve_tol=solve_tol, @@ -3318,29 +2147,29 @@ def plot_solvability_cdfs( experiment = experiments[exp_idx] color_str = "C" + str(exp_idx) # Plot cdf of solve times. - estimator = cdf_of_curves_crossing_times( + estimator = curve_utils.cdf_of_curves_crossing_times( experiment.progress_curves, threshold=solve_tol ) handle = estimator.plot(color_str=color_str) solver_curve_handles.append(handle) if plot_conf_ints or print_max_hw: - # Note: "experiments" needs to be a list of list of ProblemSolver objects. - bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( - bootstrap_procedure( - experiments=[[experiment]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type="solve_time_cdf", - solve_tol=solve_tol, - estimator=estimator, - normalize=True, - ) + bs_conf_int_lb_curve, bs_conf_int_ub_curve = bootstrap_procedure( + experiments=[[experiment]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=PlotType.SOLVE_TIME_CDF, + solve_tol=solve_tol, + estimator=estimator, + normalize=True, ) if plot_conf_ints: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) plot_bootstrap_conf_ints( bs_conf_int_lb_curve, @@ -3348,9 +2177,7 @@ def plot_solvability_cdfs( color_str=color_str, ) if print_max_hw: - curve_pairs.append( - [bs_conf_int_lb_curve, bs_conf_int_ub_curve] - ) + curve_pairs.append([bs_conf_int_lb_curve, bs_conf_int_ub_curve]) plt.legend( handles=solver_curve_handles, labels=[experiment.solver.name for experiment in experiments], @@ -3364,7 +2191,7 @@ def plot_solvability_cdfs( save_plot( solver_name="SOLVER SET", problem_name=ref_experiment.problem.name, - plot_type="solve_time_cdf", + plot_type=PlotType.SOLVE_TIME_CDF, normalize=True, extra=solve_tol, plot_title=plot_title, @@ -3375,47 +2202,45 @@ def plot_solvability_cdfs( else: # Plot separately. for experiment in experiments: setup_plot( - plot_type="solve_time_cdf", + plot_type=PlotType.SOLVE_TIME_CDF, solver_name=experiment.solver.name, problem_name=experiment.problem.name, solve_tol=solve_tol, ) - estimator = cdf_of_curves_crossing_times( + estimator = curve_utils.cdf_of_curves_crossing_times( experiment.progress_curves, threshold=solve_tol ) estimator.plot() if plot_conf_ints or print_max_hw: - # Note: "experiments" needs to be a list of list of Problem-Solver objects. - bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( - bootstrap_procedure( - experiments=[[experiment]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type="solve_time_cdf", - solve_tol=solve_tol, - estimator=estimator, - normalize=True, - ) + bs_conf_int_lb_curve, bs_conf_int_ub_curve = bootstrap_procedure( + experiments=[[experiment]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=PlotType.SOLVE_TIME_CDF, + solve_tol=solve_tol, + estimator=estimator, + normalize=True, ) if plot_conf_ints: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) - plot_bootstrap_conf_ints( - bs_conf_int_lb_curve, bs_conf_int_ub_curve - ) + plot_bootstrap_conf_ints(bs_conf_int_lb_curve, bs_conf_int_ub_curve) if print_max_hw: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Max halfwidth is not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Max halfwidth is not available for scalar estimators." + ) raise ValueError(error_msg) report_max_halfwidth( - curve_pairs=[ - [bs_conf_int_lb_curve, bs_conf_int_ub_curve] - ], + curve_pairs=[[bs_conf_int_lb_curve, bs_conf_int_ub_curve]], normalize=True, conf_level=conf_level, ) @@ -3423,7 +2248,7 @@ def plot_solvability_cdfs( save_plot( solver_name=experiment.solver.name, problem_name=experiment.problem.name, - plot_type="solve_time_cdf", + plot_type=PlotType.SOLVE_TIME_CDF, normalize=True, extra=solve_tol, ext=ext, @@ -3433,111 +2258,58 @@ def plot_solvability_cdfs( return file_list -# TODO: Add the capability to compute and print the max halfwidth of the bootstrapped CI intervals. +# TODO: Add the capability to compute and print the max halfwidth +# of the bootstrapped CI intervals. def plot_area_scatterplots( - experiments: list[ - list[ProblemSolver] - ], # TODO: check if this should be list[ProblemSolver] + experiments: list[list[ProblemSolver]], all_in_one: bool = True, n_bootstraps: int = 100, conf_level: float = 0.95, plot_conf_ints: bool = True, - print_max_hw: bool = True, + print_max_hw: bool = True, # noqa: ARG001 plot_title: str | None = None, legend_loc: str = "best", ext: str = ".png", save_as_pickle: bool = False, solver_set_name: str = "SOLVER_SET", problem_set_name: str = "PROBLEM_SET", -) -> list[str | os.PathLike]: - """Plot a scatter plot of mean and standard deviation of area under progress curves. - - Either one plot for each solver or one plot for all solvers. - - Notes - ----- - TODO: Add the capability to compute and print the max halfwidth of - the bootstrapped CI intervals. - - Parameters - ---------- - experiments : list [list [``experiment_base.ProblemSolver``]] - Problem-solver pairs used to produce plots. - all_in_one : bool, default=True - True if curves are to be plotted together, otherwise False. - n_bootstraps : int, default=100 - Number of bootstrap samples. - conf_level : float - Confidence level for confidence intervals, i.e., 1-gamma; in (0, 1). - plot_conf_ints : bool, default=True - True if bootstrapping confidence intervals are to be plotted, otherwise False. - print_max_hw : bool, default=True - True if caption with max half-width is to be printed, otherwise False. - plot_title : str, opt - Optional title to override the one that is autmatically generated, only applies if all_in_one is True. - legend_loc : str, default="best" - specificies location of legend - ext: str, default = '.png' - Extension to add to image file path to change file type - save_as_pickle: bool, default = False - True if plot should be saved to pickle file, False otherwise. - solver_set_name: str, default = "SOLVER_SET" - Use to change name of solver groups for plot titles. - problem_set_name: str, default = "PROBLEM_SET" - USe to change name of problem groups for plot titles. - - Returns - ------- - file_list : list [str] - List compiling path names for plots produced. - - Raises - ------ - TypeError - ValueError - +) -> list[Path]: + """Plots scatterplots of mean vs. standard deviation of area under progress curves. + + Can generate either one plot per solver or a combined plot for all solvers. + + Note: + The `print_max_hw` flag is currently not implemented. + + Args: + experiments (list[list[ProblemSolver]]): Problem-solver pairs used for plotting. + all_in_one (bool, optional): If True, plot all solvers together. + Defaults to True. + n_bootstraps (int, optional): Number of bootstrap samples. Defaults to 100. + conf_level (float, optional): Confidence level for CIs (0 < conf_level < 1). + Defaults to 0.95. + plot_conf_ints (bool, optional): If True, show bootstrapped confidence + intervals. Defaults to True. + print_max_hw (bool, optional): Placeholder for printing max half-widths. + Currently unused. + plot_title (str, optional): Custom title for the plot + (applies only if `all_in_one=True`). + legend_loc (str, optional): Location of the legend + (e.g., "best", "lower right"). + ext (str, optional): File extension for saved plots. Defaults to ".png". + save_as_pickle (bool, optional): If True, save plot as a pickle file. + Defaults to False. + solver_set_name (str, optional): Label for solver group in plot titles. + Defaults to "SOLVER_SET". + problem_set_name (str, optional): Label for problem group in plot titles. + Defaults to "PROBLEM_SET". + + Returns: + list[Path]: List of file paths for the plots produced. + + Raises: + ValueError: If `n_bootstraps` is not positive or `conf_level` is outside (0, 1). """ - # Type checking - if not isinstance(experiments, list) or not all( - [isinstance(experiment, list) for experiment in experiments] - ): - error_msg = ( - "Experiments must be a list of lists of ProblemSolver objects." - ) - raise TypeError(error_msg) - if not isinstance(all_in_one, bool): - error_msg = "All in one must be a boolean." - raise TypeError(error_msg) - if not isinstance(n_bootstraps, int): - error_msg = "Number of bootstraps must be an integer." - raise TypeError(error_msg) - if not isinstance(conf_level, (int, float)): - error_msg = "Confidence level must be a float." - raise TypeError(error_msg) - if not isinstance(plot_conf_ints, bool): - error_msg = "Plot confidence intervals must be a boolean." - raise TypeError(error_msg) - if not isinstance(print_max_hw, bool): - error_msg = "Print max halfwidth must be a boolean." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) - if not isinstance(legend_loc, str): - error_msg = "Legend location must be a string." - raise TypeError(error_msg) - if not isinstance(ext, str): - error_msg = "Extension must be a string." - raise TypeError(error_msg) - if not isinstance(save_as_pickle, bool): - error_msg = "Save as pickle must be a boolean." - raise TypeError(error_msg) - if not isinstance(solver_set_name, str): - error_msg = "Solver set name must be a string." - raise TypeError(error_msg) - if not isinstance(problem_set_name, str): - error_msg = "Problem set name must be a string." - raise TypeError(error_msg) # Value checking if n_bootstraps < 1: error_msg = "Number of bootstraps must be a positive integer." @@ -3553,14 +2325,13 @@ def plot_area_scatterplots( if all_in_one: marker_list = ["o", "v", "s", "*", "P", "X", "D", "V", ">", "<"] setup_plot( - plot_type="area", + plot_type=PlotType.AREA, solver_name=solver_set_name, problem_name=problem_set_name, plot_title=plot_title, ) solver_names = [ - solver_experiments[0].solver.name - for solver_experiments in experiments + solver_experiments[0].solver.name for solver_experiments in experiments ] solver_curve_handles = [] # TODO: Build up capability to print max half-width. @@ -3582,23 +2353,20 @@ def plot_area_scatterplots( mean_estimator = float(np.mean(areas)) std_dev_estimator = float(np.std(areas, ddof=1)) if plot_conf_ints: - # Note: "experiments" needs to be a list of list of ProblemSolver objects. - mean_bs_conf_int_lb, mean_bs_conf_int_ub = ( - bootstrap_procedure( - experiments=[[experiment]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type="area_mean", - estimator=mean_estimator, - normalize=True, - ) + mean_bs_conf_int_lb, mean_bs_conf_int_ub = bootstrap_procedure( + experiments=[[experiment]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=PlotType.AREA_MEAN, + estimator=mean_estimator, + normalize=True, ) std_dev_bs_conf_int_lb, std_dev_bs_conf_int_ub = ( bootstrap_procedure( experiments=[[experiment]], n_bootstraps=n_bootstraps, conf_level=conf_level, - plot_type="area_std_dev", + plot_type=PlotType.AREA_STD_DEV, estimator=std_dev_estimator, normalize=True, ) @@ -3607,16 +2375,17 @@ def plot_area_scatterplots( # curve_pairs.append([bs_CI_lb_curve, bs_CI_ub_curve]) if isinstance(mean_bs_conf_int_lb, (Curve)) or isinstance( mean_bs_conf_int_ub, (Curve) + ): + error_msg = "Mean confidence intervals should be scalar values." + raise ValueError(error_msg) + if isinstance(std_dev_bs_conf_int_lb, (Curve)) or isinstance( + std_dev_bs_conf_int_ub, (Curve) ): error_msg = ( - "Mean confidence intervals should be scalar values." + "Standard deviation confidence intervals should " + "be scalar values." ) raise ValueError(error_msg) - if isinstance( - std_dev_bs_conf_int_lb, (Curve) - ) or isinstance(std_dev_bs_conf_int_ub, (Curve)): - error_msg = "Standard deviation confidence intervals should be scalar values." - raise ValueError(error_msg) x_err = [ [mean_estimator - mean_bs_conf_int_lb], [mean_bs_conf_int_ub - mean_estimator], @@ -3642,14 +2411,12 @@ def plot_area_scatterplots( marker=marker_str, ) solver_curve_handles.append(handle) - plt.legend( - handles=solver_curve_handles, labels=solver_names, loc=legend_loc - ) + plt.legend(handles=solver_curve_handles, labels=solver_names, loc=legend_loc) file_list.append( save_plot( solver_name=solver_set_name, problem_name=problem_set_name, - plot_type="area", + plot_type=PlotType.AREA, normalize=True, plot_title=plot_title, ext=ext, @@ -3660,7 +2427,7 @@ def plot_area_scatterplots( for solver_idx in range(n_solvers): ref_experiment = experiments[solver_idx][0] setup_plot( - plot_type="area", + plot_type=PlotType.AREA, solver_name=ref_experiment.solver.name, problem_name=problem_set_name, ) @@ -3677,23 +2444,20 @@ def plot_area_scatterplots( mean_estimator = float(np.mean(areas)) std_dev_estimator = float(np.std(areas, ddof=1)) if plot_conf_ints: - # Note: "experiments" needs to be a list of list of ProblemSolver objects. - mean_bs_conf_int_lb, mean_bs_conf_int_ub = ( - bootstrap_procedure( - experiments=[[experiment]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type="area_mean", - estimator=mean_estimator, - normalize=True, - ) + mean_bs_conf_int_lb, mean_bs_conf_int_ub = bootstrap_procedure( + experiments=[[experiment]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=PlotType.AREA_MEAN, + estimator=mean_estimator, + normalize=True, ) std_dev_bs_conf_int_lb, std_dev_bs_conf_int_ub = ( bootstrap_procedure( experiments=[[experiment]], n_bootstraps=n_bootstraps, conf_level=conf_level, - plot_type="area_std_dev", + plot_type=PlotType.AREA_STD_DEV, estimator=std_dev_estimator, normalize=True, ) @@ -3702,16 +2466,17 @@ def plot_area_scatterplots( # curve_pairs.append([bs_CI_lb_curve, bs_CI_ub_curve]) if isinstance(mean_bs_conf_int_lb, (Curve)) or isinstance( mean_bs_conf_int_ub, (Curve) + ): + error_msg = "Mean confidence intervals should be scalar values." + raise ValueError(error_msg) + if isinstance(std_dev_bs_conf_int_lb, (Curve)) or isinstance( + std_dev_bs_conf_int_ub, (Curve) ): error_msg = ( - "Mean confidence intervals should be scalar values." + "Standard deviation confidence intervals should " + "be scalar values." ) raise ValueError(error_msg) - if isinstance( - std_dev_bs_conf_int_lb, (Curve) - ) or isinstance(std_dev_bs_conf_int_ub, (Curve)): - error_msg = "Standard deviation confidence intervals should be scalar values." - raise ValueError(error_msg) x_err = [ [mean_estimator - mean_bs_conf_int_lb], [mean_bs_conf_int_ub - mean_estimator], @@ -3741,7 +2506,7 @@ def plot_area_scatterplots( save_plot( solver_name=experiment.solver.name, problem_name=problem_set_name, - plot_type="area", + plot_type=PlotType.AREA, normalize=True, ext=ext, save_as_pickle=save_as_pickle, @@ -3751,15 +2516,8 @@ def plot_area_scatterplots( def plot_solvability_profiles( - experiments: list[ - list[ProblemSolver] - ], # TODO: check if this should be list[ProblemSolver] - plot_type: Literal[ - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - ], + experiments: list[list[ProblemSolver]], + plot_type: PlotType, all_in_one: bool = True, n_bootstraps: int = 100, conf_level: float = 0.95, @@ -3774,128 +2532,49 @@ def plot_solvability_profiles( save_as_pickle: bool = False, solver_set_name: str = "SOLVER_SET", problem_set_name: str = "PROBLEM_SET", -) -> list[str | os.PathLike]: - """Plot the (difference of) solvability profiles for each solver on a set of problems. - - Parameters - ---------- - experiments : list [list [``experiment_base.ProblemSolver``]] - Problem-solver pairs used to produce plots. - plot_type : str - String indicating which type of plot to produce: - "cdf_solvability" : cdf-solvability profile; - - "quantile_solvability" : quantile-solvability profile; - - "diff_cdf_solvability" : difference of cdf-solvability profiles; - - "diff_quantile_solvability" : difference of quantile-solvability profiles. - all_in_one : bool, default=True - True if curves are to be plotted together, otherwise False. - n_bootstraps : int, default=100 - Number of bootstrap samples. - conf_level : float - Confidence level for confidence intervals, i.e., 1-gamma; in (0, 1). - plot_conf_ints : bool, default=True - True if bootstrapping confidence intervals are to be plotted, otherwise False. - print_max_hw : bool, default=True - True if caption with max half-width is to be printed, otherwise False. - solve_tol : float, default=0.1 - Relative optimality gap definining when a problem is solved; in (0, 1]. - beta : float, default=0.5 - Quantile to compute, e.g., beta quantile; in (0, 1). - ref_solver : str, optional - Name of solver used as benchmark for difference profiles. - plot_title : str, optional - Optional title to override the one that is autmatically generated, only applies if all_in_one is True. - legend_loc : str, default="best" - specificies location of legend - ext: str, default = '.png' - Extension to add to image file path to change file type - save_as_pickle: bool, default = False - True if plot should be saved to pickle file, False otherwise. - solver_set_name: str, default = "SOLVER_SET" - Use to change name of solver groups for plot titles. - problem_set_name: str, default = "PROBLEM_SET" - USe to change name of problem groups for plot titles. - - Returns - ------- - file_list : list [str] - List compiling path names for plots produced. - - Raises - ------ - TypeError - ValueError - +) -> list[Path]: + """Plots solvability or difference profiles for solvers on multiple problems. + + Args: + experiments (list[list[ProblemSolver]]): Problem-solver pairs used for plotting. + plot_type (PlotType): Type of solvability plot to produce: + - PlotType.CDF_SOLVABILITY + - PlotType.QUANTILE_SOLVABILITY + - PlotType.DIFF_CDF_SOLVABILITY + - PlotType.DIFF_QUANTILE_SOLVABILITY + all_in_one (bool, optional): If True, plot all curves together. + Defaults to True. + n_bootstraps (int, optional): Number of bootstrap samples. Defaults to 100. + conf_level (float, optional): Confidence level for intervals + (0 < conf_level < 1). Defaults to 0.95. + plot_conf_ints (bool, optional): If True, show bootstrapped confidence + intervals. Defaults to True. + print_max_hw (bool, optional): If True, print max half-width in caption. + Defaults to True. + solve_tol (float, optional): Optimality gap defining when a problem is + considered solved (0 < solve_tol ≤ 1). Defaults to 0.1. + beta (float, optional): Quantile level to compute (0 < beta < 1). + Defaults to 0.5. + ref_solver (str, optional): Name of the reference solver for difference plots. + plot_title (str, optional): Custom title for the plot + (used only if `all_in_one=True`). + legend_loc (str, optional): Location of the legend + (e.g., "best", "upper right"). + ext (str, optional): File extension for saved plots (e.g., ".png"). + Defaults to ".png". + save_as_pickle (bool, optional): If True, save plots as pickle files. + Defaults to False. + solver_set_name (str, optional): Name of solver group for plot titles. + Defaults to "SOLVER_SET". + problem_set_name (str, optional): Name of problem group for plot titles. + Defaults to "PROBLEM_SET". + + Returns: + list[Path]: List of file paths for the plots produced. + + Raises: + ValueError: If any input parameter is out of bounds or invalid. """ - # Type checking - if ( - not isinstance(experiments, list) - or not all( - [ - isinstance(experiment_list, list) - for experiment_list in experiments - ] - ) - or not all( - [ - isinstance(experiment, ProblemSolver) - for experiment in experiment_list - ] - for experiment_list in experiments - ) - ): - error_msg = ( - "Experiments must be a list of lists of ProblemSolver objects." - ) - raise TypeError(error_msg) - if not isinstance(plot_type, str): - error_msg = "Plot type must be a string." - raise TypeError(error_msg) - if not isinstance(all_in_one, bool): - error_msg = "All in one must be a boolean." - raise TypeError(error_msg) - if not isinstance(n_bootstraps, int): - error_msg = "Number of bootstraps must be an integer." - raise TypeError(error_msg) - if not isinstance(conf_level, (int, float)): - error_msg = "Confidence level must be a float." - raise TypeError(error_msg) - if not isinstance(plot_conf_ints, bool): - error_msg = "Plot confidence intervals must be a boolean." - raise TypeError(error_msg) - if not isinstance(print_max_hw, bool): - error_msg = "Print max halfwidth must be a boolean." - raise TypeError(error_msg) - if not isinstance(solve_tol, (int, float)): - error_msg = "Solve tolerance must be a float." - raise TypeError(error_msg) - if not isinstance(beta, (int, float)): - error_msg = "Beta quantile must be a float." - raise TypeError(error_msg) - if not isinstance(ref_solver, (str, type(None))): - error_msg = "Reference solver must be a string or None." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) - if not isinstance(legend_loc, (str, type(None))): - error_msg = "Legend location must be a string." - raise TypeError(error_msg) - if not isinstance(ext, str): - error_msg = "Extension must be a string." - raise TypeError(error_msg) - if not isinstance(save_as_pickle, bool): - error_msg = "Save as pickle must be a boolean." - raise TypeError(error_msg) - if not isinstance(solver_set_name, str): - error_msg = "Solver set name must be a string." - raise TypeError(error_msg) - if not isinstance(problem_set_name, str): - error_msg = "Problem set name must be a string." - raise TypeError(error_msg) # Value checking if n_bootstraps < 1: error_msg = "Number of bootstraps must be a positive integer." @@ -3918,7 +2597,7 @@ def plot_solvability_profiles( n_solvers = len(experiments) n_problems = len(experiments[0]) if all_in_one: - if plot_type == "cdf_solvability": + if plot_type == PlotType.CDF_SOLVABILITY: setup_plot( plot_type=plot_type, solver_name=solver_set_name, @@ -3926,7 +2605,7 @@ def plot_solvability_profiles( solve_tol=solve_tol, plot_title=plot_title, ) - elif plot_type == "quantile_solvability": + elif plot_type == PlotType.QUANTILE_SOLVABILITY: setup_plot( plot_type=plot_type, solver_name=solver_set_name, @@ -3935,7 +2614,7 @@ def plot_solvability_profiles( solve_tol=solve_tol, plot_title=plot_title, ) - elif plot_type == "diff_cdf_solvability": + elif plot_type == PlotType.DIFF_CDF_SOLVABILITY: setup_plot( plot_type=plot_type, solver_name=solver_set_name, @@ -3943,7 +2622,7 @@ def plot_solvability_profiles( solve_tol=solve_tol, plot_title=plot_title, ) - elif plot_type == "diff_quantile_solvability": + elif plot_type == PlotType.DIFF_QUANTILE_SOLVABILITY: setup_plot( plot_type=plot_type, solver_name=solver_set_name, @@ -3952,10 +2631,12 @@ def plot_solvability_profiles( solve_tol=solve_tol, plot_title=plot_title, ) + else: + error_msg = f"Plot type {plot_type} is not supported." + raise ValueError(error_msg) curve_pairs = [] solver_names = [ - solver_experiments[0].solver.name - for solver_experiments in experiments + solver_experiments[0].solver.name for solver_experiments in experiments ] solver_curves = [] solver_curve_handles = [] @@ -3966,48 +2647,56 @@ def plot_solvability_profiles( for problem_idx in range(n_problems): experiment = experiments[solver_idx][problem_idx] sub_curve = None - if plot_type in {"cdf_solvability", "diff_cdf_solvability"}: - sub_curve = cdf_of_curves_crossing_times( + if plot_type in [ + PlotType.CDF_SOLVABILITY, + PlotType.DIFF_CDF_SOLVABILITY, + ]: + sub_curve = curve_utils.cdf_of_curves_crossing_times( curves=experiment.progress_curves, threshold=solve_tol ) - if plot_type in { - "quantile_solvability", - "diff_quantile_solvability", - }: - sub_curve = quantile_cross_jump( + elif plot_type in [ + PlotType.QUANTILE_SOLVABILITY, + PlotType.DIFF_QUANTILE_SOLVABILITY, + ]: + sub_curve = curve_utils.quantile_cross_jump( curves=experiment.progress_curves, threshold=solve_tol, beta=beta, ) + else: + error_msg = f"Plot type {plot_type} is not supported." + raise ValueError(error_msg) if sub_curve is not None: solver_sub_curves.append(sub_curve) # Plot solvability profile for the solver. - # Exploit the fact that each solvability profile is an average of more basic curves. - solver_curve = mean_of_curves(solver_sub_curves) - # CAUTION: Using mean above requires an equal number of macro-replications per problem. + # Exploit the fact that each solvability profile is an average of more + # basic curves. + solver_curve = curve_utils.mean_of_curves(solver_sub_curves) + # CAUTION: Using mean above requires an equal number of macro-replications + # per problem. solver_curves.append(solver_curve) - if plot_type in {"cdf_solvability", "quantile_solvability"}: + if plot_type in [PlotType.CDF_SOLVABILITY, PlotType.QUANTILE_SOLVABILITY]: handle = solver_curve.plot(color_str=color_str) solver_curve_handles.append(handle) if plot_conf_ints or print_max_hw: - # Note: "experiments" needs to be a list of list of ProblemSolver objects. - bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( - bootstrap_procedure( - experiments=[experiments[solver_idx]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type=plot_type, # type: ignore - solve_tol=solve_tol, - beta=beta, - estimator=solver_curve, - normalize=True, - ) + bs_conf_int_lb_curve, bs_conf_int_ub_curve = bootstrap_procedure( + experiments=[experiments[solver_idx]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=plot_type, # type: ignore + solve_tol=solve_tol, + beta=beta, + estimator=solver_curve, + normalize=True, ) if plot_conf_ints: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) plot_bootstrap_conf_ints( bs_conf_int_lb_curve, @@ -4015,10 +2704,8 @@ def plot_solvability_profiles( color_str=color_str, ) if print_max_hw: - curve_pairs.append( - [bs_conf_int_lb_curve, bs_conf_int_ub_curve] - ) - if plot_type == "cdf_solvability": + curve_pairs.append([bs_conf_int_lb_curve, bs_conf_int_ub_curve]) + if plot_type == PlotType.CDF_SOLVABILITY: plt.legend( handles=solver_curve_handles, labels=solver_names, @@ -4042,7 +2729,7 @@ def plot_solvability_profiles( save_as_pickle=save_as_pickle, ) ) - elif plot_type == "quantile_solvability": + elif plot_type == PlotType.QUANTILE_SOLVABILITY: plt.legend( handles=solver_curve_handles, labels=solver_names, @@ -4066,26 +2753,28 @@ def plot_solvability_profiles( save_as_pickle=save_as_pickle, ) ) - elif plot_type in {"diff_cdf_solvability", "diff_quantile_solvability"}: + elif plot_type in [ + PlotType.DIFF_CDF_SOLVABILITY, + PlotType.DIFF_QUANTILE_SOLVABILITY, + ]: if ref_solver is None: - error_msg = "Reference solver must be specified for difference profiles." + error_msg = ( + "Reference solver must be specified for difference profiles." + ) raise ValueError(error_msg) non_ref_solvers = [ - solver_name - for solver_name in solver_names - if solver_name != ref_solver + solver_name for solver_name in solver_names if solver_name != ref_solver ] ref_solver_idx = solver_names.index(ref_solver) for solver_idx in range(n_solvers): if solver_idx is not ref_solver_idx: - diff_solver_curve = difference_of_curves( + diff_solver_curve = curve_utils.difference_of_curves( solver_curves[solver_idx], solver_curves[ref_solver_idx] ) color_str = "C" + str(solver_idx) handle = diff_solver_curve.plot(color_str=color_str) solver_curve_handles.append(handle) if plot_conf_ints or print_max_hw: - # Note: "experiments" needs to be a list of list of ProblemSolver objects. bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( bootstrap_procedure( experiments=[ @@ -4105,7 +2794,10 @@ def plot_solvability_profiles( if isinstance( bs_conf_int_lb_curve, (int, float) ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) plot_bootstrap_conf_ints( bs_conf_int_lb_curve, @@ -4117,8 +2809,7 @@ def plot_solvability_profiles( [bs_conf_int_lb_curve, bs_conf_int_ub_curve] ) offset_labels = [ - f"{non_ref_solver} - {ref_solver}" - for non_ref_solver in non_ref_solvers + f"{non_ref_solver} - {ref_solver}" for non_ref_solver in non_ref_solvers ] plt.legend( handles=solver_curve_handles, @@ -4132,7 +2823,7 @@ def plot_solvability_profiles( conf_level=conf_level, difference=True, ) - if plot_type == "diff_cdf_solvability": + if plot_type == PlotType.DIFF_CDF_SOLVABILITY: file_list.append( save_plot( solver_name=solver_set_name, @@ -4145,7 +2836,7 @@ def plot_solvability_profiles( save_as_pickle=save_as_pickle, ) ) - elif plot_type == "diff_quantile_solvability": + elif plot_type == PlotType.DIFF_QUANTILE_SOLVABILITY: file_list.append( save_plot( solver_name=solver_set_name, @@ -4158,10 +2849,12 @@ def plot_solvability_profiles( save_as_pickle=save_as_pickle, ) ) + else: + error_msg = f"Plot type {plot_type} is not supported." + raise ValueError(error_msg) else: solver_names = [ - solver_experiments[0].solver.name - for solver_experiments in experiments + solver_experiments[0].solver.name for solver_experiments in experiments ] solver_curves = [] for solver_idx in range(n_solvers): @@ -4170,28 +2863,35 @@ def plot_solvability_profiles( for problem_idx in range(n_problems): experiment = experiments[solver_idx][problem_idx] sub_curve = None - if plot_type in {"cdf_solvability", "diff_cdf_solvability"}: - sub_curve = cdf_of_curves_crossing_times( + if plot_type in [ + PlotType.CDF_SOLVABILITY, + PlotType.DIFF_CDF_SOLVABILITY, + ]: + sub_curve = curve_utils.cdf_of_curves_crossing_times( curves=experiment.progress_curves, threshold=solve_tol ) - if plot_type in { - "quantile_solvability", - "diff_quantile_solvability", - }: - sub_curve = quantile_cross_jump( + elif plot_type in [ + PlotType.QUANTILE_SOLVABILITY, + PlotType.DIFF_QUANTILE_SOLVABILITY, + ]: + sub_curve = curve_utils.quantile_cross_jump( curves=experiment.progress_curves, threshold=solve_tol, beta=beta, ) + else: + error_msg = f"Plot type {plot_type} is not supported." + raise ValueError(error_msg) if sub_curve is not None: solver_sub_curves.append(sub_curve) # Plot solvability profile for the solver. - # Exploit the fact that each solvability profile is an average of more basic curves. - solver_curve = mean_of_curves(solver_sub_curves) + # Exploit the fact that each solvability profile is an average of more + # basic curves. + solver_curve = curve_utils.mean_of_curves(solver_sub_curves) solver_curves.append(solver_curve) - if plot_type in {"cdf_solvability", "quantile_solvability"}: + if plot_type in {PlotType.CDF_SOLVABILITY, PlotType.QUANTILE_SOLVABILITY}: # Set up plot. - if plot_type == "cdf_solvability": + if plot_type == PlotType.CDF_SOLVABILITY: file_list.append( setup_plot( plot_type=plot_type, @@ -4200,7 +2900,7 @@ def plot_solvability_profiles( solve_tol=solve_tol, ) ) - elif plot_type == "quantile_solvability": + elif plot_type == PlotType.QUANTILE_SOLVABILITY: file_list.append( setup_plot( plot_type=plot_type, @@ -4212,42 +2912,42 @@ def plot_solvability_profiles( ) handle = solver_curve.plot() if plot_conf_ints or print_max_hw: - # Note: "experiments" needs to be a list of list of ProblemSolver objects. - bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( - bootstrap_procedure( - experiments=[experiments[solver_idx]], - n_bootstraps=n_bootstraps, - conf_level=conf_level, - plot_type=plot_type, # type: ignore - solve_tol=solve_tol, - beta=beta, - estimator=solver_curve, - normalize=True, - ) + bs_conf_int_lb_curve, bs_conf_int_ub_curve = bootstrap_procedure( + experiments=[experiments[solver_idx]], + n_bootstraps=n_bootstraps, + conf_level=conf_level, + plot_type=plot_type, + solve_tol=solve_tol, + beta=beta, + estimator=solver_curve, + normalize=True, ) if plot_conf_ints: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) plot_bootstrap_conf_ints( bs_conf_int_lb_curve, bs_conf_int_ub_curve ) if print_max_hw: - if isinstance( - bs_conf_int_lb_curve, (int, float) - ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Max halfwidth is not available for scalar estimators." + if isinstance(bs_conf_int_lb_curve, (int, float)) or isinstance( + bs_conf_int_ub_curve, (int, float) + ): + error_msg = ( + "Max halfwidth is not available for scalar estimators." + ) raise ValueError(error_msg) report_max_halfwidth( - curve_pairs=[ - [bs_conf_int_lb_curve, bs_conf_int_ub_curve] - ], + curve_pairs=[[bs_conf_int_lb_curve, bs_conf_int_ub_curve]], normalize=True, conf_level=conf_level, ) - if plot_type == "cdf_solvability": + if plot_type == PlotType.CDF_SOLVABILITY: file_list.append( save_plot( solver_name=experiments[solver_idx][0].solver.name, @@ -4259,7 +2959,7 @@ def plot_solvability_profiles( save_as_pickle=save_as_pickle, ) ) - elif plot_type == "quantile_solvability": + elif plot_type == PlotType.QUANTILE_SOLVABILITY: file_list.append( save_plot( solver_name=experiments[solver_idx][0].solver.name, @@ -4271,47 +2971,45 @@ def plot_solvability_profiles( save_as_pickle=save_as_pickle, ) ) - if plot_type in {"diff_cdf_solvability", "diff_quantile_solvability"}: + if plot_type in [ + PlotType.DIFF_CDF_SOLVABILITY, + PlotType.DIFF_QUANTILE_SOLVABILITY, + ]: if ref_solver is None: - error_msg = "Reference solver must be specified for difference profiles." + error_msg = ( + "Reference solver must be specified for difference profiles." + ) raise ValueError(error_msg) non_ref_solvers = [ - solver_name - for solver_name in solver_names - if solver_name != ref_solver + solver_name for solver_name in solver_names if solver_name != ref_solver ] ref_solver_idx = solver_names.index(ref_solver) for solver_idx in range(n_solvers): if solver_idx is not ref_solver_idx: - if plot_type == "diff_cdf_solvability": + if plot_type == PlotType.DIFF_CDF_SOLVABILITY: file_list.append( setup_plot( plot_type=plot_type, - solver_name=experiments[solver_idx][ - 0 - ].solver.name, + solver_name=experiments[solver_idx][0].solver.name, problem_name=problem_set_name, solve_tol=solve_tol, ) ) - elif plot_type == "diff_quantile_solvability": + elif plot_type == PlotType.DIFF_QUANTILE_SOLVABILITY: file_list.append( setup_plot( plot_type=plot_type, - solver_name=experiments[solver_idx][ - 0 - ].solver.name, + solver_name=experiments[solver_idx][0].solver.name, problem_name=problem_set_name, beta=beta, solve_tol=solve_tol, ) ) - diff_solver_curve = difference_of_curves( + diff_solver_curve = curve_utils.difference_of_curves( solver_curves[solver_idx], solver_curves[ref_solver_idx] ) handle = diff_solver_curve.plot() if plot_conf_ints or print_max_hw: - # Note: "experiments" needs to be a list of list of ProblemSolver objects. bs_conf_int_lb_curve, bs_conf_int_ub_curve = ( bootstrap_procedure( experiments=[ @@ -4320,7 +3018,7 @@ def plot_solvability_profiles( ], n_bootstraps=n_bootstraps, conf_level=conf_level, - plot_type=plot_type, # type: ignore + plot_type=plot_type, solve_tol=solve_tol, beta=beta, estimator=diff_solver_curve, @@ -4331,7 +3029,10 @@ def plot_solvability_profiles( if isinstance( bs_conf_int_lb_curve, (int, float) ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Bootstrap confidence intervals are not available for scalar estimators." + error_msg = ( + "Bootstrap confidence intervals are not available " + "for scalar estimators." + ) raise ValueError(error_msg) plot_bootstrap_conf_ints( bs_conf_int_lb_curve, bs_conf_int_ub_curve @@ -4340,7 +3041,10 @@ def plot_solvability_profiles( if isinstance( bs_conf_int_lb_curve, (int, float) ) or isinstance(bs_conf_int_ub_curve, (int, float)): - error_msg = "Max halfwidth is not available for scalar estimators." + error_msg = ( + "Max halfwidth is not available for " + "scalar estimators." + ) raise ValueError(error_msg) report_max_halfwidth( curve_pairs=[ @@ -4350,12 +3054,10 @@ def plot_solvability_profiles( conf_level=conf_level, difference=True, ) - if plot_type == "diff_cdf_solvability": + if plot_type == PlotType.DIFF_CDF_SOLVABILITY: file_list.append( save_plot( - solver_name=experiments[solver_idx][ - 0 - ].solver.name, + solver_name=experiments[solver_idx][0].solver.name, problem_name=problem_set_name, plot_type=plot_type, normalize=True, @@ -4364,12 +3066,10 @@ def plot_solvability_profiles( save_as_pickle=save_as_pickle, ) ) - elif plot_type == "diff_quantile_solvability": + elif plot_type == PlotType.DIFF_QUANTILE_SOLVABILITY: file_list.append( save_plot( - solver_name=experiments[solver_idx][ - 0 - ].solver.name, + solver_name=experiments[solver_idx][0].solver.name, problem_name=problem_set_name, plot_type=plot_type, normalize=True, @@ -4383,80 +3083,42 @@ def plot_solvability_profiles( def plot_terminal_progress( experiments: list[ProblemSolver], - plot_type: Literal["box", "violin"] = "violin", + plot_type: PlotType = PlotType.VIOLIN, normalize: bool = True, all_in_one: bool = True, plot_title: str | None = None, ext: str = ".png", save_as_pickle: bool = False, solver_set_name: str = "SOLVER_SET", -) -> list[str | os.PathLike]: - """Plot individual or aggregate terminal progress for one or more solvers on a single problem. - - Parameters - ---------- - experiments : list [``experiment_base.ProblemSolver``] - ProblemSolver pairs of different solvers on a common problem. - plot_type : str, default="violin" - String indicating which type of plot to produce: - - "box" : comparative box plots; - - "violin" : comparative violin plots. - normalize : bool, default=True - True if progress curves are to be normalized w.r.t. optimality gaps, - otherwise False. - all_in_one : bool, default=True - True if curves are to be plotted together, otherwise False. - plot_title : str, opt - Optional title to override the one that is autmatically generated, only applies if all_in_one is True. - ext: str, default = '.png' - Extension to add to image file path to change file type - save_as_pickle: bool, default = False - True if plot should be saved to pickle file, False otherwise. - solver_set_name: str, default = "SOLVER_SET" - Use to change name of solver groups for plot titles. - - Returns - ------- - file_list : list [str] - List compiling path names for plots produced. - - Raises - ------ - TypeError - ValueError - +) -> list[Path]: + """Plots terminal progress as box or violin plots for solvers on a single problem. + + Args: + experiments (list[ProblemSolver]): ProblemSolver pairs for different solvers on + a common problem. + plot_type (str, optional): Type of plot to generate: "box" or "violin". + Defaults to "violin". + normalize (bool, optional): If True, normalize progress curves by optimality + gaps. Defaults to True. + all_in_one (bool, optional): If True, plot all curves in one figure. + Defaults to True. + plot_title (str, optional): Custom title to override the default. Used only if + all_in_one is True. + ext (str, optional): File extension for saved plots (e.g., ".png"). + Defaults to ".png". + save_as_pickle (bool, optional): If True, save the plot as a pickle file. + Defaults to False. + solver_set_name (str, optional): Label for solver group in plot titles. + Defaults to "SOLVER_SET". + + Returns: + list[str]: List of file paths for the plots produced. + + Raises: + ValueError: If an unsupported plot type is specified. """ - # Type checking - if not isinstance(experiments, list) or not all( - [isinstance(experiment, ProblemSolver) for experiment in experiments] - ): - error_msg = "Experiments must be a list of ProblemSolver objects." - raise TypeError(error_msg) - if not isinstance(plot_type, str): - error_msg = "Plot type must be a string." - raise TypeError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) - if not isinstance(all_in_one, bool): - error_msg = "All in one must be a boolean." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) - if not isinstance(ext, str): - error_msg = "Extension must be a string." - raise TypeError(error_msg) - if not isinstance(save_as_pickle, bool): - error_msg = "Save as pickle must be a boolean." - raise TypeError(error_msg) - if not isinstance(solver_set_name, str): - error_msg = "Solver set name must be a string." - raise TypeError(error_msg) # Value checking - if plot_type not in ["box", "violin"]: + if plot_type not in [PlotType.BOX, PlotType.VIOLIN]: error_msg = "Plot type must be either 'box' or 'violin'." raise ValueError(error_msg) @@ -4492,42 +3154,41 @@ def plot_terminal_progress( ] for experiment in experiments ] - if plot_type == "box": + if plot_type == PlotType.BOX: plt.boxplot(terminal_data) plt.xticks( range(1, n_experiments + 1), labels=[experiment.solver.name for experiment in experiments], ) - elif plot_type == "violin": - solver_names = [ - experiments[exp_idx].solver.name - for exp_idx in range(n_experiments) - for td in terminal_data[exp_idx] - ] - terminal_values = [ - td - for exp_idx in range(n_experiments) - for td in terminal_data[exp_idx] - ] + elif plot_type == PlotType.VIOLIN: + import seaborn as sns + + # Construct dictionary of lists directly terminal_data_dict = { - "Solvers": solver_names, - "Terminal": terminal_values, + "Solvers": [ + experiments[exp_idx].solver.name + for exp_idx in range(n_experiments) + for _ in terminal_data[exp_idx] + ], + "Terminal": [ + td + for exp_idx in range(n_experiments) + for td in terminal_data[exp_idx] + ], } - terminal_data_df = pd.DataFrame(terminal_data_dict) - # sns.violinplot(x="Solvers", y="Terminal", data=terminal_data_df, inner="stick", scale="width", showmeans=True, bw = 0.2, cut=2) + sns.violinplot( x="Solvers", y="Terminal", - data=terminal_data_df, + data=terminal_data_dict, inner="stick", density_norm="width", cut=0.1, hue="Solvers", ) - if normalize: - plt.ylabel("Terminal Progress") - else: - plt.ylabel("Terminal Objective") + + plt.ylabel("Terminal Progress" if normalize else "Terminal Objective") + file_list.append( save_plot( solver_name=solver_set_name, @@ -4549,31 +3210,23 @@ def plot_terminal_progress( budget=experiment.problem.factors["budget"], ) if normalize: - terminal_data = [ - experiment.progress_curves[mrep].y_vals[-1] - for mrep in range(experiment.n_macroreps) - ] + curves = experiment.progress_curves else: - terminal_data = [ - experiment.objective_curves[mrep].y_vals[-1] - for mrep in range(experiment.n_macroreps) - ] - if plot_type == "box": + curves = experiment.objective_curves + terminal_data = [curve.y_vals[-1] for curve in curves] + if plot_type == PlotType.BOX: plt.boxplot(terminal_data) plt.xticks([1], labels=[experiment.solver.name]) - if plot_type == "violin": - solver_name_rep = [ - experiment.solver.name for td in terminal_data - ] + if plot_type == PlotType.VIOLIN: terminal_data_dict = { - "Solver": solver_name_rep, + "Solver": [experiment.solver.name] * len(terminal_data), "Terminal": terminal_data, } - terminal_data_df = pd.DataFrame(terminal_data_dict) + import seaborn as sns + sns.violinplot( - x="Solver", - y="Terminal", - data=terminal_data_df, + x=terminal_data_dict["Solver"], + y=terminal_data_dict["Terminal"], inner="stick", ) if normalize: @@ -4602,83 +3255,32 @@ def plot_terminal_scatterplots( save_as_pickle: bool = False, solver_set_name: str = "SOLVER_SET", problem_set_name: str = "PROBLEM_SET", -) -> list[str | os.PathLike]: - """Plot a scatter plot of mean and standard deviation of terminal progress. - - Either one plot for each solver or one plot for all solvers. - - Parameters - ---------- - experiments : list [list [``experiment_base.ProblemSolver``]] - ProblemSolver pairs used to produce plots. - all_in_one : bool, default=True - True if curves are to be plotted together, otherwise False. - plot_title : str, opt - Optional title to override the one that is autmatically generated, only applies if all_in_one is True. - legend_loc : str, default="best" - specificies location of legend - ext: str, default = '.png' - Extension to add to image file path to change file type - save_as_pickle: bool, default = False - True if plot should be saved to pickle file, False otherwise. - solver_set_name: str, default = "SOLVER_SET" - Use to change name of solver groups for plot titles. - problem_set_name: str, default = "PROBLEM_SET" - USe to change name of problem groups for plot titles. - - Returns - ------- - file_list : list [str] - List compiling path names for plots produced. - - Raises - ------ - TypeError - +) -> list[Path]: + """Plot scatter plots of the mean and standard deviation of terminal progress. + + Either creates one plot per solver or a combined plot for all solvers. + + Args: + experiments (list[list[ProblemSolver]]): Problem-solver pairs used to produce + plots. + all_in_one (bool, optional): Whether to plot all solvers in one figure. + Defaults to True. + plot_title (str | None, optional): Title to override the autogenerated one + (only applies if `all_in_one` is True). + legend_loc (str | None, optional): Location of the legend (e.g., "best"). + Defaults to None. + ext (str, optional): File extension to use for output images. + Defaults to ".png". + save_as_pickle (bool, optional): Whether to also save the plots as `.pickle` + files. Defaults to False. + solver_set_name (str, optional): Name for the solver group used in plot titles. + Defaults to "SOLVER_SET". + problem_set_name (str, optional): Name for the problem group used in plot + titles. Defaults to "PROBLEM_SET". + + Returns: + list[Path]: A list of file paths to the plots produced. """ - # Type checking - if ( - not isinstance(experiments, list) - or not all( - [ - isinstance(experiment_list, list) - for experiment_list in experiments - ] - ) - or not all( - [ - isinstance(experiment, ProblemSolver) - for experiment in experiment_list - ] - for experiment_list in experiments - ) - ): - error_msg = ( - "Experiments must be a list of lists of ProblemSolver objects." - ) - raise TypeError(error_msg) - if not isinstance(all_in_one, bool): - error_msg = "All in one must be a boolean." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) - if not isinstance(legend_loc, (str, type(None))): - error_msg = "Legend location must be a string." - raise TypeError(error_msg) - if not isinstance(ext, str): - error_msg = "Extension must be a string." - raise TypeError(error_msg) - if not isinstance(save_as_pickle, bool): - error_msg = "Save as pickle must be a boolean." - raise TypeError(error_msg) - if not isinstance(solver_set_name, str): - error_msg = "Solver set name must be a string." - raise TypeError(error_msg) - if not isinstance(problem_set_name, str): - error_msg = "Problem set name must be a string." - raise TypeError(error_msg) - if legend_loc is None: legend_loc = "best" @@ -4689,14 +3291,13 @@ def plot_terminal_scatterplots( if all_in_one: marker_list = ["o", "v", "s", "*", "P", "X", "D", "V", ">", "<"] setup_plot( - plot_type="terminal_scatter", + plot_type=PlotType.TERMINAL_SCATTER, solver_name=solver_set_name, problem_name=problem_set_name, plot_title=plot_title, ) solver_names = [ - solver_experiments[0].solver.name - for solver_experiments in experiments + solver_experiments[0].solver.name for solver_experiments in experiments ] solver_curve_handles = [] handle = None @@ -4708,9 +3309,7 @@ def plot_terminal_scatterplots( solver_idx % len(marker_list) ] # Cycle through list of marker types. # Plot mean and standard deviation of terminal progress. - terminals = [ - curve.y_vals[-1] for curve in experiment.progress_curves - ] + terminals = [curve.y_vals[-1] for curve in experiment.progress_curves] mean_estimator = np.mean(terminals) std_dev_estimator = np.std(terminals, ddof=1) handle = plt.scatter( @@ -4720,14 +3319,12 @@ def plot_terminal_scatterplots( marker=marker_str, ) solver_curve_handles.append(handle) - plt.legend( - handles=solver_curve_handles, labels=solver_names, loc=legend_loc - ) + plt.legend(handles=solver_curve_handles, labels=solver_names, loc=legend_loc) file_list.append( save_plot( solver_name=solver_set_name, problem_name=problem_set_name, - plot_type="terminal_scatter", + plot_type=PlotType.TERMINAL_SCATTER, normalize=True, plot_title=plot_title, ext=ext, @@ -4738,7 +3335,7 @@ def plot_terminal_scatterplots( for solver_idx in range(n_solvers): ref_experiment = experiments[solver_idx][0] setup_plot( - plot_type="terminal_scatter", + plot_type=PlotType.TERMINAL_SCATTER, solver_name=ref_experiment.solver.name, problem_name=problem_set_name, ) @@ -4746,9 +3343,7 @@ def plot_terminal_scatterplots( for problem_idx in range(n_problems): experiment = experiments[solver_idx][problem_idx] # Plot mean and standard deviation of terminal progress. - terminals = [ - curve.y_vals[-1] for curve in experiment.progress_curves - ] + terminals = [curve.y_vals[-1] for curve in experiment.progress_curves] mean_estimator = np.mean(terminals) std_dev_estimator = np.std(terminals, ddof=1) handle = plt.scatter( @@ -4762,7 +3357,7 @@ def plot_terminal_scatterplots( save_plot( solver_name=experiment.solver.name, problem_name=problem_set_name, - plot_type="terminal_scatter", + plot_type=PlotType.TERMINAL_SCATTER, normalize=True, ext=ext, save_as_pickle=save_as_pickle, @@ -4772,20 +3367,7 @@ def plot_terminal_scatterplots( def setup_plot( - plot_type: Literal[ - "all", - "mean", - "quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - "area", - "box", - "violin", - "terminal_scatter", - ], + plot_type: PlotType, solver_name: str = "SOLVER SET", problem_name: str = "PROBLEM SET", normalize: bool = True, @@ -4794,99 +3376,36 @@ def setup_plot( solve_tol: float | None = None, plot_title: str | None = None, ) -> None: - """Create new figure. Add labels to plot and reformat axes. - - Parameters - ---------- - plot_type : str - String indicating which type of plot to produce: - "all" : all estimated progress curves; - - "mean" : estimated mean progress curve; - - "quantile" : estimated beta quantile progress curve; - - "solve_time_cdf" : cdf of solve time; - - "cdf_solvability" : cdf solvability profile; - - "quantile_solvability" : quantile solvability profile; - - "diff_cdf_solvability" : difference of cdf solvability profiles; - - "diff_quantile_solvability" : difference of quantile solvability profiles; - - "area" : area scatterplot; - - "box" : box plot of terminal progress; - - "violin" : violin plot of terminal progress; - - "terminal_scatter" : scatterplot of mean and std dev of terminal progress. - solver_name : str, default="SOLVER_SET" - Name of solver. - problem_name : str, default="PROBLEM_SET" - Name of problem. - normalize : bool, default=True - True if progress curves are to be normalized w.r.t. optimality gaps, - otherwise False. - budget : int, optional - Budget of problem, measured in function evaluations. - beta : float, optional - Quantile to compute, e.g., beta quantile; in (0, 1). - solve_tol : float, optional - Relative optimality gap definining when a problem is solved; in (0, 1]. - plot_title : str, optional - Optional title to override the one that is autmatically generated. - - Raises - ------ - TypeError - ValueError - + """Create a new figure, add labels to the plot, and reformat axes. + + Args: + plot_type (PlotType): Type of plot to produce. Valid options include: + - ALL: All estimated progress curves. + - MEAN: Estimated mean progress curve. + - QUANTILE: Estimated beta quantile progress curve. + - SOLVE_TIME_CDF: CDF of solve time. + - CDF_SOLVABILITY: CDF solvability profile. + - QUANTILE_SOLVABILITY: Quantile solvability profile. + - DIFF_CDF_SOLVABILITY: Difference of CDF solvability profiles. + - DIFF_QUANTILE_SOLVABILITY: Difference of quantile solvability profiles. + - AREA: Area scatterplot. + - BOX: Box plot of terminal progress. + - VIOLIN: Violin plot of terminal progress. + - TERMINAL_SCATTER: Scatterplot of mean and std dev of terminal progress. + solver_name (str, optional): Name of the solver. Defaults to "SOLVER SET". + problem_name (str, optional): Name of the problem. Defaults to "PROBLEM SET". + normalize (bool, optional): Whether to normalize with respect to optimality + gaps. Defaults to True. + budget (int, optional): Function evaluation budget. + beta (float, optional): Quantile to compute (must be in (0, 1)). + solve_tol (float, optional): Relative optimality gap for declaring a solve + (must be in (0, 1]). + plot_title (str, optional): Title to override the automatically generated one. + + Raises: + ValueError: If any inputs are invalid. """ - # Type checking - if not isinstance(plot_type, str): - error_msg = "Plot type must be a string." - raise TypeError(error_msg) - if not isinstance(solver_name, str): - error_msg = "Solver name must be a string." - raise TypeError(error_msg) - if not isinstance(problem_name, str): - error_msg = "Problem name must be a string." - raise TypeError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) - if not isinstance(budget, (int, type(None))): - error_msg = "Budget must be an integer or None." - raise TypeError(error_msg) - if not isinstance(beta, (float, type(None))): - error_msg = "Beta must be a float or None." - raise TypeError(error_msg) - if not isinstance(solve_tol, (float, type(None))): - error_msg = "Solve tolerance must be a float or None." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) # Value checking - if plot_type not in [ - "all", - "mean", - "quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - "area", - "box", - "violin", - "terminal_scatter", - ]: - error_msg = f"Plot type '{plot_type}' is not recognized." - raise ValueError(error_msg) if isinstance(beta, float) and not 0 < beta < 1: error_msg = "Beta must be in (0, 1)." raise ValueError(error_msg) @@ -4898,87 +3417,98 @@ def setup_plot( # Set up axes and axis labels. if normalize: plt.ylabel("Fraction of Initial Optimality Gap", size=14) - if plot_type != "box" and plot_type != "violin": + if plot_type != PlotType.BOX and plot_type != PlotType.VIOLIN: plt.xlabel("Fraction of Budget", size=14) plt.xlim((0, 1)) plt.ylim((-0.1, 1.1)) plt.tick_params(axis="both", which="major", labelsize=12) else: plt.ylabel("Objective Function Value", size=14) - if plot_type != "box" and plot_type != "violin": + if plot_type != PlotType.BOX and plot_type != PlotType.VIOLIN: plt.xlabel("Budget", size=14) plt.xlim((0, budget)) plt.tick_params(axis="both", which="major", labelsize=12) # Specify title (plus alternative y-axis label and alternative axes). - if plot_type == "all": - if normalize: - title = f"{solver_name} on {problem_name}\nProgress Curves" - else: - title = f"{solver_name} on {problem_name}\nObjective Curves" - elif plot_type == "mean": - if normalize: - title = f"{solver_name} on {problem_name}\nMean Progress Curve" - else: - title = f"{solver_name} on {problem_name}\nMean Objective Curve" - elif plot_type == "quantile": + if plot_type == PlotType.ALL: + title = f"{solver_name} on {problem_name}\n" + title += "Progress Curves" if normalize else "Objective Curves" + elif plot_type == PlotType.MEAN: + title = f"{solver_name} on {problem_name}\n" + title += "Mean Progress Curve" if normalize else "Mean Objective Curve" + elif plot_type == PlotType.QUANTILE: if beta is None: error_msg = "Beta must be specified for quantile plot." raise ValueError(error_msg) - if normalize: - title = f"{solver_name} on {problem_name}\n{round(beta, 2)}-Quantile Progress Curve" - else: - title = f"{solver_name} on {problem_name}\n{round(beta, 2)}-Quantile Objective Curve" - elif plot_type == "solve_time_cdf": + beta_rounded = round(beta, 2) + title = f"{solver_name} on {problem_name}\n{beta_rounded}-Quantile " + title += "Progress Curve" if normalize else "Objective Curve" + elif plot_type == PlotType.SOLVE_TIME_CDF: if solve_tol is None: error_msg = "Solve tolerance must be specified for cdf plot." raise ValueError(error_msg) plt.ylabel("Fraction of Macroreplications Solved", size=14) - title = f"{solver_name} on {problem_name}\nCDF of {round(solve_tol, 2)}-Solve Times" - elif plot_type == "cdf_solvability": + solve_tol_rounded = round(solve_tol, 2) + title = f"{solver_name} on {problem_name}\n" + title += f"CDF of {solve_tol_rounded}-Solve Times" + elif plot_type == PlotType.CDF_SOLVABILITY: if solve_tol is None: - error_msg = ( - "Solve tolerance must be specified for cdf solvability plot." - ) + error_msg = "Solve tolerance must be specified for cdf solvability plot." raise ValueError(error_msg) plt.ylabel("Problem Averaged Solve Fraction", size=14) - title = f"CDF-Solvability Profile for {solver_name}\nProfile of CDFs of {round(solve_tol, 2)}-Solve Times" - elif plot_type == "quantile_solvability": + title = ( + f"CDF-Solvability Profile for {solver_name}\n" + f"Profile of CDFs of {round(solve_tol, 2)}-Solve Times" + ) + elif plot_type == PlotType.QUANTILE_SOLVABILITY: if beta is None: error_msg = "Beta must be specified for quantile solvability plot." raise ValueError(error_msg) if solve_tol is None: - error_msg = "Solve tolerance must be specified for quantile solvability plot." + error_msg = ( + "Solve tolerance must be specified for quantile solvability plot." + ) raise ValueError(error_msg) plt.ylabel("Fraction of Problems Solved", size=14) - title = f"Quantile Solvability Profile for {solver_name}\nProfile of {round(beta, 2)}-Quantiles of {round(solve_tol, 2)}-Solve Times" - elif plot_type == "diff_cdf_solvability": + title = ( + f"Quantile Solvability Profile for {solver_name}\n" + f"Profile of {round(beta, 2)}-Quantiles " + f"of {round(solve_tol, 2)}-Solve Times" + ) + elif plot_type == PlotType.DIFF_CDF_SOLVABILITY: if solve_tol is None: - error_msg = ( - "Solve tolerance must be specified for cdf solvability plot." - ) + error_msg = "Solve tolerance must be specified for cdf solvability plot." raise ValueError(error_msg) plt.ylabel("Difference in Problem Averaged Solve Fraction", size=14) - title = f"Difference of CDF-Solvability Profile for {solver_name}\nDifference of Profiles of CDFs of {round(solve_tol, 2)}-Solve Times" + title = ( + f"Difference of CDF-Solvability Profile for {solver_name}\n" + f"Difference of Profiles of CDFs of {round(solve_tol, 2)}-Solve Times" + ) plt.plot([0, 1], [0, 0], color="black", linestyle="--") plt.ylim((-1, 1)) - elif plot_type == "diff_quantile_solvability": + elif plot_type == PlotType.DIFF_QUANTILE_SOLVABILITY: if beta is None: error_msg = "Beta must be specified for quantile solvability plot." raise ValueError(error_msg) if solve_tol is None: - error_msg = "Solve tolerance must be specified for quantile solvability plot." + error_msg = ( + "Solve tolerance must be specified for quantile solvability plot." + ) raise ValueError(error_msg) plt.ylabel("Difference in Fraction of Problems Solved", size=14) - title = f"Difference of Quantile Solvability Profile for {solver_name}\nDifference of Profiles of {round(beta, 2)}-Quantiles of {round(solve_tol, 2)}-Solve Times" + title = ( + f"Difference of Quantile Solvability Profile for {solver_name}\n" + f"Difference of Profiles of {round(beta, 2)}-Quantiles " + f"of {round(solve_tol, 2)}-Solve Times" + ) plt.plot([0, 1], [0, 0], color="black", linestyle="--") plt.ylim((-1, 1)) - elif plot_type == "area": + elif plot_type == PlotType.AREA: plt.xlabel("Mean Area", size=14) plt.ylabel("Std Dev of Area") # plt.xlim((0, 1)) # plt.ylim((0, 0.5)) title = f"{solver_name}\nAreas Under Progress Curves" - elif plot_type == "box" or plot_type == "violin": + elif plot_type == PlotType.BOX or plot_type == PlotType.VIOLIN: plt.xlabel("Solvers") if normalize: plt.ylabel("Terminal Progress") @@ -4986,7 +3516,7 @@ def setup_plot( else: plt.ylabel("Terminal Objective") title = f"{solver_name} on {problem_name}" - elif plot_type == "terminal_scatter": + elif plot_type == PlotType.TERMINAL_SCATTER: plt.xlabel("Mean Terminal Progress", size=14) plt.ylabel("Std Dev of Terminal Progress") # plt.xlim((0, 1)) @@ -5004,170 +3534,88 @@ def setup_plot( def save_plot( solver_name: str, problem_name: str, - plot_type: Literal[ - "all", - "mean", - "quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - "area", - "box", - "violin", - "terminal_scatter", - ], + plot_type: PlotType, normalize: bool, extra: float | list[float] | None = None, plot_title: str | None = None, ext: str = ".png", save_as_pickle: bool = False, -) -> str | os.PathLike: - """Create new figure. Add labels to plot and reformat axes. - - Parameters - ---------- - solver_name : str - Name of solver. - problem_name : str - Name of problem. - plot_type : str - String indicating which type of plot to produce: - "all" : all estimated progress curves; - - "mean" : estimated mean progress curve; - - "quantile" : estimated beta quantile progress curve; - - "solve_time_cdf" : cdf of solve time; - - "cdf_solvability" : cdf solvability profile; - - "quantile_solvability" : quantile solvability profile; - - "diff_cdf_solvability" : difference of cdf solvability profiles; - - "diff_quantile_solvability" : difference of quantile solvability profiles; - - "area" : area scatterplot; - - "terminal_scatter" : scatterplot of mean and std dev of terminal progress. - normalize : bool - True if progress curves are to be normalized w.r.t. optimality gaps, - otherwise False. - extra : float | list [float], optional - Extra number(s) specifying quantile (e.g., beta) and/or solve tolerance. - plot_title: str, opt - Will change name of save file if generic title is overwritten. - ext: str, default = '.png' - Extension to add to image file path to change file type - save_as_pickle: bool, default = False - True if plot should be saved to pickle file, False otherwise. - - Returns - ------- - path_name : str - Path name pointing to location where plot will be saved. - - Raises - ------ - TypeError - +) -> Path: + """Create and save a plot with appropriate labels and formatting. + + Args: + solver_name (str): Name of the solver. + problem_name (str): Name of the problem. + plot_type (PlotType): Type of plot to produce. Valid options include: + - ALL: All estimated progress curves. + - MEAN: Estimated mean progress curve. + - QUANTILE: Estimated beta quantile progress curve. + - SOLVE_TIME_CDF: CDF of solve time. + - CDF_SOLVABILITY: CDF solvability profile. + - QUANTILE_SOLVABILITY: Quantile solvability profile. + - DIFF_CDF_SOLVABILITY: Difference of CDF solvability profiles. + - DIFF_QUANTILE_SOLVABILITY: Difference of quantile solvability profiles. + - AREA: Area scatterplot. + - TERMINAL_SCATTER: Scatterplot of mean and std dev of terminal progress. + normalize (bool): Whether to normalize with respect to optimality gaps. + extra (float | list[float], optional): Extra number(s) specifying quantile + (e.g., beta) and/or solve tolerance. + plot_title (str | None, optional): If provided, overrides the default title + and filename. + ext (str, optional): File extension for the saved plot. Defaults to ".png". + save_as_pickle (bool, optional): Whether to save the plot as a pickle file. + Defaults to False. + + Returns: + Path: Path pointing to the location where the plot will be saved. """ - # Type checking - if not isinstance(solver_name, str): - error_msg = "Solver name must be a string." - raise TypeError(error_msg) - if not isinstance(problem_name, str): - error_msg = "Problem name must be a string." - raise TypeError(error_msg) - if plot_type not in [ - "all", - "mean", - "quantile", - "solve_time_cdf", - "cdf_solvability", - "quantile_solvability", - "diff_cdf_solvability", - "diff_quantile_solvability", - "area", - "box", - "violin", - "terminal_scatter", - ]: - error_msg = f"Plot type '{plot_type}' is not recognized." - raise ValueError(error_msg) - if not isinstance(normalize, bool): - error_msg = "Normalize must be a boolean." - raise TypeError(error_msg) - if not isinstance(extra, (float, list, type(None))) or ( - isinstance(extra, list) and not all(isinstance(e, float) for e in extra) - ): - error_msg = "Extra must be a float, list of floats, or None." - raise TypeError(error_msg) - if not isinstance(plot_title, (str, type(None))): - error_msg = "Plot title must be a string or None." - raise TypeError(error_msg) - if not isinstance(ext, str): - error_msg = "Extension must be a string." - raise TypeError(error_msg) - if not isinstance(save_as_pickle, bool): - error_msg = "Save as pickle must be a boolean." - raise TypeError(error_msg) - # Form string name for plot filename. - if plot_type == "all": + if plot_type == PlotType.ALL: plot_name = "all_prog_curves" - elif plot_type == "mean": + elif plot_type == PlotType.MEAN: plot_name = "mean_prog_curve" - elif plot_type == "quantile": + elif plot_type == PlotType.QUANTILE: plot_name = f"{extra}_quantile_prog_curve" - elif plot_type == "solve_time_cdf": + elif plot_type == PlotType.SOLVE_TIME_CDF: plot_name = f"cdf_{extra}_solve_times" - elif plot_type == "cdf_solvability": + elif plot_type == PlotType.CDF_SOLVABILITY: plot_name = f"profile_cdf_{extra}_solve_times" - elif plot_type == "quantile_solvability": - if ( - isinstance(extra, list) - and len(extra) == 2 - and isinstance(extra[0], float) - and isinstance(extra[1], float) - ): - plot_name = f"profile_{extra[1]}_quantile_{extra[0]}_solve_times" - else: - error_msg = "Extra must be a list of two floats for 'quantile_solvability' plot type." + elif plot_type == PlotType.QUANTILE_SOLVABILITY: + if not (isinstance(extra, list) and len(extra) >= 2): + error_msg = ( + "Extra must be a list of two floats for " + "'quantile_solvability' plot type." + ) raise ValueError(error_msg) - elif plot_type == "diff_cdf_solvability": + extra_0 = float(extra[0]) + extra_1 = float(extra[1]) + plot_name = f"profile_{extra_1}_quantile_{extra_0}_solve_times" + elif plot_type == PlotType.DIFF_CDF_SOLVABILITY: plot_name = f"diff_profile_cdf_{extra}_solve_times" - elif plot_type == "diff_quantile_solvability": - if ( - isinstance(extra, list) - and len(extra) == 2 - and isinstance(extra[0], float) - and isinstance(extra[1], float) - ): - plot_name = ( - f"diff_profile_{extra[1]}_quantile_{extra[0]}_solve_times" + elif plot_type == PlotType.DIFF_QUANTILE_SOLVABILITY: + if not (isinstance(extra, list) and len(extra) == 2): + error_msg = ( + "Extra must be a list of two floats for " + "'diff_quantile_solvability' plot type." ) - else: - error_msg = "Extra must be a list of two floats for 'diff_quantile_solvability' plot type." raise ValueError(error_msg) - elif plot_type == "area": + extra_0 = float(extra[0]) + extra_1 = float(extra[1]) + plot_name = f"diff_profile_{extra_1}_quantile_{extra_0}_solve_times" + elif plot_type == PlotType.AREA: plot_name = "area_scatterplot" - elif plot_type == "box": + elif plot_type == PlotType.BOX: plot_name = "terminal_box" - elif plot_type == "violin": + elif plot_type == PlotType.VIOLIN: plot_name = "terminal_violin" - elif plot_type == "terminal_scatter": + elif plot_type == PlotType.TERMINAL_SCATTER: plot_name = "terminal_scatter" else: raise NotImplementedError(f"'{plot_type}' is not implemented.") - plot_dir = os.path.join(EXPERIMENT_DIR, "plots") - # Create directories if they do no exist. - if not os.path.exists(plot_dir): - os.makedirs(plot_dir) + plot_dir = EXPERIMENT_DIR / "plots" + # Create the directory if it does not exist + plot_dir.mkdir(parents=True, exist_ok=True) if not normalize: plot_name = plot_name + "_unnorm" @@ -5177,108 +3625,39 @@ def save_plot( plot_name = plot_name.replace("$", "") plot_name = plot_name.replace(" ", "_") + # If the plot title is not provided, use the default title. if plot_title is None: - path_name = os.path.join( - plot_dir, f"{solver_name}_on_{problem_name}_{plot_name}" - ) - else: - path_name = os.path.join(plot_dir, plot_title) - # add extension to path name - extended_path_name = f"{path_name}{ext}" - # Create directories if they do no exist. - if not os.path.exists("./experiments/plots"): - os.makedirs("./experiments", exist_ok=True) - os.makedirs("./experiments/plots") - # plt.savefig(extended_path_name, bbox_inches="tight") + plot_title = f"{solver_name}_{problem_name}_{plot_name}" + path_name = plot_dir / plot_title # Check to make sure file does not override previous images - counter = 1 - new_path_name = path_name # set incase counter not needed - while os.path.exists(extended_path_name): - extended_path_name = f"{path_name} ({counter}){ext}" - new_path_name = f"{path_name} ({counter})" # use for pickle + counter = 0 + while True: + # add extension to path name + extended_path_name = path_name.with_suffix(ext) + + # If file doesn't exist, break out of loop + if not extended_path_name.exists(): + break + + # If file exists, increment counter and try again counter += 1 + path_name = plot_dir / f"{plot_title} ({counter})" + plt.savefig(extended_path_name, bbox_inches="tight") # save plot as pickle if save_as_pickle: fig = plt.gcf() - pickle_path = f"{new_path_name}.pkl" - with open(pickle_path, "wb") as f: - pickle.dump(fig, f) + pickle_path = path_name.with_suffix(".pkl") + with pickle_path.open("wb") as pickle_file: + pickle.dump(fig, pickle_file) # Return path_name for use in GUI. return extended_path_name class ProblemsSolvers: - """Base class for running one or more solver on one or more problem. - - Attributes - ---------- - solver_names : list [str] - List of solver names. - n_solvers : int - Number of solvers. - problem_names : list [str] - List of problem names. - n_problems : int - Number of problems. - solvers : list [``base.Solver``] - List of solvers. - problems : list [``base.Problem``] - List of problems. - all_solver_fixed_factors : dict [dict] - Fixed solver factors for each solver: - outer key is solver name; - inner key is factor name. - all_problem_fixed_factors : dict [dict] - Fixed problem factors for each problem: - outer key is problem name; - inner key is factor name. - all_model_fixed_factors : dict of dict - Fixed model factors for each problem: - outer key is problem name; - inner key is factor name. - experiments : list [list [``experiment_base.ProblemSolver``]] - All problem-solver pairs. - file_name_path : str - Path of .pickle file for saving ``experiment_base.ProblemsSolvers`` object. - - Parameters - ---------- - solver_factors: list [dict], optional - List of dictionaries that contain solver factors at different design points. - Each variant of solver with be crossed together with each vairant of problem. - (Requires solver_names with a name provided for each index in solver_factors.) - problem_factors: list [dict], optional - List of dictionaries that contain problem and model factors at different design points. - Each variant of problem will be crossed together with each variant of solver. - (Requires problem_names with a name provided for each index in problem_factors.) - solver_names : list [str], optional - List of solver names. - problem_names : list [str], optional - List of problem names. - solver_renames : list [str], optional - User-specified names for solvers. - problem_renames : list [str], optional - User-specified names for problems. - fixed_factors_filename : str, optional - Name of .py file containing dictionaries of fixed factors - for solvers/problems/models. - solvers : list [``base.Solver``], optional - List of solvers. - problems : list [``base.Problem``], optional - List of problems. - experiments : list [list [``experiment_base.ProblemSolver``]], optional - All problem-solver pairs. - file_name_path : str - Path of .pickle file for saving ``experiment_base.ProblemsSolvers`` object. - create_pair_pickles : bool, optional - True if creating pickle files for each problem-solver pair, False otherwise. - experiment_name: str, optional - Name of experiment to be appended to the beginning of output files. - - """ + """Base class for running one or more solver on one or more problem.""" @property def solver_names(self) -> list[str]: @@ -5288,11 +3667,12 @@ def solver_names(self) -> list[str]: @solver_names.setter def solver_names(self, solver_names: list[str]) -> None: self.__solver_names = solver_names + self.__n_solvers = len(solver_names) @property def n_solvers(self) -> int: """Number of solvers.""" - return len(self.solver_names) + return self.__n_solvers @property def problem_names(self) -> list[str]: @@ -5302,11 +3682,12 @@ def problem_names(self) -> list[str]: @problem_names.setter def problem_names(self, problem_names: list[str]) -> None: self.__problem_names = problem_names + self.__n_problems = len(problem_names) @property def n_problems(self) -> int: """Number of problems.""" - return len(self.problem_names) + return self.__n_problems @property def solvers(self) -> list[Solver]: @@ -5354,9 +3735,7 @@ def all_model_fixed_factors(self) -> dict[str, dict]: return self.__all_model_fixed_factors @all_model_fixed_factors.setter - def all_model_fixed_factors( - self, all_model_fixed_factors: dict[str, dict] - ) -> None: + def all_model_fixed_factors(self, all_model_fixed_factors: dict[str, dict]) -> None: self.__all_model_fixed_factors = all_model_fixed_factors @property @@ -5369,17 +3748,17 @@ def experiments(self, experiments: list[list[ProblemSolver]]) -> None: self.__experiments = experiments @property - def file_name_path(self) -> str: - """Path of .pickle file for saving ``experiment_base.ProblemsSolvers`` object.""" + def file_name_path(self) -> Path: + """Path to the .pickle file for saving the ProblemsSolvers object.""" return self.__file_name_path @file_name_path.setter - def file_name_path(self, file_name_path: str) -> None: + def file_name_path(self, file_name_path: Path) -> None: self.__file_name_path = file_name_path @property def create_pair_pickles(self) -> bool: - """True if creating pickle files for each problem-solver pair, False otherwise.""" + """Whether to create pickle files for each problem-solver pair.""" return self.__create_pair_pickles @create_pair_pickles.setter @@ -5395,7 +3774,8 @@ def experiment_name(self) -> str: def experiment_name(self, experiment_name: str) -> None: self.__experiment_name = experiment_name - # TODO: If loading some ProblemSolver objects from file, check that their factors match those in the overall ProblemsSolvers. + # TODO: If loading some ProblemSolver objects from file, check that their factors + # match those in the overall ProblemsSolvers. def __init__( self, solver_factors: list[dict] | None = None, @@ -5408,136 +3788,40 @@ def __init__( solvers: list[Solver] | None = None, problems: list[Problem] | None = None, experiments: list[list[ProblemSolver]] | None = None, - file_name_path: str | None = None, + file_name_path: Path | None = None, create_pair_pickles: bool = False, experiment_name: str | None = None, ) -> None: - """Initialize ProblemsSolvers object. - - There are three ways to create a ProblemsSolvers object: - 1. Provide the names of the solvers and problems to look up in directory.py. - 2. Provide the lists of unique solver and problem objects to pair. - 3. Provide a list of list of ProblemSolver objects. - - Parameters - ---------- - solver_factors: list [dict], optional - List of dictionaries that contain solver factors at different design points. - Each variant of solver with be crossed together with each vairant of problem. - (Requires solver_names with a name provided for each index in solver_factors.) - problem_factors: list [dict], optional - List of dictionaries that contain problem and model factors at different design points. - Each variant of problem will be crossed together with each variant of solver. - (Requires problem_names with a name provided for each index in problem_factors.) - solver_names : list [str], optional - List of solver names. - problem_names : list [str], optional - List of problem names. - solver_renames : list [str], optional - User-specified names for solvers. - problem_renames : list [str], optional - User-specified names for problems. - fixed_factors_filename : str, optional - Name of .py file containing dictionaries of fixed factors - for solvers/problems/models. - solvers : list [``base.Solver``], optional - List of solvers. - problems : list [``base.Problem``], optional - List of problems. - experiments : list [list [``experiment_base.ProblemSolver``]], optional - All problem-solver pairs. - file_name_path : str, optional - Path of .pickle file for saving ``experiment_base.ProblemsSolvers`` object. - create_pair_pickles : bool, optional - True if creating pickle files for each problem-solver pair, False otherwise. - experiment_name: str, optional - Name of experiment to be appended to the beginning of output files. - - Raises - ------ - TypeError - + """Initialize a ProblemsSolvers object. + + There are three ways to initialize a ProblemsSolvers object: + 1. Provide the names of solvers and problems (for lookup in `directory.py`). + 2. Provide lists of solver and problem objects to pair directly. + 3. Provide a full list of `ProblemSolver` objects (as nested lists). + + Args: + solver_factors (list[dict] | None): List of solver factor dictionaries, + one per design point. Requires `solver_names` to match the number + of entries. + problem_factors (list[dict] | None): List of problem/model factor + dictionaries, one per design point. Requires `problem_names` to match + the number of entries. + solver_names (list[str] | None): List of solver names to look up. + problem_names (list[str] | None): List of problem names to look up. + solver_renames (list[str] | None): User-specified labels for solvers. + problem_renames (list[str] | None): User-specified labels for problems. + fixed_factors_filename (str | None): Name of a `.py` file containing + fixed factor dictionaries. + solvers (list[Solver] | None): List of `Solver` objects to use directly. + problems (list[Problem] | None): List of `Problem` objects to use directly. + experiments (list[list[ProblemSolver]] | None): Explicit problem-solver + pairings. + file_name_path (Path | None): Output path for saving the + `ProblemsSolvers` object. + create_pair_pickles (bool): Whether to create individual `.pickle` files + for each problem-solver pair. + experiment_name (str | None): Optional name to prefix output files. """ - # Type checking - if not isinstance(solver_factors, (list, type(None))) or ( - isinstance(solver_factors, list) - and not all(isinstance(dp, dict) for dp in solver_factors) - ): - error_msg = "Solver factors must be a list of dictionaries or None." - raise TypeError(error_msg) - if not isinstance(problem_factors, (list, type(None))) or ( - isinstance(problem_factors, list) - and not all(isinstance(dp, dict) for dp in problem_factors) - ): - error_msg = ( - "Problem factors must be a list of dictionaries or None." - ) - raise TypeError(error_msg) - if not isinstance(solver_names, (list, type(None))) or ( - isinstance(solver_names, list) - and not all(isinstance(name, str) for name in solver_names) - ): - error_msg = "Solver names must be a list of strings or None." - raise TypeError(error_msg) - if not isinstance(problem_names, (list, type(None))) or ( - isinstance(problem_names, list) - and not all(isinstance(name, str) for name in problem_names) - ): - error_msg = "Problem names must be a list of strings or None." - raise TypeError(error_msg) - if not isinstance(solver_renames, (list, type(None))) or ( - isinstance(solver_renames, list) - and not all(isinstance(name, str) for name in solver_renames) - ): - error_msg = "Solver renames must be a list of strings or None." - raise TypeError(error_msg) - if not isinstance(problem_renames, (list, type(None))) or ( - isinstance(problem_renames, list) - and not all(isinstance(name, str) for name in problem_renames) - ): - error_msg = "Problem renames must be a list of strings or None." - raise TypeError(error_msg) - if not isinstance(fixed_factors_filename, (str, type(None))): - error_msg = "Fixed factors filename must be a string or None." - raise TypeError(error_msg) - if not isinstance(solvers, (list, type(None))) or ( - isinstance(solvers, list) - and not all(isinstance(solver, Solver) for solver in solvers) - ): - error_msg = "Solvers must be a list of Solver objects or None." - raise TypeError(error_msg) - if not isinstance(problems, (list, type(None))) or ( - isinstance(problems, list) - and not all(isinstance(problem, Problem) for problem in problems) - ): - error_msg = "Problems must be a list of Problem objects or None." - raise TypeError(error_msg) - if not isinstance(experiments, (list, type(None))) or ( - isinstance(experiments, list) - and not all( - isinstance(experiment_list, list) - for experiment_list in experiments - ) - and not all( - isinstance(experiment, ProblemSolver) - for experiment_list in experiments - for experiment in experiment_list - ) - ): - error_msg = "Experiments must be a list of lists of ProblemSolver objects or None." - raise TypeError(error_msg) - if not isinstance(file_name_path, (str, type(None))): - error_msg = "File name path must be a string or None." - raise TypeError(error_msg) - if not isinstance(create_pair_pickles, bool): - error_msg = "Create pair pickles must be a boolean." - raise TypeError(error_msg) - if not isinstance(experiment_name, (str, type(None))): - error_msg = "Experiment name must be a string or None." - raise TypeError(error_msg) - # Value checking - # TODO: Implement this - # set attributes for pickle create and experiment file names self.create_pair_pickles = create_pair_pickles if experiment_name is not None: @@ -5549,18 +3833,15 @@ def __init__( # For some reason some of these variables weren't being assigned to the # class attributes. TODO: Fix this. - output_dir = os.path.join(EXPERIMENT_DIR, "outputs") - if not os.path.exists(output_dir): - os.makedirs(output_dir) + output_dir = EXPERIMENT_DIR / "outputs" + output_dir.mkdir(parents=True, exist_ok=True) if experiments is not None: # Method #3 self.experiments = experiments self.solvers = [ experiments[idx][0].solver for idx in range(len(experiments)) ] - self.problems = [ - experiment.problem for experiment in experiments[0] - ] + self.problems = [experiment.problem for experiment in experiments[0]] self.solver_names = [solver.name for solver in self.solvers] self.problem_names = [problem.name for problem in self.problems] self.solver_set = self.solver_names @@ -5587,8 +3868,10 @@ def __init__( raise ValueError(error_msg) # Get corresponding name of problem from names. problem_name = problem_names[index] - fixed_factors = {} # Will hold problem factor values for current dp. - model_fixed_factors = {} # Will hold model factor values for current dp. + # Will hold problem factor values for current dp. + fixed_factors = {} + # Will hold model factor values for current dp. + model_fixed_factors = {} # Create default instances of problem and model to compare factor names. default_problem = problem_directory[problem_name]() default_model = default_problem.model @@ -5629,9 +3912,10 @@ def __init__( solver_rename=self.solver_renames[sol_indx], problem_rename=self.problem_renames[prob_indx], create_pickle=self.create_pair_pickles, - file_name_path=os.path.join( - output_dir, - f"{self.file_header}{self.solver_renames[sol_indx]}_on_{self.problem_renames[prob_indx]}", + file_name_path=output_dir + / ( + f"{self.file_header}" + f"{self.solver_renames[sol_indx]}_on_{self.problem_renames[prob_indx]}" ), ) for prob_indx, problem in enumerate(problems) @@ -5656,10 +3940,7 @@ def __init__( elif solvers is not None and problems is not None: # Method #2 self.experiments = [ - [ - ProblemSolver(solver=solver, problem=problem) - for problem in problems - ] + [ProblemSolver(solver=solver, problem=problem) for problem in problems] for solver in solvers ] self.solvers = solvers @@ -5688,7 +3969,8 @@ def __init__( # Use this for naming file. self.solver_set = solver_names self.problem_set = problem_names - # Read in fixed solver/problem/model factors from .py file in the experiments folder. + # Read in fixed solver/problem/model factors from .py file in the + # experiments folder. # File should contain three dictionaries of dictionaries called # - all_solver_fixed_factors # - all_problem_fixed_factors @@ -5704,59 +3986,53 @@ def __init__( problem_name: {} for problem_name in self.problem_names } else: - fixed_factors_filename = ( - "experiments.inputs." + fixed_factors_filename - ) + fixed_factors_filename = "experiments.inputs." + fixed_factors_filename all_factors = importlib.import_module(fixed_factors_filename) - self.all_solver_fixed_factors = ( - all_factors.all_solver_fixed_factors - ) - self.all_problem_fixed_factors = ( - all_factors.all_problem_fixed_factors - ) - self.all_model_fixed_factors = ( - all_factors.all_model_fixed_factors - ) + self.all_solver_fixed_factors = all_factors.all_solver_fixed_factors + self.all_problem_fixed_factors = all_factors.all_problem_fixed_factors + self.all_model_fixed_factors = all_factors.all_model_fixed_factors # Create all problem-solver pairs (i.e., instances of ProblemSolver class). self.experiments = [] for solver_idx in range(self.n_solvers): + solver_name = self.solver_names[solver_idx] solver_experiments = [] for problem_idx in range(self.n_problems): - filename = os.path.join( - output_dir, - f"{self.solver_names[solver_idx]}_on_{self.problem_names[problem_idx]}.pickle", + problem_name = self.problem_names[problem_idx] + filename = f"{solver_name}_on_{problem_name}.pickle" + file_path = output_dir / filename + if file_path.exists(): + with file_path.open("rb") as f: + loaded_exp = pickle.load(f) + solver_experiments.append(loaded_exp) + continue + # TODO: Check if the solver/problem/model factors in the file + # match those for the ProblemsSolvers. + if solver_names is None: + error_msg = "Solver names must be provided if no file exists." + raise ValueError(error_msg) + if problem_names is None: + error_msg = "Problem names must be provided if no file exists." + raise ValueError(error_msg) + # If no file exists, create new ProblemSolver object. + logging.debug( + f"No experiment file exists for {solver_name} on " + f"{problem_name}. " + "Creating new experiment." + ) + # Lookup fixed factors for solver, problem, and model. + solver_ff = self.all_solver_fixed_factors[solver_name] + problem_ff = self.all_problem_fixed_factors[problem_name] + model_ff = self.all_model_fixed_factors[problem_name] + # Create new ProblemSolver object. + next_experiment = ProblemSolver( + solver_name=solver_names[solver_idx], + problem_name=problem_names[problem_idx], + solver_rename=solver_name, + problem_rename=problem_name, + solver_fixed_factors=solver_ff, + problem_fixed_factors=problem_ff, + model_fixed_factors=model_ff, ) - if os.path.exists(filename): - with open(filename, "rb") as file: - next_experiment = pickle.load(file) - # TODO: Check if the solver/problem/model factors in the file match - # those for the ProblemsSolvers. - else: - if solver_names is None: - error_msg = "Solver names must be provided if no file exists." - raise ValueError(error_msg) - if problem_names is None: - error_msg = "Problem names must be provided if no file exists." - raise ValueError(error_msg) - # If no file exists, create new ProblemSolver object. - print( - f"No experiment file exists for {self.solver_names[solver_idx]} on {self.problem_names[problem_idx]}. Creating new experiment." - ) - next_experiment = ProblemSolver( - solver_name=solver_names[solver_idx], - problem_name=problem_names[problem_idx], - solver_rename=self.solver_names[solver_idx], - problem_rename=self.problem_names[problem_idx], - solver_fixed_factors=self.all_solver_fixed_factors[ - self.solver_names[solver_idx] - ], - problem_fixed_factors=self.all_problem_fixed_factors[ - self.problem_names[problem_idx] - ], - model_fixed_factors=self.all_model_fixed_factors[ - self.problem_names[problem_idx] - ], - ) solver_experiments.append(next_experiment) self.experiments.append(solver_experiments) self.solvers = [ @@ -5774,10 +4050,9 @@ def __init__( solver_names_string = "_".join(self.solver_set) if self.problem_set is not None: problem_names_string = "_".join(self.problem_set) - self.file_name_path = os.path.join( - output_dir, - f"{self.file_header}group_{solver_names_string}_on_{problem_names_string}.pickle", - ) + s_on_p = f"{solver_names_string}_on_{problem_names_string}" + file_name = f"{self.file_header}group_{s_on_p}.pickle" + self.file_name_path = output_dir / file_name else: self.file_name_path = file_name_path @@ -5787,40 +4062,34 @@ def __init__( def check_compatibility(self) -> str: """Check whether all experiments' solvers and problems are compatible. - Returns - ------- - error_str : str - Error message in the event any problem and solver are incompatible. - + Returns: + str: Error message in the event any problem and solver are incompatible. """ - error_str = "" + errors = [] for solver_idx in range(self.n_solvers): for problem_idx in range(self.n_problems): new_error_str = self.experiments[solver_idx][ problem_idx ].check_compatibility() - if new_error_str != "": - error_str += f"For solver {self.solver_names[solver_idx]} and problem {self.problem_names[problem_idx]}... {new_error_str}" - return error_str + if len(new_error_str) > 0: + new_msg = ( + f"For solver {self.solver_names[solver_idx]} " + f"and problem {self.problem_names[problem_idx]}... " + + new_error_str + ) + errors.append(new_msg) + return "\n".join(errors) def run(self, n_macroreps: int) -> None: """Run `n_macroreps` of each solver on each problem. - Parameters - ---------- - n_macroreps : int - Number of macroreplications of the solver to run on the problem. - - Raises - ------ - TypeError - ValueError + Args: + n_macroreps (int): Number of macroreplications to run per problem-solver + pair. + Raises: + ValueError: If `n_macroreps` is not positive. """ - # Type checking - if not isinstance(n_macroreps, int): - error_msg = "Number of macroreplications must be an integer." - raise TypeError(error_msg) # Value checking if n_macroreps <= 0: error_msg = "Number of macroreplications must be positive." @@ -5832,8 +4101,10 @@ def run(self, n_macroreps: int) -> None: # If the problem-solver pair has not been run in this way before, # run it now and save result to .pickle file. if not experiment.has_run: - print( - f"Running {n_macroreps} macro-replications of {experiment.solver.name} on {experiment.problem.name}." + # TODO: check if this should be prob on solv instead? + s_on_p = f"{experiment.solver.name} on {experiment.problem.name}" + logging.debug( + f"Running {n_macroreps} macro-replications of {s_on_p}." ) experiment.run(n_macroreps) # Save ProblemsSolvers object to .pickle file. @@ -5845,35 +4116,18 @@ def post_replicate( crn_across_budget: bool = True, crn_across_macroreps: bool = False, ) -> None: - """For each problem-solver pair, run postreplications at solutions recommended by the solver on each macroreplication. - - Parameters - ---------- - n_postreps : int - Number of postreplications to take at each recommended solution. - crn_across_budget : bool, default=True - True if CRN used for post-replications at solutions recommended at different times, - otherwise False. - crn_across_macroreps : bool, default=False - True if CRN used for post-replications at solutions recommended on different - macroreplications, otherwise False. - - Raises - ------ - TypeError - ValueError + """Runs postreplications for each problem-solver pair on all macroreplications. + Args: + n_postreps (int): Number of postreplications per recommended solution. + crn_across_budget (bool, optional): If True, use CRN across solutions from + different time budgets. Defaults to True. + crn_across_macroreps (bool, optional): If True, use CRN across solutions + from different macroreplications. Defaults to False. + + Raises: + ValueError: If n_postreps is not positive. """ - # Type checking - if not isinstance(n_postreps, int): - error_msg = "Number of postreplications must be an integer." - raise TypeError(error_msg) - if not isinstance(crn_across_budget, bool): - error_msg = "CRN across budget must be a boolean." - raise TypeError(error_msg) - if not isinstance(crn_across_macroreps, bool): - error_msg = "CRN across macroreplications must be a boolean." - raise TypeError(error_msg) # Value checking if n_postreps <= 0: error_msg = "Number of postreplications must be positive." @@ -5882,12 +4136,11 @@ def post_replicate( for solver_index in range(self.n_solvers): for problem_index in range(self.n_problems): experiment = self.experiments[solver_index][problem_index] - # If the problem-solver pair has not been post-replicated in this way before, - # post-process it now. + # If the problem-solver pair has not been post-replicated in this + # way before, post-process it now. if not experiment.has_postreplicated: - print( - f"Post-processing {experiment.solver.name} on {experiment.problem.name}." - ) + s_on_p = f"{experiment.solver.name} on {experiment.problem.name}" + logging.debug(f"Post-processing {s_on_p}.") experiment.post_replicate( n_postreps, crn_across_budget, crn_across_macroreps ) @@ -5897,31 +4150,17 @@ def post_replicate( def post_normalize( self, n_postreps_init_opt: int, crn_across_init_opt: bool = True ) -> None: - """Construct objective curves and (normalized) progress curves for all collections of experiments on all given problem. + """Builds objective and progress curves for all experiment collections. - Parameters - ---------- - n_postreps_init_opt : int - Number of postreplications to take at initial x0 and optimal x*. - crn_across_init_opt : bool, default=True - True if CRN used for post-replications at solutions x0 and x*, - otherwise False. - - Raises - ------ - TypeError - ValueError + Args: + n_postreps_init_opt (int): Number of postreplications at initial (x0) and + optimal (x*) solutions. + crn_across_init_opt (bool, optional): If True, use CRN for postreplications + at x0 and x*. Defaults to True. + Raises: + ValueError: If `n_postreps_init_opt` is not positive. """ - # Type checking - if not isinstance(n_postreps_init_opt, int): - error_msg = "Number of postreplications must be an integer." - raise TypeError(error_msg) - if not isinstance(crn_across_init_opt, bool): - error_msg = ( - "CRN across initial and optimal solutions must be a boolean." - ) - raise TypeError(error_msg) # Value checking if n_postreps_init_opt <= 0: error_msg = "Number of postreplications must be positive." @@ -5941,69 +4180,58 @@ def post_normalize( self.record_group_experiment_results() def check_postreplicate(self) -> bool: - """Check to see if all experiments have been postreplicated. - - Return: - ------ - bool - True if all experiments have been postreplicated, false otherwise. + """Checks whether all experiments have been postreplicated. + Returns: + bool: Whether all experiments have been postreplicated """ - for solver_idx in range(self.n_solvers): - for problem_idx in range(self.n_problems): - experiment = self.experiments[solver_idx][problem_idx] - if not experiment.has_postreplicated: - return False - return True + return all( + experiment.has_postreplicated + for row in self.experiments + for experiment in row + ) def check_postnormalize(self) -> bool: - """Check to see if all experiments have been postnormalized. - - Return: - ------ - bool - True if all experiments have been postnormalized, false otherwise. + """Checks whether all experiments have been postnormalized. + Returns: + bool: Whether all experiments have been postnormalized. """ - for solver_idx in range(self.n_solvers): - for problem_idx in range(self.n_problems): - experiment = self.experiments[solver_idx][problem_idx] - if not experiment.has_postreplicated: - return False - return True + return all( + experiment.has_postnormalized + for row in self.experiments + for experiment in row + ) def record_group_experiment_results(self) -> None: - """Save ``experiment_base.ProblemsSolvers`` object to .pickle file.""" - output_dir = os.path.join(EXPERIMENT_DIR, "outputs") - if not os.path.exists(output_dir): - os.makedirs(output_dir) - with open(self.file_name_path, "wb") as file: + """Saves a ProblemsSolvers object to a .pickle file in the outputs directory.""" + output_dir = EXPERIMENT_DIR / "outputs" + output_dir.mkdir(parents=True, exist_ok=True) + with self.file_name_path.open("wb") as file: pickle.dump(self, file, pickle.HIGHEST_PROTOCOL) def log_group_experiment_results(self) -> None: - """Create readable .txt file describing the solvers and problems that make up the ProblemSolvers object.""" - # Create a new text file in experiment/{date/time of launch}/logs folder with correct name. - new_path = self.file_name_path.replace( - "outputs", "logs" - ) # Adjust file_path_name to correct folder. - new_path = new_path.replace( + """Creates a .txt summary of solvers and problems in the ProblemSolvers object. + + The file is saved in the 'logs/' folder next to the experiment's pickle file. + """ + # Create a new text file in experiment/{date/time of launch}/logs folder + # with correct name. + log_dir = self.file_name_path.parent.parent / "logs" + log_dir.mkdir(parents=True, exist_ok=True) + new_filename = self.file_name_path.name.replace( ".pickle", "_group_experiment_results.txt" ) # Remove .pickle from .txt file name. - - # Create directory if it does no exist. - log_dir = os.path.dirname(new_path) - if not os.path.exists(log_dir): - os.makedirs(log_dir) + new_path = log_dir / new_filename # Create text file. - with open(new_path, "w") as file: + with new_path.open("w") as file: + seperator_len = 100 # Title text file with experiment information. - file.write(self.file_name_path) + file.write(str(self.file_name_path)) file.write("\n") # Write the name of each problem. - file.write( - "----------------------------------------------------------------------------------------------" - ) + file.write("-" * seperator_len) file.write("\nProblems:\n\n") for i in range(self.n_problems): file.write(f"{self.problem_names[i]}\n\t") @@ -6018,23 +4246,17 @@ def log_group_experiment_results(self) -> None: for key, value in self.problems[i].factors.items(): file.write(f"\t\t{key}: {value}\n") file.write("\n") - file.write( - "----------------------------------------------------------------------------------------------" - ) + file.write("-" * seperator_len) # Write the name of each Solver. file.write("\nSolvers:\n\n") # Write solver factors for each solver. - for j in range(self.n_solvers): - file.write(f"{self.solver_names[j]}\n\t") - file.write("Solver Factors:\n") - for key, value in self.solvers[ - j - ].factors.items(): # changed from i to j + for solv_idx in range(self.n_solvers): + file.write(f"{self.solver_names[solv_idx]}\n") + file.write("\tSolver Factors:\n") + for key, value in self.solvers[solv_idx].factors.items(): file.write(f"\t\t{key}: {value}\n") file.write("\n") - file.write( - "----------------------------------------------------------------------------------------------" - ) + file.write("-" * seperator_len) # Write the name of pickle files for each Problem-Solver pair if created. if self.create_pair_pickles: file.write( @@ -6042,47 +4264,32 @@ def log_group_experiment_results(self) -> None: ) for solver_group in self.experiments: for experiment in solver_group: - directory, file_name = os.path.split( - experiment.file_name_path - ) + file_name = experiment.file_name_path.name file.write(f"{file_name}\n") # for p in self.problem_names: # for s in self.solver_names: # file.write(f"\t{s}_on_{p}.pickle\n") - file.close() def report_group_statistics( self, solve_tols: list[float] | None = None, csv_filename: str = "df_solver_results", ) -> None: - """Report statistics for all solvers on all problems. + """Reports statistics for all solvers across all problems. - Parameters - ---------- - solve_tols : list [float], optional - Relative optimality gap(s) definining when a problem is solved; in (0,1]. - csv_filename : str, optional - Name of .csv file to print output to. Do not include '.csv' extension. - - Raises - ------ - TypeError - ValueError + Args: + solve_tols (list[float], optional): Optimality gaps defining when a problem + is considered solved (values in (0, 1]). + Defaults to [0.05, 0.10, 0.20, 0.50]. + csv_filename (str, optional): Name of the output CSV file (without '.csv'). + Defaults to "df_solver_results". + Raises: + ValueError: If any solve tolerance is not in the range (0, 1]. """ # Assign default values if solve_tols is None: solve_tols = [0.05, 0.10, 0.20, 0.50] - # Type checking - if not isinstance(solve_tols, list) or not all( - isinstance(tol, float) for tol in solve_tols - ): - error_msg = "Solve tols must be a list of floats or None." - raise TypeError(error_msg) - if not isinstance(csv_filename, str): - error_msg = "CSV filename must be a string." - raise TypeError(error_msg) # Value checking if not all(0 < tol <= 1 for tol in solve_tols): error_msg = "Solve tols must be in (0,1]." @@ -6115,40 +4322,25 @@ def report_statistics( solve_tols: list[float] | None = None, csv_filename: str = "df_solver_results", ) -> None: - """For each design point, calculate statistics from each macoreplication and print to csv. - - Parameters - ---------- - pair_list: list [``experiment_base.ProblemSolver``] - List of ProblemSolver objects. - solve_tols : list [float], default = [0.05, 0.10, 0.20, 0.50] - Relative optimality gap(s) definining when a problem is solved; in (0,1]. - csv_filename : str, default="df_solver_results" - Name of .csv file to print output to. - - Raises - ------ - TypeError - ValueError - + """Calculates statistics from macroreplications and saves results to a CSV file. + + Args: + pair_list (list[ProblemSolver]): List of ProblemSolver objects. + solve_tols (list[float], optional): Optimality gaps defining when a problem + is considered solved (values in (0, 1]). + Defaults to [0.05, 0.10, 0.20, 0.50]. + csv_filename (str, optional): Name of the CSV file to write results to. + Defaults to "df_solver_results". + + Raises: + ValueError: If any solve tolerance is not in the range (0, 1]. """ + # Local imports + import csv + # Assign default values if solve_tols is None: solve_tols = [0.05, 0.10, 0.20, 0.50] - # Type checking - if not isinstance(pair_list, list) or not all( - isinstance(obj, ProblemSolver) for obj in pair_list - ): - error_msg = "Pair list must be a list of ProblemSolver objects." - raise TypeError(error_msg) - if not isinstance(solve_tols, list) or not all( - isinstance(tol, float) for tol in solve_tols - ): - error_msg = "Solve tols must be a list of floats or None." - raise TypeError(error_msg) - if not isinstance(csv_filename, str): - error_msg = "CSV filename must be a string." - raise TypeError(error_msg) # Value checking if not all(0 < tol <= 1 for tol in solve_tols): error_msg = "Solve tols must be in (0,1]." @@ -6156,12 +4348,11 @@ def report_statistics( # TODO: figure out if we should also check for increasing order of solve_tols # Create directory if it does no exist. - log_dir = os.path.join(EXPERIMENT_DIR, "logs") - if not os.path.exists(log_dir): - os.makedirs(log_dir) + log_dir = EXPERIMENT_DIR / "logs" + log_dir.mkdir(parents=True, exist_ok=True) - file_path = os.path.join(log_dir, f"{csv_filename}.csv") - with open(file_path, mode="w", newline="") as output_file: + file_path = log_dir / f"{csv_filename}.csv" + with file_path.open(mode="w", newline="") as output_file: csv_writer = csv.writer( output_file, delimiter=",", @@ -6169,12 +4360,8 @@ def report_statistics( quoting=csv.QUOTE_MINIMAL, ) base_experiment = pair_list[0] - solver_factor_names = list( - base_experiment.solver.specifications.keys() - ) - problem_factor_names = list( - base_experiment.problem.specifications.keys() - ) + solver_factor_names = list(base_experiment.solver.specifications.keys()) + problem_factor_names = list(base_experiment.problem.specifications.keys()) model_factor_names = list( set(base_experiment.problem.model.specifications.keys()) - base_experiment.problem.model_decision_factors @@ -6184,9 +4371,7 @@ def report_statistics( [f"{solve_tol}-Solve Time", f"{solve_tol}-Solved? (Y/N)"] for solve_tol in solve_tols ] - solve_time_headers = list( - itertools.chain.from_iterable(solve_time_headers) - ) + solve_time_headers = list(itertools.chain.from_iterable(solve_time_headers)) # Print headers. csv_writer.writerow( [ @@ -6229,14 +4414,12 @@ def report_statistics( # Parse list of statistics. solve_time_values = [ [ - progress_curve.compute_crossing_time( - threshold=solve_tol - ), + progress_curve.compute_crossing_time(threshold=solve_tol), int( progress_curve.compute_crossing_time( threshold=solve_tol ) - < np.inf + < float("inf") ), ] for solve_tol in solve_tols @@ -6252,10 +4435,7 @@ def report_statistics( init_sol = tuple([round(x, 4) for x in experiment.x0]) int_obj = experiment.x0_postreps[mrep] opt_sol = tuple( - [ - round(x, 4) - for x in experiment.all_recommended_xs[mrep][-1] - ] + [round(x, 4) for x in experiment.all_recommended_xs[mrep][-1]] ) opt_obj = experiment.all_est_objectives[mrep][-1] solution_list = [init_sol, int_obj, opt_sol, opt_obj] @@ -6274,125 +4454,67 @@ def report_statistics( def read_group_experiment_results( - file_name_path: str | os.PathLike, + file_path: Path | str, ) -> ProblemsSolvers: - """Read in ``experiment_base.ProblemsSolvers`` object from .pickle file. + """Reads a ProblemsSolvers object from a .pickle file. - Parameters - ---------- - file_name_path : str | os.PathLike - Path of .pickle file for reading ``experiment_base.ProblemsSolvers`` object. + Args: + file_path (Path): Path to the .pickle file. - Returns - ------- - groupexperiment : ``experiment_base.ProblemsSolvers`` - Problem-solver group that has been run or has been post-processed. - - Raises - ------ - TypeError - ValueError + Returns: + ProblemsSolvers: A group of problem-solver experiments that were run + or post-processed. + Raises: + FileNotFoundError: If the file does not exist. """ - # Type checking - if not isinstance(file_name_path, (str, os.PathLike)): - error_msg = "File name path must be a string or os.PathLike object." - raise TypeError(error_msg) - # Value checking - if not os.path.exists(file_name_path): - error_msg = "File name path does not exist." - raise ValueError(error_msg) - - with open(file_name_path, "rb") as file: - groupexperiment = pickle.load(file) - return groupexperiment + file_path = resolve_file_path(file_path, EXPERIMENT_DIR / "outputs") + with file_path.open("rb") as file: + return pickle.load(file) def find_unique_solvers_problems( experiments: list[ProblemSolver], ) -> tuple[list[Solver], list[Problem]]: - """Identify the unique problems and solvers in a collection of experiments. + """Finds unique solvers and problems from a list of ProblemSolver experiments. - Parameters - ---------- - experiments : list [``experiment_base.ProblemSolver``] - ProblemSolver pairs of different solvers on different problems. - - Returns - ------- - list [``base.Solver``] - Unique solvers. - list [``base.Problem``] - Unique problems. - - Raises - ------ - TypeError + Args: + experiments (list[ProblemSolver]): List of problem-solver pairs. + Returns: + tuple[list[Solver], list[Problem]]: A tuple containing: + - A list of unique solvers. + - A list of unique problems. """ - # Type checking - if not isinstance(experiments, list) or not all( - isinstance(experiment, ProblemSolver) for experiment in experiments - ): - error_msg = "Experiments must be a list of ProblemSolver objects." - raise TypeError(error_msg) - - unique_solvers = list( - set([experiment.solver for experiment in experiments]) - ) - unique_problems = list( - set([experiment.problem for experiment in experiments]) - ) - # unique_solvers = [] - # unique_problems = [] - # for experiment in experiments: - # if experiment.solver not in unique_solvers: - # unique_solvers.append(experiment.solver) - # if experiment.problem not in unique_problems: - # unique_problems.append(experiment.problem) + unique_solvers = list({experiment.solver for experiment in experiments}) + unique_problems = list({experiment.problem for experiment in experiments}) return unique_solvers, unique_problems def find_missing_experiments( experiments: list[ProblemSolver], ) -> tuple[list[Solver], list[Problem], list[tuple[Solver, Problem]]]: - """Identify problem-solver pairs that are not part of a list of experiments. - - Parameters - ---------- - experiments : list [``experiment_base.ProblemSolver``] - Problem-solver pairs of different solvers on different problems. - - Returns - ------- - list [``base.Solver``] - List of solvers present in the list of experiments - list [``base.Problem``] - List of problems present in the list of experiments. - list [tuple [``base.Solver``, ``base.Problem``]] - List of names of missing problem-solver pairs. - - Raises - ------ - TypeError + """Finds missing problem-solver pairs from a list of experiments. + Args: + experiments (list[ProblemSolver]): List of problem-solver pairs. + + Returns: + tuple: A tuple containing: + - list[Solver]: Unique solvers present in the experiments. + - list[Problem]: Unique problems present in the experiments. + - list[tuple[Solver, Problem]]: Problem-solver pairs that are missing. """ - # Type checking - if not isinstance(experiments, list) or not all( - isinstance(experiment, ProblemSolver) for experiment in experiments - ): - error_msg = "Experiments must be a list of ProblemSolver objects." - raise TypeError(error_msg) - - pairs = [ - (experiment.solver, experiment.problem) for experiment in experiments - ] + pairs = {(experiment.solver, experiment.problem) for experiment in experiments} unique_solvers, unique_problems = find_unique_solvers_problems(experiments) - missing = [] - for solver in unique_solvers: - for problem in unique_problems: - if (solver, problem) not in pairs: - missing.append((solver, problem)) + + missing = [ + (solver, problem) + for solver in unique_solvers + for problem in unique_problems + if (solver, problem) not in pairs + ] + return unique_solvers, unique_problems, missing @@ -6402,65 +4524,19 @@ def make_full_metaexperiment( unique_problems: list[Problem], missing_experiments: list[tuple[Solver, Problem]], ) -> ProblemsSolvers: - """Create experiment objects for missing problem-solver pairs and run them. - - Parameters - ---------- - existing_experiments : list [``experiment_base.ProblemSolver``] - Problem-solver pairs of different solvers on different problems. - unique_solvers : list [``base.Solver objects``] - List of solvers present in the list of experiments. - unique_problems : list [``base.Problem``] - List of problems present in the list of experiments. - missing_experiments : list [tuple [``base.Solver``, ``base.Problem``]] - List of missing problem-solver pairs. - - Returns - ------- - metaexperiment : ``experiment_base.ProblemsSolvers`` - New ProblemsSolvers object. - - Raises - ------ - TypeError + """Creates experiments for missing problem-solver pairs. + + Args: + existing_experiments (list[ProblemSolver]): Existing problem-solver experiments. + unique_solvers (list[Solver]): Solvers present in the existing experiments. + unique_problems (list[Problem]): Problems present in the existing experiments. + missing_experiments (list[tuple[Solver, Problem]]): Problem-solver pairs that + have not yet been run. + Returns: + ProblemsSolvers: A new ProblemsSolvers object containing the completed set. """ - # Type checking - if not isinstance(existing_experiments, list) or not all( - isinstance(experiment, ProblemSolver) - for experiment in existing_experiments - ): - error_msg = ( - "Existing experiments must be a list of ProblemSolver objects." - ) - raise TypeError(error_msg) - if not isinstance(unique_solvers, list) or not all( - isinstance(solver, Solver) for solver in unique_solvers - ): - error_msg = "Unique solvers must be a list of Solver objects." - raise TypeError(error_msg) - if not isinstance(unique_problems, list) or not all( - isinstance(problem, Problem) for problem in unique_problems - ): - error_msg = "Unique problems must be a list of Problem objects." - raise TypeError(error_msg) - if ( - not isinstance(missing_experiments, list) - or not all(isinstance(pair, tuple) for pair in missing_experiments) - or not all(len(pair) == 2 for pair in missing_experiments) - or not all( - isinstance(pair[0], Solver) and isinstance(pair[1], Problem) - for pair in missing_experiments - ) - ): - error_msg = "Missing experiments must be a list of tuples of Solver and Problem objects." - raise TypeError(error_msg) - - # Ordering of solvers and problems in unique_solvers and unique_problems - # is used to construct experiments. - full_experiments = [ - [] * len(unique_problems) for _ in range(len(unique_solvers)) - ] + full_experiments = [[] * len(unique_problems) for _ in range(len(unique_solvers))] for experiment in existing_experiments: solver_idx = unique_solvers.index(experiment.solver) problem_idx = unique_problems.index(experiment.problem) @@ -6471,141 +4547,130 @@ def make_full_metaexperiment( full_experiments[solver_idx][problem_idx] = ProblemSolver( solver=pair[0], problem=pair[1] ) - metaexperiment = ProblemsSolvers(experiments=full_experiments) - return metaexperiment + return ProblemsSolvers(experiments=full_experiments) -def validate_ruby_install() -> bool: - """ - Check if Ruby is installed on the system or is on the system path. - - Returns - ------- - bool - False is ruby is installed on the system path - True if ruby is installed via WSL - - Raises - ------ - Exception - If Ruby is not installed on the system or is not on the system path. +def lookup_datafarming_gem(design_type: str) -> str: + """Check if a compatible version of the datafarming Ruby gem is installed. + + Args: + design_type (str): The type of design to check for. + + Returns: + str: The name of the datafarming script to use. """ - # Check if Ruby is on the system path + # Local imports + import platform + + # Dictionary of all the valid design types and their corresponding scripts + # Windows needs .bat file equivalents to any scripts being run + if platform.system() == "Windows": + datafarming_stack = {"nolhs": "stack_nolhs.rb.bat"} + else: + datafarming_stack = {"nolhs": "stack_nolhs.rb"} + + # Error if design type is not valid + if design_type not in datafarming_stack: + error_msg = "Invalid design type." + raise Exception(error_msg) + + # Check the design type + datafarming_file = datafarming_stack[design_type] + command = f"{datafarming_file} --help" results = subprocess.run( - "ruby -v", + command, shell=True, capture_output=True, ) - # Return false if it is + # If the return code is 0, then the command was successful if results.returncode == 0: - return False - - # If Ruby is not on the system path, check if it is installed on WSL - if os.name == "nt" and shutil.which("wsl") is not None: - # If WSL is installed, check if Ruby is installed on WSL - result = subprocess.run( - 'wsl -e bash -lic "ruby -v"', - shell=True, - capture_output=True, + return datafarming_file + + # The command was not successful, so check to see if the gem is installed + # Check to see if the datafarming gem is installed + command = "gem list" + results = subprocess.run( + command, + shell=True, + capture_output=True, + ) + # If the return code is not 0, then the command was not successful + # Let's figure out what error we're throwing + # If the datafarming gem is not present, then tell the user + # that they need to install it + if "datafarming" not in results.stdout.decode("utf-8"): + error_msg = [ + "Datafarming gem is not installed. Please install it by running:", + "gem install datafarming -v 1.4" + "Alternatively, you can run the setup_simopt script for your platform", + ] + error_msg = "\n".join(error_msg) + raise Exception(error_msg) + installed_gems = results.stdout.decode("utf-8").split("\n") + # If the datafarming gem is present, then check to see if the version is correct + # Strip away all the information except for version(s) + datafarming_gem_installs = [ + gem.split(" ")[1] for gem in installed_gems if gem.startswith("datafarming ") + ] + # Local import + import re + + # Strip away anything that isn't a period or a number + datafarming_versions = [ + re.sub(r"[^0-9.]", "", version) for version in datafarming_gem_installs + ] + # Check for valid versions (min <= version < max) + min_version = "1.0.0" + max_version = "2.0.0" + version_check_results = [ + min_version <= version < max_version for version in datafarming_versions + ] + if not any(version_check_results): + # Write the correct error message depending on plurality + error_msg = [] + if len(version_check_results) == 1: + error_msg.append( + "Datafarming gem is installed, but the installed version " + f"{datafarming_versions} is not supported." + ) + else: + error_msg.append( + f"Datafarming gem is installed, but the installed versions " + f"{datafarming_versions} are not supported." + ) + error_msg.append(f"Please install version {min_version} <= x < {max_version}.") + error_msg.append( + "This can be done by running: `gem install datafarming -v 1.4' " + "or by running the setup_simopt script for your platform." ) - # If Ruby is installed on WSL, return True - if result.returncode == 0: - return True - # The internet claims that WSL will shut down automatically if not - # being used, so we shouldn't risk accidentally closing it while - # the user is using it elsewhere. The system should take care of it - # automatically. - - # If we're here, Ruby is not installed on the system or on WSL - # Raise an exception - error_msg = "Ruby is not installed on the system or is not on the system path. Please install Ruby or add it to the system path. If you just installed Ruby, you may need to restart your terminal/IDE." + error_msg = " ".join(error_msg) + raise Exception(error_msg) + # We get here if the gem is installed and the version is correct, but + # we still can't run the stack script. This is likely due to the gem + # not being in the system path. We'll let the user know that they need + # to restart their terminal/IDE. + error_msg = ( + "Ruby was able to detect the datafarming gem, but was unable to run the " + "stack script. If you just installed the datafarming gem, it may be necessary " + "to restart your terminal/IDE to refresh the system path." + ) raise Exception(error_msg) -def validate_gem_install(design_type: str, installed_via_wsl: bool) -> str: - # Set command prefix based on if WSL is being used - if installed_via_wsl: - command_prefix = 'wsl -e bash -lic "' - command_suffix = '"' - else: - command_prefix = "" - command_suffix = "" - - datafarming_stack = ["nolhs"] +def create_design_list_from_table(design_table: DataFrame) -> list: + """Create a list of solver or problem objects for each design point. - # Check the design type - if design_type in datafarming_stack: - command = ( - f"{command_prefix}stack_{design_type}.rb --help{command_suffix}" - ) - results = subprocess.run( - command, - shell=True, - capture_output=True, - ) - # If the return code is 0, then the command was successful - if results.returncode == 0: - return f"stack_{design_type}.rb" - - # The command was not successful, so check to see if the gem is installed - # Check to see if the datafarming gem is installed - command = f"{command_prefix}gem list{command_suffix}" - results = subprocess.run( - command, - shell=True, - capture_output=True, - ) - # If the return code is not 0, then the command was not successful - # Let's figure out what error we're throwing - # If the datafarming gem is not present, then tell the user - # that they need to install it - if "datafarming" not in results.stdout.decode("utf-8"): - error_msg = "Datafarming gem is not installed. Please install it by running:\n" - error_msg += f"`{command_prefix}gem install datafarming -v 1.4{command_suffix}`" - raise Exception(error_msg) - installed_gems = results.stdout.decode("utf-8").split("\n") - # If the datafarming gem is present, then check to see if the version is correct - # Strip away all the information except for version(s) - datafarming_gem_installs = [ - gem.split(" ")[1] - for gem in installed_gems - if gem.startswith("datafarming ") - ] - # Strip away anything that isn't a period or a number - datafarming_versions = [ - re.sub(r"[^0-9.]", "", version) - for version in datafarming_gem_installs - ] - # Check for valid versions (min <= version < max) - min_version = "1.0.0" - max_version = "2.0.0" - version_check_results = [ - min_version <= version < max_version - for version in datafarming_versions - ] - if not any(version_check_results): - # Write the correct error message depending on plurality - if len(version_check_results) == 1: - error_msg = f"Datafarming gem is installed, but the installed version {datafarming_versions} is not supported." - else: - error_msg = f"Datafarming gem is installed, but the installed versions {datafarming_versions.sort()} are not supported." - error_msg += ( - f" Please install version {min_version} <= x < {max_version}." - ) - error_msg += f" This can be done by running: `{command_prefix}gem install datafarming -v 1.4{command_suffix}`" - raise Exception(error_msg) - # We get here if the gem is installed and the version is correct, but - # we still can't run the stack script. This is likely due to the gem - # not being in the system path. We'll let the user know that they need - # to restart their terminal/IDE. - error_msg = "Ruby was able to detect the datafarming gem, but was unable to run the stack script. If you just installed the datafarming gem, it may be necessary to restart your terminal/IDE." - raise Exception(error_msg) - else: - error_msg = "Invalid design type." - raise ValueError(error_msg) + Args: + design_table (DataFrame): DataFrame containing the design table. + Each row represents a design point, and each column represents a factor. + Returns: + list[dict]: List of dictionaries, where each dictionary contains the factor + values for a design point. + """ + # Local imports + import ast -def create_design_list_from_table(design_table: pd.DataFrame) -> list: # Create list of solver or problem objects for each dp using design_table. design_list = [] dp_dict = design_table.to_dict( @@ -6625,88 +4690,40 @@ def create_design( factor_headers: list[str], factor_settings_filename: str, fixed_factors: dict, - class_type: Literal["solver", "problem", "model"], + class_type: Literal["solver", "problem", "model"] | None = None, n_stacks: int = 1, design_type: Literal["nolhs"] = "nolhs", cross_design_factors: dict | None = None, - csv_filename: str | None = None, -) -> list: - """Create a design of solver or problem factors using Ruby. - - Parameters - ---------- - name : str - Name of solver, problem, or model. - factor_headers : list[str] - List of factor names that are changing in the design. - factor_settings_filename : str - name of factor settings file within data_farming_experiments folder. - fixed_factors : dict - dict of fixed factor values that are different that defaults. - n_stacks : int, optional - number of stacks for ruby calculation. The default is '1'. - design_type : str, optional - design type for ruby calculation. The default is 'nolhs'. - cross_design_factors : dict, optional - dict of lists of values of factors to include in cross design. The default is None. - class_type: str, optional - determines class type (solver, problem, or model) that design is over. Problem automatically combines problem factors with model factors. Choose model to run without any associated problem(s). - default is 'solver' - csv_filename: str, optional - override default csv file name - - Returns - ------- - design_list : list - list that contains a dict of factor values for every design point. - - Throws - ------ - Exception - If ruby is not installed on the system or if the design type is not valid. - - Raises - ------ - TypeError - ValueError - +) -> list[dict]: + """Creates a design of solver, problem, or model factors using Ruby. + + Args: + name (str): Name of the solver, problem, or model. + factor_headers (list[str]): Names of factors that vary in the design. + factor_settings_filename (str): Filename of the factor settings file located in + the `data_farming_experiments` folder. + fixed_factors (dict): Dictionary of fixed factor values that override defaults. + class_type (Literal["solver", "problem", "model"], optional): Type of class the + design is built for. Use "problem" to combine problem and model factors, + or "model" to run independently of any problem. Defaults to "solver". + n_stacks (int, optional): Number of Ruby stacks. Defaults to 1. + design_type (Literal["nolhs"], optional): Type of Ruby design. + Defaults to "nolhs". + cross_design_factors (dict, optional): Dictionary of lists of cross-design + factor values. Defaults to None. + + Returns: + list[dict]: A list of dictionaries, where each dictionary represents a design + + Raises: + ValueError: If input validation fails. + Exception: If Ruby is not installed or the design type is unsupported. """ # Default values if cross_design_factors is None: cross_design_factors = {} - if csv_filename is None: - csv_filename = factor_settings_filename - - # Type checking - if not isinstance(name, str): - error_msg = "Name must be a string." - raise TypeError(error_msg) - if not isinstance(factor_headers, list) or not all( - isinstance(header, str) for header in factor_headers - ): - error_msg = "Factor headers must be a list of strings." - raise TypeError(error_msg) - if not isinstance(factor_settings_filename, str): - error_msg = "Factor settings filename must be a string." - raise TypeError(error_msg) - if not isinstance(fixed_factors, dict): - error_msg = "Fixed factors must be a dictionary." - raise TypeError(error_msg) - if not isinstance(n_stacks, int): - error_msg = "Number of stacks must be an integer." - raise TypeError(error_msg) - if not isinstance(design_type, str): - error_msg = "Design type must be a string." - raise TypeError(error_msg) - if not isinstance(cross_design_factors, dict): - error_msg = "Cross design factors must be a dictionary or None." - raise TypeError(error_msg) - if not isinstance(class_type, str): - error_msg = "Class type must be a string." - raise TypeError(error_msg) - if not isinstance(csv_filename, str): - error_msg = "CSV filename must be a string or None." - raise TypeError(error_msg) + if class_type is None: + class_type = "solver" # TODO: add additional checking # Value checking @@ -6735,53 +4752,26 @@ def create_design( design_object = model_directory[name]() # Make directory to store the current design file. - data_farming_path = os.path.join(EXPERIMENT_DIR, "data_farming") - if not os.path.exists(data_farming_path): - os.makedirs(data_farming_path) + df_dir = EXPERIMENT_DIR / "data_farming" + df_dir.mkdir(parents=True, exist_ok=True) - source_file = os.path.join( - data_farming_path, f"{factor_settings_filename}.txt" - ) - design_file = os.path.join( - data_farming_path, f"{factor_settings_filename}_design.txt" - ) + source_file = df_dir / f"{factor_settings_filename}.txt" + design_file = df_dir / f"{factor_settings_filename}_design.txt" # If the dest file already exists, delete it # TODO: investigate if this may cause issues with multiple concurrent designs - if os.path.exists(design_file): - os.remove(design_file) + if design_file.exists(): + design_file.unlink() # Only run the Ruby script if there are factors to change if len(factor_headers) > 0: - # Check if Ruby is installed on the system. - installed_via_wsl: bool = validate_ruby_install() # Check if the datafarming gem is installed - command_file: str = validate_gem_install(design_type, installed_via_wsl) + command_file: str = lookup_datafarming_gem(design_type) # Create solver factor design from .txt file of factor settings. - if installed_via_wsl: - # Replace the drive letter with the WSL equivalent - windows_drive_letter = os.path.splitdrive(data_farming_path)[0] - linux_drive_letter = ( - f"/mnt/{windows_drive_letter.strip(':').lower()}" - ) - source_file_wsl = source_file.replace( - windows_drive_letter, linux_drive_letter - ) - design_file_wsl = design_file.replace( - windows_drive_letter, linux_drive_letter - ) - # Replace backslashes with forward slashes - source_file_wsl = source_file_wsl.replace("\\", "/") - design_file_wsl = design_file_wsl.replace("\\", "/") - command = f"{command_file} -s {n_stacks} '{source_file_wsl}' > '{design_file_wsl}'" - command = f'wsl -e bash -lic "{command}"' - else: - command = f"{command_file} -s {n_stacks} '{source_file}' > '{design_file}'" - completed_process = subprocess.run( - command, capture_output=True, shell=True - ) + command = f'{command_file} -s {n_stacks} "{source_file}" > "{design_file}"' + completed_process = subprocess.run(command, capture_output=True, shell=True) # If the design file doesn't exist, there was an error in the Ruby script. - if not os.path.exists(design_file): + if not design_file.exists(): error_msg = completed_process.stderr.decode("utf-8") raise Exception( f"Ruby script did not complete successfully.\nError:\n{error_msg}" @@ -6796,7 +4786,10 @@ def create_design( encoding="utf-8", ) except pd.errors.EmptyDataError: - error_msg = "Error in Ruby script. No data in design file.\nMake sure to select factors for data farming." + error_msg = ( + "Error in Ruby script. No data in design file.\n" + "Make sure to select factors for data farming." + ) raise Exception(error_msg) from pd.errors.EmptyDataError design_table.columns = factor_headers # Add factor headers names to dt. else: @@ -6838,9 +4831,8 @@ def create_design( new_design_table = pd.DataFrame() # Temp empty value. for combination in combinations: - combination_dict = dict( - zip(cross_factor_names, combination) - ) # Dictionary containing current combination of cross design factor values. + # Dictionary containing current combination of cross design factor values. + combination_dict = dict(zip(cross_factor_names, combination)) working_design_table = design_table.copy() for factor in combination_dict: @@ -6889,7 +4881,7 @@ def create_design( design_table["design_type"] = design_type design_table["num_stacks"] = str(n_stacks) # Dump the design table to a csv file. - design_file_csv = design_file.replace(".txt", ".csv") + design_file_csv = design_file.with_suffix(".csv") design_table.to_csv(design_file_csv, mode="w", header=True, index=False) # Now return the list from earlier diff --git a/simopt/gui/data_farming_window.py b/simopt/gui/data_farming_window.py index bd328b456..8c8da9dd5 100644 --- a/simopt/gui/data_farming_window.py +++ b/simopt/gui/data_farming_window.py @@ -1,21 +1,25 @@ +"""GUI for data farming experiments.""" + import ast -import os +import logging import tkinter as tk -from tkinter import filedialog, ttk +from pathlib import Path +from tkinter import filedialog, messagebox, ttk from tkinter.font import nametofont import pandas as pd +import simopt.directory as directory from simopt.data_farming_base import DATA_FARMING_DIR, DataFarmingExperiment -from simopt.directory import ( - model_directory, - model_unabbreviated_directory, -) from simopt.experiment_base import ( create_design, ) from simopt.gui.toplevel_custom import Toplevel +# Workaround for AutoAPI +model_directory = directory.model_directory +model_unabbreviated_directory = directory.model_unabbreviated_directory + class DataFarmingWindow(Toplevel): """Class to create the data farming window.""" @@ -23,13 +27,10 @@ class DataFarmingWindow(Toplevel): def __init__(self, root: tk.Tk, forced_creation: bool = False) -> None: """Initialize the data farming window. - Parameters - ---------- - root : tk.Tk - The root window of the application. - forced_creation : bool, optional - If True, the window will be created even if it already exists, by default False. - + Args: + root (tk.Tk): The root window of the application. + forced_creation (bool, optional): Whether to create the window even if it + already exists. Defaults to False. """ if not forced_creation: super().__init__( @@ -130,16 +131,14 @@ def __init__(self, root: tk.Tk, forced_creation: bool = False) -> None: def clear_frame(self, frame: tk.Frame) -> None: """Clear all widgets from a frame. - Parameters - ---------- - frame : tk.Frame - Name of frame that you wish to delete all widgets from. - + Args: + frame (tk.Frame): The frame to clear. """ for widget in frame.winfo_children(): widget.destroy() def load_design(self) -> None: + """Load design from a CSV file.""" # Clear previous selections self.clear_frame(frame=self.factors_frame) self.clear_frame(frame=self.create_design_frame) @@ -206,11 +205,12 @@ def load_design(self) -> None: self.headerdefault_label.grid(row=0, column=2, sticky=tk.N + tk.W) # Name of design csv file - self.csv_filename = filedialog.askopenfilename() + selected_file = filedialog.askopenfilename() + self.csv_filename = Path(selected_file).resolve() # get experiment name - filename = os.path.basename(self.csv_filename) - name, ext = os.path.splitext(filename) + filename = self.csv_filename.name + name = filename.split(".")[0] # remove design from name if present self.experiment_name = name.replace("_design", "") @@ -223,24 +223,20 @@ def load_design(self) -> None: self.n_stacks = self.design_table.at[1, "Number Stacks"] self.model_var.set(self.model_name) - all_factor_names = [col for col in self.design_table.columns[1:-3]] - self.factor_names = [] # names of factors included in design - # determine what factors are included in design - self.factor_status = {} # dictionary that contains true/false for wheither factor is in design - for col in self.design_table.columns[ - 1:-3 - ]: # col correspond to factor names, exclude index and information cols + all_factor_names = list(self.design_table.columns[1:-3]) + # names of factors included in design + self.factor_names = [] + # dictionary that contains true/false for whether factor is in design + self.factor_status = {} + # col correspond to factor names, exclude index and information cols + for col in self.design_table.columns[1:-3]: factor_set = set(self.design_table[col]) - - if len(factor_set) > 1: - design_factor = True - else: - design_factor = False - + design_factor = len(factor_set) > 1 self.factor_status[col] = design_factor # get default values for fixed factors - self.default_factors = {} # contains only factors not in design, factor default vals input as str + # contains only factors not in design, factor default vals input as str + self.default_factors = {} for factor in self.factor_status: if not self.factor_status[factor]: self.default_factors[factor] = self.design_table.at[1, factor] @@ -254,9 +250,9 @@ def load_design(self) -> None: self.factor_datatype = self.model_object.specifications[factor].get( "datatype" ) - self.factor_description = self.model_object.specifications[ - factor - ].get("description") + self.factor_description = self.model_object.specifications[factor].get( + "description" + ) if not self.factor_status[factor]: self.factor_default = self.default_factors[factor] @@ -264,9 +260,7 @@ def load_design(self) -> None: else: self.factor_default = "Cannot Edit Design Factor" - self.factors_frame.grid_rowconfigure( - self.factor_que_length, weight=1 - ) + self.factors_frame.grid_rowconfigure(self.factor_que_length, weight=1) if self.factor_datatype is int: self.str_type = "int" @@ -340,6 +334,7 @@ def load_design(self) -> None: self.run_button.configure(state="disabled") def enable_run_button(self) -> None: + """Enable the run button.""" self.run_button.configure(state="normal") def show_design_options(self) -> None: @@ -445,33 +440,34 @@ def show_design_options(self) -> None: def mod_design(self) -> None: self.default_values = [ - self.default_value.get() - for self.default_value in self.default_values_list + self.default_value.get() for self.default_value in self.default_values_list ] # default value of each factor - factor_index = 0 - for factor in self.default_factors: - # self.default_values = [self.default_value.get() for self.default_value in self.default_values_list] # default value of each factor + for factor_index, factor in enumerate(self.default_factors): + # self.default_values = [ + # self.default_value.get() + # for self.default_value in self.default_values_list + # ] # default value of each factor new_val = self.default_values[factor_index] self.design_table[factor] = new_val self.default_factors[factor] = new_val - factor_index += 1 self.experiment_name = ( self.design_filename_var.get() ) # name of design file specified by user - self.csv_filename = os.path.join( - DATA_FARMING_DIR, f"{self.experiment_name}_design.csv" - ) + design_csv_name = f"{self.experiment_name}_design.csv" + + self.csv_filename = DATA_FARMING_DIR / design_csv_name self.design_table.to_csv(self.csv_filename, index=False) # read new design csv and convert to df self.design_table = pd.read_csv(self.csv_filename, index_col=False) - tk.messagebox.showinfo( + messagebox.showinfo( "Information", - f"Design has been modified. {self.experiment_name}_design.csv has been created in {DATA_FARMING_DIR}. ", + f"Design has been modified. " + f"{design_csv_name} has been created in {DATA_FARMING_DIR}. ", ) self.display_design_tree() @@ -479,19 +475,16 @@ def mod_design(self) -> None: def con_design(self) -> None: # Create design txt file - self.experiment_name = ( - self.design_filename_var.get() - ) # name of design file specified by user + # Load name specified by user + self.experiment_name = self.design_filename_var.get() + self.design_filename = f"{self.experiment_name}_design.csv" + file_path = DATA_FARMING_DIR / self.design_filename self.design_table[self.factor_names].to_csv( - os.path.join( - DATA_FARMING_DIR, - f"{self.experiment_name}_design.txt", - ), + file_path, sep="\t", index=False, header=False, ) - self.design_filename = f"{self.experiment_name}_design" # get fixed factors in proper data type self.fixed_factors = self.convert_proper_datatype(self.default_factors) @@ -499,18 +492,15 @@ def con_design(self) -> None: self.enable_run_button() def convert_proper_datatype(self, fixed_factors: dict) -> dict: - """Convert fixed factors to proper data type. + """Convert fixed factor values from strings to their proper data types. - Parameters - ---------- - fixed_factors : dict - Dictionary containing fixed factor names not included in design and corresponding user selected value as str. - - Returns - ------- - converted_fixed_factors : dict - Dictrionary containing fixed factor names and corresponding values converted to proper data type. + Args: + fixed_factors (dict): Dictionary containing fixed factor names and + user-selected values as strings. + Returns: + dict: Dictionary with fixed factor names and values converted to their + appropriate data types. """ converted_fixed_factors = {} @@ -527,9 +517,7 @@ def convert_proper_datatype(self, fixed_factors: dict) -> dict: tuple_str = fixed_val[1:-1].split(",") # determine if last tuple value is empty if last_val != ",": - converted_fixed_factors[factor] = tuple( - float(s) for s in tuple_str - ) + converted_fixed_factors[factor] = tuple(float(s) for s in tuple_str) else: tuple_exclude_last = tuple_str[:-1] float_tuple = [float(s) for s in tuple_exclude_last] @@ -543,14 +531,11 @@ def convert_proper_datatype(self, fixed_factors: dict) -> dict: return converted_fixed_factors # Display Model Factors - def show_model_factors(self, *args: tuple) -> None: - """Show model factors in GUI. - - Parameters - ---------- - args : tuple - Tuple containing model name selected by user. + def show_model_factors(self, _: tk.StringVar) -> object: + """Show model factors in the GUI. + Args: + _ (tk.StringVar): The selected model from the drop-down menu. """ self.factor_canvas.destroy() @@ -560,13 +545,9 @@ def show_model_factors(self, *args: tuple) -> None: self.factor_canvas.grid_columnconfigure(0, weight=1) self.factor_canvas.grid(row=4, column=0, sticky="nsew") self.factors_frame = tk.Frame(master=self.factor_canvas) - self.factor_canvas.create_window( - (0, 0), window=self.factors_frame, anchor="nw" - ) + self.factor_canvas.create_window((0, 0), window=self.factors_frame, anchor="nw") - self.factors_frame.grid_rowconfigure( - self.factor_que_length + 1, weight=1 - ) + self.factors_frame.grid_rowconfigure(self.factor_que_length + 1, weight=1) self.factors_title_frame = tk.Frame(master=self) self.factors_title_frame.grid(row=3, column=0, sticky="nsew") @@ -679,22 +660,20 @@ def show_model_factors(self, *args: tuple) -> None: self.factor_datatype = self.model_object.specifications[factor].get( "datatype" ) - self.factor_description = self.model_object.specifications[ - factor - ].get("description") + self.factor_description = self.model_object.specifications[factor].get( + "description" + ) self.factor_default = self.model_object.specifications[factor].get( "default" ) - self.factor_isDatafarmable = self.model_object.specifications[ - factor - ].get("isDatafarmable") + self.factor_isDatafarmable = self.model_object.specifications[factor].get( + "isDatafarmable" + ) # Values to help with formatting entry_width = 10 - self.factors_frame.grid_rowconfigure( - self.factor_que_length, weight=1 - ) + self.factors_frame.grid_rowconfigure(self.factor_que_length, weight=1) # Add label for factor names self.factorname_label = tk.Label( @@ -714,9 +693,7 @@ def show_model_factors(self, *args: tuple) -> None: self.factor_datatype is float and self.factor_isDatafarmable is not False ): - self.factors_frame.grid_rowconfigure( - self.factor_que_length, weight=1 - ) + self.factors_frame.grid_rowconfigure(self.factor_que_length, weight=1) self.str_type = "float" @@ -756,9 +733,7 @@ def show_model_factors(self, *args: tuple) -> None: command=self.include_factor, width=5, ) - self.checkbox.grid( - row=self.factor_que_length, column=3, sticky="nsew" - ) + self.checkbox.grid(row=self.factor_que_length, column=3, sticky="nsew") self.checkstate_list.append(self.checkstate) self.check_widgets[factor] = self.checkbox @@ -849,12 +824,9 @@ def show_model_factors(self, *args: tuple) -> None: self.factor_que_length += 1 elif ( - self.factor_datatype is int - and self.factor_isDatafarmable is not False + self.factor_datatype is int and self.factor_isDatafarmable is not False ): - self.factors_frame.grid_rowconfigure( - self.factor_que_length, weight=1 - ) + self.factors_frame.grid_rowconfigure(self.factor_que_length, weight=1) self.str_type = "int" @@ -892,9 +864,7 @@ def show_model_factors(self, *args: tuple) -> None: variable=self.checkstate, command=self.include_factor, ) - self.checkbox.grid( - row=self.factor_que_length, column=3, sticky="nsew" - ) + self.checkbox.grid(row=self.factor_que_length, column=3, sticky="nsew") self.checkstate_list.append(self.checkstate) self.check_widgets[factor] = self.checkbox @@ -956,13 +926,8 @@ def show_model_factors(self, *args: tuple) -> None: self.factor_que_length += 1 - elif ( - self.factor_datatype is list - or self.factor_isDatafarmable is False - ): - self.factors_frame.grid_rowconfigure( - self.factor_que_length, weight=1 - ) + elif self.factor_datatype is list or self.factor_isDatafarmable is False: + self.factors_frame.grid_rowconfigure(self.factor_que_length, weight=1) if self.factor_datatype is list: self.str_type = "list" @@ -1020,9 +985,7 @@ def show_model_factors(self, *args: tuple) -> None: self.factor_que_length += 1 elif self.factor_datatype is tuple: - self.factors_frame.grid_rowconfigure( - self.factor_que_length, weight=1 - ) + self.factors_frame.grid_rowconfigure(self.factor_que_length, weight=1) self.str_type = "tuple" @@ -1118,10 +1081,8 @@ def display_design_tree(self) -> None: self.design_tree.heading(column, text=column) self.design_tree.column(column, width=100) - for index, row in design_table.iterrows(): - self.design_tree.insert( - "", index, text=index, values=tuple(row)[:-3] - ) + for index, row in enumerate(design_table.itertuples(index=False)): + self.design_tree.insert("", index, text=str(index), values=row[:-3]) # Create a horizontal scrollbar xscrollbar = ttk.Scrollbar( @@ -1175,14 +1136,12 @@ def display_design_tree(self) -> None: ) self.run_button.grid(row=0, column=2, sticky=tk.E, padx=30) - def create_design(self, *args: tuple) -> None: - """Create a design txt file and design csv file based on user specified design options. - - Parameters - ---------- - args : tuple - Tuple containing the number of stacks and design type. + def create_design(self, *_: tuple) -> None: + """Create a design `.txt` and `.csv` file based on user-specified options. + Args: + _ (tuple): Tuple containing the number of stacks and the design type + (unused positional arguments). """ self.create_design_frame = tk.Frame(master=self) self.create_design_frame.grid(row=6, column=0) @@ -1194,8 +1153,13 @@ def create_design(self, *args: tuple) -> None: self.fixed_str = {} # user specified design options - n_stacks = self.stack_var.get() + n_stacks = int(self.stack_var.get()) design_type = self.design_var.get() + if design_type != "nolhs": + error_msg = "Design type not supported." + logging.error(error_msg) + messagebox.showerror("Error", error_msg) + return # List to hold names of all factors part of model to be displayed in csv self.factor_names = [] # names of model factors included in experiment self.fixed_factors = {} # fixed factor names and corresponding value @@ -1210,9 +1174,10 @@ def create_design(self, *args: tuple) -> None: max_values = [max_val.get() for max_val in self.max_list] dec_values = [dec_val.get() for dec_val in self.dec_list] - with open( - os.path.join(DATA_FARMING_DIR, f"{self.experiment_name}.txt"), - ) as self.model_design_factors: + # Create an empty file to append to later + file_name = f"{self.experiment_name}.txt" + file_path = DATA_FARMING_DIR / file_name + with file_path.open() as self.model_design_factors: self.model_design_factors.write("") # values to index through factors @@ -1225,12 +1190,10 @@ def create_design(self, *args: tuple) -> None: # Get experiment information for factor_index, factor in enumerate(self.model_object.specifications): - factor_datatype = self.model_object.specifications[factor].get( - "datatype" + factor_datatype = self.model_object.specifications[factor].get("datatype") + is_datafarmable_factor = self.model_object.specifications[factor].get( + "isDatafarmable" ) - is_datafarmable_factor = self.model_object.specifications[ - factor - ].get("isDatafarmable") factor_include = check_values[factor_index] # get user inputs for design factors @@ -1238,28 +1201,26 @@ def create_design(self, *args: tuple) -> None: if factor_include: self.factor_names.append(factor) - if ( - factor_datatype in (float, int) - and is_datafarmable_factor is not False - ): - factor_min = str(min_values[maxmin_index]) - factor_max = str(max_values[maxmin_index]) - maxmin_index += 1 + if not (factor_datatype in (float, int) and is_datafarmable_factor): + error_msg = "Factor datatype not supported." + logging.error(error_msg) - if factor_datatype is float: - factor_dec = str(dec_values[dec_index]) - dec_index += 1 + factor_min = str(min_values[maxmin_index]) + factor_max = str(max_values[maxmin_index]) + maxmin_index += 1 - elif factor_datatype is int: - factor_dec = "0" + if factor_datatype is float: + # NOTE: this doesn't work with 1e-XX values + factor_dec = str(dec_values[dec_index]) + dec_index += 1 + else: # factor is int + factor_dec = "0" data_insert = f"{factor_min} {factor_max} {factor_dec}\n" + file_name = f"{self.experiment_name}.txt" + file_path = DATA_FARMING_DIR / file_name - with open( - os.path.join( - DATA_FARMING_DIR, - f"{self.experiment_name}.txt", - ), + with file_path.open( mode="a", ) as self.model_design_factors: self.model_design_factors.write(data_insert) @@ -1276,9 +1237,8 @@ def create_design(self, *args: tuple) -> None: # convert fixed factors to proper data type self.fixed_factors = self.convert_proper_datatype(def_factor_str) self.design_filename = f"{self.experiment_name}_design" - self.csv_filename = os.path.join( - DATA_FARMING_DIR, f"{self.experiment_name}_design.csv" - ) + design_csv = f"{self.experiment_name}_design.csv" + self.csv_filename = DATA_FARMING_DIR / design_csv """ Use create_design to create a design txt file & design csv""" self.design_list = create_design( @@ -1289,25 +1249,22 @@ def create_design(self, *args: tuple) -> None: n_stacks=n_stacks, design_type=design_type, class_type="model", - csv_filename=self.csv_filename, ) # Pop up message that csv design file has been created - tk.messagebox.showinfo( + messagebox.showinfo( "Information", - f"Design file {self.experiment_name}_design.csv has been created in {DATA_FARMING_DIR}. ", + f"Design file {design_csv} has been created in {DATA_FARMING_DIR}.", ) # Display Design Values self.display_design_tree() - def run_experiment(self, *args: tuple) -> None: - """Run experiment with specified design and experiment options. - - Parameters - ---------- - args : tuple - Tuple containing the number of replications and whether to use common random numbers. + def run_experiment(self, *_: tuple) -> None: + """Run an experiment using the specified design and experiment options. + Args: + _ (tuple): Tuple containing the number of replications and whether to use + common random numbers (CRN). """ # Specify a common number of replications to run of the model at each # design point. @@ -1315,45 +1272,35 @@ def run_experiment(self, *args: tuple) -> None: # Specify whether to use common random numbers across different versions # of the model. - if self.crn_var.get() == "Yes": - crn_across_design_pts = True - else: - crn_across_design_pts = False + crn_across_design_pts = self.crn_var.get() == "Yes" - output_filename = os.path.join( - DATA_FARMING_DIR, - f"{self.experiment_name}_raw_results", - ) + raw_results = f"{self.experiment_name}_raw_results" + output_filename = DATA_FARMING_DIR / raw_results # Create DataFarmingExperiment object. myexperiment = DataFarmingExperiment( model_name=self.model_object.name, - factor_settings_filename=None, + factor_settings_file_name=None, factor_headers=self.factor_names, - design_filepath=self.design_filename, + design_path=self.design_filename, model_fixed_factors=self.fixed_factors, ) # Run replications and print results to file. - myexperiment.run( - n_reps=n_reps, crn_across_design_pts=crn_across_design_pts - ) - myexperiment.print_to_csv(csv_filename=output_filename) + myexperiment.run(n_reps=n_reps, crn_across_design_pts=crn_across_design_pts) + myexperiment.print_to_csv(csv_file_name=output_filename) # run confirmation message - tk.messagebox.showinfo( + messagebox.showinfo( "Run Completed", f"Experiment Completed. Output file can be found at {output_filename}", ) - def include_factor(self, *args: tuple) -> None: - """Include factor in experiment and enable experiment options. - - Parameters - ---------- - args : tuple - Tuple containing the factor name and checkstate value. + def include_factor(self, *_: tuple) -> None: + """Include a factor in the experiment and enable related experiment options. + Args: + _ (tuple): Tuple containing the factor name and its checkstate value. """ self.check_values = [ self.checkstate.get() for self.checkstate in self.checkstate_list @@ -1369,15 +1316,15 @@ def include_factor(self, *args: tuple) -> None: self.factor_datatype = self.model_object.specifications[factor].get( "datatype" ) - self.factor_description = self.model_object.specifications[ - factor - ].get("description") + self.factor_description = self.model_object.specifications[factor].get( + "description" + ) self.factor_default = self.model_object.specifications[factor].get( "default" ) - self.factor_isDatafarmable = self.model_object.specifications[ - factor - ].get("isDatafarmable") + self.factor_isDatafarmable = self.model_object.specifications[factor].get( + "isDatafarmable" + ) # Disable / enable experiment option widgets depending on factor type if ( diff --git a/simopt/gui/df_object.py b/simopt/gui/df_object.py index e1158f7a5..d26e33cae 100644 --- a/simopt/gui/df_object.py +++ b/simopt/gui/df_object.py @@ -1,7 +1,17 @@ +"""Datafarmable row classes. + +This module contains the classes that represent the datafarmable rows in the GUI. +""" + +from __future__ import annotations + import tkinter as tk from abc import ABC, abstractmethod +from ast import literal_eval from tkinter import ttk -from typing import Literal, Union +from typing import Literal + +from simopt.utils import classproperty, override class DFFactor(ABC): @@ -17,9 +27,9 @@ def description(self) -> tk.StringVar: """The description of the factor.""" return self.__description - @property + @classproperty @abstractmethod - def type(self) -> tk.StringVar: + def type(cls) -> tk.StringVar: """The type of the factor.""" raise NotImplementedError @@ -41,7 +51,7 @@ def default_eval(self) -> object: raise NotImplementedError @property - def include(self) -> Union[tk.BooleanVar, None]: + def include(self) -> tk.BooleanVar | None: """Whether to include the factor in the experiment.""" return None @@ -68,30 +78,26 @@ def include_datafarm_state( return "disabled" @property - def minimum(self) -> Union[tk.IntVar, tk.DoubleVar, None]: + def minimum(self) -> tk.IntVar | tk.DoubleVar | None: """The minimum value of the factor.""" return None @property - def maximum(self) -> Union[tk.IntVar, tk.DoubleVar, None]: + def maximum(self) -> tk.IntVar | tk.DoubleVar | None: """The maximum value of the factor.""" return None @property - def num_decimals(self) -> Union[tk.IntVar, None]: + def num_decimals(self) -> tk.IntVar | None: """The number of decimals of the factor.""" return None def __init__(self, name: str, description: str) -> None: - """Initialize the factor class. - - Parameters - ---------- - name : str - The name of the factor - description : str - The description of the factor + """Initialize a DFFactor instance. + Args: + name (str): The name of the factor. + description (str): A description of the factor. """ self.__name = tk.StringVar(value=name) self.__description = tk.StringVar(value=description) @@ -99,16 +105,11 @@ def __init__(self, name: str, description: str) -> None: def get_name_label(self, frame: ttk.Frame) -> tk.Label: """Get the name label of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - tk.Label - The name label of the factor + Args: + frame (ttk.Frame): The frame in which the label will be placed. + Returns: + tk.Label: The name label for the factor. """ if not hasattr(self, "lbl_name"): self.lbl_name = tk.Label( @@ -121,16 +122,11 @@ def get_name_label(self, frame: ttk.Frame) -> tk.Label: def get_description_label(self, frame: ttk.Frame) -> tk.Label: """Get the description label of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - tk.Label - The description label of the factor + Args: + frame (ttk.Frame): The frame in which the label will be placed. + Returns: + tk.Label: The description label for the factor. """ if not hasattr(self, "lbl_description"): self.lbl_description = tk.Label( @@ -145,16 +141,11 @@ def get_description_label(self, frame: ttk.Frame) -> tk.Label: def get_type_label(self, frame: ttk.Frame) -> tk.Label: """Get the type label of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - tk.Label - The type label of the factor + Args: + frame (ttk.Frame): The frame in which the label will be placed. + Returns: + tk.Label: The type label for the factor. """ if not hasattr(self, "lbl_type"): self.lbl_type = tk.Label( @@ -169,16 +160,11 @@ def get_type_label(self, frame: ttk.Frame) -> tk.Label: def get_default_entry(self, frame: ttk.Frame) -> ttk.Entry: """Get the default entry of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - ttk.Entry - The default entry of the factor + Args: + frame (ttk.Frame): The frame in which the entry will be placed. + Returns: + ttk.Entry: The default entry for the factor. """ if not hasattr(self, "ent_default"): self.ent_default = ttk.Entry( @@ -190,21 +176,15 @@ def get_default_entry(self, frame: ttk.Frame) -> ttk.Entry: ) return self.ent_default - def get_include_checkbutton( - self, frame: ttk.Frame - ) -> Union[tk.Checkbutton, None]: + def get_include_checkbutton(self, frame: ttk.Frame) -> tk.Checkbutton | None: """Get the include checkbutton of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - tk.Checkbutton | None - The include checkbutton of the factor (if applicable) + Args: + frame (ttk.Frame): The frame in which the checkbutton will be placed. + Returns: + tk.Checkbutton | None: The include checkbutton for the factor, + if applicable. """ if self.include is None: return None @@ -216,19 +196,14 @@ def get_include_checkbutton( ) return self.chk_include - def get_minimum_entry(self, frame: ttk.Frame) -> Union[ttk.Entry, None]: + def get_minimum_entry(self, frame: ttk.Frame) -> ttk.Entry | None: """Get the minimum entry of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - ttk.Entry | None - The minimum entry of the factor (if applicable) + Args: + frame (ttk.Frame): The frame in which the entry will be placed. + Returns: + ttk.Entry | None: The minimum entry for the factor, if applicable. """ if self.minimum is None: return None @@ -242,19 +217,14 @@ def get_minimum_entry(self, frame: ttk.Frame) -> Union[ttk.Entry, None]: ) return self.ent_minimum - def get_maximum_entry(self, frame: ttk.Frame) -> Union[ttk.Entry, None]: + def get_maximum_entry(self, frame: ttk.Frame) -> ttk.Entry | None: """Get the maximum entry of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - ttk.Entry | None - The maximum entry of the factor (if applicable) + Args: + frame (ttk.Frame): The frame in which the entry will be placed. + Returns: + ttk.Entry | None: The maximum entry for the factor, if applicable. """ if self.maximum is None: return None @@ -268,21 +238,15 @@ def get_maximum_entry(self, frame: ttk.Frame) -> Union[ttk.Entry, None]: ) return self.ent_maximum - def get_num_decimals_entry( - self, frame: ttk.Frame - ) -> Union[ttk.Entry, None]: + def get_num_decimals_entry(self, frame: ttk.Frame) -> ttk.Entry | None: """Get the number of decimals entry of the factor. - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - ttk.Entry | None - The number of decimals entry of the factor (if applicable) + Args: + frame (ttk.Frame): The frame in which the entry will be placed. + Returns: + ttk.Entry | None: The number of decimals entry for the factor, + if applicable. """ if self.num_decimals is None: return None @@ -328,8 +292,8 @@ def include(self) -> tk.BooleanVar: """Whether to include the factor in the experiment.""" return self.__include - @property - def type(self) -> tk.StringVar: + @classproperty + def type(cls) -> tk.StringVar: """The type of the factor.""" return tk.StringVar(value="bool") @@ -369,36 +333,19 @@ def include_datafarm_state(self) -> Literal["readonly", "disabled", None]: return "disabled" def __init__(self, name: str, description: str, default: bool) -> None: - """Initialize the boolean factor class. - - Parameters - ---------- - name : str - The name of the factor - description : str - The description of the factor - default : bool - The default value of the factor + """Initialize the boolean factor. + Args: + name (str): The name of the factor. + description (str): A description of the factor. + default (bool): The default value of the factor. """ super().__init__(name, description) self.default = tk.BooleanVar(value=default) self.__include = tk.BooleanVar(value=False) + @override def get_default_entry(self, frame: ttk.Frame) -> ttk.Entry: - """Get the default entry of the factor. - - Parameters - ---------- - frame : ttk.Frame - The frame the entry will be placed in - - Returns - ------- - ttk.Entry - The default entry of the factor - - """ if not hasattr(self, "ent_default"): # Create a dropdown menu for boolean values self.ent_default = ttk.Combobox( @@ -421,8 +368,8 @@ def _toggle_fields(self) -> None: class DFInteger(DFFactor): """Class to store integer factors for problems and solvers.""" - @property - def type(self) -> tk.StringVar: + @classproperty + def type(cls) -> tk.StringVar: """The type of the factor.""" return tk.StringVar(value="int") @@ -472,17 +419,12 @@ def maximum(self, maximum: tk.IntVar) -> None: self.__maximum = maximum def __init__(self, name: str, description: str, default: int) -> None: - """Initialize the integer factor class. - - Parameters - ---------- - name : str - The name of the factor - description : str - The description of the factor - default : int - The default value of the factor + """Initialize the integer factor. + Args: + name (str): The name of the factor. + description (str): A description of the factor. + default (int): The default value of the factor. """ super().__init__(name, description) self.__default = tk.IntVar(value=default) @@ -494,8 +436,8 @@ def __init__(self, name: str, description: str, default: int) -> None: class DFIntegerNonDatafarmable(DFFactor): """Class to store non-datafarmable integer factors for problems and solvers.""" - @property - def type(self) -> tk.StringVar: + @classproperty + def type(cls) -> tk.StringVar: """The type of the factor.""" return tk.StringVar(value="int") @@ -522,17 +464,12 @@ def default_eval(self) -> int: ) from None def __init__(self, name: str, description: str, default: int) -> None: - """Initialize the - - Parameters - ---------- - name : str - The name of the factor - description : str - The description of the factor - default : list - The default value of the factor + """Initialize the non-datafarmable integer factor. + Args: + name (str): The name of the factor. + description (str): A description of the factor. + default (int): The default value of the factor. """ appended_description = "[Non-Datafarmable] " + description super().__init__(name, appended_description) @@ -542,8 +479,8 @@ def __init__(self, name: str, description: str, default: int) -> None: class DFFloat(DFFactor): """Class to store float factors for problems and solvers.""" - @property - def type(self) -> tk.StringVar: + @classproperty + def type(cls) -> tk.StringVar: """The type of the factor.""" return tk.StringVar(value="float") @@ -602,17 +539,12 @@ def num_decimals(self, num_decimals: tk.IntVar) -> None: self.__num_decimals = num_decimals def __init__(self, name: str, description: str, default: float) -> None: - """Initialize the float factor class. - - Parameters - ---------- - name : str - The name of the factor - description : str - The description of the factor - default : float - The default value of the factor + """Initialize the float factor. + Args: + name (str): The name of the factor. + description (str): A description of the factor. + default (float): The default value of the factor. """ super().__init__(name, description) self.__default = tk.DoubleVar(value=default) @@ -623,24 +555,19 @@ def __init__(self, name: str, description: str, default: float) -> None: self.__num_decimals = tk.IntVar(value=num_decimals) def __find_num_decimals(self, value: float) -> int: - """Find the number of decimals in a float value. - - Parameters - ---------- - value : float - The float value to find the number of decimals in + """Find the number of decimal places in a float value. - Returns - ------- - int - The number of decimals in the float value + Args: + value (float): The float value to analyze. + Returns: + int: The number of decimal places in the given float. """ # Case 1: Decimal point in value if "." in str(value): return len(str(value).split(".")[1]) # Case 2: No decimal point in value, but xe-y format - elif "e-" in str(value): + if "e-" in str(value): return int(str(value).split("e-")[1]) # Case 3: No decimal point and not in xe-y format return 0 @@ -649,8 +576,8 @@ def __find_num_decimals(self, value: float) -> int: class DFTuple(DFFactor): """Class to store tuple factors for problems and solvers.""" - @property - def type(self) -> tk.StringVar: + @classproperty + def type(cls) -> tk.StringVar: """The type of the factor.""" return tk.StringVar(value="tuple") @@ -670,24 +597,19 @@ def default(self, default: tk.Variable) -> None: def default_eval(self) -> tuple: """Evaluated default value of the factor.""" try: - return tuple(eval(self.default.get())) + return tuple(literal_eval(self.default.get())) except ValueError: raise ValueError( f"Default value for {self.name.get()} must be a tuple." ) from None def __init__(self, name: str, description: str, default: tuple) -> None: - """Initialize the tuple factor class. - - Parameters - ---------- - name : str - The name of the factor - description : str - The description of the factor - default : tuple - The default value of the factor + """Initialize the tuple factor. + Args: + name (str): The name of the factor. + description (str): A description of the factor. + default (tuple): The default value of the factor. """ super().__init__(name, description) self.__default = tk.StringVar(value=str(default)) @@ -696,8 +618,8 @@ def __init__(self, name: str, description: str, default: tuple) -> None: class DFList(DFFactor): """Class to store list factors for problems and solvers.""" - @property - def type(self) -> tk.StringVar: + @classproperty + def type(cls) -> tk.StringVar: """The type of the factor.""" return tk.StringVar(value="list") @@ -717,72 +639,48 @@ def default(self, default: tk.Variable) -> None: def default_eval(self) -> list: """Evaluated default value of the factor.""" try: - return list(eval(self.default.get())) + return list(literal_eval(self.default.get())) except ValueError: raise ValueError( f"Default value for {self.name.get()} must be a list." ) from None def __init__(self, name: str, description: str, default: list) -> None: - """Initialize the list factor class. - - Parameters - ---------- - name : str - The name of the factor - description : str - The description of the factor - default : list - The default value of the factor + """Initialize the list factor. + Args: + name (str): The name of the factor. + description (str): A description of the factor. + default (list): The default value of the factor. """ super().__init__(name, description) self.__default = tk.StringVar(value=str(default)) -def spec_dict_to_df_dict(spec_dict: "dict[str, dict]") -> "dict[str, DFFactor]": - """Convert a dictionary of specifications to a dictionary of datafarm factors. - - Parameters - ---------- - spec_dict : dict - The dictionary of specifications +def spec_dict_to_df_dict(spec_dict: dict[str, dict]) -> dict[str, DFFactor]: + """Convert a dictionary of specifications to a dictionary of data farming factors. - Returns - ------- - dict - The dictionary of datafarm factors + Args: + spec_dict (dict[str, dict]): A dictionary of factor specifications. + Returns: + dict[str, DFFactor]: A dictionary mapping factor names to `DFFactor` instances. """ - - # Create an empty dictionary for the datafarm factors - df_dict: dict[str, DFFactor] = {} - - # Iterate over the specification dictionary - for spec_name, spec in spec_dict.items(): - # Convert the specification to a datafarm factor - df_dict[spec_name] = spec_to_df(spec_name, spec) - - return df_dict + return { + spec_name: spec_to_df(spec_name, spec) for spec_name, spec in spec_dict.items() + } def spec_to_df(spec_name: str, spec: dict) -> DFFactor: - """Convert a specification to a datafarm factor. + """Convert a specification to a data farming factor. - Parameters - ---------- - spec_name : str - The name of the factor - spec : dict - The specifications of the factor - - Returns - ------- - DFFactor - The datafarm factor + Args: + spec_name (str): The name of the factor. + spec (dict): The specification dictionary for the factor. + Returns: + DFFactor: The corresponding data farming factor. """ - # Get the factor's datatype, description, and default value f_type = spec["datatype"] f_description = spec["description"] @@ -797,16 +695,9 @@ def spec_to_df(spec_name: str, spec: dict) -> DFFactor: } # Check to see if we have a non-datafarmable integer - if ( - f_type is int - and "isDatafarmable" in spec - and not spec["isDatafarmable"] - ): + if f_type is int and "isDatafarmable" in spec and not spec["isDatafarmable"]: return DFIntegerNonDatafarmable(spec_name, f_description, f_default) # Otherwise, just use the default mapping - elif f_type in df_factor_map: + if f_type in df_factor_map: return df_factor_map[f_type](spec_name, f_description, f_default) - else: - raise NotImplementedError( - f"Factor type [{f_type}] not yet implemented." - ) + raise NotImplementedError(f"Factor type [{f_type}] not yet implemented.") diff --git a/simopt/gui/experiment_window.py b/simopt/gui/experiment_window.py deleted file mode 100644 index 5233cb4e0..000000000 --- a/simopt/gui/experiment_window.py +++ /dev/null @@ -1,4225 +0,0 @@ -import ast -import pickle -import time -import tkinter as tk -from functools import partial -from tkinter import Scrollbar, filedialog, simpledialog, ttk -from tkinter.font import nametofont - -from simopt.base import Problem, Solver -from simopt.directory import ( - model_directory, - model_problem_unabbreviated_directory, - problem_directory, - problem_unabbreviated_directory, - solver_directory, - solver_unabbreviated_directory, -) -from simopt.experiment_base import ( - EXPERIMENT_DIR, - ProblemSolver, - ProblemsSolvers, - find_missing_experiments, - make_full_metaexperiment, - post_normalize, -) -from simopt.gui.data_farming_window import DataFarmingWindow -from simopt.gui.plot_window import PlotWindow -from simopt.gui.toplevel_custom import Toplevel - - -class ExperimentWindow(Toplevel): - """Main window of the GUI. - - Attributes - ---------- - self.frame : Tkinter frame that contains the GUI widgets - self.experiment_master_list : 2D array list that contains queue of experiment object arguments - self.widget_list : Current method to clear, view/edit, and run individual experiments - * this functionality is currently not enabled, possible contraint of the GUI framework - self.experiment_object_list : List that contains matching experiment objects to every sublist from self.experiment_master_list - self.problem_var : Variable that contains selected problem (use .get() method to obtain value for) - self.solver_var : Variable that contains selected solver (use .get() method to obtain value for) - self.maco_var : Variable that contains inputted number of macroreplications (use .get() method to obtain value for) - - """ - - def __init__(self, root: tk.Tk) -> None: - """Initialize the main window of the GUI.""" - super().__init__( - root, title="SimOpt GUI - Experiment", exit_on_close=True - ) - self.center_window(0.8) # 80% scaling - - self.frame = tk.Frame(self) - self.count_meta_experiment_queue = 0 - self.experiment_master_list = [] - self.meta_experiment_master_list = [] - self.widget_list = [] - self.experiment_object_list = [] - self.count_experiment_queue = 1 - self.normalize_list = [] - self.normalize_list2 = [] - self.widget_meta_list = [] - self.widget_norm_list = [] - self.post_norm_exp_list = [] - self.prev = 60 - self.meta_experiment_macro_reps = [] - self.check_box_list = [] - self.check_box_list_var = [] - self.list_checked_experiments = [] - - self.instruction_label = tk.Label( - master=self, # window label is used in - text="Welcome to SimOpt Library Graphic User Interface\n Please Load or Add Your Problem-Solver Pair(s): ", - font=nametofont("TkHeadingFont"), - justify="center", - ) - - self.problem_label = tk.Label( - master=self, # window label is used in - text="Select Problem:", - ) - - self.or_label = tk.Label( - master=self, # window label is used in - text=" OR ", - ) - self.or_label2 = tk.Label( - master=self, # window label is used in - text=" OR Select Problem and Solver from Below:", - ) - self.or_label22 = tk.Label( - master=self, # window label is used in - text="Select from Below:", - ) - - # from experiments.inputs.all_factors.py: - self.problem_list = problem_unabbreviated_directory - # stays the same, has to change into a special type of variable via tkinter function - self.problem_var = tk.StringVar(master=self) - # sets the default OptionMenu value - - # creates drop down menu, for tkinter, it is called "OptionMenu" - self.problem_menu = ttk.OptionMenu( - self, - self.problem_var, - "Problem", - *self.problem_list, - command=self.show_problem_factors, - ) - - self.solver_label = tk.Label( - master=self, # window label is used in - text="Select Solver:", - ) - - # from experiments.inputs.all_factors.py: - self.solver_list = solver_unabbreviated_directory - # stays the same, has to change into a special type of variable via tkinter function - self.solver_var = tk.StringVar(master=self) - # sets the default OptionMenu value - - # creates drop down menu, for tkinter, it is called "OptionMenu" - self.solver_menu = ttk.OptionMenu( - self, - self.solver_var, - "Solver", - *self.solver_list, - command=self.show_solver_factors, - ) - - # self.macro_label = tk.Label(master=self, - # text = "Number of Macroreplications:", - # font = f"{TEXT_FAMILY} 13") - - self.macro_definition = tk.Label( - master=self, - text="", - ) - - self.macro_definition_label = tk.Label( - master=self, - text="Number of Macroreplications:", - width=25, - ) - - self.macro_var = tk.StringVar(self) - self.macro_entry = ttk.Entry( - master=self, - textvariable=self.macro_var, - justify=tk.LEFT, - width=10, - ) - self.macro_entry.insert(index=tk.END, string="10") - - self.add_button = ttk.Button( - master=self, - text="Add Problem-Solver Pair", - width=15, - command=self.add_experiment, - ) - - self.clear_queue_button = ttk.Button( - master=self, - text="Clear All Problem-Solver Pairs", - width=15, - command=self.clear_queue, - ) # (self.experiment_added, self.problem_added, self.solver_added, self.macros_added, self.run_button_added)) - - self.crossdesign_button = ttk.Button( - master=self, - text="Create Problem-Solver Group", - width=50, - command=self.crossdesign_function, - ) - - self.pickle_file_load_button = ttk.Button( - master=self, - text="Load Problem-Solver Pair", - width=50, - command=self.load_pickle_file_function, - ) - - self.attribute_description_label = tk.Label( - master=self, - text="Attribute Description Label for Problems:\n Objective (Single [S] or Multiple [M])\n Constraint (Unconstrained [U], Box[B], Determinisitic [D], Stochastic [S])\n Variable (Discrete [D], Continuous [C], Mixed [M])\n Gradient Available (True [G] or False [N])", - font=nametofont("TkTooltipFont"), - ) - self.attribute_description_label.place(x=450, rely=0.478) - - self.post_normal_all_button = ttk.Button( - master=self, - text="Post-Normalize Selected", - width=20, - state="normal", - command=self.post_normal_all_function, - ) - - self.make_meta_experiment = ttk.Button( - master=self, - text="Create Problem-Solver Group from Selected", - width=35, - state="normal", - command=self.make_meta_experiment_func, - ) - - self.pickle_file_pathname_label = tk.Label( - master=self, - text="File Selected:", - ) - - self.pickle_file_pathname_show = tk.Label( - master=self, - text="No File Selected!", - foreground="red", - wraplength="500", - ) - - self.style.configure("Bold.TLabel", font=nametofont("TkHeadingFont")) - self.label_Workspace = ttk.Label( - master=self, text="Workspace", style="Bold.TLabel" - ) - self.queue_label_frame = ttk.LabelFrame( - master=self, labelwidget=self.label_Workspace - ) - - self.queue_canvas = tk.Canvas( - master=self.queue_label_frame, borderwidth=0 - ) - - self.queue_frame = ttk.Frame(master=self.queue_canvas) - self.vert_scroll_bar = Scrollbar( - self.queue_label_frame, - orient="vertical", - command=self.queue_canvas.yview, - ) - self.horiz_scroll_bar = Scrollbar( - self.queue_label_frame, - orient="horizontal", - command=self.queue_canvas.xview, - ) - self.queue_canvas.configure( - xscrollcommand=self.horiz_scroll_bar.set, - yscrollcommand=self.vert_scroll_bar.set, - ) - - self.vert_scroll_bar.pack(side="right", fill="y") - self.horiz_scroll_bar.pack(side="bottom", fill="x") - - self.queue_canvas.pack(side="left", fill="both", expand=True) - self.queue_canvas.create_window( - (0, 0), - window=self.queue_frame, - anchor="nw", - tags="self.queue_frame", - ) - - self.queue_frame.bind("", self.on_frame_configure_queue) - - self.notebook = ttk.Notebook(master=self.queue_frame) - self.notebook.pack(fill="both") - - self.tab_one = tk.Frame(master=self.notebook) - self.notebook.add(self.tab_one, text="Queue of Problem-Solver Pairs") - - self.tab_one.grid_rowconfigure(0) - - self.heading_list = [ - "Selected", - "Pair #", - "Problem", - "Solver", - "Macroreps", - "", - "", - "", - "", - "", - ] - - for heading in self.heading_list: - self.tab_one.grid_columnconfigure(self.heading_list.index(heading)) - label = tk.Label( - master=self.tab_one, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label.grid( - row=0, column=self.heading_list.index(heading), padx=10, pady=3 - ) - - self.tab_two = tk.Frame(master=self.notebook) - self.notebook.add(self.tab_two, text="Queue of Problem-Solver Groups") - self.tab_two.grid_rowconfigure(0) - self.heading_list = [ - "Problems", - "Solvers", - "Macroreps", - "", - "", - "", - "", - "", - ] - - for heading in self.heading_list: - self.tab_two.grid_columnconfigure(self.heading_list.index(heading)) - label = tk.Label( - master=self.tab_two, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label.grid( - row=0, column=self.heading_list.index(heading), padx=10, pady=3 - ) - - self.tab_three = tk.Frame(master=self.notebook) - self.notebook.add(self.tab_three, text="Post-Normalize by Problem") - self.tab_three.grid_rowconfigure(0) - self.heading_list = [ - "Problem", - "Solvers", - "Selected", - "", - "", - "", - "", - "", - ] - - for heading in self.heading_list: - self.tab_three.grid_columnconfigure( - self.heading_list.index(heading) - ) - label = tk.Label( - master=self.tab_three, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label.grid( - row=0, column=self.heading_list.index(heading), padx=10, pady=3 - ) - - def on_tab_change(event: tk.Event) -> None: - """Handle tab change event. - - Parameters - ---------- - event : tk.Event - The event object - - """ - tab = event.widget.tab("current")["text"] - if tab == "Post-Normalize by Problem": - self.post_norm_setup() - self.post_normal_all_button.place(x=10, rely=0.92) - else: - self.post_normal_all_button.place_forget() - if tab == "Queue of Problem-Solver Pairs": - # My code starts here - # Make meta experiment button wider & releative x - self.make_meta_experiment.place(relx=0.02, rely=0.92, width=300) - # My code ends here - else: - self.make_meta_experiment.place_forget() - - self.notebook.bind("<>", on_tab_change) - - self.instruction_label.place(relx=0.4, y=0) - - self.solver_label.place(relx=0.01, rely=0.1) - self.solver_menu.place(relx=0.1, rely=0.1) - - self.problem_label.place(relx=0.3, rely=0.1) - self.problem_menu.place(relx=0.4, rely=0.1) - - # self.macro_label.place(relx=.7, rely=.1) - self.macro_entry.place(relx=0.89, rely=0.1, width=100) - - self.macro_definition.place(relx=0.73, rely=0.05) - self.macro_definition_label.place(relx=0.7, rely=0.1) - - # self.macro_definition_label.bind("",self.on_enter) - # self.macro_definition_label.bind("",self.on_leave) - - self.or_label.place(x=215, rely=0.06) - self.crossdesign_button.place(x=255, rely=0.06, width=220) - - y_place = 0.06 - self.pickle_file_load_button.place(x=10, rely=y_place, width=195) - self.or_label2.place(x=480, rely=0.06) - # self.or_label22.place(x=435, rely=.06) - - self.queue_label_frame.place( - x=10, rely=0.56, relheight=0.35, relwidth=0.99 - ) - # self.post_normal_all_button.place(x=400,rely=.95) - - self.frame.pack(fill="both") - - # self.l1.bind("", self.on_enter) - # self.l1.bind("", self.on_leave) - - # def on_enter(self, event): - # self.l2(text="Hover Works :)") - # def on_leave(self, enter): - # self.l2.configure(text="") - - # def on_enter(self, event): - # self.macro_definition.configure(text="Definition of MacroReplication") - - # def on_leave(self, enter): - # self.macro_definition.configure(text="") - - def show_problem_factors(self, *args: tuple) -> None: - """Show the problem factors. - - Parameters - ---------- - *args : tuple - The arguments - - """ - # if args and len(args) == 2: - # print("ARGS: ", args[1]) - # ("arg length:", len(args)) - - self.problem_factors_list = [] - self.problem_factors_types = [] - - self.factor_label_frame_problem = ttk.LabelFrame( - master=self, text="Problem Factors" - ) - - self.factor_canvas_problem = tk.Canvas( - master=self.factor_label_frame_problem, borderwidth=0 - ) - - self.factor_frame_problem = ttk.Frame(master=self.factor_canvas_problem) - self.vert_scroll_bar_factor_problem = Scrollbar( - self.factor_label_frame_problem, - orient="vertical", - command=self.factor_canvas_problem.yview, - ) - self.horiz_scroll_bar_factor_problem = Scrollbar( - self.factor_label_frame_problem, - orient="horizontal", - command=self.factor_canvas_problem.xview, - ) - self.factor_canvas_problem.configure( - xscrollcommand=self.horiz_scroll_bar_factor_problem.set, - yscrollcommand=self.vert_scroll_bar_factor_problem.set, - ) - - self.vert_scroll_bar_factor_problem.pack(side="right", fill="y") - self.horiz_scroll_bar_factor_problem.pack(side="bottom", fill="x") - - self.factor_canvas_problem.pack(side="left", fill="both", expand=True) - self.factor_canvas_problem.create_window( - (0, 0), - window=self.factor_frame_problem, - anchor="nw", - tags="self.factor_frame_problem", - ) - - self.factor_frame_problem.bind( - "", self.on_frame_configure_factor_problem - ) - - self.factor_notebook_problem = ttk.Notebook( - master=self.factor_frame_problem - ) - self.factor_notebook_problem.pack(fill="both") - - self.factor_tab_one_problem = tk.Frame( - master=self.factor_notebook_problem - ) - - self.factor_notebook_problem.add( - self.factor_tab_one_problem, - text=str(self.problem_var.get()) + " Factors", - ) - - self.factor_tab_one_problem.grid_rowconfigure(0) - - self.factor_heading_list_problem = ["Description", "Input"] - - for heading in self.factor_heading_list_problem: - self.factor_tab_one_problem.grid_columnconfigure( - self.factor_heading_list_problem.index(heading) - ) - label_problem = tk.Label( - master=self.factor_tab_one_problem, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label_problem.grid( - row=0, - column=self.factor_heading_list_problem.index(heading), - padx=10, - pady=3, - ) - - self.problem_object = problem_unabbreviated_directory[ - self.problem_var.get() - ] - - count_factors_problem = 1 - - if args and len(args) == 2 and args[0]: - oldname = args[1][3][1] - - else: - problem_object = problem_unabbreviated_directory[ - self.problem_var.get() - ] - oldname = problem_object().name - - self.save_label_problem = tk.Label( - master=self.factor_tab_one_problem, - text="save problem as", - ) - - self.save_var_problem = tk.StringVar(self.factor_tab_one_problem) - self.save_entry_problem = ttk.Entry( - master=self.factor_tab_one_problem, - textvariable=self.save_var_problem, - justify=tk.LEFT, - width=15, - ) - - self.save_entry_problem.insert(index=tk.END, string=oldname) - - self.save_label_problem.grid( - row=count_factors_problem, column=0, sticky="nsew" - ) - self.save_entry_problem.grid( - row=count_factors_problem, column=1, sticky="nsew" - ) - - self.problem_factors_list.append(self.save_var_problem) - self.problem_factors_types.append(str) - - count_factors_problem += 1 - - for _, factor_type in enumerate( - self.problem_object().specifications, start=0 - ): - # (factor_type, len(self.problem_object().specifications[factor_type]['default']) ) - - self.dictionary_size_problem = len( - self.problem_object().specifications[factor_type] - ) - datatype = ( - self.problem_object() - .specifications[factor_type] - .get("datatype") - ) - description = ( - self.problem_object() - .specifications[factor_type] - .get("description") - ) - default = ( - self.problem_object().specifications[factor_type].get("default") - ) - - if datatype is not bool: - self.int_float_description_problem = tk.Label( - master=self.factor_tab_one_problem, - text=str(description), - wraplength=150, - ) - - self.int_float_var_problem = tk.StringVar( - self.factor_tab_one_problem - ) - self.int_float_entry_problem = ttk.Entry( - master=self.factor_tab_one_problem, - textvariable=self.int_float_var_problem, - justify=tk.LEFT, - width=15, - ) - if args and len(args) == 2 and args[0]: - self.int_float_entry_problem.insert( - index=tk.END, string=str(args[1][3][0][factor_type]) - ) - elif datatype is tuple and len(default) == 1: - # (factor_type, len(self.problem_object().specifications[factor_type]['default']) ) - # self.int_float_entry_problem.insert(index=tk.END, string=str(self.problem_object().specifications[factor_type].get("default"))) - self.int_float_entry_problem.insert( - index=tk.END, string=str(default[0]) - ) - else: - self.int_float_entry_problem.insert( - index=tk.END, string=str(default) - ) - - self.int_float_description_problem.grid( - row=count_factors_problem, column=0, sticky="nsew" - ) - self.int_float_entry_problem.grid( - row=count_factors_problem, column=1, sticky="nsew" - ) - - self.problem_factors_list.append(self.int_float_var_problem) - if datatype is not tuple: - self.problem_factors_types.append(datatype) - else: - self.problem_factors_types.append(str) - - count_factors_problem += 1 - - if datatype is bool: - self.boolean_description_problem = tk.Label( - master=self.factor_tab_one_problem, - text=str(description), - wraplength=150, - ) - self.boolean_var_problem = tk.BooleanVar( - self.factor_tab_one_problem, value=bool(default) - ) - self.boolean_menu_problem = tk.Checkbutton( - self.factor_tab_one_problem, - variable=self.boolean_var_problem.get(), - onvalue=True, - offvalue=False, - ) - self.boolean_description_problem.grid( - row=count_factors_problem, column=0, sticky="nsew" - ) - self.boolean_menu_problem.grid( - row=count_factors_problem, column=1, sticky="nsew" - ) - self.problem_factors_list.append(self.boolean_var_problem) - self.problem_factors_types.append(datatype) - - count_factors_problem += 1 - - # self.factor_label_frame_problem.place(x=400, y=70, height=300, width=475) - self.factor_label_frame_problem.place( - relx=0.35, rely=0.15, relheight=0.33, relwidth=0.34 - ) - - # Switching from Problems to Oracles - - self.oracle_factors_list = [] - self.oracle_factors_types = [] - - ## Rina Adding After this - problem = str(self.problem_var.get()) - self.oracle = model_problem_unabbreviated_directory[ - problem - ] # returns model string - self.oracle_object = model_directory[self.oracle] - ##self.oracle = problem.split("-") - ##self.oracle = self.oracle[0] - ##self.oracle_object = model_directory[self.oracle] - - ## Stop adding for Rina - - self.factor_label_frame_oracle = ttk.LabelFrame( - master=self, text="Model Factors" - ) - - self.factor_canvas_oracle = tk.Canvas( - master=self.factor_label_frame_oracle, borderwidth=0 - ) - - self.factor_frame_oracle = ttk.Frame(master=self.factor_canvas_oracle) - self.vert_scroll_bar_factor_oracle = Scrollbar( - self.factor_label_frame_oracle, - orient="vertical", - command=self.factor_canvas_oracle.yview, - ) - self.horiz_scroll_bar_factor_oracle = Scrollbar( - self.factor_label_frame_oracle, - orient="horizontal", - command=self.factor_canvas_oracle.xview, - ) - self.factor_canvas_oracle.configure( - xscrollcommand=self.horiz_scroll_bar_factor_oracle.set, - yscrollcommand=self.vert_scroll_bar_factor_oracle.set, - ) - - self.vert_scroll_bar_factor_oracle.pack(side="right", fill="y") - self.horiz_scroll_bar_factor_oracle.pack(side="bottom", fill="x") - - self.factor_canvas_oracle.pack(side="left", fill="both", expand=True) - self.factor_canvas_oracle.create_window( - (0, 0), - window=self.factor_frame_oracle, - anchor="nw", - tags="self.factor_frame_oracle", - ) - - self.factor_frame_oracle.bind( - "", self.on_frame_configure_factor_oracle - ) - - self.factor_notebook_oracle = ttk.Notebook( - master=self.factor_frame_oracle - ) - self.factor_notebook_oracle.pack(fill="both") - - self.factor_tab_one_oracle = tk.Frame( - master=self.factor_notebook_oracle - ) - - self.factor_notebook_oracle.add( - self.factor_tab_one_oracle, text=str(self.oracle + " Factors") - ) - - self.factor_tab_one_oracle.grid_rowconfigure(0) - - self.factor_heading_list_oracle = ["Description", "Input"] - - for heading in self.factor_heading_list_oracle: - self.factor_tab_one_oracle.grid_columnconfigure( - self.factor_heading_list_oracle.index(heading) - ) - label_oracle = tk.Label( - master=self.factor_tab_one_oracle, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label_oracle.grid( - row=0, - column=self.factor_heading_list_oracle.index(heading), - padx=10, - pady=3, - ) - - count_factors_oracle = 1 - for factor_type in self.oracle_object().specifications: - self.dictionary_size_oracle = len( - self.oracle_object().specifications[factor_type] - ) - datatype = ( - self.oracle_object().specifications[factor_type].get("datatype") - ) - description = ( - self.oracle_object() - .specifications[factor_type] - .get("description") - ) - default = ( - self.oracle_object().specifications[factor_type].get("default") - ) - - if datatype is not bool: - # ("yes?") - self.int_float_description_oracle = tk.Label( - master=self.factor_tab_one_oracle, - text=str(description), - wraplength=150, - ) - - self.int_float_var_oracle = tk.StringVar( - self.factor_tab_one_oracle - ) - self.int_float_entry_oracle = ttk.Entry( - master=self.factor_tab_one_oracle, - textvariable=self.int_float_var_oracle, - justify=tk.LEFT, - width=15, - ) - - if args and len(args) == 2 and args[0]: - self.int_float_entry_oracle.insert( - index=tk.END, string=str(args[1][4][0][factor_type]) - ) - else: - self.int_float_entry_oracle.insert( - index=tk.END, string=str(default) - ) - - self.int_float_description_oracle.grid( - row=count_factors_oracle, column=0, sticky="nsew" - ) - self.int_float_entry_oracle.grid( - row=count_factors_oracle, column=1, sticky="nsew" - ) - - self.oracle_factors_list.append(self.int_float_var_oracle) - if not datatype is not tuple: - self.oracle_factors_types.append(datatype) - else: - self.oracle_factors_types.append(str) - - count_factors_oracle += 1 - - if datatype is bool: - self.boolean_description_oracle = tk.Label( - master=self.factor_tab_one_oracle, - text=str(description), - wraplength=150, - ) - self.boolean_var_oracle = tk.BooleanVar( - self.factor_tab_one_oracle, value=bool(default) - ) - self.boolean_menu_oracle = tk.Checkbutton( - self.factor_tab_one_oracle, - variable=self.boolean_var_oracle.get(), - onvalue=True, - offvalue=False, - ) - self.boolean_description_oracle.grid( - row=count_factors_oracle, column=0, sticky="nsew" - ) - self.boolean_menu_oracle.grid( - row=count_factors_oracle, column=1, sticky="nsew" - ) - self.oracle_factors_list.append(self.boolean_var_oracle) - self.oracle_factors_types.append(datatype) - - count_factors_oracle += 1 - - self.factor_label_frame_oracle.place( - relx=0.7, rely=0.15, relheight=0.33, relwidth=0.3 - ) - if str(self.solver_var.get()) != "Solver": - self.add_button.place(x=10, rely=0.48, width=200, height=30) - - # Creates a function that checks the compatibility of the solver picked with the list of problems and adds - # the compatible problems to a new list - def update_problem_list_compatability(self) -> None: - """Update the problem list compatibility.""" - if self.solver_var.get() != "Solver": - self.problem_menu.destroy() - temp_problem_list = [] - - for problem in problem_unabbreviated_directory: - temp_problem = problem_unabbreviated_directory[ - problem - ] # problem object - temp_problem_name = temp_problem().name - - temp_solver = solver_unabbreviated_directory[ - self.solver_var.get() - ] - temp_solver_name = temp_solver().name - - temp_experiment = ProblemSolver( - solver_name=temp_solver_name, problem_name=temp_problem_name - ) - comp = temp_experiment.check_compatibility() - - if comp == "": - temp_problem_list.append(problem) - - # from experiments.inputs.all_factors.py: - self.problem_list = temp_problem_list - # stays the same, has to change into a special type of variable via tkinter function - self.problem_var = tk.StringVar(master=self) - # sets the default OptionMenu value - - # creates drop down menu, for tkinter, it is called "OptionMenu" - self.problem_menu = ttk.OptionMenu( - self, - self.problem_var, - "Problem", - *self.problem_list, - command=self.show_problem_factors, - ) - self.problem_menu.place(relx=0.4, rely=0.1) - - def clear_row_function(self, row_index: int) -> None: - """Clear the row. - - Parameters - ---------- - row_index : int - Row to clear - - """ - for widget in self.widget_list[row_index - 1]: - widget.grid_remove() - - self.experiment_master_list.pop(row_index - 1) - self.experiment_object_list.pop(row_index - 1) - self.widget_list.pop(row_index - 1) - - self.check_box_list[row_index - 1].grid_remove() - - self.check_box_list.pop(row_index - 1) - self.check_box_list_var.pop(row_index - 1) - - # if (integer - 1) in self.normalize_list: - # self.normalize_list.remove(integer - 1) - # for i in range(len(self.normalize_list)): - # if i < self.normalize_list[i]: - # self.normalize_list[i] = self.normalize_list[i] - 1 - - for row_of_widgets in self.widget_list: - row_index = self.widget_list.index(row_of_widgets) - row_of_widgets[7]["text"] = str(row_index + 1) - - run_button_added = row_of_widgets[3] - text_on_run = run_button_added["text"] - split_text = text_on_run.split(" ") - split_text[len(split_text) - 1] = str(row_index + 1) - # new_text = " ".join(split_text) - # run_button_added["text"] = new_text - run_button_added["command"] = partial( - self.run_row_function, row_index + 1 - ) - - row_of_widgets[3] = run_button_added - - view_edit_button_added = row_of_widgets[4] - text_on_view_edit = view_edit_button_added["text"] - split_text = text_on_view_edit.split(" ") - split_text[len(split_text) - 1] = str(row_index + 1) - # new_text = " ".join(split_text) - # viewEdit_button_added["text"] = new_text - view_edit_button_added["command"] = partial( - self.view_edit_function, row_index + 1 - ) - - row_of_widgets[4] = view_edit_button_added - - clear_button_added = row_of_widgets[5] - text_on_clear = clear_button_added["text"] - split_text = text_on_clear.split(" ") - split_text[len(split_text) - 1] = str(row_index + 1) - # new_text = " ".join(split_text) - # clear_button_added["text"] = new_text - clear_button_added["command"] = partial( - self.clear_row_function, row_index + 1 - ) - - row_of_widgets[5] = clear_button_added - - postprocess_button_added = row_of_widgets[6] - postprocess_button_added["command"] = partial( - self.post_rep_function, row_index + 1 - ) - - row_of_widgets[6] = postprocess_button_added - - current_check_box = self.check_box_list[row_index] - current_check_box.grid( - row=(row_index + 1), column=0, sticky="nsew", padx=10, pady=3 - ) - # TODO: figure out why ihdex 7 maps to column 1 - row_of_widgets[7].grid( - row=(row_index + 1), column=1, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[0].grid( - row=(row_index + 1), column=2, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[1].grid( - row=(row_index + 1), column=3, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[2].grid( - row=(row_index + 1), column=4, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[3].grid( - row=(row_index + 1), column=5, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[4].grid( - row=(row_index + 1), column=6, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[5].grid( - row=(row_index + 1), column=7, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[6].grid( - row=(row_index + 1), column=8, sticky="nsew", padx=10, pady=3 - ) - - self.count_experiment_queue = len(self.widget_list) + 1 - - def clear_meta_function(self, row_index: int) -> None: - """Clear the meta function. - - Parameters - ---------- - row_index : int - The integer - - """ - for widget in self.widget_meta_list[row_index - 1]: - widget.grid_remove() - - self.meta_experiment_master_list.pop(row_index - 1) - - self.widget_meta_list.pop(row_index - 1) - - for row_of_widgets in self.widget_meta_list: - row_index = self.widget_meta_list.index(row_of_widgets) - - run_button_added = row_of_widgets[3] - text_on_run = run_button_added["text"] - split_text = text_on_run.split(" ") - split_text[len(split_text) - 1] = str(row_index + 1) - new_text = " ".join(split_text) - run_button_added["text"] = new_text - run_button_added["command"] = partial( - self.run_meta_function, row_index + 1 - ) - row_of_widgets[3] = run_button_added - - clear_button_added = row_of_widgets[4] - text_on_clear = clear_button_added["text"] - split_text = text_on_clear.split(" ") - split_text[len(split_text) - 1] = str(row_index + 1) - new_text = " ".join(split_text) - clear_button_added["text"] = new_text - clear_button_added["command"] = partial( - self.clear_meta_function, row_index + 1 - ) - row_of_widgets[4] = clear_button_added - - postprocess_button_added = row_of_widgets[5] - postprocess_button_added["command"] = partial( - self.post_rep_meta_function, row_index + 1 - ) - row_of_widgets[5] = postprocess_button_added - - plot_button_added = row_of_widgets[6] - plot_button_added["command"] = partial( - self.plot_meta_function, row_index + 1 - ) - row_of_widgets[6] = plot_button_added - - view_button_added = row_of_widgets[7] - view_button_added["command"] = partial( - self.view_meta_function, row_index + 1 - ) - row_of_widgets[7] = view_button_added - - row_of_widgets[0].grid( - row=(row_index + 1), column=0, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[1].grid( - row=(row_index + 1), column=1, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[2].grid( - row=(row_index + 1), column=2, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[3].grid( - row=(row_index + 1), column=3, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[4].grid( - row=(row_index + 1), column=4, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[5].grid( - row=(row_index + 1), column=5, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[6].grid( - row=(row_index + 1), column=6, sticky="nsew", padx=10, pady=3 - ) - row_of_widgets[7].grid( - row=(row_index + 1), column=6, sticky="nsew", padx=10, pady=3 - ) - - # self.count_meta_experiment_queue = len(self.widget_meta_list) + 1 - self.count_meta_experiment_queue = self.count_meta_experiment_queue - 1 - - # resets problem_var to default value - self.problem_var.set("Problem") - # resets solver_var to default value - self.solver_var.set("Solver") - - def view_edit_function(self, row_index: int) -> None: - """View the edit function. - - Parameters - ---------- - row_index : int - The integer - - """ - self.experiment_object_list[row_index - 1] - # (current_experiment) - current_experiment_arguments = self.experiment_master_list[ - row_index - 1 - ] - - self.problem_var.set(current_experiment_arguments[0]) - # self.problem_var.set(problem_solver_abbreviated_name_to_unabbreviated(current_experiment_arguments[0], problem_directory, problem_unabbreviated_directory)) - - self.solver_var.set(current_experiment_arguments[1]) - # self.solver_var.set(problem_solver_abbreviated_name_to_unabbreviated(current_experiment_arguments[1], solver_directory, solver_unabbreviated_directory))' - - self.macro_var.set(current_experiment_arguments[2]) - self.show_problem_factors(True, current_experiment_arguments) - # print(" self.show_problem_factors", self.show_problem_factors(True, current_experiment_arguments)) - # self.my_experiment[1][3][1] - self.show_solver_factors(True, current_experiment_arguments, False) - # print("self.show_solver_factors", self. show_solver_factors(True, current_experiment_arguments)) - view_edit_button_added = self.widget_list[row_index - 1][5] - view_edit_button_added["text"] = "Save Changes" - view_edit_button_added["command"] = partial( - self.save_edit_function, row_index - ) - view_edit_button_added.grid( - row=(row_index), column=5, sticky="nsew", padx=10, pady=3 - ) - - def clear_queue(self) -> None: - """Clear the queue.""" - # for row in self.widget_list: - # for widget in row: - # widget.grid_remove() - for row in range(len(self.widget_list), 0, -1): - self.clear_row_function(row) - - self.experiment_master_list.clear() - self.experiment_object_list.clear() - self.widget_list.clear() - - # TODO: change away from *args - def add_experiment(self, *args: tuple) -> None: - """Add an experiment. - - Parameters - ---------- - *args : tuple - Arguments D: - - """ - if len(args) == 1 and args[0] is int: - place = args[0] - 1 - else: - place = len(self.experiment_object_list) - - if ( - self.problem_var.get() in problem_unabbreviated_directory - and self.solver_var.get() in solver_unabbreviated_directory - and self.macro_entry.get().isnumeric() - ): - # creates blank list to store selections - self.selected = [] - # grabs problem_var (whatever is selected our of OptionMenu) - self.selected.append(self.problem_var.get()) - # grabs solver_var (" ") - self.selected.append(self.solver_var.get()) - # grabs macro_entry - self.selected.append(int(self.macro_entry.get())) - # grabs problem factors & problem rename - problem_factors = self.confirm_problem_factors() - self.selected.append(problem_factors) - # grabs oracle factors - oracle_factors = self.confirm_oracle_factors() - self.selected.append(oracle_factors) - # grabs solver factors & solver rename - solver_factors = self.confirm_solver_factors() - self.selected.append(solver_factors) - - self.macro_reps = self.selected[2] - self.solver_name = self.selected[1] - self.problem_name = self.selected[0] - - # macro_entry is a positive integer - if int(self.macro_entry.get()) != 0: - # resets current entry from index 0 to length of entry - self.macro_entry.delete(0, len(self.macro_entry.get())) - # resets macro_entry textbox - self.macro_entry.insert(index=tk.END, string="10") - - # complete experiment with given arguments - self.solver_dictionary_rename = self.selected[5] - self.solver_rename = self.solver_dictionary_rename[1] - self.solver_factors = self.solver_dictionary_rename[0] - - self.oracle_factors = self.selected[4] - self.oracle_factors = self.oracle_factors[0] - - self.problem_dictionary_rename = self.selected[3] - self.problem_rename = self.problem_dictionary_rename[1] - self.problem_factors = self.problem_dictionary_rename[0] - - self.macro_reps = self.selected[2] - self.solver_name = self.selected[1] - self.problem_name = self.selected[0] - - solver_object, self.solver_name = ( - problem_solver_unabbreviated_to_object( - self.solver_name, solver_unabbreviated_directory - ) - ) - problem_object, self.problem_name = ( - problem_solver_unabbreviated_to_object( - self.problem_name, problem_unabbreviated_directory - ) - ) - - # self.selected[0] = self.problem_name - - self.my_experiment = ProblemSolver( - solver_name=self.solver_name, - problem_name=self.problem_name, - solver_rename=self.solver_rename, - problem_rename=self.problem_rename, - solver_fixed_factors=self.solver_factors, - problem_fixed_factors=self.problem_factors, - model_fixed_factors=self.oracle_factors, - ) - # print("type", type(self.selected[2])) - self.my_experiment.n_macroreps = self.selected[2] - self.my_experiment.post_norm_ready = False - - compatibility_result = self.my_experiment.check_compatibility() - for exp in self.experiment_object_list: - if ( - exp.problem.name == self.my_experiment.problem.name - and exp.solver.name == self.my_experiment.solver.name - ): - if exp.problem != self.my_experiment.problem: - message = "Please Save the Problem for Unique Factors with a Unique Name" - tk.messagebox.showerror( - title="Error Window", message=message - ) - return False - - if compatibility_result == "": - self.experiment_object_list.insert( - place, self.my_experiment - ) - self.experiment_master_list.insert(place, self.selected) - # this option list doesnt autoupdate - not sure why but this will force it to update - self.experiment_master_list[place][5][0][ - "crn_across_solns" - ] = self.boolean_var.get() - - self.rows = 5 - - self.problem_added = tk.Label( - master=self.tab_one, - text=self.selected[3][1], - justify="center", - ) - self.problem_added.grid( - row=self.count_experiment_queue, - column=2, - sticky="nsew", - padx=10, - pady=3, - ) - - self.checkbox_select_var = tk.BooleanVar( - self.tab_one, value=False - ) - self.checkbox_select = tk.Checkbutton( - master=self.tab_one, - text="", - state="normal", - variable=self.checkbox_select_var, - ) - self.checkbox_select.deselect() - self.checkbox_select.grid( - row=self.count_experiment_queue, - column=0, - sticky="nsew", - padx=10, - pady=3, - ) - - self.exp_num = tk.Label( - master=self.tab_one, - text=str(self.count_experiment_queue), - justify="center", - ) - self.exp_num.grid( - row=self.count_experiment_queue, - column=1, - sticky="nsew", - padx=10, - pady=3, - ) - - self.solver_added = tk.Label( - master=self.tab_one, - text=self.selected[5][1], - justify="center", - ) - self.solver_added.grid( - row=self.count_experiment_queue, - column=3, - sticky="nsew", - padx=10, - pady=3, - ) - - self.macros_added = tk.Label( - master=self.tab_one, - text=self.selected[2], - justify="center", - ) - self.macros_added.grid( - row=self.count_experiment_queue, - column=4, - sticky="nsew", - padx=10, - pady=3, - ) - - self.run_button_added = ttk.Button( - master=self.tab_one, - text="Run", - command=partial( - self.run_row_function, self.count_experiment_queue - ), - ) - self.run_button_added.grid( - row=self.count_experiment_queue, - column=5, - sticky="nsew", - padx=10, - pady=3, - ) - - self.viewEdit_button_added = ttk.Button( - master=self.tab_one, - text="View / Edit", - command=partial( - self.view_edit_function, self.count_experiment_queue - ), - ) - self.viewEdit_button_added.grid( - row=self.count_experiment_queue, - column=6, - sticky="nsew", - padx=10, - pady=3, - ) - - self.clear_button_added = ttk.Button( - master=self.tab_one, - text="Remove", - command=partial( - self.clear_row_function, self.count_experiment_queue - ), - ) - self.clear_button_added.grid( - row=self.count_experiment_queue, - column=7, - sticky="nsew", - padx=10, - pady=3, - ) - - self.postprocess_button_added = ttk.Button( - master=self.tab_one, - text="Post-Process", - command=partial( - self.post_rep_function, self.count_experiment_queue - ), - state="disabled", - ) - self.postprocess_button_added.grid( - row=self.count_experiment_queue, - column=8, - sticky="nsew", - padx=10, - pady=3, - ) - - self.widget_row = [ - self.problem_added, - self.solver_added, - self.macros_added, - self.run_button_added, - self.viewEdit_button_added, - self.clear_button_added, - self.postprocess_button_added, - self.exp_num, - ] - self.check_box_list.append(self.checkbox_select) - self.check_box_list_var.append(self.checkbox_select_var) - - self.widget_list.insert(place, self.widget_row) - - # separator = ttk.Separator(master=self.tab_one, orient='horizontal') - - # separator.place(x=0.1, y=self.prev, relwidth=1) - # self.prev += 32 - - self.count_experiment_queue += 1 - - else: - tk.messagebox.showerror( - title="Error Window", message=compatibility_result - ) - self.selected.clear() - - else: - # reset macro_entry to "10" - self.macro_entry.delete(0, len(self.macro_entry.get())) - # resets macro_entry textbox - self.macro_entry.insert(index=tk.END, string="10") - - message = "Please enter a postivie (non zero) integer for the number of Macroreplications, example: 10" - tk.messagebox.showerror(title="Error Window", message=message) - - # s selected (list) in console/terminal - # ("it works", self.experiment_master_list) - self.notebook.select(self.tab_one) - return self.experiment_master_list - - # problem selected, but solver NOT selected - elif ( - self.problem_var.get() in problem_unabbreviated_directory - and self.solver_var.get() not in solver_unabbreviated_directory - ): - message = "You have not selected a Solver!" - tk.messagebox.showerror(title="Error Window", message=message) - - # problem NOT selected, but solver selected - elif ( - self.problem_var.get() not in problem_unabbreviated_directory - and self.solver_var.get() in solver_unabbreviated_directory - ): - message = "You have not selected a Problem!" - tk.messagebox.showerror(title="Error Window", message=message) - - # macro_entry not numeric or negative - elif not self.macro_entry.get().isnumeric(): - # reset macro_entry to "10" - self.macro_entry.delete(0, len(self.macro_entry.get())) - # resets macro_entry textbox - self.macro_entry.insert(index=tk.END, string="10") - - message = "Please enter a positive (non zero) integer for the number of Macroreplications, example: 10" - tk.messagebox.showerror(title="Error Window", message=message) - - # neither problem nor solver selected - else: - # reset problem_var - self.problem_var.set("Problem") - # reset solver_var - self.solver_var.set("Solver") - - # reset macro_entry to "10" - self.macro_entry.delete(0, len(self.macro_entry.get())) - # resets macro_entry textbox - self.macro_entry.insert(index=tk.END, string="10") - - message = "You have not selected all required fields, check for '*' near input boxes." - tk.messagebox.showerror(title="Error Window", message=message) - - def confirm_problem_factors(self) -> list: - """Confirm the problem factors. - - Returns - ------- - list - The problem factors - - """ - self.problem_factors_return = [] - self.problem_factors_dictionary = dict() - - keys = list(self.problem_object().specifications.keys()) - # ("keys ->", keys) - # ("self.problem_factors_types -> ", self.problem_factors_types) - - for problem_factor in self.problem_factors_list: - # (problem_factor.get() + " " + str(type(problem_factor.get()))) - index = self.problem_factors_list.index(problem_factor) - - # (problem_factor.get()) - if index == 0: - if problem_factor.get() == self.problem_var.get(): - # self.problem_object().specifications[factor_type].get("default") - # self.problem_factors_return.append(None) - self.problem_factors_return.append(problem_factor.get()) - else: - self.problem_factors_return.append(problem_factor.get()) - # self.problem_factors_dictionary["rename"] = problem_factor.get() - - if index > 0: - # (self.problem_factors_types[index]) - # datatype = self.problem_factors_types[index] - - # if the data type is tuple update data - # self.problem_factors_dictionary[keys[index]] = datatype(nextVal) - # (ast.literal_eval(problem_factor.get()) , keys[index]) - if keys[index - 1] == "initial_solution" and isinstance( - type(ast.literal_eval(problem_factor.get())), int - ): - t = (ast.literal_eval(problem_factor.get()),) - # (t) - self.problem_factors_dictionary[keys[index - 1]] = t - else: - self.problem_factors_dictionary[keys[index - 1]] = ( - ast.literal_eval(problem_factor.get()) - ) - # ("datatype of factor -> ", type(datatype(problem_factor.get()))) - - self.problem_factors_return.insert(0, self.problem_factors_dictionary) - return self.problem_factors_return - - def confirm_oracle_factors(self) -> list: - """Confirm the oracle factors. - - Returns - ------- - list - The oracle factors - - """ - self.oracle_factors_return = [] - self.oracle_factors_dictionary = dict() - - keys = list(self.oracle_object().specifications.keys()) - # ("keys ->", keys) - # ("self.oracle_factors_types -> ", self.oracle_factors_types) - - keys = list(self.oracle_object().specifications.keys()) - - for oracle_factor in self.oracle_factors_list: - index = self.oracle_factors_list.index(oracle_factor) - self.oracle_factors_dictionary[keys[index]] = oracle_factor.get() - # (self.oracle_factors_types[index]) - - datatype = self.oracle_factors_types[index] - if str(datatype) == "": - new_list = ast.literal_eval(oracle_factor.get()) - - self.oracle_factors_dictionary[keys[index]] = new_list - else: - self.oracle_factors_dictionary[keys[index]] = datatype( - oracle_factor.get() - ) - # (str(datatype(oracle_factor.get())) + " " + str(datatype)) - # ("datatype of factor -> ", type(datatype(oracle_factor.get()))) - - self.oracle_factors_return.append(self.oracle_factors_dictionary) - return self.oracle_factors_return - - def confirm_solver_factors(self) -> list: - """Confirm the solver factors. - - Returns - ------- - list - The solver factors - - """ - self.solver_factors_return = [] - self.solver_factors_dictionary = dict() - - keys = list(self.solver_object().specifications.keys()) - # ("keys ->", keys) - # ("self.solver_factors_types -> ", self.solver_factors_types) - - for solver_factor in self.solver_factors_list: - index = self.solver_factors_list.index(solver_factor) - # (solver_factor.get()) - if index == 0: - if solver_factor.get() == self.solver_var.get(): - # self.solver_factors_return.append(None) - self.solver_factors_return.append(solver_factor.get()) - else: - self.solver_factors_return.append(solver_factor.get()) - # self.solver_factors_dictionary["rename"] = solver_factor.get() - if index > 0: - # (self.solver_factors_types[index]) - datatype = self.solver_factors_types[index] - self.solver_factors_dictionary[keys[index - 1]] = datatype( - solver_factor.get() - ) - # ("datatype of factor -> ", type(datatype(solver_factor.get()))) - - self.solver_factors_return.insert(0, self.solver_factors_dictionary) - return self.solver_factors_return - - def on_frame_configure_queue(self, event: tk.Event) -> None: - """Configure the queue. - - Parameters - ---------- - event : tk.Event - Event triggering the function - - """ - self.queue_canvas.configure(scrollregion=self.queue_canvas.bbox("all")) - - def on_frame_configure_factor_problem(self, event: tk.Event) -> None: - """Configure the problem factors. - - Parameters - ---------- - event : tk.Event - Event triggering the function - - """ - self.factor_canvas_problem.configure( - scrollregion=self.factor_canvas_problem.bbox("all") - ) - - def on_frame_configure_factor_solver(self, event: tk.Event) -> None: - """Configure the solver factors. - - Parameters - ---------- - event : tk.Event - Event triggering the function - - """ - self.factor_canvas_solver.configure( - scrollregion=self.factor_canvas_solver.bbox("all") - ) - - def on_frame_configure_factor_oracle(self, event: tk.Event) -> None: - """Configure the oracle factors. - - Parameters - ---------- - event : tk.Event - Event triggering the function - - """ - self.factor_canvas_oracle.configure( - scrollregion=self.factor_canvas_oracle.bbox("all") - ) - - def save_edit_function(self, row_index: int) -> None: - """Save the edit function. - - Parameters - ---------- - row_index : int - Index of the row - - """ - self.experiment_master_list[row_index - 1] - self.experiment_master_list[row_index - 1][5][0]["crn_across_solns"] = ( - self.boolean_var.get() - ) - - if self.add_experiment(row_index): - self.clear_row_function(row_index + 1) - - # resets problem_var to default value - self.problem_var.set("Problem") - # resets solver_var to default value - self.solver_var.set("Solver") - - self.factor_label_frame_problem.destroy() - self.factor_label_frame_oracle.destroy() - self.factor_label_frame_solver.destroy() - - def select_pickle_file_fuction(self, *args: tuple) -> None: - """Load a pickle file. - - Parameters - ---------- - *args : tuple - Arguments - - """ - filename = filedialog.askopenfilename( - parent=self, - initialdir=EXPERIMENT_DIR, - title="Select Pickle File", - # filetypes = (("Pickle files", "*.pickle;*.pck;*.pcl;*.pkl;*.db") - # ,("Python files", "*.py"),("All files", "*.*") ) - ) - if filename != "": - # filename_short_list = filename.split("/") - # filename_short = filename_short_list[len(filename_short_list)-1] - self.pickle_file_pathname_show["text"] = filename - self.pickle_file_pathname_show["foreground"] = "blue" - # self.pickle_file_pathname_show.place(x=950, y=400) - # else: - # message = "You attempted to select a file but failed, please try again if necessary" - # tk.messagebox.showwarning(master=self, title=" Warning", message=message) - - def load_pickle_file_function(self) -> None: - """Load data from a pickle file.""" - self.select_pickle_file_fuction() - - filename = self.pickle_file_pathname_show["text"] - acceptable_types = ["pickle", "pck", "pcl", "pkl", "db"] - - if filename != "No file selected": - filetype = filename.split(".") - filetype = filetype[len(filetype) - 1] - if filetype in acceptable_types: - experiment_pathname = filename[filename.index(EXPERIMENT_DIR) :] - - pickle_file = experiment_pathname - infile = open(pickle_file, "rb") - new_dict = pickle.load(infile) - infile.close() - - self.my_experiment = new_dict - compatibility_result = self.my_experiment.check_compatibility() - place = len(self.experiment_object_list) - self.my_experiment.post_norm_ready = True - - if compatibility_result == "": - self.experiment_object_list.insert( - place, self.my_experiment - ) - - # filler in master list so that placement stays correct - self.experiment_master_list.insert(place, None) - - self.rows = 5 - - self.checkbox_select_var = tk.BooleanVar( - self.tab_one, value=False - ) - self.checkbox_select = tk.Checkbutton( - master=self.tab_one, - text="", - state="normal", - variable=self.checkbox_select_var, - ) - self.checkbox_select.deselect() - self.checkbox_select.grid( - row=self.count_experiment_queue, - column=0, - sticky="nsew", - padx=10, - pady=3, - ) - - self.exp_num = tk.Label( - master=self.tab_one, - text=str(self.count_experiment_queue), - justify="center", - ) - self.exp_num.grid( - row=self.count_experiment_queue, - column=1, - sticky="nsew", - padx=10, - pady=3, - ) - - self.problem_added = tk.Label( - master=self.tab_one, - text=self.my_experiment.problem.name, - justify="center", - ) - self.problem_added.grid( - row=self.count_experiment_queue, - column=2, - sticky="nsew", - padx=10, - pady=3, - ) - - self.solver_added = tk.Label( - master=self.tab_one, - text=self.my_experiment.solver.name, - justify="center", - ) - self.solver_added.grid( - row=self.count_experiment_queue, - column=3, - sticky="nsew", - padx=10, - pady=3, - ) - - self.macros_added = tk.Label( - master=self.tab_one, - text=self.my_experiment.n_macroreps, - justify="center", - ) - self.macros_added.grid( - row=self.count_experiment_queue, - column=4, - sticky="nsew", - padx=10, - pady=3, - ) - - self.run_button_added = ttk.Button( - master=self.tab_one, - text="Run", - command=partial( - self.run_row_function, self.count_experiment_queue - ), - ) - self.run_button_added.grid( - row=self.count_experiment_queue, - column=5, - sticky="nsew", - padx=10, - pady=3, - ) - - self.viewEdit_button_added = ttk.Button( - master=self.tab_one, - text="View / Edit", - command=partial( - self.view_edit_function, self.count_experiment_queue - ), - ) - self.viewEdit_button_added.grid( - row=self.count_experiment_queue, - column=6, - sticky="nsew", - padx=10, - pady=3, - ) - - self.clear_button_added = ttk.Button( - master=self.tab_one, - text="Remove ", - command=partial( - self.clear_row_function, self.count_experiment_queue - ), - ) - self.clear_button_added.grid( - row=self.count_experiment_queue, - column=7, - sticky="nsew", - padx=10, - pady=3, - ) - - self.postprocess_button_added = ttk.Button( - master=self.tab_one, - text="Post-Process", - command=partial( - self.post_rep_function, self.count_experiment_queue - ), - state="disabled", - ) - self.postprocess_button_added.grid( - row=self.count_experiment_queue, - column=8, - sticky="nsew", - padx=10, - pady=3, - ) - - self.widget_row = [ - self.problem_added, - self.solver_added, - self.macros_added, - self.run_button_added, - self.viewEdit_button_added, - self.clear_button_added, - self.postprocess_button_added, - self.exp_num, - ] - self.widget_list.insert(place, self.widget_row) - self.check_box_list.append(self.checkbox_select) - self.check_box_list_var.append(self.checkbox_select_var) - - row_of_widgets = self.widget_list[len(self.widget_list) - 1] - if self.my_experiment.has_run: - run_button = row_of_widgets[3] - run_button["state"] = "disabled" - run_button["text"] = "Run Complete" - run_button = row_of_widgets[4] - run_button["state"] = "disabled" - run_button = row_of_widgets[6] - run_button["state"] = "normal" - self.my_experiment.post_norm_ready = False - if self.my_experiment.check_postreplicate(): - self.experiment_object_list[ - place - ].post_norm_ready = True - self.widget_list[place][6]["text"] = ( - "Post-Processing Complete" - ) - self.widget_list[place][6]["state"] = "disabled" - - # separator = ttk.Separator(master=self.tab_one, orient='horizontal') - - # separator.place(x=0.1, y=self.prev, relwidth=1) - # self.prev += 32 - - self.count_experiment_queue += 1 - if self.notebook.index("current") == 2: - self.post_norm_setup() - - else: - message = f"You have loaded a file, but {filetype} files are not acceptable!\nPlease try again." - tk.messagebox.showwarning( - master=self, title=" Warning", message=message - ) - # else: - # message = "You are attempting to load a file, but haven't selected one yet.\nPlease select a file first." - # tk.messagebox.showwarning(master=self, title=" Warning", message=message) - - def run_row_function(self, row_to_run: int) -> None: - """Run the specified row. - - Parameters - ---------- - row_to_run : int - The row to run - - """ - # stringtuple[1:-1].split(separator=",") - row_index = row_to_run - 1 - - # run_button = row_of_widgets[3] - self.widget_list[row_index][3]["state"] = "disabled" - self.widget_list[row_index][3]["text"] = "Run Complete" - self.widget_list[row_index][4]["state"] = "disabled" - self.widget_list[row_index][6]["state"] = "normal" - # run_button["state"] = "disabled" - # run_button = row_of_widgets[4] - # run_button["state"] = "disabled" - # row_of_widgets[6]["state"] = "normal" - # run_button.grid(row=integer, column=3, sticky='nsew', padx=10, pady=3) - - # widget_row = [row_of_widgets[0], row_of_widgets[1], row_of_widgets[2], row_of_widgets[3], run_button, row_of_widgets[4], row_of_widgets[5], row_of_widgets[6],row_of_widgets[7] ] - # self.widget_list[row_index] = widget_row - - self.my_experiment = self.experiment_object_list[row_index] - - self.selected = self.experiment_master_list[row_index] - self.macro_reps = self.selected[2] - self.my_experiment.run(n_macroreps=self.macro_reps) - - def post_rep_function(self, selected_row: int) -> None: - """Post replicate function. - - Parameters - ---------- - selected_row : int - The selected row - - """ - row_index = selected_row - 1 - self.my_experiment = self.experiment_object_list[row_index] - self.selected = self.experiment_object_list[row_index] - self.post_rep_function_row_index = selected_row - # calls postprocessing window - - self.postrep_window = Toplevel(self) - self.center_window(0.8) - self.set_style() - - self.postrep_window.title("Post-Processing Page") - self.app = PostProcessingWindow( - self.postrep_window, self.my_experiment, self.selected, self - ) - - def post_process_disable_button(self, meta: bool = False) -> None: - """Disable the post process button in the GUI. - - Parameters - ---------- - meta : bool, optional - The boolean, by default False - - """ - if meta: - row_index = self.post_rep_function_row_index - 1 - self.widget_meta_list[row_index][5]["text"] = ( - "Post-Processed & Post-Normalized" - ) - self.widget_meta_list[row_index][5]["state"] = "disabled" - self.widget_meta_list[row_index][6]["state"] = "normal" - # self.normalize_button_added["state"] = "normal" - else: - row_index = self.post_rep_function_row_index - 1 - self.experiment_object_list[row_index].post_norm_ready = True - self.widget_list[row_index][6]["text"] = "Post-Processing Complete" - self.widget_list[row_index][6]["state"] = "disabled" - # self.widget_list[row_index][7]["state"] = "normal" - - def checkbox_function2(self, exp: ProblemSolver, row_num: int) -> None: - newlist = sorted( - self.experiment_object_list, key=lambda x: x.problem.name - ) - prob_name = newlist[row_num].problem.name - if row_num in self.normalize_list2: - self.normalize_list2.remove(row_num) - self.post_norm_exp_list.remove(exp) - - if len(self.normalize_list2) == 0: - for i in self.widget_norm_list: - i[2]["state"] = "normal" - else: - self.normalize_list2.append(row_num) - self.post_norm_exp_list.append(exp) - for i in self.widget_norm_list: - if i[0]["text"] != prob_name: - i[2]["state"] = "disable" - - def crossdesign_function(self) -> None: - # self.crossdesign_window = tk.Tk() - self.crossdesign_window = Toplevel(self) - self.center_window(0.8) - self.set_style() - self.crossdesign_window.title("Cross-Design Problem-Solver Group") - self.cross_app = CrossDesignWindow(self.crossdesign_window, self) - - # My code starts here - # Open data farming window - def datafarming_function(self) -> None: - self.datafarming_window = Toplevel(self) - self.center_window(0.8) - self.set_style() - self.datafarming_window.title("Data Farming") - self.datafarming_app = DataFarmingWindow(self.datafarming_window, self) - - # My code ends here - - def add_meta_exp_to_frame( - self, - n_macroreps: int | None = None, - input_meta_experiment: ProblemsSolvers | None = None, - ) -> None: - if n_macroreps is None and input_meta_experiment is not None: - self.cross_app = CrossDesignWindow( - root=None, main_widow=None, forced_creation=True - ) - self.cross_app.crossdesign_MetaExperiment = input_meta_experiment - self.meta_experiment_macro_reps.append("mixed") - text_macros_added = "mixed" - elif n_macroreps is not None and input_meta_experiment is None: - self.meta_experiment_macro_reps.append(int(n_macroreps.get())) - text_macros_added = n_macroreps.get() - - row_num = self.count_meta_experiment_queue + 1 - - self.macros_added = tk.Label( - master=self.tab_two, - text=text_macros_added, - justify="center", - ) - self.macros_added.grid( - row=row_num, column=2, sticky="nsew", padx=10, pady=3 - ) - - self.problem_added = tk.Label( - master=self.tab_two, - text=self.cross_app.crossdesign_MetaExperiment.problem_names, - justify="center", - ) - self.problem_added.grid( - row=row_num, column=0, sticky="nsew", padx=10, pady=3 - ) - - self.solver_added = tk.Label( - master=self.tab_two, - text=self.cross_app.crossdesign_MetaExperiment.solver_names, - justify="center", - ) - self.solver_added.grid( - row=row_num, column=1, sticky="nsew", padx=10, pady=3 - ) - - self.run_button_added = ttk.Button( - master=self.tab_two, - text="Run", - command=partial(self.run_meta_function, row_num), - ) - self.run_button_added.grid( - row=row_num, column=3, sticky="nsew", padx=10, pady=3 - ) - - self.clear_button_added = ttk.Button( - master=self.tab_two, - text="Remove", - command=partial(self.clear_meta_function, row_num), - ) - self.clear_button_added.grid( - row=row_num, column=4, sticky="nsew", padx=10, pady=3 - ) - - self.postprocess_button_added = ttk.Button( - master=self.tab_two, - text="Post-Process and Post-Normalize", - command=partial(self.post_rep_meta_function, row_num), - state="disabled", - ) - self.postprocess_button_added.grid( - row=row_num, column=5, sticky="nsew", padx=10, pady=3 - ) - - self.plot_button_added = ttk.Button( - master=self.tab_two, - text="Plot", - command=partial(self.plot_meta_function, row_num), - state="disabled", - ) - self.plot_button_added.grid( - row=row_num, column=6, sticky="nsew", padx=10, pady=3 - ) - - self.view_button_added = ttk.Button( - master=self.tab_two, - text="View Problem-Solver Group", - command=partial(self.view_meta_function, row_num), - ) - self.view_button_added.grid( - row=row_num, column=7, sticky="nsew", padx=10, pady=3 - ) - - # self.select_checkbox = tk.Checkbutton(self.tab_one,text="",state="disabled",command=partial(self.checkbox_function, self.count_experiment_queue - 1)) - # self.select_checkbox.grid(row=self.count_experiment_queue, column=7, sticky='nsew', padx=10, pady=3) - - self.widget_row_meta = [ - self.problem_added, - self.solver_added, - self.macros_added, - self.run_button_added, - self.clear_button_added, - self.postprocess_button_added, - self.plot_button_added, - self.view_button_added, - ] - self.widget_meta_list.insert(row_num - 1, self.widget_row_meta) - self.meta_experiment_master_list.insert( - row_num - 1, self.cross_app.crossdesign_MetaExperiment - ) - # self.select_checkbox.deselect() - - self.count_meta_experiment_queue += 1 - self.notebook.select(self.tab_two) - - def plot_meta_function(self, integer: int) -> None: - row_index = integer - 1 - self.my_experiment = self.meta_experiment_master_list[row_index] - # (self.my_experiment.experiments) - exps = [] - for ex in self.my_experiment.experiments: - for e in ex: - exps.append(e) - - self.postrep_window = Toplevel(self) - self.center_window(0.8) - self.set_style() - self.postrep_window.title("Plotting Page") - PlotWindow( - self.postrep_window, - self, - experiment_list=exps, - meta_list=self.my_experiment, - ) - - def run_meta_function(self, integer: int) -> None: - row_index = integer - 1 - self.widget_meta_list[row_index][5]["state"] = "normal" - self.widget_meta_list[row_index][3]["state"] = "disabled" - - self.my_experiment = self.meta_experiment_master_list[row_index] - # self.macro_reps = self.selected[2] - self.macro_reps = self.meta_experiment_macro_reps[row_index] - - # (self.my_experiment.n_solvers) - # (self.my_experiment.n_problems) - # (self.macro_reps) - - if self.macro_reps == "mixed": - ask_for_macro_rep = simpledialog.askinteger( - "Macroreplication", - "To make a Problem-Solver Group a common macroreplication is needed:", - ) - self.my_experiment.run(n_macroreps=ask_for_macro_rep) - else: - self.my_experiment.run(n_macroreps=int(self.macro_reps)) - - def post_rep_meta_function(self, integer: int) -> None: - row_index = integer - 1 - self.selected = self.meta_experiment_master_list[row_index] - # (self.selected) - self.post_rep_function_row_index = integer - # calls postprocessing window - self.postrep_window = Toplevel(self) - self.center_window(0.8) - self.set_style() - self.postrep_window.title("Post-Processing and Post-Normalization Page") - self.app = PostProcessingWindow( - self.postrep_window, self.selected, self.selected, self, True - ) - - def progress_bar_test(self) -> None: - root = tk.Tk() - progress = ttk.Progressbar( - root, orient="horizontal", length=100, mode="determinate" - ) - progress["value"] = 20 - root.update_idletasks() - time.sleep(1) - - progress["value"] = 40 - root.update_idletasks() - time.sleep(1) - - progress["value"] = 50 - root.update_idletasks() - time.sleep(1) - - progress["value"] = 60 - root.update_idletasks() - time.sleep(1) - - progress["value"] = 80 - root.update_idletasks() - time.sleep(1) - progress["value"] = 100 - - progress.pack(pady=10) - - def post_norm_setup(self) -> None: - newlist = sorted( - self.experiment_object_list, key=lambda x: x.problem.name - ) - for widget in self.tab_three.winfo_children(): - widget.destroy() - - self.heading_list = [ - "Problem", - "Solvers", - "Selected", - "", - "", - "", - "", - "", - ] - for heading in self.heading_list: - self.tab_three.grid_columnconfigure( - self.heading_list.index(heading) - ) - label = tk.Label( - master=self.tab_three, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label.grid( - row=0, column=self.heading_list.index(heading), padx=10, pady=3 - ) - - self.widget_norm_list = [] - self.normalize_list2 = [] - self.post_norm_exp_list = [] - - for i, exp in enumerate(newlist): - if exp.post_norm_ready: - row_num = i + 1 - self.problem_added = tk.Label( - master=self.tab_three, - text=exp.problem.name, - justify="center", - ) - self.problem_added.grid( - row=row_num, column=0, sticky="nsew", padx=10, pady=3 - ) - - self.solver_added = tk.Label( - master=self.tab_three, - text=exp.solver.name, - justify="center", - ) - self.solver_added.grid( - row=row_num, column=1, sticky="nsew", padx=10, pady=3 - ) - - self.select_checkbox = tk.Checkbutton( - self.tab_three, - text="", - command=partial(self.checkbox_function2, exp, row_num - 1), - ) - self.select_checkbox.grid( - row=row_num, column=2, sticky="nsew", padx=10, pady=3 - ) - self.select_checkbox.deselect() - - self.widget_norm_list.append( - [ - self.problem_added, - self.solver_added, - self.select_checkbox, - ] - ) - - def post_normal_all_function(self) -> None: - self.postrep_window = Toplevel(self) - self.center_window(0.8) - self.set_style() - self.postrep_window.title("Post-Normalization Page") - self.app = PostNormalWindow( - self.postrep_window, self.post_norm_exp_list, self - ) - # post_normalize(self.post_norm_exp_list, n_postreps_init_opt, crn_across_init_opt=True, proxy_init_val=None, proxy_opt_val=None, proxy_opt_x=None) - - def post_norm_return_func(self) -> None: - # ('IN post_process_disable_button ', self.post_rep_function_row_index) - # print("youve returned") - pass - - def make_meta_experiment_func(self) -> None: - self.list_checked_experiments = [] - self.list_unique_solver = [] - self.list_unique_problems = [] - self.list_missing_experiments = [] - - message2 = "There are experiments missing, would you like to add them?" - response = tk.messagebox.askyesno( - title="Make ProblemsSolvers Experiemnts", message=message2 - ) - - if response: - for index, checkbox in enumerate(self.check_box_list_var): - if checkbox.get(): - index = self.check_box_list_var.index(checkbox) - experiment_checked = self.experiment_object_list[ - index - ] ## Is this right? - self.list_checked_experiments.append(experiment_checked) - # print("checkbox",checkbox.get()) - # print("experiment_checked:", experiment_checked ) - # Making the checkbox in the Queue of Porblem-Solver Groups disabled - check_box_object = self.check_box_list[index] - check_box_object["state"] = "disabled" - ( - self.list_unique_solver, - self.list_unique_problems, - self.list_missing_experiments, - ) = find_missing_experiments(self.list_checked_experiments) - self.meta_experiment_created = make_full_metaexperiment( - self.list_checked_experiments, - self.list_unique_solver, - self.list_unique_problems, - self.list_missing_experiments, - ) - - self.add_meta_exp_to_frame( - n_macroreps=None, - input_meta_experiment=self.meta_experiment_created, - ) - self.meta_experiment_problem_solver_list( - self.meta_experiment_created - ) - self.meta_experiment_master_list.append( - self.meta_experiment_created - ) - - def meta_experiment_problem_solver_list( - self, meta_experiment: ProblemsSolvers - ) -> None: - self.list_meta_experiment_problems = [] - self.list_meta_experiment_solvers = [] - - self.list_meta_experiment_problems = meta_experiment.problem_names - # print("self.list_meta_experiment_problems", self.list_meta_experiment_problems) - self.list_meta_experiment_solvers = meta_experiment.solver_names - # print("self.list_meta_experiment_solvers", self.list_meta_experiment_solvers) - - def view_meta_function(self, row_num: int) -> None: - self.factor_label_frame_solvers.destroy() - self.factor_label_frame_oracle.destroy() - self.factor_label_frame_problems.destroy() - - row_index = row_num - 1 - self.problem_menu.destroy() - self.problem_label.destroy() - self.solver_menu.destroy() - self.solver_label.destroy() - - self.problem_label2 = tk.Label( - master=self, - text="Group Problem(s):*", - ) - self.problem_var2 = tk.StringVar(master=self) - - self.problem_menu2 = ttk.OptionMenu( - self, - self.problem_var2, - "Problem", - *self.list_meta_experiment_problems, - command=partial(self.show_problem_factors2, row_index), - ) - - self.problem_label2.place(relx=0.35, rely=0.1) - self.problem_menu2.place(relx=0.45, rely=0.1) - self.solver_label2 = tk.Label( - master=self, - text="Group Solver(s):*", - ) - self.solver_var2 = tk.StringVar(master=self) - self.solver_menu2 = ttk.OptionMenu( - self, - self.solver_var2, - "Solver", - *self.list_meta_experiment_solvers, - command=partial(self.show_solver_factors2, row_index), - ) - - self.solver_label2.place(relx=0.01, rely=0.1) - self.solver_menu2.place(relx=0.1, rely=0.1) - - view_button_added = self.widget_meta_list[row_index][7] - view_button_added["text"] = "Exit View Problem-Solver Group" - view_button_added["command"] = partial(self.exit_meta_view, row_num) - view_button_added.grid( - row=(row_num), column=7, sticky="nsew", padx=10, pady=3 - ) - - self.add_button["state"] = "disabled" - - for i in range(self.count_meta_experiment_queue): - self.clear_button_added = self.widget_meta_list[i][4] - self.clear_button_added["state"] = "disabled" - - self.run_button = self.widget_meta_list[i][3] - self.run_button["state"] = "disabled" - - if i != (row_index): - view_button_added = self.widget_meta_list[i][7] - view_button_added["state"] = "disabled" - - for i in range(self.count_experiment_queue - 1): - # print("VALUE OF I",i) - self.run_button_added = self.widget_list[i][3] - self.run_button_added["state"] = "disabled" - - self.viewEdit_button_added = self.widget_list[i][4] - self.viewEdit_button_added["state"] = "disabled" - - self.clear_button_added = self.widget_list[i][5] - self.clear_button_added["state"] = "disabled" - - self.pickle_file_load_button["state"] = "disabled" - self.crossdesign_button["state"] = "disabled" - self.macro_entry["state"] = "disabled" - - def exit_meta_view(self, row_num: int) -> None: - row_index = row_num - 1 - self.add_button["state"] = "normal" - self.problem_menu2.destroy() - self.problem_label2.destroy() - self.solver_menu2.destroy() - self.solver_label2.destroy() - self.factor_label_frame_solver.destroy() - self.factor_label_frame_oracle.destroy() - self.factor_label_frame_problem.destroy() - self.problem_label = tk.Label( - master=self, # window label is used in - text="Select Problem:", - ) - self.problem_var = tk.StringVar(master=self) - self.problem_menu = ttk.OptionMenu( - self, - self.problem_var, - "Problem", - *self.problem_list, - command=self.show_problem_factors, - ) - - self.problem_label.place(relx=0.3, rely=0.1) - self.problem_menu.place(relx=0.4, rely=0.1) - self.solver_label = tk.Label( - master=self, # window label is used in - text="Select Solver(s):*", - ) - self.solver_var = tk.StringVar(master=self) - self.solver_menu = ttk.OptionMenu( - self, - self.solver_var, - "Solver", - *self.solver_list, - command=self.show_solver_factors, - ) - - self.solver_label.place(relx=0.01, rely=0.1) - self.solver_menu.place(relx=0.1, rely=0.1) - - view_button_added = self.widget_meta_list[row_index][7] - view_button_added["text"] = "View Problem-Solver Group" - view_button_added["command"] = partial(self.view_meta_function, row_num) - view_button_added.grid( - row=(row_num), column=7, sticky="nsew", padx=10, pady=3 - ) - - for i in range(self.count_meta_experiment_queue): - self.clear_button_added = self.widget_meta_list[i][4] - self.clear_button_added["state"] = "normal" - - self.run_button = self.widget_meta_list[i][3] - self.run_button["state"] = "normal" - - if i != (row_index): - view_button_added = self.widget_meta_list[i][7] - view_button_added["state"] = "normal" - - for i in range(self.count_experiment_queue - 1): - self.run_button_added = self.widget_list[i][3] - self.run_button_added["state"] = "normal" - - self.viewEdit_button_added = self.widget_list[i][4] - self.viewEdit_button_added["state"] = "normal" - - self.clear_button_added = self.widget_list[i][5] - self.clear_button_added["state"] = "normal" - - self.pickle_file_load_button["state"] = "normal" - self.crossdesign_button["state"] = "normal" - self.macro_entry["state"] = "normal" - - def show_solver_factors2(self, row_index: int, *args: tuple) -> None: - self.factor_label_frame_solver.destroy() - - self.solver_factors_list = [] - self.solver_factors_types = [] - - self.factor_label_frame_solver = ttk.LabelFrame( - master=self, text="Solver Factors" - ) - - self.factor_canvas_solver = tk.Canvas( - master=self.factor_label_frame_solver, borderwidth=0 - ) - - self.factor_frame_solver = ttk.Frame(master=self.factor_canvas_solver) - self.vert_scroll_bar_factor_solver = Scrollbar( - self.factor_label_frame_solver, - orient="vertical", - command=self.factor_canvas_solver.yview, - ) - self.horiz_scroll_bar_factor_solver = Scrollbar( - self.factor_label_frame_solver, - orient="horizontal", - command=self.factor_canvas_solver.xview, - ) - self.factor_canvas_solver.configure( - xscrollcommand=self.horiz_scroll_bar_factor_solver.set, - yscrollcommand=self.vert_scroll_bar_factor_solver.set, - ) - - self.vert_scroll_bar_factor_solver.pack(side="right", fill="y") - self.horiz_scroll_bar_factor_solver.pack(side="bottom", fill="x") - - self.factor_canvas_solver.pack(side="left", fill="both", expand=True) - self.factor_canvas_solver.create_window( - (0, 0), - window=self.factor_frame_solver, - anchor="nw", - tags="self.factor_frame_solver", - ) - - self.factor_frame_solver.bind( - "", self.on_frame_configure_factor_solver - ) - - self.factor_notebook_solver = ttk.Notebook( - master=self.factor_frame_solver - ) - self.factor_notebook_solver.pack(fill="both") - - self.factor_tab_one_solver = tk.Frame( - master=self.factor_notebook_solver - ) - - self.factor_notebook_solver.add( - self.factor_tab_one_solver, - text=str(self.solver_var2.get()) + " Factors", - ) - - self.factor_tab_one_solver.grid_rowconfigure(0) - - self.factor_heading_list_solver = ["Description", "Input"] - - for heading in self.factor_heading_list_solver: - self.factor_tab_one_solver.grid_columnconfigure( - self.factor_heading_list_solver.index(heading) - ) - label = tk.Label( - master=self.factor_tab_one_solver, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label.grid( - row=0, - column=self.factor_heading_list_solver.index(heading), - padx=10, - pady=3, - ) - - meta_experiment = self.meta_experiment_master_list[row_index] - solver_name = self.solver_var2.get() - solver_index = meta_experiment.solver_names.index(str(solver_name)) - self.solver_object = meta_experiment.solvers[solver_index] - - meta_experiment = self.meta_experiment_master_list[row_index] - solver_name = self.solver_var2.get() - solver_index = meta_experiment.solver_names.index(str(solver_name)) - self.custom_solver_object = meta_experiment.solvers[solver_index] - # explanation: https://stackoverflow.com/questions/5924879/how-to-create-a-new-instance-from-a-class-object-in-python - default_solver_class = self.custom_solver_object.__class__ - self.default_solver_object = default_solver_class() - - count_factors_solver = 1 - - self.save_label_solver = tk.Label( - master=self.factor_tab_one_solver, - text="save solver as", - ) - - self.save_var_solver = tk.StringVar(self.factor_tab_one_solver) - self.save_entry_solver = ttk.Entry( - master=self.factor_tab_one_solver, - textvariable=self.save_var_solver, - justify=tk.LEFT, - width=15, - ) - - self.save_entry_solver.insert(index=tk.END, string=solver_name) - self.save_entry_solver["state"] = "disabled" - self.save_label_solver.grid( - row=count_factors_solver, column=0, sticky="nsew" - ) - self.save_entry_solver.grid( - row=count_factors_solver, column=1, sticky="nsew" - ) - - self.solver_factors_list.append(self.save_var_solver) - - self.solver_factors_types.append(str) - - count_factors_solver += 1 - - for factor_type in self.default_solver_object.specifications: - self.dictionary_size_solver = len( - self.default_solver_object.specifications[factor_type] - ) - datatype = self.default_solver_object.specifications[ - factor_type - ].get("datatype") - description = self.default_solver_object.specifications[ - factor_type - ].get("description") - default = self.default_solver_object.specifications[ - factor_type - ].get("default") - - if datatype is not bool: - self.int_float_description = tk.Label( - master=self.factor_tab_one_solver, - text=str(description), - wraplength=150, - ) - - self.int_float_var = tk.StringVar(self.factor_tab_one_solver) - self.int_float_entry = ttk.Entry( - master=self.factor_tab_one_solver, - textvariable=self.int_float_var, - justify=tk.LEFT, - width=15, - ) - self.int_float_entry.insert( - index=tk.END, - string=str(self.custom_solver_object.factors[factor_type]), - ) - self.int_float_entry["state"] = "disabled" - self.int_float_description.grid( - row=count_factors_solver, column=0, sticky="nsew" - ) - self.int_float_entry.grid( - row=count_factors_solver, column=1, sticky="nsew" - ) - self.solver_factors_list.append(self.int_float_var) - - if datatype is not tuple: - self.solver_factors_types.append(datatype) - else: - self.solver_factors_types.append(str) - - count_factors_solver += 1 - - if datatype is bool: - self.boolean_description = tk.Label( - master=self.factor_tab_one_solver, - text=str(description), - wraplength=150, - ) - - self.boolean_var = tk.BooleanVar( - self.factor_tab_one_solver, value=bool(default) - ) - self.boolean_menu = tk.Checkbutton( - self.factor_tab_one_solver, - variable=self.boolean_var, - onvalue=True, - offvalue=False, - ) - - # self.boolean_menu.configure(state = "disabled") - self.boolean_description.grid( - row=count_factors_solver, column=0, sticky="nsew" - ) - self.boolean_menu.grid( - row=count_factors_solver, column=1, sticky="nsew" - ) - self.solver_factors_list.append(self.boolean_var) - self.solver_factors_types.append(datatype) - - count_factors_solver += 1 - - self.factor_label_frame_solver.place( - x=10, rely=0.15, relheight=0.33, relwidth=0.34 - ) - if str(self.problem_var.get()) != "Problem": - self.add_button.place(x=10, rely=0.48, width=200, height=30) - - def show_problem_factors2(self, row_index: int, *args: tuple) -> None: - self.factor_label_frame_problem.destroy() - self.factor_label_frame_oracle.destroy() - self.problem_factors_list = [] - self.problem_factors_types = [] - - self.factor_label_frame_problem = ttk.LabelFrame( - master=self, text="Problem Factors" - ) - - self.factor_canvas_problem = tk.Canvas( - master=self.factor_label_frame_problem, borderwidth=0 - ) - - self.factor_frame_problem = ttk.Frame(master=self.factor_canvas_problem) - self.vert_scroll_bar_factor_problem = Scrollbar( - self.factor_label_frame_problem, - orient="vertical", - command=self.factor_canvas_problem.yview, - ) - self.horiz_scroll_bar_factor_problem = Scrollbar( - self.factor_label_frame_problem, - orient="horizontal", - command=self.factor_canvas_problem.xview, - ) - self.factor_canvas_problem.configure( - xscrollcommand=self.horiz_scroll_bar_factor_problem.set, - yscrollcommand=self.vert_scroll_bar_factor_problem.set, - ) - - self.vert_scroll_bar_factor_problem.pack(side="right", fill="y") - self.horiz_scroll_bar_factor_problem.pack(side="bottom", fill="x") - - self.factor_canvas_problem.pack(side="left", fill="both", expand=True) - self.factor_canvas_problem.create_window( - (0, 0), - window=self.factor_frame_problem, - anchor="nw", - tags="self.factor_frame_problem", - ) - - self.factor_frame_problem.bind( - "", self.on_frame_configure_factor_problem - ) - - self.factor_notebook_problem = ttk.Notebook( - master=self.factor_frame_problem - ) - self.factor_notebook_problem.pack(fill="both") - - self.factor_tab_one_problem = tk.Frame( - master=self.factor_notebook_problem - ) - - self.factor_notebook_problem.add( - self.factor_tab_one_problem, - text=str(self.problem_var2.get()) + " Factors", - ) - - self.factor_tab_one_problem.grid_rowconfigure(0) - - self.factor_heading_list_problem = ["Description", "Input"] - - for heading in self.factor_heading_list_problem: - self.factor_tab_one_problem.grid_columnconfigure( - self.factor_heading_list_problem.index(heading) - ) - label_problem = tk.Label( - master=self.factor_tab_one_problem, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label_problem.grid( - row=0, - column=self.factor_heading_list_problem.index(heading), - padx=10, - pady=3, - ) - - meta_experiment = self.meta_experiment_master_list[row_index] - problem_name = self.problem_var2.get() - problem_index = meta_experiment.problem_names.index(str(problem_name)) - self.custom_problem_object = meta_experiment.problems[problem_index] - # explanation: https://stackoverflow.com/questions/5924879/how-to-create-a-new-instance-from-a-class-object-in-python - default_problem_class = self.custom_problem_object.__class__ - self.default_problem_object = default_problem_class() - - count_factors_problem = 1 - - self.save_label_problem = tk.Label( - master=self.factor_tab_one_problem, - text="save problem as", - ) - - self.save_var_problem = tk.StringVar(self.factor_tab_one_problem) - self.save_entry_problem = ttk.Entry( - master=self.factor_tab_one_problem, - textvariable=self.save_var_problem, - justify=tk.LEFT, - width=15, - ) - - self.save_entry_problem.insert(index=tk.END, string=problem_name) - self.save_entry_problem["state"] = "disabled" - self.save_label_problem.grid( - row=count_factors_problem, column=0, sticky="nsew" - ) - self.save_entry_problem.grid( - row=count_factors_problem, column=1, sticky="nsew" - ) - - self.problem_factors_list.append(self.save_var_problem) - self.problem_factors_types.append(str) - - count_factors_problem += 1 - - for _, factor_type in enumerate( - self.default_problem_object.specifications, start=0 - ): - self.dictionary_size_problem = len( - self.default_problem_object.specifications[factor_type] - ) - datatype = self.default_problem_object.specifications[ - factor_type - ].get("datatype") - description = self.default_problem_object.specifications[ - factor_type - ].get("description") - default = self.default_problem_object.specifications[factor_type][ - "default" - ] - - if datatype is not bool: - self.int_float_description_problem = tk.Label( - master=self.factor_tab_one_problem, - text=str(description), - wraplength=150, - ) - - self.int_float_var_problem = tk.StringVar( - self.factor_tab_one_problem - ) - self.int_float_entry_problem = ttk.Entry( - master=self.factor_tab_one_problem, - textvariable=self.int_float_var_problem, - justify=tk.LEFT, - width=15, - ) - if datatype is tuple and len(default) == 1: - self.int_float_entry_problem.insert( - index=tk.END, - string=str( - self.custom_problem_object.factors[factor_type][0] - ), - ) - else: - self.int_float_entry_problem.insert( - index=tk.END, - string=str( - self.custom_problem_object.factors[factor_type] - ), - ) - - self.int_float_entry_problem["state"] = "disabled" - self.int_float_description_problem.grid( - row=count_factors_problem, column=0, sticky="nsew" - ) - self.int_float_entry_problem.grid( - row=count_factors_problem, column=1, sticky="nsew" - ) - - self.problem_factors_list.append(self.int_float_var_problem) - datatype = self.default_problem_object.specifications[ - factor_type - ].get("datatype") - - if datatype is not tuple: - self.problem_factors_types.append(datatype) - else: - self.problem_factors_types.append(str) - - count_factors_problem += 1 - - if datatype is bool: - self.boolean_description_problem = tk.Label( - master=self.factor_tab_one_problem, - text=str(description), - wraplength=150, - ) - self.boolean_var_problem = tk.BooleanVar( - self.factor_tab_one_problem, value=bool(default) - ) - self.boolean_menu_problem = tk.Checkbutton( - self.factor_tab_one_problem, - variable=self.boolean_var_problem, - onvalue=True, - offvalue=False, - ) - self.boolean_description_problem.grid( - row=count_factors_problem, column=0, sticky="nsew" - ) - self.boolean_menu_problem.grid( - row=count_factors_problem, column=1, sticky="nsew" - ) - - self.problem_factors_list.append(self.boolean_var_problem) - self.problem_factors_types.append(datatype) - - count_factors_problem += 1 - - self.factor_label_frame_problem.place( - relx=0.35, rely=0.15, relheight=0.33, relwidth=0.34 - ) - - # Switching from Problems to Oracles - - self.oracle_factors_list = [] - self.oracle_factors_types = [] - - self.factor_label_frame_oracle = ttk.LabelFrame( - master=self, text="Model Factors" - ) - - self.factor_canvas_oracle = tk.Canvas( - master=self.factor_label_frame_oracle, borderwidth=0 - ) - - self.factor_frame_oracle = ttk.Frame(master=self.factor_canvas_oracle) - self.vert_scroll_bar_factor_oracle = Scrollbar( - self.factor_label_frame_oracle, - orient="vertical", - command=self.factor_canvas_oracle.yview, - ) - self.horiz_scroll_bar_factor_oracle = Scrollbar( - self.factor_label_frame_oracle, - orient="horizontal", - command=self.factor_canvas_oracle.xview, - ) - self.factor_canvas_oracle.configure( - xscrollcommand=self.horiz_scroll_bar_factor_oracle.set, - yscrollcommand=self.vert_scroll_bar_factor_oracle.set, - ) - - self.vert_scroll_bar_factor_oracle.pack(side="right", fill="y") - self.horiz_scroll_bar_factor_oracle.pack(side="bottom", fill="x") - - self.factor_canvas_oracle.pack(side="left", fill="both", expand=True) - self.factor_canvas_oracle.create_window( - (0, 0), - window=self.factor_frame_oracle, - anchor="nw", - tags="self.factor_frame_oracle", - ) - - self.factor_frame_oracle.bind( - "", self.on_frame_configure_factor_oracle - ) - - self.factor_notebook_oracle = ttk.Notebook( - master=self.factor_frame_oracle - ) - self.factor_notebook_oracle.pack(fill="both") - - self.factor_tab_one_oracle = tk.Frame( - master=self.factor_notebook_oracle - ) - - self.factor_notebook_oracle.add( - self.factor_tab_one_oracle, text=str(self.oracle + " Factors") - ) - - self.factor_tab_one_oracle.grid_rowconfigure(0) - - self.factor_heading_list_oracle = ["Description", "Input"] - - for heading in self.factor_heading_list_oracle: - self.factor_tab_one_oracle.grid_columnconfigure( - self.factor_heading_list_oracle.index(heading) - ) - label_oracle = tk.Label( - master=self.factor_tab_one_oracle, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label_oracle.grid( - row=0, - column=self.factor_heading_list_oracle.index(heading), - padx=10, - pady=3, - ) - - self.default_oracle_object = self.default_problem_object.model - self.custom_oracle_object = self.custom_problem_object.model - - count_factors_oracle = 1 - for factor_type in self.default_oracle_object.specifications: - self.dictionary_size_oracle = len( - self.default_oracle_object.specifications[factor_type] - ) - datatype = self.default_oracle_object.specifications[ - factor_type - ].get("datatype") - description = self.default_oracle_object.specifications[ - factor_type - ].get("description") - default = self.default_oracle_object.specifications[ - factor_type - ].get("default") - - if datatype is bool: - # ("yes?") - self.int_float_description_oracle = tk.Label( - master=self.factor_tab_one_oracle, - text=str(description), - wraplength=150, - ) - self.int_float_var_oracle = tk.StringVar( - self.factor_tab_one_oracle - ) - self.int_float_entry_oracle = ttk.Entry( - master=self.factor_tab_one_oracle, - textvariable=self.int_float_var_oracle, - justify=tk.LEFT, - width=15, - ) - self.int_float_entry_oracle.insert( - index=tk.END, - string=str(self.custom_oracle_object.factors[factor_type]), - ) - self.int_float_entry_oracle["state"] = "disabled" - self.int_float_description_oracle.grid( - row=count_factors_oracle, column=0, sticky="nsew" - ) - self.int_float_entry_oracle.grid( - row=count_factors_oracle, column=1, sticky="nsew" - ) - - self.oracle_factors_list.append(self.int_float_var_oracle) - - if datatype is not tuple: - self.oracle_factors_types.append(datatype) - else: - self.oracle_factors_types.append(str) - - count_factors_oracle += 1 - - if datatype is bool: - # ("yes!") - self.boolean_description_oracle = tk.Label( - master=self.factor_tab_one_oracle, - text=str(description), - wraplength=150, - ) - self.boolean_var_oracle = tk.BooleanVar( - self.factor_tab_one_oracle, value=bool(default) - ) - self.boolean_menu_oracle = tk.Checkbutton( - self.factor_tab_one_oracle, - variable=self.boolean_var_oracle, - onvalue=True, - offvalue=False, - ) - self.boolean_description_oracle.grid( - row=count_factors_oracle, column=0, sticky="nsew" - ) - self.boolean_menu_oracle.grid( - row=count_factors_oracle, column=1, sticky="nsew" - ) - self.oracle_factors_list.append(self.boolean_var_oracle) - self.oracle_factors_types.append(datatype) - - count_factors_oracle += 1 - - self.factor_label_frame_oracle.place( - relx=0.7, rely=0.15, relheight=0.33, relwidth=0.3 - ) - if str(self.solver_var.get()) != "Solver": - self.add_button.place(x=10, rely=0.48, width=200, height=30) - - def show_solver_factors(self, *args: tuple) -> None: - """Show the solver factors in the GUI. - - Parameters - ---------- - args : tuple - The arguments passed to the function. - - """ - if args and len(args) == 3 and not args[2]: - pass - else: - self.update_problem_list_compatability() - - self.solver_factors_list = [] - self.solver_factors_types = [] - - self.factor_label_frame_solver = ttk.LabelFrame( - master=self, text="Solver Factors" - ) - - self.factor_canvas_solver = tk.Canvas( - master=self.factor_label_frame_solver, borderwidth=0 - ) - - self.factor_frame_solver = ttk.Frame(master=self.factor_canvas_solver) - self.vert_scroll_bar_factor_solver = Scrollbar( - self.factor_label_frame_solver, - orient="vertical", - command=self.factor_canvas_solver.yview, - ) - self.horiz_scroll_bar_factor_solver = Scrollbar( - self.factor_label_frame_solver, - orient="horizontal", - command=self.factor_canvas_solver.xview, - ) - self.factor_canvas_solver.configure( - xscrollcommand=self.horiz_scroll_bar_factor_solver.set, - yscrollcommand=self.vert_scroll_bar_factor_solver.set, - ) - - self.vert_scroll_bar_factor_solver.pack(side="right", fill="y") - self.horiz_scroll_bar_factor_solver.pack(side="bottom", fill="x") - - self.factor_canvas_solver.pack(side="left", fill="both", expand=True) - self.factor_canvas_solver.create_window( - (0, 0), - window=self.factor_frame_solver, - anchor="nw", - tags="self.factor_frame_solver", - ) - - self.factor_frame_solver.bind( - "", self.on_frame_configure_factor_solver - ) - - self.factor_notebook_solver = ttk.Notebook( - master=self.factor_frame_solver - ) - self.factor_notebook_solver.pack(fill="both") - - self.factor_tab_one_solver = tk.Frame( - master=self.factor_notebook_solver - ) - - self.factor_notebook_solver.add( - self.factor_tab_one_solver, - text=str(self.solver_var.get()) + " Factors", - ) - - self.factor_tab_one_solver.grid_rowconfigure(0) - - self.factor_heading_list_solver = ["Description", "Input"] - - for heading in self.factor_heading_list_solver: - self.factor_tab_one_solver.grid_columnconfigure( - self.factor_heading_list_solver.index(heading) - ) - label = tk.Label( - master=self.factor_tab_one_solver, - text=heading, - font=nametofont("TkHeadingFont"), - ) - label.grid( - row=0, - column=self.factor_heading_list_solver.index(heading), - padx=10, - pady=3, - ) - - self.solver_object = solver_unabbreviated_directory[ - self.solver_var.get() - ] - - count_factors_solver = 1 - - self.save_label_solver = tk.Label( - master=self.factor_tab_one_solver, - text="save solver as", - ) - - if args and len(args) == 3 and args[0]: - oldname = args[1][5][1] - - else: - solver_object = solver_unabbreviated_directory[ - self.solver_var.get() - ] - oldname = solver_object().name - - self.save_var_solver = tk.StringVar(self.factor_tab_one_solver) - self.save_entry_solver = ttk.Entry( - master=self.factor_tab_one_solver, - textvariable=self.save_var_solver, - justify=tk.LEFT, - width=15, - ) - - self.save_entry_solver.insert(index=tk.END, string=oldname) - - self.save_label_solver.grid( - row=count_factors_solver, column=0, sticky="nsew" - ) - self.save_entry_solver.grid( - row=count_factors_solver, column=1, sticky="nsew" - ) - - self.solver_factors_list.append(self.save_var_solver) - - self.solver_factors_types.append(str) - - count_factors_solver += 1 - - for factor_type in self.solver_object().specifications: - # ("size of dictionary", len(self.solver_object().specifications[factor_type])) - # ("first", factor_type) - # ("second", self.solver_object().specifications[factor_type].get("description")) - # ("third", self.solver_object().specifications[factor_type].get("datatype")) - # ("fourth", self.solver_object().specifications[factor_type].get("default")) - - self.dictionary_size_solver = len( - self.solver_object().specifications[factor_type] - ) - datatype = ( - self.solver_object().specifications[factor_type].get("datatype") - ) - description = ( - self.solver_object() - .specifications[factor_type] - .get("description") - ) - default = ( - self.solver_object().specifications[factor_type].get("default") - ) - - if datatype is not bool: - self.int_float_description = tk.Label( - master=self.factor_tab_one_solver, - text=str(description), - wraplength=150, - ) - - self.int_float_var = tk.StringVar(self.factor_tab_one_solver) - self.int_float_entry = ttk.Entry( - master=self.factor_tab_one_solver, - textvariable=self.int_float_var, - justify=tk.LEFT, - width=15, - ) - - if args and len(args) == 3 and args[0]: - self.int_float_entry.insert( - index=tk.END, string=str(args[1][5][0][factor_type]) - ) - else: - self.int_float_entry.insert( - index=tk.END, string=str(default) - ) - - self.int_float_description.grid( - row=count_factors_solver, column=0, sticky="nsew" - ) - self.int_float_entry.grid( - row=count_factors_solver, column=1, sticky="nsew" - ) - self.solver_factors_list.append(self.int_float_var) - - if datatype is not tuple: - self.solver_factors_types.append(datatype) - else: - self.solver_factors_types.append(str) - - count_factors_solver += 1 - - if datatype is bool: - self.boolean_description = tk.Label( - master=self.factor_tab_one_solver, - text=str(description), - wraplength=150, - ) - self.boolean_var = tk.BooleanVar( - self.factor_tab_one_solver, value=bool(default) - ) - self.boolean_menu = tk.Checkbutton( - self.factor_tab_one_solver, - variable=self.boolean_var, - onvalue=True, - offvalue=False, - ) - self.boolean_description.grid( - row=count_factors_solver, column=0, sticky="nsew" - ) - self.boolean_menu.grid( - row=count_factors_solver, column=1, sticky="nsew" - ) - self.solver_factors_list.append(self.boolean_var) - self.solver_factors_types.append(datatype) - - count_factors_solver += 1 - - # self.factor_label_frame_problem.place(relx=.32, y=70, height=150, relwidth=.34) - self.factor_label_frame_solver.place( - x=10, rely=0.15, relheight=0.33, relwidth=0.34 - ) - if str(self.problem_var.get()) != "Problem": - self.add_button.place(x=10, rely=0.48, width=200, height=30) - - -def problem_solver_unabbreviated_to_object( - problem_or_solver_name: str, unabbreviated_dictionary: dict -) -> tuple[Problem | Solver, str]: - """Convert the unabbreviated name of a problem or solver to the object of the problem or solver. - - Arguments: - --------- - problem_or_solver_name: str - The unabbreviated name of the problem or solver. - unabbreviated_dictionary: dict - The dictionary that maps the unabbreviated name of the problem or solver to the object of the problem or solver. - - Returns: - ------- - Problem | Solver - The object of the problem or solver. - str - The name of the problem or solver. - - Raises: - ------ - ValueError: If the problem_or_solver_name is not found in the unabbreviated_dictionary. - - """ - if problem_or_solver_name in unabbreviated_dictionary.keys(): - problem_or_solver_object = unabbreviated_dictionary[ - problem_or_solver_name - ] - return problem_or_solver_object, problem_or_solver_object().name - else: - error_msg = ( - f"{problem_or_solver_name} not found in {unabbreviated_dictionary}" - ) - raise ValueError(error_msg) - - -def problem_solver_abbreviated_name_to_unabbreviated( - problem_or_solver_name: str, - abbreviated_dictionary: dict, - unabbreviated_dictionary: dict, -) -> str: - """Convert the abbreviated name of a problem or solver to the unabbreviated name of the problem or solver. - - Arguments: - --------- - problem_or_solver_name: str - The abbreviated name of the problem or solver. - abbreviated_dictionary: dict - The dictionary that maps the abbreviated name of the problem or solver to the object of the problem or solver. - unabbreviated_dictionary: dict - The dictionary that maps the unabbreviated name of the problem or solver to the object of the problem or solver. - - Returns: - ------- - str - The unabbreviated name of the problem or solver. - - Raises: - ------ - ValueError: If the problem_or_solver_name is not found in the abbreviated_dictionary. - - """ - if problem_or_solver_name in abbreviated_dictionary.keys(): - problem_or_solver_object = abbreviated_dictionary[ - problem_or_solver_name - ] - for key, value in unabbreviated_dictionary.items(): - if problem_or_solver_object == value: - return key - else: - error_msg = ( - f"{problem_or_solver_name} not found in {abbreviated_dictionary}" - ) - raise ValueError(error_msg) - - -class PostNormalWindow(Toplevel): - """Post-Normalization Page of the GUI. - - Arguments: - --------- - master : tk.Tk - Tkinter window created from Experiment_Window.run_single_function - myexperiment : object(Experiment) - Experiment object created in Experiment_Window.run_single_function - experiment_list : list - List of experiment object arguments - - """ - - def __init__( - self, - root: tk.Tk, - experiment_list: list, - main_window: tk.Tk, - meta: bool = False, - ) -> None: - """Initialize the PostNormalWindow class. - - Parameters - ---------- - root : tk.Tk - The root window of the application. - experiment_list : list - List of experiment object arguments. - main_window : tk.Tk - The main window of the application. - meta : bool, optional - Whether the window is for a meta experiment, by default False. - - """ - super().__init__(root, title="SimOpt GUI - Post-Normalization") - self.center_window(0.8) # 80% scaling - - self.post_norm_exp_list = experiment_list - self.meta = meta - self.main_window = main_window - self.optimal_var = tk.StringVar(master=self) - self.initial_var = tk.StringVar(master=self) - self.check_var = tk.IntVar(master=self) - self.init_var = tk.StringVar(self) - self.proxy_var = tk.StringVar(self) - self.proxy_sol = tk.StringVar(self) - - self.all_solvers = [] - for solvers in self.post_norm_exp_list: - if solvers.solver.name not in self.all_solvers: - self.all_solvers.append(solvers.solver.name) - - # ("my exp post pro ", experiment_list) - self.selected = experiment_list - - self.frame = tk.Frame(self) - top_lab = ( - "Welcome to the Post-Normalization Page for " - + self.post_norm_exp_list[0].problem.name - + " \n with Solvers:" - ) - if self.post_norm_exp_list[0].problem.minmax[0] == 1: - minmax = "max" - else: - minmax = "min" - - opt = "unknown" - if self.post_norm_exp_list[0].problem.optimal_solution is not None: - if len(self.post_norm_exp_list[0].problem.optimal_solution) == 1: - opt = str( - self.post_norm_exp_list[0].problem.optimal_solution[0] - ) - else: - opt = str(self.post_norm_exp_list[0].problem.optimal_solution) - - for solv in self.all_solvers: - top_lab = top_lab + " " + solv - - self.title = tk.Label( - master=self, - text=top_lab, - font=nametofont("TkHeadingFont"), - justify="center", - ) - initsol = self.post_norm_exp_list[0].problem.factors["initial_solution"] - if len(initsol) == 1: - initsol = str(initsol[0]) - else: - initsol = str(initsol) - - self.n_init_label = tk.Label( - master=self, - text="The Initial Solution, x\u2080, is " + initsol + ".", - wraplength="400", - ) - - self.n_opt_label = tk.Label( - master=self, - text="The Optimal Solution, x\u002a, is " - + opt - + " for this " - + minmax - + "imization Problem. \nIf the Proxy Optimal Value or the Proxy Optimal Solution is unspecified, SimOpt uses the best Solution found in the selected Problem-Solver Pair experiments as the Proxy Optimal Solution.", - wraplength="600", - justify="left", - ) - - self.n_optimal_label = tk.Label( - master=self, - text="Optimal Solution (optional):", - wraplength="250", - ) - self.n_proxy_val_label = tk.Label( - master=self, - text="Insert Proxy Optimal Value, f(x\u002a):", - wraplength="250", - ) - self.n_proxy_sol_label = tk.Label( - master=self, - text="Insert Proxy Optimal Solution, x\u002a:", - wraplength="250", - ) - - # t = ["x","f(x)"] - self.n_proxy_sol_entry = ttk.Entry( - master=self, - textvariable=self.proxy_sol, - justify=tk.LEFT, - width=8, - ) - self.n_proxy_val_entry = ttk.Entry( - master=self, - textvariable=self.proxy_var, - justify=tk.LEFT, - width=8, - ) - self.n_initial_entry = ttk.Entry( - master=self, - textvariable=self.init_var, - justify=tk.LEFT, - width=10, - ) - - self.n_crn_label = tk.Label( - master=self, - text="CRN for x\u2080 and Optimal x\u002a?", - wraplength="310", - ) - self.n_crn_checkbox = tk.Checkbutton( - self, text="", variable=self.check_var - ) - - self.n_postreps_init_opt_label = tk.Label( - master=self, - text="Number of Post-Normalizations at x\u2080 and x\u002a:", - wraplength="310", - ) - - self.n_postreps_init_opt_var = tk.StringVar(self) - self.n_postreps_init_opt_entry = ttk.Entry( - master=self, - textvariable=self.n_postreps_init_opt_var, - justify=tk.LEFT, - width=15, - ) - self.n_postreps_init_opt_entry.insert(index=tk.END, string="200") - - self.post_processing_run_label = tk.Label( - master=self, # window label is used for - text="Click to Post-Normalize the Problem-Solver Pairs", - wraplength="300", - ) - - self.post_processing_run_button = ttk.Button( - master=self, # window button is used in - # aesthetic of button and specific formatting options - text="Post-Normalize", - width=15, # width of button - command=self.post_norm_run_function, - ) # if command=function(), it will only work once, so cannot call function, only specify which one, activated by left mouse click - - self.title.place(x=75, y=15) - - self.n_init_label.place(x=10, y=70) - - self.n_opt_label.place(x=10, y=90) - - # self.n_proxy_label.place(x=10, y=200) - self.n_proxy_val_label.place(x=10, y=190) - self.n_proxy_sol_label.place(x=325, y=190) - self.n_proxy_val_entry.place(x=220, y=190) - self.n_proxy_sol_entry.place(x=530, y=190) - - self.n_crn_label.place(x=10, y=230) - self.n_crn_checkbox.place(x=325, y=230) - # default to selected - self.n_crn_checkbox.select() - - self.n_postreps_init_opt_label.place(x=10, y=270) - self.n_postreps_init_opt_entry.place(x=325, y=270) - - self.post_processing_run_label.place(x=10, y=310) - self.post_processing_run_button.place(x=325, y=310) - - self.frame.pack(side="top", fill="both", expand=True) - - def post_norm_run_function(self) -> None: - self.experiment_list = [] - - # if self.n_postreps_entry.get().isnumeric() != False and self.n_postreps_init_opt_entry.get().isnumeric() != False and self.crn_across_budget_var.get() in self.crn_across_budget_list and self.crn_across_macroreps_var.get() in self.crn_across_macroreps_list: - if self.n_postreps_init_opt_entry.get().isnumeric(): - n_postreps_init_opt = int(self.n_postreps_init_opt_entry.get()) - crn = self.check_var.get() - proxy_val = None - proxy_sol = None - if self.proxy_sol.get() != "": - proxy_sol = ast.literal_eval(self.proxy_sol.get()) - if self.proxy_var.get() != "": - proxy_val = ast.literal_eval(self.proxy_var.get()) - post_normalize( - self.post_norm_exp_list, - n_postreps_init_opt, - crn_across_init_opt=crn, - proxy_init_val=None, - proxy_opt_val=proxy_val, - proxy_opt_x=proxy_sol, - ) - # self.destroy() - self.post_processed_bool = True - - self.postrep_window = Toplevel(self) - self.postrep_window.center_window(0.8) - self.postrep_window.set_style() - self.postrep_window.title("Plotting Page") - self.destroy() - PlotWindow( - self.postrep_window, - self.main_window, - experiment_list=self.post_norm_exp_list, - ) - - return - - else: - message = "Please enter a valid value for the number of postreplications at each recommended solution." - tk.messagebox.showerror(title="Error Window", message=message) - - self.n_postreps_entry.delete(0, len(self.n_postreps_entry.get())) - self.n_postreps_entry.insert(index=tk.END, string="100") - - -class PostProcessingWindow(Toplevel): - """Postprocessing Page of the GUI. - - Arguments: - --------- - master : tk.Tk - Tkinter window created from Experiment_Window.run_single_function - myexperiment : object(Experiment) - Experiment object created in Experiment_Window.run_single_function - experiment_list : list - List of experiment object arguments - - """ - - def __init__( - self, - root: tk.Tk, - myexperiment: ProblemSolver, - experiment_list: list, - main_window: tk.Tk, - meta: bool = False, - ) -> None: - """Initialize the PostProcessingWindow class. - - Parameters - ---------- - root : tk.Tk - The root window of the application. - myexperiment : - Experiment object created in Experiment_Window.run_single_function. - experiment_list : - List of experiment object arguments. - main_window : tk.Tk - The main window of the application. - meta : bool, optional - Whether the window is for a meta experiment, by default False. - - """ - super().__init__(root, title="SimOpt GUI - Post-Processing") - self.center_window(0.8) # 80% scaling - - self.meta = meta - self.main_window = main_window - self.my_experiment = myexperiment - # ("my exp post pro ", experiment_list) - self.selected = experiment_list - - self.frame = tk.Frame(self) - - self.title = tk.Label( - master=self, - text="Welcome to the Post-Processing Page", - font=nametofont("TkHeadingFont"), - justify="center", - ) - if self.meta: - self.title = tk.Label( - master=self, - text="Welcome to the Post-Processing \nand Post-Normalization Page", - font=nametofont("TkHeadingFont"), - justify="center", - ) - - self.n_postreps_label = tk.Label( - master=self, - text="Number of Postreplications at each Recommended Solution:", - wraplength="250", - ) - - self.n_postreps_var = tk.StringVar(self) - self.n_postreps_entry = ttk.Entry( - master=self, - textvariable=self.n_postreps_var, - justify=tk.LEFT, - width=15, - ) - self.n_postreps_entry.insert(index=tk.END, string="100") - - self.crn_across_budget_label = tk.Label( - master=self, - text="Use CRN for Postreplications at Solutions Recommended at Different Times?", - wraplength="250", - ) - - self.crn_across_budget_list = ["True", "False"] - # stays the same, has to change into a special type of variable via tkinter function - self.crn_across_budget_var = tk.StringVar(self) - # sets the default OptionMenu selection - # self.crn_across_budget_var.set("True") - # creates drop down menu, for tkinter, it is called "OptionMenu" - self.crn_across_budget_menu = ttk.OptionMenu( - self, - self.crn_across_budget_var, - "True", - *self.crn_across_budget_list, - ) - - self.crn_across_macroreps_label = tk.Label( - master=self, - text="Use CRN for Postreplications at Solutions Recommended on Different Macroreplications?", - wraplength="325", - ) - - self.crn_across_macroreps_list = ["True", "False"] - # stays the same, has to change into a special type of variable via tkinter function - self.crn_across_macroreps_var = tk.StringVar(self) - - self.crn_across_macroreps_menu = ttk.OptionMenu( - self, - self.crn_across_macroreps_var, - "False", - *self.crn_across_macroreps_list, - ) - - self.crn_norm_budget_label = tk.Label( - master=self, - text="Use CRN for Postreplications at x\u2080 and x\u002a?", - wraplength="325", - ) - self.crn_norm_across_macroreps_var = tk.StringVar(self) - self.crn_norm_across_macroreps_menu = ttk.OptionMenu( - self, - self.crn_norm_across_macroreps_var, - "True", - *self.crn_across_macroreps_list, - ) - - self.n_norm_label = tk.Label( - master=self, - text="Post-Normalization Parameters", - font=nametofont("TkHeadingFont"), - wraplength="300", - ) - - self.n_proc_label = tk.Label( - master=self, - text="Post-Processing Parameters", - font=nametofont("TkHeadingFont"), - wraplength="300", - ) - - self.n_norm_ostreps_label = tk.Label( - master=self, - text="Number of Postreplications at x\u2080 and x\u002a:", - wraplength="300", - ) - - self.n_norm_postreps_var = tk.StringVar(self) - self.n_norm_postreps_entry = ttk.Entry( - master=self, - textvariable=self.n_norm_postreps_var, - justify=tk.LEFT, - width=15, - ) - self.n_norm_postreps_entry.insert(index=tk.END, string="200") - - self.post_processing_run_label = tk.Label( - master=self, # window label is used for - text="Complete Post-Processing of the Problem-Solver Pairs:", - wraplength="250", - ) - - if self.meta: - self.post_processing_run_label = tk.Label( - master=self, # window label is used for - text="Complete Post-Processing and Post-Normalization of the Problem-Solver Pair(s)", - wraplength="300", - ) - - self.post_processing_run_button = ttk.Button( - master=self, # window button is used in - # aesthetic of button and specific formatting options - text="Post-Process", - width=15, # width of button - command=self.post_processing_run_function, - ) # if command=function(), it will only work once, so cannot call function, only specify which one, activated by left mouse click - - self.title.place(x=145, y=15) - - if not self.meta: - self.n_postreps_label.place(x=10, y=55) - self.n_postreps_entry.place(x=300, y=55) - - self.crn_across_budget_label.place(x=10, y=105) - self.crn_across_budget_menu.place(x=345, y=105) - - self.crn_across_macroreps_label.place(x=10, y=160) - self.crn_across_macroreps_menu.place(x=345, y=160) - - self.post_processing_run_label.place(x=10, y=233) - self.post_processing_run_button.place(x=310, y=237) - else: - self.n_proc_label.place(x=15, y=65) - - self.n_postreps_label.place(x=10, y=105) - self.n_postreps_entry.place(x=300, y=105) - - self.crn_across_budget_label.place(x=10, y=155) - self.crn_across_budget_menu.place(x=300, y=155) - - self.crn_across_macroreps_label.place(x=10, y=205) - self.crn_across_macroreps_menu.place(x=300, y=205) - - self.n_norm_label.place(x=15, y=265) - - self.crn_norm_budget_label.place(x=10, y=305) - self.crn_norm_across_macroreps_menu.place(x=300, y=305) - - self.n_norm_ostreps_label.place(x=10, y=355) - self.n_norm_postreps_entry.place(x=300, y=355) - - self.post_processing_run_label.place(x=10, y=405) - self.post_processing_run_button.place(x=300, y=405) - - self.frame.pack(side="top", fill="both", expand=True) - self.run_all = all - - def post_processing_run_function(self) -> list: - self.experiment_list = [] - # self.experiment_list = [self.selected[3], self.selected[4], self.selected[2]] - - # if self.n_postreps_entry.get().isnumeric() != False and self.n_postreps_init_opt_entry.get().isnumeric() != False and self.crn_across_budget_var.get() in self.crn_across_budget_list and self.crn_across_macroreps_var.get() in self.crn_across_macroreps_list: - if ( - self.n_postreps_entry.get().isnumeric() - and self.crn_across_budget_var.get() in self.crn_across_budget_list - and self.crn_across_macroreps_var.get() - in self.crn_across_macroreps_list - and ( - (self.meta and self.n_norm_postreps_entry.get().isnumeric()) - or not self.meta - ) - ): - self.experiment_list.append(int(self.n_postreps_entry.get())) - # self.experiment_list.append(int(self.n_postreps_init_opt_entry.get())) - - # actually adding a boolean value to the list instead of a string - if self.crn_across_budget_var.get() == "True": - self.experiment_list.append(True) - else: - self.experiment_list.append(False) - - if self.crn_across_macroreps_var.get() == "True": - self.experiment_list.append(True) - else: - self.experiment_list.append(False) - - norm = False - if self.crn_norm_across_macroreps_var.get() == "True": - norm = True - # reset n_postreps_entry - self.n_postreps_entry.delete(0, len(self.n_postreps_entry.get())) - self.n_postreps_entry.insert(index=tk.END, string="100") - - # reset crn_across_budget_bar - self.crn_across_budget_var.set("True") - - # reset crn_across_macroreps_var - self.crn_across_macroreps_var.set("False") - - self.n_postreps = self.experiment_list[0] # int - # print("self.n_prostreps", type(self.n_postreps)) - # self.n_postreps_init_opt = self.experiment_list[4] # int - self.crn_across_budget = self.experiment_list[1] # boolean - # print("self.n_prostreps", type(self.n_postreps)) - self.crn_across_macroreps = self.experiment_list[2] # boolean - - # print("This is the experiment object", self.my_experiment) - # print("This is the problem name: ", self.my_experiment.problem.name) - # print("This is the solver name: ", self.my_experiment.solver.name) - # print("This is the experiment list", self.selected) - # print ("This is experiment_list ", self.experiment_list) - # self, n_postreps, crn_across_budget=True, crn_across_macroreps=False - self.my_experiment.post_replicate( - self.n_postreps, - self.crn_across_budget, - self.crn_across_macroreps, - ) - - if self.meta: - self.my_experiment.post_normalize( - n_postreps_init_opt=int(self.n_norm_postreps_entry.get()), - crn_across_init_opt=norm, - ) - - # (self.experiment_list) - self.destroy() - self.post_processed_bool = True - ExperimentWindow.post_process_disable_button( - self.main_window, self.meta - ) - - return self.experiment_list - - elif not self.n_postreps_entry.get().isnumeric(): - message = "Please enter a valid value for the number of postreplications at each recommended solution." - tk.messagebox.showerror(title="Error Window", message=message) - - self.n_postreps_entry.delete(0, len(self.n_postreps_entry.get())) - self.n_postreps_entry.insert(index=tk.END, string="100") - - elif ( - self.crn_across_macroreps_var.get() - not in self.crn_across_macroreps_list - ): - message = "Please answer the following question: 'Use CRN for postreplications at Solutions Recommended at Different Times?' with True or False." - tk.messagebox.showerror(title="Error Window", message=message) - - self.crn_across_budget_var.set("----") - - elif ( - self.crn_across_budget_var.get() not in self.crn_across_budget_list - ): - message = "Please answer the following question: 'Use CRN for Postreplications at Solutions Recommended on Different Macroreplications?' with True or False." - tk.messagebox.showerror(title="Error Window", message=message) - - self.crn_across_macroreps_var.set("----") - - else: - message = "You have not selected all required field! Check for '*' signs near required input boxes." - tk.messagebox.showerror(title="Error Window", message=message) - - self.n_postreps_init_opt_entry.delete( - 0, len(self.n_postreps_init_opt_entry.get()) - ) - self.n_postreps_init_opt_entry.insert(index=tk.END, string="6") - - self.crn_across_budget_var.set("True") - - self.crn_across_macroreps_var.set("False") - - -class CrossDesignWindow(Toplevel): - """Class to create a window for the user to select problems and solvers for a cross-design problem-solver group.""" - - def __init__( - self, root: tk.Tk, main_widow: tk.Tk, forced_creation: bool = False - ) -> None: - """Initialize the CrossDesignWindow class. - - Parameters - ---------- - root : tk.Tk - The root window of the application. - main_widow : tk.Tk - The main window of the application. - forced_creation : bool, optional - Whether the window is being forced to be created, by default False. - - """ - if not forced_creation: - super().__init__(root, title="SimOpt GUI - Cross-Design") - self.center_window(0.8) # 80% scaling - - self.crossdesign_title_label = tk.Label( - master=self, - text="Create Cross-Design Problem-Solver Group", - font=nametofont("TkHeadingFont"), - ) - self.crossdesign_title_label.place(x=10, y=25) - - self.crossdesign_problem_label = tk.Label( - master=self, - text="Select Problems:", - ) - self.crossdesign_problem_label.place(x=190, y=55) - - self.crossdesign_solver_label = tk.Label( - master=self, - text="Select Solvers:", - ) - self.crossdesign_solver_label.place(x=10, y=55) - - self.crossdesign_checkbox_problem_list = [] - self.crossdesign_checkbox_problem_names = [] - self.crossdesign_checkbox_solver_list = [] - self.crossdesign_checkbox_solver_names = [] - - solver_cnt = 0 - - for solver in solver_unabbreviated_directory: - self.crossdesign_solver_checkbox_var = tk.BooleanVar( - self, value=False - ) - self.crossdesign_solver_checkbox = tk.Checkbutton( - master=self, - text=solver, - variable=self.crossdesign_solver_checkbox_var, - ) - self.crossdesign_solver_checkbox.place( - x=10, y=85 + (25 * solver_cnt) - ) - - self.crossdesign_checkbox_solver_list.append( - self.crossdesign_solver_checkbox_var - ) - self.crossdesign_checkbox_solver_names.append(solver) - - solver_cnt += 1 - - problem_cnt = 0 - for problem in problem_unabbreviated_directory: - self.crossdesign_problem_checkbox_var = tk.BooleanVar( - self, value=False - ) - self.crossdesign_problem_checkbox = tk.Checkbutton( - master=self, - text=problem, - variable=self.crossdesign_problem_checkbox_var, - ) - self.crossdesign_problem_checkbox.place( - x=190, y=85 + (25 * problem_cnt) - ) - - self.crossdesign_checkbox_problem_list.append( - self.crossdesign_problem_checkbox_var - ) - self.crossdesign_checkbox_problem_names.append(problem) - - problem_cnt += 1 - - if problem_cnt < solver_cnt: - solver_cnt += 1 - self.crossdesign_macro_label = tk.Label( - master=self, - text="Number of Macroreplications:", - ) - self.crossdesign_macro_label.place( - x=15, y=80 + (25 * problem_cnt) - ) - - self.crossdesign_macro_var = tk.StringVar(self) - self.crossdesign_macro_entry = ttk.Entry( - master=self, - textvariable=self.crossdesign_macro_var, - justify=tk.LEFT, - width=15, - ) - self.crossdesign_macro_entry.insert(index=tk.END, string="10") - self.crossdesign_macro_entry.place( - x=15, y=105 + (25 * solver_cnt) - ) - - self.crossdesign_button = ttk.Button( - master=self, - text="Add Cross-Design Problem-Solver Group", - width=65, - command=self.confirm_cross_design_function, - ) - self.crossdesign_button.place(x=15, y=135 + (25 * solver_cnt)) - - if problem_cnt > solver_cnt: - problem_cnt += 1 - - self.crossdesign_macro_label = tk.Label( - master=self, - text="Number of Macroreplications:", - ) - self.crossdesign_macro_label.place( - x=15, y=80 + (25 * problem_cnt) - ) - - self.crossdesign_macro_var = tk.StringVar(self) - self.crossdesign_macro_entry = ttk.Entry( - master=self, - textvariable=self.crossdesign_macro_var, - justify=tk.LEFT, - width=15, - ) - self.crossdesign_macro_entry.insert(index=tk.END, string="10") - - self.crossdesign_macro_entry.place( - x=15, y=105 + (25 * problem_cnt) - ) - - self.crossdesign_button = ttk.Button( - master=self, - text="Add Cross-Design Problem-Solver Group", - width=45, - command=self.confirm_cross_design_function, - ) - self.crossdesign_button.place(x=15, y=135 + (25 * problem_cnt)) - - if problem_cnt == solver_cnt: - problem_cnt += 1 - - self.crossdesign_macro_label = tk.Label( - master=self, - text="Number of Macroreplications:", - ) - self.crossdesign_macro_label.place( - x=15, y=80 + (25 * problem_cnt) - ) - - self.crossdesign_macro_var = tk.StringVar(self) - self.crossdesign_macro_entry = ttk.Entry( - master=self, - textvariable=self.crossdesign_macro_var, - justify=tk.LEFT, - width=15, - ) - self.crossdesign_macro_entry.insert(index=tk.END, string="10") - self.crossdesign_macro_entry.place( - x=15, y=105 + (25 * problem_cnt) - ) - - self.crossdesign_button = ttk.Button( - master=self, - text="Add Cross-Design Problem-Solver Group", - width=30, - command=self.confirm_cross_design_function, - ) - self.crossdesign_button.place(x=15, y=135 + (25 * problem_cnt)) - else: - # print("forced creation of cross design window class") - pass - - def confirm_cross_design_function(self) -> ProblemsSolvers: - solver_names_list = list(solver_directory.keys()) - problem_names_list = list(problem_directory.keys()) - problem_list = [] - solver_list = [] - - for checkbox in self.crossdesign_checkbox_solver_list: - if checkbox.get(): - # (self.crossdesign_checkbox_solver_names[self.crossdesign_checkbox_solver_list.index(checkbox)] + " was selected (solver)") - # solver_list.append(solver_directory[self.crossdesign_checkbox_solver_names[self.crossdesign_checkbox_solver_list.index(checkbox)]]) - solver_list.append( - solver_names_list[ - self.crossdesign_checkbox_solver_list.index(checkbox) - ] - ) - - for checkbox in self.crossdesign_checkbox_problem_list: - if checkbox.get(): - # (self.crossdesign_checkbox_problem_names[self.crossdesign_checkbox_problem_list.index(checkbox)] + " was selected (problem)") - # problem_list.append(problem_directory[self.crossdesign_checkbox_problem_names[self.crossdesign_checkbox_problem_list.index(checkbox)]]) - problem_list.append( - problem_names_list[ - self.crossdesign_checkbox_problem_list.index(checkbox) - ] - ) - - # Solver can handle upto deterministic constraints, but problem has stochastic constraints. - stochastic = ["FACSIZE-1", "FACSIZE-2", "RMITD-1"] - if len(solver_list) == 0 or len(problem_list) == 0: - self.crossdesign_warning = tk.Label( - master=self, - text="Select at least one solver and one problem", - font=nametofont("TkHeadingFont"), - wraplength=300, - ) - self.crossdesign_warning.place(x=10, y=345) - return - - if "ASTRODF" in solver_list and any( - item in stochastic for item in problem_list - ): - self.crossdesign_warning = tk.Label( - master=self, - text="ASTRODF can handle upto deterministic constraints, but problem has stochastic constraints", - font=nametofont("TkHeadingFont"), - wraplength=300, - ) - self.crossdesign_warning.place(x=10, y=345) - return - # macro_reps = self.crossdesign_macro_var.get() - # (solver_list, problem_list) - # self.crossdesign_ProblemsSolvers = ProblemsSolvers(solver_names=solver_list, problem_names=problem_list, fixed_factors_filename="all_factors") - self.crossdesign_MetaExperiment = ProblemsSolvers( - solver_names=solver_list, problem_names=problem_list - ) - - # if self.count_meta_experiment_queue == 0: - # self.create_meta_exp_frame() - self.destroy() - ExperimentWindow.add_meta_exp_to_frame( - self.main_window, self.crossdesign_macro_var - ) - - return self.crossdesign_MetaExperiment - - # (self.crossdesign_MetaExperiment) - - def get_crossdesign_meta_experiment(self) -> ProblemsSolvers: - return self.crossdesign_MetaExperiment diff --git a/simopt/gui/main_menu.py b/simopt/gui/main_menu.py index 538ebc54b..9c3e39073 100644 --- a/simopt/gui/main_menu.py +++ b/simopt/gui/main_menu.py @@ -1,3 +1,5 @@ +"""Main menu window of the GUI.""" + import tkinter as tk from tkinter import ttk from tkinter.font import nametofont @@ -16,15 +18,10 @@ class MainMenuWindow(Toplevel): def __init__(self, root: tk.Tk) -> None: """Initialize the main menu window of the GUI. - Parameters - ---------- - root : tk.Tk - The main window of the GUI - + Args: + root (tk.Tk): The main window of the GUI. """ - super().__init__( - root, title="SimOpt GUI - Main Menu", exit_on_close=True - ) + super().__init__(root, title="SimOpt GUI - Main Menu", exit_on_close=True) # Set the size of the window to XX% of the screen size size_percent = 50 self.center_window(size_percent / 100.0) @@ -42,9 +39,7 @@ def __init__(self, root: tk.Tk) -> None: ) self.title_label.grid(row=0, column=0, pady=10, sticky="nsew") - self.separator = ttk.Separator( - master=self.menu_frame, orient="horizontal" - ) + self.separator = ttk.Separator(master=self.menu_frame, orient="horizontal") self.separator.grid(row=1, column=0, pady=10, sticky="nsew") # Button to open model data farming window @@ -81,6 +76,7 @@ def __init__(self, root: tk.Tk) -> None: self.lift() def set_main_menu_style_changes(self) -> None: + """Set the style of the main menu window.""" self.header_font = nametofont("TkHeadingFont").copy() header_font_size = self.header_font.cget("size") scaled_header_font_size = int(header_font_size * FONT_SCALE) diff --git a/simopt/gui/new_experiment_window.py b/simopt/gui/new_experiment_window.py index 0919c438e..068b659eb 100644 --- a/simopt/gui/new_experiment_window.py +++ b/simopt/gui/new_experiment_window.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pickle import re @@ -6,7 +8,7 @@ from abc import ABCMeta from tkinter import filedialog, messagebox, ttk from tkinter.font import nametofont -from typing import Callable, Final, Literal, Union +from typing import Callable, Final, Literal import matplotlib.pyplot as plt import pandas as pd @@ -14,14 +16,9 @@ from matplotlib.ticker import MultipleLocator from PIL import Image, ImageTk +import simopt.directory as directory from simopt.base import Problem, Solver from simopt.data_farming_base import DATA_FARMING_DIR -from simopt.directory import ( - problem_directory, - problem_unabbreviated_directory, - solver_directory, - solver_unabbreviated_directory, -) from simopt.experiment_base import ( ProblemSolver, ProblemsSolvers, @@ -37,6 +34,12 @@ from simopt.gui.df_object import DFFactor, spec_dict_to_df_dict from simopt.gui.toplevel_custom import Toplevel +# Workaround for AutoAPI +problem_directory = directory.problem_directory +solver_directory = directory.solver_directory +problem_unabbreviated_directory = directory.problem_unabbreviated_directory +solver_unabbreviated_directory = directory.solver_unabbreviated_directory + class NewExperimentWindow(Toplevel): """New Experiment Window.""" @@ -100,16 +103,12 @@ def __init__(self, root: tk.Tk) -> None: # Variables used by the GUI # Add the name of the problem/solver to the displayed description - # TODO: update the problem/solver implementations so that "name" is an - # attribute of the class, as currently it is only initialized in the - # __init__ method of the class. This will eliminate the need to - # instantiate the class to get the name. self.problem_full_name_to_class = { - f"{problem().name} - {key}": problem + f"{problem.class_name_abbr} -- {key}": problem for key, problem in problem_unabbreviated_directory.items() } self.solver_full_name_to_class = { - f"{solver().name} - {key}": solver + f"{solver.class_name_abbr} -- {key}": solver for key, solver in solver_unabbreviated_directory.items() } # Current exp variables @@ -213,9 +212,7 @@ def _initialize_experiment_frame(self) -> None: self.tk_canvases["exps.list_canvas"] = tk.Canvas( self.tk_frames["exps.list_canvas"], ) - self.tk_canvases["exps.list_canvas"].grid( - row=0, column=0, sticky="nsew" - ) + self.tk_canvases["exps.list_canvas"].grid(row=0, column=0, sticky="nsew") self.__update_exp_list_scroll_region() self.tk_frames["exps.list_canvas.list"] = ttk.Frame( self.tk_canvases["exps.list_canvas"], @@ -233,9 +230,7 @@ def _initialize_experiment_frame(self) -> None: self.tk_canvases["exps.list_canvas"].config( yscrollcommand=self.tk_scrollbars["exps.list_canvas_vert"].set ) - self.tk_scrollbars["exps.list_canvas_vert"].grid( - row=0, column=1, sticky="ns" - ) + self.tk_scrollbars["exps.list_canvas_vert"].grid(row=0, column=1, sticky="ns") self.tk_scrollbars["exps.list_canvas_horiz"] = ttk.Scrollbar( self.tk_frames["exps.list_canvas"], orient="horizontal", @@ -244,9 +239,7 @@ def _initialize_experiment_frame(self) -> None: self.tk_canvases["exps.list_canvas"].config( xscrollcommand=self.tk_scrollbars["exps.list_canvas_horiz"].set ) - self.tk_scrollbars["exps.list_canvas_horiz"].grid( - row=1, column=0, sticky="ew" - ) + self.tk_scrollbars["exps.list_canvas_horiz"].grid(row=1, column=0, sticky="ew") self.tk_frames["exps.fields"] = ttk.Frame( self.tk_frames["exps"], ) @@ -257,25 +250,19 @@ def _initialize_experiment_frame(self) -> None: text="Change Default Experiment Options", command=self.open_defaults_window, ) - self.tk_buttons["exps.fields.default_opts"].grid( - row=0, column=0, sticky="ew" - ) + self.tk_buttons["exps.fields.default_opts"].grid(row=0, column=0, sticky="ew") self.tk_buttons["exps.fields.open_plot_win"] = ttk.Button( self.tk_frames["exps.fields"], text="Open Plotting Window", command=self.open_plotting_window, ) - self.tk_buttons["exps.fields.open_plot_win"].grid( - row=2, column=0, sticky="ew" - ) + self.tk_buttons["exps.fields.open_plot_win"].grid(row=2, column=0, sticky="ew") self.tk_buttons["exps.fields.load_exp"] = ttk.Button( self.tk_frames["exps.fields"], text="Load Experiment", command=self.load_experiment, ) - self.tk_buttons["exps.fields.load_exp"].grid( - row=3, column=0, sticky="ew" - ) + self.tk_buttons["exps.fields.load_exp"].grid(row=3, column=0, sticky="ew") def _initialize_current_experiment_frame(self) -> None: if "curr_exp" in self.tk_frames: @@ -329,9 +316,7 @@ def _initialize_current_experiment_frame(self) -> None: self.tk_canvases["curr_exp.lists.problems"] = tk.Canvas( self.tk_frames["curr_exp.lists"], ) - self.tk_canvases["curr_exp.lists.problems"].grid( - row=1, column=0, sticky="nsew" - ) + self.tk_canvases["curr_exp.lists.problems"].grid(row=1, column=0, sticky="nsew") self.tk_frames["curr_exp.lists.problems"] = ttk.Frame( self.tk_canvases["curr_exp.lists.problems"], ) @@ -346,9 +331,7 @@ def _initialize_current_experiment_frame(self) -> None: command=self.tk_canvases["curr_exp.lists.problems"].yview, ) self.tk_canvases["curr_exp.lists.problems"].config( - yscrollcommand=self.tk_scrollbars[ - "curr_exp.lists.problems_vert" - ].set + yscrollcommand=self.tk_scrollbars["curr_exp.lists.problems_vert"].set ) self.tk_scrollbars["curr_exp.lists.problems_vert"].grid( row=1, column=1, sticky="ns" @@ -359,9 +342,7 @@ def _initialize_current_experiment_frame(self) -> None: command=self.tk_canvases["curr_exp.lists.problems"].xview, ) self.tk_canvases["curr_exp.lists.problems"].config( - xscrollcommand=self.tk_scrollbars[ - "curr_exp.lists.problems_horiz" - ].set + xscrollcommand=self.tk_scrollbars["curr_exp.lists.problems_horiz"].set ) self.tk_scrollbars["curr_exp.lists.problems_horiz"].grid( row=2, column=0, sticky="ew" @@ -371,9 +352,7 @@ def _initialize_current_experiment_frame(self) -> None: self.tk_canvases["curr_exp.lists.solvers"] = tk.Canvas( self.tk_frames["curr_exp.lists"], ) - self.tk_canvases["curr_exp.lists.solvers"].grid( - row=1, column=3, sticky="nsew" - ) + self.tk_canvases["curr_exp.lists.solvers"].grid(row=1, column=3, sticky="nsew") self.tk_frames["curr_exp.lists.solvers"] = ttk.Frame( self.tk_canvases["curr_exp.lists.solvers"], ) @@ -399,9 +378,7 @@ def _initialize_current_experiment_frame(self) -> None: command=self.tk_canvases["curr_exp.lists.solvers"].xview, ) self.tk_canvases["curr_exp.lists.solvers"].config( - xscrollcommand=self.tk_scrollbars[ - "curr_exp.lists.solvers_horiz" - ].set + xscrollcommand=self.tk_scrollbars["curr_exp.lists.solvers_horiz"].set ) self.tk_scrollbars["curr_exp.lists.solvers_horiz"].grid( row=2, column=3, sticky="ew" @@ -434,24 +411,18 @@ def _initialize_current_experiment_frame(self) -> None: text="Experiment Name ", anchor="e", ) - self.tk_labels["curr_exp.fields.exp_name"].grid( - row=2, column=0, sticky="ew" - ) + self.tk_labels["curr_exp.fields.exp_name"].grid(row=2, column=0, sticky="ew") self.tk_entries["curr_exp.fields.exp_name"] = ttk.Entry( self.tk_frames["curr_exp.fields"], textvariable=self.curr_exp_name, ) - self.tk_entries["curr_exp.fields.exp_name"].grid( - row=2, column=1, sticky="ew" - ) + self.tk_entries["curr_exp.fields.exp_name"].grid(row=2, column=1, sticky="ew") self.tk_labels["curr_exp.fields.make_pickle"] = ttk.Label( self.tk_frames["curr_exp.fields"], text="Create Pickles for each pair? ", anchor="e", ) - self.tk_labels["curr_exp.fields.make_pickle"].grid( - row=3, column=0, sticky="ew" - ) + self.tk_labels["curr_exp.fields.make_pickle"].grid(row=3, column=0, sticky="ew") self.tk_checkbuttons["curr_exp.fields.make_pickle"] = ttk.Checkbutton( self.tk_frames["curr_exp.fields"], variable=self.curr_exp_is_pickled, @@ -507,20 +478,14 @@ def _initialize_notebook_frame(self) -> None: text=attribute_desc, anchor="nw", ) - self.tk_labels["ntbk.header.attr_desc"].grid( - row=0, column=2, sticky="nsew" - ) + self.tk_labels["ntbk.header.attr_desc"].grid(row=0, column=2, sticky="nsew") self.tk_labels["ntbk.header.incomp_desc"] = ttk.Label( self.tk_frames["ntbk.header"], text="incompatible problems/solvers will be unselectable", anchor="center", ) - self.tk_labels["ntbk.header.incomp_desc"].grid( - row=1, column=2, sticky="nsew" - ) - self.tk_notebooks["ntbk.ps_adding"] = ttk.Notebook( - self.tk_frames["ntbk"] - ) + self.tk_labels["ntbk.header.incomp_desc"].grid(row=1, column=2, sticky="nsew") + self.tk_notebooks["ntbk.ps_adding"] = ttk.Notebook(self.tk_frames["ntbk"]) self.tk_notebooks["ntbk.ps_adding"].grid(row=1, column=0, sticky="nsew") self.tk_frames["ntbk.ps_adding.problem"] = ttk.Frame( self.tk_notebooks["ntbk.ps_adding"] @@ -528,21 +493,17 @@ def _initialize_notebook_frame(self) -> None: self.tk_notebooks["ntbk.ps_adding"].add( self.tk_frames["ntbk.ps_adding.problem"], text="Add Problem" ) - self.tk_frames["ntbk.ps_adding.problem"].grid_columnconfigure( - 1, weight=1 - ) + self.tk_frames["ntbk.ps_adding.problem"].grid_columnconfigure(1, weight=1) self.tk_frames["ntbk.ps_adding.problem"].grid_rowconfigure(1, weight=1) self.tk_labels["ntbk.ps_adding.problem.select"] = ttk.Label( self.tk_frames["ntbk.ps_adding.problem"], text="Selected Problem" ) - self.tk_labels["ntbk.ps_adding.problem.select"].grid( - row=0, column=0, padx=5 - ) + self.tk_labels["ntbk.ps_adding.problem.select"].grid(row=0, column=0, padx=5) # Setting this to readonly prevents the user from typing in the combobox self.tk_comboboxes["ntbk.ps_adding.problem.select"] = ttk.Combobox( self.tk_frames["ntbk.ps_adding.problem"], textvariable=self.selected_problem_name, - values=sorted(list(self.problem_full_name_to_class.keys())), + values=sorted(self.problem_full_name_to_class.keys()), state="readonly", ) self.tk_comboboxes["ntbk.ps_adding.problem.select"].grid( @@ -557,31 +518,21 @@ def _initialize_notebook_frame(self) -> None: self.tk_canvases["ntbk.ps_adding.problem.factors"].grid( row=1, column=0, sticky="nsew", columnspan=2 ) - self.tk_scrollbars["ntbk.ps_adding.problem.factors_vert"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.problem"], - orient="vertical", - command=self.tk_canvases[ - "ntbk.ps_adding.problem.factors" - ].yview, - ) + self.tk_scrollbars["ntbk.ps_adding.problem.factors_vert"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.problem"], + orient="vertical", + command=self.tk_canvases["ntbk.ps_adding.problem.factors"].yview, ) self.tk_canvases["ntbk.ps_adding.problem.factors"].config( - yscrollcommand=self.tk_scrollbars[ - "ntbk.ps_adding.problem.factors_vert" - ].set + yscrollcommand=self.tk_scrollbars["ntbk.ps_adding.problem.factors_vert"].set ) self.tk_scrollbars["ntbk.ps_adding.problem.factors_vert"].grid( row=1, column=2, sticky="ns" ) - self.tk_scrollbars["ntbk.ps_adding.problem.factors_horiz"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.problem"], - orient="horizontal", - command=self.tk_canvases[ - "ntbk.ps_adding.problem.factors" - ].xview, - ) + self.tk_scrollbars["ntbk.ps_adding.problem.factors_horiz"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.problem"], + orient="horizontal", + command=self.tk_canvases["ntbk.ps_adding.problem.factors"].xview, ) self.tk_canvases["ntbk.ps_adding.problem.factors"].config( xscrollcommand=self.tk_scrollbars[ @@ -602,21 +553,17 @@ def _initialize_notebook_frame(self) -> None: self.tk_notebooks["ntbk.ps_adding"].add( self.tk_frames["ntbk.ps_adding.solver"], text="Add Solver" ) - self.tk_frames["ntbk.ps_adding.solver"].grid_columnconfigure( - 1, weight=1 - ) + self.tk_frames["ntbk.ps_adding.solver"].grid_columnconfigure(1, weight=1) self.tk_frames["ntbk.ps_adding.solver"].grid_rowconfigure(1, weight=1) self.tk_labels["ntbk.ps_adding.solver.select"] = ttk.Label( self.tk_frames["ntbk.ps_adding.solver"], text="Selected Solver" ) - self.tk_labels["ntbk.ps_adding.solver.select"].grid( - row=0, column=0, padx=5 - ) + self.tk_labels["ntbk.ps_adding.solver.select"].grid(row=0, column=0, padx=5) # Setting this to readonly prevents the user from typing in the combobox self.tk_comboboxes["ntbk.ps_adding.solver.select"] = ttk.Combobox( self.tk_frames["ntbk.ps_adding.solver"], textvariable=self.selected_solver_name, - values=sorted(list(self.solver_full_name_to_class.keys())), + values=sorted(self.solver_full_name_to_class.keys()), state="readonly", ) self.tk_comboboxes["ntbk.ps_adding.solver.select"].grid( @@ -631,32 +578,24 @@ def _initialize_notebook_frame(self) -> None: self.tk_canvases["ntbk.ps_adding.solver.factors"].grid( row=1, column=0, sticky="nsew", columnspan=2 ) - self.tk_scrollbars["ntbk.ps_adding.solver.factors_vert"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.solver"], - orient="vertical", - command=self.tk_canvases["ntbk.ps_adding.solver.factors"].yview, - ) + self.tk_scrollbars["ntbk.ps_adding.solver.factors_vert"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.solver"], + orient="vertical", + command=self.tk_canvases["ntbk.ps_adding.solver.factors"].yview, ) self.tk_canvases["ntbk.ps_adding.solver.factors"].config( - yscrollcommand=self.tk_scrollbars[ - "ntbk.ps_adding.solver.factors_vert" - ].set + yscrollcommand=self.tk_scrollbars["ntbk.ps_adding.solver.factors_vert"].set ) self.tk_scrollbars["ntbk.ps_adding.solver.factors_vert"].grid( row=1, column=2, sticky="ns" ) - self.tk_scrollbars["ntbk.ps_adding.solver.factors_horiz"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.solver"], - orient="horizontal", - command=self.tk_canvases["ntbk.ps_adding.solver.factors"].xview, - ) + self.tk_scrollbars["ntbk.ps_adding.solver.factors_horiz"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.solver"], + orient="horizontal", + command=self.tk_canvases["ntbk.ps_adding.solver.factors"].xview, ) self.tk_canvases["ntbk.ps_adding.solver.factors"].config( - xscrollcommand=self.tk_scrollbars[ - "ntbk.ps_adding.solver.factors_horiz" - ].set + xscrollcommand=self.tk_scrollbars["ntbk.ps_adding.solver.factors_horiz"].set ) self.tk_scrollbars["ntbk.ps_adding.solver.factors_horiz"].grid( row=2, column=0, sticky="ew", columnspan=2 @@ -692,12 +631,8 @@ def _initialize_generated_design_frame(self) -> None: font=nametofont("TkHeadingFont"), ) self.tk_labels["gen_design.header"].grid(row=0, column=0, sticky="nsew") - self.tk_frames["gen_design.display"] = ttk.Frame( - self.tk_frames["gen_design"] - ) - self.tk_frames["gen_design.display"].grid( - row=1, column=0, sticky="nsew" - ) + self.tk_frames["gen_design.display"] = ttk.Frame(self.tk_frames["gen_design"]) + self.tk_frames["gen_design.display"].grid(row=1, column=0, sticky="nsew") self.tk_frames["gen_design.display"].grid_columnconfigure(0, weight=1) self.tk_frames["gen_design.display"].grid_columnconfigure(1, weight=0) self.tk_frames["gen_design.display"].grid_rowconfigure(0, weight=1) @@ -760,21 +695,15 @@ def _initialize_design_options(self) -> None: values=sorted(self.design_types), state="readonly", ) - self.tk_comboboxes["design_opts.type"].grid( - row=1, column=1, sticky="ew" - ) + self.tk_comboboxes["design_opts.type"].grid(row=1, column=1, sticky="ew") self.tk_labels["design_opts.num_stacks"] = ttk.Label( self.tk_frames["design_opts"], text="# of Stacks ", anchor="e" ) - self.tk_labels["design_opts.num_stacks"].grid( - row=2, column=0, sticky="ew" - ) + self.tk_labels["design_opts.num_stacks"].grid(row=2, column=0, sticky="ew") self.tk_entries["design_opts.num_stacks"] = ttk.Entry( self.tk_frames["design_opts"], textvariable=self.design_num_stacks ) - self.tk_entries["design_opts.num_stacks"].grid( - row=2, column=1, sticky="ew" - ) + self.tk_entries["design_opts.num_stacks"].grid(row=2, column=1, sticky="ew") self.tk_labels["design_opts.name"] = ttk.Label( self.tk_frames["design_opts"], text="Design Name ", anchor="e" ) @@ -828,9 +757,7 @@ def __refresh_problem_tab(self) -> None: def __refresh_solver_tab(self) -> None: self.selected_solver_name.set("") self._enable_design_opts() - self._destroy_widget_children( - self.tk_canvases["ntbk.ps_adding.solver.factors"] - ) + self._destroy_widget_children(self.tk_canvases["ntbk.ps_adding.solver.factors"]) self.tk_buttons["design_opts.generate"].configure( text="Generate Solver Design", command=self.create_solver_design ) @@ -891,7 +818,7 @@ def _on_solver_combobox_change(self, _: tk.Event) -> None: self._hide_gen_design() def __update_problem_dropdown(self) -> None: - possible_problems = sorted(list(self.problem_full_name_to_class.keys())) + possible_problems = sorted(self.problem_full_name_to_class.keys()) # For each solver in the current experiment, check all the possible # problems and remove the ones that are not compatible # Grab the name (index 1) out of the first element (index 0) of the @@ -904,7 +831,7 @@ def __update_problem_dropdown(self) -> None: solver: Solver = solver_class() problem_list = possible_problems.copy() for problem_name in problem_list: - short_problem_name = problem_name.split(" - ")[0] + short_problem_name = problem_name.split(" ")[0] problem_class: ABCMeta = problem_directory[short_problem_name] problem: Problem = problem_class() # Create a new ProblemSolver object to check compatibility @@ -917,7 +844,7 @@ def __update_problem_dropdown(self) -> None: ) def __update_solver_dropdown(self) -> None: - possible_options = sorted(list(self.solver_full_name_to_class.keys())) + possible_options = sorted(self.solver_full_name_to_class.keys()) # For each problem in the current experiment, check all the possible # solvers and remove the ones that are not compatible # Grab the name (index 1) out of the first element (index 0) of the @@ -930,7 +857,7 @@ def __update_solver_dropdown(self) -> None: problem: Problem = problem_class() solver_list = possible_options.copy() for solver_name in solver_list: - short_solver_name = solver_name.split(" - ")[0] + short_solver_name = solver_name.split(" ")[0] solver_class: ABCMeta = solver_directory[short_solver_name] solver: Solver = solver_class() # Create a new ProblemSolver object to check compatibility @@ -943,15 +870,13 @@ def __update_solver_dropdown(self) -> None: ) def add_problem_to_curr_exp( - self, unique_name: str, problem_list: "list[list]" + self, unique_name: str, problem_list: list[list] ) -> None: self.root_problem_dict[unique_name] = problem_list self.add_problem_to_curr_exp_list(unique_name) self.__update_solver_dropdown() - def add_solver_to_curr_exp( - self, unique_name: str, solver_list: "list[list]" - ) -> None: + def add_solver_to_curr_exp(self, unique_name: str, solver_list: list[list]) -> None: self.root_solver_dict[unique_name] = solver_list self.add_solver_to_curr_exp_list(unique_name) self.__update_problem_dropdown() @@ -1022,20 +947,12 @@ def add_solver_to_curr_exp_list(self, unique_name: str) -> None: def __initialize_quick_add(self) -> None: # Delete all existing children of the frame - for child in self.tk_frames[ - "ntbk.ps_adding.quick_add" - ].winfo_children(): + for child in self.tk_frames["ntbk.ps_adding.quick_add"].winfo_children(): child.destroy() # Configure the grid layout to expand properly - self.tk_frames["ntbk.ps_adding.quick_add"].grid_rowconfigure( - 2, weight=1 - ) - self.tk_frames["ntbk.ps_adding.quick_add"].grid_columnconfigure( - 0, weight=2 - ) - self.tk_frames["ntbk.ps_adding.quick_add"].grid_columnconfigure( - 3, weight=1 - ) + self.tk_frames["ntbk.ps_adding.quick_add"].grid_rowconfigure(2, weight=1) + self.tk_frames["ntbk.ps_adding.quick_add"].grid_columnconfigure(0, weight=2) + self.tk_frames["ntbk.ps_adding.quick_add"].grid_columnconfigure(3, weight=1) # Create labels for the title and the column headers title_text = "Select problems/solvers to be included in cross-design." @@ -1082,14 +999,10 @@ def __initialize_quick_add(self) -> None: self.tk_canvases["ntbk.ps_adding.quick_add.problems"].grid( row=2, column=0, sticky="nsew" ) - self.tk_scrollbars["ntbk.ps_adding.quick_add.problems_vert"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.quick_add"], - orient="vertical", - command=self.tk_canvases[ - "ntbk.ps_adding.quick_add.problems" - ].yview, - ) + self.tk_scrollbars["ntbk.ps_adding.quick_add.problems_vert"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.quick_add"], + orient="vertical", + command=self.tk_canvases["ntbk.ps_adding.quick_add.problems"].yview, ) self.tk_canvases["ntbk.ps_adding.quick_add.problems"].config( yscrollcommand=self.tk_scrollbars[ @@ -1099,14 +1012,10 @@ def __initialize_quick_add(self) -> None: self.tk_scrollbars["ntbk.ps_adding.quick_add.problems_vert"].grid( row=2, column=1, sticky="ns" ) - self.tk_scrollbars["ntbk.ps_adding.quick_add.problems_horiz"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.quick_add"], - orient="horizontal", - command=self.tk_canvases[ - "ntbk.ps_adding.quick_add.problems" - ].xview, - ) + self.tk_scrollbars["ntbk.ps_adding.quick_add.problems_horiz"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.quick_add"], + orient="horizontal", + command=self.tk_canvases["ntbk.ps_adding.quick_add.problems"].xview, ) self.tk_canvases["ntbk.ps_adding.quick_add.problems"].config( xscrollcommand=self.tk_scrollbars[ @@ -1123,14 +1032,10 @@ def __initialize_quick_add(self) -> None: self.tk_canvases["ntbk.ps_adding.quick_add.solvers"].grid( row=2, column=3, sticky="nsew" ) - self.tk_scrollbars["ntbk.ps_adding.quick_add.solvers_vert"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.quick_add"], - orient="vertical", - command=self.tk_canvases[ - "ntbk.ps_adding.quick_add.solvers" - ].yview, - ) + self.tk_scrollbars["ntbk.ps_adding.quick_add.solvers_vert"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.quick_add"], + orient="vertical", + command=self.tk_canvases["ntbk.ps_adding.quick_add.solvers"].yview, ) self.tk_canvases["ntbk.ps_adding.quick_add.solvers"].config( yscrollcommand=self.tk_scrollbars[ @@ -1140,14 +1045,10 @@ def __initialize_quick_add(self) -> None: self.tk_scrollbars["ntbk.ps_adding.quick_add.solvers_vert"].grid( row=2, column=4, sticky="ns" ) - self.tk_scrollbars["ntbk.ps_adding.quick_add.solvers_horiz"] = ( - ttk.Scrollbar( - self.tk_frames["ntbk.ps_adding.quick_add"], - orient="horizontal", - command=self.tk_canvases[ - "ntbk.ps_adding.quick_add.solvers" - ].xview, - ) + self.tk_scrollbars["ntbk.ps_adding.quick_add.solvers_horiz"] = ttk.Scrollbar( + self.tk_frames["ntbk.ps_adding.quick_add"], + orient="horizontal", + command=self.tk_canvases["ntbk.ps_adding.quick_add.solvers"].xview, ) self.tk_canvases["ntbk.ps_adding.quick_add.solvers"].config( xscrollcommand=self.tk_scrollbars[ @@ -1196,45 +1097,29 @@ def __initialize_quick_add(self) -> None: # ) # display all potential problems - problem_list = [ - f"{problem().name} - {key}" - for key, problem in problem_unabbreviated_directory.items() - ] - sorted_problems = sorted(problem_list) + sorted_problems = sorted(self.problem_full_name_to_class) for problem_name in sorted_problems: - row = self.tk_frames[ - "ntbk.ps_adding.quick_add.problems_frame" - ].grid_size()[1] - shortened_name = problem_name.split(" - ")[0] - tk_name = ( - f"ntbk.ps_adding.quick_add.problems_frame.{shortened_name}" - ) + row = self.tk_frames["ntbk.ps_adding.quick_add.problems_frame"].grid_size()[ + 1 + ] + shortened_name = problem_name.split(" ")[0] + tk_name = f"ntbk.ps_adding.quick_add.problems_frame.{shortened_name}" self.tk_var_bools[tk_name] = tk.BooleanVar() self.tk_checkbuttons[tk_name] = ttk.Checkbutton( - master=self.tk_frames[ - "ntbk.ps_adding.quick_add.problems_frame" - ], + master=self.tk_frames["ntbk.ps_adding.quick_add.problems_frame"], text=problem_name, variable=self.tk_var_bools[tk_name], command=self.cross_design_solver_compatibility, ) - self.tk_checkbuttons[tk_name].grid( - row=row, column=0, sticky="w", padx=10 - ) + self.tk_checkbuttons[tk_name].grid(row=row, column=0, sticky="w", padx=10) # display all potential solvers - solver_list = [ - f"{solver().name} - {key}" - for key, solver in solver_unabbreviated_directory.items() - ] - sorted_solvers = sorted(solver_list) + sorted_solvers = sorted(self.solver_full_name_to_class) for solver_name in sorted_solvers: - row = self.tk_frames[ - "ntbk.ps_adding.quick_add.solvers_frame" - ].grid_size()[1] - shortened_name = solver_name.split(" - ")[0] - tk_name = ( - f"ntbk.ps_adding.quick_add.problems_frame.{shortened_name}" - ) + row = self.tk_frames["ntbk.ps_adding.quick_add.solvers_frame"].grid_size()[ + 1 + ] + shortened_name = solver_name.split(" ")[0] + tk_name = f"ntbk.ps_adding.quick_add.problems_frame.{shortened_name}" self.tk_var_bools[tk_name] = tk.BooleanVar() self.tk_checkbuttons[tk_name] = ttk.Checkbutton( master=self.tk_frames["ntbk.ps_adding.quick_add.solvers_frame"], @@ -1242,9 +1127,7 @@ def __initialize_quick_add(self) -> None: variable=self.tk_var_bools[tk_name], command=self.cross_design_problem_compatibility, ) - self.tk_checkbuttons[tk_name].grid( - row=row, column=0, sticky="w", padx=10 - ) + self.tk_checkbuttons[tk_name].grid(row=row, column=0, sticky="w", padx=10) # Update the scroll region self.__update_quick_add_problems_scroll_region() self.__update_quick_add_solvers_scroll_region() @@ -1280,13 +1163,9 @@ def cross_design_problem_compatibility(self) -> None: solvers=temp_solvers, problems=temp_problem ) # temp experiment to run check compatibility error = temp_exp.check_compatibility() - dict_name = ( - f"ntbk.ps_adding.quick_add.problems_frame.{problem_name}" - ) - if error: - self.tk_checkbuttons[dict_name].configure(state="disabled") - else: - self.tk_checkbuttons[dict_name].configure(state="normal") + dict_name = f"ntbk.ps_adding.quick_add.problems_frame.{problem_name}" + state = "disabled" if error else "normal" + self.tk_checkbuttons[dict_name].configure(state=state) def cross_design_solver_compatibility(self) -> None: # If we don't have the tab open, return @@ -1317,10 +1196,8 @@ def cross_design_solver_compatibility(self) -> None: ) # temp experiment to run check compatibility error = temp_exp.check_compatibility() dict_name = f"ntbk.ps_adding.quick_add.problems_frame.{solver_name}" - if error: - self.tk_checkbuttons[dict_name].configure(state="disabled") - else: - self.tk_checkbuttons[dict_name].configure(state="normal") + state = "disabled" if error else "normal" + self.tk_checkbuttons[dict_name].configure(state=state) def create_cross_design(self) -> None: any_added = False @@ -1426,11 +1303,8 @@ def load_design(self) -> None: self.update() # Find the unabbreviated name and set the combobox for unabbreviated_name in problem_unabbreviated_directory: - if ( - problem_unabbreviated_directory[unabbreviated_name]().name - == name - ): - name = name + " - " + unabbreviated_name + if problem_unabbreviated_directory[unabbreviated_name]().name == name: + name = name + " -- " + unabbreviated_name break self.tk_comboboxes["ntbk.ps_adding.problem.select"].set(name) self.update() @@ -1442,11 +1316,8 @@ def load_design(self) -> None: self.update() # Find the unabbreviated name and set the combobox for unabbreviated_name in solver_unabbreviated_directory: - if ( - solver_unabbreviated_directory[unabbreviated_name]().name - == name - ): - name = name + " - " + unabbreviated_name + if solver_unabbreviated_directory[unabbreviated_name]().name == name: + name = name + " -- " + unabbreviated_name break self.tk_comboboxes["ntbk.ps_adding.solver.select"].set(name) self.update() @@ -1507,9 +1378,7 @@ def load_experiment(self) -> None: # If the name already exists, make the user change it if unique_name != loaded_name: msg = f"The experiment name '{loaded_name}' already exists." - msg += ( - f" Would you like to rename the experiment to '{unique_name}'?" - ) + msg += f" Would you like to rename the experiment to '{unique_name}'?" msg += "\n\nIf you select 'No', the experiment will not be added." response = messagebox.askyesno("Name Conflict", msg) if not response: @@ -1519,7 +1388,7 @@ def load_experiment(self) -> None: self.add_exp_row(unique_name, is_imported=True) def _destroy_widget_children(self, widget: tk.Widget) -> None: - """_Destroy all children of a widget._ + """_Destroy all children of a widget._. Args: widget (tk.Widget): _The widget whose children will be destroyed._ @@ -1533,22 +1402,15 @@ def __insert_factor_headers( frame: ttk.Frame, first_row: int = 0, ) -> int: - """Insert the headers for the factors into the frame. - - Parameters - ---------- - frame : tk.Frame - Frame to display factors. - factor_heading_list : list[str] - List of factor headings. - first_row : int, optional - First row to display factors. - - Returns - ------- - int - Index of the last row inserted. + """Insert the headers for the factors into the given frame. + Args: + frame (ttk.Frame): The frame to display factor headers in. + first_row (int, optional): The row index at which to start inserting + headers. Defaults to 0. + + Returns: + int: The index of the last row inserted. """ header_columns = [ "Factor Name", @@ -1582,26 +1444,21 @@ def __insert_factor_headers( def __insert_factors( self, frame: ttk.Frame, - factor_dict: "dict[str, DFFactor]", + factor_dict: dict[str, DFFactor], first_row: int = 2, ) -> int: - """Insert the factors into the frame. - - Parameters - ---------- - frame : ttk.Frame - Frame to display factors. - factors : dict[str, DFFactor] - Dictionary of factors. - first_row : int, optional - First row to display factors. - - Returns - ------- - int - Index of the last row displayed. - """ + """Insert the factors into the given frame. + Args: + frame (ttk.Frame): The frame to display the factors in. + factor_dict (dict[str, DFFactor]): Dictionary mapping factor names to + `DFFactor` objects. + first_row (int, optional): The row index at which to start inserting + factors. Defaults to 2. + + Returns: + int: The index of the last row displayed. + """ row_index = first_row # Loop through and add everything to the frame for factor_index, factor_name in enumerate(factor_dict): @@ -1612,9 +1469,7 @@ def __insert_factors( factor_obj = factor_dict[factor_name] # Make a list of functions that will return the widgets for each # column in the frame - column_functions: list[ - Callable[[ttk.Frame], Union[tk.Widget, None]] - ] = [ + column_functions: list[Callable[[ttk.Frame], tk.Widget | None]] = [ factor_obj.get_name_label, factor_obj.get_description_label, factor_obj.get_type_label, @@ -1683,9 +1538,7 @@ def _create_problem_factors_canvas(self, problem: Problem) -> None: def _create_solver_factors_canvas(self, solver: Solver) -> None: # Clear the canvas - self._destroy_widget_children( - self.tk_canvases["ntbk.ps_adding.solver.factors"] - ) + self._destroy_widget_children(self.tk_canvases["ntbk.ps_adding.solver.factors"]) # Initialize the frames and headers self.tk_frames["ntbk.ps_adding.solver.factors.solvers"] = ttk.Frame( @@ -1712,20 +1565,14 @@ def _create_solver_factors_canvas(self, solver: Solver) -> None: self.tk_entries["design_opts.name"].insert(0, unique_name) def __get_unique_name(self, dict_lookup: dict, base_name: str) -> str: - """Determine unique name from dictionary. + """Generate a unique name by appending a number to a base name if needed. - Parameters - ---------- - dict_lookup : dict - dictionary where you want to determine unique name from. - base_name : str - base name that you want appended to become unique. - - Returns - ------- - str - new unique name. + Args: + dict_lookup (dict): Dictionary to check existing names against. + base_name (str): Desired base name to make unique. + Returns: + str: A unique name not present in `dict_lookup`. """ if base_name in dict_lookup: # remove suffix from base_name if applicable @@ -1738,28 +1585,50 @@ def __get_unique_name(self, dict_lookup: dict, base_name: str) -> str: count += 1 test_name = f"{base_name}_{count!s}" return test_name - else: - return base_name + return base_name def get_unique_experiment_name(self, base_name: str) -> str: + """Generate a unique experiment name. + + Args: + base_name (str): Desired base name to make unique. + + Returns: + str: A unique name not present in `root_experiment_dict`. + """ return self.__get_unique_name(self.root_experiment_dict, base_name) def get_unique_problem_name(self, base_name: str) -> str: + """Generate a unique problem name. + + Args: + base_name (str): Desired base name to make unique. + + Returns: + str: A unique name not present in `root_problem_dict`. + """ return self.__get_unique_name(self.root_problem_dict, base_name) def get_unique_solver_name(self, base_name: str) -> str: + """Generate a unique solver name. + + Args: + base_name (str): Desired base name to make unique. + + Returns: + str: A unique name not present in `root_solver_dict`. + """ return self.__get_unique_name(self.root_solver_dict, base_name) def __show_data_farming_core( - self, base_object: Union[Solver, Problem], frame: ttk.Frame + self, base_object: Solver | Problem, frame: ttk.Frame ) -> None: """Show data farming options for a solver or problem. - Parameters - ---------- - base_object : Solver or Problem - Solver or Problem object. - + Args: + base_object (Solver | Problem): The solver or problem object to display + options for. + frame (ttk.Frame): The frame in which to display the data farming options. """ # Check if the base object is a Problem or Solver if not isinstance(base_object, (Problem, Solver)): @@ -1773,7 +1642,7 @@ def __show_data_farming_core( # specifications for the model if isinstance(base_object, Problem): model_specifications = base_object.model.specifications - for factor in model_specifications.keys(): + for factor in model_specifications: specifications[factor] = model_specifications[factor] # Convert the specifications to a dictionary of DFFactor objects self.factor_dict = spec_dict_to_df_dict(specifications) @@ -1839,7 +1708,7 @@ def __create_design_core(self, base_object: str) -> None: num_stacks = self.design_num_stacks.get() design_type = self.design_type.get() # Extract the name of the problem or solver from the dropdown box - base_name = base_dropdown.split(" - ")[0] + base_name = base_dropdown.split(" ")[0] """ Determine factors included in design """ # List of names of factors included in the design @@ -1942,17 +1811,36 @@ def _create_gen_design_frame( self.tk_buttons["gen_design.add"].grid() def create_solver_design(self) -> None: + """Create a design for the solver.""" self.__create_design_core("Solver") def create_problem_design(self) -> None: + """Create a design for the problem.""" self.__create_design_core("Problem") def display_design_tree( self, - csv_filename: Union[str, None] = None, - design_table: Union[pd.DataFrame, None] = None, - master_frame: Union[ttk.Frame, None] = None, + csv_filename: str | None = None, + design_table: pd.DataFrame | None = None, + master_frame: ttk.Frame | None = None, ) -> None: + """Display the design tree in the GUI. + + Displays a Treeview widget populated with design points from either a + provided CSV file or a DataFrame. Automatically handles formatting, + scrollbar setup, and label configuration. + + Args: + csv_filename (str | None): Optional path to a CSV file containing + the design. + design_table (pd.DataFrame | None): Optional DataFrame containing + the design data. + master_frame (ttk.Frame | None): Optional parent frame to render + the design tree in. Defaults to the general design display frame. + + Raises: + ValueError: If neither `csv_filename` nor `design_table` is provided. + """ if csv_filename is None and design_table is None: error_msg = "Either csv_filename or dataframe must be provided." raise ValueError(error_msg) @@ -2047,7 +1935,12 @@ def display_design_tree( ) def __read_in_generated_design(self) -> pd.DataFrame: - # Get the design table from the treeview + """Extract the design table from the current Treeview widget. + + Returns: + pd.DataFrame: A DataFrame representing the design as entered or displayed + in the Treeview. + """ design_table = pd.DataFrame(columns=self.design_tree["columns"]) for child in self.design_tree.get_children(): values = self.design_tree.item(child)["values"] @@ -2055,15 +1948,25 @@ def __read_in_generated_design(self) -> pd.DataFrame: return design_table def add_problem_design_to_experiment(self) -> None: + """Add a problem design (from the design tree) to the current experiment. + + Reads the current design table, converts it into a list of problem instances, + checks for name collisions, and updates the experiment with the new problem + design. + + Raises: + messagebox.showerror: If the design name is already in use. + """ design_name = self.design_name.get() if design_name in self.root_problem_dict: messagebox.showerror( "Error", - f"The design name {design_name} is already in use. Please choose a different name.", + f"The design name {design_name} is already in use. " + f"Please choose a different name.", ) return selected_name = self.selected_problem_name.get() - selected_name_short = selected_name.split(" - ")[0] + selected_name_short = selected_name.split(" ")[0] # Create the list of problems by reading the design table design_table = self.__read_in_generated_design() @@ -2087,15 +1990,25 @@ def add_problem_design_to_experiment(self) -> None: self._hide_gen_design() def add_solver_design_to_experiment(self) -> None: + """Add a solver design (from the design tree) to the current experiment. + + Reads the current design table, converts it into a list of solver instances, + checks for name collisions, and updates the experiment with the new solver + design. + + Raises: + messagebox.showerror: If the design name is already in use. + """ design_name = self.design_name.get() if design_name in self.root_solver_dict: messagebox.showerror( "Error", - f"The design name {design_name} is already in use. Please choose a different name.", + f"The design name {design_name} is already in use. " + f"Please choose a different name.", ) return selected_name = self.selected_solver_name.get() - selected_name_short = selected_name.split(" - ")[0] + selected_name_short = selected_name.split(" ")[0] # Create the list of problems by reading the design table design_table = self.__read_in_generated_design() @@ -2118,7 +2031,16 @@ def add_solver_design_to_experiment(self) -> None: # Hide the design tree self._hide_gen_design() - def __view_design(self, design_list: "list[list]") -> None: + def __view_design(self, design_list: list[list]) -> None: + """Display a design in the GUI from a list of design points. + + Converts a list of design dictionaries into a DataFrame, formats it + for display, and passes it to the design tree viewer. + + Args: + design_list (list[list]): A nested list where each item contains a + dictionary representing a design point. + """ # Create an empty dataframe to display the design tree column_names = list(design_list[0][0].keys()) num_rows = len(design_list) @@ -2134,16 +2056,33 @@ def __view_design(self, design_list: "list[list]") -> None: ) def view_problem_design(self, problem_save_name: str) -> None: + """Display a saved problem design in the design tree view. + + Args: + problem_save_name (str): The name associated with the saved problem design. + """ problem = self.root_problem_dict[problem_save_name] self.__view_design(problem) def view_solver_design(self, solver_save_name: str) -> None: + """Display a saved solver design in the design tree view. + + Args: + solver_save_name (str): The name associated with the saved solver design. + """ solver = self.root_solver_dict[solver_save_name] self.__view_design(solver) def __delete_from_current_experiment( self, root_dict: dict, list_name: str, save_name: str ) -> None: + """Delete a saved item from the current experiment and update the GUI. + + Args: + root_dict (dict): Dictionary containing saved designs (problems or solvers). + list_name (str): GUI key prefix for the display widgets. + save_name (str): The name of the item to delete. + """ # Delete from root dict del root_dict[save_name] # Delete from GUI @@ -2159,6 +2098,11 @@ def __delete_from_current_experiment( del self.tk_buttons[del_bttn_name] def delete_problem(self, problem_name: str) -> None: + """Delete a saved problem design from the current experiment. + + Args: + problem_name (str): The name of the problem design to delete. + """ self.__delete_from_current_experiment( self.root_problem_dict, "curr_exp.lists.problems", @@ -2170,6 +2114,11 @@ def delete_problem(self, problem_name: str) -> None: self.__update_solver_dropdown() def delete_solver(self, solver_name: str) -> None: + """Delete a saved solver design from the current experiment. + + Args: + solver_name (str): The name of the solver design to delete. + """ self.__delete_from_current_experiment( self.root_solver_dict, "curr_exp.lists.solvers", @@ -2195,9 +2144,7 @@ def create_experiment(self) -> None: # If the name already exists, make the user change it if unique_name != entered_name: msg = f"The experiment name '{entered_name}' already exists." - msg += ( - f" Would you like to rename the experiment to '{unique_name}'?" - ) + msg += f" Would you like to rename the experiment to '{unique_name}'?" msg += "\n\nIf you select 'No', the experiment will not be added." response = messagebox.askyesno("Name Conflict", msg) if not response: @@ -2311,20 +2258,16 @@ def __update_action_button( self, experiment_name: str, text: str, - command: Union[Callable, None] = None, + command: Callable | None = None, ) -> None: name_base: Final[str] = "exp." + experiment_name action_bttn_name: Final[str] = name_base + ".action" if command is None: self.tk_buttons[action_bttn_name].configure(text=text) else: - self.tk_buttons[action_bttn_name].configure( - text=text, command=command - ) + self.tk_buttons[action_bttn_name].configure(text=text, command=command) - def __update_experiment_label( - self, experiment_name: str, status: str - ) -> None: + def __update_experiment_label(self, experiment_name: str, status: str) -> None: name_base: Final[str] = "exp." + experiment_name lbl_name: Final[str] = name_base + ".name" text = f"{experiment_name}\n({status})" @@ -2352,9 +2295,7 @@ def __run_experiment_gui(self, experiment_name: str) -> None: # Enable the buttons self.__enable_exp_buttons(experiment_name) - def __run_experiment_gui_thread( - self, experiment_name: str - ) -> threading.Thread: + def __run_experiment_gui_thread(self, experiment_name: str) -> threading.Thread: return self.__spawn_new_thread( lambda: self.__run_experiment_gui(experiment_name) ) @@ -2381,12 +2322,8 @@ def __post_process_gui(self, experiment_name: str) -> None: # Enable the buttons self.__enable_exp_buttons(experiment_name) - def __post_process_gui_thread( - self, experiment_name: str - ) -> threading.Thread: - return self.__spawn_new_thread( - lambda: self.__post_process_gui(experiment_name) - ) + def __post_process_gui_thread(self, experiment_name: str) -> threading.Thread: + return self.__spawn_new_thread(lambda: self.__post_process_gui(experiment_name)) def __post_normalize_gui(self, experiment_name: str) -> None: # Setup @@ -2411,9 +2348,7 @@ def __post_normalize_gui(self, experiment_name: str) -> None: # Enable the buttons self.__enable_exp_buttons(experiment_name) - def __post_normalize_gui_thread( - self, experiment_name: str - ) -> threading.Thread: + def __post_normalize_gui_thread(self, experiment_name: str) -> threading.Thread: return self.__spawn_new_thread( lambda: self.__post_normalize_gui(experiment_name) ) @@ -2441,12 +2376,8 @@ def __log_results_gui(self, experiment_name: str) -> None: if not button.endswith(".action") and not button.endswith(".all"): self.tk_buttons[button].configure(state="normal") - def __log_results_gui_thread( - self, experiment_name: str - ) -> threading.Thread: - return self.__spawn_new_thread( - lambda: self.__log_results_gui(experiment_name) - ) + def __log_results_gui_thread(self, experiment_name: str) -> threading.Thread: + return self.__spawn_new_thread(lambda: self.__log_results_gui(experiment_name)) def __all_action_gui(self, experiment_name: str) -> None: # None of these steps do anything if they've already been done @@ -2455,16 +2386,10 @@ def __all_action_gui(self, experiment_name: str) -> None: self.__post_normalize_gui(experiment_name) self.__log_results_gui(experiment_name) - def __all_actions_gui_thread( - self, experiment_name: str - ) -> threading.Thread: - return self.__spawn_new_thread( - lambda: self.__all_action_gui(experiment_name) - ) + def __all_actions_gui_thread(self, experiment_name: str) -> threading.Thread: + return self.__spawn_new_thread(lambda: self.__all_action_gui(experiment_name)) - def add_exp_row( - self, experiment_name: str, is_imported: bool = False - ) -> None: + def add_exp_row(self, experiment_name: str, is_imported: bool = False) -> None: """Display experiment in list.""" list_frame = self.tk_frames["exps.list_canvas.list"] row_idx = list_frame.grid_size()[1] @@ -2503,10 +2428,7 @@ def add_exp_row( def view(experiment_name: str) -> None: # Check if there's an experiment in progress - if ( - len(self.root_problem_dict) > 0 - or len(self.root_solver_dict) > 0 - ): + if len(self.root_problem_dict) > 0 or len(self.root_solver_dict) > 0: messagebox.showerror( "Error", "Please clear the current experiment before viewing another.", @@ -2592,9 +2514,7 @@ def delete_experiment(experiment_name: str) -> None: self.tk_buttons[action_bttn_name] = ttk.Button( master=list_frame, text=bttn_text_run, - command=lambda name=experiment_name: self.__run_experiment_gui_thread( - name - ), + command=lambda name=experiment_name: self.__run_experiment_gui_thread(name), ) self.tk_buttons[action_bttn_name].grid( row=row_idx, column=1, padx=5, pady=5, sticky="nsew" @@ -2603,9 +2523,7 @@ def delete_experiment(experiment_name: str) -> None: self.tk_buttons[all_bttn_name] = ttk.Button( master=list_frame, text=bttn_text_run_all, - command=lambda name=experiment_name: self.__all_actions_gui_thread( - name - ), + command=lambda name=experiment_name: self.__all_actions_gui_thread(name), ) self.tk_buttons[all_bttn_name].grid( row=row_idx, column=2, padx=5, pady=5, sticky="nsew" @@ -2624,9 +2542,7 @@ def delete_experiment(experiment_name: str) -> None: self.tk_buttons[opt_bttn_name] = ttk.Button( master=list_frame, text="Options", - command=lambda name=experiment_name: self.open_post_processing_window( - name - ), + command=lambda name=experiment_name: self.open_post_processing_window(name), ) self.tk_buttons[opt_bttn_name].grid( row=row_idx, column=3, padx=5, pady=5, sticky="nsew" @@ -2696,9 +2612,7 @@ def open_defaults_window(self) -> None: self.title_label.grid(row=0, column=0, columnspan=2, sticky="ew") # Divider - self.divider = ttk.Separator( - master=self.main_frame, orient="horizontal" - ) + self.divider = ttk.Separator(master=self.main_frame, orient="horizontal") self.divider.grid(row=1, column=0, columnspan=2, padx=10, sticky="ew") # Macro replication number input @@ -2715,9 +2629,7 @@ def open_defaults_window(self) -> None: justify="center", ) self.macro_rep_label.grid(row=2, column=0, padx=10, pady=10, sticky="e") - self.macro_rep_entry.grid( - row=2, column=1, padx=10, pady=10, sticky="ew" - ) + self.macro_rep_entry.grid(row=2, column=1, padx=10, pady=10, sticky="ew") # Post replication number input self.post_rep_label = ttk.Label( @@ -2749,9 +2661,7 @@ def open_defaults_window(self) -> None: "yes", "no", ) - self.crn_budget_label.grid( - row=4, column=0, padx=10, pady=10, sticky="e" - ) + self.crn_budget_label.grid(row=4, column=0, padx=10, pady=10, sticky="e") self.crn_budget_opt.grid(row=4, column=1, padx=10, pady=10, sticky="ew") # CRN across macroreps @@ -2784,12 +2694,8 @@ def open_defaults_window(self) -> None: width=10, justify="center", ) - self.init_post_rep_label.grid( - row=6, column=0, padx=10, pady=10, sticky="e" - ) - self.init_post_rep_entry.grid( - row=6, column=1, padx=10, pady=10, sticky="ew" - ) + self.init_post_rep_label.grid(row=6, column=0, padx=10, pady=10, sticky="e") + self.init_post_rep_entry.grid(row=6, column=1, padx=10, pady=10, sticky="ew") # CRN across init solutions self.crn_init_label = ttk.Label( @@ -2819,12 +2725,8 @@ def open_defaults_window(self) -> None: justify="center", ) self.solve_tols_frame = ttk.Frame(master=self.main_frame) - self.solve_tols_label.grid( - row=7, column=0, padx=10, pady=10, sticky="e" - ) - self.solve_tols_frame.grid( - row=7, column=1, padx=5, pady=10, sticky="ew" - ) + self.solve_tols_label.grid(row=7, column=0, padx=10, pady=10, sticky="e") + self.solve_tols_frame.grid(row=7, column=1, padx=5, pady=10, sticky="ew") self.solve_tols_frame.columnconfigure(0, weight=1) self.solve_tols_frame.columnconfigure(1, weight=1) self.solve_tols_frame.columnconfigure(2, weight=1) @@ -2904,21 +2806,20 @@ def change_experiment_defaults(self) -> None: def _find_option_setting_bool( self, exp_name: str, - search_dict: "dict[str, tk.StringVar]", + search_dict: dict[str, tk.StringVar], default_val: bool, ) -> bool: if exp_name in search_dict: value = search_dict[exp_name].get() true_vals = ["yes", "true", "1"] - is_true = value.lower() in true_vals - return is_true + return value.lower() in true_vals return default_val # Functionally the same as the above function, but for integers def _find_option_setting_int( self, exp_name: str, - search_dict: "dict[str, tk.IntVar]", + search_dict: dict[str, tk.IntVar], default_val: int, ) -> int: if exp_name in search_dict: @@ -3180,9 +3081,7 @@ def post_normalize(self, experiment_name: str) -> None: crn = self.crn_init_default # run post normalization - experiment.post_normalize( - n_postreps_init_opt=reps, crn_across_init_opt=crn - ) + experiment.post_normalize(n_postreps_init_opt=reps, crn_across_init_opt=crn) def log_results(self, experiment_name: str) -> None: # get experiment object from master dict @@ -3298,14 +3197,10 @@ def open_plotting_window(self) -> None: self.plot_header_divider = ttk.Separator( master=self.title_frame, orient="horizontal" ) - self.plot_header_divider.grid( - row=2, column=0, sticky="nsew", padx=10, pady=10 - ) + self.plot_header_divider.grid(row=2, column=0, sticky="nsew", padx=10, pady=10) # experiment selection - self.plot_selection_frame = tk.Frame( - master=self.plot_main_frame, width=10 - ) + self.plot_selection_frame = tk.Frame(master=self.plot_main_frame, width=10) self.plot_selection_frame.grid_columnconfigure(0, weight=0) self.plot_selection_frame.grid_columnconfigure(1, weight=0) self.plot_selection_frame.grid_columnconfigure(3, weight=0) @@ -3313,9 +3208,7 @@ def open_plotting_window(self) -> None: self.plot_selection_frame.grid_rowconfigure(3, weight=1) self.plot_selection_frame.grid(row=1, column=0, sticky="nsew") - self.experiment_selection_frame = tk.Frame( - master=self.plot_selection_frame - ) + self.experiment_selection_frame = tk.Frame(master=self.plot_selection_frame) self.experiment_selection_frame.grid( row=0, column=0, columnspan=5, sticky="nsew" ) @@ -3326,9 +3219,7 @@ def open_plotting_window(self) -> None: justify="right", anchor="e", ) - self.experiment_selection_label.grid( - row=0, column=0, sticky="ew", padx=10 - ) + self.experiment_selection_label.grid(row=0, column=0, sticky="ew", padx=10) # find experiments that have been postnormalized postnorm_experiments = [] # list to hold names of all experiments that have been postnormalized for exp_name in self.root_experiment_dict: @@ -3358,9 +3249,7 @@ def open_plotting_window(self) -> None: text="Solver Selection", anchor="center", ) - self.select_plot_solvers_label.grid( - row=2, column=0, sticky="ew", columnspan=2 - ) + self.select_plot_solvers_label.grid(row=2, column=0, sticky="ew", columnspan=2) # solver selection (treeview) self.solver_tree_frame = tk.Frame( @@ -3375,9 +3264,7 @@ def open_plotting_window(self) -> None: self.solver_tree = ttk.Treeview(master=self.solver_tree_frame) self.solver_tree.grid(row=0, column=0, sticky="nsew") self.style = ttk.Style() - self.style.configure( - "Treeview.Heading", font=nametofont("TkHeadingFont") - ) + self.style.configure("Treeview.Heading", font=nametofont("TkHeadingFont")) self.style.configure( "Treeview", foreground="black", font=nametofont("TkDefaultFont") ) @@ -3425,9 +3312,7 @@ def open_plotting_window(self) -> None: text="Problem Selection", anchor="center", ) - self.select_plot_problems_label.grid( - row=2, column=3, sticky="ew", columnspan=2 - ) + self.select_plot_problems_label.grid(row=2, column=3, sticky="ew", columnspan=2) # problem selection (treeview) self.problem_tree_frame = tk.Frame( @@ -3442,9 +3327,7 @@ def open_plotting_window(self) -> None: self.problem_tree = ttk.Treeview(master=self.problem_tree_frame) self.problem_tree.grid(row=0, column=0, sticky="nsew") self.style = ttk.Style() - self.style.configure( - "Treeview.Heading", font=nametofont("TkHeadingFont") - ) + self.style.configure("Treeview.Heading", font=nametofont("TkHeadingFont")) self.style.configure( "Treeview", foreground="black", font=nametofont("TkDefaultFont") ) @@ -3501,9 +3384,7 @@ def open_plotting_window(self) -> None: self.experiment_plotting_divider = ttk.Separator( master=self.plot_main_frame, orient="vertical" ) - self.experiment_plotting_divider.grid( - row=1, column=1, sticky="ns", padx=10 - ) + self.experiment_plotting_divider.grid(row=1, column=1, sticky="ns", padx=10) # plot options self.plot_options_frame.grid(row=1, column=2, sticky="nsew") @@ -3538,9 +3419,7 @@ def open_plotting_window(self) -> None: ) # blank plotting workspace - self.plotting_workspace_frame.grid( - row=3, column=0, columnspan=3, sticky="nsew" - ) + self.plotting_workspace_frame.grid(row=3, column=0, columnspan=3, sticky="nsew") self.plotting_workspace_frame.grid_rowconfigure(1, weight=1) self.plotting_workspace_frame.grid_columnconfigure(0, weight=1) self.workspace_label = ttk.Label( @@ -3576,9 +3455,7 @@ def open_plotting_window(self) -> None: # loaded plots tab self.loaded_plots_frame = ttk.Frame(self.plot_notebook) - self.plot_notebook.add( - self.loaded_plots_frame, text="Loaded Plots & Copies" - ) + self.plot_notebook.add(self.loaded_plots_frame, text="Loaded Plots & Copies") self.select_header = ttk.Label( master=self.loaded_plots_frame, @@ -3634,9 +3511,7 @@ def refresh_experiments(self) -> None: self.update_plot_menu(postnorm_experiments[0]) def update_plot_window_scroll(self, event: tk.Event) -> None: - self.plotting_canvas.configure( - scrollregion=self.plotting_canvas.bbox("all") - ) + self.plotting_canvas.configure(scrollregion=self.plotting_canvas.bbox("all")) def update_plot_menu(self, tk_experiment_name: tk.StringVar) -> None: # If we somehow get a string instead of a variable, just use the string @@ -3647,25 +3522,21 @@ def update_plot_menu(self, tk_experiment_name: tk.StringVar) -> None: # Set the dropdown to the selected experiment self.experiment_var.set(experiment_name) - self.plot_solver_options = [ - "All" - ] # holds names of potential solvers to plot - self.plot_problem_options = [ - "All" - ] # holds names of potential problems to plot + self.plot_solver_options = ["All"] # holds names of potential solvers to plot + self.plot_problem_options = ["All"] # holds names of potential problems to plot self.plot_experiment = self.root_experiment_dict[experiment_name] solver_factor_set = set() # holds names of solver factors problem_factor_set = set() # holds names of problem factors for solver in self.plot_experiment.solvers: self.plot_solver_options.append(solver.name) - for factor in solver.factors.keys(): + for factor in solver.factors: solver_factor_set.add(factor) # append factor names to list for problem in self.plot_experiment.problems: self.plot_problem_options.append(problem.name) - for factor in problem.factors.keys(): + for factor in problem.factors: problem_factor_set.add(factor) - for factor in problem.model.factors.keys(): + for factor in problem.model.factors: problem_factor_set.add(factor) # determine if all solvers in experiment have the same factor options @@ -3692,13 +3563,11 @@ def update_plot_menu(self, tk_experiment_name: tk.StringVar) -> None: "Solver Name", *list(self.plot_experiment.solvers[0].factors.keys()), ] - self.solver_tree["columns"] = ( - columns # set column names to factor names - ) + self.solver_tree["columns"] = columns # set column names to factor names self.solver_tree.heading( "Solver Name", text="Solver Name" ) # set heading for name column - for factor in self.plot_experiment.solvers[0].factors.keys(): + for factor in self.plot_experiment.solvers[0].factors: self.solver_tree.heading( factor, text=factor ) # set column header text to factor names @@ -3725,13 +3594,11 @@ def update_plot_menu(self, tk_experiment_name: tk.StringVar) -> None: self.problem_tree.heading("#0", text="#") self.problem_tree.column("#0", width=75) if self.all_same_problem: - factors = list( - self.plot_experiment.problems[0].factors.keys() - ) + list(self.plot_experiment.problems[0].model.factors.keys()) - columns = ["Problem Name", *factors] - self.problem_tree["columns"] = ( - columns # set column names to factor names + factors = list(self.plot_experiment.problems[0].factors.keys()) + list( + self.plot_experiment.problems[0].model.factors.keys() ) + columns = ["Problem Name", *factors] + self.problem_tree["columns"] = columns # set column names to factor names self.problem_tree.heading( "Problem Name", text="Problem Name" ) # set heading for name column @@ -3927,7 +3794,9 @@ def show_plot_options(self, plot_type_tk: tk.StringVar) -> None: if plot_type == "Solvability CDF": # plot description - description = "Plot the solvability cdf for one or more solvers on a single problem." + description = ( + "Plot the solvability cdf for one or more solvers on a single problem." + ) self.plot_description = ttk.Label( master=self.more_options_frame, text=description, @@ -4489,7 +4358,9 @@ def deselect_all_problems(self) -> None: def select_solver( self, _: tk.Event - ) -> None: # upddates solver list and options menu for reference solver when relevant + ) -> ( + None + ): # upddates solver list and options menu for reference solver when relevant selected_items = self.solver_tree.selection() self.selected_solvers = [] for item in selected_items: @@ -4518,9 +4389,7 @@ def update_ref_solver(self) -> None: ) # save previously selected reference solver if len(self.selected_solvers) != 0: solver_options = [] - for ( - solver - ) in self.selected_solvers: # append solver names to options list + for solver in self.selected_solvers: # append solver names to options list solver_options.append(solver.name) if ( saved_solver not in solver_options @@ -4545,7 +4414,7 @@ def update_ref_solver(self) -> None: ]: # disable if not correct plot type self.ref_solver_menu.configure(state="disabled") - def __get_plot_experiment_sublist(self) -> "list[list[ProblemSolver]]": + def __get_plot_experiment_sublist(self) -> list[list[ProblemSolver]]: # get selected solvers & problems exp_sublist = [] # sublist of experiments to be plotted (each index represents a group of problems over a single solver) for solver in self.selected_solvers: @@ -4565,10 +4434,7 @@ def __plot_progress_curve(self) -> None: n_problems = len(exp_sublist[0]) all_str = self.all_var.get() all_in = all_str.lower() == "yes" - if all_in: - legend = self.legend_var.get() - else: - legend = None + legend = self.legend_var.get() if all_in else None ext = self.ext_var.get() solver_set_name = self.solver_set_var.get() # get user input @@ -4641,10 +4507,7 @@ def __plot_solvability_cdf(self) -> None: all_str = self.all_var.get() all_in = all_str.lower() == "yes" # only get legend location if all in one is selected - if all_in: - legend = self.legend_var.get() - else: - legend = None + legend = self.legend_var.get() if all_in else None ext = self.ext_var.get() solver_set_name = self.solver_set_var.get() solve_tol = float(self.solve_tol_var.get()) @@ -4707,9 +4570,7 @@ def __plot_area_scatterplot(self) -> None: # Ensure that the number of selected solvers is less than or equal to 7 num_selected_solvers = len(self.selected_solvers) if num_selected_solvers > 7 and all_in: - error_msg = ( - "Area scatter plot can plot at most 7 solvers at one time." - ) + error_msg = "Area scatter plot can plot at most 7 solvers at one time." error_msg += " Please select fewer solvers and plot again." messagebox.showerror("Error", error_msg) return @@ -4825,10 +4686,7 @@ def __plot_terminal_scatterplot(self) -> None: all_str = self.all_var.get() all_in = all_str.lower() == "yes" # only get legend location if all in one is selected - if all_in: - legend = self.legend_var.get() - else: - legend = None + legend = self.legend_var.get() if all_in else None ext = self.ext_var.get() solver_set_name = self.solver_set_var.get() problem_set_name = self.problem_set_var.get() @@ -4870,10 +4728,7 @@ def __plot_solvability_profile(self) -> None: all_str = self.all_var.get() all_in = all_str.lower() == "yes" # only get legend location if all in one is selected - if all_in: - legend = self.legend_var.get() - else: - legend = None + legend = self.legend_var.get() if all_in else None ext = self.ext_var.get() solver_set_name = self.solver_set_var.get() problem_set_name = self.problem_set_var.get() @@ -4983,7 +4838,7 @@ def plot(self) -> None: error_msg = "Please select problems to plot." messagebox.showerror("Error", error_msg) return - elif len(self.selected_solvers) == 0: + if len(self.selected_solvers) == 0: error_msg = "Please select solvers to plot." messagebox.showerror("Error", error_msg) return @@ -4999,30 +4854,25 @@ def plot(self) -> None: # Ensure that the selected plot type is valid if self.plot_type not in plot_types: - error_msg = ( - "Invalid plot type selected. Please select a valid plot type." - ) + error_msg = "Invalid plot type selected. Please select a valid plot type." messagebox.showerror("Error", error_msg) return - else: - # Call the appropriate plot function - plot_types[self.plot_type]() + # Call the appropriate plot function + plot_types[self.plot_type]() def add_plot_to_notebook( self, - file_paths: "list[str]", - solver_names: "list[str]", - problem_names: "list[str]", - parameters: Union[dict, None] = None, + file_paths: list[str], + solver_names: list[str], + problem_names: list[str], + parameters: dict | None = None, ) -> None: # add new tab for exp if applicable exp_name = self.experiment_var.get() if exp_name not in self.experiment_tabs: tab_frame = tk.Frame(self.plot_notebook) self.plot_notebook.add(tab_frame, text=exp_name) - self.experiment_tabs[exp_name] = ( - tab_frame # save tab frame to dictionary - ) + self.experiment_tabs[exp_name] = tab_frame # save tab frame to dictionary # set up tab first time it is created select_header = ttk.Label( @@ -5091,9 +4941,7 @@ def add_plot_to_notebook( for index, file_path in enumerate(file_paths): row = tab_frame.grid_size()[1] self.plot_check_var = tk.BooleanVar() - check = tk.Checkbutton( - master=tab_frame, variable=self.plot_check_var - ) + check = tk.Checkbutton(master=tab_frame, variable=self.plot_check_var) check.grid(row=row, column=0, padx=5) self.plot_check_vars[file_path] = self.plot_check_var solver_label = ttk.Label( @@ -5131,9 +4979,9 @@ def add_plot_to_notebook( del_button = ttk.Button( master=tab_frame, text="Delete", - command=lambda r=row, - frame=tab_frame, - fp=file_path: self.delete_plot(r, frame, fp), + command=lambda r=row, frame=tab_frame, fp=file_path: self.delete_plot( + r, frame, fp + ), ) del_button.grid(row=row, column=7, pady=10) @@ -5143,15 +4991,13 @@ def add_plot_to_notebook( self.plot_notebook.select(index) def delete_plot( - self, row: int, frame: tk.Frame, file_path: Union[os.PathLike, str] + self, row: int, frame: tk.Frame, file_path: os.PathLike | str ) -> None: for widget in frame.winfo_children(): # remove plot from list display info = widget.grid_info() if info["row"] == row: widget.destroy() - del self.plot_check_vars[ - file_path - ] # remove check variable from dictionary + del self.plot_check_vars[file_path] # remove check variable from dictionary def load_plot(self) -> None: # ask user for pickle file location @@ -5217,13 +5063,11 @@ def load_plot(self) -> None: self.plot_notebook.select(0) def view_plot( - self, file_path: Union[os.PathLike, str] + self, file_path: os.PathLike | str ) -> None: # this window also allows for the editing of individual plots by accessing the created pickle file # create new window self.view_single_window = tk.Toplevel(self) - self.view_single_window.title( - "Simopt Graphical User Interface - View Plot" - ) + self.view_single_window.title("Simopt Graphical User Interface - View Plot") self.view_single_window.geometry("800x500") # self.view_single_frame = tk.Frame(self.view_single_window) @@ -5342,37 +5186,41 @@ def view_plot( self.edit_title_button = tk.Button( master=self.edit_frame, text="Edit Plot Title", - command=lambda frame=self.image_frame, - fp=file_path: self.edit_plot_title(fp, frame), + command=lambda frame=self.image_frame, fp=file_path: self.edit_plot_title( + fp, frame + ), ) self.edit_title_button.grid(row=0, column=0, padx=10, pady=10) self.edit_axes_button = tk.Button( master=self.edit_frame, text="Edit Plot Axes", - command=lambda frame=self.image_frame, - fp=file_path: self.edit_plot_x_axis(fp, frame), + command=lambda frame=self.image_frame, fp=file_path: self.edit_plot_x_axis( + fp, frame + ), ) self.edit_axes_button.grid(row=1, column=0, padx=10, pady=10) self.edit_text_button = tk.Button( master=self.edit_frame, text="Edit Plot Caption", - command=lambda frame=self.image_frame, - fp=file_path: self.edit_plot_text(fp, frame), + command=lambda frame=self.image_frame, fp=file_path: self.edit_plot_text( + fp, frame + ), ) self.edit_text_button.grid(row=2, column=0) self.edit_image_button = tk.Button( master=self.edit_frame, text="Edit Image File", - command=lambda frame=self.image_frame, - fp=file_path: self.edit_plot_image(fp, frame), + command=lambda frame=self.image_frame, fp=file_path: self.edit_plot_image( + fp, frame + ), ) self.edit_image_button.grid(row=3, column=0, pady=10) def save_plot_changes( self, fig: plt.Figure, - pickle_path: Union[str, os.PathLike], - file_path: Union[str, os.PathLike], + pickle_path: str | os.PathLike, + file_path: str | os.PathLike, image_frame: tk.Frame, copy: bool = False, ) -> None: @@ -5443,7 +5291,7 @@ def save_plot_changes( self.plot_notebook.select(0) def edit_plot_title( - self, file_path: Union[os.PathLike, str], image_frame: tk.Frame + self, file_path: os.PathLike | str, image_frame: tk.Frame ) -> None: # create new window self.edit_title_window = tk.Toplevel(self) @@ -5608,8 +5456,8 @@ def edit_plot_title( def save_title_changes( self, fig: plt.figure, - pickle_path: Union[str, os.PathLike], - file_path: Union[str, os.PathLike], + pickle_path: str | os.PathLike, + file_path: str | os.PathLike, image_frame: tk.Frame, copy: bool = False, ) -> None: @@ -5644,9 +5492,7 @@ def save_title_changes( ]: # remove old title from all alignments ax.set_title("", loc=align) - ax.set_title( - f"{title_text}", **font_specs, position=title_pos, loc=alignment - ) + ax.set_title(f"{title_text}", **font_specs, position=title_pos, loc=alignment) self.save_plot_changes( fig, pickle_path, file_path, image_frame, copy @@ -5654,7 +5500,7 @@ def save_title_changes( self.edit_title_window.destroy() # close editing window def edit_plot_x_axis( - self, file_path: Union[str, os.PathLike], image_frame: tk.Frame + self, file_path: str | os.PathLike, image_frame: tk.Frame ) -> None: # actualy edits both axes # create new window self.edit_x_axis_window = tk.Toplevel(self) @@ -5676,7 +5522,7 @@ def edit_plot_x_axis( "Select Axis", *["X-Axis", "Y-Axis"], command=lambda axis: self.show_axis_options( - axis, file_path, image_frame + str(axis), file_path, image_frame ), ) self.select_axis_menu.grid(row=0, column=1) @@ -5687,7 +5533,7 @@ def edit_plot_x_axis( def show_axis_options( self, axis: Literal["X-Axis", "Y-Axis"], - file_path: Union[str, os.PathLike], + file_path: str | os.PathLike, image_frame: tk.Frame, ) -> None: self._destroy_widget_children(self.edit_x_axis_frame) @@ -5733,10 +5579,7 @@ def show_axis_options( axis_display = "Y" align_options = ["top", "center", "bottom"] # get spacing between ticks - if len(tick_pos) > 1: - space = tick_pos[1] - tick_pos[0] - else: - space = "none" + space = tick_pos[1] - tick_pos[0] if len(tick_pos) > 1 else "none" # display current information in entry widgets self.x_title_label = ttk.Label( @@ -5918,8 +5761,8 @@ def show_axis_options( def save_x_axis_changes( self, fig: plt.figure, - pickle_path: Union[str, os.PathLike], - file_path: Union[str, os.PathLike], + pickle_path: str | os.PathLike, + file_path: str | os.PathLike, image_frame: tk.Frame, axis: Literal["X-Axis", "Y-Axis"], copy: bool = False, @@ -5991,7 +5834,7 @@ def save_x_axis_changes( self.edit_x_axis_window.destroy() def edit_plot_text( - self, file_path: Union[str, os.PathLike], image_frame: tk.Frame + self, file_path: str | os.PathLike, image_frame: tk.Frame ) -> None: # create new window self.edit_text_window = tk.Toplevel(self) @@ -6286,8 +6129,8 @@ def edit_plot_text( def save_text_changes( self, fig: plt.figure, - pickle_path: Union[str, os.PathLike], - file_path: Union[str, os.PathLike], + pickle_path: str | os.PathLike, + file_path: str | os.PathLike, image_frame: tk.Frame, text: Text, copy: bool = False, @@ -6338,7 +6181,7 @@ def save_text_changes( self.edit_text_window.destroy() def edit_plot_image( - self, file_path: Union[str, os.PathLike], image_frame: tk.Frame + self, file_path: str | os.PathLike, image_frame: tk.Frame ) -> None: # create new window self.edit_image_window = tk.Toplevel(self) @@ -6400,8 +6243,8 @@ def edit_plot_image( def save_image_changes( self, fig: plt.figure, - pickle_path: Union[str, os.PathLike], - file_path: Union[str, os.PathLike], + pickle_path: str | os.PathLike, + file_path: str | os.PathLike, image_frame: tk.Frame, copy: bool = False, ) -> None: @@ -6434,9 +6277,7 @@ def save_image_changes( extended_path_name = f"{path_name} ({counter}){ext}" new_path_name = f"{path_name} ({counter})" # use for pickle counter += 1 - plt.savefig( - extended_path_name, bbox_inches="tight", dpi=dpi - ) # save image + plt.savefig(extended_path_name, bbox_inches="tight", dpi=dpi) # save image # save pickle with new name pickle_file = new_path_name + ".pkl" with open(pickle_file, "wb") as f: @@ -6524,21 +6365,15 @@ def view_all_plots(self) -> None: ) # Bind the configure event to update the scroll region - self.view_all_frame.bind( - "", self.update_view_all_window_scroll - ) + self.view_all_frame.bind("", self.update_view_all_window_scroll) # open plot images row = 0 col = 0 - for ( - image_path - ) in self.plot_check_vars: # get file path of all created plots + for image_path in self.plot_check_vars: # get file path of all created plots plot_image = Image.open(image_path) plot_photo = ImageTk.PhotoImage(plot_image) - plot_display = ttk.Label( - master=self.view_all_frame, image=plot_photo - ) + plot_display = ttk.Label(master=self.view_all_frame, image=plot_photo) plot_display.image = plot_photo plot_display.grid(row=row, column=col, padx=10, pady=10) col += 1 @@ -6601,9 +6436,7 @@ def view_selected_plots(self) -> None: # create master frame inside the canvas self.view_frame = tk.Frame(self.view_canvas) - self.view_canvas.create_window( - (0, 0), window=self.view_frame, anchor="nw" - ) + self.view_canvas.create_window((0, 0), window=self.view_frame, anchor="nw") # Bind the configure event to update the scroll region self.view_frame.bind("", self.update_view_window_scroll) @@ -6614,9 +6447,7 @@ def view_selected_plots(self) -> None: for image_path in selected_plots: plot_image = Image.open(image_path) plot_photo = ImageTk.PhotoImage(plot_image) - plot_display = ttk.Label( - master=self.view_frame, image=plot_photo - ) + plot_display = ttk.Label(master=self.view_frame, image=plot_photo) plot_display.image = plot_photo plot_display.grid(row=row, column=col, padx=10, pady=10) col += 1 @@ -6628,9 +6459,7 @@ def update_view_window_scroll(self, event: tk.Event) -> None: self.view_canvas.configure(scrollregion=self.view_canvas.bbox("all")) def update_view_all_window_scroll(self, event: tk.Event) -> None: - self.view_all_canvas.configure( - scrollregion=self.view_all_canvas.bbox("all") - ) + self.view_all_canvas.configure(scrollregion=self.view_all_canvas.bbox("all")) def update_view_single_window_scroll(self, event: tk.Event) -> None: self.view_single_canvas.configure( diff --git a/simopt/gui/plot_window.py b/simopt/gui/plot_window.py index db501a141..7925a78e2 100644 --- a/simopt/gui/plot_window.py +++ b/simopt/gui/plot_window.py @@ -1,18 +1,19 @@ +from __future__ import annotations + +import logging import os import tkinter as tk from functools import partial from tkinter import Listbox, Scrollbar, ttk from tkinter.constants import MULTIPLE from tkinter.font import nametofont -from typing import Literal, Union +from typing import Literal from PIL import Image, ImageTk -from simopt.directory import ( - problem_unabbreviated_directory, - solver_unabbreviated_directory, -) +import simopt.directory as directory from simopt.experiment_base import ( + PlotType, ProblemSolver, plot_area_scatterplots, plot_progress_curves, @@ -23,41 +24,28 @@ ) from simopt.gui.toplevel_custom import Toplevel +problem_unabbreviated_directory = directory.problem_unabbreviated_directory +solver_unabbreviated_directory = directory.solver_unabbreviated_directory -class PlotWindow(Toplevel): - """Plot Window Page of the GUI. - - Arguments: - --------- - master : tk.Tk - Tkinter window created from Experiment_Window.run_single_function - myexperiment : object(Experiment) - Experiment object created in Experiment_Window.run_single_function - experiment_list : list - List of experiment object arguments - """ +class PlotWindow(Toplevel): + """Plot Window Page of the GUI.""" def __init__( self, root: tk.Tk, main_window: tk.Tk, experiment_list: list, - meta_list: Union[list[ProblemSolver], None] = None, + meta_list: list[ProblemSolver] | None = None, ) -> None: - """Initialize the Plot_Window class. - - Parameters - ---------- - root : tk.Tk - The root window of the application. - main_window : tk.Tk - The main window of the application. - experiment_list : list, optional - List of experiment object arguments, by default None. - meta_list : object, optional - MetaList object, by default None. - + """Initialize the PlotWindow class. + + Args: + root (tk.Tk): The root window of the application. + main_window (tk.Tk): The main window of the application. + experiment_list (list): List of experiment objects. + meta_list (list[ProblemSolver] | None, optional): List of `ProblemSolver` + objects used for meta-plotting. Defaults to None. """ super().__init__(root, title="SimOpt GUI - Plotting Page") self.center_window(0.8) # 80% scaling @@ -151,7 +139,10 @@ def __init__( self.instruction_label = tk.Label( master=self, # window label is used in - text="Welcome to the Plotting Page of SimOpt \n Select Problems and Solvers to Plot", + text=( + "Welcome to the Plotting Page of SimOpt\n" + "Select Problems and Solvers to Plot" + ), justify="center", ) @@ -166,10 +157,17 @@ def __init__( # from experiments.inputs.all_factors.py: self.problem_list = problem_unabbreviated_directory - # stays the same, has to change into a special type of variable via tkinter function + # stays the same, has to change into a special type of variable via tkinter + # function self.problem_var = tk.StringVar(master=self) - # self.problem_menu = tk.Listbox(self, self.problem_var, "Problem", *self.all_problems, command=self.experiment_list[0].problem.name) + # self.problem_menu = tk.Listbox( + # self, + # self.problem_var, + # "Problem", + # *self.all_problems, + # command=self.experiment_list[0].problem.name, + # ) self.plot_menu = ttk.OptionMenu( self, self.plot_var, @@ -184,7 +182,8 @@ def __init__( # from experiments.inputs.all_factors.py: self.solver_list = solver_unabbreviated_directory - # stays the same, has to change into a special type of variable via tkinter function + # stays the same, has to change into a special type of variable via tkinter + # function self.solver_var = tk.StringVar(master=self) self.add_button = ttk.Button( @@ -205,13 +204,9 @@ def __init__( master=self, text="Plotting Workspace", style="Bold.TLabel" ) - self.queue_label_frame = ttk.LabelFrame( - master=self, labelwidget=workspace_lbl - ) + self.queue_label_frame = ttk.LabelFrame(master=self, labelwidget=workspace_lbl) - self.queue_canvas = tk.Canvas( - master=self.queue_label_frame, borderwidth=0 - ) + self.queue_canvas = tk.Canvas(master=self.queue_label_frame, borderwidth=0) self.queue_frame = ttk.Frame(master=self.queue_canvas) self.vert_scroll_bar = Scrollbar( @@ -263,9 +258,7 @@ def __init__( text=heading, font=nametofont("TkHeadingFont"), ) - label.grid( - row=0, column=self.heading_list.index(heading), padx=10, pady=3 - ) + label.grid(row=0, column=self.heading_list.index(heading), padx=10, pady=3) self.instruction_label.place(relx=0.3, y=0) @@ -286,9 +279,7 @@ def __init__( self.post_normal_all_button.place(relx=0.01, rely=0.92) # self.queue_label_frame.place(x=10, rely=.7, relheight=.3, relwidth=1) - self.queue_label_frame.place( - x=10, rely=0.56, relheight=0.35, relwidth=0.99 - ) + self.queue_label_frame.place(x=10, rely=0.56, relheight=0.35, relwidth=0.99) self.param_label = [] self.param_entry = [] @@ -305,9 +296,7 @@ def __init__( (0, 0), window=self.CI_frame, anchor="nw", tags="self.queue_frame" ) - self.CI_label_frame.place( - relx=0.4, rely=0.15, relheight=0.2, relwidth=0.3 - ) + self.CI_label_frame.place(relx=0.4, rely=0.15, relheight=0.2, relwidth=0.3) self.settings_label_frame = ttk.LabelFrame( master=self, text="Error Estimation Setting and Parameters" @@ -329,35 +318,12 @@ def __init__( relx=0.65, rely=0.15, relheight=0.2, relwidth=0.3 ) - """ - # Confidence Interval Checkbox - entry1 = tk.Checkbutton(self.settings_canvas, variable=self.params[0], onvalue=True, offvalue=False) - entry1.select() - # entry1 = ttk.OptionMenu(self.settings_canvas, self.params[0], "True", *tf_list) - label1 = tk.Label(master=self.settings_canvas, text="Confidence Intervals", font=f"{TEXT_FAMILY} 14") - label1.grid(row=0, column=0, padx=10, pady=3) - entry1.grid(row=0, column=1, padx=10, pady=3) - - # Plot Together Checkbox - entry = tk.Checkbutton(self.settings_canvas, variable=self.params[1], onvalue=True, offvalue=False) - entry.select() - # Creates the Check Mark that checks whether the plots will be plot together - label = tk.Label(master=self.settings_canvas, text="Plot Together", font=f"{TEXT_FAMILY} 14") - label.grid(row=1, column=0, padx=10, pady=3) - entry.grid(row=1, column=1, padx=10, pady=3) - - entry2 = tk.Checkbutton(self.settings_canvas, variable=self.params[2], onvalue=True, offvalue=False) - entry2.select() - label2 = tk.Label(master=self.settings_canvas, text="Print Max HW", font=f"{TEXT_FAMILY} 14") - label2.grid(row=2, column=0, padx=10, pady=3) - entry2.grid(row=2, column=1, padx=10, pady=3) - """ - def add_plot(self) -> None: self.plot_exp_list = [] solver_lst = "" - # Appends experiment that is part of the experiment list if it matches what was chosen in the solver menu + # Appends experiment that is part of the experiment list if it matches what was + # chosen in the solver menu for i in self.solver_menu.curselection(): solver_lst = solver_lst + self.solver_menu.get(i) + " " for j in self.problem_menu.curselection(): @@ -387,7 +353,7 @@ def add_plot(self) -> None: ) self.bad_label.place(relx=0.45, rely=0.5) return - elif self.bad_label is not None: + if self.bad_label is not None: self.bad_label.destroy() self.bad_label = None @@ -416,7 +382,7 @@ def add_plot(self) -> None: if self.plot_type_list[-1] == "All Progress Curves": path_name = plot_progress_curves( exp_list, - plot_type="all", + plot_type=PlotType.ALL, normalize=bool(param_value_list[1]), all_in_one=bool(param_value_list[0]), ) @@ -424,7 +390,7 @@ def add_plot(self) -> None: if self.plot_type_list[-1] == "Mean Progress Curve": path_name = plot_progress_curves( exp_list, - plot_type="mean", + plot_type=PlotType.MEAN, normalize=bool(param_value_list[3]), all_in_one=bool(param_value_list[1]), plot_conf_ints=bool(param_value_list[0]), @@ -442,7 +408,7 @@ def add_plot(self) -> None: elif self.plot_type_list[-1] == "Quantile Progress Curve": path_name = plot_progress_curves( exp_list, - plot_type="quantile", + plot_type=PlotType.QUANTILE, beta=param_value_list[3], normalize=bool(param_value_list[4]), plot_conf_ints=bool(param_value_list[0]), @@ -492,7 +458,7 @@ def add_plot(self) -> None: elif self.plot_type_list[-1] == "CDF Solvability": path_name = plot_solvability_profiles( list_exp_list, - plot_type="cdf_solvability", + plot_type=PlotType.CDF_SOLVABILITY, plot_conf_ints=bool(param_value_list[0]), print_max_hw=bool(param_value_list[1]), solve_tol=param_value_list[2], @@ -510,7 +476,7 @@ def add_plot(self) -> None: elif self.plot_type_list[-1] == "Quantile Solvability": path_name = plot_solvability_profiles( list_exp_list, - plot_type="quantile_solvability", + plot_type=PlotType.QUANTILE_SOLVABILITY, plot_conf_ints=bool(param_value_list[0]), print_max_hw=bool(param_value_list[1]), solve_tol=param_value_list[2], @@ -530,7 +496,7 @@ def add_plot(self) -> None: elif self.plot_type_list[-1] == "CDF Difference Plot": path_name = plot_solvability_profiles( list_exp_list, - plot_type="diff_cdf_solvability", + plot_type=PlotType.DIFF_CDF_SOLVABILITY, plot_conf_ints=bool(param_value_list[0]), print_max_hw=bool(param_value_list[1]), solve_tol=param_value_list[2], @@ -549,7 +515,7 @@ def add_plot(self) -> None: elif self.plot_type_list[-1] == "Quantile Difference Plot": path_name = plot_solvability_profiles( list_exp_list, - plot_type="diff_quantile_solvability", + plot_type=PlotType.DIFF_QUANTILE_SOLVABILITY, plot_conf_ints=bool(param_value_list[0]), print_max_hw=bool(param_value_list[1]), solve_tol=param_value_list[2], @@ -581,14 +547,13 @@ def add_plot(self) -> None: ) param_list = {} else: - print(f"{self.plot_type_list[-1]} is the plot_type_list") + error_msg = f"Plot type {self.plot_type_list[-1]} is not a valid plot type." + logging.error(error_msg) + raise ValueError(error_msg) for i, new_plot in enumerate(path_name): place = self.num_plots + 1 - if len(path_name) == 1: - prob_text = solver_lst - else: - prob_text = self.solver_menu.get(i) + prob_text = solver_lst if len(path_name) == 1 else self.solver_menu.get(i) self.problem_button_added = tk.Label( master=self.tab_one, @@ -638,9 +603,7 @@ def add_plot(self) -> None: justify="center", command=partial(self.clear_row, place - 1), ) - self.clear_plot.grid( - row=place, column=3, sticky="nsew", padx=10, pady=3 - ) + self.clear_plot.grid(row=place, column=3, sticky="nsew", padx=10, pady=3) self.view_plot = tk.Button( master=self.tab_one, @@ -648,49 +611,36 @@ def add_plot(self) -> None: justify="center", command=partial(self.view_one_plot, new_plot), ) - self.view_plot.grid( - row=place, column=4, sticky="nsew", padx=10, pady=3 - ) + self.view_plot.grid(row=place, column=4, sticky="nsew", padx=10, pady=3) self.plot_path = tk.Label( master=self.tab_one, text=new_plot, justify="center", ) - self.plot_path.grid( - row=place, column=6, sticky="nsew", padx=10, pady=3 - ) + self.plot_path.grid(row=place, column=6, sticky="nsew", padx=10, pady=3) # self.view_plot.pack() self.change_on_hover(self.view_plot, "red", "yellow") self.all_path_names.append(new_plot) - # print("all_path_names",self.all_path_names) + # logging.debug("all_path_names",self.all_path_names) self.num_plots += 1 def change_on_hover( self, button: tk.Button, color_on_hover: str, color_on_leave: str ) -> None: - """Change the color of the button when the mouse is hovered over it. - - Parameters - ---------- - button : tk.Button - The button that will change color when hovered over. - color_on_hover : str - The color the button will change to when hovered over. - color_on_leave : str - The color the button will change to when the mouse leaves the button. + """Change the color of a button when hovered over. + Args: + button (tk.Button): The button to apply the hover effect to. + color_on_hover (str): The color the button changes to when hovered. + color_on_leave (str): The color the button reverts to when the mouse leaves. """ # adjusting backgroung of the widget # background on entering widget - button.bind( - "", func=lambda e: button.config(background=color_on_hover) - ) + button.bind("", func=lambda _: button.config(background=color_on_hover)) # background color on leving widget - button.bind( - "", func=lambda e: button.config(background=color_on_leave) - ) + button.bind("", func=lambda _: button.config(background=color_on_leave)) def solver_select_function(self) -> None: # if user clicks plot type then a solver, this is update parameters @@ -796,9 +746,7 @@ def get_parameters_and_settings( ) self.CI_canvas.grid_rowconfigure(0) - self.CI_label_frame.place( - relx=0.4, rely=0.15, relheight=0.3, relwidth=0.25 - ) + self.CI_label_frame.place(relx=0.4, rely=0.15, relheight=0.3, relwidth=0.25) self.settings_label_frame.destroy() self.settings_label_frame = ttk.LabelFrame( @@ -1044,7 +992,7 @@ def get_parameters_and_settings( def clear_row(self, place: int) -> None: self.plot_CI_list.pop(place) self.plot_exp_list.pop(place) - print("Clear") + logging.debug("Clear") def plot_button(self) -> None: self.postrep_window = Toplevel(self) @@ -1092,7 +1040,7 @@ def view_one_plot(self, path_name: os.PathLike | str) -> None: width = 400 height = 400 - print("This is path", path_name) + logging.debug("This is path", path_name) img = Image.open(path_name) img = img.resize((width, height), Image.ANTIALIAS) diff --git a/simopt/gui/toplevel_custom.py b/simopt/gui/toplevel_custom.py index 765b0a890..4a18d8d4a 100644 --- a/simopt/gui/toplevel_custom.py +++ b/simopt/gui/toplevel_custom.py @@ -13,15 +13,13 @@ def __init__( title: str = "SimOpt GUI", exit_on_close: bool = False, ) -> None: - """Initialize the ToplevelCustom class. - - Parameters - ---------- - root : tk.Tk - The main window of the GUI - exit_on_close : bool, optional - If True, the program will exit when the window is closed. + """Initialize the Toplevel class. + Args: + root (tk.Tk): The main window of the GUI. + title (str, optional): The title of the window. Defaults to "SimOpt GUI". + exit_on_close (bool, optional): If True, the program will exit when the + window is closed. """ super().__init__(root) self.root = root @@ -85,27 +83,24 @@ def set_style(self) -> None: ) def center_window(self, scale: float) -> None: - """Centers the window to the main display/monitor. - - Example Usage - ------------- - position = center_window(self.root, 0.8) - - self.root.geometry(position) + """Center the window on the main display/monitor. - Parameters - ---------- - scale : float - The scale of the window + Args: + scale (float): The scale factor to apply to the window size + (e.g., 0.8 for 80% of screen size). + Example: + ```python + position = center_window(self.root, 0.8) + self.root.geometry(position) + ``` """ screen_width = self.winfo_screenwidth() screen_height = self.winfo_screenheight() width = int(screen_width * scale) height = int(screen_height * scale) x = int((screen_width / 2) - (width / 2)) - y = int( - (screen_height / 2) - (height / 1.9) - ) # Slight adjustment for taskbar + # Slight adjustment for taskbar + y = int((screen_height / 2) - (height / 1.9)) position = f"{width}x{height}+{x}+{y}" self.geometry(position) diff --git a/simopt/models/amusementpark.py b/simopt/models/amusementpark.py index a5af04704..31bb069a3 100644 --- a/simopt/models/amusementpark.py +++ b/simopt/models/amusementpark.py @@ -1,19 +1,22 @@ -"""Simulate a single day of operation for an amusement park queuing problem. - -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate a single day of operation for an amusement park queuing problem.""" from __future__ import annotations +import bisect +import itertools import math as math +from collections.abc import Sequence from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override + +INF = float("inf") +# Default values for the model PARK_CAPACITY: Final[int] = 350 NUM_ATTRACTIONS: Final[int] = 7 @@ -26,52 +29,28 @@ class AmusementPark(Model): arrival rate, a next attraction transition matrix, and attraction durations based on an Erlang distribution. Returns the total number and percent of tourists to leave the park due to full queues. - - Parameters - ---------- - name : str - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : dict - fixed_factors of the simulation model - - See Also - -------- - base.Model - """ - @property - def name(self) -> str: - return "AMUSEMENTPARK" - - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 3 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 4 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "park_capacity": { - "description": "The total number of tourists waiting for \ - attractions that can be maintained through \ - park facilities, distributed across the attractions.", + "description": ( + "The total number of tourists waiting for attractions that can be " + "maintained through park facilities, distributed across the " + "attractions." + ), "datatype": int, "default": PARK_CAPACITY, }, @@ -87,38 +66,51 @@ def specifications(self) -> dict[str, dict]: "default": 480.0, }, "erlang_shape": { - "description": "The shape parameter of the Erlang distribution for each attraction" - "duration.", + "description": ( + "The shape parameter of the Erlang distribution for each " + "attraction duration." + ), "datatype": list, "default": [2] * NUM_ATTRACTIONS, }, "erlang_scale": { - "description": "The rate parameter of the Erlang distribution for each attraction" - "duration.", + "description": ( + "The rate parameter of the Erlang distribution for each attraction " + "duration." + ), "datatype": list, "default": [1 / 9] * NUM_ATTRACTIONS, }, "queue_capacities": { - "description": "The capacity of the queue for each attraction \ - based on the portion of facilities allocated.", + "description": ( + "The capacity of the queue for each attraction based on the " + "portion of facilities allocated." + ), "datatype": list, "default": [50] * NUM_ATTRACTIONS, }, "depart_probabilities": { - "description": "The probability that a tourist will depart the \ - park after visiting an attraction.", + "description": ( + "The probability that a tourist will depart the park after " + "visiting an attraction." + ), "datatype": list, "default": [0.2] * NUM_ATTRACTIONS, }, "arrival_gammas": { - "description": "The gamma values for the poisson distributions dictating the rates at which \ - tourists entering the park arrive at each attraction", + "description": ( + "The gamma values for the poisson distributions dictating the " + "rates at which tourists entering the park arrive at each " + "attraction" + ), "datatype": list, "default": [1] * NUM_ATTRACTIONS, }, "transition_probabilities": { - "description": "The transition matrix that describes the probability \ - of a tourist visiting each attraction after their current attraction.", + "description": ( + "The transition matrix that describes the probability of a tourist " + "visiting each attraction after their current attraction." + ), "datatype": list, "default": [ [0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0], @@ -136,416 +128,416 @@ def specifications(self) -> dict[str, dict]: def check_factor_list(self) -> dict[str, Callable]: """Switch case for checking factor simulatability.""" return { - "park_capacity": self.check_park_capacity, - "number_attractions": self.check_number_attractions, - "time_open": self.check_time_open, - "queue_capacities": self.check_queue_capacities, - "depart_probabilities": self.check_depart_probabilities, - "arrival_gammas": self.check_arrival_gammas, - "transition_probabilities": self.check_transition_probabilities, - "erlang_shape": self.check_erlang_shape, - "erlang_scale": self.check_erlang_scale, + "park_capacity": self._check_park_capacity, + "number_attractions": self._check_number_attractions, + "time_open": self._check_time_open, + "queue_capacities": self._check_queue_capacities, + "depart_probabilities": self._check_depart_probabilities, + "arrival_gammas": self._check_arrival_gammas, + "transition_probabilities": self._check_transition_probabilities, + "erlang_shape": self._check_erlang_shape, + "erlang_scale": self._check_erlang_scale, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Amusement Park Model.""" # Let the base class handle default arguments. super().__init__(fixed_factors) # Check for simulatable factors. - def check_park_capacity(self) -> None: + def _check_park_capacity(self) -> None: if self.factors["park_capacity"] < 0: - raise ValueError( - "Park capacity must be greater than or equal to 0." - ) + raise ValueError("Park capacity must be greater than or equal to 0.") - def check_number_attractions(self) -> None: + def _check_number_attractions(self) -> None: if self.factors["number_attractions"] < 0: raise ValueError("Number of attractions must be greater than 0.") - def check_time_open(self) -> None: + def _check_time_open(self) -> None: if self.factors["time_open"] < 0: raise ValueError("Time open must be greater than or equal to 0.") - def check_queue_capacities(self) -> bool: - return all([cap >= 0 for cap in self.factors["queue_capacities"]]) + def _check_queue_capacities(self) -> bool: + return all(cap >= 0 for cap in self.factors["queue_capacities"]) - def check_depart_probabilities(self) -> bool: + def _check_depart_probabilities(self) -> bool: if ( len(self.factors["depart_probabilities"]) != self.factors["number_attractions"] ): raise ValueError( - "The number of departure probabilities must match the number of attractions." - ) - else: - return all( - [ - 0 <= prob <= 1 - for prob in self.factors["depart_probabilities"] - ] + "The number of departure probabilities must match the number of " + "attractions." ) + return all(0 <= prob <= 1 for prob in self.factors["depart_probabilities"]) - def check_arrival_gammas(self) -> bool: - if ( - len(self.factors["arrival_gammas"]) - != self.factors["number_attractions"] - ): + def _check_arrival_gammas(self) -> bool: + if len(self.factors["arrival_gammas"]) != self.factors["number_attractions"]: raise ValueError( "The number of arrivals must match the number of attractions." ) - else: - return all([gamma >= 0 for gamma in self.factors["arrival_gammas"]]) + return all(gamma >= 0 for gamma in self.factors["arrival_gammas"]) - def check_transition_probabilities(self) -> bool: - """Check if transition matrix has same number of rows and columns and that each row + depart probability sums to 1.""" - transition_sums = list( - map(sum, self.factors["transition_probabilities"]) - ) + def _check_transition_probabilities(self) -> bool: + """Validate the structure and consistency of the transition matrix. + + Checks that the transition matrix is square (same number of rows and columns), + and that the sum of each row and its corresponding departure probability equals + 1. + + Returns: + bool: True if all checks pass. + + Raises: + ValueError: If any row has the wrong shape or an invalid total probability. + """ + transition_sums = list(map(sum, self.factors["transition_probabilities"])) if all( - [ - len(row) == len(self.factors["transition_probabilities"]) - for row in self.factors["transition_probabilities"] - ] + len(row) == len(self.factors["transition_probabilities"]) + for row in self.factors["transition_probabilities"] ) and all( transition_sums[i] + self.factors["depart_probabilities"][i] == 1 for i in range(self.factors["number_attractions"]) ): return True - else: - raise ValueError( - "The values you entered are invalid. Check that each row and depart probability sums to 1." - ) + raise ValueError( + "The values you entered are invalid. " + "Check that each row and depart probability sums to 1." + ) - def check_erlang_shape(self) -> bool: - if ( - len(self.factors["erlang_shape"]) - != self.factors["number_attractions"] - ): + def _check_erlang_shape(self) -> bool: + """Validate the Erlang shape parameters for each attraction. + + Checks that the number of shape parameters matches the number of attractions, + and that all shape values are non-negative. + + Returns: + bool: True if all shape parameters are valid. + + Raises: + ValueError: If the number of shape parameters is incorrect. + """ + if len(self.factors["erlang_shape"]) != self.factors["number_attractions"]: raise ValueError( - "The number of attractions must equal the number of Erlang shape parameters." + "The number of attractions must equal the number of Erlang shape " + "parameters." ) - else: - return all([gamma >= 0 for gamma in self.factors["erlang_shape"]]) + return all(gamma >= 0 for gamma in self.factors["erlang_shape"]) - def check_erlang_scale(self) -> bool: - if ( - len(self.factors["erlang_scale"]) - != self.factors["number_attractions"] - ): + def _check_erlang_scale(self) -> bool: + """Validate the Erlang scale parameters for each attraction. + + Checks that the number of scale parameters matches the number of attractions, + and that all scale values are non-negative. + + Returns: + bool: True if all scale parameters are valid. + + Raises: + ValueError: If the number of scale parameters is incorrect. + """ + if len(self.factors["erlang_scale"]) != self.factors["number_attractions"]: raise ValueError( "The number of attractions must equal the number of Erlang scales." ) - else: - return all([gamma >= 0 for gamma in self.factors["erlang_scale"]]) + return all(gamma >= 0 for gamma in self.factors["erlang_scale"]) + @override def check_simulatable_factors(self) -> bool: - if ( - sum(self.factors["queue_capacities"]) - > self.factors["park_capacity"] - ): + if sum(self.factors["queue_capacities"]) > self.factors["park_capacity"]: raise ValueError( - "The sum of the queue capacities must be less than or equal to the park capacity" + "The sum of the queue capacities must be less than or equal to the " + "park capacity" ) return True def replicate( self, rng_list: list[MRG32k3a] ) -> tuple[dict[str, float | list[float]], dict]: - """Simulate a single replication for the current model factors. - - Parameters - ---------- - rng_list : list[MRG32k3a] - rngs for model to use when simulating a replication - - Returns - ------- - dict[str, float | list[float]] - performance measures of interest - "total_departed_tourists": The total number of tourists to leave the park due to full queues - "percent_departed_tourists": The percentage of tourists to leave the park due to full queues - "average_number_in_system": The average number of tourists in the park at any given time - "attraction_utilization_percentages": The percentage of time each attraction is utilized - dict - gradients of performance measures with respect to factors + """Simulate a single replication using current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used during the + simulation. + + Returns: + tuple: A tuple containing: + - dict[str, float | list[float]]: Performance metrics from the simulation: + - "total_departed_tourists": Total number of tourists who left due to full queues. + - "percent_departed_tourists": Percentage of tourists who left due to full queues. + - "average_number_in_system": Average number of tourists in the park at a given time. + - "attraction_utilization_percentages": Utilization percentage of each attraction. + - dict: Gradients of the performance measures with respect to model factors. + """ # noqa: E501 + + def fast_weighted_choice( + population: Sequence[int], weights: Sequence[float], rng: MRG32k3a + ) -> int: + """Select a single element from a population based on weights. + + Designed to be faster than `random.choices()` when only one element + is needed. + + Args: + population (Sequence[int]): The population to select from. + weights (Sequence[float]): The weights for each element in the + population. + rng (MRG32k3a): The random number generator to use for selection. + + Returns: + int: The selected element from the population. + """ + # Calculate cumulative weights + cum_weights = list(itertools.accumulate(weights)) + # Generate a value somewhere between 0 and the sum of weights + x = rng.random() * cum_weights[-1] + # Find the index of the first cumulative weight that is >= x + # Return the corresponding element from the population + return population[bisect.bisect(cum_weights, x)] + + def set_completion(i: int, new_time: float) -> None: + """Set the completion time for an attraction. + + Updates the minimum completion time and index if necessary. + This function doesn't offer much (if any) performance gain with small + numbers of attractions, but with larger numbers it is significantly faster. + + Args: + i (int): The index of the attraction. + new_time (float): The new completion time for the attraction. + """ + nonlocal min_completion_time, min_completion_index + completion_times[i] = new_time + + if new_time < min_completion_time: + min_completion_time = new_time + min_completion_index = i + elif i == min_completion_index: + # Grab the min index and time with one scanning pass + min_completion_time = min(completion_times) + min_completion_index = completion_times.index(min_completion_time) + + # Keep local copies of factors to prevent excessive lookups + num_attactions: int = self.factors["number_attractions"] + arrival_gammas: list[int] = self.factors["arrival_gammas"] + time_open: float = self.factors["time_open"] + erlang_shape: list[int] = self.factors["erlang_shape"] + erlang_scale: list[float] = self.factors["erlang_scale"] + queue_capacities: list[int] = self.factors["queue_capacities"] + transition_probabilities: list[list[float]] = self.factors[ + "transition_probabilities" + ] + depart_probabilities: list[float] = self.factors["depart_probabilities"] - """ # Designate random number generators. arrival_rng = rng_list[0] transition_rng = rng_list[1] time_rng = rng_list[2] - # Initiate clock variables for statistics tracking and event handling. - clock = 0 - previous_clock = 0 - next_arrival = arrival_rng.expovariate( - sum(self.factors["arrival_gammas"]) - ) - # initialize list of attractions to be selected upon arrival. - potential_attractions = range(self.factors["number_attractions"]) - - # create list of each attraction's next completion time and initialize to infinity. - completion_times = [ - math.inf for _ in range(self.factors["number_attractions"]) - ] - + attraction_range = range(num_attactions) + destination_range = range(num_attactions + 1) + depart_idx = destination_range[-1] + # initialize lists of each attraction's next completion time + completion_times = [INF] * num_attactions + min_completion_time = INF + min_completion_index = -1 # initialize actual queues. - queues = [0 for _ in range(self.factors["number_attractions"])] + queues = [0] * num_attactions # create external arrival probabilities for each attraction. + arrival_prob_sum = sum(arrival_gammas) arrival_probabalities = [ - self.factors["arrival_gammas"][i] - / sum(self.factors["arrival_gammas"]) - for i in self.factors["arrival_gammas"] + arrival_gammas[i] / arrival_prob_sum for i in attraction_range ] + # Initiate clock variables for statistics tracking and event handling. + clock = 0 + previous_clock = 0 + next_arrival = arrival_rng.expovariate(arrival_prob_sum) + # Initialize quantities to track: total_visitors = 0 total_departed = 0 # initialize time average and utilization quantities. in_system = 0 time_average = 0 - cumulative_util = [ - 0.0 for _ in range(self.factors["number_attractions"]) - ] + cumulative_util = [0.0] * num_attactions # Run simulation over time horizon. - while ( - min(next_arrival, min(completion_times)) < self.factors["time_open"] - ): + while clock < time_open: # Count number of tourists on attractions and in queues. - clock = min(next_arrival, min(completion_times)) riders = 0 - for i in range(self.factors["number_attractions"]): - if completion_times[i] != math.inf: + delta_time = clock - previous_clock + for i in attraction_range: + if not math.isinf(completion_times[i]): riders += 1 - cumulative_util[i] += clock - previous_clock + cumulative_util[i] += delta_time in_system = sum(queues) + riders - time_average += in_system * (clock - previous_clock) + time_average += in_system * (delta_time) previous_clock = clock - if next_arrival < min( - completion_times - ): # Next event is external tourist arrival. + if next_arrival < min_completion_time: + # Next event is external tourist arrival. total_visitors += 1 # Select attraction. - attraction_selection = arrival_rng.choices( - population=potential_attractions, + attraction_selection = fast_weighted_choice( + population=attraction_range, weights=arrival_probabalities, - )[0] + rng=arrival_rng, + ) # Check if attraction is currently available. # If available, arrive at that attraction. Otherwise check queue. - if completion_times[attraction_selection] == math.inf: + if math.isinf(completion_times[attraction_selection]): # Generate completion time if attraction available. - completion_times[attraction_selection] = ( - next_arrival - + time_rng.gammavariate( - alpha=self.factors["erlang_shape"][ - attraction_selection - ], - beta=self.factors["erlang_scale"][ - attraction_selection - ], - ) + completion_time = next_arrival + time_rng.gammavariate( + alpha=erlang_shape[attraction_selection], + beta=erlang_scale[attraction_selection], ) - # If unavailable, check if current queue is less than capacity. If queue is not full, join queue. + set_completion(attraction_selection, completion_time) + # If unavailable, check if current queue is less than capacity. + # If queue is not full, join queue. elif ( queues[attraction_selection] - < self.factors["queue_capacities"][attraction_selection] + < queue_capacities[attraction_selection] ): queues[attraction_selection] += 1 # If queue is full, leave park + 1. else: total_departed += 1 # Use superposition of Poisson processes to generate next arrival time. - next_arrival += arrival_rng.expovariate( - sum(self.factors["arrival_gammas"]) - ) - - else: # Next event is the completion of an attraction. - finished_attraction = completion_times.index( - min(completion_times) - ) # Identify finished attraction. + next_arrival += arrival_rng.expovariate(arrival_prob_sum) + else: + # Next event is the completion of an attraction. + # Identify finished attraction. + finished_attraction = completion_times.index(min_completion_time) # Check if there is a queue for that attraction. # If so then start new completion time and subtract 1 from queue. + alpha = erlang_shape[finished_attraction] + beta = erlang_scale[finished_attraction] if queues[finished_attraction] > 0: - completion_times[finished_attraction] = min( - completion_times - ) + time_rng.gammavariate( - alpha=self.factors["erlang_shape"][finished_attraction], - beta=self.factors["erlang_scale"][finished_attraction], + completion_time = min_completion_time + time_rng.gammavariate( + alpha=alpha, + beta=beta, ) + set_completion(finished_attraction, completion_time) queues[finished_attraction] -= 1 - else: # If no one in queue, set next completion of that attraction to infinity. - completion_times[finished_attraction] = math.inf - + else: # If attraction queue is empty, set next completion to infinity. + set_completion(finished_attraction, INF) # Check if that person will leave the park. - potential_destinations = range( - self.factors["number_attractions"] + 1 + next_destination = fast_weighted_choice( + population=destination_range, + weights=transition_probabilities[finished_attraction] + + [depart_probabilities[finished_attraction]], + rng=transition_rng, ) - next_destination = transition_rng.choices( - population=potential_destinations, - weights=self.factors["transition_probabilities"][ - finished_attraction - ] - + [ - self.factors["depart_probabilities"][ - finished_attraction - ] - ], - )[0] # Check if tourist leaves park. - if next_destination != potential_destinations[-1]: + if next_destination != depart_idx: # Check if attraction is currently available. # If available, arrive at that attraction. Otherwise check queue. - if completion_times[next_destination] == math.inf: + if math.isinf(completion_times[next_destination]): # Generate completion time if attraction available. - completion_times[next_destination] = min( - completion_times - ) + time_rng.gammavariate( - alpha=self.factors["erlang_shape"][ - finished_attraction - ], - beta=self.factors["erlang_scale"][ - finished_attraction - ], + completion_time = min_completion_time + time_rng.gammavariate( + alpha=alpha, + beta=beta, ) - # if unavailable, check if current queue is less than capacity. If queue is not full, join queue. - elif ( - queues[next_destination] - < self.factors["queue_capacities"][next_destination] - ): + set_completion(next_destination, completion_time) + # If unavailable, check if current queue is less than capacity. + # If queue is not full, join queue. + elif queues[next_destination] < queue_capacities[next_destination]: queues[next_destination] += 1 # If queue is full, leave park + 1. else: total_departed += 1 + # End of while loop. + # Check if any attractions are available. + clock = min(next_arrival, min_completion_time) # End of simulation. # Calculate overall percent utilization calculation for each attraction. - for i in range(self.factors["number_attractions"]): - cumulative_util[i] = cumulative_util[i] / self.factors["time_open"] + cumulative_util = [cumulative_util[i] / time_open for i in attraction_range] # Calculate responses from simulation data. responses = { "total_departed": total_departed, "percent_departed": total_departed / total_visitors, - "average_number_in_system": time_average - / self.factors["time_open"], + "average_number_in_system": time_average / time_open, "attraction_utilization_percentages": cumulative_util, } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the total departed tourists. -""" - - class AmusementParkMinDepart(Problem): - """Class to make amusement park simulation-optimization problems. - - Attributes - ---------- - name : str - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : str - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : str - description of variable types: - "discrete", "continuous", "mixed" - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : base.Model - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : [list] [rng.mrg32k3a.MRG32k3a] - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - See Also - -------- - base.Problem + """Class to make amusement park simulation-optimization problems.""" - """ + @classproperty + @override + def class_name_abbr(cls) -> str: + return "AMUSEMENTPARK-1" - @property - def n_objectives(self) -> int: + @classproperty + @override + def class_name(cls) -> str: + return "Min Total Departed Visitors for Amusement Park" + + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.DETERMINISTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.DISCRETE - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"queue_capacities"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "Initial solution from which solvers start.", @@ -562,6 +554,7 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, @@ -569,14 +562,17 @@ def check_factor_list(self) -> dict[str, Callable]: } @property + @override def dim(self) -> int: return self.model.factors["number_attractions"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (self.model.factors["park_capacity"],) * self.dim @@ -588,15 +584,11 @@ def __init__( ) -> None: """Initialize the Amusement Park Minimize Departures Problem. - Parameters - ---------- - name : str - user-specified name of problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed_factors : dict - subset of user-specified non-decision factors to pass through to the model - + Args: + name (str): User-specified name of the problem. + fixed_factors (dict | None): Dictionary of user-specified problem factors. + model_fixed_factors (dict | None): Subset of user-specified non-decision + factors to pass through to the model. """ # Let the base class handle default arguments. super().__init__( @@ -606,161 +598,39 @@ def __init__( model=AmusementPark, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict[str, tuple]: - """Convert a vector of variables to a dictionary with factor keys. - - Parameters - ---------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - dict[str, tuple] - dictionary with factor keys and associated values - - """ - factor_dict = { + return { "queue_capacities": vector[:], } - return factor_dict + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """Convert a dictionary with factor keys to a vector of variables. - - Parameters - ---------- - factor_dict : dict - dictionary with factor keys and associated values - - Returns - ------- - tuple - vector of values associated with decision variables - - """ - vector = tuple(factor_dict["queue_capacities"]) - return vector + return tuple(factor_dict["queue_capacities"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """Convert a dictionary with response keys to a vector of objectives. - - Parameters - ---------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - tuple - vector of objectives - - """ - objectives = (response_dict["total_departed"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """Convert a dictionary with response keys to a vector of left-hand sides of stochastic constraints: E[Y] <= 0. - - Parameters - ---------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint + return (response_dict["total_departed"],) - """ - stoch_constraints = () - return stoch_constraints - - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = () return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """Check if a solution `x` satisfies the problem's deterministic constraints. - - Parameters - ---------- - x : tuple - vector of decision variables - - Returns - ------- - bool - indicates if solution `x` satisfies the deterministic constraints. - - """ # Check box constraints. if not super().check_deterministic_constraints(x): return False # Check if sum of queue capacities is less than park capacity. return sum(x) <= self.model.factors["park_capacity"] + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : rng.mrg32k3a.MRG32k3a - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ num_elements: int = self.model.factors["number_attractions"] summation: int = self.model.factors["park_capacity"] - # TODO: see if this issue still exists after the next release of MRG32k3a - # If it does, create a fix and PR it to the MRG32k3a repo. - vector: list[int] = rand_sol_rng.integer_random_vector_from_simplex( + vector = rand_sol_rng.integer_random_vector_from_simplex( n_elements=num_elements, summation=summation, with_zero=False - ) # type: ignore + ) return tuple(vector) diff --git a/simopt/models/chessmm.py b/simopt/models/chessmm.py index cc8a53bcc..679241250 100644 --- a/simopt/models/chessmm.py +++ b/simopt/models/chessmm.py @@ -1,70 +1,51 @@ -""" -Summary -------- -Simulate matching of chess players on an online platform. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate matching of chess players on an online platform.""" from __future__ import annotations from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a from scipy import special +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override MEAN_ELO: Final[int] = 1200 MAX_ALLOWABLE_DIFF: Final[int] = 150 class ChessMatchmaking(Model): - """ - A model that simulates a matchmaking problem with a - Elo (truncated normal) distribution of players and Poisson arrivals. - Returns the average difference between matched players. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model + """Matchmaking model following an Elo distribution. + + A model that simulates a matchmaking problem with a Elo (truncated normal) + distribution of players and Poisson arrivals and returns the average difference + between matched players. """ - @property - def name(self) -> str: + @classproperty + @override + def class_name_abbr(cls) -> str: return "CHESS" - @property - def n_rngs(self) -> int: + @classproperty + @override + def class_name(cls) -> str: + return "Chess Matchmaking" + + @classproperty + @override + def n_rngs(cls) -> int: return 2 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 2 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "elo_mean": { "description": "mean of normal distribution for Elo rating", @@ -72,11 +53,11 @@ def specifications(self) -> dict[str, dict]: "default": MEAN_ELO, }, "elo_sd": { - "description": "standard deviation of normal distribution for Elo rating", - "datatype": float, - "default": round( - MEAN_ELO / (np.sqrt(2) * special.erfcinv(1 / 50)), 1 + "description": ( + "standard deviation of normal distribution for Elo rating" ), + "datatype": float, + "default": round(MEAN_ELO / (np.sqrt(2) * special.erfcinv(1 / 50)), 1), }, "poisson_rate": { "description": "rate of Poisson process for player arrivals", @@ -96,243 +77,204 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "elo_mean": self.check_elo_mean, - "elo_sd": self.check_elo_sd, - "poisson_rate": self.check_poisson_rate, - "num_players": self.check_num_players, - "allowable_diff": self.check_allowable_diff, + "elo_mean": self._check_elo_mean, + "elo_sd": self._check_elo_sd, + "poisson_rate": self._check_poisson_rate, + "num_players": self._check_num_players, + "allowable_diff": self._check_allowable_diff, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the ChessMatchmaking model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_elo_mean(self) -> None: + def _check_elo_mean(self) -> None: if self.factors["elo_mean"] <= 0: raise ValueError( "Mean of normal distribution for Elo rating must be greater than 0." ) - def check_elo_sd(self) -> None: + def _check_elo_sd(self) -> None: if self.factors["elo_sd"] <= 0: raise ValueError( - "Standard deviation of normal distribution for Elo rating must be greater than 0." + "Standard deviation of normal distribution for Elo rating must be " + "greater than 0." ) - def check_poisson_rate(self) -> None: + def _check_poisson_rate(self) -> None: if self.factors["poisson_rate"] <= 0: raise ValueError( "Rate of Poisson process for player arrivals must be greater than 0." ) - def check_num_players(self) -> None: + def _check_num_players(self) -> None: if self.factors["num_players"] <= 0: raise ValueError("Number of players must be greater than 0.") - def check_allowable_diff(self) -> None: + def _check_allowable_diff(self) -> None: if self.factors["allowable_diff"] <= 0: raise ValueError( - "The maximum mallowable different between Elo ratings must be greater than 0." + "The maximum mallowable different between Elo ratings must be greater " + "than 0." ) + @override def check_simulatable_factors(self) -> bool: # No factors need cross-checked return True - def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: - """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "avg_diff" = the average Elo difference between all pairs - "avg_wait_time" = the average waiting time - gradients : dict of dicts - gradient estimates for each response + def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict[str, dict]]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): List of random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict[str, dict]]: A tuple containing: + - dict: Performance measures of interest, including: + - "avg_diff": Average Elo difference between all pairs. + - "avg_wait_time": Average waiting time. + - dict[str, dict]: Gradient estimates for each response. """ - # Designate separate random number generators. + # Constants + num_players = self.factors["num_players"] + num_players_range = range(num_players) + elo_mean = self.factors["elo_mean"] + elo_sd = self.factors["elo_sd"] + elo_min, elo_max = 0, 2400 + allowable_diff = self.factors["allowable_diff"] + poisson_rate = self.factors["poisson_rate"] + + # Designate separate RNGs for Elo and arrival times. elo_rng = rng_list[0] arrival_rng = rng_list[1] + + def generate_elo() -> float: + while True: + rating = elo_rng.normalvariate(elo_mean, elo_sd) + if elo_min <= rating <= elo_max: + return rating + + # Generate Elo ratings (normal distribution). + player_ratings = [generate_elo() for _ in num_players_range] + + # Generate interarrival times (Poisson distribution). + interarrival_times = [ + arrival_rng.poissonvariate(poisson_rate) for _ in num_players_range + ] + # Initialize statistics. # Incoming players are initialized with a wait time of 0. - wait_times = np.zeros(self.factors["num_players"]) + wait_times = np.zeros(num_players) waiting_players = [] - total_diff = 0 + total_diff = 0 # TODO: make this do something elo_diffs = [] + # Simulate arrival and matching and players. - for _ in range(self.factors["num_players"]): - # Generate interarrival time of the player. - time = arrival_rng.poissonvariate(self.factors["poisson_rate"]) - # Generate rating of the player via acceptance/rejection (not truncation). - player_rating = elo_rng.normalvariate( - self.factors["elo_mean"], self.factors["elo_sd"] - ) - while player_rating < 0 or player_rating > 2400: - player_rating = elo_rng.normalvariate( - self.factors["elo_mean"], self.factors["elo_sd"] - ) - # Attempt to match the incoming player with waiting players in FIFO manner. - old_total = total_diff - for p in range(len(waiting_players)): - if ( - abs(player_rating - waiting_players[p]) - <= self.factors["allowable_diff"] - ): - total_diff += abs(player_rating - waiting_players[p]) - elo_diffs.append(abs(player_rating - waiting_players[p])) - del waiting_players[p] + for interarrival_time, player_rating in zip(interarrival_times, player_ratings): + # Try to match the player + for i, waiting_rating in enumerate(waiting_players): + diff = abs(player_rating - waiting_rating) + if diff <= allowable_diff: + total_diff += diff + elo_diffs.append(diff) + waiting_players.pop(i) break - else: - wait_times[p] += time - # If incoming player is not matched, add them to the waiting pool. - if old_total == total_diff: + wait_times[i] += interarrival_time + # If break did not execute, then the player was not matched. + else: waiting_players.append(player_rating) + # If there weren't any matches, the elo_diffs list will be empty. - # This throws some warnings, so we'll add a 0 to the list. - # TODO: Check to see if there is a better way to handle this. - if not elo_diffs: - elo_diffs.append(0) + avg_diff = np.mean(elo_diffs) if elo_diffs else np.nan # Compose responses and gradients. responses = { - "avg_diff": np.mean(elo_diffs), + "avg_diff": avg_diff, "avg_wait_time": np.mean(wait_times), } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the expected Elo difference between all pairs of matched -players subject to the expected waiting time being sufficiently small. -""" +class ChessAvgDifference(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "CHESS-1" -class ChessAvgDifference(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : list - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - prev_cost : list - cost of prevention - upper_thres : float > 0 - upper limit of amount of contamination - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Avg Difference for Chess Matchmaking" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 1 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.STOCHASTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set: + @classproperty + @override + def model_decision_factors(cls) -> set: return {"allowable_diff"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -353,23 +295,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, - "upper_time": self.check_upper_time, + "upper_time": self._check_upper_time, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 1 - @property - def lower_bounds(self) -> tuple: + @classproperty + @override + def lower_bounds(cls) -> tuple: return (0,) - @property - def upper_bounds(self) -> tuple: + @classproperty + @override + def upper_bounds(cls) -> tuple: return (2400,) def __init__( @@ -378,162 +324,73 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the ChessAvgDifference problem. + + Args: + name (str, optional): User-specified name for the problem. + Defaults to "CHESS-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. - super().__init__( - name, fixed_factors, model_fixed_factors, ChessMatchmaking - ) + super().__init__(name, fixed_factors, model_fixed_factors, ChessMatchmaking) - def check_upper_time(self) -> None: + def _check_upper_time(self) -> None: if self.factors["upper_time"] <= 0: - raise ValueError( - "The upper bound on wait time must be greater than 0." - ) + raise ValueError("The upper bound on wait time must be greater than 0.") + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"allowable_diff": vector[0]} - return factor_dict + return {"allowable_diff": vector[0]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = (factor_dict["allowable_diff"],) - return vector + return (factor_dict["allowable_diff"],) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["avg_diff"],) - return objectives + return (response_dict["avg_diff"],) def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = (response_dict["avg_wait_time"],) - return stoch_constraints + """Convert a response dictionary to a vector of stochastic constraint values. + + Each returned value represents the left-hand side of a constraint of the form + E[Y] ≤ 0. + + Args: + response_dict (dict): A dictionary containing response keys and their + associated values. - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: + Returns: + tuple: A tuple representing the left-hand sides of the stochastic + constraints. """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints + return (response_dict["avg_wait_time"],) + + def deterministic_stochastic_constraints_and_gradients(self) -> tuple[tuple, tuple]: + """Compute deterministic components of stochastic constraints. + + Returns: + tuple: + - tuple: The deterministic components of the stochastic constraints. + - tuple: The gradients of those deterministic components. """ det_stoch_constraints = (-1 * self.factors["upper_time"],) det_stoch_constraints_gradients = ((0,),) return det_stoch_constraints, det_stoch_constraints_gradients - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = () return det_objectives, det_objectives_gradients + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - is_greater_than_zero: list[bool] = [x_val > 0 for x_val in x] - return all(is_greater_than_zero) + return all(x_val > 0 for x_val in x) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - x = (min(max(0, rand_sol_rng.normalvariate(150, 50)), 2400),) - return x + return (min(max(0, rand_sol_rng.normalvariate(150, 50)), 2400),) diff --git a/simopt/models/cntnv.py b/simopt/models/cntnv.py index 0b285d23e..02bb1dada 100644 --- a/simopt/models/cntnv.py +++ b/simopt/models/cntnv.py @@ -1,65 +1,47 @@ -""" -Summary -------- -Simulate a day's worth of sales for a newsvendor. -A detailed description of the model/problem can be found `here `__. -""" +"""Simulate a day's worth of sales for a newsvendor.""" from __future__ import annotations from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class CntNV(Model): - """ - A model that simulates a day's worth of sales for a newsvendor - with a Burr Type XII demand distribution. Returns the profit, after - accounting for order costs and salvage. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : dict - fixed_factors of the simulation model - - See also - -------- - base.Model + """Continuous Newsvendor Model with a Burr Type XII demand distribution. + + A model that simulates a day's worth of sales for a newsvendor with a Burr Type XII + demand distribution. Returns the profit, after accounting for order costs and + salvage. """ - @property - def name(self) -> str: + @classproperty + @override + def class_name_abbr(cls) -> str: return "CNTNEWS" - @property - def n_rngs(self) -> int: + @classproperty + @override + def class_name(cls) -> str: + return "Continuous Newsvendor" + + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "purchase_price": { "description": "purchasing cost per unit", @@ -94,48 +76,56 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "purchase_price": self.check_purchase_price, - "sales_price": self.check_sales_price, - "salvage_price": self.check_salvage_price, - "order_quantity": self.check_order_quantity, - "Burr_c": self.check_burr_c, - "Burr_k": self.check_burr_k, + "purchase_price": self._check_purchase_price, + "sales_price": self._check_sales_price, + "salvage_price": self._check_salvage_price, + "order_quantity": self._check_order_quantity, + "Burr_c": self._check_burr_c, + "Burr_k": self._check_burr_k, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Continuous Newsvendor model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_purchase_price(self) -> None: + def _check_purchase_price(self) -> None: if self.factors["purchase_price"] <= 0: raise ValueError("Purchasing cost per unit must be greater than 0.") - def check_sales_price(self) -> None: + def _check_sales_price(self) -> None: if self.factors["sales_price"] <= 0: raise ValueError("Sales price per unit must be greater than 0.") - def check_salvage_price(self) -> None: + def _check_salvage_price(self) -> None: if self.factors["salvage_price"] <= 0: raise ValueError("Salvage cost per unit must be greater than 0.") - def check_order_quantity(self) -> None: + def _check_order_quantity(self) -> None: if self.factors["order_quantity"] <= 0: raise ValueError("Order quantity must be greater than 0.") - def check_burr_c(self) -> None: + def _check_burr_c(self) -> None: if self.factors["Burr_c"] <= 0: raise ValueError( "Burr Type XII cdf shape parameter must be greater than 0." ) - def check_burr_k(self) -> None: + def _check_burr_k(self) -> None: if self.factors["Burr_k"] <= 0: raise ValueError( "Burr Type XII cdf shape parameter must be greater than 0." ) + @override def check_simulatable_factors(self) -> bool: if ( self.factors["salvage_price"] @@ -143,62 +133,71 @@ def check_simulatable_factors(self) -> bool: < self.factors["sales_price"] ): return True - else: - raise ValueError( - "The salvage cost per unit must be greater than the purchasing cost per unit, which must be greater than the sales price per unit." - ) + raise ValueError( + "The salvage cost per unit must be greater than the purchasing cost per " + "unit, which must be greater than the sales price per unit." + ) def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate the + replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "profit": Profit in this scenario. + - "stockout_qty": Amount by which demand exceeded supply. + - "stockout": Whether there was unmet demand ("Y" or "N"). + - gradients (dict): Gradient estimates for each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "profit" = profit in this scenario - "stockout_qty" = amount by which demand exceeded supply - "stockout" = was there unmet demand? (Y/N) - """ + ord_quant: float = self.factors["order_quantity"] + purch_price: float = self.factors["purchase_price"] + sales_price: float = self.factors["sales_price"] + salvage_price: float = self.factors["salvage_price"] + burr_k: float = self.factors["Burr_k"] + burr_c: float = self.factors["Burr_c"] # Designate random number generator for demand variability. demand_rng = rng_list[0] + # Generate random demand according to Burr Type XII distribution. # If U ~ Uniform(0,1) and the Burr Type XII has parameters c and k, - # X = ((1-U)**(-1/k - 1))**(1/c) has the desired distribution. - base = (1 - demand_rng.random()) ** (-1 / self.factors["Burr_k"]) - 1 - exponent = 1 / self.factors["Burr_c"] - demand = base**exponent - # Calculate profit. - order_cost = ( - self.factors["purchase_price"] * self.factors["order_quantity"] - ) - sales_revenue = ( - min(demand, self.factors["order_quantity"]) - * self.factors["sales_price"] - ) - salvage_revenue = ( - max(0, self.factors["order_quantity"] - demand) - * self.factors["salvage_price"] - ) + # X = ((1-U)**(-1/k) - 1)**(1/c) has the desired distribution. + # https://en.wikipedia.org/wiki/Burr_distribution + def nth_root(x: float, n: float) -> float: + """Return the nth root of x.""" + return x ** (1 / n) + + u = demand_rng.random() + demand = nth_root(nth_root(1 - u, -burr_k) - 1, burr_c) + + # Calculate units sold, as well as unsold/stockout + units_sold = min(demand, ord_quant) + order_diff = ord_quant - demand + units_unsold = max(order_diff, 0) + stockout_qty = max(-order_diff, 0) + + # Compute revenue and cost components + order_cost = purch_price * ord_quant + sales_revenue = units_sold * sales_price + salvage_revenue = units_unsold * salvage_price + + # Build profit profit = sales_revenue + salvage_revenue - order_cost - stockout_qty = max(demand - self.factors["order_quantity"], 0) + + # Determine if there was a stockout. stockout = int(stockout_qty > 0) + # Calculate gradient of profit w.r.t. order quantity. - if demand > self.factors["order_quantity"]: - grad_profit_order_quantity = ( - self.factors["sales_price"] - self.factors["purchase_price"] - ) - elif demand < self.factors["order_quantity"]: - grad_profit_order_quantity = ( - self.factors["salvage_price"] - self.factors["purchase_price"] - ) + if order_diff < 0: + grad_profit_order_quantity = sales_price - purch_price + elif order_diff > 0: + grad_profit_order_quantity = salvage_price - purch_price else: grad_profit_order_quantity = np.nan + # Compose responses and gradients. responses = { "profit": profit, @@ -206,124 +205,71 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: "stockout": stockout, } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } gradients["profit"]["order_quantity"] = grad_profit_order_quantity return responses, gradients -""" -Summary -------- -Maximize the expected profit for the continuous newsvendor problem. -""" +class CntNVMaxProfit(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "CNTNEWS-1" -class CntNVMaxProfit(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Profit for Continuous Newsvendor" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: # TODO: Generalize to function of factors. # return (0.1878,) return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return { "purchase_price": 5.0, "sales_price": 9.0, @@ -332,12 +278,14 @@ def model_default_factors(self) -> dict: "Burr_k": 20.0, } - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"order_quantity"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -353,22 +301,26 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 1 - @property - def lower_bounds(self) -> tuple: + @classproperty + @override + def lower_bounds(cls) -> tuple: return (0,) - @property - def upper_bounds(self) -> tuple: + @classproperty + @override + def upper_bounds(cls) -> tuple: return (np.inf,) def __init__( @@ -377,6 +329,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the Continuous Newsvendor problem. + + Args: + name (str, optional): Name of the problem. Defaults to "CNTNEWS-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -385,154 +346,29 @@ def __init__( model=CntNV, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"order_quantity": vector[0]} - return factor_dict + return {"order_quantity": vector[0]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = (factor_dict["order_quantity"],) - return vector + return (factor_dict["order_quantity"],) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["profit"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["profit"],) - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0,),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ return x[0] > 0 + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ # Generate an Exponential(rate = 1) r.v. - x = (rand_sol_rng.expovariate(1),) - return x + return (rand_sol_rng.expovariate(1),) diff --git a/simopt/models/contam.py b/simopt/models/contam.py index 4d1ce7980..616c6ee18 100644 --- a/simopt/models/contam.py +++ b/simopt/models/contam.py @@ -1,97 +1,90 @@ -""" -Summary -------- -Simulate contamination rates. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate contamination rates.""" from __future__ import annotations from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override NUM_STAGES: Final[int] = 5 class Contamination(Model): - """ - A model that simulates a contamination problem with a - beta distribution. - Returns the probability of violating contamination upper limit - in each level of supply chain. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model + """Contamination model with contamination and restoration rates. + + A model that simulates a contamination problem with a beta distribution. + Returns the probability of violating contamination upper limit in each level of + supply chain. """ - @property - def name(self) -> str: + @classproperty + @override + def class_name_abbr(cls) -> str: return "CONTAM" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 2 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "contam_rate_alpha": { - "description": "alpha parameter of beta distribution for growth rate of contamination at each stage", + "description": ( + "alpha parameter of beta distribution for growth rate of " + "contamination at each stage" + ), "datatype": float, "default": 1.0, }, "contam_rate_beta": { - "description": "beta parameter of beta distribution for growth rate of contamination at each stage", + "description": ( + "beta parameter of beta distribution for growth rate of " + "contamination at each stage" + ), "datatype": float, "default": round(17 / 3, 2), }, "restore_rate_alpha": { - "description": "alpha parameter of beta distribution for rate that contamination decreases by after prevention effort", + "description": ( + "alpha parameter of beta distribution for rate that contamination " + "decreases by after prevention effort" + ), "datatype": float, "default": 1.0, }, "restore_rate_beta": { - "description": "beta parameter of beta distribution for rate that contamination decreases by after prevention effort", + "description": ( + "beta parameter of beta distribution for rate that contamination " + "decreases by after prevention effort" + ), "datatype": float, "default": round(3 / 7, 3), }, "initial_rate_alpha": { - "description": "alpha parameter of beta distribution for initial contamination fraction", + "description": ( + "alpha parameter of beta distribution for initial contamination " + "fraction" + ), "datatype": float, "default": 1.0, }, "initial_rate_beta": { - "description": "beta parameter of beta distribution for initial contamination fraction", + "description": ( + "beta parameter of beta distribution for initial contamination " + "fraction" + ), "datatype": float, "default": 30.0, }, @@ -108,237 +101,204 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "contam_rate_alpha": self.check_contam_rate_alpha, - "contam_rate_beta": self.check_contam_rate_beta, - "restore_rate_alpha": self.check_restore_rate_alpha, - "restore_rate_beta": self.check_restore_rate_beta, - "initial_rate_alpha": self.check_initial_rate_alpha, - "initial_rate_beta": self.check_initial_rate_beta, - "stages": self.check_stages, - "prev_decision": self.check_prev_decision, + "contam_rate_alpha": self._check_contam_rate_alpha, + "contam_rate_beta": self._check_contam_rate_beta, + "restore_rate_alpha": self._check_restore_rate_alpha, + "restore_rate_beta": self._check_restore_rate_beta, + "initial_rate_alpha": self._check_initial_rate_alpha, + "initial_rate_beta": self._check_initial_rate_beta, + "stages": self._check_stages, + "prev_decision": self._check_prev_decision, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Contamination model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_contam_rate_alpha(self) -> None: + def _check_contam_rate_alpha(self) -> None: if self.factors["contam_rate_alpha"] <= 0: raise ValueError("contam_rate_alpha must be greater than 0.") - def check_contam_rate_beta(self) -> None: + def _check_contam_rate_beta(self) -> None: if self.factors["contam_rate_beta"] <= 0: raise ValueError("contam_rate_beta must be greater than 0.") - def check_restore_rate_alpha(self) -> None: + def _check_restore_rate_alpha(self) -> None: if self.factors["restore_rate_alpha"] <= 0: raise ValueError("restore_rate_alpha must be greater than 0.") - def check_restore_rate_beta(self) -> None: + def _check_restore_rate_beta(self) -> None: if self.factors["restore_rate_beta"] <= 0: raise ValueError("restore_rate_beta must be greater than 0.") - def check_initial_rate_alpha(self) -> None: + def _check_initial_rate_alpha(self) -> None: if self.factors["initial_rate_alpha"] <= 0: raise ValueError("initial_rate_alpha must be greater than 0.") - def check_initial_rate_beta(self) -> None: + def _check_initial_rate_beta(self) -> None: if self.factors["initial_rate_beta"] <= 0: raise ValueError("initial_rate_beta must be greater than 0.") - def check_prev_cost(self) -> None: + def _check_prev_cost(self) -> None: if any(cost <= 0 for cost in self.factors["prev_cost"]): raise ValueError("All costs in prev_cost must be greater than 0.") - def check_stages(self) -> None: + def _check_stages(self) -> None: if self.factors["stages"] <= 0: raise ValueError("Stages must be greater than 0.") - def check_prev_decision(self) -> None: - if any(u < 0 or u > 1 for u in self.factors["prev_decision"]): + def _check_prev_decision(self) -> None: + if not all(0 <= u <= 1 for u in self.factors["prev_decision"]): raise ValueError( - "All elements in prev_decision must be between 0 and 1." + "All elements in prev_decision must be in the range [0, 1]." ) + @override def check_simulatable_factors(self) -> bool: # Check for matching number of stages. if len(self.factors["prev_decision"]) != self.factors["stages"]: raise ValueError( - "The number of stages must be equal to the length of the previous decision tuple." + "The number of stages must be equal to the length of the previous " + "decision tuple." ) return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: - """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "level" = a list of contamination levels over time - gradients : dict of dicts - gradient estimates for each response - """ + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "level": A list of contamination levels over time. + - gradients (dict): A dictionary of gradient estimates for each + response. + """ + stages: int = self.factors["stages"] + init_alpha: float = self.factors["initial_rate_alpha"] + init_beta: float = self.factors["initial_rate_beta"] + contam_alpha: float = self.factors["contam_rate_alpha"] + contam_beta: float = self.factors["contam_rate_beta"] + restore_alpha: float = self.factors["restore_rate_alpha"] + restore_beta: float = self.factors["restore_rate_beta"] + u: tuple = self.factors["prev_decision"] + # Designate separate random number generators. # Outputs will be coupled when generating demand. contam_rng = rng_list[0] restore_rng = rng_list[1] - # Generate rates with beta distribution. - levels = np.zeros(self.factors["stages"]) - levels[0] = restore_rng.betavariate( - alpha=self.factors["initial_rate_alpha"], - beta=self.factors["initial_rate_beta"], - ) - u = self.factors["prev_decision"] - for i in range(1, self.factors["stages"]): - c = contam_rng.betavariate( - alpha=self.factors["contam_rate_alpha"], - beta=self.factors["contam_rate_beta"], - ) - r = restore_rng.betavariate( - alpha=self.factors["restore_rate_alpha"], - beta=self.factors["restore_rate_beta"], - ) - levels[i] = ( - c * (1 - u[i]) * (1 - levels[i - 1]) - + (1 - r * u[i]) * levels[i - 1] - ) + + # Initialize levels with beta distribution. + levels = np.zeros(stages) + levels[0] = restore_rng.betavariate(alpha=init_alpha, beta=init_beta) + + # Generate contamination and restoration values with beta distribution. + rand_range = range(stages - 1) + contamination_rates = [ + contam_rng.betavariate(contam_alpha, contam_beta) for _ in rand_range + ] + restoration_rates = [ + restore_rng.betavariate(restore_alpha, restore_beta) for _ in rand_range + ] + + # Calculate contamination and restoration levels. + # Start from stage 1; stage 0 was initialized separately. + for i in range(1, stages): + c = contamination_rates[i - 1] + r = restoration_rates[i - 1] + u_i = u[i] + prev = levels[i - 1] + + contamination_change = c * (1 - u_i) * (1 - prev) + restoration_change = (1 - r * u_i) * prev + levels[i] = contamination_change + restoration_change # Compose responses and gradients. responses = {"level": levels} gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the (deterministic) total cost of prevention efforts. -""" +class ContaminationTotalCostDisc(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "CONTAM-1" -class ContaminationTotalCostDisc(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : float - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : list - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - prev_cost : list - cost of prevention - upper_thres : float > 0 - upper limit of amount of contamination - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Total Cost for Discrete Contamination" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 @property + @override def n_stochastic_constraints(self) -> int: return self.model.factors["stages"] - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.STOCHASTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.DISCRETE - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"prev_decision"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -368,24 +328,28 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, - "prev_cost": self.check_prev_cost, - "error_prob": self.check_error_prob, - "upper_thres": self.check_upper_thres, + "prev_cost": self._check_prev_cost, + "error_prob": self._check_error_prob, + "upper_thres": self._check_upper_thres, } @property + @override def dim(self) -> int: return self.model.factors["stages"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.model.factors["stages"] @property + @override def upper_bounds(self) -> tuple: return (1,) * self.model.factors["stages"] @@ -395,6 +359,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the ContaminationTotalCostDisc problem. + + Args: + name (str, optional): Name of the problem. Defaults to "CONTAM-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -403,333 +376,151 @@ def __init__( model=Contamination, ) - def check_prev_cost(self) -> bool: - if len(self.factors["prev_cost"]) != self.dim: - return False - elif any([elem < 0 for elem in self.factors["prev_cost"]]): - return False - else: - return True - - def check_error_prob(self) -> bool: - if len(self.factors["error_prob"]) != self.dim: - return False - elif all(error < 0 for error in self.factors["error_prob"]): - return False - else: - return True - - def check_upper_thres(self) -> bool: + def _check_prev_cost(self) -> bool: + return not ( + len(self.factors["prev_cost"]) != self.dim + or any(elem < 0 for elem in self.factors["prev_cost"]) + ) + + def _check_error_prob(self) -> bool: + return not ( + len(self.factors["error_prob"]) != self.dim + or all(error < 0 for error in self.factors["error_prob"]) + ) + + def _check_upper_thres(self) -> bool: return len(self.factors["upper_thres"]) == self.dim + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys + return {"prev_decision": vector[:]} - Arguments - --------- - vector : tuple - vector of values associated with decision variables + @override + def factor_dict_to_vector(self, factor_dict: dict) -> tuple: + return tuple(factor_dict["prev_decision"]) - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"prev_decision": vector[:]} - return factor_dict + @override + def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: # noqa: ARG002 + return (np.nan * len(self.model.factors["prev_decision"]),) - def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["prev_decision"]) - return vector - - def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: - """Convert a dictionary with factor keys to a gradient vector. - - Notes - ----- - A subclass of ``base.Problem`` can have its own custom - ``factor_dict_to_vector_gradients`` method if the - objective is deterministic. - - Parameters - ---------- - factor_dict : dict - Dictionary with factor keys and associated values. - - Returns - ------- - vector : tuple - Vector of partial derivatives associated with decision variables. - """ - vector = (np.nan * len(self.model.factors["prev_decision"]),) - return vector + @override + def response_dict_to_objectives(self, response_dict: dict) -> tuple: # noqa: ARG002 + return (0,) - def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (0,) - return objectives - - def response_dict_to_objectives_gradients( - self, response_dict: dict - ) -> tuple: - """Convert a dictionary with response keys to a vector - of gradients. - - Notes - ----- - A subclass of ``base.Problem`` can have its own custom - ``response_dict_to_objectives_gradients`` method if the - objective is deterministic. - - Parameters - ---------- - response_dict : dict - Dictionary with response keys and associated values. - - Returns - ------- - tuple - Vector of gradients. - """ + @override + def response_dict_to_objectives_gradients(self, _response_dict: dict) -> tuple: return ((0,) * len(self.model.factors["prev_decision"]),) def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint + """Convert a response dictionary to a vector of stochastic constraint values. + + Each returned value represents the left-hand side of a constraint of the form + E[Y] ≤ 0. + + Args: + response_dict (dict): A dictionary containing response keys and their + associated values. + + Returns: + tuple: A tuple representing the left-hand sides of the stochastic + constraints. """ under_control = response_dict["level"] <= self.factors["upper_thres"] - stoch_constraints = tuple([-1 * z for z in under_control]) - return stoch_constraints + return tuple([-1 * z for z in under_control]) - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints + def deterministic_stochastic_constraints_and_gradients(self) -> tuple[tuple, tuple]: + """Compute deterministic components of stochastic constraints. + + Returns: + tuple: + - tuple: The deterministic components of the stochastic constraints. + - tuple: The gradients of those deterministic components. """ - det_stoch_constraints = tuple( - np.ones(self.dim) - self.factors["error_prob"] - ) + det_stoch_constraints = tuple(np.ones(self.dim) - self.factors["error_prob"]) det_stoch_constraints_gradients = ((0,),) return det_stoch_constraints, det_stoch_constraints_gradients - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, x: tuple) -> tuple[tuple, tuple]: det_objectives = (np.dot(self.factors["prev_cost"], x),) det_objectives_gradients = (tuple(self.factors["prev_cost"]),) return det_objectives, det_objectives_gradients + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - between_0_and_1: list[bool] = [0 <= u <= 1 for u in x] - return all(between_0_and_1) + return all(0 <= u <= 1 for u in x) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ return tuple([rand_sol_rng.randint(0, 1) for _ in range(self.dim)]) class ContaminationTotalCostCont(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : list - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - prev_cost : list - cost of prevention - upper_thres : float > 0 - upper limit of amount of contamination - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + """Base class to implement simulation-optimization problems.""" - @property - def n_objectives(self) -> int: + @classproperty + @override + def class_name_abbr(cls) -> str: + return "CONTAM-2" + + @classproperty + @override + def class_name(cls) -> str: + return "Min Total Cost for Continuous Contamination" + + @classproperty + @override + def n_objectives(cls) -> int: return 1 @property + @override def n_stochastic_constraints(self) -> int: return self.model.factors["stages"] - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.STOCHASTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"prev_decision"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -760,24 +551,28 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, - "prev_cost": self.check_prev_cost, - "error_prob": self.check_error_prob, - "upper_thres": self.check_upper_thres, + "prev_cost": self._check_prev_cost, + "error_prob": self._check_error_prob, + "upper_thres": self._check_upper_thres, } @property + @override def dim(self) -> int: return self.model.factors["stages"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.model.factors["stages"] @property + @override def upper_bounds(self) -> tuple: return (1,) * self.model.factors["stages"] @@ -787,6 +582,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the ContaminationTotalCostCont problem. + + Args: + name (str, optional): Name of the problem. Defaults to "CONTAM-2". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -795,239 +599,102 @@ def __init__( model=Contamination, ) + @override def check_initial_solution(self) -> bool: - if len(self.factors["initial_solution"]) != self.dim: - return False - elif all(u < 0 or u > 1 for u in self.factors["initial_solution"]): - return False - else: - return True - - def check_prev_cost(self) -> bool: - if len(self.factors["prev_cost"]) != self.dim: - return False - elif any([elem < 0 for elem in self.factors["prev_cost"]]): - return False - else: - return True - - def check_budget(self) -> bool: - return self.factors["budget"] > 0 - - def check_error_prob(self) -> bool: - if len(self.factors["error_prob"]) != self.dim: - return False - elif all(error < 0 for error in self.factors["error_prob"]): - return False - else: - return True - - def check_upper_thres(self) -> bool: - return len(self.factors["upper_thres"]) == self.dim + return not ( + len(self.factors["initial_solution"]) != self.dim + or all(u < 0 or u > 1 for u in self.factors["initial_solution"]) + ) - def check_simulatable_factors(self) -> bool: - lower_len = len(self.lower_bounds) - upper_len = len(self.upper_bounds) - if lower_len != upper_len or lower_len != self.dim: - error_msg = f"Lower bounds: {lower_len}, Upper bounds: {upper_len}, Dim: {self.dim}" - raise ValueError(error_msg) - return True + def _check_prev_cost(self) -> bool: + return not ( + len(self.factors["prev_cost"]) != self.dim + or any(elem < 0 for elem in self.factors["prev_cost"]) + ) - def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys + def _check_error_prob(self) -> bool: + return not ( + len(self.factors["error_prob"]) != self.dim + or all(error < 0 for error in self.factors["error_prob"]) + ) - Arguments - --------- - vector : tuple - vector of values associated with decision variables + def _check_upper_thres(self) -> bool: + return len(self.factors["upper_thres"]) == self.dim - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"prev_decision": vector[:]} - return factor_dict + # # TODO: figure out how Problem.check_simulatable_factors() works + # def check_simulatable_factors(self) -> bool: + # lower_len = len(self.lower_bounds) + # upper_len = len(self.upper_bounds) + # if lower_len != upper_len or lower_len != self.dim: + # error_msg = ( + # f"Lower bounds: {lower_len}, " + # f"Upper bounds: {upper_len}, " + # f"Dim: {self.dim}" + # ) + # raise ValueError(error_msg) + # return True + + @override + def vector_to_factor_dict(self, vector: tuple) -> dict: + return {"prev_decision": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["prev_decision"]) - return vector - - def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: - """Convert a dictionary with factor keys to a gradient vector. - - Notes - ----- - A subclass of ``base.Problem`` can have its own custom - ``factor_dict_to_vector_gradients`` method if the - objective is deterministic. - - Parameters - ---------- - factor_dict : dict - Dictionary with factor keys and associated values. - - Returns - ------- - vector : tuple - Vector of partial derivatives associated with decision variables. - """ - vector = (np.nan * len(self.model.factors["prev_decision"]),) - return vector + return tuple(factor_dict["prev_decision"]) - def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (0,) - return objectives - - def response_dict_to_objectives_gradients( - self, response_dict: dict - ) -> tuple: - """Convert a dictionary with response keys to a vector - of gradients. - - Notes - ----- - A subclass of ``base.Problem`` can have its own custom - ``response_dict_to_objectives_gradients`` method if the - objective is deterministic. - - Parameters - ---------- - response_dict : dict - Dictionary with response keys and associated values. - - Returns - ------- - tuple - Vector of gradients. - """ + @override + def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: # noqa: ARG002 + return (np.nan * len(self.model.factors["prev_decision"]),) + + @override + def response_dict_to_objectives(self, response_dict: dict) -> tuple: # noqa: ARG002 + return (0,) + + @override + def response_dict_to_objectives_gradients(self, _response_dict: dict) -> tuple: return ((0,) * len(self.model.factors["prev_decision"]),) def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint + """Convert a response dictionary to a vector of stochastic constraint values. + + Each returned value represents the left-hand side of a constraint of the form + E[Y] ≤ 0. + + Args: + response_dict (dict): A dictionary containing response keys and their + associated values. + + Returns: + tuple: A tuple representing the left-hand sides of the stochastic + constraints. """ under_control = response_dict["level"] <= self.factors["upper_thres"] - stoch_constraints = tuple([-1 * z for z in under_control]) - return stoch_constraints + return tuple([-1 * z for z in under_control]) - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints + def deterministic_stochastic_constraints_and_gradients(self) -> tuple[tuple, tuple]: + """Compute deterministic components of stochastic constraints. + + Returns: + tuple: + - tuple: The deterministic components of the stochastic constraints. + - tuple: The gradients of those deterministic components. """ - det_stoch_constraints = tuple( - np.ones(self.dim) - self.factors["error_prob"] - ) + det_stoch_constraints = tuple(np.ones(self.dim) - self.factors["error_prob"]) det_stoch_constraints_gradients = ( (0,), ) # tuple of tuples - of sizes self.dim by self.dim, full of zeros return det_stoch_constraints, det_stoch_constraints_gradients - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, x: tuple) -> tuple[tuple, tuple]: det_objectives = (np.dot(self.factors["prev_cost"], x),) det_objectives_gradients = (tuple(self.factors["prev_cost"]),) return det_objectives, det_objectives_gradients + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - between_0_and_1: list[bool] = [0 <= u <= 1 for u in x] - return all(between_0_and_1) + return all(0 <= u <= 1 for u in x) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ return tuple([rand_sol_rng.random() for _ in range(self.dim)]) diff --git a/simopt/models/dualsourcing.py b/simopt/models/dualsourcing.py index 8c167ca2e..1144af7c5 100644 --- a/simopt/models/dualsourcing.py +++ b/simopt/models/dualsourcing.py @@ -1,92 +1,37 @@ -""" -Summary -------- -Simulate multiple periods of ordering and sales for a dual sourcing inventory problem. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate periods of ordering and sales for a dual sourcing inventory problem.""" from __future__ import annotations from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class DualSourcing(Model): - """ + """Dual Sourcing Inventory Model. + A model that simulates multiple periods of ordering and sales for a single-staged, - dual sourcing inventory problem with stochastic demand. Returns average holding cost, - average penalty cost, and average ordering cost per period. - - Attributes - ---------- - name : str - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Parameters - ---------- - fixed_factors : dict - fixed_factors of the simulation model - - ``n_days`` - Number of days to simulate (`int`) - ``initial_inv`` - Initial inventory (`int`) - ``cost_reg`` - Regular ordering cost per unit (`flt`) - ``cost_exp`` - Expedited ordering cost per unit (`flt`) - ``lead_reg`` - Lead time for regular orders in days (`int`) - ``lead_exp`` - Lead time for expedited orders in days (`int`) - ``holding_cost`` - Holding cost per unit per period (`flt`) - ``penalty_cost`` - Penalty cost per unit per period for backlogging(`flt`) - ``st_dev`` - Standard deviation of demand distribution (`flt`) - ``mu`` - Mean of demand distribution (`flt`) - ``order_level_reg`` - Order-up-to level for regular orders (`int`) - ``order_level_exp`` - Order-up-to level for expedited orders (`int`) - - - See also - -------- - base.Model + dual sourcing inventory problem with stochastic demand. Returns average holding + cost, average penalty cost, and average ordering cost per period. """ - @property - def name(self) -> str: - return "DUALSOURCING" - - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 3 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "n_days": { "description": "number of days to simulate", @@ -152,185 +97,176 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "n_days": self.check_n_days, - "initial_inv": self.check_initial_inv, - "cost_reg": self.check_cost_reg, - "cost_exp": self.check_cost_exp, - "lead_reg": self.check_lead_reg, - "lead_exp": self.check_lead_exp, - "holding_cost": self.check_holding_cost, - "penalty_cost": self.check_penalty_cost, - "st_dev": self.check_st_dev, - "mu": self.check_mu, - "order_level_reg": self.check_order_level_reg, - "order_level_exp": self.check_order_level_exp, + "n_days": self._check_n_days, + "initial_inv": self._check_initial_inv, + "cost_reg": self._check_cost_reg, + "cost_exp": self._check_cost_exp, + "lead_reg": self._check_lead_reg, + "lead_exp": self._check_lead_exp, + "holding_cost": self._check_holding_cost, + "penalty_cost": self._check_penalty_cost, + "st_dev": self._check_st_dev, + "mu": self._check_mu, + "order_level_reg": self._check_order_level_reg, + "order_level_exp": self._check_order_level_exp, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the DualSourcing model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) # Check for simulatable factors - def check_n_days(self) -> None: + def _check_n_days(self) -> None: if self.factors["n_days"] < 1: raise ValueError("n_days must be greater than or equal to 1.") - def check_initial_inv(self) -> None: + def _check_initial_inv(self) -> None: if self.factors["initial_inv"] < 0: raise ValueError("initial_inv must be greater than or equal to 0.") - def check_cost_reg(self) -> None: + def _check_cost_reg(self) -> None: if self.factors["cost_reg"] <= 0: raise ValueError("cost_reg must be greater than 0.") - def check_cost_exp(self) -> None: + def _check_cost_exp(self) -> None: if self.factors["cost_exp"] <= 0: raise ValueError("cost_exp must be greater than 0.") - def check_lead_reg(self) -> None: + def _check_lead_reg(self) -> None: if self.factors["lead_reg"] < 0: raise ValueError("lead_reg must be greater than or equal to 0.") - def check_lead_exp(self) -> None: + def _check_lead_exp(self) -> None: if self.factors["lead_exp"] < 0: raise ValueError("lead_exp must be greater than or equal to 0.") - def check_holding_cost(self) -> None: + def _check_holding_cost(self) -> None: if self.factors["holding_cost"] <= 0: raise ValueError("holding_cost must be greater than 0.") - def check_penalty_cost(self) -> None: + def _check_penalty_cost(self) -> None: if self.factors["penalty_cost"] <= 0: raise ValueError("penalty_cost must be greater than 0.") - def check_st_dev(self) -> None: + def _check_st_dev(self) -> None: if self.factors["st_dev"] <= 0: raise ValueError("st-dev must be greater than 0.") - def check_mu(self) -> None: + def _check_mu(self) -> None: if self.factors["mu"] <= 0: raise ValueError("mu must be greater than 0.") - def check_order_level_reg(self) -> None: + def _check_order_level_reg(self) -> None: if self.factors["order_level_reg"] < 0: - raise ValueError( - "order_level_reg must be greater than or equal to 0." - ) + raise ValueError("order_level_reg must be greater than or equal to 0.") - def check_order_level_exp(self) -> None: + def _check_order_level_exp(self) -> None: if self.factors["order_level_exp"] < 0: - raise ValueError( - "order_level_exp must be greater than or equal to 0." - ) + raise ValueError("order_level_exp must be greater than or equal to 0.") + @override def check_simulatable_factors(self) -> bool: if (self.factors["lead_exp"] > self.factors["lead_reg"]) or ( self.factors["cost_exp"] < self.factors["cost_reg"] ): raise ValueError( - "lead_exp must be less than lead_reg and cost_exp must be greater than cost_reg" + "lead_exp must be less than lead_reg and cost_exp must be greater than " + "cost_reg" ) return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest: + - "average_holding_cost": The average holding cost over the + time period. + - "average_penalty_cost": The average penalty cost over the + time period. + - "average_ordering_cost": The average ordering cost over the + time period. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - - ``average_holding_cost`` - The average holding cost over the time period - ``average_penalty_cost`` - The average penalty cost over the time period - ``average_ordering_cost`` - The average ordering cost over the time period - """ + n_days: int = self.factors["n_days"] + n_days_range = range(n_days) + lead_reg: int = self.factors["lead_reg"] + lead_exp: int = self.factors["lead_exp"] + order_level_reg: int = self.factors["order_level_reg"] + order_level_exp: int = self.factors["order_level_exp"] + mu: float = self.factors["mu"] + st_dev: float = self.factors["st_dev"] + initial_inv: int = self.factors["initial_inv"] + cost_exp: float = self.factors["cost_exp"] + cost_reg: float = self.factors["cost_reg"] + penalty_cost: float = self.factors["penalty_cost"] + holding_cost: float = self.factors["holding_cost"] + + def round_and_clamp_non_neg(x: float | int) -> int: + return round(max(0, x)) + # Designate random number generators. demand_rng = rng_list[0] # Vectors of regular orders to be received in periods n through n + lr - 1. - orders_reg = np.zeros(self.factors["lead_reg"]) + orders_reg = [0] * lead_reg # Vectors of expedited orders to be received in periods n through n + le - 1. - orders_exp = np.zeros(self.factors["lead_exp"]) + orders_exp = [0] * lead_exp # Generate demand. - demand = [ - round( - max( - 0, - demand_rng.normalvariate( - mu=self.factors["mu"], sigma=self.factors["st_dev"] - ), - ) - ) - for _ in range(self.factors["n_days"]) - ] + demand = [] + for _ in n_days_range: + draw = demand_rng.normalvariate(mu=mu, sigma=st_dev) + demand.append(round_and_clamp_non_neg(draw)) # Track total expenses. - total_holding_cost = np.zeros(self.factors["n_days"]) - total_penalty_cost = np.zeros(self.factors["n_days"]) - total_ordering_cost = np.zeros(self.factors["n_days"]) - inv = self.factors["initial_inv"] + total_holding_cost = np.zeros(n_days) + total_penalty_cost = np.zeros(n_days) + total_ordering_cost = np.zeros(n_days) + inv = initial_inv # Run simulation over time horizon. - for day in range(self.factors["n_days"]): + for day in n_days_range: # Calculate inventory positions. - inv_position_exp = round( - inv - + np.sum(orders_exp) - + np.sum(orders_reg[: self.factors["lead_exp"]]) - ) - inv_position_reg = round( - inv + np.sum(orders_exp) + np.sum(orders_reg) + inv_order_exp_sum = inv + sum(orders_exp) + inv_position_exp = round(inv_order_exp_sum + sum(orders_reg[:lead_exp])) + inv_position_reg = round(inv_order_exp_sum + sum(orders_reg)) + # Calculate how much to order. + order_exp = round_and_clamp_non_neg( + order_level_exp - inv_position_exp - orders_reg[lead_exp] ) - # Place orders if needed. - orders_exp = np.append( - orders_exp, - max( - 0, - round( - self.factors["order_level_exp"] - - inv_position_exp - - orders_reg[self.factors["lead_exp"]] - ), - ), - ) - orders_reg = np.append( - orders_reg, - ( - self.factors["order_level_reg"] - - inv_position_reg - - orders_exp[self.factors["lead_exp"]] - ), + orders_exp.append(order_exp) + order_reg = round_and_clamp_non_neg( + order_level_reg - inv_position_reg - orders_exp[lead_exp] ) + orders_reg.append(order_reg) # Charge ordering cost. - total_ordering_cost[day] = ( - self.factors["cost_exp"] * orders_exp[self.factors["lead_exp"]] - + self.factors["cost_reg"] - * orders_reg[self.factors["lead_reg"]] - ) + daily_cost_exp = cost_exp * order_exp + daily_cost_reg = cost_reg * order_reg + total_ordering_cost[day] = daily_cost_exp + daily_cost_reg # Orders arrive, update on-hand inventory. - inv = inv + orders_exp[0] + orders_reg[0] - orders_exp = np.delete(orders_exp, 0) - orders_reg = np.delete(orders_reg, 0) + inv += orders_exp.pop(0) + orders_reg.pop(0) # Satisfy or backorder demand. # dn = max(0, demand[day]) THIS IS DONE TWICE # inv = inv - dn - inv = inv - demand[day] - total_penalty_cost[day] = ( - -1 * self.factors["penalty_cost"] * min(0, inv) - ) - # Charge holding cost. - total_holding_cost[day] = self.factors["holding_cost"] * max(0, inv) + inv -= demand[day] + # Calculate holding and penalty costs. + total_penalty_cost[day] = -penalty_cost * min(0, inv) + total_holding_cost[day] = holding_cost * max(0, inv) # Calculate responses from simulation data. responses = { @@ -339,125 +275,78 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: "average_holding_cost": np.mean(total_holding_cost), } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the expected total cost for dual-sourcing inventory system. -""" +class DualSourcingMinCost(Problem): + """Class to make dual-sourcing inventory simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "DUALSOURCING-1" -class DualSourcingMinCost(Problem): - """ - Class to make dual-sourcing inventory simulation-optimization problems. - - Attributes - ---------- - name : str - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : str - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : str - description of variable types: - "discrete", "continuous", "mixed" - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : base.Model - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name of problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Cost for Dual Sourcing" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.DISCRETE - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"order_level_exp", "order_level_reg"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -473,22 +362,26 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 2 - @property - def lower_bounds(self) -> tuple: + @classproperty + @override + def lower_bounds(cls) -> tuple: return (0, 0) - @property - def upper_bounds(self) -> tuple: + @classproperty + @override + def upper_bounds(cls) -> tuple: return (np.inf, np.inf) def __init__( @@ -497,6 +390,14 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the DualSourcingMinCost problem. + + Args: + name (str, optional): Name of the problem. Defaults to "DUALSOURCING-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Model fixed factors. Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -505,163 +406,38 @@ def __init__( model=DualSourcing, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys. - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dict - dictionary with factor keys and associated values - """ - factor_dict = { + return { "order_level_exp": vector[0], "order_level_reg": vector[1], } - return factor_dict + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dict - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = ( + return ( factor_dict["order_level_exp"], factor_dict["order_level_reg"], ) - return vector + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = ( + return ( response_dict["average_ordering_cost"] + response_dict["average_penalty_cost"] + response_dict["average_holding_cost"], ) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0, 0),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ return x[0] >= 0 and x[1] >= 0 + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - x = (rand_sol_rng.randint(40, 60), rand_sol_rng.randint(70, 90)) - return x + return (rand_sol_rng.randint(40, 60), rand_sol_rng.randint(70, 90)) diff --git a/simopt/models/dynamnews.py b/simopt/models/dynamnews.py index 9f9c4bb48..546a10bc6 100644 --- a/simopt/models/dynamnews.py +++ b/simopt/models/dynamnews.py @@ -1,68 +1,44 @@ -""" -Summary -------- -Simulate a day's worth of sales for a newsvendor under dynamic consumer substitution. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate sales for a newsvendor under dynamic consumer substitution.""" from __future__ import annotations from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override NUM_PRODUCTS: Final[int] = 10 class DynamNews(Model): - """ + """Dynamic Newsvendor Model. + A model that simulates a day's worth of sales for a newsvendor with dynamic consumer substitution. Returns the profit and the number of products that stock out. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : dict - fixed_factors of the simulation model - - See also - -------- - base.Model """ - @property - def name(self) -> str: - return "DYNAMNEWS" + @classproperty + @override + def class_name(cls) -> str: + return "Dynamic Newsvendor" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 4 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "num_prod": { "description": "number of products", @@ -102,136 +78,150 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "num_prod": self.check_num_prod, - "num_customer": self.check_num_customer, - "c_utility": self.check_c_utility, - "mu": self.check_mu, - "init_level": self.check_init_level, - "price": self.check_price, - "cost": self.check_cost, + "num_prod": self._check_num_prod, + "num_customer": self._check_num_customer, + "c_utility": self._check_c_utility, + "mu": lambda: None, + "init_level": self._check_init_level, + "price": self._check_price, + "cost": self._check_cost, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_num_prod(self) -> None: + def _check_num_prod(self) -> None: if self.factors["num_prod"] <= 0: raise ValueError("num_prod must be greater than 0.") - def check_num_customer(self) -> None: + def _check_num_customer(self) -> None: if self.factors["num_customer"] <= 0: raise ValueError("num_customer must be greater than 0.") - def check_c_utility(self) -> None: + def _check_c_utility(self) -> None: if len(self.factors["c_utility"]) != self.factors["num_prod"]: - raise ValueError( - "The length of c_utility must be equal to num_prod." - ) + raise ValueError("The length of c_utility must be equal to num_prod.") - def check_init_level(self) -> None: + def _check_init_level(self) -> None: if any(np.array(self.factors["init_level"]) < 0) or ( len(self.factors["init_level"]) != self.factors["num_prod"] ): raise ValueError( - "The length of init_level must be equal to num_prod and every element in init_level must be greater than or equal to zero." + "The length of init_level must be equal to num_prod and every element " + "in init_level must be greater than or equal to zero." ) - def check_mu(self) -> None: - # TODO: figure out if mu has any constraints - pass - - def check_price(self) -> None: + def _check_price(self) -> None: if any(np.array(self.factors["price"]) < 0) or ( len(self.factors["price"]) != self.factors["num_prod"] ): raise ValueError( - "The length of price must be equal to num_prod and every element in price must be greater than or equal to zero." + "The length of price must be equal to num_prod and every element in " + "price must be greater than or equal to zero." ) - def check_cost(self) -> None: + def _check_cost(self) -> None: if any(np.array(self.factors["cost"]) < 0) or ( len(self.factors["cost"]) != self.factors["num_prod"] ): raise ValueError( - "The length of cost must be equal to num_prod and every element in cost must be greater than or equal to 0." + "The length of cost must be equal to num_prod and every element in " + "cost must be greater than or equal to 0." ) + @override def check_simulatable_factors(self) -> bool: if any(np.subtract(self.factors["price"], self.factors["cost"]) < 0): raise ValueError( - "Each element in price must be greater than its corresponding element in cost." + "Each element in price must be greater than its corresponding element " + "in cost." ) return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "profit": Profit in this scenario. + - "n_prod_stockout": Number of products that are out of stock. + - "n_missed_orders": Number of unmet customer orders. + - "fill_rate": Fraction of customer orders fulfilled. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "profit" = profit in this scenario - "n_prod_stockout" = number of products which are out of stock - "n_missed_orders" = number of unmet customer orders - "fill_rate" = fraction of customer orders fulfilled - """ + num_customer: int = self.factors["num_customer"] + num_prod: int = self.factors["num_prod"] + mu: float = self.factors["mu"] + init_level: list = self.factors["init_level"] + c_utility: list = self.factors["c_utility"] + price: list = self.factors["price"] + cost: list = self.factors["cost"] + # Designate random number generator for generating a Gumbel random variable. gumbel_rng = rng_list[0] # Compute Gumbel rvs for the utility of the products. - gumbel = np.zeros( - (self.factors["num_customer"], self.factors["num_prod"]) - ) - for t in range(self.factors["num_customer"]): - for j in range(self.factors["num_prod"]): - gumbel[t][j] = gumbel_rng.gumbelvariate( - -self.factors["mu"] * np.euler_gamma, self.factors["mu"] - ) + gumbel_mu = -mu * np.euler_gamma + gumbel_beta = mu + gumbel_flat = [ + gumbel_rng.gumbelvariate(gumbel_mu, gumbel_beta) + for _ in range(num_customer * num_prod) + ] + gumbel = np.reshape(gumbel_flat, (num_customer, num_prod)) + # Compute utility for each product and each customer. - utility = np.zeros( - (self.factors["num_customer"], self.factors["num_prod"] + 1) - ) - for t in range(self.factors["num_customer"]): - for j in range(self.factors["num_prod"] + 1): - if j == 0: - utility[t][j] = 0 - else: - utility[t][j] = ( - self.factors["c_utility"][j - 1] + gumbel[t][j - 1] - ) + utility = np.zeros((num_customer, num_prod + 1)) + # Keep the first column of utility as 0, which indicates no purchase. + utility[:, 1:] = np.array(c_utility) + gumbel # Initialize inventory. - inventory = np.copy(self.factors["init_level"]) - itembought = np.zeros(self.factors["num_customer"]) + inventory = np.copy(init_level) + itembought = np.zeros(num_customer) # Loop through customers - for t in range(self.factors["num_customer"]): + for t in range(num_customer): + # Figure out which producs are in stock instock = np.where(inventory > 0)[0] - # Initialize the purchase option to be no-purchase. - itembought[t] = 0 - # Assign the purchase option to be the product that maximizes the utility. - for j in instock: - if utility[t][j + 1] > utility[t][int(itembought[t])]: - itembought[t] = j + 1 - # print("item bought", int(itembought[t])) - if itembought[t] != 0: - inventory[int(itembought[t] - 1)] -= 1 + + # If no products are in stock, no purchase is made. + if len(instock) == 0: + itembought[t] = 0 + continue + + # Shift indices to match utility (1-based product indices) + utility_options = utility[t, instock + 1] + + # Pick index of max utility + best_idx = np.argmax(utility_options) + best_product = instock[best_idx] + 1 + + # Record it and decrement inventory. + itembought[t] = best_product + inventory[best_product - 1] -= 1 # Calculate profit. - numsold = self.factors["init_level"] - inventory - revenue = numsold * np.array(self.factors["price"]) - cost = self.factors["init_level"] * np.array(self.factors["cost"]) - profit = revenue - cost - unmet_demand = self.factors["num_customer"] - sum(numsold) - order_fill_rate = sum(numsold) / self.factors["num_customer"] + numsold = init_level - inventory + total_sold = sum(numsold) + revenue = numsold * np.array(price) + costs = init_level * np.array(cost) + profit = revenue - costs + unmet_demand = num_customer - total_sold + order_fill_rate = total_sold / num_customer # Compose responses and gradients. responses = { @@ -241,129 +231,78 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: "fill_rate": order_fill_rate, } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Maximize the expected profit for the continuous newsvendor problem. -""" +class DynamNewsMaxProfit(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "DYNAMNEWS-1" -class DynamNewsMaxProfit(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Profit for Dynamic Newsvendor" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"init_level"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -379,6 +318,7 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, @@ -386,14 +326,17 @@ def check_factor_list(self) -> dict[str, Callable]: } @property + @override def dim(self) -> int: return self.model.factors["num_prod"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (np.inf,) * self.dim @@ -403,6 +346,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the problem. + + Args: + name (str, optional): Name of the problem. Defaults to "DYNAMNEWS-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -411,152 +363,28 @@ def __init__( model=DynamNews, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"init_level": vector[:]} - return factor_dict + return {"init_level": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["init_level"]) - return vector + return tuple(factor_dict["init_level"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["profit"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["profit"],) - def deterministic_objectives_and_gradients(self, x: tuple) -> tuple: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple: det_objectives = (0,) det_objectives_gradients = ((0,),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - greater_than_zero: list[bool] = [x[j] > 0 for j in range(self.dim)] - return all(greater_than_zero) + return all(x[j] > 0 for j in range(self.dim)) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - x = tuple([rand_sol_rng.uniform(0, 10) for _ in range(self.dim)]) - return x + return tuple([rand_sol_rng.uniform(0, 10) for _ in range(self.dim)]) diff --git a/simopt/models/example.py b/simopt/models/example.py index 84292bc47..8d332d167 100644 --- a/simopt/models/example.py +++ b/simopt/models/example.py @@ -1,6 +1,5 @@ -""" -Summary -------- +"""Example problem of deterministic function with noise. + Simulate a synthetic problem with a deterministic objective function evaluated with noise. """ @@ -10,54 +9,38 @@ from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class ExampleModel(Model): - """ - A model that is a deterministic function evaluated with noise. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : dict - fixed_factors of the simulation model - - See also - -------- - base.Model - """ + """A model that is a deterministic function evaluated with noise.""" - @property - def name(self) -> str: + @classproperty + @override + def class_name_abbr(cls) -> str: return "EXAMPLE" - @property - def n_rngs(self) -> int: + @classproperty + @override + def class_name(cls) -> str: + return "Deterministic Function + Noise" + + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "x": { "description": "point to evaluate", @@ -67,31 +50,33 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: - return {"x": self.check_x} + return {"x": lambda: True} def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the model. + + Args: + fixed_factors (dict | None): fixed factors of the model. + If None, use default values. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_x(self) -> bool: - # Assume f(x) can be evaluated at any x in R^d. - return True - def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: - """ - Evaluate a deterministic function f(x) with stochastic noise. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "est_f(x)" = f(x) evaluated with stochastic noise + """Evaluate a deterministic function f(x) with stochastic noise. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "est_f(x)": Estimate of f(x) with added stochastic noise. + - gradients (dict): A dictionary of gradient estimates for + each response. """ # Designate random number generator for stochastic noise. noise_rng = rng_list[0] @@ -104,120 +89,70 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: return responses, gradients -""" -Summary -------- -Minimize f(x). -""" +class ExampleProblem(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "EXAMPLE-1" -class ExampleProblem(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Deterministic Function + Noise" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.UNCONSTRAINED - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: # Change if f is changed # TODO: figure out what f is return 0.0 @property + @override def optimal_solution(self) -> tuple: # Change if f is changed # TODO: figure out what f is return (0,) * self.dim - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} @property + @override def model_fixed_factors(self) -> dict: return {} @@ -226,12 +161,14 @@ def model_fixed_factors(self, value: dict | None) -> None: # TODO: figure out if fixed factors should change pass - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"x"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -247,6 +184,7 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, @@ -254,14 +192,17 @@ def check_factor_list(self) -> dict[str, Callable]: } @property + @override def dim(self) -> int: return len(self.factors["initial_solution"]) @property + @override def lower_bounds(self) -> tuple: return (-np.inf,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (np.inf,) * self.dim @@ -269,9 +210,19 @@ def __init__( self, name: str = "EXAMPLE-1", fixed_factors: dict | None = None, - model_fixed_factors: dict | None = None, + model_fixed_factors: dict | None = None, # noqa: ARG002 ) -> None: + """Initialize the problem. + + Args: + name (str): user-specified name for problem + fixed_factors (dict | None): fixed factors of the problem. + If None, use default values. + model_fixed_factors (dict | None): fixed factors of the model. + If None, use default values. + """ # Let the base class handle default arguments. + # TODO: check if model_fixed_factors should be passed to the model super().__init__( name=name, fixed_factors=fixed_factors, @@ -279,160 +230,31 @@ def __init__( model=ExampleModel, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"x": vector[:]} - return factor_dict + return {"x": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["x"]) - return vector + return tuple(factor_dict["x"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - tuple - vector of objectives - """ - objectives = (response_dict["est_f(x)"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["est_f(x)"],) - def deterministic_objectives_and_gradients(self, x: tuple) -> tuple: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - tuple - vector of deterministic components of objectives - tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple: det_objectives = (0,) det_objectives_gradients = ((0,) * self.dim,) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - tuple - vector of deterministic components of stochastic constraints - tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - - def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - bool - indicates if solution `x` satisfies the deterministic constraints. - """ - # Superclass method will check box constraints. - # Can add other constraints here. - return super().check_deterministic_constraints(x) - + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - tuple - vector of decision variables - """ # x = tuple([rand_sol_rng.uniform(-2, 2) for _ in range(self.dim)]) - x = tuple( + return tuple( rand_sol_rng.mvnormalvariate( - mean_vec=np.zeros(self.dim), + mean_vec=[0] * self.dim, cov=np.eye(self.dim), factorized=False, ) ) - return x diff --git a/simopt/models/facilitysizing.py b/simopt/models/facilitysizing.py index e0093f0c1..b0c8da1db 100644 --- a/simopt/models/facilitysizing.py +++ b/simopt/models/facilitysizing.py @@ -1,71 +1,53 @@ -""" -Summary -------- -Simulate demand at facilities. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate demand at facilities.""" from __future__ import annotations from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override NUM_FACILITIES: Final[int] = 3 class FacilitySize(Model): - """ - A model that simulates a facilitysize problem with a - multi-variate normal distribution. - Returns the probability of violating demand in each scenario. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model + """Facility Sizing Model. + + A model that simulates a facilitysize problem with a multi-variate normal + distribution. Returns the probability of violating demand in each scenario. """ - @property - def name(self) -> str: + @classproperty + @override + def class_name_abbr(cls) -> str: return "FACSIZE" - @property - def n_rngs(self) -> int: + @classproperty + @override + def class_name(cls) -> str: + return "Facility Sizing" + + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 3 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "mean_vec": { - "description": "location parameters of the multivariate normal distribution", + "description": ( + "location parameters of the multivariate normal distribution" + ), "datatype": list, "default": [100] * NUM_FACILITIES, }, @@ -92,222 +74,170 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "mean_vec": self.check_mean_vec, - "cov": self.check_cov, - "capacity": self.check_capacity, - "n_fac": self.check_n_fac, + "mean_vec": self._check_mean_vec, + "cov": self._check_cov, + "capacity": self._check_capacity, + "n_fac": self._check_n_fac, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the FacilitySize model. + + Args: + fixed_factors (dict | None): Fixed factors for the model. + If None, default values are used. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_mean_vec(self) -> None: + def _check_mean_vec(self) -> None: if any(mean <= 0 for mean in self.factors["mean_vec"]): raise ValueError("All elements in mean_vec must be greater than 0.") - def check_cov(self) -> bool: + def _check_cov(self) -> bool: try: - np.linalg.cholesky(np.matrix(self.factors["cov"])) + np.linalg.cholesky(np.array(self.factors["cov"])) return True - except np.linalg.linalg.LinAlgError as err: - if "Matrix is not positive definite" in err.message: + except np.linalg.LinAlgError as err: + if "Matrix is not positive definite" in str(err): return False - else: - raise + raise - def check_capacity(self) -> None: + def _check_capacity(self) -> None: if len(self.factors["capacity"]) != self.factors["n_fac"]: raise ValueError("The length of capacity must equal n_fac.") - def check_n_fac(self) -> None: + def _check_n_fac(self) -> None: if self.factors["n_fac"] <= 0: raise ValueError("n_fac must be greater than 0.") + @override def check_simulatable_factors(self) -> bool: if len(self.factors["capacity"]) != self.factors["n_fac"]: raise ValueError("The length of capacity must be equal to n_fac.") - elif len(self.factors["mean_vec"]) != self.factors["n_fac"]: + if len(self.factors["mean_vec"]) != self.factors["n_fac"]: raise ValueError("The length of mean_vec must be equal to n_fac.") - elif len(self.factors["cov"]) != self.factors["n_fac"]: + if len(self.factors["cov"]) != self.factors["n_fac"]: raise ValueError("The length of cov must be equal to n_fac.") - elif len(self.factors["cov"][0]) != self.factors["n_fac"]: + if len(self.factors["cov"][0]) != self.factors["n_fac"]: raise ValueError("The length of cov[0] must be equal to n_fac.") - else: - return True + return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: - """ - Simulate a single replication for the current model factors. + """Simulate a single replication using the current model factors. Args: - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication + rng_list (list[MRG32k3a]): Random number generators for the model to use + when simulating a replication. Returns: - A tuple containing both a dictionary of responses and a dictionary - of gradient estimates for each response. - The responses dictionary contains the following keys: - stockout_flag : boolean - false - all facilities satisfy the demand, true - at least one of the facilities did not satisfy the demand - n_fac_stockout : integer - the number of facilities which cannot satisfy the demand - n_cut : integer - the number of toal demand which cannot be satisfied - """ + tuple: A tuple containing: + - dict: The responses dictionary, with keys: + - "stockout_flag" (bool): True if at least one facility failed to satisfy demand; + False otherwise. + - "n_fac_stockout" (int): Number of facilities that could not satisfy demand. + - "n_cut" (int): Total number of demand units that could not be satisfied. + - dict: Gradient estimates for each response. + """ # noqa: E501 + mean_vec: list[float | int] = self.factors["mean_vec"] + cov = np.array(self.factors["cov"]) + capacity = np.array(self.factors["capacity"]) # Designate RNG for demands. demand_rng = rng_list[0] - stockout_flag = 0 - n_fac_stockout = 0 - n_cut = 0 - # Generate random demands at facilities from truncated multivariate normal distribution. - demand = demand_rng.mvnormalvariate( - self.factors["mean_vec"], self.factors["cov"], factorized=False - ) - while np.any(demand < 0): - demand = demand_rng.mvnormalvariate( - self.factors["mean_vec"], self.factors["cov"], factorized=False - ) + # Generate random demands at facilities from truncated mv normal distribution. + while True: + demand = np.array(demand_rng.mvnormalvariate(mean_vec, cov)) + # Only leave if all demands are non-negative. + if np.all(demand >= 0): + break # Check for stockouts. - for i in range(self.factors["n_fac"]): - if demand[i] > self.factors["capacity"][i]: - n_fac_stockout = n_fac_stockout + 1 - stockout_flag = 1 - n_cut += demand[i] - self.factors["capacity"][i] + extra_demand = demand - capacity + pos_excess_mask = extra_demand > 0 + n_fac_stockout = np.sum(pos_excess_mask).astype(int) + n_cut = np.sum(extra_demand[pos_excess_mask]).astype(int) # Compose responses and gradients. responses = { - "stockout_flag": stockout_flag, + "stockout_flag": int(n_fac_stockout > 0), "n_fac_stockout": n_fac_stockout, "n_cut": n_cut, } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the (deterministic) total cost of installing capacity at -facilities subject to a chance constraint on stockout probability. -""" +class FacilitySizingTotalCost(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "FACSIZE-1" -class FacilitySizingTotalCost(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : float - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Total Cost for Facility Sizing" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 1 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.STOCHASTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> None: # return (185, 185, 185) return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"capacity"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "Initial solution from which solvers start.", @@ -333,23 +263,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, - "installation_costs": self.check_installation_costs, - "epsilon": self.check_epsilon, + "installation_costs": self._check_installation_costs, + "epsilon": self._check_epsilon, } @property + @override def dim(self) -> int: return self.model.factors["n_fac"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (np.inf,) * self.dim @@ -359,6 +293,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the FacilitySizingTotalCost problem. + + Args: + name (str): User-specified name for the problem. + fixed_factors (dict | None): User-specified problem factors. + If None, default values are used. + model_fixed_factors (dict | None): Subset of user-specified + non-decision factors to pass through to the model. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -367,346 +310,155 @@ def __init__( model=FacilitySize, ) - def check_installation_costs(self) -> None: - if ( - len(self.factors["installation_costs"]) - != self.model.factors["n_fac"] - ): - raise ValueError( - "The length of installation_costs must equal n_fac." - ) - elif any([elem < 0 for elem in self.factors["installation_costs"]]): + def _check_installation_costs(self) -> None: + if len(self.factors["installation_costs"]) != self.model.factors["n_fac"]: + raise ValueError("The length of installation_costs must equal n_fac.") + if any(elem < 0 for elem in self.factors["installation_costs"]): raise ValueError( "All elements in installation_costs must be greater than or equal to 0." ) - def check_epsilon(self) -> None: - if 0 > self.factors["epsilon"] or self.factors["epsilon"] > 1: + def _check_epsilon(self) -> None: + if self.factors["epsilon"] < 0 or self.factors["epsilon"] > 1: raise ValueError( - "epsilon must be greater than or equal to 0 and less than or equal to 1." + "epsilon must be greater than or equal to 0 and less than or equal " + "to 1." ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys + return {"capacity": vector[:]} - Arguments - --------- - vector : tuple - vector of values associated with decision variables + @override + def factor_dict_to_vector(self, factor_dict: dict) -> tuple: + return tuple(factor_dict["capacity"]) - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"capacity": vector[:]} - return factor_dict + @override + def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: # noqa: ARG002 + return (np.nan * len(self.model.factors["capacity"]),) - def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["capacity"]) - return vector - - def factor_dict_to_vector_gradients(self, factor_dict: dict) -> tuple: - """Convert a dictionary with factor keys to a gradient vector. - - Notes - ----- - A subclass of ``base.Problem`` can have its own custom - ``factor_dict_to_vector_gradients`` method if the - objective is deterministic. - - Parameters - ---------- - factor_dict : dict - Dictionary with factor keys and associated values. - - Returns - ------- - vector : tuple - Vector of partial derivatives associated with decision variables. - """ - vector = (np.nan * len(self.model.factors["capacity"]),) - return vector + @override + def response_dict_to_objectives(self, response_dict: dict) -> tuple: # noqa: ARG002 + return (0,) - def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (0,) - return objectives - - def response_dict_to_objectives_gradients( - self, response_dict: dict - ) -> tuple: - """Convert a dictionary with response keys to a vector - of gradients. - - Notes - ----- - A subclass of ``base.Problem`` can have its own custom - ``response_dict_to_objectives_gradients`` method if the - objective is deterministic. - - Parameters - ---------- - response_dict : dict - Dictionary with response keys and associated values. - - Returns - ------- - tuple - Vector of gradients. - """ + @override + def response_dict_to_objectives_gradients(self, _response_dict: dict) -> tuple: return ((0,) * len(self.model.factors["capacity"]),) def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = (response_dict["stockout_flag"],) - return stoch_constraints + """Convert a response dictionary to a vector of stochastic constraint values. - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: + Each returned value represents the left-hand side of a constraint of the form + E[Y] ≤ 0. + + Args: + response_dict (dict): A dictionary containing response keys and their + associated values. + + Returns: + tuple: A tuple representing the left-hand sides of the stochastic + constraints. """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints + return (response_dict["stockout_flag"],) + + def deterministic_stochastic_constraints_and_gradients(self) -> tuple[tuple, tuple]: + """Compute deterministic components of stochastic constraints. + + Returns: + tuple: + - tuple: The deterministic components of the stochastic constraints. + - tuple: The gradients of those deterministic components. """ det_stoch_constraints = (-self.factors["epsilon"],) det_stoch_constraints_gradients = ((0,),) return det_stoch_constraints, det_stoch_constraints_gradients - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, x: tuple) -> tuple[tuple, tuple]: det_objectives = (np.dot(self.factors["installation_costs"], x),) det_objectives_gradients = (tuple(self.factors["installation_costs"]),) return det_objectives, det_objectives_gradients - def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - # Check box constraints. - box_feasible = super().check_deterministic_constraints(x) - return box_feasible - + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ cov_matrix = np.diag([x**2 for x in self.factors["initial_solution"]]) x = rand_sol_rng.mvnormalvariate( self.factors["initial_solution"], cov_matrix, factorized=False ) - while np.any(x < 0): + while any(elem < 0 for elem in x): x = rand_sol_rng.mvnormalvariate( self.factors["initial_solution"], cov_matrix, factorized=False ) return tuple(x) -""" -Summary -------- -Maximize the probability of not stocking out subject to a budget -constraint on the total cost of installing capacity. -""" +class FacilitySizingMaxService(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "FACSIZE-2" -class FacilitySizingMaxService(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Service for Facility Sizing" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.DETERMINISTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> None: # return (175, 179, 143) return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"capacity"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "Initial solution from which solvers start.", @@ -731,23 +483,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, - "installation_costs": self.check_installation_costs, - "installation_budget": self.check_installation_budget, + "installation_costs": self._check_installation_costs, + "installation_budget": self._check_installation_budget, } @property + @override def dim(self) -> int: return self.model.factors["n_fac"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (np.inf,) * self.dim @@ -757,6 +513,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the FacilitySizingMaxService problem. + + Args: + name (str): User-specified name for the problem. + fixed_factors (dict | None): User-specified problem factors. + If None, default values are used. + model_fixed_factors (dict | None): Subset of user-specified + non-decision factors to pass through to the model. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -765,172 +530,48 @@ def __init__( model=FacilitySize, ) - def check_installation_costs(self) -> bool: - if ( - len(self.factors["installation_costs"]) - != self.model.factors["n_fac"] - ): - return False - elif any([elem < 0 for elem in self.factors["installation_costs"]]): - return False - else: - return True + def _check_installation_costs(self) -> bool: + return not ( + len(self.factors["installation_costs"]) != self.model.factors["n_fac"] + or any(elem < 0 for elem in self.factors["installation_costs"]) + ) - def check_installation_budget(self) -> bool: + def _check_installation_budget(self) -> bool: return self.factors["installation_budget"] > 0 + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"capacity": vector[:]} - return factor_dict + return {"capacity": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["capacity"]) - return vector + return tuple(factor_dict["capacity"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (1 - response_dict["stockout_flag"],) - return objectives + return (1 - response_dict["stockout_flag"],) - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints - - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - tuple - vector of deterministic components of objectives - tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0, 0, 0),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - # Check budget constraint. + # Check budget constraint budget_feasible = ( np.dot(self.factors["installation_costs"], x) <= self.factors["installation_budget"] ) - # Check box constraints. - box_feasible = super().check_deterministic_constraints(x) - return budget_feasible * box_feasible - - def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. + if not budget_feasible: + return False - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution + # Check box constraints from the base class + return super().check_deterministic_constraints(x) - Returns - ------- - tuple - vector of decision variables - """ + @override + def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: # Generate random vector of length # of facilities of continuous values # summing to less than or equal to installation budget. x = rand_sol_rng.continuous_random_vector_from_simplex( diff --git a/simopt/models/fixedsan.py b/simopt/models/fixedsan.py index 224587c59..b2dd55f8c 100644 --- a/simopt/models/fixedsan.py +++ b/simopt/models/fixedsan.py @@ -1,69 +1,45 @@ -""" -Summary -------- -Simulate duration of a stochastic activity network (SAN). -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate duration of a stochastic activity network (SAN).""" from __future__ import annotations from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override # TODO: figure out if this should ever be anything other than 13 NUM_ARCS: Final[int] = 13 class FixedSAN(Model): - """ + """Fixed Stochastic Activity Network (SAN) Model. + A model that simulates a stochastic activity network problem with tasks that have exponentially distributed durations, and the selected means come with a cost. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model """ - @property - def name(self) -> str: - return "FIXEDSAN" + @classproperty + @override + def class_name(cls) -> str: + return "Fixed Stochastic Activity Network" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "num_arcs": { "description": "number of arcs", @@ -83,122 +59,113 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "num_arcs": self.check_num_arcs, - "num_nodes": self.check_num_nodes, - "arc_means": self.check_arc_means, + "num_arcs": self._check_num_arcs, + "num_nodes": self._check_num_nodes, + "arc_means": self._check_arc_means, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Fixed Stochastic Activity Network model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_num_arcs(self) -> None: + def _check_num_arcs(self) -> None: if self.factors["num_arcs"] <= 0: raise ValueError("num_arcs must be greater than 0.") - def check_num_nodes(self) -> None: + def _check_num_nodes(self) -> None: if self.factors["num_nodes"] <= 0: raise ValueError("num_nodes must be greater than 0.") - def check_arc_means(self) -> bool: - for x in list(self.factors["arc_means"]): - if x <= 0: - return False - return True + def _check_arc_means(self) -> bool: + return all(x > 0 for x in list(self.factors["arc_means"])) def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "longest_path_length": The length or duration of the longest path. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "longest_path_length" = length/duration of longest path - gradients : dict of dicts - gradient estimates for each response - """ + num_nodes: int = self.factors["num_nodes"] + num_arcs: int = self.factors["num_arcs"] + thetas = list(self.factors["arc_means"]) + # Designate separate random number generators. exp_rng = rng_list[0] + # Make sure we're not going to index out of bounds. + if num_nodes < 9 or num_arcs < 13: + raise ValueError( + "This model only supports 9 nodes and 13 arcs. " + f"num_nodes: {num_nodes}, num_arcs: {num_arcs}" + ) # Generate arc lengths. - nodes = np.zeros(self.factors["num_nodes"]) - time_deriv = np.zeros( - (self.factors["num_nodes"], self.factors["num_arcs"]) - ) - thetas = list(self.factors["arc_means"]) + nodes = np.zeros(num_nodes) + time_deriv = np.zeros((num_nodes, num_arcs)) arcs = [exp_rng.expovariate(1 / x) for x in thetas] - # Brute force calculation like in Matlab code - nodes[1] = nodes[0] + arcs[0] - time_deriv[1, :] = time_deriv[0, :] - time_deriv[1, 0] = time_deriv[1, 0] + arcs[0] / thetas[0] - - nodes[2] = max(nodes[0] + arcs[1], nodes[1] + arcs[2]) - if nodes[0] + arcs[1] > nodes[1] + arcs[2]: - nodes[2] = nodes[0] + arcs[1] - time_deriv[2, :] = time_deriv[0, :] - time_deriv[2, 1] = time_deriv[2, 1] + arcs[1] / thetas[1] - else: - nodes[2] = nodes[1] + arcs[2] - time_deriv[2, :] = time_deriv[1, :] - time_deriv[2, 2] = time_deriv[2, 2] + arcs[2] / thetas[2] - - nodes[3] = nodes[1] + arcs[3] - time_deriv[3, :] = time_deriv[1, :] - time_deriv[3, 3] = time_deriv[3, 3] + arcs[3] / thetas[3] - - nodes[4] = nodes[3] + arcs[6] - time_deriv[4, :] = time_deriv[3, :] - time_deriv[4, 6] = time_deriv[4, 6] + arcs[6] / thetas[6] - - nodes[5] = max( - [nodes[1] + arcs[4], nodes[2] + arcs[5], nodes[4] + arcs[8]] - ) - ind = np.argmax( - [nodes[1] + arcs[4], nodes[2] + arcs[5], nodes[4] + arcs[8]] - ) - - if ind == 1: - time_deriv[5, :] = time_deriv[1, :] - time_deriv[5, 4] = time_deriv[5, 4] + arcs[4] / thetas[4] - elif ind == 2: - time_deriv[5, :] = time_deriv[2, :] - time_deriv[5, 5] = time_deriv[5, 5] + arcs[5] / thetas[5] - else: - time_deriv[5, :] = time_deriv[4, :] - time_deriv[5, 8] = time_deriv[5, 8] + arcs[8] / thetas[8] - - nodes[6] = nodes[3] + arcs[7] - time_deriv[6, :] = time_deriv[3, :] - time_deriv[6, 7] = time_deriv[6, 7] + arcs[7] / thetas[7] - - if nodes[6] + arcs[11] > nodes[4] + arcs[9]: - nodes[7] = nodes[6] + arcs[11] - time_deriv[7, :] = time_deriv[6, :] - time_deriv[7, 11] = time_deriv[7, 11] + arcs[11] / thetas[11] - else: - nodes[7] = nodes[4] + arcs[9] - time_deriv[7, :] = time_deriv[4, :] - time_deriv[7, 9] = time_deriv[7, 9] + arcs[9] / thetas[9] - - if nodes[5] + arcs[10] > nodes[7] + arcs[12]: - nodes[8] = nodes[5] + arcs[10] - time_deriv[8, :] = time_deriv[5, :] - time_deriv[8, 10] = time_deriv[8, 10] + arcs[10] / thetas[10] - else: - nodes[8] = nodes[7] + arcs[12] - time_deriv[8, :] = time_deriv[7, :] - time_deriv[8, 12] = time_deriv[8, 12] + arcs[12] / thetas[12] - - longest_path = nodes[8] + def get_time(prev_node_idx: int, arc_idx: int) -> float: + return nodes[prev_node_idx] + arcs[arc_idx] + + def update_node(target_node_idx: int, segments: list[tuple[int, int]]) -> None: + """Update the target node with the maximum time from the segments. + + Args: + target_node_idx (int): Index of the target node to be updated. + segments (list[tuple[int, int]]): List of (previous_node_idx, arc_idx) + tuples representing the segments leading to the target node. + """ + # Get the time for the first segment in the list + best_prev, best_arc = segments[0] + max_time = get_time(best_prev, best_arc) + # Iterate through the rest of the segments (if any) to find the + # maximum time + for seg_prev, seg_arc in segments[1:]: + t = get_time(seg_prev, seg_arc) + if t > max_time: + max_time = t + best_prev, best_arc = seg_prev, seg_arc + + # Update the target node with the maximum time and the + # time derivative + nodes[target_node_idx] = max_time + time_deriv[target_node_idx, :] = time_deriv[best_prev, :].copy() + time_deriv[target_node_idx, best_arc] += arcs[best_arc] / thetas[best_arc] + + # node 1 = node 0 + arc 0 + update_node(1, [(0, 0)]) + # node 2 = max(node0+arc1, node1+arc2) + update_node(2, [(0, 1), (1, 2)]) + # node 3 = node1 + arc3 + update_node(3, [(1, 3)]) + # node 4 = node3 + arc6 + update_node(4, [(3, 6)]) + # node 5 = max(node1+arc4, node2+arc5, node4+arc8) + update_node(5, [(1, 4), (2, 5), (4, 8)]) + # node 6 = node3 + arc7 + update_node(6, [(3, 7)]) + # node 7 = max(node6+arc11, node4+arc9) + update_node(7, [(6, 11), (4, 9)]) + # node 8 = max(node5+arc10, node7+arc12) + update_node(8, [(5, 10), (7, 12)]) + + longest_path = float(nodes[8]) longest_path_gradient = time_deriv[8, :] # Compose responses and gradients. @@ -215,121 +182,72 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: return responses, gradients -""" -Summary -------- -Minimize the duration of the longest path from a to i plus cost. -""" +class FixedSANLongestPath(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "FIXEDSAN-1" -class FixedSANLongestPath(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : list - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Mean Longest Path for Fixed Stochastic Activity Network" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"arc_means"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -350,6 +268,7 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, @@ -358,14 +277,17 @@ def check_factor_list(self) -> dict[str, Callable]: } @property + @override def dim(self) -> int: return self.model.factors["num_arcs"] @property + @override def lower_bounds(self) -> tuple: return (1e-2,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (np.inf,) * self.dim @@ -375,6 +297,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the Fixed Stochastic Activity Network problem. + + Args: + name (str, optional): Name of the problem. Defaults to "FIXEDSAN-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -384,101 +315,30 @@ def __init__( ) def check_arc_costs(self) -> bool: - positive = True - for x in list(self.factors["arc_costs"]): - positive = positive and x > 0 - return ( - len(self.factors["arc_costs"]) != self.model.factors["num_arcs"] - ) and positive + """Check if all arc costs are positive and match the number of arcs.""" + return len(self.factors["arc_costs"]) == self.model.factors["num_arcs"] and all( + x > 0 for x in self.factors["arc_costs"] + ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"arc_means": vector[:]} - return factor_dict + return {"arc_means": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["arc_means"]) - return vector + return tuple(factor_dict["arc_means"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["longest_path_length"],) - return objectives + return (response_dict["longest_path_length"],) - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + def deterministic_stochastic_constraints_and_gradients(self) -> tuple[tuple, tuple]: + """Compute deterministic components of stochastic constraints. - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints + Returns: + tuple: + - tuple: The deterministic components of the stochastic constraints. + - tuple: The gradients of those deterministic components. """ det_stoch_constraints = () det_stoch_constraints_gradients = ( @@ -486,67 +346,20 @@ def deterministic_stochastic_constraints_and_gradients( ) # tuple of tuples - of sizes self.dim by self.dim, full of zeros return det_stoch_constraints, det_stoch_constraints_gradients - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ - det_objectives = ( - np.sum(np.array(self.factors["arc_costs"]) / np.array(x)), - ) + @override + def deterministic_objectives_and_gradients(self, x: tuple) -> tuple[tuple, tuple]: + det_objectives = (np.sum(np.array(self.factors["arc_costs"]) / np.array(x)),) det_objectives_gradients = ( -np.array(self.factors["arc_costs"]) / (np.array(x) ** 2), ) return det_objectives, det_objectives_gradients + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - is_positive: list[bool] = [x_i >= 0 for x_i in x] - return all(is_positive) + return all(x_i >= 0 for x_i in x) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - x = tuple( - [ - rand_sol_rng.lognormalvariate(lq=0.1, uq=10) - for _ in range(self.dim) - ] + return tuple( + [rand_sol_rng.lognormalvariate(lq=0.1, uq=10) for _ in range(self.dim)] ) - return x diff --git a/simopt/models/hotel.py b/simopt/models/hotel.py index eece5218c..8d7ed368d 100644 --- a/simopt/models/hotel.py +++ b/simopt/models/hotel.py @@ -1,64 +1,60 @@ -""" -Summary -------- -Simulate expected revenue for a hotel. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate expected revenue for a hotel.""" from __future__ import annotations +import heapq from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class Hotel(Model): - """ - A model that simulates business of a hotel with Poisson arrival rate. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model - """ + """A model that simulates business of a hotel with Poisson arrival rate.""" - @property - def name(self) -> str: - return "HOTEL" + @classproperty + @override + def class_name(cls) -> str: + return "Hotel Booking" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: + def double_up(values: list[float]) -> list[float]: + """Duplicate each value in the list once.""" + return [x for x in values for _ in range(2)] + + def gen_binary_list(pattern: list[int]) -> list[int]: + """Generate a binary list from alternating 0 and 1 runs. + + Args: + pattern (list[int]): A list of run lengths. Even-indexed values + correspond to 0s, odd-indexed to 1s. For example: + bitstring([3, 2, 4]) → [0, 0, 0, 1, 1, 0, 0, 0, 0] + + Returns: + list[int]: Expanded binary sequence. + """ + result = [] + current_bit = 0 + for count in pattern: + result.extend([current_bit] * count) + current_bit = 1 - current_bit # flip 0 to 1 or 1 to 0 + return result + return { "num_products": { "description": "number of products: (rate, length of stay)", @@ -68,69 +64,41 @@ def specifications(self) -> dict[str, dict]: "lambda": { "description": "arrival rates for each product", "datatype": list, - "default": ( - (1 / 168) - * np.array( + "default": [ + x / 168 + for x in double_up( [ 1, - 1, - 2, 2, 3, - 3, - 2, 2, 1, - 1, 0.5, - 0.5, - 0.25, 0.25, 1, - 1, - 2, 2, 3, - 3, - 2, 2, 1, - 1, 0.5, - 0.5, - 1, 1, 2, - 2, 3, - 3, - 2, 2, 1, 1, - 1, - 1, - 2, 2, 3, - 3, - 2, 2, 1, - 1, - 2, 2, 3, - 3, 1, - 1, - 2, 2, 1, - 1, ] ) - ).tolist(), + ], }, "num_rooms": { "description": "hotel capacity", @@ -151,432 +119,36 @@ def specifications(self) -> dict[str, dict]: "description": "incidence matrix", "datatype": list, "default": [ - [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - [ - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - [ - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - [ - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - ], - [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - ], - [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 1, - ], + gen_binary_list([0, 14, 42]), + gen_binary_list([2, 24, 30]), + gen_binary_list([4, 10, 2, 20, 20]), + gen_binary_list([6, 8, 4, 8, 2, 16, 12]), + gen_binary_list([8, 6, 6, 6, 4, 6, 2, 12, 6]), + gen_binary_list([10, 4, 8, 4, 6, 4, 4, 4, 2, 8, 2]), + gen_binary_list([12, 2, 10, 2, 8, 2, 6, 2, 4, 2, 2, 4]), ], }, "time_limit": { - "description": "time after which orders of each product no longer arrive (e.g. Mon night stops at 3am Tues or t=27)", + "description": ( + "time after which orders of each product no longer arrive " + "(e.g. Mon night stops at 3am Tues or t=27)" + ), "datatype": list, - "default": np.concatenate( - ( - 27 * np.ones(14), - 51 * np.ones(12), - 75 * np.ones(10), - 99 * np.ones(8), - 123 * np.ones(6), - 144 * np.ones(4), - 168 * np.ones(2), - ), - axis=None, - ).tolist(), + "default": ( + [27] * 14 + + [51] * 12 + + [75] * 10 + + [99] * 8 + + [123] * 6 + + [144] * 4 + + [168] * 2 + ), }, "time_before": { - "description": "hours before t=0 to start running (e.g. 168 means start at time -168)", + "description": ( + "hours before t=0 to start running " + "(e.g. 168 means start at time -168)" + ), "datatype": int, "default": 168, }, @@ -588,53 +160,58 @@ def specifications(self) -> dict[str, dict]: "booking_limits": { "description": "booking limits", "datatype": tuple, - "default": tuple([100 for _ in range(56)]), + "default": tuple([100] * 56), }, } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "num_products": self.check_num_products, - "lambda": self.check_lambda, - "num_rooms": self.check_num_rooms, - "discount_rate": self.check_discount_rate, - "rack_rate": self.check_rack_rate, - "product_incidence": self.check_product_incidence, - "time_limit": self.check_time_limit, - "time_before": self.check_time_before, - "runlength": self.check_runlength, - "booking_limits": self.check_booking_limits, + "num_products": self._check_num_products, + "lambda": self._check_lambda, + "num_rooms": self._check_num_rooms, + "discount_rate": self._check_discount_rate, + "rack_rate": self._check_rack_rate, + "product_incidence": self._check_product_incidence, + "time_limit": self._check_time_limit, + "time_before": self._check_time_before, + "runlength": self._check_runlength, + "booking_limits": self._check_booking_limits, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Hotel model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_num_products(self) -> None: + def _check_num_products(self) -> None: if self.factors["num_products"] <= 0: raise ValueError("num_products must be greater than 0.") - def check_lambda(self) -> None: + def _check_lambda(self) -> None: for i in self.factors["lambda"]: if i <= 0: - raise ValueError( - "All elements in lambda must be greater than 0." - ) + raise ValueError("All elements in lambda must be greater than 0.") - def check_num_rooms(self) -> None: + def _check_num_rooms(self) -> None: if self.factors["num_rooms"] <= 0: raise ValueError("num_rooms must be greater than 0.") - def check_discount_rate(self) -> None: + def _check_discount_rate(self) -> None: if self.factors["discount_rate"] <= 0: raise ValueError("discount_rate must be greater than 0.") - def check_rack_rate(self) -> None: + def _check_rack_rate(self) -> None: if self.factors["rack_rate"] <= 0: raise ValueError("rack_rate must be greater than 0.") - def check_product_incidence(self) -> None: + def _check_product_incidence(self) -> None: # TODO: fix check for product_incidence return # is_positive = [[i > 0 for i in j] for j in self.factors["product_incidence"]] @@ -643,39 +220,35 @@ def check_product_incidence(self) -> None: # "All elements in product_incidence must be greater than 0." # ) - def check_time_limit(self) -> None: + def _check_time_limit(self) -> None: for i in self.factors["time_limit"]: if i <= 0: - raise ValueError( - "All elements in time_limit must be greater than 0." - ) + raise ValueError("All elements in time_limit must be greater than 0.") - def check_time_before(self) -> None: + def _check_time_before(self) -> None: if self.factors["time_before"] <= 0: raise ValueError("time_before must be greater than 0.") - def check_runlength(self) -> None: + def _check_runlength(self) -> None: if self.factors["runlength"] <= 0: raise ValueError("runlength must be greater than 0.") - def check_booking_limits(self) -> None: + def _check_booking_limits(self) -> None: for i in list(self.factors["booking_limits"]): if i <= 0 or i > self.factors["num_rooms"]: raise ValueError( - "All elements in booking_limits must be greater than 0 and less than num_rooms." + "All elements in booking_limits must be greater than 0 and less " + "than num_rooms." ) + @override def check_simulatable_factors(self) -> bool: if len(self.factors["lambda"]) != self.factors["num_products"]: raise ValueError("The length of lambda must equal num_products.") if len(self.factors["time_limit"]) != self.factors["num_products"]: - raise ValueError( - "The length of time_limit must equal num_products." - ) + raise ValueError("The length of time_limit must equal num_products.") if len(self.factors["booking_limits"]) != self.factors["num_products"]: - raise ValueError( - "The length of booking_limits must equal num_products." - ) + raise ValueError("The length of booking_limits must equal num_products.") # TODO: get rid of this conversion to np.array np_array = np.array(self.factors["product_incidence"]) # m, n = np_array.shape @@ -688,206 +261,149 @@ def check_simulatable_factors(self) -> bool: return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "revenue": Expected revenue. + - gradients (dict): A dictionary of gradient estimates for each + response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "revenue" = expected revenue - gradients : dict of dicts - gradient estimates for each response - """ + booking_limits = list(self.factors["booking_limits"]) + product_incidence = np.array(self.factors["product_incidence"]) + num_products: int = self.factors["num_products"] + time_before: int = self.factors["time_before"] + f_lambda = self.factors["lambda"] + run_length: int = self.factors["runlength"] + time_limit: list = self.factors["time_limit"] + rack_rate: int = self.factors["rack_rate"] + discount_rate: int = self.factors["discount_rate"] + # Designate separate random number generators. arr_rng = rng_list[0] - total_revenue = 0 - b = list(self.factors["booking_limits"]) - a_array = np.array(self.factors["product_incidence"]) - # Vector of next arrival time per product. - # (Starts at time = -1*time_before, e.g., t = -168.) - arrival = ( - np.zeros(self.factors["num_products"]) - self.factors["time_before"] - ) - # Upper bound on number of arrivals over the time period. - arr_bound = 10 * round(168 * np.sum(self.factors["lambda"])) - arr_time = np.zeros((self.factors["num_products"], arr_bound)) - # Index of which arrival time to use next for each product. - a = np.zeros(self.factors["num_products"], dtype=int) - # Generate all interarrival times in advance. - for i in range(self.factors["num_products"]): - arr_time[i] = np.array( - [ - arr_rng.expovariate(self.factors["lambda"][i]) - for _ in range(arr_bound) - ] - ) - # Extract first arrivals. - for i in range(self.factors["num_products"]): - arrival[i] = arrival[i] + arr_time[i, a[i]] - a[i] = 1 - min_time = ( - 0 # Keeps track of minimum time of the orders not yet received. + + # Generate interarrival times + arr_bound = 10 * round(168 * np.sum(f_lambda)) + arr_time = np.array( + [ + [arr_rng.expovariate(f_lambda[i]) for _ in range(arr_bound)] + for i in range(num_products) + ] ) - min_idx = 0 - while min_time <= self.factors["runlength"]: - min_time = self.factors["runlength"] + 1 - for i in range(self.factors["num_products"]): - if (arrival[i] < min_time) and ( - arrival[i] <= self.factors["time_limit"][i] - ): - min_time = arrival[i] - min_idx = i - if min_time > self.factors["runlength"]: + + # Initialize arrival times + arrival = [-time_before + arr_time[i, 0] for i in range(num_products)] + a_idx = np.ones(num_products, dtype=int) # Next interarrival index + + # Precompute resource conflict matrix (bool) + conflicts = (product_incidence.T @ product_incidence) >= 1 + + # Min-heap for tracking next arrival events (arrival_time, product_idx) + heap = [ + (arrival[i], i) for i in range(num_products) if arrival[i] <= time_limit[i] + ] + heapq.heapify(heap) + + while heap: + current_time, product_idx = heapq.heappop(heap) + if current_time > run_length: break - if b[min_idx] > 0: - if min_idx % 2 == 0: # Rack_rate. - total_revenue += sum( - self.factors["rack_rate"] * a_array[:, min_idx] - ) - else: # Discount_rate. - total_revenue += sum( - self.factors["discount_rate"] * a_array[:, min_idx] - ) - # Reduce the inventory of products sharing the same resource. - for i in range(self.factors["num_products"]): - if np.dot(a_array[:, i].T, a_array[:, min_idx]) >= 1: - if b[i] != 0: - b[i] -= 1 - arrival[min_idx] += arr_time[min_idx, a[min_idx]] - a[min_idx] = a[min_idx] + 1 + if booking_limits[product_idx] > 0: + rate = rack_rate if product_idx % 2 == 0 else discount_rate + total_revenue += rate * np.sum(product_incidence[:, product_idx]) + for i in range(num_products): + if conflicts[product_idx, i] and booking_limits[i] > 0: + booking_limits[i] -= 1 + + # Schedule next arrival for this product + next_idx = a_idx[product_idx] + if next_idx < arr_bound: + next_time = current_time + arr_time[product_idx, next_idx] + a_idx[product_idx] += 1 + if next_time <= time_limit[product_idx]: + heapq.heappush(heap, (next_time, product_idx)) + # Compose responses and gradients. responses = {"revenue": total_revenue} gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Maximize the expected revenue. -""" +class HotelRevenue(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "HOTEL-1" -class HotelRevenue(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : list - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Revenue for Hotel Booking" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.DISCRETE - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"booking_limits"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -903,6 +419,7 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, @@ -910,14 +427,17 @@ def check_factor_list(self) -> dict[str, Callable]: } @property + @override def dim(self) -> int: return self.model.factors["num_products"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (self.model.factors["num_rooms"],) * self.dim @@ -927,6 +447,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the HotelRevenue problem. + + Args: + name (str, optional): Name of the problem. Defaults to "HOTEL-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -935,171 +464,43 @@ def __init__( model=Hotel, ) + @override def check_initial_solution(self) -> bool: return len(self.factors["initial_solution"]) == self.dim - def check_budget(self) -> bool: - if self.factors["budget"] <= 0: - raise ValueError("budget must be greater than 0.") - return True - - def check_simulatable_factors(self) -> bool: - if len(self.lower_bounds) != self.dim: - return False - elif len(self.upper_bounds) != self.dim: - return False - else: - return True + # # TODO: figure out how Problem.check_simulatable_factors() works + # def check_simulatable_factors(self) -> bool: + # return not ( + # len(self.lower_bounds) != self.dim or len(self.upper_bounds) != self.dim + # ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"booking_limits": vector[:]} - return factor_dict + return {"booking_limits": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["booking_limits"]) - return vector + return tuple(factor_dict["booking_limits"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["revenue"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["revenue"],) - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0,) * self.dim,) return det_objectives, det_objectives_gradients - def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ + @override + def check_deterministic_constraints(self, _x: tuple) -> bool: return True + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - x = tuple( + return tuple( [ rand_sol_rng.randint(0, self.model.factors["num_rooms"]) for _ in range(self.dim) ] ) - return x diff --git a/simopt/models/ironore.py b/simopt/models/ironore.py index 9a6deb4d4..7fbfd3d3d 100644 --- a/simopt/models/ironore.py +++ b/simopt/models/ironore.py @@ -1,14 +1,8 @@ -""" -Summary -------- -Simulate multiple periods of production and sales for an iron ore inventory problem. -A detailed description of the model/problem can be found -`here `__. - -Changed get_random_solution quantiles - from 10 and 200 => mean=59.887, sd=53.338, p(X>100)=0.146 - to 10 and 1000 => mean=199.384, sd=343.925, p(X>100)=0.5 -""" +"""Simulate production and sales over multiple periods for an iron ore inventory.""" + +# Changed get_random_solution quantiles +# from 10 and 200 => mean=59.887, sd=53.338, p(X>100)=0.146 +# to 10 and 1000 => mean=199.384, sd=343.925, p(X>100)=0.5 from __future__ import annotations @@ -16,57 +10,34 @@ from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class IronOre(Model): - """ + """Iron Ore Inventory Model. + A model that simulates multiple periods of production and sales for an inventory problem with stochastic price determined by a mean-reverting random walk. Returns total profit, fraction of days producing iron, and mean stock. - - Attributes - ---------- - name : str - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - ---------- - fixed_factors : dict - fixed_factors of the simulation model - - See also - -------- - base.Model """ - @property - def name(self) -> str: - return "IRONORE" - - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 3 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "mean_price": { "description": "mean iron ore price per unit", @@ -121,12 +92,12 @@ def specifications(self) -> dict[str, dict]: "price_stop": { "description": "price level to stop production", "datatype": float, - "default": 40, + "default": 40.0, }, "price_sell": { "description": "price level to sell all stock", "datatype": float, - "default": 100, + "default": 100.0, }, "n_days": { "description": "number of days to simulate", @@ -137,109 +108,128 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "mean_price": self.check_mean_price, - "max_price": self.check_max_price, - "min_price": self.check_min_price, - "capacity": self.check_capacity, - "st_dev": self.check_st_dev, - "holding_cost": self.check_holding_cost, - "prod_cost": self.check_prod_cost, - "max_prod_perday": self.check_max_prod_perday, - "price_prod": self.check_price_prod, - "inven_stop": self.check_inven_stop, - "price_stop": self.check_price_stop, - "price_sell": self.check_price_sell, - "n_days": self.check_n_days, + "mean_price": self._check_mean_price, + "max_price": self._check_max_price, + "min_price": self._check_min_price, + "capacity": self._check_capacity, + "st_dev": self._check_st_dev, + "holding_cost": self._check_holding_cost, + "prod_cost": self._check_prod_cost, + "max_prod_perday": self._check_max_prod_perday, + "price_prod": self._check_price_prod, + "inven_stop": self._check_inven_stop, + "price_stop": self._check_price_stop, + "price_sell": self._check_price_sell, + "n_days": self._check_n_days, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Iron Ore Inventory Model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) # Check for simulatable factors - def check_mean_price(self) -> bool: + def _check_mean_price(self) -> bool: if self.factors["mean_price"] <= 0: - raise ValueError( - "Mean iron ore price per unit must be greater than 0." - ) + raise ValueError("Mean iron ore price per unit must be greater than 0.") return True - def check_max_price(self) -> None: + def _check_max_price(self) -> None: if self.factors["max_price"] <= 0: raise ValueError("max_price must be greater than 0.") - def check_min_price(self) -> None: + def _check_min_price(self) -> None: if self.factors["min_price"] < 0: raise ValueError("min_price must be greater than or equal to 0.") - def check_capacity(self) -> None: + def _check_capacity(self) -> None: if self.factors["capacity"] < 0: raise ValueError("capacity must be greater than or equal to 0.") - def check_st_dev(self) -> None: + def _check_st_dev(self) -> None: if self.factors["st_dev"] <= 0: raise ValueError("st_dev must be greater than 0.") - def check_holding_cost(self) -> None: + def _check_holding_cost(self) -> None: if self.factors["holding_cost"] <= 0: raise ValueError("holding_cost must be greater than 0.") - def check_prod_cost(self) -> None: + def _check_prod_cost(self) -> None: if self.factors["prod_cost"] <= 0: raise ValueError("prod_cost must be greater than 0.") - def check_max_prod_perday(self) -> None: + def _check_max_prod_perday(self) -> None: if self.factors["max_prod_perday"] <= 0: raise ValueError("max_prod_perday must be greater than 0.") - def check_price_prod(self) -> None: + def _check_price_prod(self) -> None: if self.factors["price_prod"] <= 0: raise ValueError("price_prod must be greater than 0.") - def check_inven_stop(self) -> None: + def _check_inven_stop(self) -> None: if self.factors["inven_stop"] <= 0: raise ValueError("inven_stop must be greater than 0.") - def check_price_stop(self) -> None: + def _check_price_stop(self) -> None: if self.factors["price_stop"] <= 0: raise ValueError("price_stop must be greater than 0.") - def check_price_sell(self) -> None: + def _check_price_sell(self) -> None: if self.factors["price_sell"] <= 0: raise ValueError("price_sell must be greater than 0.") - def check_n_days(self) -> None: + def _check_n_days(self) -> None: if self.factors["n_days"] < 1: raise ValueError("n_days must be greater than or equal to 1.") + @override def check_simulatable_factors(self) -> bool: if (self.factors["min_price"] > self.factors["mean_price"]) or ( self.factors["mean_price"] > self.factors["max_price"] ): raise ValueError( - "mean_price must be greater than or equal to min_price and less than or equal to max_price." + "mean_price must be greater than or equal to min_price and less than " + "or equal to max_price." ) return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: - """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "total_profit" = The total profit over the time period - "frac_producing" = The fraction of days spent producing iron ore - "mean_stock" = The average stocks over the time period - """ + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "total_profit": The total profit over the time period. + - "frac_producing": The fraction of days spent producing iron ore. + - "mean_stock": The average stock over the time period. + - gradients (dict): A dictionary of gradient estimates for each + response. + """ + n_days: int = self.factors["n_days"] + min_price: float = self.factors["min_price"] + mean_price: float = self.factors["mean_price"] + max_price: float = self.factors["max_price"] + st_dev: float = self.factors["st_dev"] + price_stop: float = self.factors["price_stop"] + inven_stop: int = self.factors["inven_stop"] + max_prod_perday: int = self.factors["max_prod_perday"] + capacity: int = self.factors["capacity"] + prod_cost: float = self.factors["prod_cost"] + price_prod: float = self.factors["price_prod"] + price_sell: float = self.factors["price_sell"] + holding_cost: float = self.factors["holding_cost"] # Designate random number generators. price_rng = rng_list[0] # Initialize quantities to track: @@ -249,197 +239,145 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: # - Profit in each period. # - Whether producing or not in each period. # - Production in each period. - mkt_price = np.zeros(self.factors["n_days"]) - mkt_price[0] = self.factors["mean_price"] - stock = np.zeros(self.factors["n_days"]) - profit = np.zeros(self.factors["n_days"]) - producing = np.zeros(self.factors["n_days"]) - prod = np.zeros(self.factors["n_days"]) + mkt_price = np.zeros(n_days) + mkt_price[0] = mean_price + stock = np.zeros(n_days) + prod_costs = np.zeros(n_days) + hold_costs = np.zeros(n_days) + sell_profit = np.zeros(n_days) # Run simulation over time horizon. - for day in range(1, self.factors["n_days"]): - # Determine new price, mean-reverting random walk, Pt = trunc(Pt-1 + Nt(μt,sigma)). - # Run μt, mean at period t, where μt = sgn(μ0 - Pt-1) * |μ0 - Pt-1|^(1/4). - mean_val = sqrt( - sqrt(abs(self.factors["mean_price"] - mkt_price[day])) - ) - mean_dir = copysign(1, self.factors["mean_price"] - mkt_price[day]) - mean_move = mean_val * mean_dir - move = price_rng.normalvariate(mean_move, self.factors["st_dev"]) - mkt_price[day] = max( - min(mkt_price[day - 1] + move, self.factors["max_price"]), - self.factors["min_price"], - ) - # If production is underway... - if producing[day] == 1: - # ... cease production if price goes too low or inventory is too high. - if (mkt_price[day] <= self.factors["price_stop"]) | ( - stock[day] >= self.factors["inven_stop"] - ): - producing[day] = 0 - else: - prod[day] = min( - self.factors["max_prod_perday"], - self.factors["capacity"] - stock[day], - ) - stock[day] = stock[day] + prod[day] - profit[day] = ( - profit[day] - prod[day] * self.factors["prod_cost"] - ) - # If production is not currently underway... - else: - if (mkt_price[day] >= self.factors["price_prod"]) and ( - stock[day] < self.factors["inven_stop"] - ): - producing[day] = 1 - prod[day] = min( - self.factors["max_prod_perday"], - self.factors["capacity"] - stock[day], - ) - stock[day] = stock[day] + prod[day] - profit[day] = ( - profit[day] - prod[day] * self.factors["prod_cost"] - ) - # Sell if price is high enough. - if mkt_price[day] >= self.factors["price_sell"]: - profit[day] = profit[day] + stock[day] * mkt_price[day] + for day in range(1, n_days): + # === Initializatize values === + # Initialize today with values from yesterday + prior_day = day - 1 + # Stock doesn't reset between days + prev_stock = stock[prior_day] + stock[day] = prev_stock + # The market price is a random walk, but it's based off of the + # previous day's price. + prev_price = mkt_price[prior_day] + mkt_price[day] = prev_price + # We just need yesterday's producing status to help determine + # if we should produce today. + prev_producing = prod_costs[prior_day] != 0 + + # === Price Update: mean-reverting random walk === + price_delta = mean_price - prev_price + mean_move = copysign(sqrt(sqrt(abs(price_delta))), price_delta) + move = price_rng.normalvariate(mean_move, st_dev) + price_today = max(min(prev_price + move, max_price), min_price) + mkt_price[day] = price_today + + # === Production Logic === + # If stock is below the inventory stop and either: + # - if producing, price is above the price stop + # - if not producing, price is above the price prod + # then produce the maximum amount possible. + if prev_stock < inven_stop and ( + (prev_producing and price_today >= price_stop) + or (not prev_producing and price_today >= price_prod) + ): + missing_stock = capacity - prev_stock + production_amount = min(max_prod_perday, missing_stock) + stock[day] += production_amount + prod_costs[day] = production_amount * prod_cost + + # === Selling Logic === + if price_today >= price_sell: + sell_profit[day] = stock[day] * price_today stock[day] = 0 - # Charge holding cost. - profit[day] = ( - profit[day] - stock[day] * self.factors["holding_cost"] - ) - # Calculate starting quantities for next period. - if day < self.factors["n_days"] - 1: - profit[day + 1] = profit[day] - stock[day + 1] = stock[day] - mkt_price[day + 1] = mkt_price[day] - producing[day + 1] = producing[day] + + # === Holding Cost === + hold_costs[day] = stock[day] * holding_cost + + # Calculate total profit + profits = sell_profit - prod_costs - hold_costs + net_profit = np.sum(profits) + + # Calculate fraction of days producing + is_producing_mask = prod_costs != 0 + frac_producing = np.mean(is_producing_mask) + # Calculate responses from simulation data. responses = { - "total_profit": profit[self.factors["n_days"] - 1], - "frac_producing": np.mean(producing), + "total_profit": net_profit, + "frac_producing": frac_producing, "mean_stock": np.mean(stock), } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Maximize the expected total profit for iron ore inventory system. -""" +class IronOreMaxRev(Problem): + """Class to make iron ore inventory simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "IRONORE-1" -class IronOreMaxRev(Problem): - """ - Class to make iron ore inventory simulation-optimization problems. - - Attributes - ---------- - name : str - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : str - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : str - description of variable types: - "discrete", "continuous", "mixed" - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : float - optimal objective function value - optimal_solution : tuple - optimal solution - model : base.Model - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name of problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Revenue for Iron Ore" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.MIXED - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"price_prod", "inven_stop", "price_stop", "price_sell"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -455,23 +393,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 4 - @property - def lower_bounds(self) -> tuple: - return (0,) * self.dim + @classproperty + @override + def lower_bounds(cls) -> tuple: + return (0,) * cls.dim - @property - def upper_bounds(self) -> tuple: - return (np.inf,) * self.dim + @classproperty + @override + def upper_bounds(cls) -> tuple: + return (np.inf,) * cls.dim def __init__( self, @@ -479,6 +421,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the Iron Ore Inventory Problem. + + Args: + name (str, optional): Name of the problem. Defaults to "IRONORE-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -487,287 +438,116 @@ def __init__( model=IronOre, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dict - dictionary with factor keys and associated values - """ - factor_dict = { + return { "price_prod": vector[0], "inven_stop": vector[1], "price_stop": vector[2], "price_sell": vector[3], } - return factor_dict + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dict - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = ( + return ( factor_dict["price_prod"], factor_dict["inven_stop"], factor_dict["price_stop"], factor_dict["price_sell"], ) - return vector + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["total_profit"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["total_profit"],) - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0, 0, 0, 0),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - - def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - # Check box constraints. - box_feasible = super().check_deterministic_constraints(x) - return box_feasible - + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - # x = (rand_sol_rng.randint(70, 90), rand_sol_rng.randint(2000, 8000), rand_sol_rng.randint(30, 50), rand_sol_rng.randint(90, 110)) - x = ( + # return ( + # rand_sol_rng.randint(70, 90), + # rand_sol_rng.randint(2000, 8000), + # rand_sol_rng.randint(30, 50), + # rand_sol_rng.randint(90, 110), + # ) + return ( rand_sol_rng.lognormalvariate(10, 200), rand_sol_rng.lognormalvariate(1000, 10000), rand_sol_rng.lognormalvariate(10, 200), rand_sol_rng.lognormalvariate(10, 200), ) - return x -""" -Summary -------- -Continuous version of the Maximization of the expected total profit for iron ore inventory system (removing the inven_stop from decision variables). -""" +class IronOreMaxRevCnt(Problem): + """Class to make iron ore inventory simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "IRONORECONT-1" -class IronOreMaxRevCnt(Problem): - """ - Class to make iron ore inventory simulation-optimization problems. - - Attributes - ---------- - name : str - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : str - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : str - description of variable types: - "discrete", "continuous", "mixed" - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : base.Model - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name of problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Revenue for Continuous Iron Ore" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"price_prod", "price_stop", "price_sell"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -782,23 +562,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 3 - @property - def lower_bounds(self) -> tuple: - return (0.0,) * self.dim + @classproperty + @override + def lower_bounds(cls) -> tuple: + return (0.0,) * cls.dim - @property - def upper_bounds(self) -> tuple: - return (np.inf,) * self.dim + @classproperty + @override + def upper_bounds(cls) -> tuple: + return (np.inf,) * cls.dim def __init__( self, @@ -806,6 +590,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the Iron Ore Inventory Problem. + + Args: + name (str, optional): Name of the problem. Defaults to "IRONORECONT-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -814,167 +607,45 @@ def __init__( model=IronOre, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dict - dictionary with factor keys and associated values - """ - factor_dict = { + return { "price_prod": vector[0], "price_stop": vector[1], "price_sell": vector[2], } - return factor_dict + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dict - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = ( + return ( factor_dict["price_prod"], factor_dict["price_stop"], factor_dict["price_sell"], ) - return vector + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["total_profit"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["total_profit"],) - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0, 0, 0),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ return x[0] >= 0 and x[1] >= 0 and x[2] >= 0 + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - # x = (rand_sol_rng.randint(70, 90), rand_sol_rng.randint(30, 50), rand_sol_rng.randint(90, 110)) - - x = ( + # return ( + # rand_sol_rng.randint(70, 90), + # rand_sol_rng.randint(30, 50), + # rand_sol_rng.randint(90, 110), + # ) + return ( rand_sol_rng.lognormalvariate(10, 1000), rand_sol_rng.lognormalvariate(10, 1000), rand_sol_rng.lognormalvariate(10, 1000), ) - return x diff --git a/simopt/models/mm1queue.py b/simopt/models/mm1queue.py index eb7465235..f791bfa98 100644 --- a/simopt/models/mm1queue.py +++ b/simopt/models/mm1queue.py @@ -1,23 +1,20 @@ -""" -Summary -------- -Simulate a M/M/1 queue. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate an M/M/1 queue.""" from __future__ import annotations +from enum import IntEnum from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class MM1Queue(Model): - """ + """MM1 Queue Simulation Model. + A model that simulates an M/M/1 queue with an Exponential(lambda) interarrival time distribution and an Exponential(x) service time distribution. Returns: @@ -25,46 +22,31 @@ class MM1Queue(Model): - the average waiting time - the fraction of customers who wait for customers after a warmup period. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model """ - @property - def name(self) -> str: + @classproperty + @override + def class_name_abbr(cls) -> str: return "MM1" - @property - def n_rngs(self) -> int: + @classproperty + @override + def class_name(cls) -> str: + return "MM1 Queue" + + @classproperty + @override + def n_rngs(cls) -> int: return 2 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 3 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "lambda": { "description": "rate parameter of interarrival time distribution", @@ -82,84 +64,93 @@ def specifications(self) -> dict[str, dict]: "default": 0.001, }, "warmup": { - "description": "number of people as warmup before collecting statistics", + "description": ( + "number of people as warmup before collecting statistics" + ), "datatype": int, "default": 20, }, "people": { - "description": "number of people from which to calculate the average sojourn time", + "description": ( + "number of people from which to calculate the average sojourn time" + ), "datatype": int, "default": 50, }, } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "lambda": self.check_lambda, - "mu": self.check_mu, - "epsilon": self.check_epsilon, - "warmup": self.check_warmup, - "people": self.check_people, + "lambda": self._check_lambda, + "mu": self._check_mu, + "epsilon": self._check_epsilon, + "warmup": self._check_warmup, + "people": self._check_people, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the MM1Queue model. + + Args: + fixed_factors (dict, optional): fixed factors of the simulation model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_lambda(self) -> None: + def _check_lambda(self) -> None: if self.factors["lambda"] <= 0: raise ValueError("lambda must be greater than 0.") - def check_mu(self) -> None: + def _check_mu(self) -> None: if self.factors["mu"] <= 0: raise ValueError("mu must be greater than 0.") - def check_warmup(self) -> None: + def _check_warmup(self) -> None: if self.factors["warmup"] < 0: raise ValueError("warmup must be greater than or equal to 0.") - def check_people(self) -> None: + def _check_people(self) -> None: if self.factors["people"] < 1: raise ValueError("people must be greater than or equal to 1.") - def check_epsilon(self) -> bool: + def _check_epsilon(self) -> bool: return self.factors["epsilon"] > 0 def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "avg_sojourn_time": Average sojourn time. + - "avg_waiting_time": Average waiting time. + - "frac_cust_wait": Fraction of customers who wait. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "avg_sojourn_time" = average sojourn time - "avg_waiting_time" = average waiting time - "frac_cust_wait" = fraction of customers who wait - gradients : dict of dicts - gradient estimates for each response - """ - # Set mu to be at least epsilon. - self.factors["mu"] = max(self.factors["mu"], self.factors["epsilon"]) - # Calculate total number of arrivals to simulate. - total = self.factors["warmup"] + self.factors["people"] + mu: float = self.factors["mu"] + epsilon: float = self.factors["epsilon"] + warmup: int = self.factors["warmup"] + people: int = self.factors["people"] + f_lambda: float = self.factors["lambda"] # Designate separate RNGs for interarrival and serivce times. arrival_rng = rng_list[0] service_rng = rng_list[1] + # Set mu to be at least epsilon. + mu_floor = max(mu, epsilon) + # Calculate total number of arrivals to simulate. + total = warmup + people # Generate all interarrival and service times up front. - arrival_times = [ - arrival_rng.expovariate(self.factors["lambda"]) - for _ in range(total) - ] - service_times = [ - service_rng.expovariate(self.factors["mu"]) for _ in range(total) - ] + arrival_times = [arrival_rng.expovariate(f_lambda) for _ in range(total)] + service_times = [service_rng.expovariate(mu_floor) for _ in range(total)] + # Create matrix storing times and metrics for each customer: # column 0 : arrival time to queue; # column 1 : service time; @@ -171,57 +162,73 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: # column 7 : IPA gradient of waiting time w.r.t. mu; # column 8 : IPA gradient of sojourn time w.r.t. lambda; # column 9 : IPA gradient of waiting time w.r.t. lambda. + # Alias columns by index + class Col(IntEnum): + ARR = 0 + SVC = 1 + DONE = 2 + SOJ = 3 + WAIT = 4 + IN_SYS = 5 + G_SOJ_MU = 6 + G_WAIT_MU = 7 + G_SOJ_LAM = 8 + G_WAIT_LAM = 9 + cust_mat = np.zeros((total, 10)) - cust_mat[:, 0] = np.cumsum(arrival_times) - cust_mat[:, 1] = service_times + cust_mat[:, Col.ARR] = np.cumsum(arrival_times) + cust_mat[:, Col.SVC] = service_times # Input entries for first customer's queueing experience. - cust_mat[0, 2] = cust_mat[0, 0] + cust_mat[0, 1] - cust_mat[0, 3] = cust_mat[0, 1] - cust_mat[0, 4] = 0 - cust_mat[0, 5] = 0 - cust_mat[0, 6] = -cust_mat[0, 1] / self.factors["mu"] - cust_mat[0, 7] = 0 - cust_mat[0, 8] = 0 - cust_mat[0, 9] = 0 + first_cust = cust_mat[0] + first_cust[Col.DONE] = first_cust[Col.ARR] + first_cust[Col.SVC] + first_cust[Col.SOJ] = first_cust[Col.SVC] + # first_cust[Col.WAIT] = 0 + # cfirst_cust[Col.IN_SYS] = 0 + first_cust[Col.G_SOJ_MU] = -first_cust[Col.SVC] / mu_floor + # first_cust[Col.G_WAIT_MU] = 0 + # first_cust[Col.G_SOJ_LAM] = 0 + # first_cust[Col.G_WAIT_LAM] = 0 # Fill in entries for remaining customers' experiences. for i in range(1, total): - cust_mat[i, 2] = ( - max(cust_mat[i, 0], cust_mat[i - 1, 2]) + cust_mat[i, 1] - ) - cust_mat[i, 3] = cust_mat[i, 2] - cust_mat[i, 0] - cust_mat[i, 4] = cust_mat[i, 3] - cust_mat[i, 1] - cust_mat[i, 5] = sum( - cust_mat[i - int(cust_mat[i - 1, 5]) - 1 : i, 2] - > cust_mat[i, 0] - ) - cust_mat[i, 6] = ( - -sum(cust_mat[i - int(cust_mat[i, 5]) : i + 1, 1]) - / self.factors["mu"] - ) - cust_mat[i, 7] = ( - -sum(cust_mat[i - int(cust_mat[i, 5]) : i, 1]) - / self.factors["mu"] - ) - cust_mat[i, 8] = np.nan # ... to be derived - cust_mat[i, 9] = np.nan # ... to be derived + # Views into the customer matrix. + # NOT copies, so be careful! + curr_cust = cust_mat[i] + prev_cust = cust_mat[i - 1] + + arrival = curr_cust[Col.ARR] + prev_departure = prev_cust[Col.DONE] + + # Completion time + curr_cust[Col.DONE] = max(arrival, prev_departure) + curr_cust[Col.SVC] + # Sojourn and waiting times + curr_cust[Col.SOJ] = curr_cust[Col.DONE] - arrival + curr_cust[Col.WAIT] = curr_cust[Col.SOJ] - curr_cust[Col.SVC] + + # Number in system at arrival + lookback = int(prev_cust[Col.IN_SYS]) + 1 + arrivals_in_window = cust_mat[i - lookback : i, Col.DONE] + curr_cust[Col.IN_SYS] = np.count_nonzero(arrivals_in_window > arrival) + + # Gradients w.r.t mu + n_in_sys = int(curr_cust[Col.IN_SYS]) + grad_range = cust_mat[i - n_in_sys : i + 1, Col.SVC] + curr_cust[Col.G_SOJ_MU] = -np.sum(grad_range) / mu_floor + curr_cust[Col.G_WAIT_MU] = -np.sum(grad_range[:-1]) / mu_floor + + # Gradients w.r.t lambda + # cust_mat[i, 8] = 0.0 + # cust_mat[i, 9] = 0.0 + cust_mat_warmup = cust_mat[warmup:] # Compute average sojourn time and its gradient. - mean_sojourn_time = np.mean(cust_mat[self.factors["warmup"] :, 3]) - grad_mean_sojourn_time_mu = np.mean( - cust_mat[self.factors["warmup"] :, 6] - ) - grad_mean_sojourn_time_lambda = np.mean( - cust_mat[self.factors["warmup"] :, 8] - ) + mean_sojourn_time = np.mean(cust_mat_warmup[:, Col.SOJ]) + grad_mean_sojourn_time_mu = np.mean(cust_mat_warmup[:, Col.G_SOJ_MU]) + grad_mean_sojourn_time_lambda = np.mean(cust_mat_warmup[:, Col.G_SOJ_LAM]) # Compute average waiting time and its gradient. - mean_waiting_time = np.mean(cust_mat[self.factors["warmup"] :, 4]) - grad_mean_waiting_time_mu = np.mean( - cust_mat[self.factors["warmup"] :, 7] - ) - grad_mean_waiting_time_lambda = np.mean( - cust_mat[self.factors["warmup"] :, 9] - ) + mean_waiting_time = np.mean(cust_mat_warmup[:, Col.WAIT]) + grad_mean_waiting_time_mu = np.mean(cust_mat_warmup[:, Col.G_WAIT_MU]) + grad_mean_waiting_time_lambda = np.mean(cust_mat_warmup[:, Col.G_WAIT_LAM]) # Compute fraction of customers who wait. - fraction_wait = np.mean(cust_mat[self.factors["warmup"] :, 5] > 0) + fraction_wait = np.mean(cust_mat_warmup[:, Col.IN_SYS] > 0) # Compose responses and gradients. responses = { "avg_sojourn_time": mean_sojourn_time, @@ -229,133 +236,82 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: "frac_cust_wait": fraction_wait, } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } gradients["avg_sojourn_time"]["mu"] = float(grad_mean_sojourn_time_mu) - gradients["avg_sojourn_time"]["lambda"] = float( - grad_mean_sojourn_time_lambda - ) + gradients["avg_sojourn_time"]["lambda"] = float(grad_mean_sojourn_time_lambda) gradients["avg_waiting_time"]["mu"] = float(grad_mean_waiting_time_mu) - gradients["avg_waiting_time"]["lambda"] = float( - grad_mean_waiting_time_lambda - ) + gradients["avg_waiting_time"]["lambda"] = float(grad_mean_waiting_time_lambda) return responses, gradients -""" -Summary -------- -Minimize the mean sojourn time of an M/M/1 queue plus a cost term. -""" +class MM1MinMeanSojournTime(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "MM1-1" -class MM1MinMeanSojournTime(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed_factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Mean Sojourn Time for MM1 Queue" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {"warmup": 50, "people": 200} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"mu"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution from which solvers start", @@ -376,24 +332,28 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "cost": self.check_cost, + "cost": self._check_cost, "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 1 - @property - def lower_bounds(self) -> tuple: - return (0,) * self.dim + @classproperty + @override + def lower_bounds(cls) -> tuple: + return (0,) * cls.dim - @property - def upper_bounds(self) -> tuple: - return (np.inf,) * self.dim + @classproperty + @override + def upper_bounds(cls) -> tuple: + return (np.inf,) * cls.dim def __init__( self, @@ -401,6 +361,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the MM1MinMeanSojournTime problem. + + Args: + name (str, optional): user-specified name for problem. Defaults to "MM1-1". + fixed_factors (dict, optional): fixed factors of the simulation model. + Defaults to None. + model_fixed_factors (dict, optional): subset of user-specified + non-decision factors to pass through to the model. Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -409,161 +378,29 @@ def __init__( model=MM1Queue, ) - def check_cost(self) -> None: + def _check_cost(self) -> None: if self.factors["cost"] <= 0: raise ValueError("cost must be greater than 0.") + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"mu": vector[0]} - return factor_dict + return {"mu": vector[0]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = (factor_dict["mu"],) - return vector + return (factor_dict["mu"],) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["avg_sojourn_time"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["avg_sojourn_time"],) - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, x: tuple) -> tuple[tuple, tuple]: det_objectives = (self.factors["cost"] * (x[0] ** 2),) det_objectives_gradients = ((2 * self.factors["cost"] * x[0],),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic - constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - - def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - # Check box constraints. - box_feasible = super().check_deterministic_constraints(x) - return box_feasible - + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ # Generate an Exponential(rate = 1/3) r.v. - x = (rand_sol_rng.expovariate(1 / 3),) - return x + return (rand_sol_rng.expovariate(1 / 3),) diff --git a/simopt/models/network.py b/simopt/models/network.py index 0a5fd3670..62751237a 100644 --- a/simopt/models/network.py +++ b/simopt/models/network.py @@ -1,69 +1,45 @@ -""" -Summary -------- -Simulate messages being processed in a queueing network. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate messages being processed in a queueing network.""" from __future__ import annotations +from enum import IntEnum from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override NUM_NETWORKS: Final = 10 class Network(Model): - """ - Simulate messages being processed in a queueing network. - - Attributes - ---------- - name : str - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Parameters - ---------- - fixed_factors : dict - fixed_factors of the simulation model - - See also - -------- - base.Model - """ + """Simulate messages being processed in a queueing network.""" - @property - def name(self) -> str: - return "NETWORK" + @classproperty + @override + def class_name(cls) -> str: + return "Communication Networks System" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 3 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "process_prob": { - "description": "probability that a message will go through a particular network i", + "description": ( + "probability that a message will go through a particular network i" + ), "datatype": list, "default": [0.1] * NUM_NETWORKS, }, @@ -73,22 +49,32 @@ def specifications(self) -> dict[str, dict]: "default": [0.1 / (x + 1) for x in range(NUM_NETWORKS)], }, "cost_time": { - "description": "cost for the length of time a message spends in a network i per each unit of time", + "description": ( + "cost for the length of time a message spends in a network i per " + "each unit of time" + ), "datatype": list, "default": [0.005] * NUM_NETWORKS, }, "mode_transit_time": { - "description": "mode time of transit for network i following a triangular distribution", + "description": ( + "mode time of transit for network i following a triangular " + "distribution" + ), "datatype": list, "default": [x + 1 for x in range(NUM_NETWORKS)], }, "lower_limits_transit_time": { - "description": "lower limits for the triangular distribution for the transit time", + "description": ( + "lower limits for the triangular distribution for the transit time" + ), "datatype": list, "default": [0.5 + x for x in range(NUM_NETWORKS)], }, "upper_limits_transit_time": { - "description": "upper limits for the triangular distribution for the transit time", + "description": ( + "upper limits for the triangular distribution for the transit time" + ), "datatype": list, "default": [1.5 + x for x in range(NUM_NETWORKS)], }, @@ -110,358 +96,304 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "process_prob": self.check_process_prob, - "cost_process": self.check_cost_process, - "cost_time": self.check_cost_time, - "mode_transit_time": self.check_mode_transit_time, - "lower_limits_transit_time": self.check_lower_limits_transit_time, - "upper_limits_transit_time": self.check_upper_limits_transit_time, - "arrival_rate": self.check_arrival_rate, - "n_messages": self.check_n_messages, - "n_networks": self.check_n_networks, + "process_prob": self._check_process_prob, + "cost_process": self._check_cost_process, + "cost_time": self._check_cost_time, + "mode_transit_time": self._check_mode_transit_time, + "lower_limits_transit_time": self._check_lower_limits_transit_time, + "upper_limits_transit_time": self._check_upper_limits_transit_time, + "arrival_rate": self._check_arrival_rate, + "n_messages": self._check_n_messages, + "n_networks": self._check_n_networks, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Network model. + + Args: + fixed_factors (dict): Fixed factors for the model. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) # Check for simulatable factors - def check_process_prob(self) -> None: + def _check_process_prob(self) -> None: # Make sure probabilities are between 0 and 1. # Make sure probabilities sum up to 1. if ( - any( - [ - 1.0 < prob_i or prob_i < 0 - for prob_i in self.factors["process_prob"] - ] - ) + any(prob_i > 1.0 or prob_i < 0 for prob_i in self.factors["process_prob"]) or round(sum(self.factors["process_prob"]), 10) != 1.0 ): raise ValueError( - "All elements in process_prob must be between 0 and 1 and the sum of all of the elements in process_prob must equal 1." + "All elements in process_prob must be between 0 and 1 and the sum of " + "all of the elements in process_prob must equal 1." ) - def check_cost_process(self) -> None: + def _check_cost_process(self) -> None: if any(cost_i <= 0 for cost_i in self.factors["cost_process"]): - raise ValueError( - "All elements in cost_process must be greater than 0." - ) + raise ValueError("All elements in cost_process must be greater than 0.") - def check_cost_time(self) -> None: + def _check_cost_time(self) -> None: if any(cost_time_i <= 0 for cost_time_i in self.factors["cost_time"]): - raise ValueError( - "All elements in cost_time must be greater than 0." - ) + raise ValueError("All elements in cost_time must be greater than 0.") - def check_mode_transit_time(self) -> None: + def _check_mode_transit_time(self) -> None: if any( - transit_time_i <= 0 - for transit_time_i in self.factors["mode_transit_time"] + transit_time_i <= 0 for transit_time_i in self.factors["mode_transit_time"] ): raise ValueError( "All elements in mode_transit_time must be greater than 0." ) - def check_lower_limits_transit_time(self) -> None: - if any( - lower_i <= 0 - for lower_i in self.factors["lower_limits_transit_time"] - ): + def _check_lower_limits_transit_time(self) -> None: + if any(lower_i <= 0 for lower_i in self.factors["lower_limits_transit_time"]): raise ValueError( "All elements in lower_limits_transit_time must be greater than 0." ) - def check_upper_limits_transit_time(self) -> None: - if any( - upper_i <= 0 - for upper_i in self.factors["upper_limits_transit_time"] - ): + def _check_upper_limits_transit_time(self) -> None: + if any(upper_i <= 0 for upper_i in self.factors["upper_limits_transit_time"]): raise ValueError( "All elements in upper_limits_transit_time must be greater than 0." ) - def check_arrival_rate(self) -> None: + def _check_arrival_rate(self) -> None: if self.factors["arrival_rate"] <= 0: raise ValueError("arrival_rate must be greater than 0.") - def check_n_messages(self) -> None: + def _check_n_messages(self) -> None: if self.factors["n_messages"] <= 0: raise ValueError("n_messages must be greater than 0.") - def check_n_networks(self) -> None: + def _check_n_networks(self) -> None: if self.factors["n_networks"] <= 0: raise ValueError("n_networks must be greater than 0.") + @override def check_simulatable_factors(self) -> bool: if len(self.factors["process_prob"]) != self.factors["n_networks"]: - raise ValueError( - "The length of process_prob must equal n_networks." - ) - elif len(self.factors["cost_process"]) != self.factors["n_networks"]: - raise ValueError( - "The length of cost_process must equal n_networks." - ) - elif len(self.factors["cost_time"]) != self.factors["n_networks"]: + raise ValueError("The length of process_prob must equal n_networks.") + if len(self.factors["cost_process"]) != self.factors["n_networks"]: + raise ValueError("The length of cost_process must equal n_networks.") + if len(self.factors["cost_time"]) != self.factors["n_networks"]: raise ValueError("The length of cost_time must equal n_networks.") - elif ( - len(self.factors["mode_transit_time"]) != self.factors["n_networks"] - ): - raise ValueError( - "The length of mode_transit_time must equal n_networks." - ) - elif ( - len(self.factors["lower_limits_transit_time"]) - != self.factors["n_networks"] - ): + if len(self.factors["mode_transit_time"]) != self.factors["n_networks"]: + raise ValueError("The length of mode_transit_time must equal n_networks.") + if len(self.factors["lower_limits_transit_time"]) != self.factors["n_networks"]: raise ValueError( "The length of lower_limits_transit_time must equal n_networks." ) - elif ( - len(self.factors["upper_limits_transit_time"]) - != self.factors["n_networks"] - ): + if len(self.factors["upper_limits_transit_time"]) != self.factors["n_networks"]: raise ValueError( "The length of upper_limits_transit_time must equal n_networks." ) - elif any( - [ - self.factors["mode_transit_time"][i] - < self.factors["lower_limits_transit_time"][i] - for i in range(self.factors["n_networks"]) - ] + if any( + self.factors["mode_transit_time"][i] + < self.factors["lower_limits_transit_time"][i] + for i in range(self.factors["n_networks"]) ): raise ValueError( - "The mode_transit time must be greater than or equal to the corresponding lower_limits_transit_time for each network." + "The mode_transit time must be greater than or equal to the " + "corresponding lower_limits_transit_time for each network." ) - elif any( - [ - self.factors["upper_limits_transit_time"][i] - < self.factors["mode_transit_time"][i] - for i in range(self.factors["n_networks"]) - ] + if any( + self.factors["upper_limits_transit_time"][i] + < self.factors["mode_transit_time"][i] + for i in range(self.factors["n_networks"]) ): raise ValueError( - "The mode_transit time must be less than or equal to the corresponding upper_limits_transit_time for each network." + "The mode_transit time must be less than or equal to the corresponding " + "upper_limits_transit_time for each network." ) - else: - return True + return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: - """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measure of interest - "total_cost": total cost spent to route all messages - gradients : dict of dicts - gradient estimates for each response + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measure of interest, including: + - "total_cost": Total cost spent to route all messages. + - gradients (dict): A dictionary of gradient estimates for + each response. """ # Determine total number of arrivals to simulate. total_arrivals = self.factors["n_messages"] + arrival_rate = self.factors["arrival_rate"] + n_networks = self.factors["n_networks"] + process_prob = self.factors["process_prob"] + lower_limits_transit_time = self.factors["lower_limits_transit_time"] + upper_limits_transit_time = self.factors["upper_limits_transit_time"] + mode_transit_time = self.factors["mode_transit_time"] + cost_process = self.factors["cost_process"] + cost_time = self.factors["cost_time"] + # Designate separate random number generators. arrival_rng = rng_list[0] network_rng = rng_list[1] transit_rng = rng_list[2] - # Generate all interarrival, network routes, and service times before the simulation run. + + # Generate all interarrival, network routes, and service times before the + # simulation run. arrival_times = [ - arrival_rng.expovariate(self.factors["arrival_rate"]) - for _ in range(total_arrivals) + arrival_rng.expovariate(arrival_rate) for _ in range(total_arrivals) ] network_routes = network_rng.choices( - range(self.factors["n_networks"]), - weights=self.factors["process_prob"], + range(n_networks), + weights=process_prob, k=total_arrivals, ) service_times = [ transit_rng.triangular( - low=self.factors["lower_limits_transit_time"][ - network_routes[i] - ], - high=self.factors["upper_limits_transit_time"][ - network_routes[i] - ], - mode=self.factors["mode_transit_time"][network_routes[i]], + low=lower_limits_transit_time[route], + high=upper_limits_transit_time[route], + mode=mode_transit_time[route], ) - for i in range(total_arrivals) + for route in network_routes ] - # Create matrix storing times and metrics for each message: - # column 0 : arrival time to queue; - # column 1 : network route; - # column 2 : service time; - # column 3 : service completion time; - # column 4 : sojourn time; - # column 5 : waiting time; - # column 6 : processing cost; - # column 7 : time cost; - # column 8 : total cost; + + # Alias columns by index + class Col(IntEnum): + ARR = 0 # arrival time to queue + ROUTE = 1 # network route + SVC = 2 # service time + DONE = 3 # service completion time + SOJ = 4 # sojourn time + WAIT = 5 # waiting time + PROC_COST = 6 # processing cost + TIME_COST = 7 # time cost + TOTAL_COST = 8 # total cost + message_mat = np.zeros((total_arrivals, 9)) - message_mat[:, 0] = np.cumsum(arrival_times) - message_mat[:, 1] = network_routes - message_mat[:, 2] = service_times + message_mat[:, Col.ARR] = np.cumsum(arrival_times) + message_mat[:, Col.ROUTE] = network_routes + message_mat[:, Col.SVC] = service_times # Fill in entries for remaining messages' metrics. # Create a list recording the index of the last customer sent to each network. # Starting with -1, indicating no one is in line. - last_in_line = [-1 for _ in range(self.factors["n_networks"])] - # Start of the simulation run. + routes = message_mat[:, Col.ROUTE].astype(int) + arrival = message_mat[:, Col.ARR] + service = message_mat[:, Col.SVC] + + # Initialize completion time tracking per network + last_in_line = [-1] * n_networks + for i in range(total_arrivals): - # Identify the network that message i was routed to. - network = int(message_mat[i, 1]) - # Check if there was a message in line previously sent to that network. - if last_in_line[network] == -1: - # With no message in line, message i's service completion time is its arrival time plus its service time. - message_mat[i, 3] = message_mat[i, 0] + message_mat[i, 2] + net = routes[i] + arr_i = arrival[i] + svc_i = service[i] + + if last_in_line[net] == -1: + done = arr_i + svc_i else: - # With a message in line, message i's service completion time will be calculated using Lindley's recursion method. - # We first choose the maximum between the arrival time of message i and the last in line message's service completion time. - # We then add message's i service time to this value. - message_mat[i, 3] = ( - max( - message_mat[i, 0], message_mat[last_in_line[network], 3] - ) - + message_mat[i, 2] - ) - # Calculate other statistics. - message_mat[i, 4] = message_mat[i, 3] - message_mat[i, 0] - message_mat[i, 5] = message_mat[i, 4] - message_mat[i, 2] - message_mat[i, 6] = self.factors["cost_process"][network] - message_mat[i, 7] = ( - self.factors["cost_time"][network] * message_mat[i, 4] - ) - message_mat[i, 8] = message_mat[i, 6] + message_mat[i, 7] - last_in_line[network] = i + done = max(arr_i, message_mat[last_in_line[net], Col.DONE]) + svc_i + + curr_message = message_mat[i] + curr_message[Col.DONE] = done + curr_message[Col.SOJ] = done - arr_i + curr_message[Col.WAIT] = curr_message[Col.SOJ] - svc_i + last_in_line[net] = i + + # Vectorized cost computations after SOJ is known + message_mat[:, Col.PROC_COST] = np.array(cost_process)[routes] + message_mat[:, Col.TIME_COST] = ( + np.array(cost_time)[routes] * message_mat[:, Col.SOJ] + ) + message_mat[:, Col.TOTAL_COST] = ( + message_mat[:, Col.PROC_COST] + message_mat[:, Col.TIME_COST] + ) + + routes = message_mat[:, Col.ROUTE].astype(int) + message_mat[:, Col.PROC_COST] = np.array(cost_process)[routes] + message_mat[:, Col.TIME_COST] = ( + np.array(cost_time)[routes] * message_mat[:, Col.SOJ] + ) + message_mat[:, Col.TOTAL_COST] = ( + message_mat[:, Col.PROC_COST] + message_mat[:, Col.TIME_COST] + ) # Compute total costs for the simulation run. - total_cost = sum(message_mat[:, 8]) + total_cost = np.sum(message_mat[:, Col.TOTAL_COST]) responses = {"total_cost": total_cost} gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the expected total cost routing the messages though the communication network. -""" +class NetworkMinTotalCost(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "NETWORK-1" -class NetworkMinTotalCost(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed_factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Total Cost for Communication Networks System" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.DETERMINISTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"process_prob"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -477,6 +409,7 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, @@ -484,14 +417,17 @@ def check_factor_list(self) -> dict[str, Callable]: } @property + @override def dim(self) -> int: return self.model.factors["n_networks"] @property + @override def lower_bounds(self) -> tuple: return (0,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (1,) * self.dim @@ -501,6 +437,13 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the NetworkMinTotalCost problem. + + Args: + name (str): Name of the problem. + fixed_factors (dict): Fixed factors for the problem. + model_fixed_factors (dict): Fixed factors for the model. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -509,159 +452,36 @@ def __init__( model=Network, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"process_prob": vector[:]} - return factor_dict + return {"process_prob": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["process_prob"]) - return vector + return tuple(factor_dict["process_prob"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["total_cost"],) - return objectives + return (response_dict["total_cost"],) - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints - - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = (0,) * self.model.factors["n_networks"] return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic - constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ # Check box constraints. box_feasible = super().check_deterministic_constraints(x) + if not box_feasible: + return False + # Check constraint that probabilities sum to one. - probability_feasible = round(sum(x), 10) == 1.0 - return box_feasible and probability_feasible + return round(sum(x), 10) == 1.0 + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ # Generating a random pmf with length equal to number of networks. x = rand_sol_rng.continuous_random_vector_from_simplex( n_elements=self.model.factors["n_networks"], diff --git a/simopt/models/paramesti.py b/simopt/models/paramesti.py index b73f95f3b..7ea9fbb60 100644 --- a/simopt/models/paramesti.py +++ b/simopt/models/paramesti.py @@ -1,10 +1,4 @@ -""" -Summary -------- -Simulate MLE estimation for the parameters of a two-dimensional gamma distribution. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate MLE estimation for the parameters of a 2D gamma distribution.""" from __future__ import annotations @@ -12,55 +6,38 @@ from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class ParameterEstimation(Model): - """ - A model that simulates MLE estimation for the parameters of - a two-dimensional gamma distribution. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.model - """ + """MLE estimation model for the parameters of a 2D gamma distribution.""" - @property - def name(self) -> str: + @classproperty + @override + def class_name_abbr(cls) -> str: return "PARAMESTI" - @property - def n_rngs(self) -> int: + @classproperty + @override + def class_name(cls) -> str: + return "Gamma Parameter Estimation" + + @classproperty + @override + def n_rngs(cls) -> int: return 2 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "xstar": { "description": "x^*, the unknown parameter that maximizes g(x)", @@ -75,195 +52,149 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: - return {"xstar": self.check_xstar, "x": self.check_x} + return {"xstar": self._check_xstar, "x": self._check_x} def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the model. + + Args: + fixed_factors (dict, optional): Fixed factors of the simulation model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_xstar(self) -> None: + def _check_xstar(self) -> None: if any(xstar_i <= 0 for xstar_i in self.factors["xstar"]): raise ValueError("All elements in xstar must be greater than 0.") - def check_x(self) -> None: + def _check_x(self) -> None: if any(x_i <= 0 for x_i in self.factors["x"]): raise ValueError("All elements in x must be greater than 0.") + @override def check_simulatable_factors(self) -> bool: # Check for dimension of x and xstar. x_len = len(self.factors["x"]) xstar_len = len(self.factors["xstar"]) if x_len != 2: raise ValueError("The length of x must equal 2.") - elif xstar_len != 2: + if xstar_len != 2: raise ValueError("The length of xstar must equal 2.") return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "loglik": The corresponding log-likelihood. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "loglik" = the corresponding loglikelihood - gradients : dict of dicts - gradient estimates for each response - """ + xstar = self.factors["xstar"] + x = self.factors["x"] # Designate separate random number generators. # Outputs will be coupled when generating Y_j's. y2_rng = rng_list[0] y1_rng = rng_list[1] # Generate y1 and y2 from specified gamma distributions. - y2 = y2_rng.gammavariate(self.factors["xstar"][1], 1) - y1 = y1_rng.gammavariate(self.factors["xstar"][0] * y2, 1) + y2 = y2_rng.gammavariate(xstar[1], 1) + y1 = y1_rng.gammavariate(xstar[0] * y2, 1) # Compute Log Likelihood loglik = ( -y1 - y2 - + (self.factors["x"][0] * y2 - 1) * np.log(y1) - + (self.factors["x"][1] - 1) * np.log(y2) - - np.log(math.gamma(self.factors["x"][0] * y2)) - - np.log(math.gamma(self.factors["x"][1])) + + (x[0] * y2 - 1) * np.log(y1) + + (x[1] - 1) * np.log(y2) + - np.log(math.gamma(x[0] * y2)) + - np.log(math.gamma(x[1])) ) # Compose responses and gradients. responses = {"loglik": loglik} gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the log likelihood of 2-D gamma random variable. -""" +class ParamEstiMaxLogLik(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "PARAMESTI-1" -class ParamEstiMaxLogLik(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : list - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - prev_cost : list - cost of prevention - upper_thres : float > 0 - upper limit of amount of contamination - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Log Likelihood for Gamma Parameter Estimation" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple: + @classproperty + @override + def minmax(cls) -> tuple: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None @property + @override def optimal_solution(self) -> tuple | None: solution = self.model.factors["xstar"] if isinstance(solution, list): return tuple(solution) return solution - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"x"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -279,23 +210,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 2 - @property - def lower_bounds(self) -> tuple: - return (0.1,) * self.dim + @classproperty + @override + def lower_bounds(cls) -> tuple: + return (0.1,) * cls.dim - @property - def upper_bounds(self) -> tuple: - return (10,) * self.dim + @classproperty + @override + def upper_bounds(cls) -> tuple: + return (10,) * cls.dim def __init__( self, @@ -303,6 +238,16 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the problem. + + Args: + name (str, optional): User-specified name for problem. + Defaults to "PARAMESTI-1". + fixed_factors (dict, optional): Fixed factors of the simulation model. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors of the simulation + model. Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -311,134 +256,33 @@ def __init__( model=ParameterEstimation, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"x": vector[:]} - return factor_dict + return {"x": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = tuple(factor_dict["x"]) - return vector + return tuple(factor_dict["x"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["loglik"],) - return objectives + return (response_dict["loglik"],) - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0, 0),) return det_objectives, det_objectives_gradients - def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ + @override + def check_deterministic_constraints(self, _x: tuple) -> bool: return True + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - x = tuple( + return tuple( [ - rand_sol_rng.uniform( - self.lower_bounds[idx], self.upper_bounds[idx] - ) + rand_sol_rng.uniform(self.lower_bounds[idx], self.upper_bounds[idx]) for idx in range(self.dim) ] ) - return x - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - tuple - vector of LHSs of stochastic constraint - """ - raise NotImplementedError diff --git a/simopt/models/rmitd.py b/simopt/models/rmitd.py index 4f246c139..4421555ba 100644 --- a/simopt/models/rmitd.py +++ b/simopt/models/rmitd.py @@ -1,67 +1,41 @@ -""" -Summary -------- -Simulate a multi-stage revenue management system with inter-temporal dependence. -A detailed description of the model/problem can be found -`here `__. - -""" +"""Simulate a multi-stage revenue management system with inter-temporal dependence.""" from __future__ import annotations from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class RMITD(Model): - """ + """Multi-stage Revenue Management with Inter-temporal Dependence (RMITD). + A model that simulates a multi-stage revenue management system with - inter-temporal dependence. - Returns the total revenue. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model + inter-temporal dependence. Returns the total revenue. """ - @property - def name(self) -> str: - return "RMITD" + @classproperty + @override + def class_name(cls) -> str: + return "Revenue Management Temporal Demand" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 2 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "time_horizon": { "description": "time horizon", @@ -106,127 +80,123 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "time_horizon": self.check_time_horizon, - "prices": self.check_prices, - "demand_means": self.check_demand_means, - "cost": self.check_cost, - "gamma_shape": self.check_gamma_shape, - "gamma_scale": self.check_gamma_scale, - "initial_inventory": self.check_initial_inventory, - "reservation_qtys": self.check_reservation_qtys, + "time_horizon": self._check_time_horizon, + "prices": self._check_prices, + "demand_means": self._check_demand_means, + "cost": self._check_cost, + "gamma_shape": self._check_gamma_shape, + "gamma_scale": self._check_gamma_scale, + "initial_inventory": self._check_initial_inventory, + "reservation_qtys": self._check_reservation_qtys, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the RMITD model. + + Args: + fixed_factors (dict, optional): Dictionary of fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_time_horizon(self) -> None: + def _check_time_horizon(self) -> None: if self.factors["time_horizon"] <= 0: raise ValueError("time_horizon must be greater than 0.") - def check_prices(self) -> None: + def _check_prices(self) -> None: if any(price <= 0 for price in self.factors["prices"]): raise ValueError("All elements in prices must be greater than 0.") - def check_demand_means(self) -> None: - if any( - demand_mean <= 0 for demand_mean in self.factors["demand_means"] - ): - raise ValueError( - "All elements in demand_means must be greater than 0." - ) + def _check_demand_means(self) -> None: + if any(demand_mean <= 0 for demand_mean in self.factors["demand_means"]): + raise ValueError("All elements in demand_means must be greater than 0.") - def check_cost(self) -> None: + def _check_cost(self) -> None: if self.factors["cost"] <= 0: raise ValueError("cost must be greater than 0.") - def check_gamma_shape(self) -> None: + def _check_gamma_shape(self) -> None: if self.factors["gamma_shape"] <= 0: raise ValueError("gamma_shape must be greater than 0.") - def check_gamma_scale(self) -> None: + def _check_gamma_scale(self) -> None: if self.factors["gamma_scale"] <= 0: raise ValueError("gamma_scale must be greater than 0.") - def check_initial_inventory(self) -> None: + def _check_initial_inventory(self) -> None: if self.factors["initial_inventory"] <= 0: raise ValueError("initial_inventory must be greater than 0.") - def check_reservation_qtys(self) -> None: + def _check_reservation_qtys(self) -> None: if any( - reservation_qty <= 0 - for reservation_qty in self.factors["reservation_qtys"] + reservation_qty <= 0 for reservation_qty in self.factors["reservation_qtys"] ): - raise ValueError( - "All elements in reservation_qtys must be greater than 0." - ) + raise ValueError("All elements in reservation_qtys must be greater than 0.") + @override def check_simulatable_factors(self) -> bool: # Check for matching number of periods. if len(self.factors["prices"]) != self.factors["time_horizon"]: - raise ValueError( - "The length of prices must be equal to time_horizon." - ) - elif len(self.factors["demand_means"]) != self.factors["time_horizon"]: + raise ValueError("The length of prices must be equal to time_horizon.") + if len(self.factors["demand_means"]) != self.factors["time_horizon"]: raise ValueError( "The length of demand_means must be equal to time_horizon." ) - elif ( - len(self.factors["reservation_qtys"]) - != self.factors["time_horizon"] - 1 - ): + if len(self.factors["reservation_qtys"]) != self.factors["time_horizon"] - 1: raise ValueError( - "The length of reservation_qtys must be equal to the time_horizon minus 1." + "The length of reservation_qtys must be equal to the time_horizon " + "minus 1." ) # Check that first reservation level is less than initial inventory. - elif ( - self.factors["initial_inventory"] - < self.factors["reservation_qtys"][0] - ): + if self.factors["initial_inventory"] < self.factors["reservation_qtys"][0]: raise ValueError( - "The initial_inventory must be greater than or equal to the first element in reservation_qtys." + "The initial_inventory must be greater than or equal to the first " + "element in reservation_qtys." ) # Check for non-increasing reservation levels. - elif any( + if any( self.factors["reservation_qtys"][idx] < self.factors["reservation_qtys"][idx + 1] for idx in range(self.factors["time_horizon"] - 2) ): raise ValueError( - "Each value in reservation_qtys must be greater than the next value in the list." + "Each value in reservation_qtys must be greater than the next value " + "in the list." ) # Check that gamma_shape*gamma_scale = 1. - elif ( - np.isclose( - self.factors["gamma_shape"] * self.factors["gamma_scale"], 1 - ) + if ( + np.isclose(self.factors["gamma_shape"] * self.factors["gamma_scale"], 1) is False ): - raise ValueError( - "gamma_shape times gamma_scale should be close to 1." - ) - else: - return True + raise ValueError("gamma_shape times gamma_scale should be close to 1.") + return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "revenue": Total revenue. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "revenue" = total revenue - gradients : dict of dicts - gradient estimates for each response - """ + gamma_shape = self.factors["gamma_shape"] + gamma_scale = self.factors["gamma_scale"] + time_horizon = self.factors["time_horizon"] + initial_inventory = self.factors["initial_inventory"] + reservation_qtys: list = self.factors["reservation_qtys"] + demand_means = np.array(self.factors["demand_means"]) + prices = self.factors["prices"] + cost = self.factors["cost"] # Designate separate random number generators. # Outputs will be coupled when generating demand. x_rng = rng_list[0] @@ -236,159 +206,101 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: # alpha = k = gamma_shape # beta = 1/theta = 1/gamma_scale x_demand = x_rng.gammavariate( - alpha=self.factors["gamma_shape"], - beta=1.0 / self.factors["gamma_scale"], + alpha=gamma_shape, + beta=1.0 / gamma_scale, ) - y_demand = [ - y_rng.expovariate(1) for _ in range(self.factors["time_horizon"]) - ] - # Track inventory over time horizon. - remaining_inventory = self.factors["initial_inventory"] - # Append "no reservations" for decision-making in final period. - reservations = self.factors["reservation_qtys"] - reservations.append(0) - # Simulate over the time horizon and calculate the realized revenue. - revenue = 0 - for period in range(self.factors["time_horizon"]): - demand = ( - self.factors["demand_means"][period] - * x_demand - * y_demand[period] - ) - sell = min( - max(remaining_inventory - reservations[period], 0), demand - ) - remaining_inventory = remaining_inventory - sell - revenue += sell * self.factors["prices"][period] - revenue -= self.factors["cost"] * self.factors["initial_inventory"] + y_demand = np.array([y_rng.expovariate(1) for _ in range(time_horizon)]) + reservations = [*reservation_qtys, 0] + demand_vec = demand_means * x_demand * y_demand + + # Set initial inventory and revenue + remaining_inventory = initial_inventory + revenue = 0.0 + + # Compute revenue for each period. + for reservation, demand, price in zip(reservations, demand_vec, prices): + available = max(remaining_inventory - reservation, 0) + sell = min(available, demand) + remaining_inventory -= sell + revenue += sell * price + + revenue -= cost * initial_inventory + # Compose responses and gradients. responses = {"revenue": revenue} gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Maximize the total revenue of a multi-stage revenue management -with inter-temporal dependence problem. -""" +class RMITDMaxRevenue(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "RMITD-1" -class RMITDMaxRevenue(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed_factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Revenue for Revenue Management Temporal Demand" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.DETERMINISTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.DISCRETE - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: - # return (90, 50, 0) + @classproperty + @override + def optimal_solution(cls) -> None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"initial_inventory", "reservation_qtys"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -404,23 +316,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 3 - @property - def lower_bounds(self) -> tuple: - return (0,) * self.dim + @classproperty + @override + def lower_bounds(cls) -> tuple: + return (0,) * cls.dim - @property - def upper_bounds(self) -> tuple: - return (np.inf,) * self.dim + @classproperty + @override + def upper_bounds(cls) -> tuple: + return (np.inf,) * cls.dim def __init__( self, @@ -428,6 +344,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the RMITDMaxRevenue problem. + + Args: + name (str): Name of the problem. + fixed_factors (dict, optional): Dictionary of fixed factors for the model. + Defaults to None. + model_fixed_factors (dict, optional): Dictionary of fixed factors for the + model. Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -436,115 +361,33 @@ def __init__( model=RMITD, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = { + return { "initial_inventory": vector[0], "reservation_qtys": list(vector[0:]), } - return factor_dict + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = ( + return ( factor_dict["initial_inventory"], *tuple(factor_dict["reservation_qtys"]), ) - return vector + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["revenue"],) - return objectives + return (response_dict["revenue"],) + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ return all(x[idx] >= x[idx + 1] for idx in range(self.dim - 1)) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ # Generate random solution using acceptable/rejection. while True: x = tuple([200 * rand_sol_rng.random() for _ in range(self.dim)]) if self.check_deterministic_constraints(x): break return x - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - tuple - vector of LHSs of stochastic constraint - """ - raise NotImplementedError diff --git a/simopt/models/san.py b/simopt/models/san.py index 6d2045e5c..34cb4d307 100644 --- a/simopt/models/san.py +++ b/simopt/models/san.py @@ -1,68 +1,45 @@ -""" -Summary -------- -Simulate duration of a stochastic activity network (SAN). -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate duration of a stochastic activity network (SAN).""" from __future__ import annotations +from collections import deque from typing import Callable, Final import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override NUM_ARCS: Final[int] = 13 class SAN(Model): - """ + """Stochastic Activity Network (SAN) Model. + A model that simulates a stochastic activity network problem with tasks that have exponentially distributed durations, and the selected means come with a cost. - - Attributes - ---------- - name : string - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI and data validation) - check_factor_list : dict - switch case for checking factor simulatability - - Arguments - --------- - fixed_factors : nested dict - fixed factors of the simulation model - - See also - -------- - base.Model """ - @property - def name(self) -> str: - return "SAN" + @classproperty + @override + def class_name(cls) -> str: + return "Stochastic Activity Network" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 1 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 1 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "num_nodes": { "description": "number of nodes", @@ -97,22 +74,29 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "num_nodes": self.check_num_nodes, - "arcs": self.check_arcs, - "arc_means": self.check_arc_means, + "num_nodes": self._check_num_nodes, + "arcs": self._check_arcs, + "arc_means": self._check_arc_means, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the SAN model. + + Args: + fixed_factors : dict + fixed factors of the simulation model + """ # Let the base class handle default arguments. super().__init__(fixed_factors) - def check_num_nodes(self) -> None: + def _check_num_nodes(self) -> None: if self.factors["num_nodes"] <= 0: raise ValueError("num_nodes must be greater than 0.") - def dfs( + def __dfs( self, graph: dict[int, set], start: int, visited: set | None = None ) -> set: if visited is None: @@ -120,29 +104,26 @@ def dfs( visited.add(start) for next_point in graph[start] - visited: - self.dfs(graph, next_point, visited) + self.__dfs(graph, next_point, visited) return visited - def check_arcs(self) -> bool: + def _check_arcs(self) -> bool: if len(self.factors["arcs"]) <= 0: raise ValueError("The length of arcs must be greater than 0.") # Check graph is connected. - graph = { - node: set() for node in range(1, self.factors["num_nodes"] + 1) - } + graph = {node: set() for node in range(1, self.factors["num_nodes"] + 1)} for a in self.factors["arcs"]: graph[a[0]].add(a[1]) - visited = self.dfs(graph, 1) - if self.factors["num_nodes"] in visited: - return True - return False + visited = self.__dfs(graph, 1) + return self.factors["num_nodes"] in visited - def check_arc_means(self) -> bool: + def _check_arc_means(self) -> bool: positive = True for x in list(self.factors["arc_means"]): positive = positive and (x > 0) return positive + @override def check_simulatable_factors(self) -> bool: if len(self.factors["arc_means"]) != len(self.factors["arcs"]): raise ValueError( @@ -151,88 +132,75 @@ def check_simulatable_factors(self) -> bool: return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "longest_path_length": Length or duration of the longest path. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - "longest_path_length" = length/duration of longest path - gradients : dict of dicts - gradient estimates for each response - """ + num_nodes: int = self.factors["num_nodes"] + arcs: list[tuple[int, int]] = self.factors["arcs"] + arc_means: tuple[int, ...] = self.factors["arc_means"] # Designate separate random number generators. exp_rng = rng_list[0] # Topological sort. - graph_in = { - node: set() for node in range(1, self.factors["num_nodes"] + 1) - } - graph_out = { - node: set() for node in range(1, self.factors["num_nodes"] + 1) - } - for a in self.factors["arcs"]: - graph_in[a[1]].add(a[0]) - graph_out[a[0]].add(a[1]) - indegrees = [ - len(graph_in[n]) for n in range(1, self.factors["num_nodes"] + 1) - ] - # outdegrees = [len(graph_out[n]) for n in range(1, self.factors["num_nodes"]+1)] - queue = [] + node_range = range(1, num_nodes + 1) + graph_in = {node: set() for node in node_range} + graph_out = {node: set() for node in node_range} + for start, end in arcs: + graph_in[end].add(start) + graph_out[start].add(end) + + indegrees = [len(graph_in[n]) for n in node_range] + # outdegrees = [len(graph_out[n]) for n in node_range] + queue = deque(n for n in node_range if indegrees[n - 1] == 0) topo_order = [] - for n in range(self.factors["num_nodes"]): - if indegrees[n] == 0: - queue.append(n + 1) - while len(queue) != 0: - u = queue.pop(0) + while queue: + u = queue.popleft() topo_order.append(u) - for n in graph_out[u]: - indegrees[n - 1] -= 1 - if indegrees[n - 1] == 0: - queue.append(n) - - # Generate arc lengths. - arc_length = {} - for i in range(len(self.factors["arcs"])): - arc_length[str(self.factors["arcs"][i])] = exp_rng.expovariate( - 1 / self.factors["arc_means"][i] - ) + for v in graph_out[u]: + indegrees[v - 1] -= 1 + if indegrees[v - 1] == 0: + queue.append(v) + + # Arc lengths + arc_length = { + arc: exp_rng.expovariate(1 / arc_means[i]) for i, arc in enumerate(arcs) + } - # Calculate the length of the longest path. - path_length = np.zeros(self.factors["num_nodes"]) - prev = np.zeros(self.factors["num_nodes"]) - for i in range(1, self.factors["num_nodes"]): - vi = topo_order[i - 1] + # Longest path + path_length = np.zeros(num_nodes) + prev = np.full(num_nodes, -1) + for vi in topo_order: for j in graph_out[vi]: - if ( - path_length[j - 1] - < path_length[vi - 1] + arc_length[str((vi, j))] - ): - path_length[j - 1] = ( - path_length[vi - 1] + arc_length[str((vi, j))] - ) + new_len = path_length[vi - 1] + arc_length[(vi, j)] + if new_len > path_length[j - 1]: + path_length[j - 1] = new_len prev[j - 1] = vi - longest_path = path_length[self.factors["num_nodes"] - 1] + + longest_path = path_length[-1] # Calculate the IPA gradient w.r.t. arc means. # If an arc is on the longest path, the component of the gradient # is the length of the length of that arc divided by its mean. # If an arc is not on the longest path, the component of the gradient is zero. - gradient = np.zeros(len(self.factors["arcs"])) + arc_to_index = {arc: i for i, arc in enumerate(arcs)} + gradient = np.zeros(len(arcs)) current = topo_order[-1] - backtrack = int(prev[self.factors["num_nodes"] - 1]) + backtrack = int(prev[-1]) + while current != topo_order[0]: - idx = self.factors["arcs"].index((backtrack, current)) - gradient[idx] = ( - arc_length[str((backtrack, current))] - / (self.factors["arc_means"][idx]) - ) + arc = (backtrack, current) + idx = arc_to_index[arc] + gradient[idx] = arc_length[arc] / arc_means[idx] current = backtrack backtrack = int(prev[backtrack - 1]) @@ -249,121 +217,72 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: return responses, gradients -""" -Summary -------- -Minimize the duration of the longest path from a to i plus cost. -""" +class SANLongestPath(Problem): + """Base class to implement simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "SAN-1" -class SANLongestPath(Problem): - """ - Base class to implement simulation-optimization problems. - - Attributes - ---------- - name : string - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : Model object - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : list - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name for problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Mean Longest Path for Stochastic Activity Network" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return True - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"arc_means"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -384,22 +303,26 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, - "arc_costs": self.check_arc_costs, + "arc_costs": self._check_arc_costs, } @property + @override def dim(self) -> int: return len(self.model.factors["arcs"]) @property + @override def lower_bounds(self) -> tuple: return (1e-2,) * self.dim @property + @override def upper_bounds(self) -> tuple: return (np.inf,) * self.dim @@ -409,6 +332,17 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the SANLongestPath problem. + + Args: + name : str + user-specified name for problem + fixed_factors : dict + dictionary of user-specified problem factors + model_fixed_factors : dict + subset of user-specified non-decision factors to pass through to the + model + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -417,103 +351,32 @@ def __init__( model=SAN, ) - def check_arc_costs(self) -> bool: + def _check_arc_costs(self) -> bool: positive = True for x in list(self.factors["arc_costs"]): positive = positive and x > 0 - matching_len = len(self.factors["arc_costs"]) == len( - self.model.factors["arcs"] - ) + matching_len = len(self.factors["arc_costs"]) == len(self.model.factors["arcs"]) return positive and matching_len + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dictionary - dictionary with factor keys and associated values - """ - factor_dict = {"arc_means": vector[:]} - return factor_dict + return {"arc_means": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dictionary - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = factor_dict["arc_means"] - return vector + return factor_dict["arc_means"] + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["longest_path_length"],) - return objectives + return (response_dict["longest_path_length"],) - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dictionary - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + def deterministic_stochastic_constraints_and_gradients(self) -> tuple[tuple, tuple]: + """Compute deterministic components of stochastic constraints. - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of stochastic constraints + Returns: + tuple: + - tuple: The deterministic components of the stochastic constraints. + - tuple: The gradients of those deterministic components. """ det_stoch_constraints = () det_stoch_constraints_gradients = ( @@ -521,67 +384,20 @@ def deterministic_stochastic_constraints_and_gradients( ) # tuple of tuples - of sizes self.dim by self.dim, full of zeros return det_stoch_constraints, det_stoch_constraints_gradients - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ - det_objectives = ( - np.sum(np.array(self.factors["arc_costs"]) / np.array(x)), - ) + @override + def deterministic_objectives_and_gradients(self, x: tuple) -> tuple[tuple, tuple]: + det_objectives = (np.sum(np.array(self.factors["arc_costs"]) / np.array(x)),) det_objectives_gradients = ( -np.array(self.factors["arc_costs"]) / (np.array(x) ** 2), ) return det_objectives, det_objectives_gradients + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ - is_positive: list[bool] = [x_i >= 0 for x_i in x] - return all(is_positive) + return all(x_i >= 0 for x_i in x) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a object - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - x = tuple( - [ - rand_sol_rng.lognormalvariate(lq=0.1, uq=10) - for _ in range(self.dim) - ] + return tuple( + [rand_sol_rng.lognormalvariate(lq=0.1, uq=10) for _ in range(self.dim)] ) - return x diff --git a/simopt/models/sscont.py b/simopt/models/sscont.py index 9dbae51f0..b9863bd56 100644 --- a/simopt/models/sscont.py +++ b/simopt/models/sscont.py @@ -1,11 +1,4 @@ -""" -Summary -------- -Simulate multiple periods worth of sales for a (s,S) inventory problem -with continuous inventory. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate sales for a (s,S) inventory problem with continuous inventory.""" from __future__ import annotations @@ -13,82 +6,46 @@ from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class SSCont(Model): - """ + """(s,S) Inventory Simulation Model. + A model that simulates multiple periods' worth of sales for a (s,S) inventory problem with continuous inventory, exponentially distributed demand, and poisson distributed lead time. Returns the various types of average costs per period, order rate, stockout rate, fraction of demand met with inventory on hand, average amount backordered given a stockout occured, and average amount ordered given an order occured. - - Attributes - ---------- - name : str - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Parameters - ---------- - fixed_factors : dict - fixed_factors of the simulation model - - ``demand_mean`` - Mean of exponentially distributed demand in each period (`flt`) - ``lead_mean`` - Mean of Poisson distributed order lead time (`flt`) - ``backorder_cost`` - Cost per unit of demand not met with in-stock inventory (`flt`) - ``holding_cost`` - Holding cost per unit per period (`flt`) - ``fixed_cost`` - Order fixed cost (`flt`) - ``variable_cost`` - Order variable cost per unit (`flt`) - ``s`` - Inventory position threshold for placing order (`flt`) - ``S`` - Max inventory position (`flt`) - ``n_days`` - Number of periods to simulate (`int`) - ``warmup`` - Number of periods as warmup before collecting statistics (`int`) - See also - -------- - base.Model """ - @property - def name(self) -> str: - return "SSCONT" + @classproperty + @override + def class_name(cls) -> str: + return "(s, S) Inventory" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 2 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 7 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "demand_mean": { - "description": "mean of exponentially distributed demand in each period", + "description": ( + "mean of exponentially distributed demand in each period" + ), "datatype": float, "default": 100.0, }, @@ -98,7 +55,9 @@ def specifications(self) -> dict[str, dict]: "default": 6.0, }, "backorder_cost": { - "description": "cost per unit of demand not met with in-stock inventory", + "description": ( + "cost per unit of demand not met with in-stock inventory" + ), "datatype": float, "default": 4.0, }, @@ -134,7 +93,9 @@ def specifications(self) -> dict[str, dict]: "isDatafarmable": False, }, "warmup": { - "description": "number of periods as warmup before collecting statistics", + "description": ( + "number of periods as warmup before collecting statistics" + ), "datatype": int, "default": 20, "isDatafarmable": False, @@ -142,219 +103,202 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "demand_mean": self.check_demand_mean, - "lead_mean": self.check_lead_mean, - "backorder_cost": self.check_backorder_cost, - "holding_cost": self.check_holding_cost, - "fixed_cost": self.check_fixed_cost, - "variable_cost": self.check_variable_cost, - "s": self.check_s, - "S": self.check_S, - "n_days": self.check_n_days, - "warmup": self.check_warmup, + "demand_mean": self._check_demand_mean, + "lead_mean": self._check_lead_mean, + "backorder_cost": self._check_backorder_cost, + "holding_cost": self._check_holding_cost, + "fixed_cost": self._check_fixed_cost, + "variable_cost": self._check_variable_cost, + "s": self._check_s, + "S": self._check_S, + "n_days": self._check_n_days, + "warmup": self._check_warmup, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the (s,S) inventory simulation model. + + Args: + fixed_factors (dict, optional): Fixed factors of the simulation model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) # Check for simulatable factors - def check_demand_mean(self) -> None: + def _check_demand_mean(self) -> None: if self.factors["demand_mean"] <= 0: raise ValueError("demand_mean must be greater than 0.") - def check_lead_mean(self) -> None: + def _check_lead_mean(self) -> None: if self.factors["lead_mean"] <= 0: raise ValueError("lead_mean must be greater than 0.") - def check_backorder_cost(self) -> None: + def _check_backorder_cost(self) -> None: if self.factors["backorder_cost"] <= 0: raise ValueError("backorder_cost must be greater than 0.") - def check_holding_cost(self) -> None: + def _check_holding_cost(self) -> None: if self.factors["holding_cost"] <= 0: raise ValueError("holding_cost must be greater than 0.") - def check_fixed_cost(self) -> None: + def _check_fixed_cost(self) -> None: if self.factors["fixed_cost"] <= 0: raise ValueError("fixed_cost must be greater than 0.") - def check_variable_cost(self) -> None: + def _check_variable_cost(self) -> None: if self.factors["variable_cost"] <= 0: raise ValueError("variable_cost must be greater than 0.") - def check_s(self) -> None: + def _check_s(self) -> None: if self.factors["s"] <= 0: raise ValueError("s must be greater than 0.") - def check_S(self) -> None: # noqa: N802 + def _check_S(self) -> None: # noqa: N802 if self.factors["S"] <= 0: raise ValueError("S must be greater than 0.") - def check_n_days(self) -> None: + def _check_n_days(self) -> None: if self.factors["n_days"] < 1: raise ValueError("n_days must be greater than or equal to 1.") - def check_warmup(self) -> None: + def _check_warmup(self) -> None: if self.factors["warmup"] < 0: raise ValueError("warmup must be greater than or equal to 0.") + @override def check_simulatable_factors(self) -> bool: if self.factors["s"] >= self.factors["S"]: raise ValueError("s must be less than S.") return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "avg_backorder_costs": Average backorder costs per period. + - "avg_order_costs": Average order costs per period. + - "avg_holding_costs": Average holding costs per period. + - "on_time_rate": Fraction of demand met with stock on hand + in store. + - "order_rate": Fraction of periods in which an order was made. + - "stockout_rate": Fraction of periods with a stockout. + - "avg_stockout": Mean amount of product backordered given a + stockout occurred. + - "avg_order": Mean amount of product ordered given an + order occurred. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - rngs for model to use when simulating a replication - - Returns - ------- - responses : dict - performance measures of interest - - ``avg_backorder_costs`` - average backorder costs per period - ``avg_order_costs`` - average order costs per period - ``avg_holding_costs`` - average holding costs per period - ``on_time_rate`` - fraction of demand met with stock on hand in store - ``order_rate`` - fraction of periods an order was made - ``stockout_rate`` - fraction of periods a stockout occured - ``avg_stockout`` - mean amount of product backordered given a stockout occured - ``avg_order`` - mean amount of product ordered given an order occured - """ + demand_mean = self.factors["demand_mean"] + n_days = self.factors["n_days"] + warmup = self.factors["warmup"] + fac_s = self.factors["s"] + fac_S = self.factors["S"] # noqa: N806 + lead_mean = self.factors["lead_mean"] + fixed_cost = self.factors["fixed_cost"] + variable_cost = self.factors["variable_cost"] + holding_cost = self.factors["holding_cost"] + backorder_cost = self.factors["backorder_cost"] + # Designate random number generators. demand_rng = rng_list[0] lead_rng = rng_list[1] + + periods = n_days + warmup # Generate exponential random demands. - demands = [ - demand_rng.expovariate(1 / self.factors["demand_mean"]) - for _ in range(self.factors["n_days"] + self.factors["warmup"]) - ] + inv_demand_mean = 1 / demand_mean + demands = np.array( + [demand_rng.expovariate(inv_demand_mean) for _ in range(periods)] + ) # Initialize starting and ending inventories for each period. - start_inv = np.zeros(self.factors["n_days"] + self.factors["warmup"]) - start_inv[0] = self.factors["s"] # Start with s units at period 0. - end_inv = np.zeros(self.factors["n_days"] + self.factors["warmup"]) + start_inv = np.zeros(periods) + start_inv[0] = fac_s # Start with s units at period 0. + end_inv = np.zeros(periods) # Initialize other quantities to track: # - Amount of product to be received in each period. # - Inventory position each period. # - Amount of product ordered in each period. # - Amount of product outstanding in each period. - orders_received = np.zeros( - self.factors["n_days"] + self.factors["warmup"] - ) - inv_pos = np.zeros(self.factors["n_days"] + self.factors["warmup"]) - orders_placed = np.zeros( - self.factors["n_days"] + self.factors["warmup"] - ) - orders_outstanding = np.zeros( - self.factors["n_days"] + self.factors["warmup"] - ) + orders_received = np.zeros(periods) + inv_pos = np.zeros(periods) + orders_placed = np.zeros(periods) + orders_outstanding = np.zeros(periods) # Run simulation over time horizon. - for day in range(self.factors["n_days"] + self.factors["warmup"]): - # Calculate end-of-period inventory on hand and inventory position. + for day in range(periods): + next_day = day + 1 + + # Inventory position end_inv[day] = start_inv[day] - demands[day] inv_pos[day] = end_inv[day] + orders_outstanding[day] - # Place orders, keeping track of outstanding orders and when they will be received. - orders_placed[day] = np.max( - ( - (inv_pos[day] < self.factors["s"]) - * (self.factors["S"] - inv_pos[day]) - ), - 0, - ) - if orders_placed[day] > 0: - lead = lead_rng.poissonvariate(self.factors["lead_mean"]) - for future_day in range(day + 1, day + lead + 1): - if ( - future_day - < self.factors["n_days"] + self.factors["warmup"] - ): - orders_outstanding[future_day] = ( - orders_outstanding[future_day] + orders_placed[day] - ) - if ( - day + lead + 1 - < self.factors["n_days"] + self.factors["warmup"] - ): - orders_received[day + lead + 1] = ( - orders_received[day + lead + 1] + orders_placed[day] + + if inv_pos[day] < fac_s: + order_qty = fac_S - inv_pos[day] + orders_placed[day] = order_qty + + lead = lead_rng.poissonvariate(lead_mean) + delivery_day = next_day + lead + + if delivery_day < periods: + orders_received[delivery_day] += order_qty + + # Track future outstanding orders + if next_day < periods: + orders_outstanding[next_day : min(delivery_day, periods)] += ( + order_qty ) - # Calculate starting inventory for next period. - if day < self.factors["n_days"] + self.factors["warmup"] - 1: - start_inv[day + 1] = end_inv[day] + orders_received[day + 1] + + if next_day < periods: + start_inv[next_day] = end_inv[day] + orders_received[next_day] + # Calculate responses from simulation data. - order_rate = np.mean(orders_placed[self.factors["warmup"] :] > 0) - stockout_rate = np.mean(end_inv[self.factors["warmup"] :] < 0) - avg_order_costs = np.mean( - self.factors["fixed_cost"] - * (orders_placed[self.factors["warmup"] :] > 0) - + self.factors["variable_cost"] - * orders_placed[self.factors["warmup"] :] - ) + orders_post_warmup = orders_placed[warmup:] + pos_orders_post_warmup_mask = orders_post_warmup > 0 + inv_post_warmup = end_inv[warmup:] + neg_inv_post_warmup_mask = inv_post_warmup < 0 + pos_inv_post_warmup_mask = inv_post_warmup > 0 + + order_rate = np.mean(pos_orders_post_warmup_mask) + stockout_rate = np.mean(neg_inv_post_warmup_mask) + + fixed_costs = fixed_cost * pos_orders_post_warmup_mask + variable_costs = variable_cost * orders_post_warmup + avg_order_costs = np.mean(fixed_costs + variable_costs) + avg_holding_costs = np.mean( - self.factors["holding_cost"] - * end_inv[self.factors["warmup"] :] - * [end_inv[self.factors["warmup"] :] > 0] + holding_cost * inv_post_warmup * pos_inv_post_warmup_mask ) - on_time_rate = 1 - np.sum( - np.min( - np.vstack( - ( - demands[self.factors["warmup"] :], - demands[self.factors["warmup"] :] - - start_inv[self.factors["warmup"] :], - ) - ), - axis=0, - ) - * ( - ( - demands[self.factors["warmup"] :] - - start_inv[self.factors["warmup"] :] - ) - > 0 - ) - ) / np.sum(demands[self.factors["warmup"] :]) + demands_post_warmup = demands[warmup:] + demand_start_inv_diff = demands_post_warmup - start_inv[warmup:] + + shortage = np.minimum(demands_post_warmup, demand_start_inv_diff) + shortage[demand_start_inv_diff <= 0] = 0 + on_time_rate = 1 - shortage.sum() / np.sum(demands_post_warmup) + avg_backorder_costs = ( - self.factors["backorder_cost"] - * (1 - on_time_rate) - * np.sum(demands[self.factors["warmup"] :]) - / float(self.factors["n_days"]) + backorder_cost * (1 - on_time_rate) * np.sum(demands_post_warmup) / n_days ) - if np.array(np.where(end_inv[self.factors["warmup"] :] < 0)).size == 0: + # Calculate average stockout costs. + neg_inv_post_warmup_mask = np.where(neg_inv_post_warmup_mask) + if len(neg_inv_post_warmup_mask[0]) == 0: avg_stockout = 0 else: - avg_stockout = -np.mean( - end_inv[self.factors["warmup"] :][ - np.where(end_inv[self.factors["warmup"] :] < 0) - ] - ) - if ( - np.array(np.where(orders_placed[self.factors["warmup"] :] > 0)).size - == 0 - ): + avg_stockout = -np.mean(inv_post_warmup[neg_inv_post_warmup_mask]) + # Calculate average backorder costs. + pos_orders_placed_post_warmup = np.where(pos_orders_post_warmup_mask) + if len(pos_orders_placed_post_warmup[0]) == 0: avg_order = 0 else: - avg_order = np.mean( - orders_placed[self.factors["warmup"] :][ - np.where(orders_placed[self.factors["warmup"] :] > 0) - ] - ) + avg_order = np.mean(orders_post_warmup[pos_orders_placed_post_warmup]) # Compose responses and gradients. responses = { "avg_backorder_costs": avg_backorder_costs, @@ -367,129 +311,78 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: "avg_order": avg_order, } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Minimize the expected total cost for (s, S) inventory system. -""" +class SSContMinCost(Problem): + """Class to make (s,S) inventory simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "SSCONT-1" -class SSContMinCost(Problem): - """ - Class to make (s,S) inventory simulation-optimization problems. - - Attributes - ---------- - name : str - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : str - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : str - description of variable types: - "discrete", "continuous", "mixed" - lower_bounds : tuple - lower bound for each decision variable - upper_bounds : tuple - upper bound for each decision variable - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : base.Model - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name of problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Min Total Cost for (s, S) Inventory" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (-1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> float | None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> tuple | None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {"demand_mean": 100.0, "lead_mean": 6.0} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"s", "S"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution from which solvers start", @@ -505,23 +398,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 2 - @property - def lower_bounds(self) -> tuple: - return (0,) * self.dim + @classproperty + @override + def lower_bounds(cls) -> tuple: + return (0,) * cls.dim - @property - def upper_bounds(self) -> tuple: - return (np.inf,) * self.dim + @classproperty + @override + def upper_bounds(cls) -> tuple: + return (np.inf,) * cls.dim def __init__( self, @@ -529,6 +426,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the (s,S) inventory simulation-optimization problem. + + Args: + name (str, optional): name of problem. Defaults to "SSCONT-1". + fixed_factors (dict, optional): fixed factors of the simulation model. + Defaults to None. + model_fixed_factors (dict, optional): fixed factors for the simulation + model. Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -537,164 +443,47 @@ def __init__( model=SSCont, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dict - dictionary with factor keys and associated values - """ - factor_dict = {"s": vector[0], "S": vector[0] + vector[1]} - return factor_dict + return {"s": vector[0], "S": vector[0] + vector[1]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dict - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = (factor_dict["s"], factor_dict["S"] - factor_dict["s"]) - return vector + return (factor_dict["s"], factor_dict["S"] - factor_dict["s"]) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = ( + return ( response_dict["avg_backorder_costs"] + response_dict["avg_order_costs"] + response_dict["avg_holding_costs"], ) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0,),) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ return x[0] >= 0 and x[1] >= 0 + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ - - # x = (rand_sol_rng.expovariate(1/300), rand_sol_rng.expovariate(1/300)) - # x = tuple(sorted([rand_sol_rng.lognormalvariate(600,1),rand_sol_rng.lognormalvariate(600,1)], key = float)) + # x = (rand_sol_rng.expovariate(1 / 300), rand_sol_rng.expovariate(1 / 300)) + # x = tuple( + # sorted( + # [ + # rand_sol_rng.lognormalvariate(600, 1), + # rand_sol_rng.lognormalvariate(600, 1), + # ], + # key=float, + # ) + # ) mu_d = self.model_default_factors["demand_mean"] mu_l = self.model_default_factors["lead_mean"] - x = ( + return ( rand_sol_rng.lognormalvariate( mu_d * mu_l / 3, mu_d * mu_l + 2 * sqrt(2 * mu_d**2 * mu_l) ), @@ -702,8 +491,8 @@ def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: mu_d * mu_l / 3, mu_d * mu_l + 2 * sqrt(2 * mu_d**2 * mu_l) ), ) - return x -# If T is lead time and X is a single demand, then var(sum_{i=1}^T X_i) = E(T) var(X) + (E X))^2 var T +# If T is lead time and X is a single demand, then: +# var(sum_{i=1}^T X_i) = E(T) var(X) + (E X))^2 var T # var(S) = E var(S|T) + var E(S|T) diff --git a/simopt/models/tableallocation.py b/simopt/models/tableallocation.py index deb797622..f28a72257 100644 --- a/simopt/models/tableallocation.py +++ b/simopt/models/tableallocation.py @@ -1,81 +1,45 @@ -""" -Summary -------- -Simulate multiple periods of arrival and seating at a restaurant. -A detailed description of the model/problem can be found -`here `__. -""" +"""Simulate multiple periods of arrival and seating at a restaurant.""" from __future__ import annotations +import bisect +import itertools +from collections.abc import Sequence from typing import Callable import numpy as np -from mrg32k3a.mrg32k3a import MRG32k3a +from mrg32k3a.mrg32k3a import MRG32k3a from simopt.base import ConstraintType, Model, Problem, VariableType +from simopt.utils import classproperty, override class TableAllocation(Model): - """ + """Table Allocation Model. + A model that simulates a table capacity allocation problem at a restaurant with a homogenous Poisson arrvial process and exponential service times. Returns expected maximum revenue. - - Attributes - ---------- - name : str - name of model - n_rngs : int - number of random-number generators used to run a simulation replication - n_responses : int - number of responses (performance measures) - factors : dict - changeable factors of the simulation model - specifications : dict - details of each factor (for GUI, data validation, and defaults) - check_factor_list : dict - switch case for checking factor simulatability - - Parameters - ---------- - fixed_factors : dict - fixed_factors of the simulation model - - ``n_hours`` - Number of hours to simulate (`int`) - ``capacity`` - Maximum total capacity (`int`) - ``table_cap`` - Capacity of each type of table (`int`) - ``lambda`` - Average number of arrivals per hour (`flt`) - ``service_time_means`` - Mean service time in minutes (`flt`) - ``table_revenue`` - Per table revenue earned (`flt`) - ``num_tables`` - Number of tables of each capacity (`int`) - - See also - -------- - base.Model """ - @property - def name(self) -> str: - return "TABLEALLOCATION" + @classproperty + @override + def class_name(cls) -> str: + return "Restaurant Table Allocation" - @property - def n_rngs(self) -> int: + @classproperty + @override + def n_rngs(cls) -> int: return 3 - @property - def n_responses(self) -> int: + @classproperty + @override + def n_responses(cls) -> int: return 2 - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "n_hours": { "description": "number of hours to simulate", @@ -115,99 +79,130 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "n_hours": self.check_n_hours, - "capacity": self.check_capacity, - "table_cap": self.check_table_cap, - "lambda": self.check_lambda, - "service_time_means": self.check_service_time_means, - "table_revenue": self.check_table_revenue, - "num_tables": self.check_num_tables, + "n_hours": self._check_n_hours, + "capacity": self._check_capacity, + "table_cap": self._check_table_cap, + "lambda": self._check_lambda, + "service_time_means": self._check_service_time_means, + "table_revenue": self._check_table_revenue, + "num_tables": self._check_num_tables, } def __init__(self, fixed_factors: dict | None = None) -> None: + """Initialize the Table Allocation Model. + + Args: + fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(fixed_factors) # Check for simulatable factors - def check_n_hours(self) -> None: + def _check_n_hours(self) -> None: if self.factors["n_hours"] <= 0: raise ValueError("n_hours must be greater than 0.") - def check_capacity(self) -> None: + def _check_capacity(self) -> None: if self.factors["capacity"] <= 0: raise ValueError("capacity must be greater than 0.") - def check_table_cap(self) -> None: + def _check_table_cap(self) -> None: if self.factors["table_cap"] <= [0, 0, 0, 0]: - raise ValueError( - "All elements in table_cap must be greater than 0." - ) + raise ValueError("All elements in table_cap must be greater than 0.") - def check_lambda(self) -> bool: + def _check_lambda(self) -> bool: return self.factors["lambda"] >= [0] * max(self.factors["table_cap"]) - def check_service_time_means(self) -> bool: - return self.factors["service_time_means"] > [0] * max( - self.factors["table_cap"] - ) + def _check_service_time_means(self) -> bool: + return self.factors["service_time_means"] > [0] * max(self.factors["table_cap"]) - def check_table_revenue(self) -> bool: - return self.factors["table_revenue"] >= [0] * max( - self.factors["table_cap"] - ) + def _check_table_revenue(self) -> bool: + return self.factors["table_revenue"] >= [0] * max(self.factors["table_cap"]) - def check_num_tables(self) -> None: + def _check_num_tables(self) -> None: if self.factors["num_tables"] < [0, 0, 0, 0]: raise ValueError( "Each element in num_tables must be greater than or equal to 0." ) + @override def check_simulatable_factors(self) -> bool: if len(self.factors["num_tables"]) != len(self.factors["table_cap"]): raise ValueError( "The length of num_tables must be equal to the length of table_cap." ) - elif len(self.factors["lambda"]) != max(self.factors["table_cap"]): + if len(self.factors["lambda"]) != max(self.factors["table_cap"]): raise ValueError( "The length of lamda must be equal to the maximum value in table_cap." ) - elif len(self.factors["lambda"]) != len( - self.factors["service_time_means"] - ): + if len(self.factors["lambda"]) != len(self.factors["service_time_means"]): raise ValueError( - "The length of lambda must be equal to the length of service_time_means." + "The length of lambda must be equal to the length of " + "service_time_means." ) - elif len(self.factors["service_time_means"]) != len( + if len(self.factors["service_time_means"]) != len( self.factors["table_revenue"] ): raise ValueError( - "The length of service_time_means must be equal to the length of table_revenue." + "The length of service_time_means must be equal to the length of " + "table_revenue." ) - else: - return True + return True def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: + """Simulate a single replication for the current model factors. + + Args: + rng_list (list[MRG32k3a]): Random number generators used to simulate + the replication. + + Returns: + tuple[dict, dict]: A tuple containing: + - responses (dict): Performance measures of interest, including: + - "total_revenue": Total revenue earned over the simulation period. + - "service_rate": Fraction of customer arrivals that are seated. + - gradients (dict): A dictionary of gradient estimates for + each response. """ - Simulate a single replication for the current model factors. - - Arguments - --------- - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - rngs for model to use when simulating a replication - Returns - ------- - responses : dict - performance measures of interest - - ``total_revenue`` - Total revenue earned over the simulation period. - ``service_rate`` - Fraction of customer arrivals that are seated. - - """ + def fast_weighted_choice( + population: Sequence[int], weights: Sequence[float], rng: MRG32k3a + ) -> int: + """Select a single element from a population based on weights. + + Designed to be faster than `random.choices()` when only one element + is needed. + + Args: + population (Sequence[int]): The population to select from. + weights (Sequence[float]): The weights for each element in the + population. + rng (MRG32k3a): The random number generator to use for selection. + + Returns: + int: The selected element from the population. + """ + # Calculate cumulative weights + cum_weights = list(itertools.accumulate(weights)) + # Generate a value somewhere between 0 and the sum of weights + x = rng.random() * cum_weights[-1] + # Find the index of the first cumulative weight that is >= x + # Return the corresponding element from the population + return population[bisect.bisect(cum_weights, x)] + + num_tables = self.factors["num_tables"] + # TODO: figure out how floats are getting into the num_tables list + num_tables = [int(n) for n in num_tables] + n_hours = self.factors["n_hours"] + f_lambda = self.factors["lambda"] + table_cap = self.factors["table_cap"] + max_table_cap = max(table_cap) + service_time_means = self.factors["service_time_means"] + table_revenue = self.factors["table_revenue"] # Designate separate random number generators. arrival_rng = rng_list[0] group_size_rng = rng_list[1] @@ -216,179 +211,134 @@ def replicate(self, rng_list: list[MRG32k3a]) -> tuple[dict, dict]: total_rev = 0 # Track table availability. # (i,j) is the time that jth table of size i becomes available. - table_avail = np.zeros((4, max(self.factors["num_tables"]))) + table_avail = np.zeros((4, max(num_tables))) # Generate total number of arrivals in the period - n_arrivals = arrival_rng.poissonvariate( - round(self.factors["n_hours"] * sum(self.factors["lambda"])) - ) + n_arrivals = arrival_rng.poissonvariate(round(n_hours * sum(f_lambda))) # Generate arrival times in minutes arrival_times = 60 * np.sort( - [ - arrival_rng.uniform(0, self.factors["n_hours"]) - for _ in range(n_arrivals) - ] + [arrival_rng.uniform(0, n_hours) for _ in range(n_arrivals)] ) # Track seating rate found = np.zeros(n_arrivals) + # Precompute options for group sizes. + group_size_options = range(1, max_table_cap + 1) # Pass through all arrivals of groups to the restaurants. for n in range(n_arrivals): # Determine group size. - group_size = group_size_rng.choices( - population=range(1, max(self.factors["table_cap"]) + 1), - weights=self.factors["lambda"], - )[0] + group_size = fast_weighted_choice( + population=group_size_options, + weights=f_lambda, + rng=group_size_rng, + ) + # Find smallest table size to start search. table_size_idx = 0 - while self.factors["table_cap"][table_size_idx] < group_size: - table_size_idx = table_size_idx + 1 - # Initialize k and j to make sure they're not unbound - k = 0 - j = 0 + while table_cap[table_size_idx] < group_size: + table_size_idx += 1 + # Find smallest available table. - for k in range(table_size_idx, len(self.factors["num_tables"])): - for j in range(self.factors["num_tables"][k]): - # Check if table is currently available. - if table_avail[k, j] < arrival_times[n]: - found[n] = 1 - break - if found[n] == 1: - break - if found[n] == 1: - # Sample service time. - service_time = service_rng.expovariate( - lambd=1 / self.factors["service_time_means"][group_size - 1] - ) - # Update table availability. - table_avail[k, j] = table_avail[k, j] + service_time - # Update revenue. - total_rev = ( - total_rev + self.factors["table_revenue"][group_size - 1] - ) + def find_table(table_size_idx: int, n: int) -> tuple[int, int] | None: + for k in range(table_size_idx, len(num_tables)): + for j in range(num_tables[k]): + # Check if table is currently available. + if table_avail[k, j] < arrival_times[n]: + return k, j + # Return None if no table is available. + return None + + result = find_table(table_size_idx, n) + # If no table is available, move on to next group. + if result is None: + continue + k, j = result + # Mark group as seated. + found[n] = 1 + # Sample service time. + service_time = service_rng.expovariate( + lambd=1 / service_time_means[group_size - 1] + ) + # Update table availability. + table_avail[k, j] += service_time + # Update revenue. + total_rev += table_revenue[group_size - 1] # Calculate responses from simulation data. responses = { "total_revenue": total_rev, "service_rate": sum(found) / len(found), } gradients = { - response_key: { - factor_key: np.nan for factor_key in self.specifications - } + response_key: dict.fromkeys(self.specifications, np.nan) for response_key in responses } return responses, gradients -""" -Summary -------- -Maximize the total expected revenue for a restaurant operation. -""" +class TableAllocationMaxRev(Problem): + """Class to make table allocation simulation-optimization problems.""" + @classproperty + @override + def class_name_abbr(cls) -> str: + return "TABLEALLOCATION-1" -class TableAllocationMaxRev(Problem): - """ - Class to make table allocation simulation-optimization problems. - - Attributes - ---------- - name : str - name of problem - dim : int - number of decision variables - n_objectives : int - number of objectives - n_stochastic_constraints : int - number of stochastic constraints - minmax : tuple of int (+/- 1) - indicator of maximization (+1) or minimization (-1) for each objective - constraint_type : str - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : str - description of variable types: - "discrete", "continuous", "mixed" - gradient_available : bool - indicates if gradient of objective function is available - optimal_value : tuple - optimal objective function value - optimal_solution : tuple - optimal solution - model : base.Model - associated simulation model that generates replications - model_default_factors : dict - default values for overriding model-level default factors - model_fixed_factors : dict - combination of overriden model-level factors and defaults - model_decision_factors : set of str - set of keys for factors that are decision variables - rng_list : [list] [mrg32k3a.mrg32k3a.MRG32k3a] - list of RNGs used to generate a random initial solution - or a random problem instance - factors : dict - changeable factors of the problem - initial_solution : tuple - default initial solution from which solvers start - budget : int > 0 - max number of replications (fn evals) for a solver to take - specifications : dict - details of each factor (for GUI, data validation, and defaults) - - Arguments - --------- - name : str - user-specified name of problem - fixed_factors : dict - dictionary of user-specified problem factors - model_fixed factors : dict - subset of user-specified non-decision factors to pass through to the model - - See also - -------- - base.Problem - """ + @classproperty + @override + def class_name(cls) -> str: + return "Max Revenue for Restaurant Table Allocation" - @property - def n_objectives(self) -> int: + @classproperty + @override + def n_objectives(cls) -> int: return 1 - @property - def n_stochastic_constraints(self) -> int: + @classproperty + @override + def n_stochastic_constraints(cls) -> int: return 0 - @property - def minmax(self) -> tuple[int]: + @classproperty + @override + def minmax(cls) -> tuple[int]: return (1,) - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.DETERMINISTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.DISCRETE - @property - def gradient_available(self) -> bool: + @classproperty + @override + def gradient_available(cls) -> bool: return False - @property - def optimal_value(self) -> float | None: + @classproperty + @override + def optimal_value(cls) -> None: return None - @property - def optimal_solution(self) -> tuple | None: + @classproperty + @override + def optimal_solution(cls) -> None: return None - @property - def model_default_factors(self) -> dict: + @classproperty + @override + def model_default_factors(cls) -> dict: return {} - @property - def model_decision_factors(self) -> set[str]: + @classproperty + @override + def model_decision_factors(cls) -> set[str]: return {"num_tables"} - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "initial_solution": { "description": "initial solution", @@ -404,23 +354,27 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "initial_solution": self.check_initial_solution, "budget": self.check_budget, } - @property - def dim(self) -> int: + @classproperty + @override + def dim(cls) -> int: return 4 - @property - def lower_bounds(self) -> tuple: - return (0,) * self.dim + @classproperty + @override + def lower_bounds(cls) -> tuple: + return (0,) * cls.dim - @property - def upper_bounds(self) -> tuple: - return (np.inf,) * self.dim + @classproperty + @override + def upper_bounds(cls) -> tuple: + return (np.inf,) * cls.dim def __init__( self, @@ -428,6 +382,15 @@ def __init__( fixed_factors: dict | None = None, model_fixed_factors: dict | None = None, ) -> None: + """Initialize the Table Allocation Problem. + + Args: + name (str, optional): Name of the problem. Defaults to "TABLEALLOCATION-1". + fixed_factors (dict, optional): Fixed factors for the problem. + Defaults to None. + model_fixed_factors (dict, optional): Fixed factors for the model. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__( name=name, @@ -436,159 +399,35 @@ def __init__( model=TableAllocation, ) + @override def vector_to_factor_dict(self, vector: tuple) -> dict: - """ - Convert a vector of variables to a dictionary with factor keys - - Arguments - --------- - vector : tuple - vector of values associated with decision variables - - Returns - ------- - factor_dict : dict - dictionary with factor keys and associated values - """ - factor_dict = {"num_tables": vector[:]} - return factor_dict + return {"num_tables": vector[:]} + @override def factor_dict_to_vector(self, factor_dict: dict) -> tuple: - """ - Convert a dictionary with factor keys to a vector - of variables. - - Arguments - --------- - factor_dict : dict - dictionary with factor keys and associated values - - Returns - ------- - vector : tuple - vector of values associated with decision variables - """ - vector = (factor_dict["num_tables"],) - return vector + return (factor_dict["num_tables"],) + @override def response_dict_to_objectives(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of objectives. - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - objectives : tuple - vector of objectives - """ - objectives = (response_dict["total_revenue"],) - return objectives - - def response_dict_to_stoch_constraints(self, response_dict: dict) -> tuple: - """ - Convert a dictionary with response keys to a vector - of left-hand sides of stochastic constraints: E[Y] <= 0 - - Arguments - --------- - response_dict : dict - dictionary with response keys and associated values - - Returns - ------- - stoch_constraints : tuple - vector of LHSs of stochastic constraint - """ - stoch_constraints = () - return stoch_constraints + return (response_dict["total_revenue"],) - def deterministic_objectives_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of objectives for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_objectives : tuple - vector of deterministic components of objectives - det_objectives_gradients : tuple - vector of gradients of deterministic components of objectives - """ + @override + def deterministic_objectives_and_gradients(self, _x: tuple) -> tuple[tuple, tuple]: det_objectives = (0,) det_objectives_gradients = ((0,) * self.dim,) return det_objectives, det_objectives_gradients - def deterministic_stochastic_constraints_and_gradients( - self, x: tuple - ) -> tuple[tuple, tuple]: - """ - Compute deterministic components of stochastic constraints - for a solution `x`. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - det_stoch_constraints : tuple - vector of deterministic components of stochastic constraints - det_stoch_constraints_gradients : tuple - vector of gradients of deterministic components of - stochastic constraints - """ - det_stoch_constraints = () - det_stoch_constraints_gradients = () - return det_stoch_constraints, det_stoch_constraints_gradients - + @override def check_deterministic_constraints(self, x: tuple) -> bool: - """ - Check if a solution `x` satisfies the problem's deterministic - constraints. - - Arguments - --------- - x : tuple - vector of decision variables - - Returns - ------- - satisfies : bool - indicates if solution `x` satisfies the deterministic constraints. - """ return ( np.sum(np.multiply(self.model_fixed_factors["table_cap"], x)) <= self.model_fixed_factors["capacity"] ) + @override def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: - """ - Generate a random solution for starting or restarting solvers. - - Arguments - --------- - rand_sol_rng : mrg32k3a.mrg32k3a.MRG32k3a - random-number generator used to sample a new random solution - - Returns - ------- - x : tuple - vector of decision variables - """ # Add new tables of random size to the restaurant until the capacity is reached. - # TO DO: Replace this with call to integer_random_vector_from_simplex(). + # TODO: Replace this with call to integer_random_vector_from_simplex(). # The different-weight case is not yet implemented. allocated = 0 num_tables = [0, 0, 0, 0] @@ -599,10 +438,8 @@ def get_random_solution(self, rand_sol_rng: MRG32k3a) -> tuple: if self.model_fixed_factors["table_cap"][table] <= ( self.model_fixed_factors["capacity"] - allocated ): - num_tables[table] = num_tables[table] + 1 - allocated = ( - allocated + self.model_fixed_factors["table_cap"][table] - ) + num_tables[table] += 1 + allocated += self.model_fixed_factors["table_cap"][table] elif self.model_fixed_factors["table_cap"][0] > ( self.model_fixed_factors["capacity"] - allocated ): diff --git a/simopt/solvers/adam.py b/simopt/solvers/adam.py index 7437dcdcf..384e355dc 100644 --- a/simopt/solvers/adam.py +++ b/simopt/solvers/adam.py @@ -1,10 +1,7 @@ -""" -Summary -------- -ADAM +"""First-order gradient-based optimization of stochastic objective functions. + An algorithm for first-order gradient-based optimization of stochastic objective functions, based on adaptive estimates of lower-order moments. -A detailed description of the solver can be found `here `__. """ from __future__ import annotations @@ -21,65 +18,39 @@ Solver, VariableType, ) +from simopt.utils import classproperty, override class ADAM(Solver): - """ + """First-order gradient-based optimization of stochastic objective functions. + An algorithm for first-order gradient-based optimization of stochastic objective functions, based on adaptive estimates of lower-order moments. - - Attributes - ---------- - name : string - name of solver - objective_type : string - description of objective types: - "single" or "multi" - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - gradient_needed : bool - indicates if gradient of objective function is needed - factors : dict - changeable factors (i.e., parameters) of the solver - specifications : dict - details of each factor (for GUI, data validation, and defaults) - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used for the solver's internal purposes - - Arguments - --------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver - - See also - -------- - base.Solver """ - @property - def objective_type(self) -> ObjectiveType: + @classproperty + @override + def objective_type(cls) -> ObjectiveType: return ObjectiveType.SINGLE - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_needed(self) -> bool: + @classproperty + @override + def gradient_needed(cls) -> bool: return False - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "crn_across_solns": { "description": "use CRN across solutions?", @@ -92,7 +63,9 @@ def specifications(self) -> dict[str, dict]: "default": 30, }, "beta_1": { - "description": "exponential decay of the rate for the first moment estimates", + "description": ( + "exponential decay of the rate for the first moment estimates" + ), "datatype": float, "default": 0.9, }, @@ -119,67 +92,58 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "crn_across_solns": self.check_crn_across_solns, - "r": self.check_r, - "beta_1": self.check_beta_1, - "beta_2": self.check_beta_2, - "alpha": self.check_alpha, - "epsilon": self.check_epsilon, - "sensitivity": self.check_sensitivity, + "r": self._check_r, + "beta_1": self._check_beta_1, + "beta_2": self._check_beta_2, + "alpha": self._check_alpha, + "epsilon": self._check_epsilon, + "sensitivity": self._check_sensitivity, } - def __init__( - self, name: str = "ADAM", fixed_factors: dict | None = None - ) -> None: + def __init__(self, name: str = "ADAM", fixed_factors: dict | None = None) -> None: + """Initialize the ADAM solver. + + Args: + name (str, optional): The name of the solver. Defaults to "ADAM". + fixed_factors (dict, optional): A dictionary of fixed factors. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(name, fixed_factors) - def check_r(self) -> None: + def _check_r(self) -> None: if self.factors["r"] <= 0: raise ValueError( - "The number of replications taken at each solution must be greater than 0." + "The number of replications taken at each solution must be greater " + "than 0." ) - def check_beta_1(self) -> None: + def _check_beta_1(self) -> None: if self.factors["beta_1"] <= 0 or self.factors["beta_1"] >= 1: raise ValueError("Beta 1 must be between 0 and 1.") - def check_beta_2(self) -> None: + def _check_beta_2(self) -> None: if self.factors["beta_2"] > 0 and self.factors["beta_2"] >= 1: raise ValueError("Beta 2 must be less than 1.") - def check_alpha(self) -> None: + def _check_alpha(self) -> None: if self.factors["alpha"] <= 0: raise ValueError("Alpha must be greater than 0.") - def check_epsilon(self) -> None: + def _check_epsilon(self) -> None: if self.factors["epsilon"] <= 0: raise ValueError("Epsilon must be greater than 0.") - def check_sensitivity(self) -> None: + def _check_sensitivity(self) -> None: if self.factors["sensitivity"] <= 0: raise ValueError("Sensitivity must be greater than 0.") + @override def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: - """ - Run a single macroreplication of a solver on a problem. - - Arguments - --------- - problem : Problem object - simulation-optimization problem to solve - crn_across_solns : bool - indicates if CRN are used when simulating different solutions - - Returns - ------- - recommended_solns : list of Solution objects - list of solutions recommended throughout the budget - intermediate_budgets : list of ints - list of intermediate budgets when recommended solutions changes - """ recommended_solns = [] intermediate_budgets = [] expended_budget = 0 @@ -205,160 +169,140 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: expended_budget += r best_solution = new_solution - # Initialize the first moment vector, the second moment vector, and the timestep. + # Initialize the first moment vector, the second moment vector, + # and the timestep. m = np.zeros(problem.dim) v = np.zeros(problem.dim) t = 0 while expended_budget < problem.factors["budget"]: # Update timestep. - t = t + 1 - new_x = new_solution.x + t += 1 # Check variable bounds. forward = np.isclose( - new_x, lower_bound, atol=self.factors["sensitivity"] + new_solution.x, lower_bound, atol=self.factors["sensitivity"] ).astype(int) backward = np.isclose( - new_x, upper_bound, atol=self.factors["sensitivity"] + new_solution.x, upper_bound, atol=self.factors["sensitivity"] ).astype(int) - # BdsCheck: 1 stands for forward, -1 stands for backward, 0 means central diff. + # 1 stands for forward, -1 stands for backward, 0 means central diff. bounds_check = np.subtract(forward, backward) if problem.gradient_available: # Use IPA gradient if available. - grad = ( - -1 - * problem.minmax[0] - * new_solution.objectives_gradients_mean[0] - ) + grad = -problem.minmax[0] * new_solution.objectives_gradients_mean[0] else: - # Use finite difference to estimate gradient if IPA gradient is not available. - grad = self.finite_diff(new_solution, bounds_check, problem) + # Use finite difference to estimate gradient if IPA gradient is + # not available. + grad = self._finite_diff(new_solution, bounds_check, problem) expended_budget += ( - 2 * problem.dim - np.sum(bounds_check != 0) + 2 * problem.dim - np.count_nonzero(bounds_check) ) * r - # Convert new_x from tuple to list. - new_x = list(new_x) - # Loop through all the dimensions. - for i in range(problem.dim): - # Update biased first moment estimate. - m[i] = beta_1 * m[i] + (1 - beta_1) * grad[i] - # Update biased second raw moment estimate. - v[i] = beta_2 * v[i] + (1 - beta_2) * grad[i] ** 2 - # Compute bias-corrected first moment estimate. - mhat = m[i] / (1 - beta_1**t) - # Compute bias-corrected second raw moment estimate. - vhat = v[i] / (1 - beta_2**t) - # Update new_x and adjust it for box constraints. - new_x[i] = min( - max( - new_x[i] - alpha * mhat / (np.sqrt(vhat) + epsilon), - lower_bound[i], - ), - upper_bound[i], - ) + # Update biased first moment estimate. + m = beta_1 * m + (1 - beta_1) * grad + # Update biased second raw moment estimate. + v = beta_2 * v + (1 - beta_2) * grad**2 + # Compute bias-corrected first moment estimate. + mhat = m / (1 - beta_1**t) + # Compute bias-corrected second raw moment estimate. + vhat = v / (1 - beta_2**t) + # Update new_x (vectorized) and apply box constraints + new_x = new_solution.x - alpha * mhat / (np.sqrt(vhat) + epsilon) + new_x = np.clip(new_x, lower_bound, upper_bound) # Create new solution based on new x new_solution = self.create_new_solution(tuple(new_x), problem) # Use r simulated observations to estimate the objective value. problem.simulate(new_solution, r) expended_budget += r - if ( - problem.minmax[0] * new_solution.objectives_mean - > problem.minmax[0] * best_solution.objectives_mean + if (new_solution.objectives_mean > best_solution.objectives_mean) ^ ( + problem.minmax[0] < 0 ): best_solution = new_solution recommended_solns.append(new_solution) intermediate_budgets.append(expended_budget) - # Loop through the budgets and convert any numpy int32s to Python ints. - for i in range(len(intermediate_budgets)): - intermediate_budgets[i] = int(intermediate_budgets[i]) return recommended_solns, intermediate_budgets - # Finite difference for approximating gradients. - def finite_diff( - self, new_solution: Solution, bounds_check: np.ndarray, problem: Problem + def _finite_diff( + self, + new_solution: Solution, + bounds_check: np.ndarray, + problem: Problem, ) -> np.ndarray: + """Compute the finite difference approximation of the gradient for a solution. + + Args: + new_solution (Solution): The current solution to perturb. + bounds_check (np.ndarray): Array indicating which perturbation method to + use per dimension. + problem (Problem): The problem instance providing bounds and function + evaluations. + + Returns: + np.ndarray: The approximated gradient of the function at the given solution. + """ r = self.factors["r"] alpha = self.factors["alpha"] lower_bound = problem.lower_bounds upper_bound = problem.upper_bounds - fn = -1 * problem.minmax[0] * new_solution.objectives_mean - new_x = new_solution.x - # Store values for each dimension. + fn = -problem.minmax[0] * new_solution.objectives_mean + new_x = np.array(new_solution.x, dtype=float) + function_diff = np.zeros((problem.dim, 3)) - grad = np.zeros(problem.dim) + # Compute step sizes + step_size = np.full(problem.dim, alpha) + # Compute step sizes for forward and backward differences + step_forward = np.minimum(step_size, upper_bound - new_x) + step_backward = np.minimum(step_size, new_x - lower_bound) + + # Create perturbed variables + x1 = np.repeat(new_x[:, np.newaxis], problem.dim, axis=1) + x2 = np.repeat(new_x[:, np.newaxis], problem.dim, axis=1) + + central_mask = bounds_check == 0 + forward_mask = bounds_check == 1 + backward_mask = bounds_check == -1 + + # Assign step sizes + function_diff[:, 2] = np.where( + central_mask, + np.minimum(step_forward, step_backward), + np.where(forward_mask, step_forward, step_backward), + ) + + # Apply step updates + np.fill_diagonal(x1, new_x + function_diff[:, 2]) + np.fill_diagonal(x2, new_x - function_diff[:, 2]) + x1[forward_mask, :] += function_diff[forward_mask, 2][:, np.newaxis] + x2[backward_mask, :] -= function_diff[backward_mask, 2][:, np.newaxis] + + # TODO: combine this with the version in ALOE. Test results might need + # regenerated since the ALOE algorithm only makes a subset of solutions. + + # Simulate perturbed solutions per dimension for i in range(problem.dim): - # Initialization. - x1 = list(new_x) - x2 = list(new_x) - # Forward stepsize. - steph1 = alpha - # Backward stepsize. - steph2 = alpha + x1_solution = self.create_new_solution(tuple(x1[:, i]), problem) + x2_solution = self.create_new_solution(tuple(x2[:, i]), problem) + problem.simulate_up_to([x1_solution, x2_solution], r) - # Check variable bounds. - if x1[i] + steph1 > upper_bound[i]: - steph1 = np.abs(upper_bound[i] - x1[i]) - if x2[i] - steph2 < lower_bound[i]: - steph2 = np.abs(x2[i] - lower_bound[i]) - - # Decide stepsize. - # Central diff. - if bounds_check[i] == 0: - function_diff[i, 2] = min(steph1, steph2) - x1[i] = x1[i] + function_diff[i, 2] - x2[i] = x2[i] - function_diff[i, 2] - # Forward diff. - elif bounds_check[i] == 1: - function_diff[i, 2] = steph1 - x1[i] = x1[i] + function_diff[i, 2] - # Backward diff. - else: - function_diff[i, 2] = steph2 - x2[i] = x2[i] - function_diff[i, 2] - x1_solution = self.create_new_solution(tuple(x1), problem) - if bounds_check[i] != -1: - problem.simulate_up_to([x1_solution], r) - fn1 = -1 * problem.minmax[0] * x1_solution.objectives_mean - # First column is f(x+h,y). - function_diff[i, 0] = ( - fn1[0] if isinstance(fn1, np.ndarray) else fn1 - ) - x2_solution = self.create_new_solution(tuple(x2), problem) - if bounds_check[i] != 1: - problem.simulate_up_to([x2_solution], r) - fn2 = -1 * problem.minmax[0] * x2_solution.objectives_mean - # Second column is f(x-h,y). - function_diff[i, 1] = ( - fn2[0] if isinstance(fn2, np.ndarray) else fn2 - ) - - # Calculate gradient. - fn_divisor = ( - function_diff[i, 2][0] - if isinstance(function_diff[i, 2], np.ndarray) - else function_diff[i, 2] - ) - if bounds_check[i] == 0: - fn_diff = fn1 - fn2 # type: ignore - fn_divisor = 2 * fn_divisor - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - elif bounds_check[i] == 1: - fn_diff = fn1 - fn # type: ignore - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - elif bounds_check[i] == -1: - fn_diff = fn - fn2 # type: ignore - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - return grad + fn1 = -problem.minmax[0] * x1_solution.objectives_mean + fn2 = -problem.minmax[0] * x2_solution.objectives_mean + + function_diff[i, 0] = fn1 + function_diff[i, 1] = fn2 + + # Compute gradient + fn_divisor = function_diff[:, 2].copy() # Extract step sizes + fn_divisor[central_mask] *= 2 # Double for central difference + + fn_diff = np.zeros(problem.dim) + if np.any(central_mask): + fn_diff[central_mask] = function_diff[:, 0] - function_diff[:, 1] + if np.any(forward_mask): + fn_diff[forward_mask] = function_diff[forward_mask, 0] - fn + if np.any(backward_mask): + fn_diff[backward_mask] = fn - function_diff[backward_mask, 1] + + return fn_diff / fn_divisor diff --git a/simopt/solvers/aloe.py b/simopt/solvers/aloe.py index 462f9cb8d..3e44cc8e6 100644 --- a/simopt/solvers/aloe.py +++ b/simopt/solvers/aloe.py @@ -1,11 +1,9 @@ -""" -Summary -------- -ALOE -The solver is a stochastic line search algorithm with the gradient estimate recomputed in each iteration, -whether or not a step is accepted. The algorithm includes the relaxation of the Armijo condition by -an additive constant. -A detailed description of the solver can be found `here `__. +"""Stochastic line search algorithm with gradient estimation. + +The solver is a stochastic line search algorithm with the gradient estimate recomputed +in each iteration, whether or not a step is accepted. The algorithm includes the +relaxation of the Armijo condition by an additive constant. A detailed description of +the solver can be found `here `__. """ from __future__ import annotations @@ -13,7 +11,6 @@ from typing import Callable import numpy as np -from numpy.linalg import norm from simopt.base import ( ConstraintType, @@ -23,64 +20,35 @@ Solver, VariableType, ) +from simopt.utils import classproperty, override class ALOE(Solver): - """ - Adaptive Line-search with Oracle Estimations - - Attributes - ---------- - name : string - name of solver - objective_type : string - description of objective types: - "single" or "multi" - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - gradient_needed : bool - indicates if gradient of objective function is needed - factors : dict - changeable factors (i.e., parameters) of the solver - specifications : dict - details of each factor (for GUI, data validation, and defaults) - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used for the solver's internal purposes - - Arguments - --------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver - - See also - -------- - base.Solver - """ + """Adaptive Line-search with Oracle Estimations.""" - @property - def objective_type(self) -> ObjectiveType: + @classproperty + @override + def objective_type(cls) -> ObjectiveType: return ObjectiveType.SINGLE - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_needed(self) -> bool: + @classproperty + @override + def gradient_needed(cls) -> bool: return False - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "crn_across_solns": { "description": "use CRN across solutions?", @@ -112,10 +80,12 @@ def specifications(self) -> dict[str, dict]: "datatype": int, "default": 1, }, + # In the paper, this value is estimated for every epoch but a value > 0 + # is justified in practice. "epsilon_f": { "description": "additive constant in the Armijo condition", "datatype": int, - "default": 1, # In the paper, this value is estimated for every epoch but a value > 0 is justified in practice. + "default": 1, }, "sensitivity": { "description": "shrinking scale for variable bounds", @@ -123,101 +93,93 @@ def specifications(self) -> dict[str, dict]: "default": 10 ** (-7), }, "lambda": { - "description": "magnifying factor for n_r inside the finite difference function", + "description": ( + "magnifying factor for n_r inside the finite difference function" + ), "datatype": int, "default": 2, }, } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "crn_across_solns": self.check_crn_across_solns, - "r": self.check_r, - "theta": self.check_theta, - "gamma": self.check_gamma, - "alpha_max": self.check_alpha_max, - "alpha_0": self.check_alpha_0, - "epsilon_f": self.check_epsilon_f, - "sensitivity": self.check_sensitivity, - "lambda": self.check_lambda, + "r": self._check_r, + "theta": self._check_theta, + "gamma": self._check_gamma, + "alpha_max": self._check_alpha_max, + "alpha_0": self._check_alpha_0, + "epsilon_f": self._check_epsilon_f, + "sensitivity": self._check_sensitivity, + "lambda": self._check_lambda, } - def __init__( - self, name: str = "ALOE", fixed_factors: dict | None = None - ) -> None: + def __init__(self, name: str = "ALOE", fixed_factors: dict | None = None) -> None: + """Initialize the ALOE solver. + + Args: + name (str): The name of the solver. + fixed_factors (dict, optional): Fixed factors for the solver. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(name, fixed_factors) - def check_r(self) -> None: + def _check_r(self) -> None: if self.factors["r"] <= 0: raise ValueError( - "The number of replications taken at each solution must be greater than 0." + "The number of replications taken at each solution must be greater " + "than 0." ) - def check_theta(self) -> None: + def _check_theta(self) -> None: if self.factors["theta"] <= 0 or self.factors["theta"] >= 1: raise ValueError("Theta must be between 0 and 1.") - def check_gamma(self) -> None: + def _check_gamma(self) -> None: if self.factors["gamma"] <= 0 or self.factors["gamma"] >= 1: raise ValueError("Gamma must be between 0 and 1.") - def check_alpha_max(self) -> None: + def _check_alpha_max(self) -> None: if self.factors["alpha_max"] <= 0: raise ValueError("The maximum step size must be greater than 0.") - def check_alpha_0(self) -> None: + def _check_alpha_0(self) -> None: if self.factors["alpha_0"] <= 0: raise ValueError("The initial step size must be greater than 0.") - def check_epsilon_f(self) -> None: + def _check_epsilon_f(self) -> None: if self.factors["epsilon_f"] <= 0: raise ValueError("epsilon_f must be greater than 0.") - def check_sensitivity(self) -> None: + def _check_sensitivity(self) -> None: if self.factors["sensitivity"] <= 0: raise ValueError("Sensitivity must be greater than 0.") - def check_lambda(self) -> None: + def _check_lambda(self) -> None: if self.factors["lambda"] <= 0: raise ValueError("Lambda must be greater than 0.") + @override def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: - """ - Run a single macroreplication of a solver on a problem. - - Arguments - --------- - problem : Problem object - simulation-optimization problem to solve - - Returns - ------- - recommended_solns : list of Solution objects - list of solutions recommended throughout the budget - intermediate_budgets : list of ints - list of intermediate budgets when recommended solutions changes - """ recommended_solns = [] intermediate_budgets = [] expended_budget = 0 # Default values. - r: int = self.factors["r"] - theta: float = self.factors["theta"] - gamma: float = self.factors["gamma"] - alpha_max: int = self.factors["alpha_max"] - alpha_0: int = self.factors["alpha_0"] - epsilon_f: int = self.factors["epsilon_f"] - - # Upper bound and lower bound. + r = self.factors["r"] + theta = self.factors["theta"] + gamma = self.factors["gamma"] + alpha_max = self.factors["alpha_max"] + alpha = self.factors["alpha_0"] + epsilon_f = self.factors["epsilon_f"] + + # Upper and lower bounds. lower_bound = np.array(problem.lower_bounds) upper_bound = np.array(problem.upper_bounds) - # Initialize stepsize. - alpha: float = alpha_0 - # Start with the initial solution. new_solution = self.create_new_solution( problem.factors["initial_solution"], problem @@ -229,78 +191,53 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: best_solution = new_solution while expended_budget < problem.factors["budget"]: - new_x = new_solution.x - # Check variable bounds. + new_x = np.array(new_solution.x, dtype=float) + + # Check variable bounds forward = np.isclose( new_x, lower_bound, atol=self.factors["sensitivity"] ).astype(int) backward = np.isclose( new_x, upper_bound, atol=self.factors["sensitivity"] ).astype(int) - # bounds_check: 1 stands for forward, -1 stands for backward, 0 means central diff. - bounds_check = np.subtract(forward, backward) + bounds_check = forward - backward if problem.gradient_available: - # Use IPA gradient if available. - grad = ( - -1 - * problem.minmax[0] - * new_solution.objectives_gradients_mean[0] - ) + grad = -problem.minmax[0] * new_solution.objectives_gradients_mean[0] else: - # Use finite difference to estimate gradient if IPA gradient is not available. - grad = self.finite_diff( - new_solution, bounds_check, problem, alpha, r - ) + grad = self._finite_diff(new_solution, bounds_check, problem, alpha, r) expended_budget += ( - 2 * problem.dim - np.sum(bounds_check != 0) + 2 * problem.dim - np.count_nonzero(bounds_check) ) * r - # A while loop to prevent zero gradient - while np.all(grad == 0): - if expended_budget > problem.factors["budget"]: - break - grad = self.finite_diff( + while ( + np.all(grad == 0) and expended_budget <= problem.factors["budget"] + ): + grad = self._finite_diff( new_solution, bounds_check, problem, alpha, r ) expended_budget += ( - 2 * problem.dim - np.sum(bounds_check != 0) + 2 * problem.dim - np.count_nonzero(bounds_check) ) * r - # Update sample size after each iteration. - r = int(self.factors["lambda"] * r) - - # Calculate the candidate solution and adjust the solution to respect box constraints. - candidate_x = list() - for i in range(problem.dim): - candidate_x.append( - min( - max((new_x[i] - alpha * grad[i]), lower_bound[i]), - upper_bound[i], - ) - ) - candidate_solution = self.create_new_solution( - tuple(candidate_x), problem - ) + r = int(self.factors["lambda"] * r) # Update sample size + + # Compute candidate solution and apply box constraints (vectorized). + candidate_x = np.clip(new_x - alpha * grad, lower_bound, upper_bound) + candidate_solution = self.create_new_solution(tuple(candidate_x), problem) - # Use r simulated observations to estimate the objective value. problem.simulate(candidate_solution, r) expended_budget += r - # Check the modified Armijo condition for sufficient decrease. - if ( - -1 * problem.minmax[0] * candidate_solution.objectives_mean - ) <= ( - -1 * problem.minmax[0] * new_solution.objectives_mean - - alpha * theta * norm(grad) ** 2 + # Check modified Armijo condition + if (-problem.minmax[0] * candidate_solution.objectives_mean) <= ( + -problem.minmax[0] * new_solution.objectives_mean + - alpha * theta * np.linalg.norm(grad) ** 2 + 2 * epsilon_f ): - # Successful step. new_solution = candidate_solution alpha = min(alpha_max, alpha / gamma) else: - # Unsuccessful step. alpha = gamma * alpha - # Append new solution. if ( problem.minmax[0] * new_solution.objectives_mean > problem.minmax[0] * best_solution.objectives_mean @@ -309,13 +246,9 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: recommended_solns.append(new_solution) intermediate_budgets.append(expended_budget) - # Loop through the budgets and convert any numpy int32s to Python ints. - for i in range(len(intermediate_budgets)): - intermediate_budgets[i] = int(intermediate_budgets[i]) return recommended_solns, intermediate_budgets - # Finite difference for approximating gradients. - def finite_diff( + def _finite_diff( self, new_solution: Solution, bounds_check: np.ndarray, @@ -323,84 +256,77 @@ def finite_diff( stepsize: float, r: int, ) -> np.ndarray: + """Compute the finite difference approximation of the gradient for a solution. + + Args: + new_solution (Solution): The current solution to perturb. + bounds_check (np.ndarray): Array indicating which perturbation method to + use per dimension. + problem (Problem): The problem instance providing bounds and function + evaluations. + stepsize (float): The step size used for finite difference calculations. + r (int): The number of replications used for each function evaluation. + + Returns: + np.ndarray: The approximated gradient of the function at the given solution. + """ lower_bound = problem.lower_bounds upper_bound = problem.upper_bounds fn = -1 * problem.minmax[0] * new_solution.objectives_mean - new_x = new_solution.x + new_x = np.array(new_solution.x, dtype=float) # Store values for each dimension. function_diff = np.zeros((problem.dim, 3)) - grad = np.zeros(problem.dim) - - for i in range(problem.dim): - # Initialization. - x1 = list(new_x) - x2 = list(new_x) - # Forward stepsize. - steph1 = stepsize - # Backward stepsize. - steph2 = stepsize - - # Check variable bounds. - if x1[i] + steph1 > upper_bound[i]: - steph1 = np.abs(upper_bound[i] - x1[i]) - if x2[i] - steph2 < lower_bound[i]: - steph2 = np.abs(x2[i] - lower_bound[i]) - - # Decide stepsize. - # Central diff. - if bounds_check[i] == 0: - function_diff[i, 2] = min(steph1, steph2) - x1[i] = x1[i] + function_diff[i, 2] - x2[i] = x2[i] - function_diff[i, 2] - # Forward diff. - elif bounds_check[i] == 1: - function_diff[i, 2] = steph1 - x1[i] = x1[i] + function_diff[i, 2] - # Backward diff. - else: - function_diff[i, 2] = steph2 - x2[i] = x2[i] - function_diff[i, 2] - x1_solution = self.create_new_solution(tuple(x1), problem) - if bounds_check[i] != -1: - problem.simulate_up_to([x1_solution], r) - fn1 = -1 * problem.minmax[0] * x1_solution.objectives_mean - # First column is f(x+h,y). - function_diff[i, 0] = ( - fn1[0] if isinstance(fn1, np.ndarray) else fn1 - ) - x2_solution = self.create_new_solution(tuple(x2), problem) - if bounds_check[i] != 1: - problem.simulate_up_to([x2_solution], r) - fn2 = -1 * problem.minmax[0] * x2_solution.objectives_mean - # Second column is f(x-h,y). - function_diff[i, 1] = ( - fn2[0] if isinstance(fn2, np.ndarray) else fn2 - ) - - # Calculate gradient. - fn_divisor = ( - function_diff[i, 2][0] - if isinstance(function_diff[i, 2], np.ndarray) - else function_diff[i, 2] - ) - if bounds_check[i] == 0: - fn_diff = fn1 - fn2 # type: ignore - fn_divisor = 2 * fn_divisor - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - elif bounds_check[i] == 1: - fn_diff = fn1 - fn # type: ignore - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - elif bounds_check[i] == -1: - fn_diff = fn - fn2 # type: ignore - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - - return grad + + # Compute step sizes + step_forward = np.minimum(stepsize, upper_bound - new_x) + step_backward = np.minimum(stepsize, new_x - lower_bound) + + # Create perturbed variables + x1 = np.tile(new_x, (problem.dim, 1)) + x2 = np.tile(new_x, (problem.dim, 1)) + + central_mask = bounds_check == 0 + forward_mask = bounds_check == 1 + backward_mask = bounds_check == -1 + + # Assign step sizes + function_diff[:, 2] = np.where( + central_mask, + np.minimum(step_forward, step_backward), + np.where(forward_mask, step_forward, step_backward), + ) + + # Apply step updates + np.fill_diagonal(x1, new_x + function_diff[:, 2]) + np.fill_diagonal(x2, new_x - function_diff[:, 2]) + + # Identify indices where x1 and x2 solutions are needed + x1_indices = np.where(bounds_check != -1)[0] + x2_indices = np.where(bounds_check != 1)[0] + + # Simulate only required solutions + for i in x1_indices: + x1_solution = self.create_new_solution(tuple(x1[i]), problem) + problem.simulate_up_to([x1_solution], r) + fn1 = -problem.minmax[0] * x1_solution.objectives_mean + function_diff[i, 0] = fn1[0] if isinstance(fn1, np.ndarray) else fn1 + + for i in x2_indices: + x2_solution = self.create_new_solution(tuple(x2[i]), problem) + problem.simulate_up_to([x2_solution], r) + fn2 = -problem.minmax[0] * x2_solution.objectives_mean + function_diff[i, 1] = fn2[0] if isinstance(fn2, np.ndarray) else fn2 + + # Compute gradient + fn_divisor = function_diff[:, 2].copy() + fn_divisor[central_mask] *= 2 + + fn_diff = np.zeros(problem.dim) + if np.any(central_mask): + fn_diff[central_mask] = function_diff[:, 0] - function_diff[:, 1] + if np.any(forward_mask): + fn_diff[forward_mask] = function_diff[forward_mask, 0] - fn + if np.any(backward_mask): + fn_diff[backward_mask] = fn - function_diff[backward_mask, 1] + + return fn_diff / fn_divisor diff --git a/simopt/solvers/astrodf.py b/simopt/solvers/astrodf.py index 6e9c127b5..2bb6dd989 100644 --- a/simopt/solvers/astrodf.py +++ b/simopt/solvers/astrodf.py @@ -1,25 +1,35 @@ -""" -Summary -------- -The ASTRO-DF solver progressively builds local models (quadratic with diagonal Hessian) using interpolation on a set of points on the coordinate bases of the best (incumbent) solution. Solving the local models within a trust region (closed ball around the incumbent solution) at each iteration suggests a candidate solution for the next iteration. If the candidate solution is worse than the best interpolation point, it is replaced with the latter (a.k.a. direct search). The solver then decides whether to accept the candidate solution and expand the trust-region or reject it and shrink the trust-region based on a success ratio test. The sample size at each visited point is determined adaptively and based on closeness to optimality. -A detailed description of the solver can be found `here `__. - -This version does not require a delta_max, instead it estimates the maximum step size using get_random_solution(). Parameter tuning on delta_max is therefore not needed and removed from this version as well. +"""ASTRO-DF Solver. + +The ASTRO-DF solver progressively builds local models (quadratic with diagonal Hessian) +using interpolation on a set of points on the coordinate bases of the best (incumbent) +solution. Solving the local models within a trust region (closed ball around the +incumbent solution) at each iteration suggests a candidate solution for the next +iteration. If the candidate solution is worse than the best interpolation point, it is +replaced with the latter (a.k.a. direct search). The solver then decides whether to +accept the candidate solution and expand the trust-region or reject it and shrink the +trust-region based on a success ratio test. The sample size at each visited point is +determined adaptively and based on closeness to optimality. A detailed description of +the solver can be found `here `__. + +This version does not require a delta_max, instead it estimates the maximum step size +using get_random_solution(). Parameter tuning on delta_max is therefore not needed and +removed from this version as well. - Delta_max is so longer a factor, instead the maximum step size is estimated using get_random_solution(). - Parameter tuning on delta_max is therefore not needed and removed from this version as well. - No upper bound on sample size may be better - testing - It seems for SAN we always use pattern search - why? because the problem is convex and model may be misleading at the beginning - Added sufficient reduction for the pattern search -""" +""" # noqa: E501 +# TODO: check if bullet points can be indented and ignore tag removed from __future__ import annotations -import sys +import logging from math import ceil, log from typing import Callable import numpy as np -from numpy.linalg import norm, pinv +from numpy.linalg import LinAlgError, inv, norm, pinv from scipy.optimize import NonlinearConstraint, minimize from simopt.base import ( @@ -30,62 +40,40 @@ Solver, VariableType, ) +from simopt.utils import classproperty, override class ASTRODF(Solver): - """The ASTRO-DF solver. - - Attributes - ---------- - name : string - name of solver - objective_type : string - description of objective types: - "single" or "multi" - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - gradient_needed : bool - indicates if gradient of objective function is needed - factors : dict - changeable factors (i.e., parameters) of the solver - specifications : dict - details of each factor (for GUI, data validation, and defaults) - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used for the solver's internal purposes - - Arguments - --------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver - See also - -------- - base.Solver - """ + """The ASTRO-DF solver.""" - @property - def objective_type(self) -> ObjectiveType: + @classproperty + @override + def class_name(cls) -> str: + return "ASTRO-DF" + + @classproperty + @override + def objective_type(cls) -> ObjectiveType: return ObjectiveType.SINGLE - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_needed(self) -> bool: + @classproperty + @override + def gradient_needed(cls) -> bool: return False - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "crn_across_solns": { "description": "use CRN across solutions", @@ -103,12 +91,17 @@ def specifications(self) -> dict[str, dict]: "default": 0.8, }, "gamma_1": { - "description": "trust-region radius increase rate after a very successful iteration", + "description": ( + "trust-region radius increase rate after a very successful " + "iteration" + ), "datatype": float, "default": 2.5, }, "gamma_2": { - "description": "trust-region radius decrease rate after an unsuccessful iteration", + "description": ( + "trust-region radius decrease rate after an unsuccessful iteration" + ), "datatype": float, "default": 0.5, }, @@ -128,74 +121,147 @@ def specifications(self) -> dict[str, dict]: "default": True, }, "ps_sufficient_reduction": { - "description": "use pattern search if with sufficient reduction, 0 always allows it, large value never does", + "description": ( + "use pattern search if with sufficient reduction, " + "0 always allows it, large value never does" + ), "datatype": float, "default": 0.1, }, "use_gradients": { - "description": "if direct gradient observations are available, use them", + "description": ( + "if direct gradient observations are available, use them" + ), "datatype": bool, "default": True, }, } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { - "crn_across_solns": self.check_crn_across_solns, # type: ignore - "eta_1": self.check_eta_1, - "eta_2": self.check_eta_2, - "gamma_1": self.check_gamma_1, - "gamma_2": self.check_gamma_2, - "lambda_min": self.check_lambda_min, - "ps_sufficient_reduction": self.check_ps_sufficient_reduction, + "crn_across_solns": self.check_crn_across_solns, + "eta_1": self._check_eta_1, + "eta_2": self._check_eta_2, + "gamma_1": self._check_gamma_1, + "gamma_2": self._check_gamma_2, + "lambda_min": self._check_lambda_min, + "ps_sufficient_reduction": self._check_ps_sufficient_reduction, } def __init__( self, name: str = "ASTRODF", fixed_factors: dict | None = None ) -> None: - """ - Initialize the ASTRO-DF solver. - Arguments - --------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver + """Initialize the ASTRO-DF solver. + + Args: + name (str, optional): User-specified name for the solver. + Defaults to "ASTRODF". + fixed_factors (dict, optional): Fixed factors of the solver. + Defaults to None. """ # Let the base class handle default arguments. super().__init__(name, fixed_factors) - def check_eta_1(self) -> None: + @property + def iteration_count(self) -> int: + """Get the current iteration count.""" + return self._iteration_count + + @iteration_count.setter + def iteration_count(self, value: int) -> None: + """Set the current iteration count.""" + self._iteration_count = value + + @property + def delta_k(self) -> float: + """Get the current delta_k value.""" + return self._delta_k + + @delta_k.setter + def delta_k(self, value: float) -> None: + """Set the current delta_k value.""" + self._delta_k = value + + @property + def delta_max(self) -> float: + """Get the current delta_max value.""" + return self._delta_max + + @delta_max.setter + def delta_max(self, value: float) -> None: + """Set the current delta_max value.""" + self._delta_max = value + + @property + def expended_budget(self) -> int: + """Get the current expended budget.""" + return self._expended_budget + + @expended_budget.setter + def expended_budget(self, value: int) -> None: + """Set the current expended budget.""" + self._expended_budget = value + + @property + def incumbent_x(self) -> tuple[float, ...]: + """Get the incumbent solution.""" + return self._incumbent_x + + @incumbent_x.setter + def incumbent_x(self, value: tuple[float, ...]) -> None: + """Set the incumbent solution.""" + self._incumbent_x = value + + @property + def incumbent_solution(self) -> Solution: + """Get the incumbent solution.""" + return self._incumbent_solution + + @incumbent_solution.setter + def incumbent_solution(self, value: Solution) -> None: + """Set the incumbent solution.""" + self._incumbent_solution = value + + @property + def h_k(self) -> np.ndarray: + """Get the Hessian approximation.""" + return self._h_k + + @h_k.setter + def h_k(self, value: np.ndarray) -> None: + """Set the Hessian approximation.""" + self._h_k = value + + def _check_eta_1(self) -> None: if self.factors["eta_1"] <= 0: raise ValueError("Eta 1 must be greater than 0.") - def check_eta_2(self) -> None: + def _check_eta_2(self) -> None: if self.factors["eta_2"] <= self.factors["eta_1"]: raise ValueError("Eta 2 must be greater than Eta 1.") - def check_gamma_1(self) -> None: + def _check_gamma_1(self) -> None: if self.factors["gamma_1"] <= 1: raise ValueError("Gamma 1 must be greater than 1.") - def check_gamma_2(self) -> None: + def _check_gamma_2(self) -> None: if self.factors["gamma_2"] >= 1 or self.factors["gamma_2"] <= 0: raise ValueError("Gamma 2 must be between 0 and 1.") - def check_lambda_min(self) -> None: + def _check_lambda_min(self) -> None: if self.factors["lambda_min"] <= 2: raise ValueError("The minimum sample size must be greater than 2.") - def check_ps_sufficient_reduction(self) -> None: + def _check_ps_sufficient_reduction(self) -> None: if self.factors["ps_sufficient_reduction"] < 0: raise ValueError( "ps_sufficient reduction must be greater than or equal to 0." ) def get_coordinate_vector(self, size: int, v_no: int) -> np.ndarray: - """ - Generate the coordinate vector corresponding to the variable number v_no. - """ + """Generate the coordinate vector corresponding to the variable number v_no.""" arr = np.zeros(size) arr[v_no] = 1.0 return arr @@ -203,8 +269,9 @@ def get_coordinate_vector(self, size: int, v_no: int) -> np.ndarray: def get_rotated_basis( self, first_basis: np.ndarray, rotate_index: np.ndarray ) -> np.ndarray: - """ - Generate the basis (rotated coordinate) (the first vector comes from the visited design points (origin basis) + """Generate the basis (rotated coordinate). + + The first vector comes from the visited design points (origin basis) """ rotate_matrix = np.array(first_basis) rotation = np.zeros((2, 2), dtype=int) @@ -216,7 +283,10 @@ def get_rotated_basis( for i in range(1, len(rotate_index)): v1 = np.array( - [[first_basis[rotate_index[0]]], [first_basis[rotate_index[i]]]] + [ + [first_basis[rotate_index[0]]], + [first_basis[rotate_index[i]]], + ] ) v2 = np.dot(rotation, v1) rotated_basis = np.copy(first_basis) @@ -227,14 +297,20 @@ def get_rotated_basis( return rotate_matrix - def evaluate_model(self, x_k: np.ndarray, q: np.ndarray) -> np.ndarray: - """ - Compute the local model value with a linear interpolation with a diagonal Hessian - """ - x_val = [1] - x_val = np.append(x_val, np.array(x_k)) - x_val = np.append(x_val, np.array(x_k) ** 2) - return np.matmul(x_val, q) + def evaluate_model(self, x_k: np.ndarray, q: np.ndarray) -> float: + """Evaluate a local quadratic model using linear interpolation and a diagonal Hessian. + + Args: + x_k (np.ndarray): The point at which to evaluate the model + (decision variables). + q (np.ndarray): Coefficient vector defining the local quadratic model. + + Returns: + np.ndarray: The evaluated model value as a NumPy array. + """ # noqa: E501 + xk_arr = np.array(x_k).flatten() + x_val = np.hstack(([1], xk_arr, xk_arr**2)) + return np.matmul(x_val, q).item() def get_stopping_time( self, @@ -242,11 +318,18 @@ def get_stopping_time( sig2: float, delta: float, kappa: float, - dim: int, - delta_power: int, ) -> int: - """ - Compute the sample size based on adaptive sampling stopping rule using the optimality gap + """Compute the sample size using adaptive stopping based on the optimality gap. + + Args: + pilot_run (int): Number of initial samples used in the pilot run. + sig2 (float): Estimated variance of the solution. + delta (float): Optimality gap threshold. + kappa (float): Constant in the stopping time denominator. + If 0, it defaults to 1. + + Returns: + int: The computed sample size, rounded up to the nearest integer. """ if kappa == 0: kappa = 1 @@ -256,42 +339,182 @@ def get_stopping_time( # compute sample size raw_sample_size = pilot_run * max( - 1, sig2 / (kappa**2 * delta**delta_power) + 1, sig2 / (kappa**2 * delta**self.delta_power) ) - # Convert out of ndarray if it is - if isinstance(raw_sample_size, np.ndarray): - raw_sample_size = raw_sample_size[0] - # round up to the nearest integer - sample_size: int = ceil(raw_sample_size) - return sample_size + return ceil(float(raw_sample_size)) + + def select_interpolation_points( + self, delta_k: float, f_index: int + ) -> tuple[list, list]: + """Select interpolation points for the local model. + + Args: + delta_k (float): The current trust-region radius. + f_index (int): The index of the farthest design point. + + Returns: + tuple[list, list]: A tuple containing: + - var_y (list): The interpolation points. + - var_z (list): The reused design point. + """ + if self.incumbent_x is None: + raise ValueError("incumbent_x should be initialized before use") + + # If it is the first iteration or there is no design point we can reuse within + # the trust region, use the coordinate basis + if ( + not self.reuse_points + or ( + norm( + np.array(self.incumbent_x) + - np.array(self.visited_pts_list[f_index].x) + ) + == 0 + ) + or self.iteration_count == 1 + ): + # Construct the interpolation set + var_y = self.get_coordinate_basis_interpolation_points( + self.incumbent_x, delta_k, self.problem + ) + var_z = self.get_coordinate_basis_interpolation_points( + tuple(np.zeros(self.problem.dim)), delta_k, self.problem + ) + # Else if we will reuse one design point (k > 1) + else: + visited_pts_array = np.array(self.visited_pts_list[f_index].x) + diff_array = visited_pts_array - np.array(self.incumbent_x) + first_basis = (diff_array) / norm(diff_array) + # if first_basis has some non-zero components, use rotated basis for those + # dimensions + rotate_list = np.nonzero(first_basis)[0] + rotate_matrix = self.get_rotated_basis(first_basis, rotate_list) + + # if first_basis has some zero components, use coordinate basis for those + # dimensions + for i in range(self.problem.dim): + if first_basis[i] == 0: + coord_vector = self.get_coordinate_vector(self.problem.dim, i) + rotate_matrix = np.vstack( + ( + rotate_matrix, + coord_vector, + ) + ) + + # construct the interpolation set + var_y = self.get_rotated_basis_interpolation_points( + np.array(self.incumbent_x), + delta_k, + self.problem, + rotate_matrix, + self.visited_pts_list[f_index].x, + ) + var_z = self.get_rotated_basis_interpolation_points( + np.zeros(self.problem.dim), + delta_k, + self.problem, + rotate_matrix, + np.array(self.visited_pts_list[f_index].x) - np.array(self.incumbent_x), + ) + + return var_y, var_z + + def perform_adaptive_sampling( + self, + solution: Solution, + pilot_run: int, + delta_k: float, + compute_kappa: bool = False, + ) -> None: + """Perform adaptive sampling on a solution until the stopping condition is met. + + Args: + solution (Solution): The solution object being sampled. + pilot_run (int): The number of initial pilot runs. + delta_k (float): The current trust-region radius. + compute_kappa (bool): Whether or not to compute kappa dynamically (needed in + the first iteration). + """ + sample_size = solution.n_reps if solution.n_reps > 0 else pilot_run + lambda_max = self.budget - self.expended_budget + + # Initial Simulation (only if needed) + if solution.n_reps == 0: + self.problem.simulate(solution, pilot_run) + self.expended_budget += pilot_run + sample_size = pilot_run + + while True: + # Compute variance + sig2 = solution.objectives_var[0] + if self.delta_power == 0: + sig2 = max(sig2, np.trace(solution.objectives_gradients_var)) + + # Compute stopping condition + kappa = None + if compute_kappa: + if self.enable_gradient: + rhs_for_kappa = norm(solution.objectives_gradients_mean[0]) + else: + rhs_for_kappa = solution.objectives_mean + kappa = ( + rhs_for_kappa + * np.sqrt(pilot_run) + / (delta_k ** (self.delta_power / 2)) + ) + + # Set k to the right kappa + if kappa is not None: + k = kappa + elif self.kappa is not None: + k = self.kappa + else: + # TODO: figure out if we need to raise an error instead + logging.warning("kappa is not set. Using default value of 0.") + k = 0 + # Compute stopping time + stopping = self.get_stopping_time(pilot_run, sig2, delta_k, k) + + # Stop if conditions are met + if ( + sample_size >= min(stopping, lambda_max) + or self.expended_budget >= self.budget + ): + if compute_kappa: + self.kappa = kappa # Update kappa only if needed + break + + # Perform additional simulation + self.problem.simulate(solution, 1) + self.expended_budget += 1 + sample_size += 1 def construct_model( self, - x_k: tuple[int | float, ...], - delta: float, - k: int, - problem: Problem, - expended_budget: int, - kappa: float, - incumbent_solution: Solution, - visited_pts_list: list, - delta_power: int, ) -> tuple[ list[float], list, np.ndarray, np.ndarray, np.ndarray, - float, - int, - list[Solution], list[Solution], ]: + """Construct the local model for the current iteration. + + Construct the "qualified" local model for each iteration k with the center + point x_k reconstruct with new points in a shrunk trust-region if the model + fails the criticality condition the criticality condition keeps the model + gradient norm and the trust-region size in lock-step """ - construct the "qualified" local model for each iteration k with the center point x_k - reconstruct with new points in a shrunk trust-region if the model fails the criticality condition - the criticality condition keeps the model gradient norm and the trust-region size in lock-step - """ + # Make sure we have our global variables initialized + if self.delta_k is None: + raise ValueError("delta_k should be initialized before use") + if self.incumbent_x is None: + raise ValueError("incumbent_x should be initialized before use") + if self.incumbent_solution is None: + raise ValueError("incumbent_solution should be initialized before use") + interpolation_solns = [] ## inner loop parameters @@ -300,226 +523,94 @@ def construct_model( beta = 10 # self.factors["beta"] # criticality_threshold = 0.1 # self.factors["criticality_threshold"] # skip_criticality = True # self.factors["skip_criticality"] - j = 0 # Problem and solver factors - reuse_points: bool = self.factors["reuse_points"] - lambda_min: int = self.factors["lambda_min"] - budget: int = problem.factors["budget"] - lambda_max = budget - expended_budget + lambda_max = self.budget - self.expended_budget # lambda_max = budget / (15 * sqrt(problem.dim)) pilot_run = ceil( max( - lambda_min * log(10 + k, 10) ** 1.1, - min(0.5 * problem.dim, lambda_max), + self.lambda_min * log(10 + self.iteration_count, 10) ** 1.1, + min(0.5 * self.problem.dim, lambda_max), ) - 1 ) + + delta = self.delta_k + model_iterations: int = 0 while True: - fval = [] - j = j + 1 - delta_k = delta * w ** (j - 1) + delta_k = delta * w**model_iterations + model_iterations += 1 # Calculate the distance between the center point and other design points distance_array = [] - for i in range(len(visited_pts_list)): - distance_array.append( - norm(np.array(visited_pts_list[i].x) - np.array(x_k)) - - delta_k - ) - # If the design point is outside the trust region, we will not reuse it (distance = -big M) - if distance_array[i] > 0: - distance_array[i] = -delta_k * 10000 + for point in self.visited_pts_list: + dist_diff = np.array(point.x) - np.array(self.incumbent_x) + distance = norm(dist_diff) - delta_k + # If the design point is outside the trust region, we will not reuse it + # (distance = -big M) + dist_to_append = -delta_k * 10000 if distance > 0 else distance + distance_array.append(dist_to_append) # Find the index of visited design points list for reusing points - # The reused point will be the farthest point from the center point among the design points within the trust region + # The reused point will be the farthest point from the center point among + # the design points within the trust region f_index = distance_array.index(max(distance_array)) - # If it is the first iteration or there is no design point we can reuse within the trust region, use the coordinate basis - - if ( - (k == 1) - or ( - norm(np.array(x_k) - np.array(visited_pts_list[f_index].x)) - == 0 - ) - or not reuse_points - ): - # Construct the interpolation set - var_y = self.get_coordinate_basis_interpolation_points( - x_k, delta_k, problem - ) - var_z = self.get_coordinate_basis_interpolation_points( - tuple(np.zeros(problem.dim)), delta_k, problem - ) - # Else if we will reuse one design point - elif k > 1: - visited_pts_array = np.array(visited_pts_list[f_index].x) - diff_array = visited_pts_array - np.array(x_k) - first_basis = (diff_array) / norm(diff_array) - # if first_basis has some non-zero components, use rotated basis for those dimensions - rotate_list = np.nonzero(first_basis)[0] - rotate_matrix = self.get_rotated_basis(first_basis, rotate_list) - - # if first_basis has some zero components, use coordinate basis for those dimensions - for i in range(problem.dim): - if first_basis[i] == 0: - coord_vector = self.get_coordinate_vector( - problem.dim, i - ) - rotate_matrix = np.vstack( - ( - rotate_matrix, - coord_vector, - ) - ) + var_y, var_z = self.select_interpolation_points(delta_k, f_index) - # construct the interpolation set - var_y = self.get_rotated_basis_interpolation_points( - np.array(x_k), - delta_k, - problem, - rotate_matrix, - visited_pts_list[f_index].x, - ) - var_z = self.get_rotated_basis_interpolation_points( - np.zeros(problem.dim), - delta_k, - problem, - rotate_matrix, - np.array(visited_pts_list[f_index].x) - np.array(x_k), - ) - # Else - # TODO: figure out what to do if the above conditions are not met - else: - error_msg = "Error in constructing the interpolation set" - raise ValueError(error_msg) # Evaluate the function estimate for the interpolation points - for i in range(2 * problem.dim + 1): - # for x_0, we don't need to simulate the new solution - if (k == 1) and (i == 0): - fval.append( - -1 - * problem.minmax[0] - * incumbent_solution.objectives_mean - ) - interpolation_solns.append(incumbent_solution) - # reuse the replications for x_k (center point, i.e., the incumbent solution) - elif i == 0: - sample_size = incumbent_solution.n_reps - sig2 = incumbent_solution.objectives_var[0] - # adaptive sampling - while True: - stopping = self.get_stopping_time( - pilot_run, - sig2, - delta_k, - kappa, - problem.dim, - delta_power, - ) - if ( - sample_size >= min(stopping, lambda_max) - or expended_budget >= budget - ): - break - problem.simulate(incumbent_solution, 1) - expended_budget += 1 - sample_size += 1 - sig2 = incumbent_solution.objectives_var[0] - fval.append( - -1 - * problem.minmax[0] - * incumbent_solution.objectives_mean - ) - interpolation_solns.append(incumbent_solution) - # else if reuse one design point, reuse the replications + fval = [] + double_dim = 2 * self.problem.dim + 1 + for i in range(double_dim): + # If first iteration, reuse the incumbent solution + if i == 0: + adapt_soln = self.incumbent_solution + # If the second iteration and we can reuse points, reuse the farthest + # point from the center point elif ( - (i == 1) - and ( - norm( - np.array(x_k) - - np.array(visited_pts_list[f_index].x) - ) - != 0 + i == 1 + and self.reuse_points + and norm( + np.array(self.incumbent_x) + - np.array(self.visited_pts_list[f_index].x) ) - and reuse_points + != 0 ): - sample_size = visited_pts_list[f_index].n_reps - sig2 = visited_pts_list[f_index].objectives_var[0] - # adaptive sampling - while True: - stopping = self.get_stopping_time( - pilot_run, - sig2, - delta_k, - kappa, - problem.dim, - delta_power, - ) - if ( - sample_size >= min(stopping, lambda_max) - or expended_budget >= budget - ): - break - problem.simulate(visited_pts_list[f_index], 1) - expended_budget += 1 - sample_size += 1 - sig2 = visited_pts_list[f_index].objectives_var[0] - fval.append( - -1 - * problem.minmax[0] - * visited_pts_list[f_index].objectives_mean - ) - interpolation_solns.append(visited_pts_list[f_index]) - # for new points, run the simulation with pilot run + adapt_soln = self.visited_pts_list[f_index] + # Otherwise, create/initialize a new solution and use that else: decision_vars = tuple(var_y[i][0]) - new_solution = self.create_new_solution( - decision_vars, problem - ) - visited_pts_list.append(new_solution) - problem.simulate(new_solution, pilot_run) - expended_budget += pilot_run - sample_size = pilot_run - - # adaptive sampling - while True: - sig2 = new_solution.objectives_var[0] - stopping = self.get_stopping_time( - pilot_run, - sig2, - delta_k, - kappa, - problem.dim, - delta_power, - ) - if ( - sample_size >= min(stopping, lambda_max) - or expended_budget >= budget - ): - break - problem.simulate(new_solution, 1) - expended_budget += 1 - sample_size += 1 - - fval.append( - -1 * problem.minmax[0] * new_solution.objectives_mean - ) - interpolation_solns.append(new_solution) + new_solution = self.create_new_solution(decision_vars, self.problem) + self.visited_pts_list.append(new_solution) + self.problem.simulate(new_solution, pilot_run) + self.expended_budget += pilot_run + adapt_soln = new_solution + + # Don't perform adaptive sampling on x_0 + if not (i == 0 and self.iteration_count == 0): + self.perform_adaptive_sampling(adapt_soln, pilot_run, delta_k) + + # Append the function estimate to the list + fval.append(-1 * self.problem.minmax[0] * adapt_soln.objectives_mean) + interpolation_solns.append(adapt_soln) # construct the model and obtain the model coefficients - q, grad, hessian = self.get_model_coefficients(var_z, fval, problem) + q, grad, hessian = self.get_model_coefficients(var_z, fval, self.problem) - if delta_k <= mu * norm(grad): + norm_grad = norm(grad) + if delta_k <= mu * norm_grad or norm_grad == 0: break - # If a model gradient norm is zero, there is a possibility that the code stuck in this while loop - if norm(grad) == 0: - break + # If a model gradient norm is zero, there is a possibility that the code + # stuck in this while loop + # TODO: investigate if this can be implemented instead of checking + # norm(grad) == 0 + # MAX_ITER = 100 + # if model_iterations > MAX_ITER: + # break - beta_n_grad = float(beta * norm(grad)) - delta_k = min(max(beta_n_grad, delta_k), delta) + beta_n_grad = float(beta * norm_grad) + self.delta_k = min(max(beta_n_grad, delta_k), delta) return ( fval, @@ -527,61 +618,84 @@ def construct_model( q, grad, hessian, - delta_k, - expended_budget, interpolation_solns, - visited_pts_list, ) def get_model_coefficients( self, y_var: list, fval: list, problem: Problem ) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + """Compute model coefficients using 2d+1 design points and function values. + + This method fits a quadratic model with a diagonal Hessian by evaluating + `2 * dim + 1` points centered at the solution. + + Args: + y_var (list): List of sampled decision vectors (design points). + fval (list): Corresponding function values for each design point. + problem (Problem): Problem instance providing dimension and structure. + + Returns: + tuple[np.ndarray, np.ndarray, np.ndarray]: A tuple containing: + - q (np.ndarray): Coefficients of the fitted local quadratic model. + - y_mean (np.ndarray): Mean of the y_var design points. + - fval_mean (np.ndarray): Mean of the function values. """ - Compute the model coefficients using (2d+1) design points and their function estimates - """ - m_var = [] - for i in range(0, 2 * problem.dim + 1): - m_var.append(1) - m_var[i] = np.append(m_var[i], np.array(y_var[i])) - m_var[i] = np.append(m_var[i], np.array(y_var[i]) ** 2) - - q: np.ndarray = np.matmul( - pinv(m_var), fval - ) # pinv returns the inverse of your matrix when it is available and the pseudo inverse when it isn't. - grad = q[1 : problem.dim + 1] - grad = np.reshape(grad, problem.dim) - hessian = q[problem.dim + 1 : 2 * problem.dim + 1] - hessian = np.reshape(hessian, problem.dim) - return q, grad, hessian + num_design_points = 2 * problem.dim + 1 + + # Construct the matrix with ones, linear terms, and squared terms + m_var = np.array( + [ + np.hstack(([1], np.ravel(y_var[i]), np.ravel(y_var[i]) ** 2)) + for i in range(num_design_points) + ] + ) + + # Compute the inverse or pseudoinverse of the matrix + try: + matrix_inverse = inv(m_var) + except LinAlgError: + matrix_inverse = pinv(m_var) + + inverse_mult = np.matmul(matrix_inverse, fval) + + # Extract gradient and Hessian from the result + decision_var_idx = problem.dim + 1 + grad = inverse_mult[1:decision_var_idx].reshape(problem.dim) + hessian = inverse_mult[decision_var_idx:num_design_points].reshape(problem.dim) + + return inverse_mult, grad, hessian def get_coordinate_basis_interpolation_points( self, x_k: tuple[int | float, ...], delta: float, problem: Problem - ) -> list: - """ - Compute the interpolation points (2d+1) using the coordinate basis - """ - y_var = [[x_k]] - epsilon = 0.01 - num_decision_vars = problem.dim + ) -> list[list[list[int | float]]]: + """Compute the interpolation points (2d+1) using the coordinate basis.""" + y_var = [[list(x_k)]] is_block_constraint = sum(x_k) != 0 + num_decision_vars = problem.dim + + lower_bounds = problem.lower_bounds + upper_bounds = problem.upper_bounds for var_idx in range(num_decision_vars): - coord_vector = self.get_coordinate_vector( - num_decision_vars, var_idx - ) + coord_vector = self.get_coordinate_vector(num_decision_vars, var_idx) coord_diff = delta * coord_vector - minus = y_var[0] - coord_diff - plus = y_var[0] + coord_diff + + minus: list[float] = [x - d for x, d in zip(x_k, coord_diff)] + plus: list[float] = [x + d for x, d in zip(x_k, coord_diff)] if is_block_constraint: - # block constraints - if minus[0][var_idx] <= problem.lower_bounds[var_idx]: - minus[0][var_idx] = problem.lower_bounds[var_idx] + epsilon - if plus[0][var_idx] >= problem.upper_bounds[var_idx]: - plus[0][var_idx] = problem.upper_bounds[var_idx] - epsilon - - y_var.append(list(plus)) - y_var.append(list(minus)) + minus = [ + clamp_with_epsilon(val, lower_bounds[j], upper_bounds[j]) + for j, val in enumerate(minus) + ] + plus = [ + clamp_with_epsilon(val, lower_bounds[j], upper_bounds[j]) + for j, val in enumerate(plus) + ] + + y_var.append([plus]) + y_var.append([minus]) + return y_var def get_rotated_basis_interpolation_points( @@ -592,192 +706,151 @@ def get_rotated_basis_interpolation_points( rotate_matrix: np.ndarray, reused_x: np.ndarray, ) -> list[list[np.ndarray]]: - """ - Compute the interpolation points (2d+1) using the rotated coordinate basis (reuse one design point) + """Compute the interpolation points (2d+1) using the rotated coordinate basis. + + One design point is reused, which is the farthest point from the center point. """ y_var = [[x_k]] - epsilon = 0.01 - is_block_constraint = sum(x_k) != 0 + is_block_constraint = np.sum(x_k) != 0 num_decision_vars = problem.dim + lower_bounds = np.array(problem.lower_bounds) + upper_bounds = np.array(problem.upper_bounds) + for i in range(num_decision_vars): rotate_matrix_delta: np.ndarray = delta * rotate_matrix[i] - if i == 0: - plus = tuple([np.array(reused_x)]) - else: - plus = y_var[0] + rotate_matrix_delta - minus = y_var[0] - rotate_matrix_delta + plus = reused_x if i == 0 else x_k + rotate_matrix_delta + + minus = x_k - rotate_matrix_delta if is_block_constraint: - # block constraints - for j in range(num_decision_vars): - lower_bound = problem.lower_bounds[j] - upper_bound = problem.upper_bounds[j] - if minus[0][j] <= lower_bound: - minus[0][j] = lower_bound + epsilon - elif minus[0][j] >= upper_bound: - minus[0][j] = upper_bound - epsilon - if plus[0][j] <= lower_bound: - plus[0][j] = lower_bound + epsilon - elif plus[0][j] >= upper_bound: - plus[0][j] = upper_bound - epsilon - - y_var.append(list(plus)) - y_var.append(list(minus)) + minus = np.array( + [ + clamp_with_epsilon(val, lower_bounds[j], upper_bounds[j]) + for j, val in enumerate(minus) + ] + ) + plus = np.array( + [ + clamp_with_epsilon(val, lower_bounds[j], upper_bounds[j]) + for j, val in enumerate(plus) + ] + ) + + y_var.append([plus]) + y_var.append([minus]) + return y_var - def iterate( - self, - k: int, - delta_k: float, - delta_max: float | int, - problem: Problem, - visited_pts_list: list, - incumbent_x: tuple[int | float, ...], - expended_budget: int, - budget_limit: int, - recommended_solns: list, - intermediate_budgets: list, - kappa: float, - incumbent_solution: Solution, - h_k: list, - ) -> tuple[ - float, - float, - list[Solution], - list[int], - int, - tuple[int | float, ...], - float, - Solution, - list[Solution], - list[list], - ]: - """ - Run one iteration of trust-region algorithm by bulding and solving a local model and updating the current incumbent and trust-region radius, and saving the data - """ - # default values - eta_1: float = self.factors["eta_1"] - eta_2: float = self.factors["eta_2"] - gamma_1: float = self.factors["gamma_1"] - gamma_2: float = self.factors["gamma_2"] - easy_solve: bool = self.factors["easy_solve"] - lambda_min: int = self.factors["lambda_min"] - lambda_max = budget_limit - expended_budget - # lambda_max = budget_limit / (15 * sqrt(problem.dim)) - enable_gradient = ( - problem.gradient_available and self.factors["use_gradients"] + def update_hessian( + self, candidate_solution: Solution, grad: np.ndarray, s: np.ndarray + ) -> None: + """Performs Hessian update if gradients are enabled.""" + epsilon = 1e-15 + if not hasattr(self, "hessian_skip_count"): + self.hessian_skip_count = 0 + + def handle_hessian_skip(variable: str, value: float | np.ndarray) -> None: + """Handles skipping Hessian update if gradients are near zero.""" + self.hessian_skip_count += 1 + message = ( + f"{variable} near zero ({value}); " + "skipping Hessian update to avoid numerical instability. " + f"({self.hessian_skip_count} consecutive skips)" + ) + logging.debug(message) + if self.hessian_skip_count == 10: + message = ( + "Hessian update skipped 10 consecutive times. " + "Check optimization stability." + ) + logging.info(message) + # If Hessian updates fail too often, the current approximation may + # be useless or unstable. Resetting can prevent further instability + # elif self.hessian_skip_count == 50: + # message = ( + # "Hessian update skipped 50 consecutive times. " + # "Resetting Hessian approximation." + # ) + # logging.warning(message) + # self.h_k = np.identity(self.problem.dim) + # self.hessian_skip_count = 0 + + candidate_grad = ( + -1 + * self.problem.minmax[0] + * candidate_solution.objectives_gradients_mean[0] ) - # uncomment the next line to avoid Hessian updating - # h_k = np.identity(problem.dim) - # determine power of delta in adaptive sampling rule - if self.factors["crn_across_solns"]: - if enable_gradient: - delta_power = 0 - else: - delta_power = 2 - else: - delta_power = 4 + y_k = candidate_grad - grad + y_ks = y_k @ s + + if np.isclose(y_ks, 0, atol=epsilon): + handle_hessian_skip("y_ks", y_ks) + return + + r_k = 1.0 / y_ks + h_s_k = self.h_k @ s + s_h_s_k = s @ h_s_k + + if np.all(np.isclose(s_h_s_k, 0, atol=epsilon)): + handle_hessian_skip("s_h_s_k", s_h_s_k) + return + self.h_k += np.outer(y_k, y_k) * r_k - np.outer(h_s_k, h_s_k) / s_h_s_k + # Reset counter on successful update + self.hessian_skip_count = 0 + + def iterate(self) -> None: + """Run one iteration of the ASTRO-DF algorithm. + Build and solve a local model, update the current incumbent and trust-region + radius, and save the data + """ + self.iteration_count += 1 + neg_minmax = -self.problem.minmax[0] + + # determine power of delta in adaptive sampling rule pilot_run = ceil( max( - lambda_min * log(10 + k, 10) ** 1.1, - min(0.5 * problem.dim, lambda_max), + self.lambda_min * log(10 + self.iteration_count, 10) ** 1.1, + min(0.5 * self.problem.dim, self.lambda_max), ) - 1 ) - if k == 1: - incumbent_solution = self.create_new_solution(incumbent_x, problem) - if len(visited_pts_list) == 0: - visited_pts_list.append(incumbent_solution) - - # pilot run - problem.simulate(incumbent_solution, pilot_run) - expended_budget += pilot_run - sample_size = pilot_run + if self.iteration_count == 1: + self.incumbent_solution = self.create_new_solution( + self.incumbent_x, self.problem + ) + self.visited_pts_list.append(self.incumbent_solution) - # adaptive sampling - while True: - if enable_gradient: - rhs_for_kappa = norm( - incumbent_solution.objectives_gradients_mean[0] - ) - else: - rhs_for_kappa = incumbent_solution.objectives_mean - sig2 = incumbent_solution.objectives_var[0] - if delta_power == 0: - sig2 = max( - sig2, - np.trace(incumbent_solution.objectives_gradients_var), - ) - stopping = self.get_stopping_time( - pilot_run, - sig2, - delta_k, - rhs_for_kappa - * np.sqrt(pilot_run) - / (delta_k ** (delta_power / 2)), - problem.dim, - delta_power, - ) - if ( - sample_size >= min(stopping, lambda_max) - or expended_budget >= budget_limit - ): - # calculate kappa - kappa = ( - rhs_for_kappa - * np.sqrt(pilot_run) - / (delta_k ** (delta_power / 2)) - ) - # print("kappa "+str(kappa)) - break - problem.simulate(incumbent_solution, 1) - expended_budget += 1 - sample_size += 1 - - recommended_solns.append(incumbent_solution) - intermediate_budgets.append(expended_budget) - elif self.factors[ - "crn_across_solns" - ]: # since incument was only evaluated with the sample size of previous incumbent, here we compute its adaptive sample size - sample_size = incumbent_solution.n_reps - # adaptive sampling - while True: - sig2 = incumbent_solution.objectives_var[0] - if delta_power == 0: - sig2 = max( - sig2, - np.trace(incumbent_solution.objectives_gradients_var), - ) - stopping = self.get_stopping_time( - pilot_run, sig2, delta_k, kappa, problem.dim, delta_power - ) - if ( - sample_size >= min(stopping, lambda_max) - or expended_budget >= budget_limit - ): - break - else: - problem.simulate(incumbent_solution, 1) - expended_budget += 1 - sample_size += 1 + self.perform_adaptive_sampling( + self.incumbent_solution, + pilot_run, + self.delta_k, + compute_kappa=True, + ) + self.recommended_solns.append(self.incumbent_solution) + self.intermediate_budgets.append(self.expended_budget) + # Since incument was only evaluated with the sample size of previous incumbent, + # here we compute its adaptive sample size + elif self.factors["crn_across_solns"]: + self.perform_adaptive_sampling( + self.incumbent_solution, pilot_run, self.delta_k + ) # use Taylor expansion if gradient available - if enable_gradient: + if self.enable_gradient: fval = ( - np.ones(2 * problem.dim + 1) - * -1 - * problem.minmax[0] - * incumbent_solution.objectives_mean - ) - grad = ( - -1 - * problem.minmax[0] - * incumbent_solution.objectives_gradients_mean[0] + np.ones(2 * self.problem.dim + 1) + * neg_minmax + * self.incumbent_solution.objectives_mean ) - hessian = h_k + grad = neg_minmax * self.incumbent_solution.objectives_gradients_mean[0] + hessian = self.h_k + # Set empty variables to get rid of typing warnings + q = np.array([]) + y_var = [[]] + interpolation_solns: list[Solution] = [] else: # build the local model with interpolation (subproblem) ( @@ -786,54 +859,43 @@ def iterate( q, grad, hessian, - delta_k, - expended_budget, interpolation_solns, - visited_pts_list, - ) = self.construct_model( - incumbent_x, - delta_k, - k, - problem, - expended_budget, - kappa, - incumbent_solution, - visited_pts_list, - delta_power, - ) + ) = self.construct_model() # solve the local model (subproblem) - if easy_solve: + if self.easy_solve: # Cauchy reduction # TODO: why do we need this? Check model reduction calculation too. - # print("np.dot(np.multiply(grad, Hessian), grad) "+str(np.dot(np.multiply(grad, hessian), grad))) - # print("np.dot(np.dot(grad, hessian), grad) "+str(np.dot(np.dot(grad, hessian), grad))) - if enable_gradient: - # print("hessian " + str(hessian)) - check_positive_definite = np.dot(np.dot(grad, hessian), grad) - else: - check_positive_definite = np.dot( - np.multiply(grad, hessian), grad - ) + # logging.debug( + # "np.dot(np.multiply(grad, Hessian), grad) " + # + str(np.dot(np.multiply(grad, hessian), grad)) + # ) + # logging.debug( + # "np.dot(np.dot(grad, hessian), grad) " + # + str(np.dot(np.dot(grad, hessian), grad)) + # ) + dot_a = np.dot(grad, hessian) if self.enable_gradient else grad * hessian + + check_positive_definite: float = np.dot(dot_a, grad) + if check_positive_definite <= 0: - tau = 1 + tau = 1.0 else: - tau = min( - 1, norm(grad) ** 3 / (delta_k * check_positive_definite) - ) - # print("tau "+str(tau)) - grad = np.reshape(grad, (1, problem.dim))[0] + norm_ratio = norm(grad) ** 3 / (self.delta_k * check_positive_definite) + tau = min(1.0, float(norm_ratio)) + + grad: np.ndarray = np.reshape(grad, (1, self.problem.dim))[0] grad_norm = norm(grad) # Make sure we don't divide by 0 if grad_norm == 0: - candidate_x = incumbent_x + candidate_x = self.incumbent_x else: - product = tau * delta_k * grad + product = tau * self.delta_k * grad adjustment = product / grad_norm - candidate_x = incumbent_x - adjustment + candidate_x = self.incumbent_x - adjustment # if norm(incumbent_x - candidate_x) > 0: - # print("incumbent_x " + str(incumbent_x)) - # print("candidate_x " + str(candidate_x)) + # logging.debug("incumbent_x " + str(incumbent_x)) + # logging.debug("candidate_x " + str(candidate_x)) else: # Search engine - solve subproblem @@ -846,257 +908,231 @@ def subproblem(s: np.ndarray) -> float: def con_f(s: np.ndarray) -> float: return float(norm(s)) - nlc = NonlinearConstraint(con_f, 0, delta_k) + nlc = NonlinearConstraint(con_f, 0, self.delta_k) solve_subproblem = minimize( subproblem, - np.zeros(problem.dim), + np.zeros(self.problem.dim), method="trust-constr", constraints=nlc, ) - candidate_x = incumbent_x + solve_subproblem.x + candidate_x = self.incumbent_x + solve_subproblem.x - # print("problem.lower_bounds "+str(problem.lower_bounds)) + # logging.debug("problem.lower_bounds "+str(problem.lower_bounds)) # handle the box constraints - new_candidate_list = [] - for i in range(problem.dim): - if candidate_x[i] <= problem.lower_bounds[i]: - new_candidate_list.append(problem.lower_bounds[i] + 0.01) - elif candidate_x[i] >= problem.upper_bounds[i]: - new_candidate_list.append(problem.upper_bounds[i] - 0.01) - else: - new_candidate_list.append(candidate_x[i]) - candidate_x = tuple(new_candidate_list) + candidate_x = tuple( + clamp_with_epsilon( + float(candidate_x[i]), + self.problem.lower_bounds[i], + self.problem.upper_bounds[i], + ) + for i in range(self.problem.dim) + ) - # store the solution (and function estimate at it) to the subproblem as a candidate for the next iterate - candidate_solution = self.create_new_solution(candidate_x, problem) - visited_pts_list.append(candidate_solution) + # Store the solution (and function estimate at it) to the subproblem as a + # candidate for the next iterate + candidate_solution = self.create_new_solution(candidate_x, self.problem) + self.visited_pts_list.append(candidate_solution) - # if we use crn, then the candidate solution has the same sample size as the incumbent solution + # if we use crn, then the candidate solution has the same sample size as the + # incumbent solution if self.factors["crn_across_solns"]: - problem.simulate(candidate_solution, incumbent_solution.n_reps) - expended_budget += incumbent_solution.n_reps + num_sims = self.incumbent_solution.n_reps + self.problem.simulate(candidate_solution, num_sims) + self.expended_budget += num_sims else: - # pilot run and adaptive sampling - problem.simulate(candidate_solution, pilot_run) - expended_budget += pilot_run - sample_size = pilot_run - while True: - # if enable_gradient: - # # print("incumbent_solution.objectives_gradients_var[0] "+str(candidate_solution.objectives_gradients_var[0])) - # while norm(candidate_solution.objectives_gradients_var[0]) == 0 and candidate_solution.n_reps < max(pilot_run, lambda_max/100): - # problem.simulate(candidate_solution, 1) - # expended_budget += 1 - # sample_size += 1 - sig2 = candidate_solution.objectives_var[0] - if delta_power == 0: - sig2 = max( - sig2, - np.trace(candidate_solution.objectives_gradients_var), - ) - stopping = self.get_stopping_time( - pilot_run, sig2, delta_k, kappa, problem.dim, delta_power - ) - if ( - sample_size >= min(stopping, lambda_max) - or expended_budget >= budget_limit - ): - break - else: - problem.simulate(candidate_solution, 1) - expended_budget += 1 - sample_size += 1 + self.perform_adaptive_sampling(candidate_solution, pilot_run, self.delta_k) - # TODO: make sure the solution whose estimated objevtive is abrupted bc of budget is not added to the list of recommended solutions, unless the error is negligible ... + # TODO: make sure the solution whose estimated objevtive is abrupted bc of + # budget is not added to the list of recommended solutions, unless the error + # is negligible ... # if (expended_budget >= budget_limit) and (sample_size < stopping): # final_ob = fval[0] # else: # calculate success ratio - fval_tilde = -1 * problem.minmax[0] * candidate_solution.objectives_mean - # replace the candidate x if the interpolation set has lower objective function value and with sufficient reduction (pattern search) - # also if the candidate solution's variance is high that could be caused by stopping early due to exhausting budget - # print("cv "+str(candidate_solution.objectives_var/(candidate_solution.n_reps * candidate_solution.objectives_mean ** 2))) - # print("fval[0] - min(fval) "+str(fval[0] - min(fval))) - if not enable_gradient and ( - ( - (min(fval) < fval_tilde) - and ( - (fval[0] - min(fval)) - >= self.factors["ps_sufficient_reduction"] * delta_k**2 - ) - ) - or ( - ( - candidate_solution.objectives_var - / ( - candidate_solution.n_reps - * candidate_solution.objectives_mean**2 + fval_tilde = neg_minmax * candidate_solution.objectives_mean + # replace the candidate x if the interpolation set has lower objective function + # value and with sufficient reduction (pattern search) + # also if the candidate solution's variance is high that could be caused by + # stopping early due to exhausting budget + # logging.debug( + # "cv " + # + str( + # candidate_solution.objectives_var + # / (candidate_solution.n_reps * candidate_solution.objectives_mean**2) + # ) + # ) + # logging.debug("fval[0] - min(fval) " + str(fval[0] - min(fval))) + + if not self.enable_gradient: + min_fval = min(fval) + sufficient_reduction = (fval[0] - min_fval) >= self.factors[ + "ps_sufficient_reduction" + ] * self.delta_k**2 + + condition_met = min_fval < fval_tilde and sufficient_reduction + + high_variance = False + if not condition_met: + # Treat variance as low if mean is zero to avoid division by + # zero (zero mean typically indicates negligible uncertainty) + if candidate_solution.objectives_mean[0] == 0: + logging.debug( + "Candidate solution objectives_mean is zero, " + "skipping variance check." ) - )[0] - > 0.75 - ) - ): - fval_tilde = min(fval) - candidate_x = y_var[fval.index(min(fval))][0] # type: ignore - candidate_solution = interpolation_solns[fval.index(min(fval))] # type: ignore + else: + high_variance = ( + candidate_solution.objectives_var[0] + / ( + candidate_solution.n_reps + * candidate_solution.objectives_mean[0] ** 2 + ) + ) > 0.75 + + if condition_met or high_variance: + fval_tilde = min_fval + min_idx = fval.index(min_fval) + candidate_x = y_var[min_idx][0] + candidate_solution = interpolation_solns[min_idx] # compute the success ratio rho candidate_x_arr = np.array(candidate_x) - incumbent_x_arr = np.array(incumbent_x) + incumbent_x_arr = np.array(self.incumbent_x) s = np.subtract(candidate_x_arr, incumbent_x_arr) - if enable_gradient: - model_reduction = -np.dot(s, grad) - 0.5 * np.dot( - np.dot(s, hessian), s - ) + if self.enable_gradient: + model_reduction = -np.dot(s, grad) - 0.5 * np.dot(np.dot(s, hessian), s) else: model_reduction = self.evaluate_model( - np.zeros(problem.dim), - q, # type: ignore - ) - self.evaluate_model(s, q) # type: ignore - if model_reduction <= 0: - rho = 0 - else: - rho = (fval[0] - fval_tilde) / model_reduction + np.zeros(self.problem.dim), + q, + ) - self.evaluate_model(s, q) + rho = 0 if model_reduction <= 0 else (fval[0] - fval_tilde) / model_reduction + + successful = rho >= self.eta_1 # successful: accept - if rho >= eta_1: - incumbent_x = candidate_x - incumbent_solution = candidate_solution - final_ob = candidate_solution.objectives_mean - recommended_solns.append(candidate_solution) - intermediate_budgets.append(expended_budget) - delta_k = min(delta_k, delta_max) + if successful: + self.incumbent_x = candidate_x + self.incumbent_solution = candidate_solution + self.recommended_solns.append(candidate_solution) + self.intermediate_budgets.append(self.expended_budget) + self.delta_k = min(self.delta_k, self.delta_max) + # very successful: expand - if rho >= eta_2: - delta_k = min(gamma_1 * delta_k, delta_max) - if enable_gradient: - candidate_grad = ( - -1 - * problem.minmax[0] - * candidate_solution.objectives_gradients_mean[0] - ) - y_k = np.array( - candidate_grad - grad - ) # np.clip(candidate_grad - grad, 1e-5, np.inf) - # Compute the intermediate terms for the SMW update - y_ks = y_k @ s - if y_ks == 0: - warning_msg = ( - "Warning: Division by 0 in ASTRO-DF solver (y_ks == 0)." - ) - print(warning_msg, file=sys.stderr) - r_k = 0 - else: - r_k = 1.0 / (y_k @ s) - h_s_k = h_k @ s - h_k = ( - h_k - + np.outer(y_k, y_k) * r_k - - np.outer(h_s_k, h_s_k) / (s @ h_s_k) - ) # type: ignore - # unsuccessful: shrink and reject - else: - delta_k = min(gamma_2 * delta_k, delta_max) - final_ob = fval[0] + if rho >= self.eta_2: + self.delta_k = min(self.gamma_1 * self.delta_k, self.delta_max) - # TODO: unified TR management - # delta_k = min(kappa * norm(grad), delta_max) - # print("norm of grad "+str(norm(grad))) - return ( - final_ob, - delta_k, - recommended_solns, - intermediate_budgets, - expended_budget, - incumbent_x, - kappa, - incumbent_solution, - visited_pts_list, - h_k, - ) + if self.enable_gradient: + self.update_hessian(candidate_solution, grad, s) - def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: - """ - Run a single macroreplication of a solver on a problem. - Arguments - --------- - problem : Problem object - simulation-optimization problem to solve - crn_across_solns : bool - indicates if CRN are used when simulating different solutions - Returns - ------- - recommended_solns : list of Solution objects - list of solutions recommended throughout the budget - intermediate_budgets : list of ints - list of intermediate budgets when recommended solutions changes - """ + elif not successful: + self.delta_k = min(self.gamma_2 * self.delta_k, self.delta_max) - budget = problem.factors["budget"] + # TODO: unified TR management + # delta_k = min(kappa * norm(grad), self.delta_max) + # logging.debug("norm of grad "+str(norm(grad))) + + def _initialize_solving(self) -> None: + """Setup the solver for the first iteration.""" + self.budget: int = self.problem.factors["budget"] + self.eta_1: float = self.factors["eta_1"] + self.eta_2: float = self.factors["eta_2"] + self.gamma_1: float = self.factors["gamma_1"] + self.gamma_2: float = self.factors["gamma_2"] + self.easy_solve: bool = self.factors["easy_solve"] + self.reuse_points: bool = self.factors["reuse_points"] + self.lambda_min: int = self.factors["lambda_min"] + self.lambda_max = self.budget # Designate random number generator for random sampling - find_next_soln_rng = self.rng_list[1] - - # Generate many dummy solutions without replication only to find a reasonable maximum radius - dummy_solns: list[tuple[int, ...]] = [] - for _ in range(1000 * problem.dim): - random_soln = problem.get_random_solution(find_next_soln_rng) - dummy_solns.append(random_soln) - # Range for each dimension is calculated and compared with box constraints range if given - # TODO: just use box constraints range if given - # delta_max = min(self.factors["delta_max"], problem.upper_bounds[0] - problem.lower_bounds[0]) - delta_max_arr: list[float | int] = [] - for i in range(problem.dim): - delta_max_arr += [ - min( - max([sol[i] for sol in dummy_solns]) - - min([sol[i] for sol in dummy_solns]), - problem.upper_bounds[0] - problem.lower_bounds[0], - ) - ] - # TODO: update this so that it could be used for problems with decision variables at varying scales! - delta_max = max(delta_max_arr) - # print("delta_max " + str(delta_max)) - # Reset iteration and data storage arrays - visited_pts_list = [] - k = 0 - delta_k = 10 ** (ceil(log(delta_max * 2, 10) - 1) / problem.dim) - # print("initial delta " + str(delta_k)) - incumbent_x: tuple[int | float, ...] = problem.factors[ - "initial_solution" + rng = self.rng_list[1] + + # Generate dummy solutions to estimate a reasonable maximum radius + dummy_solns = [ + self.problem.get_random_solution(rng) + for _ in range(1000 * self.problem.dim) ] - expended_budget, kappa = 0, 0 - recommended_solns, intermediate_budgets = [], [] - incumbent_solution = self.create_new_solution( - tuple(incumbent_x), problem + + # Range for each dimension is calculated and compared with box constraints + # range if given + # TODO: just use box constraints range if given + # self.delta_max = min( + # self.factors["delta_max"], + # problem.upper_bounds[0] - problem.lower_bounds[0] + # ) + delta_max_candidates: list[float | int] = [] + for i in range(self.problem.dim): + sol_values = [sol[i] for sol in dummy_solns] + min_soln, max_soln = min(sol_values), max(sol_values) + bound_range = self.problem.upper_bounds[i] - self.problem.lower_bounds[i] + delta_max_candidates.append(min(max_soln - min_soln, bound_range)) + + # TODO: update this so that it could be used for problems with decision + # variables at varying scales! + self.delta_max = max(delta_max_candidates) + # logging.debug("delta_max " + str(self.delta_max)) + + # Initialize trust-region radius + self.delta_k = 10 ** (ceil(log(self.delta_max * 2, 10) - 1) / self.problem.dim) + # logging.debug("initial delta " + str(self.delta_k)) + + if "initial_solution" in self.problem.factors: + self.incumbent_x = tuple(self.problem.factors["initial_solution"]) + else: + self.incumbent_x = tuple(self.problem.get_random_solution(rng)) + + self.incumbent_solution = self.create_new_solution( + self.incumbent_x, self.problem ) - h_k = np.identity(problem.dim).tolist() + self.h_k = np.identity(self.problem.dim) - while expended_budget < budget: - k += 1 - ( - final_ob, - delta_k, - recommended_solns, - intermediate_budgets, - expended_budget, - incumbent_x, - kappa, - incumbent_solution, - visited_pts_list, - h_k, - ) = self.iterate( - k, - delta_k, - delta_max, - problem, - visited_pts_list, - incumbent_x, - expended_budget, - budget, - recommended_solns, - intermediate_budgets, - kappa, - incumbent_solution, - h_k, # type: ignore - ) + self.enable_gradient = ( + self.problem.gradient_available and self.factors["use_gradients"] + ) + + if self.factors["crn_across_solns"]: + self.delta_power = 0 if self.enable_gradient else 2 + else: + self.delta_power = 4 + + # Reset iteration count and data storage + self.iteration_count = 0 + self.expended_budget = 0 + self.recommended_solns = [] + self.intermediate_budgets = [] + self.visited_pts_list = [] + self.kappa = None + + @override + def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: + self.problem = problem + self._initialize_solving() - return recommended_solns, intermediate_budgets + while self.expended_budget < self.budget: + self.iterate() + + return self.recommended_solns, self.intermediate_budgets + + +def clamp_with_epsilon( + val: float, lower_bound: float, upper_bound: float, epsilon: float = 0.01 +) -> float: + """Clamp a value within bounds while avoiding exact boundary values. + + Adds a small epsilon to the lower bound or subtracts it from the upper bound + if `val` lies outside the specified range. + + Args: + val (float): The value to clamp. + lower_bound (float): Minimum acceptable value. + upper_bound (float): Maximum acceptable value. + epsilon (float, optional): Small margin to avoid returning exact boundary + values. Defaults to 0.01. + + Returns: + float: The adjusted value, guaranteed to lie strictly within the bounds. + """ + if val <= lower_bound: + return lower_bound + epsilon + if val >= upper_bound: + return upper_bound - epsilon + return val diff --git a/simopt/solvers/neldmd.py b/simopt/solvers/neldmd.py index 07af9ca45..cb0060d5d 100644 --- a/simopt/solvers/neldmd.py +++ b/simopt/solvers/neldmd.py @@ -1,15 +1,14 @@ -""" -Summary -------- -Nelder-Mead: An algorithm that maintains a simplex of points that moves around the feasible -region according to certain geometric operations: reflection, expansion, -contraction, and shrinking. -A detailed description of the solver can be found +"""Nelder-Mead Algorithm. + +Nelder-Mead: An algorithm that maintains a simplex of points that moves around the +feasible region according to certain geometric operations: reflection, expansion, +contraction, and shrinking. A detailed description of the solver can be found `here `__. """ from __future__ import annotations +from collections.abc import Iterable from typing import Callable import numpy as np @@ -22,65 +21,50 @@ Solver, VariableType, ) +from simopt.utils import classproperty, override class NelderMead(Solver): - """The Nelder-Mead algorithm, which maintains a simplex of points that moves around the feasible - region according to certain geometric operations: reflection, expansion, - contraction, and shrinking. - - Attributes - ---------- - name : string - name of solver - objective_type : string - description of objective types: - "single" or "multi" - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - gradient_needed : bool - indicates if gradient of objective function is needed - factors : dict - changeable factors (i.e., parameters) of the solver - specifications : dict - details of each factor (for GUI, data validation, and defaults) - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used for the solver's internal purposes - - Arguments - --------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver - - See also - -------- - base.Solver + """Nelder-Mead Algorithm. + + The Nelder-Mead algorithm, which maintains a simplex of points that moves around + the feasible region according to certain geometric operations: reflection, + expansion, contraction, and shrinking. """ - @property - def objective_type(self) -> ObjectiveType: + @classproperty + @override + def class_name_abbr(cls) -> str: + return "NELDMD" + + @classproperty + @override + def class_name(cls) -> str: + return "Nelder-Mead" + + @classproperty + @override + def objective_type(cls) -> ObjectiveType: return ObjectiveType.SINGLE - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_needed(self) -> bool: + @classproperty + @override + def gradient_needed(cls) -> bool: return False - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "crn_across_solns": { "description": "use CRN across solutions?", @@ -118,145 +102,138 @@ def specifications(self) -> dict[str, dict]: "default": 10 ** (-7), }, "initial_spread": { - "description": "fraction of the distance between bounds used to select initial points", + "description": ( + "fraction of the distance between bounds used to select initial " + "points" + ), "datatype": float, "default": 1 / 10, }, } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "crn_across_solns": self.check_crn_across_solns, - "r": self.check_r, - "alpha": self.check_alpha, - "gammap": self.check_gammap, - "betap": self.check_betap, - "delta": self.check_delta, - "sensitivity": self.check_sensitivity, - "initial_spread": self.check_initial_spread, + "r": self._check_r, + "alpha": self._check_alpha, + "gammap": self._check_gammap, + "betap": self._check_betap, + "delta": self._check_delta, + "sensitivity": self._check_sensitivity, + "initial_spread": self._check_initial_spread, } - def __init__( - self, name: str = "NELDMD", fixed_factors: dict | None = None - ) -> None: + def __init__(self, name: str = "NELDMD", fixed_factors: dict | None = None) -> None: + """Initialize the Nelder-Mead solver. + + Args: + name (str): Name of the solver. + fixed_factors (dict, optional): Fixed factors for the solver. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(name, fixed_factors) - def check_r(self) -> None: + def _check_r(self) -> None: if self.factors["r"] <= 0: raise ValueError( - "The number of replications taken at each solution must be greater than 0." + "The number of replications taken at each solution must be greater " + "than 0." ) - def check_alpha(self) -> None: + def _check_alpha(self) -> None: if self.factors["alpha"] <= 0: raise ValueError("Alpha must be greater than 0.") - def check_gammap(self) -> None: + def _check_gammap(self) -> None: if self.factors["gammap"] <= 1: raise ValueError("Gammap must be greater than 1.") - def check_betap(self) -> None: + def _check_betap(self) -> None: if (self.factors["betap"] <= 0) or (self.factors["betap"] >= 1): raise ValueError("betap must be between 0 and 1.") - def check_delta(self) -> None: + def _check_delta(self) -> None: if (self.factors["delta"] <= 0) or (self.factors["delta"] >= 1): raise ValueError("Delta must be between 0 and 1.") - def check_sensitivity(self) -> None: + def _check_sensitivity(self) -> None: if self.factors["sensitivity"] <= 0: raise ValueError("Sensitivity must be greater than 0.") - def check_initial_spread(self) -> None: + def _check_initial_spread(self) -> None: if self.factors["initial_spread"] <= 0: raise ValueError("Initial spread must be greater than 0.") + @override def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: - """ - Run a single macroreplication of a solver on a problem. - - Arguments - --------- - problem : Problem object - simulation-optimization problem to solve - - Returns - ------- - recommended_solns : list of Solution objects - list of solutions recommended throughout the budget - intermediate_budgets : list of ints - list of intermediate budgets when recommended solutions changes - """ # Designate random number generator for random sampling. get_rand_soln_rng = self.rng_list[1] n_pts = problem.dim + 1 + # Check for sufficiently large budget. if problem.factors["budget"] < self.factors["r"] * n_pts: - err_msg = ( - "Budget is too small for a good quality run of Nelder-Mead." - ) + err_msg = "Budget is too small for a good quality run of Nelder-Mead." raise ValueError(err_msg) + # Shrink variable bounds to avoid floating errors. - if ( - problem.lower_bounds is not None - and problem.lower_bounds != (-np.inf,) * problem.dim - ): - self.lower_bounds = tuple( - map( - lambda i: i + self.factors["sensitivity"], - problem.lower_bounds, - ) + if problem.lower_bounds and not np.all(np.isneginf(problem.lower_bounds)): + self.lower_bounds = ( + np.array(problem.lower_bounds) + self.factors["sensitivity"] ) else: self.lower_bounds = None - if ( - problem.upper_bounds is not None - and problem.upper_bounds != (np.inf,) * problem.dim - ): - self.upper_bounds = tuple( - map( - lambda i: i - self.factors["sensitivity"], - problem.upper_bounds, - ) + + if problem.upper_bounds and not np.all(np.isposinf(problem.upper_bounds)): + self.upper_bounds = ( + np.array(problem.upper_bounds) - self.factors["sensitivity"] ) else: self.upper_bounds = None + # Initial dim + 1 points. - sol = [] - sol.append( - self.create_new_solution( - problem.factors["initial_solution"], problem - ) - ) + sol = [self.create_new_solution(problem.factors["initial_solution"], problem)] + if self.lower_bounds is None or self.upper_bounds is None: - for _ in range(1, n_pts): - rand_x = problem.get_random_solution(get_rand_soln_rng) - sol.append(self.create_new_solution(rand_x, problem)) + sol.extend( + self.create_new_solution( + problem.get_random_solution(get_rand_soln_rng), problem + ) + for _ in range(1, n_pts) + ) else: # Restrict starting shape/location. - for i in range(problem.dim): - distance = ( - self.upper_bounds[i] - self.lower_bounds[i] - ) * self.factors["initial_spread"] - new_pt = list(problem.factors["initial_solution"]) - new_pt[i] += distance - # Try opposite direction if out of bounds. - if ( - new_pt[i] > self.upper_bounds[i] - or new_pt[i] < self.lower_bounds[i] - ): - new_pt[i] -= 2 * distance - # Set to bound if neither direction works. - if ( - new_pt[i] > self.upper_bounds[i] - or new_pt[i] < self.lower_bounds[i] - ): - if problem.minmax[i] == -1: - new_pt[i] = self.lower_bounds[i] - else: - new_pt[i] = self.upper_bounds[i] - sol.append(self.create_new_solution(tuple(new_pt), problem)) + initial_solution = np.array( + problem.factors["initial_solution"], dtype=float + ) + distances = (self.upper_bounds - self.lower_bounds) * self.factors[ + "initial_spread" + ] + + # Generate new points + new_pts = np.tile(initial_solution, (problem.dim, 1)) + new_pts[np.arange(problem.dim), np.arange(problem.dim)] += distances + + # Apply boundary conditions + out_of_bounds = (new_pts > self.upper_bounds) | ( + new_pts < self.lower_bounds + ) + if np.any(out_of_bounds): + new_pts[out_of_bounds] -= 2 * distances + + # If still out of bounds, set to nearest bound + out_of_bounds = (new_pts > self.upper_bounds) | ( + new_pts < self.lower_bounds + ) + if np.any(out_of_bounds): + new_pts[out_of_bounds] = np.where( + problem.minmax[np.newaxis, :] == -1, + self.lower_bounds, + self.upper_bounds, + ) + + sol.extend(self.create_new_solution(pt, problem) for pt in new_pts) # Initialize lists to track budget and best solutions. intermediate_budgets = [] @@ -268,164 +245,97 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: # Start Solving. # Evaluate solutions in initial structure. for solution in sol: - problem.simulate(solution, self.factors["r"]) - budget_spent += self.factors["r"] + problem.simulate(solution, r) + budget_spent += r # Record initial solution data. intermediate_budgets.append(0) recommended_solns.append(sol[0]) # Sort solutions by obj function estimate. - sort_sol = self.sort_and_end_update(problem, sol) + sort_sol = self._sort_and_end_update(problem, sol) # Maximization problem is converted to minimization by using minmax. while budget_spent <= problem.factors["budget"]: - # Reflect worst and update sort_sol. - p_high = sort_sol[-1] # Current worst point. - p_cent = tuple( - np.mean(tuple([s.x for s in sort_sol[0:-1]]), axis=0) - ) # Centroid for other pts. - orig_pt = p_high # Save the original point. - p_refl = tuple( - map( - lambda i, j: i - j, - tuple((1 + self.factors["alpha"]) * i for i in p_cent), - tuple(self.factors["alpha"] * i for i in p_high.x), + # Shrink towards best if out of bounds. + while True: + # Reflect worst and update sort_sol. + p_high = sort_sol[-1] # Current worst point. + p_high_x = np.array(p_high.x) + p_cent = np.mean([s.x for s in sort_sol[:-1]], axis=0) + p_refl = np.array( + (1 + self.factors["alpha"]) * p_cent + - self.factors["alpha"] * p_high_x ) - ) # Reflection. - p_refl_copy = p_refl - p_refl = self.check_const(p_refl, orig_pt.x) - # Shrink towards best if out of bounds. - if p_refl != p_refl_copy: - while p_refl != p_refl_copy: - p_low = sort_sol[0] - for i in range(1, len(sort_sol)): - p_new2 = p_low - p_new = tuple( - map( - lambda i, j: i + j, - tuple( - self.factors["delta"] * i - for i in sort_sol[i].x - ), - tuple( - (1 - self.factors["delta"]) * i - for i in p_low.x - ), - ) - ) - p_new = self.check_const(p_new, p_new2.x) - p_new = Solution(p_new, problem) - p_new.attach_rngs( - rng_list=self.solution_progenitor_rngs, copy=True - ) - problem.simulate(p_new, r) - budget_spent += r + # Check if reflection point is within bounds. + if np.equal(p_refl, self._check_const(p_refl, p_high_x)).all(): + break - # Update sort_sol. - sort_sol[i] = p_new # p_new replaces pi. + sol_0_x = np.array(sort_sol[0].x) + for i in range(1, len(sort_sol)): + p_new = ( + self.factors["delta"] * np.array(sort_sol[i].x) + + (1 - self.factors["delta"]) * sol_0_x + ) + p_new = self._check_const(p_new, sol_0_x) + p_new = Solution(p_new, problem) + p_new.attach_rngs(rng_list=self.solution_progenitor_rngs, copy=True) + problem.simulate(p_new, r) + budget_spent += r - # Sort & end updating. - sort_sol = self.sort_and_end_update(problem, sort_sol) - - p_high = sort_sol[-1] # Current worst point. - p_cent = tuple( - np.mean(tuple([s.x for s in sort_sol[0:-1]]), axis=0) - ) # Centroid for other pts. - orig_pt = p_high # Save the original point. - p_refl = tuple( - map( - lambda i, j: i - j, - tuple( - (1 + self.factors["alpha"]) * i for i in p_cent - ), - tuple(self.factors["alpha"] * i for i in p_high.x), - ) - ) # Reflection. - p_refl_copy = p_refl - p_refl = self.check_const(p_refl, orig_pt.x) + # Update sort_sol. + sort_sol[i] = p_new # p_new replaces pi. + + # Sort & end updating. + sort_sol = self._sort_and_end_update(problem, sort_sol) # Evaluate reflected point. + p_refl = tuple(p_refl.tolist()) p_refl = Solution(p_refl, problem) - p_refl.attach_rngs( - rng_list=self.solution_progenitor_rngs, copy=True - ) + p_refl.attach_rngs(rng_list=self.solution_progenitor_rngs, copy=True) problem.simulate(p_refl, r) budget_spent += r - refl_fn_val = ( - tuple([-1 * i for i in problem.minmax]) * p_refl.objectives_mean - ) + np_minmax = np.array(problem.minmax) + refl_fn_val = np_minmax * -p_refl.objectives_mean # Track best, worst, and second worst points. p_low = sort_sol[0] # Current best pt. - fn_low = ( - tuple([-1 * i for i in problem.minmax]) - * sort_sol[0].objectives_mean - ) - fn_sec = ( - tuple([-1 * i for i in problem.minmax]) - * sort_sol[-2].objectives_mean - ) # Current 2nd worst obj fn. - fn_high = ( - tuple([-1 * i for i in problem.minmax]) - * sort_sol[-1].objectives_mean - ) # Worst obj fn from unreflected structure. + inv_minmax = np_minmax * -1 + fn_low = inv_minmax * sort_sol[0].objectives_mean + fn_sec = inv_minmax * sort_sol[-2].objectives_mean + fn_high = inv_minmax * sort_sol[-1].objectives_mean # Check if accept reflection. if fn_low <= refl_fn_val and refl_fn_val <= fn_sec: - sort_sol[-1] = ( - p_refl # The new point replaces the previous worst. - ) - + # The new point replaces the previous worst. + sort_sol[-1] = p_refl # Sort & end updating. - sort_sol = self.sort_and_end_update(problem, sort_sol) - + sort_sol = self._sort_and_end_update(problem, sort_sol) # Best solution remains the same, so no reporting. # Check if accept expansion (of reflection in the same direction). elif refl_fn_val < fn_low: - p_exp2 = p_refl - p_exp = tuple( - map( - lambda i, j: i + j, - tuple(self.factors["gammap"] * i for i in p_refl.x), - tuple((1 - self.factors["gammap"]) * i for i in p_cent), - ) - ) - p_exp = self.check_const(p_exp, p_exp2.x) + p_exp = self.factors["gammap"] * np.array(p_refl.x) + ( + 1 - self.factors["gammap"] + ) * np.array(p_cent) + p_exp = self._check_const(p_exp, p_refl.x) # Evaluate expansion point. p_exp = Solution(p_exp, problem) - p_exp.attach_rngs( - rng_list=self.solution_progenitor_rngs, copy=True - ) + p_exp.attach_rngs(rng_list=self.solution_progenitor_rngs, copy=True) problem.simulate(p_exp, r) budget_spent += r - exp_fn_val = ( - tuple([-1 * i for i in problem.minmax]) - * p_exp.objectives_mean - ) + exp_fn_val = inv_minmax * p_exp.objectives_mean # Check if expansion point is an improvement relative to simplex. - if exp_fn_val < fn_low: - sort_sol[-1] = p_exp # p_exp replaces p_high. + sort_sol[-1] = p_exp if exp_fn_val < fn_low else p_refl - # Sort & end updating. - sort_sol = self.sort_and_end_update(problem, sort_sol) - - # Record data from expansion point (new best). - if budget_spent <= problem.factors["budget"]: - intermediate_budgets.append(budget_spent) - recommended_solns.append(p_exp) - else: - sort_sol[-1] = p_refl # p_refl replaces p_high. - - # Sort & end updating. - sort_sol = self.sort_and_end_update(problem, sort_sol) + # Sort & end updating. + sort_sol = self._sort_and_end_update(problem, sort_sol) - # Record data from expansion point (new best). - if budget_spent <= problem.factors["budget"]: - intermediate_budgets.append(budget_spent) - recommended_solns.append(p_refl) + # Record data if within budget. + if budget_spent <= problem.factors["budget"]: + intermediate_budgets.append(budget_spent) + recommended_solns.append(p_exp if exp_fn_val < fn_low else p_refl) # Check if accept contraction or shrink. elif refl_fn_val > fn_sec: @@ -435,123 +345,138 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: # Attempt contraction or shrinking. p_cont2 = p_high - p_cont = tuple( - map( - lambda i, j: i + j, - tuple(self.factors["betap"] * i for i in p_high.x), - tuple((1 - self.factors["betap"]) * i for i in p_cent), - ) - ) - p_cont = self.check_const(p_cont, p_cont2.x) + p_cont = self.factors["betap"] * np.array(p_high.x) + ( + 1 - self.factors["betap"] + ) * np.array(p_cent) + p_cont = self._check_const(p_cont, p_cont2.x) # Evaluate contraction point. p_cont = Solution(p_cont, problem) - p_cont.attach_rngs( - rng_list=self.solution_progenitor_rngs, copy=True - ) + p_cont.attach_rngs(rng_list=self.solution_progenitor_rngs, copy=True) problem.simulate(p_cont, r) budget_spent += r - cont_fn_val = ( - tuple([-1 * i for i in problem.minmax]) - * p_cont.objectives_mean - ) + cont_fn_val = inv_minmax * p_cont.objectives_mean # Accept contraction. if cont_fn_val <= fn_high: sort_sol[-1] = p_cont # p_cont replaces p_high. # Sort & end updating. - sort_sol = self.sort_and_end_update(problem, sort_sol) + sort_sol = self._sort_and_end_update(problem, sort_sol) # Check if contraction point is new best. - if cont_fn_val < fn_low: + if ( + cont_fn_val < fn_low + and budget_spent <= problem.factors["budget"] + ): # Record data from contraction point (new best). - if budget_spent <= problem.factors["budget"]: - intermediate_budgets.append(budget_spent) - recommended_solns.append(p_cont) - else: # Contraction fails -> simplex shrinks by delta with p_low fixed. + intermediate_budgets.append(budget_spent) + recommended_solns.append(p_cont) + # Contraction fails -> simplex shrinks by delta with p_low fixed. + else: + # Set pre-loop variables sort_sol[-1] = p_high # Replaced by p_refl. - - # Check for new best. - new_best = 0 - + is_new_best = False + p_low_x = np.array(p_low.x) for i in range(1, len(sort_sol)): - p_new2 = p_low - p_new = tuple( - map( - lambda i, j: i + j, - tuple( - self.factors["delta"] * i - for i in sort_sol[i].x - ), - tuple( - (1 - self.factors["delta"]) * i - for i in p_low.x - ), - ) + p_new = ( + self.factors["delta"] * np.array(sort_sol[i].x) + + (1 - self.factors["delta"]) * p_low_x ) - p_new = self.check_const(p_new, p_new2.x) + p_new = self._check_const(p_new, p_low.x) + p_new = Solution(p_new, problem) p_new.attach_rngs( rng_list=self.solution_progenitor_rngs, copy=True ) problem.simulate(p_new, r) budget_spent += r - new_fn_val = ( - tuple([-1 * i for i in problem.minmax]) - * p_new.objectives_mean - ) + new_fn_val = inv_minmax * p_new.objectives_mean # Check for new best. if new_fn_val <= fn_low: - new_best = 1 + is_new_best = True # Update sort_sol. sort_sol[i] = p_new # p_new replaces pi. # Sort & end updating. - sort_sol = self.sort_and_end_update(problem, sort_sol) + sort_sol = self._sort_and_end_update(problem, sort_sol) # Record data if there is a new best solution in the contraction. - if ( - new_best == 1 - and budget_spent <= problem.factors["budget"] - ): + if is_new_best and budget_spent <= problem.factors["budget"]: intermediate_budgets.append(budget_spent) recommended_solns.append(sort_sol[0]) return recommended_solns, intermediate_budgets - # HELPER FUNCTIONS - - def sort_and_end_update( - self, problem: Problem, sol: list[Solution] + def _sort_and_end_update( + self, problem: Problem, sol: Iterable[Solution] ) -> list[Solution]: - sort_sol = sorted( + """Sort solutions by objective values, accounting for minimization/maximization. + + Args: + problem (Problem): The simulation-optimization problem defining the + objective direction (minimize or maximize). + sol (Iterable[Solution]): An iterable of solutions to be sorted. + + Returns: + list[Solution]: A list of solutions sorted according to their + objective values. + """ + minmax_array = np.array(problem.minmax) + return sorted( sol, - key=lambda s: tuple([-1 * i for i in problem.minmax]) - * s.objectives_mean, + key=lambda s: np.dot(minmax_array, s.objectives_mean), + reverse=True, ) - return sort_sol - def check_const(self, pt: tuple, pt2: tuple) -> tuple: - """ - Check & modify (if needed) the new point based on bounds. + def _check_const( + self, new_point: Iterable[float], reference_point: Iterable[float] + ) -> tuple: + """Adjust a point to ensure it remains within the specified bounds. + + Args: + new_point (Iterable[float]): The proposed new point to be checked and + adjusted if necessary. + reference_point (Iterable[float]): The original reference point used to + compute movement direction. + + Returns: + tuple: The modified point that adheres to the given bounds. """ - col = len(pt2) - step = tuple(map(lambda i, j: i - j, pt, pt2)) - tmax = np.ones(col) - for i in range(col): - if step[i] > 0 and self.upper_bounds is not None: # Move pt to ub. - tmax[i] = (self.upper_bounds[i] - pt2[i]) / step[i] - elif ( - step[i] < 0 and self.lower_bounds is not None - ): # Move pt to lb. - tmax[i] = (self.lower_bounds[i] - pt2[i]) / step[i] - t = min(1, min(tmax)) - modified = list(map(lambda i, j: i + t * j, pt2, step)) - # Remove rounding error. - for i in range(col): - if abs(modified[i]) < self.factors["sensitivity"]: - modified[i] = 0 - return tuple(modified) + # Make sure everything is a NumPy array + new_point = np.array(new_point) + reference_point = np.array(reference_point) + # Create or compute the other variables we need + step = new_point - reference_point + tmin = 1 + + # Apply bounding constraints using NumPy masks + if self.upper_bounds is not None: + mask = step > 0 + if np.any(mask): + tmin = min( + tmin, + np.min( + (self.upper_bounds[mask] - reference_point[mask]) / step[mask] + ), + ) + + if self.lower_bounds is not None: + mask = step < 0 + if np.any(mask): + tmin = min( + tmin, + np.min( + (self.lower_bounds[mask] - reference_point[mask]) / step[mask] + ), + ) + + # Compute the modified point + adjusted_point = reference_point + tmin * step + + # Remove rounding errors + adjusted_point[np.abs(adjusted_point) < self.factors["sensitivity"]] = 0 + + return tuple(adjusted_point.tolist()) diff --git a/simopt/solvers/randomsearch.py b/simopt/solvers/randomsearch.py index 78573bea0..1fe749f74 100644 --- a/simopt/solvers/randomsearch.py +++ b/simopt/solvers/randomsearch.py @@ -1,6 +1,5 @@ -""" -Summary -------- +"""Random Search Solver. + Randomly sample solutions from the feasible region. Can handle stochastic constraints. A detailed description of the solver can be found `here `__. @@ -18,65 +17,49 @@ Solver, VariableType, ) +from simopt.utils import classproperty, override class RandomSearch(Solver): - """ + """Random Search Solver. + A solver that randomly samples solutions from the feasible region. Take a fixed number of replications at each solution. - - Attributes - ---------- - name : string - name of solver - objective_type : string - description of objective types: - "single" or "multi" - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - gradient_needed : bool - indicates if gradient of objective function is needed - factors : dict - changeable factors (i.e., parameters) of the solver - specifications : dict - details of each factor (for GUI, data validation, and defaults) - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used for the solver's internal purposes - - Arguments - --------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver - - See also - -------- - base.Solver """ - @property - def objective_type(self) -> ObjectiveType: + @classproperty + @override + def class_name_abbr(cls) -> str: + return "RNDSRCH" + + @classproperty + @override + def class_name(cls) -> str: + return "Random Search" + + @classproperty + @override + def objective_type(cls) -> ObjectiveType: return ObjectiveType.SINGLE - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.STOCHASTIC - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.MIXED - @property - def gradient_needed(self) -> bool: + @classproperty + @override + def gradient_needed(cls) -> bool: return False - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "crn_across_solns": { "description": "use CRN across solutions?", @@ -91,75 +74,66 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "crn_across_solns": self.check_crn_across_solns, - "sample_size": self.check_sample_size, + "sample_size": self._check_sample_size, } def __init__( self, name: str = "RNDSRCH", fixed_factors: dict | None = None ) -> None: + """Initialize Random Search solver. + + Args: + name (str): user-specified name for solver + fixed_factors (dict, optional): fixed_factors of the solver. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(name, fixed_factors) - def check_sample_size(self) -> None: + def _check_sample_size(self) -> None: if self.factors["sample_size"] <= 0: raise ValueError("Sample size must be greater than 0.") + @override def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: - """ - Run a single macroreplication of a solver on a problem. - - Arguments - --------- - problem : Problem object - simulation-optimization problem to solve - crn_across_solns : bool - indicates if CRN are used when simulating different solutions - - Returns - ------- - recommended_solns : list of Solution objects - list of solutions recommended throughout the budget - intermediate_budgets : list of ints - list of intermediate budgets when recommended solutions changes - """ - recommended_solns = [] - intermediate_budgets = [] - expended_budget = 0 # Designate random number generator for random sampling. find_next_soln_rng = self.rng_list[1] + # Start at initial solution and record as best. + new_x = problem.factors["initial_solution"] + new_solution = self.create_new_solution(new_x, problem) + best_solution = new_solution + recommended_solns = [new_solution] + # Initialize budget and record initial expenditure. + expended_budget = 0 + intermediate_budgets = [expended_budget] + # Prepare other variables in the loop. + sample_size = self.factors["sample_size"] + stoch_constraint_range = range(problem.n_stochastic_constraints) # Sequentially generate random solutions and simulate them. - best_solution = None - while expended_budget < problem.factors["budget"]: - if expended_budget == 0: - # Start at initial solution and record as best. - new_x = problem.factors["initial_solution"] - new_solution = self.create_new_solution(new_x, problem) - best_solution = new_solution - recommended_solns.append(new_solution) - intermediate_budgets.append(expended_budget) - else: - # Identify new solution to simulate. - new_x = problem.get_random_solution(find_next_soln_rng) - new_solution = self.create_new_solution(new_x, problem) + while True: # Simulate new solution and update budget. - problem.simulate(new_solution, self.factors["sample_size"]) - expended_budget += self.factors["sample_size"] + problem.simulate(new_solution, sample_size) + expended_budget += sample_size # Check for improvement relative to incumbent best solution. # Also check for feasibility w.r.t. stochastic constraints. - if ( - best_solution is not None - and problem.minmax * new_solution.objectives_mean - > problem.minmax * best_solution.objectives_mean - and all( - new_solution.stoch_constraints_mean[idx] <= 0 - for idx in range(problem.n_stochastic_constraints) - ) + mean_diff = new_solution.objectives_mean - best_solution.objectives_mean + if all(problem.minmax * mean_diff > 0) and all( + new_solution.stoch_constraints_mean[idx] <= 0 + for idx in stoch_constraint_range ): # If better, record incumbent solution as best. best_solution = new_solution recommended_solns.append(new_solution) intermediate_budgets.append(expended_budget) - return recommended_solns, intermediate_budgets + + # Check if budget is exceeded. + if expended_budget >= problem.factors["budget"]: + return recommended_solns, intermediate_budgets + + # Identify new solution to simulate for next iteration. + new_x = problem.get_random_solution(find_next_soln_rng) + new_solution = self.create_new_solution(new_x, problem) diff --git a/simopt/solvers/spsa.py b/simopt/solvers/spsa.py index 4d9399869..b427bcd0e 100644 --- a/simopt/solvers/spsa.py +++ b/simopt/solvers/spsa.py @@ -1,15 +1,15 @@ -""" -Summary -------- -Simultaneous perturbation stochastic approximation (SPSA) is an algorithm for optimizing systems with multiple unknown parameters. +"""Simultaneous Perturbation Stochastic Approximation (SPSA) Solver. + +Simultaneous perturbation stochastic approximation (SPSA) is an algorithm for +optimizing systems with multiple unknown parameters. """ from __future__ import annotations -import sys from typing import Callable import numpy as np +from numpy.typing import NDArray from simopt.base import ( ConstraintType, @@ -19,64 +19,39 @@ Solver, VariableType, ) +from simopt.utils import classproperty, make_nonzero, override class SPSA(Solver): - """ - Simultaneous perturbation stochastic approximation (SPSA) is an algorithm for optimizing systems with multiple unknown parameters. - - Attributes - ---------- - name : string - name of solver - objective_type : string - description of objective types: - "single" or "multi" - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - gradient_needed : bool - indicates if gradient of objective function is needed - factors : dict - changeable factors (i.e., parameters) of the solver - specifications : dict - details of each factor (for GUI, data validation, and defaults) - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used for the solver's internal purposes - - Parameters - ---------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver - - See also - -------- - base.Solver + """Simultaneous Perturbation Stochastic Approximation (SPSA) Solver. + + Simultaneous perturbation stochastic approximation (SPSA) is an algorithm for + optimizing systems with multiple unknown parameters. """ - @property - def objective_type(self) -> ObjectiveType: + @classproperty + @override + def objective_type(cls) -> ObjectiveType: return ObjectiveType.SINGLE - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_needed(self) -> bool: + @classproperty + @override + def gradient_needed(cls) -> bool: return False - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "crn_across_solns": { "description": "use CRN across solutions?", @@ -84,7 +59,9 @@ def specifications(self) -> dict[str, dict]: "default": True, }, "alpha": { - "description": "non-negative coefficient in the SPSA gain sequecence ak", + "description": ( + "non-negative coefficient in the SPSA gain sequecence ak" + ), "datatype": float, "default": 0.602, }, @@ -94,7 +71,9 @@ def specifications(self) -> dict[str, dict]: "default": 0.101, }, "step": { - "description": "initial desired magnitude of change in the theta elements", + "description": ( + "initial desired magnitude of change in the theta elements" + ), "datatype": float, "default": 0.1, }, @@ -109,121 +88,123 @@ def specifications(self) -> dict[str, dict]: "default": 30, }, "n_loss": { - "description": "number of loss function evaluations used in this gain calculation", + "description": ( + "number of loss function evaluations used in this gain calculation" + ), "datatype": int, "default": 2, }, "eval_pct": { - "description": "percentage of the expected number of loss evaluations per run", + "description": ( + "percentage of the expected number of loss evaluations per run" + ), "datatype": float, "default": 2 / 3, }, "iter_pct": { - "description": "percentage of the maximum expected number of iterations", + "description": ( + "percentage of the maximum expected number of iterations" + ), "datatype": float, "default": 0.1, }, } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "crn_across_solns": self.check_crn_across_solns, - "alpha": self.check_alpha, - "gamma": self.check_gamma, - "step": self.check_step, - "gavg": self.check_gavg, - "n_reps": self.check_n_reps, - "n_loss": self.check_n_loss, - "eval_pct": self.check_eval_pct, - "iter_pct": self.check_iter_pct, + "alpha": self._check_alpha, + "gamma": self._check_gamma, + "step": self._check_step, + "gavg": self._check_gavg, + "n_reps": self._check_n_reps, + "n_loss": self._check_n_loss, + "eval_pct": self._check_eval_pct, + "iter_pct": self._check_iter_pct, } - def __init__( - self, name: str = "SPSA", fixed_factors: dict | None = None - ) -> None: + def __init__(self, name: str = "SPSA", fixed_factors: dict | None = None) -> None: + """Initialize the SPSA solver. + + Args: + name (str): Name of the solver. + fixed_factors (dict, optional): Fixed factors for the solver. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(name, fixed_factors) - def check_alpha(self) -> None: + def _check_alpha(self) -> None: if self.factors["alpha"] <= 0: raise ValueError("Alpha must be greater than 0.") - def check_gamma(self) -> None: + def _check_gamma(self) -> None: if self.factors["gamma"] <= 0: raise ValueError("Gamma must be greater than 0.") - def check_step(self) -> None: + def _check_step(self) -> None: if self.factors["step"] <= 0: raise ValueError("Step must be greater than 0.") - def check_gavg(self) -> None: + def _check_gavg(self) -> None: if self.factors["gavg"] <= 0: raise ValueError("gavg must be greater than 0.") - def check_n_reps(self) -> None: + def _check_n_reps(self) -> None: if self.factors["n_reps"] <= 0: raise ValueError( - "The number of replications taken at each solution must be greater than 0." + "The number of replications taken at each solution must be greater " + "than 0." ) - def check_n_loss(self) -> None: + def _check_n_loss(self) -> None: if self.factors["n_loss"] <= 0: raise ValueError("n_loss must be greater than 0.") - def check_eval_pct(self) -> None: - if 0 >= self.factors["eval_pct"] or self.factors["eval_pct"] > 1: + def _check_eval_pct(self) -> None: + if self.factors["eval_pct"] <= 0 or self.factors["eval_pct"] > 1: raise ValueError("eval_pct must be between 0 and 1.") - def check_iter_pct(self) -> None: - if 0 >= self.factors["iter_pct"] or self.factors["iter_pct"] > 1: + def _check_iter_pct(self) -> None: + if self.factors["iter_pct"] <= 0 or self.factors["iter_pct"] > 1: raise ValueError("iter_pct must be between 0 and 1.") def check_problem_factors(self) -> bool: + """Determine if the joint settings of problem factors are permissible. + + Returns: + bool: True if problem factors are permissible; False otherwise. + """ # Check divisibility for the for loop. return self.factors["n_loss"] % (2 * self.factors["gavg"]) == 0 - def gen_simul_pert_vec(self, dim: int) -> list[int]: - """ + def _gen_simul_pert_vec(self, dim: int) -> NDArray[np.int_]: + """Generate a random perturbation vector. + Generate a new simulatanious pertubation vector with a 50/50 probability discrete distribution, with values of -1 and 1. The vector size is the problem's dimension. The vector components are independent from each other. - Parameters - ---------- - dim : int - Length of the vector. + Args: + dim (int): The length of the vector. - Returns - ------- - list - Vector of -1's and 1's. + Returns: + NDArray[np.int_]: A random vector of -1's and 1's. """ - prob_list = self.rng_list[2].choices([-1, 1], [0.5, 0.5], k=dim) - return prob_list + return np.array(self.rng_list[2].choices([-1, 1], [0.5, 0.5], k=dim)) + @override def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: - """ - Run a single macroreplication of a solver on a problem. - - Parameters - ---------- - problem : Problem object - simulation-optimization problem to solve - crn_across_solns : bool - indicates if CRN are used when simulating different solutions - - Returns - ------- - recommended_solns : list of Solution objects - list of solutions recommended throughout the budget - intermediate_budgets : list of ints - list of intermediate budgets when recommended solutions changes - """ recommended_solns = [] intermediate_budgets = [] expended_budget = 0 - # problem.minmax = [int(i) for i in problem.minmax] + # -minmax is needed to cast this as a minimization problem + neg_minmax = -np.array(problem.minmax) + lower_bound = np.array(problem.lower_bounds) + upper_bound = np.array(problem.upper_bounds) + # Start at initial solution and record as best. theta = problem.factors["initial_solution"] theta_sol = self.create_new_solution(tuple(theta), problem) @@ -231,21 +212,13 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: intermediate_budgets.append(expended_budget) # Simulate initial solution. problem.simulate(theta_sol, self.factors["n_reps"]) - expended_budget = self.factors["n_reps"] - # Determine initial value for the parameters c, a, and A (Aalg) (according to Section III.B of Spall (1998)). - if len(theta_sol.objectives_var) == 1: - # There's only one index, so we can safely index it. - c_calculated = np.sqrt( - theta_sol.objectives_var[0] / self.factors["gavg"] - ) - c = float(max(c_calculated, 0.0001)) - else: - # Raise the error to the user - with np.errstate(all="raise"): - c_calculated = np.sqrt( - max(theta_sol.objectives_var) / self.factors["gavg"] - ) - c = float(max(c_calculated, 0.0001)) + expended_budget += self.factors["n_reps"] + + # Determine initial value for the parameters c, a, and A (Aalg) + # (according to Section III.B of Spall (1998)). + objective_var = max(theta_sol.objectives_var) + c: float = max(np.sqrt(objective_var / self.factors["gavg"]), 1e-4) + # Calculating the maximum expected number of loss evaluations per run. num_evals = round( (problem.factors["budget"] / self.factors["n_reps"]) @@ -253,30 +226,28 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: ) aalg = self.factors["iter_pct"] * num_evals / (2 * self.factors["gavg"]) gbar = np.zeros((1, problem.dim)) - for _ in range( - int(self.factors["n_loss"] / (2 * self.factors["gavg"])) - ): + + for _ in range(int(self.factors["n_loss"] / (2 * self.factors["gavg"]))): ghat = np.zeros((1, problem.dim)) for _ in range(self.factors["gavg"]): - # Generate a random random direction (delta). - delta = self.gen_simul_pert_vec(problem.dim) + # Generate random direction (delta). + delta = self._gen_simul_pert_vec(problem.dim) + c_delta = c * delta # Determine points forward/backward relative to random direction. - thetaplus = np.add(theta, np.dot(c, delta)) - thetaminus = np.subtract(theta, np.dot(c, delta)) - thetaplus, step_weight_plus = check_cons( - thetaplus, theta, problem.lower_bounds, problem.upper_bounds + theta_forward = theta + c_delta + theta_backward = theta - c_delta + theta_forward, step_weight_plus = _check_cons( + theta_forward, theta, lower_bound, upper_bound ) - thetaminus, step_weight_minus = check_cons( - thetaminus, + theta_backward, step_weight_minus = _check_cons( + theta_backward, theta, - problem.lower_bounds, - problem.upper_bounds, - ) - thetaplus_sol = self.create_new_solution( - tuple(thetaplus), problem + lower_bound, + upper_bound, ) + thetaplus_sol = self.create_new_solution(tuple(theta_forward), problem) thetaminus_sol = self.create_new_solution( - tuple(thetaminus), problem + tuple(theta_backward), problem ) # Evaluate two points and update budget spent. problem.simulate(thetaplus_sol, self.factors["n_reps"]) @@ -285,60 +256,41 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: # Estimate gradient. # (-minmax is needed to cast this as a minimization problem, # but is not essential here because of the absolute value taken.) - ghat += np.dot(-1, problem.minmax) * np.divide( - ( - thetaplus_sol.objectives_mean - - thetaminus_sol.objectives_mean - ) - / ((step_weight_plus + step_weight_minus) * c), - delta, + step_weight_net = step_weight_plus + step_weight_minus + step_weight_net = make_nonzero(step_weight_net, "net_step_weight") + theta_mean_diff = ( + thetaplus_sol.objectives_mean - thetaminus_sol.objectives_mean ) - gbar += np.abs(np.divide(ghat, self.factors["gavg"])) - meangbar = np.mean(gbar) / ( - self.factors["n_loss"] / (2 * self.factors["gavg"]) - ) + ghat += (neg_minmax * theta_mean_diff) / (step_weight_net * c * delta) + gbar += np.abs(ghat / self.factors["gavg"]) - a_leftside = self.factors["step"] * ( - (aalg + 1) ** self.factors["alpha"] - ) - if meangbar == 0: - print( - "Warning: Division by zero in SPSA solver (meangbar == 0)", - file=sys.stderr, - ) - # Follow IEEE 754 standard. - if a_leftside < 0: - a = -np.inf - elif a_leftside > 0: - a = np.inf - else: - a = np.nan - else: - a = a_leftside / meangbar + a_leftside = self.factors["step"] * ((aalg + 1) ** self.factors["alpha"]) + meangbar = np.mean(gbar) / (self.factors["n_loss"] / (2 * self.factors["gavg"])) + meangbar = make_nonzero(meangbar, "meangbar") + a = a_leftside / meangbar # Run the main algorithm. # Initiate iteration counter. k = 0 - ftheta_best = None + best_solution_value = None while expended_budget < problem.factors["budget"]: k += 1 # Calculate the gain sequences ak and ck. ak = a / (k + aalg) ** self.factors["alpha"] ck = c / (k ** self.factors["gamma"]) # Generate random direction (delta). - delta = self.gen_simul_pert_vec(problem.dim) + delta = self._gen_simul_pert_vec(problem.dim) + ck_delta = ck * delta # Determine points forward/backward relative to random direction. - thetaplus = np.add(theta, np.dot(ck, delta)) - thetaminus = np.subtract(theta, np.dot(ck, delta)) - thetaplus, step_weight_plus = check_cons( - thetaplus, theta, problem.lower_bounds, problem.upper_bounds + theta_forward = theta + ck_delta + theta_backward = theta - ck_delta + theta_forward, step_weight_plus = _check_cons( + theta_forward, theta, lower_bound, upper_bound ) - thetaminus, step_weight_minus = check_cons( - thetaminus, theta, problem.lower_bounds, problem.upper_bounds - ) - thetaplus_sol = self.create_new_solution(tuple(thetaplus), problem) - thetaminus_sol = self.create_new_solution( - tuple(thetaminus), problem + theta_backward, step_weight_minus = _check_cons( + theta_backward, theta, lower_bound, upper_bound ) + thetaplus_sol = self.create_new_solution(tuple(theta_forward), problem) + thetaminus_sol = self.create_new_solution(tuple(theta_backward), problem) # Evaluate two points and update budget spent. problem.simulate(thetaplus_sol, self.factors["n_reps"]) problem.simulate(thetaminus_sol, self.factors["n_reps"]) @@ -347,89 +299,71 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: mean_minus = thetaplus_sol.objectives_mean * step_weight_minus mean_plus = thetaminus_sol.objectives_mean * step_weight_plus mean_net = mean_minus + mean_plus - net_step_weight = step_weight_plus + step_weight_minus - if net_step_weight == 0: - print( - "Warning: Division by zero in SPSA solver (step_weight_minus = step_weight_plus)", - file=sys.stderr, - ) - # Follow IEEE 754 standard. - if mean_net < 0: - ftheta = -np.inf - elif mean_net > 0: - ftheta = np.inf - else: - ftheta = np.nan - else: - ftheta = mean_net / net_step_weight - # If on the first iteration, record the initial solution as best estimated objective. - if k == 1: - ftheta_best = ftheta - # Check if new solution is better than the best recorded and update accordingly. - if ( - ftheta_best is not None - and np.dot(-1, problem.minmax) * ftheta - < np.dot(-1, problem.minmax) * ftheta_best - ): - ftheta_best = ftheta + step_weight_net = step_weight_plus + step_weight_minus + step_weight_net = make_nonzero(step_weight_net, "net_step_weight") + solution_value = float((mean_net / step_weight_net) * neg_minmax) + if best_solution_value is None: + # Record data from the initial solution. + best_solution_value = solution_value + # Check if new solution is better than the best recorded and update + # accordingly. + if solution_value < best_solution_value: + best_solution_value = solution_value # Record data from the new best solution. recommended_solns.append(theta_sol) intermediate_budgets.append(expended_budget) - # Estimate gradient. (-minmax is needed to cast this as a minimization problem.) - ghat = np.dot(-1, problem.minmax) * np.divide( - (thetaplus_sol.objectives_mean - thetaminus_sol.objectives_mean) - / ((step_weight_plus + step_weight_minus) * c), - delta, + # Estimate gradient. + theta_mean_diff = ( + thetaplus_sol.objectives_mean - thetaminus_sol.objectives_mean ) + ghat = (neg_minmax * theta_mean_diff * delta) / (step_weight_net * c) # Take step and check feasibility. - theta_next = np.subtract(theta, np.dot(ak, ghat)) - theta, _ = check_cons( - theta_next, theta, problem.lower_bounds, problem.upper_bounds - ) + theta_next = theta - (ak * ghat) + theta, _ = _check_cons(theta_next, theta, lower_bound, upper_bound) theta_sol = self.create_new_solution(tuple(theta), problem) return recommended_solns, intermediate_budgets -def check_cons( +def _check_cons( candidate_x: np.ndarray, new_x: np.ndarray, - lower_bound: tuple, - upper_bound: tuple, + lower_bound: np.ndarray, + upper_bound: np.ndarray, ) -> tuple[np.ndarray, float]: - """Evaluates the distance from the new vector (candiate_x) compared to the current vector (new_x) respecting the vector's boundaries of feasibility. - Returns the evaluated vector (modified_x) and the weight (t2 - how much of a full step took) of the new vector. - The weight (t2) is used to calculate the weigthed average in the ftheta calculation.""" - # The current step. - current_step = np.subtract(candidate_x, new_x) - # Form a matrix to determine the possible stepsize. - step_size_matrix = np.ones((2, len(candidate_x))) - for i in range(0, len(candidate_x)): - if current_step[i] > 0: - diff = upper_bound[i] - new_x[i] - if current_step[i] == np.inf: - print( - "Warning: Division by +inf in SPSA solver", file=sys.stderr - ) - # IEEE 754 standard. - step_size_matrix[0, i] = 0 - else: - step_size_matrix[0, i] = diff / current_step[i] - elif current_step[i] < 0: - diff = lower_bound[i] - new_x[i] - if current_step[i] == -np.inf: - print( - "Warning: Division by -inf in SPSA solver", file=sys.stderr - ) - # IEEE 754 standard. - step_size_matrix[1, i] = 0 - else: - step_size_matrix[1, i] = diff / current_step[i] - # Find the minimum stepsize. - min_step_size = step_size_matrix.min() + """Checks the feasibility of a new solution. + + Evaluates the distance from the new vector (candiate_x) compared to the current + vector (new_x) respecting the vector's boundaries of feasibility. + Returns the evaluated vector (modified_x) and the weight + (t2 - how much of a full step took) of the new vector. + The weight (t2) is used to calculate the weigthed average in the ftheta calculation. + """ + # Compute step direction + current_step = candidate_x - new_x + + # Initialize minimum step size + # TODO: figure out if this should be greater than 1 + min_step_size = 1 + + # Check positive steps for a minimum + pos_mask = current_step > 0 + if np.any(pos_mask): + # Make sure there aren't any infinite steps + inf_mask = np.isinf(current_step) + if np.any(inf_mask): + current_step[inf_mask] = 1e15 + + diff = upper_bound - new_x + step_size = diff[pos_mask] / current_step[pos_mask] + min_step_size = min(min_step_size, float(np.min(step_size))) + + # Check negative steps for a minimum + neg_mask = current_step < 0 + if np.any(neg_mask): + diff = lower_bound - new_x + step_size = diff[neg_mask] / current_step[neg_mask] + min_step_size = min(min_step_size, float(np.min(step_size))) + # Calculate the modified x. - if min_step_size == 0: - # If t2 is 0, then there shouldn't be any change. - modified_x = new_x - else: - modified_x = new_x + min_step_size * current_step + modified_x = new_x + min_step_size * current_step return modified_x, min_step_size diff --git a/simopt/solvers/strong.py b/simopt/solvers/strong.py index fa560b02f..ee4a5f62c 100644 --- a/simopt/solvers/strong.py +++ b/simopt/solvers/strong.py @@ -1,8 +1,7 @@ -""" -Summary -------- -STRONG: A trust-region-based algorithm that fits first- or second-order models through function evaluations taken within -a neighborhood of the incumbent solution. +"""STRONG Solver. + +STRONG: A trust-region-based algorithm that fits first- or second-order models through +function evaluations taken within a neighborhood of the incumbent solution. A detailed description of the solver can be found `here `__. """ @@ -10,7 +9,7 @@ from __future__ import annotations import math -import sys +from collections.abc import Iterable from typing import Callable, Literal import numpy as np @@ -24,64 +23,39 @@ Solver, VariableType, ) +from simopt.utils import classproperty, make_nonzero, override class STRONG(Solver): - """ - A trust-region-based algorithm that fits first- or second-order models through function evaluations taken within a neighborhood of the incumbent solution. - - Attributes - ---------- - name : string - name of solver - objective_type : string - description of objective types: - "single" or "multi" - constraint_type : string - description of constraints types: - "unconstrained", "box", "deterministic", "stochastic" - variable_type : string - description of variable types: - "discrete", "continuous", "mixed" - gradient_needed : bool - indicates if gradient of objective function is needed - factors : dict - changeable factors (i.e., parameters) of the solver - specifications : dict - details of each factor (for GUI, data validation, and defaults) - rng_list : list of mrg32k3a.mrg32k3a.MRG32k3a objects - list of RNGs used for the solver's internal purposes - - Arguments - --------- - name : str - user-specified name for solver - fixed_factors : dict - fixed_factors of the solver - - See also - -------- - base.Solver + """STRONG Solver. + + A trust-region-based algorithm that fits first- or second-order models through + function evaluations taken within a neighborhood of the incumbent solution. """ - @property - def objective_type(self) -> ObjectiveType: + @classproperty + @override + def objective_type(cls) -> ObjectiveType: return ObjectiveType.SINGLE - @property - def constraint_type(self) -> ConstraintType: + @classproperty + @override + def constraint_type(cls) -> ConstraintType: return ConstraintType.BOX - @property - def variable_type(self) -> VariableType: + @classproperty + @override + def variable_type(cls) -> VariableType: return VariableType.CONTINUOUS - @property - def gradient_needed(self) -> bool: + @classproperty + @override + def gradient_needed(cls) -> bool: return False - @property - def specifications(self) -> dict[str, dict]: + @classproperty + @override + def specifications(cls) -> dict[str, dict]: return { "crn_across_solns": { "description": "use CRN across solutions?", @@ -134,7 +108,9 @@ def specifications(self) -> dict[str, dict]: "default": 1.11, }, "lambda": { - "description": "magnifying factor for n_r inside the finite difference function", + "description": ( + "magnifying factor for n_r inside the finite difference function" + ), "datatype": int, "default": 2, }, @@ -146,96 +122,84 @@ def specifications(self) -> dict[str, dict]: } @property + @override def check_factor_list(self) -> dict[str, Callable]: return { "crn_across_solns": self.check_crn_across_solns, - "n0": self.check_n0, - "n_r": self.check_n_r, - "sensitivity": self.check_sensitivity, - "delta_threshold": self.check_delta_threshold, - "delta_T": self.check_delta_t, - "eta_0": self.check_eta_0, - "eta_1": self.check_eta_1, - "gamma_1": self.check_gamma_1, - "gamma_2": self.check_gamma_2, - "lambda": self.check_lambda, - "lambda_2": self.check_lambda_2, + "n0": self._check_n0, + "n_r": self._check_n_r, + "sensitivity": self._check_sensitivity, + "delta_threshold": self._check_delta_threshold, + "delta_T": self._check_delta_t, + "eta_0": self._check_eta_0, + "eta_1": self._check_eta_1, + "gamma_1": self._check_gamma_1, + "gamma_2": self._check_gamma_2, + "lambda": self._check_lambda, + "lambda_2": self._check_lambda_2, } - def __init__( - self, name: str = "STRONG", fixed_factors: dict | None = None - ) -> None: + def __init__(self, name: str = "STRONG", fixed_factors: dict | None = None) -> None: + """Initialize STRONG solver. + + Args: + name (str): name of the solver. + fixed_factors (dict, optional): fixed factors of the solver. + Defaults to None. + """ # Let the base class handle default arguments. super().__init__(name, fixed_factors) - def check_n0(self) -> None: + def _check_n0(self) -> None: if self.factors["n0"] <= 0: raise ValueError("n0 must be greater than 0.") - def check_n_r(self) -> None: + def _check_n_r(self) -> None: if self.factors["n_r"] <= 0: raise ValueError( - "The number of replications taken at each solution must be greater than 0." + "The number of replications taken at each solution must be greater " + "than 0." ) - def check_sensitivity(self) -> None: + def _check_sensitivity(self) -> None: if self.factors["sensitivity"] <= 0: raise ValueError("sensitivity must be greater than 0.") - def check_delta_threshold(self) -> None: + def _check_delta_threshold(self) -> None: if self.factors["delta_threshold"] <= 0: raise ValueError("delta_threshold must be greater than 0.") - def check_delta_t(self) -> None: + def _check_delta_t(self) -> None: if self.factors["delta_T"] <= self.factors["delta_threshold"]: raise ValueError("delta_T must be greater than delta_threshold") - def check_eta_0(self) -> None: + def _check_eta_0(self) -> None: if self.factors["eta_0"] <= 0 or self.factors["eta_0"] >= 1: raise ValueError("eta_0 must be between 0 and 1.") - def check_eta_1(self) -> None: - if ( - self.factors["eta_1"] >= 1 - or self.factors["eta_1"] <= self.factors["eta_0"] - ): + def _check_eta_1(self) -> None: + if self.factors["eta_1"] >= 1 or self.factors["eta_1"] <= self.factors["eta_0"]: raise ValueError("eta_1 must be between eta_0 and 1.") - def check_gamma_1(self) -> None: + def _check_gamma_1(self) -> None: if self.factors["gamma_1"] <= 0 or self.factors["gamma_1"] >= 1: raise ValueError("gamma_1 must be between 0 and 1.") - def check_gamma_2(self) -> None: + def _check_gamma_2(self) -> None: if self.factors["gamma_2"] <= 1: raise ValueError("gamma_2 must be greater than 1.") - def check_lambda(self) -> None: + def _check_lambda(self) -> None: if self.factors["lambda"] <= 1: raise ValueError("lambda must be greater than 1.") - def check_lambda_2(self) -> None: + def _check_lambda_2(self) -> None: # TODO: Check if this is the correct condition. if self.factors["lambda_2"] <= 1: raise ValueError("lambda_2 must be greater than 1.") + @override def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: - """ - Run a single macroreplication of a solver on a problem. - - Arguments - --------- - problem : Problem object - simulation-optimization problem to solve - crn_across_solns : bool - indicates if CRN are used when simulating different solutions - - Returns - ------- - recommended_solns : list of Solution objects - list of solutions recommended throughout the budget - intermediate_budgets : list of ints - list of intermediate budgets when recommended solutions changes - """ recommended_solns = [] intermediate_budgets = [] expended_budget = 0 @@ -265,8 +229,14 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: recommended_solns.append(new_solution) intermediate_budgets.append(expended_budget) + # Precompute factorials + factorials = np.array([math.factorial(i) for i in range(1, problem.dim + 1)]) + # Precompute other variables + neg_minmax = -problem.minmax[0] + dim_sq = problem.dim**2 + while expended_budget < problem.factors["budget"]: - new_x = new_solution.x + new_x = np.array(new_solution.x) # Check variable bounds. forward = np.isclose( new_x, lower_bound, atol=self.factors["sensitivity"] @@ -274,27 +244,28 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: backward = np.isclose( new_x, upper_bound, atol=self.factors["sensitivity"] ).astype(int) - # bounds_check: 1 stands for forward, -1 stands for backward, 0 means central diff. - bounds_check = np.subtract(forward, backward) + # bounds_check: + # 1 stands for forward, -1 stands for backward, 0 means central diff. + bounds_check = forward - backward # Stage I. if delta_t > delta_threshold: # Step 1: Build the linear model. num_evals = 2 * problem.dim - np.sum(bounds_check != 0) - grad, hessian = self.finite_diff( - new_solution, bounds_check, 1, problem, n_r - ) - expended_budget += num_evals * n_r - # A while loop to prevent zero gradient - while norm(grad) == 0: - if expended_budget > problem.factors["budget"]: - break + # Generate a new gradient and Hessian matrix. + num_generated_grads = 0 + while True: grad, hessian = self.finite_diff( new_solution, bounds_check, 1, problem, n_r ) expended_budget += num_evals * n_r - # Update n_r and counter after each loop. - n_r = int(lam * n_r) + num_generated_grads += 1 + if num_generated_grads > 2: + # Update n_r and counter after each loop. + n_r *= lam + # Accept any non-zero gradient, or exit if the budget is exceeded. + if norm(grad) != 0 or expended_budget > problem.factors["budget"]: + break # Step 2: Solve the subproblem. # Cauchy reduction. @@ -308,44 +279,27 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: problem.simulate(candidate_solution, n_r) expended_budget += n_r # Find the old objective value and the new objective value. - g_old = -1 * problem.minmax[0] * new_solution.objectives_mean - g_new = ( - -1 * problem.minmax[0] * candidate_solution.objectives_mean - ) + g_old = neg_minmax * new_solution.objectives_mean + g_new = neg_minmax * candidate_solution.objectives_mean g_diff = g_old - g_new # Construct the polynomial. + x_diff = candidate_x - new_x r_old = g_old - r_new = ( - g_old - + np.matmul(np.subtract(candidate_x, new_x), grad) - + 0.5 - * np.matmul( - np.matmul(np.subtract(candidate_x, new_x), hessian), - np.subtract(candidate_x, new_x), - ) - ) - r_diff = r_old - r_new - if r_diff == 0: - print( - "Warning: Division by zero in STRONG solver (r_diff == 0 (Step I_3))", - file=sys.stderr, - ) - # Follow IEEE 754 standard. - if g_diff < 0: - rho = -np.inf - elif g_diff > 0: - rho = np.inf - else: - rho = np.nan - else: - rho = g_diff / r_diff + r_new = g_old + (x_diff @ grad) + 0.5 * ((x_diff @ hessian) @ x_diff) - # Step 4: Update the trust region size and determine to accept or reject the solution. - if (rho < eta_0) | (g_diff <= 0) | (r_diff <= 0): - # The solution fails either the RC or SR test, the center point reamins and the trust region shrinks. + r_diff = (r_old - r_new)[0] + r_diff = make_nonzero(r_diff, "r_diff (stage I)") + rho = g_diff / r_diff + + # Step 4: Update the trust region size and determine to accept or + # reject the solution. + if (rho < eta_0) or (g_diff <= 0) or (r_diff <= 0): + # The solution fails either the RC or SR test, the center point + # remains and the trust region shrinks. delta_t = gamma_1 * delta_t - elif (eta_0 <= rho) & (rho < eta_1): - # The center point moves to the new solution and the trust region remains. + elif (eta_0 <= rho) and (rho < eta_1): + # The center point moves to the new solution and the trust + # region remains. new_solution = candidate_solution # Update incumbent best solution. if ( @@ -356,7 +310,8 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: recommended_solns.append(new_solution) intermediate_budgets.append(expended_budget) else: - # The center point moves to the new solution and the trust region enlarges. + # The center point moves to the new solution and the trust + # region enlarges. delta_t = gamma_2 * delta_t new_solution = candidate_solution # Update incumbent best solution. @@ -374,31 +329,30 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: else: n_onbound = np.sum(bounds_check != 0) if n_onbound <= 1: - num_evals = problem.dim**2 + num_evals = dim_sq else: # TODO: Check the formula, it seems to be dividing an # integer by a tuple. num_evals = ( - problem.dim**2 + dim_sq + problem.dim - - math.factorial(n_onbound) - / (math.factorial(2), math.factorial(n_onbound - 2)) + - factorials[n_onbound] / (2, factorials[n_onbound - 2]) ) # Step 1: Build the quadratic model. - grad, hessian = self.finite_diff( - new_solution, bounds_check, 2, problem, n_r - ) - expended_budget += num_evals * n_r - # A while loop to prevent zero gradient - while norm(grad) == 0: - if expended_budget > problem.factors["budget"]: - break + num_generated_grads = 0 + while True: grad, hessian = self.finite_diff( new_solution, bounds_check, 2, problem, n_r ) expended_budget += num_evals * n_r - # Update n_r and counter after each loop. - n_r = int(lam * n_r) + num_generated_grads += 1 + if num_generated_grads > 2: + # Update n_r and counter after each loop. + n_r *= lam + # Accept any non-zero gradient, or exit if the budget is exceeded. + if norm(grad) != 0 or expended_budget > problem.factors["budget"]: + break + # Step 2: Solve the subproblem. # Cauchy reduction. candidate_x = self.cauchy_point( @@ -415,33 +369,20 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: problem.simulate(candidate_solution, n_r) expended_budget += n_r # Find the old objective value and the new objective value. - g_old = -1 * problem.minmax[0] * new_solution.objectives_mean - g_new = ( - -1 * problem.minmax[0] * candidate_solution.objectives_mean - ) + g_old = neg_minmax * new_solution.objectives_mean + g_new = neg_minmax * candidate_solution.objectives_mean g_diff = g_old - g_new # Construct the polynomial. + x_diff = candidate_x - new_x r_old = g_old - r_new = ( - g_old - + np.matmul(np.subtract(candidate_x, new_x), grad) - + 0.5 - * np.matmul( - np.matmul(np.subtract(candidate_x, new_x), hessian), - np.subtract(candidate_x, new_x), - ) - ) - r_diff = r_old - r_new - if r_diff == 0: - print( - "Warning: Division by zero in STRONG solver (r_diff == 0 (Step II_3))", - file=sys.stderr, - ) - rho = 0 - else: - rho = g_diff / r_diff - # Step 4: Update the trust region size and determine to accept or reject the solution. - if (rho < eta_0) | (g_diff <= 0) | (r_diff <= 0): + r_new = g_old + (x_diff @ grad) + 0.5 * ((x_diff @ hessian) @ x_diff) + + r_diff = (r_old - r_new)[0] + r_diff = make_nonzero(r_diff, "rdiff (stage II)") + rho = g_diff / r_diff + # Step 4: Update the trust region size and determine to accept or + # reject the solution. + if (rho < eta_0) or (g_diff <= 0) or (r_diff <= 0): # Inner Loop. rr_old = r_old g_b_old = rr_old @@ -452,132 +393,77 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: while np.sum(result_x != new_x) == 0: if expended_budget > problem.factors["budget"]: break - # Step1: Build the quadratic model. - g_var, h_var = self.finite_diff( - new_solution, - bounds_check, - 2, - problem, - (sub_counter + 1) * n_r, - ) - expended_budget += num_evals * (sub_counter + 1) * n_r # A while loop to prevent zero gradient - while norm(g_var) == 0: - if expended_budget > problem.factors["budget"]: - break + while True: + n_r_loop = (sub_counter + 1) * n_r g_var, h_var = self.finite_diff( new_solution, bounds_check, 2, problem, - (sub_counter + 1) * n_r, - ) - expended_budget += ( - num_evals * (sub_counter + 1) * n_r + n_r_loop, ) - # Update n_r and counter after each loop. - n_r = int(lam * n_r) + expended_budget += num_evals * n_r_loop + num_generated_grads += 1 + if num_generated_grads > 2: + # Update n_r and counter after each loop. + n_r *= lam + # Accept any non-zero gradient, or exit if the budget + # is exceeded. + if ( + norm(grad) != 0 + or expended_budget > problem.factors["budget"] + ): + break - # Step 2: determine the new inner solution based on the accumulated design matrix X. + # Step 2: determine the new inner solution based on the + # accumulated design matrix X. try_x = self.cauchy_point(g_var, h_var, new_x, problem) - try_solution = self.create_new_solution( - tuple(try_x), problem - ) + try_solution = self.create_new_solution(tuple(try_x), problem) # Step 3. - problem.simulate( - try_solution, - int( - n_r - + np.ceil( - sub_counter ** self.factors["lambda_2"] - ) - ), + counter_ceiling = np.ceil( + sub_counter ** self.factors["lambda_2"] ) - expended_budget += int( - n_r - + np.ceil(sub_counter ** self.factors["lambda_2"]) - ) - g_b_new = ( - -1 - * problem.minmax[0] - * try_solution.objectives_mean + counter_lower_ceiling = np.ceil( + (sub_counter - 1) ** self.factors["lambda_2"] ) + # Theoretically these are already integers + ceiling_diff = int(counter_ceiling - counter_lower_ceiling) + mreps = int(n_r + counter_ceiling) + + problem.simulate(try_solution, mreps) + expended_budget += mreps + g_b_new = neg_minmax * try_solution.objectives_mean dummy_solution = new_solution - problem.simulate( - dummy_solution, - int( - np.ceil(sub_counter ** self.factors["lambda_2"]) - - np.ceil( - (sub_counter - 1) - ** self.factors["lambda_2"] - ) - ), - ) - expended_budget += int( - np.ceil(sub_counter ** self.factors["lambda_2"]) - - np.ceil( - (sub_counter - 1) ** self.factors["lambda_2"] - ) - ) - dummy = ( - -1 - * problem.minmax[0] - * dummy_solution.objectives_mean - ) + problem.simulate(dummy_solution, ceiling_diff) + expended_budget += ceiling_diff + + dummy = neg_minmax * dummy_solution.objectives_mean # Update g_old. g_b_old = ( - g_b_old - * ( - n_r - + np.ceil( - (sub_counter - 1) - ** self.factors["lambda_2"] - ) - ) - + ( - np.ceil(sub_counter ** self.factors["lambda_2"]) - - np.ceil( - (sub_counter - 1) - ** self.factors["lambda_2"] - ) - ) - * dummy - ) / ( - n_r - + np.ceil(sub_counter ** self.factors["lambda_2"]) - ) + g_b_old * (n_r + counter_lower_ceiling) + + ceiling_diff * dummy + ) / mreps + + x_diff = try_x - new_x rr_new = ( g_b_old - + np.matmul(np.subtract(try_x, new_x), g_var) - + 0.5 - * np.matmul( - np.matmul(np.subtract(try_x, new_x), h_var), - np.subtract(try_x, new_x), - ) + + (x_diff @ g_var) + + 0.5 * ((x_diff @ h_var) @ x_diff) ) + rr_old = g_b_old # Set rho to the ratio. g_b_diff = g_b_old - g_b_new - rr_diff = rr_old - rr_new - if rr_diff == 0: - print( - "Warning: Division by zero in STRONG solver (rr_diff == 0)", - file=sys.stderr, - ) - rrho = 0 - else: - rrho = (g_b_diff) / (rr_diff) + rr_diff = (rr_old - rr_new)[0] + rr_diff = make_nonzero(rr_diff, "rr_diff") + rrho = g_b_diff / rr_diff - if ( - (rrho < eta_0) - | ((g_b_diff) <= 0) - | ((rr_diff) <= 0) - ): + if (rrho < eta_0) or (g_b_diff <= 0) or (rr_diff <= 0): delta_t = gamma_1 * delta_t result_solution = new_solution result_x = new_x - elif (eta_0 <= rrho) and (rrho < eta_1): # Accept the solution and remains the size of trust region. result_solution = try_solution @@ -589,7 +475,7 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: result_solution = try_solution result_x = try_x rr_old = g_b_new - sub_counter = sub_counter + 1 + sub_counter += 1 new_solution = result_solution # Update incumbent best solution. if ( @@ -599,20 +485,11 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: best_solution = new_solution recommended_solns.append(new_solution) intermediate_budgets.append(expended_budget) - elif (eta_0 <= rho) and (rho < eta_1): - # The center point moves to the new solution and the trust region remains. - new_solution = candidate_solution - # Update incumbent best solution. - if ( - problem.minmax * new_solution.objectives_mean - > problem.minmax * best_solution.objectives_mean - ): - best_solution = new_solution - recommended_solns.append(new_solution) - intermediate_budgets.append(expended_budget) else: - # The center point moves to the new solution and the trust region enlarges. - delta_t = gamma_2 * delta_t + # The center point moves to the new solution and the trust + # region enlarges. + if not ((eta_0 <= rho) and (rho < eta_1)): + delta_t = gamma_2 * delta_t new_solution = candidate_solution # Update incumbent best solution. if ( @@ -624,62 +501,75 @@ def solve(self, problem: Problem) -> tuple[list[Solution], list[int]]: intermediate_budgets.append(expended_budget) n_r = int(np.ceil(self.factors["lambda_2"] * n_r)) # Loop through each budget and convert any numpy int32s to Python ints. - for i in range(len(intermediate_budgets)): - intermediate_budgets[i] = int(intermediate_budgets[i]) + intermediate_budgets = [int(i) for i in intermediate_budgets] return recommended_solns, intermediate_budgets def cauchy_point( self, grad: np.ndarray, hessian: np.ndarray, - new_x: tuple, + new_x: np.ndarray, problem: Problem, ) -> np.ndarray: - """ - Find the Cauchy point based on the gradient and Hessian matrix. - """ + """Find the Cauchy point based on the gradient and Hessian matrix.""" delta_t = self.factors["delta_T"] lower_bound = problem.lower_bounds upper_bound = problem.upper_bounds - if np.dot(np.matmul(grad, hessian), grad) <= 0: - tau = 1 - else: - tau = min( - 1, - norm(grad) ** 3 - / (delta_t * np.dot(np.matmul(grad, hessian), grad)), - ) - grad = np.reshape(grad, (1, problem.dim))[0] - candidate_x = new_x - tau * delta_t * grad / norm(grad) - cauchy_x = self.check_cons(candidate_x, new_x, lower_bound, upper_bound) - return cauchy_x + + val = float(np.dot(grad, hessian @ grad)) + val_dt = delta_t * val + grad_norm = float(norm(grad)) + grad_norm = make_nonzero(grad_norm, "grad_norm") + tau = 1 if val <= 0 else min(1, grad_norm**3 / val_dt) + candidate_x = new_x - tau * delta_t * grad / grad_norm + return self.check_cons(candidate_x, new_x, lower_bound, upper_bound) def check_cons( self, candidate_x: tuple, - new_x: tuple, + new_x: tuple | np.ndarray, lower_bound: tuple, upper_bound: tuple, ) -> np.ndarray: + """Check feasibility of a new point and apply Cauchy point correction if needed. + + This method compares a candidate point to its updated version and enforces + box constraints defined by lower and upper bounds. + + Args: + candidate_x (tuple): Current decision variable vector (the Cauchy point). + new_x (tuple | np.ndarray): Proposed new solution to check and correct. + lower_bound (tuple): Lower bounds for each decision variable. + upper_bound (tuple): Upper bounds for each decision variable. + + Returns: + np.ndarray: The corrected feasible solution, clipped to respect the bounds. """ - Check the feasibility of the Cauchy point and update the point accordingly. - """ + # Convert the inputs to numpy arrays + candidate_x_arr = np.array(candidate_x) + # If new_x is a tuple, convert it to a numpy array + if isinstance(new_x, tuple): + new_x = np.array(new_x) + current_step: np.ndarray = candidate_x_arr - new_x + lower_bound_arr = np.array(lower_bound) + upper_bound_arr = np.array(upper_bound) # The current step. - current_step = np.subtract(candidate_x, new_x) # Form a matrix to determine the possible stepsize. - max_step_matrix = np.ones((2, len(candidate_x))) - for i in range(0, len(candidate_x)): - if current_step[i] > 0: - step_diff = upper_bound[i] - new_x[i] - max_step_matrix[0, i] = step_diff / current_step[i] - elif current_step[i] < 0: - step_diff = lower_bound[i] - new_x[i] - max_step_matrix[1, i] = step_diff / current_step[i] - # Find the minimum stepsize. - t2 = max_step_matrix.min() + min_step = 1 + pos_mask = current_step > 0 + if np.any(pos_mask): + step_diff = (upper_bound_arr[pos_mask] - new_x[pos_mask]) / current_step[ + pos_mask + ] + min_step = min(min_step, float(np.min(step_diff))) + neg_mask = current_step < 0 + if np.any(neg_mask): + step_diff = (lower_bound_arr[neg_mask] - new_x[neg_mask]) / current_step[ + neg_mask + ] + min_step = min(min_step, float(np.min(step_diff))) # Calculate the modified x. - modified_x = new_x + t2 * current_step - return modified_x + return new_x + min_step * current_step def finite_diff( self, @@ -689,347 +579,190 @@ def finite_diff( problem: Problem, n_r: int, ) -> tuple[np.ndarray, np.ndarray]: + """Estimate gradients and approximate Hessian using finite differences and BFGS. + + This method uses finite differencing to compute gradients of the objective, + and applies BFGS updates to build or refine a Hessian approximation. + + Args: + new_solution (Solution): The solution at which derivatives are computed. + bounds_check (np.ndarray): Boolean mask indicating which variables are + within bounds and eligible for perturbation. + stage (Literal[1, 2]): Indicates the optimization stage + (e.g., 1 for initial approximation, 2 for refinement). + problem (Problem): The simulation-optimization problem being solved. + n_r (int): Number of replications used when estimating gradients. + + Returns: + tuple[np.ndarray, np.ndarray]: A tuple containing: + - Gradient estimate as a NumPy array. + - Hessian approximation (updated via BFGS) as a NumPy array. """ - Finite difference for calculating gradients and BFGS for calculating Hessian matrix - """ - delta_t = self.factors["delta_T"] - lower_bound = problem.lower_bounds - upper_bound = problem.upper_bounds - fn = -1 * problem.minmax[0] * new_solution.objectives_mean - new_x = new_solution.x + neg_minmax = -np.array(problem.minmax) + fn = (neg_minmax * new_solution.objectives_mean)[0] + new_x = np.array(new_solution.x, dtype=float) # Store values for each dimension. - func_diff = np.zeros((problem.dim, 3)) + f_x_minus_h = np.zeros(problem.dim) # f(x - h) + f_x_plus_h = np.zeros(problem.dim) # f(x + h) + + def get_fn_x(x: Iterable) -> float: + """Helper to simulate the function at a given x.""" + x_solution = self.create_new_solution(tuple(x), problem) + problem.simulate_up_to([x_solution], n_r) + return (neg_minmax * x_solution.objectives_mean)[0] + + # Initialize step sizes. + delta_t: float = self.factors["delta_T"] + ub_steps = np.minimum(delta_t, np.array(problem.upper_bounds) - new_x) + lb_steps = np.minimum(delta_t, new_x - np.array(problem.lower_bounds)) + + # Create independent fresh copies for each dimension + # Tiling creates a 2D array, each row is a copy of new_x + x1 = np.tile(new_x, (problem.dim, 1)) + x2 = np.tile(new_x, (problem.dim, 1)) + + # Compute masks for numpy vectorization + bounds_neg = bounds_check == -1 + bounds_zero = bounds_check == 0 + bounds_pos = bounds_check == 1 + bounds_non_neg = bounds_zero | bounds_pos + bounds_non_zero = bounds_neg | bounds_pos + bounds_non_pos = bounds_zero | bounds_neg + + steps = np.minimum(ub_steps, lb_steps) + # Apply step modifications per bounds_check conditions + steps = np.where(bounds_neg, lb_steps, steps) + steps = np.where(bounds_pos, ub_steps, steps) + + # Modify x1 and x2 based on step sizes + x1[np.arange(problem.dim), bounds_non_neg] += steps[bounds_non_neg] + x2[np.arange(problem.dim), bounds_non_pos] -= steps[bounds_non_pos] + + # Compute function values + non_neg_indices = np.where(bounds_non_neg)[0] + non_pos_indices = np.where(bounds_non_pos)[0] + f_x_minus_h[non_neg_indices] = np.array( + list(map(get_fn_x, x1[non_neg_indices])) + ) + f_x_plus_h[non_pos_indices] = np.array(list(map(get_fn_x, x2[non_pos_indices]))) + + # Compute gradients grad = np.zeros(problem.dim) + grad[bounds_neg] = (fn - f_x_plus_h[bounds_neg]) / steps[bounds_neg] + grad[bounds_zero] = (f_x_minus_h[bounds_zero] - f_x_plus_h[bounds_zero]) / ( + 2 * steps[bounds_zero] + ) + grad[bounds_pos] = (f_x_minus_h[bounds_pos] - fn) / steps[bounds_pos] + hessian = np.zeros((problem.dim, problem.dim)) + # If stage 1, exit without calculating the Hessian. + if stage == 1: + return grad, hessian + + # Initialize the diagonal of the Hessian matrix. + hessian_diag = np.zeros(problem.dim) + + # Case where bounds_check[i] == 0 (Central Difference) + if np.any(bounds_zero): + hessian_diag[bounds_zero] = ( + f_x_minus_h[bounds_zero] - 2 * fn + f_x_plus_h[bounds_zero] + ) / (steps[bounds_zero] ** 2) + + # Case where bounds_check[i] != 0 (One-Sided Difference) + if np.any(bounds_non_zero): + x = new_x.copy() + x[bounds_non_zero] += (steps[bounds_non_zero] / 2) * bounds_check[ + bounds_non_zero + ] # Apply h shift + fn_x = np.array( + [get_fn_x(x) for _ in range(np.sum(bounds_non_zero))] + ) # Simulate function evaluations + hessian_diag[bounds_non_zero] = ( + 4 + * (fn - 2 * fn_x + f_x_plus_h[bounds_non_zero]) + / (steps[bounds_non_zero] ** 2) + ) - for i in range(problem.dim): - # Initialization. - x1 = list(new_x) - x2 = list(new_x) - # Forward stepsize. - steph1 = delta_t - # Backward stepsize. - steph2 = delta_t + # Fill the diagonal of the Hessian matrix. + np.fill_diagonal(hessian, hessian_diag) - # Check variable bounds. - if x1[i] + steph1 > upper_bound[i]: - steph1 = np.abs(upper_bound[i] - x1[i]) - if x2[i] - steph2 < lower_bound[i]: - steph2 = np.abs(x2[i] - lower_bound[i]) - - # Decide stepsize. - # Central diff. - if bounds_check[i] == 0: - func_diff[i, 2] = min(steph1, steph2) - x1[i] = x1[i] + func_diff[i, 2] - x2[i] = x2[i] - func_diff[i, 2] - # Forward diff. - elif bounds_check[i] == 1: - func_diff[i, 2] = steph1 - x1[i] = x1[i] + func_diff[i, 2] - # Backward diff - else: - func_diff[i, 2] = steph2 - x2[i] = x2[i] - func_diff[i, 2] - x1_solution = self.create_new_solution(tuple(x1), problem) - - # Run bounds checks. - if bounds_check[i] != -1: - problem.simulate_up_to([x1_solution], n_r) - fn1 = -1 * problem.minmax[0] * x1_solution.objectives_mean - # First column is f(x+h,y). - func_diff[i, 0] = fn1[0] if isinstance(fn1, np.ndarray) else fn1 - x2_solution = self.create_new_solution(tuple(x2), problem) - if bounds_check[i] != 1: - problem.simulate_up_to([x2_solution], n_r) - fn2 = -1 * problem.minmax[0] * x2_solution.objectives_mean - # Second column is f(x-h,y). - func_diff[i, 1] = fn2[0] if isinstance(fn2, np.ndarray) else fn2 - - # Calculate gradient. - fn_divisor = ( - func_diff[i, 2][0] - if isinstance(func_diff[i, 2], np.ndarray) - else func_diff[i, 2] - ) - if bounds_check[i] == 0: - fn_diff = fn1 - fn2 # type: ignore - fn_divisor = 2 * fn_divisor - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - elif bounds_check[i] == 1: - fn_diff = fn1 - fn # type: ignore - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor - else: - grad[i] = fn_diff / fn_divisor - elif bounds_check[i] == -1: - fn_diff = fn - fn2 # type: ignore - if isinstance(fn_diff, np.ndarray): - grad[i] = fn_diff[0] / fn_divisor + # Fill the upper triangle of the Hessian matrix. + for i in range(problem.dim): + f_i_minus_h = f_x_minus_h[i] + f_i_plus_h = f_x_plus_h[i] + h = steps[i] # h step size + # Upper triangle in Hessian + for j in range(i + 1, problem.dim): + f_j_minus_k = f_x_minus_h[j] + f_j_plus_k = f_x_plus_h[j] + k = steps[j] # k step size + + x5 = new_x.copy() + # Neither x nor y on boundary. + if bounds_check[i] == 0 and bounds_check[j] == 0: + # Represent f(x+h,y+k). + x5[i] += h + x5[j] += k + fn5 = get_fn_x(x5) + # Represent f(x-h,y-k). + x6 = new_x.copy() + x6[i] -= h + x6[j] -= k + fn6 = get_fn_x(x6) + # Compute second order gradient. + hessian[i, j] = ( + 2 * fn + + (fn5 - f_i_minus_h - f_j_minus_k) + + (fn6 - f_i_plus_h - f_j_plus_k) + ) / (2 * h * k) + # When x on boundary, y not. + elif bounds_check[j] == 0: + i_plus_minus = bounds_check[i] * h + # Represent f(x+/-h,y+k). + x5[i] += i_plus_minus + x5[j] += k + fn5 = get_fn_x(x5) + # Represent f(x+/-h,y-k). + x6 = new_x.copy() + x6[i] += i_plus_minus + x6[j] -= k + fn6 = get_fn_x(x6) + # Compute second order gradient. + hessian[i, j] = ( + (fn5 - f_j_minus_k - fn6 + f_j_plus_k) + / (2 * h * k) + * bounds_check[i] + ) + # When y on boundary, x not. + elif bounds_check[i] == 0: + k_plus_minus = bounds_check[j] * k + # Represent f(x+h,y+/-k). + x5[i] += h + x5[j] += k_plus_minus + fn5 = get_fn_x(x5) + # Represent f(x-h,y+/-k). + x6 = new_x.copy() + x6[i] -= h + x6[j] += k_plus_minus + fn6 = get_fn_x(x6) + # Compute second order gradient. + hessian[i, j] = ( + (fn5 - f_i_minus_h - fn6 + f_i_plus_h) + / (2 * h * k) + * bounds_check[j] + ) + # If only using one side else: - grad[i] = fn_diff / fn_divisor - - if stage == 2: - # Diagonal in Hessian. - for i in range(problem.dim): - fn_1 = ( - func_diff[i, 1][0] - if isinstance(func_diff[i, 1], np.ndarray) - else func_diff[i, 1] - ) - fn_2 = ( - func_diff[i, 2][0] - if isinstance(func_diff[i, 2], np.ndarray) - else func_diff[i, 2] - ) - if bounds_check[i] == 0: - fn_0 = ( - func_diff[i, 0][0] - if isinstance(func_diff[i, 0], np.ndarray) - else func_diff[i, 0] + x5[i] += h * bounds_check[i] + x5[j] += k * bounds_check[j] + # TODO: verify the i and j mappings are inverted + fd_ix = f_i_minus_h if bounds_check[i] == -1 else f_i_plus_h + fd_jx = f_j_minus_k if bounds_check[j] == -1 else f_j_plus_k + fn5 = get_fn_x(x5) + hessian[i, j] = ( + ((fn + fn5) - (fd_jx + fd_ix)) / (h * k) * bounds_check[j] ) - hessian[i, i] = (fn_0 - 2 * fn[0] + fn_1) / (fn_2**2) - elif bounds_check[i] == 1: - x3 = list(new_x) - x3[i] = x3[i] + func_diff[i, 2] / 2 - x3_solution = self.create_new_solution(tuple(x3), problem) - # Check budget. - problem.simulate_up_to([x3_solution], n_r) - fn3 = -1 * problem.minmax[0] * x3_solution.objectives_mean - hessian[i, i] = 4 * (fn_1 - 2 * fn3[0] + fn[0]) / (fn_2**2) - elif bounds_check[i] == -1: - x4 = list(new_x) - x4[i] = x4[i] - func_diff[i, 2] / 2 - x4_solution = self.create_new_solution(tuple(x4), problem) - # Check budget. - problem.simulate_up_to([x4_solution], n_r) - fn4 = -1 * problem.minmax[0] * x4_solution.objectives_mean - hessian[i, i] = 4 * (fn[0] - 2 * fn4[0] + fn_1) / (fn_2**2) - - # Upper triangle in Hessian - for j in range(i + 1, problem.dim): - # Neither x nor y on boundary. - if bounds_check[i] ** 2 + bounds_check[j] ** 2 == 0: - # Represent f(x+h,y+k). - x5 = list(new_x) - x5[i] = x5[i] + func_diff[i, 2] - x5[j] = x5[j] + func_diff[j, 2] - x5_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget. - problem.simulate_up_to([x5_solution], n_r) - fn5 = ( - -1 * problem.minmax[0] * x5_solution.objectives_mean - ) - # Represent f(x-h,y-k). - x6 = list(new_x) - x6[i] = x6[i] - func_diff[i, 2] - x6[j] = x6[j] - func_diff[j, 2] - x6_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget. - problem.simulate_up_to([x6_solution], n_r) - fn6 = ( - -1 * problem.minmax[0] * x6_solution.objectives_mean - ) - # Compute second order gradient. - fn_i0 = ( - func_diff[i, 0][0] - if isinstance(func_diff[i, 0], np.ndarray) - else func_diff[i, 0] - ) - fn_j0 = ( - func_diff[j, 0][0] - if isinstance(func_diff[j, 0], np.ndarray) - else func_diff[j, 0] - ) - fn_i1 = ( - func_diff[i, 1][0] - if isinstance(func_diff[i, 1], np.ndarray) - else func_diff[i, 1] - ) - fn_j1 = ( - func_diff[j, 1][0] - if isinstance(func_diff[j, 1], np.ndarray) - else func_diff[j, 1] - ) - fn_i2 = ( - func_diff[i, 2][0] - if isinstance(func_diff[i, 2], np.ndarray) - else func_diff[i, 2] - ) - fn_j2 = ( - func_diff[j, 2][0] - if isinstance(func_diff[j, 2], np.ndarray) - else func_diff[j, 2] - ) - hessian[i, j] = ( - fn5[0] - - fn_i0 - - fn_j0 - + 2 * fn[0] - - fn_i1 - - fn_j1 - + fn6[0] - ) / (2 * fn_i2 * fn_j2) - hessian[j, i] = hessian[i, j] - # When x on boundary, y not. - elif bounds_check[j] == 0: - # Represent f(x+/-h,y+k). - x5 = list(new_x) - x5[i] = x5[i] + bounds_check[i] * func_diff[i, 2] - x5[j] = x5[j] + func_diff[j, 2] - x5_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget. - problem.simulate_up_to([x5_solution], n_r) - fn5 = ( - -1 * problem.minmax[0] * x5_solution.objectives_mean - ) - # Represent f(x+/-h,y-k). - x6 = list(new_x) - x6[i] = x6[i] + bounds_check[i] * func_diff[i, 2] - x6[j] = x6[j] - func_diff[j, 2] - x6_solution = self.create_new_solution( - tuple(x6), problem - ) - # Check budget. - problem.simulate_up_to([x6_solution], n_r) - fn6 = ( - -1 * problem.minmax[0] * x6_solution.objectives_mean - ) - # Compute second order gradient. - hessian[i, j] = ( - fn5 - func_diff[j, 0] - fn6 + func_diff[j, 1] - ) / ( - 2 - * func_diff[i, 2] - * func_diff[j, 2] - * bounds_check[i] - ) - hessian[j, i] = hessian[i, j] - # When y on boundary, x not. - elif bounds_check[i] == 0: - # Represent f(x+h,y+/-k). - x5 = list(new_x) - x5[i] = x5[i] + func_diff[i, 2] - x5[j] = x5[j] + bounds_check[j] * func_diff[j, 2] - x5_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget. - problem.simulate_up_to([x5_solution], n_r) - fn5 = ( - -1 * problem.minmax[0] * x5_solution.objectives_mean - ) - # Represent f(x-h,y+/-k). - x6 = list(new_x) - x6[i] = x6[i] + func_diff[i, 2] - x6[j] = x6[j] + bounds_check[j] * func_diff[j, 2] - x6_solution = self.create_new_solution( - tuple(x6), problem - ) - # Check budget. - problem.simulate_up_to([x6_solution], n_r) - fn6 = ( - -1 * problem.minmax[0] * x6_solution.objectives_mean - ) - # Compute second order gradient. - hessian[i, j] = ( - fn5 - func_diff[i, 0] - fn6 + func_diff[i, 1] - ) / ( - 2 - * func_diff[i, 2] - * func_diff[j, 2] - * bounds_check[j] - ) - hessian[j, i] = hessian[i, j] - elif bounds_check[i] == 1: - if bounds_check[j] == 1: - # Represent f(x+h,y+k). - x5 = list(new_x) - x5[i] = x5[i] + func_diff[i, 2] - x5[j] = x5[j] + func_diff[j, 2] - x5_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget. - problem.simulate_up_to([x5_solution], n_r) - fn5 = ( - -1 - * problem.minmax[0] - * x5_solution.objectives_mean - ) - # Compute second order gradient. - hessian[i, j] = ( - fn5 - func_diff[i, 0] - func_diff[j, 0] + fn - ) / (func_diff[i, 2] * func_diff[j, 2]) - hessian[j, i] = hessian[i, j] - else: - # Represent f(x+h,y-k). - x5 = list(new_x) - x5[i] = x5[i] + func_diff[i, 2] - x5[j] = x5[j] - func_diff[j, 2] - x5_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget. - problem.simulate_up_to([x5_solution], n_r) - fn5 = ( - -1 - * problem.minmax[0] - * x5_solution.objectives_mean - ) - # Compute second order gradient. - hessian[i, j] = ( - func_diff[i, 0] - fn5 - fn + func_diff[j, 1] - ) / (func_diff[i, 2] * func_diff[j, 2]) - hessian[j, i] = hessian[i, j] - elif bounds_check[i] == -1: - if bounds_check[j] == 1: - # Represent f(x-h,y+k). - x5 = list(new_x) - x5[i] = x5[i] - func_diff[i, 2] - x5[j] = x5[j] + func_diff[j, 2] - x5_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget - problem.simulate_up_to([x5_solution], n_r) - fn5 = ( - -1 - * problem.minmax[0] - * x5_solution.objectives_mean - ) - # Compute second order gradient. - hessian[i, j] = ( - func_diff[j, 0] - fn - fn5 + func_diff[i, 1] - ) / (func_diff[i, 2] * func_diff[j, 2]) - hessian[j, i] = hessian[i, j] - else: - # Represent f(x-h,y-k). - x5 = list(new_x) - x5[i] = x5[i] - func_diff[i, 2] - x5[j] = x5[j] - func_diff[j, 2] - x5_solution = self.create_new_solution( - tuple(x5), problem - ) - # Check budget. - problem.simulate_up_to([x5_solution], n_r) - fn5 = ( - -1 - * problem.minmax[0] - * x5_solution.objectives_mean - ) - # Compute second order gradient. - hessian[i, j] = ( - fn - func_diff[j, 1] - func_diff[i, 1] + fn5 - ) / (func_diff[i, 2] * func_diff[j, 2]) - hessian[j, i] = hessian[i, j] + # Since we're only computing the upper half the matrix, we + # need to copy the value to the lower triangle. + hessian[j, i] = hessian[i, j] return grad, hessian diff --git a/simopt/utils.py b/simopt/utils.py new file mode 100644 index 000000000..83d8d6225 --- /dev/null +++ b/simopt/utils.py @@ -0,0 +1,111 @@ +"""Utility functions for simopt.""" + +from pathlib import Path +from typing import Callable, Generic, Optional, TypeVar + +T = TypeVar("T", bound=type) +R = TypeVar("R") + + +class ClassPropertyDescriptor(Generic[T, R]): + """Descriptor for class properties.""" + + def __init__(self, fget: Callable[[type[T]], R]) -> None: + """Initialize the descriptor. + + Args: + fget (Callable[[type[T]], R]): The function to get the class property. + """ + self.fget = fget + + def __get__(self, instance: Optional[object], owner: type[T]) -> R: + """Get the class property. + + Args: + instance (Optional[object]): The instance of the class. + owner (type[T]): The class itself. + + Returns: + R: The value of the class property. + """ + return self.fget(owner) + + +def classproperty( + func: Callable[[type[T]], R], +) -> ClassPropertyDescriptor[T, R]: + """Decorator to define a class property. + + Args: + func (Callable[[type[T]], R]): The function to be decorated. + + Returns: + ClassPropertyDescriptor[T, R]: The class property descriptor. + """ + return ClassPropertyDescriptor(func) + + +def override(obj: T) -> T: + """Decorator to mark a method as overridden.""" + obj.__override__ = True + return obj + + +def make_nonzero(value: float, name: str, epsilon: float = 1e-15) -> float: + """Return a non-zero value to avoid division by zero. + + Args: + value (float): The value to check. + name (str): The name of the variable. + epsilon (float, optional): The value to use if the original value is zero. + Default is 1e-15. + + Returns: + float: The original value if it's not close to zero, otherwise a non-zero value. + """ + # Delayed import to avoid lagging when importing the module + import numpy as np + + # If it's not close to 0, return the original value + if not np.isclose(value, 0, atol=epsilon): + return value + + # Delayed import to avoid lagging when importing the module + import logging + from math import copysign + + # If it's close to 0, return a non-zero value + # Use the sign of the original value to help determine the new value + new_value = copysign(epsilon, value) + warning_msg = ( + f"{name} is {value}. Setting to {new_value} to avoid division by zero." + ) + logging.warning(warning_msg) + return new_value + + +def resolve_file_path(target: str | Path, directory: str | Path) -> Path: + """Resolve a file path against a base directory. + + Args: + target (str | Path): The target file path to resolve. + directory (str | Path): The base directory to resolve against. + + Returns: + Path: The resolved file path. + + Raises: + ValueError: If the target is a directory. + """ + # If the target is a directory, raise an error + if Path(target).is_dir(): + raise ValueError(f"Target {target} is a directory, not a file.") + # If it's already a Path object, resolve it directly + if isinstance(target, Path): + return target.resolve() + # Otherwise, we know it's a string + # We need to check if it's a fully qualified path or a relative path + if Path(target).is_absolute(): + return Path(target).resolve() + # If it's a relative path, resolve it against the directory + return (Path(directory) / target).resolve() diff --git a/simopt/utils.pyi b/simopt/utils.pyi new file mode 100644 index 000000000..1828c6746 --- /dev/null +++ b/simopt/utils.pyi @@ -0,0 +1,9 @@ +from pathlib import Path +from typing import Any, TypeVar + +T = TypeVar("T") + +def classproperty(func: Any) -> Any: ... # noqa: ANN401 +def make_nonzero(value: float, name: str, epsilon: float = 1e-15) -> float: ... +def override(func: T) -> T: ... +def resolve_file_path(target: str | Path, directory: str | Path) -> Path: ... diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index 90e817dbc..000000000 --- a/test/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Init file for the test package.""" diff --git a/test/expected_results/AMUSEMENTPARK1_RNDSRCH.yaml b/test/expected_results/AMUSEMENTPARK1_RNDSRCH.yaml new file mode 100644 index 000000000..797cd146e --- /dev/null +++ b/test/expected_results/AMUSEMENTPARK1_RNDSRCH.yaml @@ -0,0 +1,713 @@ +all_est_objectives: +- - 1694.81 + - 621.67 + - 426.51 + - 426.51 +- - 1695.01 + - 500.08 + - 475.41 + - 465.01 + - 413.25 + - 413.25 +- - 1688.67 + - 449.44 + - 425.45 + - 425.45 +- - 1696.48 + - 567.56 + - 374.29 + - 374.29 +- - 1692.15 + - 629.88 + - 437.23 + - 397.97 + - 397.97 +- - 1694.2 + - 773.76 + - 452.01 + - 447.57 +- - 1693.99 + - 496.2 + - 369.15 + - 369.15 +- - 1691.36 + - 496.07 + - 483.93 + - 421.86 + - 435.13 + - 435.13 +- - 1699.13 + - 451.84 + - 444.12 + - 411.36 + - 411.36 +- - 1695.34 + - 468.1 + - 413.39 + - 413.39 +all_intermediate_budgets: +- - 0 + - 20 + - 30 + - 100 +- - 0 + - 20 + - 40 + - 60 + - 70 + - 100 +- - 0 + - 20 + - 30 + - 100 +- - 0 + - 20 + - 40 + - 100 +- - 0 + - 20 + - 30 + - 50 + - 100 +- - 0 + - 20 + - 30 + - 100 +- - 0 + - 20 + - 30 + - 100 +- - 0 + - 20 + - 30 + - 50 + - 80 + - 100 +- - 0 + - 20 + - 50 + - 60 + - 100 +- - 0 + - 20 + - 30 + - 100 +all_recommended_xs: +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 137.0 + - 4.0 + - 3.0 + - 32.0 + - 27.0 + - 12.0 + - 135.0 + - !!python/tuple + - 16.0 + - 5.0 + - 67.0 + - 38.0 + - 165.0 + - 46.0 + - 13.0 + - !!python/tuple + - 16.0 + - 5.0 + - 67.0 + - 38.0 + - 165.0 + - 46.0 + - 13.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 103.0 + - 55.0 + - 23.0 + - 63.0 + - 23.0 + - 69.0 + - 14.0 + - !!python/tuple + - 36.0 + - 107.0 + - 4.0 + - 21.0 + - 112.0 + - 20.0 + - 50.0 + - !!python/tuple + - 40.0 + - 75.0 + - 16.0 + - 8.0 + - 41.0 + - 39.0 + - 131.0 + - !!python/tuple + - 65.0 + - 27.0 + - 33.0 + - 38.0 + - 114.0 + - 54.0 + - 19.0 + - !!python/tuple + - 65.0 + - 27.0 + - 33.0 + - 38.0 + - 114.0 + - 54.0 + - 19.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 50.0 + - 48.0 + - 44.0 + - 73.0 + - 70.0 + - 17.0 + - 48.0 + - !!python/tuple + - 99.0 + - 29.0 + - 15.0 + - 5.0 + - 39.0 + - 134.0 + - 29.0 + - !!python/tuple + - 99.0 + - 29.0 + - 15.0 + - 5.0 + - 39.0 + - 134.0 + - 29.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 12.0 + - 67.0 + - 123.0 + - 96.0 + - 18.0 + - 16.0 + - 18.0 + - !!python/tuple + - 48.0 + - 24.0 + - 17.0 + - 29.0 + - 184.0 + - 24.0 + - 24.0 + - !!python/tuple + - 48.0 + - 24.0 + - 17.0 + - 29.0 + - 184.0 + - 24.0 + - 24.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 1.0 + - 108.0 + - 28.0 + - 68.0 + - 35.0 + - 86.0 + - 24.0 + - !!python/tuple + - 73.0 + - 36.0 + - 6.0 + - 47.0 + - 98.0 + - 52.0 + - 38.0 + - !!python/tuple + - 64.0 + - 45.0 + - 14.0 + - 22.0 + - 124.0 + - 33.0 + - 48.0 + - !!python/tuple + - 64.0 + - 45.0 + - 14.0 + - 22.0 + - 124.0 + - 33.0 + - 48.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 2.0 + - 17.0 + - 98.0 + - 27.0 + - 141.0 + - 2.0 + - 63.0 + - !!python/tuple + - 72.0 + - 73.0 + - 9.0 + - 17.0 + - 34.0 + - 58.0 + - 87.0 + - !!python/tuple + - 5.0 + - 35.0 + - 68.0 + - 46.0 + - 55.0 + - 76.0 + - 65.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 38.0 + - 4.0 + - 80.0 + - 27.0 + - 51.0 + - 22.0 + - 128.0 + - !!python/tuple + - 40.0 + - 9.0 + - 19.0 + - 24.0 + - 63.0 + - 109.0 + - 86.0 + - !!python/tuple + - 40.0 + - 9.0 + - 19.0 + - 24.0 + - 63.0 + - 109.0 + - 86.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 41.0 + - 23.0 + - 24.0 + - 168.0 + - 28.0 + - 38.0 + - 28.0 + - !!python/tuple + - 32.0 + - 26.0 + - 13.0 + - 23.0 + - 112.0 + - 5.0 + - 139.0 + - !!python/tuple + - 15.0 + - 55.0 + - 47.0 + - 12.0 + - 103.0 + - 112.0 + - 6.0 + - !!python/tuple + - 29.0 + - 10.0 + - 115.0 + - 20.0 + - 56.0 + - 51.0 + - 69.0 + - !!python/tuple + - 29.0 + - 10.0 + - 115.0 + - 20.0 + - 56.0 + - 51.0 + - 69.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 32.0 + - 63.0 + - 29.0 + - 38.0 + - 31.0 + - 41.0 + - 116.0 + - !!python/tuple + - 60.0 + - 24.0 + - 62.0 + - 41.0 + - 79.0 + - 65.0 + - 19.0 + - !!python/tuple + - 13.0 + - 55.0 + - 6.0 + - 35.0 + - 183.0 + - 21.0 + - 37.0 + - !!python/tuple + - 13.0 + - 55.0 + - 6.0 + - 35.0 + - 183.0 + - 21.0 + - 37.0 +- - !!python/tuple + - 344.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 10.0 + - 4.0 + - 62.0 + - 16.0 + - 56.0 + - 51.0 + - 151.0 + - !!python/tuple + - 12.0 + - 82.0 + - 14.0 + - 41.0 + - 51.0 + - 85.0 + - 65.0 + - !!python/tuple + - 12.0 + - 82.0 + - 14.0 + - 41.0 + - 51.0 + - 85.0 + - 65.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 621.67 + - 426.51 + - 426.51 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 60.0 + - 70.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 500.08 + - 475.41 + - 465.01 + - 413.25 + - 413.25 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 449.44 + - 425.45 + - 425.45 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 567.56 + - 374.29 + - 374.29 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 50.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 629.88 + - 437.23 + - 397.97 + - 397.97 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 773.76 + - 452.01 + - 447.57 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 496.2 + - 370.32 + - 370.32 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 50.0 + - 80.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 496.07 + - 483.93 + - 421.86 + - 435.13 + - 435.13 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 60.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 451.84 + - 444.12 + - 411.36 + - 411.36 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 100.0 + - !!python/tuple + - 1694.81 + - 468.1 + - 413.39 + - 413.39 +problem_name: AMUSEMENTPARK-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 0.18977115720012983 + - 0.04242387635995742 + - 0.04242387635995742 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.4 + - 0.6 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.09796978459633518 + - 0.07934374740466144 + - 0.07149166849126834 + - 0.032412475745381246 + - 0.032412475745381246 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 0.05973620034881351 + - 0.04162356831686158 + - 0.04162356831686158 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.4 + - 1.0 + - !!python/tuple + - 1.0 + - 0.148917696622851 + - 0.0029973801236702633 + - 0.0029973801236702633 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 0.5 + - 1.0 + - !!python/tuple + - 1.0 + - 0.19596976949618344 + - 0.05051755770145492 + - 0.02087595980339605 + - 0.02087595980339605 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3046002612326254 + - 0.061676569849526984 + - 0.058324336159578404 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 0.09504035515556931 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 0.5 + - 0.8 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0949422041691519 + - 0.08577641205294115 + - 0.038913091076565334 + - 0.04893204176701976 + - 0.04893204176701976 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.5 + - 0.6 + - 1.0 + - !!python/tuple + - 1.0 + - 0.06154821855959651 + - 0.05571955998157782 + - 0.03098551140438963 + - 0.03098551140438963 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0738246419376515 + - 0.032518176807676914 + - 0.032518176807676914 +solver_name: RNDSRCH diff --git a/test/expected_results/CHESS1_RNDSRCH.yaml b/test/expected_results/CHESS1_RNDSRCH.yaml new file mode 100644 index 000000000..ceb383c0a --- /dev/null +++ b/test/expected_results/CHESS1_RNDSRCH.yaml @@ -0,0 +1,597 @@ +all_est_objectives: +- - 72.4276732332523 + - 69.30060348609184 + - 54.95832309504901 + - 50.76932237094423 + - 47.57252024265534 + - 45.08591208586104 + - 45.08591208586104 +- - 72.74324031306887 + - 57.74819288082265 + - 49.95876461028564 + - 49.64637151466069 + - 48.85249099958758 + - 48.85249099958758 +- - 72.693378470264 + - 59.68194171549788 + - 55.62979406446834 + - 54.52102052668502 + - 53.359298053034806 + - 50.66821015498298 + - 50.66821015498298 +- - 72.45439322791282 + - 50.457683811445875 + - 49.469281459920786 + - 46.5133444169605 + - 46.5133444169605 +- - 72.3563151924843 + - 70.55332280165287 + - 63.82933981981832 + - 55.81857835561859 + - 55.631693000218974 + - 53.5421333444192 + - 50.28678029351573 + - 47.460615843315985 + - 47.460615843315985 +- - 72.62045984905988 + - 61.618173475713554 + - 59.679050466243254 + - 54.90694954398295 + - 52.35902761450769 + - 47.27592326574964 + - 47.27592326574964 +- - 72.15734084331623 + - 69.08537177303445 + - 56.47046765246474 + - 54.88509548579496 + - 46.50586677554573 + - 46.50586677554573 +- - 72.72178346682318 + - 58.48675027524051 + - 50.50385018315687 + - 48.57430429298003 + - 47.0337445134079 + - 47.0337445134079 +- - 72.59693781222677 + - 48.91069780201896 + - 47.82534170478068 + - 47.82534170478068 +- - 72.74614614914957 + - 62.647433361052464 + - 58.039442874142686 + - 55.74216267693869 + - 54.73460236285473 + - 49.696936150341116 + - 48.03142657581588 + - 47.35437099017415 + - 47.35437099017415 +all_intermediate_budgets: +- - 0 + - 20 + - 40 + - 120 + - 150 + - 370 + - 1000 +- - 0 + - 40 + - 60 + - 850 + - 890 + - 1000 +- - 0 + - 40 + - 180 + - 190 + - 290 + - 480 + - 1000 +- - 0 + - 30 + - 250 + - 270 + - 1000 +- - 0 + - 40 + - 60 + - 120 + - 260 + - 270 + - 560 + - 760 + - 1000 +- - 0 + - 40 + - 70 + - 220 + - 450 + - 460 + - 1000 +- - 0 + - 40 + - 60 + - 100 + - 150 + - 1000 +- - 0 + - 30 + - 100 + - 370 + - 470 + - 1000 +- - 0 + - 20 + - 800 + - 1000 +- - 0 + - 20 + - 70 + - 180 + - 200 + - 210 + - 530 + - 720 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 150.0 + - !!python/tuple + - 143.9959354336992 + - !!python/tuple + - 113.6269068626152 + - !!python/tuple + - 105.08828691067168 + - !!python/tuple + - 98.32992367837491 + - !!python/tuple + - 93.19677707732482 + - !!python/tuple + - 93.19677707732482 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 119.27048503018092 + - !!python/tuple + - 103.10156276095827 + - !!python/tuple + - 102.53925144519903 + - !!python/tuple + - 101.07902970687567 + - !!python/tuple + - 101.07902970687567 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 122.72928023719989 + - !!python/tuple + - 114.51330244302284 + - !!python/tuple + - 112.07126704757704 + - !!python/tuple + - 109.70428450521894 + - !!python/tuple + - 104.13697440763019 + - !!python/tuple + - 104.13697440763019 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 104.66583726274526 + - !!python/tuple + - 102.56893879857296 + - !!python/tuple + - 96.3539568789001 + - !!python/tuple + - 96.3539568789001 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 146.40270006499802 + - !!python/tuple + - 131.7647201870756 + - !!python/tuple + - 115.58445281553676 + - !!python/tuple + - 115.12938585410117 + - !!python/tuple + - 110.31212977724317 + - !!python/tuple + - 103.81394022474558 + - !!python/tuple + - 97.81325466504939 + - !!python/tuple + - 97.81325466504939 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 127.32339425713342 + - !!python/tuple + - 123.0554345330125 + - !!python/tuple + - 113.56452280248604 + - !!python/tuple + - 108.12599267323786 + - !!python/tuple + - 97.4876059250656 + - !!python/tuple + - 97.4876059250656 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 143.3698978636649 + - !!python/tuple + - 116.87967131671495 + - !!python/tuple + - 113.75244457196567 + - !!python/tuple + - 96.5074611302455 + - !!python/tuple + - 96.5074611302455 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 120.73420496683447 + - !!python/tuple + - 104.51921544298851 + - !!python/tuple + - 100.4225896851816 + - !!python/tuple + - 97.20843481870226 + - !!python/tuple + - 97.20843481870226 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 101.05580426232788 + - !!python/tuple + - 98.89052790054892 + - !!python/tuple + - 98.89052790054892 +- - !!python/tuple + - 150.0 + - !!python/tuple + - 129.56816424339831 + - !!python/tuple + - 120.18826149831811 + - !!python/tuple + - 115.11223524428766 + - !!python/tuple + - 113.13627700861363 + - !!python/tuple + - 102.72878653310669 + - !!python/tuple + - 99.39214831242 + - !!python/tuple + - 98.35893958209188 + - !!python/tuple + - 98.35893958209188 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 120.0 + - 150.0 + - 370.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 69.30060348609184 + - 54.95832309504901 + - 50.76932237094423 + - 47.57252024265534 + - 45.08591208586104 + - 45.08591208586104 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 60.0 + - 850.0 + - 890.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 57.74819288082265 + - 49.95876461028564 + - 49.64637151466069 + - 48.85249099958758 + - 48.85249099958758 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 180.0 + - 190.0 + - 290.0 + - 480.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 59.68194171549788 + - 55.62979406446834 + - 54.52102052668502 + - 53.359298053034806 + - 50.66821015498298 + - 50.66821015498298 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 250.0 + - 270.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 50.457683811445875 + - 49.469281459920786 + - 46.5133444169605 + - 46.5133444169605 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 60.0 + - 120.0 + - 260.0 + - 270.0 + - 560.0 + - 760.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 70.55332280165287 + - 63.82933981981832 + - 55.81857835561859 + - 55.631693000218974 + - 53.5421333444192 + - 50.28678029351573 + - 47.460615843315985 + - 47.460615843315985 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 70.0 + - 220.0 + - 450.0 + - 460.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 61.618173475713554 + - 59.679050466243254 + - 54.90694954398295 + - 52.35902761450769 + - 47.27592326574964 + - 47.27592326574964 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 60.0 + - 100.0 + - 150.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 69.08537177303445 + - 56.47046765246474 + - 54.88509548579496 + - 46.50586677554573 + - 46.50586677554573 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 100.0 + - 370.0 + - 470.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 58.48675027524051 + - 50.50385018315687 + - 48.57430429298003 + - 47.0337445134079 + - 47.0337445134079 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 800.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 48.91069780201896 + - 47.82534170478068 + - 47.82534170478068 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 70.0 + - 180.0 + - 200.0 + - 210.0 + - 530.0 + - 720.0 + - 1000.0 + - !!python/tuple + - 72.4276732332523 + - 62.647433361052464 + - 58.039442874142686 + - 55.74216267693869 + - 54.73460236285473 + - 49.696936150341116 + - 48.03142657581588 + - 47.35437099017415 + - 47.35437099017415 +problem_name: CHESS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.04 + - 0.12 + - 0.15 + - 0.37 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8856302734010673 + - 0.3610744368648659 + - 0.20786555242164628 + - 0.09094542752347719 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.06 + - 0.85 + - 0.89 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4631113821345683 + - 0.17822014091032795 + - 0.1667946480921832 + - 0.13775919164175413 + - 0.13775919164175413 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.18 + - 0.19 + - 0.29 + - 0.48 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5338364837200502 + - 0.38563287572327126 + - 0.3450804938995016 + - 0.30259155299376705 + - 0.20416746525688081 + - 0.20416746525688081 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.25 + - 0.27 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1964676560747941 + - 0.16031774070552046 + - 0.05220703682563091 + - 0.05220703682563091 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.06 + - 0.12 + - 0.26 + - 0.27 + - 0.56 + - 0.76 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9314473408828577 + - 0.6855237902531978 + - 0.39253748915078857 + - 0.3857023275680297 + - 0.3092785871756101 + - 0.19021701563474153 + - 0.08685262608555559 + - 0.08685262608555559 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.07 + - 0.22 + - 0.45 + - 0.46 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6046523960447182 + - 0.5337307389130848 + - 0.3591954960464919 + - 0.26600757315666157 + - 0.08009766335397724 + - 0.08009766335397724 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.06 + - 0.1 + - 0.15 + - 1.0 + - !!python/tuple + - 1.0 + - 0.877758369616335 + - 0.41637974617775947 + - 0.35839620378180664 + - 0.051933548904554296 + - 0.051933548904554296 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.1 + - 0.37 + - 0.47 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4901234458577688 + - 0.19815614905306742 + - 0.12758476633286756 + - 0.07124019616171325 + - 0.07124019616171325 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.8 + - 1.0 + - !!python/tuple + - 1.0 + - 0.13988805240231753 + - 0.10019214212838 + - 0.10019214212838 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.07 + - 0.18 + - 0.2 + - 0.21 + - 0.53 + - 0.72 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6422966384836188 + - 0.4737635852516241 + - 0.3897426553334654 + - 0.3528920549404438 + - 0.16864400356741555 + - 0.10772950850080396 + - 0.08296681739279788 + - 0.08296681739279788 +solver_name: RNDSRCH diff --git a/test/expected_results/CNTNEWS1_ADAM.yaml b/test/expected_results/CNTNEWS1_ADAM.yaml new file mode 100644 index 000000000..4651534db --- /dev/null +++ b/test/expected_results/CNTNEWS1_ADAM.yaml @@ -0,0 +1,669 @@ +all_est_objectives: +- - 0.0 + - 0.2474405509297145 + - 0.3851329060383193 + - 0.391508529502654 + - 0.3980149517216228 + - 0.3980149517216228 +- - 0.0 + - 0.4311357294567686 + - 0.5221030061939704 + - 0.5203791427747975 + - 0.5063093136182275 + - 0.5063093136182275 +- - 0.0 + - 0.33309713211730796 + - 0.3430177342999942 + - 0.38054433340313826 + - 0.448238689706914 + - 0.441652992209642 + - 0.441652992209642 +- - 0.0 + - 0.38241937103076956 + - 0.2146512110245976 + - 0.2445978246859378 + - 0.5259702336069461 + - 0.49491150585281224 + - 0.502490196336352 + - 0.502490196336352 +- - 0.0 + - 0.22254895046977885 + - 0.1839845408941551 + - 0.2517546992732133 + - 0.38429247688148116 + - 0.38871220730169775 + - 0.3537675810795669 + - 0.41898519406059015 + - 0.3882384514482171 + - 0.42001351900172135 + - 0.4195597578368205 + - 0.41061833933871084 + - 0.4129936157255452 + - 0.4129936157255452 +- - 0.0 + - 0.321038670515768 + - 0.1904483614323016 + - 0.4906511157364701 + - 0.454012637866771 + - 0.46183064633681725 + - 0.46183064633681725 +- - 0.0 + - 0.3008994306386978 + - 0.39202877852691737 + - 0.42765353994617494 + - 0.413693441062102 + - 0.4275949696656343 + - 0.4275949696656343 +- - 0.0 + - 0.26357599374580576 + - 0.41544053907458545 + - 0.4102587084139304 + - 0.4102587084139304 +- - 0.0 + - 0.3880159147482879 + - 0.45640378257413144 + - 0.40792517491815167 + - 0.4534573960087132 + - 0.4534573960087132 +- - 0.0 + - 0.3335810979704511 + - 0.30834804840415164 + - 0.38720413377656726 + - 0.428283673193736 + - 0.4359819514743492 + - 0.42899862732848376 + - 0.42769859903930696 + - 0.42769859903930696 +all_intermediate_budgets: +- - 0 + - 120 + - 240 + - 360 + - 480 + - 1000 +- - 0 + - 120 + - 240 + - 360 + - 870 + - 1000 +- - 0 + - 120 + - 240 + - 570 + - 690 + - 810 + - 1000 +- - 0 + - 120 + - 150 + - 210 + - 240 + - 360 + - 690 + - 1000 +- - 0 + - 120 + - 150 + - 210 + - 240 + - 330 + - 360 + - 450 + - 570 + - 660 + - 750 + - 840 + - 960 + - 1000 +- - 0 + - 120 + - 150 + - 240 + - 360 + - 450 + - 1000 +- - 0 + - 120 + - 240 + - 450 + - 570 + - 810 + - 1000 +- - 0 + - 120 + - 240 + - 480 + - 1000 +- - 0 + - 120 + - 240 + - 510 + - 630 + - 1000 +- - 0 + - 120 + - 210 + - 240 + - 360 + - 480 + - 630 + - 990 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3050233636669336 + - !!python/tuple + - 0.2185317126338195 + - !!python/tuple + - 0.21157056027753252 + - !!python/tuple + - 0.203474497018807 + - !!python/tuple + - 0.203474497018807 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.2725771987747624 + - !!python/tuple + - 0.2034732984953683 + - !!python/tuple + - 0.17954098286099152 + - !!python/tuple + - 0.16317885111803035 + - !!python/tuple + - 0.16317885111803035 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.28068158455467385 + - !!python/tuple + - 0.27640546292420576 + - !!python/tuple + - 0.2588670862825193 + - !!python/tuple + - 0.2158360328605167 + - !!python/tuple + - 0.2210258127112818 + - !!python/tuple + - 0.2210258127112818 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3050233636669336 + - !!python/tuple + - 0.05516878405414677 + - !!python/tuple + - 0.06325532644394757 + - !!python/tuple + - 0.20685036996348963 + - !!python/tuple + - 0.15858981281719609 + - !!python/tuple + - 0.16437359067084711 + - !!python/tuple + - 0.16437359067084711 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3050233636669336 + - !!python/tuple + - 0.048050485950262234 + - !!python/tuple + - 0.06867616073995275 + - !!python/tuple + - 0.22483578850291736 + - !!python/tuple + - 0.22158598672334634 + - !!python/tuple + - 0.1086209939165887 + - !!python/tuple + - 0.177792865100242 + - !!python/tuple + - 0.12582058057141127 + - !!python/tuple + - 0.16886924231685355 + - !!python/tuple + - 0.15915350778089687 + - !!python/tuple + - 0.14217170001851348 + - !!python/tuple + - 0.14467702208934718 + - !!python/tuple + - 0.14467702208934718 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3050233636669336 + - !!python/tuple + - 0.048050485950262234 + - !!python/tuple + - 0.16569355019956486 + - !!python/tuple + - 0.13887261336221143 + - !!python/tuple + - 0.1434989459659648 + - !!python/tuple + - 0.1434989459659648 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.2725771987747624 + - !!python/tuple + - 0.22306227804941636 + - !!python/tuple + - 0.15230777951704763 + - !!python/tuple + - 0.2038706704067485 + - !!python/tuple + - 0.1809304538772994 + - !!python/tuple + - 0.1809304538772994 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3050233636669336 + - !!python/tuple + - 0.22468852268986356 + - !!python/tuple + - 0.22900671490707622 + - !!python/tuple + - 0.22900671490707622 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.2725771987747624 + - !!python/tuple + - 0.21759199014126873 + - !!python/tuple + - 0.26097962117772183 + - !!python/tuple + - 0.22192926958495912 + - !!python/tuple + - 0.22192926958495912 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.2725771987747624 + - !!python/tuple + - 0.08860125146054904 + - !!python/tuple + - 0.2429316279194451 + - !!python/tuple + - 0.20857393715254818 + - !!python/tuple + - 0.1838878244881581 + - !!python/tuple + - 0.16750137939656518 + - !!python/tuple + - 0.16547008519472642 + - !!python/tuple + - 0.16547008519472642 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 360.0 + - 480.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.2474405509297145 + - 0.3851329060383193 + - 0.391508529502654 + - 0.3980149517216228 + - 0.3980149517216228 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 360.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.4311357294567686 + - 0.5221030061939704 + - 0.5203791427747975 + - 0.5063093136182275 + - 0.5063093136182275 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 570.0 + - 690.0 + - 810.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.33309713211730796 + - 0.3430177342999942 + - 0.38054433340313826 + - 0.448238689706914 + - 0.441652992209642 + - 0.441652992209642 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 150.0 + - 210.0 + - 240.0 + - 360.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.38241937103076956 + - 0.2146512110245976 + - 0.2445978246859378 + - 0.3953142533658765 + - 0.49491150585281224 + - 0.502490196336352 + - 0.502490196336352 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 150.0 + - 210.0 + - 240.0 + - 330.0 + - 360.0 + - 450.0 + - 570.0 + - 660.0 + - 750.0 + - 840.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.22254895046977885 + - 0.1839845408941551 + - 0.2517546992732133 + - 0.38429247688148116 + - 0.38871220730169775 + - 0.3537675810795669 + - 0.41898519406059015 + - 0.3882384514482171 + - 0.42001351900172135 + - 0.4195597578368205 + - 0.41061833933871084 + - 0.4129936157255452 + - 0.4129936157255452 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 150.0 + - 240.0 + - 360.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.321038670515768 + - 0.1904483614323016 + - 0.4906511157364701 + - 0.454012637866771 + - 0.46183064633681725 + - 0.46183064633681725 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 450.0 + - 570.0 + - 810.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3008994306386978 + - 0.39202877852691737 + - 0.42765353994617494 + - 0.413693441062102 + - 0.4275949696656343 + - 0.4275949696656343 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 480.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.26357599374580576 + - 0.41544053907458545 + - 0.4102587084139304 + - 0.4102587084139304 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 510.0 + - 630.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3880159147482879 + - 0.45640378257413144 + - 0.40792517491815167 + - 0.4534573960087132 + - 0.4534573960087132 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 210.0 + - 240.0 + - 360.0 + - 480.0 + - 630.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3335810979704511 + - 0.30834804840415164 + - 0.38720413377656726 + - 0.428283673193736 + - 0.4359819514743492 + - 0.42899862732848376 + - 0.42769859903930696 + - 0.42769859903930696 +problem_name: CNTNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.36 + - 0.48 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3740662047399034 + - 0.025755072681717943 + - 0.009627084859245266 + - -0.006831775815699558 + - -0.006831775815699558 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.36 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - -0.09061518977849281 + - -0.32072901937777265 + - -0.3163682775009108 + - -0.28077677267462803 + - -0.28077677267462803 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.57 + - 0.69 + - 0.81 + - 1.0 + - !!python/tuple + - 1.0 + - 0.15738648611535017 + - 0.13229100296942775 + - 0.037362477666769554 + - -0.1338794032606109 + - -0.11722000522171268 + - -0.11722000522171268 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.15 + - 0.21 + - 0.24 + - 0.36 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.03261932051605611 + - 0.4570112026142129 + - 0.3812572589950245 + - -0.0 + - -0.2519445014666728 + - -0.27111580738092067 + - -0.27111580738092067 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.15 + - 0.21 + - 0.24 + - 0.33 + - 0.36 + - 0.45 + - 0.57 + - 0.66 + - 0.75 + - 0.84 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.43703281990239196 + - 0.5345866248746886 + - 0.36315299251250127 + - 0.027881050052081777 + - 0.01670075391404704 + - 0.10509783528563228 + - -0.0598787938789685 + - 0.017899182378102858 + - -0.062480078635021676 + - -0.06133222939599893 + - -0.03871372165948667 + - -0.04472229930780127 + - -0.04472229930780127 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.15 + - 0.24 + - 0.36 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.18788996910102293 + - 0.5182355308194888 + - -0.24116727782733435 + - -0.1484853733481934 + - -0.16826206595029503 + - -0.16826206595029503 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.45 + - 0.57 + - 0.81 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2388348558729924 + - 0.008311045733831202 + - -0.08180652811009917 + - -0.04649260060758532 + - -0.08165836679276256 + - -0.08165836679276256 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.48 + - 1.0 + - !!python/tuple + - 1.0 + - 0.33324945533431755 + - -0.050912117479562265 + - -0.0378039873867698 + - -0.0378039873867698 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.51 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.018462118568828206 + - -0.15453409202454066 + - -0.03190100393522451 + - -0.14708081519393962 + - -0.14708081519393962 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.21 + - 0.24 + - 0.36 + - 0.48 + - 0.63 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.15616223009871924 + - 0.21999258620516965 + - 0.020515626543328943 + - -0.08340053399831553 + - -0.10287435315628095 + - -0.08520910560599304 + - -0.08192051108123762 + - -0.08192051108123762 +solver_name: ADAM diff --git a/test/expected_results/CNTNEWS1_ALOE.yaml b/test/expected_results/CNTNEWS1_ALOE.yaml new file mode 100644 index 000000000..937a01ad7 --- /dev/null +++ b/test/expected_results/CNTNEWS1_ALOE.yaml @@ -0,0 +1,229 @@ +all_est_objectives: +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +all_intermediate_budgets: +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +problem_name: CNTNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +solver_name: ALOE diff --git a/test/expected_results/CNTNEWS1_ASTRODF.yaml b/test/expected_results/CNTNEWS1_ASTRODF.yaml new file mode 100644 index 000000000..ede8a37c2 --- /dev/null +++ b/test/expected_results/CNTNEWS1_ASTRODF.yaml @@ -0,0 +1,4229 @@ +all_est_objectives: +- - 0.0 + - 0.22992437234562227 + - 0.4096936132784179 + - 0.374586173485624 + - 0.39412788267000154 + - 0.39260200376375154 + - 0.39260200740173035 + - 0.39260201649667736 + - 0.3926020392340449 + - 0.39260209607746377 + - 0.3926022381860109 + - 0.3926025934573788 + - 0.3926034816357985 + - 0.39260570208184775 + - 0.3926112531969709 + - 0.3926251309847787 + - 0.39265982545429823 + - 0.39274656162809707 + - 0.3928549818453457 + - 0.3928278767910335 + - 0.39283465305461157 + - 0.3928335942634276 + - 0.3928345471754934 + - 0.3928345471754934 +- - 0.0 + - 0.3439923382503173 + - 0.49131171677303703 + - 0.5064813730041924 + - 0.5030054713826125 + - 0.503076996956343 + - 0.5030770024133112 + - 0.5030770160557317 + - 0.5030770501617831 + - 0.5030771354269113 + - 0.5030773485897321 + - 0.5030778814967839 + - 0.5030792137644134 + - 0.5030825444334873 + - 0.503090871106172 + - 0.5031116877878837 + - 0.503143476931764 + - 0.5031752660756442 + - 0.5032070552195242 + - 0.5032388443634046 + - 0.5032706335072848 + - 0.503302422651165 + - 0.5033342117950452 + - 0.5033660009389255 + - 0.5033977900828056 + - 0.5034295792266861 + - 0.5034613683705661 + - 0.5034931575144463 + - 0.5035249466583265 + - 0.5035567358022067 + - 0.5035885249460871 + - 0.5035885248215641 + - 0.5035885245102572 + - 0.5035885237319898 + - 0.5035885217863213 + - 0.50358851692215 + - 0.5035885047617215 + - 0.5035884743606506 + - 0.5035883983579733 + - 0.5035882083512803 + - 0.5035877333345471 + - 0.5035865457927146 + - 0.5035865457927146 +- - 0.0 + - 0.24889761595433638 + - 0.3498725931055646 + - 0.37112465539964296 + - 0.37150612512620546 + - 0.37141075769456483 + - 0.3714942041972504 + - 0.371494211473208 + - 0.371494229663102 + - 0.3714942751378371 + - 0.37149438882467484 + - 0.37149467304176914 + - 0.3714953835845049 + - 0.3714971599413443 + - 0.3715016008334428 + - 0.37151270306368905 + - 0.3715404586393047 + - 0.3715775459738315 + - 0.37161463330835853 + - 0.37165172064288526 + - 0.3716888079774122 + - 0.3717258953119393 + - 0.3717629826464659 + - 0.37180006998099285 + - 0.37183715731551975 + - 0.37187424465004676 + - 0.3719113319845737 + - 0.3719484193191004 + - 0.3719855066536274 + - 0.3720225939881545 + - 0.3720596813226812 + - 0.3720967686572081 + - 0.3720967688165006 + - 0.37209676921473167 + - 0.3720967702103097 + - 0.37209677269925506 + - 0.3720967789216179 + - 0.37209679447752536 + - 0.37209683336729404 + - 0.3720969305917156 + - 0.37209717365276945 + - 0.3720977813054042 + - 0.372099300436991 + - 0.372099300436991 +- - 0.0 + - 0.36369488062311356 + - 0.5222144742551554 + - 0.5127048056337827 + - 0.5099494692419162 + - 0.5106906454775327 + - 0.5106906470782434 + - 0.5106906510800201 + - 0.5106906610844618 + - 0.5106906860955661 + - 0.5106907486233269 + - 0.5106909049427287 + - 0.5106912957412334 + - 0.5106922727374951 + - 0.5106947152281492 + - 0.5107008214547847 + - 0.5107160870213733 + - 0.5107542509378448 + - 0.5108496607290235 + - 0.5110881852069703 + - 0.5113492800420396 + - 0.5116103748771091 + - 0.5118714697121785 + - 0.5121325645472481 + - 0.5123936593823174 + - 0.512654754217387 + - 0.5129158490524562 + - 0.513176943887526 + - 0.5134380387225953 + - 0.5136991335576648 + - 0.5139602283927341 + - 0.5144301990958592 + - 0.5149001697989841 + - 0.5153701405021092 + - 0.5158266584233755 + - 0.5162539045171255 + - 0.5166811506108755 + - 0.5171083967046255 + - 0.5174936597514894 + - 0.5178781812358644 + - 0.5182627027202394 + - 0.5186472242046144 + - 0.5190317456889894 + - 0.5194162671733644 + - 0.5198007886577394 + - 0.5201853101421144 + - 0.5205698316264894 + - 0.5209543531108644 + - 0.5213388745952394 + - 0.5217233960796144 + - 0.5221079175639894 + - 0.5224547469022872 + - 0.5227965437772872 + - 0.5231195696257395 + - 0.5234186418913644 + - 0.5236710831879514 + - 0.5238847062348264 + - 0.5240983292817014 + - 0.5243119523285764 + - 0.5244999895166171 + - 0.5246708879541172 + - 0.5248417863916172 + - 0.5250126848291172 + - 0.5251835832666172 + - 0.5253146205796022 + - 0.5254427944077272 + - 0.5255709682358521 + - 0.5256292290668182 + - 0.5256874898977842 + - 0.5257457507287501 + - 0.5258040115597161 + - 0.525862272390682 + - 0.5259205332216476 + - 0.5259787940526137 + - 0.5260321167717661 + - 0.5260580032694255 + - 0.5260746261958402 + - 0.5260746261958402 + - 0.5260746261958402 +- - 0.0 + - 0.2027779943453018 + - 0.3708410755083972 + - 0.41918439016619474 + - 0.4124147573209379 + - 0.41845196829119474 + - 0.4175378245786301 + - 0.41613783896276557 + - 0.4163381265075969 + - 0.4163381032245325 + - 0.4163380450168716 + - 0.4163378994977193 + - 0.4163375356998386 + - 0.41633662620513684 + - 0.4163343524683824 + - 0.4163286681264963 + - 0.4163144572717811 + - 0.4162789301349931 + - 0.4161904523331373 + - 0.4161592273105697 + - 0.4161748398218535 + - 0.4161670335662116 + - 0.41616947302109947 + - 0.41616825329365553 + - 0.41616886315737767 + - 0.41616855822551657 + - 0.41616855822551657 +- - 0.0 + - 0.29850299229375954 + - 0.4804317337645296 + - 0.4909860735289226 + - 0.5050958895590046 + - 0.5011873637224928 + - 0.4806575480675972 + - 0.44490052991749934 + - 0.4449003116387709 + - 0.44489976594194985 + - 0.4448984016998972 + - 0.44489499109476555 + - 0.4448864645819364 + - 0.4448651482998636 + - 0.4448118575946816 + - 0.4446786308317266 + - 0.44434556392433905 + - 0.4435128966558702 + - 0.441431228484698 + - 0.44126859815882513 + - 0.4413499133217617 + - 0.44130925574029356 + - 0.44132958453102766 + - 0.4413194201356604 + - 0.44132450233334397 + - 0.44132450233334397 +- - 0.0 + - 0.20591704794095048 + - 0.42997202505958965 + - 0.4194112459607936 + - 0.4154908423622787 + - 0.4164815584607936 + - 0.4161763826795436 + - 0.4163289705701686 + - 0.4163289822117008 + - 0.41632901131553124 + - 0.4163290840751074 + - 0.41632926597404774 + - 0.4163297207213986 + - 0.41633085758977584 + - 0.4163336997607189 + - 0.4163408051880765 + - 0.4163585687564705 + - 0.4164029776774555 + - 0.41646231741269857 + - 0.41652165714794165 + - 0.4165809968831847 + - 0.4166403366184278 + - 0.41669967635367094 + - 0.4167590160889139 + - 0.41681835582415694 + - 0.4168776955594 + - 0.416937035294643 + - 0.41699637502988607 + - 0.41705571476512904 + - 0.41711505450037234 + - 0.4171743942356154 + - 0.4172337339708583 + - 0.41729307370610136 + - 0.41739988522953886 + - 0.41750669675297636 + - 0.41761350827641386 + - 0.41772031979985136 + - 0.4177203214081797 + - 0.4177203254290006 + - 0.41772033548105286 + - 0.41772036061118345 + - 0.4177204234365097 + - 0.41772058049982597 + - 0.41772097315811657 + - 0.41772195480384317 + - 0.4177244089181595 + - 0.4177305442039501 + - 0.41774588241842653 + - 0.41774588241842653 +- - 0.0 + - 0.24399364811077842 + - 0.24067333561077842 + - 0.2415034137357784 + - 0.24108837467327843 + - 0.24115322452679405 + - 0.24115322947444523 + - 0.24115324184357317 + - 0.24115327276639303 + - 0.24115335007344268 + - 0.2411535433410668 + - 0.24115402651012713 + - 0.24115523443277792 + - 0.2411582542394049 + - 0.24116580375597235 + - 0.24118467754739098 + - 0.24121349970450892 + - 0.2412423218616272 + - 0.24127114401874528 + - 0.2412999661758633 + - 0.2413287883329813 + - 0.24135761049009946 + - 0.2413864326472176 + - 0.24141525480433568 + - 0.24144407696145365 + - 0.2414728991185719 + - 0.24150172127568997 + - 0.241530543432808 + - 0.24155936558992597 + - 0.2415881877470442 + - 0.24161700990416232 + - 0.24166888978697482 + - 0.2417207696697873 + - 0.24177264955259983 + - 0.24182452943541233 + - 0.24187640931822482 + - 0.24192828920103732 + - 0.2419801690838498 + - 0.24203204896666233 + - 0.24208392884947483 + - 0.24213580873228732 + - 0.24218768861509982 + - 0.2422395684979123 + - 0.24229144838072483 + - 0.24234332826353733 + - 0.24239520814634982 + - 0.24244708802916232 + - 0.2424989679119748 + - 0.24255084779478733 + - 0.24260272767759983 + - 0.24265460756041232 + - 0.24270648744322482 + - 0.2427583673260373 + - 0.24281024720884983 + - 0.24286212709166233 + - 0.24291400697447482 + - 0.24296588685728732 + - 0.2430177667400998 + - 0.24306964662291233 + - 0.24312152650572483 + - 0.24317340638853732 + - 0.24322528627134982 + - 0.2432771661541623 + - 0.24332904603697483 + - 0.24338092591978733 + - 0.24343280580259982 + - 0.24348468568541232 + - 0.24350826745032705 + - 0.2435318492152417 + - 0.24355543098015633 + - 0.243579012745071 + - 0.24360259450998586 + - 0.24362617627490057 + - 0.24364975803981512 + - 0.24367333980473 + - 0.24369692156964465 + - 0.2437205033345593 + - 0.24374408509947398 + - 0.24374408509947398 +- - 0.0 + - 0.28863506810939754 + - 0.4567329878166897 + - 0.46719516670391614 + - 0.46597446357891614 + - 0.46627963936016614 + - 0.46658481514141614 + - 0.46658481150343734 + - 0.4665848024084903 + - 0.4665847796711228 + - 0.4665847228277039 + - 0.46658458071915676 + - 0.4665842254477889 + - 0.4665833372693692 + - 0.46658111682331993 + - 0.4665755657081968 + - 0.466561687920389 + - 0.46652699345086945 + - 0.4664402572770706 + - 0.4662234168425735 + - 0.4659860579016013 + - 0.465748698960629 + - 0.46551134001965694 + - 0.46527398107868456 + - 0.4650366221377124 + - 0.46479926319674036 + - 0.4645619042557679 + - 0.4643245453147957 + - 0.4640871863738236 + - 0.4638498274328513 + - 0.46361246849187915 + - 0.46337510955090694 + - 0.46294786345715694 + - 0.46252061736340694 + - 0.4620933549556019 + - 0.4615806596431019 + - 0.4610558947309445 + - 0.46044900231972863 + - 0.4597654085697286 + - 0.4590818148197286 + - 0.4583982210697286 + - 0.4577146273197286 + - 0.45703103356972863 + - 0.4563474398197286 + - 0.4556638460697286 + - 0.454978765671967 + - 0.45420972270321697 + - 0.4534406797344669 + - 0.4526716367657169 + - 0.4519025937969669 + - 0.45113355082821693 + - 0.45031393571744543 + - 0.44945944352994543 + - 0.44860495134244543 + - 0.44775045915494543 + - 0.4473505535385362 + - 0.44692330744478626 + - 0.4464960613510361 + - 0.4460688152572861 + - 0.4456415691635362 + - 0.4452143230697861 + - 0.44478707697603603 + - 0.44433402484812556 + - 0.4438679382003982 + - 0.4434018515526709 + - 0.44292244947658715 + - 0.44292244947658715 +- - 0.0 + - 0.2368489701567661 + - 0.43639394983304697 + - 0.4349570424799939 + - 0.41440299043971335 + - 0.40471557359553323 + - 0.40959838609553323 + - 0.40807250718928323 + - 0.409407651232252 + - 0.4094076977983807 + - 0.40940781421370254 + - 0.4094081052520071 + - 0.4094088328477685 + - 0.40941065183717207 + - 0.40941519931068093 + - 0.4094265679944531 + - 0.4094549897038835 + - 0.4095260439774595 + - 0.40970367966139953 + - 0.4101477688712496 + - 0.4107411662236801 + - 0.411334563576111 + - 0.4119279609285414 + - 0.41252135828097203 + - 0.41311475563340244 + - 0.4136782601806195 + - 0.41423457019852317 + - 0.4147908802164268 + - 0.4153471902343305 + - 0.415903500252234 + - 0.4164598102701379 + - 0.4170161202880414 + - 0.41757243030594515 + - 0.4181287403238488 + - 0.4191090464657198 + - 0.42002303508905287 + - 0.42089087871698255 + - 0.42175872234491224 + - 0.4226265659728419 + - 0.4234944096007716 + - 0.4243622532287013 + - 0.42520124655539987 + - 0.4260023329811811 + - 0.42680341940696237 + - 0.4276045058327436 + - 0.4282937704296772 + - 0.4289530972657695 + - 0.42955391208510546 + - 0.4301547269044414 + - 0.43075554172377734 + - 0.43135212239898857 + - 0.4318450655416254 + - 0.43231236595666445 + - 0.4327796663717035 + - 0.4331962619505304 + - 0.43359680516342103 + - 0.43399734837631165 + - 0.4343978915892023 + - 0.43477798437659365 + - 0.4351085661117764 + - 0.43536687392630535 + - 0.43556714553275067 + - 0.43574918143984775 + - 0.43588269584414463 + - 0.43601621024844156 + - 0.43614972465273844 + - 0.4362832390570353 + - 0.4364167534613322 + - 0.43646631801602614 + - 0.43646631801602614 + - 0.43638564968170984 + - 0.43629461713332574 + - 0.436179169060033 + - 0.4359971039632646 + - 0.4358150388664961 + - 0.43563297376972765 + - 0.43534238113981305 + - 0.43497825094627607 + - 0.43461412075273914 + - 0.4342499905592023 + - 0.43385951317406474 + - 0.43385951317406474 +all_intermediate_budgets: +- - 5 + - 37 + - 43 + - 49 + - 55 + - 130 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 414 + - 441 + - 468 + - 513 + - 524 + - 1000 +- - 5 + - 37 + - 43 + - 88 + - 109 + - 167 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 405 + - 414 + - 423 + - 432 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 495 + - 504 + - 513 + - 886 + - 897 + - 908 + - 919 + - 930 + - 941 + - 952 + - 963 + - 974 + - 985 + - 996 + - 1000 +- - 5 + - 37 + - 61 + - 81 + - 137 + - 158 + - 167 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 405 + - 414 + - 423 + - 432 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 495 + - 504 + - 513 + - 886 + - 897 + - 908 + - 919 + - 930 + - 941 + - 952 + - 963 + - 974 + - 985 + - 996 + - 1000 +- - 5 + - 37 + - 43 + - 49 + - 109 + - 130 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 405 + - 414 + - 423 + - 432 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 495 + - 504 + - 513 + - 524 + - 534 + - 544 + - 554 + - 564 + - 574 + - 584 + - 594 + - 604 + - 614 + - 624 + - 634 + - 644 + - 654 + - 664 + - 674 + - 684 + - 694 + - 704 + - 714 + - 724 + - 734 + - 744 + - 754 + - 764 + - 774 + - 784 + - 794 + - 804 + - 814 + - 824 + - 834 + - 844 + - 854 + - 864 + - 874 + - 886 + - 897 + - 908 + - 919 + - 930 + - 941 + - 952 + - 963 + - 974 + - 985 + - 996 + - 1000 +- - 5 + - 37 + - 43 + - 49 + - 95 + - 102 + - 109 + - 116 + - 183 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 414 + - 423 + - 432 + - 486 + - 495 + - 504 + - 513 + - 1000 +- - 5 + - 37 + - 43 + - 81 + - 88 + - 95 + - 102 + - 109 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 1000 +- - 5 + - 37 + - 43 + - 49 + - 102 + - 109 + - 151 + - 158 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 405 + - 414 + - 423 + - 432 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 495 + - 504 + - 513 + - 524 + - 534 + - 544 + - 554 + - 886 + - 897 + - 908 + - 919 + - 930 + - 941 + - 952 + - 963 + - 974 + - 985 + - 996 + - 1000 +- - 5 + - 37 + - 95 + - 116 + - 123 + - 167 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 405 + - 414 + - 423 + - 432 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 495 + - 504 + - 513 + - 524 + - 534 + - 544 + - 554 + - 564 + - 574 + - 584 + - 594 + - 604 + - 614 + - 624 + - 634 + - 644 + - 654 + - 664 + - 674 + - 684 + - 694 + - 704 + - 714 + - 724 + - 734 + - 744 + - 754 + - 764 + - 774 + - 784 + - 794 + - 804 + - 814 + - 824 + - 834 + - 844 + - 854 + - 864 + - 874 + - 886 + - 897 + - 908 + - 919 + - 930 + - 941 + - 952 + - 963 + - 974 + - 985 + - 996 + - 1000 +- - 5 + - 37 + - 43 + - 49 + - 109 + - 116 + - 123 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 405 + - 414 + - 423 + - 432 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 495 + - 504 + - 513 + - 524 + - 534 + - 544 + - 554 + - 564 + - 574 + - 584 + - 594 + - 604 + - 614 + - 624 + - 634 + - 644 + - 654 + - 664 + - 674 + - 684 + - 694 + - 704 + - 714 + - 724 + - 734 + - 744 + - 886 + - 897 + - 908 + - 919 + - 930 + - 941 + - 952 + - 963 + - 974 + - 985 + - 996 + - 1000 +- - 5 + - 37 + - 43 + - 81 + - 88 + - 116 + - 123 + - 158 + - 167 + - 297 + - 306 + - 315 + - 324 + - 333 + - 342 + - 351 + - 360 + - 369 + - 378 + - 387 + - 396 + - 405 + - 414 + - 423 + - 432 + - 441 + - 450 + - 459 + - 468 + - 477 + - 486 + - 495 + - 504 + - 513 + - 524 + - 534 + - 544 + - 554 + - 564 + - 574 + - 584 + - 594 + - 604 + - 614 + - 624 + - 634 + - 644 + - 654 + - 664 + - 674 + - 684 + - 694 + - 704 + - 714 + - 724 + - 734 + - 744 + - 754 + - 764 + - 774 + - 784 + - 794 + - 804 + - 814 + - 824 + - 834 + - 844 + - 854 + - 864 + - 874 + - 886 + - 897 + - 908 + - 919 + - 930 + - 941 + - 952 + - 963 + - 974 + - 985 + - 996 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.1875 + - !!python/tuple + - 0.22916666666666666 + - !!python/tuple + - 0.20833333333333334 + - !!python/tuple + - 0.21024068196614584 + - !!python/tuple + - 0.21024067741867233 + - !!python/tuple + - 0.21024066604998856 + - !!python/tuple + - 0.21024063762827913 + - !!python/tuple + - 0.21024056657400556 + - !!python/tuple + - 0.21024038893832162 + - !!python/tuple + - 0.21023994484911177 + - !!python/tuple + - 0.21023883462608714 + - !!python/tuple + - 0.21023605906852558 + - !!python/tuple + - 0.21022912017462167 + - !!python/tuple + - 0.2102117729398619 + - !!python/tuple + - 0.21016840485296248 + - !!python/tuple + - 0.21005998463571393 + - !!python/tuple + - 0.20992445936415324 + - !!python/tuple + - 0.20995834068204342 + - !!python/tuple + - 0.20994987035257087 + - !!python/tuple + - 0.20995119384155095 + - !!python/tuple + - 0.20995000270146888 + - !!python/tuple + - 0.20995000270146888 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.23437500000000003 + - !!python/tuple + - 0.22216796875000003 + - !!python/tuple + - 0.22521972656250003 + - !!python/tuple + - 0.22516012191772464 + - !!python/tuple + - 0.22516011737025113 + - !!python/tuple + - 0.22516010600156736 + - !!python/tuple + - 0.22516007757985793 + - !!python/tuple + - 0.22516000652558435 + - !!python/tuple + - 0.2251598288899004 + - !!python/tuple + - 0.22515938480069056 + - !!python/tuple + - 0.22515827457766593 + - !!python/tuple + - 0.22515549902010437 + - !!python/tuple + - 0.22514856012620046 + - !!python/tuple + - 0.2251312128914407 + - !!python/tuple + - 0.2251047219382072 + - !!python/tuple + - 0.22507823098497368 + - !!python/tuple + - 0.22505174003174017 + - !!python/tuple + - 0.22502524907850666 + - !!python/tuple + - 0.22499875812527315 + - !!python/tuple + - 0.22497226717203964 + - !!python/tuple + - 0.22494577621880613 + - !!python/tuple + - 0.22491928526557262 + - !!python/tuple + - 0.2248927943123391 + - !!python/tuple + - 0.2248663033591056 + - !!python/tuple + - 0.22483981240587209 + - !!python/tuple + - 0.22481332145263858 + - !!python/tuple + - 0.22478683049940507 + - !!python/tuple + - 0.22476033954617156 + - !!python/tuple + - 0.22473384859293805 + - !!python/tuple + - 0.22473384869670704 + - !!python/tuple + - 0.22473384895612952 + - !!python/tuple + - 0.2247338496046857 + - !!python/tuple + - 0.22473385122607614 + - !!python/tuple + - 0.22473385527955225 + - !!python/tuple + - 0.22473386541324256 + - !!python/tuple + - 0.22473389074746833 + - !!python/tuple + - 0.22473395408303273 + - !!python/tuple + - 0.22473411242194372 + - !!python/tuple + - 0.2247345082692212 + - !!python/tuple + - 0.22473549788741493 + - !!python/tuple + - 0.22473549788741493 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.2734375 + - !!python/tuple + - 0.263671875 + - !!python/tuple + - 0.26348114013671875 + - !!python/tuple + - 0.26352882385253906 + - !!python/tuple + - 0.2634871006011963 + - !!python/tuple + - 0.2634870969632175 + - !!python/tuple + - 0.26348708786827046 + - !!python/tuple + - 0.2634870651309029 + - !!python/tuple + - 0.26348700828748406 + - !!python/tuple + - 0.2634868661789369 + - !!python/tuple + - 0.263486510907569 + - !!python/tuple + - 0.2634856227291493 + - !!python/tuple + - 0.2634834022831001 + - !!python/tuple + - 0.26347785116797695 + - !!python/tuple + - 0.26346397338016914 + - !!python/tuple + - 0.2634454297129057 + - !!python/tuple + - 0.26342688604564224 + - !!python/tuple + - 0.2634083423783788 + - !!python/tuple + - 0.26338979871111534 + - !!python/tuple + - 0.2633712550438519 + - !!python/tuple + - 0.26335271137658844 + - !!python/tuple + - 0.263334167709325 + - !!python/tuple + - 0.26331562404206155 + - !!python/tuple + - 0.2632970803747981 + - !!python/tuple + - 0.26327853670753465 + - !!python/tuple + - 0.2632599930402712 + - !!python/tuple + - 0.26324144937300775 + - !!python/tuple + - 0.2632229057057443 + - !!python/tuple + - 0.26320436203848085 + - !!python/tuple + - 0.2631858183712174 + - !!python/tuple + - 0.26318581829157117 + - !!python/tuple + - 0.26318581809245556 + - !!python/tuple + - 0.2631858175946665 + - !!python/tuple + - 0.26318581635019395 + - !!python/tuple + - 0.26318581323901247 + - !!python/tuple + - 0.26318580546105874 + - !!python/tuple + - 0.26318578601617443 + - !!python/tuple + - 0.26318573740396367 + - !!python/tuple + - 0.26318561587343675 + - !!python/tuple + - 0.26318531204711937 + - !!python/tuple + - 0.26318455248132594 + - !!python/tuple + - 0.26318455248132594 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.1875 + - !!python/tuple + - 0.22916666666666666 + - !!python/tuple + - 0.23221842447916666 + - !!python/tuple + - 0.23145548502604166 + - !!python/tuple + - 0.23145548320705225 + - !!python/tuple + - 0.23145547865957875 + - !!python/tuple + - 0.23145546729089497 + - !!python/tuple + - 0.23145543886918554 + - !!python/tuple + - 0.23145536781491197 + - !!python/tuple + - 0.23145519017922803 + - !!python/tuple + - 0.23145474609001818 + - !!python/tuple + - 0.23145363586699355 + - !!python/tuple + - 0.231450860309432 + - !!python/tuple + - 0.23144392141552808 + - !!python/tuple + - 0.2314265741807683 + - !!python/tuple + - 0.2313832060938689 + - !!python/tuple + - 0.23127478587662034 + - !!python/tuple + - 0.23100373533349897 + - !!python/tuple + - 0.23070703665728368 + - !!python/tuple + - 0.23041033798106839 + - !!python/tuple + - 0.2301136393048531 + - !!python/tuple + - 0.2298169406286378 + - !!python/tuple + - 0.22952024195242252 + - !!python/tuple + - 0.22922354327620723 + - !!python/tuple + - 0.22892684459999194 + - !!python/tuple + - 0.22863014592377665 + - !!python/tuple + - 0.22833344724756136 + - !!python/tuple + - 0.22803674857134607 + - !!python/tuple + - 0.22774004989513078 + - !!python/tuple + - 0.22720599227794328 + - !!python/tuple + - 0.22667193466075578 + - !!python/tuple + - 0.22613787704356828 + - !!python/tuple + - 0.22560381942638078 + - !!python/tuple + - 0.22506976180919328 + - !!python/tuple + - 0.22453570419200578 + - !!python/tuple + - 0.22400164657481828 + - !!python/tuple + - 0.22346758895763078 + - !!python/tuple + - 0.22293353134044328 + - !!python/tuple + - 0.22239947372325578 + - !!python/tuple + - 0.22186541610606828 + - !!python/tuple + - 0.22133135848888078 + - !!python/tuple + - 0.22079730087169328 + - !!python/tuple + - 0.22026324325450578 + - !!python/tuple + - 0.21972918563731828 + - !!python/tuple + - 0.21919512802013078 + - !!python/tuple + - 0.21866107040294328 + - !!python/tuple + - 0.21812701278575578 + - !!python/tuple + - 0.21759295516856828 + - !!python/tuple + - 0.21705889755138078 + - !!python/tuple + - 0.21652483993419328 + - !!python/tuple + - 0.21599078231700578 + - !!python/tuple + - 0.21545672469981828 + - !!python/tuple + - 0.21492266708263078 + - !!python/tuple + - 0.21438860946544328 + - !!python/tuple + - 0.21385455184825578 + - !!python/tuple + - 0.21332049423106828 + - !!python/tuple + - 0.21278643661388078 + - !!python/tuple + - 0.21225237899669328 + - !!python/tuple + - 0.21171832137950578 + - !!python/tuple + - 0.21118426376231828 + - !!python/tuple + - 0.21065020614513078 + - !!python/tuple + - 0.21011614852794328 + - !!python/tuple + - 0.20958209091075578 + - !!python/tuple + - 0.20904803329356828 + - !!python/tuple + - 0.20851397567638078 + - !!python/tuple + - 0.20827122221402283 + - !!python/tuple + - 0.2080284687516649 + - !!python/tuple + - 0.20778571528930695 + - !!python/tuple + - 0.207542961826949 + - !!python/tuple + - 0.20730020836459107 + - !!python/tuple + - 0.20705745490223312 + - !!python/tuple + - 0.20681470143987518 + - !!python/tuple + - 0.20657194797751724 + - !!python/tuple + - 0.2063291945151593 + - !!python/tuple + - 0.20608644105280136 + - !!python/tuple + - 0.2058436875904434 + - !!python/tuple + - 0.2058436875904434 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.23437500000000003 + - !!python/tuple + - 0.15625000000000006 + - !!python/tuple + - 0.14404296875000006 + - !!python/tuple + - 0.15319824218750006 + - !!python/tuple + - 0.15090942382812506 + - !!python/tuple + - 0.14862060546875006 + - !!python/tuple + - 0.148918628692627 + - !!python/tuple + - 0.14891859231283894 + - !!python/tuple + - 0.14891850136336876 + - !!python/tuple + - 0.14891827398969332 + - !!python/tuple + - 0.1489177055555047 + - !!python/tuple + - 0.1489162844700332 + - !!python/tuple + - 0.1489127317563544 + - !!python/tuple + - 0.1489038499721574 + - !!python/tuple + - 0.14888164551166488 + - !!python/tuple + - 0.14882613436043363 + - !!python/tuple + - 0.1486936795942661 + - !!python/tuple + - 0.14865031150736668 + - !!python/tuple + - 0.1486719955508164 + - !!python/tuple + - 0.14866115352909154 + - !!python/tuple + - 0.14866454166088056 + - !!python/tuple + - 0.14866284759498605 + - !!python/tuple + - 0.1486636946279333 + - !!python/tuple + - 0.14866327111145966 + - !!python/tuple + - 0.14866327111145966 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.15625 + - !!python/tuple + - 0.166015625 + - !!python/tuple + - 0.18833705357142855 + - !!python/tuple + - 0.2106584821428571 + - !!python/tuple + - 0.23297991071428564 + - !!python/tuple + - 0.2553013392857142 + - !!python/tuple + - 0.2553014529725519 + - !!python/tuple + - 0.2553017371896462 + - !!python/tuple + - 0.255302447732382 + - !!python/tuple + - 0.2553042240892214 + - !!python/tuple + - 0.2553086649813199 + - !!python/tuple + - 0.25531976721156613 + - !!python/tuple + - 0.25534752278718176 + - !!python/tuple + - 0.25541691172622083 + - !!python/tuple + - 0.2555903840738185 + - !!python/tuple + - 0.2560240649428127 + - !!python/tuple + - 0.2571082671152982 + - !!python/tuple + - 0.25719297041002365 + - !!python/tuple + - 0.25715061876266093 + - !!python/tuple + - 0.25717179458634226 + - !!python/tuple + - 0.2571612066745016 + - !!python/tuple + - 0.25716650063042196 + - !!python/tuple + - 0.25716385365246175 + - !!python/tuple + - 0.25716385365246175 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.15625 + - !!python/tuple + - 0.1953125 + - !!python/tuple + - 0.201416015625 + - !!python/tuple + - 0.19989013671875 + - !!python/tuple + - 0.20036697387695312 + - !!python/tuple + - 0.20012855529785156 + - !!python/tuple + - 0.20012853710795753 + - !!python/tuple + - 0.20012849163322244 + - !!python/tuple + - 0.20012837794638472 + - !!python/tuple + - 0.2001280937292904 + - !!python/tuple + - 0.20012738318655465 + - !!python/tuple + - 0.20012560682971525 + - !!python/tuple + - 0.20012116593761675 + - !!python/tuple + - 0.2001100637073705 + - !!python/tuple + - 0.20008230813175487 + - !!python/tuple + - 0.2000129191927158 + - !!python/tuple + - 0.19992020085639853 + - !!python/tuple + - 0.19982748252008126 + - !!python/tuple + - 0.19973476418376399 + - !!python/tuple + - 0.19964204584744671 + - !!python/tuple + - 0.19954932751112944 + - !!python/tuple + - 0.19945660917481217 + - !!python/tuple + - 0.1993638908384949 + - !!python/tuple + - 0.19927117250217763 + - !!python/tuple + - 0.19917845416586036 + - !!python/tuple + - 0.1990857358295431 + - !!python/tuple + - 0.19899301749322582 + - !!python/tuple + - 0.19890029915690854 + - !!python/tuple + - 0.19880758082059127 + - !!python/tuple + - 0.198714862484274 + - !!python/tuple + - 0.19862214414795673 + - !!python/tuple + - 0.19845525114258564 + - !!python/tuple + - 0.19828835813721454 + - !!python/tuple + - 0.19812146513184345 + - !!python/tuple + - 0.19795457212647236 + - !!python/tuple + - 0.1979545696134593 + - !!python/tuple + - 0.19795456333092665 + - !!python/tuple + - 0.19795454762459502 + - !!python/tuple + - 0.19795450835876596 + - !!python/tuple + - 0.19795441019419333 + - !!python/tuple + - 0.1979541647827617 + - !!python/tuple + - 0.19795355125418265 + - !!python/tuple + - 0.19795201743273502 + - !!python/tuple + - 0.19794818287911592 + - !!python/tuple + - 0.19793859649506818 + - !!python/tuple + - 0.1979146305349488 + - !!python/tuple + - 0.1979146305349488 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.313720703125 + - !!python/tuple + - 0.31341552734375 + - !!python/tuple + - 0.313568115234375 + - !!python/tuple + - 0.31354427337646484 + - !!python/tuple + - 0.31354427155747544 + - !!python/tuple + - 0.31354426701000193 + - !!python/tuple + - 0.31354425564131816 + - !!python/tuple + - 0.31354422721960873 + - !!python/tuple + - 0.31354415616533515 + - !!python/tuple + - 0.3135439785296512 + - !!python/tuple + - 0.31354353444044136 + - !!python/tuple + - 0.31354242421741674 + - !!python/tuple + - 0.3135396486598552 + - !!python/tuple + - 0.31353270976595127 + - !!python/tuple + - 0.31352211338465785 + - !!python/tuple + - 0.31351151700336444 + - !!python/tuple + - 0.313500920622071 + - !!python/tuple + - 0.3134903242407776 + - !!python/tuple + - 0.3134797278594842 + - !!python/tuple + - 0.3134691314781908 + - !!python/tuple + - 0.31345853509689736 + - !!python/tuple + - 0.31344793871560395 + - !!python/tuple + - 0.31343734233431053 + - !!python/tuple + - 0.3134267459530171 + - !!python/tuple + - 0.3134161495717237 + - !!python/tuple + - 0.3134055531904303 + - !!python/tuple + - 0.31339495680913687 + - !!python/tuple + - 0.31338436042784346 + - !!python/tuple + - 0.31337376404655004 + - !!python/tuple + - 0.3133546905602219 + - !!python/tuple + - 0.3133356170738938 + - !!python/tuple + - 0.31331654358756567 + - !!python/tuple + - 0.31329747010123754 + - !!python/tuple + - 0.3132783966149094 + - !!python/tuple + - 0.3132593231285813 + - !!python/tuple + - 0.31324024964225317 + - !!python/tuple + - 0.31322117615592504 + - !!python/tuple + - 0.3132021026695969 + - !!python/tuple + - 0.3131830291832688 + - !!python/tuple + - 0.31316395569694067 + - !!python/tuple + - 0.31314488221061254 + - !!python/tuple + - 0.3131258087242844 + - !!python/tuple + - 0.3131067352379563 + - !!python/tuple + - 0.31308766175162817 + - !!python/tuple + - 0.31306858826530004 + - !!python/tuple + - 0.3130495147789719 + - !!python/tuple + - 0.3130304412926438 + - !!python/tuple + - 0.31301136780631567 + - !!python/tuple + - 0.31299229431998754 + - !!python/tuple + - 0.3129732208336594 + - !!python/tuple + - 0.3129541473473313 + - !!python/tuple + - 0.31293507386100317 + - !!python/tuple + - 0.31291600037467504 + - !!python/tuple + - 0.3128969268883469 + - !!python/tuple + - 0.3128778534020188 + - !!python/tuple + - 0.31285877991569067 + - !!python/tuple + - 0.31283970642936254 + - !!python/tuple + - 0.3128206329430344 + - !!python/tuple + - 0.3128015594567063 + - !!python/tuple + - 0.31278248597037817 + - !!python/tuple + - 0.31276341248405004 + - !!python/tuple + - 0.3127443389977219 + - !!python/tuple + - 0.3127252655113938 + - !!python/tuple + - 0.31270619202506567 + - !!python/tuple + - 0.31268711853873754 + - !!python/tuple + - 0.3126784487722248 + - !!python/tuple + - 0.312669779005712 + - !!python/tuple + - 0.31266110923919926 + - !!python/tuple + - 0.3126524394726865 + - !!python/tuple + - 0.31264376970617375 + - !!python/tuple + - 0.312635099939661 + - !!python/tuple + - 0.31262643017314823 + - !!python/tuple + - 0.31261776040663547 + - !!python/tuple + - 0.3126090906401227 + - !!python/tuple + - 0.31260042087360995 + - !!python/tuple + - 0.3125917511070972 + - !!python/tuple + - 0.3125917511070972 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.15625 + - !!python/tuple + - 0.1953125 + - !!python/tuple + - 0.1983642578125 + - !!python/tuple + - 0.197601318359375 + - !!python/tuple + - 0.19683837890625 + - !!python/tuple + - 0.19683838800119702 + - !!python/tuple + - 0.19683841073856456 + - !!python/tuple + - 0.19683846758198342 + - !!python/tuple + - 0.19683860969053057 + - !!python/tuple + - 0.19683896496189845 + - !!python/tuple + - 0.19683985314031816 + - !!python/tuple + - 0.1968420735863674 + - !!python/tuple + - 0.19684762470149053 + - !!python/tuple + - 0.19686150248929835 + - !!python/tuple + - 0.19689619695881788 + - !!python/tuple + - 0.19698293313261672 + - !!python/tuple + - 0.19719977356711382 + - !!python/tuple + - 0.19774187465335658 + - !!python/tuple + - 0.19833527200578713 + - !!python/tuple + - 0.19892866935821768 + - !!python/tuple + - 0.19952206671064823 + - !!python/tuple + - 0.20011546406307879 + - !!python/tuple + - 0.20070886141550934 + - !!python/tuple + - 0.2013022587679399 + - !!python/tuple + - 0.20189565612037044 + - !!python/tuple + - 0.202489053472801 + - !!python/tuple + - 0.20308245082523155 + - !!python/tuple + - 0.2036758481776621 + - !!python/tuple + - 0.20426924553009265 + - !!python/tuple + - 0.2048626428825232 + - !!python/tuple + - 0.2059307581168982 + - !!python/tuple + - 0.2069988733512732 + - !!python/tuple + - 0.2080669885856482 + - !!python/tuple + - 0.2091351038200232 + - !!python/tuple + - 0.2102032190543982 + - !!python/tuple + - 0.2112713342887732 + - !!python/tuple + - 0.2123394495231482 + - !!python/tuple + - 0.2134075647575232 + - !!python/tuple + - 0.2144756799918982 + - !!python/tuple + - 0.2155437952262732 + - !!python/tuple + - 0.2166119104606482 + - !!python/tuple + - 0.2176800256950232 + - !!python/tuple + - 0.2187481409293982 + - !!python/tuple + - 0.2198162561637732 + - !!python/tuple + - 0.2208843713981482 + - !!python/tuple + - 0.2219524866325232 + - !!python/tuple + - 0.2230206018668982 + - !!python/tuple + - 0.2240887171012732 + - !!python/tuple + - 0.2251568323356482 + - !!python/tuple + - 0.2262249475700232 + - !!python/tuple + - 0.2272930628043982 + - !!python/tuple + - 0.2283611780387732 + - !!python/tuple + - 0.2294292932731482 + - !!python/tuple + - 0.22991480019786412 + - !!python/tuple + - 0.23040030712258003 + - !!python/tuple + - 0.23088581404729594 + - !!python/tuple + - 0.23137132097201185 + - !!python/tuple + - 0.23185682789672776 + - !!python/tuple + - 0.23234233482144367 + - !!python/tuple + - 0.2328278417461596 + - !!python/tuple + - 0.2333133486708755 + - !!python/tuple + - 0.2337988555955914 + - !!python/tuple + - 0.23428436252030732 + - !!python/tuple + - 0.23476986944502323 + - !!python/tuple + - 0.23476986944502323 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3125 + - !!python/tuple + - 0.1875 + - !!python/tuple + - 0.197265625 + - !!python/tuple + - 0.2216796875 + - !!python/tuple + - 0.22930908203125 + - !!python/tuple + - 0.225494384765625 + - !!python/tuple + - 0.2266864776611328 + - !!python/tuple + - 0.22564339637756348 + - !!python/tuple + - 0.2256433599977754 + - !!python/tuple + - 0.22564326904830523 + - !!python/tuple + - 0.22564304167462979 + - !!python/tuple + - 0.22564247324044118 + - !!python/tuple + - 0.22564105215496966 + - !!python/tuple + - 0.22563749944129086 + - !!python/tuple + - 0.22562861765709386 + - !!python/tuple + - 0.22560641319660135 + - !!python/tuple + - 0.2255509020453701 + - !!python/tuple + - 0.22541212416729195 + - !!python/tuple + - 0.2250651794720966 + - !!python/tuple + - 0.2246015877905102 + - !!python/tuple + - 0.22413799610892382 + - !!python/tuple + - 0.22367440442733744 + - !!python/tuple + - 0.22321081274575105 + - !!python/tuple + - 0.22274722106416467 + - !!python/tuple + - 0.22228362938257828 + - !!python/tuple + - 0.2218200377009919 + - !!python/tuple + - 0.22135644601940552 + - !!python/tuple + - 0.22089285433781913 + - !!python/tuple + - 0.22042926265623275 + - !!python/tuple + - 0.21996567097464637 + - !!python/tuple + - 0.21950207929305998 + - !!python/tuple + - 0.2190384876114736 + - !!python/tuple + - 0.21857489592988721 + - !!python/tuple + - 0.21774043090303175 + - !!python/tuple + - 0.21690596587617628 + - !!python/tuple + - 0.2160715008493208 + - !!python/tuple + - 0.21523703582246534 + - !!python/tuple + - 0.21440257079560987 + - !!python/tuple + - 0.2135681057687544 + - !!python/tuple + - 0.21273364074189893 + - !!python/tuple + - 0.21189917571504346 + - !!python/tuple + - 0.211064710688188 + - !!python/tuple + - 0.21023024566133253 + - !!python/tuple + - 0.20939578063447706 + - !!python/tuple + - 0.2085613156076216 + - !!python/tuple + - 0.20772685058076612 + - !!python/tuple + - 0.20689238555391065 + - !!python/tuple + - 0.20605792052705518 + - !!python/tuple + - 0.20522345550019971 + - !!python/tuple + - 0.20438899047334425 + - !!python/tuple + - 0.20355452544648878 + - !!python/tuple + - 0.2027200604196333 + - !!python/tuple + - 0.20188559539277784 + - !!python/tuple + - 0.20105113036592237 + - !!python/tuple + - 0.2002166653390669 + - !!python/tuple + - 0.19938220031221143 + - !!python/tuple + - 0.19854773528535596 + - !!python/tuple + - 0.1977132702585005 + - !!python/tuple + - 0.19687880523164503 + - !!python/tuple + - 0.19604434020478956 + - !!python/tuple + - 0.1952098751779341 + - !!python/tuple + - 0.19437541015107862 + - !!python/tuple + - 0.19354094512422315 + - !!python/tuple + - 0.19270648009736768 + - !!python/tuple + - 0.19187201507051221 + - !!python/tuple + - 0.19103755004365675 + - !!python/tuple + - 0.19020308501680128 + - !!python/tuple + - 0.1893686199899458 + - !!python/tuple + - 0.18853415496309034 + - !!python/tuple + - 0.18739624810828742 + - !!python/tuple + - 0.1862583412534845 + - !!python/tuple + - 0.1851204343986816 + - !!python/tuple + - 0.18398252754387867 + - !!python/tuple + - 0.18284462068907575 + - !!python/tuple + - 0.18170671383427284 + - !!python/tuple + - 0.18056880697946992 + - !!python/tuple + - 0.179430900124667 + - !!python/tuple + - 0.1782929932698641 + - !!python/tuple + - 0.17715508641506117 + - !!python/tuple + - 0.17601717956025825 + - !!python/tuple + - 0.17601717956025825 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 49.0 + - 55.0 + - 130.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 414.0 + - 441.0 + - 468.0 + - 513.0 + - 524.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.22992437234562227 + - 0.4096936132784179 + - 0.374586173485624 + - 0.39412788267000154 + - 0.39260200376375154 + - 0.39260200740173035 + - 0.39260201649667736 + - 0.3926020392340449 + - 0.39260209607746377 + - 0.3926022381860109 + - 0.3926025934573788 + - 0.3926034816357985 + - 0.39260570208184775 + - 0.3926112531969709 + - 0.3926251309847787 + - 0.39265982545429823 + - 0.39274656162809707 + - 0.3928549818453457 + - 0.3928278767910335 + - 0.39283465305461157 + - 0.3928335942634276 + - 0.3928345471754934 + - 0.3928345471754934 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 88.0 + - 109.0 + - 167.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 405.0 + - 414.0 + - 423.0 + - 432.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 886.0 + - 897.0 + - 908.0 + - 919.0 + - 930.0 + - 941.0 + - 952.0 + - 963.0 + - 974.0 + - 985.0 + - 996.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3439923382503173 + - 0.49131171677303703 + - 0.5064813730041924 + - 0.5030054713826125 + - 0.503076996956343 + - 0.5030770024133112 + - 0.5030770160557317 + - 0.5030770501617831 + - 0.5030771354269113 + - 0.5030773485897321 + - 0.5030778814967839 + - 0.5030792137644134 + - 0.5030825444334873 + - 0.503090871106172 + - 0.5031116877878837 + - 0.503143476931764 + - 0.5031752660756442 + - 0.5032070552195242 + - 0.5032388443634046 + - 0.5032706335072848 + - 0.503302422651165 + - 0.5033342117950452 + - 0.5033660009389255 + - 0.5033977900828056 + - 0.5034295792266861 + - 0.5034613683705661 + - 0.5034931575144463 + - 0.5035249466583265 + - 0.5035567358022067 + - 0.5035885249460871 + - 0.5035885248215641 + - 0.5035885245102572 + - 0.5035885237319898 + - 0.5035885217863213 + - 0.50358851692215 + - 0.5035885047617215 + - 0.5035884743606506 + - 0.5035883983579733 + - 0.5035882083512803 + - 0.5035877333345471 + - 0.5035865457927146 + - 0.5035865457927146 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 61.0 + - 81.0 + - 137.0 + - 158.0 + - 167.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 405.0 + - 414.0 + - 423.0 + - 432.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 886.0 + - 897.0 + - 908.0 + - 919.0 + - 930.0 + - 941.0 + - 952.0 + - 963.0 + - 974.0 + - 985.0 + - 996.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.24889761595433638 + - 0.3498725931055646 + - 0.37112465539964296 + - 0.37150612512620546 + - 0.37141075769456483 + - 0.3714942041972504 + - 0.371494211473208 + - 0.371494229663102 + - 0.3714942751378371 + - 0.37149438882467484 + - 0.37149467304176914 + - 0.3714953835845049 + - 0.3714971599413443 + - 0.3715016008334428 + - 0.37151270306368905 + - 0.3715404586393047 + - 0.3715775459738315 + - 0.37161463330835853 + - 0.37165172064288526 + - 0.3716888079774122 + - 0.3717258953119393 + - 0.3717629826464659 + - 0.37180006998099285 + - 0.37183715731551975 + - 0.37187424465004676 + - 0.3719113319845737 + - 0.3719484193191004 + - 0.3719855066536274 + - 0.3720225939881545 + - 0.3720596813226812 + - 0.3720967686572081 + - 0.3720967688165006 + - 0.37209676921473167 + - 0.3720967702103097 + - 0.37209677269925506 + - 0.3720967789216179 + - 0.37209679447752536 + - 0.37209683336729404 + - 0.3720969305917156 + - 0.37209717365276945 + - 0.3720977813054042 + - 0.372099300436991 + - 0.372099300436991 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 49.0 + - 109.0 + - 130.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 405.0 + - 414.0 + - 423.0 + - 432.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 524.0 + - 534.0 + - 544.0 + - 554.0 + - 564.0 + - 574.0 + - 584.0 + - 594.0 + - 604.0 + - 614.0 + - 624.0 + - 634.0 + - 644.0 + - 654.0 + - 664.0 + - 674.0 + - 684.0 + - 694.0 + - 704.0 + - 714.0 + - 724.0 + - 734.0 + - 744.0 + - 754.0 + - 764.0 + - 774.0 + - 784.0 + - 794.0 + - 804.0 + - 814.0 + - 824.0 + - 834.0 + - 844.0 + - 854.0 + - 864.0 + - 874.0 + - 886.0 + - 897.0 + - 908.0 + - 919.0 + - 930.0 + - 941.0 + - 952.0 + - 963.0 + - 974.0 + - 985.0 + - 996.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.36369488062311356 + - 0.5222144742551554 + - 0.5127048056337827 + - 0.5099494692419162 + - 0.5106906454775327 + - 0.5106906470782434 + - 0.5106906510800201 + - 0.5106906610844618 + - 0.5106906860955661 + - 0.5106907486233269 + - 0.5106909049427287 + - 0.5106912957412334 + - 0.5106922727374951 + - 0.5106947152281492 + - 0.5107008214547847 + - 0.5107160870213733 + - 0.5107542509378448 + - 0.5108496607290235 + - 0.5110881852069703 + - 0.5113492800420396 + - 0.5116103748771091 + - 0.5118714697121785 + - 0.5121325645472481 + - 0.5123936593823174 + - 0.512654754217387 + - 0.5129158490524562 + - 0.513176943887526 + - 0.5134380387225953 + - 0.5136991335576648 + - 0.5139602283927341 + - 0.5144301990958592 + - 0.5149001697989841 + - 0.5153701405021092 + - 0.5158266584233755 + - 0.5162539045171255 + - 0.5166811506108755 + - 0.5171083967046255 + - 0.5174936597514894 + - 0.5178781812358644 + - 0.5182627027202394 + - 0.5186472242046144 + - 0.5190317456889894 + - 0.5194162671733644 + - 0.5198007886577394 + - 0.5201853101421144 + - 0.5205698316264894 + - 0.5209543531108644 + - 0.5213388745952394 + - 0.5217233960796144 + - 0.5221079175639894 + - 0.5224547469022872 + - 0.5227965437772872 + - 0.5231195696257395 + - 0.5234186418913644 + - 0.5236710831879514 + - 0.5238847062348264 + - 0.5240983292817014 + - 0.5243119523285764 + - 0.5244999895166171 + - 0.5246708879541172 + - 0.5248417863916172 + - 0.5250126848291172 + - 0.5251835832666172 + - 0.5253146205796022 + - 0.5254427944077272 + - 0.5255709682358521 + - 0.5256292290668182 + - 0.5256874898977842 + - 0.5257457507287501 + - 0.5258040115597161 + - 0.525862272390682 + - 0.5259205332216476 + - 0.5259787940526137 + - 0.5260321167717661 + - 0.5260580032694255 + - 0.39592539649442726 + - 0.5260746261958402 + - 0.5260746261958402 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 49.0 + - 95.0 + - 102.0 + - 109.0 + - 116.0 + - 183.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 414.0 + - 423.0 + - 432.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.2027779943453018 + - 0.3708410755083972 + - 0.41918439016619474 + - 0.4124147573209379 + - 0.41845196829119474 + - 0.4175378245786301 + - 0.41613783896276557 + - 0.4163381265075969 + - 0.4163381032245325 + - 0.4163380450168716 + - 0.4163378994977193 + - 0.4163375356998386 + - 0.41633662620513684 + - 0.4163343524683824 + - 0.4163286681264963 + - 0.4163144572717811 + - 0.4162789301349931 + - 0.4161904523331373 + - 0.4161592273105697 + - 0.4161748398218535 + - 0.4161670335662116 + - 0.41616947302109947 + - 0.41616825329365553 + - 0.41616886315737767 + - 0.41616855822551657 + - 0.41616855822551657 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 81.0 + - 88.0 + - 95.0 + - 102.0 + - 109.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.29850299229375954 + - 0.4804317337645296 + - 0.4909860735289226 + - 0.5050958895590046 + - 0.5011873637224928 + - 0.4806575480675972 + - 0.44490052991749934 + - 0.4449003116387709 + - 0.44489976594194985 + - 0.4448984016998972 + - 0.44489499109476555 + - 0.4448864645819364 + - 0.4448651482998636 + - 0.4448118575946816 + - 0.4446786308317266 + - 0.44434556392433905 + - 0.4435128966558702 + - 0.441431228484698 + - 0.44126859815882513 + - 0.4413499133217617 + - 0.44130925574029356 + - 0.44132958453102766 + - 0.4413194201356604 + - 0.44132450233334397 + - 0.44132450233334397 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 49.0 + - 102.0 + - 109.0 + - 151.0 + - 158.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 405.0 + - 414.0 + - 423.0 + - 432.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 524.0 + - 534.0 + - 544.0 + - 554.0 + - 886.0 + - 897.0 + - 908.0 + - 919.0 + - 930.0 + - 941.0 + - 952.0 + - 963.0 + - 974.0 + - 985.0 + - 996.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.20591704794095048 + - 0.42997202505958965 + - 0.4194112459607936 + - 0.4154908423622787 + - 0.4164815584607936 + - 0.4161763826795436 + - 0.4163289705701686 + - 0.4163289822117008 + - 0.41632901131553124 + - 0.4163290840751074 + - 0.41632926597404774 + - 0.4163297207213986 + - 0.41633085758977584 + - 0.4163336997607189 + - 0.4163408051880765 + - 0.4163585687564705 + - 0.4164029776774555 + - 0.41646231741269857 + - 0.41652165714794165 + - 0.4165809968831847 + - 0.4166403366184278 + - 0.41669967635367094 + - 0.4167590160889139 + - 0.41681835582415694 + - 0.4168776955594 + - 0.416937035294643 + - 0.41699637502988607 + - 0.41705571476512904 + - 0.41711505450037234 + - 0.4171743942356154 + - 0.4172337339708583 + - 0.41729307370610136 + - 0.41739988522953886 + - 0.41750669675297636 + - 0.41761350827641386 + - 0.41772031979985136 + - 0.4177203214081797 + - 0.4177203254290006 + - 0.41772033548105286 + - 0.41772036061118345 + - 0.4177204234365097 + - 0.41772058049982597 + - 0.41772097315811657 + - 0.41772195480384317 + - 0.4177244089181595 + - 0.4177305442039501 + - 0.41774588241842653 + - 0.41774588241842653 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 95.0 + - 116.0 + - 123.0 + - 167.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 405.0 + - 414.0 + - 423.0 + - 432.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 524.0 + - 534.0 + - 544.0 + - 554.0 + - 564.0 + - 574.0 + - 584.0 + - 594.0 + - 604.0 + - 614.0 + - 624.0 + - 634.0 + - 644.0 + - 654.0 + - 664.0 + - 674.0 + - 684.0 + - 694.0 + - 704.0 + - 714.0 + - 724.0 + - 734.0 + - 744.0 + - 754.0 + - 764.0 + - 774.0 + - 784.0 + - 794.0 + - 804.0 + - 814.0 + - 824.0 + - 834.0 + - 844.0 + - 854.0 + - 864.0 + - 874.0 + - 886.0 + - 897.0 + - 908.0 + - 919.0 + - 930.0 + - 941.0 + - 952.0 + - 963.0 + - 974.0 + - 985.0 + - 996.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.24399364811077842 + - 0.24067333561077842 + - 0.2415034137357784 + - 0.24108837467327843 + - 0.24115322452679405 + - 0.24115322947444523 + - 0.24115324184357317 + - 0.24115327276639303 + - 0.24115335007344268 + - 0.2411535433410668 + - 0.24115402651012713 + - 0.24115523443277792 + - 0.2411582542394049 + - 0.24116580375597235 + - 0.24118467754739098 + - 0.24121349970450892 + - 0.2412423218616272 + - 0.24127114401874528 + - 0.2412999661758633 + - 0.2413287883329813 + - 0.24135761049009946 + - 0.2413864326472176 + - 0.24141525480433568 + - 0.24144407696145365 + - 0.2414728991185719 + - 0.24150172127568997 + - 0.241530543432808 + - 0.24155936558992597 + - 0.2415881877470442 + - 0.24161700990416232 + - 0.24166888978697482 + - 0.2417207696697873 + - 0.24177264955259983 + - 0.24182452943541233 + - 0.24187640931822482 + - 0.24192828920103732 + - 0.2419801690838498 + - 0.24203204896666233 + - 0.24208392884947483 + - 0.24213580873228732 + - 0.24218768861509982 + - 0.2422395684979123 + - 0.24229144838072483 + - 0.24234332826353733 + - 0.24239520814634982 + - 0.24244708802916232 + - 0.2424989679119748 + - 0.24255084779478733 + - 0.24260272767759983 + - 0.24265460756041232 + - 0.24270648744322482 + - 0.2427583673260373 + - 0.24281024720884983 + - 0.24286212709166233 + - 0.24291400697447482 + - 0.24296588685728732 + - 0.2430177667400998 + - 0.24306964662291233 + - 0.24312152650572483 + - 0.24317340638853732 + - 0.24322528627134982 + - 0.2432771661541623 + - 0.24332904603697483 + - 0.24338092591978733 + - 0.24343280580259982 + - 0.24348468568541232 + - 0.24350826745032705 + - 0.2435318492152417 + - 0.24355543098015633 + - 0.243579012745071 + - 0.24360259450998586 + - 0.24362617627490057 + - 0.24364975803981512 + - 0.24367333980473 + - 0.24369692156964465 + - 0.2437205033345593 + - 0.24374408509947398 + - 0.24374408509947398 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 49.0 + - 109.0 + - 116.0 + - 123.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 405.0 + - 414.0 + - 423.0 + - 432.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 524.0 + - 534.0 + - 544.0 + - 554.0 + - 564.0 + - 574.0 + - 584.0 + - 594.0 + - 604.0 + - 614.0 + - 624.0 + - 634.0 + - 644.0 + - 654.0 + - 664.0 + - 674.0 + - 684.0 + - 694.0 + - 704.0 + - 714.0 + - 724.0 + - 734.0 + - 744.0 + - 886.0 + - 897.0 + - 908.0 + - 919.0 + - 930.0 + - 941.0 + - 952.0 + - 963.0 + - 974.0 + - 985.0 + - 996.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.28863506810939754 + - 0.4567329878166897 + - 0.46719516670391614 + - 0.46597446357891614 + - 0.46627963936016614 + - 0.46658481514141614 + - 0.46658481150343734 + - 0.4665848024084903 + - 0.4665847796711228 + - 0.4665847228277039 + - 0.46658458071915676 + - 0.4665842254477889 + - 0.4665833372693692 + - 0.46658111682331993 + - 0.4665755657081968 + - 0.466561687920389 + - 0.46652699345086945 + - 0.4664402572770706 + - 0.4662234168425735 + - 0.4659860579016013 + - 0.465748698960629 + - 0.46551134001965694 + - 0.46527398107868456 + - 0.4650366221377124 + - 0.46479926319674036 + - 0.4645619042557679 + - 0.4643245453147957 + - 0.4640871863738236 + - 0.4638498274328513 + - 0.46361246849187915 + - 0.46337510955090694 + - 0.46294786345715694 + - 0.46252061736340694 + - 0.4620933549556019 + - 0.4615806596431019 + - 0.4610558947309445 + - 0.46044900231972863 + - 0.4597654085697286 + - 0.4590818148197286 + - 0.4583982210697286 + - 0.4577146273197286 + - 0.45703103356972863 + - 0.4563474398197286 + - 0.4556638460697286 + - 0.454978765671967 + - 0.45420972270321697 + - 0.4534406797344669 + - 0.4526716367657169 + - 0.4519025937969669 + - 0.45113355082821693 + - 0.45031393571744543 + - 0.44945944352994543 + - 0.44860495134244543 + - 0.44775045915494543 + - 0.4473505535385362 + - 0.44692330744478626 + - 0.4464960613510361 + - 0.4460688152572861 + - 0.4456415691635362 + - 0.4452143230697861 + - 0.44478707697603603 + - 0.44433402484812556 + - 0.4438679382003982 + - 0.4434018515526709 + - 0.44292244947658715 + - 0.44292244947658715 +- !!python/tuple + - !!python/tuple + - 5.0 + - 37.0 + - 43.0 + - 81.0 + - 88.0 + - 116.0 + - 123.0 + - 158.0 + - 167.0 + - 297.0 + - 306.0 + - 315.0 + - 324.0 + - 333.0 + - 342.0 + - 351.0 + - 360.0 + - 369.0 + - 378.0 + - 387.0 + - 396.0 + - 405.0 + - 414.0 + - 423.0 + - 432.0 + - 441.0 + - 450.0 + - 459.0 + - 468.0 + - 477.0 + - 486.0 + - 495.0 + - 504.0 + - 513.0 + - 524.0 + - 534.0 + - 544.0 + - 554.0 + - 564.0 + - 574.0 + - 584.0 + - 594.0 + - 604.0 + - 614.0 + - 624.0 + - 634.0 + - 644.0 + - 654.0 + - 664.0 + - 674.0 + - 684.0 + - 694.0 + - 704.0 + - 714.0 + - 724.0 + - 734.0 + - 744.0 + - 754.0 + - 764.0 + - 774.0 + - 784.0 + - 794.0 + - 804.0 + - 814.0 + - 824.0 + - 834.0 + - 844.0 + - 854.0 + - 864.0 + - 874.0 + - 886.0 + - 897.0 + - 908.0 + - 919.0 + - 930.0 + - 941.0 + - 952.0 + - 963.0 + - 974.0 + - 985.0 + - 996.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.2368489701567661 + - 0.43639394983304697 + - 0.4349570424799939 + - 0.41440299043971335 + - 0.40471557359553323 + - 0.40959838609553323 + - 0.40807250718928323 + - 0.409407651232252 + - 0.4094076977983807 + - 0.40940781421370254 + - 0.4094081052520071 + - 0.4094088328477685 + - 0.40941065183717207 + - 0.40941519931068093 + - 0.4094265679944531 + - 0.4094549897038835 + - 0.4095260439774595 + - 0.40970367966139953 + - 0.4101477688712496 + - 0.4107411662236801 + - 0.411334563576111 + - 0.4119279609285414 + - 0.41252135828097203 + - 0.41311475563340244 + - 0.4136782601806195 + - 0.41423457019852317 + - 0.4147908802164268 + - 0.4153471902343305 + - 0.415903500252234 + - 0.4164598102701379 + - 0.4170161202880414 + - 0.41757243030594515 + - 0.4181287403238488 + - 0.4191090464657198 + - 0.42002303508905287 + - 0.42089087871698255 + - 0.42175872234491224 + - 0.4226265659728419 + - 0.4234944096007716 + - 0.4243622532287013 + - 0.42520124655539987 + - 0.4260023329811811 + - 0.42680341940696237 + - 0.4276045058327436 + - 0.4282937704296772 + - 0.4289530972657695 + - 0.42955391208510546 + - 0.4301547269044414 + - 0.43075554172377734 + - 0.43135212239898857 + - 0.4318450655416254 + - 0.43231236595666445 + - 0.4327796663717035 + - 0.4331962619505304 + - 0.43359680516342103 + - 0.43399734837631165 + - 0.4343978915892023 + - 0.43477798437659365 + - 0.4351085661117764 + - 0.43536687392630535 + - 0.43556714553275067 + - 0.43574918143984775 + - 0.43588269584414463 + - 0.43601621024844156 + - 0.43614972465273844 + - 0.4362832390570353 + - 0.4364167534613322 + - 0.43646631801602614 + - 0.43646631801602614 + - 0.43638564968170984 + - 0.43629461713332574 + - 0.436179169060033 + - 0.4359971039632646 + - 0.4358150388664961 + - 0.43563297376972765 + - 0.43534238113981305 + - 0.43497825094627607 + - 0.43461412075273914 + - 0.4342499905592023 + - 0.43385951317406474 + - 0.43385951317406474 +problem_name: CNTNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.049 + - 0.055 + - 0.13 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.414 + - 0.441 + - 0.468 + - 0.513 + - 0.524 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41927349348791143 + - -0.03477477551552933 + - 0.053897080605951 + - 0.004540031633083237 + - 0.008393987251389923 + - 0.008393978062843699 + - 0.008393955091478137 + - 0.008393897663064235 + - 0.00839375409202948 + - 0.00839339516444259 + - 0.008392497845475366 + - 0.008390254548057306 + - 0.008384646304512158 + - 0.008370625695649286 + - 0.008335574173492106 + - 0.008247945368099158 + - 0.008028873354616786 + - 0.007755033337763682 + - 0.007823493341977064 + - 0.007806378340923613 + - 0.007809052559837895 + - 0.0078066457628145364 + - 0.0078066457628145364 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.088 + - 0.109 + - 0.167 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.405 + - 0.414 + - 0.423 + - 0.432 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 0.886 + - 0.897 + - 0.908 + - 0.919 + - 0.93 + - 0.941 + - 0.952 + - 0.963 + - 0.974 + - 0.985 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.13116879771778156 + - -0.24091993371269468 + - -0.27923436457636086 + - -0.2704551812949752 + - -0.27063583546458336 + - -0.2706358492474027 + - -0.270635883704451 + - -0.2706359698470719 + - -0.27063618520362404 + - -0.27063672359500435 + - -0.2706380695734552 + - -0.2706414345195823 + - -0.2706498468849 + - -0.2706708777981943 + - -0.2707234550814301 + - -0.2708037458234782 + - -0.2708840365655264 + - -0.27096432730757397 + - -0.2710446180496224 + - -0.27112490879167056 + - -0.2712051995337184 + - -0.27128549027576654 + - -0.2713657810178147 + - -0.2714460717598626 + - -0.2715263625019113 + - -0.2716066532439589 + - -0.271686943986007 + - -0.2717672347280549 + - -0.27184752547010305 + - -0.27192781621215145 + - -0.2719278158976403 + - -0.2719278151113635 + - -0.2719278131456716 + - -0.27192780823144147 + - -0.2719277959458661 + - -0.2719277652319269 + - -0.2719276884470802 + - -0.2719274964849632 + - -0.27192701657967117 + - -0.27192581681643957 + - -0.27192281740836155 + - -0.27192281740836155 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.061 + - 0.081 + - 0.137 + - 0.158 + - 0.167 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.405 + - 0.414 + - 0.423 + - 0.432 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 0.886 + - 0.897 + - 0.908 + - 0.919 + - 0.93 + - 0.941 + - 0.952 + - 0.963 + - 0.974 + - 0.985 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.37135223413777735 + - 0.11631687130105796 + - 0.06263993498364377 + - 0.0616764460790671 + - 0.06191731830521127 + - 0.06170655510733512 + - 0.06170653673024268 + - 0.06170649078751155 + - 0.061706375930683746 + - 0.061706088788614236 + - 0.06170537093344046 + - 0.06170357629550601 + - 0.06169908970066989 + - 0.061687873213579596 + - 0.06165983199585385 + - 0.06158972895153949 + - 0.06149605641915026 + - 0.061402383886760614 + - 0.06130871135437167 + - 0.06121503882198216 + - 0.061121366289592374 + - 0.06102769375720371 + - 0.0609340212248142 + - 0.060840348692424835 + - 0.060746676160035186 + - 0.060653003627645675 + - 0.06055933109525687 + - 0.060465658562867224 + - 0.0603719860304773 + - 0.06027831349808849 + - 0.06018464096569912 + - 0.06018464056336948 + - 0.060184639557546 + - 0.06018463704298639 + - 0.06018463075658647 + - 0.060184615040588196 + - 0.060184575750591676 + - 0.06018447752560023 + - 0.06018423196312197 + - 0.060183618056926534 + - 0.06018208329143751 + - 0.06017824637771525 + - 0.06017824637771525 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.049 + - 0.109 + - 0.13 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.405 + - 0.414 + - 0.423 + - 0.432 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 0.524 + - 0.534 + - 0.544 + - 0.554 + - 0.564 + - 0.574 + - 0.584 + - 0.594 + - 0.604 + - 0.614 + - 0.624 + - 0.634 + - 0.644 + - 0.654 + - 0.664 + - 0.674 + - 0.684 + - 0.694 + - 0.704 + - 0.714 + - 0.724 + - 0.734 + - 0.744 + - 0.754 + - 0.764 + - 0.774 + - 0.784 + - 0.794 + - 0.804 + - 0.814 + - 0.824 + - 0.834 + - 0.844 + - 0.854 + - 0.864 + - 0.874 + - 0.886 + - 0.897 + - 0.908 + - 0.919 + - 0.93 + - 0.941 + - 0.952 + - 0.963 + - 0.974 + - 0.985 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08140552780065816 + - -0.31897190450248303 + - -0.2949530648282098 + - -0.28799383357842734 + - -0.28986584341204497 + - -0.2898658474550053 + - -0.2898658575624062 + - -0.28986588283090825 + - -0.2898659460021636 + - -0.2898661039303018 + - -0.28986649875064735 + - -0.28986748580151134 + - -0.28986995342867117 + - -0.28987612249657085 + - -0.28989154516632 + - -0.2899301018406929 + - -0.29002649352662513 + - -0.29026747274145576 + - -0.2908699207785323 + - -0.2915293754065533 + - -0.2921888300345749 + - -0.29284828466259594 + - -0.2935077392906178 + - -0.2941671939186388 + - -0.2948266485466607 + - -0.29548610317468144 + - -0.2961455578027036 + - -0.2968050124307246 + - -0.2974644670587462 + - -0.2981239216867672 + - -0.29931094001720576 + - -0.30049795834764403 + - -0.30168497667808264 + - -0.30283801693594026 + - -0.30391712450906616 + - -0.304996232082192 + - -0.3060753396553179 + - -0.3070484094565357 + - -0.3080196062723489 + - -0.30899080308816235 + - -0.30996199990397555 + - -0.3109331967197887 + - -0.3119043935356022 + - -0.3128755903514153 + - -0.3138467871672288 + - -0.31481798398304195 + - -0.31578918079885515 + - -0.3167603776146686 + - -0.3177315744304818 + - -0.3187027712462952 + - -0.3195787679400376 + - -0.32044205399853837 + - -0.32125792954305343 + - -0.32201330484424145 + - -0.32265090298475513 + - -0.323190456771318 + - -0.323730010557881 + - -0.32426956434444393 + - -0.32474449520188736 + - -0.32517613823113783 + - -0.3256077812603881 + - -0.3260394242896386 + - -0.32647106731888886 + - -0.3268020319757289 + - -0.3271257642476667 + - -0.3274494965196042 + - -0.32759664755230355 + - -0.3277437985850029 + - -0.32789094961770165 + - -0.328038100650401 + - -0.3281852516830998 + - -0.328332402715798 + - -0.32847955374849763 + - -0.32861423245217386 + - -0.32867961471329843 + - -0.0 + - -0.3287215997098707 + - -0.3287215997098707 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.049 + - 0.095 + - 0.102 + - 0.109 + - 0.116 + - 0.183 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.414 + - 0.423 + - 0.432 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4878378701120883 + - 0.0633561807555913 + - -0.05874589980260298 + - -0.041647646179076916 + - -0.05689600110581577 + - -0.05458712241134809 + - -0.05105113904614807 + - -0.051557010977084254 + - -0.05155695217038842 + - -0.05155680515364883 + - -0.05155643761179985 + - -0.05155551875717742 + - -0.05155322162062132 + - -0.05154747877923109 + - -0.05153312167575551 + - -0.05149722891706656 + - -0.05140749702034418 + - -0.05118402612749611 + - -0.051105160202642455 + - -0.05114459316506929 + - -0.05112487668385587 + - -0.051131038084234505 + - -0.051127957384045186 + - -0.051129497734140265 + - -0.05112872755909265 + - -0.05112872755909265 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.081 + - 0.088 + - 0.095 + - 0.102 + - 0.109 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2460625286057874 + - -0.21344005213692263 + - -0.2400974473377419 + - -0.2757350097548339 + - -0.2658631352271618 + - -0.2140103977249223 + - -0.1236978831282459 + - -0.12369733181547243 + - -0.12369595353353878 + - -0.12369250782870464 + - -0.1236838935666193 + - -0.12366235791140592 + - -0.12360851877337249 + - -0.12347392092828892 + - -0.12313742631558 + - -0.1222961897838077 + - -0.12019309845437694 + - -0.11493537013080002 + - -0.11452461010552044 + - -0.11472999011816058 + - -0.11462730011184086 + - -0.11467864511500078 + - -0.11465297261342026 + - -0.11466580886421039 + - -0.11466580886421039 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.049 + - 0.102 + - 0.109 + - 0.151 + - 0.158 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.405 + - 0.414 + - 0.423 + - 0.432 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 0.524 + - 0.534 + - 0.544 + - 0.554 + - 0.886 + - 0.897 + - 0.908 + - 0.919 + - 0.93 + - 0.941 + - 0.952 + - 0.963 + - 0.974 + - 0.985 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4799094734407905 + - -0.08599253512559556 + - -0.05931887591529357 + - -0.049417001387347996 + - -0.05191928112814473 + - -0.0511484900044834 + - -0.05153388556631406 + - -0.05153391496966198 + - -0.05153398847803178 + - -0.05153417224895626 + - -0.051534631676267484 + - -0.051535780244545526 + - -0.051538651665240645 + - -0.051545830216978436 + - -0.05156377659632291 + - -0.0516086425446841 + - -0.05172080741558707 + - -0.051870683467410174 + - -0.052020559519233275 + - -0.05217043557105623 + - -0.05232031162287947 + - -0.05247018767470271 + - -0.052620063726525536 + - -0.05276993977834849 + - -0.05291981583017159 + - -0.05306969188199442 + - -0.05321956793381751 + - -0.053369443985640336 + - -0.05351932003746399 + - -0.053669196089287094 + - -0.05381907214110963 + - -0.053968948192932735 + - -0.054238725086214204 + - -0.05450850197949567 + - -0.054778278872777135 + - -0.055048055766058604 + - -0.055048059828259145 + - -0.055048069983760495 + - -0.05504809537251387 + - -0.05504815884439723 + - -0.055048317524105154 + - -0.055048714223376365 + - -0.05504970597155438 + - -0.05505218534199964 + - -0.055058383768112354 + - -0.05507387983339373 + - -0.055112619996596744 + - -0.055112619996596744 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.095 + - 0.116 + - 0.123 + - 0.167 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.405 + - 0.414 + - 0.423 + - 0.432 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 0.524 + - 0.534 + - 0.544 + - 0.554 + - 0.564 + - 0.574 + - 0.584 + - 0.594 + - 0.604 + - 0.614 + - 0.624 + - 0.634 + - 0.644 + - 0.654 + - 0.664 + - 0.674 + - 0.684 + - 0.694 + - 0.704 + - 0.714 + - 0.724 + - 0.734 + - 0.744 + - 0.754 + - 0.764 + - 0.774 + - 0.784 + - 0.794 + - 0.804 + - 0.814 + - 0.824 + - 0.834 + - 0.844 + - 0.854 + - 0.864 + - 0.874 + - 0.886 + - 0.897 + - 0.908 + - 0.919 + - 0.93 + - 0.941 + - 0.952 + - 0.963 + - 0.974 + - 0.985 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.383738324767422 + - 0.3921245321928573 + - 0.3900279803364985 + - 0.3910762562646779 + - 0.39091246315089984 + - 0.390912450654477 + - 0.3909124194134198 + - 0.3909123413107769 + - 0.39091214605416963 + - 0.3909116579126515 + - 0.39091043755885607 + - 0.3909073866743675 + - 0.3908997594631461 + - 0.3908806914350926 + - 0.39083302136495884 + - 0.3907602244255022 + - 0.39068742748604474 + - 0.3906146305465878 + - 0.39054183360713096 + - 0.3904690366676742 + - 0.390396239728217 + - 0.3903234427887599 + - 0.39025064584930297 + - 0.39017784890984625 + - 0.39010505197038886 + - 0.3900322550309319 + - 0.3899594580914751 + - 0.3898866611520184 + - 0.3898138642125611 + - 0.389741067273104 + - 0.38961003278208156 + - 0.38947899829105914 + - 0.38934796380003667 + - 0.38921692930901425 + - 0.38908589481799183 + - 0.3889548603269694 + - 0.388823825835947 + - 0.3886927913449245 + - 0.3885617568539021 + - 0.3884307223628797 + - 0.3882996878718573 + - 0.3881686533808349 + - 0.38803761888981236 + - 0.38790658439879 + - 0.3877755499077676 + - 0.38764451541674516 + - 0.38751348092572274 + - 0.38738244643470027 + - 0.38725141194367785 + - 0.38712037745265543 + - 0.386989342961633 + - 0.3868583084706106 + - 0.3867272739795881 + - 0.3865962394885657 + - 0.3864652049975433 + - 0.38633417050652086 + - 0.38620313601549844 + - 0.38607210152447596 + - 0.38594106703345354 + - 0.3858100325424312 + - 0.38567899805140876 + - 0.38554796356038634 + - 0.38541692906936387 + - 0.38528589457834145 + - 0.38515486008731903 + - 0.3850238255962966 + - 0.3849642644640138 + - 0.38490470333173116 + - 0.3848451421994486 + - 0.384785581067166 + - 0.3847260199348828 + - 0.38466645880260003 + - 0.3846068976703177 + - 0.3845473365380345 + - 0.3844877754057519 + - 0.38442821427346924 + - 0.38436865314118657 + - 0.38436865314118657 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.049 + - 0.109 + - 0.116 + - 0.123 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.405 + - 0.414 + - 0.423 + - 0.432 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 0.524 + - 0.534 + - 0.544 + - 0.554 + - 0.564 + - 0.574 + - 0.584 + - 0.594 + - 0.604 + - 0.614 + - 0.624 + - 0.634 + - 0.644 + - 0.654 + - 0.664 + - 0.674 + - 0.684 + - 0.694 + - 0.704 + - 0.714 + - 0.724 + - 0.734 + - 0.744 + - 0.886 + - 0.897 + - 0.908 + - 0.919 + - 0.93 + - 0.941 + - 0.952 + - 0.963 + - 0.974 + - 0.985 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.27098622451348575 + - -0.1535834575419016 + - -0.18000807940213054 + - -0.1769249149074852 + - -0.17769570603114654 + - -0.17846649715480786 + - -0.17846648796626163 + - -0.17846646499489607 + - -0.1784664075664822 + - -0.17846626399544743 + - -0.17846590506786053 + - -0.17846500774889332 + - -0.17846276445147524 + - -0.1784571562079301 + - -0.17844313559906724 + - -0.17840808407691006 + - -0.1783204552715171 + - -0.17810138325803473 + - -0.1775537032243288 + - -0.17695419901703668 + - -0.17635469480974428 + - -0.1757551906024526 + - -0.17515568639516005 + - -0.17455618218786806 + - -0.17395667798057637 + - -0.17335717377328355 + - -0.17275766956599156 + - -0.17215816535869974 + - -0.17155866115140733 + - -0.17095915694411534 + - -0.1703596527368232 + - -0.16928054516369737 + - -0.1682014375905715 + - -0.1671222888125742 + - -0.1658273597248232 + - -0.16450194610699584 + - -0.1629691007361523 + - -0.1612425286191508 + - -0.15951595650214945 + - -0.15778938438514808 + - -0.15606281226814672 + - -0.15433624015114536 + - -0.15260966803414383 + - -0.15088309591714247 + - -0.14915276893173715 + - -0.14721037530011052 + - -0.14526798166848376 + - -0.14332558803685727 + - -0.14138319440523067 + - -0.13944080077360418 + - -0.1373706756489507 + - -0.13521246050269897 + - -0.13305424535644722 + - -0.13089603021019547 + - -0.12988597725590142 + - -0.12880686968277572 + - -0.12772776210964942 + - -0.12664865453652355 + - -0.12556954696339795 + - -0.1244904393902718 + - -0.12341133181714578 + - -0.12226704521183618 + - -0.12108983695024413 + - -0.11991262868865221 + - -0.11870178927211451 + - -0.11870178927211451 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.037 + - 0.043 + - 0.081 + - 0.088 + - 0.116 + - 0.123 + - 0.158 + - 0.167 + - 0.297 + - 0.306 + - 0.315 + - 0.324 + - 0.333 + - 0.342 + - 0.351 + - 0.36 + - 0.369 + - 0.378 + - 0.387 + - 0.396 + - 0.405 + - 0.414 + - 0.423 + - 0.432 + - 0.441 + - 0.45 + - 0.459 + - 0.468 + - 0.477 + - 0.486 + - 0.495 + - 0.504 + - 0.513 + - 0.524 + - 0.534 + - 0.544 + - 0.554 + - 0.564 + - 0.574 + - 0.584 + - 0.594 + - 0.604 + - 0.614 + - 0.624 + - 0.634 + - 0.644 + - 0.654 + - 0.664 + - 0.674 + - 0.684 + - 0.694 + - 0.704 + - 0.714 + - 0.724 + - 0.734 + - 0.744 + - 0.754 + - 0.764 + - 0.774 + - 0.784 + - 0.794 + - 0.804 + - 0.814 + - 0.824 + - 0.834 + - 0.844 + - 0.854 + - 0.864 + - 0.874 + - 0.886 + - 0.897 + - 0.908 + - 0.919 + - 0.93 + - 0.941 + - 0.952 + - 0.963 + - 0.974 + - 0.985 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.40178384045616583 + - -0.10221257261325824 + - -0.09858333496956165 + - -0.046669382941556675 + - -0.022201599541063263 + - -0.03453425751964466 + - -0.030680301901337973 + - -0.03405251306735632 + - -0.03405263068074799 + - -0.034052924714227176 + - -0.03405365979792512 + - -0.03405549750717 + - -0.03406009178028218 + - -0.03407157746306265 + - -0.034100291670013806 + - -0.034172077187391715 + - -0.034351540980836474 + - -0.034800200464448365 + - -0.035921849173478106 + - -0.037420609691708406 + - -0.03891937020993955 + - -0.04041813072816957 + - -0.04191689124640015 + - -0.04341565176463017 + - -0.044838911177151775 + - -0.04624399916299284 + - -0.04764908714883378 + - -0.04905417513467485 + - -0.050459263120515505 + - -0.051864351106357134 + - -0.053269439092197786 + - -0.054674527078039 + - -0.056079615063879935 + - -0.05855560208201707 + - -0.06086408906321518 + - -0.06305602632112711 + - -0.06524796357903903 + - -0.06743990083695096 + - -0.06963183809486288 + - -0.07182377535277482 + - -0.07394284458684547 + - -0.07596617128645648 + - -0.0779894979860675 + - -0.0800128246856785 + - -0.08175371982157131 + - -0.08341900030605168 + - -0.08493649533075993 + - -0.08645399035546819 + - -0.08797148538017645 + - -0.08947828610701397 + - -0.09072332657928828 + - -0.0919036004873947 + - -0.09308387439550111 + - -0.09413608166110086 + - -0.09514774501090636 + - -0.09615940836071186 + - -0.09717107171051738 + - -0.09813108284078778 + - -0.09896604250265781 + - -0.09961845787387685 + - -0.1001242895487796 + - -0.10058406280078329 + - -0.10092128391738511 + - -0.10125850503398709 + - -0.10159572615058893 + - -0.10193294726719077 + - -0.1022701683837926 + - -0.10239535498493718 + - -0.10239535498493718 + - -0.10219160868568346 + - -0.10196168519709162 + - -0.10167009472495996 + - -0.10121024774777572 + - -0.10075040077059133 + - -0.1002905537934071 + - -0.09955659574856444 + - -0.09863690179419568 + - -0.09771720783982704 + - -0.0967975138854587 + - -0.09581127408221565 + - -0.09581127408221565 +solver_name: ASTRODF diff --git a/test/expected_results/CNTNEWS1_NELDMD.yaml b/test/expected_results/CNTNEWS1_NELDMD.yaml new file mode 100644 index 000000000..f8e654eb6 --- /dev/null +++ b/test/expected_results/CNTNEWS1_NELDMD.yaml @@ -0,0 +1,485 @@ +all_est_objectives: +- - 0.0 + - 0.33395328468123553 + - 0.4142601096819947 + - 0.3876196642197782 + - 0.4049806221714546 + - 0.4049806221714546 +- - 0.0 + - 0.45872335071914677 + - 0.5103839679828455 + - 0.5103839679828455 +- - 0.0 + - 0.412617647477692 + - 0.4417917885990019 + - 0.42793287347173736 + - 0.42793287347173736 +- - 0.0 + - 0.5236229896180403 + - 0.4695920056841419 + - 0.5172487917535501 + - 0.4980196690457847 + - 0.4965080769037575 + - 0.4965080769037575 +- - 0.0 + - 0.3776932524192807 + - 0.41728398804646816 + - 0.4147298546882691 + - 0.4161053216271213 + - 0.4161053216271213 +- - 0.0 + - 0.46673802096005224 + - 0.463358387956608 + - 0.463358387956608 +- - 0.0 + - 0.41289388808915367 + - 0.42484378613653784 + - 0.42484378613653784 +- - 0.0 + - 0.44861187614720016 + - 0.39295373936031447 + - 0.4240737429022521 + - 0.40957413049113134 + - 0.4131990335939115 + - 0.41138658204252154 + - 0.41138658204252154 +- - 0.0 + - 0.44630961682620884 + - 0.43842590275136056 + - 0.43842590275136056 +- - 0.0 + - 0.3576741285644469 + - 0.42035944685626625 + - 0.42035944685626625 +all_intermediate_budgets: +- - 0 + - 120 + - 180 + - 240 + - 300 + - 1000 +- - 0 + - 150 + - 240 + - 1000 +- - 0 + - 120 + - 240 + - 300 + - 1000 +- - 0 + - 120 + - 180 + - 240 + - 300 + - 600 + - 1000 +- - 0 + - 210 + - 300 + - 480 + - 540 + - 1000 +- - 0 + - 360 + - 420 + - 1000 +- - 0 + - 210 + - 360 + - 1000 +- - 0 + - 180 + - 270 + - 330 + - 390 + - 510 + - 570 + - 1000 +- - 0 + - 360 + - 420 + - 1000 +- - 0 + - 180 + - 330 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.2591296074337594 + - !!python/tuple + - 0.17275307162250628 + - !!python/tuple + - 0.21594133952813283 + - !!python/tuple + - 0.19434720557531954 + - !!python/tuple + - 0.19434720557531954 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.13369089668585274 + - !!python/tuple + - 0.1671136208573159 + - !!python/tuple + - 0.1671136208573159 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.2410077344101471 + - !!python/tuple + - 0.22092375654263485 + - !!python/tuple + - 0.23096574547639098 + - !!python/tuple + - 0.23096574547639098 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.21450798830012197 + - !!python/tuple + - 0.14300532553341463 + - !!python/tuple + - 0.1787566569167683 + - !!python/tuple + - 0.16088099122509147 + - !!python/tuple + - 0.15976376211936166 + - !!python/tuple + - 0.15976376211936166 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1203649154451259 + - !!python/tuple + - 0.15045614430640736 + - !!python/tuple + - 0.14669474069874716 + - !!python/tuple + - 0.14857544250257726 + - !!python/tuple + - 0.14857544250257726 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.14667615039338527 + - !!python/tuple + - 0.14445378447833396 + - !!python/tuple + - 0.14445378447833396 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.13570434398518863 + - !!python/tuple + - 0.18659347297963438 + - !!python/tuple + - 0.18659347297963438 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.19332816548160733 + - !!python/tuple + - 0.24166020685200917 + - !!python/tuple + - 0.21749418616680827 + - !!python/tuple + - 0.22957719650940872 + - !!python/tuple + - 0.22655644392375862 + - !!python/tuple + - 0.22806682021658367 + - !!python/tuple + - 0.22806682021658367 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.23109768282550877 + - !!python/tuple + - 0.2388009389196924 + - !!python/tuple + - 0.2388009389196924 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.11334357260860682 + - !!python/tuple + - 0.15584741233683436 + - !!python/tuple + - 0.15584741233683436 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 180.0 + - 240.0 + - 300.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.33395328468123553 + - 0.4142601096819947 + - 0.3876196642197782 + - 0.4049806221714546 + - 0.4049806221714546 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.45872335071914677 + - 0.5103839679828455 + - 0.5103839679828455 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 300.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.412617647477692 + - 0.4417917885990019 + - 0.42793287347173736 + - 0.42793287347173736 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 180.0 + - 240.0 + - 300.0 + - 600.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3889235928427754 + - 0.4695920056841419 + - 0.5172487917535501 + - 0.4980196690457847 + - 0.4965080769037575 + - 0.4965080769037575 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 300.0 + - 480.0 + - 540.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3776932524192807 + - 0.41728398804646816 + - 0.4147298546882691 + - 0.4161053216271213 + - 0.4161053216271213 +- !!python/tuple + - !!python/tuple + - 0.0 + - 360.0 + - 420.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.46673802096005224 + - 0.463358387956608 + - 0.463358387956608 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 360.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.41289388808915367 + - 0.42484378613653784 + - 0.42484378613653784 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 270.0 + - 330.0 + - 390.0 + - 510.0 + - 570.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.44861187614720016 + - 0.39295373936031447 + - 0.4240737429022521 + - 0.40957413049113134 + - 0.4131990335939115 + - 0.41138658204252154 + - 0.41138658204252154 +- !!python/tuple + - !!python/tuple + - 0.0 + - 360.0 + - 420.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.44630961682620884 + - 0.43842590275136056 + - 0.43842590275136056 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3576741285644469 + - 0.42035944685626625 + - 0.42035944685626625 +problem_name: CNTNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.18 + - 0.24 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1413396080184879 + - -0.0651452298227168 + - 0.00335266012911766 + - -0.04128581969356213 + - -0.04128581969356213 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.24 + - 1.0 + - !!python/tuple + - 1.0 + - -0.17946907608813625 + - -0.3122988097797686 + - -0.3122988097797686 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - -0.060922132446963796 + - -0.13593465844999228 + - -0.10030062805866267 + - -0.10030062805866267 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.18 + - 0.24 + - 0.3 + - 0.6 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.20741455217908875 + - -0.3299496386238798 + - -0.2805077352227177 + - -0.2766211308360348 + - -0.2766211308360348 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.3 + - 0.48 + - 0.54 + - 1.0 + - !!python/tuple + - 1.0 + - 0.028875441423875305 + - -0.07292022321504579 + - -0.06635303776987903 + - -0.06988963715383116 + - -0.06988963715383116 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.36 + - 0.42 + - 1.0 + - !!python/tuple + - 1.0 + - -0.20007638916555462 + - -0.19138667975826118 + - -0.19138667975826118 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.36 + - 1.0 + - !!python/tuple + - 1.0 + - -0.061632402064300616 + - -0.0923579694181304 + - -0.0923579694181304 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.27 + - 0.33 + - 0.39 + - 0.51 + - 0.57 + - 1.0 + - !!python/tuple + - 1.0 + - -0.15347046155812435 + - -0.010362309182843246 + - -0.09037803493110881 + - -0.05309664424678923 + - -0.062416991917869126 + - -0.057756818082329464 + - -0.057756818082329464 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.36 + - 0.42 + - 1.0 + - !!python/tuple + - 1.0 + - -0.14755089441599417 + - -0.12728029571761354 + - -0.12728029571761354 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08034859507985995 + - -0.08082784020304724 + - -0.08082784020304724 +solver_name: NELDMD diff --git a/test/expected_results/CNTNEWS1_RNDSRCH.yaml b/test/expected_results/CNTNEWS1_RNDSRCH.yaml new file mode 100644 index 000000000..c697eee60 --- /dev/null +++ b/test/expected_results/CNTNEWS1_RNDSRCH.yaml @@ -0,0 +1,501 @@ +all_est_objectives: +- - 0.0 + - 0.30642490124223903 + - 0.4151164698102006 + - 0.383692822859518 + - 0.41264401929671174 + - 0.41264401929671174 +- - 0.0 + - 0.2608097677102839 + - 0.4634029387306951 + - 0.5247338854640871 + - 0.4832543226170563 + - 0.49262851577797984 +- - 0.0 + - 0.45785222794560837 + - 0.35589089245323074 + - 0.44682453155847746 + - 0.44682453155847746 +- - 0.0 + - 0.2737730945815515 + - 0.5017681608415159 + - 0.5017681608415159 +- - 0.0 + - 0.37535406229302315 + - 0.3918892086848514 + - 0.41859627008283357 + - 0.4155557551796807 + - 0.4155557551796807 +- - 0.0 + - 0.459775599575629 + - 0.4693215852862771 + - 0.3291477295050598 + - 0.5033010821239441 + - 0.44032376540116447 + - 0.4433469952445831 + - 0.4433469952445831 +- - 0.0 + - 0.3374887812737839 + - 0.42795951313399394 + - 0.42795951313399394 +- - 0.0 + - 0.1613541911278018 + - 0.2082772359174493 + - 0.39029635105208366 + - 0.41395474632071955 + - 0.41395474632071955 +- - 0.0 + - 0.2165783048877279 + - 0.45037156341569434 + - 0.4057769392078374 + - 0.4057769392078374 +- - 0.0 + - 0.4164897722325254 + - 0.428005095615344 + - 0.428005095615344 +all_intermediate_budgets: +- - 0 + - 20 + - 80 + - 520 + - 940 + - 1000 +- - 0 + - 30 + - 40 + - 370 + - 700 + - 1000 +- - 0 + - 20 + - 120 + - 230 + - 1000 +- - 0 + - 20 + - 60 + - 1000 +- - 0 + - 30 + - 60 + - 620 + - 640 + - 1000 +- - 0 + - 20 + - 50 + - 70 + - 160 + - 510 + - 940 + - 1000 +- - 0 + - 60 + - 120 + - 1000 +- - 0 + - 70 + - 80 + - 90 + - 130 + - 1000 +- - 0 + - 50 + - 70 + - 840 + - 1000 +- - 0 + - 30 + - 340 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.08637653581125314 + - !!python/tuple + - 0.16201092394781372 + - !!python/tuple + - 0.220031799278404 + - !!python/tuple + - 0.18069759039261452 + - !!python/tuple + - 0.18069759039261452 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.3422671900811551 + - !!python/tuple + - 0.25411599712618166 + - !!python/tuple + - 0.19694301248184054 + - !!python/tuple + - 0.24037175375360595 + - !!python/tuple + - 0.23334625077738846 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.16067182294009807 + - !!python/tuple + - 0.27075075921979186 + - !!python/tuple + - 0.21701449798421404 + - !!python/tuple + - 0.21701449798421404 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.07150266276670732 + - !!python/tuple + - 0.16380950044050657 + - !!python/tuple + - 0.16380950044050657 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.23124098139956537 + - !!python/tuple + - 0.12808012265783883 + - !!python/tuple + - 0.15379949965266126 + - !!python/tuple + - 0.14781215577002094 + - !!python/tuple + - 0.14781215577002094 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.14223141856328267 + - !!python/tuple + - 0.14837586376590187 + - !!python/tuple + - 0.3022077181845406 + - !!python/tuple + - 0.20663001343178547 + - !!python/tuple + - 0.2576797005148086 + - !!python/tuple + - 0.2561104719278581 + - !!python/tuple + - 0.2561104719278581 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.09590415802387352 + - !!python/tuple + - 0.1800190952064003 + - !!python/tuple + - 0.1800190952064003 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.041719078922958744 + - !!python/tuple + - 0.054813625384861384 + - !!python/tuple + - 0.24350561539939172 + - !!python/tuple + - 0.22592668331808533 + - !!python/tuple + - 0.22592668331808533 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.05706434183349318 + - !!python/tuple + - 0.22615291294721201 + - !!python/tuple + - 0.2623222684966682 + - !!python/tuple + - 0.2623222684966682 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.15178070996172968 + - !!python/tuple + - 0.16594898609478428 + - !!python/tuple + - 0.16594898609478428 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 80.0 + - 520.0 + - 940.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.30642490124223903 + - 0.4151164698102006 + - 0.383692822859518 + - 0.41264401929671174 + - 0.41264401929671174 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 40.0 + - 370.0 + - 700.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.2608097677102839 + - 0.4634029387306951 + - 0.4031116411987593 + - 0.4832543226170563 + - 0.49262851577797984 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 120.0 + - 230.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.45785222794560837 + - 0.35589089245323074 + - 0.44682453155847746 + - 0.44682453155847746 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 60.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.2737730945815515 + - 0.5017681608415159 + - 0.5017681608415159 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 60.0 + - 620.0 + - 640.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.37535406229302315 + - 0.3918892086848514 + - 0.41859627008283357 + - 0.4155557551796807 + - 0.4155557551796807 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 70.0 + - 160.0 + - 510.0 + - 940.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.459775599575629 + - 0.4693215852862771 + - 0.3291477295050598 + - 0.5033010821239441 + - 0.44032376540116447 + - 0.4433469952445831 + - 0.4433469952445831 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 120.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3374887812737839 + - 0.42795951313399394 + - 0.42795951313399394 +- !!python/tuple + - !!python/tuple + - 0.0 + - 70.0 + - 80.0 + - 90.0 + - 130.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.1613541911278018 + - 0.2082772359174493 + - 0.39029635105208366 + - 0.41395474632071955 + - 0.41395474632071955 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 70.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.2165783048877279 + - 0.45037156341569434 + - 0.4057769392078374 + - 0.4057769392078374 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 340.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.4164897722325254 + - 0.428005095615344 + - 0.428005095615344 +problem_name: CNTNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.08 + - 0.52 + - 0.94 + - 1.0 + - !!python/tuple + - 1.0 + - 0.23985102407113976 + - -0.029780406677767404 + - 0.04817230849869357 + - -0.023646992851919083 + - -0.023646992851919083 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.04 + - 0.37 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3530085935134571 + - -0.14956476412500427 + - -0.0 + - -0.1988101389976521 + - -0.22206472210283576 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.12 + - 0.23 + - 1.0 + - !!python/tuple + - 1.0 + - -0.1357951027761526 + - 0.11714062289321427 + - -0.10843867031407549 + - -0.10843867031407549 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.06 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3208504379396867 + - -0.244737461189102 + - -0.244737461189102 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.06 + - 0.62 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.06885829152239722 + - 0.027839514831511793 + - -0.03841275542930641 + - -0.03087014293091489 + - -0.03087014293091489 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.05 + - 0.07 + - 0.16 + - 0.51 + - 0.94 + - 1.0 + - !!python/tuple + - 1.0 + - -0.14056641531949912 + - -0.16424716460835756 + - 0.1834824503548153 + - -0.24854018263338892 + - -0.09231220436042245 + - -0.09981193777032413 + - -0.09981193777032413 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.12 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1627907835403325 + - -0.061640174571349265 + - -0.061640174571349265 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.07 + - 0.08 + - 0.09 + - 0.13 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5997282771393743 + - 0.4833261691523427 + - 0.031790920521585504 + - -0.026898516474779522 + - -0.026898516474779522 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.05 + - 0.07 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.46273368776035617 + - -0.11723780061621424 + - -0.006611811063436768 + - -0.006611811063436768 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.34 + - 1.0 + - !!python/tuple + - 1.0 + - -0.03318716123896273 + - -0.06175325114044687 + - -0.06175325114044687 +solver_name: RNDSRCH diff --git a/test/expected_results/CNTNEWS1_SPSA.yaml b/test/expected_results/CNTNEWS1_SPSA.yaml new file mode 100644 index 000000000..0eac2e3af --- /dev/null +++ b/test/expected_results/CNTNEWS1_SPSA.yaml @@ -0,0 +1,845 @@ +all_est_objectives: +- - 0.0 + - 0.3429464172024326 + - 0.4115021249247384 + - 0.41492342232631946 + - 0.4138505181626517 + - 0.4132988240841759 + - 0.4125577795308321 + - 0.4117550503450055 + - 0.4107394436803852 + - 0.4107394436803852 +- - 0.0 + - 0.37268556152481336 + - 0.49457806671942095 + - 0.5164592272226188 + - 0.5135069581119557 + - 0.5135069581119557 +- - 0.0 + - 0.3582169441217175 + - 0.45666139535031997 + - 0.4654192188345126 + - 0.4564133157307797 + - 0.4506114123318362 + - 0.4441172167364378 + - 0.4408274615725344 + - 0.43778749605175626 + - 0.43778749605175626 +- - 0.0 + - 0.3654698820099673 + - 0.47194540209751457 + - 0.4792834321852345 + - 0.484808793280978 + - 0.4892335008693194 + - 0.4930811587234702 + - 0.4964496419462773 + - 0.4964496419462773 +- - 0.0 + - 0.33544308154611086 + - 0.41261450713950665 + - 0.41808574180619934 + - 0.4136593025736609 + - 0.4159902140288644 + - 0.4159902140288644 +- - 0.0 + - 0.36290742002048326 + - 0.44617159734989087 + - 0.4781799824983829 + - 0.46808929276160144 + - 0.4618072767879084 + - 0.46232186895186284 + - 0.46269230742048373 + - 0.465346237525976 + - 0.465346237525976 +- - 0.0 + - 0.34774312089770393 + - 0.42520260903771734 + - 0.43175056524577243 + - 0.43256104460328737 + - 0.43041051280562187 + - 0.42827292510887155 + - 0.42608549781691124 + - 0.4237288284448436 + - 0.4237288284448436 +- - 0.0 + - 0.3479713079202194 + - 0.44850991599771883 + - 0.4596254890927701 + - 0.45736586086592995 + - 0.4537719181108492 + - 0.4503517777960105 + - 0.44724126607191134 + - 0.4439707662797271 + - 0.43970831513551195 + - 0.43546451562643285 + - 0.43331788043153247 + - 0.4312502573266455 + - 0.4292881271457174 + - 0.42741932661590676 + - 0.42741932661590676 +- - 0.0 + - 0.35215633302609456 + - 0.4545437710594256 + - 0.46958227201965036 + - 0.46436553178096834 + - 0.4585010991485759 + - 0.45124440264611915 + - 0.4429709642595987 + - 0.44048944623521136 + - 0.43816605247548085 + - 0.4382584563251735 + - 0.4391492872477771 + - 0.4391492872477771 +- - 0.0 + - 0.3334227845761664 + - 0.4066711879413156 + - 0.4169825031548733 + - 0.4231375424459163 + - 0.4231375424459163 +all_intermediate_budgets: +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 570 + - 690 + - 810 + - 870 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 810 + - 870 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.14916782386402333 + - !!python/tuple + - 0.1651214576715606 + - !!python/tuple + - 0.1753130186184001 + - !!python/tuple + - 0.17829510504005008 + - !!python/tuple + - 0.18096708966098796 + - !!python/tuple + - 0.18339717694544025 + - !!python/tuple + - 0.1856324457107729 + - !!python/tuple + - 0.1856324457107729 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.15408460625046405 + - !!python/tuple + - 0.17402664850984856 + - !!python/tuple + - 0.17062946152754568 + - !!python/tuple + - 0.17062946152754568 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.15900138863680602 + - !!python/tuple + - 0.1909086562517971 + - !!python/tuple + - 0.20789459116324643 + - !!python/tuple + - 0.21385876400641496 + - !!python/tuple + - 0.2192027332482907 + - !!python/tuple + - 0.2216328205326845 + - !!python/tuple + - 0.2238680892979626 + - !!python/tuple + - 0.2238680892979626 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.14425104147767587 + - !!python/tuple + - 0.14823944992951843 + - !!python/tuple + - 0.1516366369118213 + - !!python/tuple + - 0.1546187233334713 + - !!python/tuple + - 0.15729070795440916 + - !!python/tuple + - 0.15972079523886146 + - !!python/tuple + - 0.15972079523886146 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.14425104147767587 + - !!python/tuple + - 0.15222785838136102 + - !!python/tuple + - 0.1454334844167512 + - !!python/tuple + - 0.1484155708383318 + - !!python/tuple + - 0.1484155708383318 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.13441747670489318 + - !!python/tuple + - 0.1543595189642777 + - !!python/tuple + - 0.14756514499966786 + - !!python/tuple + - 0.1434843399978966 + - !!python/tuple + - 0.14380596010036828 + - !!python/tuple + - 0.1440374841432563 + - !!python/tuple + - 0.14576050339728266 + - !!python/tuple + - 0.14576050339728266 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.14916782386401783 + - !!python/tuple + - 0.16113304921962907 + - !!python/tuple + - 0.16792742318416568 + - !!python/tuple + - 0.17389159602733056 + - !!python/tuple + - 0.1792355652692063 + - !!python/tuple + - 0.18409573983805855 + - !!python/tuple + - 0.18856627736867218 + - !!python/tuple + - 0.18856627736867218 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.14916782386401783 + - !!python/tuple + - 0.1691098661233977 + - !!python/tuple + - 0.17930142707023722 + - !!python/tuple + - 0.18526559991340574 + - !!python/tuple + - 0.19060956915534147 + - !!python/tuple + - 0.19546974372424603 + - !!python/tuple + - 0.19994028125480798 + - !!python/tuple + - 0.20408919868289824 + - !!python/tuple + - 0.20796739972575776 + - !!python/tuple + - 0.20979073822574115 + - !!python/tuple + - 0.21151375747981363 + - !!python/tuple + - 0.21314886596392038 + - !!python/tuple + - 0.21470619973876262 + - !!python/tuple + - 0.21470619973876262 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.15408460625046405 + - !!python/tuple + - 0.1820034654136172 + - !!python/tuple + - 0.20238658730736941 + - !!python/tuple + - 0.21431493299369916 + - !!python/tuple + - 0.22500287147745063 + - !!python/tuple + - 0.23472322061520434 + - !!python/tuple + - 0.23695848938053984 + - !!python/tuple + - 0.23903294809458497 + - !!python/tuple + - 0.2389504446573593 + - !!python/tuple + - 0.2381550599050347 + - !!python/tuple + - 0.2381550599050347 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.1 + - !!python/tuple + - 0.14425104147758255 + - !!python/tuple + - 0.1522278583813512 + - !!python/tuple + - 0.15902223234596102 + - !!python/tuple + - 0.15902223234596102 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3429464172024326 + - 0.4115021249247384 + - 0.41492342232631946 + - 0.4138505181626517 + - 0.4132988240841759 + - 0.4125577795308321 + - 0.4117550503450055 + - 0.4107394436803852 + - 0.4107394436803852 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.37268556152481336 + - 0.49457806671942095 + - 0.41405633738001996 + - 0.5135069581119557 + - 0.5135069581119557 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3582169441217175 + - 0.45666139535031997 + - 0.4654192188345126 + - 0.4564133157307797 + - 0.4506114123318362 + - 0.4441172167364378 + - 0.4408274615725344 + - 0.43778749605175626 + - 0.43778749605175626 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3654698820099673 + - 0.47194540209751457 + - 0.4792834321852345 + - 0.484808793280978 + - 0.4892335008693194 + - 0.4930811587234702 + - 0.4964496419462773 + - 0.4964496419462773 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.33544308154611086 + - 0.41261450713950665 + - 0.41808574180619934 + - 0.4136593025736609 + - 0.4159902140288644 + - 0.4159902140288644 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 570.0 + - 690.0 + - 810.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.36290742002048326 + - 0.44617159734989087 + - 0.4781799824983829 + - 0.46808929276160144 + - 0.4618072767879084 + - 0.46232186895186284 + - 0.46269230742048373 + - 0.465346237525976 + - 0.465346237525976 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.34774312089770393 + - 0.42520260903771734 + - 0.43175056524577243 + - 0.43256104460328737 + - 0.43041051280562187 + - 0.42827292510887155 + - 0.42608549781691124 + - 0.4237288284448436 + - 0.4237288284448436 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3479713079202194 + - 0.44850991599771883 + - 0.4596254890927701 + - 0.45736586086592995 + - 0.4537719181108492 + - 0.4503517777960105 + - 0.44724126607191134 + - 0.4439707662797271 + - 0.43970831513551195 + - 0.43546451562643285 + - 0.43331788043153247 + - 0.4312502573266455 + - 0.4292881271457174 + - 0.42741932661590676 + - 0.42741932661590676 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 810.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.35215633302609456 + - 0.4545437710594256 + - 0.46958227201965036 + - 0.46436553178096834 + - 0.4585010991485759 + - 0.45124440264611915 + - 0.4429709642595987 + - 0.44048944623521136 + - 0.43816605247548085 + - 0.4382584563251735 + - 0.4391492872477771 + - 0.4391492872477771 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.3334227845761664 + - 0.4066711879413156 + - 0.4169825031548733 + - 0.4231375424459163 + - 0.4231375424459163 +problem_name: CNTNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.17173972176719243 + - 0.006168755854441335 + - -0.0020941231132605336 + - 0.0004970802250499793 + - 0.0018294933018953286 + - 0.0036192124450264594 + - 0.005557908012170722 + - 0.008010730425291244 + - 0.008010730425291244 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0999158136715985 + - -0.19447046710819532 + - -0.0 + - -0.24018620596708842 + - -0.24018620596708842 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1348594097403059 + - -0.10289676578768842 + - -0.12404805051287478 + - -0.10229762118550695 + - -0.08828526857751266 + - -0.07260094011996251 + - -0.06465575279419997 + - -0.05731384000036668 + - -0.05731384000036668 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 1.0 + - !!python/tuple + - 1.0 + - 0.11734261979296828 + - -0.1398096333551928 + - -0.157531932050467 + - -0.17087639896698786 + - -0.1815626442647634 + - -0.19085523927368714 + - -0.19899056511876773 + - -0.19899056511876773 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.18986125494743494 + - 0.0034822078793350295 + - -0.0097315366591798 + - 0.0009588907849384172 + - -0.004670564061598981 + - -0.004670564061598981 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.57 + - 0.69 + - 0.81 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - 0.12353129934729712 + - -0.07756253695592057 + - -0.1548669572940515 + - -0.1304966269167139 + - -0.11532473988935166 + - -0.11656754700881412 + - -0.11746220417301761 + - -0.12387179114440718 + - -0.12387179114440718 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1601550574057605 + - -0.026919698242578425 + - -0.0427338655838825 + - -0.044691278825383214 + - -0.03949746435251899 + - -0.034334911569783896 + - -0.029051989671277385 + - -0.02336032609964924 + - -0.02336032609964924 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.15960395601709595 + - -0.08320988113769036 + - -0.11005543835192384 + - -0.10459814178900156 + - -0.09591830179954085 + - -0.08765821734707241 + - -0.08014592628112423 + - -0.07224724318674476 + - -0.061952868341074725 + - -0.05170353962428188 + - -0.04651913595476335 + - -0.0415255567766978 + - -0.03678675675411229 + - -0.03227335999840592 + - -0.03227335999840592 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.81 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1494965751414492 + - -0.09778242723102287 + - -0.1341023663373345 + - -0.1215032589992089 + - -0.1073398901458297 + - -0.0898140226554921 + - -0.0698325910491764 + - -0.06383940171632044 + - -0.05822810308379135 + - -0.058451270419611796 + - -0.06060274315938526 + - -0.06060274315938526 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 1.0 + - !!python/tuple + - 1.0 + - 0.19474053534374056 + - 0.01783609806683446 + - -0.007067071581053234 + - -0.021932293376689983 + - -0.021932293376689983 +solver_name: SPSA diff --git a/test/expected_results/CNTNEWS1_STRONG.yaml b/test/expected_results/CNTNEWS1_STRONG.yaml new file mode 100644 index 000000000..b3616cebc --- /dev/null +++ b/test/expected_results/CNTNEWS1_STRONG.yaml @@ -0,0 +1,229 @@ +all_est_objectives: +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +- - 0.0 + - 0.0 +all_intermediate_budgets: +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +- - 10 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +- - !!python/tuple + - 0.0 + - !!python/tuple + - 0.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 0.0 + - 0.0 +problem_name: CNTNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +solver_name: STRONG diff --git a/test/expected_results/CONTAM1_RNDSRCH.yaml b/test/expected_results/CONTAM1_RNDSRCH.yaml new file mode 100644 index 000000000..75541a0e9 --- /dev/null +++ b/test/expected_results/CONTAM1_RNDSRCH.yaml @@ -0,0 +1,441 @@ +all_est_objectives: +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 4.0 +- - 5.0 + - 4.0 + - 3.0 + - 3.0 +all_intermediate_budgets: +- - 0 + - 350 + - 10000 +- - 0 + - 50 + - 10000 +- - 0 + - 460 + - 10000 +- - 0 + - 110 + - 10000 +- - 0 + - 1050 + - 10000 +- - 0 + - 1310 + - 10000 +- - 0 + - 680 + - 10000 +- - 0 + - 340 + - 10000 +- - 0 + - 600 + - 10000 +- - 0 + - 120 + - 240 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 0.0 + - 1.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 350.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 460.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 110.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1050.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1310.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 680.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 340.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 600.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 4.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.0 + - 3.0 + - 3.0 +problem_name: CONTAM-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.035 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.005 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.046 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.011 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.105 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.131 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.068 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.034 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.012 + - 0.024 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5 + - 0.0 + - 0.0 +solver_name: RNDSRCH diff --git a/test/expected_results/CONTAM2_RNDSRCH.yaml b/test/expected_results/CONTAM2_RNDSRCH.yaml new file mode 100644 index 000000000..784e36bba --- /dev/null +++ b/test/expected_results/CONTAM2_RNDSRCH.yaml @@ -0,0 +1,729 @@ +all_est_objectives: +- - 5.0 + - 3.667378017170037 + - 3.3211801328709045 + - 3.291355383256896 + - 3.000273415599221 + - 3.000273415599221 +- - 5.0 + - 3.56335421399625 + - 3.5574467619762116 + - 3.480077810319183 + - 3.480077810319183 +- - 5.0 + - 3.88743374067969 + - 3.597213034336526 + - 3.116723753111097 + - 3.116723753111097 +- - 5.0 + - 4.24621445527594 + - 4.142112564425778 + - 3.5419670428915766 + - 3.5419670428915766 +- - 5.0 + - 3.676476563258823 + - 3.6599794985437137 + - 3.150652949543625 + - 3.150652949543625 +- - 5.0 + - 4.1684142861119895 + - 3.7871814993521546 + - 3.5729307386022042 + - 3.112418814884292 + - 2.959428638816148 + - 2.959428638816148 +- - 5.0 + - 3.5470976037430346 + - 3.5424001891676444 + - 3.344015624037768 + - 3.2577571681732063 + - 3.2577571681732063 +- - 5.0 + - 3.804930813476817 + - 3.1908605444941185 + - 2.955048022011758 + - 2.9529103849095657 + - 2.9529103849095657 +- - 5.0 + - 3.825462916795231 + - 3.4557396778356884 + - 3.231484368478121 + - 3.231484368478121 +- - 5.0 + - 3.322856331047163 + - 3.2065094392639493 + - 2.533092906205758 + - 2.533092906205758 +all_intermediate_budgets: +- - 0 + - 30 + - 70 + - 90 + - 2820 + - 10000 +- - 0 + - 290 + - 2460 + - 4600 + - 10000 +- - 0 + - 310 + - 1260 + - 1470 + - 10000 +- - 0 + - 2730 + - 4670 + - 8800 + - 10000 +- - 0 + - 40 + - 3240 + - 5870 + - 10000 +- - 0 + - 550 + - 1340 + - 5150 + - 6250 + - 8480 + - 10000 +- - 0 + - 910 + - 2450 + - 2950 + - 5210 + - 10000 +- - 0 + - 400 + - 480 + - 1380 + - 8270 + - 10000 +- - 0 + - 280 + - 3210 + - 7010 + - 10000 +- - 0 + - 70 + - 270 + - 690 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.03326209446380745 + - 0.9980069071951874 + - 0.901269364977262 + - 0.7880875551892006 + - 0.9467520953445778 + - !!python/tuple + - 0.4364856003758043 + - 0.8519591601117293 + - 0.6367106003304489 + - 0.8388013584703865 + - 0.557223413582535 + - !!python/tuple + - 0.12796479454652343 + - 0.5595762809719579 + - 0.9052088780522921 + - 0.8230316257548002 + - 0.8755738039313237 + - !!python/tuple + - 0.06229376652210565 + - 0.7898627040654985 + - 0.7782993900790515 + - 0.7738785007891078 + - 0.5959390541434575 + - !!python/tuple + - 0.06229376652210565 + - 0.7898627040654985 + - 0.7782993900790515 + - 0.7738785007891078 + - 0.5959390541434575 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.24632191104697004 + - 0.6637364647018688 + - 0.9563748077317048 + - 0.9840620028984026 + - 0.7128590276173031 + - !!python/tuple + - 0.25051909454818155 + - 0.6634471446734401 + - 0.748241567666234 + - 0.9990029585996213 + - 0.8962359964887349 + - !!python/tuple + - 0.24606300894662408 + - 0.6850149956259688 + - 0.9413679958797393 + - 0.7677955207651175 + - 0.8398362891017338 + - !!python/tuple + - 0.24606300894662408 + - 0.6850149956259688 + - 0.9413679958797393 + - 0.7677955207651175 + - 0.8398362891017338 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.7698572986131343 + - 0.7192630450256898 + - 0.9778550228555325 + - 0.5973057528584256 + - 0.8231526213269088 + - !!python/tuple + - 0.4968506438529431 + - 0.9233205677128113 + - 0.8304316817619348 + - 0.6456992617588133 + - 0.7009108792500252 + - !!python/tuple + - 0.06344719980773925 + - 0.9226542552728404 + - 0.7729225111584836 + - 0.6167373234129891 + - 0.7409624634590448 + - !!python/tuple + - 0.06344719980773925 + - 0.9226542552728404 + - 0.7729225111584836 + - 0.6167373234129891 + - 0.7409624634590448 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.5898436751886001 + - 0.9861156430821991 + - 0.7755748194920743 + - 0.9224802062092077 + - 0.9722001113038564 + - !!python/tuple + - 0.6988445830903187 + - 0.9660945427482167 + - 0.8186923994887665 + - 0.8043678517706024 + - 0.8541131873278746 + - !!python/tuple + - 0.01852142947084674 + - 0.8444670139926344 + - 0.9813207425444188 + - 0.7883824363778221 + - 0.9092754205058532 + - !!python/tuple + - 0.01852142947084674 + - 0.8444670139926344 + - 0.9813207425444188 + - 0.7883824363778221 + - 0.9092754205058532 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.24562849572178141 + - 0.8088286214592758 + - 0.8706149084232517 + - 0.9832052063445288 + - 0.7681993313099865 + - !!python/tuple + - 0.5488515992558405 + - 0.6899984934180245 + - 0.8717399885230506 + - 0.7460824207368175 + - 0.803306996609982 + - !!python/tuple + - 0.01360778949000412 + - 0.7085216358239996 + - 0.9008675288363467 + - 0.7205134052473093 + - 0.8071425901459667 + - !!python/tuple + - 0.01360778949000412 + - 0.7085216358239996 + - 0.9008675288363467 + - 0.7205134052473093 + - 0.8071425901459667 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.8781058955113464 + - 0.9756674482344718 + - 0.9510288412715306 + - 0.6683077362850329 + - 0.6953043648096052 + - !!python/tuple + - 0.715419861443185 + - 0.7875036694576878 + - 0.7895704135835744 + - 0.834710978581543 + - 0.659976576286165 + - !!python/tuple + - 0.1391789719809839 + - 0.9177810735764129 + - 0.788741525741815 + - 0.8139095756442267 + - 0.9133195916587662 + - !!python/tuple + - 0.08480227404247806 + - 0.9333753462745976 + - 0.5179690203484046 + - 0.9103170059029798 + - 0.6659551683158322 + - !!python/tuple + - 0.10192041988471694 + - 0.9067525371454023 + - 0.5265895951377777 + - 0.8057342128811209 + - 0.6184318737671314 + - !!python/tuple + - 0.10192041988471694 + - 0.9067525371454023 + - 0.5265895951377777 + - 0.8057342128811209 + - 0.6184318737671314 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.15532444168522114 + - 0.804898578072643 + - 0.9763238320768245 + - 0.7371860820182378 + - 0.8733646698901084 + - !!python/tuple + - 0.457591377473205 + - 0.8996494261378144 + - 0.7849648842291664 + - 0.9603175001093279 + - 0.439877001218129 + - !!python/tuple + - 0.17687179026876865 + - 0.8730649320868556 + - 0.9822296899053676 + - 0.9549250208363879 + - 0.35692419094038935 + - !!python/tuple + - 0.01806688582476048 + - 0.896702386558544 + - 0.6011137722599471 + - 0.9430836737531713 + - 0.798790449776783 + - !!python/tuple + - 0.01806688582476048 + - 0.896702386558544 + - 0.6011137722599471 + - 0.9430836737531713 + - 0.798790449776783 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.25482071354116975 + - 0.81435415343979 + - 0.8915878253640299 + - 0.9921094680574651 + - 0.8520586530743632 + - !!python/tuple + - 0.2234959827007643 + - 0.8444680747690982 + - 0.6751698340371544 + - 0.703053024652188 + - 0.744673628334914 + - !!python/tuple + - 0.13235233526893095 + - 0.8908768527448143 + - 0.40452793523245734 + - 0.7498565805075151 + - 0.7774343182580402 + - !!python/tuple + - 0.05645904567639378 + - 0.9444027658169566 + - 0.4478956098114808 + - 0.7538730059297721 + - 0.7502799576749632 + - !!python/tuple + - 0.05645904567639378 + - 0.9444027658169566 + - 0.4478956098114808 + - 0.7538730059297721 + - 0.7502799576749632 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.7007941377268128 + - 0.9827784801409403 + - 0.4625638588828227 + - 0.7666013702873804 + - 0.912725069757275 + - !!python/tuple + - 0.1427668749111495 + - 0.8876552981399702 + - 0.8522797872485117 + - 0.6898583284324343 + - 0.8831793891036215 + - !!python/tuple + - 0.1359046532931197 + - 0.8833809140471812 + - 0.5627404810045893 + - 0.8196071736696856 + - 0.8298511464635465 + - !!python/tuple + - 0.1359046532931197 + - 0.8833809140471812 + - 0.5627404810045893 + - 0.8196071736696856 + - 0.8298511464635465 +- - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - !!python/tuple + - 0.040689602136480915 + - 0.931800068778548 + - 0.6429362743466033 + - 0.8138730023721197 + - 0.8935573834134116 + - !!python/tuple + - 0.26597978019243906 + - 0.8292102889334177 + - 0.673802245443423 + - 0.9518629151832979 + - 0.48565420951137217 + - !!python/tuple + - 0.050912116791522195 + - 0.5487563535900138 + - 0.7448884963376464 + - 0.4434954017044612 + - 0.745040537782114 + - !!python/tuple + - 0.050912116791522195 + - 0.5487563535900138 + - 0.7448884963376464 + - 0.4434954017044612 + - 0.745040537782114 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 70.0 + - 90.0 + - 2820.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.667378017170037 + - 3.3211801328709045 + - 3.291355383256896 + - 3.000273415599221 + - 3.000273415599221 +- !!python/tuple + - !!python/tuple + - 0.0 + - 290.0 + - 2460.0 + - 4600.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.56335421399625 + - 3.5574467619762116 + - 3.480077810319183 + - 3.480077810319183 +- !!python/tuple + - !!python/tuple + - 0.0 + - 310.0 + - 1260.0 + - 1470.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.88743374067969 + - 3.597213034336526 + - 3.116723753111097 + - 3.116723753111097 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2730.0 + - 4670.0 + - 8800.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.24621445527594 + - 4.142112564425778 + - 3.5419670428915766 + - 3.5419670428915766 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 3240.0 + - 5870.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.676476563258823 + - 3.6599794985437137 + - 3.150652949543625 + - 3.150652949543625 +- !!python/tuple + - !!python/tuple + - 0.0 + - 550.0 + - 1340.0 + - 5150.0 + - 6250.0 + - 8480.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 4.1684142861119895 + - 3.7871814993521546 + - 3.5729307386022042 + - 3.112418814884292 + - 2.959428638816148 + - 2.959428638816148 +- !!python/tuple + - !!python/tuple + - 0.0 + - 910.0 + - 2450.0 + - 2950.0 + - 5210.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.5470976037430346 + - 3.5424001891676444 + - 3.344015624037768 + - 3.2577571681732063 + - 3.2577571681732063 +- !!python/tuple + - !!python/tuple + - 0.0 + - 400.0 + - 480.0 + - 1380.0 + - 8270.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.804930813476817 + - 3.1908605444941185 + - 2.955048022011758 + - 2.9529103849095657 + - 2.9529103849095657 +- !!python/tuple + - !!python/tuple + - 0.0 + - 280.0 + - 3210.0 + - 7010.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.825462916795231 + - 3.4557396778356884 + - 3.231484368478121 + - 3.231484368478121 +- !!python/tuple + - !!python/tuple + - 0.0 + - 70.0 + - 270.0 + - 690.0 + - 10000.0 + - !!python/tuple + - 5.0 + - 3.322856331047163 + - 3.2065094392639493 + - 2.533092906205758 + - 2.533092906205758 +problem_name: CONTAM-2 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.003 + - 0.007 + - 0.009 + - 0.282 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4598004982910341 + - 0.3194636833497544 + - 0.3073737470529899 + - 0.18937904494607982 + - 0.18937904494607982 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.029 + - 0.246 + - 0.46 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4176327962987419 + - 0.41523811672815764 + - 0.383875382455895 + - 0.383875382455895 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.031 + - 0.126 + - 0.147 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5490035834267596 + - 0.43135800728275153 + - 0.2365840401422179 + - 0.2365840401422179 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.273 + - 0.467 + - 0.88 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6944410486230774 + - 0.6522416925500252 + - 0.40896316655935083 + - 0.40896316655935083 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.004 + - 0.324 + - 0.587 + - 1.0 + - !!python/tuple + - 1.0 + - 0.46348873856229295 + - 0.4568013911722718 + - 0.2503377791937941 + - 0.2503377791937941 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.055 + - 0.134 + - 0.515 + - 0.625 + - 0.848 + - 1.0 + - !!python/tuple + - 1.0 + - 0.662903513480524 + - 0.5083647439748279 + - 0.4215147927590241 + - 0.2348389650084058 + - 0.1728219654817489 + - 0.1728219654817489 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.091 + - 0.245 + - 0.295 + - 0.521 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41104292094668243 + - 0.4091387492868712 + - 0.3287204126462522 + - 0.2937541765518514 + - 0.2937541765518514 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.048 + - 0.138 + - 0.827 + - 1.0 + - !!python/tuple + - 1.0 + - 0.515559710566522 + - 0.2666365668747893 + - 0.17104621283366178 + - 0.17017968765824287 + - 0.17017968765824287 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.028 + - 0.321 + - 0.701 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5238827249881289 + - 0.3740095336184095 + - 0.2831040796101476 + - 0.2831040796101476 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.007 + - 0.027 + - 0.069 + - 1.0 + - !!python/tuple + - 1.0 + - 0.32014315692234047 + - 0.27298009509650356 + - 0.0 + - 0.0 +solver_name: RNDSRCH diff --git a/test/expected_results/DUALSOURCING1_RNDSRCH.yaml b/test/expected_results/DUALSOURCING1_RNDSRCH.yaml new file mode 100644 index 000000000..d22e30de5 --- /dev/null +++ b/test/expected_results/DUALSOURCING1_RNDSRCH.yaml @@ -0,0 +1,591 @@ +all_est_objectives: +- - 3291.55245 + - 3284.783300000001 + - 3274.906049999999 + - 3261.74975 + - 3257.48345 + - 3251.78475 + - 3251.78475 +- - 3294.1309499999998 + - 3279.0634999999997 + - 3274.7287500000007 + - 3263.1724499999996 + - 3261.18745 + - 3250.3644499999996 + - 3250.3644499999996 +- - 3292.8134999999997 + - 3281.6305000000007 + - 3268.73705 + - 3249.467800000001 + - 3249.467800000001 +- - 3289.0947499999997 + - 3248.29325 + - 3245.6727499999997 + - 3245.6727499999997 +- - 3300.4361000000004 + - 3275.393 + - 3275.25365 + - 3269.3328 + - 3262.8836499999998 + - 3262.8836499999998 +- - 3299.5075499999994 + - 3292.6588 + - 3280.7238 + - 3259.878999999999 + - 3255.5115 + - 3255.5115 +- - 3290.2424999999994 + - 3280.1293 + - 3269.3651 + - 3263.8942500000003 + - 3246.4921000000004 + - 3246.4921000000004 +- - 3298.4577000000004 + - 3267.0598999999997 + - 3265.2524999999996 + - 3265.2524999999996 +- - 3298.7213 + - 3291.00275 + - 3270.6689499999998 + - 3261.0730999999996 + - 3261.0730999999996 +- - 3292.317499999999 + - 3280.3055 + - 3275.7666500000005 + - 3264.0554999999995 + - 3258.9226499999995 + - 3250.4445 + - 3248.56365 + - 3248.56365 +all_intermediate_budgets: +- - 0 + - 20 + - 30 + - 290 + - 590 + - 940 + - 1000 +- - 0 + - 110 + - 210 + - 240 + - 250 + - 370 + - 1000 +- - 0 + - 50 + - 230 + - 330 + - 1000 +- - 0 + - 70 + - 240 + - 1000 +- - 0 + - 50 + - 150 + - 330 + - 600 + - 1000 +- - 0 + - 60 + - 120 + - 250 + - 520 + - 1000 +- - 0 + - 20 + - 30 + - 140 + - 150 + - 1000 +- - 0 + - 220 + - 630 + - 1000 +- - 0 + - 90 + - 140 + - 470 + - 1000 +- - 0 + - 140 + - 170 + - 180 + - 240 + - 550 + - 650 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 48.0 + - 83.0 + - !!python/tuple + - 53.0 + - 85.0 + - !!python/tuple + - 49.0 + - 87.0 + - !!python/tuple + - 48.0 + - 89.0 + - !!python/tuple + - 51.0 + - 89.0 + - !!python/tuple + - 51.0 + - 89.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 54.0 + - 86.0 + - !!python/tuple + - 54.0 + - 87.0 + - !!python/tuple + - 51.0 + - 87.0 + - !!python/tuple + - 52.0 + - 88.0 + - !!python/tuple + - 50.0 + - 90.0 + - !!python/tuple + - 50.0 + - 90.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 52.0 + - 83.0 + - !!python/tuple + - 54.0 + - 88.0 + - !!python/tuple + - 51.0 + - 90.0 + - !!python/tuple + - 51.0 + - 90.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 52.0 + - 90.0 + - !!python/tuple + - 50.0 + - 90.0 + - !!python/tuple + - 50.0 + - 90.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 48.0 + - 87.0 + - !!python/tuple + - 49.0 + - 86.0 + - !!python/tuple + - 47.0 + - 90.0 + - !!python/tuple + - 52.0 + - 89.0 + - !!python/tuple + - 52.0 + - 89.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 49.0 + - 82.0 + - !!python/tuple + - 55.0 + - 88.0 + - !!python/tuple + - 51.0 + - 89.0 + - !!python/tuple + - 50.0 + - 90.0 + - !!python/tuple + - 50.0 + - 90.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 56.0 + - 88.0 + - !!python/tuple + - 48.0 + - 86.0 + - !!python/tuple + - 51.0 + - 86.0 + - !!python/tuple + - 50.0 + - 90.0 + - !!python/tuple + - 50.0 + - 90.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 50.0 + - 87.0 + - !!python/tuple + - 52.0 + - 88.0 + - !!python/tuple + - 52.0 + - 88.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 57.0 + - 89.0 + - !!python/tuple + - 54.0 + - 89.0 + - !!python/tuple + - 48.0 + - 90.0 + - !!python/tuple + - 48.0 + - 90.0 +- - !!python/tuple + - 50.0 + - 80.0 + - !!python/tuple + - 52.0 + - 83.0 + - !!python/tuple + - 54.0 + - 86.0 + - !!python/tuple + - 48.0 + - 88.0 + - !!python/tuple + - 54.0 + - 90.0 + - !!python/tuple + - 52.0 + - 90.0 + - !!python/tuple + - 51.0 + - 90.0 + - !!python/tuple + - 51.0 + - 90.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 290.0 + - 590.0 + - 940.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3284.783300000001 + - 3274.906049999999 + - 3261.74975 + - 3257.48345 + - 3251.78475 + - 3251.78475 +- !!python/tuple + - !!python/tuple + - 0.0 + - 110.0 + - 210.0 + - 240.0 + - 250.0 + - 370.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3279.0634999999997 + - 3274.7287500000007 + - 3263.1724499999996 + - 3261.18745 + - 3247.1854000000003 + - 3247.1854000000003 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 230.0 + - 330.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3281.6305000000007 + - 3268.73705 + - 3249.467800000001 + - 3249.467800000001 +- !!python/tuple + - !!python/tuple + - 0.0 + - 70.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3248.29325 + - 3247.1854000000003 + - 3247.1854000000003 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 150.0 + - 330.0 + - 600.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3275.393 + - 3275.25365 + - 3269.3328 + - 3262.8836499999998 + - 3262.8836499999998 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 120.0 + - 250.0 + - 520.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3292.6588 + - 3280.7238 + - 3259.878999999999 + - 3247.1854000000003 + - 3247.1854000000003 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 140.0 + - 150.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3280.1293 + - 3269.3651 + - 3263.8942500000003 + - 3247.1854000000003 + - 3247.1854000000003 +- !!python/tuple + - !!python/tuple + - 0.0 + - 220.0 + - 630.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3267.0598999999997 + - 3265.2524999999996 + - 3265.2524999999996 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 140.0 + - 470.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3291.00275 + - 3270.6689499999998 + - 3261.0730999999996 + - 3261.0730999999996 +- !!python/tuple + - !!python/tuple + - 0.0 + - 140.0 + - 170.0 + - 180.0 + - 240.0 + - 550.0 + - 650.0 + - 1000.0 + - !!python/tuple + - 3291.55245 + - 3280.3055 + - 3275.7666500000005 + - 3264.0554999999995 + - 3258.9226499999995 + - 3250.4445 + - 3248.56365 + - 3248.56365 +problem_name: DUALSOURCING-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.29 + - 0.59 + - 0.94 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8474284407009437 + - 0.6248026406984224 + - 0.3282695153272463 + - 0.23211031610169966 + - 0.10366589619998447 + - 0.10366589619998447 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.11 + - 0.21 + - 0.24 + - 0.25 + - 0.37 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7185084426392913 + - 0.6208064318001868 + - 0.36033610528532617 + - 0.31559569545416366 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.05 + - 0.23 + - 0.33 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7763666955544823 + - 0.4857580118578982 + - 0.05144358256860701 + - 0.05144358256860701 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.07 + - 0.24 + - 1.0 + - !!python/tuple + - 1.0 + - 0.02497010732063266 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.05 + - 0.15 + - 0.33 + - 0.6 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6357781281378824 + - 0.6326372837499882 + - 0.4991857696195694 + - 0.3538267700917577 + - 0.3538267700917577 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.12 + - 0.25 + - 0.52 + - 1.0 + - !!python/tuple + - 1.0 + - 1.024936298446708 + - 0.7559303582275593 + - 0.28610421472689174 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.14 + - 0.15 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7425307745274901 + - 0.49991378737147874 + - 0.37660493541941703 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.22 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4479563099191746 + - 0.4072188707610573 + - 0.4072188707610573 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.14 + - 0.47 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9876101746679116 + - 0.5293015875520134 + - 0.3130183322983918 + - 0.3130183322983918 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.14 + - 0.17 + - 0.18 + - 0.24 + - 0.55 + - 0.65 + - 1.0 + - !!python/tuple + - 1.0 + - 0.746502190251544 + - 0.6441999186333166 + - 0.38023938936664137 + - 0.2645488036729795 + - 0.07345766734546863 + - 0.031064720327354595 + - 0.031064720327354595 +solver_name: RNDSRCH diff --git a/test/expected_results/DYNAMNEWS1_ADAM.yaml b/test/expected_results/DYNAMNEWS1_ADAM.yaml new file mode 100644 index 000000000..514c62f37 --- /dev/null +++ b/test/expected_results/DYNAMNEWS1_ADAM.yaml @@ -0,0 +1,579 @@ +all_est_objectives: +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +- - 120.0 + - 144.99999995 + - 144.99999995 +all_intermediate_budgets: +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - !!python/tuple + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 + - 2.500000001 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 144.99999995 + - 144.99999995 +problem_name: DYNAMNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +solver_name: ADAM diff --git a/test/expected_results/DYNAMNEWS1_ALOE.yaml b/test/expected_results/DYNAMNEWS1_ALOE.yaml new file mode 100644 index 000000000..6f78403a7 --- /dev/null +++ b/test/expected_results/DYNAMNEWS1_ALOE.yaml @@ -0,0 +1,579 @@ +all_est_objectives: +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +- - 120.0 + - 145.0 + - 145.0 +all_intermediate_budgets: +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +- - 0 + - 660 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - !!python/tuple + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 + - 2.5 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 145.0 + - 145.0 +problem_name: DYNAMNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +solver_name: ALOE diff --git a/test/expected_results/DYNAMNEWS1_ASTRODF.yaml b/test/expected_results/DYNAMNEWS1_ASTRODF.yaml new file mode 100644 index 000000000..0137f878c --- /dev/null +++ b/test/expected_results/DYNAMNEWS1_ASTRODF.yaml @@ -0,0 +1,919 @@ +all_est_objectives: +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +all_intermediate_budgets: +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +- - 5 + - 110 + - 310 + - 753 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - 2.601892829446503 + - !!python/tuple + - 3.522026124322272 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - 2.17635391193111 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 + - !!python/tuple + - 3.3665155108248026 + - 2.0208432984336406 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.0208432984336477 + - 2.020843298433655 + - 2.0208432984336584 + - 2.0208432984336513 + - 2.020843298433655 + - 2.0208432984336584 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +- !!python/tuple + - !!python/tuple + - 5.0 + - 110.0 + - 310.0 + - 753.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 139.90535852767488 + - 154.4539433414887 + - 162.22947401636173 + - 162.22947401636173 +problem_name: DYNAMNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.11 + - 0.31 + - 0.753 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5286382558313991 + - 0.18412568131586066 + - -0.0 + - -0.0 +solver_name: ASTRODF diff --git a/test/expected_results/DYNAMNEWS1_NELDMD.yaml b/test/expected_results/DYNAMNEWS1_NELDMD.yaml new file mode 100644 index 000000000..210506759 --- /dev/null +++ b/test/expected_results/DYNAMNEWS1_NELDMD.yaml @@ -0,0 +1,528 @@ +all_est_objectives: +- - 120.0 + - 140.32722485757927 + - 140.32722485757927 +- - 120.0 + - 137.12313884196678 + - 137.12313884196678 +- - 120.0 + - 120.0 +- - 120.0 + - 137.22984650726218 + - 137.22984650726218 +- - 120.0 + - 138.28951296145596 + - 138.28951296145596 +- - 120.0 + - 120.0 +- - 120.0 + - 132.0580866213513 + - 132.0580866213513 +- - 120.0 + - 120.0 +- - 120.0 + - 134.96429481669952 + - 134.96429481669952 +- - 120.0 + - 131.35814876846175 + - 131.35814876846175 +all_intermediate_budgets: +- - 0 + - 990 + - 1000 +- - 0 + - 690 + - 1000 +- - 0 + - 1000 +- - 0 + - 720 + - 1000 +- - 0 + - 690 + - 1000 +- - 0 + - 1000 +- - 0 + - 750 + - 1000 +- - 0 + - 1000 +- - 0 + - 690 + - 1000 +- - 0 + - 810 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.7886285505870987 + - 2.969027030589398 + - 3.6618743849995004 + - 1.3708918586738332 + - 1.8337725612056026 + - 5.153673502821542 + - 1.6739925431977747 + - 2.5108215209525153 + - 1.0000000005838672e-07 + - 2.9718729754568916 + - !!python/tuple + - 3.7886285505870987 + - 2.969027030589398 + - 3.6618743849995004 + - 1.3708918586738332 + - 1.8337725612056026 + - 5.153673502821542 + - 1.6739925431977747 + - 2.5108215209525153 + - 1.0000000005838672e-07 + - 2.9718729754568916 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.7596227692266835 + - 2.253968994068801 + - 3.7574242021156183 + - 1.8315381898254697 + - 0.8166826851810032 + - 2.962206182155146 + - 3.0720195705975404 + - 1.0000000005838672e-07 + - 4.884884709493206 + - 2.4370248289431764 + - !!python/tuple + - 2.7596227692266835 + - 2.253968994068801 + - 3.7574242021156183 + - 1.8315381898254697 + - 0.8166826851810032 + - 2.962206182155146 + - 3.0720195705975404 + - 1.0000000005838672e-07 + - 4.884884709493206 + - 2.4370248289431764 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 0.0 + - 2.520500939095589 + - 5.155234798695308 + - 4.737329032448124 + - 5.447280848946656 + - 1.216542196206054 + - 1.2877324686884104 + - 5.164962716896884 + - 0.9069141085212036 + - 0.11753358904933564 + - !!python/tuple + - 0.0 + - 2.520500939095589 + - 5.155234798695308 + - 4.737329032448124 + - 5.447280848946656 + - 1.216542196206054 + - 1.2877324686884104 + - 5.164962716896884 + - 0.9069141085212036 + - 0.11753358904933564 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 1.467057588270408 + - 1.3319794877658817 + - 4.692800272497436 + - 0.4505359468627381 + - 1.0000000000287557e-07 + - 3.319077232124695 + - 3.025676642266447 + - 1.800735400598667 + - 2.7887536521058753 + - 3.865481085216654 + - !!python/tuple + - 1.467057588270408 + - 1.3319794877658817 + - 4.692800272497436 + - 0.4505359468627381 + - 1.0000000000287557e-07 + - 3.319077232124695 + - 3.025676642266447 + - 1.800735400598667 + - 2.7887536521058753 + - 3.865481085216654 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 4.053782719829774 + - 3.69949437820676 + - 2.698288209269848 + - 0.3506753755802086 + - 4.696737048265247 + - 0.913611555858698 + - 3.291140292113799 + - 4.2049936289483 + - 1.0000000000287557e-07 + - 3.6796593676571114 + - !!python/tuple + - 4.053782719829774 + - 3.69949437820676 + - 2.698288209269848 + - 0.3506753755802086 + - 4.696737048265247 + - 0.913611555858698 + - 3.291140292113799 + - 4.2049936289483 + - 1.0000000000287557e-07 + - 3.6796593676571114 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.6216171987786976 + - 4.2153282206462865 + - 5.307706078205278 + - 2.5427852553364767 + - 4.731713533416263 + - 1.0000000000287557e-07 + - 4.079643938707886 + - 0.9383967989892159 + - 1.4908806665590892 + - 1.0790692460209108 + - !!python/tuple + - 2.6216171987786976 + - 4.2153282206462865 + - 5.307706078205278 + - 2.5427852553364767 + - 4.731713533416263 + - 1.0000000000287557e-07 + - 4.079643938707886 + - 0.9383967989892159 + - 1.4908806665590892 + - 1.0790692460209108 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.782046916200016 + - 1.0000000000287557e-07 + - 5.519650989287856 + - 1.0407439804824283 + - 4.357126866728563 + - 4.188607403380507 + - 0.5804720793565912 + - 0.6110250987218857 + - 6.3758161364705925 + - 1.2728806756792106 + - !!python/tuple + - 3.782046916200016 + - 1.0000000000287557e-07 + - 5.519650989287856 + - 1.0407439804824283 + - 4.357126866728563 + - 4.188607403380507 + - 0.5804720793565912 + - 0.6110250987218857 + - 6.3758161364705925 + - 1.2728806756792106 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 140.32722485757927 + - 140.32722485757927 +- !!python/tuple + - !!python/tuple + - 0.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 137.12313884196678 + - 137.12313884196678 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 120.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 720.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 137.22984650726218 + - 137.22984650726218 +- !!python/tuple + - !!python/tuple + - 0.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 138.28951296145596 + - 138.28951296145596 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 120.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 750.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 132.0580866213513 + - 132.0580866213513 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 120.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 134.96429481669952 + - 134.96429481669952 +- !!python/tuple + - !!python/tuple + - 0.0 + - 810.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 131.35814876846175 + - 131.35814876846175 +problem_name: DYNAMNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1576253540786609 + - 0.1576253540786609 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.72 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1523758590766112 + - 0.1523758590766112 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.10024545457633019 + - 0.10024545457633019 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.75 + - 1.0 + - !!python/tuple + - 1.0 + - 0.40680113956356023 + - 0.40680113956356023 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.26382991669815214 + - 0.26382991669815214 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.81 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4412346570650192 + - 0.4412346570650192 +solver_name: NELDMD diff --git a/test/expected_results/DYNAMNEWS1_RNDSRCH.yaml b/test/expected_results/DYNAMNEWS1_RNDSRCH.yaml new file mode 100644 index 000000000..42d81087b --- /dev/null +++ b/test/expected_results/DYNAMNEWS1_RNDSRCH.yaml @@ -0,0 +1,596 @@ +all_est_objectives: +- - 120.0 + - 132.97336658427028 + - 146.88837878936502 + - 146.88837878936502 +- - 120.0 + - 122.81327077773409 + - 122.81327077773409 +- - 120.0 + - 132.56550638089544 + - 135.2840984470892 + - 145.90403108532502 + - 145.90403108532502 +- - 120.0 + - 124.33123266578104 + - 124.33123266578104 +- - 120.0 + - 131.8208805701563 + - 131.8208805701563 +- - 120.0 + - 150.86918328674278 + - 150.86918328674278 +- - 120.0 + - 120.0 +- - 120.0 + - 120.99177821685791 + - 120.99177821685791 +- - 120.0 + - 138.44031632495714 + - 138.44031632495714 +- - 120.0 + - 120.0 +all_intermediate_budgets: +- - 0 + - 320 + - 610 + - 1000 +- - 0 + - 390 + - 1000 +- - 0 + - 100 + - 300 + - 740 + - 1000 +- - 0 + - 310 + - 1000 +- - 0 + - 340 + - 1000 +- - 0 + - 340 + - 1000 +- - 0 + - 1000 +- - 0 + - 160 + - 1000 +- - 0 + - 680 + - 1000 +- - 0 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 0.2567518673381741 + - 3.44578711006877 + - 1.448259339956088 + - 4.47075722504349 + - 7.039501835642471 + - 1.8020712455806367 + - 4.195236703988452 + - 0.7427899037721333 + - 1.596470023986363 + - 2.4077014277693576 + - !!python/tuple + - 1.2799051814294136 + - 0.4364330556192611 + - 0.709495287755276 + - 2.075954000884302 + - 0.10045085355960241 + - 4.0177294136229245 + - 1.4488345108361864 + - 6.52174595895297 + - 1.3073988100371678 + - 6.724377169429895 + - !!python/tuple + - 1.2799051814294136 + - 0.4364330556192611 + - 0.709495287755276 + - 2.075954000884302 + - 0.10045085355960241 + - 4.0177294136229245 + - 1.4488345108361864 + - 6.52174595895297 + - 1.3073988100371678 + - 6.724377169429895 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 4.297877972470275 + - 0.0786263533761449 + - 2.5284771448753878 + - 7.048550594155333 + - 4.1085243212462075 + - 2.2018840019572226 + - 3.1867969927503204 + - 1.7329181126428226 + - 0.5196833769078698 + - 3.734006974071602 + - !!python/tuple + - 4.297877972470275 + - 0.0786263533761449 + - 2.5284771448753878 + - 7.048550594155333 + - 4.1085243212462075 + - 2.2018840019572226 + - 3.1867969927503204 + - 1.7329181126428226 + - 0.5196833769078698 + - 3.734006974071602 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.0006046574855616 + - 1.0335920366894322 + - 0.20491809878101677 + - 4.147547223300166 + - 2.847424785668113 + - 7.451413273786651 + - 1.7436671635794385 + - 0.909198436213954 + - 5.254270858803843 + - 1.8942621895127316 + - !!python/tuple + - 0.294442831362623 + - 1.390893563932241 + - 0.5622719663550539 + - 3.058029859343127 + - 2.289477117874483 + - 3.7969603575225346 + - 2.7863253093221374 + - 7.28117539186135 + - 3.585029529800206 + - 1.898574383208405 + - !!python/tuple + - 1.2287495391396583 + - 0.5141311038609756 + - 4.426196376012835 + - 2.108124270683585 + - 0.14025330291425042 + - 2.694491604448821 + - 2.481113070638738 + - 5.003943948731838 + - 0.8906083985340192 + - 3.531582167970271 + - !!python/tuple + - 1.2287495391396583 + - 0.5141311038609756 + - 4.426196376012835 + - 2.108124270683585 + - 0.14025330291425042 + - 2.694491604448821 + - 2.481113070638738 + - 5.003943948731838 + - 0.8906083985340192 + - 3.531582167970271 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.515721790322599 + - 3.6425285757626273 + - 0.925871474338059 + - 3.5973821436649853 + - 3.499980144667409 + - 7.090938162271664 + - 0.850270285004801 + - 2.9865966833224777 + - 1.7338202615814782 + - 1.2906439459076944 + - !!python/tuple + - 3.515721790322599 + - 3.6425285757626273 + - 0.925871474338059 + - 3.5973821436649853 + - 3.499980144667409 + - 7.090938162271664 + - 0.850270285004801 + - 2.9865966833224777 + - 1.7338202615814782 + - 1.2906439459076944 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 0.8735068891405671 + - 3.033892342599483 + - 5.21640750929079 + - 2.7564976698140415 + - 6.394155309531908 + - 1.0891515520735464 + - 2.800953828869014 + - 0.7588440011813193 + - 0.8869817607319462 + - 3.825433022736122 + - !!python/tuple + - 0.8735068891405671 + - 3.033892342599483 + - 5.21640750929079 + - 2.7564976698140415 + - 6.394155309531908 + - 1.0891515520735464 + - 2.800953828869014 + - 0.7588440011813193 + - 0.8869817607319462 + - 3.825433022736122 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 4.664814244089966 + - 8.136107314450276 + - 0.7257692448236055 + - 0.04750559336532918 + - 1.732959903417076 + - 4.233118749803095 + - 1.2697424586178807 + - 1.1772280826381039 + - 1.1240477542863072 + - 0.7148699971598014 + - !!python/tuple + - 4.664814244089966 + - 8.136107314450276 + - 0.7257692448236055 + - 0.04750559336532918 + - 1.732959903417076 + - 4.233118749803095 + - 1.2697424586178807 + - 1.1772280826381039 + - 1.1240477542863072 + - 0.7148699971598014 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 5.293138185742484 + - 1.9949781393994235 + - 0.36914406967860797 + - 7.909657884204956 + - 2.4696393179905085 + - 7.284396659851657 + - 0.3046382296282686 + - 0.6887372241488989 + - 1.0576093406376295 + - 2.429705305345986 + - !!python/tuple + - 5.293138185742484 + - 1.9949781393994235 + - 0.36914406967860797 + - 7.909657884204956 + - 2.4696393179905085 + - 7.284396659851657 + - 0.3046382296282686 + - 0.6887372241488989 + - 1.0576093406376295 + - 2.429705305345986 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.9216751381076005 + - 0.80919811695656 + - 4.270505050258955 + - 0.8015779188666974 + - 1.820579745965215 + - 1.1619459375936434 + - 5.685964394984905 + - 2.3862585882520735 + - 2.6448808634037198 + - 2.0093509806192023 + - !!python/tuple + - 2.9216751381076005 + - 0.80919811695656 + - 4.270505050258955 + - 0.8015779188666974 + - 1.820579745965215 + - 1.1619459375936434 + - 5.685964394984905 + - 2.3862585882520735 + - 2.6448808634037198 + - 2.0093509806192023 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 320.0 + - 610.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 132.97336658427028 + - 146.88837878936502 + - 146.88837878936502 +- !!python/tuple + - !!python/tuple + - 0.0 + - 390.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 122.81327077773409 + - 122.81327077773409 +- !!python/tuple + - !!python/tuple + - 0.0 + - 100.0 + - 300.0 + - 740.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 132.56550638089544 + - 135.2840984470892 + - 145.90403108532502 + - 145.90403108532502 +- !!python/tuple + - !!python/tuple + - 0.0 + - 310.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 124.33123266578104 + - 124.33123266578104 +- !!python/tuple + - !!python/tuple + - 0.0 + - 340.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 131.8208805701563 + - 131.8208805701563 +- !!python/tuple + - !!python/tuple + - 0.0 + - 340.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 150.86918328674278 + - 150.86918328674278 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 120.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 160.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 120.99177821685791 + - 120.99177821685791 +- !!python/tuple + - !!python/tuple + - 0.0 + - 680.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 138.44031632495714 + - 138.44031632495714 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 120.0 +problem_name: DYNAMNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.32 + - 0.61 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5797308123198102 + - 0.12895723415809887 + - 0.12895723415809887 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.39 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9088647486523465 + - 0.9088647486523465 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.1 + - 0.3 + - 0.74 + - 1.0 + - !!python/tuple + - 1.0 + - 0.592943348575993 + - 0.5048751920283818 + - 0.16084494867572743 + - 0.16084494867572743 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.31 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8596907269768567 + - 0.8596907269768567 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.34 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6170653282157629 + - 0.6170653282157629 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.34 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.16 + - 1.0 + - !!python/tuple + - 1.0 + - 0.967871575750958 + - 0.967871575750958 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.68 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4026302492791703 + - 0.4026302492791703 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +solver_name: RNDSRCH diff --git a/test/expected_results/DYNAMNEWS1_SPSA.yaml b/test/expected_results/DYNAMNEWS1_SPSA.yaml new file mode 100644 index 000000000..510592a29 --- /dev/null +++ b/test/expected_results/DYNAMNEWS1_SPSA.yaml @@ -0,0 +1,2194 @@ +all_est_objectives: +- - 120.0 + - 135.99999999920416 + - 136.73751735714364 + - 137.33577862489784 + - 139.3740908142008 + - 139.82140377739694 + - 140.22220147052707 + - 140.55749178531923 + - 140.86866059240373 + - 143.4864462962174 + - 143.75994707120185 + - 144.7937586235706 + - 145.02735868979542 + - 145.02735868979542 +- - 120.0 + - 123.99999999980108 + - 124.73751735770684 + - 130.12186876756576 + - 130.12186876756573 + - 131.91112062041017 + - 133.5143113929167 + - 133.87882448557522 + - 134.21411480034394 + - 134.21411480034394 + - 136.8319005041889 + - 137.10540127917338 + - 137.3638541672632 + - 137.60912043986477 + - 139.71152103575875 + - 139.71152103575875 +- - 120.0 + - 120.0 +- - 120.0 + - 123.99999999980108 + - 124.73751735770684 + - 125.33577862546575 + - 127.374090814752 + - 127.82140377797806 + - 128.22220147111503 + - 129.68025384169843 + - 130.01554415646714 + - 130.01554415646714 + - 132.6333298602965 + - 133.72733296024447 + - 133.96093302644772 + - 133.96093302644772 +- - 120.0 + - 123.99999999980108 + - 124.73751735770684 + - 125.33577862545624 + - 125.84535667276117 + - 126.29266963597975 + - 127.89586040843861 + - 128.26037350109704 + - 129.4238338138927 + - 130.51783691384068 + - 130.77628980193046 + - 131.02155607451397 + - 131.02155607451397 +- - 120.0 + - 121.0 + - 123.95006943173551 + - 126.34311450279972 + - 130.3689311718006 + - 131.97212194425262 + - 133.43017431483602 + - 134.7713355739345 + - 135.08250438101902 + - 136.2459646938251 + - 138.70747166865607 + - 139.74128322104357 + - 139.98654949364973 + - 139.98654949364973 +- - 120.0 + - 121.0 + - 123.95006943173551 + - 126.34311450274274 + - 128.38142669203737 + - 128.78222438516744 + - 130.12338564427765 + - 131.36806087265973 + - 131.64156164764927 + - 131.90001453573902 + - 132.14528080832255 + - 133.07968107315276 + - 133.07968107315276 +- - 120.0 + - 122.0 + - 123.47503471594108 + - 124.67155725150425 + - 124.92634627517351 + - 125.15000275679586 + - 125.33225930312307 + - 125.33225930312307 + - 126.73251893510196 + - 127.31424909153131 + - 127.83115486775321 + - 129.79328504866336 + - 130.26048518111037 + - 130.26048518111037 +- - 120.0 + - 121.33333333331755 + - 122.31668981060369 + - 122.51611023319447 + - 122.68596958231217 + - 123.2203665065013 + - 123.34187087072438 + - 123.4536343089917 + - 123.86852605178863 + - 123.96548107786208 + - 124.05163204056042 + - 124.13338746476622 + - 124.13338746476622 + - 124.13338746476622 +- - 120.0 + - 123.0 + - 125.2125520738236 + - 125.80896935814263 + - 125.94256858918992 + - 126.06407295341197 + - 127.06994389778856 + - 127.16689892386121 + - 127.16689892386117 + - 127.248654348067 + - 127.248654348067 +all_intermediate_budgets: +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 630 + - 690 + - 750 + - 810 + - 870 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 750 + - 810 + - 870 + - 930 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 510 + - 630 + - 690 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 570 + - 630 + - 690 + - 750 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 510 + - 570 + - 630 + - 690 + - 750 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 450 + - 510 + - 570 + - 630 + - 750 + - 870 + - 930 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.6000000000198953 + - 3.3999999999801047 + - 2.6000000000198953 + - 2.6000000000198953 + - 2.6000000000198953 + - 2.6000000000198953 + - 2.6000000000198953 + - 2.6000000000198953 + - 2.6000000000198953 + - 2.6000000000198953 + - !!python/tuple + - 2.6737517358138443 + - 3.3262482641861557 + - 2.6737517358138443 + - 2.5262482642259463 + - 2.6737517358138443 + - 2.6737517358138443 + - 2.5262482642259463 + - 2.5262482642259463 + - 2.5262482642259463 + - 2.5262482642259463 + - !!python/tuple + - 2.613925609038426 + - 3.2664221374107374 + - 2.613925609038426 + - 2.466422137450528 + - 2.613925609038426 + - 2.613925609038426 + - 2.5860743910013646 + - 2.5860743910013646 + - 2.5860743910013646 + - 2.5860743910013646 + - !!python/tuple + - 2.5120099995732796 + - 3.164506527945591 + - 2.7158412185035723 + - 2.5683377469156743 + - 2.5120099995732796 + - 2.5120099995732796 + - 2.4841587815362183 + - 2.4841587815362183 + - 2.4841587815362183 + - 2.687990000466511 + - !!python/tuple + - 2.556741295892894 + - 3.119775231625977 + - 2.671109922183958 + - 2.6130690432352885 + - 2.4672787032536654 + - 2.556741295892894 + - 2.439427485216604 + - 2.439427485216604 + - 2.5288900778558325 + - 2.6432587041468967 + - !!python/tuple + - 2.5968210652059005 + - 3.07969546231297 + - 2.6310301528709514 + - 2.653148812548295 + - 2.4271989339406588 + - 2.5166615265798873 + - 2.3993477159035974 + - 2.3993477159035974 + - 2.568969847168839 + - 2.6833384734599033 + - !!python/tuple + - 2.5632920337260447 + - 3.0461664308331144 + - 2.664559184350807 + - 2.6866778440268897 + - 2.4607279654205145 + - 2.4831324951012927 + - 2.365818684425003 + - 2.3658186844237417 + - 2.6024988786474337 + - 2.6498094419813087 + - !!python/tuple + - 2.594408914434495 + - 3.0772833115415645 + - 2.633442303642357 + - 2.6555609633184396 + - 2.4918448461289646 + - 2.4520156143928427 + - 2.396935565133453 + - 2.3347018037152916 + - 2.5713819979389836 + - 2.6186925612728587 + - !!python/tuple + - 2.5071493909740403 + - 2.99002378808111 + - 2.5461827801819026 + - 2.742820486778894 + - 2.40458532266851 + - 2.364756090932388 + - 2.4841950885939075 + - 2.247442280254837 + - 2.484122474478529 + - 2.531433037812404 + - !!python/tuple + - 2.479799313475589 + - 3.0173738655795614 + - 2.573532857680354 + - 2.7701705642773455 + - 2.3772352451700587 + - 2.3374060134339367 + - 2.456845011095456 + - 2.2200922027563856 + - 2.5114725519769805 + - 2.5040829603139527 + - !!python/tuple + - 2.4281087358571543 + - 2.965683287961127 + - 2.6252234352987887 + - 2.718479986658911 + - 2.325544667551624 + - 2.285715435815502 + - 2.4051544334770214 + - 2.2717827803748203 + - 2.563163129595415 + - 2.452392382695518 + - !!python/tuple + - 2.451468742479643 + - 2.942323281338638 + - 2.6485834419212773 + - 2.7418399932813995 + - 2.3021846609291354 + - 2.2623554291930135 + - 2.381794426854533 + - 2.295142786997309 + - 2.5398031229729265 + - 2.4290323760730295 + - !!python/tuple + - 2.451468742479643 + - 2.942323281338638 + - 2.6485834419212773 + - 2.7418399932813995 + - 2.3021846609291354 + - 2.2623554291930135 + - 2.381794426854533 + - 2.295142786997309 + - 2.5398031229729265 + - 2.4290323760730295 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.8000000000099474 + - 2.8000000000099474 + - 3.1999999999900526 + - 2.8000000000099474 + - 3.1999999999900526 + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 3.1999999999900526 + - 2.8000000000099474 + - !!python/tuple + - 2.7262482642193704 + - 2.8737517358005245 + - 3.2737517357806296 + - 2.8737517358005245 + - 3.1262482641994755 + - 2.7262482642193704 + - 2.7262482642193704 + - 2.7262482642193704 + - 3.1262482641994755 + - 2.8737517358005245 + - !!python/tuple + - 2.5467698838907404 + - 2.6942733554718945 + - 3.0942733554519997 + - 3.0532301161291544 + - 3.3057266445281055 + - 2.5467698838907404 + - 2.5467698838907404 + - 2.5467698838907404 + - 2.9467698838708456 + - 2.6942733554718945 + - !!python/tuple + - 2.5467698838915735 + - 2.6942733554727276 + - 3.0942733554528328 + - 3.0532301161299875 + - 3.3057266445272724 + - 2.5467698838899073 + - 2.5467698838899073 + - 2.5467698838899073 + - 2.9467698838716787 + - 2.6942733554710614 + - !!python/tuple + - 2.636232476533794 + - 2.6048107628305073 + - 3.0048107628106124 + - 3.142692708772208 + - 3.216264051885052 + - 2.6362324765321277 + - 2.457307291247687 + - 2.457307291247687 + - 2.8573072912294584 + - 2.604810762828841 + - !!python/tuple + - 2.5560729379084637 + - 2.524651224205177 + - 2.9246512241852822 + - 3.0625331701468776 + - 3.2964235905103823 + - 2.5560729379067975 + - 2.377147752622357 + - 2.537466829873017 + - 2.777147752604128 + - 2.6849703014541713 + - !!python/tuple + - 2.5925242471743113 + - 2.5611025334710247 + - 2.96110253345113 + - 3.0989844794127253 + - 3.2599722812445346 + - 2.51962162864095 + - 2.340696443356509 + - 2.5010155206071696 + - 2.7406964433382806 + - 2.6485189921883237 + - !!python/tuple + - 2.5589952156974376 + - 2.5946315649478984 + - 2.9946315649280035 + - 3.0654554479358516 + - 3.226443249767661 + - 2.5531506601178235 + - 2.3071674118796355 + - 2.467486489130296 + - 2.707167411861407 + - 2.6820480236651973 + - !!python/tuple + - 2.5589952156974376 + - 2.5946315649478984 + - 2.9946315649280035 + - 3.0654554479358516 + - 3.226443249767661 + - 2.5531506601178235 + - 2.3071674118796355 + - 2.467486489130296 + - 2.707167411861407 + - 2.6820480236651973 + - !!python/tuple + - 2.47173569223594 + - 2.5073720414864007 + - 2.907372041466506 + - 2.978195924474354 + - 3.3137027732291586 + - 2.465891136656326 + - 2.219907888418138 + - 2.380226965668798 + - 2.7944269353229045 + - 2.5947885002036997 + - !!python/tuple + - 2.4990857697343913 + - 2.4800219639879493 + - 2.8800219639680544 + - 2.9508458469759025 + - 3.34105285072761 + - 2.4932412141547773 + - 2.1925578109196864 + - 2.4075770431672496 + - 2.767076857824453 + - 2.5674384227052482 + - !!python/tuple + - 2.4732404809254103 + - 2.454176675178968 + - 2.8541766751590734 + - 2.9250005581669214 + - 3.366898139536591 + - 2.5190865029637584 + - 2.1667125221107053 + - 2.4334223319762307 + - 2.792922146633434 + - 2.541593133896267 + - !!python/tuple + - 2.4977671081855672 + - 2.478703302439125 + - 2.8787033024192303 + - 2.9004739309067644 + - 3.342371512276434 + - 2.5436131302239153 + - 2.1421858948505483 + - 2.4088957047160737 + - 2.768395519373277 + - 2.51706650663611 + - !!python/tuple + - 2.4276870883224353 + - 2.4086232825759932 + - 2.9487833222823623 + - 2.8303939110436325 + - 3.412451532139566 + - 2.4735331103607834 + - 2.0721058749874164 + - 2.338815684852942 + - 2.6983154995101453 + - 2.4469864867729783 + - !!python/tuple + - 2.4276870883224353 + - 2.4086232825759932 + - 2.9487833222823623 + - 2.8303939110436325 + - 3.412451532139566 + - 2.4735331103607834 + - 2.0721058749874164 + - 2.338815684852942 + - 2.6983154995101453 + - 2.4469864867729783 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 3.1999999999900526 + - 3.1999999999900526 + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 3.1999999999900526 + - !!python/tuple + - 2.8737517358005245 + - 2.7262482642193704 + - 2.8737517358005245 + - 3.1262482641994755 + - 3.1262482641994755 + - 2.7262482642193704 + - 2.7262482642193704 + - 2.8737517358005245 + - 2.7262482642193704 + - 3.2737517357806296 + - !!python/tuple + - 2.933577862576418 + - 2.666422137443477 + - 2.933577862576418 + - 3.066422137423582 + - 3.186074390975369 + - 2.666422137443477 + - 2.666422137443477 + - 2.813925609024631 + - 2.786074390995264 + - 3.213925609004736 + - !!python/tuple + - 3.0354934720407316 + - 2.5645065279791632 + - 2.8316622531121043 + - 2.9645065279592684 + - 3.2879900004396827 + - 2.5645065279791632 + - 2.5645065279791632 + - 2.9158412184889446 + - 2.68415878153095 + - 3.1120099995404225 + - !!python/tuple + - 2.9907621757181255 + - 2.519775231656557 + - 2.8763935494347104 + - 2.9197752316366623 + - 3.332721296762289 + - 2.519775231656557 + - 2.519775231656557 + - 2.9605725148115507 + - 2.639427485208344 + - 3.1567412958630285 + - !!python/tuple + - 3.0308419450318147 + - 2.5598550009702463 + - 2.836313780121021 + - 2.879695462322973 + - 3.372801066075978 + - 2.479695462342868 + - 2.5598550009702463 + - 2.9204927454978615 + - 2.599347715894655 + - 3.1166615265493394 + - !!python/tuple + - 2.957939326502642 + - 2.4869523824410735 + - 2.909216398650194 + - 2.952598080852146 + - 3.4457036846051508 + - 2.406792843813695 + - 2.4869523824410735 + - 2.8475901269686887 + - 2.526445097365482 + - 3.0437589080201666 + - !!python/tuple + - 2.924410295025768 + - 2.4534233509642 + - 2.9427454301270677 + - 2.9861271123290196 + - 3.412174653128277 + - 2.440321875290569 + - 2.4534233509642 + - 2.8811191584455624 + - 2.4929160658886085 + - 3.010229876543293 + - !!python/tuple + - 2.924410295025768 + - 2.4534233509642 + - 2.9427454301270677 + - 2.9861271123290196 + - 3.412174653128277 + - 2.440321875290569 + - 2.4534233509642 + - 2.8811191584455624 + - 2.4929160658886085 + - 3.010229876543293 + - !!python/tuple + - 2.837150771564792 + - 2.3661638275032235 + - 2.8554859066660914 + - 3.073386635789996 + - 3.3249151296673007 + - 2.3530623518295926 + - 2.3661638275032235 + - 2.793859634984586 + - 2.405656542427632 + - 3.097489400004269 + - !!python/tuple + - 2.8918509265621903 + - 2.311463672505825 + - 2.91018606166349 + - 3.1280867907873944 + - 3.2702149746699023 + - 2.298362196832194 + - 2.311463672505825 + - 2.7391594799871877 + - 2.3509563874302337 + - 3.0427892450068708 + - !!python/tuple + - 2.8684909199418684 + - 2.288103665885503 + - 2.886826055043168 + - 3.1047267841670725 + - 3.293574981290224 + - 2.275002190211872 + - 2.334823679126147 + - 2.7625194866075096 + - 2.327596380809912 + - 3.0661492516271927 + - !!python/tuple + - 2.8684909199418684 + - 2.288103665885503 + - 2.886826055043168 + - 3.1047267841670725 + - 3.293574981290224 + - 2.275002190211872 + - 2.334823679126147 + - 2.7625194866075096 + - 2.327596380809912 + - 3.0661492516271927 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.1999999999900526 + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 2.8000000000099474 + - 3.1999999999900526 + - 3.1999999999900526 + - 2.8000000000099474 + - !!python/tuple + - 3.1262482641994755 + - 2.8737517358005245 + - 2.7262482642193704 + - 2.7262482642193704 + - 2.7262482642193704 + - 2.7262482642193704 + - 2.8737517358005245 + - 3.2737517357806296 + - 3.1262482641994755 + - 2.8737517358005245 + - !!python/tuple + - 3.186074390974419 + - 2.933577862575468 + - 2.666422137444427 + - 2.666422137444427 + - 2.786074390994314 + - 2.666422137444427 + - 2.813925609025581 + - 3.333577862555573 + - 3.066422137424532 + - 2.813925609025581 + - !!python/tuple + - 3.2370321957049097 + - 2.9845356673059587 + - 2.615464332713936 + - 2.7173799421749174 + - 2.7351165862638234 + - 2.615464332713936 + - 2.8648834137560715 + - 3.2826200578250826 + - 3.0154643326940413 + - 2.7629678042950903 + - !!python/tuple + - 3.1923008993830515 + - 2.9398043709841004 + - 2.570733036392078 + - 2.672648645853059 + - 2.7798478825856816 + - 2.6601956290357944 + - 2.9096147100779297 + - 3.2378887615032244 + - 3.0601956290158996 + - 2.718236507973232 + - !!python/tuple + - 3.11214136076011 + - 2.859644832361159 + - 2.4905734977691365 + - 2.5924891072301177 + - 2.69968834396274 + - 2.580036090412853 + - 2.989774248700871 + - 3.318048300126166 + - 2.980036090392958 + - 2.7983960465961735 + - !!python/tuple + - 3.148592670025957 + - 2.823193523095312 + - 2.4541221885032893 + - 2.628940416495965 + - 2.663237034696893 + - 2.543584781147006 + - 2.953322939435024 + - 3.354499609392013 + - 2.943584781127111 + - 2.8348473558620206 + - !!python/tuple + - 3.0904196543861757 + - 2.7650205074555303 + - 2.395949172863508 + - 2.5707674008561834 + - 2.6050640190571115 + - 2.4854117655072243 + - 3.0114959550748055 + - 3.4126726250317945 + - 3.0017577967668925 + - 2.776674340222239 + - !!python/tuple + - 3.0357194993887773 + - 2.710320352458132 + - 2.4506493278609063 + - 2.516067245858785 + - 2.550363864059713 + - 2.430711610509826 + - 3.066196110072204 + - 3.467372780029193 + - 2.947057641769494 + - 2.7219741852248407 + - !!python/tuple + - 3.0615647881977583 + - 2.736165641267113 + - 2.424804039051925 + - 2.490221957049804 + - 2.524518575250732 + - 2.456556899318807 + - 3.092041398881185 + - 3.441527491220212 + - 2.921212352960513 + - 2.6961288964158596 + - !!python/tuple + - 3.037038160939408 + - 2.7606922685254633 + - 2.4493306663102756 + - 2.4656953297914534 + - 2.5490452025090824 + - 2.4810835265771574 + - 3.0675147716228346 + - 3.4170008639618614 + - 2.8966857257021625 + - 2.671602269157509 + - !!python/tuple + - 3.037038160939408 + - 2.7606922685254633 + - 2.4493306663102756 + - 2.4656953297914534 + - 2.5490452025090824 + - 2.4810835265771574 + - 3.0675147716228346 + - 3.4170008639618614 + - 2.8966857257021625 + - 2.671602269157509 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.1 + - 3.1 + - 2.9 + - 2.9 + - 3.1 + - 2.9 + - 2.9 + - 2.9 + - 2.9 + - 3.1 + - !!python/tuple + - 2.9524965284132256 + - 2.9524965284132256 + - 2.7524965284132255 + - 3.0475034715867744 + - 3.2475034715867745 + - 2.7524965284132255 + - 2.7524965284132255 + - 3.0475034715867744 + - 2.7524965284132255 + - 2.9524965284132256 + - !!python/tuple + - 3.0721487819664373 + - 2.832844274860014 + - 2.632844274860014 + - 2.9278512180335627 + - 3.127851218033563 + - 2.632844274860014 + - 2.632844274860014 + - 2.9278512180335627 + - 2.872148781966437 + - 3.0721487819664373 + - !!python/tuple + - 2.937954892999741 + - 2.96703816382671 + - 2.498650385893318 + - 3.062045107000259 + - 2.993657329066867 + - 2.498650385893318 + - 2.498650385893318 + - 2.7936573290668667 + - 2.737954892999741 + - 2.937954892999741 + - !!python/tuple + - 3.018114431622341 + - 3.04719770244931 + - 2.5788099245159177 + - 2.981885568377659 + - 2.913497790444267 + - 2.418490847270718 + - 2.418490847270718 + - 2.7134977904442668 + - 2.657795354377141 + - 2.8577953543771413 + - !!python/tuple + - 3.091017050151514 + - 2.974295083920137 + - 2.505907305986745 + - 2.908982949848486 + - 2.9864004089734397 + - 2.345588228741545 + - 2.4913934657998906 + - 2.640595171915094 + - 2.5848927358479683 + - 2.7848927358479685 + - !!python/tuple + - 3.023958987196591 + - 2.9072370209652143 + - 2.438849243031822 + - 2.841924886893563 + - 2.919342346018517 + - 2.412646291696468 + - 2.4243354028449677 + - 2.573537108960171 + - 2.651950798802891 + - 2.8519507988028914 + - !!python/tuple + - 2.992842106488141 + - 2.9383539016736644 + - 2.469966123740272 + - 2.810808006185113 + - 2.8882254653100667 + - 2.381529410988018 + - 2.455452283553418 + - 2.542420228251721 + - 2.6830676795113413 + - 2.8208339180944413 + - !!python/tuple + - 2.9346690908478377 + - 2.9965269173139677 + - 2.411793108099969 + - 2.7526349905448098 + - 2.8300524496697634 + - 2.3233563953477145 + - 2.513625299193721 + - 2.4842472126114177 + - 2.7412406951516446 + - 2.762660902454138 + - !!python/tuple + - 2.8526188583534733 + - 2.9144766848196033 + - 2.3297428756056044 + - 2.6705847580504454 + - 2.748002217175399 + - 2.405406627842079 + - 2.4315750666993567 + - 2.4021969801170533 + - 2.65919046265728 + - 2.8447111349485024 + - !!python/tuple + - 2.8009282807340945 + - 2.966167262438982 + - 2.2780522979862257 + - 2.6188941804310666 + - 2.6963116395560203 + - 2.3537160502227 + - 2.379884489079978 + - 2.453887557736432 + - 2.6074998850379014 + - 2.896401712567881 + - !!python/tuple + - 2.776401653473486 + - 2.9906938896995907 + - 2.3025789252468343 + - 2.594367553170458 + - 2.720838266816629 + - 2.3291894229620915 + - 2.3553578618193693 + - 2.4293609304758235 + - 2.582973257777293 + - 2.9209283398284898 + - !!python/tuple + - 2.776401653473486 + - 2.9906938896995907 + - 2.3025789252468343 + - 2.594367553170458 + - 2.720838266816629 + - 2.3291894229620915 + - 2.3553578618193693 + - 2.4293609304758235 + - 2.582973257777293 + - 2.9209283398284898 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.1 + - 2.9 + - 2.9 + - 3.1 + - 3.1 + - 2.9 + - 2.9 + - 2.9 + - 2.9 + - 3.1 + - !!python/tuple + - 2.9524965284132256 + - 2.7524965284132255 + - 2.7524965284132255 + - 2.9524965284132256 + - 2.9524965284132256 + - 3.0475034715867744 + - 3.0475034715867744 + - 2.7524965284132255 + - 3.0475034715867744 + - 2.9524965284132256 + - !!python/tuple + - 2.8328442748628637 + - 2.6328442748628635 + - 2.8721487819635874 + - 2.8328442748628637 + - 2.8328442748628637 + - 2.9278512180364125 + - 2.9278512180364125 + - 2.8721487819635874 + - 2.9278512180364125 + - 3.0721487819635875 + - !!python/tuple + - 2.9347598843275935 + - 2.7347598843275933 + - 2.7702331724988576 + - 2.730928665398134 + - 2.730928665398134 + - 3.0297668275011422 + - 2.8259356085716827 + - 2.7702331724988576 + - 2.8259356085716827 + - 2.9702331724988578 + - !!python/tuple + - 2.9748396536406 + - 2.6946801150145867 + - 2.730153403185851 + - 2.7710084347111406 + - 2.6908488960851273 + - 2.9896870581881356 + - 2.785855839258676 + - 2.730153403185851 + - 2.8660153778846893 + - 3.0103129418118644 + - !!python/tuple + - 2.9077815906850892 + - 2.627622052059076 + - 2.66309534023034 + - 2.8380664976666514 + - 2.757906959040638 + - 2.9226289952326248 + - 2.718797776303165 + - 2.797211466141362 + - 2.7989573149291784 + - 2.9432548788563535 + - !!python/tuple + - 2.84554782926598 + - 2.689855813478185 + - 2.725329101649449 + - 2.7758327362475423 + - 2.695673197621529 + - 2.984862756651734 + - 2.656564014884056 + - 2.7349777047222528 + - 2.7367235535100694 + - 2.8810211174372444 + - !!python/tuple + - 2.8728979067649267 + - 2.7172058909771315 + - 2.6979790241505026 + - 2.7484826587485958 + - 2.6683231201225825 + - 2.9575126791527873 + - 2.6839140923830027 + - 2.707627627223306 + - 2.7093734760111228 + - 2.908371194936191 + - !!python/tuple + - 2.8470526179559457 + - 2.7430511797861126 + - 2.7238243129594837 + - 2.7226373699396147 + - 2.6424778313136015 + - 2.931667390343806 + - 2.6580688035740216 + - 2.7334729160322873 + - 2.6835281872021417 + - 2.934216483745172 + - !!python/tuple + - 2.8225259906975952 + - 2.767577807044463 + - 2.6992976857011333 + - 2.6981107426812643 + - 2.617951204055251 + - 2.9071407630854558 + - 2.682595430832372 + - 2.708946288773937 + - 2.708054814460492 + - 2.9587431110035225 + - !!python/tuple + - 2.775805977456085 + - 2.720857793802953 + - 2.7460176989426435 + - 2.651390729439754 + - 2.571231190813741 + - 2.8604207498439456 + - 2.635875417590862 + - 2.755666302015447 + - 2.661334801218982 + - 3.0054631242450327 + - !!python/tuple + - 2.775805977456085 + - 2.720857793802953 + - 2.7460176989426435 + - 2.651390729439754 + - 2.571231190813741 + - 2.8604207498439456 + - 2.635875417590862 + - 2.755666302015447 + - 2.661334801218982 + - 3.0054631242450327 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.9 + - 2.9 + - 2.9 + - 3.1 + - 2.9 + - 2.9 + - 2.9 + - 3.1 + - 2.9 + - 3.1 + - !!python/tuple + - 2.8262482642029445 + - 2.9737517357970553 + - 2.9737517357970553 + - 3.0262482642029447 + - 2.8262482642029445 + - 2.8262482642029445 + - 2.8262482642029445 + - 3.1737517357970555 + - 2.8262482642029445 + - 3.0262482642029447 + - !!python/tuple + - 2.886074390981101 + - 2.9139256090188987 + - 2.9139256090188987 + - 2.966422137424788 + - 2.886074390981101 + - 2.766422137424788 + - 2.766422137424788 + - 3.113925609018899 + - 2.766422137424788 + - 3.0860743909811013 + - !!python/tuple + - 2.860595488614172 + - 2.8884467066519695 + - 2.8884467066519695 + - 2.9919010397917174 + - 2.9115532933480304 + - 2.791901039791717 + - 2.7409432350578586 + - 3.139404511385828 + - 2.7409432350578586 + - 3.060595488614172 + - !!python/tuple + - 2.8382298404519433 + - 2.910812354814198 + - 2.910812354814198 + - 2.969535391629489 + - 2.889187645185802 + - 2.7695353916294887 + - 2.71857758689563 + - 3.1170388632235997 + - 2.763308883220087 + - 3.0829611367764005 + - !!python/tuple + - 2.8200041858192164 + - 2.892586700181471 + - 2.892586700181471 + - 2.9877610462622157 + - 2.870961990553075 + - 2.7877610462622155 + - 2.736803241528357 + - 3.1352645178563265 + - 2.7450832285873603 + - 3.0647354821436736 + - !!python/tuple + - 2.8200041858192164 + - 2.892586700181471 + - 2.892586700181471 + - 2.9877610462622157 + - 2.870961990553075 + - 2.7877610462622155 + - 2.736803241528357 + - 3.1352645178563265 + - 2.7450832285873603 + - 3.0647354821436736 + - !!python/tuple + - 2.8666795068851796 + - 2.845911379115508 + - 2.845911379115508 + - 2.9410857251962526 + - 2.824286669487112 + - 2.7410857251962524 + - 2.690127920462394 + - 3.0885891967903634 + - 2.7917585496533235 + - 3.0180601610777105 + - !!python/tuple + - 2.8957660147066475 + - 2.874997886936976 + - 2.81682487129404 + - 2.9119992173747846 + - 2.795200161665644 + - 2.7119992173747844 + - 2.661041412640926 + - 3.1176757046118313 + - 2.7626720418318556 + - 2.9889736532562425 + - !!python/tuple + - 2.869920725895431 + - 2.8491525981257593 + - 2.7909795824828234 + - 2.886153928563816 + - 2.8210454504768605 + - 2.6861539285638156 + - 2.6868867014521425 + - 3.0918304158006147 + - 2.7368267530208867 + - 3.0148189420672113 + - !!python/tuple + - 2.820867471372677 + - 2.8000993436030055 + - 2.7419263279600696 + - 2.837100674041062 + - 2.7719921959541067 + - 2.637100674041062 + - 2.6378334469293887 + - 3.042777161277861 + - 2.7858800075436405 + - 2.9657656875444576 + - !!python/tuple + - 2.7975074647503266 + - 2.776739336980655 + - 2.718566321337719 + - 2.8604606806634125 + - 2.7486321893317562 + - 2.6604606806634123 + - 2.614473440307038 + - 3.0194171546555104 + - 2.76252000092129 + - 2.989125694166808 + - !!python/tuple + - 2.7975074647503266 + - 2.776739336980655 + - 2.718566321337719 + - 2.8604606806634125 + - 2.7486321893317562 + - 2.6604606806634123 + - 2.614473440307038 + - 3.0194171546555104 + - 2.76252000092129 + - 2.989125694166808 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 3.0666666666658773 + - 3.0666666666658773 + - 2.9333333333341227 + - 2.9333333333341227 + - 2.9333333333341227 + - 2.9333333333341227 + - 3.0666666666658773 + - 2.9333333333341227 + - 2.9333333333341227 + - 2.9333333333341227 + - !!python/tuple + - 3.0174988428015688 + - 3.115834490530186 + - 2.884165509469814 + - 2.9825011571984312 + - 2.884165509469814 + - 2.884165509469814 + - 3.0174988428015688 + - 2.884165509469814 + - 2.884165509469814 + - 2.9825011571984312 + - !!python/tuple + - 3.037440885060639 + - 3.135776532789256 + - 2.864223467210744 + - 3.0024431994575016 + - 2.864223467210744 + - 2.864223467210744 + - 2.9975568005424984 + - 2.864223467210744 + - 2.864223467210744 + - 3.0024431994575016 + - !!python/tuple + - 3.02045495014886 + - 3.118790597877477 + - 2.881209402122523 + - 3.0194291343692807 + - 2.8472375322989647 + - 2.881209402122523 + - 3.0145427354542775 + - 2.8472375322989647 + - 2.8472375322989647 + - 2.9854572645457225 + - !!python/tuple + - 2.993735103939279 + - 3.0920707516681456 + - 2.9079292483318544 + - 2.9927092881596997 + - 2.8205176860896333 + - 2.8544895559131915 + - 3.0412625816638585 + - 2.8739573785085457 + - 2.8205176860893837 + - 2.9587374183361415 + - !!python/tuple + - 3.0058855403615836 + - 3.079920315245841 + - 2.8957788119095498 + - 2.980558851737395 + - 2.8083672496673286 + - 2.842339119490887 + - 3.053413018086163 + - 2.8861078149308503 + - 2.808367249667079 + - 2.970887854758446 + - !!python/tuple + - 2.9947091965348496 + - 3.091096659072575 + - 2.8846024680828157 + - 2.969382507910661 + - 2.8195435934940627 + - 2.853515463317621 + - 3.042236674259429 + - 2.8749314711041163 + - 2.797190905840345 + - 2.98206419858518 + - !!python/tuple + - 2.9739646093950047 + - 3.07035207193273 + - 2.9053470552226606 + - 2.990127095050506 + - 2.8402881806339075 + - 2.832770876177776 + - 3.0214920871195843 + - 2.8541868839642714 + - 2.7764463187005 + - 2.9613196114453353 + - !!python/tuple + - 2.9642691067876594 + - 3.060656569325385 + - 2.8956515526153153 + - 2.999822597657851 + - 2.849983683241253 + - 2.823075373570431 + - 3.011796584512239 + - 2.844491381356926 + - 2.7861418213078455 + - 2.9710151140526806 + - !!python/tuple + - 2.9556540105178297 + - 3.052041473055555 + - 2.8870364563454856 + - 3.008437693927681 + - 2.841368586971423 + - 2.814460277300601 + - 3.0204116807820687 + - 2.853106477626756 + - 2.777526725038016 + - 2.9796302103225103 + - !!python/tuple + - 2.9474784680972417 + - 3.043865930634967 + - 2.8952119987660736 + - 3.000262151507093 + - 2.833193044550835 + - 2.822635819721189 + - 3.0122361383614806 + - 2.861282020047344 + - 2.7693511826174277 + - 2.9878057527430983 + - !!python/tuple + - 2.9474784680972417 + - 3.043865930634967 + - 2.8952119987660736 + - 3.000262151507093 + - 2.833193044550835 + - 2.822635819721189 + - 3.0122361383614806 + - 2.861282020047344 + - 2.7693511826174277 + - 2.9878057527430983 + - !!python/tuple + - 2.9474784680972417 + - 3.043865930634967 + - 2.8952119987660736 + - 3.000262151507093 + - 2.833193044550835 + - 2.822635819721189 + - 3.0122361383614806 + - 2.861282020047344 + - 2.7693511826174277 + - 2.9878057527430983 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.9 + - 3.1 + - 2.9 + - 3.1 + - 2.9 + - 2.9 + - 2.9 + - 2.9 + - 2.9 + - 2.9 + - !!python/tuple + - 2.8262482642058786 + - 3.1737517357941214 + - 2.8262482642058786 + - 3.026248264205879 + - 2.8262482642058786 + - 2.973751735794121 + - 2.8262482642058786 + - 2.8262482642058786 + - 2.8262482642058786 + - 2.8262482642058786 + - !!python/tuple + - 2.796427399989927 + - 3.1439308715781698 + - 2.8560691284218302 + - 2.996427399989927 + - 2.796427399989927 + - 2.9439308715781696 + - 2.796427399989927 + - 2.796427399989927 + - 2.8560691284218302 + - 2.8560691284218302 + - !!python/tuple + - 2.783067476885199 + - 3.1305709484734416 + - 2.8694290515265584 + - 2.983067476885199 + - 2.783067476885199 + - 2.9572907946828977 + - 2.783067476885199 + - 2.809787323094655 + - 2.842709205317102 + - 2.8694290515265584 + - !!python/tuple + - 2.795217913307398 + - 3.1184205120512423 + - 2.8815794879487577 + - 2.9709170404629996 + - 2.7709170404629995 + - 2.969441231105097 + - 2.7709170404629995 + - 2.8219377595168544 + - 2.8305587688949028 + - 2.857278615104359 + - !!python/tuple + - 2.761688881828176 + - 3.0848914805720202 + - 2.9151085194279798 + - 2.9373880089837776 + - 2.7373880089837774 + - 2.935912199625875 + - 2.7373880089837774 + - 2.7884087280376324 + - 2.864087800374125 + - 2.823749583625137 + - !!python/tuple + - 2.751993379220918 + - 3.075195977964762 + - 2.9054130168207215 + - 2.947083511591036 + - 2.7470835115910357 + - 2.9262166970186168 + - 2.7470835115910357 + - 2.7981042306448907 + - 2.8543922977668665 + - 2.8140540810178787 + - !!python/tuple + - 2.7519933792208393 + - 3.0751959779648406 + - 2.905413016820643 + - 2.9470835115909573 + - 2.7470835115911143 + - 2.926216697018538 + - 2.7470835115911143 + - 2.7981042306449693 + - 2.854392297766945 + - 2.8140540810178 + - !!python/tuple + - 2.7438178368002513 + - 3.0670204355442525 + - 2.897237474400055 + - 2.9552590540115453 + - 2.7389079691705263 + - 2.91804115459795 + - 2.7389079691705263 + - 2.8062797730655573 + - 2.862567840187533 + - 2.822229623438388 + - !!python/tuple + - 2.7438178368002513 + - 3.0670204355442525 + - 2.897237474400055 + - 2.9552590540115453 + - 2.7389079691705263 + - 2.91804115459795 + - 2.7389079691705263 + - 2.8062797730655573 + - 2.862567840187533 + - 2.822229623438388 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 135.99999999920416 + - 136.73751735714364 + - 137.33577862489784 + - 139.3740908142008 + - 139.82140377739694 + - 140.22220147052707 + - 140.55749178531923 + - 140.86866059240373 + - 143.4864462962174 + - 143.75994707120185 + - 144.7937586235706 + - 145.02735868979542 + - 145.02735868979542 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 123.99999999980108 + - 124.73751735770684 + - 130.12186876756576 + - 130.12186876756573 + - 131.91112062041017 + - 133.5143113929167 + - 133.87882448557522 + - 134.21411480034394 + - 134.21411480034394 + - 136.8319005041889 + - 137.10540127917338 + - 137.3638541672632 + - 137.60912043986477 + - 139.71152103575875 + - 139.71152103575875 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 120.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 123.99999999980108 + - 124.73751735770684 + - 125.33577862546575 + - 127.374090814752 + - 127.82140377797806 + - 128.22220147111503 + - 129.68025384169843 + - 130.01554415646714 + - 130.01554415646714 + - 132.6333298602965 + - 133.72733296024447 + - 133.96093302644772 + - 133.96093302644772 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 123.99999999980108 + - 124.73751735770684 + - 125.33577862545624 + - 125.84535667276117 + - 126.29266963597975 + - 127.89586040843861 + - 128.26037350109704 + - 129.4238338138927 + - 130.51783691384068 + - 130.77628980193046 + - 131.02155607451397 + - 131.02155607451397 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 121.0 + - 123.95006943173551 + - 126.34311450279972 + - 130.3689311718006 + - 131.97212194425262 + - 133.43017431483602 + - 134.7713355739345 + - 135.08250438101902 + - 136.2459646938251 + - 138.70747166865607 + - 139.74128322104357 + - 139.98654949364973 + - 139.98654949364973 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 510.0 + - 630.0 + - 690.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 121.0 + - 123.95006943173551 + - 126.34311450274274 + - 128.38142669203737 + - 128.78222438516744 + - 130.12338564427765 + - 131.36806087265973 + - 131.64156164764927 + - 131.90001453573902 + - 132.14528080832255 + - 133.07968107315276 + - 133.07968107315276 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 122.0 + - 123.47503471594108 + - 124.67155725150425 + - 124.92634627517351 + - 125.15000275679586 + - 125.33225930312307 + - 125.33225930312307 + - 126.73251893510196 + - 127.31424909153131 + - 127.83115486775321 + - 129.79328504866336 + - 130.26048518111037 + - 130.26048518111037 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 121.33333333331755 + - 122.31668981060369 + - 122.51611023319447 + - 122.68596958231217 + - 123.2203665065013 + - 123.34187087072438 + - 123.4536343089917 + - 123.86852605178863 + - 123.96548107786208 + - 124.05163204056042 + - 124.13338746476622 + - 124.13338746476622 + - 124.13338746476622 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 750.0 + - 870.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 123.0 + - 125.2125520738236 + - 125.80896935814263 + - 125.94256858918992 + - 126.06407295341197 + - 127.06994389778856 + - 127.16689892386121 + - 127.16689892386117 + - 127.248654348067 + - 127.248654348067 +problem_name: DYNAMNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3606996168665631 + - 0.33123117127145546 + - 0.30732688016469434 + - 0.22588351993770994 + - 0.20801056063983062 + - 0.19199617821546597 + - 0.17859922654557717 + - 0.1661660804456903 + - 0.06156911772740576 + - 0.050641045837183804 + - 0.009333788240309645 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8401749042166393 + - 0.8107064586228792 + - 0.5955678386591863 + - 0.5955678386591874 + - 0.5240760014652773 + - 0.46001847176837746 + - 0.4454538867805442 + - 0.43205693511159227 + - 0.43205693511159227 + - 0.3274599723920574 + - 0.3165319005018343 + - 0.30620508610270974 + - 0.29640515972447956 + - 0.2124010655668644 + - 0.2124010655668644 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8401749042166393 + - 0.8107064586228792 + - 0.7868021675159295 + - 0.7053588072896129 + - 0.6874858479905377 + - 0.6714714655659 + - 0.6132131256165906 + - 0.5998161739476388 + - 0.5998161739476388 + - 0.4952192112287273 + - 0.45150692366743406 + - 0.4421731354279863 + - 0.4421731354279863 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8401749042166393 + - 0.8107064586228792 + - 0.7868021675163094 + - 0.7664413274603948 + - 0.748568368161619 + - 0.6845108384666241 + - 0.6699462534787942 + - 0.6234587144933054 + - 0.5797464269320121 + - 0.5694196125328898 + - 0.5596196861553807 + - 0.5596196861553807 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9600437260521728 + - 0.8421699436726376 + - 0.7465527792436984 + - 0.5856961455533702 + - 0.5216386158586485 + - 0.4633802759093391 + - 0.4097924692325877 + - 0.3973593231326997 + - 0.35087178414679526 + - 0.25251913713596164 + - 0.21121187953833798 + - 0.20141195315992383 + - 0.20141195315992383 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.51 + - 0.63 + - 0.69 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9600437260521728 + - 0.8421699436726376 + - 0.7465527792459754 + - 0.6651094190193237 + - 0.6490950365949614 + - 0.595507229917741 + - 0.5457746455164322 + - 0.534846573626007 + - 0.5245197592268858 + - 0.5147198328493756 + - 0.4773846798908977 + - 0.4773846798908977 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9200874521043455 + - 0.8611505609116483 + - 0.8133419786959373 + - 0.8031615586673088 + - 0.7942250790173994 + - 0.7869427865235644 + - 0.7869427865235644 + - 0.7309936290701319 + - 0.7077498595761287 + - 0.687096230776192 + - 0.6086968197464462 + - 0.5900292432659325 + - 0.5900292432659325 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9467249680701941 + - 0.907433707275379 + - 0.8994656102395504 + - 0.8926786635536039 + - 0.8713261536538265 + - 0.8664712919910729 + - 0.8620056414343128 + - 0.8454281133004269 + - 0.8415541517180176 + - 0.8381118802515736 + - 0.834845238125286 + - 0.834845238125286 + - 0.834845238125286 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.75 + - 0.87 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8801311781565183 + - 0.7917258413709892 + - 0.7678952289715189 + - 0.7625571014965745 + - 0.7577022398338618 + - 0.7175113848241909 + - 0.7136374232418133 + - 0.713637423241815 + - 0.7103707811155258 + - 0.7103707811155258 +solver_name: SPSA diff --git a/test/expected_results/DYNAMNEWS1_STRONG.yaml b/test/expected_results/DYNAMNEWS1_STRONG.yaml new file mode 100644 index 000000000..6b05c36cc --- /dev/null +++ b/test/expected_results/DYNAMNEWS1_STRONG.yaml @@ -0,0 +1,579 @@ +all_est_objectives: +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- - 120.0 + - 151.62277660168382 + - 151.62277660168382 +all_intermediate_budgets: +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +- - 10 + - 220 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +- - !!python/tuple + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - 3.0 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - !!python/tuple + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 + - 2.367544467966324 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +- !!python/tuple + - !!python/tuple + - 10.0 + - 220.0 + - 1000.0 + - !!python/tuple + - 120.0 + - 151.62277660168382 + - 151.62277660168382 +problem_name: DYNAMNEWS-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.22 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +solver_name: STRONG diff --git a/test/expected_results/EXAMPLE1_ADAM.yaml b/test/expected_results/EXAMPLE1_ADAM.yaml new file mode 100644 index 000000000..1f5daffac --- /dev/null +++ b/test/expected_results/EXAMPLE1_ADAM.yaml @@ -0,0 +1,789 @@ +all_est_objectives: +- - 7.903551197790307 + - 4.403551205290308 + - 1.9385528592614014 + - 0.48023513138392304 + - -0.07596958889124633 + - -0.09019097673721527 + - -0.09567648872865574 + - -0.09567648872865574 +- - 8.119582533677294 + - 4.6195825411772935 + - 2.154584195148387 + - 0.6962664672709087 + - 0.14006174699573942 + - 0.12584035914977051 + - 0.12035484715833006 + - 0.12035484715833006 +- - 7.976856896022382 + - 4.476856903522382 + - 2.011858557493474 + - 0.5535408296159963 + - -0.0026638906591731084 + - -0.016885278505141953 + - -0.022370790496582443 + - -0.022370790496582443 +- - 8.180131279954653 + - 4.680131287454653 + - 2.215132941425747 + - 0.7568152135482683 + - 0.20061049327309885 + - 0.18638910542712991 + - 0.1809035934356895 + - 0.1809035934356895 +- - 7.8782672205408835 + - 4.378267228040881 + - 1.9132688820119745 + - 0.45495115413449616 + - -0.1012535661406732 + - -0.11547495398664209 + - -0.12096046597808256 + - -0.12096046597808256 +- - 8.017782437920566 + - 4.517782445420563 + - 2.052784099391656 + - 0.594466371514178 + - 0.03826165123900876 + - 0.024040263393039867 + - 0.018554751401599397 + - 0.018554751401599397 +- - 7.9194888015218154 + - 4.419488809021813 + - 1.954490462992906 + - 0.4961727351154277 + - -0.06003198515974163 + - -0.07425337300571057 + - -0.079738884997151 + - -0.079738884997151 +- - 7.975335312885124 + - 4.475335320385124 + - 2.010336974356217 + - 0.552019246478739 + - -0.004185473796430293 + - -0.018406861642399165 + - -0.023892373633839635 + - -0.023892373633839635 +- - 8.016362370710029 + - 4.516362378210028 + - 2.05136403218112 + - 0.5930463043036418 + - 0.036841584028472416 + - 0.02262019618250352 + - 0.01713468419106306 + - 0.01713468419106306 +- - 7.955360178855756 + - 4.455360186355754 + - 1.9903618403268473 + - 0.5320441124493689 + - -0.024160607825800505 + - -0.03838199567176938 + - -0.04386750766320986 + - -0.04386750766320986 +all_intermediate_budgets: +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 480 + - 840 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.50000000125 + - 1.50000000125 + - !!python/tuple + - 1.0087124618718393 + - 1.0087124618718393 + - !!python/tuple + - 0.5369748288298137 + - 0.5369748288298137 + - !!python/tuple + - 0.10119094158679942 + - 0.10119094158679942 + - !!python/tuple + - -0.05593668506658764 + - -0.05593668506658764 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 + - !!python/tuple + - -0.01965087124069538 + - -0.01965087124069538 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.403551205290308 + - 1.9385528592614014 + - 0.48023513138392304 + - -0.07596958889124633 + - -0.09019097673721527 + - -0.09567648872865574 + - -0.09567648872865574 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.6195825411772935 + - 2.154584195148387 + - 0.6962664672709087 + - 0.14006174699573942 + - 0.12584035914977051 + - 0.12035484715833006 + - 0.12035484715833006 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.476856903522382 + - 2.011858557493474 + - 0.5535408296159963 + - -0.0026638906591731084 + - -0.016885278505141953 + - -0.022370790496582443 + - -0.022370790496582443 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.680131287454653 + - 2.215132941425747 + - 0.7568152135482683 + - 0.20061049327309885 + - 0.18638910542712991 + - 0.1809035934356895 + - 0.1809035934356895 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.378267228040881 + - 1.9132688820119745 + - 0.45495115413449616 + - -0.1012535661406732 + - -0.11547495398664209 + - -0.12096046597808256 + - -0.12096046597808256 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.517782445420563 + - 2.052784099391656 + - 0.594466371514178 + - 0.03826165123900876 + - 0.024040263393039867 + - 0.018554751401599397 + - 0.018554751401599397 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.419488809021813 + - 1.954490462992906 + - 0.4961727351154277 + - -0.06003198515974163 + - -0.07425337300571057 + - -0.079738884997151 + - -0.079738884997151 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.475335320385124 + - 2.010336974356217 + - 0.552019246478739 + - -0.004185473796430293 + - -0.018406861642399165 + - -0.023892373633839635 + - -0.023892373633839635 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.516362378210028 + - 2.05136403218112 + - 0.5930463043036418 + - 0.036841584028472416 + - 0.02262019618250352 + - 0.01713468419106306 + - 0.01713468419106306 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 480.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 4.455360186355754 + - 1.9903618403268473 + - 0.5320441124493689 + - -0.024160607825800505 + - -0.03838199567176938 + - -0.04386750766320986 + - -0.04386750766320986 +problem_name: EXAMPLE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5571610906400483 + - 0.24527618164900183 + - 0.06076194350688691 + - -0.009612082846061158 + - -0.01141144967371516 + - -0.012105506288793979 + - -0.012105506288793979 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5844945424619817 + - 0.27260963347093525 + - 0.08809539532882035 + - 0.01772136897587229 + - 0.01592200214821829 + - 0.015227945533139475 + - 0.015227945533139475 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5664361236470552 + - 0.2545512146560086 + - 0.07003697651389372 + - -0.0003370498390543589 + - -0.00213641666670835 + - -0.002830473281787169 + - -0.002830473281787169 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5921554969825633 + - 0.2802705879915169 + - 0.09575634984940193 + - 0.025382323496453845 + - 0.023582956668799844 + - 0.022888900053721035 + - 0.022888900053721035 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5539620252305024 + - 0.24207711623945583 + - 0.05756287809734091 + - -0.012811148255607164 + - -0.014610515083261161 + - -0.015304571698339977 + - -0.015304571698339977 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5716142443264813 + - 0.2597293353354348 + - 0.07521509719331992 + - 0.004841070840371862 + - 0.003041704012717865 + - 0.0023476473976390484 + - 0.0023476473976390484 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5591776023741611 + - 0.24729269338311455 + - 0.06277845524099962 + - -0.007595571111948451 + - -0.009394937939602454 + - -0.010088994554681265 + - -0.010088994554681265 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5662436047274988 + - 0.2543586957364522 + - 0.06984445759433731 + - -0.0005295687586107466 + - -0.002328935586264741 + - -0.003022992201343558 + - -0.003022992201343558 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5714345697504588 + - 0.25954966075941216 + - 0.07503542261729727 + - 0.004661396264349204 + - 0.002862029436695207 + - 0.002167972821616391 + - 0.002167972821616391 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.48 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5637162428455443 + - 0.25183133385449785 + - 0.06731709571238294 + - -0.0030569306405651402 + - -0.004856297468219135 + - -0.005550354083297953 + - -0.005550354083297953 +solver_name: ADAM diff --git a/test/expected_results/EXAMPLE1_ALOE.yaml b/test/expected_results/EXAMPLE1_ALOE.yaml new file mode 100644 index 000000000..c5e89b1a0 --- /dev/null +++ b/test/expected_results/EXAMPLE1_ALOE.yaml @@ -0,0 +1,519 @@ +all_est_objectives: +- - 7.903551197790307 + - 2.7835511977903082 + - 0.9403511977903071 + - 0.9403511977903023 + - 0.9403511977903023 +- - 8.119582533677294 + - 2.999582533677294 + - 1.1563825336772928 + - 1.1563825336772882 + - 1.1563825336772882 +- - 7.976856896022382 + - 2.8568568960223812 + - 1.0136568960223804 + - 1.0136568960223755 + - 1.0136568960223755 +- - 8.180131279954653 + - 3.0601312799546543 + - 1.2169312799546521 + - 1.2169312799546477 + - 1.2169312799546477 +- - 7.8782672205408835 + - 2.7582672205408816 + - 0.9150672205408802 + - 0.9150672205408756 + - 0.9150672205408756 +- - 8.017782437920566 + - 2.897782437920564 + - 1.0545824379205622 + - 1.0545824379205575 + - 1.0545824379205575 +- - 7.9194888015218154 + - 2.7994888015218122 + - 0.9562888015218118 + - 0.9562888015218072 + - 0.9562888015218072 +- - 7.975335312885124 + - 2.8553353128851247 + - 1.012135312885123 + - 1.0121353128851185 + - 1.0121353128851185 +- - 8.016362370710029 + - 2.896362370710028 + - 1.0531623707100257 + - 1.0531623707100213 + - 1.0531623707100213 +- - 7.955360178855756 + - 2.835360178855754 + - 0.992160178855753 + - 0.9921601788557481 + - 0.9921601788557481 +all_intermediate_budgets: +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +- - 0 + - 90 + - 150 + - 180 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.2000000000000002 + - -1.2000000000000002 + - !!python/tuple + - 0.7199999999999998 + - 0.7199999999999998 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 + - !!python/tuple + - -0.7199999999999982 + - -0.7199999999999982 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.7835511977903082 + - 0.9403511977903071 + - 0.9403511977903023 + - 0.9403511977903023 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.999582533677294 + - 1.1563825336772928 + - 1.1563825336772882 + - 1.1563825336772882 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.8568568960223812 + - 1.0136568960223804 + - 1.0136568960223755 + - 1.0136568960223755 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 3.0601312799546543 + - 1.2169312799546521 + - 1.2169312799546477 + - 1.2169312799546477 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.7582672205408816 + - 0.9150672205408802 + - 0.9150672205408756 + - 0.9150672205408756 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.897782437920564 + - 1.0545824379205622 + - 1.0545824379205575 + - 1.0545824379205575 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.7994888015218122 + - 0.9562888015218118 + - 0.9562888015218072 + - 0.9562888015218072 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.8553353128851247 + - 1.012135312885123 + - 1.0121353128851185 + - 1.0121353128851185 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.896362370710028 + - 1.0531623707100257 + - 1.0531623707100213 + - 1.0531623707100213 +- !!python/tuple + - !!python/tuple + - 0.0 + - 90.0 + - 150.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.835360178855754 + - 0.992160178855753 + - 0.9921601788557481 + - 0.9921601788557481 +problem_name: EXAMPLE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3521899369195634 + - 0.11897831421060606 + - 0.11897831421060547 + - 0.11897831421060547 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3795233887414969 + - 0.1463117660325395 + - 0.14631176603253893 + - 0.14631176603253893 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3614649699265702 + - 0.1282533472176129 + - 0.12825334721761225 + - 0.12825334721761225 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.38718434326207857 + - 0.15397272055312106 + - 0.1539727205531205 + - 0.1539727205531205 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.34899087151001745 + - 0.11577924880106005 + - 0.11577924880105948 + - 0.11577924880105948 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.36664309060599654 + - 0.13343146789703908 + - 0.1334314678970385 + - 0.1334314678970385 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.35420644865367606 + - 0.12099482594471878 + - 0.12099482594471819 + - 0.12099482594471819 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3612724510070139 + - 0.12806082829805646 + - 0.1280608282980559 + - 0.1280608282980559 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3664634160299739 + - 0.13325179332101642 + - 0.13325179332101586 + - 0.13325179332101586 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.09 + - 0.15 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3587450891250594 + - 0.1255334664161021 + - 0.12553346641610147 + - 0.12553346641610147 +solver_name: ALOE diff --git a/test/expected_results/EXAMPLE1_ASTRODF.yaml b/test/expected_results/EXAMPLE1_ASTRODF.yaml new file mode 100644 index 000000000..6269a152c --- /dev/null +++ b/test/expected_results/EXAMPLE1_ASTRODF.yaml @@ -0,0 +1,429 @@ +all_est_objectives: +- - 7.903551197790307 + - 0.015007377791990031 + - -0.09644880220969246 + - -0.09644880220969246 +- - 8.119582533677294 + - 0.23103871367897583 + - 0.11958253367729331 + - 0.11958253367729331 +- - 7.976856896022382 + - 0.08831307602406331 + - -0.023143103977619206 + - -0.023143103977619206 +- - 8.180131279954653 + - 0.2915874599563352 + - 0.18013127995465272 + - 0.18013127995465272 +- - 7.8782672205408835 + - -0.010276599457436787 + - -0.12173277945911931 + - -0.12173277945911931 +- - 8.017782437920566 + - 0.12923861792224517 + - 0.017782437920562676 + - 0.017782437920562676 +- - 7.9194888015218154 + - 0.030944981523494786 + - -0.08051119847818775 + - -0.08051119847818775 +- - 7.975335312885124 + - 0.08679149288680611 + - -0.02466468711487639 + - -0.02466468711487639 +- - 8.016362370710029 + - 0.1278185507117088 + - 0.016362370710026303 + - 0.016362370710026303 +- - 7.955360178855756 + - 0.0668163588574359 + - -0.044639821144246604 + - -0.044639821144246604 +all_intermediate_budgets: +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +- - 5 + - 10 + - 15 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.2360679774997898 + - -0.2360679774997898 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 + - !!python/tuple + - 2.220446049250313e-16 + - 2.220446049250313e-16 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.015007377791990031 + - -0.09644880220969246 + - -0.09644880220969246 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.23103871367897583 + - 0.11958253367729331 + - 0.11958253367729331 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.08831307602406331 + - -0.023143103977619206 + - -0.023143103977619206 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.2915874599563352 + - 0.18013127995465272 + - 0.18013127995465272 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - -0.010276599457436787 + - -0.12173277945911931 + - -0.12173277945911931 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.12923861792224517 + - 0.017782437920562676 + - 0.017782437920562676 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.030944981523494786 + - -0.08051119847818775 + - -0.08051119847818775 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.08679149288680611 + - -0.02466468711487639 + - -0.02466468711487639 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.1278185507117088 + - 0.016362370710026303 + - 0.016362370710026303 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 15.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.0668163588574359 + - -0.044639821144246604 + - -0.044639821144246604 +problem_name: EXAMPLE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.001898814522285353 + - -0.012203223563182312 + - -0.012203223563182312 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.029232266344218806 + - 0.015130228258751138 + - 0.015130228258751138 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.01117384752929216 + - -0.0029281905561755086 + - -0.0029281905561755086 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.03689322086480036 + - 0.022791182779332692 + - 0.022791182779332692 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0013002508872606458 + - -0.015402288972728315 + - -0.015402288972728315 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.01635196820871838 + - 0.002249930123250714 + - 0.002249930123250714 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.003915326256398068 + - -0.010186711829069602 + - -0.010186711829069602 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.01098132860973577 + - -0.0031207094757318963 + - -0.0031207094757318963 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.01617229363269572 + - 0.002070255547228053 + - 0.002070255547228053 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.015 + - 1.0 + - !!python/tuple + - 1.0 + - 0.008453966727781377 + - -0.0056480713576862905 + - -0.0056480713576862905 +solver_name: ASTRODF diff --git a/test/expected_results/EXAMPLE1_NELDMD.yaml b/test/expected_results/EXAMPLE1_NELDMD.yaml new file mode 100644 index 000000000..6ecee206d --- /dev/null +++ b/test/expected_results/EXAMPLE1_NELDMD.yaml @@ -0,0 +1,672 @@ +all_est_objectives: +- - 7.903551197790307 + - -0.09644640016839132 + - -0.09644872973314587 + - -0.09644872973314587 +- - 8.119582533677294 + - 0.1281654633078836 + - 0.12025060930535407 + - 0.12008788006149328 + - 0.12008788006149328 +- - 7.976856896022382 + - 0.17649037776246415 + - -0.00042200281393437676 + - -0.0036577734555506146 + - -0.007089395388055545 + - -0.014375996139893883 + - -0.021509004618859143 + - -0.02181566665576085 + - -0.02181566665576085 +- - 8.180131279954653 + - 0.4317025308079476 + - 0.2221758645318664 + - 0.21968882115330066 + - 0.18016845313865582 + - 0.18016845313865582 +- - 7.8782672205408835 + - 0.09996794664289788 + - -0.12164707396166655 + - -0.12166688688916778 + - -0.12173186281060193 + - -0.12173186281060193 +- - 8.017782437920566 + - 0.026277063986824455 + - 0.025578135249436026 + - 0.017787448130174837 + - 0.017787448130174837 +- - 7.9194888015218154 + - -0.01268664918269342 + - -0.021460129890490506 + - -0.07904682432625551 + - -0.0804578363872733 + - -0.0804578363872733 +- - 7.975335312885124 + - 0.006587093018437868 + - -0.013208990657627501 + - -0.01895665616941808 + - -0.02187880112391326 + - -0.02225170168330721 + - -0.024649258172348403 + - -0.024663807153444614 + - -0.024663807153444614 +- - 8.016362370710029 + - 0.4374158780453417 + - 0.17607050541048072 + - 0.01638376652204602 + - 0.016366979257347612 + - 0.01636264215738756 + - 0.01636264215738756 +- - 7.955360178855756 + - 0.1258871364852736 + - 0.026832413823649873 + - -0.019066933819951268 + - -0.04379178908965226 + - -0.04420582862951392 + - -0.04447417090342632 + - -0.04458851993118425 + - -0.04459024978361607 + - -0.04459024978361607 +all_intermediate_budgets: +- - 0 + - 750 + - 870 + - 1000 +- - 0 + - 330 + - 420 + - 630 + - 1000 +- - 0 + - 150 + - 450 + - 510 + - 570 + - 690 + - 780 + - 900 + - 1000 +- - 0 + - 360 + - 480 + - 540 + - 990 + - 1000 +- - 0 + - 300 + - 660 + - 720 + - 840 + - 1000 +- - 0 + - 420 + - 480 + - 780 + - 1000 +- - 0 + - 390 + - 450 + - 690 + - 990 + - 1000 +- - 0 + - 300 + - 360 + - 420 + - 480 + - 540 + - 720 + - 960 + - 1000 +- - 0 + - 210 + - 270 + - 690 + - 870 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 390 + - 600 + - 660 + - 780 + - 840 + - 960 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.0014398540752762535 + - 0.0005734645090496762 + - !!python/tuple + - -0.00021385740037272415 + - -0.00016352846523962278 + - !!python/tuple + - -0.00021385740037272415 + - -0.00016352846523962278 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.04681352257059446 + - 0.07994638037536622 + - !!python/tuple + - 0.0028822671214648876 + - -0.025685952664857542 + - !!python/tuple + - -0.0027133110436036584 + - 0.022315562448226394 + - !!python/tuple + - -0.0027133110436036584 + - 0.022315562448226394 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.3971677215134686 + - 0.20467360046640914 + - !!python/tuple + - 0.03775908935387706 + - -0.14592927168615205 + - !!python/tuple + - 0.11745703115324767 + - -0.07542662894981855 + - !!python/tuple + - 0.11813960365317994 + - -0.04579020242620924 + - !!python/tuple + - 0.0589633982410927 + - -0.07273531127030121 + - !!python/tuple + - 0.0011523378288700037 + - -0.04040756706717455 + - !!python/tuple + - -0.01916166482584898 + - 0.030988190056216586 + - !!python/tuple + - -0.01916166482584898 + - 0.030988190056216586 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.4932156251752103 + - -0.09115699609092759 + - !!python/tuple + - 0.08508304143318501 + - -0.18656221653296418 + - !!python/tuple + - -0.15619641530331513 + - 0.12312684940760182 + - !!python/tuple + - 0.000961375687680086 + - -0.006020709326165982 + - !!python/tuple + - 0.000961375687680086 + - -0.006020709326165982 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.3155053294698369 + - 0.34950981842882023 + - !!python/tuple + - -0.003012827027926889 + - 0.008753763233749403 + - !!python/tuple + - -0.004720779940186026 + - -0.006603545010664186 + - !!python/tuple + - 0.0009554736765976964 + - 6.0980084530875764e-05 + - !!python/tuple + - 0.0009554736765976964 + - 6.0980084530875764e-05 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.05214401773413912 + - 0.07599754917629645 + - !!python/tuple + - -0.05278138332560775 + - -0.07078010245195057 + - !!python/tuple + - 0.002170365484640781 + - -0.000547469885267788 + - !!python/tuple + - 0.002170365484640781 + - -0.000547469885267788 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.2508051603073924 + - 0.07015212654422909 + - !!python/tuple + - -0.16290180562181608 + - -0.1803165835769115 + - !!python/tuple + - -0.037497984421950015 + - -0.007633827102015961 + - !!python/tuple + - 0.00713614352833244 + - 0.0015612643778482455 + - !!python/tuple + - 0.00713614352833244 + - 0.0015612643778482455 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.06989569905802442 + - 0.16237725021228927 + - !!python/tuple + - -0.0939074048854224 + - -0.05135266073860476 + - !!python/tuple + - 0.02006168647731612 + - -0.07283927293118866 + - !!python/tuple + - 0.016486419926985643 + - 0.05014064168869628 + - !!python/tuple + - -0.03781667584163576 + - -0.031350988179925474 + - !!python/tuple + - 0.0038044626224129074 + - -0.0009772444334303944 + - !!python/tuple + - 0.0006951032229441409 + - -0.000629915027031391 + - !!python/tuple + - 0.0006951032229441409 + - -0.000629915027031391 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5417562561029351 + - -0.35714656138432344 + - !!python/tuple + - -0.3001261559399664 + - -0.26387956575141125 + - !!python/tuple + - 0.003950211265695603 + - -0.002406583257673914 + - !!python/tuple + - 0.0006616080936530195 + - -0.0020422590559828506 + - !!python/tuple + - 0.0002358349655285437 + - 0.0004645742463202508 + - !!python/tuple + - 0.0002358349655285437 + - 0.0004645742463202508 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.41147885512005683 + - -0.034815361819281576 + - !!python/tuple + - 0.19460235279436558 + - 0.18330891755393064 + - !!python/tuple + - -0.10629725507324023 + - -0.11947292952041433 + - !!python/tuple + - 0.01179154197348162 + - 0.02662689603543736 + - !!python/tuple + - 0.017256071647067057 + - 0.011671354079281396 + - !!python/tuple + - 0.000499044782936232 + - -0.01286083959642365 + - !!python/tuple + - 0.0070257618368586225 + - -0.0013927970685335515 + - !!python/tuple + - 0.0027264465634947044 + - -0.006491367326454762 + - !!python/tuple + - 0.0027264465634947044 + - -0.006491367326454762 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 750.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - -0.09644640016839132 + - -0.09644872973314587 + - -0.09644872973314587 +- !!python/tuple + - !!python/tuple + - 0.0 + - 330.0 + - 420.0 + - 630.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.1281654633078836 + - 0.12025060930535407 + - 0.12008788006149328 + - 0.12008788006149328 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 450.0 + - 510.0 + - 570.0 + - 690.0 + - 780.0 + - 900.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.17649037776246415 + - -0.00042200281393437676 + - -0.0036577734555506146 + - -0.007089395388055545 + - -0.014375996139893883 + - -0.021509004618859143 + - -0.02181566665576085 + - -0.02181566665576085 +- !!python/tuple + - !!python/tuple + - 0.0 + - 360.0 + - 480.0 + - 540.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.4317025308079476 + - 0.2221758645318664 + - 0.21968882115330066 + - 0.18016845313865582 + - 0.18016845313865582 +- !!python/tuple + - !!python/tuple + - 0.0 + - 300.0 + - 660.0 + - 720.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.09996794664289788 + - -0.12164707396166655 + - -0.12166688688916778 + - -0.12173186281060193 + - -0.12173186281060193 +- !!python/tuple + - !!python/tuple + - 0.0 + - 420.0 + - 480.0 + - 780.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.026277063986824455 + - 0.025578135249436026 + - 0.017787448130174837 + - 0.017787448130174837 +- !!python/tuple + - !!python/tuple + - 0.0 + - 390.0 + - 450.0 + - 690.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - -0.01268664918269342 + - -0.021460129890490506 + - -0.07904682432625551 + - -0.0804578363872733 + - -0.0804578363872733 +- !!python/tuple + - !!python/tuple + - 0.0 + - 300.0 + - 360.0 + - 420.0 + - 480.0 + - 540.0 + - 720.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.006587093018437868 + - -0.013208990657627501 + - -0.01895665616941808 + - -0.02187880112391326 + - -0.02225170168330721 + - -0.024649258172348403 + - -0.024663807153444614 + - -0.024663807153444614 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 690.0 + - 870.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.4374158780453417 + - 0.17607050541048072 + - 0.01638376652204602 + - 0.016366979257347612 + - 0.01636264215738756 + - 0.01636264215738756 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 390.0 + - 600.0 + - 660.0 + - 780.0 + - 840.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.1258871364852736 + - 0.026832413823649873 + - -0.019066933819951268 + - -0.04379178908965226 + - -0.04420582862951392 + - -0.04447417090342632 + - -0.04458851993118425 + - -0.04459024978361607 + - -0.04459024978361607 +problem_name: EXAMPLE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.75 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - -0.012202919643938792 + - -0.012203214393058052 + - -0.012203214393058052 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.33 + - 0.42 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.01621618688871357 + - 0.015214756796789526 + - 0.01519416741363904 + - 0.01519416741363904 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.45 + - 0.51 + - 0.57 + - 0.69 + - 0.78 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 0.022330516162381252 + - -5.3394076077138754e-05 + - -0.0004628012603465216 + - -0.0008969886081129727 + - -0.001818928704341557 + - -0.0027214354763555756 + - -0.0027602360141426203 + - -0.0027602360141426203 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.36 + - 0.48 + - 0.54 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.05462133666302358 + - 0.02811089078463651 + - 0.0277962166190208 + - 0.022795886131417448 + - 0.022795886131417448 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.3 + - 0.66 + - 0.72 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.012648484730616682 + - -0.015391445050128467 + - -0.01539395188876409 + - -0.015402172993405294 + - -0.015402172993405294 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.42 + - 0.48 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.003324716109154965 + - 0.0032362838690267763 + - 0.0022505640420407338 + - 0.0022505640420407338 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.39 + - 0.45 + - 0.69 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0016051833998671867 + - -0.0027152515816548867 + - -0.01000143129943355 + - -0.010179960169014643 + - -0.010179960169014643 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.3 + - 0.36 + - 0.42 + - 0.48 + - 0.54 + - 0.72 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0008334345983966679 + - -0.0016712728654583147 + - -0.0023984985603329833 + - -0.002768224128165348 + - -0.0028154055217012313 + - -0.0031187573225615215 + - -0.0031205981382571644 + - -0.0031205981382571644 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.69 + - 0.87 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.055344220224401844 + - 0.022277391643860917 + - 0.0020729626609651912 + - 0.002070838645534874 + - 0.0020702898922148145 + - 0.0020702898922148145 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.39 + - 0.6 + - 0.66 + - 0.78 + - 0.84 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.01592792066944153 + - 0.003394981971034962 + - -0.002412451484502567 + - -0.005540773760268128 + - -0.005593160279884451 + - -0.005627112394218502 + - -0.005641580451031988 + - -0.0056417993213079606 + - -0.0056417993213079606 +solver_name: NELDMD diff --git a/test/expected_results/EXAMPLE1_RNDSRCH.yaml b/test/expected_results/EXAMPLE1_RNDSRCH.yaml new file mode 100644 index 000000000..9a0ad390b --- /dev/null +++ b/test/expected_results/EXAMPLE1_RNDSRCH.yaml @@ -0,0 +1,645 @@ +all_est_objectives: +- - 7.903551197790307 + - 2.0674945230792927 + - -0.04460585132793124 + - -0.04460585132793124 +- - 8.119582533677294 + - 0.4733206889584291 + - 0.1384150184350865 + - 0.13596153342590694 + - 0.13596153342590694 +- - 7.976856896022382 + - 2.7977195799324552 + - 1.616197711965944 + - 0.2536188500794632 + - -0.0069881846667191275 + - -0.007922812095533614 + - -0.013774633168158941 + - -0.013774633168158941 +- - 8.180131279954653 + - 5.715910686142866 + - 0.45926241375445015 + - 0.22120864120721806 + - 0.20483737087714946 + - 0.18330691026091478 + - 0.18330691026091478 +- - 7.8782672205408835 + - 1.6613404604934467 + - -0.06382525694293545 + - -0.07537921315219558 + - -0.11991920343370521 + - -0.11991920343370521 +- - 8.017782437920566 + - 1.4053254144378025 + - 0.45089170766524894 + - 0.4415517531995551 + - 0.3101919794296568 + - 0.28187537240154703 + - 0.06444728443760227 + - 0.02322362035096746 + - 0.0187556065440146 + - 0.0187556065440146 +- - 7.9194888015218154 + - 1.3974243151670578 + - 0.275118985483952 + - -0.053374750932244 + - -0.07152917650339355 + - -0.07152917650339355 +- - 7.975335312885124 + - 6.717882956690119 + - 0.018530523415775678 + - -0.02009445619484764 + - -0.02009445619484764 +- - 8.016362370710029 + - 0.9793113702355438 + - 0.4543138045692236 + - 0.031728028883887385 + - 0.021178386775928496 + - 0.021178386775928496 +- - 7.955360178855756 + - 1.1737466518038315 + - 0.4016673538428662 + - 0.04817920508632083 + - -0.02164772972651269 + - -0.02458936231620068 + - -0.02458936231620068 +all_intermediate_budgets: +- - 0 + - 20 + - 30 + - 1000 +- - 0 + - 20 + - 110 + - 200 + - 1000 +- - 0 + - 20 + - 40 + - 50 + - 230 + - 600 + - 680 + - 1000 +- - 0 + - 20 + - 30 + - 80 + - 570 + - 610 + - 1000 +- - 0 + - 20 + - 50 + - 470 + - 780 + - 1000 +- - 0 + - 20 + - 60 + - 220 + - 300 + - 410 + - 430 + - 450 + - 710 + - 1000 +- - 0 + - 20 + - 30 + - 80 + - 420 + - 1000 +- - 0 + - 20 + - 30 + - 450 + - 1000 +- - 0 + - 20 + - 80 + - 220 + - 320 + - 1000 +- - 0 + - 20 + - 30 + - 90 + - 100 + - 250 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.3868011021291062 + - 0.4906383886555158 + - !!python/tuple + - 0.2115038131722949 + - -0.08431540722394794 + - !!python/tuple + - 0.2115038131722949 + - -0.08431540722394794 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -0.21677401012418288 + - -0.5538476178659764 + - !!python/tuple + - 0.1268733620219359 + - 0.05230329594819093 + - !!python/tuple + - -0.09430454247719183 + - 0.08651966838113279 + - !!python/tuple + - -0.09430454247719183 + - 0.08651966838113279 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.0431970971246267 + - -1.316283594238273 + - !!python/tuple + - 1.0112373369677945 + - 0.7853278705520689 + - !!python/tuple + - -0.1947614760183092 + - -0.4887022831093098 + - !!python/tuple + - 0.04691925587326392 + - -0.1181249454569153 + - !!python/tuple + - 0.0677084372564724 + - 0.10313030304605894 + - !!python/tuple + - 0.00468157077450062 + - -0.09667757601710751 + - !!python/tuple + - 0.00468157077450062 + - -0.09667757601710751 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.4832334273540664 + - 1.8264167120807142 + - !!python/tuple + - 0.010656711702209958 + - 0.5282211357902044 + - !!python/tuple + - 0.18919944896434088 + - -0.0726700059457484 + - !!python/tuple + - 0.07681549011763705 + - -0.13713304270118087 + - !!python/tuple + - 0.05505079606614951 + - -0.012043261964489 + - !!python/tuple + - 0.05505079606614951 + - -0.012043261964489 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.054821564282514 + - -0.8187946674699076 + - !!python/tuple + - 0.2359883900016885 + - -0.04708505389818347 + - !!python/tuple + - -0.1721256225005614 + - -0.12933033822625684 + - !!python/tuple + - -0.041121437247691114 + - -0.011072643049349629 + - !!python/tuple + - -0.041121437247691114 + - -0.011072643049349629 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - -1.1142801791955352 + - -0.38199824445827724 + - !!python/tuple + - 0.6458443828015041 + - -0.12646858482813192 + - !!python/tuple + - 0.14117915836210068 + - -0.6354823054367144 + - !!python/tuple + - -0.04280188271227482 + - -0.5390524467483464 + - !!python/tuple + - -0.5124452038133244 + - 0.03863738564790421 + - !!python/tuple + - 0.19406244612126408 + - 0.09489264208815718 + - !!python/tuple + - 0.05574214650338574 + - 0.04831144309167226 + - !!python/tuple + - -0.012688852133630803 + - 0.02849845004527066 + - !!python/tuple + - -0.012688852133630803 + - 0.02849845004527066 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.2053569856330164 + - -0.1582720784943877 + - !!python/tuple + - 0.5537596915151108 + - 0.2213151328202144 + - !!python/tuple + - -0.06758837896000809 + - 0.15022735628207698 + - !!python/tuple + - -0.0463473586092998 + - 0.08266767400099732 + - !!python/tuple + - -0.0463473586092998 + - 0.08266767400099732 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.7961740075905845 + - 2.471569257261901 + - !!python/tuple + - 0.05212922586833122 + - -0.2011908405992196 + - !!python/tuple + - 0.04759936485487095 + - -0.048005534945896176 + - !!python/tuple + - 0.04759936485487095 + - -0.048005534945896176 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.3237604145032036 + - 0.9263520893948647 + - !!python/tuple + - -0.4958555661704936 + - 0.4382678306206567 + - !!python/tuple + - -0.04626283224666211 + - 0.11500177618792813 + - !!python/tuple + - 0.04751655305887319 + - 0.05057858490809635 + - !!python/tuple + - 0.04751655305887319 + - 0.05057858490809635 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.24343264403622777 + - -1.0766276147143958 + - !!python/tuple + - -0.19032036061515473 + - -0.6403790559679715 + - !!python/tuple + - 0.2880881151820603 + - -0.09911742592206169 + - !!python/tuple + - 0.12927626566841813 + - -0.07924480142294829 + - !!python/tuple + - -0.06306668737076235 + - -0.12677954003751724 + - !!python/tuple + - -0.06306668737076235 + - -0.12677954003751724 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.0674945230792927 + - -0.04460585132793124 + - -0.04460585132793124 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 110.0 + - 200.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.4733206889584291 + - 0.1384150184350865 + - 0.13596153342590694 + - 0.13596153342590694 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 50.0 + - 230.0 + - 600.0 + - 680.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 2.7977195799324552 + - 1.616197711965944 + - 0.2536188500794632 + - -0.0069881846667191275 + - -0.007922812095533614 + - -0.013774633168158941 + - -0.013774633168158941 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 80.0 + - 570.0 + - 610.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 5.715910686142866 + - 0.45926241375445015 + - 0.22120864120721806 + - 0.20483737087714946 + - 0.18330691026091478 + - 0.18330691026091478 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 470.0 + - 780.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 1.6613404604934467 + - -0.06382525694293545 + - -0.07537921315219558 + - -0.11991920343370521 + - -0.11991920343370521 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 60.0 + - 220.0 + - 300.0 + - 410.0 + - 430.0 + - 450.0 + - 710.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 1.4053254144378025 + - 0.45089170766524894 + - 0.4415517531995551 + - 0.3101919794296568 + - 0.28187537240154703 + - 0.06444728443760227 + - 0.02322362035096746 + - 0.0187556065440146 + - 0.0187556065440146 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 80.0 + - 420.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 1.3974243151670578 + - 0.275118985483952 + - -0.053374750932244 + - -0.07152917650339355 + - -0.07152917650339355 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 6.717882956690119 + - 0.018530523415775678 + - -0.02009445619484764 + - -0.02009445619484764 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 80.0 + - 220.0 + - 320.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.9793113702355438 + - 0.4543138045692236 + - 0.031728028883887385 + - 0.021178386775928496 + - 0.021178386775928496 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 90.0 + - 100.0 + - 250.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 1.1737466518038315 + - 0.4016673538428662 + - 0.04817920508632083 + - -0.02164772972651269 + - -0.02458936231620068 + - -0.02458936231620068 +problem_name: EXAMPLE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 1.0 + - !!python/tuple + - 1.0 + - 0.26159057762001053 + - -0.0056437733129890075 + - -0.0056437733129890075 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.11 + - 0.2 + - 1.0 + - !!python/tuple + - 1.0 + - 0.05988709089285854 + - 0.017513015981193984 + - 0.01720258780178705 + - 0.01720258780178705 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.04 + - 0.05 + - 0.23 + - 0.6 + - 0.68 + - 1.0 + - !!python/tuple + - 1.0 + - 0.35398259717918296 + - 0.20449006674592105 + - 0.03208922720085252 + - -0.0008841828808134881 + - -0.001002436992848062 + - -0.0017428410120263515 + - -0.0017428410120263515 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.08 + - 0.57 + - 0.61 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7232079027641314 + - 0.05810836195795781 + - 0.027988512463747194 + - 0.025917130888507226 + - 0.023192980683438117 + - 0.023192980683438117 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.05 + - 0.47 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2102017711934261 + - -0.008075516352798457 + - -0.009537385317788574 + - -0.015172825535340682 + - -0.015172825535340682 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.06 + - 0.22 + - 0.3 + - 0.41 + - 0.43 + - 0.45 + - 0.71 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1778093643311511 + - 0.05704925499708413 + - 0.055867513494820546 + - 0.03924716518776787 + - 0.0356643950734898 + - 0.008154218632204292 + - 0.0029383779227570984 + - 0.002373060675466787 + - 0.002373060675466787 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.08 + - 0.42 + - 1.0 + - !!python/tuple + - 1.0 + - 0.17680967456220856 + - 0.034809540496286075 + - -0.0067532618688124196 + - -0.00905025787944435 + - -0.00905025787944435 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8499828480352376 + - 0.002344581941970147 + - -0.0025424591670217427 + - -0.0025424591670217427 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.08 + - 0.22 + - 0.32 + - 1.0 + - !!python/tuple + - 1.0 + - 0.12390776572806182 + - 0.057482237186777724 + - 0.004014401639197071 + - 0.002679603920557837 + - 0.002679603920557837 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.09 + - 0.1 + - 0.25 + - 1.0 + - !!python/tuple + - 1.0 + - 0.14850876807529131 + - 0.05082112379498033 + - 0.006095893337135702 + - -0.0027389877265000845 + - -0.0031111789752276712 + - -0.0031111789752276712 +solver_name: RNDSRCH diff --git a/test/expected_results/EXAMPLE1_SPSA.yaml b/test/expected_results/EXAMPLE1_SPSA.yaml new file mode 100644 index 000000000..1d054e08c --- /dev/null +++ b/test/expected_results/EXAMPLE1_SPSA.yaml @@ -0,0 +1,1005 @@ +all_est_objectives: +- - 7.903551197790307 + - 7.903551197790307 +- - 8.119582533677294 + - 8.119582533677294 + - 7.54044728437453 + - 7.54044728437453 + - 7.167113743359139 + - 6.855393868157876 + - 6.855393868157876 + - 6.855393868157876 + - 6.6314417308437825 + - 6.6314417308437825 + - 6.6314417308437825 + - 6.454559638333733 + - 6.291888233300224 + - 6.141430638086044 + - 6.141430638086044 + - 6.141430638086044 +- - 7.976856896022382 + - 7.976856896022382 +- - 8.180131279954653 + - 8.180131279954653 + - 8.180131279954653 + - 8.180131279954653 + - 8.180131279954653 + - 7.8262826871049755 + - 7.8262826871049755 + - 7.8262826871049755 + - 7.572063578993549 + - 7.572063578993549 + - 7.572063578993549 + - 7.572063578993549 + - 7.38225136765764 + - 7.38225136765764 + - 7.38225136765764 + - 7.38225136765764 +- - 7.8782672205408835 + - 7.8782672205408835 + - 7.8782672205408835 + - 7.8782672205408835 + - 7.8782672205408835 + - 7.8782672205408835 + - 7.560841841843724 + - 7.283353893641661 + - 7.283353893641661 + - 7.283353893641661 + - 7.283353893641661 + - 7.082208999948889 + - 6.897224064458831 + - 6.726128299109339 + - 6.726128299109339 + - 6.726128299109339 +- - 8.017782437920566 + - 8.017782437920566 + - 7.4386471886178 + - 7.4386471886178 + - 7.065313647602408 + - 6.753593772401145 + - 6.48632908944113 + - 6.48632908944113 + - 6.27126296362666 + - 6.27126296362666 + - 6.090693703521139 + - 6.090693703521139 + - 6.090693703521139 + - 6.090693703521139 + - 5.949658937740341 + - 5.949658937740341 +- - 7.9194888015218154 + - 7.9194888015218154 + - 7.340353552219049 + - 7.340353552219049 + - 6.967020011203659 + - 6.967020011203659 + - 6.967020011203659 + - 6.967020011203659 + - 6.732703816936659 + - 6.732703816936659 + - 6.535972222552363 + - 6.356248214840531 + - 6.356248214840531 + - 6.356248214840531 + - 6.356248214840531 + - 6.356248214840531 +- - 7.975335312885124 + - 7.975335312885124 + - 7.396200063582359 + - 6.95887859387649 + - 6.607546096989012 + - 6.314196290309309 + - 6.314196290309309 + - 6.085242116315845 + - 6.085242116315845 + - 6.085242116315845 + - 6.085242116315845 + - 6.085242116315845 + - 5.92835013266411 + - 5.92835013266411 + - 5.790099792081516 + - 5.790099792081516 +- - 8.016362370710029 + - 8.016362370710029 +- - 7.955360178855756 + - 7.955360178855756 +all_intermediate_budgets: +- - 0 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.9262482642039207 + - 1.9262482642039207 + - !!python/tuple + - 1.9262482642039207 + - 1.9262482642039207 + - !!python/tuple + - 1.8771695727453401 + - 1.8771695727453401 + - !!python/tuple + - 1.8351854585409866 + - 1.8351854585409866 + - !!python/tuple + - 1.8351854585409866 + - 1.8351854585409866 + - !!python/tuple + - 1.8351854585409866 + - 1.8351854585409866 + - !!python/tuple + - 1.8044194630360328 + - 1.8044194630360328 + - !!python/tuple + - 1.8044194630360328 + - 1.8044194630360328 + - !!python/tuple + - 1.8044194630360328 + - 1.8044194630360328 + - !!python/tuple + - 1.7797439569579159 + - 1.7797439569579159 + - !!python/tuple + - 1.756744958669717 + - 1.756744958669717 + - !!python/tuple + - 1.7352014442722137 + - 1.7352014442722137 + - !!python/tuple + - 1.7352014442722137 + - 1.7352014442722137 + - !!python/tuple + - 1.7352014442722137 + - 1.7352014442722137 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.9552687036760859 + - 1.9552687036760859 + - !!python/tuple + - 1.9552687036760859 + - 1.9552687036760859 + - !!python/tuple + - 1.9552687036760859 + - 1.9552687036760859 + - !!python/tuple + - 1.922489570717992 + - 1.922489570717992 + - !!python/tuple + - 1.922489570717992 + - 1.922489570717992 + - !!python/tuple + - 1.922489570717992 + - 1.922489570717992 + - !!python/tuple + - 1.922489570717992 + - 1.922489570717992 + - !!python/tuple + - 1.8976459216227595 + - 1.8976459216227595 + - !!python/tuple + - 1.8976459216227595 + - 1.8976459216227595 + - !!python/tuple + - 1.8976459216227595 + - 1.8976459216227595 + - !!python/tuple + - 1.8976459216227595 + - 1.8976459216227595 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.959920230685785 + - 1.959920230685785 + - !!python/tuple + - 1.92419940145256 + - 1.92419940145256 + - !!python/tuple + - 1.92419940145256 + - 1.92419940145256 + - !!python/tuple + - 1.92419940145256 + - 1.92419940145256 + - !!python/tuple + - 1.92419940145256 + - 1.92419940145256 + - !!python/tuple + - 1.897885900075135 + - 1.897885900075135 + - !!python/tuple + - 1.8733601954666845 + - 1.8733601954666845 + - !!python/tuple + - 1.8503865918462092 + - 1.8503865918462092 + - !!python/tuple + - 1.8503865918462092 + - 1.8503865918462092 + - !!python/tuple + - 1.8503865918462092 + - 1.8503865918462092 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.9262482642039207 + - 1.9262482642039207 + - !!python/tuple + - 1.9262482642039207 + - 1.9262482642039207 + - !!python/tuple + - 1.8771695727453401 + - 1.8771695727453401 + - !!python/tuple + - 1.8351854585409866 + - 1.8351854585409866 + - !!python/tuple + - 1.7984085536274244 + - 1.7984085536274244 + - !!python/tuple + - 1.7984085536274244 + - 1.7984085536274244 + - !!python/tuple + - 1.768259105123751 + - 1.768259105123751 + - !!python/tuple + - 1.768259105123751 + - 1.768259105123751 + - !!python/tuple + - 1.742542863977896 + - 1.742542863977896 + - !!python/tuple + - 1.742542863977896 + - 1.742542863977896 + - !!python/tuple + - 1.742542863977896 + - 1.742542863977896 + - !!python/tuple + - 1.742542863977896 + - 1.742542863977896 + - !!python/tuple + - 1.7221899575569148 + - 1.7221899575569148 + - !!python/tuple + - 1.7221899575569148 + - 1.7221899575569148 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.926248264203921 + - 1.926248264203921 + - !!python/tuple + - 1.926248264203921 + - 1.926248264203921 + - !!python/tuple + - 1.8771695727453404 + - 1.8771695727453404 + - !!python/tuple + - 1.8771695727453404 + - 1.8771695727453404 + - !!python/tuple + - 1.8771695727453404 + - 1.8771695727453404 + - !!python/tuple + - 1.8771695727453404 + - 1.8771695727453404 + - !!python/tuple + - 1.845699733896991 + - 1.845699733896991 + - !!python/tuple + - 1.845699733896991 + - 1.845699733896991 + - !!python/tuple + - 1.8188572540238765 + - 1.8188572540238765 + - !!python/tuple + - 1.7939843105945377 + - 1.7939843105945377 + - !!python/tuple + - 1.7939843105945377 + - 1.7939843105945377 + - !!python/tuple + - 1.7939843105945377 + - 1.7939843105945377 + - !!python/tuple + - 1.7939843105945377 + - 1.7939843105945377 + - !!python/tuple + - 1.7939843105945377 + - 1.7939843105945377 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 1.926248264203921 + - 1.926248264203921 + - !!python/tuple + - 1.8686282777737477 + - 1.8686282777737477 + - !!python/tuple + - 1.8210176803238192 + - 1.8210176803238192 + - !!python/tuple + - 1.7802894395889934 + - 1.7802894395889934 + - !!python/tuple + - 1.7802894395889934 + - 1.7802894395889934 + - !!python/tuple + - 1.7478424991157986 + - 1.7478424991157986 + - !!python/tuple + - 1.7478424991157986 + - 1.7478424991157986 + - !!python/tuple + - 1.7478424991157986 + - 1.7478424991157986 + - !!python/tuple + - 1.7478424991157986 + - 1.7478424991157986 + - !!python/tuple + - 1.7478424991157986 + - 1.7478424991157986 + - !!python/tuple + - 1.7252557520233032 + - 1.7252557520233032 + - !!python/tuple + - 1.7252557520233032 + - 1.7252557520233032 + - !!python/tuple + - 1.705104759127191 + - 1.705104759127191 + - !!python/tuple + - 1.705104759127191 + - 1.705104759127191 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 2.0 + - 2.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 + - 7.54044728437453 + - 7.54044728437453 + - 7.167113743359139 + - 6.855393868157876 + - 6.855393868157876 + - 6.855393868157876 + - 6.6314417308437825 + - 6.6314417308437825 + - 6.6314417308437825 + - 6.454559638333733 + - 6.291888233300224 + - 6.141430638086044 + - 6.141430638086044 + - 6.141430638086044 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 + - 7.903551197790307 + - 7.903551197790307 + - 7.903551197790307 + - 7.8262826871049755 + - 7.8262826871049755 + - 7.8262826871049755 + - 7.572063578993549 + - 7.572063578993549 + - 7.572063578993549 + - 7.572063578993549 + - 7.38225136765764 + - 7.38225136765764 + - 7.38225136765764 + - 7.38225136765764 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 + - 7.903551197790307 + - 7.903551197790307 + - 7.903551197790307 + - 7.903551197790307 + - 7.560841841843724 + - 7.283353893641661 + - 7.283353893641661 + - 7.283353893641661 + - 7.283353893641661 + - 7.082208999948889 + - 6.897224064458831 + - 6.726128299109339 + - 6.726128299109339 + - 6.726128299109339 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 + - 7.4386471886178 + - 7.4386471886178 + - 7.065313647602408 + - 6.753593772401145 + - 6.48632908944113 + - 6.48632908944113 + - 6.27126296362666 + - 6.27126296362666 + - 6.090693703521139 + - 6.090693703521139 + - 6.090693703521139 + - 6.090693703521139 + - 5.949658937740341 + - 5.949658937740341 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 + - 7.340353552219049 + - 7.340353552219049 + - 6.967020011203659 + - 6.967020011203659 + - 6.967020011203659 + - 6.967020011203659 + - 6.732703816936659 + - 6.732703816936659 + - 6.535972222552363 + - 6.356248214840531 + - 6.356248214840531 + - 6.356248214840531 + - 6.356248214840531 + - 6.356248214840531 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 + - 7.396200063582359 + - 6.95887859387649 + - 6.607546096989012 + - 6.314196290309309 + - 6.314196290309309 + - 6.085242116315845 + - 6.085242116315845 + - 6.085242116315845 + - 6.085242116315845 + - 6.085242116315845 + - 5.92835013266411 + - 5.92835013266411 + - 5.790099792081516 + - 5.790099792081516 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 7.903551197790307 +problem_name: EXAMPLE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 + - 0.9540581310440179 + - 0.9540581310440179 + - 0.9068219543340135 + - 0.8673814715180845 + - 0.8673814715180845 + - 0.8673814715180845 + - 0.8390458371039358 + - 0.8390458371039358 + - 0.8390458371039358 + - 0.8166657590752766 + - 0.7960836940057179 + - 0.7770469861450483 + - 0.7770469861450483 + - 0.7770469861450483 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 0.9902235705505477 + - 0.9902235705505477 + - 0.9902235705505477 + - 0.9580583954603298 + - 0.9580583954603298 + - 0.9580583954603298 + - 0.9580583954603298 + - 0.9340423289370968 + - 0.9340423289370968 + - 0.9340423289370968 + - 0.9340423289370968 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 0.9566385606457009 + - 0.9215292861869432 + - 0.9215292861869432 + - 0.9215292861869432 + - 0.9215292861869432 + - 0.8960793474620559 + - 0.8726740539603479 + - 0.8510260933072522 + - 0.8510260933072522 + - 0.8510260933072522 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 + - 0.9411778329085176 + - 0.9411778329085176 + - 0.893941656198513 + - 0.8545011733825841 + - 0.8206854016779941 + - 0.8206854016779941 + - 0.7934740734494128 + - 0.7934740734494128 + - 0.7706274750550094 + - 0.7706274750550094 + - 0.7706274750550094 + - 0.7706274750550094 + - 0.7527829944852841 + - 0.7527829944852841 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 + - 0.9287411909561972 + - 0.9287411909561972 + - 0.8815050142461929 + - 0.8815050142461929 + - 0.8815050142461929 + - 0.8815050142461929 + - 0.8518580633499285 + - 0.8518580633499285 + - 0.8269665190983649 + - 0.8042268666036636 + - 0.8042268666036636 + - 0.8042268666036636 + - 0.8042268666036636 + - 0.8042268666036636 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 + - 0.9358071933095348 + - 0.8804749181383261 + - 0.8360224324018252 + - 0.7989062299077213 + - 0.7989062299077213 + - 0.7699377107871676 + - 0.7699377107871676 + - 0.7699377107871676 + - 0.7699377107871676 + - 0.7699377107871676 + - 0.750086889336729 + - 0.750086889336729 + - 0.7325947092871777 + - 0.7325947092871777 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +solver_name: SPSA diff --git a/test/expected_results/EXAMPLE1_STRONG.yaml b/test/expected_results/EXAMPLE1_STRONG.yaml new file mode 100644 index 000000000..479678c97 --- /dev/null +++ b/test/expected_results/EXAMPLE1_STRONG.yaml @@ -0,0 +1,510 @@ +all_est_objectives: +- - 7.903551197790307 + - 0.589842698805547 + - -0.09492468108921435 + - -0.09644872638865283 + - -0.09644872638865283 +- - 8.119582533677294 + - 0.8058740346925333 + - 0.12054129595050911 + - 0.11958255305022249 + - 0.11958253367761001 + - 0.11958253367761001 +- - 7.976856896022382 + - 0.6631483970376202 + - -0.02308765260351348 + - -0.02308765260351348 +- - 8.180131279954653 + - 0.8664227809698921 + - 0.18015531518237998 + - 0.18013128352345414 + - 0.18013128352345414 +- - 7.8782672205408835 + - 0.5645587215561201 + - -0.12149060266398673 + - -0.12173277559919024 + - -0.12173277559919024 +- - 8.017782437920566 + - 0.704073938935802 + - 0.0177828579100946 + - 0.017782438146714166 + - 0.017782437920648375 + - 0.017782437920648375 +- - 7.9194888015218154 + - 0.6057803025370522 + - -0.08041843102760225 + - -0.08051119665104835 + - -0.08051119665104835 +- - 7.975335312885124 + - 0.6616268139003629 + - -0.02464754158530805 + - -0.02464754158530805 +- - 8.016362370710029 + - 0.7026538717252656 + - 0.01640797304152326 + - 0.016362371048236773 + - 0.016362371048236773 +- - 7.955360178855756 + - 0.6416516798709928 + - -0.044164702444264084 + - -0.044164702444264084 +all_intermediate_budgets: +- - 10 + - 60 + - 550 + - 735 + - 1000 +- - 10 + - 60 + - 550 + - 735 + - 940 + - 1000 +- - 10 + - 60 + - 550 + - 1000 +- - 10 + - 60 + - 550 + - 908 + - 1000 +- - 10 + - 60 + - 550 + - 735 + - 1000 +- - 10 + - 60 + - 550 + - 735 + - 940 + - 1000 +- - 10 + - 60 + - 550 + - 735 + - 1000 +- - 10 + - 60 + - 550 + - 1000 +- - 10 + - 60 + - 550 + - 735 + - 1000 +- - 10 + - 60 + - 550 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - 0.02760544439488488 + - 0.02760544439488488 + - !!python/tuple + - -0.00019470623980406485 + - -0.00019470623980406485 + - !!python/tuple + - -0.00019470623980406485 + - -0.00019470623980406485 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269051 + - 0.5857864376269051 + - !!python/tuple + - -0.021894774184903043 + - -0.021894774184903043 + - !!python/tuple + - 9.841983844978419e-05 + - 9.841983844978419e-05 + - !!python/tuple + - -3.979369928847602e-07 + - -3.979369928847602e-07 + - !!python/tuple + - -3.979369928847602e-07 + - -3.979369928847602e-07 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - 0.005265518687922577 + - 0.005265518687922577 + - !!python/tuple + - 0.005265518687922577 + - 0.005265518687922577 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - -0.0034666430251244496 + - -0.0034666430251244496 + - !!python/tuple + - -4.2242167507199144e-05 + - -4.2242167507199144e-05 + - !!python/tuple + - -4.2242167507199144e-05 + - -4.2242167507199144e-05 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - 0.011004017337604699 + - 0.011004017337604699 + - !!python/tuple + - -4.393136180332914e-05 + - -4.393136180332914e-05 + - !!python/tuple + - -4.393136180332914e-05 + - -4.393136180332914e-05 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - 0.00045825185866199547 + - 0.00045825185866199547 + - !!python/tuple + - -1.0633708033248586e-05 + - -1.0633708033248586e-05 + - !!python/tuple + - 2.0704886748205175e-07 + - 2.0704886748205175e-07 + - !!python/tuple + - 2.0704886748205175e-07 + - 2.0704886748205175e-07 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269051 + - 0.5857864376269051 + - !!python/tuple + - 0.006810559836955554 + - 0.006810559836955554 + - !!python/tuple + - -3.0225315793797405e-05 + - -3.0225315793797405e-05 + - !!python/tuple + - -3.0225315793797405e-05 + - -3.0225315793797405e-05 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - -0.002927928411724401 + - -0.002927928411724401 + - !!python/tuple + - -0.002927928411724401 + - -0.002927928411724401 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - -0.004775056622541962 + - -0.004775056622541962 + - !!python/tuple + - 1.3004047107287309e-05 + - 1.3004047107287309e-05 + - !!python/tuple + - 1.3004047107287309e-05 + - 1.3004047107287309e-05 +- - !!python/tuple + - 2.0 + - 2.0 + - !!python/tuple + - 0.5857864376269049 + - 0.5857864376269049 + - !!python/tuple + - -0.015412960455124969 + - -0.015412960455124969 + - !!python/tuple + - -0.015412960455124969 + - -0.015412960455124969 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 735.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.589842698805547 + - -0.09492468108921435 + - -0.09644872638865283 + - -0.09644872638865283 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 735.0 + - 940.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.8058740346925333 + - 0.12054129595050911 + - 0.11958255305022249 + - 0.11958253367761001 + - 0.11958253367761001 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.6631483970376202 + - -0.02308765260351348 + - -0.02308765260351348 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 908.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.8664227809698921 + - 0.18015531518237998 + - 0.18013128352345414 + - 0.18013128352345414 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 735.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.5645587215561201 + - -0.12149060266398673 + - -0.12173277559919024 + - -0.12173277559919024 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 735.0 + - 940.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.704073938935802 + - 0.0177828579100946 + - 0.017782438146714166 + - 0.017782437920648375 + - 0.017782437920648375 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 735.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.6057803025370522 + - -0.08041843102760225 + - -0.08051119665104835 + - -0.08051119665104835 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.6616268139003629 + - -0.02464754158530805 + - -0.02464754158530805 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 735.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.7026538717252656 + - 0.01640797304152326 + - 0.016362371048236773 + - 0.016362371048236773 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 550.0 + - 1000.0 + - !!python/tuple + - 7.903551197790307 + - 0.6416516798709928 + - -0.044164702444264084 + - -0.044164702444264084 +problem_name: EXAMPLE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 0.735 + - 1.0 + - !!python/tuple + - 1.0 + - 0.07463008514077274 + - -0.012010383524276228 + - -0.012203213969894721 + - -0.012203213969894721 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 0.735 + - 0.94 + - 1.0 + - !!python/tuple + - 1.0 + - 0.10196353696270626 + - 0.015251536041698613 + - 0.01513023070991881 + - 0.01513022825879121 + - 0.01513022825879121 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08390511814777954 + - -0.0029211745487229056 + - -0.0029211745487229056 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 0.908 + - 1.0 + - !!python/tuple + - 1.0 + - 0.10962449148328773 + - 0.022794223846205768 + - 0.02279118323087673 + - 0.02279118323087673 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 0.735 + - 1.0 + - !!python/tuple + - 1.0 + - 0.07143101973122673 + - -0.01537164745614014 + - -0.015402288484349234 + - -0.015402288484349234 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 0.735 + - 0.94 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08908323882720574 + - 0.0022499832625954737 + - 0.0022499301518646227 + - 0.0022499301232615575 + - 0.0022499301232615575 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 0.735 + - 1.0 + - !!python/tuple + - 1.0 + - 0.07664659687488551 + - -0.010174974390004055 + - -0.010186711597890055 + - -0.010186711597890055 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08371259922822313 + - -0.0031185401306945497 + - -0.0031185401306945497 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 0.735 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08890356425118309 + - 0.002076025400595955 + - 0.0020702555900202688 + - 0.0020702555900202688 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.55 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08118523734626876 + - -0.0055879567727241085 + - -0.0055879567727241085 +solver_name: STRONG diff --git a/test/expected_results/FACSIZE1_RNDSRCH.yaml b/test/expected_results/FACSIZE1_RNDSRCH.yaml new file mode 100644 index 000000000..59eb903b5 --- /dev/null +++ b/test/expected_results/FACSIZE1_RNDSRCH.yaml @@ -0,0 +1,689 @@ +all_est_objectives: +- - 900.0 + - 697.9078465323493 + - 697.9078465323493 +- - 900.0 + - 899.272844621186 + - 884.4368952404533 + - 793.723842792552 + - 792.5005691446677 + - 774.3303109067089 + - 761.1319376530369 + - 738.4163195108241 + - 738.4163195108241 +- - 900.0 + - 830.0204673164263 + - 765.8515484624785 + - 732.1519188322044 + - 664.6356087524383 + - 664.6356087524383 +- - 900.0 + - 857.5640339280928 + - 851.3476777133721 + - 728.2487365557738 + - 659.7018863081597 + - 657.9754604346256 + - 628.8884751358111 + - 628.8884751358111 +- - 900.0 + - 869.2762796515829 + - 820.5732894616599 + - 663.8282830794832 + - 591.3023714559438 + - 576.4131825494867 + - 576.4131825494867 +- - 900.0 + - 845.1872462981827 + - 670.5119950831386 + - 670.5119950831386 +- - 900.0 + - 836.6947946091967 + - 677.174656865134 + - 645.6353022606578 + - 578.5728483144582 + - 578.5728483144582 +- - 900.0 + - 810.5321907061535 + - 752.3446494152274 + - 752.3446494152274 +- - 900.0 + - 822.3422319883621 + - 750.5580004872782 + - 631.3744446087885 + - 577.0662341237048 + - 577.0662341237048 +- - 900.0 + - 885.2742114970222 + - 873.3009051874886 + - 858.1759611875959 + - 853.4128677432601 + - 768.9130269993921 + - 762.1137624636784 + - 699.5665553186716 + - 699.5665553186716 +all_intermediate_budgets: +- - 0 + - 710 + - 10000 +- - 0 + - 230 + - 380 + - 1120 + - 2510 + - 4340 + - 4400 + - 5330 + - 10000 +- - 0 + - 790 + - 1020 + - 5090 + - 8070 + - 10000 +- - 0 + - 140 + - 160 + - 1480 + - 1670 + - 2920 + - 8980 + - 10000 +- - 0 + - 1120 + - 1610 + - 1870 + - 3260 + - 5910 + - 10000 +- - 0 + - 750 + - 1040 + - 10000 +- - 0 + - 430 + - 530 + - 590 + - 3400 + - 10000 +- - 0 + - 1170 + - 1790 + - 10000 +- - 0 + - 210 + - 2630 + - 4060 + - 4100 + - 10000 +- - 0 + - 50 + - 770 + - 3190 + - 3270 + - 4180 + - 5770 + - 9150 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 289.89150861878767 + - 195.03698226817048 + - 212.97935564539068 + - !!python/tuple + - 289.89150861878767 + - 195.03698226817048 + - 212.97935564539068 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 380.9279493191419 + - 227.6318357963392 + - 290.7130595057053 + - !!python/tuple + - 221.8705975458371 + - 451.4169891215546 + - 211.149308573062 + - !!python/tuple + - 212.9283349015932 + - 299.0174639377215 + - 281.7780439532375 + - !!python/tuple + - 398.14575586829324 + - 229.40988374658235 + - 164.94492952979184 + - !!python/tuple + - 356.936183203668 + - 188.95044489766755 + - 228.44368280537327 + - !!python/tuple + - 334.62232455609745 + - 225.1108733141704 + - 201.39873978276938 + - !!python/tuple + - 373.9722489572557 + - 192.10435166157123 + - 172.33971889199697 + - !!python/tuple + - 373.9722489572557 + - 192.10435166157123 + - 172.33971889199697 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 217.71567896416911 + - 205.77047481676703 + - 406.5343135354902 + - !!python/tuple + - 317.73985356050304 + - 227.79275595882496 + - 220.3189389431505 + - !!python/tuple + - 250.6404136587871 + - 224.88687352391972 + - 256.6246316494979 + - !!python/tuple + - 208.51974831378504 + - 211.9205024214042 + - 244.19535801724908 + - !!python/tuple + - 208.51974831378504 + - 211.9205024214042 + - 244.19535801724908 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 190.2049892398901 + - 474.0379345263219 + - 193.3211101618811 + - !!python/tuple + - 237.85025044134343 + - 216.50662649277535 + - 396.99080077925316 + - !!python/tuple + - 194.9605027171918 + - 332.9019112349397 + - 200.38632260364224 + - !!python/tuple + - 219.73676588685464 + - 237.2873240604807 + - 202.67779636082446 + - !!python/tuple + - 220.64893220089417 + - 242.1034959598881 + - 195.22303227384361 + - !!python/tuple + - 203.44781664835216 + - 253.34246266593476 + - 172.09819582152403 + - !!python/tuple + - 203.44781664835216 + - 253.34246266593476 + - 172.09819582152403 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 218.3848345296287 + - 236.36409120816978 + - 414.52735391378417 + - !!python/tuple + - 214.5541014578959 + - 396.98550216843734 + - 209.03368583532648 + - !!python/tuple + - 251.73379592593736 + - 192.64639356909203 + - 219.44809358445383 + - !!python/tuple + - 199.39430208016998 + - 200.57275004544422 + - 191.3353193303294 + - !!python/tuple + - 199.82844464071087 + - 173.65927835678087 + - 202.925459551995 + - !!python/tuple + - 199.82844464071087 + - 173.65927835678087 + - 202.925459551995 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 190.27113654655489 + - 353.5104936195739 + - 301.40561613205386 + - !!python/tuple + - 236.16097014589496 + - 252.22903122147036 + - 182.12199371577313 + - !!python/tuple + - 236.16097014589496 + - 252.22903122147036 + - 182.12199371577313 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 256.9312040061071 + - 193.3304141300806 + - 386.43317647300904 + - !!python/tuple + - 153.45887974518718 + - 156.80969447210998 + - 366.90608264783685 + - !!python/tuple + - 251.80855077884593 + - 148.48239476971577 + - 245.34435671209593 + - !!python/tuple + - 160.32745990084092 + - 162.80050614091945 + - 255.44488227269778 + - !!python/tuple + - 160.32745990084092 + - 162.80050614091945 + - 255.44488227269778 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 223.33067077931395 + - 272.42873103682433 + - 314.772788890015 + - !!python/tuple + - 331.7142259966948 + - 218.57542759744743 + - 202.05499582108513 + - !!python/tuple + - 331.7142259966948 + - 218.57542759744743 + - 202.05499582108513 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 276.79185619837244 + - 274.4581344529286 + - 271.0922413370609 + - !!python/tuple + - 253.2060207603967 + - 307.43904225567366 + - 189.91293747120807 + - !!python/tuple + - 211.3854924941673 + - 217.3598341035374 + - 202.62911801108396 + - !!python/tuple + - 191.21340204185898 + - 202.64370663337118 + - 183.20912544847482 + - !!python/tuple + - 191.21340204185898 + - 202.64370663337118 + - 183.20912544847482 +- - !!python/tuple + - 300.0 + - 300.0 + - 300.0 + - !!python/tuple + - 270.2647722233815 + - 338.7828797005254 + - 276.22655957311554 + - !!python/tuple + - 406.7379863459669 + - 241.94662382482272 + - 224.61629501669947 + - !!python/tuple + - 228.73215177759892 + - 308.58981561460513 + - 320.8539937953921 + - !!python/tuple + - 294.96311959280985 + - 268.00060409145647 + - 290.4491440589938 + - !!python/tuple + - 339.59912111493975 + - 231.45331994977818 + - 197.86058593467405 + - !!python/tuple + - 352.3466244656596 + - 218.42418077276463 + - 191.34295722525428 + - !!python/tuple + - 209.95456005981615 + - 249.0714840540515 + - 240.54051120480395 + - !!python/tuple + - 209.95456005981615 + - 249.0714840540515 + - 240.54051120480395 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 710.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 697.9078465323493 + - 697.9078465323493 +- !!python/tuple + - !!python/tuple + - 0.0 + - 230.0 + - 380.0 + - 1120.0 + - 2510.0 + - 4340.0 + - 4400.0 + - 5330.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 899.272844621186 + - 884.4368952404533 + - 793.723842792552 + - 792.5005691446677 + - 774.3303109067089 + - 761.1319376530369 + - 738.4163195108241 + - 738.4163195108241 +- !!python/tuple + - !!python/tuple + - 0.0 + - 790.0 + - 1020.0 + - 5090.0 + - 8070.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 830.0204673164263 + - 765.8515484624785 + - 732.1519188322044 + - 664.6356087524383 + - 664.6356087524383 +- !!python/tuple + - !!python/tuple + - 0.0 + - 140.0 + - 160.0 + - 1480.0 + - 1670.0 + - 2920.0 + - 8980.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 857.5640339280928 + - 851.3476777133721 + - 728.2487365557738 + - 659.7018863081597 + - 657.9754604346256 + - 628.8884751358111 + - 628.8884751358111 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1120.0 + - 1610.0 + - 1870.0 + - 3260.0 + - 5910.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 869.2762796515829 + - 820.5732894616599 + - 663.8282830794832 + - 591.3023714559438 + - 576.4131825494867 + - 576.4131825494867 +- !!python/tuple + - !!python/tuple + - 0.0 + - 750.0 + - 1040.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 845.1872462981827 + - 670.5119950831386 + - 670.5119950831386 +- !!python/tuple + - !!python/tuple + - 0.0 + - 430.0 + - 530.0 + - 590.0 + - 3400.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 836.6947946091967 + - 677.174656865134 + - 645.6353022606578 + - 578.5728483144582 + - 578.5728483144582 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1170.0 + - 1790.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 810.5321907061535 + - 752.3446494152274 + - 752.3446494152274 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 2630.0 + - 4060.0 + - 4100.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 822.3422319883621 + - 750.5580004872782 + - 631.3744446087885 + - 577.0662341237048 + - 577.0662341237048 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 770.0 + - 3190.0 + - 3270.0 + - 4180.0 + - 5770.0 + - 9150.0 + - 10000.0 + - !!python/tuple + - 900.0 + - 885.2742114970222 + - 873.3009051874886 + - 858.1759611875959 + - 853.4128677432601 + - 768.9130269993921 + - 762.1137624636784 + - 699.5665553186716 + - 699.5665553186716 +problem_name: FACSIZE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.071 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3754623409572083 + - 0.3754623409572083 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.023 + - 0.038 + - 0.112 + - 0.251 + - 0.434 + - 0.44 + - 0.533 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9977528275578618 + - 0.951904391896537 + - 0.6715683350614213 + - 0.6677879781929856 + - 0.611635325309536 + - 0.5708475906370923 + - 0.5006481359090372 + - 0.5006481359090372 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.079 + - 0.102 + - 0.509 + - 0.807 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7837379988624668 + - 0.585432890639814 + - 0.48128887792697267 + - 0.27263912324377565 + - 0.27263912324377565 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.014 + - 0.016 + - 0.148 + - 0.167 + - 0.292 + - 0.898 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8688575560455365 + - 0.84964677278898 + - 0.4692266366181854 + - 0.25739214104854724 + - 0.25205686229048047 + - 0.16216758457519523 + - 0.16216758457519523 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.112 + - 0.161 + - 0.187 + - 0.326 + - 0.591 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9050526205285981 + - 0.7545428112179293 + - 0.2701441956712746 + - 0.04601296500199401 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.075 + - 0.104 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8306088173378697 + - 0.2907992769144329 + - 0.2907992769144329 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.043 + - 0.053 + - 0.059 + - 0.34 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8043640779634521 + - 0.31138930537878584 + - 0.21392132181576698 + - 0.006674146314077661 + - 0.006674146314077661 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.117 + - 0.179 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7235121937328954 + - 0.5436916999644036 + - 0.5436916999644036 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.263 + - 0.406 + - 0.41 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7600094817721854 + - 0.5381703102427025 + - 0.16985012706120867 + - 0.0020181649529588683 + - 0.0020181649529588683 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.005 + - 0.077 + - 0.319 + - 0.327 + - 0.418 + - 0.577 + - 0.915 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9544920011915199 + - 0.9174901653198697 + - 0.8707486320304124 + - 0.8560289549994893 + - 0.5948939637485223 + - 0.5738817834956804 + - 0.38058834948682346 + - 0.38058834948682346 +solver_name: RNDSRCH diff --git a/test/expected_results/FACSIZE2_RNDSRCH.yaml b/test/expected_results/FACSIZE2_RNDSRCH.yaml new file mode 100644 index 000000000..6353eee54 --- /dev/null +++ b/test/expected_results/FACSIZE2_RNDSRCH.yaml @@ -0,0 +1,609 @@ +all_est_objectives: +- - 0.29 + - 0.2 + - 0.66 + - 0.66 +- - 0.22 + - 0.28 + - 0.56 + - 0.49 + - 0.64 + - 0.67 + - 0.67 +- - 0.17 + - 0.46 + - 0.69 + - 0.66 + - 0.34 + - 0.53 + - 0.8 + - 0.8 +- - 0.2 + - 0.63 + - 0.68 + - 0.68 +- - 0.27 + - 0.55 + - 0.69 + - 0.87 + - 0.87 +- - 0.23 + - 0.32 + - 0.82 + - 0.82 +- - 0.31 + - 0.61 + - 0.69 + - 0.69 +- - 0.28 + - 0.31 + - 0.5 + - 0.55 + - 0.54 + - 0.58 + - 0.74 + - 0.74 +- - 0.24 + - 0.44 + - 0.67 + - 0.67 + - 0.78 + - 0.78 +- - 0.22 + - 0.34 + - 0.56 + - 0.56 +all_intermediate_budgets: +- - 0 + - 50 + - 170 + - 10000 +- - 0 + - 110 + - 120 + - 280 + - 350 + - 1300 + - 10000 +- - 0 + - 50 + - 620 + - 1130 + - 1840 + - 3710 + - 8680 + - 10000 +- - 0 + - 30 + - 730 + - 10000 +- - 0 + - 60 + - 4830 + - 6610 + - 10000 +- - 0 + - 220 + - 690 + - 10000 +- - 0 + - 30 + - 140 + - 10000 +- - 0 + - 40 + - 70 + - 190 + - 240 + - 660 + - 4120 + - 10000 +- - 0 + - 70 + - 160 + - 690 + - 4160 + - 10000 +- - 0 + - 20 + - 540 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 115.64625172280249 + - 67.32898403527882 + - 192.9424276184349 + - !!python/tuple + - 139.59332113978707 + - 132.727473999214 + - 187.89481955629833 + - !!python/tuple + - 139.59332113978707 + - 132.727473999214 + - 187.89481955629833 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 85.51334282075409 + - 108.05785690341943 + - 159.8598132261171 + - !!python/tuple + - 111.9469694758229 + - 221.243552053035 + - 146.38163509019188 + - !!python/tuple + - 193.0790419365374 + - 144.79805380524957 + - 103.75268316840707 + - !!python/tuple + - 174.29099191271845 + - 177.0469710057997 + - 125.28524002044693 + - !!python/tuple + - 202.6142955626765 + - 147.18339350403886 + - 129.27141166023299 + - !!python/tuple + - 202.6142955626765 + - 147.18339350403886 + - 129.27141166023299 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 130.23611195131934 + - 127.59009947505332 + - 123.57708618604435 + - !!python/tuple + - 143.3810415499044 + - 123.0209180126784 + - 209.77163574018053 + - !!python/tuple + - 202.98466103170287 + - 125.04756159845107 + - 154.5189137430708 + - !!python/tuple + - 149.9829892293694 + - 207.51450400869757 + - 101.79967309216315 + - !!python/tuple + - 154.79572808777715 + - 217.5635005704146 + - 119.1199153608043 + - !!python/tuple + - 183.2026223666373 + - 156.23222256458882 + - 154.1168789976069 + - !!python/tuple + - 183.2026223666373 + - 156.23222256458882 + - 154.1168789976069 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 134.88010283444575 + - 140.23529311384561 + - 149.33646518317627 + - !!python/tuple + - 129.7767278723324 + - 188.73960018573257 + - 179.88256817114868 + - !!python/tuple + - 129.7767278723324 + - 188.73960018573257 + - 179.88256817114868 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 100.12695014625918 + - 131.8854422849072 + - 242.3850867003431 + - !!python/tuple + - 126.81672218671957 + - 141.80684147771052 + - 207.5928482644522 + - !!python/tuple + - 152.9048176724934 + - 171.68763773772602 + - 161.8928370703268 + - !!python/tuple + - 152.9048176724934 + - 171.68763773772602 + - 161.8928370703268 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 167.02903172514368 + - 123.85734281556849 + - 84.39079789754145 + - !!python/tuple + - 146.86641785041778 + - 166.3188830936159 + - 176.07253455163146 + - !!python/tuple + - 146.86641785041778 + - 166.3188830936159 + - 176.07253455163146 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 135.62609423190068 + - 112.43768348056781 + - 206.21176690143704 + - !!python/tuple + - 138.79616194628218 + - 193.19949664303456 + - 163.7197801735518 + - !!python/tuple + - 138.79616194628218 + - 193.19949664303456 + - 163.7197801735518 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 81.39324547485333 + - 150.42715875637927 + - 241.5103783677702 + - !!python/tuple + - 97.40375326014605 + - 223.38757767915172 + - 148.56049206587073 + - !!python/tuple + - 151.54239268061184 + - 223.80767263285722 + - 115.71030005992911 + - !!python/tuple + - 178.62339565848612 + - 172.09138960927004 + - 109.26936432440482 + - !!python/tuple + - 153.0967413783358 + - 127.5741736254255 + - 139.45692719589937 + - !!python/tuple + - 201.80272007709505 + - 147.06013772834757 + - 145.2233859352917 + - !!python/tuple + - 201.80272007709505 + - 147.06013772834757 + - 145.2233859352917 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 195.09946102758124 + - 123.7576834954317 + - 115.2877694647424 + - !!python/tuple + - 160.50667871846565 + - 136.86294748156635 + - 154.29282306994014 + - !!python/tuple + - 141.35691451426555 + - 126.75689402162885 + - 221.52372917089048 + - !!python/tuple + - 149.11617932751898 + - 161.745945374285 + - 165.82522203485627 + - !!python/tuple + - 149.11617932751898 + - 161.745945374285 + - 165.82522203485627 +- - !!python/tuple + - 100.0 + - 100.0 + - 100.0 + - !!python/tuple + - 141.85285929250406 + - 85.81791069594338 + - 201.917564496131 + - !!python/tuple + - 197.68606338619745 + - 110.7897217255696 + - 153.87472510476198 + - !!python/tuple + - 197.68606338619745 + - 110.7897217255696 + - 153.87472510476198 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 170.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.2 + - 0.66 + - 0.66 +- !!python/tuple + - !!python/tuple + - 0.0 + - 110.0 + - 120.0 + - 280.0 + - 350.0 + - 1300.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.28 + - 0.56 + - 0.49 + - 0.64 + - 0.67 + - 0.67 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 620.0 + - 1130.0 + - 1840.0 + - 3710.0 + - 8680.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.46 + - 0.69 + - 0.66 + - 0.34 + - 0.53 + - 0.8 + - 0.8 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 730.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.63 + - 0.68 + - 0.68 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 4830.0 + - 6610.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.55 + - 0.69 + - 0.83 + - 0.83 +- !!python/tuple + - !!python/tuple + - 0.0 + - 220.0 + - 690.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.32 + - 0.82 + - 0.82 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 140.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.61 + - 0.69 + - 0.69 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 70.0 + - 190.0 + - 240.0 + - 660.0 + - 4120.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.31 + - 0.5 + - 0.55 + - 0.54 + - 0.58 + - 0.74 + - 0.74 +- !!python/tuple + - !!python/tuple + - 0.0 + - 70.0 + - 160.0 + - 690.0 + - 4160.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.44 + - 0.67 + - 0.67 + - 0.78 + - 0.78 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 540.0 + - 10000.0 + - !!python/tuple + - 0.29 + - 0.34 + - 0.56 + - 0.56 +problem_name: FACSIZE-2 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.005 + - 0.017 + - 1.0 + - !!python/tuple + - 1.0 + - 1.1666666666666663 + - 0.31481481481481466 + - 0.31481481481481466 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.011 + - 0.012 + - 0.028 + - 0.035 + - 0.13 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0185185185185184 + - 0.4999999999999998 + - 0.6296296296296295 + - 0.35185185185185175 + - 0.2962962962962961 + - 0.2962962962962961 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.005 + - 0.062 + - 0.113 + - 0.184 + - 0.371 + - 0.868 + - 1.0 + - !!python/tuple + - 1.0 + - 0.685185185185185 + - 0.25925925925925924 + - 0.31481481481481466 + - 0.9074074074074072 + - 0.5555555555555554 + - 0.05555555555555539 + - 0.05555555555555539 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.003 + - 0.073 + - 1.0 + - !!python/tuple + - 1.0 + - 0.37037037037037024 + - 0.27777777777777757 + - 0.27777777777777757 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.483 + - 0.661 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5185185185185184 + - 0.25925925925925924 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.022 + - 0.069 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9444444444444444 + - 0.018518518518518535 + - 0.018518518518518535 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.003 + - 0.014 + - 1.0 + - !!python/tuple + - 1.0 + - 0.40740740740740733 + - 0.25925925925925924 + - 0.25925925925925924 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.004 + - 0.007 + - 0.019 + - 0.024 + - 0.066 + - 0.412 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9629629629629629 + - 0.611111111111111 + - 0.5185185185185184 + - 0.5370370370370369 + - 0.4629629629629629 + - 0.1666666666666666 + - 0.1666666666666666 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.007 + - 0.016 + - 0.069 + - 0.416 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7222222222222221 + - 0.2962962962962961 + - 0.2962962962962961 + - 0.09259259259259246 + - 0.09259259259259246 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.054 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9074074074074072 + - 0.4999999999999998 + - 0.4999999999999998 +solver_name: RNDSRCH diff --git a/test/expected_results/FIXEDSAN1_ADAM.yaml b/test/expected_results/FIXEDSAN1_ADAM.yaml new file mode 100644 index 000000000..7b340c5f4 --- /dev/null +++ b/test/expected_results/FIXEDSAN1_ADAM.yaml @@ -0,0 +1,10989 @@ +all_est_objectives: +- - 68.30388079811371 + - 65.02210791739226 + - 61.74824816579643 + - 58.48392401637333 + - 55.23116930559886 + - 51.99256448482765 + - 48.77142811485493 + - 45.57209342681238 + - 42.400316592004394 + - 39.2638941827025 + - 36.17373068936197 + - 33.14529085208375 + - 30.200853946682095 + - 27.374255317430443 + - 24.71842075109201 + - 22.321813481233022 + - 20.320980393817294 + - 18.983113368745144 + - 18.92801613981818 + - 18.852584812900208 + - 18.870381099720866 + - 18.879738283978583 + - 19.103843183553785 + - 19.118421138546896 + - 19.035238817073665 + - 19.00179509138621 + - 19.039392247425987 + - 18.995970338828364 + - 19.001079817985858 + - 19.011033707356972 + - 19.049031530603404 + - 19.004989614663483 + - 19.001232805114565 + - 19.026064106431313 + - 19.026064106431313 +- - 68.00555254312637 + - 64.73869603705984 + - 61.47963710010403 + - 58.22989108242584 + - 54.99135271344948 + - 51.766420225044406 + - 48.55817111407994 + - 45.37061622896076 + - 42.20907570989225 + - 39.08074998631693 + - 35.99561320313202 + - 32.96785932021541 + - 30.018335217049543 + - 27.178819623397516 + - 24.49993381236022 + - 22.066585951867918 + - 20.02977903424231 + - 18.675193625910012 + - 18.583084924211605 + - 18.292361780538705 + - 18.202966731600828 + - 18.255183064557226 + - 18.187796389838503 + - 18.183260330697365 + - 18.20101953970759 + - 18.214243050426607 + - 18.224164368352884 + - 18.21125196721191 + - 18.22880168449789 + - 18.222181503002073 + - 18.220439017697544 + - 18.220439017697544 +- - 67.15565001348712 + - 63.93128863921279 + - 60.714740887800765 + - 57.50753697066988 + - 54.311590893741304 + - 51.129326112169785 + - 47.96385346211013 + - 44.819228360555435 + - 41.70083126744452 + - 38.615945305863285 + - 35.574659388338304 + - 32.59132824954737 + - 29.68702421030585 + - 26.893835661041948 + - 24.263275728448097 + - 21.880694891924225 + - 19.89798920258097 + - 18.598630900372164 + - 18.574766917548125 + - 18.307700358142075 + - 18.439932907695905 + - 18.404610019818858 + - 18.48333817898758 + - 18.48136858935248 + - 18.456645321487816 + - 18.499763339624323 + - 18.50211864511825 + - 18.46211331712011 + - 18.457677836554893 + - 18.456035355614336 + - 18.457163978299164 + - 18.483964675422985 + - 18.485456529669477 + - 18.485458297189712 + - 18.484197873339486 + - 18.469579213269938 + - 18.46868560949624 + - 18.46853728363629 + - 18.46902121669734 + - 18.47621008260426 + - 18.47664293887354 + - 18.476863554198054 + - 18.476863056155484 + - 18.472655687292775 + - 18.47183223678717 + - 18.471229397870523 + - 18.470935103695098 + - 18.475141396011956 + - 18.475898772810645 + - 18.476350456586314 + - 18.476440071921587 + - 18.472412857040872 + - 18.472000867113913 + - 18.471879653818597 + - 18.47204094628669 + - 18.474597246565796 + - 18.474887762840027 + - 18.474997752462347 + - 18.474937765458105 + - 18.47474141538401 + - 18.473561734123326 + - 18.47337058783364 + - 18.473259811086926 + - 18.473226555724708 + - 18.473259691135727 + - 18.473343766702502 + - 18.473462352737485 + - 18.47360018536611 + - 18.473744013643156 + - 18.473882463464832 + - 18.47400547199608 + - 18.474103861977806 + - 18.474169450371086 + - 18.474195804870746 + - 18.4741794722721 + - 18.47412128576012 + - 18.47402726624079 + - 18.473908686448013 + - 18.473781053681748 + - 18.473662042692354 + - 18.47356870243898 + - 18.47351448711599 + - 18.47350675565014 + - 18.473545314779805 + - 18.47362236535283 + - 18.47372390536008 + - 18.47383232268728 + - 18.47392965118685 + - 18.474000823418542 + - 18.474036261946654 + - 18.47403330472214 + - 18.473996222329973 + - 18.473934893786588 + - 18.47386249018165 + - 18.473792706650784 + - 18.473737142865268 + - 18.473703354868263 + - 18.473693914463798 + - 18.473706567490023 + - 18.47373533889519 + - 18.47383952913955 + - 18.47385927167116 + - 18.47386728080185 + - 18.47386500084253 + - 18.473855598030042 + - 18.473810450543045 + - 18.47381086595136 + - 18.473811197831726 + - 18.47381089246404 + - 18.473812900432108 + - 18.473816719833977 + - 18.473820923531676 + - 18.47382455388735 + - 18.473815294668203 + - 18.473813266586234 + - 18.473812879970957 + - 18.473821637968687 + - 18.473821017078915 + - 18.473819155360005 + - 18.473816608697827 + - 18.473814136090496 + - 18.473815729340334 + - 18.47381879514535 + - 18.4738217745057 + - 18.473823946713534 + - 18.47382480056043 + - 18.473824154992414 + - 18.47382219007412 + - 18.473819385753274 + - 18.473816390124554 + - 18.47381385555124 + - 18.47381228623747 + - 18.473811934204136 + - 18.473812764916087 + - 18.473814494056583 + - 18.473816678790264 + - 18.47381883496877 + - 18.47382054861182 + - 18.473821292559748 + - 18.47382031712923 + - 18.47381910712739 + - 18.473817909716296 + - 18.47381691352115 + - 18.473816227231705 + - 18.47381702123838 + - 18.473817609914008 + - 18.473818196882053 + - 18.473818661848842 + - 18.473818099456608 + - 18.47381751163035 + - 18.47381716067628 + - 18.473817648032615 + - 18.473818139592908 + - 18.47381853219771 + - 18.473817974636013 + - 18.473817667484965 + - 18.473817453183507 + - 18.473817362869045 + - 18.47381739483444 + - 18.47381787023396 + - 18.473818010495485 + - 18.473818093757018 + - 18.47381811641077 + - 18.473818089114236 + - 18.473817895242423 + - 18.473817844255397 + - 18.47381781100687 + - 18.473817794611804 + - 18.473817792334714 + - 18.47381780144711 + - 18.47381781989657 + - 18.473817845853283 + - 18.473817876717852 + - 18.473817908366353 + - 18.473817935235683 + - 18.473817951417242 + - 18.47381795242792 + - 18.473817936972466 + - 18.473817907942514 + - 18.47381787213841 + - 18.47381783865637 + - 18.47381781637871 + - 18.47381781637871 +- - 67.71943959541662 + - 64.55197719198007 + - 61.40257326763198 + - 58.261824402386516 + - 55.086338652757505 + - 51.927009913154826 + - 48.787172176801334 + - 45.6727002765803 + - 42.592368280935176 + - 39.54098705205152 + - 36.50978124287638 + - 33.536610935836535 + - 30.661530300630673 + - 27.906866635355687 + - 25.311288908889818 + - 22.947745181719164 + - 20.970789070872538 + - 19.61624593981226 + - 19.452222899010522 + - 18.57830464983363 + - 18.72371702657416 + - 18.73743867518951 + - 18.8220508938799 + - 18.493920669333896 + - 18.309960181125515 + - 18.18536794742197 + - 18.073803264306488 + - 18.090139571717447 + - 18.119491529683764 + - 18.140347509323913 + - 18.099105066496737 + - 18.083593526354694 + - 18.10335139258012 + - 18.111403803388086 + - 18.117437518534857 + - 18.077391263358304 + - 18.063938370442287 + - 18.052286785421074 + - 18.04436269482664 + - 18.070710102065135 + - 18.112340057986536 + - 18.10923505974569 + - 18.101688377854824 + - 18.08018982278497 + - 18.079304296637794 + - 18.083573209900134 + - 18.08379921324741 + - 18.08379921324741 +- - 64.758578697695 + - 61.65407091011951 + - 58.55744388596955 + - 55.470290739875594 + - 52.39460756527104 + - 49.33292537077175 + - 46.2884963062263 + - 43.26556139467647 + - 40.26974312396309 + - 37.30863333907557 + - 34.393145737969526 + - 31.539613899241125 + - 28.76838329804989 + - 26.115431556240605 + - 23.635996188642757 + - 21.41623539678116 + - 19.61459204102056 + - 18.461993291726166 + - 18.475425254740724 + - 18.237978880776733 + - 18.18199282767025 + - 18.356542470816304 + - 18.25936304773308 + - 18.25269513117851 + - 18.27220250526261 + - 18.31509559099395 + - 18.26989274709243 + - 18.26489646336393 + - 18.29552780291055 + - 18.30721591453019 + - 18.310857467249978 + - 18.300625045961112 + - 18.30304957967182 + - 18.289311382881632 + - 18.289311382881632 +- - 67.09349230810763 + - 63.89641862746208 + - 60.75096857108767 + - 57.630239106800076 + - 54.47786888720787 + - 51.334777055238234 + - 48.20565212276791 + - 45.09486060046185 + - 42.01239305909945 + - 38.962033926382226 + - 35.95492226974436 + - 33.01147005218473 + - 30.146549141673027 + - 27.381267721421867 + - 24.77330571192132 + - 22.39239528052828 + - 20.39159305211724 + - 19.021393429528842 + - 18.759778992041255 + - 18.580933774920357 + - 18.329044255439943 + - 18.370320516602522 + - 18.293135647198465 + - 18.260497619364102 + - 18.18270573233336 + - 18.12664626654516 + - 18.112666457848793 + - 18.10456325310068 + - 18.11493592341219 + - 18.129415254720445 + - 18.144631951153418 + - 18.16830324326743 + - 18.145519047540258 + - 18.132107902291185 + - 18.099378894764918 + - 18.104063462425636 + - 18.12221848164645 + - 18.111958667733486 + - 18.102110526041216 + - 18.113416350356307 + - 18.116750971300934 + - 18.10997400951901 + - 18.10997400951901 +- - 64.04874061726181 + - 61.17801599545821 + - 58.162931670380225 + - 55.13734376630716 + - 52.113923639826716 + - 49.098751672675434 + - 46.09657857725076 + - 43.11226446593334 + - 40.15154846927009 + - 37.22176590048349 + - 34.332780605351026 + - 31.502494780667412 + - 28.749680176501688 + - 26.10540659425521 + - 23.61485747273079 + - 21.357221782138044 + - 19.470976846479754 + - 18.229228038327513 + - 17.811093833166375 + - 17.777399780444096 + - 17.86135671661055 + - 17.828396412341316 + - 17.72272308877751 + - 17.720007290199074 + - 17.80930540277987 + - 17.792371806459595 + - 17.706405786595475 + - 17.71301419975566 + - 17.7310637768733 + - 17.771120574811153 + - 17.763922681985342 + - 17.75318130991752 + - 17.741427489445993 + - 17.720189211795894 + - 17.726833764848195 + - 17.72594177308614 + - 17.73658494124442 + - 17.733851465808254 + - 17.733851465808254 +- - 65.76447222250123 + - 62.609669735287845 + - 59.46267447977363 + - 56.32501087374465 + - 53.19858541557217 + - 50.085811544615446 + - 46.989786219176956 + - 43.91454468885621 + - 40.86543637708846 + - 37.849693418224305 + - 34.8773148759105 + - 31.962485620741173 + - 29.12593526151852 + - 26.39902439138718 + - 23.83372994171139 + - 21.521148521502955 + - 19.628328154744366 + - 18.450956011747294 + - 18.62125891325564 + - 18.328516156541298 + - 18.39557999657864 + - 18.28977650106866 + - 18.302895516307686 + - 18.284834059300916 + - 18.31582996807983 + - 18.323511062316367 + - 18.34812847823928 + - 18.314470199029305 + - 18.296216337125376 + - 18.29647684853723 + - 18.354034824462904 + - 18.343419675114752 + - 18.347979264690558 + - 18.343453870344597 + - 18.322696599330197 + - 18.307416846370526 + - 18.31320701055863 + - 18.31715543270471 + - 18.351460295642585 + - 18.34079044838282 + - 18.34079044838282 +- - 72.64729923751366 + - 69.14835540199743 + - 65.65722424668212 + - 62.17543430356618 + - 58.70489641269817 + - 55.24802832203673 + - 51.80793076031394 + - 48.38864127633647 + - 44.995508445965854 + - 41.635757465244005 + - 38.31936933502812 + - 35.06049156865521 + - 31.87978548298332 + - 28.808502266105993 + - 25.898175628455874 + - 23.230412504338076 + - 20.95959641310537 + - 19.392173879024018 + - 19.138465277116744 + - 19.06455863621091 + - 19.14094571944497 + - 19.1026203869096 + - 19.18183437689951 + - 19.187641823224826 + - 19.182569830471937 + - 19.158544965839425 + - 19.18123535345789 + - 19.166710342613897 + - 19.161576480519756 + - 19.171172799645436 + - 19.17413996646642 + - 19.16697999741767 + - 19.176019503013286 + - 19.1795345231454 + - 19.171100275580415 + - 19.176431288573752 + - 19.176431288573752 +- - 65.3640980466472 + - 62.28627263175769 + - 59.2228418406142 + - 56.20027496113272 + - 53.14443140905965 + - 50.09506042712854 + - 47.05417453770416 + - 44.02845493671018 + - 41.024218206955936 + - 38.07107808738595 + - 35.1663431779809 + - 32.32750259681693 + - 29.57333252095602 + - 26.93688682353654 + - 24.471857568794533 + - 22.234398351155033 + - 20.34628246477408 + - 19.047048371896928 + - 18.709281331395704 + - 18.331408016372375 + - 18.0306556559578 + - 18.207837839002103 + - 18.10987828350396 + - 18.029313537789523 + - 17.971216660076163 + - 17.94417434271083 + - 17.922407607533582 + - 17.926268866509055 + - 17.933253412801218 + - 17.947885481346432 + - 17.959298958389212 + - 17.867304728456546 + - 17.872274961771808 + - 17.885125592950473 + - 17.911194172638318 + - 17.908478229701217 + - 17.893431448688993 + - 17.89143650071703 + - 17.891426744677545 + - 17.893798970933855 + - 17.890139104818136 + - 17.893367247269257 + - 17.89274895346761 + - 17.893973182562846 + - 17.898971515766732 + - 17.905334662205522 + - 17.899372043325204 + - 17.897656033069868 + - 17.889459533754305 + - 17.896881024027717 + - 17.894839890462432 + - 17.88980077521994 + - 17.88980077521994 +all_intermediate_budgets: +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 750 + - 1260 + - 1290 + - 1560 + - 1590 + - 1920 + - 1950 + - 2250 + - 2550 + - 2580 + - 2610 + - 2850 + - 2940 + - 3210 + - 7500 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 750 + - 1260 + - 1590 + - 1920 + - 1950 + - 2520 + - 2700 + - 2880 + - 3690 + - 3750 + - 7170 + - 8790 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 750 + - 1260 + - 1590 + - 1920 + - 1950 + - 2250 + - 2550 + - 2580 + - 2790 + - 2820 + - 2850 + - 2880 + - 3060 + - 3090 + - 3120 + - 3150 + - 3330 + - 3360 + - 3390 + - 3420 + - 3630 + - 3660 + - 3690 + - 3720 + - 3900 + - 3930 + - 3960 + - 3990 + - 4170 + - 4200 + - 4230 + - 4260 + - 4440 + - 4470 + - 4500 + - 4530 + - 4680 + - 4710 + - 4740 + - 4770 + - 4800 + - 4920 + - 4950 + - 4980 + - 5010 + - 5040 + - 5070 + - 5100 + - 5130 + - 5160 + - 5190 + - 5220 + - 5250 + - 5280 + - 5310 + - 5340 + - 5370 + - 5400 + - 5430 + - 5460 + - 5490 + - 5520 + - 5550 + - 5580 + - 5610 + - 5640 + - 5670 + - 5700 + - 5730 + - 5760 + - 5790 + - 5820 + - 5850 + - 5880 + - 5910 + - 5940 + - 5970 + - 6000 + - 6030 + - 6060 + - 6090 + - 6180 + - 6210 + - 6240 + - 6270 + - 6300 + - 6480 + - 6510 + - 6540 + - 6570 + - 6720 + - 6750 + - 6780 + - 6810 + - 6990 + - 7020 + - 7050 + - 7200 + - 7230 + - 7260 + - 7290 + - 7320 + - 7440 + - 7470 + - 7500 + - 7530 + - 7560 + - 7590 + - 7620 + - 7650 + - 7680 + - 7710 + - 7740 + - 7770 + - 7800 + - 7830 + - 7860 + - 7890 + - 7920 + - 8010 + - 8040 + - 8070 + - 8100 + - 8130 + - 8160 + - 8310 + - 8340 + - 8370 + - 8550 + - 8580 + - 8610 + - 8760 + - 8790 + - 8820 + - 8850 + - 9000 + - 9030 + - 9060 + - 9090 + - 9120 + - 9210 + - 9240 + - 9270 + - 9300 + - 9330 + - 9420 + - 9450 + - 9480 + - 9510 + - 9540 + - 9570 + - 9600 + - 9630 + - 9660 + - 9690 + - 9720 + - 9750 + - 9780 + - 9810 + - 9840 + - 9870 + - 9900 + - 9930 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 750 + - 1170 + - 1200 + - 1230 + - 1470 + - 1500 + - 1530 + - 1830 + - 1860 + - 1890 + - 2100 + - 2130 + - 2370 + - 2400 + - 2430 + - 2460 + - 2670 + - 2700 + - 2730 + - 2760 + - 2970 + - 3150 + - 3210 + - 3270 + - 3450 + - 3480 + - 5940 + - 6390 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 750 + - 780 + - 1230 + - 1260 + - 1290 + - 1590 + - 1950 + - 2250 + - 2280 + - 2550 + - 2580 + - 2640 + - 3150 + - 3270 + - 3840 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 720 + - 750 + - 1200 + - 1230 + - 1440 + - 1470 + - 1500 + - 1530 + - 2100 + - 2130 + - 2160 + - 2190 + - 2280 + - 2340 + - 2370 + - 2430 + - 2610 + - 2700 + - 2760 + - 2850 + - 3600 + - 3660 + - 3690 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 750 + - 780 + - 1260 + - 1290 + - 1560 + - 1590 + - 1950 + - 1980 + - 2250 + - 2280 + - 2340 + - 2550 + - 2580 + - 2610 + - 2640 + - 2880 + - 2910 + - 3450 + - 3510 + - 7320 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 750 + - 1230 + - 1260 + - 1290 + - 1590 + - 1920 + - 1950 + - 2220 + - 2250 + - 2280 + - 2310 + - 2520 + - 2550 + - 2670 + - 2820 + - 2850 + - 2910 + - 2940 + - 2970 + - 3330 + - 3660 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 750 + - 1260 + - 1290 + - 1560 + - 1590 + - 1920 + - 1950 + - 2250 + - 2550 + - 2580 + - 2850 + - 2880 + - 3180 + - 3420 + - 3450 + - 4050 + - 4290 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 480 + - 510 + - 540 + - 570 + - 720 + - 750 + - 1440 + - 1470 + - 1500 + - 1530 + - 1560 + - 1860 + - 1890 + - 1920 + - 1950 + - 1980 + - 2190 + - 2220 + - 2250 + - 2340 + - 2370 + - 2430 + - 2460 + - 2490 + - 2520 + - 2580 + - 2700 + - 2730 + - 2790 + - 2850 + - 2910 + - 2970 + - 3810 + - 3960 + - 4410 + - 7050 + - 9210 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000004105136 + - 9.500000082863304 + - 9.500000009444161 + - 9.500000008083433 + - 9.500000009652434 + - 9.500000030260473 + - 9.500000011065525 + - 9.500000010500042 + - 9.500000024741569 + - 9.500000031840116 + - 9.500000008188639 + - 9.500000007052652 + - 9.500000007501454 + - !!python/tuple + - 9.000011622446763 + - 9.000256002247575 + - 9.000026901195714 + - 9.000022989663751 + - 9.000027500955897 + - 9.000088241363851 + - 9.00003157761982 + - 9.000029944686126 + - 9.000071703030862 + - 9.000093011795043 + - 9.000023291665515 + - 9.000020034581846 + - 9.000021320378814 + - !!python/tuple + - 8.500045294202305 + - 8.501010171366357 + - 8.50010492449952 + - 8.500089649120044 + - 8.500107267259464 + - 8.50034529565139 + - 8.500123195348095 + - 8.500116814417904 + - 8.500280336904574 + - 8.500364053123079 + - 8.50009082827383 + - 8.50007811314271 + - 8.500083132154796 + - !!python/tuple + - 8.000114245128987 + - 8.00258393737405 + - 8.000264896441141 + - 8.000226277889897 + - 8.00027082091116 + - 8.000874940769418 + - 8.00031111182677 + - 8.000294968575123 + - 8.000709650935054 + - 8.000922727881322 + - 8.000229258327723 + - 8.000197125195124 + - 8.000209807517782 + - !!python/tuple + - 7.500235375210018 + - 7.505408741381778 + - 7.500546329314016 + - 7.500466556534471 + - 7.500558570987749 + - 7.501811963126974 + - 7.500641849989814 + - 7.500608477321914 + - 7.501468039354608 + - 7.501911531408315 + - 7.500472711598623 + - 7.500406365030715 + - 7.500432547223902 + - !!python/tuple + - 7.000430500877843 + - 7.0100726615693985 + - 7.001000423461434 + - 7.00085408657958 + - 7.00102288760703 + - 7.00333359347497 + - 7.001175763779157 + - 7.001114489787152 + - 7.0026974810154545 + - 7.003518037430514 + - 7.000865374433702 + - 7.000743728205734 + - 7.000791725896857 + - !!python/tuple + - 6.50072812745319 + - 6.517391602980416 + - 6.501694363029258 + - 6.5014460191436445 + - 6.501732501266425 + - 6.505676229380113 + - 6.501992150729903 + - 6.501888059034895 + - 6.504586540460846 + - 6.505992746148077 + - 6.5014651693705465 + - 6.50125884584825 + - 6.5013402403997045 + - !!python/tuple + - 6.0011660345424245 + - 6.0285209793386505 + - 6.002717624734551 + - 6.002318374912577 + - 6.002778965407671 + - 6.0091605797819865 + - 6.003196775362744 + - 6.003029237296014 + - 6.007389803230283 + - 6.009675964697746 + - 6.0023491505773405 + - 6.0020176739262885 + - 6.00214841532392 + - !!python/tuple + - 5.501795144220993 + - 5.545135541872775 + - 5.504191490896931 + - 5.503574050575494 + - 5.504286404232567 + - 5.514230582695559 + - 5.504933239610083 + - 5.504673790839296 + - 5.511457768725702 + - 5.515039483138571 + - 5.50362162509241 + - 5.503109389672431 + - 5.503311379423446 + - !!python/tuple + - 5.0026854818190225 + - 5.069726152337514 + - 5.006283842431238 + - 5.005355241169757 + - 5.0064266759235645 + - 5.02151568086689 + - 5.00740071023617 + - 5.007009890281298 + - 5.017284369145654 + - 5.022753382028466 + - 5.005426755496857 + - 5.004657073207783 + - 5.004960499354136 + - !!python/tuple + - 4.503935686109226 + - 4.606098586465475 + - 4.5092330125351525 + - 4.507863419228608 + - 4.509443832864735 + - 4.531934386537766 + - 4.510882589901147 + - 4.510305076488243 + - 4.525585470305614 + - 4.533797323823555 + - 4.507968833206914 + - 4.506834852453518 + - 4.507281748008953 + - !!python/tuple + - 4.0056888256210454 + - 4.160212502095774 + - 4.013387957996531 + - 4.011392879978147 + - 4.01369533292697 + - 4.046874342373876 + - 4.015794967007633 + - 4.014951775410643 + - 4.037434539700709 + - 4.049654319314914 + - 4.011546325615052 + - 4.009896621678678 + - 4.010546504302184 + - !!python/tuple + - 3.5081600653570075 + - 3.741531153782662 + - 3.51927958166252 + - 3.516390092462249 + - 3.5197252460521535 + - 3.5685217061900634 + - 3.52277297109339 + - 3.521548315006465 + - 3.5545098693236574 + - 3.5726653886066573 + - 3.51661213195621 + - 3.5142267120913706 + - 3.5151659623643554 + - !!python/tuple + - 3.011688201091954 + - 3.364850589631413 + - 3.027755944579202 + - 3.0235657723902527 + - 3.0284031180275592 + - 3.100498492873225 + - 3.032835183041997 + - 3.03105295115001 + - 3.0795737002929466 + - 3.106714864513545 + - 3.023887400820713 + - 3.020435264282256 + - 3.0217936877266833 + - !!python/tuple + - 2.5168396853842547 + - 3.051453853537772 + - 2.5402608493177334 + - 2.534124810950322 + - 2.541210247769347 + - 2.649166544843034 + - 2.547723820003381 + - 2.545102125234254 + - 2.6174669328400877 + - 2.6586241937420154 + - 2.534595120405735 + - 2.529553181783321 + - 2.5315355983946874 + - !!python/tuple + - 2.0246749949771727 + - 2.7073140946656724 + - 2.0681856790306683 + - 2.0502922017342744 + - 2.0608972971849853 + - 2.2263899047923745 + - 2.070688125988004 + - 2.0667427392132485 + - 2.177316682709038 + - 2.2410548486627 + - 2.050994599946295 + - 2.0434764172555724 + - 2.046429308523484 + - !!python/tuple + - 1.5372888684442148 + - 2.36459722391655 + - 1.6143323484163188 + - 1.5767066420574274 + - 1.597006606763173 + - 1.8491647785292624 + - 1.6071476132426967 + - 1.6058701404977573 + - 1.7494476237762528 + - 1.857858246646818 + - 1.5805103621827876 + - 1.5675486956379943 + - 1.5745104757139374 + - !!python/tuple + - 1.059826214647333 + - 2.0795898135792563 + - 1.1926711824873815 + - 1.1249409345955248 + - 1.1641356063642596 + - 1.5588105185080006 + - 1.1738824463261393 + - 1.178608054793212 + - 1.3700482958965778 + - 1.5522807805614343 + - 1.135046506183136 + - 1.1116350914805484 + - 1.1265185762893635 + - !!python/tuple + - 0.9886687477001342 + - 1.8357604409996562 + - 1.2873548369301737 + - 1.210619328188798 + - 1.394537774236007 + - 1.7947213034650356 + - 1.326931974508479 + - 1.368829208466525 + - 1.7682836977144711 + - 1.8673063043426614 + - 1.216143448300559 + - 1.180377924083004 + - 1.185088018454199 + - !!python/tuple + - 0.9773443616138615 + - 2.4627599381154193 + - 1.6459661320494525 + - 1.2730901968073411 + - 1.5635530723103268 + - 2.0328161830994347 + - 1.4339732384257067 + - 1.515948048933063 + - 1.6733525364787571 + - 1.9974915236251323 + - 1.3693454422378504 + - 1.3349924372952657 + - 1.3715133446146186 + - !!python/tuple + - 0.8800288711848383 + - 2.3073577329975334 + - 1.5425505708828713 + - 1.1741132315310288 + - 1.458532466808154 + - 1.9191927414684786 + - 1.3375911446677196 + - 1.4130003128576711 + - 1.6616486608138368 + - 1.9455866468698833 + - 1.2614143012879493 + - 1.233465307333771 + - 1.265454104772473 + - !!python/tuple + - 0.8989286688010593 + - 2.24306446720515 + - 1.35431271404257 + - 1.257260327394326 + - 1.4368104741140866 + - 2.1509840054532563 + - 1.4247982845807519 + - 1.451213659683823 + - 1.8486559785307046 + - 2.036434692167899 + - 1.2334537751406338 + - 1.221452594216129 + - 1.1814743444379516 + - !!python/tuple + - 0.9546042466563511 + - 2.3688045480389404 + - 1.415513510326898 + - 1.3188579715397983 + - 1.4843833144959127 + - 2.1928388659085365 + - 1.4903658147051395 + - 1.5062104644597347 + - 1.8627990493145727 + - 2.1172667357796153 + - 1.2980158596103424 + - 1.284625280703854 + - 1.2515445329325088 + - !!python/tuple + - 0.9224888688059528 + - 2.415986120922648 + - 1.6236609616989137 + - 1.274568373510831 + - 1.525047531189356 + - 2.107232891199536 + - 1.4562238224561246 + - 1.5249741618312913 + - 1.7889903044103168 + - 2.182024926056571 + - 1.3270295835606476 + - 1.312373124939183 + - 1.3443215091714082 + - !!python/tuple + - 0.8879508081771741 + - 2.3810411944117065 + - 1.583743512057519 + - 1.238815426968924 + - 1.5036837871586632 + - 2.0686916024783644 + - 1.413874062510595 + - 1.5086621989421583 + - 1.7888784365138477 + - 2.1078854907187736 + - 1.2848633843388213 + - 1.2791963621772575 + - 1.2987194029631057 + - !!python/tuple + - 0.9222899442055481 + - 2.308462693502202 + - 1.4425076614421712 + - 1.2769469506932336 + - 1.5154637611795845 + - 1.9670651853550578 + - 1.4575218533260246 + - 1.4381961676174566 + - 1.8392934171166124 + - 2.1778987639986607 + - 1.2701937188144392 + - 1.2893966973735356 + - 1.2318895003040953 + - !!python/tuple + - 0.9047697397777075 + - 2.38087310886439 + - 1.5593875735133402 + - 1.2626150090467314 + - 1.5295956823136876 + - 2.03340356902964 + - 1.441417075433795 + - 1.489821749438812 + - 1.8129513776710644 + - 2.134931067514316 + - 1.295147730391176 + - 1.310282280842279 + - 1.3015706187777858 + - !!python/tuple + - 0.892536837667201 + - 2.3708692830972824 + - 1.5487714393711545 + - 1.2506781483076956 + - 1.5090168189259352 + - 2.002967527601067 + - 1.4303316031069664 + - 1.4823658128045596 + - 1.816754013424606 + - 2.1386816617861015 + - 1.2781485540505046 + - 1.299034053945518 + - 1.2907533318719409 + - !!python/tuple + - 0.8829318765567095 + - 2.357918236206044 + - 1.536395189230734 + - 1.241858000736236 + - 1.4841737663619305 + - 1.9716084144722636 + - 1.4223219387426993 + - 1.4785257878948972 + - 1.8207388208144801 + - 2.1481014090015935 + - 1.260914431497678 + - 1.2894109174204162 + - 1.280211702941621 + - !!python/tuple + - 0.9122319601923727 + - 2.3075481326539866 + - 1.481298008966047 + - 1.2680760001872886 + - 1.4819170487674094 + - 2.034308089501609 + - 1.4475518110989456 + - 1.468827599047451 + - 1.8222394494530416 + - 2.161223117603411 + - 1.268532190776193 + - 1.269840988228796 + - 1.24570136416074 + - !!python/tuple + - 0.9275651010138701 + - 2.3333763951622672 + - 1.4986147817569655 + - 1.2865063083936994 + - 1.507698299680781 + - 1.9947999294603491 + - 1.4615680558159483 + - 1.4961904223111324 + - 1.816055655448013 + - 2.150420919684388 + - 1.2853433793058808 + - 1.3031964290677456 + - 1.2680257584870964 + - !!python/tuple + - 0.8962894011579936 + - 2.333452439731047 + - 1.526359967729988 + - 1.2549823691704824 + - 1.496908856208614 + - 1.9746137364847152 + - 1.4345180821854906 + - 1.4789828325734047 + - 1.824553113007929 + - 2.1527056588870392 + - 1.2661083381393072 + - 1.3014061209823178 + - 1.2757072028420575 + - !!python/tuple + - 0.9074694636829342 + - 2.3329988724401924 + - 1.511873651436765 + - 1.2657632312219973 + - 1.49855812576517 + - 1.9851269518250991 + - 1.4480635125277215 + - 1.47235086593504 + - 1.8209337858216952 + - 2.1797103929119 + - 1.2745058532375146 + - 1.291042273807758 + - 1.2728707094087899 + - !!python/tuple + - 0.9074694636829342 + - 2.3329988724401924 + - 1.511873651436765 + - 1.2657632312219973 + - 1.49855812576517 + - 1.9851269518250991 + - 1.4480635125277215 + - 1.47235086593504 + - 1.8209337858216952 + - 2.1797103929119 + - 1.2745058532375146 + - 1.291042273807758 + - 1.2728707094087899 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000005207035 + - 9.50000001594349 + - 9.500000016437369 + - 9.500000006050772 + - 9.500000026438348 + - 9.500000018287647 + - 9.500000007189852 + - 9.500000008293297 + - 9.500000022789534 + - 9.500000019150935 + - 9.500000011470698 + - 9.500000006523518 + - 9.500000008223601 + - !!python/tuple + - 9.000014760663822 + - 9.00004574979774 + - 9.000047193311127 + - 9.000017168941918 + - 9.000076766478278 + - 9.000052615437713 + - 9.000020427514277 + - 9.000023592154731 + - 9.000065901157338 + - 9.000055152881481 + - 9.000032748902912 + - 9.000018520307231 + - 9.000023392040942 + - !!python/tuple + - 8.500057534085801 + - 8.50017862174972 + - 8.500184271889633 + - 8.500066929836105 + - 8.500300213291906 + - 8.500205502603075 + - 8.500079646851221 + - 8.500092001559912 + - 8.50025757457739 + - 8.500215442281478 + - 8.500127772994741 + - 8.50007220317739 + - 8.500091220194136 + - !!python/tuple + - 8.000145145505623 + - 8.000451468366133 + - 8.000465789481034 + - 8.00016887367686 + - 8.000760193825696 + - 8.000519623620994 + - 8.000201000447253 + - 8.000232224041936 + - 8.000651805775954 + - 8.000544839171564 + - 8.0003226948548 + - 8.000182194088348 + - 8.000230248972398 + - !!python/tuple + - 7.5002991027812955 + - 7.5009323144875415 + - 7.500961982556862 + - 7.500348057276417 + - 7.501573127609287 + - 7.501073557812839 + - 7.500414364861874 + - 7.500478836506508 + - 7.501347853144863 + - 7.501125846411392 + - 7.500665799905726 + - 7.500375546176025 + - 7.500474757488621 + - !!python/tuple + - 7.000547192435232 + - 7.001709712638188 + - 7.001764314484273 + - 7.000636871512399 + - 7.002891686551886 + - 7.001969766127057 + - 7.000758392639319 + - 7.000876607503444 + - 7.002475551323148 + - 7.002066106248059 + - 7.001219746493672 + - 7.000687242682145 + - 7.000869126534534 + - !!python/tuple + - 6.500925752338173 + - 6.502900460391082 + - 6.5029934692088425 + - 6.501077704197397 + - 6.504918905723097 + - 6.503343641062898 + - 6.501283711865974 + - 6.501484227659051 + - 6.504207072626951 + - 6.503507954525067 + - 6.502066886359401 + - 6.501163081172325 + - 6.50147153516095 + - !!python/tuple + - 6.001482991536528 + - 6.00466102331458 + - 6.004811190026128 + - 6.00172683409081 + - 6.007929316048811 + - 6.0053769384584275 + - 6.002057611793179 + - 6.002379780349124 + - 6.006774471777209 + - 6.005642614915722 + - 6.003317097818854 + - 6.001863893781839 + - 6.002359381232572 + - !!python/tuple + - 5.5022839654886315 + - 5.507204913077556 + - 5.507438301929071 + - 5.50266027394391 + - 5.512301512212661 + - 5.508318273741433 + - 5.50317108546508 + - 5.503668977418857 + - 5.51049660820839 + - 5.508731882352131 + - 5.5051196310410555 + - 5.502871884190522 + - 5.503637440880649 + - !!python/tuple + - 5.003418257653377 + - 5.010829983625835 + - 5.011183040111958 + - 5.003982805134738 + - 5.0185700330262035 + - 5.012515424439729 + - 5.004749740320678 + - 5.0054979417282865 + - 5.015821835948742 + - 5.013142337828986 + - 5.007681587635356 + - 5.00430043391685 + - 5.005450531210573 + - !!python/tuple + - 4.505012263282342 + - 4.515962949082556 + - 4.5164872883139315 + - 4.505842450014283 + - 4.527511252279588 + - 4.518468208166144 + - 4.506971315379037 + - 4.508073773944997 + - 4.523398343346916 + - 4.519401430163116 + - 4.511297830065453 + - 4.506309825697994 + - 4.5080038815431145 + - !!python/tuple + - 4.007249674744278 + - 4.0232353153750715 + - 4.024005512744382 + - 4.008454656480023 + - 4.0402921194869785 + - 4.026919030565732 + - 4.010095032715461 + - 4.0116991007146545 + - 4.0341954094036945 + - 4.028293641945024 + - 4.016401566074636 + - 4.009133548235586 + - 4.011597347741945 + - !!python/tuple + - 3.5104074354244608 + - 3.533620081258864 + - 3.5347469932576003 + - 3.512144849002054 + - 3.5587416082480723 + - 3.5390165472671797 + - 3.514513404273622 + - 3.516833233981252 + - 3.549723912647801 + - 3.541034535869767 + - 3.5236545922516087 + - 3.5131246396656395 + - 3.5166859695097266 + - !!python/tuple + - 3.014922986046635 + - 3.048694609237856 + - 3.0503495418665656 + - 3.0174282509473476 + - 3.0858768130109886 + - 3.056631430719671 + - 3.0208497860652934 + - 3.0242077313953297 + - 3.0724634139562097 + - 3.059606891572258 + - 3.0341192768833274 + - 3.0188427637011217 + - 3.0239943693249 + - !!python/tuple + - 2.5215306986887978 + - 2.5711887516241276 + - 2.5736504592596656 + - 2.5251724146968852 + - 2.6269913566220238 + - 2.5830155193027746 + - 2.530157892731539 + - 2.5350636455730173 + - 2.606751451898316 + - 2.5874623693087404 + - 2.549614743936644 + - 2.5272318452309843 + - 2.5347515631847277 + - !!python/tuple + - 2.0315701859169213 + - 2.1062462265375195 + - 2.109999334910849 + - 2.0369660339679805 + - 2.192041468385466 + - 2.1243106986398512 + - 2.044376719967402 + - 2.0516945552472112 + - 2.16078087350321 + - 2.1311233152226423 + - 2.0735375052272853 + - 2.0400240108042818 + - 2.05122829377262 + - !!python/tuple + - 1.5477952718708172 + - 1.6646718311108826 + - 1.670622996458582 + - 1.5560906882909575 + - 1.80088980624127 + - 1.6933440752081044 + - 1.5675338663269498 + - 1.578885856977274 + - 1.751313841506093 + - 1.704170626434463 + - 1.613029496876037 + - 1.5608058620894685 + - 1.578161108485073 + - !!python/tuple + - 1.0770166641082874 + - 1.2720290098037688 + - 1.2741611517469775 + - 1.0911008940093778 + - 1.4921867204700394 + - 1.2939517596490533 + - 1.1175485995935786 + - 1.1285760031777357 + - 1.4136929850717905 + - 1.3420809823587507 + - 1.1812856754059657 + - 1.0985025417026257 + - 1.1312104570541637 + - !!python/tuple + - 1.0542086714903836 + - 1.5726597840533705 + - 1.5427262665072046 + - 1.1207536045101194 + - 1.5605264454056111 + - 1.5118557863637976 + - 1.1594938216760355 + - 1.335614077642152 + - 1.66597563941235 + - 1.656133562157711 + - 1.287253934603777 + - 1.1715569380372157 + - 1.2509541566566527 + - !!python/tuple + - 1.076291512244034 + - 1.7814573939975094 + - 1.6686844976611495 + - 1.1742588047938687 + - 1.8222598207351293 + - 1.589972648455839 + - 1.3560121497191238 + - 1.4970422591127324 + - 1.9058963779379607 + - 1.691906241567102 + - 1.3706361637585733 + - 1.3702912883608187 + - 1.368953587982214 + - !!python/tuple + - 1.0643792914654253 + - 1.7574396829307313 + - 1.7294752436582532 + - 1.1846217114474595 + - 1.9761466281734812 + - 1.6032619995591828 + - 1.2266872021590114 + - 1.5146655972712766 + - 1.9365549845610848 + - 1.8642458769262995 + - 1.3872133784641791 + - 1.227679125995933 + - 1.3815795326042384 + - !!python/tuple + - 1.0325028049409006 + - 1.8082463614563633 + - 1.6934887754876142 + - 1.1453712971792613 + - 1.8398463761258481 + - 1.5866112189750534 + - 1.3554910970798024 + - 1.4835087620005956 + - 1.8502821728166199 + - 1.7432306979120284 + - 1.3638975966446394 + - 1.3594844318706922 + - 1.3927348993168596 + - !!python/tuple + - 0.9965330023729132 + - 1.7701824280183278 + - 1.6590448395901412 + - 1.1097748734826585 + - 1.8064213626236614 + - 1.555060744895854 + - 1.3148536944744225 + - 1.4488938338298842 + - 1.836484436803305 + - 1.710993857785613 + - 1.326162775082556 + - 1.3275820653296244 + - 1.3518158533125897 + - !!python/tuple + - 1.0282930036774252 + - 1.7950892866554289 + - 1.7004224280264566 + - 1.1495633735742996 + - 1.8295647939304944 + - 1.6010370326954713 + - 1.3218094194892942 + - 1.4807669206838323 + - 1.8477960297810652 + - 1.784512326732108 + - 1.3648908309830439 + - 1.3141728444527518 + - 1.389510824518703 + - !!python/tuple + - 0.9823800699613249 + - 1.7277159213971116 + - 1.6635082435442055 + - 1.1022762848224776 + - 1.7738831367161914 + - 1.594468516796364 + - 1.2382751425677252 + - 1.4396036397089564 + - 1.8393595364273543 + - 1.7917252791267848 + - 1.3075128127984792 + - 1.2633609853341532 + - 1.3220874975791024 + - !!python/tuple + - 1.0262925996889007 + - 1.7501024201679876 + - 1.7022462540368737 + - 1.1483913008531987 + - 1.8165974629631305 + - 1.6081700911897117 + - 1.2373368203275295 + - 1.4754532375102718 + - 1.8782854523305679 + - 1.8044513686898347 + - 1.3464052360529035 + - 1.2493836220554497 + - 1.3642975432562763 + - !!python/tuple + - 1.0146288974974005 + - 1.763814542501225 + - 1.700274416858424 + - 1.1331444142485128 + - 1.8031163279476703 + - 1.6368645889898814 + - 1.2667736119205824 + - 1.4669002617921174 + - 1.884627873585134 + - 1.7834306524862593 + - 1.3458192063983403 + - 1.2675265300964729 + - 1.3458849605492256 + - !!python/tuple + - 1.01127633893847 + - 1.760337933251583 + - 1.6846469500206418 + - 1.1343537410497808 + - 1.8046654715123578 + - 1.580735970295776 + - 1.2637298741344622 + - 1.4626838970668836 + - 1.8966585080320735 + - 1.8305240183806717 + - 1.348243291010851 + - 1.2657137347794105 + - 1.3343574379197964 + - !!python/tuple + - 1.0152094877340596 + - 1.7578963296619186 + - 1.6891914408455622 + - 1.140109647826317 + - 1.8055532612589278 + - 1.6047033725518691 + - 1.2599604651779936 + - 1.4813520546916477 + - 1.8982575363841117 + - 1.8113325519650585 + - 1.3526940218354733 + - 1.2776225179249443 + - 1.3395439100566229 + - !!python/tuple + - 1.0152216112041001 + - 1.757884874051806 + - 1.6892516258073331 + - 1.140323332668742 + - 1.7994962137895718 + - 1.598357272386766 + - 1.2579578795873008 + - 1.468875843324526 + - 1.8961651174587482 + - 1.7937466243445632 + - 1.3465993283381035 + - 1.2670733177262155 + - 1.3528559627760146 + - !!python/tuple + - 1.0152216112041001 + - 1.757884874051806 + - 1.6892516258073331 + - 1.140323332668742 + - 1.7994962137895718 + - 1.598357272386766 + - 1.2579578795873008 + - 1.468875843324526 + - 1.8961651174587482 + - 1.7937466243445632 + - 1.3465993283381035 + - 1.2670733177262155 + - 1.3528559627760146 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000004583558 + - 9.500000013589746 + - 9.500000040136452 + - 9.500000006102683 + - 9.500000019329802 + - 9.500000014151874 + - 9.500000005875975 + - 9.500000012034603 + - 9.50000002120144 + - 9.500000014492624 + - 9.50000000571148 + - 9.500000012972832 + - 9.500000010760841 + - !!python/tuple + - 9.0000129840356 + - 9.000038892055366 + - 9.000118335746393 + - 9.000017317255876 + - 9.000055679227513 + - 9.000040526568808 + - 9.000016669640328 + - 9.000034380820795 + - 9.000061199367492 + - 9.000041518374285 + - 9.00001619994214 + - 9.000037100603954 + - 9.00003069753265 + - !!python/tuple + - 8.500050604249976 + - 8.500151791204686 + - 8.500463778223668 + - 8.500067508553993 + - 8.50021750441481 + - 8.500158184385434 + - 8.500064981640174 + - 8.500134151861486 + - 8.500239138187588 + - 8.50016206423887 + - 8.500063149048074 + - 8.500144785453452 + - 8.500119756139 + - !!python/tuple + - 8.000127649238706 + - 8.000383495743206 + - 8.001177221929924 + - 8.000170335406398 + - 8.00055007144922 + - 8.000399687244412 + - 8.000163953103536 + - 8.000338838294132 + - 8.000604982495496 + - 8.000409514971805 + - 8.000159324783567 + - 8.000365756443065 + - 8.000302410506288 + - !!python/tuple + - 7.500263015890128 + - 7.500791578027875 + - 7.5024428039544 + - 7.500351073552651 + - 7.501136698592683 + - 7.50082509064776 + - 7.500337904130901 + - 7.5006991855521825 + - 7.501250633996988 + - 7.500845435311643 + - 7.500328354654512 + - 7.500754870235232 + - 7.500623860986818 + - !!python/tuple + - 7.000481106754885 + - 7.001450859608354 + - 7.004504314457253 + - 7.000642398079648 + - 7.002086105624852 + - 7.001512474220111 + - 7.000618269358388 + - 7.001281070491396 + - 7.002296170557514 + - 7.0015498863160985 + - 7.000600774530678 + - 7.001383388006324 + - 7.001142733118072 + - !!python/tuple + - 6.500813818389852 + - 6.502459843763454 + - 6.507689417835845 + - 6.501087070500013 + - 6.503542073456825 + - 6.502564676308645 + - 6.50104617948093 + - 6.502171113712321 + - 6.503900627882 + - 6.502628344520913 + - 6.501016533860642 + - 6.502345079903789 + - 6.501936034875736 + - !!python/tuple + - 6.001303443493466 + - 6.003950210207683 + - 6.012446428678559 + - 6.001741868426415 + - 6.005697797878363 + - 6.004119241217356 + - 6.001676235462918 + - 6.003484948093015 + - 6.006278054421591 + - 6.004221925912639 + - 6.001628657546027 + - 6.003765228828881 + - 6.003106448765469 + - !!python/tuple + - 5.502007016113234 + - 5.506101214548284 + - 5.519401814138204 + - 5.502683482580729 + - 5.508817821606229 + - 5.5063635163634315 + - 5.50258217035619 + - 5.50537973213107 + - 5.509722099939114 + - 5.506522910169993 + - 5.502508737901824 + - 5.505814273967855 + - 5.504793347997683 + - !!python/tuple + - 5.003003013174177 + - 5.009162226462459 + - 5.029453151225362 + - 5.004017635682513 + - 5.013272649970847 + - 5.009558302641183 + - 5.003865601084587 + - 5.0080736890417965 + - 5.014644923074475 + - 5.009799072545379 + - 5.003755421472977 + - 5.008729145635878 + - 5.007189963281628 + - !!python/tuple + - 4.504402057211551 + - 4.513489343780028 + - 4.543925159308525 + - 4.505893691289771 + - 4.5195955049741645 + - 4.514076312046376 + - 4.505670042740828 + - 4.51187776283644 + - 4.521641156793135 + - 4.514433272401664 + - 4.505507994496044 + - 4.512847887660115 + - 4.510571131799558 + - !!python/tuple + - 4.006364737450294 + - 4.019607574904594 + - 4.064842753348742 + - 4.0085290695022495 + - 4.0285796712013555 + - 4.020467550197737 + - 4.008204317884645 + - 4.017249217718867 + - 4.031597931670857 + - 4.020990800979897 + - 4.007969066864232 + - 4.01866838765322 + - 4.015340159284991 + - !!python/tuple + - 3.5091328291693316 + - 3.5283222809664183 + - 3.595430408921221 + - 3.5122522110290797 + - 3.5414547243987955 + - 3.5295766264758157 + - 3.5117837228234046 + - 3.5248873810298624 + - 3.5458945708004683 + - 3.5303402987202173 + - 3.511444443876552 + - 3.526953497577345 + - 3.5221122862963203 + - !!python/tuple + - 3.013087551079512 + - 3.0409325573154384 + - 3.14106342572645 + - 3.0175831887137714 + - 3.060226947846589 + - 3.0427676210225933 + - 3.0169072056144994 + - 3.035916348945332 + - 3.066788983824372 + - 3.0438856867912483 + - 3.0164178343495807 + - 3.0389320528129997 + - 3.0318734766106528 + - !!python/tuple + - 2.5188674291409434 + - 2.559674925468602 + - 2.7111176597062836 + - 2.52539787932864 + - 2.5883899080486086 + - 2.5623920437421006 + - 2.5244143988276884 + - 2.55226383345329 + - 2.5982235015598794 + - 2.5640490453937774 + - 2.5237027533838736 + - 2.556716433758118 + - 2.546308729193666 + - !!python/tuple + - 2.027633733689205 + - 2.0887465202544204 + - 2.3223837275069665 + - 2.0373005903400827 + - 2.132545596698203 + - 2.0928677616768288 + - 2.0358416652246363 + - 2.077534453267823 + - 2.1476494007756983 + - 2.0953836998971362 + - 2.034786664039424 + - 2.084265504010903 + - 2.068557800982221 + - !!python/tuple + - 1.5417643326453256 + - 1.6369833870225408 + - 1.9838873107847736 + - 1.5571518761498921 + - 1.706431424409952 + - 1.638641245132005 + - 1.5554579955842158 + - 1.6193124654353914 + - 1.7389916296653296 + - 1.6474715595637028 + - 1.5527363282892277 + - 1.6299134287358674 + - 1.6052154572684545 + - !!python/tuple + - 1.0671150222293053 + - 1.225845321996024 + - 1.739139137110346 + - 1.0942828430704041 + - 1.2908584098398466 + - 1.221729109235513 + - 1.1021774430616254 + - 1.196254337566296 + - 1.4076097633944555 + - 1.2433729646941374 + - 1.0851577649588733 + - 1.2140131262409528 + - 1.1726271545967786 + - !!python/tuple + - 1.0181274429125846 + - 1.4683956046168236 + - 1.8577727102646402 + - 1.1169205248004772 + - 1.5429938673950088 + - 1.4498432340888685 + - 1.1138135943280534 + - 1.397201155020808 + - 1.8792201847153627 + - 1.5254452803880196 + - 1.0801818672290606 + - 1.4403872278933632 + - 1.354909280002075 + - !!python/tuple + - 1.0388932499212902 + - 1.6649187540238122 + - 2.2758250325410163 + - 1.1536558818831844 + - 1.5615382867512784 + - 1.4921390352905815 + - 1.28918861806577 + - 1.548574296485713 + - 2.3145953965652772 + - 1.7291770110311524 + - 1.0937038301216013 + - 1.607601109098684 + - 1.562653308975186 + - !!python/tuple + - 0.99082152645873 + - 1.622948063747163 + - 2.2407818267357884 + - 1.1955468342865276 + - 1.5955111422870416 + - 1.5920891917085769 + - 1.2271461754484192 + - 1.5608258165749618 + - 2.0509464562577775 + - 1.6920292284608682 + - 1.114626955046202 + - 1.6107898276195098 + - 1.499252141773969 + - !!python/tuple + - 0.9817793328529272 + - 1.6690186301725167 + - 2.2563604661131684 + - 1.1579837881480537 + - 1.5630530184026257 + - 1.4905082954868654 + - 1.293434379594591 + - 1.563230377045683 + - 2.3322409185771686 + - 1.7658618635255146 + - 1.0503220497392176 + - 1.625657907878719 + - 1.6067430910933915 + - !!python/tuple + - 0.9455002289982296 + - 1.6339556656807337 + - 2.2458574631850645 + - 1.1210111186622287 + - 1.5466863358732088 + - 1.4732393279400555 + - 1.2540060747006452 + - 1.525337370739064 + - 2.2934165868192906 + - 1.7286887913399813 + - 1.0150565423452622 + - 1.587624499648493 + - 1.5713779352210753 + - !!python/tuple + - 0.9595309061395849 + - 1.611961892029991 + - 2.274314610175626 + - 1.14947111005753 + - 1.462161321844675 + - 1.5596470535467 + - 1.2089983862165283 + - 1.529355268708647 + - 2.0794756792006157 + - 1.6704873134101266 + - 1.0751477199521373 + - 1.5819055524184842 + - 1.4766052110531913 + - !!python/tuple + - 0.957377320096544 + - 1.6446325215093243 + - 2.247809944232945 + - 1.1482884522127095 + - 1.4531463459884066 + - 1.5009958298766144 + - 1.2942271984301827 + - 1.5452311588113068 + - 2.2438069968130456 + - 1.7349406990171827 + - 1.0389296017085363 + - 1.6056930798427878 + - 1.5659268402836664 + - !!python/tuple + - 0.9443213254432716 + - 1.6318170117355955 + - 2.2493875786029487 + - 1.134658884308749 + - 1.4463237897949481 + - 1.4994053384452057 + - 1.283118915230433 + - 1.5312630215040972 + - 2.243194620773933 + - 1.7222989840761276 + - 1.027448918766551 + - 1.5916945984713764 + - 1.5556209617753534 + - !!python/tuple + - 0.9360477211267395 + - 1.6016357526132536 + - 2.2662651894835997 + - 1.1211399525868069 + - 1.487923001535664 + - 1.5355329888101668 + - 1.214874179556035 + - 1.5093004874964238 + - 2.17167906467009 + - 1.6719644005439693 + - 1.0425962092725467 + - 1.5647518684180566 + - 1.4942789540670411 + - !!python/tuple + - 0.9446318046223444 + - 1.6079457546037543 + - 2.2652268880940167 + - 1.1296397014888326 + - 1.4909129765855098 + - 1.5387232900638192 + - 1.2140865714843205 + - 1.517258625696928 + - 2.1618643785836276 + - 1.6757774044715978 + - 1.0517768311606064 + - 1.5722358727335035 + - 1.4947485954364028 + - !!python/tuple + - 0.953256103729128 + - 1.6154500203587168 + - 2.263338053874884 + - 1.138507360076904 + - 1.4904694657245277 + - 1.5399425576738657 + - 1.2159811923986261 + - 1.5259934564203215 + - 2.1543010296193734 + - 1.6817053747170567 + - 1.0598480138951814 + - 1.5807404338601616 + - 1.497770045221073 + - !!python/tuple + - 0.9610446434436972 + - 1.6233141837383964 + - 2.2609574182763397 + - 1.1468460385140216 + - 1.4869740901625284 + - 1.5392300233767342 + - 1.220163031990547 + - 1.5345829740721728 + - 2.14932853263788 + - 1.68900799623207 + - 1.066086761291342 + - 1.58934939753727 + - 1.5028433324587516 + - !!python/tuple + - 0.9673339522863994 + - 1.6444797909370503 + - 2.254826705763733 + - 1.1586568800017591 + - 1.4591294329361453 + - 1.5170419924501182 + - 1.2598838629748141 + - 1.5512379820933484 + - 2.168055807251532 + - 1.7221241377216985 + - 1.057303150268104 + - 1.6091514648201706 + - 1.5397642632477786 + - !!python/tuple + - 0.9624286283070783 + - 1.641811878567801 + - 2.2561989850084387 + - 1.1542118549708054 + - 1.4609108580826784 + - 1.5150052583565898 + - 1.2638145042458984 + - 1.5473251952483598 + - 2.175291507786967 + - 1.7219215173184343 + - 1.051396671277373 + - 1.605721752037151 + - 1.5420266343650322 + - !!python/tuple + - 0.9570282587911374 + - 1.637922437744093 + - 2.2578633468327878 + - 1.1489648237842307 + - 1.4645243482362034 + - 1.514295734403062 + - 1.2661080134240008 + - 1.5423810628364085 + - 2.1822254267573795 + - 1.7200022837072082 + - 1.0458451934639397 + - 1.6011110152826413 + - 1.5425476106999876 + - !!python/tuple + - 0.9517316948097714 + - 1.6332975636998188 + - 2.259529849809485 + - 1.1435006344891228 + - 1.4691454971619091 + - 1.5148814282508145 + - 1.2667400230414387 + - 1.5369826906168687 + - 2.1883783592401675 + - 1.7166956474795465 + - 1.0412225548907839 + - 1.5958720511834035 + - 1.541440598656047 + - !!python/tuple + - 0.9433628650559104 + - 1.6153982125020538 + - 2.26030753766352 + - 1.130272630471851 + - 1.4777640554382117 + - 1.5292678753916784 + - 1.2475867633539452 + - 1.521076621978319 + - 2.1962953714102973 + - 1.6928453591189918 + - 1.0439150235519317 + - 1.5780435054666437 + - 1.5190932842787084 + - !!python/tuple + - 0.9462140450940696 + - 1.6163111494761802 + - 2.259139574496821 + - 1.1325183835782984 + - 1.4745951948432545 + - 1.530339182653051 + - 1.2437075520217014 + - 1.5228878617670891 + - 2.1931195520953604 + - 1.6916960474654172 + - 1.047671916531975 + - 1.5794367370630618 + - 1.5163412718308205 + - !!python/tuple + - 0.9495527696152947 + - 1.6182158033232987 + - 2.2580405456614683 + - 1.1355277602790534 + - 1.471250636159735 + - 1.53052802642484 + - 1.2405095813003728 + - 1.5256022515424323 + - 2.1893010583131605 + - 1.6917679674883772 + - 1.0512749107320571 + - 1.5818289580502805 + - 1.5146195628353651 + - !!python/tuple + - 0.9529628681718663 + - 1.6208212019576493 + - 2.2571855589352716 + - 1.1389093989250352 + - 1.4683698313111349 + - 1.5298912704023637 + - 1.2381969054982922 + - 1.5288482738073585 + - 2.1851853464627347 + - 1.6929422604862392 + - 1.0543279809274881 + - 1.5848764914860551 + - 1.5139965611110848 + - !!python/tuple + - 0.9578942073142885 + - 1.6334103382258331 + - 2.259796154352937 + - 1.1481937283856274 + - 1.4746054671292266 + - 1.5201167101368314 + - 1.2457971750359438 + - 1.539978138972651 + - 2.170450407861003 + - 1.7093664062898808 + - 1.0508176177454618 + - 1.5974636223787262 + - 1.5277732907075574 + - !!python/tuple + - 0.955832086814927 + - 1.6325123546417384 + - 2.2602570253911733 + - 1.1464965437776669 + - 1.4759440076048322 + - 1.5202660295490826 + - 1.2482652326452734 + - 1.5385051580666074 + - 2.1716256778687764 + - 1.7099056493427593 + - 1.0484935098307047 + - 1.5962534571267593 + - 1.5294610824549173 + - !!python/tuple + - 0.9536558294172487 + - 1.631072041468132 + - 2.2604364719665693 + - 1.1444473431447193 + - 1.4763915821847922 + - 1.5209279327592906 + - 1.250426855661905 + - 1.5365840178659993 + - 2.173407999354894 + - 1.7096922000999994 + - 1.046509782307592 + - 1.5945150536197563 + - 1.5305115524216981 + - !!python/tuple + - 0.951623944458305 + - 1.6292936203871227 + - 2.2603295034006132 + - 1.1423008240080377 + - 1.4759435756845118 + - 1.521965997763305 + - 1.2521251246526637 + - 1.5344644500574525 + - 2.175597738684451 + - 1.7088169161944333 + - 1.0450726798417944 + - 1.5924836400334392 + - 1.5308825100958157 + - !!python/tuple + - 0.9500691812227055 + - 1.6224159544754142 + - 2.257827885562922 + - 1.1375831365922682 + - 1.4689603439245678 + - 1.5268286333156236 + - 1.2506842728778609 + - 1.5286560386255654 + - 2.1864005431260103 + - 1.6995520990975626 + - 1.048889166240012 + - 1.5856892730813381 + - 1.523750070272431 + - !!python/tuple + - 0.9513865350235782 + - 1.6228525789376265 + - 2.2578436662161194 + - 1.1385808931068209 + - 1.4693680906550448 + - 1.5264957167488649 + - 1.2491764605221714 + - 1.529494848991362 + - 2.186629700591132 + - 1.6989205888566348 + - 1.0503632406682144 + - 1.5863272197924894 + - 1.5224278777885107 + - !!python/tuple + - 0.9527802688754557 + - 1.6236761834504931 + - 2.258043328417672 + - 1.1398455521861504 + - 1.4702741567520279 + - 1.52587625164813 + - 1.247660637714964 + - 1.530662092793088 + - 2.186338877301859 + - 1.698782130258936 + - 1.0515859329670514 + - 1.587348509009756 + - 1.5214465528789358 + - !!python/tuple + - 0.9540769568656233 + - 1.6247578438596022 + - 2.258373995925129 + - 1.1412075452830848 + - 1.4714477260389653 + - 1.5250825326549045 + - 1.2462727150955353 + - 1.5319938613522952 + - 2.1856001365493674 + - 1.699105823286104 + - 1.0524299323544015 + - 1.588601932586749 + - 1.5208739984157205 + - !!python/tuple + - 0.954913176542248 + - 1.6293319813943092 + - 2.2594874031172507 + - 1.144421863641077 + - 1.4730350731527246 + - 1.5226339291305955 + - 1.2445833265523485 + - 1.5358920223338648 + - 2.178228304622974 + - 1.704863330428949 + - 1.049565102500945 + - 1.5931605081017128 + - 1.5244258810898785 + - !!python/tuple + - 0.9540532241670768 + - 1.6290921171148147 + - 2.2592677481426304 + - 1.1438038179210046 + - 1.4721753436729594 + - 1.523018232779415 + - 1.2453525361942661 + - 1.535378004484609 + - 2.1775388626998664 + - 1.7053814773993616 + - 1.0486459509391417 + - 1.5927907546618914 + - 1.525345124303783 + - !!python/tuple + - 0.9531580942656922 + - 1.628593579845454 + - 2.2589972724728478 + - 1.143005496702835 + - 1.4713653361395924 + - 1.5235347703602018 + - 1.2462430235284383 + - 1.5346443301886628 + - 2.177178902047385 + - 1.7055876098666458 + - 1.047922015895091 + - 1.5921633919047857 + - 1.5260917565299805 + - !!python/tuple + - 0.9523412349626408 + - 1.6279182267262218 + - 2.2587309327701366 + - 1.1421373815019333 + - 1.4707707721578194 + - 1.5240967210658831 + - 1.2471606904969463 + - 1.533797545718426 + - 2.1771487870415873 + - 1.705488241899158 + - 1.0474682332970682 + - 1.5913752597226387 + - 1.5266039974542696 + - !!python/tuple + - 0.9520910757904042 + - 1.624988389432535 + - 2.2587893306931153 + - 1.140115134247221 + - 1.4726724474875539 + - 1.5249823499104034 + - 1.2495227986875117 + - 1.5313383628253687 + - 2.181055345601758 + - 1.7019383308945535 + - 1.0497144340960651 + - 1.5884559297534837 + - 1.5249145873997711 + - !!python/tuple + - 0.952663568544719 + - 1.625147208270516 + - 2.258977624116377 + - 1.140525284026902 + - 1.4730134880584802 + - 1.5246383478626 + - 1.2492024257298466 + - 1.5316829922906765 + - 2.181715774565694 + - 1.7015639750993703 + - 1.0502616916420648 + - 1.588700201512929 + - 1.5243081105523266 + - !!python/tuple + - 0.953235285234855 + - 1.6254731126560498 + - 2.2591288268846323 + - 1.1410465076447855 + - 1.473105568789507 + - 1.5242616643781624 + - 1.2487463897453166 + - 1.532165132618499 + - 2.182212914443111 + - 1.7013876089105189 + - 1.0506522019680289 + - 1.589109985140346 + - 1.5237855198923895 + - !!python/tuple + - 0.9537333849162871 + - 1.625911171009669 + - 2.2592173718695143 + - 1.1416047245074774 + - 1.472951991348248 + - 1.5239114096309907 + - 1.2482108917001535 + - 1.5327130669538125 + - 2.182517985732418 + - 1.7014107998664352 + - 1.0508490056855981 + - 1.589620264000718 + - 1.5233955052393426 + - !!python/tuple + - 0.9539280337129363 + - 1.6277082509515914 + - 2.2588026898236695 + - 1.1429338073961048 + - 1.4712498334770345 + - 1.5236899840545262 + - 1.2461874496955718 + - 1.5342795953550497 + - 2.181436757334846 + - 1.7032632927064473 + - 1.0494891318309871 + - 1.5914420846155908 + - 1.52379946092958 + - !!python/tuple + - 0.9535787757939584 + - 1.6277149513718194 + - 2.2586982715843935 + - 1.1427549629493123 + - 1.4712744022402202 + - 1.5239253495783773 + - 1.246145768679808 + - 1.534153938277539 + - 2.1809425849883164 + - 1.7036190201582346 + - 1.049098681478444 + - 1.5913970630630465 + - 1.5241868092552362 + - !!python/tuple + - 0.9531996507978949 + - 1.6275910052576095 + - 2.258639641372868 + - 1.1424691113932648 + - 1.4714623062071654 + - 1.5241790885671838 + - 1.2462376393477994 + - 1.533906777125034 + - 2.1804645720424203 + - 1.7038667283721438 + - 1.0487975612545422 + - 1.591216579472582 + - 1.52457605330348 + - !!python/tuple + - 0.952843125632731 + - 1.6273639780353921 + - 2.258634090597356 + - 1.1421220491172956 + - 1.4717561680866542 + - 1.5244106084635125 + - 1.2464414572554694 + - 1.533580417796595 + - 2.1800448422774474 + - 1.7039876615068508 + - 1.0486185062664315 + - 1.5909356824656902 + - 1.5249237314799 + - !!python/tuple + - 0.9525540002016274 + - 1.6270716943796755 + - 2.258677739985213 + - 1.141763123022173 + - 1.4720800778524041 + - 1.5245864233263062 + - 1.2467265143111257 + - 1.5332232696231582 + - 2.179716401876785 + - 1.7039795672198663 + - 1.0485746121182398 + - 1.5905987036320326 + - 1.5251949769578044 + - !!python/tuple + - 0.9524670332112873 + - 1.6260558156904092 + - 2.259015236385587 + - 1.1409863441736872 + - 1.472482355522639 + - 1.5245025373126315 + - 1.2479639190497782 + - 1.5323216248381688 + - 2.179565744968814 + - 1.703079582256503 + - 1.0493911967360108 + - 1.5895586303622073 + - 1.5252494948453355 + - !!python/tuple + - 0.9526754599954654 + - 1.6259859587923526 + - 2.2590507374428146 + - 1.1410441856014437 + - 1.4722946205579315 + - 1.524338517878913 + - 1.2481447701700512 + - 1.5323404702312897 + - 2.179781168801713 + - 1.7028065801594943 + - 1.049660008738488 + - 1.589518036885672 + - 1.5250468663539547 + - !!python/tuple + - 0.9529197575759835 + - 1.6260089003387783 + - 2.259048040609152 + - 1.1411887582890707 + - 1.472061423702982 + - 1.524167795445629 + - 1.2482386893666766 + - 1.532453288942249 + - 2.180052078349652 + - 1.702581852745071 + - 1.0498770989256867 + - 1.589576887849192 + - 1.524806257683299 + - !!python/tuple + - 0.9531636142539158 + - 1.62611299084431 + - 2.2590112860393843 + - 1.1413932508070699 + - 1.471840569923927 + - 1.5240178549452474 + - 1.2482443641267829 + - 1.5326367006231036 + - 2.1803478183645324 + - 1.7024278307587892 + - 1.0500169557168204 + - 1.5897183195182207 + - 1.5245586979448564 + - !!python/tuple + - 0.9533741108121375 + - 1.6262773013585357 + - 2.2589511598673764 + - 1.1416255661905326 + - 1.4716817828501076 + - 1.5239104112019912 + - 1.2481695227294844 + - 1.5328603525300697 + - 2.1806382044297616 + - 1.7023564136405767 + - 1.0500672225755954 + - 1.5899164581492553 + - 1.524333197500689 + - !!python/tuple + - 0.9535258633257112 + - 1.62647511643593 + - 2.258882141459008 + - 1.1418529460067397 + - 1.4716159384299092 + - 1.5238584852945989 + - 1.248029355487383 + - 1.5330914618449771 + - 2.1808963182723913 + - 1.7023684581905802 + - 1.0500292582406414 + - 1.5901405296231694 + - 1.5241536060160237 + - !!python/tuple + - 0.9536037844366638 + - 1.6266778687413062 + - 2.258819210487251 + - 1.1420462778952525 + - 1.471649563903451 + - 1.523865103702688 + - 1.2478443187356614 + - 1.5332992805855032 + - 2.181100753931858 + - 1.7024546449117843 + - 1.049916730793061 + - 1.590359244618188 + - 1.5240363239270436 + - !!python/tuple + - 0.953604210973625 + - 1.6268589719645077 + - 2.2587747312776063 + - 1.1421835534389637 + - 1.47176546190479 + - 1.523923696465434 + - 1.2476375918718812 + - 1.533458909083147 + - 2.181237149885509 + - 1.702597505325742 + - 1.049752605889691 + - 1.5905448706714194 + - 1.5239890631804844 + - !!python/tuple + - 0.953534386516767 + - 1.6269970671686587 + - 2.258756139497957 + - 1.1422521005077715 + - 1.4719288169776417 + - 1.5240199926036235 + - 1.247432471502254 + - 1.5335540178046345 + - 2.181298923365406 + - 1.7027742677571969 + - 1.0495650816040876 + - 1.5906764926596804 + - 1.524010717254821 + - !!python/tuple + - 0.9534105078474174 + - 1.627078314241382 + - 2.258764842244736 + - 1.142249405782342 + - 1.4720969002417374 + - 1.5241349859951194 + - 1.247249971921358 + - 1.5335782167151766 + - 2.1812872050549674 + - 1.7029601055962718 + - 1.0493831255110515 + - 1.5907421103932284 + - 1.5240922664665142 + - !!python/tuple + - 0.9532547185812754 + - 1.627097514162399 + - 2.258796459469154 + - 1.1421825409422734 + - 1.4722297913535594 + - 1.5242484063390358 + - 1.2471068606331945 + - 1.5335350087725625 + - 2.18121004751178 + - 1.703131356387215 + - 1.049232276304173 + - 1.5907394015807208 + - 1.5242185285685323 + - !!python/tuple + - 0.9530915439608922 + - 1.6270580160922101 + - 2.258842246191467 + - 1.1420663847294994 + - 1.4722995110676393 + - 1.524342094229696 + - 1.2470142965752817 + - 1.5334364527326823 + - 2.1810810428078935 + - 1.7032683195112372 + - 1.0491312866063862 + - 1.5906751644179151 + - 1.5243704798033144 + - !!python/tuple + - 0.9529442985108036 + - 1.6269705232695548 + - 2.258891301806571 + - 1.1419209726477086 + - 1.472295550924703 + - 1.5244027442889092 + - 1.2469771642431482 + - 1.5333008174172498 + - 2.180917529506371 + - 1.7033573249386522 + - 1.0490900218094084 + - 1.5905636225590978 + - 1.5245278261922495 + - !!python/tuple + - 0.9528319625451888 + - 1.6268510441083752 + - 2.2589330399097536 + - 1.1417683926691844 + - 1.4722258028330846 + - 1.5244236267192963 + - 1.2469941174493866 + - 1.5331496180360664 + - 2.1807385935564096 + - 1.7033918808760942 + - 1.0491088182764499 + - 1.5904239068434485 + - 1.5246715014958707 + - !!python/tuple + - 0.9527669227665408 + - 1.626718325471207 + - 2.258959379915778 + - 1.1416296721839865 + - 1.472113055568863 + - 1.524405094846417 + - 1.24705827078916 + - 1.5330044751988052 + - 2.180563071234425 + - 1.7033728371767811 + - 1.0491792765975654 + - 1.5902771095106936 + - 1.5247858038880346 + - !!python/tuple + - 0.9527538231299574 + - 1.6265911456953064 + - 2.258966223646874 + - 1.1415220689352887 + - 1.4719882557677588 + - 1.5243538982130747 + - 1.2471584131112647 + - 1.5328842265659282 + - 2.180407745966817 + - 1.7033076272643672 + - 1.0492862570442751 + - 1.590143331269046 + - 1.5248599502325615 + - !!python/tuple + - 0.9527895979905997 + - 1.6264858339021406 + - 2.258953965770721 + - 1.1414570943101738 + - 1.4718824007369853 + - 1.5242815125169846 + - 1.2472805717442992 + - 1.5328026548388092 + - 2.180285897511311 + - 1.7032087592352425 + - 1.0494106857334147 + - 1.5900391101341462 + - 1.5248889141309157 + - !!python/tuple + - 0.9528645867416191 + - 1.6264143241765692 + - 2.258927010923711 + - 1.141439474902511 + - 1.471819109936834 + - 1.524201840239734 + - 1.247409732705054 + - 1.5327670859213312 + - 2.180206315743055 + - 1.703091805362593 + - 1.0495326922362518 + - 1.5899755409429488 + - 1.524873509491136 + - !!python/tuple + - 0.9529644830619185 + - 1.6263829587904746 + - 2.2588924824833345 + - 1.1414671162395245 + - 1.471809601455342 + - 1.5241287101818182 + - 1.2475315215429814 + - 1.5327779748018822 + - 2.1801728374173703 + - 1.7029731813147169 + - 1.049634590374083 + - 1.589957279219342 + - 1.5248197733963813 + - !!python/tuple + - 0.9530727725134283 + - 1.626392138482826 + - 2.2588584644392 + - 1.1415319916216824 + - 1.4718510871826984 + - 1.524073603251626 + - 1.2476336700058503 + - 1.532829454112098 + - 2.1801844085093887 + - 1.7028680095858146 + - 1.0497032783275233 + - 1.5899824900846242 + - 1.5247377802340654 + - !!python/tuple + - 0.9531732709127452 + - 1.626436796859407 + - 2.2588321897304797 + - 1.1416217588368747 + - 1.4719286932386642 + - 1.5240439610690366 + - 1.247707131247715 + - 1.5329106914936321 + - 2.1802356227300463 + - 1.7027883281624199 + - 1.0497317556158448 + - 1.5900436712787478 + - 1.524640075557717 + - !!python/tuple + - 0.9532523940302194 + - 1.626507567015798 + - 2.258818566732191 + - 1.1417218236765352 + - 1.4720201462292062 + - 1.5240423095345612 + - 1.2477467552454702 + - 1.5330078038820298 + - 2.1803176435752705 + - 1.7027418418094653 + - 1.049719609725546 + - 1.590129167061582 + - 1.5245399481836757 + - !!python/tuple + - 0.9533008588598114 + - 1.62659242566003 + - 2.2588193317462415 + - 1.1418175309158474 + - 1.4721018526397691 + - 1.524066275712039 + - 1.2477514901882614 + - 1.5331060211109286 + - 2.1804193865641874 + - 1.7027313294343576 + - 1.0496724884943496 + - 1.590225110989309 + - 1.5244497610269483 + - !!python/tuple + - 0.9533146231548352 + - 1.626678552848213 + - 2.258832957647837 + - 1.1418961725012968 + - 1.4721547711401721 + - 1.5241094209672215 + - 1.2477241287061165 + - 1.5331917824043224 + - 2.1805288223808863 + - 1.702754728730606 + - 1.0496007216295271 + - 1.590317498761355 + - 1.5243795368423125 + - !!python/tuple + - 0.9532949945754708 + - 1.6267541377280583 + - 2.2588552752163458 + - 1.1419485538344083 + - 1.472168661083673 + - 1.5241626826815988 + - 1.2476706644839521 + - 1.5332544847983614 + - 2.1806342609555065 + - 1.7028058311324237 + - 1.0495173663371573 + - 1.5903940993248187 + - 1.5243359489693271 + - !!python/tuple + - 0.9532479644926183 + - 1.62680989031772 + - 2.258880612945875 + - 1.141969941449148 + - 1.4721438056227614 + - 1.5242161314096423 + - 1.2475993607948777 + - 1.5332876736769139 + - 2.1807254899646424 + - 1.7028754472084882 + - 1.0494360148665078 + - 1.590445958660883 + - 1.5243218063141735 + - !!python/tuple + - 0.9531829271510801 + - 1.6268400791862074 + - 2.2589031643570316 + - 1.141960314949937 + - 1.4720900008149846 + - 1.5242607211942512 + - 1.2475196549364707 + - 1.5332895595744864 + - 2.180794666282013 + - 1.702952853429684 + - 1.0493687103521476 + - 1.5904683265191568 + - 1.5243360545057345 + - !!python/tuple + - 0.9531110194064983 + - 1.6268429942596898 + - 2.258918266026159 + - 1.1419239477670278 + - 1.4720232895996506 + - 1.5242897384480802 + - 1.2474410301707337 + - 1.533262847406938 + - 2.1808368920744123 + - 1.7030273104361036 + - 1.0493242740752327 + - 1.5904609289657416 + - 1.524374250161641 + - !!python/tuple + - 0.9530433516950254 + - 1.6268208204659877 + - 2.2589233149008767 + - 1.1418684312179825 + - 1.4719614350764543 + - 1.5242997300804755 + - 1.2473719798187324 + - 1.5332139598087677 + - 2.1808504445069223 + - 1.7030894510116767 + - 1.0493072618734085 + - 1.5904276050246355 + - 1.5244294104302851 + - !!python/tuple + - 0.9529893951160162 + - 1.626778989293599 + - 2.2589181545585357 + - 1.141803323445497 + - 1.4719193586488677 + - 1.5242907977891598 + - 1.247319168368139 + - 1.5331518128929384 + - 2.180836665331917 + - 1.703132369559393 + - 1.0493176553768186 + - 1.5903754108423624 + - 1.5244931015715995 + - !!python/tuple + - 0.9529557460923848 + - 1.626725141051127 + - 2.2589048904311704 + - 1.1417386418138153 + - 1.4719056792966576 + - 1.5242662621857417 + - 1.247286864777568 + - 1.5330863516237263 + - 2.1807995502766437 + - 1.7031522974792332 + - 1.0493512738211423 + - 1.5903133590809713 + - 1.524556611910234 + - !!python/tuple + - 0.9529454176907638 + - 1.6266678730539021 + - 2.258887222815585 + - 1.1416834215140894 + - 1.4719211251482078 + - 1.5242318071533203 + - 1.2472766874664156 + - 1.5330270685675749 + - 2.180745105075802 + - 1.7031488120844809 + - 1.0494007834211976 + - 1.590250997621488 + - 1.524612056804981 + - !!python/tuple + - 0.9529577177563985 + - 1.6266154641728023 + - 2.2588694855343086 + - 1.1416445361959493 + - 1.4719590581130046 + - 1.5241942943282485 + - 1.2472876630815968 + - 1.5329817141470348 + - 2.1806805530790077 + - 1.7031245915110982 + - 1.0494570998238348 + - 1.5901970373110577 + - 1.5246532843714906 + - !!python/tuple + - 0.9529886827950205 + - 1.6265747540948126 + - 2.2588556278651084 + - 1.141625924239168 + - 1.4720078020397471 + - 1.5241604785077898 + - 1.2473165663073345 + - 1.532955363105465 + - 2.1806134874824434 + - 1.7030847860129785 + - 1.049510935691413 + - 1.5901582148686024 + - 1.524676486388712 + - !!python/tuple + - 0.9530319568321263 + - 1.626550319883044 + - 2.258848370557581 + - 1.1416282957970911 + - 1.4720540357448424 + - 1.5241358530595688 + - 1.247358479461941 + - 1.532949938682332 + - 2.1805510593260697 + - 1.7030361201997084 + - 1.0495542438033216 + - 1.5901385294919617 + - 1.5246804634524815 + - !!python/tuple + - 0.9530799474959807 + - 1.6265440396063275 + - 2.2588487091869656 + - 1.1416493217722736 + - 1.4720863043007992 + - 1.5241238134849837 + - 1.2474074911720998 + - 1.532964223279028 + - 2.1804992813894537 + - 1.7029858665543773 + - 1.0495813430376033 + - 1.5901389284619059 + - 1.5246665407308153 + - !!python/tuple + - 0.9531250642107897 + - 1.626555071505562 + - 2.2588558464171666 + - 1.1416842373799496 + - 1.472097750694291 + - 1.5241252570673152 + - 1.2474574445514808 + - 1.5329943131666124 + - 2.1804625097816457 + - 1.7029408360316765 + - 1.0495895812291756 + - 1.5901574480741445 + - 1.5246381745556572 + - !!python/tuple + - 0.9531608474411267 + - 1.626580216595675 + - 2.2588675320475904 + - 1.141726739392641 + - 1.4720874422444383 + - 1.5241386513159376 + - 1.247502647213044 + - 1.5330344151348745 + - 2.180443141749886 + - 1.7029065174760492 + - 1.049579472414525 + - 1.5901897516935104 + - 1.5246003254099867 + - !!python/tuple + - 0.9531828302027637 + - 1.6266145812791726 + - 2.258880699898829 + - 1.1417700241735909 + - 1.472060074737862 + - 1.52416051965659 + - 1.2475384670293745 + - 1.5330778426238003 + - 2.1804415427764026 + - 1.7028864672770885 + - 1.049554332150389 + - 1.590229955458849 + - 1.5245586959459676 + - !!python/tuple + - 0.9531890263320898 + - 1.626652421069983 + - 2.258892232893863 + - 1.1418078061575476 + - 1.4720242676109654 + - 1.5241862242019621 + - 1.2475617567175818 + - 1.5331180521541625 + - 2.180456191190024 + - 1.7028820092682364 + - 1.0495195100674997 + - 1.590271600487362 + - 1.5245189415811664 + - !!python/tuple + - 0.953129152690464 + - 1.6267345827839779 + - 2.2588984151741545 + - 1.141849034887869 + - 1.4719573355535065 + - 1.524241410589693 + - 1.2475504109831335 + - 1.5331737888291008 + - 2.180561877923015 + - 1.7029444279591994 + - 1.0494192905959838 + - 1.5903512146934378 + - 1.5244529408855756 + - !!python/tuple + - 0.9530969666606008 + - 1.6267405427023243 + - 2.2588910283016017 + - 1.1418361413047429 + - 1.4719649190918536 + - 1.524243164458938 + - 1.2475252190082309 + - 1.5331655015119652 + - 2.180602454523392 + - 1.7029774292584827 + - 1.049404055915336 + - 1.590352776504644 + - 1.5244549999647983 + - !!python/tuple + - 0.9530671731927749 + - 1.626734723581166 + - 2.258881638067562 + - 1.14181357486081 + - 1.4719851936327002 + - 1.5242360966534376 + - 1.2474948433834334 + - 1.5331462919810428 + - 2.18063829081971 + - 1.7030086859180118 + - 1.0494018107865652 + - 1.5903419169046358 + - 1.5244680440005123 + - !!python/tuple + - 0.9530440886649294 + - 1.6267190841262398 + - 2.2588725922197175 + - 1.1417855467526767 + - 1.4720116810965271 + - 1.5242223054763073 + - 1.247463258924043 + - 1.5331199989515647 + - 2.180666030956771 + - 1.7030341183795135 + - 1.0494116750138063 + - 1.590321384766381 + - 1.5244893404383804 + - !!python/tuple + - 0.9530306049648903 + - 1.626696816513945 + - 2.258865941513288 + - 1.1417566750993857 + - 1.472036886774496 + - 1.5242048936493555 + - 1.2474342106772687 + - 1.53309113855782 + - 2.1806834909620085 + - 1.7030508175155812 + - 1.0494309272801006 + - 1.5902950709781556 + - 1.5245153420063928 + - !!python/tuple + - 0.9531121051940131 + - 1.626614985545568 + - 2.258887418931268 + - 1.1417267314349575 + - 1.4720005667959841 + - 1.5241732471306164 + - 1.2474160375433105 + - 1.533044605102081 + - 2.1806005809258 + - 1.7029805640442979 + - 1.0495254938987733 + - 1.5902184372274506 + - 1.5245937742046582 + - !!python/tuple + - 0.953126479746127 + - 1.6266251813967867 + - 2.2588904555901257 + - 1.1417454641475018 + - 1.4719882509383253 + - 1.524185024514103 + - 1.2474351469848124 + - 1.5330621871204189 + - 2.1805768501856826 + - 1.7029625372592332 + - 1.0495162763760277 + - 1.5902319565155294 + - 1.5245823334975919 + - !!python/tuple + - 0.9531340664297221 + - 1.6266399192130219 + - 2.2588905339825778 + - 1.1417647072966202 + - 1.4719847102543577 + - 1.5241973874002812 + - 1.2474551379432754 + - 1.533081450388287 + - 2.1805574276523547 + - 1.7029498611576734 + - 1.049501520555626 + - 1.590249438555613 + - 1.52456660151781 + - !!python/tuple + - 0.9531343250110428 + - 1.6266565876298171 + - 2.258887917766054 + - 1.1417815312490749 + - 1.471990052540318 + - 1.5242080196606032 + - 1.2474735738964606 + - 1.533099352592899 + - 2.180544020718228 + - 1.7029437930167228 + - 1.0494841561581723 + - 1.590267915902437 + - 1.5245490758000024 + - !!python/tuple + - 0.9530755438957554 + - 1.6266940012626305 + - 2.2588707420113794 + - 1.141782746916903 + - 1.4720400691866575 + - 1.5242021694123657 + - 1.247494583605218 + - 1.5331106372566672 + - 2.1805710875613795 + - 1.7029907452747863 + - 1.0494458657648915 + - 1.5902998217535842 + - 1.5245059551549012 + - !!python/tuple + - 0.9530670354559134 + - 1.6266870098648092 + - 2.2588722133193837 + - 1.141770072306299 + - 1.4720352571848394 + - 1.5241935161252347 + - 1.2474844920268866 + - 1.5330986612761635 + - 2.180587085442624 + - 1.703003172439068 + - 1.0494540107216623 + - 1.5902905863614984 + - 1.5245118656182233 + - !!python/tuple + - 0.9530633517615636 + - 1.6266770376493767 + - 2.258875207372376 + - 1.1417572691542235 + - 1.472025866091289 + - 1.524185897949198 + - 1.2474722694377487 + - 1.5330857613753472 + - 2.180602411391066 + - 1.7030122709396205 + - 1.0494651193010045 + - 1.590278792047269 + - 1.5245212170964402 + - !!python/tuple + - 0.953064620460527 + - 1.6266658730933716 + - 2.2588788583431265 + - 1.1417463055552182 + - 1.4720148897735525 + - 1.5241806371948543 + - 1.247459586920338 + - 1.5330739950049543 + - 2.180615424046421 + - 1.703017064269586 + - 1.0494770633995651 + - 1.59026646571343 + - 1.5245324141321897 + - !!python/tuple + - 0.9531101819126107 + - 1.6266473555545002 + - 2.2588798281606315 + - 1.1417568036870223 + - 1.472019620023841 + - 1.5242003159574429 + - 1.247436607908329 + - 1.5330773882013786 + - 2.1806119214759447 + - 1.7029792979310503 + - 1.04948827095947 + - 1.5902535025586813 + - 1.5245622944446093 + - !!python/tuple + - 0.9531114143569206 + - 1.626654229357097 + - 2.2588772873559675 + - 1.1417652701837897 + - 1.4720261309310452 + - 1.5242040749994634 + - 1.2474433249227408 + - 1.5330860178760688 + - 2.1806019554623592 + - 1.702973012134913 + - 1.0494801913649099 + - 1.590261555585954 + - 1.5245567580225132 + - !!python/tuple + - 0.9531093682900444 + - 1.626661733234534 + - 2.2588754526671844 + - 1.1417722595342705 + - 1.4720293786647267 + - 1.5242056486538398 + - 1.2474512479907673 + - 1.5330936330897076 + - 2.1805921854040733 + - 1.7029695633031106 + - 1.0494723055967938 + - 1.5902697628090674 + - 1.5245496600258899 + - !!python/tuple + - 0.95308132485749 + - 1.6266756933864976 + - 2.258880301767613 + - 1.1417683159506475 + - 1.472008778529646 + - 1.5241904512005156 + - 1.2474760940072671 + - 1.5330941526660502 + - 2.180574570150693 + - 1.7029885019772206 + - 1.0494667148917696 + - 1.5902806365042583 + - 1.5245259664461412 + - !!python/tuple + - 0.9530791670667231 + - 1.6266719987688876 + - 2.2588817257494176 + - 1.1417624248561462 + - 1.4720070974991801 + - 1.5241878437861156 + - 1.2474747070987493 + - 1.5330884206101458 + - 2.180578545768668 + - 1.7029941259982477 + - 1.0494720137252176 + - 1.5902759519002123 + - 1.5245274364745751 + - !!python/tuple + - 0.9530793580577327 + - 1.6266672079473625 + - 2.2588823673824643 + - 1.1417569020946063 + - 1.472008287177568 + - 1.5241867865942467 + - 1.2474714363262127 + - 1.533082695848596 + - 2.180584046512255 + - 1.702998339185332 + - 1.0494775971870651 + - 1.5902704246061539 + - 1.524530748792589 + - !!python/tuple + - 0.9530816411376011 + - 1.6266621767213922 + - 2.2588821411791966 + - 1.1417525891660016 + - 1.472011736023941 + - 1.5241873360908929 + - 1.247466870284612 + - 1.5330778858904512 + - 2.1805902900739995 + - 1.7030006537123574 + - 1.0494824743173194 + - 1.5902650034848596 + - 1.5245352606331033 + - !!python/tuple + - 0.9530854359483792 + - 1.62665771844105 + - 2.2588811869698753 + - 1.1417500564822283 + - 1.4720162496480083 + - 1.52418923157141 + - 1.2474617041752754 + - 1.533074667961218 + - 2.18059648147451 + - 1.703000908451403 + - 1.0494858690495223 + - 1.5902605318275114 + - 1.52454022043666 + - !!python/tuple + - 0.953100260544938 + - 1.626654577551711 + - 2.2588768146928726 + - 1.1417575822295702 + - 1.4720222582070337 + - 1.524199304127925 + - 1.2474475508830483 + - 1.5330799677529061 + - 2.1806090534073843 + - 1.702987986517772 + - 1.0494811488803928 + - 1.5902597896620614 + - 1.5245517695615471 + - !!python/tuple + - 0.9531009100594164 + - 1.626657337794102 + - 2.2588769442752734 + - 1.141761557494328 + - 1.4720193136550972 + - 1.524199946874738 + - 1.2474474622432363 + - 1.5330839191603458 + - 2.1806079773402565 + - 1.70298427017014 + - 1.0494772929452834 + - 1.5902631861078302 + - 1.5245510201817887 + - !!python/tuple + - 0.9531000000832102 + - 1.6266606808549058 + - 2.258877622228039 + - 1.1417650712673322 + - 1.4720158992574084 + - 1.5241994585571281 + - 1.247448786205943 + - 1.5330876461170746 + - 2.180605490756104 + - 1.7029815247213727 + - 1.0494737058394068 + - 1.5902669648440493 + - 1.5245489882169463 + - !!python/tuple + - 0.9530978340571292 + - 1.6266640171841689 + - 2.258878623304651 + - 1.1417675996128211 + - 1.4720130439149741 + - 1.5241980440778287 + - 1.2474512189990845 + - 1.5330905679011935 + - 2.1806020218728674 + - 1.7029800705526943 + - 1.0494709924054162 + - 1.5902704846646316 + - 1.5245460880348867 + - !!python/tuple + - 0.953094899563933 + - 1.6266668136449183 + - 2.25887966099013 + - 1.1417688272841577 + - 1.4720115186203238 + - 1.5241960722184489 + - 1.247454344321447 + - 1.5330922885407947 + - 2.1805980745049545 + - 1.7029800033147984 + - 1.0494695469552295 + - 1.5902732060137985 + - 1.5245428197116093 + - !!python/tuple + - 0.9530917687952309 + - 1.626668673613501 + - 2.2588804663106186 + - 1.141768679645094 + - 1.4720116372718048 + - 1.524193987588818 + - 1.2474576966679658 + - 1.5330926439700436 + - 2.1805941617005407 + - 1.7029812001236895 + - 1.0494695031131192 + - 1.590274768151611 + - 1.5245396893311578 + - !!python/tuple + - 0.9530889935937354 + - 1.6266693880280172 + - 2.2588808550808555 + - 1.14176731269296 + - 1.4720132077112003 + - 1.5241922154470169 + - 1.2474608252399448 + - 1.5330917073573551 + - 2.180590744243007 + - 1.7029833582147347 + - 1.0494707341543583 + - 1.5902750306929698 + - 1.524537135572776 + - !!python/tuple + - 0.9530870133766062 + - 1.626668951748951 + - 2.2588807673726 + - 1.141765066479509 + - 1.472015634011516 + - 1.5241910789095048 + - 1.2474633502380303 + - 1.5330897554100722 + - 2.180588180855291 + - 1.7029860573623348 + - 1.0494728993530285 + - 1.5902740759709149 + - 1.524535472601799 + - !!python/tuple + - 0.95308609048905 + - 1.6266675456473476 + - 2.258880271506209 + - 1.1417623927229403 + - 1.472018127007533 + - 1.5241907439367128 + - 1.2474650050113163 + - 1.5330872045609683 + - 2.1805866949772086 + - 1.7029888345175315 + - 1.0494755240950815 + - 1.5902721752817197 + - 1.5245348560742995 + - !!python/tuple + - 0.9530862816152258 + - 1.626665490314047 + - 2.258879534653057 + - 1.1417597706858904 + - 1.472019952228828 + - 1.5241912006271139 + - 1.247465659905426 + - 1.5330845300839266 + - 2.1805863606047198 + - 1.702991258251033 + - 1.0494780965737767 + - 1.5902697276307116 + - 1.5245352751436605 + - !!python/tuple + - 0.9530874469719307 + - 1.6266631813539276 + - 2.2588787705651585 + - 1.141757626104891 + - 1.4720206395591295 + - 1.5241922813699769 + - 1.2474653263557434 + - 1.5330821828544352 + - 2.1805871072024394 + - 1.7029929916835107 + - 1.049480162411522 + - 1.5902671833025994 + - 1.5245365693449602 + - !!python/tuple + - 0.9530892923899412 + - 1.6266610183504306 + - 2.258878179955646 + - 1.1417562661900218 + - 1.4720200966388794 + - 1.5241937089818671 + - 1.247464142435255 + - 1.5330805175942614 + - 2.1805887414286156 + - 1.7029938353117762 + - 1.049481400523627 + - 1.5902649659811239 + - 1.5245384657190864 + - !!python/tuple + - 0.9530914341611069 + - 1.6266593395739781 + - 2.2588778996240184 + - 1.1417558399600358 + - 1.4720186012224257 + - 1.524195162526972 + - 1.2474623433508831 + - 1.5330797433694603 + - 2.1805909815992974 + - 1.7029937449489647 + - 1.0494816683215664 + - 1.5902634062009695 + - 1.5245406289926577 + - !!python/tuple + - 0.953093473481318 + - 1.6266583725391417 + - 2.258877972768072 + - 1.1417563282160108 + - 1.47201668538633 + - 1.5241963460226609 + - 1.247460222024762 + - 1.5330799025291093 + - 2.1805934996443757 + - 1.702992824218181 + - 1.0494810108610924 + - 1.5902626959739994 + - 1.524542716343693 + - !!python/tuple + - 0.9530950667971688 + - 1.62665820706892 + - 2.258878346344354 + - 1.1417575622008576 + - 1.4720149552123216 + - 1.5241970459226852 + - 1.2474580857382547 + - 1.5330808790556127 + - 2.1805959648609337 + - 1.7029912949919574 + - 1.049479635467574 + - 1.590262870133684 + - 1.5245444283411398 + - !!python/tuple + - 0.9530959802504472 + - 1.626658793281944 + - 2.2588788937839857 + - 1.1417592653340485 + - 1.4720139048534233 + - 1.5241971667502623 + - 1.247456214813352 + - 1.5330824323579455 + - 2.180598084043073 + - 1.7029894522697386 + - 1.0494778594408465 + - 1.5902638150982293 + - 1.5245455489301305 + - !!python/tuple + - 0.9530961201852051 + - 1.6266599626372364 + - 2.2588794548924414 + - 1.1417611090723754 + - 1.4720137804849696 + - 1.5241967395897642 + - 1.247454828527843 + - 1.5330842486704879 + - 2.1805996334700444 + - 1.7029876118256202 + - 1.0494760426344132 + - 1.590265301201159 + - 1.5245459695555639 + - !!python/tuple + - 0.9530929651526662 + - 1.6266643742433338 + - 2.2588800023651254 + - 1.1417646132671995 + - 1.4720172820158701 + - 1.5241938681154992 + - 1.2474544624184658 + - 1.5330882481035768 + - 2.1806000135552503 + - 1.7029845760680469 + - 1.0494732212986555 + - 1.5902700247271166 + - 1.5245435687861177 + - !!python/tuple + - 0.9530915103215525 + - 1.6266653115489251 + - 2.2588797134362424 + - 1.1417645826768907 + - 1.4720183960766722 + - 1.5241931005288212 + - 1.2474554540523397 + - 1.5330884551153026 + - 2.1805988948655886 + - 1.7029847691854196 + - 1.049473568443286 + - 1.5902708301897237 + - 1.5245421280765548 + - !!python/tuple + - 0.9530902941410017 + - 1.6266657206070194 + - 2.2588793035918573 + - 1.1417639703556997 + - 1.4720188855315326 + - 1.5241927024737496 + - 1.2474567536339145 + - 1.5330880478594155 + - 2.180597420475206 + - 1.7029854977984522 + - 1.049474449998825 + - 1.590271028231015 + - 1.5245407432408113 + - !!python/tuple + - 0.9530895080787876 + - 1.6266655841370314 + - 2.2588788932746877 + - 1.1417629354776555 + - 1.47201866341242 + - 1.524192720363753 + - 1.247458159316988 + - 1.5330871540181823 + - 2.1805958056932906 + - 1.7029865959994468 + - 1.0494756529938694 + - 1.5902706442297554 + - 1.5245396159388236 + - !!python/tuple + - 0.9530892496485781 + - 1.6266649773661912 + - 2.2588785917021337 + - 1.14176169352649 + - 1.4720178650216615 + - 1.524193110504102 + - 1.2474594742070562 + - 1.5330859712990559 + - 2.1805942627930426 + - 1.7029878554283961 + - 1.0494769255484557 + - 1.5902697983510656 + - 1.5245388902924293 + - !!python/tuple + - 0.9530895138543862 + - 1.6266640469443627 + - 2.2588784688226307 + - 1.1417604746945482 + - 1.472016786643923 + - 1.5241937564283166 + - 1.2474605320359011 + - 1.5330847275938386 + - 2.1805929751861295 + - 1.7029890619719306 + - 1.0494780267356958 + - 1.590268676712398 + - 1.5245386366127198 + - !!python/tuple + - 0.9530936989434823 + - 1.626660637756389 + - 2.258879582712987 + - 1.1417595519810053 + - 1.4720161812571078 + - 1.5241957490889801 + - 1.2474600008769416 + - 1.5330831254475803 + - 2.18059292913757 + - 1.702989977360803 + - 1.0494774695940445 + - 1.5902654714805993 + - 1.5245421844429734 + - !!python/tuple + - 0.9530939697838142 + - 1.6266609122901285 + - 2.2588796538099394 + - 1.1417603623885797 + - 1.4720170005298663 + - 1.5241954045198263 + - 1.2474590974145767 + - 1.5330838705739938 + - 2.1805939098203733 + - 1.7029891872739893 + - 1.0494765811892373 + - 1.5902659185450627 + - 1.5245429124858694 + - !!python/tuple + - 0.9530938696837726 + - 1.6266614613053476 + - 2.258879581662291 + - 1.1417612220541935 + - 1.4720176406295855 + - 1.5241949104280776 + - 1.2474582036275177 + - 1.533084724036852 + - 2.180594943973763 + - 1.702988333047421 + - 1.0494757971456097 + - 1.590266617958709 + - 1.5245433621819093 + - !!python/tuple + - 0.9530907540485336 + - 1.6266639958428986 + - 2.2588788519918794 + - 1.1417618270466006 + - 1.4720157996200438 + - 1.5241940337329916 + - 1.247457370693997 + - 1.5330858414151514 + - 2.1805968390037966 + - 1.7029873631331869 + - 1.0494767101404006 + - 1.5902689886558243 + - 1.5245410434591884 + - !!python/tuple + - 0.9530907772727119 + - 1.6266636868256557 + - 2.2588789979216686 + - 1.14176123612504 + - 1.4720157582916131 + - 1.5241944039761501 + - 1.2474579439493734 + - 1.5330852693309933 + - 2.180596282254197 + - 1.702987925978694 + - 1.0494772623627173 + - 1.5902685666820895 + - 1.5245405845938782 + - !!python/tuple + - 0.9530910318227395 + - 1.6266632356876558 + - 2.258879171516337 + - 1.1417606813794228 + - 1.472016007387833 + - 1.524194765068267 + - 1.247458539199216 + - 1.5330846934944948 + - 2.1805956300244596 + - 1.7029884949501728 + - 1.0494776483657005 + - 1.5902680291913216 + - 1.524540321426524 + - !!python/tuple + - 0.9530929403936205 + - 1.6266617549348168 + - 2.258879234660361 + - 1.1417605067329188 + - 1.4720172843096053 + - 1.5241947786727879 + - 1.2474596168363419 + - 1.5330841944049438 + - 2.180593691710487 + - 1.70298912523675 + - 1.0494766442996 + - 1.590266684403933 + - 1.5245415973076575 + - !!python/tuple + - 0.9530929478688445 + - 1.6266619201448342 + - 2.2588791061573046 + - 1.1417609063344085 + - 1.472017000220674 + - 1.5241945096500034 + - 1.2474593433177539 + - 1.5330845722682316 + - 2.1805938375531215 + - 1.7029887768730763 + - 1.049476258901421 + - 1.5902669319043596 + - 1.524541981447901 + - !!python/tuple + - 0.9530927891233679 + - 1.626662203418873 + - 2.258879002654779 + - 1.1417613029987905 + - 1.4720166423358605 + - 1.5241942717641246 + - 1.2474589809728605 + - 1.533084975738749 + - 2.1805941327157212 + - 1.7029883844710592 + - 1.0494759911652265 + - 1.5902672826690436 + - 1.5245422609955377 + - !!python/tuple + - 0.953092509644013 + - 1.626662543752002 + - 2.258878950661641 + - 1.1417616266265265 + - 1.4720163309135113 + - 1.524194113553545 + - 1.24745858891051 + - 1.5330853308064716 + - 2.180594524637004 + - 1.7029880171283658 + - 1.0494758813890723 + - 1.5902676651622496 + - 1.5245424020533618 + - !!python/tuple + - 0.9530914340675237 + - 1.6266632548644133 + - 2.258879275137562 + - 1.1417613196844862 + - 1.4720168626836312 + - 1.5241946312943166 + - 1.2474577683657246 + - 1.5330852359907108 + - 2.180596011074372 + - 1.702987855261426 + - 1.0494769762089475 + - 1.5902682136411825 + - 1.5245414478390484 + - !!python/tuple + - 0.9530915367782126 + - 1.6266630793445185 + - 2.258879301460654 + - 1.1417610406269112 + - 1.4720170378268587 + - 1.5241947782568728 + - 1.2474579321095005 + - 1.5330849568986955 + - 2.180595978271364 + - 1.7029881130883866 + - 1.049477157269237 + - 1.590267987209177 + - 1.5245412064372887 + - !!python/tuple + - 0.9530917269942093 + - 1.6266628514257144 + - 2.258879282414577 + - 1.141760801693405 + - 1.472017080405132 + - 1.52419485651874 + - 1.2474581620628868 + - 1.5330846997309795 + - 2.1805958339479528 + - 1.7029883774255201 + - 1.0494772257566702 + - 1.5902677246089796 + - 1.5245410446077883 + - !!python/tuple + - 0.9530919604206453 + - 1.6266626167140381 + - 2.258879227783985 + - 1.1417606420713193 + - 1.4720169895435413 + - 1.5241948554892095 + - 1.2474584192561076 + - 1.5330845086853566 + - 2.180595607820693 + - 1.7029886032734554 + - 1.04947717911957 + - 1.5902674761538165 + - 1.5245409805318082 + - !!python/tuple + - 0.9530921888101112 + - 1.62666241770199 + - 2.258879156537783 + - 1.1417605829262703 + - 1.4720168073552138 + - 1.5241947830500966 + - 1.2474586645516366 + - 1.5330844118505422 + - 2.1805953375373774 + - 1.7029887563648434 + - 1.0494770376270275 + - 1.5902672848631132 + - 1.5245410150320362 + - !!python/tuple + - 0.9530924864175555 + - 1.6266622783814226 + - 2.258879039295722 + - 1.1417609308779733 + - 1.472016372243506 + - 1.524194401271161 + - 1.2474590426721022 + - 1.5330846776641804 + - 2.1805946400238034 + - 1.7029886761243884 + - 1.0494764437355653 + - 1.590267250404863 + - 1.5245415050109536 + - !!python/tuple + - 0.9530924166613786 + - 1.6266623865564769 + - 2.2588790631364852 + - 1.1417611253778954 + - 1.4720164099534834 + - 1.5241943194661018 + - 1.2474590105808765 + - 1.5330848695186496 + - 2.1805945385678527 + - 1.7029885133743943 + - 1.0494763248665846 + - 1.5902673960937912 + - 1.524541691311957 + - !!python/tuple + - 0.9530922847813513 + - 1.6266625383112834 + - 2.258879109732392 + - 1.141761298167048 + - 1.47201653108875 + - 1.5241942929210142 + - 1.2474589103024203 + - 1.533085052873231 + - 2.1805945222897334 + - 1.7029883308586087 + - 1.0494762867444194 + - 1.5902675749755104 + - 1.5245418374318478 + - !!python/tuple + - 0.9530921219659246 + - 1.6266627020758406 + - 2.258879163484451 + - 1.141761419784803 + - 1.4720166881738128 + - 1.5241943222177907 + - 1.2474587628211227 + - 1.5330851950850075 + - 2.18059458512765 + - 1.7029881615341498 + - 1.0494763291383762 + - 1.5902677515208492 + - 1.5245419235868236 + - !!python/tuple + - 0.9530919623579739 + - 1.6266628471087285 + - 2.2588792082132354 + - 1.1417614729208394 + - 1.472016826524793 + - 1.524194395415805 + - 1.247458593911921 + - 1.533085274124747 + - 2.180594711060393 + - 1.702988032984742 + - 1.0494764358366402 + - 1.5902678939947659 + - 1.524541941590196 + - !!python/tuple + - 0.9530917559824232 + - 1.6266629777898407 + - 2.2588792047294923 + - 1.1417612542259779 + - 1.472016821479917 + - 1.5241946615191426 + - 1.2474582035718498 + - 1.533085115708491 + - 2.1805952260666075 + - 1.7029880133369857 + - 1.0494768501595912 + - 1.590267954275995 + - 1.5245416708051835 + - !!python/tuple + - 0.9530918059260797 + - 1.6266629108632211 + - 2.258879166493149 + - 1.1417611192132286 + - 1.472016705409438 + - 1.5241946987268151 + - 1.247458166777275 + - 1.5330849839560614 + - 2.1805953617792224 + - 1.7029881125683854 + - 1.0494769252310698 + - 1.5902678601356228 + - 1.5245415374308458 + - !!python/tuple + - 0.9530918991372705 + - 1.6266628097558622 + - 2.258879127367 + - 1.141760995990214 + - 1.4720165917553811 + - 1.5241946945145426 + - 1.2474581839882473 + - 1.5330848545124351 + - 2.180595449408699 + - 1.7029882348295593 + - 1.0494769422358934 + - 1.5902677385132704 + - 1.524541420246283 + - !!python/tuple + - 0.9530920133972314 + - 1.6266626962405457 + - 2.2588790988375957 + - 1.141760906218644 + - 1.4720165177527094 + - 1.5241946538378421 + - 1.247458247480805 + - 1.5330847510900258 + - 2.1805954817879343 + - 1.7029883568227957 + - 1.049476903366163 + - 1.5902676143309953 + - 1.5245413369152965 + - !!python/tuple + - 0.9530921245209231 + - 1.6266625922903901 + - 2.258879088208759 + - 1.1417608633068677 + - 1.4720165040099151 + - 1.5241945894295372 + - 1.2474583435276498 + - 1.5330846903326512 + - 2.180595459884347 + - 1.7029884575097098 + - 1.049476821857086 + - 1.5902675106125312 + - 1.524541297864227 + - !!python/tuple + - 0.9530922112296255 + - 1.6266625160388797 + - 2.2588790968583066 + - 1.1417608706942466 + - 1.4720165492483697 + - 1.524194518190614 + - 1.2474584549580687 + - 1.5330846793916797 + - 2.180595391910197 + - 1.702988521532779 + - 1.0494767182884992 + - 1.5902674444375005 + - 1.5245413052436212 + - !!python/tuple + - 0.9530922590128846 + - 1.6266624788135284 + - 2.2588791203879643 + - 1.1417609221428253 + - 1.4720166327687734 + - 1.5241944569668764 + - 1.247458563985273 + - 1.5330847154847027 + - 2.180595291535726 + - 1.7029885413415482 + - 1.0494766157432345 + - 1.590267424357747 + - 1.5245413533465388 + - !!python/tuple + - 0.9530922623203738 + - 1.6266624836905674 + - 2.2588791504521977 + - 1.1417610038015176 + - 1.472016723131808 + - 1.5241944187252972 + - 1.2474586548645572 + - 1.5330847873402944 + - 2.1805951755273933 + - 1.702988517772233 + - 1.0494765349032906 + - 1.5902674496191114 + - 1.5245414302835714 + - !!python/tuple + - 0.9530922248073176 + - 1.6266625256993017 + - 2.2588791775781942 + - 1.1417610974990975 + - 1.4720167896109233 + - 1.5241944099635993 + - 1.2474587160089277 + - 1.5330848780904085 + - 2.1805950611828284 + - 1.702988459119452 + - 1.0494764900819087 + - 1.5902675111694582 + - 1.5245415205251416 + - !!python/tuple + - 0.9530921577608495 + - 1.626662593490019 + - 2.258879194058753 + - 1.1417611845413527 + - 1.4720168123574011 + - 1.5241944298321892 + - 1.2474587413012077 + - 1.5330849689411434 + - 2.180594963928857 + - 1.7029883789970077 + - 1.0494764869118536 + - 1.5902675941062003 + - 1.524541607812819 + - !!python/tuple + - 0.9530920771785599 + - 1.626662672026093 + - 2.258879196059515 + - 1.1417612492576728 + - 1.4720167880056771 + - 1.5241944710146398 + - 1.247458730482457 + - 1.5330850428665521 + - 2.1805948953944494 + - 1.7029882934688714 + - 1.049476522010354 + - 1.5902676809813665 + - 1.524541677924364 + - !!python/tuple + - 0.9530920001924537 + - 1.626662745710706 + - 2.258879184389587 + - 1.1417612816559168 + - 1.4720167292580764 + - 1.5241945220069806 + - 1.24745868864281 + - 1.533085087632626 + - 2.1805948621782694 + - 1.7029882180160776 + - 1.0494765845108285 + - 1.5902677552750448 + - 1.5245417208469918 + - !!python/tuple + - 0.953091941598509 + - 1.6266628013303537 + - 2.258879163828219 + - 1.1417612787681566 + - 1.4720166591304438 + - 1.5241945701476338 + - 1.2474586249705792 + - 1.533085097645251 + - 2.1805948654163996 + - 1.7029881648838456 + - 1.0494766589809048 + - 1.5902678043777583 + - 1.5245417320510135 + - !!python/tuple + - 0.9530919111640579 + - 1.6266628302859079 + - 2.258879141337082 + - 1.141761244552522 + - 1.4720166022683554 + - 1.5241946046350074 + - 1.2474585510110061 + - 1.5330850743812827 + - 2.1805949011372316 + - 1.7029881412386512 + - 1.049476729005774 + - 1.5902678215718455 + - 1.5245417127328782 + - !!python/tuple + - 0.9530919121727681 + - 1.6266628297610541 + - 2.2588791237889736 + - 1.1417611884997978 + - 1.4720165765133975 + - 1.524194618840112 + - 1.2474584787362082 + - 1.5330850254494233 + - 2.1805949612839557 + - 1.702988148385145 + - 1.049476780643672 + - 1.5902678067332439 + - 1.5245416690799964 + - !!python/tuple + - 0.9530919413824773 + - 1.6266628027065184 + - 2.258879115931563 + - 1.141761123324245 + - 1.4720165875334543 + - 1.5241946114451523 + - 1.2474584187291131 + - 1.533084962581377 + - 2.1805950352041834 + - 1.7029881820848027 + - 1.049476805056683 + - 1.5902677657381896 + - 1.5245416107684004 + - !!python/tuple + - 0.9530919902767582 + - 1.6266627567498444 + - 2.2588791191712256 + - 1.1417610622573444 + - 1.4720166280497937 + - 1.5241945862512973 + - 1.247458378740473 + - 1.5330848990288806 + - 2.1805951113598363 + - 1.702988233820887 + - 1.0494767998510066 + - 1.5902677088025163 + - 1.5245415490139278 + - !!python/tuple + - 0.9530920472458316 + - 1.6266627023312754 + - 2.2588791314656906 + - 1.1417610164922796 + - 1.4720166815069855 + - 1.524194550820159 + - 1.2474583627997213 + - 1.5330848469123233 + - 2.180595179002008 + - 1.7029882927014863 + - 1.0494767689674145 + - 1.5902676481606883 + - 1.5245414945440263 + - !!python/tuple + - 0.9530920472458316 + - 1.6266627023312754 + - 2.2588791314656906 + - 1.1417610164922796 + - 1.4720166815069855 + - 1.524194550820159 + - 1.2474583627997213 + - 1.5330848469123233 + - 2.180595179002008 + - 1.7029882927014863 + - 1.0494767689674145 + - 1.5902676481606883 + - 1.5245414945440263 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000004963947 + - 9.500000048175574 + - 9.500000014808244 + - 9.500000004830206 + - 10.4999995000005 + - 9.50000001583368 + - 9.500000005202557 + - 9.500000009641704 + - 9.50000000927737 + - 9.500000018344263 + - 9.500000008708806 + - 9.50000001022638 + - 9.500000004875055 + - !!python/tuple + - 9.00001406767254 + - 9.00014330803694 + - 9.000042437708956 + - 9.000013686570849 + - 10.998136568670553 + - 9.000045429061498 + - 9.000014747895897 + - 9.000027470051155 + - 9.000026421094738 + - 9.000052781702985 + - 9.00002478586422 + - 9.000029155182615 + - 9.000013814355768 + - !!python/tuple + - 8.500054830876485 + - 8.500562363416712 + - 8.50016566095624 + - 8.500053344367656 + - 11.493346309848137 + - 8.50017736645383 + - 8.50005748427905 + - 8.500107146536886 + - 8.500103049256179 + - 8.500206153816926 + - 8.500096662875725 + - 8.500113729715023 + - 8.500053842793157 + - !!python/tuple + - 7.999873509889511 + - 8.115143676424237 + - 8.0004186265429 + - 8.000134566963958 + - 11.259912064823139 + - 8.005544194928879 + - 8.000145019741376 + - 8.000270515612394 + - 8.000260154554246 + - 8.000521275428323 + - 8.000244007505982 + - 8.00028716565095 + - 8.0001358253569 + - !!python/tuple + - 7.499602247172464 + - 7.813729730642975 + - 7.500864299844043 + - 7.500277282982071 + - 10.927844172917927 + - 7.513911144444838 + - 7.5002988433552 + - 7.500557940127686 + - 7.5005365319152215 + - 7.501076982571552 + - 7.500503174637969 + - 7.5005923491034086 + - 7.500279878434698 + - !!python/tuple + - 6.999323765549825 + - 7.578873210776665 + - 7.001584581581624 + - 7.000507231809621 + - 10.543656264976164 + - 7.024289056255888 + - 7.000546717285079 + - 7.0010217298936945 + - 7.000982446180411 + - 7.00197607502161 + - 7.000921248709991 + - 7.00108488299228 + - 7.000511984754748 + - !!python/tuple + - 6.499104731671053 + - 7.3992039173579744 + - 6.502687398914495 + - 6.5008580640251985 + - 10.126752244127989 + - 6.536222288681303 + - 6.500924947417676 + - 6.501730535674828 + - 6.501663845188066 + - 6.503354399065619 + - 6.50155997687553 + - 6.501837773877063 + - 6.500866114248007 + - !!python/tuple + - 5.9990107934299814 + - 7.266643571643761 + - 6.004317187380995 + - 6.001374408105384 + - 9.687510853560216 + - 6.0495415288593275 + - 6.001481700169489 + - 6.002775803814554 + - 6.0026685458491364 + - 6.005394328918169 + - 6.002501539977336 + - 6.00294832173193 + - 6.001387320773244 + - !!python/tuple + - 5.49935533552978 + - 7.136229279181846 + - 5.508832768422272 + - 5.5021164637359075 + - 9.232250122896291 + - 5.564271876944509 + - 5.502281973164578 + - 5.504281511928462 + - 5.504115559961534 + - 5.508345340185362 + - 5.5038572455273975 + - 5.50454852055444 + - 5.502136380700753 + - !!python/tuple + - 5.0005298393903255 + - 6.884402101259968 + - 5.016056709923408 + - 5.003815652401909 + - 8.76516134511831 + - 5.079735691371285 + - 5.003415269725153 + - 5.009110788566813 + - 5.00616959213275 + - 5.012556436649129 + - 5.005084200514621 + - 5.008730035070889 + - 5.00682572376377 + - !!python/tuple + - 4.502546113879848 + - 6.561833407261766 + - 4.526068593601747 + - 4.506451744570894 + - 8.289215583592432 + - 4.596480686069999 + - 4.505007871200028 + - 4.516980155724292 + - 4.509064410334292 + - 4.518529236289785 + - 4.506542698205868 + - 4.515378772563071 + - 4.514827688774268 + - !!python/tuple + - 4.005498842927424 + - 6.191157926584012 + - 4.039234154773656 + - 4.0100940950457185 + - 7.806645096718941 + - 4.115260055089639 + - 4.007243302946387 + - 4.027867314926624 + - 4.0131421893227035 + - 4.0270088837802325 + - 4.008653530469674 + - 4.024608301052789 + - 4.025762669256157 + - !!python/tuple + - 3.5095913808746895 + - 5.785571943195819 + - 3.556306347093267 + - 3.5149243358550986 + - 7.3192264624170145 + - 3.637176968581191 + - 3.510398253803613 + - 3.5420461323731507 + - 3.518923334199775 + - 3.5391483859624357 + - 3.5119735062106376 + - 3.5368110247337015 + - 3.5394787029346824 + - !!python/tuple + - 3.0153417719798075 + - 5.347027793985501 + - 3.0786487798867324 + - 3.021306946102496 + - 6.82846516053177 + - 3.1542260026721674 + - 3.0194692277310224 + - 3.060202107990566 + - 3.0272387892772903 + - 3.058846093886602 + - 3.0159461487171506 + - 3.0527908747900745 + - 3.0584864747497527 + - !!python/tuple + - 2.5233925209462824 + - 4.883344066915595 + - 2.6087134499471256 + - 2.5298778574689793 + - 6.335732112246924 + - 2.6700417495523574 + - 2.5345898209891624 + - 2.583700701526821 + - 2.5395025068884074 + - 2.5892620340384225 + - 2.5220749227870862 + - 2.5740587918516376 + - 2.5829345229730922 + - !!python/tuple + - 2.0349736802580103 + - 4.400479268720374 + - 2.1511229088699517 + - 2.0418408256032143 + - 5.842382775836275 + - 2.18990567116393 + - 2.0588348329138793 + - 2.1106790347464974 + - 2.0587237550487574 + - 2.1365611466084524 + - 2.0358489812294867 + - 2.102371299934552 + - 2.1124752556291506 + - !!python/tuple + - 1.5526581208325447 + - 3.9033520838041653 + - 1.7153601222864172 + - 1.562133253648014 + - 5.33577410963605 + - 1.7237513316799877 + - 1.5964323311199888 + - 1.6467937433732225 + - 1.590386395773201 + - 1.7154389167922972 + - 1.5619140672580156 + - 1.6437932933597694 + - 1.6516615073880236 + - !!python/tuple + - 1.0851439124483147 + - 3.389354880100153 + - 1.3443239131141305 + - 1.1005867415941657 + - 4.814678667603533 + - 1.2670277202825375 + - 1.1566500437814708 + - 1.2045459910295462 + - 1.1692677059392096 + - 1.3714457772249902 + - 1.1122948680525502 + - 1.204711072802502 + - 1.2062235078294394 + - !!python/tuple + - 1.030801549771097 + - 0.9020184813439147 + - 1.4869678747486725 + - 1.031996584205737 + - 1.6690662029000998 + - 1.4564741821571778 + - 1.034684889132743 + - 1.2958253621542088 + - 1.3580342350291863 + - 1.7267047715421027 + - 1.2449714547874242 + - 1.3443521401095464 + - 0.9793847010527037 + - !!python/tuple + - 1.281890991584231 + - 2.900545027194919 + - 1.7720249743832803 + - 1.1934819355566577 + - 4.230694546613635 + - 1.6562088011414222 + - 1.2459205849388655 + - 1.6502635966960755 + - 1.659462719668897 + - 2.1963072891355275 + - 1.7458885503882096 + - 1.7272208079697018 + - 1.216222470793413 + - !!python/tuple + - 1.1780635857333008 + - 2.853804269502918 + - 1.69516055404506 + - 1.092912970181925 + - 4.350539293932356 + - 1.5492453207096528 + - 1.1717805080177528 + - 1.5370727392928398 + - 1.5537025643657212 + - 2.112760003795851 + - 1.6332217629814594 + - 1.6103006780100164 + - 1.1356855010728157 + - !!python/tuple + - 1.0747801477856582 + - 2.7892703738813154 + - 1.6296369677281282 + - 0.9978449543693211 + - 4.429894593637181 + - 1.4396772156179587 + - 1.1016664821665472 + - 1.4283165479900077 + - 1.4618179874694361 + - 2.0286046407205047 + - 1.5141657253003755 + - 1.4902251203109327 + - 1.060902107279632 + - !!python/tuple + - 0.8748885027044561 + - 1.9396497946457423 + - 1.631657228355066 + - 0.9872663818977739 + - 3.8085650699040907 + - 1.4127047761712834 + - 1.0959277023722316 + - 1.2141562702222293 + - 1.3955876680829888 + - 1.7342163394682741 + - 1.0830189557474168 + - 1.2970133054799802 + - 1.0071156712816631 + - !!python/tuple + - 0.9355074330911477 + - 1.8404618940348891 + - 1.6799208610455347 + - 1.0442573371532857 + - 3.6337937179705047 + - 1.520412102749143 + - 1.1428887947819542 + - 1.2719374781540622 + - 1.4356738270662366 + - 1.7148481028741587 + - 1.158457138908173 + - 1.3747167413699424 + - 1.0464305706775652 + - !!python/tuple + - 0.9960354534252261 + - 1.755523878070578 + - 1.7288114607732352 + - 1.0956096482634818 + - 3.449839906872378 + - 1.607505965252964 + - 1.1866191719637778 + - 1.332078507608917 + - 1.4788413516381658 + - 1.7162140674805904 + - 1.2388878680387707 + - 1.4500838495049746 + - 1.0864259074702034 + - !!python/tuple + - 1.0565858442993787 + - 1.992696462168958 + - 1.5702915007051204 + - 1.0280008027795668 + - 2.2645494989078645 + - 1.4837209746675892 + - 1.160624087868451 + - 1.4571569076800424 + - 1.485238055947111 + - 2.089180059482473 + - 1.4625837135730402 + - 1.5145805466675926 + - 1.114123794841263 + - !!python/tuple + - 1.0226858931807103 + - 1.996879779178362 + - 1.5703342835394403 + - 0.9859755795448364 + - 2.339182030155173 + - 1.4720319117770138 + - 1.1290442428156966 + - 1.4228762243350133 + - 1.4372682486673583 + - 2.0907530656927893 + - 1.4244420203229269 + - 1.4572190828075902 + - 1.0864254461144178 + - !!python/tuple + - 0.9904125618232434 + - 1.9803686561637897 + - 1.575085152571911 + - 0.951196425933375 + - 2.4521240809532454 + - 1.4607928936342212 + - 1.103140348187072 + - 1.386418887265416 + - 1.3934017826857028 + - 2.083540048724405 + - 1.3832018624188018 + - 1.3965918130126276 + - 1.061892211039384 + - !!python/tuple + - 0.9559548793616427 + - 1.8827031520840094 + - 1.6890855221939147 + - 1.0160695936520145 + - 3.009014229262902 + - 1.4569416895550156 + - 1.1269315458907747 + - 1.2920845186257235 + - 1.3863068213564647 + - 1.8656169625136763 + - 1.20258425047467 + - 1.3668823694000498 + - 1.0702652763597982 + - !!python/tuple + - 0.974190005649787 + - 1.8824513957032083 + - 1.7094430784706094 + - 1.0464904749025383 + - 3.008543821327967 + - 1.486044539250412 + - 1.1502287843796823 + - 1.3087836399765953 + - 1.4203191997773423 + - 1.8507336385665947 + - 1.2117151110353432 + - 1.4019353356373911 + - 1.0885514419005982 + - !!python/tuple + - 1.0348183687892807 + - 1.9638755199860465 + - 1.5682478431294995 + - 1.0599579520945408 + - 2.9102428158660687 + - 1.5223811479289397 + - 1.1970041448971303 + - 1.4095519654673627 + - 1.4961316820734887 + - 1.9810642502048577 + - 1.3765421771265627 + - 1.4646225478504553 + - 1.125546755688536 + - !!python/tuple + - 1.0254578896340438 + - 1.9743518365686499 + - 1.5518238702751554 + - 1.0408183716545396 + - 2.8928161438829654 + - 1.4888958480883425 + - 1.1851234308149956 + - 1.402946665113001 + - 1.4897714696326083 + - 1.9995666675771133 + - 1.381834262794645 + - 1.4409648196250906 + - 1.1149045181990764 + - !!python/tuple + - 1.014332597571552 + - 1.9830652384465324 + - 1.5600237988278194 + - 1.0215752618435057 + - 2.8584302061310076 + - 1.4764078879296936 + - 1.171224993556471 + - 1.3932307187984734 + - 1.472292455711078 + - 2.0129641661038926 + - 1.3809710088072558 + - 1.419597388715426 + - 1.1036714532586804 + - !!python/tuple + - 1.0026407611741597 + - 1.9897526851019702 + - 1.574194715878724 + - 1.0041409803774897 + - 2.8267618905093457 + - 1.47397063411047 + - 1.1566896562206752 + - 1.3815436516274675 + - 1.4460336225571644 + - 2.020705536097492 + - 1.3745576706567453 + - 1.4021306872736796 + - 1.0929584097229392 + - !!python/tuple + - 0.986986501914921 + - 1.9510028084873414 + - 1.6499520238601262 + - 1.0168206305790906 + - 2.7124639583977324 + - 1.4268268209973525 + - 1.1307722361900032 + - 1.3332528658776825 + - 1.4036210256345578 + - 1.955730247561504 + - 1.278707498601393 + - 1.3984817296017968 + - 1.0823777474670468 + - !!python/tuple + - 0.9917719295829877 + - 1.9446281355433188 + - 1.6428005853617909 + - 1.0285098425667083 + - 2.7125191863470004 + - 1.4499533406466072 + - 1.139692213673834 + - 1.3368897425260668 + - 1.41370090042408 + - 1.9423423966093645 + - 1.2736497327751788 + - 1.400787237103551 + - 1.088606076933692 + - !!python/tuple + - 0.9967603057198089 + - 1.939602170176024 + - 1.6326358273865484 + - 1.038346523905322 + - 2.716090458764284 + - 1.4836241403079216 + - 1.1487875365026 + - 1.3428642315538082 + - 1.4170358178700777 + - 1.931451032943444 + - 1.272260955508482 + - 1.4066366827228844 + - 1.095239618037199 + - !!python/tuple + - 1.0013968208521684 + - 1.9360760508194816 + - 1.619461190988453 + - 1.0472596008187696 + - 2.7227565107872413 + - 1.493292809070123 + - 1.1578464344131325 + - 1.3503242375301296 + - 1.4307877519377428 + - 1.92379571469875 + - 1.2743463369658525 + - 1.4151547607760229 + - 1.1015449718496517 + - !!python/tuple + - 1.0029352560284255 + - 1.9483644972260714 + - 1.5914785762456605 + - 1.0305782241023047 + - 2.814047592083606 + - 1.4791657299824472 + - 1.1684641545985257 + - 1.3777428572004902 + - 1.4481820953644284 + - 1.9541943450857246 + - 1.3285127361702733 + - 1.44145096537735 + - 1.104769735171801 + - !!python/tuple + - 0.9908101866842761 + - 1.9697519518207862 + - 1.6274226541677546 + - 1.0118859109637042 + - 2.876194650258557 + - 1.4512992303937822 + - 1.142313809600646 + - 1.352478256250308 + - 1.415030400717893 + - 1.977571535408522 + - 1.321040910539167 + - 1.409022813015557 + - 1.0873916618933757 + - !!python/tuple + - 0.9927873971402301 + - 1.9713379310646064 + - 1.6213451667357484 + - 1.0209234685530633 + - 2.8841587678941183 + - 1.4483092716277344 + - 1.1408503087786392 + - 1.3511078575606008 + - 1.4065451802184468 + - 1.9700213709810366 + - 1.3074768440962632 + - 1.4242649205874065 + - 1.0906470628945868 + - !!python/tuple + - 0.9966129348626167 + - 1.969883098462336 + - 1.6105261042300967 + - 1.030546458870633 + - 2.885684623682429 + - 1.4657117686254844 + - 1.147807420272212 + - 1.3526239021745157 + - 1.420452105972429 + - 1.9591838876810306 + - 1.2998973036667667 + - 1.4154099104382225 + - 1.0949347306582187 + - !!python/tuple + - 1.0019428170048963 + - 1.9570606358028881 + - 1.6006135954869474 + - 1.0343272642021346 + - 2.863088446916042 + - 1.4846650733370492 + - 1.162582507058118 + - 1.3678003394569196 + - 1.4346125513126249 + - 1.9440171560056998 + - 1.3048018799972438 + - 1.4315114794703394 + - 1.1030581884523847 + - !!python/tuple + - 1.0010662514140778 + - 1.9552036565207034 + - 1.6040388407197559 + - 1.0313090476098878 + - 2.857343222160189 + - 1.4798400027599594 + - 1.1611415092163555 + - 1.3689209943246199 + - 1.4281048782500547 + - 1.945901617740231 + - 1.3075190334075837 + - 1.4400780016610437 + - 1.1025119290568204 + - !!python/tuple + - 0.9979264693218922 + - 1.9586091746302519 + - 1.6090343396258378 + - 1.0272260968401457 + - 2.836900735471719 + - 1.4712036450450423 + - 1.1531675225536577 + - 1.3622420357813534 + - 1.4230352080432682 + - 1.9566555177269287 + - 1.3095440183042497 + - 1.4330185996168094 + - 1.0980478725565952 + - !!python/tuple + - 0.997907382056863 + - 1.958501263716556 + - 1.6091379650175899 + - 1.0270075150161326 + - 2.837534164133152 + - 1.4746806669686463 + - 1.1534257497029692 + - 1.3618989914099946 + - 1.4222230902449282 + - 1.9565858497718625 + - 1.3096646194921038 + - 1.4310213561366818 + - 1.0977857440617513 + - !!python/tuple + - 0.997907382056863 + - 1.958501263716556 + - 1.6091379650175899 + - 1.0270075150161326 + - 2.837534164133152 + - 1.4746806669686463 + - 1.1534257497029692 + - 1.3618989914099946 + - 1.4222230902449282 + - 1.9565858497718625 + - 1.3096646194921038 + - 1.4310213561366818 + - 1.0977857440617513 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000006211147 + - 9.500000077837424 + - 9.50000001943276 + - 9.500000004049639 + - 9.500000109510177 + - 9.500000023841164 + - 9.500000013220763 + - 9.500000008490767 + - 9.500000014084216 + - 9.50000001357855 + - 9.500000007363887 + - 9.500000006170309 + - 9.500000006763026 + - !!python/tuple + - 9.000017627215449 + - 9.000239173212735 + - 9.000055982294771 + - 9.000011464602087 + - 9.000348098869397 + - 9.000069023737765 + - 9.000037820268554 + - 9.000024159329016 + - 9.000040329727375 + - 9.000038859521409 + - 9.00002092611983 + - 9.00001751050505 + - 9.00001920550696 + - !!python/tuple + - 8.500068718039572 + - 8.50094300322999 + - 8.500218691831645 + - 8.500044678676122 + - 8.50137951039426 + - 8.500269823617007 + - 8.500147599654644 + - 8.5000942162441 + - 8.500157414407916 + - 8.500151663963692 + - 8.500081593120498 + - 8.500068262622056 + - 8.500074877279891 + - !!python/tuple + - 8.000173390418038 + - 8.00240992396116 + - 8.000553084443565 + - 8.000112691505036 + - 8.003545950867787 + - 8.000682929036746 + - 8.000372881842972 + - 8.00023782238977 + - 8.000397737017156 + - 8.00038317352193 + - 8.0002059183898 + - 8.00017224007601 + - 8.00018894967928 + - !!python/tuple + - 7.500357377760624 + - 7.505039264587137 + - 7.501142948136219 + - 7.500232171808143 + - 7.507463755335707 + - 7.5014125073729945 + - 7.50076961371105 + - 7.500490399111504 + - 7.500821053745949 + - 7.500790911179504 + - 7.500424517774243 + - 7.500355003926478 + - 7.500389489403834 + - !!python/tuple + - 7.0006539493632385 + - 7.009373502333508 + - 7.0020976235582095 + - 7.000424636628338 + - 7.013987936154299 + - 7.002594914939156 + - 7.001410485391022 + - 7.000897814711866 + - 7.001505051369609 + - 7.001449633729168 + - 7.000777005148169 + - 7.000649599690667 + - 7.000712796525678 + - !!python/tuple + - 6.501106648147209 + - 6.516162550466052 + - 6.5035617244311625 + - 6.500718198854634 + - 6.524327130586775 + - 6.50441112137187 + - 6.502391166148389 + - 6.50152021103631 + - 6.502552045332979 + - 6.502457758323525 + - 6.501315274980658 + - 6.50109927599647 + - 6.5012064016027065 + - !!python/tuple + - 6.00177329497726 + - 6.026464301428437 + - 6.005729583356264 + - 6.001150116090272 + - 6.0402263029315755 + - 6.0071052646826635 + - 6.003839504745173 + - 6.002437616544049 + - 6.004098872254232 + - 6.003946848218985 + - 6.002108310581672 + - 6.001761460776595 + - 6.0019334524511185 + - !!python/tuple + - 5.502731998644754 + - 5.541806157611396 + - 5.508867327384971 + - 5.501770603862418 + - 5.564262776720156 + - 5.51101315981757 + - 5.505929475543164 + - 5.503758398794167 + - 5.506331902653819 + - 5.506095998423057 + - 5.503249412866617 + - 5.502713728682196 + - 5.502979303484481 + - !!python/tuple + - 5.004090451184348 + - 5.06445149750085 + - 5.013347725189649 + - 5.002648711116203 + - 5.100330939097202 + - 5.016607565260114 + - 5.008902994790187 + - 5.00563238772122 + - 5.009510556657322 + - 5.009154351872548 + - 5.004867402611348 + - 5.004063029913073 + - 5.004461716693442 + - !!python/tuple + - 4.5060008226159365 + - 4.597849051588241 + - 4.519707329434268 + - 4.503881693227653 + - 4.6544272129925774 + - 4.5245728744419065 + - 4.513105339490961 + - 4.508271998665411 + - 4.514005538273096 + - 4.513477677076849 + - 4.507144612052306 + - 4.505960477205939 + - 4.506547225679483 + - !!python/tuple + - 4.008684660925847 + - 4.147397277396745 + - 4.02874450437816 + - 4.005610597988685 + - 4.235843667753893 + - 4.035934053040385 + - 4.019045257549201 + - 4.011987730587293 + - 4.020363829983685 + - 4.019590487331252 + - 4.0103470434166155 + - 4.008626063271056 + - 4.009478527645202 + - !!python/tuple + - 3.5124767218788344 + - 3.7217099541036016 + - 3.54169691536467 + - 3.50804752472729 + - 3.8586414889555405 + - 3.552291385262891 + - 3.527502614040215 + - 3.51725103948002 + - 3.529425291154843 + - 3.528297367041236 + - 3.5148776254750445 + - 3.512392164219458 + - 3.513622774708499 + - !!python/tuple + - 3.0179072353902097 + - 3.3344669378720067 + - 3.0605844176970174 + - 3.0115263885374346 + - 3.5423108329587314 + - 3.076275321458251 + - 3.039734348038808 + - 3.0248132074262966 + - 3.042546131490505 + - 3.0408961265947054 + - 3.021376553425617 + - 3.017785181954284 + - 3.019562382086916 + - !!python/tuple + - 2.525869521130499 + - 3.0060697748037315 + - 2.5889247779448072 + - 2.516605364321234 + - 3.308697737245792 + - 2.612492211297269 + - 2.55790247202209 + - 2.535949541377298 + - 2.5620639263739364 + - 2.5596210153825383 + - 2.530926630784962 + - 2.5256918610175245 + - 2.528280448884775 + - !!python/tuple + - 2.0380006197502576 + - 2.7617296408310765 + - 2.1333659574469426 + - 2.024296870039615 + - 3.1730929134250148 + - 2.1696353609296466 + - 2.08606110352855 + - 2.0530186446545757 + - 2.092369794384397 + - 2.088664806742608 + - 2.045521786438277 + - 2.037736900677098 + - 2.041582827319497 + - !!python/tuple + - 1.5579984478301447 + - 2.5400280032373246 + - 1.7077354956782833 + - 1.5377338169028276 + - 2.943022286516323 + - 1.761453031440762 + - 1.6327453075967495 + - 1.5860133485827748 + - 1.6427066753796027 + - 1.636854379344656 + - 1.5682069813682986 + - 1.562100388955981 + - 1.5675976321216865 + - !!python/tuple + - 1.0949849569971244 + - 2.2926736623736588 + - 1.3430852337521824 + - 1.0631869287072353 + - 2.618452811974353 + - 1.4232060711522436 + - 1.2187538938835325 + - 1.167314512688527 + - 1.2354142412185638 + - 1.2256295244175237 + - 1.1018339646871018 + - 1.1170993055685705 + - 1.117825018080015 + - !!python/tuple + - 1.1146992539838978 + - 1.571224670944866 + - 1.5289232876737349 + - 0.9918547078339626 + - 1.5816452622314099 + - 1.6769583971938389 + - 1.4925949245027117 + - 1.2912456797600969 + - 1.4439876188112737 + - 1.4788033624122086 + - 1.1362477961152893 + - 1.1359702134161491 + - 1.192132064799182 + - !!python/tuple + - 1.3035574759515045 + - 1.8908519440474514 + - 1.7217525845422277 + - 1.1653409403397799 + - 1.892495594844929 + - 1.9065896306677148 + - 1.6958368108940147 + - 1.5006975961394187 + - 1.6117212866257655 + - 1.6766421643455263 + - 1.325842063680363 + - 1.3378260508942854 + - 1.3936423333437031 + - !!python/tuple + - 1.316771969026451 + - 2.2957173684288845 + - 1.9706953224039383 + - 1.1007017333364222 + - 2.5081693910879674 + - 2.0116108059304585 + - 1.8812885045092296 + - 1.578338089421477 + - 1.793854459922887 + - 1.7360261862782609 + - 1.351836056396473 + - 1.5612875527601011 + - 1.4924035018067623 + - !!python/tuple + - 1.2093441125809552 + - 2.1685126438802094 + - 1.8659091159250112 + - 0.9993709661874826 + - 2.3585964203731438 + - 1.9067268897724563 + - 1.7754555030907424 + - 1.4646874569804829 + - 1.6965889062447483 + - 1.6392488910633312 + - 1.2514225472632672 + - 1.449183584347616 + - 1.3847918219989266 + - !!python/tuple + - 1.1059363397395627 + - 2.058676097720423 + - 1.769901322302048 + - 0.9030639176691704 + - 2.1854367648692006 + - 1.8219949614901416 + - 1.6680808447578699 + - 1.3808216431891025 + - 1.589731146069434 + - 1.5503427212469907 + - 1.1476428249757689 + - 1.3436009293145157 + - 1.282312279865126 + - !!python/tuple + - 1.1735527167087891 + - 2.0706859662841253 + - 1.6998919728731146 + - 0.9810507082026968 + - 2.0703399094611106 + - 1.945826619789042 + - 1.6070876603491138 + - 1.427578869062412 + - 1.5504061466313699 + - 1.6249585363692431 + - 1.1333178028465283 + - 1.2549010566742116 + - 1.3072120309900315 + - !!python/tuple + - 1.154280482803529 + - 2.079317519092385 + - 1.7803284093760143 + - 0.9199455240728424 + - 2.224694459258581 + - 1.951199412716071 + - 1.7517009205218996 + - 1.4265425487855543 + - 1.642922872951775 + - 1.646772222743664 + - 1.1859214220234 + - 1.358812442546545 + - 1.3366776807818117 + - !!python/tuple + - 1.1499102378813726 + - 2.055772924167433 + - 1.6911475550552992 + - 0.948489405058016 + - 2.09719361420725 + - 1.904400251507496 + - 1.6321045958300908 + - 1.421986231143767 + - 1.5305823437574324 + - 1.628225510379233 + - 1.1035046002332518 + - 1.2625965075156944 + - 1.3106013649336292 + - !!python/tuple + - 1.1706590935770391 + - 2.0820103373497836 + - 1.7254769173251636 + - 0.9669219160644484 + - 2.1191379972336883 + - 1.9252472377419436 + - 1.6480223964581955 + - 1.432878638959346 + - 1.5588402106976993 + - 1.6491026908335973 + - 1.1251170698397366 + - 1.2832773262800306 + - 1.3329356364101648 + - !!python/tuple + - 1.1696484050112876 + - 2.0767721722228365 + - 1.7583023965498832 + - 0.9365042675236357 + - 2.2420310419393585 + - 1.9549581202327613 + - 1.7144034326544353 + - 1.4669977261298064 + - 1.6174998412684491 + - 1.65630412074338 + - 1.1721332542152696 + - 1.3346046813152659 + - 1.3377259943458804 + - !!python/tuple + - 1.1537065258020234 + - 2.073153705005241 + - 1.7293639289011968 + - 0.9239712424391555 + - 2.2456813195309424 + - 1.9396661128432406 + - 1.7156794216605302 + - 1.4417133143869114 + - 1.60570630056633 + - 1.643441607320293 + - 1.165524716822053 + - 1.3216425601937491 + - 1.3263752633205546 + - !!python/tuple + - 1.1317607523418334 + - 2.0468631632137257 + - 1.7439607863563766 + - 0.904509404233323 + - 2.2275874490169043 + - 1.9456142360976882 + - 1.675507741356451 + - 1.4124974716007663 + - 1.5504965508375876 + - 1.6178748779952699 + - 1.1319396642976163 + - 1.314900123785867 + - 1.3054837797527972 + - !!python/tuple + - 1.1512820591771304 + - 2.0953600600502864 + - 1.7510720469512315 + - 0.9342819007722043 + - 2.237575584887261 + - 1.959822509579384 + - 1.6784349262234584 + - 1.4475128227548015 + - 1.5848397750702587 + - 1.6516476717976982 + - 1.1477505242734751 + - 1.319517134815819 + - 1.3290714047143852 + - !!python/tuple + - 1.142619060776558 + - 2.0626318377048136 + - 1.7154641370032202 + - 0.9229529069352548 + - 2.209687687122241 + - 1.9447729595369185 + - 1.6791998545462683 + - 1.4248030929249942 + - 1.5647482055102273 + - 1.6273474805226975 + - 1.1323986582121472 + - 1.307009753411288 + - 1.3113396308765601 + - !!python/tuple + - 1.1533756998644094 + - 2.0626861344449368 + - 1.7278230976000817 + - 0.9293645150433945 + - 2.2427973794078926 + - 1.9189168930658569 + - 1.6814360871526521 + - 1.4312183659307158 + - 1.566255432024181 + - 1.6315146909057292 + - 1.1415650431482405 + - 1.3003687083242734 + - 1.3188131123733913 + - !!python/tuple + - 1.1533756998644094 + - 2.0626861344449368 + - 1.7278230976000817 + - 0.9293645150433945 + - 2.2427973794078926 + - 1.9189168930658569 + - 1.6814360871526521 + - 1.4312183659307158 + - 1.566255432024181 + - 1.6315146909057292 + - 1.1415650431482405 + - 1.3003687083242734 + - 1.3188131123733913 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000006458365 + - 9.500000015675443 + - 9.50000001730824 + - 9.500000006054561 + - 10.4999995000005 + - 9.500000013359537 + - 9.500000012096132 + - 9.500000008647817 + - 9.500000007106319 + - 9.50000001535589 + - 9.500000008209511 + - 9.500000011609893 + - 9.50000001154289 + - !!python/tuple + - 9.00001833397596 + - 9.000044967013604 + - 9.000049742571857 + - 9.000017179766 + - 10.998136568670553 + - 9.000038223267266 + - 9.000034559011524 + - 9.000024610579612 + - 9.000020188268048 + - 9.00004403442932 + - 9.000023351588318 + - 9.000033151536861 + - 9.000032957703326 + - !!python/tuple + - 8.500071476023747 + - 8.500175558167635 + - 8.500194252193438 + - 8.500066972071123 + - 11.493346309848137 + - 8.500149175648477 + - 8.500134848443354 + - 8.500095978369494 + - 8.500078713008683 + - 8.500171908642509 + - 8.500091062244564 + - 8.500129346713784 + - 8.500128589095308 + - !!python/tuple + - 8.00018035717539 + - 8.000443704284493 + - 8.000491091988895 + - 8.001833247915261 + - 11.25840589059718 + - 8.000376872437485 + - 8.000340601372422 + - 8.00046149722216 + - 8.000198640866632 + - 8.000434456175716 + - 8.000180014673905 + - 8.003978235297716 + - 8.003680857376484 + - !!python/tuple + - 7.500371755097546 + - 7.500916232551916 + - 7.501014413908787 + - 7.504594170111866 + - 10.92541888700305 + - 7.500777871444681 + - 7.5007028321520695 + - 7.501063244821795 + - 7.500409493838452 + - 7.500897078898657 + - 7.500345557959088 + - 7.509973086949843 + - 7.509219369867039 + - !!python/tuple + - 7.000680295215118 + - 7.001680120000626 + - 7.001860839364248 + - 7.008026334512173 + - 10.540574040038711 + - 7.001425663766629 + - 7.001287769623387 + - 7.001901771731977 + - 7.000749463495275 + - 7.001644879593132 + - 7.00064249457578 + - 7.017401011846499 + - 7.016094432476361 + - !!python/tuple + - 6.50115130430619 + - 6.502850061884365 + - 6.5031579458976 + - 6.5119774195831095 + - 10.123163494987372 + - 6.502416983478267 + - 6.502182501461219 + - 6.5030125872044175 + - 6.501268570793606 + - 6.502790053621453 + - 6.501134808453553 + - 6.5259296971987855 + - 6.5240068315426125 + - !!python/tuple + - 6.001844985592488 + - 6.004579670584376 + - 6.008016068040654 + - 6.016387601252149 + - 9.679611891106903 + - 6.005918074594383 + - 6.003503290506994 + - 6.0044617484326706 + - 6.002033293000904 + - 6.004482822243429 + - 6.001903338361087 + - 6.0354300604119295 + - 6.032845954402738 + - !!python/tuple + - 5.502842687310777 + - 5.507078506874508 + - 5.5159897060357235 + - 5.521304548045936 + - 9.218487733126448 + - 5.511618697063 + - 5.508642040535304 + - 5.506350060121946 + - 5.505705866128411 + - 5.506928052974359 + - 5.5030549192567175 + - 5.5459099479430245 + - 5.542629972088901 + - !!python/tuple + - 5.004256602075747 + - 5.010638820783843 + - 5.026948846437886 + - 5.026776576110961 + - 8.740999951042207 + - 5.0194339296851025 + - 5.01713135355977 + - 5.008824332659064 + - 5.011835882877865 + - 5.010411342982374 + - 5.004735506002308 + - 5.05749616397504 + - 5.053490820286156 + - !!python/tuple + - 4.506245316779304 + - 4.515679144814299 + - 4.541054730327871 + - 4.532916050665285 + - 8.25018517907115 + - 4.5294870130763645 + - 4.528801662136871 + - 4.512097877762425 + - 4.520189253413503 + - 4.5153415182528125 + - 4.507150750317509 + - 4.570446853655476 + - 4.565687900449981 + - !!python/tuple + - 4.009039823097995 + - 4.022818613240047 + - 4.058802951345753 + - 4.039918213775383 + - 7.748805863835674 + - 4.0421403891315 + - 4.043774966384836 + - 4.016486268565515 + - 4.030726239413482 + - 4.0223230464617 + - 4.0106002629208675 + - 4.085194518432506 + - 4.079651495738076 + - !!python/tuple + - 3.5129893341720244 + - 3.5330106952028686 + - 3.581151358452472 + - 3.5481011798236355 + - 7.239145972131322 + - 3.5580874403648544 + - 3.562525582443427 + - 3.5224714521724434 + - 3.543622019280715 + - 3.5322862626212266 + - 3.5155380812371178 + - 3.6024347468263738 + - 3.59607123256732 + - !!python/tuple + - 3.0186473521544213 + - 3.047800245151742 + - 3.109794293602217 + - 3.057984882570245 + - 6.723088919581002 + - 3.078549596266839 + - 3.086041061495763 + - 3.0308233954189325 + - 3.0593438886720796 + - 3.0467375423554577 + - 3.0226868051240774 + - 3.123300153440739 + - 3.1160691158055713 + - !!python/tuple + - 2.5269472013714296 + - 2.5698593678551274 + - 2.666560002108622 + - 2.570453058989961 + - 6.1982480245797325 + - 2.6058057242442465 + - 2.61617903393632 + - 2.542850053196141 + - 2.5788334692319377 + - 2.5682806709956707 + - 2.533271862557322 + - 2.649715919997636 + - 2.6415535865711313 + - !!python/tuple + - 2.0396010756525365 + - 2.1042210737815585 + - 2.2566527004931594 + - 2.0888030528111914 + - 5.663433380041905 + - 2.1439122522453085 + - 2.156862304411055 + - 2.0636573349527105 + - 2.106852356323965 + - 2.1018176359542062 + - 2.0495213685236484 + - 2.1886092552142715 + - 2.1791711141575534 + - !!python/tuple + - 1.560153147185865 + - 1.6614622342541012 + - 1.8652118965679163 + - 1.6204044420693766 + - 5.119973401953225 + - 1.6957269417640002 + - 1.7246641066010053 + - 1.5982277650046135 + - 1.650351887858066 + - 1.6514582973292735 + - 1.5768776690559767 + - 1.7470303725212124 + - 1.7345011238305852 + - !!python/tuple + - 1.097421066464465 + - 1.2666915306657878 + - 1.5121397560529695 + - 1.1747492271344764 + - 4.56797702056659 + - 1.2801561366320204 + - 1.336739893494171 + - 1.1698402898270852 + - 1.2171736939402698 + - 1.2412140581868154 + - 1.1255058506458315 + - 1.342174348180207 + - 1.3266271851174012 + - !!python/tuple + - 0.909386324304385 + - 1.3384995233404477 + - 1.3725301050260195 + - 0.8945827999342747 + - 1.7428775149825586 + - 1.1761152821955632 + - 1.189750809009337 + - 1.0391563847664105 + - 0.9718934071796581 + - 1.3113074696676865 + - 0.9998067788345776 + - 1.178778782179246 + - 1.1835285244308722 + - !!python/tuple + - 1.1225392670405903 + - 1.5609822892489087 + - 1.5039605362713644 + - 1.1049075394727264 + - 1.2976736222824865 + - 1.3932209935276476 + - 1.3889013255113685 + - 1.248137690067948 + - 1.1965501571463033 + - 1.4993726362804283 + - 1.2246647105987614 + - 1.3837536734861167 + - 1.3833596342436063 + - !!python/tuple + - 1.3912232700282152 + - 1.7629008834519895 + - 1.6319619151651712 + - 1.2661759973617734 + - 3.7841610834428807 + - 1.6269869398960188 + - 1.790066506541193 + - 1.5343537665105496 + - 1.4127123189140895 + - 1.6231726589607252 + - 1.5648787806742954 + - 1.6134257791227773 + - 1.583506929328145 + - !!python/tuple + - 1.2797041322445164 + - 1.6847618923266898 + - 1.592128085624554 + - 1.170546117878999 + - 3.814079448572871 + - 1.5365958355077072 + - 1.701022922299007 + - 1.4240688426994361 + - 1.326985446868202 + - 1.5046787341916166 + - 1.4516736527801244 + - 1.541412939315603 + - 1.5053686522810537 + - !!python/tuple + - 0.8834996650861107 + - 1.5778360398509885 + - 1.7726562909888284 + - 1.0706279388037365 + - 2.9842559579458676 + - 1.3203320429155776 + - 1.3905126736706288 + - 1.2186459206728333 + - 1.2677212784297174 + - 1.494086343436904 + - 1.0363683454954622 + - 1.5076810129801534 + - 1.5513384774691834 + - !!python/tuple + - 0.9284461813132875 + - 1.622926849633125 + - 1.7848225799925028 + - 1.1253265553674292 + - 2.790156886892081 + - 1.4009415652259638 + - 1.430678675545327 + - 1.2561959064942938 + - 1.331713905965521 + - 1.5366599099584943 + - 1.0779465141016127 + - 1.5371525545079003 + - 1.5921278651097135 + - !!python/tuple + - 0.9889527208572563 + - 1.6728245636176728 + - 1.779624335412206 + - 1.180305585896224 + - 2.599071627671466 + - 1.4906182186197776 + - 1.4939742969555527 + - 1.2903396245337297 + - 1.3975581895905647 + - 1.5744565164729705 + - 1.1367591398414656 + - 1.561333157299464 + - 1.6263636917107664 + - !!python/tuple + - 1.0565215511790977 + - 1.7232145751165568 + - 1.759006148360015 + - 1.2311039108637216 + - 2.413495352046153 + - 1.580034847748998 + - 1.5528097339212956 + - 1.3430555941377933 + - 1.4493128406642333 + - 1.5997404455079094 + - 1.200940916627884 + - 1.5918280355390055 + - 1.6562724216759805 + - !!python/tuple + - 1.0324557833658534 + - 1.7479296091205307 + - 1.7100944954901882 + - 1.1708826685142604 + - 2.5628356147834075 + - 1.5443623644735336 + - 1.5704533049469966 + - 1.3315185898237627 + - 1.3749012380836567 + - 1.546701222523033 + - 1.2152225412728586 + - 1.5716343013722787 + - 1.6548030656509556 + - !!python/tuple + - 1.0516754597718079 + - 1.7187529427198727 + - 1.7293245160953545 + - 1.1915457615730405 + - 2.5398143776635695 + - 1.5705344905894167 + - 1.5991805199933717 + - 1.3462088371763987 + - 1.401725431377132 + - 1.5693726115925313 + - 1.2210824957508137 + - 1.5825968048181158 + - 1.6715557454759833 + - !!python/tuple + - 1.0785119959395673 + - 1.6844095086736879 + - 1.7339550887788544 + - 1.2102662195227674 + - 2.512357970990736 + - 1.5914167917661455 + - 1.621527949414231 + - 1.368673624859106 + - 1.422944743792501 + - 1.579786320323549 + - 1.2318910513974561 + - 1.5995276666987084 + - 1.6784778657074781 + - !!python/tuple + - 1.1076103060675941 + - 1.658223306547899 + - 1.7160626083555532 + - 1.2256090765547722 + - 2.481431200926086 + - 1.6056467038465068 + - 1.6361100778043314 + - 1.396272849790587 + - 1.4377452111771725 + - 1.5779146768771124 + - 1.246202427842202 + - 1.620386270353587 + - 1.6758992972453435 + - !!python/tuple + - 1.1810608571222692 + - 1.6402442566394548 + - 1.5486721049694754 + - 1.2477159180377593 + - 2.411290826527776 + - 1.5636499387430227 + - 1.6614437424421518 + - 1.4310505791790114 + - 1.4509544917581654 + - 1.5784879007274677 + - 1.3062908183621669 + - 1.6437716398891646 + - 1.6249913582345197 + - !!python/tuple + - 1.2021965676866655 + - 1.6515222969013093 + - 1.5272682758168739 + - 1.2373164077103926 + - 2.393377202383511 + - 1.5423067848128353 + - 1.657035026441839 + - 1.414750178677735 + - 1.4048585265260722 + - 1.564549309265143 + - 1.3376565162755638 + - 1.6305209128673386 + - 1.5656525981786846 + - !!python/tuple + - 1.2028037081258904 + - 1.658112609943875 + - 1.5609247410355886 + - 1.2265369740498824 + - 2.3888508834171387 + - 1.5392496164367742 + - 1.6268521308916295 + - 1.4185697877153325 + - 1.364800592547665 + - 1.5491145948582692 + - 1.3441715543833181 + - 1.629538216520523 + - 1.54180972633284 + - !!python/tuple + - 1.1863382140273588 + - 1.6904909021436985 + - 1.6216861040002604 + - 1.2017093381684474 + - 2.359707515245412 + - 1.5246712755052323 + - 1.6129752584318269 + - 1.3803929670792086 + - 1.3188573202574372 + - 1.5353424966408846 + - 1.350718805051303 + - 1.593517922793643 + - 1.5156638667757425 + - !!python/tuple + - 1.1163629810405713 + - 1.6809331901415037 + - 1.629775877964494 + - 1.1672849088292019 + - 2.3210853293307445 + - 1.4744639940625073 + - 1.5728482456423474 + - 1.350694482945474 + - 1.3458623112236379 + - 1.4842980529980374 + - 1.2983382736135671 + - 1.5786392982707649 + - 1.5711307722229122 + - !!python/tuple + - 1.1168326153805532 + - 1.6398649511026957 + - 1.59050473970166 + - 1.1827539122465702 + - 2.3682904406466427 + - 1.5092939151865619 + - 1.6118028179630761 + - 1.3527245585164465 + - 1.3619948309027086 + - 1.517323100885644 + - 1.2714151047720632 + - 1.618760657726102 + - 1.5813211424244558 + - !!python/tuple + - 1.1267659434353279 + - 1.6436112280601058 + - 1.5702671370418004 + - 1.1964724592360645 + - 2.412780546115236 + - 1.5377807036815283 + - 1.6035797752203194 + - 1.3671468519196088 + - 1.3887944980735643 + - 1.5151360172125468 + - 1.2764435728793562 + - 1.6247095075989342 + - 1.5649408885864737 + - !!python/tuple + - 1.1450584809155855 + - 1.67780810484649 + - 1.5968496639299192 + - 1.2098257743045686 + - 2.4083097664391517 + - 1.5674140021785559 + - 1.6215805107482246 + - 1.398599437920898 + - 1.3847638779149274 + - 1.578014749079653 + - 1.2924149700613883 + - 1.6005003376626366 + - 1.5688197008096687 + - !!python/tuple + - 1.147800693565739 + - 1.6767426304073785 + - 1.6015946427229784 + - 1.1928381137195687 + - 2.4090741990038187 + - 1.5105413813711737 + - 1.6371852716738942 + - 1.378123808983844 + - 1.359298341347498 + - 1.5145755917385892 + - 1.3032762027345073 + - 1.5833883953816787 + - 1.5773805826494869 + - !!python/tuple + - 1.143759980171934 + - 1.677429194075792 + - 1.6183956762551894 + - 1.1906734773332295 + - 2.3739735342343793 + - 1.517504811607509 + - 1.6354662969964981 + - 1.376690339336028 + - 1.3631693579913655 + - 1.5113663884716009 + - 1.2981725190865097 + - 1.6128263700075645 + - 1.5777615597664076 + - !!python/tuple + - 1.1419538323778682 + - 1.6756505389676064 + - 1.6150999311968082 + - 1.1907855021055525 + - 2.3684031701849007 + - 1.5134874204840845 + - 1.6238411484834356 + - 1.3696476806728852 + - 1.3751316406030596 + - 1.5158662597857515 + - 1.3015536377925792 + - 1.611982906825036 + - 1.5723052039884036 + - !!python/tuple + - 1.1419538323778682 + - 1.6756505389676064 + - 1.6150999311968082 + - 1.1907855021055525 + - 2.3684031701849007 + - 1.5134874204840845 + - 1.6238411484834356 + - 1.3696476806728852 + - 1.3751316406030596 + - 1.5158662597857515 + - 1.3015536377925792 + - 1.611982906825036 + - 1.5723052039884036 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000006024784 + - 10.4999995000005 + - 9.500000012766604 + - 9.500000006336188 + - 9.500000023121846 + - 9.500000011343548 + - 9.500000006063832 + - 9.500000020527326 + - 9.500000011839393 + - 9.500000011893627 + - 9.50000000963569 + - 9.500000014758333 + - 9.500000009001171 + - !!python/tuple + - 9.0001931413491 + - 10.203563601920312 + - 9.000036502289907 + - 9.001944613266222 + - 9.000066887102143 + - 9.00041363751926 + - 9.000675588192392 + - 9.000059208525993 + - 9.000033815662832 + - 9.000538608949844 + - 8.999629705385802 + - 9.00004229228601 + - 9.002842755203233 + - !!python/tuple + - 8.500470036263602 + - 9.816735385935555 + - 8.50014244594921 + - 8.5043137156538 + - 8.500261441745902 + - 8.49942661500912 + - 8.501550174232388 + - 8.500231334523018 + - 8.500131942637577 + - 8.501276783155488 + - 8.499155103177587 + - 8.500165091994104 + - 8.506260566231976 + - !!python/tuple + - 8.000821395340106 + - 9.391116426273602 + - 8.000359833413617 + - 8.006864603058727 + - 8.000661630546306 + - 7.997631325207765 + - 8.002543915388268 + - 8.00058517108217 + - 8.000333246902475 + - 8.002176485399106 + - 7.998685723126806 + - 8.000417185123961 + - 8.009910815898328 + - !!python/tuple + - 7.501261248117545 + - 8.944272110383437 + - 7.500742615718154 + - 7.509542725038586 + - 7.501368259890208 + - 7.495398291660756 + - 7.503646866100286 + - 7.501209517597833 + - 7.5006876213744835 + - 7.503260676573192 + - 7.498294858797791 + - 7.5008613153865 + - 7.513725349515409 + - !!python/tuple + - 7.001816761768626 + - 8.484537198110704 + - 7.001360867387686 + - 7.012350682490673 + - 7.002513219997332 + - 6.992967685592495 + - 7.004876013591192 + - 7.002220343575446 + - 7.001259827256795 + - 7.004582973537747 + - 6.998050784995728 + - 7.001579092307358 + - 7.017716443432115 + - !!python/tuple + - 6.50252759538378 + - 8.016723289784624 + - 6.502306782015872 + - 6.515320339710582 + - 6.504271454615389 + - 6.490520714097442 + - 6.506266509165312 + - 6.503771162134017 + - 6.502135004997281 + - 6.506224353440783 + - 6.498030054972064 + - 6.502678055065389 + - 6.521937120397556 + - !!python/tuple + - 6.003448599270032 + - 7.544075394443273 + - 6.003703513262632 + - 6.018507366004434 + - 6.006878822948087 + - 5.9882186344510675 + - 6.007871683854723 + - 6.006068465434373 + - 6.0034267915596775 + - 6.008298370056332 + - 5.9983273378645015 + - 6.004302113535744 + - 6.026474211843659 + - !!python/tuple + - 5.504655161678189 + - 7.069131638269862 + - 5.505718567956015 + - 5.521994037300789 + - 5.51065951967476 + - 5.486228629037809 + - 5.509767418397303 + - 5.509395344817297 + - 5.505289601551632 + - 5.510962515211545 + - 5.499066486046635 + - 5.506647407747799 + - 5.5314533254189 + - !!python/tuple + - 5.006252036027797 + - 6.59419819340212 + - 5.008584742678647 + - 5.02589781137281 + - 5.016069572822703 + - 4.984747146178119 + - 5.012060709224398 + - 5.014148832034378 + - 5.007937797875728 + - 5.014437416887176 + - 5.000416023908353 + - 5.0099871750566045 + - 5.037052288142889 + - !!python/tuple + - 4.508449475697985 + - 6.106125507077162 + - 4.512634087664842 + - 4.531326708040532 + - 4.5237685473040194 + - 4.481744993848748 + - 4.514904255913458 + - 4.53300464392856 + - 4.511676740100262 + - 4.519038636571151 + - 4.499151339905137 + - 4.5218906889578205 + - 4.5449561086290595 + - !!python/tuple + - 4.01145222528208 + - 5.605676712713783 + - 4.018355496963716 + - 4.038350597527642 + - 4.03474320746783 + - 3.977995454624196 + - 4.0185212872767995 + - 4.065263349051371 + - 4.016955334328401 + - 4.025230844776996 + - 3.9962605513614013 + - 4.041844890883852 + - 4.055283170544185 + - !!python/tuple + - 3.5167299256655475 + - 5.102237183578794 + - 3.5264977433076274 + - 3.548747263406613 + - 3.5505324859035454 + - 3.473243799070945 + - 3.5239546008913742 + - 3.611206488791811 + - 3.524459860807647 + - 3.5360482112820097 + - 3.4914934524272434 + - 3.5699749038584767 + - 3.5704688159 + - !!python/tuple + - 3.024618248578139 + - 4.587669915980576 + - 3.0382664212542974 + - 3.0627868797248015 + - 3.073663270228487 + - 2.968676955624569 + - 3.031630604085775 + - 3.1723535214501677 + - 3.0352929435191305 + - 3.052353019945303 + - 2.9861723697073588 + - 3.1072187903979493 + - 3.0910181068170925 + - !!python/tuple + - 2.535859649879692 + - 4.062780595548218 + - 2.5557328922447438 + - 2.5812322559400673 + - 2.608557438048905 + - 2.4659247071510384 + - 2.5423715703165937 + - 2.752042978497062 + - 2.5513444999646078 + - 2.575931378021846 + - 2.4820124640792445 + - 2.65575856908121 + - 2.618185993366794 + - !!python/tuple + - 2.0531774395367974 + - 3.530431278350254 + - 2.0827773076764102 + - 2.1079127710610672 + - 2.163565216770481 + - 1.96534376244008 + - 2.058825099164467 + - 2.3396259337424516 + - 2.081491201550185 + - 2.1103558032262715 + - 1.9875939348164169 + - 2.2255206232941296 + - 2.1524604617212373 + - !!python/tuple + - 1.580631835729107 + - 2.989177586974675 + - 1.6275675703974677 + - 1.646877719195662 + - 1.7557368029063771 + - 1.4683506355354403 + - 1.5940737400034204 + - 1.9359413404406967 + - 1.6387574925360882 + - 1.663198711271412 + - 1.5143333644428247 + - 1.811796729052515 + - 1.6946097454966418 + - !!python/tuple + - 1.0884796695493586 + - 1.6285672052334053 + - 1.4142415527401675 + - 1.1190170130987656 + - 1.7905250874239644 + - 1.2766442740525066 + - 1.1155810488318165 + - 1.5460364049147415 + - 1.4152148116823353 + - 1.410883184715274 + - 1.3016981764144324 + - 1.4057574379927884 + - 1.2786543402157964 + - !!python/tuple + - 1.2796502840206816 + - 1.9227919001436082 + - 1.5936218310612378 + - 1.3235955879949457 + - 1.980163754822874 + - 1.4656257020749395 + - 1.3250179023385564 + - 1.7496678297083283 + - 1.6328930312895753 + - 1.6258791822744532 + - 1.5141353190991937 + - 1.6044606457747153 + - 1.4890679869585959 + - !!python/tuple + - 1.1507685819054039 + - 2.6765976146301234 + - 1.6829538304136622 + - 1.3353208991322585 + - 1.9819634120926293 + - 1.1203044959287265 + - 1.3842560636169474 + - 1.7896009738710659 + - 1.7752408726332294 + - 1.5810090852769656 + - 1.4833681345457612 + - 1.7382145828226117 + - 1.4565829916935937 + - !!python/tuple + - 1.0571423305497414 + - 2.50547231133447 + - 1.6117079656713504 + - 1.2345584937643865 + - 1.9013300569578884 + - 1.0438178780128018 + - 1.2754690534821134 + - 1.6754993931292579 + - 1.6687348528755575 + - 1.4740338679164386 + - 1.3854380306729492 + - 1.6508213850612132 + - 1.3491297417224624 + - !!python/tuple + - 1.137889960209543 + - 1.9185466978481085 + - 1.4849789036044192 + - 1.1747583196773175 + - 1.89219432431528 + - 1.3227701844505457 + - 1.1705153205279464 + - 1.6530254963419748 + - 1.574765552195828 + - 1.5755169948955108 + - 1.411380839894942 + - 1.4365908348226797 + - 1.314520900223328 + - !!python/tuple + - 1.190460489391351 + - 2.041164786465409 + - 1.5215808695343644 + - 1.2312635901878486 + - 1.942334255274621 + - 1.3672378434005041 + - 1.2380210016786455 + - 1.7323777226770678 + - 1.6376814981691927 + - 1.6444248412456028 + - 1.4717012921517465 + - 1.4757652649735555 + - 1.3772922224723807 + - !!python/tuple + - 1.1078062061594807 + - 2.5272112447189947 + - 1.5895164024484811 + - 1.2903088085042327 + - 1.8673739080756637 + - 1.167446973539984 + - 1.2868189857944945 + - 1.7148312905485084 + - 1.7102533587319964 + - 1.6159286725298407 + - 1.4732952849252041 + - 1.7093878449340976 + - 1.43829721787409 + - !!python/tuple + - 1.084016675124663 + - 2.4545459776319745 + - 1.567667679604786 + - 1.2615677709890019 + - 1.8514880093811932 + - 1.1540855884395953 + - 1.2540516367355024 + - 1.6647276505691428 + - 1.6838713268531122 + - 1.5766708545300627 + - 1.4500863719435186 + - 1.667738624316748 + - 1.394313388237712 + - !!python/tuple + - 1.1516208560003676 + - 2.1126631248089893 + - 1.5717040567158589 + - 1.2141586756742537 + - 1.9600907434371686 + - 1.287559006653494 + - 1.2457187498263216 + - 1.740582345906353 + - 1.6302531561238556 + - 1.5914220602138744 + - 1.4177038931556687 + - 1.4840582090309535 + - 1.3758153956071582 + - !!python/tuple + - 1.1636940086570562 + - 2.1713086219499043 + - 1.5852358102673907 + - 1.2265920046500172 + - 1.9668035588103987 + - 1.2992062418301595 + - 1.2657104966390413 + - 1.7523072271445301 + - 1.6585170738320492 + - 1.6121432315537358 + - 1.45113371504225 + - 1.4961728429156667 + - 1.378862543282373 + - !!python/tuple + - 1.1799572601506707 + - 2.251032144246947 + - 1.6054699767357117 + - 1.2570346625120605 + - 1.9638795956636892 + - 1.290929019171938 + - 1.3052369775961323 + - 1.7656441478900455 + - 1.7013513970460297 + - 1.6511671802644239 + - 1.4924412763768995 + - 1.5587728640434344 + - 1.413002777482583 + - !!python/tuple + - 1.13434488929641 + - 2.370032766051317 + - 1.5812968315270748 + - 1.2885666721044637 + - 1.8917887136218605 + - 1.2063936543380327 + - 1.2859771571358347 + - 1.704890951429949 + - 1.7031283112676707 + - 1.6393976897900346 + - 1.4918092607759807 + - 1.6769342730018992 + - 1.4406722189046164 + - !!python/tuple + - 1.1259358984046908 + - 2.3509639934800206 + - 1.5729086344443721 + - 1.2829188819803348 + - 1.8901038650317692 + - 1.2042907187589145 + - 1.27603028203006 + - 1.7188572908835593 + - 1.6875194400331726 + - 1.6241987568718284 + - 1.4685720654589816 + - 1.6614236678919823 + - 1.4310455193320168 + - !!python/tuple + - 1.1193683900881997 + - 2.328480589754864 + - 1.565827434086295 + - 1.2758075875994208 + - 1.8921048738183643 + - 1.2080258389909144 + - 1.2691993651217872 + - 1.7167431538013898 + - 1.6791545933566614 + - 1.6085311907993345 + - 1.4531436098915105 + - 1.6313725841558533 + - 1.413200043973515 + - !!python/tuple + - 1.1151466755497503 + - 2.30407018771065 + - 1.5606766624649242 + - 1.2679543573330299 + - 1.8972197702170552 + - 1.2166582056421258 + - 1.2657246729152911 + - 1.7002634394197764 + - 1.6780135704813972 + - 1.5937235888959784 + - 1.4460060082031958 + - 1.5912785562289964 + - 1.3893493121164973 + - !!python/tuple + - 1.1461153084185935 + - 2.1968762734316427 + - 1.583720051849256 + - 1.2351799191860904 + - 1.9372472509554064 + - 1.2519103441643127 + - 1.2600172511560348 + - 1.711274242152904 + - 1.660819717638168 + - 1.6036702876204159 + - 1.443885632599078 + - 1.5549154915872438 + - 1.3999764524681944 + - !!python/tuple + - 1.1481324065915979 + - 2.2277335531416473 + - 1.5875173277785395 + - 1.2355227168018241 + - 1.9337464709148904 + - 1.2488658994670179 + - 1.2628118571425722 + - 1.7332635014804676 + - 1.664477742333065 + - 1.610881423276945 + - 1.4526138434785703 + - 1.5695742088254077 + - 1.4032747595328876 + - !!python/tuple + - 1.1384699715239623 + - 2.2628066119725943 + - 1.5813595124872908 + - 1.2390975955413408 + - 1.9236697321806524 + - 1.2343164820675916 + - 1.2690643811043978 + - 1.7047772548808198 + - 1.6690215297778521 + - 1.6054106715694807 + - 1.4451614731482265 + - 1.5560976541803053 + - 1.4016261540704833 + - !!python/tuple + - 1.1407828349301674 + - 2.265565995363931 + - 1.5829411973324437 + - 1.2410685764293774 + - 1.9188990016951224 + - 1.2292492908130261 + - 1.2641721875017689 + - 1.7259603213511567 + - 1.6715812608441782 + - 1.6093688719577417 + - 1.457719855695438 + - 1.5988605735343362 + - 1.4018051275812073 + - !!python/tuple + - 1.1369812224284188 + - 2.2760141609667155 + - 1.5779010976069567 + - 1.2552753854335366 + - 1.9197653589381245 + - 1.2329721133930829 + - 1.2764879226396522 + - 1.7148425863483707 + - 1.6796046061456165 + - 1.612749021144018 + - 1.4577646299136227 + - 1.5872300572079001 + - 1.4059687064909983 + - !!python/tuple + - 1.1369812224284188 + - 2.2760141609667155 + - 1.5779010976069567 + - 1.2552753854335366 + - 1.9197653589381245 + - 1.2329721133930829 + - 1.2764879226396522 + - 1.7148425863483707 + - 1.6796046061456165 + - 1.612749021144018 + - 1.4577646299136227 + - 1.5872300572079001 + - 1.4059687064909983 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000004700096 + - 9.500000024864637 + - 9.500000018133074 + - 9.500000004574957 + - 9.500000072472044 + - 9.500000008394883 + - 9.50000001453487 + - 9.500000006682454 + - 9.500000012216972 + - 9.500000007255545 + - 9.5000000073501 + - 9.500000017098733 + - 9.500000008686868 + - !!python/tuple + - 9.000013315923606 + - 9.00007206965237 + - 9.000052161619587 + - 9.000012959541985 + - 9.000221395598908 + - 9.00002388389645 + - 9.000041641388473 + - 9.000018974957108 + - 9.000034909037348 + - 9.000020615700121 + - 9.000020886609239 + - 9.000049128838434 + - 9.000024722811007 + - !!python/tuple + - 8.500051898695927 + - 8.500281775717527 + - 8.500203725184015 + - 8.500050508720625 + - 8.500872159914996 + - 8.500093140726882 + - 8.50016254548761 + - 8.500073977499815 + - 8.50013621680011 + - 8.500080381408226 + - 8.500081438890062 + - 8.50019184919546 + - 8.500096416644313 + - !!python/tuple + - 8.00013091713471 + - 8.000713308646649 + - 8.000515115352282 + - 8.000127408075128 + - 8.002226711076535 + - 8.00023510361601 + - 8.000410734062674 + - 8.000186676500409 + - 8.000344064850555 + - 8.000202856532363 + - 8.000205528660866 + - 8.000484999107988 + - 8.0002433850087 + - !!python/tuple + - 7.5002697554161974 + - 7.501475642114471 + - 7.50106421102038 + - 7.500262518539981 + - 7.504651021855493 + - 7.500484783753251 + - 7.50084795917475 + - 7.500384797522324 + - 7.500709995967092 + - 7.500418196600769 + - 7.500423713168011 + - 7.501001786743314 + - 7.50050188880375 + - !!python/tuple + - 7.000493447421748 + - 7.00271152625198 + - 7.001952548798551 + - 7.000480196088046 + - 7.008640462692783 + - 7.000887515238807 + - 7.001554527875026 + - 7.000704197382776 + - 7.001300930724042 + - 7.000765416886889 + - 7.0007755300768615 + - 7.001837589677592 + - 7.000918890017472 + - !!python/tuple + - 6.500834717972935 + - 6.504610568193154 + - 6.503314283416889 + - 6.500812276175185 + - 6.514877158123335 + - 6.501502734936849 + - 6.502636244321545 + - 6.501191823229761 + - 6.5022048748319845 + - 6.501295623268817 + - 6.501312773452197 + - 6.503118322294617 + - 6.5015559741437805 + - !!python/tuple + - 6.0013369626157225 + - 6.0074287887919695 + - 6.005329484292814 + - 6.001300970151933 + - 6.0243193743505685 + - 6.002409526330149 + - 6.004234668189348 + - 6.00191004319953 + - 6.0035393295171415 + - 6.002076744086388 + - 6.002104292272913 + - 6.005012837567772 + - 6.002495105236928 + - !!python/tuple + - 5.502058709868086 + - 5.511518706584836 + - 5.508244421440883 + - 5.502003201845244 + - 5.538344732878205 + - 5.503714966627905 + - 5.506542692079999 + - 5.502943150697986 + - 5.505464022717125 + - 5.50320064294078 + - 5.503243204421613 + - 5.507751822705905 + - 5.503847294639189 + - !!python/tuple + - 5.003080504666861 + - 5.01737716790475 + - 5.01240352951236 + - 5.002997295682379 + - 5.058986211225881 + - 5.005567084375887 + - 5.009828958283015 + - 5.004407432322788 + - 5.008200794003122 + - 5.0047941392295545 + - 5.00485807578371 + - 5.011657528749796 + - 5.005766064348983 + - !!python/tuple + - 4.5045159043017735 + - 4.52572437439368 + - 4.5183017192920785 + - 4.504393657824263 + - 4.589331128974553 + - 4.508175711996922 + - 4.514477588227237 + - 4.506467315859925 + - 4.512065821338939 + - 4.507036704121494 + - 4.507130874171241 + - 4.517192346869594 + - 4.508469125588999 + - !!python/tuple + - 4.006529793030703 + - 4.037640482127289 + - 4.026673933169737 + - 4.00635256089733 + - 4.1342064986370115 + - 4.011847521932372 + - 4.02105577523505 + - 4.0093623955283375 + - 4.017524206577172 + - 4.0101901161206435 + - 4.010327063740671 + - 4.025041827051087 + - 4.012274826515436 + - !!python/tuple + - 3.5093704773743792 + - 3.554814550209229 + - 3.5386569736579374 + - 3.5091152988683714 + - 3.7013433969429332 + - 3.517048066212533 + - 3.5304351516928643 + - 3.5134550660285333 + - 3.5252875189022124 + - 3.514650814000844 + - 3.514848746340716 + - 3.5362644402416414 + - 3.517666739984556 + - !!python/tuple + - 3.013429604078787 + - 3.080027019122219 + - 3.056101673075042 + - 3.013062322208971 + - 3.303195744459901 + - 3.0245190356697402 + - 3.044024601791626 + - 3.019320070945513 + - 3.0365000140486322 + - 3.0210485001333383 + - 3.021334779951586 + - 3.0525800723115237 + - 3.0254158442044017 + - !!python/tuple + - 2.5193634488391776 + - 2.6181511580533643 + - 2.5822245195526117 + - 2.518830849757279 + - 2.9589927841509343 + - 2.5355190768406155 + - 2.5642550003831075 + - 2.527927294603895 + - 2.5531249085277214 + - 2.530447849210136 + - 2.530865657187854 + - 2.5769720300735974 + - 2.536831681457266 + - !!python/tuple + - 2.028366246969224 + - 2.1783737300307275 + - 2.1230999817966794 + - 2.0275797254060373 + - 2.6942571818910883 + - 2.0523751600753153 + - 2.0956965528201255 + - 2.0410577078645233 + - 2.0788349010621356 + - 2.0448085487787577 + - 2.0454309411018805 + - 2.115069356318738 + - 2.054337896059181 + - !!python/tuple + - 1.5428852189249969 + - 1.7792394244173697 + - 1.691420564073258 + - 1.5416817149356103 + - 2.532160648459172 + - 1.5799441173540176 + - 1.647966373505585 + - 1.562401934607169 + - 1.6213586830337874 + - 1.5682023638254794 + - 1.569166180670976 + - 1.6786677903891687 + - 1.5829981693706556 + - !!python/tuple + - 1.0689521848710783 + - 1.458155210031541 + - 1.3162987648359146 + - 1.066979668064855 + - 2.4790404243296154 + - 1.1303420754398368 + - 1.2441989980253665 + - 1.1011484745354847 + - 1.1996832992582365 + - 1.1107801924303744 + - 1.1123828765558188 + - 1.2952430046360668 + - 1.1354416293834197 + - !!python/tuple + - 1.0282438654933075 + - 1.8775939634625298 + - 1.5895252033885727 + - 1.0181338103457525 + - 1.4401641579742348 + - 1.2162669134900637 + - 1.5558679808744345 + - 1.1398001817068235 + - 1.449013372380158 + - 1.1947908889824739 + - 1.170046131802535 + - 1.552430481914889 + - 1.2598522513376682 + - !!python/tuple + - 1.15868287509481 + - 2.29787695831902 + - 1.9275788045236133 + - 1.119489320191422 + - 2.7391199468364182 + - 1.4020829319845165 + - 1.8856610917330756 + - 1.4033429919748883 + - 1.6640839496375617 + - 1.5186100281100443 + - 1.3148776861917255 + - 1.7934659916337918 + - 1.5815125993126664 + - !!python/tuple + - 1.052995932582275 + - 2.198536169342148 + - 1.8212648786843244 + - 1.0235524456008052 + - 2.4335840857267663 + - 1.2929374616647125 + - 1.7822284523338838 + - 1.3230817070002432 + - 1.5711588345706784 + - 1.4378101638708436 + - 1.2050273214226517 + - 1.6716275211756777 + - 1.497087018632064 + - !!python/tuple + - 0.9515945780295928 + - 2.106845796799938 + - 1.7278423592811332 + - 0.9328989744987495 + - 2.1467937918169397 + - 1.193090714044149 + - 1.6823666729003903 + - 1.2477546637851602 + - 1.4848966782847077 + - 1.35092462036036 + - 1.1038152958474077 + - 1.574112329468634 + - 1.4123612539406867 + - !!python/tuple + - 1.0088148093685025 + - 1.9187254233075575 + - 1.7969917484177302 + - 1.0179970759416235 + - 2.1231226991305108 + - 1.3297450687274481 + - 1.704588948918182 + - 1.1558478767872522 + - 1.5896365374476131 + - 1.274099495105293 + - 1.2530275070954275 + - 1.7567887039434507 + - 1.343889742143331 + - !!python/tuple + - 1.0030999335361455 + - 2.1513914828012104 + - 1.8282234433055007 + - 0.9904605219978309 + - 2.395489692445476 + - 1.2802372970916591 + - 1.8017451766893848 + - 1.3220842771725847 + - 1.6117718868022637 + - 1.391653425806065 + - 1.1821270461734166 + - 1.7353898653395097 + - 1.4846102589908527 + - !!python/tuple + - 0.9690251081698196 + - 2.0739964573424055 + - 1.809363836629798 + - 0.9566650599310219 + - 2.352677804604661 + - 1.2423775507833106 + - 1.762099221028928 + - 1.2855361825967297 + - 1.5898754269655866 + - 1.3575779388770057 + - 1.1524334436000392 + - 1.7110427943105537 + - 1.4506216247832755 + - !!python/tuple + - 0.9481316823788271 + - 2.0456779192662697 + - 1.7395796044922287 + - 0.9585318973950334 + - 2.1265598161048946 + - 1.2779622234336578 + - 1.6777192147736137 + - 1.1265203323574737 + - 1.543813777355842 + - 1.2499314405454667 + - 1.1851814856066143 + - 1.6814659495308881 + - 1.3214283247234178 + - !!python/tuple + - 0.9709550356043292 + - 2.0641717602247076 + - 1.7514015653220742 + - 0.9803421267293118 + - 2.132897370580002 + - 1.2993671272163827 + - 1.7046661652113682 + - 1.149117407617922 + - 1.5469035977361736 + - 1.2811253395538256 + - 1.2018086357796207 + - 1.6801819002305354 + - 1.3459559891386563 + - !!python/tuple + - 0.991115998967989 + - 2.0897044756736154 + - 1.7731483834199906 + - 0.9981819587151597 + - 2.1671229911439016 + - 1.3175113310825959 + - 1.7271846224146428 + - 1.1735647147331618 + - 1.5427608664128163 + - 1.3068630894281899 + - 1.2130737003164809 + - 1.6929093318464996 + - 1.3689833686504016 + - !!python/tuple + - 1.007140722649416 + - 2.119540858275143 + - 1.8017678945100364 + - 1.0108762325990832 + - 2.2246451952625237 + - 1.331153295372274 + - 1.743945067719132 + - 1.1974021222254805 + - 1.5391474448685822 + - 1.3208628138735072 + - 1.2210207426803439 + - 1.7170988954672053 + - 1.3864762112340039 + - !!python/tuple + - 0.9873420975989853 + - 2.202240493392765 + - 1.8454942132695369 + - 0.9826690364284152 + - 2.3307449383263563 + - 1.2907130875618817 + - 1.7738396609834555 + - 1.2714676884370368 + - 1.6043302203972596 + - 1.3193975030408693 + - 1.2013141493055008 + - 1.7407008659981689 + - 1.4232334008948253 + - !!python/tuple + - 0.9758908024652958 + - 2.15113800833495 + - 1.8529247370758586 + - 0.9700696054344027 + - 2.3227720375520096 + - 1.2741730098040458 + - 1.7662856648012994 + - 1.2547749423234709 + - 1.5936715967779966 + - 1.327483342293226 + - 1.1903853348569922 + - 1.714042655731605 + - 1.421955261461998 + - !!python/tuple + - 0.9404454013442162 + - 2.0400370931600404 + - 1.834004104811414 + - 0.9400797801164781 + - 2.241106694488787 + - 1.2423710926391178 + - 1.716112773273262 + - 1.1947541312655874 + - 1.5756290822767445 + - 1.2933430569396638 + - 1.1703847115217871 + - 1.6840840247635491 + - 1.3809918344900343 + - !!python/tuple + - 0.9570015187167048 + - 2.0807431912394265 + - 1.801467826601561 + - 0.9635634538178484 + - 2.195479746110611 + - 1.279214534256882 + - 1.702462131440795 + - 1.1798250903793972 + - 1.5432293059410584 + - 1.2624447322171013 + - 1.1887606559948443 + - 1.699207626921675 + - 1.3524049031047252 + - !!python/tuple + - 0.9670990921620803 + - 2.0630450915962593 + - 1.7898817592883698 + - 0.9713782883517003 + - 2.210387695907381 + - 1.2857483724501932 + - 1.7086569978607151 + - 1.1789560426061296 + - 1.5358519167332778 + - 1.2856012667422698 + - 1.187477597826818 + - 1.702634945011011 + - 1.363681853078365 + - !!python/tuple + - 0.9830170005490055 + - 2.0617712287456875 + - 1.7938669682358392 + - 0.9839342568559207 + - 2.23685676110254 + - 1.296212980099053 + - 1.7340789214585528 + - 1.1999473734747341 + - 1.5399993869501334 + - 1.2993287880720428 + - 1.2009873374527549 + - 1.6784580015975905 + - 1.3768101939688155 + - !!python/tuple + - 0.9875618998512415 + - 2.0762685751140517 + - 1.8073889349381838 + - 0.9876205195399351 + - 2.2470746920153646 + - 1.2992765811649196 + - 1.7424103634666057 + - 1.219338334023837 + - 1.545009411558656 + - 1.2906981388332068 + - 1.2077589519587049 + - 1.6819421154757828 + - 1.3789098200227194 + - !!python/tuple + - 0.9894503119764405 + - 2.098132691186847 + - 1.826012232385839 + - 0.9894499116211716 + - 2.2376030555290316 + - 1.3006172351113905 + - 1.7445354452091333 + - 1.2342870810458908 + - 1.5494810034611506 + - 1.2882648781365749 + - 1.2095449813588537 + - 1.7006817236833758 + - 1.3838623419566414 + - !!python/tuple + - 0.9550705989215548 + - 2.140758712966454 + - 1.8131780595239668 + - 0.9629851679919711 + - 2.1994132067974212 + - 1.2760240729441958 + - 1.723907799580645 + - 1.217453853332476 + - 1.5704038552908346 + - 1.2719472977494337 + - 1.191270557028076 + - 1.7083219184391905 + - 1.3728686189141084 + - !!python/tuple + - 0.9700346926692995 + - 2.152582920101465 + - 1.8415178896524529 + - 0.9702400517281066 + - 2.2423382462556294 + - 1.2835468513641632 + - 1.7406075823735156 + - 1.2205065959973886 + - 1.5499794211039817 + - 1.2961143874312617 + - 1.1925902544336584 + - 1.6950937419385446 + - 1.3876825469331333 + - !!python/tuple + - 0.9700346926692995 + - 2.152582920101465 + - 1.8415178896524529 + - 0.9702400517281066 + - 2.2423382462556294 + - 1.2835468513641632 + - 1.7406075823735156 + - 1.2205065959973886 + - 1.5499794211039817 + - 1.2961143874312617 + - 1.1925902544336584 + - 1.6950937419385446 + - 1.3876825469331333 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000004406346 + - 9.500000020709221 + - 9.500000010812077 + - 9.500000010201006 + - 9.500000069202946 + - 9.500000008038407 + - 9.500000006974718 + - 9.50000001544829 + - 9.500000010523959 + - 9.500000020374463 + - 9.500000008866582 + - 9.500000009834833 + - 9.50000000742426 + - !!python/tuple + - 9.000012479516785 + - 9.000059745419387 + - 9.000030845482764 + - 9.000029082005492 + - 9.000210658812865 + - 9.000022860441439 + - 9.000019811436662 + - 9.000044304016026 + - 9.000030013706777 + - 9.000058757497275 + - 9.000025239429467 + - 9.000028026437802 + - 9.000021099130308 + - !!python/tuple + - 8.500048636590167 + - 8.500233438869062 + - 8.500120334276618 + - 8.500113443814739 + - 8.500829429757825 + - 8.500089144588399 + - 8.500077242183032 + - 8.500172963591746 + - 8.500117084103803 + - 8.500229566813172 + - 8.500098434159131 + - 8.500109320000112 + - 8.500082268478314 + - !!python/tuple + - 8.000122682032115 + - 8.000590513000239 + - 8.000303873150823 + - 8.000286442487964 + - 8.00211636503417 + - 8.000225002665118 + - 8.000194924605715 + - 8.000437129373664 + - 8.000295650795385 + - 8.00058068397931 + - 8.000248485624205 + - 8.000276012318713 + - 8.000207624991079 + - !!python/tuple + - 7.500252772387655 + - 7.50122060310096 + - 7.500626884691069 + - 7.500590854451935 + - 7.504417573932669 + - 7.500463923075504 + - 7.500401822460226 + - 7.500902615084442 + - 7.500609887515591 + - 7.501200206603886 + - 7.500512424990158 + - 7.500569298757255 + - 7.5004280411509665 + - !!python/tuple + - 7.000462351214495 + - 7.002240785285961 + - 7.001148284808555 + - 7.001082139420489 + - 7.008200506162084 + - 7.000849257204043 + - 7.000735401647154 + - 7.0016550649975855 + - 7.001117078668887 + - 7.0022031753264855 + - 7.00093821792758 + - 7.001042575349077 + - 7.000783464602127 + - !!python/tuple + - 6.500782057223024 + - 6.503806059687245 + - 6.5019454660534866 + - 6.501833114453979 + - 6.514107299069826 + - 6.501437826253813 + - 6.501244727529239 + - 6.5028073966011535 + - 6.5018924564054865 + - 6.503741855397151 + - 6.501588775157869 + - 6.501765929176483 + - 6.501326229575972 + - !!python/tuple + - 6.001252508707283 + - 6.006124952281531 + - 6.0031216285023135 + - 6.002940824742305 + - 6.023037729879894 + - 6.002305208975601 + - 6.001994999589877 + - 6.004510810541031 + - 6.00303631386267 + - 6.006021032695329 + - 6.002547838132213 + - 6.002832736162728 + - 6.002125907779249 + - !!python/tuple + - 5.501928471409072 + - 5.509483395042927 + - 5.50481685533257 + - 5.504536915174096 + - 5.536281872191105 + - 5.503553699058043 + - 5.503074365019179 + - 5.506971529504265 + - 5.504684747592898 + - 5.509321416094343 + - 5.503928846793737 + - 5.504369615422638 + - 5.503276601906604 + - !!python/tuple + - 5.002885284526702 + - 5.014282487530001 + - 5.007225373590709 + - 5.006803778142612 + - 5.055738492641407 + - 5.005324650450955 + - 5.00460447064026 + - 5.010477071213379 + - 5.00702639143909 + - 5.014036626735015 + - 5.005888716139177 + - 5.006551918335891 + - 5.004908249382236 + - !!python/tuple + - 4.504229119629995 + - 4.521100534447399 + - 4.510623457674518 + - 4.5100006285892125 + - 4.5842846324837705 + - 4.507818330907583 + - 4.50675739703314 + - 4.515439063007192 + - 4.510329454009445 + - 4.520733937268214 + - 4.508650026683557 + - 4.509628722912284 + - 4.5072047791060665 + - !!python/tuple + - 4.00611405515323 + - 4.030799676295868 + - 4.015416557361823 + - 4.014507487465842 + - 4.126413589640433 + - 4.011327252898783 + - 4.009784018852589 + - 4.022466204200114 + - 4.014987356605906 + - 4.030258619138071 + - 4.012538347636112 + - 4.013964961511459 + - 4.0104345510448365 + - !!python/tuple + - 3.508771971704574 + - 3.544719301222956 + - 3.5222232478251256 + - 3.520903416985716 + - 3.689333498297998 + - 3.5162951386102037 + - 3.514064032620939 + - 3.5324955024630835 + - 3.52159997385549 + - 3.543923126864439 + - 3.51804840644752 + - 3.520116288812443 + - 3.515004117907554 + - !!python/tuple + - 3.012568301500027 + - 3.06505013753575 + - 3.0320349590028455 + - 3.03011514212664 + - 3.284742600071563 + - 3.0234282484178117 + - 3.0202000954733457 + - 3.047044428710199 + - 3.0311280944522014 + - 3.063872909398158 + - 3.025969327062486 + - 3.028971167553467 + - 3.0215595361180903 + - !!python/tuple + - 2.518114724773012 + - 2.595614693755498 + - 2.5465462745477945 + - 2.5437239035363923 + - 2.931052905951694 + - 2.5339237479271333 + - 2.529210200844016 + - 2.568736464044686 + - 2.5452125966041974 + - 2.593849715707468 + - 2.5376422183162295 + - 2.5420439373413353 + - 2.5311937400854503 + - !!python/tuple + - 2.026522709808958 + - 2.1436381765321775 + - 2.068915286576251 + - 2.0646711186746396 + - 2.6537168705037235 + - 2.049991986310021 + - 2.0429659548260766 + - 2.10251137331791 + - 2.0669088641972513 + - 2.140926085453997 + - 2.0555507397786705 + - 2.06214828939721 + - 2.0459198018939064 + - !!python/tuple + - 1.5400654800749396 + - 1.7240665781590196 + - 1.606048466016753 + - 1.5991280151859844 + - 2.3870071421100634 + - 1.5825027843757038 + - 1.5653511786660013 + - 1.6587535397808273 + - 1.6026315680793832 + - 1.7197546512031598 + - 1.5848869990681438 + - 1.5951824130086456 + - 1.5699234741081698 + - !!python/tuple + - 1.0643334024119153 + - 1.3697129801531809 + - 1.1744056731490136 + - 1.1624277497198727 + - 2.1689383243247424 + - 1.1432540982543564 + - 1.106042749823133 + - 1.2621833298963345 + - 1.1682973182700005 + - 1.3627012175002726 + - 1.1385974764249196 + - 1.1558201410786326 + - 1.1136425630042206 + - !!python/tuple + - 1.0123883160487608 + - 1.7728472984564747 + - 1.340433210282463 + - 1.3241011604481665 + - 2.220423850724127 + - 1.2075324839319483 + - 1.1647209178650013 + - 1.5069194390896146 + - 1.3547065590947953 + - 1.7251596040371995 + - 1.2441288524763459 + - 1.3006128800705703 + - 1.1715800850853233 + - !!python/tuple + - 1.0686933124268383 + - 1.9566286934261812 + - 1.4786279309897254 + - 1.4260228911313164 + - 2.1799277459209976 + - 1.4907287283851602 + - 1.2196847245259714 + - 1.7346817813678406 + - 1.4753869809964872 + - 1.9983919544008069 + - 1.3547810518520988 + - 1.3956093184692324 + - 1.2179912733980616 + - !!python/tuple + - 0.9676285749672954 + - 1.871779226754406 + - 1.376465371725277 + - 1.3255195214779132 + - 2.200077490204316 + - 1.3850270806346916 + - 1.117044069377437 + - 1.6344059140770884 + - 1.3733247431082716 + - 1.8977432506127447 + - 1.250648486055155 + - 1.2953998767141541 + - 1.1182692732067587 + - !!python/tuple + - 0.8728037840814817 + - 1.9606273692690304 + - 1.426616184444116 + - 1.4097103466208079 + - 2.6460826822841557 + - 1.2307952639338413 + - 1.1760658195760725 + - 1.6440801887819614 + - 1.4030387944204592 + - 1.8275504344798907 + - 1.280583694387962 + - 1.3994029328256694 + - 1.2238115000714105 + - !!python/tuple + - 0.934410221657238 + - 2.0177278231597633 + - 1.4907678290844988 + - 1.4722396659196921 + - 2.6248989292732863 + - 1.2944499504825333 + - 1.2310045815787942 + - 1.7265922257714554 + - 1.4619623687975944 + - 1.9050240352616883 + - 1.3421551143625787 + - 1.460862079169564 + - 1.2851590310738779 + - !!python/tuple + - 0.9913770569710142 + - 2.015748189059209 + - 1.4862952757855132 + - 1.427033234210693 + - 2.5192186145597253 + - 1.4421957820767308 + - 1.2093449727360073 + - 1.724268293058236 + - 1.487994044006164 + - 2.037806041039674 + - 1.362772070788561 + - 1.393977768472027 + - 1.201392284204487 + - !!python/tuple + - 0.9554714272003724 + - 1.9825355983865371 + - 1.4485219294253093 + - 1.3897979089347712 + - 2.5404915447521255 + - 1.4068140400255729 + - 1.1722503849827473 + - 1.7024289915754973 + - 1.4512816057448494 + - 1.9700643183130795 + - 1.3252066698817493 + - 1.3617214464591554 + - 1.1657581873904976 + - !!python/tuple + - 0.920267555181951 + - 1.9892588869656174 + - 1.458176823349891 + - 1.4227032070127918 + - 2.5184011792294902 + - 1.3044917008564119 + - 1.1804051646712117 + - 1.7046099256701814 + - 1.4237127866478807 + - 1.9644324536740365 + - 1.3167934871099163 + - 1.398658684231681 + - 1.235771789764 + - !!python/tuple + - 0.9533140079686064 + - 2.006101994706204 + - 1.4687936677949671 + - 1.4182455901754174 + - 2.5547311074238257 + - 1.3902137070011875 + - 1.1918108788052426 + - 1.7295570090540773 + - 1.4646070497644859 + - 1.965448775061285 + - 1.3376554972283117 + - 1.394816120357185 + - 1.1969135944608444 + - !!python/tuple + - 0.9401183090096915 + - 1.9937688814485666 + - 1.4548947526377882 + - 1.4045801811789491 + - 2.5557292517137813 + - 1.3788984937321849 + - 1.1778985291992297 + - 1.7177735403108445 + - 1.4509434813427489 + - 1.9486859371087664 + - 1.3235865953216361 + - 1.3817518082103324 + - 1.1851089668671206 + - !!python/tuple + - 0.924651935854672 + - 1.9863482878016654 + - 1.4535240291627147 + - 1.4123435867137135 + - 2.523359654457755 + - 1.3264653253983918 + - 1.1759302475519018 + - 1.7044529130055293 + - 1.4274480677336818 + - 1.9572059307250376 + - 1.316783754987394 + - 1.3885799600350393 + - 1.2177295703292847 + - !!python/tuple + - 0.9327936705504548 + - 1.9939434292868943 + - 1.4620516998030253 + - 1.4206812504531177 + - 2.5260446466532485 + - 1.332783269158936 + - 1.1854739744013543 + - 1.7083967614819306 + - 1.4363917436772216 + - 1.9677532335515175 + - 1.3258699976614414 + - 1.3963309024726107 + - 1.224152019188099 + - !!python/tuple + - 0.9352498397353867 + - 1.994309421417618 + - 1.4562945420185012 + - 1.409277111470285 + - 2.5362075916676217 + - 1.3630783253284575 + - 1.1807994186682726 + - 1.7056331244639418 + - 1.4471006879357164 + - 1.9614274146414117 + - 1.3231143465451023 + - 1.3846580824620696 + - 1.1961742991877482 + - !!python/tuple + - 0.9297397358686779 + - 1.9895191274750732 + - 1.455513620836958 + - 1.4121381109068267 + - 2.5357503403433572 + - 1.3405550329091407 + - 1.1778418839322238 + - 1.6994786475395565 + - 1.4338546461526631 + - 1.9750334622487342 + - 1.3197603838429175 + - 1.3856304322656088 + - 1.2122244617471378 + - !!python/tuple + - 0.9329013719362266 + - 1.9924493299065915 + - 1.458909368066234 + - 1.4155132561797406 + - 2.5375446650494635 + - 1.3420799611582863 + - 1.1777628301878318 + - 1.7109789732507077 + - 1.4344696251398386 + - 1.9835733521444632 + - 1.321577902096758 + - 1.388729881271172 + - 1.2154677043934823 + - !!python/tuple + - 0.9357816810593576 + - 1.9949886553418037 + - 1.4606410111030066 + - 1.4162558425783636 + - 2.5364382060297728 + - 1.3484726937199027 + - 1.1818597954523793 + - 1.71826859119018 + - 1.4405555954608962 + - 1.9646853874701324 + - 1.3251662253115426 + - 1.3927026598450278 + - 1.2114578360759523 + - !!python/tuple + - 0.9346320809268766 + - 1.994572489672082 + - 1.4584268991117064 + - 1.4131857531704108 + - 2.5353544496199256 + - 1.3534585508633143 + - 1.178110396676866 + - 1.710996065752779 + - 1.440933196206779 + - 1.9814717123602257 + - 1.321935476340858 + - 1.3862320248078546 + - 1.2065919943408834 + - !!python/tuple + - 0.9346320809268766 + - 1.994572489672082 + - 1.4584268991117064 + - 1.4131857531704108 + - 2.5353544496199256 + - 1.3534585508633143 + - 1.178110396676866 + - 1.710996065752779 + - 1.440933196206779 + - 1.9814717123602257 + - 1.321935476340858 + - 1.3862320248078546 + - 1.2065919943408834 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.500000005125825 + - 9.500000068264441 + - 9.500000017824522 + - 9.50000000499913 + - 10.4999995000005 + - 9.500000019486905 + - 9.500000004848577 + - 9.50000001858929 + - 9.500000011931057 + - 9.500000026171392 + - 9.500000009022777 + - 9.50000000965997 + - 9.500000007222853 + - !!python/tuple + - 9.000014529108645 + - 9.00020758972919 + - 9.000051256187815 + - 9.000014167947558 + - 10.998136568670553 + - 9.000056141706818 + - 9.000013738910015 + - 9.000053501501476 + - 9.000034081008106 + - 9.000075968590053 + - 9.00002568860892 + - 9.000027522663803 + - 9.000020522048343 + - !!python/tuple + - 8.50005663081648 + - 8.500817223200515 + - 8.500200179232195 + - 8.500055222015108 + - 11.493346309848137 + - 8.500219316422749 + - 8.50005354851591 + - 8.500208973193828 + - 8.500132979865768 + - 8.500297080524023 + - 8.500100188399868 + - 8.500107352056864 + - 8.500080015849807 + - !!python/tuple + - 8.000142864740925 + - 8.002084865380402 + - 8.000506122071645 + - 8.000931330108166 + - 11.330168225890219 + - 8.000554669346446 + - 8.000152204047877 + - 8.000528427164133 + - 8.00315011307319 + - 8.00075222567741 + - 8.00025292089631 + - 8.000271035358391 + - 8.00020193283086 + - !!python/tuple + - 7.50029439809732 + - 7.504350986745423 + - 7.501045567327071 + - 7.502665316586195 + - 11.024628998862193 + - 7.501146235636966 + - 7.500322380609141 + - 7.503128152294022 + - 7.507868726805382 + - 7.50155655574172 + - 7.499324282299009 + - 7.503219753734783 + - 7.501737105538252 + - !!python/tuple + - 7.000538575748244 + - 7.008075129168729 + - 7.001918209534251 + - 7.004982868637003 + - 10.654249959755909 + - 7.002103682643779 + - 7.0005862743784455 + - 7.007378115201493 + - 7.013758487786212 + - 7.002861051789132 + - 6.997772169822974 + - 7.0080179544665775 + - 7.00423613995463 + - !!python/tuple + - 6.5009111556597015 + - 6.513888131464488 + - 6.503255737556783 + - 6.507751830836525 + - 10.244688050848007 + - 6.50357206236267 + - 6.500975607979371 + - 6.513012911886736 + - 6.520585307557833 + - 6.504866458458462 + - 6.495900568086556 + - 6.51418816991362 + - 6.507477905761347 + - !!python/tuple + - 6.001459574005786 + - 6.022673283689187 + - 6.005234862402517 + - 6.010917312423263 + - 9.808829844063542 + - 6.005746305727311 + - 6.001533922921294 + - 6.01997918490828 + - 6.0282783659040176 + - 6.007844146232237 + - 5.993945085596775 + - 6.021493486376516 + - 6.011364838566763 + - !!python/tuple + - 5.502247837802234 + - 5.535696035940299 + - 5.508097185268008 + - 5.514477010075543 + - 9.354283969095773 + - 5.508893373780287 + - 5.502320844040302 + - 5.52838488512796 + - 5.536882840217344 + - 5.51216825268117 + - 5.492119276258581 + - 5.529850232807259 + - 5.515882462964058 + - !!python/tuple + - 5.0033640778902235 + - 5.054817475054152 + - 5.012180489484116 + - 5.018581276904976 + - 8.882051128426935 + - 5.013387226796301 + - 5.003419024596656 + - 5.038805629607886 + - 5.046551316994179 + - 5.018366866438416 + - 4.990264149836904 + - 5.042753948843825 + - 5.021497566033339 + - !!python/tuple + - 4.5049326250548205 + - 4.582855653870667 + - 4.517969927674866 + - 4.526074311535116 + - 8.411114961725483 + - 4.519766171257833 + - 4.505724185273898 + - 4.55262724774768 + - 4.557561574159314 + - 4.530826849739583 + - 4.485803141121273 + - 4.568740281306089 + - 4.532729617227753 + - !!python/tuple + - 4.007134144996776 + - 4.124210124913243 + - 4.026185608243404 + - 4.036576822776943 + - 7.926095869734884 + - 4.028831246693847 + - 4.00925557425003 + - 4.070414135648438 + - 4.070363573175983 + - 4.0502432194735505 + - 3.979689415365802 + - 4.106303643320718 + - 4.0489621540278655 + - !!python/tuple + - 3.510240968802071 + - 3.6859412097804087 + - 3.5379407875622926 + - 3.550555669902527 + - 7.439008328091801 + - 3.541824379686793 + - 3.518269765904355 + - 3.602785635959347 + - 3.5856725263773503 + - 3.5785356939871193 + - 3.4723497560264476 + - 3.6613643434963885 + - 3.574039421915848 + - !!python/tuple + - 3.014683153806377 + - 3.279529809899633 + - 3.0550469049099416 + - 3.0680368425045565 + - 6.938565838499385 + - 3.060772575722357 + - 3.032465706627746 + - 3.1508648999643607 + - 3.1046499997894603 + - 3.118539037273589 + - 2.964941243524425 + - 3.2331362556926484 + - 3.1076043353699183 + - !!python/tuple + - 2.521182464385438 + - 2.923140494269332 + - 2.580650273983788 + - 2.589442665829966 + - 6.4246203943718605 + - 2.589206351177479 + - 2.5519997878481453 + - 2.717567015462228 + - 2.629275191107323 + - 2.675430803692891 + - 2.4590188381906053 + - 2.821855105054596 + - 2.6500138125221957 + - !!python/tuple + - 2.0310550077605427 + - 2.642168356067601 + - 2.1206914429227477 + - 2.1164156882874017 + - 5.898636178669018 + - 2.13379787926922 + - 2.0842840383521235 + - 2.274918531845206 + - 2.1857727285080943 + - 2.2588075112028756 + - 1.9596060778608975 + - 2.427582715341348 + - 2.2012290351945003 + - !!python/tuple + - 1.5470049560101273 + - 2.46215643089468 + - 1.6875946409449536 + - 1.6513639438106416 + - 5.361809882571694 + - 1.7084221082938058 + - 1.6311567680154222 + - 1.8336896859165637 + - 1.7813757502021779 + - 1.886798505967492 + - 1.4720579055628604 + - 2.0541289156032154 + - 1.7648082786369355 + - !!python/tuple + - 1.075716832030042 + - 2.393345748315526 + - 1.3133391605253346 + - 1.2001740758100594 + - 4.815170810108886 + - 1.370897881480556 + - 1.1982264809664476 + - 1.4154058324727021 + - 1.4317383346943198 + - 1.5919112915462277 + - 1.0112044914238996 + - 1.7089131193497369 + - 1.348800445343791 + - !!python/tuple + - 0.8543846667248285 + - 1.5130170550067588 + - 1.4148336735478813 + - 0.8054798802426215 + - 1.984587529966638 + - 1.4535216369225246 + - 0.7991344507865078 + - 1.4624241999309475 + - 1.3391437460397693 + - 1.8877711620683595 + - 1.028708647521608 + - 1.147783992245465 + - 0.9219116235074567 + - !!python/tuple + - 1.0596103702183541 + - 1.590625084763861 + - 1.613028878763779 + - 1.013894484313214 + - 1.447400302274502 + - 1.6358255398703725 + - 1.0047200277446295 + - 1.6609123903713763 + - 1.526078880724094 + - 2.104683294981246 + - 1.2398664408628044 + - 1.276186698352504 + - 1.1299793074594566 + - !!python/tuple + - 0.8031524130814475 + - 2.07220328250829 + - 1.6510396396556146 + - 0.9736510970651461 + - 2.6840559049675417 + - 1.8091209710457763 + - 1.0218058100154142 + - 1.614476662368834 + - 1.7311771086032852 + - 2.1899358022120303 + - 0.9599411314050699 + - 1.9513142497571339 + - 1.2690295309097028 + - !!python/tuple + - 0.826649253027555 + - 2.117694873983147 + - 1.7157598312949203 + - 1.0228012371461528 + - 2.5266624629277854 + - 1.8828771843748042 + - 1.0710991230941131 + - 1.6225663642907893 + - 1.792208532068576 + - 2.2338160633369464 + - 1.032601547260275 + - 1.9115857754049612 + - 1.2944076264011835 + - !!python/tuple + - 0.8695184228629926 + - 2.1910755936014343 + - 1.7707512963377152 + - 1.0716983287080692 + - 2.3719203298139924 + - 1.9384462526585182 + - 1.1259304593821315 + - 1.6200640688188601 + - 1.846267502158868 + - 2.2868878556343732 + - 1.1220174756729073 + - 1.8387111679696453 + - 1.3205959620774423 + - !!python/tuple + - 0.9245111820983034 + - 2.283157790327524 + - 1.8123669129976623 + - 1.1146177390523502 + - 2.243470041431296 + - 1.9732516093942702 + - 1.1739953485581938 + - 1.6039624960114127 + - 1.8824906221638267 + - 2.3385955797979623 + - 1.2192064892134094 + - 1.730984703195571 + - 1.339903819453381 + - !!python/tuple + - 0.9844787709200862 + - 2.3847417952445205 + - 1.8385881206507322 + - 1.148788101803939 + - 2.141238555129269 + - 1.986639987439753 + - 1.212639073514189 + - 1.5769584049856014 + - 1.9004077777222457 + - 2.386091605382485 + - 1.3150360557258485 + - 1.5979955675179291 + - 1.3514510481427486 + - !!python/tuple + - 1.185764670742371 + - 2.446455103508352 + - 1.573782249228005 + - 1.0310241603020436 + - 2.177554117134041 + - 1.560593340922113 + - 1.0466756138999425 + - 1.617124053835107 + - 1.5876908094424813 + - 2.139454137357618 + - 1.3639292265671827 + - 1.5424105874079734 + - 1.2983436607953711 + - !!python/tuple + - 1.150559651891535 + - 2.4464025705266956 + - 1.5690346405422515 + - 1.0121338889050362 + - 2.228557120553422 + - 1.6107345954569197 + - 1.0386741116297555 + - 1.5523652158377952 + - 1.6426352328610931 + - 2.133398359409266 + - 1.3159855339775162 + - 1.541609292971497 + - 1.2647687607447897 + - !!python/tuple + - 1.1110484754876069 + - 2.4533409654365848 + - 1.5764045204425468 + - 1.0006510652127754 + - 2.2719545364623794 + - 1.6727261720828825 + - 1.0443170337886367 + - 1.4905252764798835 + - 1.705453811095724 + - 2.1386440216539078 + - 1.2673235066730406 + - 1.5281611090661467 + - 1.2421262916830416 + - !!python/tuple + - 1.0700530514374778 + - 2.466181656484826 + - 1.5939347963401125 + - 1.001661702521729 + - 2.2951862046629046 + - 1.7376468704902979 + - 1.0618589489001455 + - 1.4407504265424125 + - 1.7642508773327878 + - 2.1607958731395858 + - 1.2158443297913315 + - 1.5238025597090954 + - 1.2393997849036966 + - !!python/tuple + - 1.0327389448587987 + - 2.460713501340097 + - 1.618613487953442 + - 1.01417585905206 + - 2.2995663466337897 + - 1.7932296125921736 + - 1.087429710504571 + - 1.4201498924503526 + - 1.817940932622872 + - 2.1838234035546438 + - 1.169216604201389 + - 1.5385775417805607 + - 1.2502721043152696 + - !!python/tuple + - 0.9932118499914506 + - 2.337830490980357 + - 1.737418202513568 + - 1.113138630681939 + - 2.433217744033475 + - 1.7835908912948923 + - 1.1546763054875164 + - 1.6867613733149538 + - 1.763128807928612 + - 2.3076094383020918 + - 1.2403510089701235 + - 1.4790672244554346 + - 1.361325948689896 + - !!python/tuple + - 1.013558235225897 + - 2.355941119651136 + - 1.7287878934722596 + - 1.1227564733305333 + - 2.4127518613593146 + - 1.7486790781788184 + - 1.166263811678334 + - 1.6732639734213066 + - 1.7427221338153127 + - 2.32998361292424 + - 1.2711866155309948 + - 1.4853101898446923 + - 1.3724492731642017 + - !!python/tuple + - 1.0344308081558171 + - 2.3872060172710223 + - 1.714955333236445 + - 1.1314008736734285 + - 2.374237674993966 + - 1.7170999982446928 + - 1.1789599479310353 + - 1.6457517699031412 + - 1.7328078333437367 + - 2.3439118976743174 + - 1.2954324436979 + - 1.5044263322794624 + - 1.381231290411871 + - !!python/tuple + - 1.0827557702558401 + - 2.5209184993144915 + - 1.7349060131648633 + - 1.1218505234518883 + - 2.2829653537979446 + - 1.710375449641944 + - 1.1492076808603366 + - 1.5306951032520502 + - 1.726798922411915 + - 2.290222542250275 + - 1.3496431097703068 + - 1.5442173424400538 + - 1.3429997560026254 + - !!python/tuple + - 1.0928271264251812 + - 2.5409074155964255 + - 1.7335807141830524 + - 1.1070116528605278 + - 2.2739809132807536 + - 1.7163940480902509 + - 1.1278060160884396 + - 1.5116233711854878 + - 1.7283906097125867 + - 2.2452432521121635 + - 1.3585636147725813 + - 1.5396431963931962 + - 1.3176273062453632 + - !!python/tuple + - 1.1039585238992335 + - 2.505275445630737 + - 1.7125866664388931 + - 1.075725530518663 + - 2.2703440902330536 + - 1.7232150807846878 + - 1.0836733647759724 + - 1.5104003356609668 + - 1.7147844871040068 + - 2.1655701160549277 + - 1.3396761354581934 + - 1.5453275449768662 + - 1.2968383019664755 + - !!python/tuple + - 1.102275465481705 + - 2.4818913793689554 + - 1.696179396923406 + - 1.0627614754173627 + - 2.2622448417700385 + - 1.72857011829682 + - 1.0743319308362398 + - 1.5145535926645255 + - 1.7053915257033057 + - 2.155236761314364 + - 1.3159049508704421 + - 1.5417722608156292 + - 1.3021539055847111 + - !!python/tuple + - 1.0955714711585112 + - 2.465826413734257 + - 1.6785552345235786 + - 1.0517218651764741 + - 2.2508584169216443 + - 1.7359473718606053 + - 1.0766829415483044 + - 1.5200776023723135 + - 1.7022283578057722 + - 2.161064230289049 + - 1.2923831408234847 + - 1.5240979276272077 + - 1.307214776233837 + - !!python/tuple + - 1.0848115362658521 + - 2.457678875132529 + - 1.6618398830061638 + - 1.0436241154547223 + - 2.2367309618831728 + - 1.7442531646538855 + - 1.0894400075031703 + - 1.5260623059373646 + - 1.7050232008376316 + - 2.181085201026266 + - 1.2709809189524495 + - 1.4956508945789142 + - 1.31152987497896 + - !!python/tuple + - 1.0631695322936279 + - 2.3916018808342434 + - 1.6383128825826152 + - 1.0366171668599666 + - 2.2413663181954107 + - 1.7449092864961675 + - 1.11378640198532 + - 1.5376459555520725 + - 1.7151120648611562 + - 2.2283610267419607 + - 1.2398030758604224 + - 1.454381082863168 + - 1.3143484876546103 + - !!python/tuple + - 1.0238944889820147 + - 2.368717804015259 + - 1.6488682037166837 + - 1.0721960187407056 + - 2.2903291085415383 + - 1.7385665662562744 + - 1.1299876627226704 + - 1.5656042828593335 + - 1.7373118566746926 + - 2.275633574995057 + - 1.224987501469879 + - 1.4798937814265063 + - 1.3193443385718264 + - !!python/tuple + - 1.0202827744335319 + - 2.381330178769462 + - 1.659903265380608 + - 1.083012161066302 + - 2.3116278035556865 + - 1.7359874138860183 + - 1.1261168329173357 + - 1.5680299907918651 + - 1.7404646777874613 + - 2.273469341686594 + - 1.2331322332948926 + - 1.4970399166176804 + - 1.3181698674271316 + - !!python/tuple + - 1.0226379266077397 + - 2.414740123937641 + - 1.6819470691045202 + - 1.1005616503484277 + - 2.343912669117687 + - 1.7311361584915395 + - 1.1215684877987229 + - 1.5582617961855043 + - 1.753298578378725 + - 2.2624229983888404 + - 1.2558368500081114 + - 1.532064296305491 + - 1.3151951944611229 + - !!python/tuple + - 1.0335628337961176 + - 2.459308336784474 + - 1.6955186190312614 + - 1.1068828540433087 + - 2.3478129322207892 + - 1.7309238192588223 + - 1.133712785089544 + - 1.535935546956362 + - 1.7778032040939251 + - 2.255282802041872 + - 1.2813032798326287 + - 1.5393908921239428 + - 1.3108638812088875 + - !!python/tuple + - 1.0498585724848173 + - 2.4736750589091416 + - 1.6959244588809312 + - 1.1042079605447388 + - 2.352991994818435 + - 1.7298383182210233 + - 1.1304470511632105 + - 1.5297645763387937 + - 1.7535913403175147 + - 2.264414503995024 + - 1.292269255273652 + - 1.551925059637939 + - 1.3200443866101912 + - !!python/tuple + - 1.0624808012229419 + - 2.4809900970966234 + - 1.6852580144391913 + - 1.0931050098588686 + - 2.3303650143540175 + - 1.7328355917946776 + - 1.137913767633265 + - 1.5591774538044527 + - 1.7363177873080917 + - 2.2541721454254526 + - 1.2939387908757667 + - 1.5381975127908216 + - 1.327964841785295 + - !!python/tuple + - 1.0441798205492756 + - 2.4623544747246764 + - 1.6751008373572551 + - 1.0808990195419523 + - 2.3008169583383604 + - 1.7450625120300007 + - 1.121506889318117 + - 1.545041317102579 + - 1.7343185163289392 + - 2.2484418594945526 + - 1.2605922633879791 + - 1.4963818208965693 + - 1.3172476514690927 + - !!python/tuple + - 1.0488502801907713 + - 2.408523095736726 + - 1.6742475188590913 + - 1.0802786885304418 + - 2.304648474624574 + - 1.7279475028988067 + - 1.1288940519613955 + - 1.5379161042779177 + - 1.7562311899041712 + - 2.2538767703307108 + - 1.2738001121270126 + - 1.5098491550377617 + - 1.3088544179390666 + - !!python/tuple + - 1.0486036830986196 + - 2.4294926964520673 + - 1.6734351657643483 + - 1.0810987232050537 + - 2.319305351196706 + - 1.7317514616691991 + - 1.1186149579489417 + - 1.5206755238286276 + - 1.746224423983029 + - 2.2531679146293304 + - 1.2669290768348371 + - 1.511397296293839 + - 1.3120965417844725 + - !!python/tuple + - 1.0476828033285213 + - 2.4616582801910303 + - 1.6721398838512833 + - 1.0815007696690646 + - 2.313022533100956 + - 1.745866034357887 + - 1.1158685914954132 + - 1.5530199914818168 + - 1.7409743272297022 + - 2.234762058992079 + - 1.2664310844931772 + - 1.5086080118126806 + - 1.3163340567892317 + - !!python/tuple + - 1.0499198887371812 + - 2.438833321829243 + - 1.6721451144305266 + - 1.0785206547664141 + - 2.3142806916458514 + - 1.7252697768055838 + - 1.1209063765173393 + - 1.545646629193628 + - 1.736911874004002 + - 2.236509417677021 + - 1.2692734940614883 + - 1.5068027728456224 + - 1.3154051830589328 + - !!python/tuple + - 1.0499198887371812 + - 2.438833321829243 + - 1.6721451144305266 + - 1.0785206547664141 + - 2.3142806916458514 + - 1.7252697768055838 + - 1.1209063765173393 + - 1.545646629193628 + - 1.736911874004002 + - 2.236509417677021 + - 1.2692734940614883 + - 1.5068027728456224 + - 1.3154051830589328 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 750.0 + - 1260.0 + - 1290.0 + - 1560.0 + - 1590.0 + - 1920.0 + - 1950.0 + - 2250.0 + - 2550.0 + - 2580.0 + - 2610.0 + - 2850.0 + - 2940.0 + - 3210.0 + - 7500.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 65.02210791739226 + - 61.74824816579643 + - 58.48392401637333 + - 55.23116930559886 + - 51.99256448482765 + - 48.77142811485493 + - 45.57209342681238 + - 42.400316592004394 + - 39.2638941827025 + - 36.17373068936197 + - 33.14529085208375 + - 30.200853946682095 + - 27.374255317430443 + - 24.71842075109201 + - 22.321813481233022 + - 20.320980393817294 + - 18.983113368745144 + - 18.92801613981818 + - 18.852584812900208 + - 18.870381099720866 + - 18.879738283978583 + - 19.103843183553785 + - 19.118421138546896 + - 19.035238817073665 + - 19.00179509138621 + - 19.039392247425987 + - 18.995970338828364 + - 19.001079817985858 + - 19.011033707356972 + - 19.049031530603404 + - 19.004989614663483 + - 19.001232805114565 + - 19.026064106431313 + - 19.026064106431313 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 750.0 + - 1260.0 + - 1590.0 + - 1920.0 + - 1950.0 + - 2520.0 + - 2700.0 + - 2880.0 + - 3690.0 + - 3750.0 + - 7170.0 + - 8790.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.73869603705984 + - 61.47963710010403 + - 58.22989108242584 + - 54.99135271344948 + - 51.766420225044406 + - 48.55817111407994 + - 45.37061622896076 + - 42.20907570989225 + - 39.08074998631693 + - 35.99561320313202 + - 32.96785932021541 + - 30.018335217049543 + - 27.178819623397516 + - 24.49993381236022 + - 22.066585951867918 + - 20.02977903424231 + - 18.675193625910012 + - 18.583084924211605 + - 18.292361780538705 + - 18.202966731600828 + - 18.255183064557226 + - 18.187796389838503 + - 18.183260330697365 + - 18.20101953970759 + - 18.214243050426607 + - 18.224164368352884 + - 18.21125196721191 + - 18.22880168449789 + - 18.222181503002073 + - 18.220439017697544 + - 18.220439017697544 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 750.0 + - 1260.0 + - 1590.0 + - 1920.0 + - 1950.0 + - 2250.0 + - 2550.0 + - 2580.0 + - 2790.0 + - 2820.0 + - 2850.0 + - 2880.0 + - 3060.0 + - 3090.0 + - 3120.0 + - 3150.0 + - 3330.0 + - 3360.0 + - 3390.0 + - 3420.0 + - 3630.0 + - 3660.0 + - 3690.0 + - 3720.0 + - 3900.0 + - 3930.0 + - 3960.0 + - 3990.0 + - 4170.0 + - 4200.0 + - 4230.0 + - 4260.0 + - 4440.0 + - 4470.0 + - 4500.0 + - 4530.0 + - 4680.0 + - 4710.0 + - 4740.0 + - 4770.0 + - 4800.0 + - 4920.0 + - 4950.0 + - 4980.0 + - 5010.0 + - 5040.0 + - 5070.0 + - 5100.0 + - 5130.0 + - 5160.0 + - 5190.0 + - 5220.0 + - 5250.0 + - 5280.0 + - 5310.0 + - 5340.0 + - 5370.0 + - 5400.0 + - 5430.0 + - 5460.0 + - 5490.0 + - 5520.0 + - 5550.0 + - 5580.0 + - 5610.0 + - 5640.0 + - 5670.0 + - 5700.0 + - 5730.0 + - 5760.0 + - 5790.0 + - 5820.0 + - 5850.0 + - 5880.0 + - 5910.0 + - 5940.0 + - 5970.0 + - 6000.0 + - 6030.0 + - 6060.0 + - 6090.0 + - 6180.0 + - 6210.0 + - 6240.0 + - 6270.0 + - 6300.0 + - 6480.0 + - 6510.0 + - 6540.0 + - 6570.0 + - 6720.0 + - 6750.0 + - 6780.0 + - 6810.0 + - 6990.0 + - 7020.0 + - 7050.0 + - 7200.0 + - 7230.0 + - 7260.0 + - 7290.0 + - 7320.0 + - 7440.0 + - 7470.0 + - 7500.0 + - 7530.0 + - 7560.0 + - 7590.0 + - 7620.0 + - 7650.0 + - 7680.0 + - 7710.0 + - 7740.0 + - 7770.0 + - 7800.0 + - 7830.0 + - 7860.0 + - 7890.0 + - 7920.0 + - 8010.0 + - 8040.0 + - 8070.0 + - 8100.0 + - 8130.0 + - 8160.0 + - 8310.0 + - 8340.0 + - 8370.0 + - 8550.0 + - 8580.0 + - 8610.0 + - 8760.0 + - 8790.0 + - 8820.0 + - 8850.0 + - 9000.0 + - 9030.0 + - 9060.0 + - 9090.0 + - 9120.0 + - 9210.0 + - 9240.0 + - 9270.0 + - 9300.0 + - 9330.0 + - 9420.0 + - 9450.0 + - 9480.0 + - 9510.0 + - 9540.0 + - 9570.0 + - 9600.0 + - 9630.0 + - 9660.0 + - 9690.0 + - 9720.0 + - 9750.0 + - 9780.0 + - 9810.0 + - 9840.0 + - 9870.0 + - 9900.0 + - 9930.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 63.93128863921279 + - 60.714740887800765 + - 57.50753697066988 + - 54.311590893741304 + - 51.129326112169785 + - 47.96385346211013 + - 44.819228360555435 + - 41.70083126744452 + - 38.615945305863285 + - 35.574659388338304 + - 32.59132824954737 + - 29.68702421030585 + - 26.893835661041948 + - 24.263275728448097 + - 21.880694891924225 + - 19.89798920258097 + - 18.598630900372164 + - 18.574766917548125 + - 18.307700358142075 + - 18.439932907695905 + - 18.404610019818858 + - 18.48333817898758 + - 18.48136858935248 + - 18.456645321487816 + - 18.499763339624323 + - 18.50211864511825 + - 18.46211331712011 + - 18.457677836554893 + - 18.456035355614336 + - 18.457163978299164 + - 18.483964675422985 + - 18.485456529669477 + - 18.485458297189712 + - 18.484197873339486 + - 18.469579213269938 + - 18.46868560949624 + - 18.46853728363629 + - 18.46902121669734 + - 18.47621008260426 + - 18.47664293887354 + - 18.476863554198054 + - 18.476863056155484 + - 18.472655687292775 + - 18.47183223678717 + - 18.471229397870523 + - 18.470935103695098 + - 18.475141396011956 + - 18.475898772810645 + - 18.476350456586314 + - 18.476440071921587 + - 18.472412857040872 + - 18.472000867113913 + - 18.471879653818597 + - 18.47204094628669 + - 18.474597246565796 + - 18.474887762840027 + - 18.474997752462347 + - 18.474937765458105 + - 18.47474141538401 + - 18.473561734123326 + - 18.47337058783364 + - 18.473259811086926 + - 18.473226555724708 + - 18.473259691135727 + - 18.473343766702502 + - 18.473462352737485 + - 18.47360018536611 + - 18.473744013643156 + - 18.473882463464832 + - 18.47400547199608 + - 18.474103861977806 + - 18.474169450371086 + - 18.474195804870746 + - 18.4741794722721 + - 18.47412128576012 + - 18.47402726624079 + - 18.473908686448013 + - 18.473781053681748 + - 18.473662042692354 + - 18.47356870243898 + - 18.47351448711599 + - 18.47350675565014 + - 18.473545314779805 + - 18.47362236535283 + - 18.47372390536008 + - 18.47383232268728 + - 18.47392965118685 + - 18.474000823418542 + - 18.474036261946654 + - 18.47403330472214 + - 18.473996222329973 + - 18.473934893786588 + - 18.47386249018165 + - 18.473792706650784 + - 18.473737142865268 + - 18.473703354868263 + - 18.473693914463798 + - 18.473706567490023 + - 18.47373533889519 + - 18.47383952913955 + - 18.47385927167116 + - 18.47386728080185 + - 18.47386500084253 + - 18.473855598030042 + - 18.473810450543045 + - 18.47381086595136 + - 18.473811197831726 + - 18.47381089246404 + - 18.473812900432108 + - 18.473816719833977 + - 18.473820923531676 + - 18.47382455388735 + - 18.473815294668203 + - 18.473813266586234 + - 18.473812879970957 + - 18.473821637968687 + - 18.473821017078915 + - 18.473819155360005 + - 18.473816608697827 + - 18.473814136090496 + - 18.473815729340334 + - 18.47381879514535 + - 18.4738217745057 + - 18.473823946713534 + - 18.47382480056043 + - 18.473824154992414 + - 18.47382219007412 + - 18.473819385753274 + - 18.473816390124554 + - 18.47381385555124 + - 18.47381228623747 + - 18.473811934204136 + - 18.473812764916087 + - 18.473814494056583 + - 18.473816678790264 + - 18.47381883496877 + - 18.47382054861182 + - 18.473821292559748 + - 18.47382031712923 + - 18.47381910712739 + - 18.473817909716296 + - 18.47381691352115 + - 18.473816227231705 + - 18.47381702123838 + - 18.473817609914008 + - 18.473818196882053 + - 18.473818661848842 + - 18.473818099456608 + - 18.47381751163035 + - 18.47381716067628 + - 18.473817648032615 + - 18.473818139592908 + - 18.47381853219771 + - 18.473817974636013 + - 18.473817667484965 + - 18.473817453183507 + - 18.473817362869045 + - 18.47381739483444 + - 18.47381787023396 + - 18.473818010495485 + - 18.473818093757018 + - 18.47381811641077 + - 18.473818089114236 + - 18.473817895242423 + - 18.473817844255397 + - 18.47381781100687 + - 18.473817794611804 + - 18.473817792334714 + - 18.47381780144711 + - 18.47381781989657 + - 18.473817845853283 + - 18.473817876717852 + - 18.473817908366353 + - 18.473817935235683 + - 18.473817951417242 + - 18.47381795242792 + - 18.473817936972466 + - 18.473817907942514 + - 18.47381787213841 + - 18.47381783865637 + - 18.47381781637871 + - 18.47381781637871 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 750.0 + - 1170.0 + - 1200.0 + - 1230.0 + - 1470.0 + - 1500.0 + - 1530.0 + - 1830.0 + - 1860.0 + - 1890.0 + - 2100.0 + - 2130.0 + - 2370.0 + - 2400.0 + - 2430.0 + - 2460.0 + - 2670.0 + - 2700.0 + - 2730.0 + - 2760.0 + - 2970.0 + - 3150.0 + - 3210.0 + - 3270.0 + - 3450.0 + - 3480.0 + - 5940.0 + - 6390.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.55197719198007 + - 61.40257326763198 + - 58.261824402386516 + - 55.086338652757505 + - 51.927009913154826 + - 48.787172176801334 + - 45.6727002765803 + - 42.592368280935176 + - 39.54098705205152 + - 36.50978124287638 + - 33.536610935836535 + - 30.661530300630673 + - 27.906866635355687 + - 25.311288908889818 + - 22.947745181719164 + - 20.970789070872538 + - 19.61624593981226 + - 19.452222899010522 + - 18.57830464983363 + - 18.72371702657416 + - 18.73743867518951 + - 18.8220508938799 + - 18.493920669333896 + - 18.309960181125515 + - 18.18536794742197 + - 18.073803264306488 + - 18.090139571717447 + - 18.119491529683764 + - 18.140347509323913 + - 18.099105066496737 + - 18.083593526354694 + - 18.10335139258012 + - 18.111403803388086 + - 18.117437518534857 + - 18.077391263358304 + - 18.063938370442287 + - 18.052286785421074 + - 18.04436269482664 + - 18.070710102065135 + - 18.112340057986536 + - 18.10923505974569 + - 18.101688377854824 + - 18.08018982278497 + - 18.079304296637794 + - 18.083573209900134 + - 18.08379921324741 + - 18.08379921324741 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 750.0 + - 780.0 + - 1230.0 + - 1260.0 + - 1290.0 + - 1590.0 + - 1950.0 + - 2250.0 + - 2280.0 + - 2550.0 + - 2580.0 + - 2640.0 + - 3150.0 + - 3270.0 + - 3840.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.65407091011951 + - 58.55744388596955 + - 55.470290739875594 + - 52.39460756527104 + - 49.33292537077175 + - 46.2884963062263 + - 43.26556139467647 + - 40.26974312396309 + - 37.30863333907557 + - 34.393145737969526 + - 31.539613899241125 + - 28.76838329804989 + - 26.115431556240605 + - 23.635996188642757 + - 21.41623539678116 + - 19.61459204102056 + - 18.461993291726166 + - 18.475425254740724 + - 18.237978880776733 + - 18.18199282767025 + - 18.356542470816304 + - 18.25936304773308 + - 18.25269513117851 + - 18.27220250526261 + - 18.31509559099395 + - 18.26989274709243 + - 18.26489646336393 + - 18.29552780291055 + - 18.30721591453019 + - 18.310857467249978 + - 18.300625045961112 + - 18.30304957967182 + - 18.289311382881632 + - 18.289311382881632 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 720.0 + - 750.0 + - 1200.0 + - 1230.0 + - 1440.0 + - 1470.0 + - 1500.0 + - 1530.0 + - 2100.0 + - 2130.0 + - 2160.0 + - 2190.0 + - 2280.0 + - 2340.0 + - 2370.0 + - 2430.0 + - 2610.0 + - 2700.0 + - 2760.0 + - 2850.0 + - 3600.0 + - 3660.0 + - 3690.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 63.89641862746208 + - 60.75096857108767 + - 57.630239106800076 + - 54.47786888720787 + - 51.334777055238234 + - 48.20565212276791 + - 45.09486060046185 + - 42.01239305909945 + - 38.962033926382226 + - 35.95492226974436 + - 33.01147005218473 + - 30.146549141673027 + - 27.381267721421867 + - 24.77330571192132 + - 22.39239528052828 + - 20.39159305211724 + - 19.021393429528842 + - 18.759778992041255 + - 18.580933774920357 + - 18.329044255439943 + - 18.370320516602522 + - 18.293135647198465 + - 18.260497619364102 + - 18.18270573233336 + - 18.12664626654516 + - 18.112666457848793 + - 18.10456325310068 + - 18.11493592341219 + - 18.129415254720445 + - 18.144631951153418 + - 18.16830324326743 + - 18.145519047540258 + - 18.132107902291185 + - 18.099378894764918 + - 18.104063462425636 + - 18.12221848164645 + - 18.111958667733486 + - 18.102110526041216 + - 18.113416350356307 + - 18.116750971300934 + - 18.10997400951901 + - 18.10997400951901 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 750.0 + - 780.0 + - 1260.0 + - 1290.0 + - 1560.0 + - 1590.0 + - 1950.0 + - 1980.0 + - 2250.0 + - 2280.0 + - 2340.0 + - 2550.0 + - 2580.0 + - 2610.0 + - 2640.0 + - 2880.0 + - 2910.0 + - 3450.0 + - 3510.0 + - 7320.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.17801599545821 + - 58.162931670380225 + - 55.13734376630716 + - 52.113923639826716 + - 49.098751672675434 + - 46.09657857725076 + - 43.11226446593334 + - 40.15154846927009 + - 37.22176590048349 + - 34.332780605351026 + - 31.502494780667412 + - 28.749680176501688 + - 26.10540659425521 + - 23.61485747273079 + - 21.357221782138044 + - 19.470976846479754 + - 18.229228038327513 + - 17.811093833166375 + - 17.777399780444096 + - 17.86135671661055 + - 17.828396412341316 + - 17.72272308877751 + - 17.720007290199074 + - 17.80930540277987 + - 17.792371806459595 + - 18.40259652174251 + - 17.71301419975566 + - 17.7310637768733 + - 17.771120574811153 + - 17.763922681985342 + - 17.75318130991752 + - 17.741427489445993 + - 17.720189211795894 + - 17.726833764848195 + - 17.72594177308614 + - 17.73658494124442 + - 17.733851465808254 + - 17.733851465808254 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 750.0 + - 1230.0 + - 1260.0 + - 1290.0 + - 1590.0 + - 1920.0 + - 1950.0 + - 2220.0 + - 2250.0 + - 2280.0 + - 2310.0 + - 2520.0 + - 2550.0 + - 2670.0 + - 2820.0 + - 2850.0 + - 2910.0 + - 2940.0 + - 2970.0 + - 3330.0 + - 3660.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 62.609669735287845 + - 59.46267447977363 + - 56.32501087374465 + - 53.19858541557217 + - 50.085811544615446 + - 46.989786219176956 + - 43.91454468885621 + - 40.86543637708846 + - 37.849693418224305 + - 34.8773148759105 + - 31.962485620741173 + - 29.12593526151852 + - 26.39902439138718 + - 23.83372994171139 + - 21.521148521502955 + - 19.628328154744366 + - 18.450956011747294 + - 18.62125891325564 + - 18.328516156541298 + - 18.39557999657864 + - 18.28977650106866 + - 18.302895516307686 + - 18.284834059300916 + - 18.31582996807983 + - 18.323511062316367 + - 18.34812847823928 + - 18.314470199029305 + - 18.296216337125376 + - 18.29647684853723 + - 18.354034824462904 + - 18.343419675114752 + - 18.347979264690558 + - 18.343453870344597 + - 18.322696599330197 + - 18.307416846370526 + - 18.31320701055863 + - 18.31715543270471 + - 18.351460295642585 + - 18.34079044838282 + - 18.34079044838282 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 750.0 + - 1260.0 + - 1290.0 + - 1560.0 + - 1590.0 + - 1920.0 + - 1950.0 + - 2250.0 + - 2550.0 + - 2580.0 + - 2850.0 + - 2880.0 + - 3180.0 + - 3420.0 + - 3450.0 + - 4050.0 + - 4290.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 69.14835540199743 + - 65.65722424668212 + - 62.17543430356618 + - 58.70489641269817 + - 55.24802832203673 + - 51.80793076031394 + - 48.38864127633647 + - 44.995508445965854 + - 41.635757465244005 + - 38.31936933502812 + - 35.06049156865521 + - 31.87978548298332 + - 28.808502266105993 + - 25.898175628455874 + - 23.230412504338076 + - 20.95959641310537 + - 19.392173879024018 + - 19.138465277116744 + - 19.06455863621091 + - 19.14094571944497 + - 19.1026203869096 + - 19.18183437689951 + - 19.187641823224826 + - 19.182569830471937 + - 19.158544965839425 + - 19.18123535345789 + - 19.166710342613897 + - 19.161576480519756 + - 19.171172799645436 + - 19.17413996646642 + - 19.16697999741767 + - 19.176019503013286 + - 19.1795345231454 + - 19.171100275580415 + - 19.176431288573752 + - 19.176431288573752 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 570.0 + - 720.0 + - 750.0 + - 1440.0 + - 1470.0 + - 1500.0 + - 1530.0 + - 1560.0 + - 1860.0 + - 1890.0 + - 1920.0 + - 1950.0 + - 1980.0 + - 2190.0 + - 2220.0 + - 2250.0 + - 2340.0 + - 2370.0 + - 2430.0 + - 2460.0 + - 2490.0 + - 2520.0 + - 2580.0 + - 2700.0 + - 2730.0 + - 2790.0 + - 2850.0 + - 2910.0 + - 2970.0 + - 3810.0 + - 3960.0 + - 4410.0 + - 7050.0 + - 9210.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 62.28627263175769 + - 59.2228418406142 + - 56.20027496113272 + - 53.14443140905965 + - 50.09506042712854 + - 47.05417453770416 + - 44.02845493671018 + - 41.024218206955936 + - 38.07107808738595 + - 35.1663431779809 + - 32.32750259681693 + - 29.57333252095602 + - 26.93688682353654 + - 24.471857568794533 + - 22.234398351155033 + - 20.34628246477408 + - 19.047048371896928 + - 18.709281331395704 + - 18.331408016372375 + - 18.0306556559578 + - 18.207837839002103 + - 18.10987828350396 + - 18.029313537789523 + - 17.971216660076163 + - 17.94417434271083 + - 17.922407607533582 + - 17.926268866509055 + - 17.933253412801218 + - 17.947885481346432 + - 17.959298958389212 + - 17.867304728456546 + - 17.872274961771808 + - 17.885125592950473 + - 17.911194172638318 + - 17.908478229701217 + - 17.893431448688993 + - 17.89143650071703 + - 17.891426744677545 + - 17.893798970933855 + - 17.890139104818136 + - 17.893367247269257 + - 17.89274895346761 + - 17.893973182562846 + - 17.898971515766732 + - 17.905334662205522 + - 17.899372043325204 + - 17.897656033069868 + - 17.889459533754305 + - 17.896881024027717 + - 17.894839890462432 + - 17.88980077521994 + - 17.88980077521994 +problem_name: FIXEDSAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.075 + - 0.126 + - 0.129 + - 0.156 + - 0.159 + - 0.192 + - 0.195 + - 0.225 + - 0.255 + - 0.258 + - 0.261 + - 0.285 + - 0.294 + - 0.321 + - 0.75 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9342347010039699 + - 0.8686279776686742 + - 0.8032123436472308 + - 0.7380285561366821 + - 0.6731283262581351 + - 0.6085781565243681 + - 0.5444648829997132 + - 0.48090385684973375 + - 0.4180513179865802 + - 0.3561257876490021 + - 0.2954371724922131 + - 0.23643193949872324 + - 0.17978813422916473 + - 0.12656636639590685 + - 0.07853940066521102 + - 0.03844357715224496 + - 0.011633304741968645 + - 0.010529180274513735 + - 0.009017569340810985 + - 0.009374199176670445 + - 0.009561713073224546 + - 0.014052677641070719 + - 0.014344813509004966 + - 0.01267787602073237 + - 0.01200767832597502 + - 0.012761108955767032 + - 0.01189095282196622 + - 0.0119933445586036 + - 0.01219281616570667 + - 0.012954275991790226 + - 0.01207169518092369 + - 0.011996410354022017 + - 0.012494018815945033 + - 0.012494018815945033 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.075 + - 0.126 + - 0.159 + - 0.192 + - 0.195 + - 0.252 + - 0.27 + - 0.288 + - 0.369 + - 0.375 + - 0.717 + - 0.879 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9285552503757498 + - 0.8632451289186351 + - 0.7981216343071552 + - 0.7332227360936309 + - 0.6685964938000609 + - 0.6043045791231554 + - 0.5404273677178265 + - 0.47707147287634766 + - 0.4143811880682548 + - 0.35255639081257056 + - 0.2918815218823879 + - 0.2327743436616763 + - 0.17587168805213782 + - 0.12218798331619021 + - 0.07342475215332979 + - 0.0326080287530854 + - 0.005462727224769645 + - 0.003616908965097681 + - -0.002209056195693978 + - -0.004000494036106573 + - -0.0029541014689893567 + - -0.004304501076853376 + - -0.004395401726143598 + - -0.004039514913454188 + - -0.0037745215187796354 + - -0.00357570262924305 + - -0.0038344615234923323 + - -0.0034827728337026975 + - -0.0036154383871411745 + - -0.003650357033620865 + - -0.003650357033620865 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.075 + - 0.126 + - 0.159 + - 0.192 + - 0.195 + - 0.225 + - 0.255 + - 0.258 + - 0.279 + - 0.282 + - 0.285 + - 0.288 + - 0.306 + - 0.309 + - 0.312 + - 0.315 + - 0.333 + - 0.336 + - 0.339 + - 0.342 + - 0.363 + - 0.366 + - 0.369 + - 0.372 + - 0.39 + - 0.393 + - 0.396 + - 0.399 + - 0.417 + - 0.42 + - 0.423 + - 0.426 + - 0.444 + - 0.447 + - 0.45 + - 0.453 + - 0.468 + - 0.471 + - 0.474 + - 0.477 + - 0.48 + - 0.492 + - 0.495 + - 0.498 + - 0.501 + - 0.504 + - 0.507 + - 0.51 + - 0.513 + - 0.516 + - 0.519 + - 0.522 + - 0.525 + - 0.528 + - 0.531 + - 0.534 + - 0.537 + - 0.54 + - 0.543 + - 0.546 + - 0.549 + - 0.552 + - 0.555 + - 0.558 + - 0.561 + - 0.564 + - 0.567 + - 0.57 + - 0.573 + - 0.576 + - 0.579 + - 0.582 + - 0.585 + - 0.588 + - 0.591 + - 0.594 + - 0.597 + - 0.6 + - 0.603 + - 0.606 + - 0.609 + - 0.618 + - 0.621 + - 0.624 + - 0.627 + - 0.63 + - 0.648 + - 0.651 + - 0.654 + - 0.657 + - 0.672 + - 0.675 + - 0.678 + - 0.681 + - 0.699 + - 0.702 + - 0.705 + - 0.72 + - 0.723 + - 0.726 + - 0.729 + - 0.732 + - 0.744 + - 0.747 + - 0.75 + - 0.753 + - 0.756 + - 0.759 + - 0.762 + - 0.765 + - 0.768 + - 0.771 + - 0.774 + - 0.777 + - 0.78 + - 0.783 + - 0.786 + - 0.789 + - 0.792 + - 0.801 + - 0.804 + - 0.807 + - 0.81 + - 0.813 + - 0.816 + - 0.831 + - 0.834 + - 0.837 + - 0.855 + - 0.858 + - 0.861 + - 0.876 + - 0.879 + - 0.882 + - 0.885 + - 0.9 + - 0.903 + - 0.906 + - 0.909 + - 0.912 + - 0.921 + - 0.924 + - 0.927 + - 0.93 + - 0.933 + - 0.942 + - 0.945 + - 0.948 + - 0.951 + - 0.954 + - 0.957 + - 0.96 + - 0.963 + - 0.966 + - 0.969 + - 0.972 + - 0.975 + - 0.978 + - 0.981 + - 0.984 + - 0.987 + - 0.99 + - 0.993 + - 1.0 + - !!python/tuple + - 1.0 + - 0.912375157827924 + - 0.8479169420113204 + - 0.7836459725635556 + - 0.7196006053295525 + - 0.6558294052949603 + - 0.5923947122612473 + - 0.5293777950184237 + - 0.4668864756399462 + - 0.4050667047399422 + - 0.3441206597307347 + - 0.28433600324237296 + - 0.22613501540493697 + - 0.17016073358496972 + - 0.11744545840237387 + - 0.06969957628582783 + - 0.029967017933976197 + - 0.003928443555559534 + - 0.003450219734868425 + - -0.0019016777819758281 + - 0.0007482049108518529 + - 4.034962437432496e-05 + - 0.0016180276402886608 + - 0.0015785579219505402 + - 0.0010831144033481117 + - 0.0019471807046822444 + - 0.0019943800008142627 + - 0.0011926906539714535 + - 0.0011038055555308674 + - 0.0010708909529434786 + - 0.0010935080599216677 + - 0.0016305823559536019 + - 0.0016604784652046079 + - 0.0016605138855401904 + - 0.0016352555406197347 + - 0.0013423039606847466 + - 0.0013243965303118487 + - 0.0013214241446888964 + - 0.0013311219524320358 + - 0.0014751836937513141 + - 0.0014838579448363239 + - 0.0014882789798400244 + - 0.001488268999283853 + - 0.0014039551599965407 + - 0.0013874535705575585 + - 0.0013753729412634 + - 0.0013694754141818188 + - 0.0014537676799592425 + - 0.001468945181093156 + - 0.0014779967272050228 + - 0.0014797925794876432 + - 0.0013990889475247739 + - 0.0013908328488504806 + - 0.001388403787212621 + - 0.001391636018014526 + - 0.001442863162088594 + - 0.0014486849816758652 + - 0.0014508891257959055 + - 0.0014496870123611105 + - 0.0014457522424059436 + - 0.0014221119438086087 + - 0.0014182814554262167 + - 0.0014160615376762238 + - 0.0014153951147033304 + - 0.0014160591339064425 + - 0.0014177439716414717 + - 0.0014201203841266905 + - 0.0014228824899647078 + - 0.0014257647459854134 + - 0.0014285392201033491 + - 0.0014310042574872744 + - 0.0014329759498625944 + - 0.0014342903126937558 + - 0.001434818445386974 + - 0.0014344911472245912 + - 0.0014333251148703995 + - 0.0014314410046577216 + - 0.0014290647172636069 + - 0.001426507012224228 + - 0.0014241220838377177 + - 0.0014222515858189006 + - 0.0014211651343623351 + - 0.0014210101991544457 + - 0.0014217829073166935 + - 0.0014233269672370582 + - 0.001425361784751734 + - 0.0014275344207624072 + - 0.0014294848414977105 + - 0.0014309111020183415 + - 0.0014316212746847557 + - 0.001431562013193671 + - 0.0014308188982076295 + - 0.001429589900912783 + - 0.0014281389642086671 + - 0.0014267405326476984 + - 0.0014256270585894354 + - 0.0014249499618474441 + - 0.0014247607802541813 + - 0.0014250143413880978 + - 0.001425590907814856 + - 0.0014276788349267915 + - 0.0014280744666604396 + - 0.001428234966150746 + - 0.0014281892767590832 + - 0.001428000848492675 + - 0.0014270961125194108 + - 0.0014271044371211073 + - 0.0014271110878590549 + - 0.0014271049684236668 + - 0.0014271452072290702 + - 0.001427221746378792 + - 0.0014273059866495633 + - 0.0014273787373959095 + - 0.0014271931866774838 + - 0.0014271525447982528 + - 0.001427144797196517 + - 0.0014273203036560542 + - 0.0014273078612954896 + - 0.0014272705532594825 + - 0.0014272195192587735 + - 0.0014271699692849165 + - 0.0014272018973176502 + - 0.0014272633347146785 + - 0.0014273230397983511 + - 0.0014273665698971007 + - 0.0014273836806169506 + - 0.0014273707437151373 + - 0.0014273313676084428 + - 0.0014272751702402325 + - 0.0014272151391455875 + - 0.0014271643474003965 + - 0.0014271328990360969 + - 0.0014271258444413923 + - 0.0014271424915470294 + - 0.0014271771427693705 + - 0.0014272209238806737 + - 0.001427264132758724 + - 0.0014272984734189447 + - 0.0014273133818113804 + - 0.0014272938346087192 + - 0.001427269586698901 + - 0.0014272455911021526 + - 0.0014272256277854042 + - 0.0014272118748438407 + - 0.0014272277863917149 + - 0.0014272395831948967 + - 0.001427251345778851 + - 0.0014272606635107564 + - 0.0014272493934153615 + - 0.0014272376136332272 + - 0.0014272305806665164 + - 0.0014272403470751752 + - 0.0014272501977293226 + - 0.0014272580653585725 + - 0.0014272468920650144 + - 0.0014272407368918127 + - 0.0014272364423839365 + - 0.0014272346325214652 + - 0.0014272352730940701 + - 0.0014272447998933807 + - 0.0014272476106732097 + - 0.0014272492791980581 + - 0.0014272497331693577 + - 0.001427249186158726 + - 0.0014272453010520472 + - 0.0014272442792942527 + - 0.0014272436130082806 + - 0.0014272432844582867 + - 0.0014272432388263848 + - 0.0014272434214348702 + - 0.001427243791153989 + - 0.0014272443113151976 + - 0.0014272449298277272 + - 0.0014272455640498953 + - 0.0014272461024995616 + - 0.0014272464267709596 + - 0.0014272464470244661 + - 0.0014272461373039398 + - 0.0014272455555563515 + - 0.0014272448380577279 + - 0.0014272441670921902 + - 0.0014272437206575758 + - 0.0014272437206575758 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.075 + - 0.117 + - 0.12 + - 0.123 + - 0.147 + - 0.15 + - 0.153 + - 0.183 + - 0.186 + - 0.189 + - 0.21 + - 0.213 + - 0.237 + - 0.24 + - 0.243 + - 0.246 + - 0.267 + - 0.27 + - 0.273 + - 0.276 + - 0.297 + - 0.315 + - 0.321 + - 0.327 + - 0.345 + - 0.348 + - 0.594 + - 0.639 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9248134860547025 + - 0.8617008032847449 + - 0.7987615641290776 + - 0.7351262129416807 + - 0.6718146411972505 + - 0.6088936606676925 + - 0.5464810004449221 + - 0.4847524890385794 + - 0.4236041383872412 + - 0.36286009435848965 + - 0.3032790565123821 + - 0.24566369296216495 + - 0.19046143303597404 + - 0.13844718602600473 + - 0.09108279928837085 + - 0.051465459985086906 + - 0.024321005674886525 + - 0.02103405538532446 + - 0.003521114348840914 + - 0.006435115037384014 + - 0.006710090898513219 + - 0.008405682904157386 + - 0.0018300961371174446 + - -0.0018563919137620088 + - -0.004353166005056108 + - -0.0065888736573401 + - -0.006261501172886927 + - -0.005673300720895461 + - -0.005255355973729403 + - -0.006081836562861355 + - -0.006392681070512394 + - -0.005996742037841417 + - -0.005835375232863626 + - -0.005714462209596454 + - -0.006516971719266819 + - -0.006786561833250873 + - -0.007020054521669107 + - -0.007178849845463772 + - -0.006650859281281591 + - -0.005816613098541295 + - -0.005878835910756913 + - -0.006030068128530487 + - -0.006460889807403271 + - -0.006478635365659277 + - -0.006393088203411962 + - -0.006388559194779155 + - -0.006388559194779155 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.075 + - 0.078 + - 0.123 + - 0.126 + - 0.129 + - 0.159 + - 0.195 + - 0.225 + - 0.228 + - 0.255 + - 0.258 + - 0.264 + - 0.315 + - 0.327 + - 0.384 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8667407064883306 + - 0.8046856498088326 + - 0.7428204455187748 + - 0.6811850944610681 + - 0.6198303169458723 + - 0.5588212846395231 + - 0.4982429857963965 + - 0.43820809262367844 + - 0.3788687423879644 + - 0.3204436408423002 + - 0.26326010578687925 + - 0.2077258516814505 + - 0.15456185439600412 + - 0.1048750496663734 + - 0.0603920103207773 + - 0.024287862263535864 + - 0.0011902853973596397 + - 0.0014594560852354587 + - -0.003298865817842778 + - -0.004420801934685237 + - -0.0009229031195097394 + - -0.002870336426937489 + - -0.0030039585701600964 + - -0.0026130392908874267 + - -0.0017534805369727505 + - -0.0026593258384918004 + - -0.002759449188039901 + - -0.0021456104864751788 + - -0.0019113858209353493 + - -0.0018384106906837922 + - -0.0020434639560906413 + - -0.0019948773566500133 + - -0.002270184835994682 + - -0.002270184835994682 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.072 + - 0.075 + - 0.12 + - 0.123 + - 0.144 + - 0.147 + - 0.15 + - 0.153 + - 0.21 + - 0.213 + - 0.216 + - 0.219 + - 0.228 + - 0.234 + - 0.237 + - 0.243 + - 0.261 + - 0.27 + - 0.276 + - 0.285 + - 0.36 + - 0.366 + - 0.369 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9116763779817465 + - 0.8486429290036844 + - 0.7861048699228024 + - 0.7229327438882649 + - 0.6599465527000368 + - 0.5972402520938217 + - 0.5349013450413023 + - 0.47313003822902483 + - 0.4120021699396389 + - 0.35174096223237017 + - 0.2927554619543064 + - 0.23534369486140475 + - 0.1799286597505639 + - 0.12766623710314828 + - 0.07995382917779902 + - 0.03985862406584478 + - 0.012400420485356925 + - 0.007157781116825392 + - 0.0035738008703373627 + - -0.001473955377485039 + - -0.0006467970836428063 + - -0.002193548244927146 + - -0.0028476001056688786 + - -0.004406515635776327 + - -0.00552992291078201 + - -0.005810072187480795 + - -0.005972456880893399 + - -0.005764593086164913 + - -0.005474433593914905 + - -0.005169497625760322 + - -0.004695135242962455 + - -0.005151720600585433 + - -0.005420474109509113 + - -0.0060763491636460455 + - -0.005982472468313459 + - -0.005618653791418 + - -0.0058242559930796 + - -0.006021608462762096 + - -0.0057950446682818735 + - -0.005728220317105668 + - -0.005864027679184578 + - -0.005864027679184578 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.075 + - 0.078 + - 0.126 + - 0.129 + - 0.156 + - 0.159 + - 0.195 + - 0.198 + - 0.225 + - 0.228 + - 0.234 + - 0.255 + - 0.258 + - 0.261 + - 0.264 + - 0.288 + - 0.291 + - 0.345 + - 0.351 + - 0.732 + - 1.0 + - !!python/tuple + - 1.0 + - 0.857200773367076 + - 0.7967797968571455 + - 0.7361483331994915 + - 0.6755603108605139 + - 0.6151375780416114 + - 0.5549753369498278 + - 0.49517098212021626 + - 0.4358395232289832 + - 0.37712795675785965 + - 0.3192339498795551 + - 0.262516254819675 + - 0.2073510492726664 + - 0.15436095852467 + - 0.10445143900747947 + - 0.059209403189540384 + - 0.021409876323426294 + - -0.003474228888675892 + - -0.01185345622169123 + - -0.012528670361184492 + - -0.010846209931880279 + - -0.011506720071993883 + - -0.013624367445126599 + - -0.013678790865642082 + - -0.011889295587600124 + - -0.012228637481618131 + - 0.0 + - -0.013818929351952086 + - -0.013457223688873851 + - -0.012654502906859396 + - -0.0127987455437011 + - -0.013013997961020332 + - -0.013249539403329293 + - -0.013675145236086494 + - -0.01354199128727226 + - -0.013559866413633997 + - -0.013346581959884616 + - -0.013401359616929015 + - -0.013401359616929015 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.075 + - 0.123 + - 0.126 + - 0.129 + - 0.159 + - 0.192 + - 0.195 + - 0.222 + - 0.225 + - 0.228 + - 0.231 + - 0.252 + - 0.255 + - 0.267 + - 0.282 + - 0.285 + - 0.291 + - 0.294 + - 0.297 + - 0.333 + - 0.366 + - 1.0 + - !!python/tuple + - 1.0 + - 0.885890490687789 + - 0.8228260765920511 + - 0.7599486646871495 + - 0.6972964603699776 + - 0.6349178279140059 + - 0.572874829014587 + - 0.5112483283159485 + - 0.45014552593353485 + - 0.3897113506894292 + - 0.33014617946354036 + - 0.2717342708836738 + - 0.2148910372804499 + - 0.1602449312798762 + - 0.10883754794544598 + - 0.06249442364025716 + - 0.024563127999137572 + - 0.0009691031143998739 + - 0.004381899077027771 + - -0.001484538249375071 + - -0.00014060810789978524 + - -0.0022608640701312116 + - -0.0019979647193575987 + - -0.0023599084502391294 + - -0.001738763940064882 + - -0.001584838157433763 + - -0.0010915158656351939 + - -0.0017660131195247274 + - -0.0021318125607341512 + - -0.002126592025518803 + - -0.0009731552601062093 + - -0.0011858782291055785 + - -0.0010945060401544315 + - -0.0011851929715948745 + - -0.0016011596408981883 + - -0.0019073592343805193 + - -0.0017913268662346825 + - -0.0017122022063519886 + - -0.0010247476962058418 + - -0.0012385667875276793 + - -0.0012385667875276793 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.075 + - 0.126 + - 0.129 + - 0.156 + - 0.159 + - 0.192 + - 0.195 + - 0.225 + - 0.255 + - 0.258 + - 0.285 + - 0.288 + - 0.318 + - 0.342 + - 0.345 + - 0.405 + - 0.429 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0169229032104008 + - 0.9469621555875505 + - 0.8771886017881624 + - 0.8076405342144518 + - 0.7383664034823435 + - 0.6694283468449572 + - 0.6009072750216307 + - 0.5329103711427999 + - 0.4655824249898644 + - 0.39912345147229844 + - 0.3338169605947475 + - 0.2700769961470191 + - 0.20852981832555345 + - 0.15020814023944074 + - 0.09674732930433998 + - 0.051241163998931936 + - 0.019830699182026536 + - 0.0147464893147585 + - 0.01326543242458888 + - 0.014796196298540521 + - 0.014028173328968984 + - 0.01561558718291299 + - 0.015731965877560473 + - 0.015630325352142364 + - 0.015148877530089252 + - 0.015603583014076333 + - 0.01531250812382805 + - 0.01520962776376141 + - 0.015401933818902855 + - 0.015461394549503502 + - 0.01531791188863458 + - 0.015499059643180383 + - 0.015569499115492269 + - 0.015400480468231151 + - 0.015507311646439169 + - 0.015507311646439169 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.057 + - 0.072 + - 0.075 + - 0.144 + - 0.147 + - 0.15 + - 0.153 + - 0.156 + - 0.186 + - 0.189 + - 0.192 + - 0.195 + - 0.198 + - 0.219 + - 0.222 + - 0.225 + - 0.234 + - 0.237 + - 0.243 + - 0.246 + - 0.249 + - 0.252 + - 0.258 + - 0.27 + - 0.273 + - 0.279 + - 0.285 + - 0.291 + - 0.297 + - 0.381 + - 0.396 + - 0.441 + - 0.705 + - 0.921 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8794097536041688 + - 0.8180199349739085 + - 0.7574490113331176 + - 0.6962112376688424 + - 0.6351031714907737 + - 0.5741651428704507 + - 0.5135310400638686 + - 0.4533274446390353 + - 0.3941478030247145 + - 0.33593818073688747 + - 0.27904905208357556 + - 0.22385668347423623 + - 0.17102346012836206 + - 0.12162534762508877 + - 0.07678763953630194 + - 0.03895061963268805 + - 0.012914534355172359 + - 0.0061458299941673745 + - -0.0014265866380485715 + - -0.007453532933636867 + - -0.0039028791656295506 + - -0.005865945986828136 + - -0.007480428397105199 + - -0.008644664519598546 + - -0.009186580780021063 + - -0.009622776671427311 + - -0.009545398723515435 + - -0.00940543145827473 + - -0.009112211178328087 + - -0.008883490070078293 + - -0.010727014365428476 + - -0.010627413054814195 + - -0.01036989200370269 + - -0.009847489022178855 + - -0.009901915335579112 + - -0.010203446272716705 + - -0.010243424161079524 + - -0.010243619667861106 + - -0.01019608128702163 + - -0.010269423409750353 + - -0.010204732841202208 + - -0.010217123179659688 + - -0.01019259016186288 + - -0.010092425741720831 + - -0.009964911058861188 + - -0.010084399343918037 + - -0.01011878744194438 + - -0.010283041717849741 + - -0.010134318285556713 + - -0.01017522171309138 + - -0.01027620338752253 + - -0.01027620338752253 +solver_name: ADAM diff --git a/test/expected_results/FIXEDSAN1_ALOE.yaml b/test/expected_results/FIXEDSAN1_ALOE.yaml new file mode 100644 index 000000000..c7da7a220 --- /dev/null +++ b/test/expected_results/FIXEDSAN1_ALOE.yaml @@ -0,0 +1,6629 @@ +all_est_objectives: +- - 68.30388079811371 + - 64.74084515855239 + - 60.31006214288031 + - 54.842235422618984 + - 48.38880862382245 + - 43.54703583960199 + - 41.72510201749178 + - 41.18740714114977 + - 40.55128887328107 + - 39.79998330449128 + - 38.92875008117543 + - 37.88512536549786 + - 36.62202386436893 + - 35.098419691271346 + - 33.26951087379192 + - 31.229473184981646 + - 29.12231720612101 + - 27.012572150485333 + - 24.985323264731793 + - 24.29985042974036 + - 22.82577878158198 + - 22.162034902159043 + - 21.353543086346757 + - 20.41137590869529 + - 20.115978001774145 + - 19.81719095474247 + - 19.677863717765412 + - 19.12679809698523 + - 19.143631249724784 + - 19.108546889971468 + - 19.029264821403352 + - 19.012731944903393 + - 19.021444766332905 + - 19.018504894337067 + - 18.993976333798006 + - 18.993976333798006 +- - 68.00555254312637 + - 64.01122844942047 + - 59.06068874145281 + - 53.07828834598835 + - 45.89041600921971 + - 37.64781930419735 + - 32.66084337007667 + - 31.748217617263343 + - 30.75081935425617 + - 29.601141448255493 + - 28.31853036558889 + - 26.993063483302834 + - 25.69290564642531 + - 24.3153772161887 + - 22.957849608659835 + - 21.574025179986833 + - 20.484349701056527 + - 19.194721244014413 + - 18.7968171825425 + - 18.354904366821923 + - 18.327525691919774 + - 18.205306008479386 + - 18.205306008479386 +- - 67.15565001348712 + - 63.21794251481438 + - 58.34750776924343 + - 52.55561084647111 + - 45.535878290120124 + - 37.73518679852211 + - 34.498322149897426 + - 32.64120505302095 + - 32.287593319545685 + - 31.86790817193657 + - 31.3829995854087 + - 30.852640154152922 + - 30.249379875097883 + - 29.50709956787778 + - 28.629912077353527 + - 27.571106836575485 + - 26.423806747343818 + - 25.060010159239155 + - 23.809549808726523 + - 22.503409501843684 + - 21.241597943967214 + - 21.108514349009983 + - 20.96402905367242 + - 20.815800303837634 + - 20.686093558376385 + - 20.55454056771805 + - 20.438013658317416 + - 20.27727995281651 + - 20.110718890843255 + - 19.86437555086897 + - 19.60682019452547 + - 19.379961752897295 + - 19.05446639086883 + - 18.85539248970252 + - 18.47638201304288 + - 18.495449635866137 + - 18.462069078997295 + - 18.46919592016258 + - 18.4732338095521 + - 18.473147376731834 + - 18.47396377420419 + - 18.473766135287125 + - 18.473766135287125 +- - 67.71943959541662 + - 62.904054871805144 + - 56.95570555379081 + - 49.74518899175331 + - 41.85294562601758 + - 33.352665136647 + - 30.53838691443924 + - 28.66000861995869 + - 28.274732908648808 + - 27.89673202585063 + - 27.468340276389682 + - 27.02529507443085 + - 26.526748255024085 + - 25.97654712611859 + - 25.31710227404332 + - 24.631987167087196 + - 23.83071303659931 + - 23.26978593634551 + - 22.86651095089728 + - 21.844851581379526 + - 21.276131046199747 + - 20.99553719208331 + - 20.651829950399236 + - 20.42706756971802 + - 19.965712518129887 + - 19.142049040034436 + - 18.234776534434243 + - 18.329667723473573 + - 18.08806027122987 + - 18.064852751307907 + - 18.064852751307907 +- - 64.758578697695 + - 61.13374742195577 + - 56.76334354384273 + - 51.45329261184661 + - 45.16233519611212 + - 38.84027811497485 + - 32.70383172999138 + - 29.796644129298315 + - 27.973965601949597 + - 27.04079919289071 + - 26.034346844934166 + - 25.06528335581928 + - 23.931669406283035 + - 22.577739531526152 + - 21.9909481355686 + - 21.543422465364902 + - 20.853252488951284 + - 20.289004738535873 + - 19.86282205727662 + - 19.608969098122987 + - 19.226581859490064 + - 18.541421756450763 + - 18.325398959257214 + - 18.187065571976564 + - 18.427356179182606 + - 18.236300919591596 + - 18.294445081703206 + - 18.278207391034062 + - 18.263284661138286 + - 18.263284661138286 +- - 67.09349230810763 + - 63.4198195238471 + - 58.9727147517484 + - 53.523297003292825 + - 46.861443454155726 + - 39.3460360634956 + - 30.93602870015962 + - 25.915871454852976 + - 24.796882430495998 + - 24.321746370616193 + - 23.769521256263197 + - 23.12271145328248 + - 22.42256264348956 + - 21.709877990071195 + - 20.987003866738114 + - 20.228428551509566 + - 19.504035507167593 + - 18.887927658420235 + - 18.650651448100078 + - 18.407443003556395 + - 18.421670640424278 + - 18.185788627703985 + - 18.185788627703985 +- - 64.04874061726181 + - 60.67729854477164 + - 56.545354430227654 + - 51.44120668978856 + - 45.29202887384301 + - 38.137067005240034 + - 30.43075983628266 + - 25.67752023438335 + - 24.673008620103765 + - 21.250878169453596 + - 20.40859152792385 + - 19.482311913787825 + - 18.596652790258737 + - 18.209165715881518 + - 17.96948764987149 + - 17.96948764987149 +- - 65.76447222250123 + - 61.717602673300256 + - 56.75925060326765 + - 50.714332618122846 + - 43.55948025201569 + - 36.049780331692894 + - 36.595058621687514 + - 31.896812066938807 + - 31.6653094653158 + - 31.475698178305173 + - 31.293133614630783 + - 31.104975594473725 + - 30.894978835864144 + - 30.658763510620634 + - 30.378729187195663 + - 30.05510448693167 + - 29.670406646611372 + - 29.201438914766545 + - 28.67210598000149 + - 28.063731133252972 + - 27.397307365016314 + - 26.6992895132165 + - 25.947189123113063 + - 25.14554953010937 + - 24.022957714592714 + - 22.85670637978042 + - 22.697420585734193 + - 22.5223449015365 + - 22.332776508314687 + - 22.132918759256643 + - 21.92224128990392 + - 21.679486628335045 + - 21.434366303004687 + - 21.060401701941647 + - 20.725467246990338 + - 20.268978843796127 + - 19.87833357804556 + - 18.96723556370045 + - 18.90089913006174 + - 18.845070856761783 + - 18.794563070465486 + - 18.748969828076785 + - 18.71789779909811 + - 18.67404133321003 + - 18.63248201593958 + - 18.549386664020425 + - 18.49626784699682 + - 18.404530007714165 + - 18.315235929963695 + - 18.343972398599846 + - 18.343972398599846 +- - 72.64729923751366 + - 68.54280202505085 + - 63.45798541227731 + - 57.22848630983488 + - 49.76809900547376 + - 41.578841092529665 + - 34.21053139528321 + - 29.6609141166125 + - 29.632170565851013 + - 29.596854633528064 + - 29.553542079790716 + - 29.50050284729456 + - 29.43591715218021 + - 29.35667352660148 + - 29.25949209773462 + - 29.14033867840757 + - 28.99496762391071 + - 28.81732332172178 + - 28.60017660556723 + - 28.33542109996964 + - 28.00899971450542 + - 27.615684083682517 + - 27.154161175958844 + - 26.601913411291342 + - 25.949330393613256 + - 25.203081855419132 + - 24.418176967175835 + - 23.45342853156471 + - 22.660727618184815 + - 21.77196142795819 + - 20.520917913422707 + - 20.012047017603045 + - 19.37583354195867 + - 19.221427544015096 + - 19.160400095579337 + - 19.19698152905614 + - 19.14465604613393 + - 19.151588405685928 + - 19.15672449046415 + - 19.160202381679063 + - 19.163527000565537 + - 19.166288079875805 + - 19.171667547856668 + - 19.171667547856668 +- - 65.3640980466472 + - 61.18525294074846 + - 56.167213131685756 + - 50.1277686788111 + - 43.206641668570484 + - 36.18440710274172 + - 30.808003703014585 + - 26.8298677728186 + - 25.12712784682803 + - 24.018639781099896 + - 22.868914874960794 + - 21.89193119121942 + - 21.224271285462322 + - 20.44892993314289 + - 19.90361983198191 + - 19.723153112019205 + - 19.545156539409042 + - 19.39547417257103 + - 19.28619839299715 + - 19.14017752147207 + - 19.00462022005199 + - 18.301165653529768 + - 17.984880456054128 + - 17.903126309830476 + - 17.93886442501782 + - 17.812118363495003 + - 17.85060456595204 + - 17.83765058456658 + - 17.84880086984672 + - 17.854887532047158 + - 17.854887532047158 +all_intermediate_budgets: +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 600 + - 630 + - 660 + - 690 + - 720 + - 750 + - 780 + - 810 + - 840 + - 870 + - 900 + - 930 + - 960 + - 1080 + - 1290 + - 1320 + - 1350 + - 1620 + - 1650 + - 1680 + - 1710 + - 2250 + - 2280 + - 2310 + - 3030 + - 3090 + - 3120 + - 3180 + - 7200 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 240 + - 570 + - 600 + - 630 + - 660 + - 690 + - 720 + - 750 + - 780 + - 810 + - 840 + - 1020 + - 1230 + - 1260 + - 1770 + - 1800 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 240 + - 690 + - 720 + - 750 + - 780 + - 810 + - 840 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1050 + - 1560 + - 1590 + - 1620 + - 1650 + - 1680 + - 1710 + - 1740 + - 1770 + - 1800 + - 1830 + - 1860 + - 1890 + - 1920 + - 1950 + - 2340 + - 2370 + - 3030 + - 3060 + - 3090 + - 3120 + - 3150 + - 3180 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 240 + - 690 + - 720 + - 750 + - 780 + - 810 + - 840 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1320 + - 1350 + - 1380 + - 1410 + - 1440 + - 1470 + - 1830 + - 2400 + - 2430 + - 4380 + - 4410 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 270 + - 570 + - 600 + - 630 + - 660 + - 690 + - 720 + - 750 + - 1020 + - 1050 + - 1080 + - 1110 + - 1140 + - 1320 + - 1590 + - 1620 + - 1980 + - 2010 + - 2880 + - 3750 + - 7470 + - 7500 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 660 + - 690 + - 720 + - 750 + - 780 + - 810 + - 840 + - 870 + - 900 + - 930 + - 960 + - 1260 + - 1560 + - 1590 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 390 + - 420 + - 450 + - 780 + - 810 + - 840 + - 870 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 240 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1050 + - 1080 + - 1110 + - 1140 + - 1170 + - 1200 + - 1230 + - 1260 + - 1290 + - 1320 + - 1350 + - 1380 + - 1860 + - 1890 + - 1920 + - 1950 + - 1980 + - 2010 + - 2040 + - 2070 + - 2100 + - 2130 + - 2160 + - 2190 + - 2700 + - 2730 + - 2760 + - 2790 + - 2820 + - 2850 + - 2880 + - 2910 + - 2940 + - 2970 + - 3000 + - 3690 + - 3720 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 1050 + - 1080 + - 1110 + - 1140 + - 1170 + - 1200 + - 1230 + - 1260 + - 1290 + - 1320 + - 1350 + - 1380 + - 1410 + - 1440 + - 1470 + - 1500 + - 1530 + - 1560 + - 1590 + - 1620 + - 1650 + - 1680 + - 1710 + - 1860 + - 2010 + - 2160 + - 2520 + - 2910 + - 4050 + - 4860 + - 4890 + - 4920 + - 4950 + - 4980 + - 5010 + - 6630 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 600 + - 630 + - 660 + - 690 + - 720 + - 750 + - 1170 + - 1200 + - 1230 + - 1260 + - 1290 + - 1320 + - 1350 + - 1620 + - 2610 + - 3000 + - 3270 + - 4260 + - 4290 + - 4620 + - 5460 + - 7680 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.782013378894375 + - 9.939659669011222 + - 9.470572318233128 + - 9.381450836742294 + - 9.48199596432663 + - 9.834767963390204 + - 9.54814619116471 + - 9.523811419843472 + - 9.797910962438403 + - 9.842965405544334 + - 9.38939798645268 + - 9.291046869198091 + - 9.333462524985206 + - !!python/tuple + - 7.263237818739055 + - 9.864386482529332 + - 8.81022433939157 + - 8.6099670527586 + - 8.835893982415033 + - 9.62865146613717 + - 8.968168128603839 + - 8.972014018596914 + - 9.430222821751249 + - 9.64707419390606 + - 8.62025209424439 + - 8.43604013273884 + - 8.574423207358597 + - !!python/tuple + - 5.374126980260274 + - 9.770537286960556 + - 7.9449839637214055 + - 7.623661317946684 + - 8.247092593717156 + - 9.352153505949307 + - 8.245483995695148 + - 8.114591954194829 + - 8.976563415661149 + - 9.338198494917787 + - 7.790463387289014 + - 7.360636454260576 + - 7.62079081996712 + - !!python/tuple + - 3.0456115617014423 + - 9.476839429830292 + - 7.126806583347991 + - 6.429631152237852 + - 7.244550999379074 + - 9.032234363181592 + - 7.3465721925292025 + - 7.260537063146649 + - 8.411765166193275 + - 8.953515151160051 + - 6.682141279024003 + - 6.038112300338705 + - 6.4443521814079645 + - !!python/tuple + - 0.3136378092350949 + - 9.111326821371573 + - 6.039555099499864 + - 4.978853672717962 + - 6.101440734497697 + - 8.436655481285879 + - 6.232257650676693 + - 6.249500247654608 + - 7.7099726520615075 + - 8.475118420274665 + - 5.197723884339061 + - 4.675201405935521 + - 5.017283804806253 + - !!python/tuple + - 1.842783751910733 + - 9.065368417303507 + - 5.97121582040586 + - 4.879152792616119 + - 6.064540754661909 + - 8.389977119099614 + - 6.156893498280237 + - 6.162896863184023 + - 7.662197132717983 + - 8.442486183740327 + - 5.104780955301189 + - 4.583489460067133 + - 4.9211079852746265 + - !!python/tuple + - 1.665320734074594 + - 9.016478216739552 + - 5.885280626719312 + - 4.75487596985016 + - 6.004603064604397 + - 8.335869840222815 + - 6.062821298768293 + - 6.054794603363107 + - 7.602521866003076 + - 8.401718502382975 + - 4.988887532710306 + - 4.46923733172527 + - 4.801217023718534 + - !!python/tuple + - 1.4608210525784702 + - 8.955400152474658 + - 5.778077910182851 + - 4.600113078636036 + - 5.929823957269181 + - 8.268284243703233 + - 5.945447315988228 + - 5.919915432454395 + - 7.527998154805865 + - 8.350794679791381 + - 4.844493563866864 + - 4.327068307872723 + - 4.651900675445214 + - !!python/tuple + - 1.2503681316207058 + - 8.869003786739842 + - 5.644428820272254 + - 4.412951649062958 + - 5.826279094723814 + - 8.177304972508807 + - 5.798938205629828 + - 5.79119560942586 + - 7.434956319653505 + - 8.281788086437352 + - 4.651881920247101 + - 4.157899834823695 + - 4.4676147417847885 + - !!python/tuple + - 1.070048386640745 + - 8.72888338200358 + - 5.477955326923023 + - 4.185577636753966 + - 5.697265736973817 + - 8.056138112579372 + - 5.616394727778845 + - 5.646582085890278 + - 7.318836054351087 + - 8.19562813407837 + - 4.412219020799325 + - 3.958681706805792 + - 4.277613127520739 + - !!python/tuple + - 0.9947538493935202 + - 8.548900569481704 + - 5.272425977975346 + - 3.9042941599421233 + - 5.536689876186516 + - 7.904911592309684 + - 5.389221182838746 + - 5.466607158817706 + - 7.173981960723324 + - 8.088085973576979 + - 4.1152805185962045 + - 3.712714831523777 + - 4.042440509005784 + - !!python/tuple + - 0.9890773500909448 + - 8.306248062643268 + - 5.017209487069516 + - 3.5812526184062103 + - 5.337130321600163 + - 7.686209576748581 + - 5.122981015305357 + - 5.242981956655827 + - 6.993401713907284 + - 7.979547810834457 + - 3.7426021952903534 + - 3.410846686240559 + - 3.7602951261742583 + - !!python/tuple + - 0.9912881646796168 + - 8.003581327983493 + - 4.701191167705615 + - 3.187345716895424 + - 5.089668934529077 + - 7.413570984476022 + - 4.7931181833718615 + - 4.96578278978525 + - 6.768489521136205 + - 7.844210054564221 + - 3.286630344742195 + - 3.0442389637772687 + - 3.415235568661867 + - !!python/tuple + - 0.9894972184126448 + - 7.626364864438133 + - 4.311688620435666 + - 2.6990083841519112 + - 4.983566531627522 + - 7.074040625509968 + - 4.352665568741371 + - 4.514748582692386 + - 6.488730715785474 + - 7.615506947644228 + - 2.815941882085829 + - 2.6012085223293058 + - 2.986972130928722 + - !!python/tuple + - 0.9918674749396661 + - 7.156822412376527 + - 3.835490486484212 + - 2.1788237846008087 + - 4.610095552915072 + - 6.65186328359569 + - 3.7601000199801016 + - 4.199397881716881 + - 6.090181899919837 + - 7.351498724606323 + - 2.2085931198251254 + - 2.1143390108766935 + - 2.644121565376928 + - !!python/tuple + - 0.9926109822367958 + - 6.514547881073899 + - 3.368310206142162 + - 1.6432371294583308 + - 4.153863056769324 + - 6.128230766854777 + - 3.1150974522816486 + - 3.689754550888619 + - 5.661079217217303 + - 7.023458249711297 + - 1.578492066659991 + - 1.6135212297330874 + - 2.2228609213483765 + - !!python/tuple + - 0.8467071162667119 + - 5.839848164149334 + - 2.82371798748027 + - 1.2695356323133329 + - 3.604868158589851 + - 5.512811617605712 + - 2.253392975996014 + - 3.338219516384414 + - 5.137328591107609 + - 6.3028684562518755 + - 1.326811392035997 + - 1.4204958680560094 + - 1.9278532247059217 + - !!python/tuple + - 1.9096859171328273 + - 4.724215493946088 + - 2.2339853024413223 + - 1.685052082387024 + - 2.9650029555627446 + - 4.67248766757956 + - 1.7145773634590562 + - 2.739494850207937 + - 4.641385059123183 + - 5.569375300593055 + - 1.3014123253011898 + - 1.4344710394438487 + - 1.6645825049503797 + - !!python/tuple + - 0.49067851593172307 + - 4.340205025460727 + - 1.8629789238919896 + - 1.3324532484023024 + - 2.662107112217548 + - 4.241466268436537 + - 1.4633600038255485 + - 2.2544372175035323 + - 4.310227737828081 + - 5.011602436118378 + - 1.462917378277571 + - 1.417900293665383 + - 1.6283734324310235 + - !!python/tuple + - 1.715103725907408 + - 3.907616912436498 + - 1.7072161600488762 + - 1.3220352378683926 + - 2.413055071102557 + - 3.8395902031278015 + - 1.3828524574126688 + - 2.1780028319175995 + - 3.816650180236694 + - 4.677474195106979 + - 1.3334415821992815 + - 1.4335881862662834 + - 1.5815626371016245 + - !!python/tuple + - 0.8726867892874302 + - 3.6825339140478137 + - 1.6125007786008883 + - 1.3153445305136156 + - 2.2762651443786504 + - 3.5857637967185094 + - 1.404398171474856 + - 2.0538345573409416 + - 3.626938700080066 + - 4.317460827388535 + - 1.3749570887279245 + - 1.4303017993665974 + - 1.5046561455272034 + - !!python/tuple + - 1.1519487977067038 + - 3.3134479995495574 + - 1.6345259263897896 + - 1.3142755468990281 + - 2.214594042023219 + - 3.2558292076172695 + - 1.4114274890349359 + - 1.9314489950683853 + - 3.273319664900445 + - 3.998821957368931 + - 1.3244227283960157 + - 1.4289920291784837 + - 1.461987788768691 + - !!python/tuple + - 1.5280098022442967 + - 2.854693324436649 + - 1.5458410201945474 + - 1.2731119324680908 + - 1.9776862303012683 + - 2.7716344210057606 + - 1.3895977126660488 + - 1.6687687087379586 + - 2.738067128830137 + - 3.2971308846421166 + - 1.3483893546840606 + - 1.3359592131045557 + - 1.3220160392687728 + - !!python/tuple + - 0.899175148409172 + - 2.805881627873011 + - 1.530367926759885 + - 1.2651551273119157 + - 1.9354027298403964 + - 2.6708090840598424 + - 1.3838806863130184 + - 1.618958701489612 + - 2.6035067679647583 + - 3.0918313414380934 + - 1.3565771234365254 + - 1.3284559909400173 + - 1.284558046860168 + - !!python/tuple + - 0.952664526294298 + - 2.6704993701144852 + - 1.519531507005271 + - 1.2752000100212086 + - 1.7917445413673605 + - 2.5362932534826292 + - 1.4145710390924575 + - 1.6176111648241291 + - 2.44945059473735 + - 2.9079060268621655 + - 1.3206033731064124 + - 1.3508784043260944 + - 1.37380616041504 + - !!python/tuple + - 0.812040502977268 + - 2.6161202461202953 + - 1.5136255753143972 + - 1.2605444284623262 + - 1.667829097970243 + - 2.410351845894097 + - 1.4249194790265487 + - 1.5686231372752266 + - 2.280806921613094 + - 2.6950637998405744 + - 1.3142854606490249 + - 1.323770317683432 + - 1.2718457014135751 + - !!python/tuple + - 1.079845189090062 + - 2.4809177317656275 + - 1.501962015318651 + - 1.2632288657229436 + - 1.5496303872613804 + - 2.1331502888783485 + - 1.4389220873031743 + - 1.4960073920965578 + - 1.9464836705009052 + - 2.2542774139665442 + - 1.2914534974581062 + - 1.311340697867629 + - 1.2787770196414967 + - !!python/tuple + - 0.9337169868201555 + - 2.4722120296853873 + - 1.5042012502892006 + - 1.2666030192596451 + - 1.5206143668623848 + - 2.1182234187326126 + - 1.4422089469283563 + - 1.5016309729818746 + - 1.9310618086660525 + - 2.249508217525897 + - 1.2788215401792866 + - 1.3096405250491543 + - 1.2799702608819588 + - !!python/tuple + - 0.9369576843947116 + - 2.4303929624639937 + - 1.5063250629553526 + - 1.2691135232031014 + - 1.531801973346657 + - 2.092962702795721 + - 1.4451916645457197 + - 1.5069501650942356 + - 1.9139515356565693 + - 2.2439743862724595 + - 1.2691261594675898 + - 1.3082888648298965 + - 1.2808783186870802 + - !!python/tuple + - 0.9422765753042139 + - 2.345265243757458 + - 1.4781124492342692 + - 1.2672435975834544 + - 1.4849510441208567 + - 1.9902353123448113 + - 1.4477854152727385 + - 1.488578274115389 + - 1.8283995590066562 + - 2.183777624564793 + - 1.270141376435648 + - 1.2999501440487553 + - 1.2752236339012155 + - !!python/tuple + - 0.9079344352891028 + - 2.3435620985178143 + - 1.4938787653313443 + - 1.264459903205511 + - 1.5285114449045167 + - 1.986981090997558 + - 1.4418455135002304 + - 1.472777955305009 + - 1.826302697727846 + - 2.1689084659248303 + - 1.2744404684560755 + - 1.302926699945833 + - 1.2651334279280564 + - !!python/tuple + - 0.907128963529184 + - 2.3425052657940144 + - 1.5004560483353995 + - 1.2689514682597984 + - 1.4905895272405059 + - 1.9851122639064527 + - 1.4457290471936761 + - 1.4906567166174436 + - 1.8251691563495094 + - 2.1715658229817123 + - 1.2650164781240576 + - 1.3050925588547995 + - 1.2754847500564397 + - !!python/tuple + - 0.8943417975320467 + - 2.3628903544936444 + - 1.5089031492717897 + - 1.2716300465772024 + - 1.4919217036836434 + - 1.993728280973677 + - 1.4428093523110193 + - 1.482017264442638 + - 1.8230200090322135 + - 2.1497752825991845 + - 1.2618888121652718 + - 1.3061174311591623 + - 1.2830443783740795 + - !!python/tuple + - 0.9086690741411234 + - 2.332009379786519 + - 1.4996487613462162 + - 1.2689939336990552 + - 1.4864063315519485 + - 1.994625625034726 + - 1.4463735510483655 + - 1.4771243692716634 + - 1.8209777252507988 + - 2.118692011440255 + - 1.2686965774226762 + - 1.30440747836938 + - 1.2866467047979389 + - !!python/tuple + - 0.9086690741411234 + - 2.332009379786519 + - 1.4996487613462162 + - 1.2689939336990552 + - 1.4864063315519485 + - 1.994625625034726 + - 1.4463735510483655 + - 1.4771243692716634 + - 1.8209777252507988 + - 2.118692011440255 + - 1.2686965774226762 + - 1.30440747836938 + - 1.2866467047979389 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.039760603064696 + - 9.686392373337815 + - 9.695815062017518 + - 9.17365930407825 + - 9.810880785050292 + - 9.726591396424016 + - 9.304575381747943 + - 9.397103411481593 + - 9.78060104312833 + - 9.738916143787254 + - 9.564106764224023 + - 9.233542347629282 + - 9.391993924635774 + - !!python/tuple + - 7.84225800071476 + - 9.295205345207636 + - 9.316380512886019 + - 8.143086797314288 + - 9.574968323062818 + - 9.385543253565725 + - 8.437232936667044 + - 8.645138071097442 + - 9.50691943831555 + - 9.413240514769154 + - 9.020405582800814 + - 8.277631610589856 + - 8.633657131683812 + - !!python/tuple + - 6.351665029603102 + - 8.807652742964645 + - 8.792035497545845 + - 6.870715205001963 + - 9.280887521852893 + - 8.807946262092187 + - 7.5173199637096735 + - 7.7083934024541625 + - 9.165771394833296 + - 9.03233293444739 + - 8.293379524040315 + - 7.087220360974333 + - 7.755440955479765 + - !!python/tuple + - 4.505078412741237 + - 8.200783927128807 + - 8.096133406886656 + - 5.362203210817437 + - 8.914657999620688 + - 7.9334505689876895 + - 6.286850215165497 + - 6.801613709954137 + - 8.639971628716504 + - 8.472765546747636 + - 7.227370972437241 + - 5.951640329382054 + - 6.710647644813995 + - !!python/tuple + - 2.2566214966015763 + - 7.447028141275977 + - 7.231918663405489 + - 3.7206094201468956 + - 8.026317770086314 + - 6.8476510332395355 + - 4.6695016563760685 + - 6.216439731970758 + - 7.913123541947353 + - 7.777389569475881 + - 5.677096069678818 + - 4.723078861246718 + - 5.504187165239576 + - !!python/tuple + - 0.3673001031031313 + - 6.700992894114727 + - 6.377137712272135 + - 2.2514136948295596 + - 6.911816694359272 + - 5.7751281633674925 + - 3.301221043673964 + - 5.3423539985125865 + - 7.426111493914322 + - 7.0883668892567036 + - 4.336688975543622 + - 3.477472971599952 + - 4.2801405279549805 + - !!python/tuple + - 2.5307310868116097 + - 6.550855620567847 + - 6.2562562777870765 + - 2.1107801335064873 + - 6.7767577985663845 + - 5.621299292083269 + - 3.1630583759972226 + - 5.268687109658024 + - 7.3151660579747775 + - 7.015521609132013 + - 4.109611878583858 + - 3.3500203053122033 + - 4.183859232263864 + - !!python/tuple + - 2.2269835475243767 + - 6.379686551818583 + - 6.105547454268427 + - 1.9461146487134595 + - 6.59233644435598 + - 5.434828653789317 + - 3.0031119733294034 + - 5.130622872025068 + - 7.197893188079679 + - 6.92463518090508 + - 3.8619156855640173 + - 3.175650224201311 + - 4.0589012509045155 + - !!python/tuple + - 1.8705937150842256 + - 6.166374025449658 + - 5.917815175621843 + - 1.7605523117248545 + - 6.3624422515444055 + - 5.20287129274204 + - 2.8087752893691715 + - 4.959048604405986 + - 7.051616417303882 + - 6.811302012826613 + - 3.5563089478534895 + - 2.9628352474541804 + - 3.904532445059144 + - !!python/tuple + - 1.4789630913917193 + - 5.9008401067160055 + - 5.684256381931151 + - 1.5660983021450496 + - 6.076157967178296 + - 4.91489964096318 + - 2.5545950696065316 + - 4.793711338676716 + - 6.869288259860765 + - 6.63680146834093 + - 3.1819925091149877 + - 2.723117342956914 + - 3.7147038927763636 + - !!python/tuple + - 1.1265383585736433 + - 5.570858816346882 + - 5.394223696305678 + - 1.3911043050250704 + - 5.72020874465627 + - 4.55849966221114 + - 2.2580529865163506 + - 4.589322450978553 + - 6.642243450016841 + - 6.41959447963568 + - 2.7298542697423005 + - 2.4402211643615357 + - 3.4829183772464587 + - !!python/tuple + - 1.0167964419138762 + - 5.161885243081993 + - 4.953154716685982 + - 1.4178420395104914 + - 5.278748013842202 + - 4.1017836273728605 + - 1.9302655796195565 + - 4.362376116761782 + - 6.35991098169124 + - 6.149648043146902 + - 2.1988928788935502 + - 2.1553690319897805 + - 3.2385945552353474 + - !!python/tuple + - 1.1037039322936788 + - 4.657303492071483 + - 4.570227183157261 + - 1.1817198830839863 + - 4.733578938021645 + - 3.6934282993795855 + - 1.6020882676038977 + - 4.04079781703175 + - 5.931430236559022 + - 5.814936326262366 + - 1.6913926112054152 + - 1.7635778564214104 + - 2.84154093973096 + - !!python/tuple + - 0.9837034747319288 + - 4.039971262770784 + - 4.161592858744235 + - 1.3144353076187474 + - 4.2820353275492185 + - 3.3277576023464106 + - 1.3254208684576991 + - 3.442576901966541 + - 5.280809347934484 + - 5.272069500183938 + - 1.5019270805055027 + - 1.4642556732323182 + - 2.414770945781555 + - !!python/tuple + - 1.248739669021421 + - 3.2979274421921003 + - 3.570486560869992 + - 1.356164669322466 + - 3.466636295955597 + - 2.7724936654508188 + - 1.235742312693918 + - 3.1692769447214353 + - 4.5472203930865875 + - 4.605993897449627 + - 1.2650009418523778 + - 1.5095605263170526 + - 2.043091008313399 + - !!python/tuple + - 0.6227230981056593 + - 2.4452590007848247 + - 3.2066789708011347 + - 0.7645399612690822 + - 2.9503211217048646 + - 2.3835808593510555 + - 1.406022133464875 + - 2.268094647943281 + - 3.7319139690673246 + - 3.5744914275052864 + - 1.7899395448247581 + - 1.2411436014707367 + - 1.534942204439832 + - !!python/tuple + - 1.319255565162669 + - 2.393853021890105 + - 2.53142923008284 + - 1.0697821919431316 + - 2.441997098343005 + - 1.9058161259852961 + - 1.4106618316302393 + - 1.6711673948898667 + - 2.89894212117629 + - 2.737935001684074 + - 1.9261746173186043 + - 1.2260680031525573 + - 1.3312336078142355 + - !!python/tuple + - 1.8582637267642297 + - 1.911583196592527 + - 2.0114888036300713 + - 1.2602261087346909 + - 1.8511606746789706 + - 1.6455393876228297 + - 1.2140242813353748 + - 1.763911777750076 + - 1.992723307551491 + - 2.0334168003802726 + - 1.6476998697025276 + - 1.3733906529170516 + - 1.5173938193406382 + - !!python/tuple + - 0.7947508568897874 + - 1.8335422637431784 + - 1.8553171497193293 + - 0.9481277413718205 + - 1.9960022028345425 + - 1.6272412724296312 + - 1.2870403877987513 + - 1.3374360372885166 + - 2.0277704837948236 + - 1.8542566393143742 + - 1.476995356866198 + - 1.1947571766234 + - 1.2968306745543836 + - !!python/tuple + - 1.4573261122283774 + - 2.0395496989669466 + - 1.8107682530844629 + - 1.1605836840058086 + - 1.8663167786685184 + - 1.605320788688247 + - 1.3163121688947654 + - 1.5182253035307292 + - 1.8976219023683132 + - 1.7742957384503109 + - 1.3901572410345704 + - 1.3009680205624174 + - 1.3625650825733466 + - !!python/tuple + - 0.9579409782862633 + - 1.9563403849289815 + - 1.7686480691212918 + - 1.1599667704019356 + - 1.7769668472561033 + - 1.612346345547027 + - 1.2801234697158204 + - 1.5165911998965562 + - 1.8973656594202812 + - 1.7931891434972498 + - 1.3469231354790945 + - 1.2673989584019945 + - 1.3535296436712747 + - !!python/tuple + - 0.9579409782862633 + - 1.9563403849289815 + - 1.7686480691212918 + - 1.1599667704019356 + - 1.7769668472561033 + - 1.612346345547027 + - 1.2801234697158204 + - 1.5165911998965562 + - 1.8973656594202812 + - 1.7931891434972498 + - 1.3469231354790945 + - 1.2673989584019945 + - 1.3535296436712747 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.909144538577726 + - 9.632075549594735 + - 9.875424972841904 + - 9.18068810201158 + - 9.741332059680916 + - 9.646689919248566 + - 9.149077474493025 + - 9.584531342579812 + - 9.764166974501059 + - 9.654996922947534 + - 9.124569958925989 + - 9.614579167494377 + - 9.535352318738454 + - !!python/tuple + - 7.548823668596683 + - 9.173143170943748 + - 9.720023544255369 + - 8.158878857696745 + - 9.418669789284307 + - 9.20598471085988 + - 8.087857604291784 + - 9.066302704544434 + - 9.469986807361474 + - 9.224652365098027 + - 8.032796020077246 + - 9.133825392195321 + - 8.955790622224578 + - !!python/tuple + - 5.856156632175194 + - 8.60120501050351 + - 9.481532093997346 + - 6.9320859481135635 + - 8.715184640909616 + - 8.606009832049509 + - 7.085870425798809 + - 8.42051694155349 + - 9.158807923677477 + - 8.688322058295288 + - 6.673526696586718 + - 8.534709342532727 + - 8.233634661359714 + - !!python/tuple + - 3.7629997440056164 + - 7.8894717750530114 + - 9.184470827788626 + - 5.409898741031286 + - 7.839525999922466 + - 7.8593665385315825 + - 5.842427757125167 + - 7.617069088705408 + - 8.771339359841617 + - 8.020830354293293 + - 4.988026159669695 + - 7.789216471104032 + - 7.335398647390091 + - !!python/tuple + - 1.247778001460846 + - 7.006027966017091 + - 8.734943764450115 + - 3.6205250696917672 + - 6.752534347944216 + - 6.847996083376678 + - 4.382765644946998 + - 6.540265103862591 + - 8.289631808090329 + - 7.296910388868347 + - 2.869515363686665 + - 6.8308583199214 + - 6.330354677873075 + - !!python/tuple + - 0.2864585460845276 + - 6.0430813911696175 + - 8.28847226386884 + - 1.9403743736476315 + - 5.67936147474259 + - 5.812794962829322 + - 3.2014055828608283 + - 5.41047102713471 + - 7.9220485375124285 + - 6.580893726469348 + - 1.2043531236502685 + - 5.783640972063971 + - 5.181023792203444 + - !!python/tuple + - 1.7846832917342295 + - 5.993694784841025 + - 8.251309505713285 + - 1.910459977118161 + - 5.621580715099494 + - 5.741414176522777 + - 3.144187697908052 + - 5.363503690163155 + - 7.9020258926138185 + - 6.540855259068925 + - 1.2069120344203472 + - 5.725249573474342 + - 5.115271440854308 + - !!python/tuple + - 1.6526645484867133 + - 5.934959731529558 + - 8.204878105697858 + - 1.855945149857595 + - 5.549462239164504 + - 5.673673915103388 + - 3.07326655089884 + - 5.2918138130173835 + - 7.877011151114664 + - 6.490854746689546 + - 1.2156983131898313 + - 5.651910383456735 + - 5.02734213115122 + - !!python/tuple + - 1.4985806137664182 + - 5.861657031390022 + - 8.146873816441019 + - 1.7912266539819626 + - 5.459487744944307 + - 5.589151411619616 + - 2.9856054948794304 + - 5.202400326780465 + - 7.8457640894232075 + - 6.428429917335197 + - 1.2246076064982285 + - 5.560403512885127 + - 4.917713306912344 + - !!python/tuple + - 1.3267272114694133 + - 5.7702159576070295 + - 8.074424101398314 + - 1.7159273115099678 + - 5.34730250547496 + - 5.483746446464068 + - 2.8776829372033426 + - 5.090958014957188 + - 7.8067389821020186 + - 6.350520309565825 + - 1.2331727504297305 + - 5.44629224854713 + - 4.781144870247872 + - !!python/tuple + - 1.1521590187227648 + - 5.656219275745057 + - 7.982691705923911 + - 1.6671511146493205 + - 5.207537088310332 + - 5.310675704193598 + - 2.745588746302651 + - 4.977740829487937 + - 7.758010952078973 + - 6.253329052520208 + - 1.2289841410273359 + - 5.3049862507992085 + - 4.622744010926007 + - !!python/tuple + - 1.009805406594796 + - 5.514224294906116 + - 7.868171432237197 + - 1.6144399593737002 + - 5.033609567301722 + - 5.095239530128141 + - 2.5853448994139367 + - 4.836946427420792 + - 7.697185606251042 + - 6.132158143843607 + - 1.2255874784003344 + - 5.129099189415122 + - 4.425991934001554 + - !!python/tuple + - 0.9482724468834303 + - 5.33756538731713 + - 7.727224254655848 + - 1.5042327521111998 + - 4.817527447589978 + - 4.892702022204163 + - 2.393720628967076 + - 4.622252254848153 + - 7.621288902400291 + - 5.981217063185384 + - 1.2417705708188638 + - 4.90912775356687 + - 4.164222178019425 + - !!python/tuple + - 0.9554523921412786 + - 5.118158073559286 + - 7.548961389024565 + - 1.4744513572153002 + - 4.549741540189217 + - 4.560125739908401 + - 2.170134185999564 + - 4.406386768576659 + - 7.526634243471304 + - 5.793410567190784 + - 1.2277820083231288 + - 4.638119649826503 + - 3.8637554912139853 + - !!python/tuple + - 0.9511065046713258 + - 4.846358060688844 + - 7.329847382727735 + - 1.3633018828380938 + - 4.219186198002007 + - 4.251317237539376 + - 1.9209026502884203 + - 4.0779359316913215 + - 7.408664519182692 + - 5.5601257772141475 + - 1.2511658590605752 + - 4.301193165405248 + - 3.4674902353373165 + - !!python/tuple + - 0.9557076416315918 + - 4.511010016871336 + - 7.004932984513852 + - 1.4157963739797388 + - 3.8138581270148384 + - 3.731182654371388 + - 1.6680381491642433 + - 3.7818222693870975 + - 7.2617689982994325 + - 5.271072371918642 + - 1.1151677370004243 + - 3.9316476902168125 + - 3.0889834937689584 + - !!python/tuple + - 0.9481858787247406 + - 4.10003189579996 + - 6.605802004497301 + - 1.2944196323140424 + - 3.3229165132404646 + - 3.2607963800417106 + - 1.4624522368275432 + - 3.3264471862692666 + - 7.079080269512818 + - 4.914311759006464 + - 1.197089045210238 + - 3.479640884787579 + - 2.5989264009063286 + - !!python/tuple + - 0.9660323406424874 + - 3.6024741204748416 + - 6.11085250148244 + - 1.2957396481397394 + - 2.7433261151505195 + - 2.707529914789223 + - 1.3385705114938777 + - 2.8028602331217995 + - 6.823708509803327 + - 4.476822563289015 + - 0.8616915485292679 + - 2.9908438036151512 + - 2.1644337545412915 + - !!python/tuple + - 0.8214038904947902 + - 3.1693811047670213 + - 5.499709751548589 + - 1.2695043535494719 + - 2.1014756350343204 + - 2.3063707064127468 + - 1.291463373676624 + - 2.22048166278146 + - 6.3573231785181905 + - 3.9465397601999155 + - 1.7099311763729044 + - 2.4368821495005792 + - 1.7490645409722956 + - !!python/tuple + - 1.5597550337364636 + - 2.6657745271799977 + - 4.538188208347888 + - 1.3830785226437528 + - 1.7631480458057505 + - 1.7663714150378562 + - 1.1300989269912445 + - 2.0748934653620625 + - 5.647165409917443 + - 3.071137668567539 + - 1.6742362036795038 + - 2.410496542217916 + - 1.6386202608966873 + - !!python/tuple + - 1.4611630872843913 + - 2.644557519056406 + - 4.501265819828064 + - 1.3700250483126317 + - 1.7575857239962176 + - 1.7589223898151671 + - 1.1537684616682784 + - 2.0582516300347877 + - 5.606469654020803 + - 3.042230278920875 + - 1.5971187294776872 + - 2.386267772992711 + - 1.6342213637686072 + - !!python/tuple + - 1.3475434874321575 + - 2.6184165996479836 + - 4.455247023376112 + - 1.355387465136831 + - 1.750974957597784 + - 1.7500675204904894 + - 1.1780206769935322 + - 2.038082058299087 + - 5.555676610864634 + - 3.0064356879134246 + - 1.506641488559779 + - 2.356571127487587 + - 1.6290595719848677 + - !!python/tuple + - 1.222781602097768 + - 2.586342175969458 + - 4.397938454931192 + - 1.3395168034162097 + - 1.743225091078633 + - 1.739686621478075 + - 1.2019160582307276 + - 2.013854743085411 + - 5.492307861340765 + - 2.962235222996602 + - 1.4037159260541563 + - 2.3203843837153895 + - 1.6231057450188233 + - !!python/tuple + - 1.0977910693145705 + - 2.5472033694905356 + - 4.329954290668342 + - 1.3230798553546426 + - 1.7085095197797329 + - 1.7452128956103434 + - 1.2243488427552447 + - 1.9850981941756252 + - 5.413294037065876 + - 2.907856611711542 + - 1.2926152003674027 + - 2.2766347414492136 + - 1.616389468937485 + - !!python/tuple + - 0.9942983591006674 + - 2.4997968269737023 + - 4.241378861239231 + - 1.3070993774543058 + - 1.7017793621027522 + - 1.7295887888547183 + - 1.244613982215742 + - 1.9288351608628596 + - 5.329520935307092 + - 2.841293083912141 + - 1.189728928356313 + - 2.2102845132555933 + - 1.6021737614302003 + - !!python/tuple + - 0.9393674590200098 + - 2.4429557503161536 + - 4.164761611345245 + - 1.2781315709830685 + - 1.6944787424838366 + - 1.7324479221135363 + - 1.226871012176179 + - 1.8930027101908427 + - 5.185204204545571 + - 2.76038493835122 + - 1.0976363423594655 + - 2.1496934044998794 + - 1.5957686527395258 + - !!python/tuple + - 0.9330433788899142 + - 2.3757615009683613 + - 4.053272663150075 + - 1.2725935970521962 + - 1.6868796606110485 + - 1.7177098195097127 + - 1.2221820717927863 + - 1.8180414574006567 + - 5.042100501118828 + - 2.663022080377254 + - 1.0554112730389213 + - 2.0580321094329537 + - 1.5786539173843377 + - !!python/tuple + - 0.9350034309396358 + - 2.297920552103945 + - 3.924038333447815 + - 1.269088278952812 + - 1.616429289769302 + - 1.745632662995531 + - 1.2186910446847068 + - 1.783658869213113 + - 4.835929613193418 + - 2.5475724902921315 + - 1.0339266479976605 + - 1.9834586893700987 + - 1.57613041209001 + - !!python/tuple + - 0.9336047853106549 + - 2.210384575706983 + - 3.755669226251389 + - 1.267439227658296 + - 1.632112049088118 + - 1.7185931701622654 + - 1.218523292467006 + - 1.6947424844041625 + - 4.616783378822704 + - 2.4137165377013923 + - 1.0523023427244693 + - 1.8704717850561468 + - 1.5572661263898955 + - !!python/tuple + - 0.9352863146293859 + - 2.116261179519232 + - 3.551161254246233 + - 1.266994637169385 + - 1.644395726961674 + - 1.6952014583499415 + - 1.2184990010655379 + - 1.6174448044274485 + - 4.347006356270375 + - 2.263959915752096 + - 1.0428868634454844 + - 1.7608742840558567 + - 1.5434975029670874 + - !!python/tuple + - 0.9322361396664259 + - 2.0218709524026632 + - 3.3217873821136643 + - 1.2669850935313 + - 1.5297886919371115 + - 1.7610632214709727 + - 1.218502203159264 + - 1.5634144056109436 + - 4.017290015666671 + - 2.106087666881725 + - 1.0515923405742744 + - 1.6697358480167441 + - 1.5355237389242975 + - !!python/tuple + - 0.9401310669190228 + - 1.9372185948741132 + - 3.0330720332732346 + - 1.266987827717236 + - 1.6300743480238162 + - 1.6993053975418086 + - 1.2185006747361953 + - 1.537871204368078 + - 3.619274616813332 + - 1.9561629973225907 + - 1.0387866756481166 + - 1.6123248083703379 + - 1.5323857547390833 + - !!python/tuple + - 0.912412478891433 + - 1.874070952541 + - 2.7321046642423346 + - 1.2669859940852282 + - 1.4637484548609492 + - 1.7989355479725313 + - 1.2185020642950448 + - 1.5327066932380526 + - 3.1498367517683006 + - 1.8388392251594208 + - 1.066593265304396 + - 1.5913385232470292 + - 1.5318593243129681 + - !!python/tuple + - 1.0278222866865536 + - 1.7916510753197041 + - 2.2799932249257764 + - 1.3453518877725537 + - 1.5371579517631326 + - 1.67525356519466 + - 1.2411008711135232 + - 1.492944201211266 + - 2.2164700318422943 + - 1.7143031640287683 + - 1.0607581841347873 + - 1.5706544649110252 + - 1.4720479680781036 + - !!python/tuple + - 0.8349959823969462 + - 1.7086519651284053 + - 2.275476985836415 + - 1.0771008868869762 + - 1.4893003207155477 + - 1.582594079630855 + - 1.2493515127792783 + - 1.521927562524781 + - 2.2080291046228466 + - 1.7086323856160994 + - 1.0367461076206097 + - 1.583075860156874 + - 1.511088980470516 + - !!python/tuple + - 1.0428094965283257 + - 1.644004889134206 + - 2.265395382538173 + - 1.1275755072474005 + - 1.4719531653984692 + - 1.5428446194878456 + - 1.244033317185514 + - 1.533142246306159 + - 2.1706447037367345 + - 1.7032516081338946 + - 1.0464134595451675 + - 1.5902451204235437 + - 1.5246130787508492 + - !!python/tuple + - 0.9685595252948405 + - 1.6407562657568575 + - 2.264934243996253 + - 1.1355309606818815 + - 1.4719694786424535 + - 1.5386078486336254 + - 1.2454847222111234 + - 1.533129215449755 + - 2.171436267612873 + - 1.7032079451284972 + - 1.0485939465986462 + - 1.5902497115615097 + - 1.524596544494425 + - !!python/tuple + - 0.9507011657155832 + - 1.6374463807700277 + - 2.2643984494291436 + - 1.1398525030919668 + - 1.4719846323711212 + - 1.5344980911364448 + - 1.2465283713530835 + - 1.533116629686451 + - 2.17234651206192 + - 1.7031624152315474 + - 1.0493769360706733 + - 1.5902542814524911 + - 1.5245806543066893 + - !!python/tuple + - 0.9542493117805041 + - 1.6342710938343727 + - 2.263787752917162 + - 1.1414979770915208 + - 1.4719974928128863 + - 1.5308109513858457 + - 1.2471423692011097 + - 1.5331053680080464 + - 2.1733705932017884 + - 1.703117298487296 + - 1.0494873972422682 + - 1.5902585393020336 + - 1.524566531163659 + - !!python/tuple + - 0.9521145241088697 + - 1.6314625419191344 + - 2.2631085726812326 + - 1.141780934781235 + - 1.4720071168703095 + - 1.5278406458473257 + - 1.2474030397446632 + - 1.5330962912819384 + - 2.17449097435819 + - 1.7030755144605625 + - 1.0494725529231665 + - 1.5902621676318152 + - 1.5245552540842773 + - !!python/tuple + - 0.9543761696846926 + - 1.6292420632120703 + - 2.2623767368945207 + - 1.1417542983757352 + - 1.4720131121441784 + - 1.5257886196014097 + - 1.247460196458969 + - 1.5330899832456244 + - 2.175673349273769 + - 1.7030402013975185 + - 1.0494796818286916 + - 1.590264898647218 + - 1.5245475226456422 + - !!python/tuple + - 0.9543761696846926 + - 1.6292420632120703 + - 2.2623767368945207 + - 1.1417542983757352 + - 1.4720131121441784 + - 1.5257886196014097 + - 1.247460196458969 + - 1.5330899832456244 + - 2.175673349273769 + - 1.7030402013975185 + - 1.0494796818286916 + - 1.590264898647218 + - 1.5245475226456422 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.99273697099715 + - 9.896212975833244 + - 9.662350247356404 + - 8.964847540307176 + - 10.01 + - 9.684217447595692 + - 9.038934181882405 + - 9.48141950958787 + - 9.46105411301654 + - 9.727435238917998 + - 9.42586843998044 + - 9.51106839868151 + - 8.974370452758604 + - !!python/tuple + - 7.736615221199021 + - 9.766742759222817 + - 9.241176943081424 + - 7.673960324699127 + - 10.022475037450063 + - 9.290317747017834 + - 7.840401350297758 + - 8.83459864987098 + - 8.788836433379567 + - 9.387439606922493 + - 8.709773120691048 + - 8.901222094773331 + - 7.695353887168324 + - !!python/tuple + - 6.173246397731943 + - 9.605330784028506 + - 8.716270596484367 + - 6.067442274686049 + - 10.038030039028898 + - 8.799385856475874 + - 6.4257685409575505 + - 7.94235195625301 + - 7.959408193636962 + - 8.963662860883565 + - 7.887222730439205 + - 8.121331926824345 + - 6.058097053633196 + - !!python/tuple + - 4.289391341767283 + - 8.895094469509996 + - 7.980428712664203 + - 4.309264453385213 + - 10.057413577344182 + - 7.635132434455972 + - 5.045899413551722 + - 6.91073714709613 + - 7.284575700080464 + - 8.477740125876212 + - 6.798093056055427 + - 7.077907655620374 + - 4.477367121316301 + - !!python/tuple + - 2.0959160085502813 + - 7.954467817603982 + - 6.875892023175739 + - 2.2840570732336207 + - 10.081549696057046 + - 6.09416372951074 + - 3.6022914842280063 + - 5.477029185410337 + - 6.15018511845043 + - 8.113023617543753 + - 5.225355591109963 + - 5.94272655207573 + - 3.019896181943098 + - !!python/tuple + - 0.2926559087641827 + - 7.299370504502278 + - 5.758987161113928 + - 0.6409263296066969 + - 9.802306191417829 + - 4.616615664322043 + - 2.2509363849161947 + - 4.20852293566967 + - 5.034331889192459 + - 7.751429851700623 + - 3.5805200366224827 + - 4.8592391076711205 + - 1.7793931854126341 + - !!python/tuple + - 1.7630882949107045 + - 7.2423642391260366 + - 5.685142000426864 + - 0.8826088769472706 + - 9.781553068363559 + - 4.532680397656126 + - 2.206082753825182 + - 4.160175660242136 + - 5.007062260382358 + - 7.721293632033264 + - 3.481788755777658 + - 4.812899766134057 + - 1.7571603935842912 + - !!python/tuple + - 1.6562811952596423 + - 7.189818511557125 + - 5.608064905598224 + - 0.9852038291783045 + - 9.745386360952441 + - 4.443377488733938 + - 2.137491059167838 + - 4.099963011576956 + - 4.958725108997772 + - 7.679969378030497 + - 3.369314085233732 + - 4.755113070029602 + - 1.7120704307535521 + - !!python/tuple + - 1.5317540465824004 + - 7.1241950067877315 + - 5.527050615987288 + - 1.0234506026301058 + - 9.708753430646611 + - 4.3329023378943505 + - 2.0524856857675484 + - 4.013010132344258 + - 4.898467546209835 + - 7.616240308671218 + - 3.250172818853519 + - 4.672282955084714 + - 1.653268473073218 + - !!python/tuple + - 1.3922640252474467 + - 7.042259479939729 + - 5.426028894616625 + - 1.0514504595935528 + - 9.662983136615765 + - 4.195494094002279 + - 1.9510799439041453 + - 3.9050021635858085 + - 4.823409495642485 + - 7.536653661733694 + - 3.1029702092689218 + - 4.569160017069337 + - 1.5862408876027445 + - !!python/tuple + - 1.2828929496826638 + - 6.91448583065641 + - 5.300154877296957 + - 1.0814827529000057 + - 9.605803279630628 + - 4.014159792451038 + - 1.8462774279532115 + - 3.771133342391793 + - 4.773904368559511 + - 7.412339039582133 + - 2.9733565943941747 + - 4.440941539247142 + - 1.4822203743342457 + - !!python/tuple + - 1.2367762205576376 + - 6.741396168946808 + - 5.1314173693656 + - 1.1001642749737732 + - 9.534380838647854 + - 3.7880656211603427 + - 1.744661274266393 + - 3.60573818249116 + - 4.712389991872682 + - 7.266163836032233 + - 2.7902593179657984 + - 4.281817699618448 + - 1.4213731375665657 + - !!python/tuple + - 1.2027627669072936 + - 6.525591074070676 + - 4.942177496305814 + - 1.1069851590600284 + - 9.445186232049473 + - 3.511324285446603 + - 1.6063668011645762 + - 3.405075508661871 + - 4.60708080413514 + - 7.072605832210729 + - 2.59490011144916 + - 4.11984859847523 + - 1.312526141744543 + - !!python/tuple + - 1.1068207257473799 + - 6.258204893473541 + - 4.707524648054701 + - 1.10394409643746 + - 9.333826571454546 + - 3.285382043660642 + - 1.6043378969151196 + - 3.1602198996855533 + - 4.359114783519017 + - 6.831330891585603 + - 2.363544562143423 + - 3.9201859373029975 + - 1.2311874866400887 + - !!python/tuple + - 1.0663948196625608 + - 6.00485324043747 + - 4.417555218839458 + - 1.0573384697529713 + - 9.194842249169653 + - 3.0126033742966607 + - 1.395299399332142 + - 2.86525660701167 + - 4.03168825622751 + - 6.530886878484008 + - 2.098747691455903 + - 3.6755310538001913 + - 1.1928998079879103 + - !!python/tuple + - 1.2132388490615087 + - 5.513475717689089 + - 4.061211858282386 + - 1.1660302135679852 + - 9.021461470937993 + - 2.6558813791574387 + - 1.576038879226612 + - 2.512950694052098 + - 3.8006706268464683 + - 6.157348774957496 + - 1.8263672334586751 + - 3.3103620504263676 + - 1.1807591862597182 + - !!python/tuple + - 0.8170830653977401 + - 5.168568253375587 + - 3.627516388495482 + - 0.9635578765699777 + - 8.80530925628437 + - 2.336449518329425 + - 1.2670130555497496 + - 2.055764500407894 + - 3.4165285865687434 + - 5.635019337848267 + - 1.699631768796665 + - 2.9447928002953754 + - 0.9858602078014782 + - !!python/tuple + - 2.0129222154260225 + - 4.415947942173406 + - 2.996508683501501 + - 1.46475124667919 + - 8.536073121962865 + - 1.887628208628891 + - 1.6949930524919636 + - 1.782677753214385 + - 3.0047750608305073 + - 5.063940042150733 + - 1.3883148673322996 + - 2.626060959036863 + - 1.5199685322139296 + - !!python/tuple + - 1.7379151995997266 + - 3.9269394914625977 + - 2.430186602834041 + - 1.9825204631558047 + - 7.9391261192897415 + - 1.7444549457017096 + - 1.380669068791182 + - 1.632774145078947 + - 2.3516820984101163 + - 4.113542328777871 + - 1.4595008099200786 + - 2.277046367843441 + - 1.7650107070489043 + - !!python/tuple + - 1.390899140890502 + - 3.8608735901248927 + - 2.351104914798881 + - 1.6221523815781835 + - 7.826396128411617 + - 1.7691079776672094 + - 1.2399765493915578 + - 1.5820797444006736 + - 2.243738110144471 + - 3.899862573032352 + - 1.5177740159726543 + - 2.1509281854851428 + - 1.4489430187315038 + - !!python/tuple + - 1.0760507101932348 + - 3.779723708977265 + - 2.259665529351879 + - 1.252076997547902 + - 7.685778257459166 + - 1.794103639520367 + - 1.14462151489714 + - 1.5343429405620579 + - 2.1202106780428287 + - 3.637021115968473 + - 1.56798758949362 + - 2.0081798041546985 + - 1.1532620720872664 + - !!python/tuple + - 0.9662322976008253 + - 3.6421117547969515 + - 2.15731620236478 + - 1.1365889711354549 + - 7.367155832743401 + - 1.8182590825388887 + - 1.222161948891896 + - 1.5977576490371443 + - 2.0401966908510465 + - 3.3879228192435176 + - 1.521185417633887 + - 2.0427624083870066 + - 1.10392822333986 + - !!python/tuple + - 1.0710920039061393 + - 3.4333659851178786 + - 2.048403229353219 + - 1.2449466447461899 + - 7.070224319477072 + - 1.6189446784880857 + - 1.184254911464534 + - 1.5485382848786164 + - 2.0146236389280756 + - 3.1283960058750346 + - 1.507472048518603 + - 1.9070772120027017 + - 1.016067469305171 + - !!python/tuple + - 0.8995987204057782 + - 3.2970532377445085 + - 1.9415825155940953 + - 1.0139762968304087 + - 6.628486587753852 + - 1.7452910249456868 + - 1.1469261091598015 + - 1.637933762699355 + - 1.7015149824242193 + - 2.845796000757956 + - 1.323683877802272 + - 1.9948483173626093 + - 1.2542939754045497 + - !!python/tuple + - 1.0994954265071235 + - 2.4139761588568844 + - 1.8565400367652316 + - 1.2811573305891888 + - 4.9451872858340336 + - 1.786913554999805 + - 1.1197187265377495 + - 1.450597022769075 + - 1.4363625780916494 + - 1.8352577508441876 + - 1.5503249763094828 + - 1.5733817838538777 + - 0.7453872496136511 + - !!python/tuple + - 0.8973082064647036 + - 2.438221287678196 + - 1.720422480070398 + - 1.1092350984268156 + - 3.489835087131066 + - 1.6618200138765886 + - 1.179871379889316 + - 1.3550507452664018 + - 1.552017810739213 + - 1.8600502634768095 + - 1.4063284004405383 + - 1.4111554216428948 + - 1.4394551705044552 + - !!python/tuple + - 1.2419692009687748 + - 2.2933194206563545 + - 1.7380140607493504 + - 0.9659743976667056 + - 3.36096022500989 + - 1.4872127970014675 + - 1.1442671972480472 + - 1.362367491408168 + - 1.5485165771329081 + - 1.8947961621992482 + - 1.307975463936317 + - 1.437500388269441 + - 1.0061375977208464 + - !!python/tuple + - 1.1007905451878406 + - 2.035951803215707 + - 1.6811990510579653 + - 1.0162318824325478 + - 2.857583952896038 + - 1.5428852561611528 + - 1.146588947365531 + - 1.361081942464536 + - 1.4308766534151178 + - 1.9190592808467404 + - 1.3257957229115376 + - 1.4355593896922612 + - 1.1005826383114468 + - !!python/tuple + - 0.9576119122011534 + - 2.0203966794970496 + - 1.652310751529319 + - 1.048999211142183 + - 2.8561800897415157 + - 1.4337475156142152 + - 1.157648933912323 + - 1.3619119631752303 + - 1.4872526221576203 + - 1.9272952480896757 + - 1.3134830964984008 + - 1.4388775583877684 + - 1.0976220063601123 + - !!python/tuple + - 0.9576119122011534 + - 2.0203966794970496 + - 1.652310751529319 + - 1.048999211142183 + - 2.8561800897415157 + - 1.4337475156142152 + - 1.157648933912323 + - 1.3619119631752303 + - 1.4872526221576203 + - 1.9272952480896757 + - 1.3134830964984008 + - 1.4388775583877684 + - 1.0976220063601123 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.194995622031554 + - 9.935763556400438 + - 9.742702529293151 + - 8.76532225189829 + - 9.954342152810169 + - 9.790278705257412 + - 9.621806990131208 + - 9.411125124272365 + - 9.644992665113993 + - 9.631772183273622 + - 9.32101084265273 + - 9.189667803106396 + - 9.26068599311705 + - !!python/tuple + - 8.191024660389706 + - 9.855630153740494 + - 9.421749640276024 + - 7.225744567975547 + - 9.897384774966799 + - 9.528668357310467 + - 9.13866160294001 + - 8.715738710245446 + - 9.202170616938284 + - 9.10031794256849 + - 8.474161851246487 + - 8.226101383593624 + - 8.338618992367259 + - !!python/tuple + - 6.940868929333486 + - 9.755721827898444 + - 9.0216991351831 + - 5.310862009953383 + - 9.82637006560417 + - 9.20256283300749 + - 8.475003376893083 + - 7.869989020567682 + - 8.511846683282034 + - 8.438024776062614 + - 7.2928620436198575 + - 7.2314247482315075 + - 7.30919193245416 + - !!python/tuple + - 5.401680092183718 + - 9.520148804594104 + - 8.479398740742157 + - 3.002516199391178 + - 9.737890907216427 + - 8.765554935257581 + - 7.646761372915556 + - 7.102662328627786 + - 7.511786524404106 + - 7.614005778179171 + - 5.679699774513182 + - 6.106650710331271 + - 6.105826557688486 + - !!python/tuple + - 3.629426337386692 + - 8.910369500120227 + - 7.36825560141516 + - 0.7953355529883366 + - 9.338970872793638 + - 7.923917583124767 + - 6.924005700731362 + - 6.015392917018357 + - 6.545436156858029 + - 6.832318053269791 + - 3.4902293515804304 + - 4.891722500308774 + - 5.252236136659687 + - !!python/tuple + - 1.9623567272396307 + - 7.464398752383655 + - 6.2318737060295 + - 3.550886772962195 + - 8.843128945444455 + - 6.672631384453462 + - 5.975559595952361 + - 4.70371389587096 + - 5.869262203305533 + - 5.5209181658697055 + - 1.4139905435798537 + - 3.5452058394111603 + - 4.083183446314186 + - !!python/tuple + - 0.5607670248869543 + - 6.641981932605167 + - 5.369545414284724 + - 0.457747938264609 + - 7.958817368039911 + - 5.7875327066009685 + - 5.016871733211968 + - 3.491339262155573 + - 4.854724981341514 + - 4.244264467919479 + - 0.9677226959533369 + - 2.278182478765939 + - 2.570911165627238 + - !!python/tuple + - 1.947176195819523 + - 6.3675336505126205 + - 5.187219577077188 + - 2.6413975682225255 + - 7.811990273494273 + - 5.558791528261736 + - 4.867411761304641 + - 3.4412711158222717 + - 4.751055177319363 + - 4.0417025992605655 + - 1.0542368453835347 + - 2.1734395287418944 + - 2.4573980797212363 + - !!python/tuple + - 1.6898834445522692 + - 6.152410450456265 + - 5.013682191591713 + - 2.1111848123496824 + - 7.628839776656557 + - 5.354230051153848 + - 4.67545052788881 + - 3.2170760080515137 + - 4.548065755075949 + - 3.7921507208714096 + - 1.2070580660679775 + - 2.0188049866242572 + - 2.2435001225765707 + - !!python/tuple + - 1.4581907617135692 + - 5.860919948512729 + - 4.73287672459035 + - 1.5872177153140528 + - 7.4005386393629555 + - 5.065163174358612 + - 4.431502539549725 + - 3.1505118411462827 + - 4.237491148956302 + - 3.486868605940819 + - 1.0370577540718535 + - 1.8972963623485508 + - 2.104041245466798 + - !!python/tuple + - 1.2886948441033352 + - 5.499250002741274 + - 4.386730524420432 + - 1.1048397255824587 + - 7.1162386964579705 + - 4.707924634153289 + - 4.140275358194456 + - 2.9588349545926285 + - 3.9317091952761247 + - 3.1179755624664853 + - 1.1308648956224676 + - 1.7755979607229089 + - 1.92062843122872 + - !!python/tuple + - 1.2339060565168152 + - 5.123211464567124 + - 3.963201827109809 + - 1.0297169051803436 + - 6.698325555564344 + - 4.283914655026484 + - 3.7855107974928326 + - 2.7360838389840896 + - 3.495647780122671 + - 2.747529010837488 + - 0.9627811448567014 + - 1.6727065299748327 + - 1.8285929025728114 + - !!python/tuple + - 1.2508275482652855 + - 4.661026251635421 + - 3.4520724431144636 + - 1.1293955452136109 + - 6.17990430514861 + - 3.7685476748045996 + - 3.359940353232948 + - 2.4878881044248287 + - 3.058715646102635 + - 2.249603467368349 + - 1.3421671822811185 + - 1.6069380127849031 + - 1.6563511676567644 + - !!python/tuple + - 1.2375055895823461 + - 4.09878380820906 + - 2.7441220777894166 + - 0.9463026266238062 + - 5.539487537932411 + - 3.1534178257217733 + - 2.92134190982712 + - 2.232295265052225 + - 2.459784190707996 + - 1.976501574111759 + - 0.44209605832784893 + - 1.5830365702497078 + - 1.7613887461774713 + - !!python/tuple + - 1.229738856929381 + - 3.998683324162351 + - 2.6722297487265987 + - 1.0056630164884857 + - 5.4078055690606 + - 3.055303884475613 + - 2.829192871976742 + - 2.136419790754667 + - 2.3794214631515 + - 1.8965632522066849 + - 2.2670507156506754 + - 1.5608087475182504 + - 1.6886890426529428 + - !!python/tuple + - 1.2375666728417503 + - 3.859748779305662 + - 2.5153807998901545 + - 1.0625158495369853 + - 5.244025581069079 + - 2.912847945031392 + - 2.728460469530483 + - 2.1565232883136694 + - 2.219676357883587 + - 1.86614250228279 + - 1.8143248624311594 + - 1.5675866689779034 + - 1.7277301255028532 + - !!python/tuple + - 1.2420146479019365 + - 3.6890140167022683 + - 2.3836275299167236 + - 1.0438871087861783 + - 5.040688928105122 + - 2.7450063012980888 + - 2.589292937013159 + - 2.1069880306971362 + - 2.061098265586988 + - 1.8339648141602491 + - 1.3585368412277616 + - 1.572354247778185 + - 1.74327178098565 + - !!python/tuple + - 1.2438400515786916 + - 3.480681243482089 + - 2.23329993922787 + - 1.0530303141450719 + - 4.7590251513897845 + - 2.547087056440746 + - 2.4796982350774246 + - 1.9684765869490835 + - 1.9602385006179006 + - 1.8018745199188315 + - 1.0418441588525873 + - 1.5419931921212755 + - 1.7564463463201077 + - !!python/tuple + - 1.2182443306665076 + - 3.259312924304151 + - 2.2220954400450807 + - 0.9487431965602009 + - 4.4491011205495345 + - 2.407418187917095 + - 2.2658507979209586 + - 1.7808896167434984 + - 1.8590107492679775 + - 1.7001087056650945 + - 1.3119693454860504 + - 1.4183868722992414 + - 1.4934019439002066 + - !!python/tuple + - 0.954374021719667 + - 2.678027586990168 + - 1.9292164581552211 + - 0.958658725732578 + - 2.8692032558617693 + - 1.9905331948679246 + - 1.778629574824045 + - 1.4695161245275172 + - 1.869553077665088 + - 1.5450160520038532 + - 1.7596737286111175 + - 1.0211480200392336 + - 1.0174274445456488 + - !!python/tuple + - 1.182283067293913 + - 2.3251067724514365 + - 1.828014521526389 + - 1.1240309337523624 + - 2.518507875082744 + - 1.883029903900574 + - 1.6666981722647831 + - 1.7401763535923909 + - 1.547400051274932 + - 1.6219845994874438 + - 1.970015806086441 + - 1.464441792733105 + - 1.6692889658576904 + - !!python/tuple + - 1.1936324177312632 + - 2.2299301970972554 + - 1.859971569725803 + - 0.8193491249919054 + - 2.3736061274958002 + - 1.887232158583597 + - 1.618762531003562 + - 1.7680123509759629 + - 1.550832607450033 + - 1.6238643777006567 + - 1.238697412048625 + - 1.449342063346763 + - 1.5346187290717164 + - !!python/tuple + - 1.1629444831462363 + - 2.1486980765021 + - 1.8095750077270571 + - 1.17693083618162 + - 2.286481594382629 + - 1.9285942342756284 + - 1.6468622445041219 + - 1.4764247252604257 + - 1.533206849933641 + - 1.6142571037360633 + - 1.1457763320563181 + - 1.3336227669485936 + - 1.3342282624999275 + - !!python/tuple + - 1.17043584631113 + - 2.121843168118529 + - 1.762751502385818 + - 0.8478190213382615 + - 2.3003492633224645 + - 1.9155717054749044 + - 1.7071326099583444 + - 1.3487050576287856 + - 1.5843495497480307 + - 1.6271166733741818 + - 1.2188916602861652 + - 1.2481258165453784 + - 1.3358089018474275 + - !!python/tuple + - 1.1670991043637315 + - 2.1407026463217242 + - 1.774795000113401 + - 0.9424852942390453 + - 2.164840580992952 + - 1.9169309360274054 + - 1.6597710104571928 + - 1.5134700547412472 + - 1.5530757117991578 + - 1.6114807160072986 + - 1.0704110521367736 + - 1.3780201118155682 + - 1.3602017886066273 + - !!python/tuple + - 1.173162284529861 + - 2.1095125446763308 + - 1.731796118202591 + - 0.877905572817069 + - 2.2303999579773914 + - 1.8979871423487957 + - 1.6649289415796684 + - 1.553001667124765 + - 1.5394306464228116 + - 1.633358419816992 + - 1.2499711318779667 + - 1.3510213453635398 + - 1.4048811081434356 + - !!python/tuple + - 1.1578611519025943 + - 2.149398824106857 + - 1.8125740598928066 + - 1.0076302190594117 + - 2.195774350683978 + - 1.947557554491054 + - 1.6588161869035494 + - 1.4327206715433243 + - 1.5462443863385908 + - 1.6371531964194599 + - 1.1811549570625042 + - 1.2917777407434843 + - 1.3215627535537702 + - !!python/tuple + - 1.1751122162492158 + - 2.103969625765089 + - 1.7216869860857544 + - 0.9529906754468447 + - 2.2171915294291153 + - 1.9122771565860543 + - 1.6909908268635385 + - 1.4235337413955034 + - 1.549264129249035 + - 1.6599807048913908 + - 1.1080277811218648 + - 1.3327035873519573 + - 1.3903425124998823 + - !!python/tuple + - 1.1751122162492158 + - 2.103969625765089 + - 1.7216869860857544 + - 0.9529906754468447 + - 2.2171915294291153 + - 1.9122771565860543 + - 1.6909908268635385 + - 1.4235337413955034 + - 1.549264129249035 + - 1.6599807048913908 + - 1.1080277811218648 + - 1.3327035873519573 + - 1.3903425124998823 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.225810114449695 + - 9.68102975361219 + - 9.711120270873192 + - 9.174176376925542 + - 10.01 + - 9.62573557814891 + - 9.586644728266807 + - 9.42181935287966 + - 9.29640092926761 + - 9.674392082130336 + - 9.390950411721152 + - 9.569332838222754 + - 9.56683287120252 + - !!python/tuple + - 8.260258671812736 + - 9.283154214402483 + - 9.220553097370392 + - 8.236122674499734 + - 10.022475037450063 + - 9.111815056829041 + - 9.15288528200382 + - 8.700674769910483 + - 8.47628351228961 + - 9.221921760663268 + - 8.643608098749404 + - 9.032149327317535 + - 9.013278502153371 + - !!python/tuple + - 7.057861830559384 + - 8.78726950241577 + - 8.609154031829027 + - 7.068025203241225 + - 10.038030039028898 + - 8.471370325497338 + - 8.612335573088165 + - 7.8022827208862235 + - 7.454804564758663 + - 8.658012264669741 + - 7.712626421780996 + - 8.362759931103826 + - 8.323496898635922 + - !!python/tuple + - 5.565449776967677 + - 8.170043759732225 + - 7.848284012592877 + - 5.618206667457833 + - 10.057413577344182 + - 7.674505819970238 + - 7.939666847858313 + - 6.685576258912259 + - 6.4259876224416415 + - 7.774014879279359 + - 6.593702297175232 + - 7.5300092983893725 + - 7.39911916945266 + - !!python/tuple + - 3.8032585982035876 + - 7.287928005601786 + - 6.863291575590132 + - 4.0264966895940315 + - 9.770783616846831 + - 6.442765424036068 + - 6.871042637184232 + - 5.597510859923329 + - 5.155159324893235 + - 6.818714331450524 + - 5.196885240323594 + - 6.692706169628469 + - 6.495219878039108 + - !!python/tuple + - 1.7129724991912951 + - 6.197020694968363 + - 5.596649295590495 + - 2.2353840357352515 + - 9.41429223709168 + - 5.039464280203124 + - 5.634714218444254 + - 4.109851738783402 + - 4.10779636185009 + - 5.3813150807131125 + - 3.62393553855319 + - 5.4904850734025406 + - 5.210794183026553 + - !!python/tuple + - 0.34629622314479014 + - 4.237209480377276 + - 4.282770276726264 + - 0.7804018610812369 + - 8.590927872139535 + - 2.921830551920791 + - 4.3548200734845555 + - 2.3543710852508974 + - 3.0638940852571412 + - 4.240682898932461 + - 1.6932358850690057 + - 4.029087755112746 + - 3.9926627740475147 + - !!python/tuple + - 2.3395602066504737 + - 4.1488814049223235 + - 4.1826933200314 + - 1.075435865570462 + - 8.503058874427207 + - 2.8296229033163844 + - 4.271849685394465 + - 2.302151660488999 + - 2.998283939472061 + - 4.1456263003459055 + - 1.627925192169833 + - 3.9452506895168034 + - 3.915285171433158 + - !!python/tuple + - 2.142463036138695 + - 4.060120969225198 + - 4.058462237816259 + - 1.1852491268962477 + - 8.393314862860343 + - 2.720512093214298 + - 4.164856834268901 + - 2.2395896066620558 + - 2.917815645922827 + - 4.015509274227189 + - 1.55886457076403 + - 3.841321355342767 + - 3.815909461603226 + - !!python/tuple + - 1.910493457201035 + - 3.950222216369246 + - 3.9046286539998536 + - 1.2599312493921773 + - 8.25628396187414 + - 2.588309326184928 + - 4.032283804593306 + - 2.1657651687181763 + - 2.819778041838284 + - 3.854432570294783 + - 1.4865365423682921 + - 3.7128529121791614 + - 3.6930996449925306 + - !!python/tuple + - 1.6492627752645779 + - 3.814601012300202 + - 3.7148342593520964 + - 1.2686424183962886 + - 8.107828044566311 + - 2.4303031458308104 + - 3.8548382011435005 + - 2.0805623087794536 + - 2.673932679783353 + - 3.655796083643028 + - 1.4171281433694887 + - 3.5547100948885024 + - 3.541964802921765 + - !!python/tuple + - 1.3826695097417656 + - 3.6480427392576105 + - 3.5601492385067544 + - 1.321079843400606 + - 7.8648638218803075 + - 2.3259407627592403 + - 3.6538660822813336 + - 1.9824861819765422 + - 2.5350870504107585 + - 3.4123089499379873 + - 1.3821680938494778 + - 3.299161862848198 + - 3.342460738577861 + - !!python/tuple + - 1.1737768923935472 + - 3.4449797842507777 + - 3.400764124406283 + - 1.3101620713079836 + - 7.5619220609500175 + - 2.1578787908538355 + - 3.388647935388621 + - 1.8823499299023414 + - 2.312698486226056 + - 3.1167972844852345 + - 1.3304552249084867 + - 3.067530002576647 + - 3.119264466382638 + - !!python/tuple + - 1.1154069365779071 + - 3.2002705447606896 + - 3.148260071512423 + - 1.3632266858499407 + - 7.184566118270824 + - 1.9157191735709256 + - 3.094418991998018 + - 1.7849704342536854 + - 2.142856118874935 + - 2.7644651704819427 + - 1.3072967292448836 + - 2.79238900847526 + - 2.853536910265118 + - !!python/tuple + - 1.139885608842026 + - 2.911107410966095 + - 2.926714476053878 + - 1.331026103087028 + - 6.665419088273495 + - 1.7626700721116018 + - 2.754226342552571 + - 1.7027885175604767 + - 1.8730943855490598 + - 2.428993492218359 + - 1.2992184782705773 + - 2.475930791917395 + - 2.549886779676528 + - !!python/tuple + - 1.11712324589279 + - 2.5814670517822496 + - 2.674552463953264 + - 1.3319484014728171 + - 6.021384258547609 + - 1.6485027995996908 + - 2.371785429984313 + - 1.648540749189961 + - 1.6409633418533631 + - 2.070028960430853 + - 1.3005253918223774 + - 2.134855911533978 + - 2.2187473444550876 + - !!python/tuple + - 1.150551093179331 + - 2.2320342490261345 + - 2.2855419093468328 + - 1.4431424953158425 + - 5.226247763169377 + - 1.4747938956862885 + - 2.0873555966361024 + - 1.426546407308801 + - 1.8211678496824804 + - 1.7460887043985132 + - 1.3370545268981273 + - 1.8061551249478374 + - 1.8660866552614197 + - !!python/tuple + - 1.080310851291057 + - 1.9189319202188395 + - 2.073887042664736 + - 1.0350983897563113 + - 4.362090118503262 + - 1.6331097656654876 + - 1.6554704628764247 + - 1.8248201779571016 + - 1.1545825355661574 + - 1.5721789704222315 + - 1.1638566041992235 + - 1.7592836255819218 + - 1.6972978350018177 + - !!python/tuple + - 0.9783632970192131 + - 1.7409481547205476 + - 2.21921570856845 + - 1.0619222594936217 + - 3.092866657197792 + - 1.8255821544605977 + - 1.4517787022355102 + - 1.710225944892187 + - 1.6287120905890506 + - 1.8888894470625428 + - 1.2266154978023083 + - 1.7904877362273428 + - 1.8869514089644441 + - !!python/tuple + - 1.3795367405340864 + - 1.652813075626404 + - 1.92484780026819 + - 1.694925276039458 + - 2.604610144394982 + - 1.739048280475651 + - 1.5938408278267704 + - 1.5816156842395845 + - 1.5846811891166284 + - 1.7068671747288047 + - 1.2581573070518717 + - 1.5636863734599906 + - 1.6293580812582502 + - !!python/tuple + - 1.0561150005593076 + - 1.699175525481764 + - 1.7030959414482563 + - 1.2770070494010093 + - 2.5475998846988905 + - 1.5004943790310137 + - 1.6934819069742704 + - 1.3535309628850447 + - 1.3243148509957772 + - 1.7759401666067622 + - 1.2795050695393104 + - 1.5938963059518019 + - 1.6570055835753628 + - !!python/tuple + - 1.0561150005593076 + - 1.699175525481764 + - 1.7030959414482563 + - 1.2770070494010093 + - 2.5475998846988905 + - 1.5004943790310137 + - 1.6934819069742704 + - 1.3535309628850447 + - 1.3243148509957772 + - 1.7759401666067622 + - 1.2795050695393104 + - 1.5938963059518019 + - 1.6570055835753628 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.17009479765881 + - 10.01 + - 9.608353178001886 + - 9.210882083079632 + - 9.783754292475336 + - 9.559220840873168 + - 9.175438946421579 + - 9.75642224621913 + - 9.577681106943533 + - 9.579606828662843 + - 9.481095811064854 + - 9.661208358118666 + - 9.444516721114201 + - !!python/tuple + - 8.148041037648563 + - 9.950778696390849 + - 9.119834445742027 + - 8.319978953050226 + - 9.514005827802615 + - 8.859629447301607 + - 8.189109402635891 + - 9.452581992410439 + - 9.050909145829447 + - 9.072135481214719 + - 8.810124385806908 + - 9.238610857434532 + - 8.837147446274665 + - !!python/tuple + - 6.875427664706894 + - 9.876938229797721 + - 8.458693758760782 + - 7.224564183955432 + - 9.17775899276866 + - 7.88603378857462 + - 7.073130084970997 + - 9.073853905525981 + - 8.432358922318892 + - 8.439754404422187 + - 7.974158539917777 + - 8.711930474204276 + - 8.08042645791695 + - !!python/tuple + - 5.296559412183797 + - 9.784933678359465 + - 7.636082297287005 + - 5.864500617412915 + - 8.759060495509596 + - 6.675562444360952 + - 5.917153078588306 + - 8.361300867860008 + - 7.793005230493904 + - 7.652967522203123 + - 7.253352776839383 + - 7.85516991832469 + - 6.953165865095516 + - !!python/tuple + - 3.4712533723110965 + - 9.428913072370666 + - 6.697368839575982 + - 4.326659626597285 + - 8.12844309270766 + - 5.124068410950288 + - 4.555444877336302 + - 7.475878856973946 + - 7.054746822913618 + - 6.742371071936257 + - 6.29778968927337 + - 6.791618786106236 + - 5.624514122187028 + - !!python/tuple + - 1.4124099652903417 + - 8.75438888301266 + - 5.539676460436865 + - 2.592951015808146 + - 7.346582721595626 + - 3.111617571271452 + - 2.913206112344395 + - 6.426669383960896 + - 6.033873472531785 + - 5.666204099410576 + - 4.893830680707842 + - 5.672365281528987 + - 4.346388974903669 + - !!python/tuple + - 0.7246557314665846 + - 7.720431403948551 + - 4.281748860738325 + - 0.7894151523099848 + - 6.382200264412662 + - 0.8447580777018642 + - 1.126072768620167 + - 5.139263271393166 + - 4.785911837560609 + - 4.355897513157757 + - 3.201982491147505 + - 4.309155111226973 + - 2.8300793924975185 + - !!python/tuple + - 3.1238627440348363 + - 7.206926975109917 + - 3.7825197717244152 + - 2.7944833256135135 + - 5.67339647478704 + - 2.3467341904094696 + - 2.3139758578565788 + - 4.133928993508338 + - 4.480805088493101 + - 3.9252509766703856 + - 2.5701678695374737 + - 3.413779406921688 + - 1.9699331108243192 + - !!python/tuple + - 1.528628496138352 + - 6.557853567342745 + - 2.972575451301144 + - 1.6530206646668755 + - 4.966564230133304 + - 0.9708923972694476 + - 1.4971968580928776 + - 3.5703765896704645 + - 3.7366505204700418 + - 3.216476350043391 + - 1.5798020909738775 + - 2.8385995409652764 + - 1.5915479024286894 + - !!python/tuple + - 0.8226461576914832 + - 5.665620919532155 + - 2.60158426125733 + - 0.802925591655462 + - 4.111931259657801 + - 2.247525689920357 + - 1.1717515388706272 + - 2.7059618027007164 + - 2.715780569935621 + - 2.4274174670398994 + - 1.3175059039083776 + - 2.0319253754776545 + - 1.46939694702247 + - !!python/tuple + - 1.3578801849898898 + - 4.1679853515716365 + - 2.10210696669293 + - 1.5767160219789895 + - 2.8463148964994884 + - 2.607718322755679 + - 3.362352608416615 + - 1.9837203086762756 + - 1.915704953915813 + - 1.7381751494156552 + - 1.389446552977112 + - 1.914816781465897 + - 1.3749661244980116 + - !!python/tuple + - 1.1831649464188498 + - 3.786374539696084 + - 1.9320555300122977 + - 1.3342225395605607 + - 2.717800015386676 + - 1.877646196735749 + - 2.39815729526456 + - 2.183960101862813 + - 1.6994132560396056 + - 1.5384354313995976 + - 1.133652164934067 + - 2.2243885835647395 + - 1.674107906562164 + - !!python/tuple + - 1.2343819474079498 + - 3.4514643951534607 + - 1.7844750017600493 + - 1.2408319053389185 + - 2.505375276155218 + - 1.2309539362312303 + - 1.6046157094763411 + - 2.0119007467421492 + - 1.742230476021904 + - 1.564586780940682 + - 1.6923456064743059 + - 2.0455132200858928 + - 1.3841145888656734 + - !!python/tuple + - 1.1884422224684792 + - 2.9573499420297966 + - 1.6901225528306294 + - 1.338975463970356 + - 2.2865844013730836 + - 1.0646094091605525 + - 1.2180223638053471 + - 1.929291729657577 + - 1.666965313209902 + - 1.7030835846633967 + - 1.2263507776655345 + - 1.8845692780075471 + - 1.5855420547844468 + - !!python/tuple + - 1.1884422224684792 + - 2.9573499420297966 + - 1.6901225528306294 + - 1.338975463970356 + - 2.2865844013730836 + - 1.0646094091605525 + - 1.2180223638053471 + - 1.929291729657577 + - 1.666965313209902 + - 1.7030835846633967 + - 1.2263507776655345 + - 1.8845692780075471 + - 1.5855420547844468 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.936191913289838 + - 9.798911210802645 + - 9.724260772003111 + - 8.90709352847976 + - 9.93100789056192 + - 9.40439903468038 + - 9.655999667321304 + - 9.251771765469178 + - 9.59073331397608 + - 9.310871922090081 + - 9.319737086106457 + - 9.70758067362397 + - 9.424418517770654 + - !!python/tuple + - 7.6095850735487 + - 9.548068527082304 + - 9.380305682740362 + - 7.5442161494124775 + - 9.844942035567206 + - 8.661531269234274 + - 9.226905755061034 + - 8.318590081153147 + - 9.08023954735446 + - 8.451380631005552 + - 8.471299832039845 + - 9.342820927452337 + - 8.706515125050174 + - !!python/tuple + - 5.958743425123737 + - 9.235381431795044 + - 8.951595811549062 + - 5.848377912203084 + - 9.737637928457445 + - 7.736106950532477 + - 8.692133268721408 + - 7.156438290037306 + - 8.444086057324704 + - 7.380868847466318 + - 7.414537111637142 + - 8.888191181120158 + - 7.812156589429595 + - !!python/tuple + - 3.916469348726007 + - 8.845997843283413 + - 8.417885511142932 + - 3.751366743853211 + - 9.603954357554324 + - 6.58592767723229 + - 8.02657736530715 + - 5.713659860677833 + - 7.569656304808515 + - 6.1660402901044975 + - 6.037021926815357 + - 8.32225155356119 + - 6.742838386847216 + - !!python/tuple + - 1.454033679305211 + - 8.361843764923753 + - 7.754733527646546 + - 1.2707116921161918 + - 9.326658759784 + - 5.163696440876054 + - 7.288743797236426 + - 4.0440575289745615 + - 6.552395359251542 + - 4.666903067508447 + - 4.451979069079627 + - 7.3986728199405665 + - 5.449915810230061 + - !!python/tuple + - 0.18572481422054565 + - 7.5207764265572274 + - 6.730159785802881 + - 0.37072901447067674 + - 8.859185617164757 + - 3.63385411714765 + - 6.660981711851961 + - 2.671234501449913 + - 5.861528565346464 + - 3.5977369166906885 + - 2.8563723404443344 + - 6.507276574696079 + - 4.392940059368256 + - !!python/tuple + - 1.173128706697371 + - 7.507860669440803 + - 6.712771387371174 + - 0.6053479284652268 + - 8.850146816563033 + - 3.6101680937247846 + - 6.652946637656041 + - 2.6591718377516824 + - 5.853088322790316 + - 3.5834314233836055 + - 2.8350729382584086 + - 6.4965686725245435 + - 4.379922797542503 + - !!python/tuple + - 1.1614357911421513 + - 7.492860578443031 + - 6.694558970473227 + - 0.6875413024039916 + - 8.838849461018583 + - 3.584333922605853 + - 6.641803672065368 + - 2.6395994373787266 + - 5.840902173706573 + - 3.565576739961202 + - 2.808752659034144 + - 6.48206620158913 + - 4.363090515817188 + - !!python/tuple + - 1.143157428664066 + - 7.482235056573229 + - 6.671800096448578 + - 0.7565573758685882 + - 8.817569625444214 + - 3.554219479828495 + - 6.627879136177561 + - 2.615249660059604 + - 5.825676190349035 + - 3.543301369997851 + - 2.7759810989062044 + - 6.4639439479870076 + - 4.342072317683697 + - !!python/tuple + - 1.1275398611709337 + - 7.45880577934032 + - 6.643361982770715 + - 0.8175143500643366 + - 8.79992400234617 + - 3.514020890911997 + - 6.610480018710026 + - 2.5849969538552617 + - 5.806654253956512 + - 3.5155253333176772 + - 2.735223529186622 + - 6.441300314435135 + - 4.3158346023993515 + - !!python/tuple + - 1.102866112797457 + - 7.4422174045086305 + - 6.607830897428137 + - 0.8721647358974443 + - 8.766684007870415 + - 3.467237319143371 + - 6.5887414289659425 + - 2.5474767577019732 + - 5.782893443353503 + - 3.4809138290141424 + - 2.684611244152048 + - 6.413010252207984 + - 4.283093023776983 + - !!python/tuple + - 1.0845768544348722 + - 7.405629840353455 + - 6.563443275059833 + - 0.9209743546627175 + - 8.739128800458465 + - 3.4048588428814988 + - 6.5615844326311334 + - 2.5010533288963446 + - 5.753218653276029 + - 3.437823080887033 + - 2.621892140317845 + - 6.377670557352198 + - 4.242254521141151 + - !!python/tuple + - 1.0545537118054642 + - 7.379745275174151 + - 6.517553737690694 + - 0.9629595085208533 + - 8.687215507743549 + - 3.332963998744788 + - 6.52662816627133 + - 2.4437989429248734 + - 5.706261736570548 + - 3.3842390719399082 + - 2.544394885057025 + - 6.333532206339908 + - 4.1913479341950195 + - !!python/tuple + - 1.0389047112157703 + - 7.322628708226422 + - 6.4602468513261595 + - 0.9985688107947869 + - 8.644200617507705 + - 3.237265185310978 + - 6.482974686658718 + - 2.3735024275675727 + - 5.647649355045517 + - 3.317712147810652 + - 2.449032652488983 + - 6.278416958368575 + - 4.127942528005256 + - !!python/tuple + - 1.0080133733797543 + - 7.282271253212834 + - 6.388701220614075 + - 1.027238223394984 + - 8.56314673944035 + - 3.126850988263775 + - 6.428474362378573 + - 2.2877426326144263 + - 5.574518255448262 + - 3.2352951941185326 + - 2.332401719221743 + - 6.209615090059278 + - 4.049055315644551 + - !!python/tuple + - 0.984513676644768 + - 7.231878771307184 + - 6.299410653161069 + - 1.0486053248588807 + - 8.46189612033102 + - 2.990631003206126 + - 6.360455163140262 + - 2.1840970073977166 + - 5.48332143537593 + - 3.1335028322804486 + - 2.1910934446587906 + - 6.123760939755669 + - 3.9510515932764263 + - !!python/tuple + - 0.9973649368682209 + - 7.1205715376152385 + - 6.214037151669837 + - 1.0506269600899203 + - 8.378116974312114 + - 2.8162052649696916 + - 6.264485782788287 + - 2.060623131871611 + - 5.351966673051978 + - 3.008329351985441 + - 2.022477894366623 + - 6.016683205539134 + - 3.829550759464352 + - !!python/tuple + - 0.9693003505893917 + - 7.0421880604580585 + - 6.078451568949225 + - 1.0542240110009171 + - 8.220162334382506 + - 2.618281699441398 + - 6.147997249286614 + - 1.916879255648194 + - 5.21867760486349 + - 2.8554062206069273 + - 1.8265274448795372 + - 5.883228269701973 + - 3.6793660589293133 + - !!python/tuple + - 0.9644562992665429 + - 6.944434760322822 + - 5.909567712413819 + - 1.055560412490145 + - 8.023002050992478 + - 2.381006198092196 + - 6.002885666380319 + - 1.7559615820409398 + - 5.052991006583575 + - 2.6704743199826435 + - 1.6098866679126753 + - 5.717058537064356 + - 3.4945434302754146 + - !!python/tuple + - 0.9652609913367336 + - 6.822609012249881 + - 5.699467087072821 + - 1.0557737014381137 + - 7.777022929490484 + - 2.103945643537562 + - 5.822324706642285 + - 1.5882006364044314 + - 4.847449114348203 + - 2.45055758345888 + - 1.3941896377073997 + - 5.510436866936813 + - 3.2686480601332444 + - !!python/tuple + - 0.9648334848829472 + - 6.670924543315526 + - 5.438561325482624 + - 1.05575023953662 + - 7.470347657284344 + - 1.7972324626846634 + - 5.59802183714531 + - 1.4362063134981826 + - 4.593235195600604 + - 2.1966994043011 + - 1.2274672669163909 + - 5.254029735332498 + - 2.99564652196739 + - !!python/tuple + - 1.0465701686494122 + - 6.334592677057931 + - 5.115453636323922 + - 1.055760786651462 + - 7.218627422337363 + - 1.4590140563183724 + - 5.320054554967294 + - 1.3345667963004786 + - 4.280308839887928 + - 1.920088148204568 + - 1.1683115034727978 + - 4.936813621942225 + - 2.67223151700007 + - !!python/tuple + - 0.8455404029696709 + - 6.101882735851534 + - 4.7170763237546405 + - 1.0557515635504071 + - 6.742768403921035 + - 1.284596907979875 + - 4.976872543085507 + - 1.3033380859779011 + - 3.898130592281375 + - 1.654336003080998 + - 1.1805091350097003 + - 4.54629963972529 + - 2.3037197857897738 + - !!python/tuple + - 1.4844280264654914 + - 5.5001018456291 + - 4.229616209547433 + - 1.1308915662428196 + - 6.3558239542398285 + - 1.1740828949133515 + - 4.593326002611415 + - 1.306846206224823 + - 3.4379503621967658 + - 1.6335583266461995 + - 1.0654764106596895 + - 4.06964393330504 + - 1.9793043150592098 + - !!python/tuple + - 1.6025642399638365 + - 5.1121895393119745 + - 3.611462399171844 + - 0.9454902465995874 + - 5.597604738486972 + - 1.3829719659552786 + - 4.056423564691738 + - 1.3051403917232118 + - 2.8735200857696737 + - 1.4330199888920128 + - 1.345991542810788 + - 3.4680847559422787 + - 1.6264952249923523 + - !!python/tuple + - 1.5110576398819957 + - 5.081853689258126 + - 3.5738485269555236 + - 0.9816678887303646 + - 5.54821759934694 + - 1.3674883114349479 + - 4.026215311319261 + - 1.305223666430326 + - 2.841412922792211 + - 1.447552845546383 + - 1.3138844883532164 + - 3.431805752973653 + - 1.624072653061934 + - !!python/tuple + - 1.404826034229355 + - 5.044010748008717 + - 3.5271033784793913 + - 1.0133119905950372 + - 5.4865794244673864 + - 1.3501314178791044 + - 3.9886085687466757 + - 1.3053151922894395 + - 2.801740749789156 + - 1.4640867050083912 + - 1.2783319069001498 + - 3.3867534773754424 + - 1.621233776819655 + - !!python/tuple + - 1.2864525908767432 + - 4.996829378240398 + - 3.4691100440035734 + - 1.0394874396948979 + - 5.4096856395708235 + - 1.3313372598720166 + - 3.941845245875765 + - 1.3054123371320703 + - 2.7528913543549387 + - 1.4825063243336125 + - 1.2407424436246501 + - 3.330915032185229 + - 1.6179638769715818 + - !!python/tuple + - 1.1640551667827965 + - 4.938048162748548 + - 3.3973287850172844 + - 1.0595110781046546 + - 5.313817730920522 + - 1.3119334696526748 + - 3.8837843718235905 + - 1.3055108703193992 + - 2.6930253049649884 + - 1.502510799234131 + - 1.2036228728217275 + - 3.261889651885314 + - 1.6142800387268668 + - !!python/tuple + - 1.054885573688527 + - 4.864885948414253 + - 3.3087649476382257 + - 1.073186451607139 + - 5.194390509253034 + - 1.2931878027000987 + - 3.811843527444367 + - 1.3056050119421485 + - 2.6201365026571746 + - 1.523572767924079 + - 1.1705547814521107 + - 3.1768711009055077 + - 1.6102471924407409 + - !!python/tuple + - 1.0175357287694604 + - 4.713438411173251 + - 3.199985364877769 + - 1.0810407733173648 + - 5.099126864377931 + - 1.260930305506301 + - 3.72295213561578 + - 1.30568803259252 + - 2.5322114948500762 + - 1.5449185213313106 + - 1.1454197763299996 + - 3.0726859493095535 + - 1.605994440545718 + - !!python/tuple + - 0.9622509185639375 + - 4.628406883714549 + - 3.067244492743413 + - 1.0598047567310602 + - 4.914080852171334 + - 1.2709928147568283 + - 3.601234659808315 + - 1.3057536131657803 + - 2.427574375575891 + - 1.5117058668307564 + - 1.1655590258306578 + - 2.945953071123373 + - 1.5818613691914725 + - !!python/tuple + - 1.0199568122579792 + - 4.394603984858301 + - 2.906845122913471 + - 1.0861985446790736 + - 4.768014641116985 + - 1.2340730896773697 + - 3.467644379099345 + - 1.305797880822419 + - 2.305567870420012 + - 1.5494042576923717 + - 1.1302981549835391 + - 2.793494686292051 + - 1.584154379099187 + - !!python/tuple + - 0.92991048685422 + - 4.267156806949713 + - 2.715989168949743 + - 1.0465315761368952 + - 4.483301952015373 + - 1.2719347699157146 + - 3.28627283162008 + - 1.3058214026791648 + - 2.167807348110745 + - 1.4955715076846237 + - 1.1781902031376512 + - 2.6132579803839353 + - 1.5550578143398277 + - !!python/tuple + - 1.0938477782460378 + - 3.963272675924751 + - 2.494636371769242 + - 1.0624177851577532 + - 4.26341377984404 + - 1.2422395856268027 + - 3.0689913694489013 + - 1.3058296768251918 + - 2.020276341216511 + - 1.4588077405724638 + - 1.1757141939911613 + - 2.40624812996784 + - 1.5337384185740608 + - !!python/tuple + - 0.7962988320755642 + - 3.7789913544568123 + - 2.3383232869883868 + - 1.0483988463111682 + - 3.777906599487851 + - 1.295264985202179 + - 2.8143589903396076 + - 1.3058307296788367 + - 1.8761292555044673 + - 1.4413754128767813 + - 1.1764159739901938 + - 2.1803343986224677 + - 1.5215595057207334 + - !!python/tuple + - 1.5378255122560953 + - 3.0645663723748235 + - 1.9628317675354283 + - 1.3965647876713358 + - 2.9778503654538264 + - 1.3451995714137692 + - 2.1461150999429135 + - 1.3021077589286199 + - 1.7048432478081563 + - 1.3322863906109923 + - 1.1227698407499518 + - 1.8708346389053323 + - 1.437029791362801 + - !!python/tuple + - 1.4504553369931001 + - 3.0505258174305303 + - 1.9593177364307799 + - 1.3269804414122 + - 2.948263229860905 + - 1.338088579949143 + - 2.132629329926888 + - 1.2975910559107167 + - 1.6927549774164194 + - 1.342962099374042 + - 1.1347489229391379 + - 1.8577253935345228 + - 1.4393978195538837 + - !!python/tuple + - 1.3636898405367794 + - 3.0083575895723755 + - 1.9550815388594187 + - 1.2492579583592287 + - 2.9335113431760695 + - 1.3237265512764516 + - 2.1162342591687993 + - 1.2926352499671707 + - 1.6855966344508881 + - 1.3449483810333924 + - 1.1525002220995708 + - 1.84201773538238 + - 1.438449243827469 + - !!python/tuple + - 1.2683212787510705 + - 2.9562835133406766 + - 1.9500232828380446 + - 1.1673850648610082 + - 2.915314748793606 + - 1.3083294060741923 + - 2.0964576495794267 + - 1.287397365392363 + - 1.6772716536771737 + - 1.3470880334890476 + - 1.169710921471163 + - 1.823423950682968 + - 1.4373970664723261 + - !!python/tuple + - 1.171106545948299 + - 2.892220343108944 + - 1.9440567203652546 + - 1.0894310418011477 + - 2.8929504687114145 + - 1.2926249413214956 + - 2.0633405828565894 + - 1.2850530780864318 + - 1.660545639177294 + - 1.3493025958094658 + - 1.168278158061964 + - 1.8266090854615502 + - 1.4381818021879405 + - !!python/tuple + - 1.0848105036489626 + - 2.813820757416478 + - 1.9371282801729168 + - 1.027630087695882 + - 2.865593528000433 + - 1.2776741522142736 + - 2.0362390430950135 + - 1.2791899085702934 + - 1.6510438443432227 + - 1.351478542010131 + - 1.1885513808469066 + - 1.7991925075307607 + - 1.4365966792975597 + - !!python/tuple + - 1.0263457316827804 + - 2.718587917519815 + - 1.9292443795595515 + - 0.9931367010219525 + - 2.832336272987538 + - 1.2647562854200933 + - 1.9900872658450675 + - 1.2787084404782918 + - 1.6295719851309973 + - 1.3534746049374093 + - 1.1768970331144804 + - 1.8075099308482179 + - 1.4380437934330814 + - !!python/tuple + - 0.9626078406607613 + - 2.6797865200836544 + - 1.8840640973678198 + - 0.9874111078624773 + - 2.7255554358938348 + - 1.2728734514006799 + - 1.9607082720458806 + - 1.272631627570672 + - 1.6596354319690139 + - 1.35514348319022 + - 1.2030996715382987 + - 1.7679316257203397 + - 1.4356145535896634 + - !!python/tuple + - 1.0181021476478147 + - 2.5392734049645163 + - 1.881488043763394 + - 0.9838913806792587 + - 2.6818056049531425 + - 1.255652118904024 + - 1.900717409845293 + - 1.2759208544881395 + - 1.6236611200687259 + - 1.3563696143377542 + - 1.1739991829473087 + - 1.7879812385701732 + - 1.438300111090274 + - !!python/tuple + - 0.9308601310952971 + - 2.4944735953391146 + - 1.878885536923834 + - 0.9853728672877867 + - 2.5264698412946807 + - 1.2785723472066175 + - 1.8680816893455505 + - 1.2685660404949275 + - 1.613794669139897 + - 1.357115029571435 + - 1.2177956788256894 + - 1.731518301244714 + - 1.4343665550112283 + - !!python/tuple + - 1.092439103061424 + - 2.2963801745274206 + - 1.876415507117545 + - 0.9841208363086658 + - 2.480161734447783 + - 1.2461742218893654 + - 1.8007809781337136 + - 1.2776694254504406 + - 1.57850342331288 + - 1.357449851017416 + - 1.1557523193272334 + - 1.7764438205712159 + - 1.4394074281599294 + - !!python/tuple + - 1.0376884242841506 + - 2.086758258073977 + - 1.7698433687180162 + - 0.9793715507074311 + - 2.2596136356387286 + - 1.298346364458073 + - 1.740916703645288 + - 1.249533725215876 + - 1.6128972133512718 + - 1.3181489314484471 + - 1.2461647679799603 + - 1.7153701408580992 + - 1.3917101009535129 + - !!python/tuple + - 0.9782439276766622 + - 2.094358605706232 + - 1.7835692087432775 + - 0.9611172861572342 + - 2.288872016025522 + - 1.2932768460090902 + - 1.7310644061624183 + - 1.2237823864700144 + - 1.5812228848709515 + - 1.2916009334456862 + - 1.2059146008940032 + - 1.7325252303638323 + - 1.3802526335573138 + - !!python/tuple + - 0.9782439276766622 + - 2.094358605706232 + - 1.7835692087432775 + - 0.9611172861572342 + - 2.288872016025522 + - 1.2932768460090902 + - 1.7310644061624183 + - 1.2237823864700144 + - 1.5812228848709515 + - 1.2916009334456862 + - 1.2059146008940032 + - 1.7325252303638323 + - 1.3802526335573138 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.865272902852201 + - 9.75856166306823 + - 9.537554120461389 + - 9.509852247147915 + - 9.927748749583111 + - 9.377986223200356 + - 9.283125166337292 + - 9.676339573387779 + - 9.524893588469748 + - 9.754594778018959 + - 9.436084802433044 + - 9.491603019289945 + - 9.326532239213632 + - !!python/tuple + - 7.450268742877655 + - 9.457389922994864 + - 8.960738329260757 + - 8.898489288282896 + - 9.8376172913095 + - 8.602182168327824 + - 8.389036753430615 + - 9.272614241340445 + - 8.932288687241643 + - 9.448475109809845 + - 8.73272948766395 + - 8.857481725978234 + - 8.486567963527863 + - !!python/tuple + - 5.689782507705786 + - 9.081986899282558 + - 8.242001176459766 + - 8.136741167559958 + - 9.72524479171323 + - 7.6357762094475845 + - 7.275497016697382 + - 8.76944236506058 + - 8.193893609159494 + - 9.066906809129792 + - 7.856475956033907 + - 8.06740232339711 + - 7.4403443966948615 + - !!python/tuple + - 3.514318143754888 + - 8.614575666769426 + - 7.3530543020214125 + - 7.1893905646657625 + - 9.442105960293638 + - 6.599432598541084 + - 5.8927177668043385 + - 8.14315905858689 + - 7.27551052935766 + - 8.591826586534863 + - 6.767190603822362 + - 7.084917986327758 + - 6.140727676277418 + - !!python/tuple + - 0.9172520558631105 + - 8.033610749758942 + - 6.251085848018413 + - 6.0155608424019 + - 9.089753734203926 + - 5.318186737648533 + - 4.188429656717715 + - 7.365375900966183 + - 6.137291232512796 + - 8.001351335228206 + - 5.419342239766778 + - 5.867937762853088 + - 4.536849339908517 + - !!python/tuple + - 1.3166210651719423 + - 7.149977897308677 + - 4.895279565677601 + - 4.6800415123807575 + - 8.6520186810885 + - 3.680494321675697 + - 2.72351670544465 + - 6.008650871024612 + - 4.888676811795257 + - 7.302861134557228 + - 3.8492857429125786 + - 4.253124207079363 + - 2.5549163454914696 + - !!python/tuple + - 0.8369318544183137 + - 6.447084159347498 + - 3.8453570288495387 + - 3.6510800930598313 + - 8.302446275007254 + - 2.4595913508410203 + - 1.7133867879579054 + - 5.030301464388178 + - 3.885520833446964 + - 6.676880795015501 + - 2.5130632148793595 + - 3.150642683610441 + - 1.3134929358531366 + - !!python/tuple + - 0.8444458309756109 + - 6.441131917816403 + - 3.839512098421957 + - 3.6450247985255695 + - 8.299384029720702 + - 2.454023599843502 + - 1.7124812448074307 + - 5.021054365957853 + - 3.881410968162634 + - 6.670944170839955 + - 2.5054060836098406 + - 3.14313338162089 + - 1.311034445343896 + - !!python/tuple + - 0.85326873954097 + - 6.433692617635732 + - 3.832210575411004 + - 3.6374612974612317 + - 8.295556464226195 + - 2.4470808204624137 + - 1.7113574300950338 + - 5.00949877373715 + - 3.876276796863077 + - 6.663524290031079 + - 2.495856497026177 + - 3.133757606306953 + - 1.3080103287838087 + - !!python/tuple + - 0.8634852911907208 + - 6.424395062296161 + - 3.82309095439618 + - 3.628015740643539 + - 8.290772384543876 + - 2.4384289053153836 + - 1.7099652716933573 + - 4.9950594402398725 + - 3.8698640353428337 + - 6.654250848405639 + - 2.4839538940078962 + - 3.122054961159335 + - 1.3043059938156794 + - !!python/tuple + - 0.8751191896727587 + - 6.412775580245377 + - 3.811702871681202 + - 3.6162226591918025 + - 8.284792875165772 + - 2.427655780481492 + - 1.7082446430442364 + - 4.977018390918739 + - 3.86185585054986 + - 6.642661256495178 + - 2.4691299000461515 + - 3.107453564227948 + - 1.2997925531867003 + - !!python/tuple + - 0.8860293276197028 + - 6.400429099954252 + - 3.7974857752476945 + - 3.600118838177225 + - 8.27731941237602 + - 2.414799808145322 + - 1.705879511775192 + - 4.954479881551373 + - 3.851857811882331 + - 6.626837605973984 + - 2.4512891819418368 + - 3.089244320872002 + - 1.2938515034713411 + - !!python/tuple + - 0.8979100256065916 + - 6.385001162095478 + - 3.779742789692911 + - 3.5800267558757337 + - 8.267979030876042 + - 2.398829430017692 + - 1.7029753743148541 + - 4.9263269831949685 + - 3.8393794244320283 + - 6.607063999912562 + - 2.4291200211635697 + - 3.0665500811182698 + - 1.2867247117454679 + - !!python/tuple + - 0.9104597739419371 + - 6.3657243561624215 + - 3.757608901313775 + - 3.5549713334125 + - 8.256305821467688 + - 2.3790238943116364 + - 1.699425813076543 + - 4.891167948996456 + - 3.8238115959957146 + - 6.58235637279154 + - 2.401618270122973 + - 3.0382892546172484 + - 1.278272206974341 + - !!python/tuple + - 0.9232300364417324 + - 6.341641129080263 + - 3.730012583416712 + - 3.5237468623973585 + - 8.241717865467988 + - 2.3545165564829116 + - 1.695112720906529 + - 4.847270225072546 + - 3.8043993562884064 + - 6.551486639063376 + - 2.367576400049058 + - 3.0031339439257256 + - 1.2683949812277986 + - !!python/tuple + - 0.9356342234663467 + - 6.311557258967605 + - 3.6956301269196046 + - 3.4887206248653677 + - 8.214228580267877 + - 2.324279375502001 + - 1.6899107939839808 + - 4.799308536970555 + - 3.780209190053721 + - 6.512922880860597 + - 2.323393458030789 + - 2.966490910439122 + - 1.2678109745529367 + - !!python/tuple + - 0.9469918863614195 + - 6.273984312282058 + - 3.6528323926346267 + - 3.4451559665105957 + - 8.17988022106069 + - 2.2871169224492975 + - 1.683696397669564 + - 4.739471169751488 + - 3.750090545594686 + - 6.464755323579976 + - 2.269084115154188 + - 2.9210570429082456 + - 1.2671578428094736 + - !!python/tuple + - 0.9566194696934612 + - 6.227068723872764 + - 3.59962475951083 + - 3.391050960183412 + - 8.13696569805303 + - 2.241681283287979 + - 1.6763628707127551 + - 4.6648595443876 + - 3.712631584395156 + - 6.40460503524893 + - 2.202702985135389 + - 2.8648623874176473 + - 1.2664490555338028 + - !!python/tuple + - 0.9639706212913957 + - 6.168504820631613 + - 3.53358329270012 + - 3.323988026479246 + - 8.083355691852447 + - 2.1865284012845394 + - 1.6678446354444851 + - 4.571896054888536 + - 3.6661103204322747 + - 6.3295118717203565 + - 2.1222185413927006 + - 2.795592733362797 + - 1.2657093053765385 + - !!python/tuple + - 0.9688072093393676 + - 6.09542891773595 + - 3.4787209855032297 + - 3.2389084381300064 + - 8.01639587515561 + - 2.1511189346161412 + - 1.6552902307412525 + - 4.456186575349856 + - 3.608444475009259 + - 6.21142006852489 + - 2.03093947431697 + - 2.7106080953806106 + - 1.2591688000455563 + - !!python/tuple + - 0.9713408300414802 + - 6.004291762582755 + - 3.4109773873911067 + - 3.1341374891792313 + - 7.932780232499667 + - 2.1091321173485356 + - 1.6413908617946116 + - 4.312374423986256 + - 3.537147627925935 + - 6.06411927665613 + - 1.9235275494551427 + - 2.607047604589227 + - 1.2531235911805636 + - !!python/tuple + - 0.9722342331848468 + - 5.890707527242451 + - 3.285583450922544 + - 3.0092342390427937 + - 7.828395754677279 + - 2.011978654314634 + - 1.5865128516901355 + - 4.174234425920167 + - 3.4135523855826975 + - 5.918605759635123 + - 1.791838923027183 + - 2.483045467811421 + - 1.2759081459571613 + - !!python/tuple + - 0.9723541283106965 + - 5.749280193356676 + - 3.184854381036252 + - 2.8588002078737818 + - 7.6650337185262325 + - 1.962207275332274 + - 1.6024244177128955 + - 3.953128722413456 + - 3.3677538116470687 + - 5.689793833230045 + - 1.6593454487607633 + - 2.3345901896429844 + - 1.2580448183780908 + - !!python/tuple + - 0.9723370349092955 + - 5.573414578491895 + - 3.06275251143059 + - 2.6714711556722213 + - 7.502655889115415 + - 1.9081152076318828 + - 1.521384049868341 + - 3.743824196425268 + - 3.179911555237653 + - 5.405277916465703 + - 1.5256195910620087 + - 2.1640979526402395 + - 1.2762862684242573 + - !!python/tuple + - 1.010077224143521 + - 5.315589097065688 + - 2.9165390868593684 + - 2.4853497403379876 + - 7.248560837451907 + - 1.8425405409090756 + - 1.4915418726294172 + - 3.4880775655852783 + - 3.048976553576987 + - 5.0766797510725095 + - 1.4006532075274103 + - 1.9750210445339866 + - 1.2934571122796126 + - !!python/tuple + - 0.979689268621645 + - 4.996505908228369 + - 2.642013556362844 + - 2.2827864675248986 + - 6.932209354924974 + - 1.6627224626408095 + - 1.48261748738457 + - 3.1792400192478762 + - 2.893983971173781 + - 4.763500476610074 + - 1.3048824201600993 + - 1.7815148757207486 + - 1.3208810414650045 + - !!python/tuple + - 0.959932460451335 + - 4.665271683517798 + - 2.4593763043113106 + - 2.017350017921345 + - 6.538990921123582 + - 1.6845577276029857 + - 1.2672706131619675 + - 2.9068319168891663 + - 2.7047341231391573 + - 4.210651587737101 + - 1.3042591502641154 + - 1.6660578388351 + - 1.2887027369045796 + - !!python/tuple + - 1.0786069940670475 + - 4.096201938474091 + - 1.9835445357666996 + - 1.9299652777607652 + - 6.051495933752383 + - 1.2215883939786372 + - 1.544777749327452 + - 2.5799685991505927 + - 2.508064889286931 + - 3.8715146203896103 + - 1.2153099091132529 + - 1.5709896429724155 + - 1.4216461827920077 + - !!python/tuple + - 0.6187778981020065 + - 3.8479469619236086 + - 1.9677273492198013 + - 1.6529912567973823 + - 5.288529218961992 + - 2.149161050451104 + - 1.1244611769211277 + - 2.254524760905335 + - 2.289650526921304 + - 2.951785187412522 + - 1.4205174963026572 + - 1.5665739810448804 + - 1.2147620864653124 + - !!python/tuple + - 1.0957657741868674 + - 3.253498222006991 + - 1.5076816550055923 + - 1.5994321980853292 + - 4.426671404486143 + - 1.412143118610462 + - 1.0675598216962214 + - 2.1095350470825864 + - 1.7575155405766434 + - 2.5593623411997815 + - 1.2694763973062275 + - 1.5789321343506992 + - 1.339082110357401 + - !!python/tuple + - 0.6038852490007804 + - 2.531673613516846 + - 1.4588233620554727 + - 1.3923993149655862 + - 3.38912320624845 + - 1.5124730603756362 + - 1.2252857383255629 + - 1.6391531644269297 + - 1.6473436292043 + - 2.024211371978863 + - 1.547549823612546 + - 1.3358097105396125 + - 0.9215915571047766 + - !!python/tuple + - 1.0767236550934598 + - 2.369515533841233 + - 1.458864607181875 + - 1.4209945576141807 + - 3.041659176653407 + - 1.4458929976214903 + - 1.323387803297719 + - 1.6354562997833213 + - 1.622838456937487 + - 1.9271365261573 + - 1.403725273996196 + - 1.3709456029665432 + - 1.0603918995148778 + - !!python/tuple + - 0.8636878209372836 + - 2.188838311812923 + - 1.4588645551233095 + - 1.411548870259686 + - 2.5684303971919467 + - 1.4201037542696366 + - 1.0700248179937895 + - 1.7513891548867546 + - 1.4121771858171972 + - 1.9157479542269102 + - 1.2108998334436505 + - 1.4747402401301275 + - 1.277452244083827 + - !!python/tuple + - 1.039499011160911 + - 2.0795937932680335 + - 1.4588645551227395 + - 1.4183563124735779 + - 2.503906905890845 + - 1.3589680586103046 + - 1.1770516502648976 + - 1.6776982544057017 + - 1.4477082497321867 + - 1.9436076052670088 + - 1.3191154089439296 + - 1.3998829234925043 + - 1.21136872514417 + - !!python/tuple + - 0.8512054364737491 + - 2.0317718329653505 + - 1.4588645551227395 + - 1.4162192585118862 + - 2.468339200292501 + - 1.3535490479427241 + - 1.1731222663924261 + - 1.7000107085079552 + - 1.4422637178610946 + - 1.9474410914598834 + - 1.3200396824091138 + - 1.3918410229876006 + - 1.2096067603505265 + - !!python/tuple + - 0.9714324659950561 + - 1.9960938519841103 + - 1.4588645551227395 + - 1.4151592082988529 + - 2.5093664130895585 + - 1.3504437433924636 + - 1.264026658571731 + - 1.6544851553160755 + - 1.4620439243901975 + - 1.9324939636323697 + - 1.329748652216078 + - 1.3961135315667326 + - 1.2030168699209087 + - !!python/tuple + - 0.9435642609051678 + - 1.9959434692820068 + - 1.4588645551227395 + - 1.4148919015655848 + - 2.5104371746357135 + - 1.3506328859572163 + - 1.2309309994517592 + - 1.6648595851969061 + - 1.456379645291735 + - 1.9365460156090908 + - 1.327003224133293 + - 1.3943609820292513 + - 1.2054738341394544 + - !!python/tuple + - 0.9347466977628996 + - 1.9957709824245697 + - 1.4588645551227395 + - 1.4146350552469629 + - 2.5117201496202086 + - 1.350806413026592 + - 1.2035320004360026 + - 1.6759685532615098 + - 1.4507927195531902 + - 1.9411525732966555 + - 1.3245309234826692 + - 1.3926988820063013 + - 1.2073925293046486 + - !!python/tuple + - 0.9346254638946168 + - 1.995577589939184 + - 1.4588645551227395 + - 1.4144068772592944 + - 2.5132408952636944 + - 1.3509512158409143 + - 1.1848438084897406 + - 1.6874140832356799 + - 1.4456718086625002 + - 1.946263559930954 + - 1.3225269740643462 + - 1.3912501959642722 + - 1.208671984367577 + - !!python/tuple + - 0.9346639578784888 + - 1.9953669937764251 + - 1.4588645551227395 + - 1.4142248490377622 + - 2.51501909511801 + - 1.3510570332164886 + - 1.1755315017317676 + - 1.698640524957139 + - 1.4414286392779083 + - 1.9517614052319805 + - 1.3211283983682418 + - 1.390126866754013 + - 1.209342337541977 + - !!python/tuple + - 0.934636640307892 + - 1.9951461551612306 + - 1.4588645551227395 + - 1.4141002621308287 + - 2.5170628101286074 + - 1.3511206444385238 + - 1.1729554872138452 + - 1.708972059921783 + - 1.438381599455649 + - 1.9574455643427988 + - 1.3203490848041257 + - 1.38939095307094 + - 1.2095733511127953 + - !!python/tuple + - 0.9316692535861208 + - 2.000035971701227 + - 1.4588646622439734 + - 1.4142429406086556 + - 2.5352137697940456 + - 1.351066359265967 + - 1.1729402183683926 + - 1.7065458236882654 + - 1.4391187705101363 + - 1.9614487533000802 + - 1.3204550444388123 + - 1.389779016742761 + - 1.2095812771128283 + - !!python/tuple + - 0.9316692535861208 + - 2.000035971701227 + - 1.4588646622439734 + - 1.4142429406086556 + - 2.5352137697940456 + - 1.351066359265967 + - 1.1729402183683926 + - 1.7065458236882654 + - 1.4391187705101363 + - 1.9614487533000802 + - 1.3204550444388123 + - 1.389779016742761 + - 1.2095812771128283 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.024547193263471 + - 9.92675543402661 + - 9.719487575329946 + - 8.999825883567205 + - 10.01 + - 9.743417454271526 + - 8.968769429170042 + - 9.73102793480955 + - 9.580925625536025 + - 9.808951707284145 + - 9.44584685520109 + - 9.482400099913226 + - 9.307752845870212 + - !!python/tuple + - 7.808079445714587 + - 9.835384869590696 + - 9.369578976943517 + - 7.75254093391608 + - 10.022475037450063 + - 9.423356289000292 + - 7.841778226899045 + - 9.182725017899898 + - 9.112477166969487 + - 9.57063300659435 + - 8.806429618636132 + - 8.822063697456203 + - 8.419196607935115 + - !!python/tuple + - 6.293938430340534 + - 9.721467644443557 + - 8.933451668752749 + - 6.200141395133929 + - 10.038030039028898 + - 9.024416852611608 + - 6.439023720097981 + - 8.499375725227022 + - 8.505234278234951 + - 9.283756760049629 + - 7.934255109921402 + - 7.999341961107919 + - 7.402796975644103 + - !!python/tuple + - 4.539290016664225 + - 9.442048680491979 + - 8.259399387253179 + - 4.4905625895146555 + - 9.938526575235375 + - 8.410080630816475 + - 4.877508425275157 + - 7.649063375373608 + - 7.878928014568545 + - 8.96168533813531 + - 6.780857506725383 + - 6.97636724766894 + - 6.206498244594673 + - !!python/tuple + - 2.4028343104943204 + - 9.094326558473679 + - 7.422030955209246 + - 2.6393833826445947 + - 9.398841666524811 + - 7.6466999473679405 + - 2.9693527729598443 + - 6.660848718021459 + - 6.986451745718618 + - 8.565080504714658 + - 5.086820365854995 + - 6.082607116975339 + - 5.124639936739959 + - !!python/tuple + - 1.1347958290218534 + - 7.983738381288788 + - 6.278453109294366 + - 1.2294932394219171 + - 8.418066461261061 + - 6.268432071199388 + - 1.683970829682992 + - 5.477210293176995 + - 6.184419595254907 + - 8.109653940817038 + - 3.049628805089159 + - 5.333558977224979 + - 3.8569285423935202 + - !!python/tuple + - 1.851305207351981 + - 6.609227709397209 + - 4.876504760155164 + - 1.4430670730104906 + - 7.202745956985472 + - 4.577440308131338 + - 1.6963766155225193 + - 3.8924329127743693 + - 5.203464560634046 + - 7.571667050636661 + - 0.765887764511652 + - 4.283366140318371 + - 2.383468298162983 + - !!python/tuple + - 3.0203736584977996 + - 5.479016348704624 + - 3.5749644195967947 + - 1.3169736595852177 + - 5.873757185922936 + - 3.2265511202208272 + - 1.321006230354065 + - 2.963831846317723 + - 4.217699803423219 + - 6.9631543781023675 + - 3.3817678796657025 + - 3.4489205980363917 + - 1.6435181175177425 + - !!python/tuple + - 2.3691683642129324 + - 5.3827505915858005 + - 3.3232557396757105 + - 1.2689527375629193 + - 5.568321504626051 + - 3.0148715246773 + - 1.1349254918545841 + - 2.8926392807472507 + - 4.024013183332859 + - 6.776178396417898 + - 2.8760142142542535 + - 3.2599939543743246 + - 1.5799797631449217 + - !!python/tuple + - 1.6973429064196983 + - 5.1648659349971435 + - 3.0561573409855294 + - 1.1189719347712883 + - 5.189793865257475 + - 2.760168447677788 + - 1.2197416733749222 + - 2.8093210798785155 + - 3.782700662057652 + - 6.598565387146022 + - 2.2358677391096284 + - 3.0338620604565816 + - 1.5510720856319997 + - !!python/tuple + - 1.2935352109655245 + - 4.722678233483627 + - 2.7429325843655246 + - 1.1738464411988745 + - 4.764235361021523 + - 2.4287713337924606 + - 1.3508258581647135 + - 2.714165877017184 + - 3.491223325557179 + - 6.400068523924617 + - 1.5286548156985695 + - 2.76938429014226 + - 1.5539856787873447 + - !!python/tuple + - 1.0651835986205322 + - 4.3357297577161615 + - 2.4506076996173776 + - 1.083125648773301 + - 4.243113817928776 + - 2.184172597565845 + - 1.1176962332124947 + - 2.609346935677434 + - 3.1693488287102105 + - 6.019259619815259 + - 1.1428565110021696 + - 2.4727591540647946 + - 1.4152340373261196 + - !!python/tuple + - 1.3338653780109913 + - 3.868372198362185 + - 2.281946872360944 + - 1.1702378411884826 + - 3.6141460734878623 + - 2.0176347347040715 + - 1.4024020113680904 + - 2.167569977847483 + - 2.801206234756144 + - 5.621617113477831 + - 1.3891752144250895 + - 2.143710462153021 + - 1.3420437001680767 + - !!python/tuple + - 1.0957001713880838 + - 3.4887037101987057 + - 2.112402022891478 + - 1.0114072138403785 + - 2.9425015409613473 + - 1.9074284150811318 + - 2.029762301625226 + - 2.2777941437995963 + - 2.384838245977992 + - 4.7646196509679 + - 1.1294238385966198 + - 2.028444550424027 + - 1.3129270023829278 + - !!python/tuple + - 1.0843852991996512 + - 3.4586385788136127 + - 2.1048610830311927 + - 1.0470015434549287 + - 2.9121759053356464 + - 1.906305865578998 + - 1.8160896159313835 + - 2.2751489705325447 + - 2.3430545275664714 + - 4.691667772170356 + - 1.1686587180212857 + - 2.0082098847714196 + - 1.3131238236267084 + - !!python/tuple + - 1.0759673274487513 + - 3.4215272677748554 + - 2.095962024064408 + - 1.0700845063120565 + - 2.8750611691194847 + - 1.9050087808558198 + - 1.5688152421725248 + - 2.2719894465295467 + - 2.292898083333566 + - 4.600930296076265 + - 1.2007433822496603 + - 1.9845295107047898 + - 1.3133128688605746 + - !!python/tuple + - 1.070916617804155 + - 3.375884946978816 + - 2.0856249285794006 + - 1.082991936132388 + - 2.8299227618164866 + - 1.9035409658101825 + - 1.3019567766230464 + - 2.2682602771073164 + - 2.2335023566428833 + - 4.4882496553543145 + - 1.225035989156727 + - 1.9573673375573835 + - 1.3134807929214245 + - !!python/tuple + - 1.0687846281843527 + - 3.3200226463247513 + - 2.0738617240823336 + - 1.0953640437949919 + - 2.7235124505214547 + - 1.9019238589501903 + - 1.125930579346286 + - 2.2639252253044844 + - 2.188659583952704 + - 4.348628552972802 + - 1.241457429625635 + - 1.9270477427152009 + - 1.3136148009299595 + - !!python/tuple + - 1.068348212217613 + - 3.2521004544606007 + - 2.060831556161654 + - 1.0474870231085023 + - 2.664925815122348 + - 1.9002029554627062 + - 1.1145922671572965 + - 2.1455588294589774 + - 2.137917136509777 + - 4.211345001908913 + - 1.2939570870173247 + - 1.821521694176463 + - 1.2748593814931628 + - !!python/tuple + - 1.0683749821616673 + - 3.1702610699405693 + - 1.9630825784858956 + - 1.143872237556656 + - 2.511412405717304 + - 1.847579947877168 + - 1.183271256731174 + - 2.0208938449272815 + - 2.0825107996941132 + - 4.076862711563065 + - 1.2351087279249664 + - 1.7970209922034661 + - 1.3399905789537012 + - !!python/tuple + - 0.9758672476200807 + - 2.6799067483010934 + - 1.797461798096329 + - 1.020278224857214 + - 2.3987087915931946 + - 1.7791191033672487 + - 1.5519431776912143 + - 1.9233804974582145 + - 1.767634660746536 + - 3.022740037925319 + - 1.321962786944321 + - 1.5623435046168197 + - 1.2839274418594626 + - !!python/tuple + - 0.9023701305016927 + - 2.5319990642337467 + - 1.731158552871189 + - 1.0686327601276369 + - 2.2000447513445334 + - 1.7730282821587249 + - 1.3592273089268982 + - 1.656421902527378 + - 1.7148504845065637 + - 2.175793773199644 + - 1.1344282323280748 + - 1.6319391605383933 + - 1.5529138857214186 + - !!python/tuple + - 0.9718896749844468 + - 2.5999318679647834 + - 1.783402714370235 + - 1.1427414086515806 + - 2.489010672918657 + - 1.797535911126599 + - 0.999865227747675 + - 1.7200665457445232 + - 1.704872174343984 + - 2.1170467489516684 + - 1.3629469538047028 + - 1.487505955712142 + - 1.2063812653399824 + - !!python/tuple + - 1.185647004854868 + - 2.4093648041045395 + - 1.8147264043424567 + - 1.2491601277312994 + - 2.280878790632385 + - 1.7735956287548635 + - 0.9614951846841634 + - 1.683794590088326 + - 1.6860286221115481 + - 2.132916185416992 + - 1.1762004161664272 + - 1.6524545162409678 + - 1.431868060404659 + - !!python/tuple + - 1.038001636081086 + - 2.4528378761632332 + - 1.7937917535738064 + - 1.2873892538832181 + - 2.5168148793591163 + - 1.7735766805130218 + - 1.14125586601858 + - 1.7546157696407194 + - 1.6688756896546426 + - 2.109564054581269 + - 1.4470929138890165 + - 1.5109899896506667 + - 1.329348575144734 + - !!python/tuple + - 1.0796107015132477 + - 2.4283262326664246 + - 1.7563013555478353 + - 1.140878539169718 + - 2.3410505312667995 + - 1.7537199426802905 + - 1.2178886594882472 + - 1.6788697919470763 + - 1.688519680932661 + - 2.164260522356824 + - 1.249606995267411 + - 1.5913941501456146 + - 1.4352762839637012 + - !!python/tuple + - 1.0597374762566283 + - 2.4016674615269653 + - 1.798535309730622 + - 1.1203629311839478 + - 2.271379125273402 + - 1.7846633827971432 + - 1.1230771941362114 + - 1.723604766492 + - 1.6896803648565435 + - 2.117776208432115 + - 1.2141430507676696 + - 1.578340944134946 + - 1.3897292169378728 + - !!python/tuple + - 1.067648815267295 + - 2.4133180028508194 + - 1.7462573097751635 + - 1.1427897574624168 + - 2.324532730887274 + - 1.7555158031205809 + - 1.1911072349333276 + - 1.6954032046810534 + - 1.72626686967174 + - 2.15414061441541 + - 1.229482880437646 + - 1.603357242203731 + - 1.3632991293284913 + - !!python/tuple + - 1.066489141167348 + - 2.442786610078205 + - 1.7449118968489967 + - 1.1306543345250557 + - 2.3047512429558688 + - 1.7451750702864863 + - 1.194139082344089 + - 1.6531358721837122 + - 1.7362368666239252 + - 2.129419722810277 + - 1.2313261981301102 + - 1.6183594274621727 + - 1.3637218098483115 + - !!python/tuple + - 1.066489141167348 + - 2.442786610078205 + - 1.7449118968489967 + - 1.1306543345250557 + - 2.3047512429558688 + - 1.7451750702864863 + - 1.194139082344089 + - 1.6531358721837122 + - 1.7362368666239252 + - 2.129419722810277 + - 1.2313261981301102 + - 1.6183594274621727 + - 1.3637218098483115 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 600.0 + - 630.0 + - 660.0 + - 690.0 + - 720.0 + - 750.0 + - 780.0 + - 810.0 + - 840.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 1080.0 + - 1290.0 + - 1320.0 + - 1350.0 + - 1620.0 + - 1650.0 + - 1680.0 + - 1710.0 + - 2250.0 + - 2280.0 + - 2310.0 + - 3030.0 + - 3090.0 + - 3120.0 + - 3180.0 + - 7200.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.74084515855239 + - 60.31006214288031 + - 54.842235422618984 + - 48.38880862382245 + - 43.54703583960199 + - 41.72510201749178 + - 41.18740714114977 + - 40.55128887328107 + - 39.79998330449128 + - 38.92875008117543 + - 37.88512536549786 + - 36.62202386436893 + - 35.098419691271346 + - 33.26951087379192 + - 31.229473184981646 + - 29.12231720612101 + - 27.012572150485333 + - 24.985323264731793 + - 24.29985042974036 + - 22.82577878158198 + - 22.162034902159043 + - 21.353543086346757 + - 20.41137590869529 + - 20.115978001774145 + - 19.81719095474247 + - 19.677863717765412 + - 19.12679809698523 + - 19.143631249724784 + - 19.108546889971468 + - 19.029264821403352 + - 19.012731944903393 + - 19.021444766332905 + - 19.018504894337067 + - 18.993976333798006 + - 18.993976333798006 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 240.0 + - 570.0 + - 600.0 + - 630.0 + - 660.0 + - 690.0 + - 720.0 + - 750.0 + - 780.0 + - 810.0 + - 840.0 + - 1020.0 + - 1230.0 + - 1260.0 + - 1770.0 + - 1800.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.01122844942047 + - 59.06068874145281 + - 53.07828834598835 + - 45.89041600921971 + - 37.64781930419735 + - 32.66084337007667 + - 31.748217617263343 + - 30.75081935425617 + - 29.601141448255493 + - 28.31853036558889 + - 26.993063483302834 + - 25.69290564642531 + - 24.3153772161887 + - 22.957849608659835 + - 21.574025179986833 + - 20.484349701056527 + - 19.194721244014413 + - 18.7968171825425 + - 18.354904366821923 + - 18.327525691919774 + - 18.205306008479386 + - 18.205306008479386 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 240.0 + - 690.0 + - 720.0 + - 750.0 + - 780.0 + - 810.0 + - 840.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1050.0 + - 1560.0 + - 1590.0 + - 1620.0 + - 1650.0 + - 1680.0 + - 1710.0 + - 1740.0 + - 1770.0 + - 1800.0 + - 1830.0 + - 1860.0 + - 1890.0 + - 1920.0 + - 1950.0 + - 2340.0 + - 2370.0 + - 3030.0 + - 3060.0 + - 3090.0 + - 3120.0 + - 3150.0 + - 3180.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 63.21794251481438 + - 58.34750776924343 + - 52.55561084647111 + - 45.535878290120124 + - 37.73518679852211 + - 34.498322149897426 + - 32.64120505302095 + - 32.287593319545685 + - 31.86790817193657 + - 31.3829995854087 + - 30.852640154152922 + - 30.249379875097883 + - 29.50709956787778 + - 28.629912077353527 + - 27.571106836575485 + - 26.423806747343818 + - 25.060010159239155 + - 23.809549808726523 + - 22.503409501843684 + - 21.241597943967214 + - 21.108514349009983 + - 20.96402905367242 + - 20.815800303837634 + - 20.686093558376385 + - 20.55454056771805 + - 20.438013658317416 + - 20.27727995281651 + - 20.110718890843255 + - 19.86437555086897 + - 19.60682019452547 + - 19.379961752897295 + - 19.05446639086883 + - 18.85539248970252 + - 18.47638201304288 + - 18.495449635866137 + - 18.462069078997295 + - 18.46919592016258 + - 18.4732338095521 + - 18.473147376731834 + - 18.47396377420419 + - 18.473766135287125 + - 18.473766135287125 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 240.0 + - 690.0 + - 720.0 + - 750.0 + - 780.0 + - 810.0 + - 840.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1320.0 + - 1350.0 + - 1380.0 + - 1410.0 + - 1440.0 + - 1470.0 + - 1830.0 + - 2400.0 + - 2430.0 + - 4380.0 + - 4410.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 62.904054871805144 + - 56.95570555379081 + - 49.74518899175331 + - 41.85294562601758 + - 33.352665136647 + - 30.53838691443924 + - 28.66000861995869 + - 28.274732908648808 + - 27.89673202585063 + - 27.468340276389682 + - 27.02529507443085 + - 26.526748255024085 + - 25.97654712611859 + - 25.31710227404332 + - 24.631987167087196 + - 23.83071303659931 + - 23.26978593634551 + - 22.86651095089728 + - 21.844851581379526 + - 21.276131046199747 + - 20.99553719208331 + - 20.651829950399236 + - 20.42706756971802 + - 19.965712518129887 + - 19.142049040034436 + - 18.234776534434243 + - 18.329667723473573 + - 18.08806027122987 + - 18.064852751307907 + - 18.064852751307907 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 270.0 + - 570.0 + - 600.0 + - 630.0 + - 660.0 + - 690.0 + - 720.0 + - 750.0 + - 1020.0 + - 1050.0 + - 1080.0 + - 1110.0 + - 1140.0 + - 1320.0 + - 1590.0 + - 1620.0 + - 1980.0 + - 2010.0 + - 2880.0 + - 3750.0 + - 7470.0 + - 7500.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.13374742195577 + - 56.76334354384273 + - 51.45329261184661 + - 45.16233519611212 + - 38.84027811497485 + - 32.70383172999138 + - 29.796644129298315 + - 27.973965601949597 + - 27.04079919289071 + - 26.034346844934166 + - 25.06528335581928 + - 23.931669406283035 + - 22.577739531526152 + - 21.9909481355686 + - 21.543422465364902 + - 20.853252488951284 + - 20.289004738535873 + - 19.86282205727662 + - 19.608969098122987 + - 19.226581859490064 + - 18.541421756450763 + - 18.325398959257214 + - 18.187065571976564 + - 18.427356179182606 + - 18.236300919591596 + - 18.294445081703206 + - 18.278207391034062 + - 18.263284661138286 + - 18.263284661138286 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 660.0 + - 690.0 + - 720.0 + - 750.0 + - 780.0 + - 810.0 + - 840.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 1260.0 + - 1560.0 + - 1590.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 63.4198195238471 + - 58.9727147517484 + - 53.523297003292825 + - 46.861443454155726 + - 39.3460360634956 + - 30.93602870015962 + - 25.915871454852976 + - 24.796882430495998 + - 24.321746370616193 + - 23.769521256263197 + - 23.12271145328248 + - 22.42256264348956 + - 21.709877990071195 + - 20.987003866738114 + - 20.228428551509566 + - 19.504035507167593 + - 18.887927658420235 + - 18.650651448100078 + - 18.407443003556395 + - 18.421670640424278 + - 18.185788627703985 + - 18.185788627703985 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 390.0 + - 420.0 + - 450.0 + - 780.0 + - 810.0 + - 840.0 + - 870.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 60.67729854477164 + - 56.545354430227654 + - 51.44120668978856 + - 45.29202887384301 + - 38.137067005240034 + - 30.43075983628266 + - 25.67752023438335 + - 24.673008620103765 + - 21.250878169453596 + - 20.40859152792385 + - 19.482311913787825 + - 18.596652790258737 + - 18.209165715881518 + - 17.96948764987149 + - 17.96948764987149 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 240.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1050.0 + - 1080.0 + - 1110.0 + - 1140.0 + - 1170.0 + - 1200.0 + - 1230.0 + - 1260.0 + - 1290.0 + - 1320.0 + - 1350.0 + - 1380.0 + - 1860.0 + - 1890.0 + - 1920.0 + - 1950.0 + - 1980.0 + - 2010.0 + - 2040.0 + - 2070.0 + - 2100.0 + - 2130.0 + - 2160.0 + - 2190.0 + - 2700.0 + - 2730.0 + - 2760.0 + - 2790.0 + - 2820.0 + - 2850.0 + - 2880.0 + - 2910.0 + - 2940.0 + - 2970.0 + - 3000.0 + - 3690.0 + - 3720.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.717602673300256 + - 56.75925060326765 + - 50.714332618122846 + - 43.55948025201569 + - 36.049780331692894 + - 36.595058621687514 + - 31.896812066938807 + - 31.6653094653158 + - 31.475698178305173 + - 31.293133614630783 + - 31.104975594473725 + - 30.894978835864144 + - 30.658763510620634 + - 30.378729187195663 + - 30.05510448693167 + - 29.670406646611372 + - 29.201438914766545 + - 28.67210598000149 + - 28.063731133252972 + - 27.397307365016314 + - 26.6992895132165 + - 25.947189123113063 + - 25.14554953010937 + - 24.022957714592714 + - 22.85670637978042 + - 22.697420585734193 + - 22.5223449015365 + - 22.332776508314687 + - 22.132918759256643 + - 21.92224128990392 + - 21.679486628335045 + - 21.434366303004687 + - 21.060401701941647 + - 20.725467246990338 + - 20.268978843796127 + - 19.87833357804556 + - 18.96723556370045 + - 18.90089913006174 + - 18.845070856761783 + - 18.794563070465486 + - 18.748969828076785 + - 18.71789779909811 + - 18.67404133321003 + - 18.63248201593958 + - 18.549386664020425 + - 18.49626784699682 + - 18.404530007714165 + - 18.315235929963695 + - 18.343972398599846 + - 18.343972398599846 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 1050.0 + - 1080.0 + - 1110.0 + - 1140.0 + - 1170.0 + - 1200.0 + - 1230.0 + - 1260.0 + - 1290.0 + - 1320.0 + - 1350.0 + - 1380.0 + - 1410.0 + - 1440.0 + - 1470.0 + - 1500.0 + - 1530.0 + - 1560.0 + - 1590.0 + - 1620.0 + - 1650.0 + - 1680.0 + - 1710.0 + - 1860.0 + - 2010.0 + - 2160.0 + - 2520.0 + - 2910.0 + - 4050.0 + - 4860.0 + - 4890.0 + - 4920.0 + - 4950.0 + - 4980.0 + - 5010.0 + - 6630.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 68.54280202505085 + - 63.45798541227731 + - 57.22848630983488 + - 49.76809900547376 + - 41.578841092529665 + - 34.21053139528321 + - 29.6609141166125 + - 29.632170565851013 + - 29.596854633528064 + - 29.553542079790716 + - 29.50050284729456 + - 29.43591715218021 + - 29.35667352660148 + - 29.25949209773462 + - 29.14033867840757 + - 28.99496762391071 + - 28.81732332172178 + - 28.60017660556723 + - 28.33542109996964 + - 28.00899971450542 + - 27.615684083682517 + - 27.154161175958844 + - 26.601913411291342 + - 25.949330393613256 + - 25.203081855419132 + - 24.418176967175835 + - 23.45342853156471 + - 22.660727618184815 + - 21.77196142795819 + - 20.520917913422707 + - 20.012047017603045 + - 19.37583354195867 + - 19.221427544015096 + - 19.160400095579337 + - 19.19698152905614 + - 19.14465604613393 + - 19.151588405685928 + - 19.15672449046415 + - 19.160202381679063 + - 19.163527000565537 + - 19.166288079875805 + - 19.171667547856668 + - 19.171667547856668 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 600.0 + - 630.0 + - 660.0 + - 690.0 + - 720.0 + - 750.0 + - 1170.0 + - 1200.0 + - 1230.0 + - 1260.0 + - 1290.0 + - 1320.0 + - 1350.0 + - 1620.0 + - 2610.0 + - 3000.0 + - 3270.0 + - 4260.0 + - 4290.0 + - 4620.0 + - 5460.0 + - 7680.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.18525294074846 + - 56.167213131685756 + - 50.1277686788111 + - 43.206641668570484 + - 36.18440710274172 + - 30.808003703014585 + - 26.8298677728186 + - 25.12712784682803 + - 24.018639781099896 + - 22.868914874960794 + - 21.89193119121942 + - 21.224271285462322 + - 20.44892993314289 + - 19.90361983198191 + - 19.723153112019205 + - 19.545156539409042 + - 19.39547417257103 + - 19.28619839299715 + - 19.14017752147207 + - 19.00462022005199 + - 18.301165653529768 + - 17.984880456054128 + - 17.903126309830476 + - 17.93886442501782 + - 18.68983534558582 + - 17.85060456595204 + - 17.83765058456658 + - 17.84880086984672 + - 17.854887532047158 + - 17.854887532047158 +problem_name: FIXEDSAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.06 + - 0.063 + - 0.066 + - 0.069 + - 0.072 + - 0.075 + - 0.078 + - 0.081 + - 0.084 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.108 + - 0.129 + - 0.132 + - 0.135 + - 0.162 + - 0.165 + - 0.168 + - 0.171 + - 0.225 + - 0.228 + - 0.231 + - 0.303 + - 0.309 + - 0.312 + - 0.318 + - 0.72 + - 1.0 + - !!python/tuple + - 1.0 + - 0.928184940230876 + - 0.8388799263933817 + - 0.7286726923250956 + - 0.5986001142892781 + - 0.5010113621514746 + - 0.4642892241864604 + - 0.4534516705977999 + - 0.44063033619407027 + - 0.4254873346118135 + - 0.4079271212615543 + - 0.3868922569170183 + - 0.361433710055777 + - 0.3307245800261484 + - 0.2938618569646038 + - 0.2527437084604218 + - 0.21027275170530654 + - 0.16774961059893698 + - 0.12688922787337856 + - 0.11307312340660387 + - 0.08336235028352099 + - 0.06998420557935597 + - 0.05368858186155467 + - 0.034698653323012925 + - 0.028744736358031896 + - 0.022722509299011585 + - 0.01991428764108674 + - 0.008807238906117983 + - 0.009146520909551082 + - 0.008439375192379398 + - 0.006841398896655336 + - 0.006508169135825256 + - 0.006683781129365446 + - 0.0066245262960007364 + - 0.006130138863665064 + - 0.006130138863665064 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.024 + - 0.057 + - 0.06 + - 0.063 + - 0.066 + - 0.069 + - 0.072 + - 0.075 + - 0.078 + - 0.081 + - 0.084 + - 0.102 + - 0.123 + - 0.126 + - 0.177 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9134790902547835 + - 0.8136980773820379 + - 0.6931193110085402 + - 0.5482435551372277 + - 0.38210921495508887 + - 0.2815938087100497 + - 0.26319930480517156 + - 0.24309616155390185 + - 0.21992373335308682 + - 0.19407195950622647 + - 0.16735640204267913 + - 0.14115096313886002 + - 0.11338607483611786 + - 0.08602431477106157 + - 0.05813252695067341 + - 0.03616948263547161 + - 0.010176269518511296 + - 0.0021562812703722033 + - -0.006750729066920534 + - -0.007302562215224186 + - -0.009765971161735741 + - -0.009765971161735741 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.024 + - 0.069 + - 0.072 + - 0.075 + - 0.078 + - 0.081 + - 0.084 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.105 + - 0.156 + - 0.159 + - 0.162 + - 0.165 + - 0.168 + - 0.171 + - 0.174 + - 0.177 + - 0.18 + - 0.183 + - 0.186 + - 0.189 + - 0.192 + - 0.195 + - 0.234 + - 0.237 + - 0.303 + - 0.306 + - 0.309 + - 0.312 + - 0.315 + - 0.318 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8974899499343246 + - 0.7993234992619818 + - 0.6825844414015587 + - 0.5410976407924919 + - 0.38387015771893496 + - 0.3186292643569573 + - 0.2811979869850401 + - 0.27407073642020546 + - 0.26561173768746393 + - 0.25583812253262145 + - 0.2451484191145996 + - 0.23298935662427608 + - 0.21802826444866752 + - 0.20034803937281534 + - 0.1790072026980246 + - 0.1558827007799249 + - 0.12839458575794827 + - 0.10319082865434526 + - 0.07686480958112556 + - 0.051432262277886456 + - 0.04874988486351961 + - 0.04583769953334307 + - 0.04285006269617737 + - 0.04023574765135088 + - 0.03758422045862864 + - 0.03523555269050379 + - 0.031995871184291994 + - 0.028638735912333065 + - 0.023673542332019345 + - 0.01848236402768336 + - 0.013909899928878141 + - 0.007349351216116771 + - 0.0033369007225002496 + - -0.004302276313008548 + - -0.003917957262841554 + - -0.004590761839940217 + - -0.004447116202897706 + - -0.004365730189064539 + - -0.004367472292927996 + - -0.004351017326095327 + - -0.004355000853648107 + - -0.004355000853648107 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.024 + - 0.069 + - 0.072 + - 0.075 + - 0.078 + - 0.081 + - 0.084 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.132 + - 0.135 + - 0.138 + - 0.141 + - 0.144 + - 0.147 + - 0.183 + - 0.24 + - 0.243 + - 0.438 + - 0.441 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8911633615631027 + - 0.771270914499783 + - 0.6259387510716521 + - 0.46686598662056034 + - 0.2955378795928057 + - 0.23881446192873843 + - 0.20095465272858287 + - 0.1931891962374664 + - 0.185570368154603 + - 0.17693588278753405 + - 0.16800604854568113 + - 0.15795754685912164 + - 0.14686792246169283 + - 0.1335764271590926 + - 0.11976753290934507 + - 0.10361738584555508 + - 0.09231157324475617 + - 0.08418333089382561 + - 0.06359119090203023 + - 0.05212829707846678 + - 0.04647276442522011 + - 0.03954514466454277 + - 0.03501492789565874 + - 0.025716047963975492 + - 0.009114630551167353 + - -0.009171975536382942 + - -0.007259388320931524 + - -0.012129127324070845 + - -0.012596888412897394 + - -0.012596888412897394 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.027 + - 0.057 + - 0.06 + - 0.063 + - 0.066 + - 0.069 + - 0.072 + - 0.075 + - 0.102 + - 0.105 + - 0.108 + - 0.111 + - 0.114 + - 0.132 + - 0.159 + - 0.162 + - 0.198 + - 0.201 + - 0.288 + - 0.375 + - 0.747 + - 0.75 + - 1.0 + - !!python/tuple + - 1.0 + - 0.855481783217647 + - 0.767393746085203 + - 0.6603665749774382 + - 0.5335686620405895 + - 0.4061439172233907 + - 0.2824602641567405 + - 0.22386420382389097 + - 0.18712705589079798 + - 0.1683185430886769 + - 0.1480329094787439 + - 0.1285008701081162 + - 0.10565222031153958 + - 0.07836297464717704 + - 0.06653585209336292 + - 0.057515711402922665 + - 0.043604933313399784 + - 0.0322321910733964 + - 0.02364223076332582 + - 0.018525676432022062 + - 0.01081843879104393 + - -0.0029913623809826825 + - -0.007345427751448104 + - -0.01013361778954953 + - -0.005290420565570716 + - -0.009141250665160507 + - -0.007969321192744398 + - -0.008296601311127007 + - -0.008597377628794041 + - -0.008597377628794041 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.066 + - 0.069 + - 0.072 + - 0.075 + - 0.078 + - 0.081 + - 0.084 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.126 + - 0.156 + - 0.159 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9015588987005744 + - 0.8119249103503637 + - 0.7020887198371404 + - 0.5678151791819777 + - 0.41633776341971984 + - 0.24682916385625725 + - 0.14564496894697349 + - 0.12309109304044905 + - 0.11351444885539809 + - 0.10238402985174355 + - 0.08934720132705487 + - 0.07523529403534163 + - 0.06087071950976134 + - 0.046300770279865386 + - 0.031011242721497388 + - 0.016410678753475624 + - 0.0039926660087405185 + - -0.000789774289283352 + - -0.00569178222524962 + - -0.005405015912643722 + - -0.01015935534553659 + - -0.01015935534553659 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.039 + - 0.042 + - 0.045 + - 0.078 + - 0.081 + - 0.084 + - 0.087 + - 1.0 + - !!python/tuple + - 1.0 + - 0.84628179009028 + - 0.7630000484613385 + - 0.6601229761749658 + - 0.536182713697695 + - 0.3919702874917118 + - 0.23664517544595082 + - 0.14084086119289635 + - 0.12059434420123659 + - 0.05161931063086266 + - 0.034642532505892595 + - 0.015972827068904693 + - -0.0018781487072293333 + - -0.00968817650969865 + - -0.014519027608897157 + - -0.014519027608897157 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.024 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.105 + - 0.108 + - 0.111 + - 0.114 + - 0.117 + - 0.12 + - 0.123 + - 0.126 + - 0.129 + - 0.132 + - 0.135 + - 0.138 + - 0.186 + - 0.189 + - 0.192 + - 0.195 + - 0.198 + - 0.201 + - 0.204 + - 0.207 + - 0.21 + - 0.213 + - 0.216 + - 0.219 + - 0.27 + - 0.273 + - 0.276 + - 0.279 + - 0.282 + - 0.285 + - 0.288 + - 0.291 + - 0.294 + - 0.297 + - 0.3 + - 0.369 + - 0.372 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8672497260656684 + - 0.7673112504826424 + - 0.6454724056553495 + - 0.5012621865359849 + - 0.34989980816455607 + - 0.3608902098748209 + - 0.26619431253574743 + - 0.2615282426857386 + - 0.25770651669501987 + - 0.2540268215198084 + - 0.2502343869694532 + - 0.2460017799184819 + - 0.24124072237743685 + - 0.23559646739135806 + - 0.2290736229566375 + - 0.22131981379208576 + - 0.21186749585333697 + - 0.2011984820703038 + - 0.18893633248746786 + - 0.17550417306248584 + - 0.1614352164709961 + - 0.1462761948019595 + - 0.13011868162818044 + - 0.10749218936621031 + - 0.08398571404909078 + - 0.08077521604205694 + - 0.07724646359704193 + - 0.07342560215563425 + - 0.06939735275095159 + - 0.06515102557824994 + - 0.06025816390259503 + - 0.055317620895173954 + - 0.04778014642293282 + - 0.041029347291429145 + - 0.03182855749429415 + - 0.02395487450417499 + - 0.005591163058453941 + - 0.004254113579145114 + - 0.0031288621953736227 + - 0.002110848327816213 + - 0.001191889956797542 + - 0.0005656151046812344 + - -0.0003183375238147246 + - -0.0011559897831979321 + - -0.0028308250271544696 + - -0.0039014657406683723 + - -0.005750495354075559 + - -0.0075502695296345524 + - -0.006971069257331692 + - -0.006971069257331692 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.105 + - 0.108 + - 0.111 + - 0.114 + - 0.117 + - 0.12 + - 0.123 + - 0.126 + - 0.129 + - 0.132 + - 0.135 + - 0.138 + - 0.141 + - 0.144 + - 0.147 + - 0.15 + - 0.153 + - 0.156 + - 0.159 + - 0.162 + - 0.165 + - 0.168 + - 0.171 + - 0.186 + - 0.201 + - 0.216 + - 0.252 + - 0.291 + - 0.405 + - 0.486 + - 0.489 + - 0.492 + - 0.495 + - 0.498 + - 0.501 + - 0.663 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0048155965666163 + - 0.9023281544240715 + - 0.7767689696080905 + - 0.6264005157496075 + - 0.4613412500064057 + - 0.3128286739799928 + - 0.2211284863179342 + - 0.2205491433012679 + - 0.21983733010400022 + - 0.21896434034188153 + - 0.21789530370089835 + - 0.21659354137683737 + - 0.21499633992196807 + - 0.2130375915880946 + - 0.21063598498173436 + - 0.2077059466595025 + - 0.2041254222219437 + - 0.19974870360982563 + - 0.19441240210119506 + - 0.1878331888464213 + - 0.17990568309204294 + - 0.17060341992212524 + - 0.1594725443881818 + - 0.1463193533567732 + - 0.13127827917329113 + - 0.11545806372655205 + - 0.09601299677400486 + - 0.08003564789729667 + - 0.06212204738114802 + - 0.03690653626681014 + - 0.026649946803518662 + - 0.013826693431585465 + - 0.010714550558831545 + - 0.009484506770240436 + - 0.010221826880768477 + - 0.00916717627840481 + - 0.009306902025192163 + - 0.00941042280708721 + - 0.009480521731357381 + - 0.009547531362524321 + - 0.009603182525115165 + - 0.009711608837297464 + - 0.009711608837297464 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.06 + - 0.063 + - 0.066 + - 0.069 + - 0.072 + - 0.075 + - 0.117 + - 0.12 + - 0.123 + - 0.126 + - 0.129 + - 0.132 + - 0.135 + - 0.162 + - 0.261 + - 0.3 + - 0.327 + - 0.426 + - 0.429 + - 0.462 + - 0.546 + - 0.768 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8565199069651244 + - 0.7553783902173296 + - 0.633649867622788 + - 0.4941505192605798 + - 0.352613289192376 + - 0.24424874542882757 + - 0.16406709739122946 + - 0.12974738186591928 + - 0.10740515890027201 + - 0.08423178338427642 + - 0.06454010787524786 + - 0.05108303337814937 + - 0.03545557657136062 + - 0.02446453368849902 + - 0.020827121775870747 + - 0.017239497122677038 + - 0.014222561787677371 + - 0.012020044766999438 + - 0.009076909003865624 + - 0.006344672594121862 + - -0.007833864150988086 + - -0.014208776629718943 + - -0.01585657909125933 + - -0.015136256552321481 + - 0.0 + - -0.016915185447572097 + - -0.01717628049167319 + - -0.016951539993726686 + - -0.0168288597699126 + - -0.0168288597699126 +solver_name: ALOE diff --git a/test/expected_results/FIXEDSAN1_ASTRODF.yaml b/test/expected_results/FIXEDSAN1_ASTRODF.yaml new file mode 100644 index 000000000..a43052d82 --- /dev/null +++ b/test/expected_results/FIXEDSAN1_ASTRODF.yaml @@ -0,0 +1,13609 @@ +all_est_objectives: +- - 68.30388079811371 + - 65.56739386963778 + - 58.791542710431756 + - 42.47900081787588 + - 38.00476005987355 + - 30.4769854535951 + - 26.001111179636045 + - 25.01504536522595 + - 24.191841479533096 + - 22.252334210388913 + - 19.599229609792324 + - 18.90430025371906 + - 18.689415624334128 + - 18.589278313001174 + - 18.553589730122056 + - 18.4225203083103 + - 18.445681506540794 + - 18.418374881063997 + - 18.422938118053565 + - 18.418381177096123 + - 18.417570505017743 + - 18.416645015640853 + - 18.416998903949796 + - 18.416707836323162 + - 18.41670722784657 + - 18.416743472053756 + - 18.416742892869824 + - 18.416796526518773 + - 18.416726848638387 + - 18.41674922755812 + - 18.416743692768414 + - 18.416745858079004 + - 18.41674151325006 + - 18.416743214235325 + - 18.416739802987326 + - 18.416741139216114 + - 18.416741139216114 +- - 68.00555254312637 + - 65.3955680436889 + - 58.83344478557817 + - 43.72842280062673 + - 45.0348774552056 + - 40.392565479407985 + - 40.099838675498354 + - 38.5454759944102 + - 37.37104208553436 + - 36.27314390193479 + - 35.02193990473593 + - 34.27285733969924 + - 33.10979051595366 + - 32.46944437290974 + - 30.421949896881156 + - 29.796888539494322 + - 28.11834310963543 + - 26.96511941872461 + - 26.709439862408022 + - 26.084238532291728 + - 25.78315933126633 + - 25.35019715833344 + - 25.1440603190449 + - 24.757332463993443 + - 24.558953521907235 + - 24.412253115383475 + - 24.25948821457931 + - 24.107572436593 + - 24.015658918032383 + - 23.407853904699962 + - 23.128829703442126 + - 22.8823164565614 + - 22.600033029710406 + - 21.229682333404885 + - 20.81022637497422 + - 20.625914822962663 + - 20.475393727678085 + - 20.439887850552154 + - 20.391350683573258 + - 20.37137982035149 + - 20.337525708908913 + - 20.32293449462835 + - 20.29992309499637 + - 20.279035238312098 + - 20.272436604917715 + - 20.2660292472882 + - 20.263208949990045 + - 20.25892097032944 + - 20.250259978103454 + - 20.24196530471391 + - 20.2409264623867 + - 20.239419536301526 + - 20.237935153513888 + - 20.23595365317463 + - 20.235255947892128 + - 20.233826169877844 + - 20.232418594791167 + - 20.23151214473684 + - 20.23061820897952 + - 20.23009424652129 + - 20.229911163943765 + - 20.22958307695201 + - 20.22920233601619 + - 20.228797441325188 + - 20.228248582527208 + - 20.227666074806695 + - 20.226877965831587 + - 20.226043931921883 + - 20.224865604904593 + - 20.22330336535859 + - 20.2219759792182 + - 20.22021775632437 + - 20.21873468203635 + - 20.216772087175965 + - 20.21512974761936 + - 20.212958392674384 + - 20.211156929754235 + - 20.20877725739892 + - 20.206821700928355 + - 20.204239032563493 + - 20.20213866360429 + - 20.199365144052514 + - 20.197132277077447 + - 20.194185174321657 + - 20.19183713014849 + - 20.18873885484265 + - 20.186296322952774 + - 20.181679207913938 + - 20.175751868210142 + - 20.170004034664498 + - 20.162718771337538 + - 20.155782940791042 + - 20.14711256724305 + - 20.139020254460192 + - 20.129635380339433 + - 20.11751196663688 + - 20.10919598202052 + - 20.098349851680442 + - 20.09105406613882 + - 20.081454118451155 + - 20.075095171514036 + - 20.066662101073035 + - 20.06114396444662 + - 20.053775916764188 + - 20.049001747240677 + - 20.04258961857887 + - 20.015227426269814 + - 19.986756047548855 + - 19.943242662118195 + - 19.91680500361134 + - 19.73920516455752 + - 19.710669687843954 + - 19.670716985874197 + - 19.625913911615807 + - 19.58591625788217 + - 19.557690964467298 + - 19.53018068153528 + - 19.48736030823651 + - 19.47469137067642 + - 19.436723250933404 + - 19.422212022930243 + - 19.40358163975203 + - 19.398464241625355 + - 19.391977998734333 + - 19.385573766035638 + - 19.37522448851307 + - 19.366318086596213 + - 19.364082320775427 + - 19.35966470630263 + - 19.358760719628947 + - 19.35344836518709 + - 19.351813730191168 + - 19.35077733056319 + - 19.34865450156175 + - 19.346385805636444 + - 19.345306207963855 + - 19.34483957087468 + - 19.343721314219945 + - 19.342919231366178 + - 19.342055620076437 + - 19.341666755101603 + - 19.341124348005984 + - 19.34086489914683 + - 19.340753970749425 + - 19.340624099817568 + - 19.340442481101718 + - 19.340389176343436 + - 19.34036638635515 + - 19.340230141007783 + - 19.340187871336504 + - 19.340161356365588 + - 19.340105472634008 + - 19.340044813664512 + - 19.340015751729066 + - 19.340003341866254 + - 19.339983538271735 + - 19.339927841518502 + - 19.339830048279058 + - 19.339751998890893 + - 19.339409193561536 + - 19.339164843217937 + - 19.33855428892754 + - 19.337731352583504 + - 19.336797271563842 + - 19.335541064096287 + - 19.334122387584824 + - 19.332220700562633 + - 19.330089034395016 + - 19.327244988761084 + - 19.324091100155332 + - 19.319933814435736 + - 19.31534315274489 + - 19.30958173479615 + - 19.30591740661873 + - 19.298016437699115 + - 19.285796425056702 + - 19.277614481788277 + - 19.263434493681675 + - 19.251009902379398 + - 19.24234768504069 + - 19.215613649378135 + - 19.196019017429844 + - 19.182917665078524 + - 19.16460425602788 + - 19.149188909377745 + - 19.12886922394873 + - 19.118057509117975 + - 19.10228505202181 + - 19.09430595914183 + - 19.079048312009746 + - 19.070901621596416 + - 19.0565006362493 + - 19.045501346331548 + - 19.033818267682978 + - 19.02755815290646 + - 19.025894055093378 + - 19.000090720013308 + - 18.996879408117564 + - 18.9739348687772 + - 18.962793611785976 + - 18.960142307155376 + - 18.94352440095209 + - 18.925764602682563 + - 18.91221774217486 + - 18.912646732366166 + - 18.912917178385033 + - 18.90797501866757 + - 18.908183050410212 + - 18.904281877113373 + - 18.90444412492541 + - 18.901341468291676 + - 18.887266741153606 + - 18.877851942218616 + - 18.880640449561795 + - 18.867872641734625 + - 18.860085527641004 + - 18.860220316408032 + - 18.860448012671387 + - 18.85739382875945 + - 18.857565781534646 + - 18.855266933296512 + - 18.855399114021065 + - 18.853655024518666 + - 18.853758134819046 + - 18.85242761959219 + - 18.852509150067355 + - 18.851652439579276 + - 18.851947472287083 + - 18.851082017250462 + - 18.85113013531536 + - 18.850572766571872 + - 18.85076165308176 + - 18.85021078296348 + - 18.85023799608255 + - 18.849883562652238 + - 18.8500014607059 + - 18.84974783469866 + - 18.84945885019234 + - 18.849490095482277 + - 18.84910254807707 + - 18.847632118049233 + - 18.846249105147614 + - 18.847306052882207 + - 18.844417404057808 + - 18.844510947831917 + - 18.840184591167837 + - 18.83347898788907 + - 18.822492401841544 + - 18.808469987165648 + - 18.7872330454903 + - 18.779627152292964 + - 18.755300510630917 + - 18.738005964252785 + - 18.73367132236414 + - 18.702959170582968 + - 18.651352240368247 + - 18.552331018258133 + - 18.546669376569128 + - 18.57382548634083 + - 18.502612817124813 + - 18.538618801713447 + - 18.52365574563279 + - 18.51317337354755 + - 18.518526302728183 + - 18.5275299762121 + - 18.518351033961252 + - 18.52080468666265 + - 18.519274596060193 + - 18.52007197897758 + - 18.519644437502883 + - 18.51977205099696 + - 18.519692176553985 + - 18.519768461307166 + - 18.519747440508294 + - 18.51976744060478 + - 18.51977369242569 + - 18.519769776492968 + - 18.51977351183494 + - 18.519771172124294 + - 18.519773403666832 + - 18.519772005886896 + - 18.519773338949896 + - 18.519773720611465 + - 18.519773481546828 + - 18.51977370953894 + - 18.519773566729498 + - 18.519773702923573 + - 18.51977370139355 + - 18.519773702849488 + - 18.51977370307698 + - 18.519773702934483 + - 18.51977370307038 + - 18.519773703033025 + - 18.519773703068566 + - 18.519773703079675 + - 18.519773703072715 + - 18.519773703079355 + - 18.5197737030752 + - 18.519773703079164 + - 18.519773703077735 + - 18.519773703079096 + - 18.519773703079515 + - 18.51977370307925 + - 18.519773703079508 + - 18.519773703079345 + - 18.5197737030795 + - 18.519773703079522 + - 18.519773703079508 + - 18.519773703079515 + - 18.51977370307951 + - 18.51977370307951 +- - 67.15565001348712 + - 64.33826853573558 + - 57.36312787550206 + - 40.72856234631455 + - 32.51159902424981 + - 31.267752894757354 + - 27.58804323996827 + - 25.30975041200169 + - 22.926766089204943 + - 22.25031149218883 + - 21.05705794129319 + - 19.56452304986026 + - 18.455658656062493 + - 18.260981844285137 + - 18.125335431007514 + - 18.142475097635835 + - 18.131173423802505 + - 18.13381300845258 + - 18.128876245883887 + - 18.127620162136747 + - 18.127813959222827 + - 18.127655741411065 + - 18.127630065649797 + - 18.12762956489595 + - 18.127629764874985 + - 18.12762960995224 + - 18.12762960995224 +- - 67.71943959541662 + - 64.73534603141549 + - 57.311355312669676 + - 39.53628297681947 + - 31.98252606674823 + - 31.04404880317291 + - 28.65546635944885 + - 25.985494980153945 + - 24.52696416646836 + - 22.730404684853912 + - 22.277395383844443 + - 21.125584133430554 + - 20.55272134787789 + - 19.685327872167967 + - 19.28871363874283 + - 18.636828260257424 + - 18.473294858494985 + - 18.051493138427727 + - 18.085327903441378 + - 17.929704767408428 + - 17.951588100905088 + - 17.943181960313936 + - 17.954360823200048 + - 17.96165353261146 + - 17.968423927480156 + - 17.964717002411422 + - 17.967663369590092 + - 17.967673971360753 + - 17.96749902035061 + - 17.96925288965881 + - 17.96821741143132 + - 17.968622941944965 + - 17.968645092313785 + - 17.96911990054058 + - 17.969133225477616 + - 17.96933989668485 + - 17.969344098149453 + - 17.969325747759953 + - 17.969436287825737 + - 17.96939475809187 + - 17.96943275275454 + - 17.969433523755765 + - 17.969467942191354 + - 17.969454885058948 + - 17.969466725906475 + - 17.969466725906475 +- - 64.758578697695 + - 62.201856413239646 + - 55.976832544213686 + - 41.42893668353909 + - 33.20392639838395 + - 28.87744926709205 + - 26.222207512870988 + - 25.294020312355986 + - 24.754713920368282 + - 22.356135975901353 + - 21.644685372631297 + - 20.24134421886945 + - 19.712031519204665 + - 19.320568630542027 + - 18.640072301860172 + - 18.51788718669868 + - 18.161945842445533 + - 18.19129006375819 + - 18.037745632125244 + - 18.098997055311592 + - 18.068682836749954 + - 18.075578733291547 + - 18.069856501660727 + - 18.06945371876881 + - 18.069247618542345 + - 18.06876929183266 + - 18.068257091183856 + - 18.068230588736604 + - 18.06814958200149 + - 18.068135452721165 + - 18.068093220944743 + - 18.068093220944743 +- - 67.09349230810763 + - 64.18503641324183 + - 57.015653875182835 + - 40.33922322729084 + - 31.55397234227899 + - 25.985640764494846 + - 23.53838698074781 + - 22.519974660546218 + - 20.98391479355507 + - 18.78847144703299 + - 18.64610491891286 + - 18.112429451907644 + - 18.125666563863362 + - 17.996610081812776 + - 17.976373554792414 + - 17.977931415556245 + - 17.966643990008393 + - 17.95854346497246 + - 17.967754350881805 + - 17.967801788086852 + - 17.969307067967346 + - 17.96771705552617 + - 17.968924935896037 + - 17.969166696645956 + - 17.97035132413054 + - 17.96957920720093 + - 17.969456469856464 + - 17.969531964692802 + - 17.969439981277507 + - 17.969497642000864 + - 17.969429251537594 + - 17.969472661338113 + - 17.96942216852895 + - 17.9694645852986 + - 17.969435168906905 + - 17.969459930691826 + - 17.96944281389799 + - 17.96944281389799 +- - 64.04874061726181 + - 61.46090171851359 + - 55.042057092995236 + - 39.32722580315888 + - 30.49175427500768 + - 26.316755362462438 + - 23.571351703232093 + - 22.072511752804544 + - 20.510088764888025 + - 18.983842766829536 + - 18.44069565266074 + - 18.269085206693568 + - 18.11295474262927 + - 17.853292982010554 + - 17.738130251767032 + - 17.745403558746737 + - 17.734037305243756 + - 17.73029602694716 + - 17.732336453022295 + - 17.732734974248903 + - 17.733181763546625 + - 17.733192095181398 + - 17.733214529720794 + - 17.73321995354089 + - 17.733231862467804 + - 17.733234718490642 + - 17.73323779357067 + - 17.733238530436985 + - 17.733240161085003 + - 17.733240551397145 + - 17.73324058893057 + - 17.73324059791724 + - 17.733240617822705 + - 17.73324062258863 + - 17.73324062258863 +- - 65.76447222250123 + - 63.104067843368824 + - 56.503360780691594 + - 40.653023848619675 + - 31.924949843966417 + - 28.04335419540771 + - 26.28210327061325 + - 24.217209576049022 + - 23.007597287650967 + - 21.976001622745656 + - 20.669789002931555 + - 20.150751121974803 + - 19.481446991853755 + - 19.132471870966523 + - 18.716283637887976 + - 18.576131287280433 + - 18.35593501417983 + - 18.317365882923884 + - 18.200145710055942 + - 18.191267227412837 + - 18.135446603407964 + - 18.140533259834662 + - 18.10008225860206 + - 18.109206111578853 + - 18.10271713765997 + - 18.078901098990077 + - 18.082030668235994 + - 18.081327799145246 + - 18.08245135507577 + - 18.08226257162849 + - 18.08244440200909 + - 18.08235311169249 + - 18.08234491327966 + - 18.082347233659767 + - 18.082346013819482 + - 18.082345212162046 + - 18.08234594569872 + - 18.082345560040693 + - 18.08234549738497 + - 18.08234549738497 +- - 72.64729923751366 + - 69.59956980064081 + - 62.031370855412 + - 44.1618907656046 + - 35.274571776624036 + - 33.853946350398786 + - 30.143206230620503 + - 27.05449119442519 + - 25.61421721497668 + - 24.251789664061107 + - 23.638175664402368 + - 22.76055497922722 + - 22.180797602760713 + - 21.51568101784029 + - 21.06208221200999 + - 20.571692594532283 + - 20.24454851531106 + - 19.918690170759 + - 19.691393600391635 + - 19.50877732340782 + - 19.323711675194122 + - 19.23312517842205 + - 19.076403418514786 + - 19.028080173768515 + - 18.95377973665594 + - 18.94009414336682 + - 18.93637782574079 + - 18.93114276720633 + - 18.93030689079251 + - 18.9300860119555 + - 18.92965358463188 + - 18.92858036227216 + - 18.928518073059067 + - 18.928354178093088 + - 18.928334748243866 + - 18.928328507869427 + - 18.928314204100683 + - 18.928276553965787 + - 18.92827271500931 + - 18.92826258407866 + - 18.928259027413183 + - 18.928257902960887 + - 18.928255313230277 + - 18.928248489606034 + - 18.928246611890867 + - 18.928246019123563 + - 18.928246019123563 +- - 65.3640980466472 + - 62.56577178226692 + - 55.660585027257895 + - 39.42919584583152 + - 32.56833758432123 + - 31.531460073123363 + - 29.285946579133586 + - 28.701295518120663 + - 25.64024288599398 + - 24.832346993587958 + - 23.74519172264209 + - 22.41251582737056 + - 21.864738662724964 + - 21.093480912879787 + - 19.879786584373274 + - 19.21362333376243 + - 18.937820795172694 + - 18.20097133618882 + - 18.069444747540363 + - 17.948930054857446 + - 17.927234159066572 + - 17.902178029988676 + - 17.8823132092491 + - 17.875907876492064 + - 17.865441508710827 + - 17.848808885321173 + - 17.84881253806114 + - 17.836717279346743 + - 17.840356120584143 + - 17.837184964300796 + - 17.838020787402762 + - 17.836098957613878 + - 17.836837736920174 + - 17.836833290240783 + - 17.836670153697227 + - 17.836520821297924 + - 17.836147586149195 + - 17.83598213729345 + - 17.835632167314486 + - 17.83551825312872 + - 17.835521703350015 + - 17.835599770449477 + - 17.835488623460048 + - 17.835427512157576 + - 17.835452224695064 + - 17.835421728112205 + - 17.83537042692178 + - 17.83535235539106 + - 17.835381972872348 + - 17.83534732954764 + - 17.83534307265898 + - 17.835340367394142 + - 17.835333604543575 + - 17.835331191250393 + - 17.835328701546985 + - 17.835329608581745 + - 17.83532855263318 + - 17.83532789266751 + - 17.83532822756594 + - 17.83532776164788 + - 17.83532799812315 + - 17.835327709629862 + - 17.835327451839284 + - 17.835327451839284 +all_intermediate_budgets: +- - 128 + - 256 + - 384 + - 512 + - 1024 + - 1152 + - 1536 + - 1664 + - 1792 + - 1920 + - 2048 + - 2176 + - 2304 + - 2432 + - 2560 + - 2688 + - 2816 + - 2944 + - 3072 + - 3200 + - 5248 + - 5376 + - 5504 + - 5632 + - 6656 + - 6784 + - 6912 + - 7040 + - 7168 + - 7296 + - 8448 + - 8576 + - 8704 + - 8832 + - 8960 + - 9088 + - 10000 +- - 6 + - 12 + - 18 + - 24 + - 48 + - 56 + - 63 + - 84 + - 91 + - 98 + - 105 + - 112 + - 119 + - 126 + - 133 + - 140 + - 147 + - 154 + - 161 + - 168 + - 177 + - 185 + - 193 + - 201 + - 209 + - 217 + - 225 + - 233 + - 241 + - 249 + - 257 + - 307 + - 316 + - 325 + - 334 + - 397 + - 406 + - 415 + - 424 + - 433 + - 496 + - 505 + - 534 + - 544 + - 584 + - 594 + - 624 + - 634 + - 644 + - 654 + - 704 + - 714 + - 724 + - 734 + - 744 + - 754 + - 764 + - 774 + - 784 + - 854 + - 864 + - 896 + - 907 + - 918 + - 929 + - 940 + - 951 + - 962 + - 973 + - 984 + - 995 + - 1006 + - 1017 + - 1028 + - 1039 + - 1050 + - 1061 + - 1072 + - 1083 + - 1094 + - 1105 + - 1116 + - 1127 + - 1138 + - 1149 + - 1160 + - 1171 + - 1182 + - 1193 + - 1204 + - 1215 + - 1226 + - 1237 + - 1248 + - 1259 + - 1270 + - 1281 + - 1292 + - 1303 + - 1314 + - 1325 + - 1336 + - 1347 + - 1358 + - 1369 + - 1380 + - 1391 + - 1402 + - 1481 + - 1493 + - 1505 + - 1517 + - 1529 + - 1541 + - 1553 + - 1565 + - 1577 + - 1589 + - 1601 + - 1613 + - 1625 + - 1637 + - 1649 + - 1661 + - 1673 + - 1685 + - 1697 + - 1709 + - 1721 + - 1733 + - 1745 + - 1757 + - 1769 + - 1781 + - 1793 + - 1805 + - 1817 + - 2021 + - 2033 + - 2045 + - 2057 + - 2069 + - 2081 + - 2093 + - 2165 + - 2177 + - 2225 + - 2237 + - 2249 + - 2261 + - 2273 + - 2285 + - 2297 + - 2309 + - 2321 + - 2393 + - 2407 + - 2420 + - 2433 + - 2446 + - 2459 + - 2472 + - 2485 + - 2498 + - 2511 + - 2524 + - 2537 + - 2550 + - 2563 + - 2576 + - 2589 + - 2602 + - 2615 + - 2628 + - 2641 + - 2654 + - 2667 + - 2680 + - 2693 + - 2706 + - 2719 + - 2732 + - 2745 + - 2758 + - 2771 + - 2784 + - 2797 + - 2810 + - 2823 + - 2836 + - 2849 + - 2862 + - 2875 + - 2888 + - 2901 + - 2914 + - 2927 + - 2940 + - 2953 + - 2966 + - 2979 + - 2992 + - 3005 + - 3018 + - 3031 + - 3226 + - 3239 + - 3252 + - 3265 + - 3278 + - 3291 + - 3330 + - 3343 + - 3356 + - 3369 + - 3382 + - 3395 + - 3512 + - 3525 + - 3538 + - 3551 + - 3564 + - 3577 + - 3590 + - 3603 + - 3616 + - 3629 + - 3642 + - 3655 + - 3668 + - 3681 + - 3694 + - 3707 + - 3720 + - 3733 + - 3746 + - 3759 + - 3772 + - 3785 + - 3798 + - 3811 + - 3824 + - 3837 + - 3850 + - 3863 + - 3878 + - 3892 + - 3906 + - 3920 + - 3934 + - 3948 + - 3962 + - 3976 + - 3990 + - 4004 + - 4018 + - 4172 + - 4186 + - 4200 + - 4214 + - 4228 + - 4242 + - 4354 + - 4368 + - 4410 + - 4424 + - 4480 + - 4494 + - 4550 + - 4564 + - 4634 + - 4648 + - 4662 + - 4732 + - 4746 + - 4802 + - 4816 + - 4830 + - 4844 + - 4858 + - 4872 + - 4886 + - 5012 + - 5026 + - 5040 + - 5054 + - 5068 + - 5250 + - 5264 + - 5334 + - 5348 + - 5362 + - 5432 + - 5446 + - 5502 + - 5516 + - 5530 + - 5544 + - 5558 + - 5670 + - 5684 + - 5740 + - 5754 + - 5768 + - 5782 + - 5796 + - 5922 + - 5936 + - 5992 + - 6020 + - 10000 +- - 161 + - 322 + - 483 + - 644 + - 1127 + - 1288 + - 1449 + - 1610 + - 1771 + - 1932 + - 2093 + - 2254 + - 2415 + - 2576 + - 2737 + - 2898 + - 3059 + - 3220 + - 3381 + - 5957 + - 6440 + - 6601 + - 7567 + - 8855 + - 9016 + - 9177 + - 10000 +- - 115 + - 230 + - 345 + - 460 + - 805 + - 920 + - 1035 + - 1610 + - 1725 + - 1840 + - 1955 + - 2070 + - 2185 + - 2300 + - 2415 + - 2530 + - 2645 + - 2760 + - 2875 + - 2990 + - 3105 + - 3220 + - 3335 + - 3450 + - 5060 + - 5175 + - 5290 + - 5405 + - 5520 + - 5635 + - 5750 + - 5865 + - 5980 + - 6095 + - 6210 + - 7705 + - 7820 + - 7935 + - 8050 + - 8165 + - 8280 + - 8395 + - 8510 + - 8625 + - 8740 + - 10000 +- - 155 + - 310 + - 465 + - 620 + - 1085 + - 1550 + - 1705 + - 1860 + - 2015 + - 2170 + - 2325 + - 3410 + - 3565 + - 3720 + - 3875 + - 4030 + - 4185 + - 4340 + - 4495 + - 4650 + - 4805 + - 4960 + - 5115 + - 5270 + - 7750 + - 7905 + - 8525 + - 8680 + - 8835 + - 8990 + - 9145 + - 10000 +- - 136 + - 272 + - 408 + - 544 + - 952 + - 1088 + - 1224 + - 1360 + - 1496 + - 1632 + - 1768 + - 1904 + - 3128 + - 3264 + - 3400 + - 3536 + - 3672 + - 3808 + - 3944 + - 5440 + - 5576 + - 6120 + - 6256 + - 6392 + - 6800 + - 6936 + - 7616 + - 7752 + - 7888 + - 8024 + - 8160 + - 8296 + - 8432 + - 8568 + - 8704 + - 8840 + - 8976 + - 10000 +- - 115 + - 230 + - 345 + - 460 + - 805 + - 1150 + - 1265 + - 1380 + - 2070 + - 2185 + - 2300 + - 2415 + - 2530 + - 2645 + - 3565 + - 3680 + - 3795 + - 4485 + - 4600 + - 5175 + - 5290 + - 6095 + - 6210 + - 6325 + - 6440 + - 6555 + - 7360 + - 7475 + - 7590 + - 7705 + - 8855 + - 8970 + - 9085 + - 9200 + - 10000 +- - 125 + - 250 + - 375 + - 500 + - 875 + - 1250 + - 1375 + - 1500 + - 1625 + - 1750 + - 1875 + - 2000 + - 2125 + - 2250 + - 2375 + - 2500 + - 2625 + - 2750 + - 2875 + - 3000 + - 3125 + - 3250 + - 3375 + - 3500 + - 3625 + - 3750 + - 5625 + - 5750 + - 5875 + - 6500 + - 6625 + - 6750 + - 7625 + - 8250 + - 8375 + - 8750 + - 8875 + - 9000 + - 9750 + - 10000 +- - 109 + - 218 + - 327 + - 436 + - 763 + - 872 + - 981 + - 1090 + - 1199 + - 2071 + - 2180 + - 2289 + - 2398 + - 2507 + - 2616 + - 2725 + - 2834 + - 2943 + - 3052 + - 3161 + - 3270 + - 3379 + - 3488 + - 3597 + - 3706 + - 3815 + - 5341 + - 5450 + - 5886 + - 5995 + - 6104 + - 6213 + - 6976 + - 7085 + - 7521 + - 7630 + - 7739 + - 7848 + - 8502 + - 8611 + - 8720 + - 8829 + - 8938 + - 9047 + - 9701 + - 9810 + - 10000 +- - 93 + - 186 + - 279 + - 372 + - 651 + - 744 + - 837 + - 1209 + - 1302 + - 1395 + - 1488 + - 1581 + - 1674 + - 1767 + - 1860 + - 1953 + - 2046 + - 2139 + - 2232 + - 2325 + - 2418 + - 2511 + - 2604 + - 2697 + - 2790 + - 2883 + - 2976 + - 3069 + - 3162 + - 3255 + - 3348 + - 3441 + - 3534 + - 5301 + - 5394 + - 5487 + - 5580 + - 5673 + - 5766 + - 5859 + - 5952 + - 6045 + - 6138 + - 6231 + - 6324 + - 6417 + - 6510 + - 6603 + - 7254 + - 7347 + - 7905 + - 7998 + - 8091 + - 8184 + - 8277 + - 8742 + - 8835 + - 9114 + - 9207 + - 9300 + - 9393 + - 9486 + - 9951 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.22492489356416 + - 9.872940368435932 + - 9.840433282237784 + - 9.41193573414882 + - 9.87407832520795 + - 9.803716375665594 + - 9.55452922795056 + - 9.627949720528663 + - 9.748589384034629 + - 9.768653530191648 + - 9.571631441720795 + - 9.582165683288604 + - 9.579657093909688 + - !!python/tuple + - 7.287357580151188 + - 9.555260433902461 + - 9.441480661055447 + - 7.941794425986032 + - 9.559243478569067 + - 9.312967343728031 + - 8.44082726704183 + - 8.697786557906172 + - 9.120019630129182 + - 9.190244903923695 + - 8.500681500281996 + - 8.537549368947492 + - 8.528769763902675 + - !!python/tuple + - 2.38413106740086 + - 8.7491852756685 + - 8.15904002274411 + - 4.392726772917217 + - 8.619047324255346 + - 7.8633175715016534 + - 5.679533387305883 + - 6.473802229905369 + - 7.573668057343043 + - 7.723052424236247 + - 5.614806318592844 + - 6.07768335630923 + - 6.0953729203966 + - !!python/tuple + - 0.9662517267344561 + - 8.395355503812013 + - 7.561600919224185 + - 3.3797097532979374 + - 8.13516056674649 + - 7.224272737229444 + - 4.762556189867479 + - 5.898879332552968 + - 6.973768994051882 + - 7.078348520534528 + - 4.71462661277817 + - 5.473451656546169 + - 5.4143648981150685 + - !!python/tuple + - 1.0873689546372645 + - 7.485521759664861 + - 6.036830571791178 + - 1.4176780624007974 + - 6.855198844274211 + - 5.709998840247457 + - 2.884514427935148 + - 4.6231882229941705 + - 5.888836348106354 + - 5.682233133917313 + - 2.7480491077248486 + - 4.064967659189972 + - 3.9027876346191688 + - !!python/tuple + - 0.4787748725301607 + - 6.289927645563436 + - 4.522877326491536 + - 1.4077028068532822 + - 5.643959148328305 + - 4.059181296735518 + - 1.6232826703852372 + - 3.681294920130097 + - 4.942726175011664 + - 4.383032411393862 + - 1.0349321825937619 + - 2.9635453796108555 + - 2.710608125985517 + - !!python/tuple + - 1.4747377921860076 + - 6.1775990047693465 + - 4.432833905902267 + - 1.3952910617686132 + - 5.543330649567577 + - 3.9480454212814635 + - 1.5979418488236 + - 3.601674695337567 + - 4.857732678677233 + - 4.282010624345925 + - 1.1447708420159322 + - 2.879283198430477 + - 2.630094683015929 + - !!python/tuple + - 1.0557908606636293 + - 5.89661878199545 + - 4.193584211580108 + - 1.3701015752799317 + - 5.284235511869266 + - 3.663569691853902 + - 1.5417247951198374 + - 3.3984922585236945 + - 4.639255080067356 + - 4.022917346130174 + - 1.2984820842051794 + - 2.6667490738719795 + - 2.4285405093316057 + - !!python/tuple + - 0.24955326304649605 + - 3.265590194866191 + - 2.1725555979795317 + - 1.2820858836259847 + - 2.5750159113559117 + - 1.0781514811791708 + - 1.1832252074485237 + - 1.6959014227232978 + - 2.545654277848313 + - 1.6910588496985004 + - 1.4698687129811396 + - 0.8890938722097048 + - 0.74071473722064 + - !!python/tuple + - 1.4813179656986535 + - 3.239515051645285 + - 2.1652579574805024 + - 1.2800992773131212 + - 2.5571572916378864 + - 1.118713775217955 + - 1.1957640295217467 + - 1.7010886471455002 + - 2.5124820952698017 + - 1.700340612088277 + - 1.446852141837628 + - 0.9691366642418585 + - 0.8705551071953783 + - !!python/tuple + - 1.2179527333171412 + - 3.127955754988917 + - 2.1197919895475117 + - 1.2634196123400139 + - 2.4589833309696565 + - 1.317790702543472 + - 1.2424867954329262 + - 1.728046675429899 + - 2.3359455571467467 + - 1.7419286317926517 + - 1.3355453365389156 + - 1.3115646398968435 + - 1.3246020079265168 + - !!python/tuple + - 0.841220193881689 + - 2.9074933393637434 + - 2.0492817719149614 + - 1.199996209880649 + - 2.312432908084552 + - 1.5276162869426064 + - 1.293354176908337 + - 1.7375429303708256 + - 2.017188946641521 + - 1.7788807173974734 + - 1.1911325869957592 + - 1.5105205390893102 + - 1.509790711845342 + - !!python/tuple + - 0.9854165810017044 + - 2.826585260205533 + - 2.040692647231558 + - 1.1920592278197355 + - 2.2693134781526174 + - 1.5591356781480645 + - 1.297647080317398 + - 1.7166938501196436 + - 1.9492054289184702 + - 1.7526261705871393 + - 1.2576624364881073 + - 1.4925738104315296 + - 1.4939452318638118 + - !!python/tuple + - 0.9226464859296848 + - 2.16360699149985 + - 1.959700971355139 + - 1.1957669181160575 + - 1.8007142665176814 + - 1.7841029776597848 + - 1.3350742920315963 + - 1.5459401485260114 + - 1.519684407121157 + - 1.5878043019421306 + - 1.5930886785556655 + - 1.3474425079081336 + - 1.3855275371460332 + - !!python/tuple + - 1.004757437633072 + - 2.1566085929678946 + - 1.783446294828907 + - 1.2246720505479198 + - 1.8686985961670541 + - 1.6839265363453295 + - 1.3197822406700808 + - 1.5677441419507399 + - 1.58092277728034 + - 1.6598772516314135 + - 1.3711869812595006 + - 1.45331413094975 + - 1.4334199443140838 + - !!python/tuple + - 0.9540971236002178 + - 2.1502053828223575 + - 1.8051945931639737 + - 1.175756745044928 + - 1.8671674736956285 + - 1.686704274608939 + - 1.318685584739334 + - 1.5217672802368134 + - 1.6580049152014347 + - 1.6452360079175559 + - 1.3556824584968934 + - 1.3999437317236554 + - 1.3888728700120054 + - !!python/tuple + - 0.9696558189116125 + - 2.1439300325902444 + - 1.812453060351046 + - 1.1620465293882314 + - 1.8915614279563866 + - 1.6884025425566487 + - 1.2912015517396753 + - 1.5248463154255754 + - 1.6221579119943597 + - 1.6420570037090625 + - 1.3162150484386452 + - 1.417168954508807 + - 1.4014204893961812 + - !!python/tuple + - 0.9643046532307968 + - 2.140179907777341 + - 1.814126664764163 + - 1.1654207711390001 + - 1.8872170159173454 + - 1.6836815242758227 + - 1.29734750256469 + - 1.5175569055030675 + - 1.6412118031734186 + - 1.6344435100911985 + - 1.321328097788643 + - 1.4083689880013939 + - 1.3951633261904623 + - !!python/tuple + - 0.9643843607662667 + - 2.1373865040961992 + - 1.8171061295641249 + - 1.1625577204769895 + - 1.8841338416012066 + - 1.6851232794122522 + - 1.2985693912853882 + - 1.5202121597280231 + - 1.6398223916941417 + - 1.6294963582775464 + - 1.3114200943554108 + - 1.4158431917682999 + - 1.3962640410934644 + - !!python/tuple + - 0.9643907821134972 + - 2.1360587194134273 + - 1.8219382882762485 + - 1.1608867853329796 + - 1.8827247159480445 + - 1.6859301015872286 + - 1.2989810755487958 + - 1.519241292833922 + - 1.639229267565815 + - 1.6273913744627901 + - 1.3094480733207572 + - 1.4162466692531548 + - 1.395979934447191 + - !!python/tuple + - 0.9643923983350331 + - 2.1354913080165305 + - 1.8200799918274808 + - 1.162659933568733 + - 1.8821340756484513 + - 1.6859072234509795 + - 1.2991317237234168 + - 1.520764781603416 + - 1.6389886042732984 + - 1.6265389693250523 + - 1.3080111420427678 + - 1.4179606813068573 + - 1.396407768862805 + - !!python/tuple + - 0.9643931536395622 + - 2.1351684064500285 + - 1.8212765107608921 + - 1.162222459412705 + - 1.8818007614736254 + - 1.6860988475435963 + - 1.2994340841075238 + - 1.5200850054002617 + - 1.6392790282465919 + - 1.6260649847562838 + - 1.3089345107910406 + - 1.4169718429659721 + - 1.3959085811592575 + - !!python/tuple + - 0.9643935299725784 + - 2.134989084355632 + - 1.8206785134282684 + - 1.1627508760618062 + - 1.8816165463574361 + - 1.6860894234305963 + - 1.29947141151061 + - 1.5205667645765497 + - 1.6392001461820525 + - 1.6258052289163196 + - 1.3084802422875985 + - 1.4175147174494058 + - 1.3960491589900377 + - !!python/tuple + - 0.9643936431933959 + - 2.134931848120863 + - 1.8204883246937464 + - 1.1629144288286872 + - 1.8815579062879257 + - 1.6860864334992305 + - 1.2995230771437523 + - 1.5206444396534011 + - 1.6392515959110614 + - 1.6257229307527599 + - 1.3085685616419942 + - 1.4175021449286762 + - 1.396017582141455 + - !!python/tuple + - 0.9643937071336568 + - 2.13489891992528 + - 1.8206118569301544 + - 1.162867314809387 + - 1.8815241994441774 + - 1.6861059402367515 + - 1.2995526102373283 + - 1.5205742132177495 + - 1.63928112837982 + - 1.6256756959725458 + - 1.308661840245576 + - 1.4174011497801449 + - 1.3959672459301034 + - !!python/tuple + - 0.9643937783156451 + - 2.1348618705551665 + - 1.8204885144755654 + - 1.1629726241616396 + - 1.8814862927395297 + - 1.6861039586375945 + - 1.2995857170681249 + - 1.520624615695271 + - 1.639314313890048 + - 1.625622621632252 + - 1.308718225241623 + - 1.4173934563798898 + - 1.3959470999023387 + - !!python/tuple + - 0.9643940341810362 + - 2.134727090047848 + - 1.8206117541920726 + - 1.1628770200942375 + - 1.8813484702418939 + - 1.686163871311504 + - 1.2997056549701773 + - 1.5205612433781484 + - 1.6394348616855345 + - 1.6254298399076237 + - 1.3089399242109252 + - 1.4172457845542201 + - 1.3958178779271335 + - !!python/tuple + - 0.9643941118864982 + - 2.1346842948274016 + - 1.820468480332657 + - 1.1629992627272823 + - 1.8813047982910773 + - 1.6861614044686142 + - 1.299713002404662 + - 1.520676028325931 + - 1.6394152810433067 + - 1.6253689705873011 + - 1.3088299112057875 + - 1.4173759019111412 + - 1.3958523677447128 + - !!python/tuple + - 0.964394212062138 + - 2.1346283501631893 + - 1.8205199923699857 + - 1.1629590452108844 + - 1.8812477444988447 + - 1.6861862038294675 + - 1.2997620400225525 + - 1.5206493089555975 + - 1.6394652001619194 + - 1.6252895398383242 + - 1.30892158007158 + - 1.4173143590191386 + - 1.3957990400930578 + - !!python/tuple + - 0.9643942200887247 + - 2.1346237848367857 + - 1.820524191236691 + - 1.1629557946131024 + - 1.8812430926139825 + - 1.6861882237304004 + - 1.2997627888502297 + - 1.5206531490757789 + - 1.6394630944798039 + - 1.6252830730488166 + - 1.3089104120279462 + - 1.4173241617059582 + - 1.3958008245392124 + - !!python/tuple + - 0.9643942296301662 + - 2.134618349857419 + - 1.8205291894893618 + - 1.1629519278209648 + - 1.8812375549711724 + - 1.6861906280322068 + - 1.2997675228461494 + - 1.5206505594624515 + - 1.6394679348591472 + - 1.6252753758591965 + - 1.3089192728481331 + - 1.4173182025767823 + - 1.3957956664631421 + - !!python/tuple + - 0.96439423591028 + - 2.134614766277341 + - 1.820532484750647 + - 1.1629493805978648 + - 1.881233904000607 + - 1.6861922130284488 + - 1.2997681079709162 + - 1.5206535743719363 + - 1.639466280735078 + - 1.625270301829123 + - 1.3089105047203244 + - 1.4173258982382257 + - 1.395797069059637 + - !!python/tuple + - 0.9643942433780023 + - 2.1346105000643076 + - 1.8205364074399975 + - 1.1629463500115316 + - 1.881229557796335 + - 1.6861940997201348 + - 1.2997718217372687 + - 1.5206515408736743 + - 1.6394700803543159 + - 1.6252642621537057 + - 1.308917462072476 + - 1.417321218368837 + - 1.3957930208877787 + - !!python/tuple + - 0.9643942482959237 + - 2.134607686628315 + - 1.8205389941102825 + - 1.1629443528889372 + - 1.881226691794201 + - 1.6861953437553048 + - 1.2997722794678068 + - 1.5206539082119488 + - 1.6394687809421251 + - 1.6252602798821665 + - 1.3089105772435452 + - 1.4173272607696512 + - 1.3957941232148996 + - !!python/tuple + - 0.9643942541452737 + - 2.1346043372870236 + - 1.8205420733167506 + - 1.1629419764951152 + - 1.881223280019661 + - 1.686196824614001 + - 1.2997751937328172 + - 1.520652311268161 + - 1.639471764054266 + - 1.625255539620679 + - 1.308916040597619 + - 1.417323585302639 + - 1.395790945475801 + - !!python/tuple + - 0.9643942541452737 + - 2.1346043372870236 + - 1.8205420733167506 + - 1.1629419764951152 + - 1.881223280019661 + - 1.686196824614001 + - 1.2997751937328172 + - 1.520652311268161 + - 1.639471764054266 + - 1.625255539620679 + - 1.308916040597619 + - 1.417323585302639 + - 1.395790945475801 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.25849264049485 + - 10.004583279558663 + - 10.004583279558663 + - 9.424850182603135 + - 10.004583279558663 + - 10.004583279558663 + - 9.390702755317172 + - 9.445944416712118 + - 10.004583279558663 + - 9.780152076706422 + - 10.004583279558663 + - 9.806036830299693 + - 9.378722635840912 + - !!python/tuple + - 7.239808403877648 + - 10.017062248320162 + - 9.811487081533679 + - 7.9023709690287856 + - 10.017062248320162 + - 9.40749462384464 + - 8.372874570642066 + - 7.937533501288342 + - 10.017062248320162 + - 9.281620104277117 + - 9.819130911353785 + - 9.277945001215306 + - 7.952941250907599 + - !!python/tuple + - 1.6500927812144122 + - 10.051689159615755 + - 9.27572191245968 + - 4.8637631977877245 + - 7.6472351374121645 + - 7.751090724635213 + - 5.55169439897251 + - 6.517750906258154 + - 10.051689159615755 + - 7.898836686823644 + - 7.8700835621585785 + - 8.162112603020153 + - 4.309499582155287 + - !!python/tuple + - 0.15430604332885411 + - 10.063433250953285 + - 9.094217959456369 + - 3.8572073913709755 + - 6.84638111694238 + - 7.191755419147733 + - 4.444440589110323 + - 6.106100054726686 + - 9.247943085704657 + - 7.917854967425641 + - 6.666783874330689 + - 8.023659697092121 + - 4.333213893713765 + - !!python/tuple + - 1.5854173914381837 + - 10.063782973268973 + - 9.085968589307914 + - 3.835175552265434 + - 6.826128421493025 + - 7.174413106455658 + - 4.421151226564066 + - 6.0860592119126435 + - 9.232700281490212 + - 7.913696920916162 + - 6.638675828642081 + - 8.009121966765706 + - 4.328779420765985 + - !!python/tuple + - 1.4674436700792812 + - 10.06475888280473 + - 9.062949070936567 + - 3.773767385841365 + - 6.769621332751902 + - 7.126024802349196 + - 4.356209972165363 + - 6.030148301090787 + - 9.190165688752044 + - 7.90209463091631 + - 6.560252989927907 + - 7.9685567978660945 + - 4.316414835030122 + - !!python/tuple + - 0.4912806992919623 + - 10.073309047040757 + - 8.861284109708372 + - 3.2375842139664464 + - 6.274765531461453 + - 6.7022309971056915 + - 3.788465594939085 + - 5.540640782116279 + - 8.817532491182687 + - 7.800465269542991 + - 5.873512165484415 + - 7.61322506620896 + - 4.208330081817698 + - !!python/tuple + - 1.1714691129614092 + - 10.075935898451513 + - 8.827075304850256 + - 3.051844145893112 + - 6.123427046788793 + - 6.596664047049125 + - 3.6182674935237173 + - 5.37900104730403 + - 8.703126860302342 + - 7.769300748745988 + - 5.722095097526798 + - 7.458333287600718 + - 4.117796887187945 + - !!python/tuple + - 0.5881220474201421 + - 10.082595883323679 + - 8.67008903233314 + - 2.6583854843296932 + - 5.740390387793888 + - 6.268047244425938 + - 3.1910670934556875 + - 5.0016356987457655 + - 8.413147512251108 + - 7.6903359272411755 + - 5.190922587447394 + - 7.1824461888147315 + - 4.037004612862356 + - !!python/tuple + - 1.1786243388599211 + - 10.087065177107812 + - 8.612037221640954 + - 2.3627319722572677 + - 5.484678344915602 + - 6.089555346046928 + - 2.913921995153954 + - 4.729478220265831 + - 8.218715330678853 + - 7.637430562023101 + - 4.936519527337615 + - 6.919397500900512 + - 3.8849120657507186 + - !!python/tuple + - 0.42240077449397384 + - 10.095592642518966 + - 8.411150271423729 + - 1.9200986732428036 + - 4.998856595364655 + - 5.671322455110053 + - 2.401636042096307 + - 4.254032858499054 + - 7.847994327985239 + - 7.536600947990473 + - 4.264006466472262 + - 6.567894409637395 + - 3.7875555517161485 + - !!python/tuple + - 1.142230605429744 + - 10.057219941760918 + - 8.389131873403093 + - 1.8982097430789253 + - 4.902909973900856 + - 5.588088571569381 + - 2.3088681665189945 + - 4.207860484619783 + - 7.774130876323687 + - 7.516523941212404 + - 4.163008253003102 + - 6.4877076173508215 + - 3.7359728442072746 + - !!python/tuple + - 0.7472884143865002 + - 10.061953012267459 + - 8.32839665244134 + - 1.6518030751479014 + - 4.638854421985991 + - 5.403158226847355 + - 2.0596325820813943 + - 3.92899035795356 + - 7.570416120276532 + - 7.4611564789887606 + - 3.9048018546734182 + - 6.212628272767915 + - 3.5806381873381046 + - !!python/tuple + - 1.2774616693312848 + - 9.712935418440008 + - 7.964489803166078 + - 1.7654743072995371 + - 3.7760985141845413 + - 4.507767577226341 + - 1.3140246863090121 + - 3.597027816884483 + - 6.9003074125464465 + - 7.279057208157907 + - 2.656876491810352 + - 5.759366026247702 + - 3.4678902064389434 + - !!python/tuple + - 0.8503715510157666 + - 9.717561268669916 + - 7.909803788139114 + - 1.4327119301656748 + - 3.806704469353442 + - 4.346690537601864 + - 1.1951154341167878 + - 3.1933314030199167 + - 6.909472902619396 + - 7.036819925745739 + - 2.6594228103949775 + - 5.523091231877896 + - 3.0390207839556025 + - !!python/tuple + - 0.6664899430863815 + - 9.153616702168245 + - 7.589797017567575 + - 0.9175806651126585 + - 3.98324153085844 + - 3.174988158290103 + - 1.1744902429760429 + - 0.8800360971052812 + - 5.832156077851515 + - 6.7473412570514535 + - 2.296165019772364 + - 4.144801389794488 + - 2.182995779812918 + - !!python/tuple + - 1.1060318168257242 + - 9.032698595533013 + - 7.464160447733337 + - 1.4105413266800437 + - 3.6906675911970535 + - 2.8977078625084425 + - 1.1837307202796596 + - 1.4407964527493178 + - 5.604410445480209 + - 6.685868535198363 + - 1.9282371832066478 + - 4.004118798966373 + - 2.216330488298437 + - !!python/tuple + - 0.5714436015786423 + - 8.849178319780382 + - 7.273692823356137 + - 1.585126684360854 + - 3.2546828947420043 + - 2.4929414877934626 + - 1.1883188597937868 + - 1.6140911576847843 + - 5.6311170090474665 + - 6.410140002544303 + - 1.5255525517180386 + - 3.7937789387973444 + - 1.7635078652093341 + - !!python/tuple + - 1.097564093655309 + - 8.853745972844994 + - 7.192817323115953 + - 1.4809380309593996 + - 3.0762838327149598 + - 2.368437798557969 + - 1.1370052200884535 + - 1.6529725889441511 + - 5.484275959734266 + - 6.291429949922999 + - 1.3873282315317181 + - 3.706631589080445 + - 1.8146866018190033 + - !!python/tuple + - 0.6882431800993298 + - 8.862905940895455 + - 6.868720068412935 + - 1.3752728281419326 + - 2.779482327807917 + - 1.8527300533111077 + - 1.1573646313068393 + - 1.7429069587526573 + - 5.230403700147195 + - 6.085761460635862 + - 1.2407092226199743 + - 3.5621636954739 + - 1.9206050077657766 + - !!python/tuple + - 0.9672073797947947 + - 8.799282168832136 + - 6.748290257767767 + - 1.3505005751712362 + - 2.822958638327771 + - 1.6488951140501729 + - 1.147280885902938 + - 1.7590042102359416 + - 5.242681204455654 + - 5.924682802005871 + - 1.4039201939808508 + - 3.445957502883912 + - 1.7069362101519086 + - !!python/tuple + - 0.7658608218877984 + - 8.61923100713843 + - 6.4078751356198005 + - 1.5412991120284862 + - 2.448534919897068 + - 1.1442565905691864 + - 1.2805408376348093 + - 1.79889655547869 + - 4.9092700067958726 + - 5.840770821649218 + - 1.3469245343659024 + - 3.121922794199638 + - 1.7278781666852383 + - !!python/tuple + - 0.9086865342750974 + - 8.625539855128524 + - 6.241304629911486 + - 1.2943117104697937 + - 2.5267111097901362 + - 1.1192345200487852 + - 1.1435710305394238 + - 1.811904141530328 + - 4.74742200575758 + - 5.614970049539772 + - 1.5010212887630427 + - 2.9709175993875254 + - 1.6913277719710986 + - !!python/tuple + - 0.860244108512324 + - 8.494011153958125 + - 5.994523767721248 + - 1.4679789197615216 + - 2.2741408603904754 + - 1.0495987592968608 + - 1.2446306367596844 + - 1.8281658198505064 + - 4.508751035067821 + - 5.555751839172061 + - 1.4149989123378046 + - 2.75381922196026 + - 1.711104098514132 + - !!python/tuple + - 0.8484999301362194 + - 8.497342846193586 + - 5.909930689966199 + - 1.351667695962545 + - 2.3206197568147804 + - 1.071372617449623 + - 1.1829644292710504 + - 1.8324774945833677 + - 4.520575405330484 + - 5.39489480606527 + - 1.5041644951352133 + - 2.6834079708626706 + - 1.5690184070837179 + - !!python/tuple + - 0.8905834758485344 + - 8.42423726107529 + - 5.738310681487729 + - 1.3652393523646165 + - 2.392710024342022 + - 1.0300885173151497 + - 1.2198144112681117 + - 1.6233348625064712 + - 4.389402860059235 + - 5.362934157171751 + - 1.501321661842756 + - 2.6017129883794237 + - 1.6502011022348468 + - !!python/tuple + - 0.8848045116031067 + - 8.36925963996109 + - 5.6361756227243385 + - 1.3459588469872223 + - 2.443771926816558 + - 1.0430203953420745 + - 1.1892637795682013 + - 1.6520441869027302 + - 4.404575677953172 + - 5.225009563921909 + - 1.5831648068369553 + - 2.520721589301943 + - 1.4923333281972022 + - !!python/tuple + - 0.8840152284357442 + - 8.323562472144042 + - 5.529347623978943 + - 1.417546867274582 + - 2.3582606802917105 + - 1.0288322554866103 + - 1.2105141232418188 + - 1.6826082866049097 + - 4.323030503370242 + - 5.20553829979694 + - 1.4956089885040782 + - 2.492360869838254 + - 1.5697427906919226 + - !!python/tuple + - 0.8828082492600724 + - 8.088312710593735 + - 4.980473923734888 + - 1.3990821936428137 + - 2.5835960614490343 + - 0.9877209351119549 + - 1.0925400109846135 + - 1.823554788604153 + - 3.9053430263273206 + - 4.855692931203914 + - 1.4927875018818055 + - 2.350751190650813 + - 1.8313277308763491 + - !!python/tuple + - 0.8843505371528974 + - 7.974766988133646 + - 4.774227768032913 + - 1.498196883230384 + - 2.359260566714273 + - 1.0647794684294445 + - 1.2250614515575247 + - 1.8353743227172543 + - 3.9451822997658694 + - 4.694810004862851 + - 1.4778451188067383 + - 2.202599101051293 + - 1.5015470317784039 + - !!python/tuple + - 0.9276604938671433 + - 7.88759294653816 + - 4.61809328814028 + - 1.3780535614469351 + - 2.4547751856268842 + - 1.1092394233248928 + - 1.223598488553675 + - 1.5787322229726823 + - 3.979339912709209 + - 4.367837666388796 + - 1.6439108437060201 + - 2.0758448342613876 + - 1.273113715644819 + - !!python/tuple + - 0.9110449477866279 + - 7.810231320253603 + - 4.4424422551679 + - 1.4544475937043455 + - 2.315106866681852 + - 1.082671836966246 + - 1.2230512232492157 + - 1.6672563079700733 + - 3.846630959034067 + - 4.1604470051971845 + - 1.499897342024334 + - 2.0704194028640424 + - 1.4783043591924985 + - !!python/tuple + - 0.9448354916080763 + - 7.0871074471771545 + - 3.1720724568282073 + - 1.5768216751431245 + - 1.0983647784246544 + - 1.3249597207320962 + - 1.2205731780040137 + - 2.1531574573750456 + - 2.6233552703003045 + - 2.241818550824574 + - 1.235407773533271 + - 1.4314130397398983 + - 1.9446443326352716 + - !!python/tuple + - 0.8943715445565734 + - 6.982394805688232 + - 3.0159905571971786 + - 1.4003361814305706 + - 1.641577871258195 + - 1.1750419784756378 + - 1.2219871437452168 + - 1.7836190150720448 + - 2.7185798810400112 + - 1.939437508635782 + - 1.5694323085279878 + - 1.4599287497914102 + - 1.545698351400504 + - !!python/tuple + - 0.9452931491329618 + - 6.829371057586006 + - 2.7971796320700846 + - 1.2450469804347484 + - 1.9983069280823393 + - 1.103771284658588 + - 1.2225688800480454 + - 1.3363674936178713 + - 2.5181223143661247 + - 1.7229578617073062 + - 1.7395788976595776 + - 1.4836092435418644 + - 1.55273412016662 + - !!python/tuple + - 0.9127412427431958 + - 6.763402105841104 + - 2.7097458019103007 + - 1.3284254604578218 + - 1.910381105466106 + - 1.1131134650222583 + - 1.1838258438713862 + - 1.48058193178749 + - 2.3928705208595558 + - 1.7019187174952422 + - 1.5744074392978364 + - 1.5714735665033275 + - 1.6726106246151788 + - !!python/tuple + - 0.9140292904499021 + - 6.699001856020535 + - 2.627583434988865 + - 1.3780331310575447 + - 1.8339396701264734 + - 1.116659653025634 + - 1.2019732363703368 + - 1.5647019209145818 + - 2.4641312106351103 + - 1.5733297029446274 + - 1.5673403661731995 + - 1.5826320422048699 + - 1.4862260537390872 + - !!python/tuple + - 0.9139657006717276 + - 6.654290962568998 + - 2.572844861410014 + - 1.3368761042543293 + - 1.9183912518650683 + - 1.1176745390769092 + - 1.2085323510803039 + - 1.459282717834883 + - 2.39254481597718 + - 1.5780585435938328 + - 1.6031347998546412 + - 1.5697657246578076 + - 1.5138580386061424 + - !!python/tuple + - 0.9139538391343508 + - 6.621774964544087 + - 2.5342491953765514 + - 1.3605604997532426 + - 1.8791454590008967 + - 1.118112736664988 + - 1.2117608510968063 + - 1.5047268255776705 + - 2.413614529881931 + - 1.545957017980902 + - 1.585810112846534 + - 1.5756080674573947 + - 1.4471953533142787 + - !!python/tuple + - 0.9139500857546535 + - 6.599332796561603 + - 2.5082363840070094 + - 1.3741680710810527 + - 1.8536605686756265 + - 1.1183258669785057 + - 1.2134710968415985 + - 1.5321401691359948 + - 2.378559219630813 + - 1.5504030084093607 + - 1.5631162929713773 + - 1.57921639782207 + - 1.473085448353594 + - !!python/tuple + - 0.9139486298995142 + - 6.585424566352463 + - 2.492387390862462 + - 1.3615731852158441 + - 1.8794862074525431 + - 1.1184310301518956 + - 1.2143618214063376 + - 1.5007624591091921 + - 2.357264935896106 + - 1.5529484411469698 + - 1.5744945533692165 + - 1.575350171124658 + - 1.4824380622492042 + - !!python/tuple + - 0.9236697953297333 + - 6.5645996268733935 + - 2.4807891370187902 + - 1.3728476252918733 + - 1.8687563325610614 + - 1.1219450308910115 + - 1.2205295604266342 + - 1.5185454582027538 + - 2.366552122025157 + - 1.5459360666990094 + - 1.5582811465077533 + - 1.5804757255831945 + - 1.4639579047884792 + - !!python/tuple + - 0.929530452150393 + - 6.548728495367198 + - 2.4720382371602807 + - 1.3682797100479678 + - 1.8864888353774973 + - 1.12431503171598 + - 1.2248094747570888 + - 1.501950606098721 + - 2.3543838041650074 + - 1.5502601044116158 + - 1.5571271614441056 + - 1.5804910068495108 + - 1.47304271814732 + - !!python/tuple + - 0.9316233020756582 + - 6.542018804500328 + - 2.4683672582113796 + - 1.371777797832456 + - 1.8829732834376496 + - 1.1252297859212634 + - 1.2264969902282803 + - 1.5076676037923313 + - 2.357390658979428 + - 1.5480361663058444 + - 1.5521349912011342 + - 1.5820755609663553 + - 1.4672349980075348 + - !!python/tuple + - 0.933119026097994 + - 6.536891080211326 + - 2.4655710259161316 + - 1.3703176231987633 + - 1.8886197382559076 + - 1.1259032562639792 + - 1.2277501776534605 + - 1.5024284275148772 + - 2.35348463313221 + - 1.5494113601872597 + - 1.5518273461411314 + - 1.5820643000161405 + - 1.4701303224572817 + - !!python/tuple + - 0.9341866912164117 + - 6.533041190195813 + - 2.4634769166848853 + - 1.369238203050309 + - 1.892834382936227 + - 1.1263947696037688 + - 1.2286708135260294 + - 1.4985405017880566 + - 2.3552125500591914 + - 1.5481417414944751 + - 1.5527283643218066 + - 1.5820559295981966 + - 1.4660266140707379 + - !!python/tuple + - 0.9349749681839379 + - 6.530090028468926 + - 2.4618747133441947 + - 1.3707688451923044 + - 1.8912657640009185 + - 1.1267636507252736 + - 1.2293651562399914 + - 1.5010794209759002 + - 2.352967786478681 + - 1.5489327502290542 + - 1.549692674700686 + - 1.5827440551286014 + - 1.468313779813067 + - !!python/tuple + - 0.9373833889272419 + - 6.520812115000676 + - 2.4568450362507996 + - 1.375538163273547 + - 1.8863506881633931 + - 1.1279047447947501 + - 1.231521117596776 + - 1.5090074407316059 + - 2.3571355895067496 + - 1.5458818216461403 + - 1.5429298267362892 + - 1.5848949892059212 + - 1.4603866375658332 + - !!python/tuple + - 0.939008964247575 + - 6.513945032496141 + - 2.4531394722202355 + - 1.3735036860677658 + - 1.8938898851603398 + - 1.1287068171753496 + - 1.2330551817510265 + - 1.5019659798576215 + - 2.3519025477517905 + - 1.5477558089702599 + - 1.5426508475920497 + - 1.5848417999696005 + - 1.4643835295931629 + - !!python/tuple + - 0.9393443142532654 + - 6.512430236211457 + - 2.4523248752826095 + - 1.3730640916906103 + - 1.8955400474483075 + - 1.1288771690811552 + - 1.233383939057783 + - 1.5004368455301689 + - 2.352584299170989 + - 1.5472612135103798 + - 1.5430349230688014 + - 1.5848302229506244 + - 1.4627893592463936 + - !!python/tuple + - 0.9397088166107403 + - 6.510759959714681 + - 2.4514273494412966 + - 1.3739115229285748 + - 1.894646540250409 + - 1.1290634680736438 + - 1.233744167786411 + - 1.5018672962378863 + - 2.353335374697378 + - 1.5467175709965981 + - 1.5418403233836446 + - 1.5852107876908408 + - 1.4613844570322085 + - !!python/tuple + - 0.9399775266498732 + - 6.509509005705595 + - 2.450755710762208 + - 1.3735469248071124 + - 1.8960083171309257 + - 1.1292017375771422 + - 1.234012097712641 + - 1.50060467250092 + - 2.3523846616242214 + - 1.5470568361257853 + - 1.5417923912008658 + - 1.585200320327125 + - 1.462109635655703 + - !!python/tuple + - 0.9402775410170259 + - 6.508095722961622 + - 2.4499973944997535 + - 1.3742619678796013 + - 1.8952514659373818 + - 1.1293568940824612 + - 1.2343132305781233 + - 1.5018145811932395 + - 2.351311348431557 + - 1.5474391268052279 + - 1.5403702764626541 + - 1.5855213302470872 + - 1.4632194503725435 + - !!python/tuple + - 0.9404938811848685 + - 6.507062917031378 + - 2.4494436221548344 + - 1.3739598372258763 + - 1.8963751360838792 + - 1.1294694149845876 + - 1.2345320096624406 + - 1.5007721874859503 + - 2.3517766185402302 + - 1.5471025396340654 + - 1.5406372128371124 + - 1.5855120584638698 + - 1.4621353422227454 + - !!python/tuple + - 0.9408266745691616 + - 6.505458638363409 + - 2.4485838833420757 + - 1.3747695728504146 + - 1.8955152671607134 + - 1.129643221753608 + - 1.2348703952164377 + - 1.5021450811555617 + - 2.352498904663022 + - 1.5465808359482747 + - 1.5394978437557312 + - 1.5858754950101939 + - 1.4607883687333014 + - !!python/tuple + - 0.9410708629751146 + - 6.504263541916212 + - 2.4479439443989133 + - 1.3744181145946421 + - 1.896815241197663 + - 1.1297715772347472 + - 1.2351208053367733 + - 1.5009378889306217 + - 2.3515911061260697 + - 1.5469053461861466 + - 1.53945802862336 + - 1.5858639357177973 + - 1.4614830561109655 + - !!python/tuple + - 0.9412775328600043 + - 6.503240631456334 + - 2.4473965360736347 + - 1.3749330422822053 + - 1.8962664173807546 + - 1.129880731519281 + - 1.2353340813986537 + - 1.501812942752825 + - 2.352051796487316 + - 1.5465731000812628 + - 1.5387340746232334 + - 1.5860949806682727 + - 1.4606258084533954 + - !!python/tuple + - 0.941429882376597 + - 6.502479299165481 + - 2.446989321061135 + - 1.3747087584822342 + - 1.8970939577760775 + - 1.1299615248578636 + - 1.2354921497513296 + - 1.5010444398025682 + - 2.35147365439442 + - 1.5467798537400923 + - 1.5387099556366823 + - 1.5860872889586457 + - 1.4610686950790603 + - !!python/tuple + - 0.9415047960504046 + - 6.502102253097503 + - 2.44678772736347 + - 1.374898241244935 + - 1.8968915300278484 + - 1.13000137315294 + - 1.2355701869285183 + - 1.5013669092173378 + - 2.3511874571821987 + - 1.5468820849843148 + - 1.5383329639754706 + - 1.5861722917082381 + - 1.461365821423144 + - !!python/tuple + - 0.9415592687265694 + - 6.5018271192263715 + - 2.4466406506673453 + - 1.374817214677446 + - 1.8971904030943214 + - 1.1300303917186987 + - 1.235627042971486 + - 1.5010894583357024 + - 2.351311444199355 + - 1.5467927282415688 + - 1.5384052877599301 + - 1.5861694702817564 + - 1.4610782467995942 + - !!python/tuple + - 0.9416903060220585 + - 6.501508594343578 + - 2.4465443405164624 + - 1.3749627543105494 + - 1.8971024657347344 + - 1.1301038387449456 + - 1.23572196368671 + - 1.501300602992924 + - 2.3514184440460664 + - 1.5467596347226147 + - 1.538251413250217 + - 1.586247604262475 + - 1.4609440031881482 + - !!python/tuple + - 0.941818869580396 + - 6.501195422517864 + - 2.4464496597371146 + - 1.3749450056723402 + - 1.8973435698937504 + - 1.130175963577072 + - 1.2358152024750537 + - 1.5011321127278 + - 2.351279523865495 + - 1.5468473372664506 + - 1.5382363352227266 + - 1.5862768558878093 + - 1.4610982098216028 + - !!python/tuple + - 0.9419801630176606 + - 6.500801707420352 + - 2.4463306417840105 + - 1.3751247960502238 + - 1.8972348239362937 + - 1.130266529427187 + - 1.2359323138775813 + - 1.5013930754940528 + - 2.3514117888798887 + - 1.546806399057116 + - 1.5380462363060923 + - 1.5863733765130377 + - 1.4609322609095508 + - !!python/tuple + - 0.9421648924475154 + - 6.5003496085386505 + - 2.4461939940082917 + - 1.375099017369115 + - 1.8975828414051235 + - 1.130370368898794 + - 1.23606663729474 + - 1.501149768848289 + - 2.3512112403410543 + - 1.5469329777249585 + - 1.5380246104169923 + - 1.5864155261988697 + - 1.4611548882004959 + - !!python/tuple + - 0.9423961328499894 + - 6.49978198495215 + - 2.4460224564614923 + - 1.3753580412984345 + - 1.8974259482590121 + - 1.130500517446331 + - 1.2362350621068803 + - 1.5015259918718886 + - 2.35140194811215 + - 1.5468738828517146 + - 1.5377507209644565 + - 1.5865545742009433 + - 1.4609155765069008 + - !!python/tuple + - 0.9426601424524407 + - 6.499131484805402 + - 2.445825913368627 + - 1.3753206257378052 + - 1.897926600828761 + - 1.1306493454098592 + - 1.2364277587648256 + - 1.5011757625975826 + - 2.3511133866718947 + - 1.5470559479336656 + - 1.537719896907453 + - 1.5866150587165193 + - 1.4612359285177405 + - !!python/tuple + - 0.9429895708051087 + - 6.498316298651189 + - 2.4455796692429757 + - 1.3756922442136996 + - 1.8977010477635756 + - 1.1308353890806202 + - 1.2366687826159535 + - 1.5017160495812487 + - 2.3513873102129725 + - 1.5469709273644665 + - 1.5373269224962958 + - 1.586814530100156 + - 1.4608921179519188 + - !!python/tuple + - 0.9435268999690313 + - 6.496979467914433 + - 2.445175969458829 + - 1.3756143985615223 + - 1.8987296616906606 + - 1.131139535336275 + - 1.2370631017748086 + - 1.5009958627689333 + - 2.3518363710372325 + - 1.546831669241452 + - 1.537517469196039 + - 1.5869383522478564 + - 1.460150409055181 + - !!python/tuple + - 0.9439896983691797 + - 6.495817840209741 + - 2.444825346219253 + - 1.3761432454036036 + - 1.8984074823340338 + - 1.1314024743049844 + - 1.2374044097182917 + - 1.5017661392751056 + - 2.351320829524722 + - 1.5471568829676006 + - 1.5367379460347905 + - 1.5872220873078644 + - 1.4608793723613187 + - !!python/tuple + - 0.9445890038595527 + - 6.494302004524944 + - 2.4443680003811923 + - 1.3760535169946853 + - 1.8995730211792643 + - 1.1317440719152017 + - 1.2378482870457572 + - 1.5009493521824016 + - 2.3518300893762514 + - 1.5469985479539592 + - 1.53695538096921 + - 1.5873616400361708 + - 1.4600383386859792 + - !!python/tuple + - 0.9451031255000981 + - 6.49298856112969 + - 2.443971934470907 + - 1.3766502849590752 + - 1.8992078194898643 + - 1.1320383527313413 + - 1.2382312057560625 + - 1.501820445108302 + - 2.351247142558185 + - 1.5473659563119972 + - 1.5360750588761152 + - 1.5876817037201187 + - 1.460862878537912 + - !!python/tuple + - 0.9457651645457905 + - 6.491282549898601 + - 2.4434577334189735 + - 1.3765474548546561 + - 1.900518555611727 + - 1.1324186808387666 + - 1.2387266780813297 + - 1.5009009803238338 + - 2.3518203801602944 + - 1.5471872128102786 + - 1.5363215153046093 + - 1.5878376872291395 + - 1.459916325277654 + - !!python/tuple + - 0.9463306596861498 + - 6.489808884382063 + - 2.443013835086588 + - 1.3772155136987048 + - 1.9001076533396588 + - 1.1327450821938683 + - 1.2391525551741502 + - 1.50187851127913 + - 2.3511662879119495 + - 1.5475990490022238 + - 1.535335172505242 + - 1.588195844521955 + - 1.4608418245265542 + - !!python/tuple + - 0.9470544302513183 + - 6.487904441837034 + - 2.4424404820106997 + - 1.3770984301713307 + - 1.9015695538034234 + - 1.1331645370821861 + - 1.239700575742469 + - 1.5008518536914373 + - 2.3518063074057727 + - 1.5473988384670767 + - 1.5356124692332032 + - 1.5883686267081343 + - 1.4597851780065947 + - !!python/tuple + - 0.9476698233810299 + - 6.486264833757706 + - 2.4419471986612233 + - 1.3778398482844467 + - 1.9011109600987286 + - 1.133523054490805 + - 1.2401697900884268 + - 1.5019396663999078 + - 2.351078520869083 + - 1.5478565617838405 + - 1.5345167621793345 + - 1.5887659369514289 + - 1.460815347047853 + - !!python/tuple + - 0.9484523346445075 + - 6.484157512274293 + - 2.4413135761538545 + - 1.3777074925429307 + - 1.9027270050833307 + - 1.133980980762511 + - 1.240769997023334 + - 1.5008033471135411 + - 2.3517868510236504 + - 1.54763419566418 + - 1.5348262648762865 + - 1.5889554777665122 + - 1.459646151820067 + - !!python/tuple + - 0.9491144781016528 + - 6.482349637298424 + - 2.4407704032180084 + - 1.378522726092148 + - 1.9022196236319464 + - 1.1343707042101285 + - 1.2412817863581052 + - 1.5020030331149739 + - 2.3509843283561436 + - 1.5481382953798972 + - 1.5336201951039652 + - 1.5893921289781077 + - 1.4607825777261418 + - !!python/tuple + - 0.9499506485307205 + - 6.4800395873687435 + - 2.440076805381561 + - 1.3783742851418417 + - 1.9039892118028479 + - 1.1348652788942346 + - 1.2419323308606443 + - 1.500757059030616 + - 2.351760955895844 + - 1.5478935451608482 + - 1.5339626799047776 + - 1.5895979220749952 + - 1.4595009362214466 + - !!python/tuple + - 0.9506546936234469 + - 6.47806510994358 + - 2.4394844584584257 + - 1.3792619309492329 + - 1.903433023050749 + - 1.1352843219625524 + - 1.2424846788166888 + - 1.502067560312765 + - 2.350884426084127 + - 1.5484433800235267 + - 1.5326479726655442 + - 1.5900731003947561 + - 1.4607427032880889 + - !!python/tuple + - 0.9515374117576821 + - 6.475557664840161 + - 2.4387327569732333 + - 1.3790968719322227 + - 1.9053515429052617 + - 1.1358125146798044 + - 1.243182143539786 + - 1.5007147342137106 + - 2.3517275973939964 + - 1.5481765498534552 + - 1.5330235060181268 + - 1.590294141849488 + - 1.459351601137554 + - !!python/tuple + - 0.9522769194004169 + - 6.473422631551512 + - 2.4380932804841504 + - 1.3800535212312344 + - 1.9047477383930922 + - 1.1362580118066026 + - 1.2437717486902973 + - 1.502132077508645 + - 2.350779735724965 + - 1.5487702461713444 + - 1.5316048455323616 + - 1.590805956034053 + - 1.4606950347210024 + - !!python/tuple + - 0.9531972819947315 + - 6.470728594456228 + - 2.4372869971035658 + - 1.3798716598249487 + - 1.9068063758327278 + - 1.1368156365317372 + - 1.2445111785947347 + - 1.5006781584709599 + - 2.3516858580281075 + - 1.548482217895857 + - 1.5320126950123878 + - 1.5910407476955961 + - 1.4592005002347606 + - !!python/tuple + - 0.9539644754908635 + - 6.468443560436401 + - 2.436603789556442 + - 1.3808918817321287 + - 1.9061574242348263 + - 1.1372838171934636 + - 1.2451335193262296 + - 1.5021953667332604 + - 2.3506713430874377 + - 1.549116644765107 + - 1.530497772371561 + - 1.5915862239648058 + - 1.460639077290335 + - !!python/tuple + - 0.9549121905808459 + - 6.465579130556395 + - 2.4357480568977246 + - 1.3806934363586358 + - 1.9083432530474473 + - 1.1378656790478556 + - 1.2459085732806412 + - 1.5006490359437359 + - 2.351635006640686 + - 1.5488088874517638 + - 1.5309363614688738 + - 1.5918328148418022 + - 1.4590501395927804 + - !!python/tuple + - 0.9556983304812453 + - 6.4631589803020715 + - 2.4350258022058733 + - 1.381769904844592 + - 1.907652884208572 + - 1.1383520168176429 + - 1.2465580694627505 + - 1.5022562434074607 + - 2.3505604415528136 + - 1.5494797190490335 + - 1.5293357124021125 + - 1.5924079691409527 + - 1.4605745914716226 + - !!python/tuple + - 0.956662245392737 + - 6.460145298641961 + - 2.43412720869221 + - 1.381555529002871 + - 1.9099492508715472 + - 1.1389521430465293 + - 1.247361283442831 + - 1.5006288641696726 + - 2.3515745696566883 + - 1.5491542590881642 + - 1.529802628010279 + - 1.5926640328935613 + - 1.45890302644376 + - !!python/tuple + - 0.9582035699881803 + - 6.455232722695133 + - 2.432664025253536 + - 1.3837319417287492 + - 1.9085414512037826 + - 1.1399193882554568 + - 1.2486593894854032 + - 1.5038918036519948 + - 2.3532256671581573 + - 1.5486260812374775 + - 1.5274923429414156 + - 1.5938260378909503 + - 1.4568498871537519 + - !!python/tuple + - 0.9598013812026059 + - 6.449977479168473 + - 2.4311015818353865 + - 1.3833364204198608 + - 1.9125427691814356 + - 1.1409351474032545 + - 1.2500287163182797 + - 1.5010394847835926 + - 2.3508882407460137 + - 1.5500845053715955 + - 1.5273261612955171 + - 1.5942624101843799 + - 1.4594784607116231 + - !!python/tuple + - 0.9616346418735822 + - 6.44374241864719 + - 2.4292513841482304 + - 1.3860759967951286 + - 1.9107427606018483 + - 1.1421167336338907 + - 1.25162923635906 + - 1.5051774875524953 + - 2.352986085909002 + - 1.5494053526308977 + - 1.524417307102511 + - 1.595723876523669 + - 1.45686565580178 + - !!python/tuple + - 0.9634899350922738 + - 6.4371771457102325 + - 2.427307643141631 + - 1.385549617683464 + - 1.9157312027791362 + - 1.143332124036081 + - 1.2532849486829913 + - 1.5015995438496146 + - 2.350065960682666 + - 1.5512201293685182 + - 1.5242411731348462 + - 1.5962521138613959 + - 1.4601500759116546 + - !!python/tuple + - 0.9655766546415612 + - 6.429479547755955 + - 2.4250341490154086 + - 1.3888970801922138 + - 1.9134889634965502 + - 1.144722539589485 + - 1.2551904932731663 + - 1.5067024711845112 + - 2.352659282675092 + - 1.5503684381689147 + - 1.5206861420676343 + - 1.5980359362620487 + - 1.4569143164218026 + - !!python/tuple + - 0.967632291216372 + - 6.421518896727517 + - 2.4226896178523756 + - 1.3882119743551924 + - 1.9195220862104607 + - 1.1461196750133553 + - 1.2571188047971158 + - 1.5023430590364213 + - 2.3491185737683176 + - 1.552558150849888 + - 1.520519213283389 + - 1.598651550304655 + - 1.4608972915851883 + - !!python/tuple + - 0.9698962183186497 + - 6.412302208269368 + - 2.4199831354744457 + - 1.3921702971114829 + - 1.916808969399647 + - 1.1476899582820566 + - 1.259301968207697 + - 1.5084438009851988 + - 2.352228429633572 + - 1.5515197333909874 + - 1.5163151856089692 + - 1.6007579888308505 + - 1.4570094307750547 + - !!python/tuple + - 0.9728519424316533 + - 6.39955414907845 + - 2.4162524336787996 + - 1.3909866240031439 + - 1.9264403451824066 + - 1.1497886487255242 + - 1.2622446229706419 + - 1.5014242246988867 + - 2.35651371367079 + - 1.5501028265674457 + - 1.5185533152353867 + - 1.6016970910974264 + - 1.4500124034496198 + - !!python/tuple + - 0.9750387258034835 + - 6.3893360555047245 + - 2.413276289409324 + - 1.3953183797393094 + - 1.9233758451374838 + - 1.1513927280784286 + - 1.264520597150932 + - 1.508206342092096 + - 2.351949331533056 + - 1.5529193025243369 + - 1.5119841497191442 + - 1.6039913005542599 + - 1.4566242988956564 + - !!python/tuple + - 0.9773868553624627 + - 6.377648571757322 + - 2.409885149670358 + - 1.3941571692576549 + - 1.9321500108637 + - 1.1531595127012306 + - 1.2670511576034171 + - 1.50177212159556 + - 2.3558814046327186 + - 1.5515953494282282 + - 1.514118069880344 + - 1.604801675323928 + - 1.450214355630304 + - !!python/tuple + - 0.9791305497166016 + - 6.368320855540292 + - 2.407190554639591 + - 1.3980524702981008 + - 1.9293100330396857 + - 1.1545100788953202 + - 1.269006623914519 + - 1.5079608282147752 + - 2.351715310811807 + - 1.5541468685702429 + - 1.5081844513980454 + - 1.606857909408576 + - 1.4562494932412797 + - !!python/tuple + - 0.9809924233901156 + - 6.3577794106885595 + - 2.404156024519076 + - 1.3969458696736143 + - 1.9371787619786671 + - 1.1559851853343868 + - 1.2711607967242438 + - 1.5021591097052203 + - 2.3552644663963664 + - 1.5529330221505557 + - 1.5101746295068317 + - 1.6075485677454433 + - 1.4504725948619919 + - !!python/tuple + - 0.9823829098375808 + - 6.349386352290082 + - 2.4017495617568083 + - 1.40040448660661 + - 1.934589866395586 + - 1.1571152936061282 + - 1.2728272807186918 + - 1.5077247479264542 + - 2.351516422960237 + - 1.555213171025453 + - 1.5048864941070472 + - 1.60936862819247 + - 1.4559013722418213 + - !!python/tuple + - 0.9838631983842491 + - 6.339989506724536 + - 2.3990638626787453 + - 1.3993727866771133 + - 1.941568823365466 + - 1.1583426284900356 + - 1.274651110718327 + - 1.5025544652278153 + - 2.354682302277311 + - 1.5541158584608845 + - 1.506711688814275 + - 1.6099530073553514 + - 1.4507555171664823 + - !!python/tuple + - 0.9849759273687687 + - 6.332516531289359 + - 2.3969356539113305 + - 1.4024165491286602 + - 1.9392378342015295 + - 1.1592860181594673 + - 1.2760651616408845 + - 1.5075070451510213 + - 2.3513456976576586 + - 1.5561337234133779 + - 1.502043365011865 + - 1.611550174951972 + - 1.455587185795428 + - !!python/tuple + - 0.9861589073082841 + - 6.324211304285882 + - 2.3945771724706466 + - 1.4014705992998742 + - 1.9453787817361372 + - 1.160306641454148 + - 1.2776054650928796 + - 1.5029386399032538 + - 2.3541454372944255 + - 1.5551522339526016 + - 1.5036957636853792 + - 1.6120427339990129 + - 1.4510421479096312 + - !!python/tuple + - 0.9870540785021256 + - 6.3176092857191355 + - 2.392708317346387 + - 1.4041324989342028 + - 1.9432996920173762 + - 1.16109408219946 + - 1.2788029386335427 + - 1.5073113640838194 + - 2.3511981973529545 + - 1.5569254089979878 + - 1.4996025722310447 + - 1.6134358891471616 + - 1.455308726786027 + - !!python/tuple + - 0.9880054161239555 + - 6.3103151347865305 + - 2.3906487673164074 + - 1.403276238269246 + - 1.9486722798324607 + - 1.1619437681082248 + - 1.2801028755189876 + - 1.5033001184788632 + - 2.3536583637611965 + - 1.556054604579814 + - 1.501083581838844 + - 1.6138503754269118 + - 1.4513193572645728 + - !!python/tuple + - 0.9887299195309387 + - 6.3045167614888395 + - 2.38901615255989 + - 1.4055937073117435 + - 1.9468313160184993 + - 1.1626018283827528 + - 1.2811163833127468 + - 1.5071383070147024 + - 2.3510702940685837 + - 1.5576046799773213 + - 1.4975123920118842 + - 1.6150604231123766 + - 1.4550648002197117 + - !!python/tuple + - 0.9931013847488662 + - 6.268326077493585 + - 2.378848927870716 + - 1.4198916241906074 + - 1.9353895941360604 + - 1.1666252474990666 + - 1.2873458404004814 + - 1.5308708747675546 + - 2.363282183915325 + - 1.5532466175312274 + - 1.482311481186673 + - 1.6225560239167345 + - 1.4401389574697225 + - !!python/tuple + - 0.9959295076070731 + - 6.238825300537221 + - 2.370677704769399 + - 1.4155049541295939 + - 1.9573208275486838 + - 1.1694891046404727 + - 1.2919446600705016 + - 1.5135254278473775 + - 2.3499817802320293 + - 1.5612632344137085 + - 1.4835538241304629 + - 1.6238804787972438 + - 1.4558578294933184 + - !!python/tuple + - 1.0110968103997982 + - 6.165915874987874 + - 2.3538943962379104 + - 1.4144930106952445 + - 1.9637882187431364 + - 1.1894754352825803 + - 1.3136533664772838 + - 1.480474112641065 + - 2.3781822629723006 + - 1.5596449577134175 + - 1.503399581096412 + - 1.634100596707245 + - 1.4243473787680456 + - !!python/tuple + - 1.0140794561739561 + - 6.14029008925667 + - 2.3481844728879424 + - 1.4275322486955422 + - 1.938749816265335 + - 1.194599356876043 + - 1.319755073016161 + - 1.5015844086503967 + - 2.3675199880308972 + - 1.5691188175820308 + - 1.4883170896715503 + - 1.6412727151435786 + - 1.4456005709106345 + - !!python/tuple + - 1.0358892995115647 + - 5.919645731567909 + - 2.2995822298532698 + - 1.4187939210940177 + - 1.9617726181940556 + - 1.2346524184930114 + - 1.3687094488010936 + - 1.406024718726015 + - 2.276733530017733 + - 1.6473963541170697 + - 1.5041840846289962 + - 1.6668696014747875 + - 1.5890518247075234 + - !!python/tuple + - 1.0344696810015224 + - 5.864184667224529 + - 2.302703278027743 + - 1.443719979929921 + - 1.9073003989663508 + - 1.278897820093008 + - 1.3302630110265083 + - 1.4605182078455163 + - 2.309758595272846 + - 1.6188314926114782 + - 1.5022038553012047 + - 1.6800032095544868 + - 1.534103716682499 + - !!python/tuple + - 1.032240960855218 + - 5.738454375771132 + - 2.2776016378396053 + - 1.4344475414941793 + - 1.9239619180224943 + - 1.2671751425604687 + - 1.3548672985878853 + - 1.4154662965834812 + - 2.3826228010803856 + - 1.5746319928873596 + - 1.5476054955396756 + - 1.6881274894759297 + - 1.4446968723572597 + - !!python/tuple + - 1.0319639307428665 + - 5.6857634226384075 + - 2.2677236584809974 + - 1.4593381419582558 + - 1.8736031940081528 + - 1.264101552979798 + - 1.3618932010380933 + - 1.4664321280317947 + - 2.3603150549421725 + - 1.5930837758329282 + - 1.512127028260629 + - 1.699202769491006 + - 1.4866932159600152 + - !!python/tuple + - 1.0315964932118025 + - 5.586450660409855 + - 2.2495925099362837 + - 1.4488173439418555 + - 1.8899208700314503 + - 1.2592346058008816 + - 1.3734276796635192 + - 1.4294757070416904 + - 2.3988655187235897 + - 1.5858328567114268 + - 1.534347617926058 + - 1.7031983339901036 + - 1.4370906836406077 + - !!python/tuple + - 1.031539151916464 + - 5.551162982129851 + - 2.243474402699846 + - 1.4645177151427224 + - 1.85710006323157 + - 1.2580329828679453 + - 1.3765473147621559 + - 1.4627145195941451 + - 2.383585928907286 + - 1.597629684785539 + - 1.5112610517988507 + - 1.709973572039221 + - 1.4659230069797957 + - !!python/tuple + - 1.0314469711369478 + - 5.480289125646441 + - 2.231409721604291 + - 1.4562398408897705 + - 1.869926395399328 + - 1.25588338883235 + - 1.3822894983124852 + - 1.436739813747998 + - 2.4104553892827063 + - 1.5919347511544646 + - 1.5273048586534457 + - 1.7118754003131875 + - 1.4332156812971282 + - !!python/tuple + - 1.0314014627806825 + - 5.421783101317937 + - 2.22181885431785 + - 1.450362653639049 + - 1.8798159618604013 + - 1.2545009771071587 + - 1.3862402689443807 + - 1.4183664277228305 + - 2.384717232346991 + - 1.6110127674075783 + - 1.5274310893858039 + - 1.7133103123309192 + - 1.4735825318985547 + - !!python/tuple + - 1.0313862481410383 + - 5.392477380539692 + - 2.2171637650502105 + - 1.4633890347079568 + - 1.8526675264282177 + - 1.2539355963048355 + - 1.3879496087524241 + - 1.4468499900734542 + - 2.3958668280708526 + - 1.6080499297634239 + - 1.5142552562691705 + - 1.7185986199213723 + - 1.4636166337847305 + - !!python/tuple + - 1.0313630523614197 + - 5.338857312823557 + - 2.2087800420766346 + - 1.457209471901925 + - 1.862664614560927 + - 1.2529965248828467 + - 1.3908648914792976 + - 1.4288159998206074 + - 2.372551400666729 + - 1.6242684396003 + - 1.515622085380755 + - 1.7194690989737738 + - 1.4973661863074228 + - !!python/tuple + - 1.0313483384427133 + - 5.289865101788447 + - 2.201341940266081 + - 1.4521634538139732 + - 1.8713374776465728 + - 1.2522838115402462 + - 1.393198884471363 + - 1.4141753059522517 + - 2.3999697372587394 + - 1.6063262342338644 + - 1.5324423132564764 + - 1.7202132937829682 + - 1.4651262469735478 + - !!python/tuple + - 1.0235183372663497 + - 5.2720051663608904 + - 2.1967490650946604 + - 1.4433415734026895 + - 1.8426373419009068 + - 1.2572043180978383 + - 1.394512988830404 + - 1.4266651490674782 + - 2.386337544792065 + - 1.6158498231908527 + - 1.5142745526772412 + - 1.7191240370777359 + - 1.487358154584688 + - !!python/tuple + - 1.0183926811369686 + - 5.257749777253537 + - 2.1931459907260007 + - 1.4234291768805662 + - 1.8475384480114003 + - 1.2607462986379971 + - 1.3954871618838187 + - 1.4048145594573926 + - 2.395822159475098 + - 1.6131438111264698 + - 1.5216603694757629 + - 1.7143487806586 + - 1.473402040972004 + - !!python/tuple + - 1.0195064625096433 + - 5.243071321362676 + - 2.1910458724635196 + - 1.430840849441362 + - 1.8343106655365649 + - 1.260169805370951 + - 1.3960302240589002 + - 1.4196255797232475 + - 2.4013692893962832 + - 1.6116024869945549 + - 1.5151671068009702 + - 1.7169964592017417 + - 1.4683816071629718 + - !!python/tuple + - 1.017277123143881 + - 5.236079404531059 + - 2.1893164153149796 + - 1.4213776245819478 + - 1.8368231298633346 + - 1.261796215771788 + - 1.3964660147314127 + - 1.409073180656768 + - 2.396005822507432 + - 1.615246344036658 + - 1.5163639913770675 + - 1.7146815182809656 + - 1.4753315740249056 + - !!python/tuple + - 1.0195290140517104 + - 5.208831832939838 + - 2.185477033274479 + - 1.4206317145311713 + - 1.842371968764103 + - 1.260634829474799 + - 1.3974130133346487 + - 1.4020864551104602 + - 2.406310415655404 + - 1.61229627693527 + - 1.522356935942391 + - 1.7152602967179984 + - 1.462087048302983 + - !!python/tuple + - 1.016737368712845 + - 5.200105930513457 + - 2.183364221602231 + - 1.4173215942399744 + - 1.8286995038247664 + - 1.262647564896894 + - 1.3979093610187534 + - 1.4086442005803725 + - 2.399564742761888 + - 1.616839886933333 + - 1.513698719169338 + - 1.7148190984292166 + - 1.4731097899313865 + - !!python/tuple + - 1.0146910388934496 + - 5.193070959476136 + - 2.181675447365182 + - 1.4081326729329051 + - 1.8313069696043134 + - 1.2641933672296704 + - 1.3982956491047345 + - 1.3982936230548135 + - 2.40419616193834 + - 1.6154788324502807 + - 1.517376701886391 + - 1.7125156698079123 + - 1.4665262948522195 + - !!python/tuple + - 1.0152506156289054 + - 5.187386491090854 + - 2.1808993057418498 + - 1.4112054964271086 + - 1.8262635750982261 + - 1.263907725143299 + - 1.3984694274609948 + - 1.4041312835989275 + - 2.401681596787461 + - 1.6171489419971847 + - 1.513770484102993 + - 1.7135571071966644 + - 1.4708982912769473 + - !!python/tuple + - 1.0144558985054697 + - 5.184501558134104 + - 2.1802136487152555 + - 1.4075025557807743 + - 1.8273466840067205 + - 1.2645223005846802 + - 1.3986214507797368 + - 1.399934239303876 + - 2.403577891137483 + - 1.616587897795133 + - 1.5152796234887218 + - 1.7126195619756945 + - 1.4682179406049114 + - !!python/tuple + - 1.0152073404743998 + - 5.17698006848446 + - 2.1791930084016395 + - 1.4075301098320276 + - 1.828955462437988 + - 1.2641364378829085 + - 1.398845794468706 + - 1.3981585160807242 + - 2.400251535352311 + - 1.6187860510432237 + - 1.515459004376038 + - 1.7127992470217772 + - 1.472924687696357 + - !!python/tuple + - 1.0141607102945385 + - 5.173177480216186 + - 2.1782954461145208 + - 1.4062792854079957 + - 1.8230736543582184 + - 1.2649423990295192 + - 1.3990405424707406 + - 1.4010837855638103 + - 2.402757440040226 + - 1.6180296426093312 + - 1.513078941382704 + - 1.7126270954473786 + - 1.4702939695464223 + - !!python/tuple + - 1.0132563265339072 + - 5.1697545993586465 + - 2.1774905577690618 + - 1.40194775870024 + - 1.8243801127010013 + - 1.2656529747833818 + - 1.3992131976115607 + - 1.3961403978332663 + - 2.405006937167638 + - 1.6173553303116013 + - 1.514879087568955 + - 1.7115204879821642 + - 1.467117426370485 + - !!python/tuple + - 1.0135485771627892 + - 5.16703039693913 + - 2.177125195444847 + - 1.4034604891133926 + - 1.8219801774388393 + - 1.2655034692804554 + - 1.3992907698160273 + - 1.3989546413249996 + - 2.4037995764214295 + - 1.6181488760423997 + - 1.5131614110483393 + - 1.7120235425723411 + - 1.4692116352555076 + - !!python/tuple + - 1.0128758521738352 + - 5.164421233006908 + - 2.176514629094975 + - 1.4001864859554438 + - 1.822981772657251 + - 1.2660373699734404 + - 1.3994198006912533 + - 1.395207036621261 + - 2.4017810533675528 + - 1.6194717909625094 + - 1.5136274452865375 + - 1.7111830706650366 + - 1.471813078447436 + - !!python/tuple + - 1.0131378581823103 + - 5.162031297964587 + - 2.1761954542944557 + - 1.4015236425362236 + - 1.8208792976460706 + - 1.2659033015674375 + - 1.3994867271791673 + - 1.3976817795997312 + - 2.402681464963189 + - 1.6191970439870056 + - 1.5126006588898093 + - 1.7116255288068067 + - 1.470999781633885 + - !!python/tuple + - 1.0127397395487094 + - 5.160461151975918 + - 2.1758294498584663 + - 1.3995648491037613 + - 1.8214854561113354 + - 1.266221286422096 + - 1.3995631608239107 + - 1.3954337450718295 + - 2.403714376051031 + - 1.6188826488841597 + - 1.513429570225202 + - 1.7111209274305086 + - 1.469537463042157 + - !!python/tuple + - 1.013066125863916 + - 5.157506918540095 + - 2.175436088333722 + - 1.399629540588959 + - 1.8221361431337293 + - 1.2660538324362864 + - 1.3996449236176043 + - 1.3947664410421006 + - 2.404824976829562 + - 1.6185455715152675 + - 1.5140973917433516 + - 1.7111971845362306 + - 1.4681306051783265 + - !!python/tuple + - 1.0131776391464213 + - 5.156479159554987 + - 2.1752994709833597 + - 1.4002060752718226 + - 1.8212326253002937 + - 1.265996106779687 + - 1.3996731776087403 + - 1.395832069838509 + - 2.404369304272753 + - 1.618843287165272 + - 1.5134504671348632 + - 1.7113875000229986 + - 1.4689190410849975 + - !!python/tuple + - 1.0129243081593489 + - 5.1554821611368356 + - 2.1750679270954265 + - 1.3989670435969155 + - 1.8216170439694144 + - 1.266197602487771 + - 1.3997209797875778 + - 1.3944115043771588 + - 2.4035968872118443 + - 1.619347409233769 + - 1.513627773839567 + - 1.7110674741060605 + - 1.4699149575775594 + - !!python/tuple + - 1.0126938880945102 + - 5.154565645105047 + - 2.174855286276631 + - 1.3986965805183058 + - 1.8202092117019657 + - 1.2663818371465145 + - 1.3997647493033216 + - 1.3951317934485976 + - 2.404199459871039 + - 1.61916343483811 + - 1.5130584919282066 + - 1.71102942217434 + - 1.469289407298776 + - !!python/tuple + - 1.0125375741576943 + - 5.153937788874554 + - 2.1747097506687036 + - 1.3979200235174327 + - 1.820452517687666 + - 1.2665074232659208 + - 1.3997946244207025 + - 1.3942388552378604 + - 2.403713042731439 + - 1.6194804271898442 + - 1.5131709561437934 + - 1.7108283539521787 + - 1.4699158650658344 + - !!python/tuple + - 1.0126015325228404 + - 5.153365459038205 + - 2.174633916356701 + - 1.398243403210101 + - 1.819950304083869 + - 1.2664744600539926 + - 1.3998101624236607 + - 1.3948330791188077 + - 2.403928267093177 + - 1.6194145928453882 + - 1.5129254259302733 + - 1.7109346204576772 + - 1.469723173728269 + - !!python/tuple + - 1.012507448056966 + - 5.152986087852498 + - 2.1745460611165113 + - 1.3977748345760734 + - 1.820097512711677 + - 1.2665501585449137 + - 1.399828145942341 + - 1.3942939478432816 + - 2.4041776307797704 + - 1.6193383610606868 + - 1.5131254487759906 + - 1.7108131964008162 + - 1.4693712993921302 + - !!python/tuple + - 1.0124316034388487 + - 5.152679027395378 + - 2.174474978627771 + - 1.39768568977087 + - 1.8196266093664066 + - 1.2666113032089177 + - 1.3998426797703651 + - 1.3945354630931623 + - 2.4043794090627237 + - 1.6192767188887485 + - 1.5129351778017917 + - 1.710800618408173 + - 1.4691622628560528 + - !!python/tuple + - 1.0123797955033162 + - 5.152468594376923 + - 2.174426279701843 + - 1.3974262425124573 + - 1.8197083944493508 + - 1.2666531372566743 + - 1.3998526278805195 + - 1.3942366526402685 + - 2.404216325718192 + - 1.6193829163118731 + - 1.5129729604169113 + - 1.7107333246051217 + - 1.4693723529962264 + - !!python/tuple + - 1.0123930452525745 + - 5.152351053078727 + - 2.174410724875526 + - 1.3974927956448588 + - 1.8196053382716082 + - 1.266646313484596 + - 1.3998558034011093 + - 1.3943586993213866 + - 2.4042605030331803 + - 1.619369411912418 + - 1.5129225742913859 + - 1.7107551645728432 + - 1.469332904477445 + - !!python/tuple + - 1.0123738318248552 + - 5.152272883198113 + - 2.1743926395538464 + - 1.3973964771482523 + - 1.81963572297776 + - 1.2666618390997972 + - 1.3998594947859218 + - 1.3942477533792623 + - 2.404311868187443 + - 1.6193537122062593 + - 1.5129637933435935 + - 1.7107301740548186 + - 1.469260501152315 + - !!python/tuple + - 1.0123956168925532 + - 5.152079687634424 + - 2.1743670768045065 + - 1.3974016822806792 + - 1.8196786677649055 + - 1.2666506179191794 + - 1.3998647111734865 + - 1.3942046340251835 + - 2.40422623650152 + - 1.6194094559037724 + - 1.5129692264696706 + - 1.7107352586191236 + - 1.469381173223265 + - !!python/tuple + - 1.0123710306865474 + - 5.151979671996045 + - 2.1743439414719674 + - 1.3973727957680944 + - 1.8195253511739564 + - 1.2666704804877342 + - 1.399869430668679 + - 1.3942833426932324 + - 2.404291960613754 + - 1.6193893577597276 + - 1.512907297004433 + - 1.7107311787085469 + - 1.4693130774385166 + - !!python/tuple + - 1.0123486779919848 + - 5.151888645476202 + - 2.174322887580958 + - 1.397260676794362 + - 1.8195607477585385 + - 1.2666885481313888 + - 1.3998737242847366 + - 1.394154173625194 + - 2.404351773336165 + - 1.619371070615187 + - 1.5129553012825214 + - 1.7107020819532923 + - 1.4692287696786803 + - !!python/tuple + - 1.012356764424201 + - 5.15181703200744 + - 2.174313414933389 + - 1.3973012537991367 + - 1.8194979689827941 + - 1.2666843826266576 + - 1.39987565556297 + - 1.3942285479017966 + - 2.4043200296266733 + - 1.6193917321223938 + - 1.5129103621710969 + - 1.7107153914171558 + - 1.4692835639166226 + - !!python/tuple + - 1.0123395034717748 + - 5.151746697695169 + - 2.1742971491314798 + - 1.3972146411227386 + - 1.819525323105165 + - 1.2666983379625953 + - 1.3998789714226207 + - 1.3941287561047497 + - 2.4042655208066472 + - 1.6194272084611312 + - 1.5129229969671332 + - 1.7106929111215252 + - 1.4693537586636756 + - !!python/tuple + - 1.0123467415853187 + - 5.151682629234547 + - 2.1742886754605117 + - 1.3972509501481951 + - 1.8194691605603144 + - 1.2666946093395937 + - 1.3998806984593524 + - 1.3941952987581534 + - 2.4042895999871243 + - 1.6194198431007452 + - 1.5128955378559343 + - 1.710704819159084 + - 1.4693322580484316 + - !!python/tuple + - 1.0123362855204674 + - 5.151640005064643 + - 2.1742788190517155 + - 1.3971984690813923 + - 1.819485740216895 + - 1.2667030642961632 + - 1.3998827070962934 + - 1.3941348278400791 + - 2.4043176087089853 + - 1.6194112763390098 + - 1.5129180185375852 + - 1.7106911964469962 + - 1.46929277619673 + - !!python/tuple + - 1.0123247914301494 + - 5.151593128153266 + - 2.174267979701127 + - 1.3971849683927395 + - 1.819413895479314 + - 1.2667123606954165 + - 1.3998849157674007 + - 1.3941717329932939 + - 2.404348411002576 + - 1.6194018558633536 + - 1.512888999118396 + - 1.7106892887240195 + - 1.4692608733560086 + - !!python/tuple + - 1.0123315721422168 + - 5.151512831235186 + - 2.174263602123735 + - 1.397152334017885 + - 1.819431260780696 + - 1.2667058453014006 + - 1.3998942164461343 + - 1.3941329719203943 + - 2.4043255921381212 + - 1.6194242108710097 + - 1.5128901125815506 + - 1.710683988393187 + - 1.469300684341287 + - !!python/tuple + - 1.0123495190734075 + - 5.1513002240514325 + - 2.1742520117496626 + - 1.397065938204763 + - 1.8194772370945733 + - 1.2666885973876585 + - 1.3999188389609782 + - 1.3940303564644592 + - 2.404389676849814 + - 1.6194220783404705 + - 1.5129232909753434 + - 1.710669955441936 + - 1.4692388023059415 + - !!python/tuple + - 1.0123725594975936 + - 5.151186832409638 + - 2.17424727914397 + - 1.3971095560026707 + - 1.8194277894383861 + - 1.2666709035799562 + - 1.399928890066932 + - 1.3941032960074657 + - 2.4043650026126553 + - 1.6194462477286917 + - 1.5128791653371303 + - 1.7106871088887008 + - 1.4692939073735924 + - !!python/tuple + - 1.0124112021823042 + - 5.150728003144835 + - 2.1742222691565702 + - 1.3971000724425249 + - 1.8191664854073881 + - 1.266633719095258 + - 1.399982000204481 + - 1.394295706983601 + - 2.4042346074175724 + - 1.6195739660419792 + - 1.5126704443411372 + - 1.7107091455616734 + - 1.4695674491022808 + - !!python/tuple + - 1.0124558624231978 + - 5.150196576142163 + - 2.174193307876472 + - 1.3968841638787912 + - 1.8192815247448872 + - 1.2665906982705164 + - 1.4000434640348056 + - 1.3940390479859284 + - 2.4043948134240254 + - 1.6195685432883993 + - 1.5127535443868858 + - 1.7106740550564536 + - 1.4694125462724943 + - !!python/tuple + - 1.0125672695302228 + - 5.148867582842907 + - 2.174120898512026 + - 1.3963447270071738 + - 1.8195690958232484 + - 1.2664832481243466 + - 1.400197029328165 + - 1.3933978019193203 + - 2.404795389093204 + - 1.6195549901473687 + - 1.5129612080750137 + - 1.710586344833939 + - 1.4690254768892095 + - !!python/tuple + - 1.0126590314915362 + - 5.147766052647199 + - 2.1740609176470342 + - 1.396323478959872 + - 1.8189415929750805 + - 1.2663944709475827 + - 1.4003240140731643 + - 1.3938611818244382 + - 2.4044821500681914 + - 1.619861495583373 + - 1.5124599527574343 + - 1.7106393627040177 + - 1.469682693404202 + - !!python/tuple + - 1.0128278067900256 + - 5.145729487007964 + - 2.17395007603116 + - 1.395498829569491 + - 1.8193828749529362 + - 1.2662307666355208 + - 1.400558335805438 + - 1.392879100488667 + - 2.405095987956542 + - 1.619840033854112 + - 1.5127790571929765 + - 1.7105050121587477 + - 1.4690886384829682 + - !!python/tuple + - 1.012965935308715 + - 5.144046613709392 + - 2.173858566993546 + - 1.3954689394757538 + - 1.8184243489544976 + - 1.266096150737569 + - 1.400751270337755 + - 1.3935887025062306 + - 2.4046172008696973 + - 1.6203077979289398 + - 1.5120136085289333 + - 1.7105861544712881 + - 1.470092656013095 + - !!python/tuple + - 1.0132184364581305 + - 5.1409457692896465 + - 2.1736900790931326 + - 1.3942179665686931 + - 1.819097640775242 + - 1.2658491058947807 + - 1.4011057195611978 + - 1.392094735231602 + - 2.4055517985783186 + - 1.6202735144748872 + - 1.512501507102625 + - 1.7103817290780814 + - 1.469186065330741 + - !!python/tuple + - 1.013423117422426 + - 5.138395026573648 + - 2.173551671978482 + - 1.3941785796499784 + - 1.8176451396275455 + - 1.2656473936353023 + - 1.4013957023203187 + - 1.3931741172619756 + - 2.4048255608643907 + - 1.6209813504619177 + - 1.5113421173005663 + - 1.7105050476361057 + - 1.4707077392567074 + - !!python/tuple + - 1.0137938942171887 + - 5.1337183881497745 + - 2.173298197378287 + - 1.3923024448258385 + - 1.8186637794445835 + - 1.265279821619837 + - 1.4019249916955814 + - 1.390924009094513 + - 2.4062350481350485 + - 1.6209259914157406 + - 1.5120825828200481 + - 1.7101970468331622 + - 1.4693357013922799 + - !!python/tuple + - 1.0140902381233428 + - 5.129896731064691 + - 2.1730914922426416 + - 1.3922567439576792 + - 1.816488351198015 + - 1.2649828107192753 + - 1.4023539736589028 + - 1.3925497959716413 + - 2.405145751847942 + - 1.621983902515461 + - 1.5103473470725692 + - 1.7103825522752456 + - 1.4716152640657814 + - !!python/tuple + - 1.0146200580055105 + - 5.122939537447968 + - 2.1727158302890706 + - 1.389489197421809 + - 1.8180108030454845 + - 1.2644470622831674 + - 1.4031296979457681 + - 1.3892093059752537 + - 2.4072424331201967 + - 1.621893466102449 + - 1.5114591214745363 + - 1.7099250522907496 + - 1.4695637588543615 + - !!python/tuple + - 1.0150350080253199 + - 5.1173072406344415 + - 2.172412646133084 + - 1.3894508208072014 + - 1.8148064428108657 + - 1.264020575936196 + - 1.4037500601103166 + - 1.391624017015103 + - 2.405634409234751 + - 1.6234469159608775 + - 1.5089057580456897 + - 1.7102000636909114 + - 1.4729226702236295 + - !!python/tuple + - 1.0157633724504385 + - 5.107153367465961 + - 2.1718674333665398 + - 1.3854619501701124 + - 1.8170435088962882 + - 1.2632621077219728 + - 1.404857450880898 + - 1.386763562020313 + - 2.4086941247843154 + - 1.623297738291902 + - 1.5105500767409878 + - 1.7095338691528974 + - 1.469906669281498 + - !!python/tuple + - 1.016317942405935 + - 5.099037417374294 + - 2.171433611561309 + - 1.3854669245074065 + - 1.8124298932892864 + - 1.2626706746574667 + - 1.4057269218904478 + - 1.390281685251864 + - 2.406371510909409 + - 1.625524360916838 + - 1.5068791664845622 + - 1.7099335122608486 + - 1.4747452410722797 + - !!python/tuple + - 1.0167960140531394 + - 5.091765818287734 + - 2.172407827882986 + - 1.3823747336883765 + - 1.8140473102064647 + - 1.2661882413666758 + - 1.4022499083389866 + - 1.386816445046407 + - 2.408562280431171 + - 1.6247375804731652 + - 1.5093895932122705 + - 1.7094580117305607 + - 1.4708043078163149 + - !!python/tuple + - 1.0178592248498881 + - 5.075027301921963 + - 2.171508240060589 + - 1.3824811352763933 + - 1.8045679660351446 + - 1.264848371286581 + - 1.4041219896865789 + - 1.3940748159051837 + - 2.4135936274939294 + - 1.6244665627726036 + - 1.504227378917408 + - 1.7102839694673417 + - 1.4675671481917785 + - !!python/tuple + - 1.01895140986052 + - 5.056381786517345 + - 2.1705136106390994 + - 1.3753856909354203 + - 1.8088412892853125 + - 1.2634157320892545 + - 1.4061463269036814 + - 1.3850520733249772 + - 2.408219107734691 + - 1.6295630206309302 + - 1.5047187781300346 + - 1.7090571677822075 + - 1.4768868805036206 + - !!python/tuple + - 1.0197962726992744 + - 5.040593539146199 + - 2.1726392616966135 + - 1.375069567116584 + - 1.7999564209273204 + - 1.2710366072952293 + - 1.3985730523932476 + - 1.3919591993981337 + - 2.4129730801721556 + - 1.6277789702143077 + - 1.5028002847798316 + - 1.7098435341848415 + - 1.4698555785888716 + - !!python/tuple + - 1.020890926671449 + - 5.01852566387466 + - 2.1714484881481435 + - 1.3669690220624842 + - 1.8051066453574969 + - 1.2690077915402718 + - 1.401191948336593 + - 1.3813516339283536 + - 2.406608524234998 + - 1.6337348182165345 + - 1.5034284237275515 + - 1.708399247981574 + - 1.4808216859771601 + - !!python/tuple + - 1.0221259774477165 + - 4.990803475061863 + - 2.1699672566447044 + - 1.3679587367274215 + - 1.7895698517465382 + - 1.2665927239789083 + - 1.4043538246095995 + - 1.3936891242843938 + - 2.414983953401293 + - 1.6329995075216173 + - 1.4950938845210684 + - 1.7098001083465857 + - 1.4750180808151219 + - !!python/tuple + - 1.022843960354306 + - 4.972329269604679 + - 2.17246578933304 + - 1.360683610121752 + - 1.7940541084541723 + - 1.2753894010821227 + - 1.3955285352358133 + - 1.3847330634701847 + - 2.420516825573634 + - 1.6308342045945134 + - 1.501817212063433 + - 1.708589451302843 + - 1.4649561899668253 + - !!python/tuple + - 1.0243778090839932 + - 4.92920190461369 + - 2.1701359965132103 + - 1.3460109475063242 + - 1.8043636550411777 + - 1.270963213966184 + - 1.4008990036834723 + - 1.3645236945161787 + - 2.407930835073035 + - 1.642354203845433 + - 1.503110041163536 + - 1.7058129259054093 + - 1.4867763511680554 + - !!python/tuple + - 1.0257760673825806 + - 4.880193559622182 + - 2.167539189053207 + - 1.3498092850467838 + - 1.7768288961785383 + - 1.2664462008189663 + - 1.4065347358948805 + - 1.3879945557167417 + - 2.422767533040492 + - 1.640572643326862 + - 1.48834563076437 + - 1.7084247832257882 + - 1.4760362286325233 + - !!python/tuple + - 1.0264514147422727 + - 4.849682485450651 + - 2.171720640585701 + - 1.3388366064615826 + - 1.784609704070907 + - 1.2810517818336467 + - 1.3917734304184775 + - 1.3734566252589118 + - 2.4318637195902526 + - 1.6367181297185798 + - 1.499808818914948 + - 1.70645797077892 + - 1.4592943764111168 + - !!python/tuple + - 1.027003978769522 + - 4.82067819531388 + - 2.170156213550539 + - 1.341520482548954 + - 1.76875252377144 + - 1.2776681127512874 + - 1.3956041981642038 + - 1.3868914340636496 + - 2.4232409021105723 + - 1.6443107268025556 + - 1.4870083791960806 + - 1.7079902079437905 + - 1.4772539544029017 + - !!python/tuple + - 1.0277751823766732 + - 4.7740236913551675 + - 2.16767212057428 + - 1.3273530396160231 + - 1.7810182952776017 + - 1.2725942627696356 + - 1.4014448466136005 + - 1.364699740499915 + - 2.437178316846294 + - 1.6425042597768813 + - 1.496170399749854 + - 1.7049952130990425 + - 1.4629149379183788 + - !!python/tuple + - 1.028202993776779 + - 4.741145034117332 + - 2.1659578138925597 + - 1.3312020491595402 + - 1.7630860455746478 + - 1.2694130535089807 + - 1.405218826657732 + - 1.3805414216544898 + - 2.427309996440495 + - 1.6509246322396216 + - 1.481788659462882 + - 1.7067864375592678 + - 1.4831519463460225 + - !!python/tuple + - 1.0285067368276761 + - 4.713684530575172 + - 2.1697660856126126 + - 1.3223262529306843 + - 1.7704732794508677 + - 1.282440520229095 + - 1.3919154002822214 + - 1.367761327706017 + - 2.435504142729468 + - 1.6471146828605594 + - 1.4924453388343473 + - 1.7050504173743783 + - 1.4676879036043244 + - !!python/tuple + - 1.0287584102783984 + - 4.687674567722158 + - 2.1683793210610793 + - 1.3256615123330844 + - 1.7564925194909227 + - 1.2793013047987167 + - 1.3953652471753701 + - 1.380172552374973 + - 2.427690394438035 + - 1.6536597919387712 + - 1.4811813623265617 + - 1.706469998169968 + - 1.4835448203387052 + - !!python/tuple + - 1.0290228662756127 + - 4.6566647212917935 + - 2.166745042364768 + - 1.3172266541749624 + - 1.7650441503790033 + - 1.2757863354133647 + - 1.399285145561855 + - 1.3657254661253964 + - 2.440888429870772 + - 1.6465418884550482 + - 1.490389746968103 + - 1.7045144773514758 + - 1.4706485801290157 + - !!python/tuple + - 1.029207292097562 + - 4.6314741631198775 + - 2.1654357345380157 + - 1.3207466196671356 + - 1.7515905022293536 + - 1.2731399856193049 + - 1.4022924539114217 + - 1.377880110079273 + - 2.4332527426904584 + - 1.652914695824749 + - 1.4795286602205397 + - 1.705906857688349 + - 1.4859305639193072 + - !!python/tuple + - 1.0293441795443357 + - 4.61034701263019 + - 2.1683868598730434 + - 1.3143579572281554 + - 1.757529597977662 + - 1.2830238064088766 + - 1.3921148222093702 + - 1.3681026435162353 + - 2.4395468333466015 + - 1.6499208133744148 + - 1.4878455002745072 + - 1.7045828794736702 + - 1.473879004338202 + - !!python/tuple + - 1.0177501826762165 + - 4.572307999968407 + - 2.1655992164621485 + - 1.3012754376507638 + - 1.7395172215217307 + - 1.2779582520782624 + - 1.3991192205805358 + - 1.3446958482595646 + - 2.4235636845348445 + - 1.6630806967110754 + - 1.490561074285958 + - 1.7013484498650295 + - 1.5002324401103153 + - !!python/tuple + - 1.019890706493292 + - 4.53688608424028 + - 2.1637702949298205 + - 1.3075170767810604 + - 1.721365439127364 + - 1.2740344575837181 + - 1.4033771228000995 + - 1.3633716960301756 + - 2.438779672442784 + - 1.654533127790134 + - 1.4836000560896336 + - 1.703429435116063 + - 1.488164669481672 + - !!python/tuple + - 1.0214153356436628 + - 4.506581731160424 + - 2.168049505242533 + - 1.2992010015391875 + - 1.7308111988481336 + - 1.2882156600826613 + - 1.3886458548480316 + - 1.350140803403221 + - 2.4477940349435534 + - 1.6501626140547476 + - 1.4953969805628378 + - 1.7015975444113705 + - 1.4706882347273718 + - !!python/tuple + - 1.01759091847222 + - 4.491609929343513 + - 2.1669473469193434 + - 1.3029751962714904 + - 1.707390356980122 + - 1.2859494072298145 + - 1.3915597814505007 + - 1.3609023046637496 + - 2.441395283456505 + - 1.6553764520851686 + - 1.4862077286450932 + - 1.702817440710215 + - 1.4833937224963691 + - !!python/tuple + - 1.0060107566606673 + - 4.441335285059087 + - 2.1632803602474633 + - 1.287328173657162 + - 1.686785957017431 + - 1.2787066808681093 + - 1.4009721427675117 + - 1.330694894406116 + - 2.4621477736867767 + - 1.6517569990652312 + - 1.500229416261212 + - 1.6986310235689124 + - 1.4609143793317392 + - !!python/tuple + - 0.9957248399082576 + - 4.373781087766902 + - 2.1585058231218635 + - 1.269657299793354 + - 1.661001579264226 + - 1.2705752771833463 + - 1.4120195591983682 + - 1.2958599124713601 + - 2.4326643080540706 + - 1.6752343371254952 + - 1.5033417441758437 + - 1.6933894893775914 + - 1.5102777368344076 + - !!python/tuple + - 0.993879776969168 + - 4.350780873775553 + - 2.1631552979882933 + - 1.2764878908235668 + - 1.6269745289687272 + - 1.2868373569774998 + - 1.395800756247229 + - 1.316404211802308 + - 2.4464714908563128 + - 1.6639724674386247 + - 1.5023311108307005 + - 1.6955579796583655 + - 1.4907437505979844 + - !!python/tuple + - 1.0063404517923042 + - 4.281984426839536 + - 2.159642575541836 + - 1.2652803661726642 + - 1.655734504280748 + - 1.2776389829999595 + - 1.404603532344599 + - 1.292910926152798 + - 2.4669721738462265 + - 1.6597144947669282 + - 1.5145661074012697 + - 1.6919179605476171 + - 1.467618870816652 + - !!python/tuple + - 1.0026433311013927 + - 4.258387162753693 + - 2.15801272024162 + - 1.2740623342577306 + - 1.6207361353374363 + - 1.2748459375627397 + - 1.4082932577244622 + - 1.3143893615404825 + - 2.4564771140645054 + - 1.6677319030358344 + - 1.498857284817065 + - 1.6942120773516898 + - 1.488187924515747 + - !!python/tuple + - 0.9990977466436622 + - 4.231286867819494 + - 2.163557024028295 + - 1.2665305725181453 + - 1.6130703016624348 + - 1.2938014147651162 + - 1.38924480634434 + - 1.301562960272602 + - 2.467687832455414 + - 1.6616224932768655 + - 1.5129407273175952 + - 1.6922518647460085 + - 1.4659967760420998 + - !!python/tuple + - 0.9942135510443357 + - 4.18508568939946 + - 2.1602219649268015 + - 1.2575425424635012 + - 1.6005710598384653 + - 1.2857784228203781 + - 1.398376562888985 + - 1.2815463958940478 + - 2.447026458554999 + - 1.6772555529580795 + - 1.5138728358512648 + - 1.6890357858383227 + - 1.4998444670931457 + - !!python/tuple + - 0.9917179605454791 + - 4.149700049214875 + - 2.1577406139718347 + - 1.2517715402319614 + - 1.5917256502741792 + - 1.280562542044375 + - 1.3921899658245427 + - 1.3154151298248649 + - 2.4585668833560073 + - 1.6642451986207079 + - 1.5021519888239787 + - 1.6926603427280222 + - 1.4826042139793696 + - !!python/tuple + - 0.9896717172877603 + - 4.110562897597967 + - 2.155056467396589 + - 1.246195683194167 + - 1.582525358578211 + - 1.275474151074616 + - 1.3996768566547688 + - 1.2965670253689188 + - 2.4410970637553726 + - 1.6774326163302113 + - 1.5038419898751143 + - 1.6898901534636723 + - 1.5100358288831772 + - !!python/tuple + - 0.9889795620734811 + - 4.091940060087126 + - 2.15896242083479 + - 1.2428334066366726 + - 1.578441983167345 + - 1.2886504582444682 + - 1.3868169526040883 + - 1.2887100257495496 + - 2.452478730931449 + - 1.6680213516334874 + - 1.515906841416779 + - 1.6886443393416926 + - 1.4910626277157717 + - !!python/tuple + - 0.9886226671926653 + - 4.080795272613506 + - 2.1581835882346887 + - 1.2416106996408331 + - 1.576077610819852 + - 1.2868824179190699 + - 1.3891246847533794 + - 1.2842946443887664 + - 2.4571880559773818 + - 1.6669651041866953 + - 1.5184159618397595 + - 1.68791833688588 + - 1.4857051554888367 + - !!python/tuple + - 0.9884773153545205 + - 4.07584532037306 + - 2.15784005803924 + - 1.2410900573816532 + - 1.5750480168559597 + - 1.2861261508280455 + - 1.388373522282935 + - 1.289036485388739 + - 2.4535775559977546 + - 1.668623771404311 + - 1.515014488406754 + - 1.6884392321582473 + - 1.4899035722888914 + - !!python/tuple + - 0.9882303258116331 + - 4.06711159173647 + - 2.1572357902870847 + - 1.2401883214774785 + - 1.5732472335575909 + - 1.2848137543390483 + - 1.3901479246627833 + - 1.2855606126706682 + - 2.457269689885708 + - 1.6677863184676343 + - 1.5170005542833822 + - 1.6878720301696166 + - 1.4857202309718138 + - !!python/tuple + - 0.9881269857962443 + - 4.063202335094855 + - 2.156966782344582 + - 1.2397978268605472 + - 1.5724536382264758 + - 1.2842434380297811 + - 1.3895429027607076 + - 1.289293987116767 + - 2.454413894158532 + - 1.669093133629594 + - 1.5143218225683253 + - 1.6882842952587278 + - 1.4890407364986435 + - !!python/tuple + - 0.9879495761260202 + - 4.056288998693507 + - 2.1564922082350977 + - 1.239117327180091 + - 1.571059926853883 + - 1.2832480494183183 + - 1.3909273041036254 + - 1.2865327375675215 + - 2.4573376171113135 + - 1.668424211737585 + - 1.5159061753087304 + - 1.687836329271323 + - 1.4857380068145898 + - !!python/tuple + - 0.9878738953231445 + - 4.0531788910673665 + - 2.1562796275348224 + - 1.2388191018081622 + - 1.5704406409494673 + - 1.2828106348882344 + - 1.3904387892219938 + - 1.2894960183471456 + - 2.4550628240690453 + - 1.6694619802928023 + - 1.5137796716509475 + - 1.6881648744385245 + - 1.488382721116997 + - !!python/tuple + - 0.986919969955046 + - 4.0130421307928055 + - 2.1535415156884685 + - 1.23501523449915 + - 1.5624928657715222 + - 1.2772246752300864 + - 1.3983869141205296 + - 1.2734196870397312 + - 2.437032568837687 + - 1.6827935684739135 + - 1.5145331154403547 + - 1.6855685602522834 + - 1.5162849463518107 + - !!python/tuple + - 0.9866331962188165 + - 3.9957445877471933 + - 2.152391014529957 + - 1.2336244806317913 + - 1.5593155301036228 + - 1.2751456561958139 + - 1.3953065783534029 + - 1.2907768501687988 + - 2.442865090929459 + - 1.6761679407588161 + - 1.5086739452295868 + - 1.6874648750482193 + - 1.5070918307181744 + - !!python/tuple + - 0.9863330492168639 + - 3.9749158508132387 + - 2.1510206051622625 + - 1.232060111670714 + - 1.5556103228257965 + - 1.2727909280664789 + - 1.3991812559949692 + - 1.2822882574691936 + - 2.4557382644808863 + - 1.6683887672194408 + - 1.5165037349601236 + - 1.686131143203711 + - 1.493273091101253 + - !!python/tuple + - 0.9860860897531422 + - 3.954562130865983 + - 2.1496988945895645 + - 1.2306533513640823 + - 1.5521284144683485 + - 1.270655704846734 + - 1.395496956224123 + - 1.3021628187357588 + - 2.4586419465489096 + - 1.6664223821256907 + - 1.5067814021954868 + - 1.6883547064917235 + - 1.4863312526975927 + - !!python/tuple + - 0.9858651986055789 + - 3.9330208735552556 + - 2.1483179067319544 + - 1.2292812181239396 + - 1.5485826179896653 + - 1.2685561970227488 + - 1.3995124678966095 + - 1.2925068679796115 + - 2.448816398482801 + - 1.6737635011202852 + - 1.5075147568671285 + - 1.6869391007573433 + - 1.501576425159891 + - !!python/tuple + - 0.9857870437640345 + - 3.9238996294451103 + - 2.1503156909795416 + - 1.2282057019915824 + - 1.5471417986906417 + - 1.2753686719550257 + - 1.3930900250420435 + - 1.2887073386498937 + - 2.454468381005571 + - 1.669113258067777 + - 1.5134710150534023 + - 1.6863580881687819 + - 1.4922628577769408 + - !!python/tuple + - 0.985733787449093 + - 3.9172184661204166 + - 2.149882684938422 + - 1.227844011082442 + - 1.5461045531656645 + - 1.2746015050519048 + - 1.394384250356609 + - 1.2860089868806364 + - 2.4573397391110325 + - 1.6684560597501303 + - 1.5150392798260297 + - 1.6859380487028188 + - 1.4889707191582486 + - !!python/tuple + - 0.9857114832624673 + - 3.9142696216905746 + - 2.149692369166077 + - 1.227688529353912 + - 1.5456525255796896 + - 1.2742707509867695 + - 1.3938853888673757 + - 1.288869965069377 + - 2.455147624977697 + - 1.6694559578958887 + - 1.5129955373307291 + - 1.6862633355781855 + - 1.4914977328865646 + - !!python/tuple + - 0.9856745794184147 + - 3.909277897344444 + - 2.1493708021431828 + - 1.2274283615280608 + - 1.5448916152184233 + - 1.273716596056481 + - 1.3948425714646115 + - 1.286848707384341 + - 2.457293763486039 + - 1.6689616180755404 + - 1.5141737397722406 + - 1.6859498705408291 + - 1.489043700854966 + - !!python/tuple + - 0.9856588151758886 + - 3.9070608241862606 + - 2.149228424487457 + - 1.2273150604034966 + - 1.544556854696359 + - 1.2734747439445335 + - 1.3944643424210255 + - 1.288995325135094 + - 2.455644057446055 + - 1.6697123307887902 + - 1.5126397616570144 + - 1.6861946365438962 + - 1.4909451339630642 + - !!python/tuple + - 0.9856324979029857 + - 3.903295630157586 + - 2.1489869640468555 + - 1.2271243111415981 + - 1.5439907322082747 + - 1.2730671858890497 + - 1.3951809844893004 + - 1.2874677027530401 + - 2.4572633757288305 + - 1.6693375750967219 + - 1.513532147979983 + - 1.6859583836086036 + - 1.4890971033627045 + - !!python/tuple + - 0.985621099129739 + - 3.9016163543015865 + - 2.1488795266550538 + - 1.2270404896082217 + - 1.543740048126474 + - 1.2728878024197996 + - 1.3948927268870122 + - 1.2890911950104051 + - 2.4560129304984852 + - 1.6699055998137569 + - 1.5123717148397209 + - 1.686143893053571 + - 1.4905381798102542 + - !!python/tuple + - 0.9856019513606851 + - 3.8987587014836844 + - 2.1486968908632016 + - 1.226898786196873 + - 1.5433148171533209 + - 1.2725843321053985 + - 1.3954336381236094 + - 1.287930036600297 + - 2.4572422452078366 + - 1.6696200939974755 + - 1.5130511192285387 + - 1.6859646884889254 + - 1.4891372498207398 + - !!python/tuple + - 0.9855935746002988 + - 3.897480523850713 + - 2.148615347335173 + - 1.2268361137996862 + - 1.5431256535570834 + - 1.2724499505916824 + - 1.3952132190106505 + - 1.2891643939105315 + - 2.456289941910514 + - 1.670052112332582 + - 1.5121686780803216 + - 1.6861059566376397 + - 1.4902346320729427 + - !!python/tuple + - 0.9855794407235667 + - 3.895302536187866 + - 2.1484765101500187 + - 1.226729855909722 + - 1.5428041076539232 + - 1.2722219907009067 + - 1.395623775226382 + - 1.2882783895893175 + - 2.457227059823217 + - 1.6698338865834337 + - 1.5126877167121078 + - 1.6859694317027825 + - 1.4891678345798032 + - !!python/tuple + - 0.9848769938091315 + - 3.894691682267823 + - 2.1484177510633713 + - 1.2265385552625883 + - 1.5426684018820174 + - 1.272225794042004 + - 1.3953174690655397 + - 1.2891690442494859 + - 2.4564281379031074 + - 1.6701456875057084 + - 1.5120509085817182 + - 1.6860714859500787 + - 1.4899605892743377 + - !!python/tuple + - 0.9834221086541818 + - 3.8934174663130885 + - 2.1482952529392856 + - 1.2261409537809715 + - 1.5423858236474102 + - 1.2722337020226753 + - 1.3953742102946396 + - 1.288385450122112 + - 2.4570253592186173 + - 1.6699524045838887 + - 1.512510424797854 + - 1.68595084966862 + - 1.4890183277036417 + - !!python/tuple + - 0.9834308512388144 + - 3.8925850267127755 + - 2.1482423619849014 + - 1.2261026630206115 + - 1.542264116461797 + - 1.2721471824079988 + - 1.3952306969438495 + - 1.2891885684815454 + - 2.4564048245752157 + - 1.670233511478353 + - 1.5119363000868418 + - 1.6860429334800087 + - 1.4897337265565171 + - !!python/tuple + - 0.9834456564298619 + - 3.8911662002377403 + - 2.148152260633904 + - 1.226037612754047 + - 1.5420570060264676 + - 1.2720001464380104 + - 1.3954982466421262 + - 1.2886109138445854 + - 2.4570155954947563 + - 1.6700908500655895 + - 1.5122753437618215 + - 1.6859540800957664 + - 1.489039947631539 + - !!python/tuple + - 0.9829956364922326 + - 3.890766397227757 + - 2.148113920090217 + - 1.2259140018952521 + - 1.5419690355847695 + - 1.2720031241719814 + - 1.3952978195231298 + - 1.289193605595816 + - 2.4564923527478757 + - 1.6702948357530032 + - 1.5118587619227033 + - 1.6860209417801924 + - 1.4895593899357304 + - !!python/tuple + - 0.9820756515425427 + - 3.8899452343507974 + - 2.148035201561653 + - 1.2256607178281693 + - 1.541788560078319 + - 1.2720092272478636 + - 1.3953344807102905 + - 1.2886881360427576 + - 2.45687747843988 + - 1.6701698849941506 + - 1.512155633152791 + - 1.6859432376245131 + - 1.4889528224864548 + - !!python/tuple + - 0.982086872783584 + - 3.8894135845942537 + - 2.1480015113173665 + - 1.2256372875676733 + - 1.5417114427547955 + - 1.271954379042983 + - 1.3952428415507896 + - 1.2892007231172673 + - 2.4564810300541815 + - 1.6703493115909884 + - 1.5117892060421219 + - 1.6860020804970468 + - 1.489410002387267 + - !!python/tuple + - 0.9821059280185087 + - 3.888507028107557 + - 2.1479440826650085 + - 1.225597418352088 + - 1.5415800778023157 + - 1.2718610274140758 + - 1.3954138304033157 + - 1.2888314448799183 + - 2.456871403136642 + - 1.6702579533479112 + - 1.5120062128379608 + - 1.685945342697431 + - 1.4889671988238355 + - !!python/tuple + - 0.9818214556225742 + - 3.8882508006246126 + - 2.1479195590689035 + - 1.2255188494261462 + - 1.5415240468077183 + - 1.2718631324715588 + - 1.395285404164586 + - 1.2892047752431637 + - 2.4565359220417387 + - 1.670388647481552 + - 1.511739321106774 + - 1.6859882204522647 + - 1.4893003349604903 + - !!python/tuple + - 0.9812443985968514 + - 3.887729470714204 + - 2.147869674572276 + - 1.2253592337058858 + - 1.5414101285470783 + - 1.2718674096839813 + - 1.3953087173350815 + - 1.2888836831734118 + - 2.456780526746347 + - 1.670309163384955 + - 1.511928089737897 + - 1.6859389049669045 + - 1.4889155205694127 + - !!python/tuple + - 0.9812633857077088 + - 3.8870435142339756 + - 2.1478262794185388 + - 1.2253298342561916 + - 1.5413111301269662 + - 1.271796975658209 + - 1.395438001397117 + - 1.2886049635386971 + - 2.4564656937232594 + - 1.6705405789356853 + - 1.5119439625693298 + - 1.6858960320455978 + - 1.4894009837790956 + - !!python/tuple + - 0.980853132134933 + - 3.8866707198828396 + - 2.1477906392190778 + - 1.2252161019181733 + - 1.5412298950704113 + - 1.2718001704035515 + - 1.395251059496351 + - 1.2891487336264689 + - 2.456478959550217 + - 1.6704835906742441 + - 1.511677362514903 + - 1.685958477302453 + - 1.4892115963374408 + - !!python/tuple + - 0.9808833730371035 + - 3.8856882635296746 + - 2.147728537018616 + - 1.2251745604821012 + - 1.5410884476420046 + - 1.2716995181911779 + - 1.3954364065139027 + - 1.2887485768050861 + - 2.4569021645402347 + - 1.6703843375181273 + - 1.511912857601033 + - 1.6858970345953552 + - 1.4887319934950858 + - !!python/tuple + - 0.9805784405832427 + - 3.8854100964870324 + - 2.1477019675374853 + - 1.2250899403759705 + - 1.541028008119395 + - 1.2717020516066961 + - 1.3952968819788292 + - 1.2891542152840185 + - 2.4565377536714648 + - 1.670526214077487 + - 1.5116230409222131 + - 1.6859436407208785 + - 1.4890940747963475 + - !!python/tuple + - 0.9807092865371456 + - 3.881440615557994 + - 2.1474512773754943 + - 1.2249241068250913 + - 1.5404580540873658 + - 1.271296730384727 + - 1.3960453709804015 + - 1.2875371006366387 + - 2.454715831285652 + - 1.6718643791104466 + - 1.5117175407283423 + - 1.6856954418491188 + - 1.4919025694727257 + - !!python/tuple + - 0.9787209936278362 + - 3.879624877073288 + - 2.147278277480955 + - 1.2243740932038498 + - 1.5400667508254098 + - 1.271317305645082 + - 1.3951292754858158 + - 1.2901987248461453 + - 2.454782941382959 + - 1.6715806851830002 + - 1.5104189754885466 + - 1.6860007777543882 + - 1.4909636248871119 + - !!python/tuple + - 0.9739796181363557 + - 3.875199848122406 + - 2.146857396310008 + - 1.223048211944255 + - 1.5391181558475375 + - 1.271366964582093 + - 1.395330365206104 + - 1.287445564341753 + - 2.4568685241480397 + - 1.6708921091652058 + - 1.5120430688587803 + - 1.6855813611216848 + - 1.4876667202264073 + - !!python/tuple + - 0.9742175507337963 + - 3.8724309593268025 + - 2.1466840681783594 + - 1.2229554583913094 + - 1.5387309047980091 + - 1.2710872436408078 + - 1.3948522299460346 + - 1.2901322592027513 + - 2.454799896994059 + - 1.671825133392681 + - 1.5101317529243168 + - 1.6858899647928742 + - 1.490060338733757 + - !!python/tuple + - 0.9746007506071594 + - 3.867870884254486 + - 2.1463991109965805 + - 1.2228043798066306 + - 1.5380965429804327 + - 1.2706310573474062 + - 1.3957191062065726 + - 1.2882558795643742 + - 2.4567716639130768 + - 1.6713537925183963 + - 1.5112421026194924 + - 1.6856047456344534 + - 1.487821426945696 + - !!python/tuple + - 0.9734210365637233 + - 3.8626258340409034 + - 2.1463998804888176 + - 1.2228067974199766 + - 1.5380456987373246 + - 1.2710875078227752 + - 1.3951327767012116 + - 1.2918687871204564 + - 2.4541756348562607 + - 1.6727448437880577 + - 1.508807524207884 + - 1.6862784319610806 + - 1.4909695588448917 + - !!python/tuple + - 0.9654275607115895 + - 3.8260930150829373 + - 2.1464052286835154 + - 1.2228234088192953 + - 1.5376938875300763 + - 1.274228624207382 + - 1.3990598221963872 + - 1.28646585436345 + - 2.4621165415609676 + - 1.6727029091555152 + - 1.5124792361789574 + - 1.6871195867519155 + - 1.4829522006600815 + - !!python/tuple + - 0.9631107019413617 + - 3.8129762100806097 + - 2.1464071202885657 + - 1.222828809680879 + - 1.5375733730532282 + - 1.2752623264263625 + - 1.3975098368824452 + - 1.295587140907615 + - 2.455578111400247 + - 1.6761756242188397 + - 1.5063460903477461 + - 1.6887901408890191 + - 1.490948447331782 + - !!python/tuple + - 0.9501297865219361 + - 3.7339206609949698 + - 2.1464184602469243 + - 1.2228602565140836 + - 1.5368590062095657 + - 1.2813067490816905 + - 1.4057067653125919 + - 1.2831813423613323 + - 2.472799079280849 + - 1.6758019924768428 + - 1.514603369362646 + - 1.6904161358598393 + - 1.4735271452528644 + - !!python/tuple + - 0.9478434590381404 + - 3.709162835132902 + - 2.1464218974836693 + - 1.2228680789786999 + - 1.5366576478697498 + - 1.2828605128403663 + - 1.4024626939676907 + - 1.3007312725866758 + - 2.460267382667139 + - 1.682331291859744 + - 1.5028550818681066 + - 1.6935123342575444 + - 1.489102687530634 + - !!python/tuple + - 0.9427063324440011 + - 3.644429813232115 + - 2.146430794875935 + - 1.2228872133436017 + - 1.53614764988778 + - 1.2866970589958036 + - 1.408662379849283 + - 1.289723627421271 + - 2.4818912412496013 + - 1.6709521599283783 + - 1.5153571542558038 + - 1.6945445445891167 + - 1.4691466626185297 + - !!python/tuple + - 0.9412936237076573 + - 3.615976295413563 + - 2.1464346038408753 + - 1.2228941989418813 + - 1.5359419108327115 + - 1.2881385509213137 + - 1.4047510514217063 + - 1.3096375094991202 + - 2.4672767452743924 + - 1.6786689313591854 + - 1.5017048878387722 + - 1.6980140479957648 + - 1.4874002573308407 + - !!python/tuple + - 0.9396168178650377 + - 3.575448193535607 + - 2.1464399674676526 + - 1.2229034069091893 + - 1.5356594617019867 + - 1.2900613926125915 + - 1.4085021075328452 + - 1.3018715528152742 + - 2.453793072815962 + - 1.6893611963065882 + - 1.5008744891325947 + - 1.6984799375302044 + - 1.5085076767902283 + - !!python/tuple + - 0.9388230158492565 + - 3.5502190298084466 + - 2.150897211760852 + - 1.2219692003502798 + - 1.5354927136685002 + - 1.3043570459883962 + - 1.3967901623328918 + - 1.2974565985757094 + - 2.4623927336083575 + - 1.6825122196928592 + - 1.5101767929349612 + - 1.6987592115821941 + - 1.4941393499113402 + - !!python/tuple + - 0.9314861017947443 + - 3.2758647611788065 + - 2.1503142469858334 + - 1.222729329189191 + - 1.5337377566899553 + - 1.3072114609297754 + - 1.4263539708668516 + - 1.2520813894681775 + - 2.5231088228438368 + - 1.6793386454372314 + - 1.5380546272064795 + - 1.7017262047348398 + - 1.4307567640576795 + - !!python/tuple + - 0.9325057616154923 + - 3.2220590348910014 + - 2.150212200304456 + - 1.2227673150845635 + - 1.533517058935529 + - 1.3074326894635655 + - 1.4168753481437897 + - 1.2966240088794003 + - 2.4934508518519602 + - 1.6941108588633995 + - 1.5092519814675196 + - 1.7081819579047561 + - 1.4704055540119023 + - !!python/tuple + - 0.9343309802472777 + - 3.076073531420653 + - 2.1499409061645025 + - 1.2228553220400789 + - 1.5329601676979498 + - 1.3079620774775162 + - 1.393471678469383 + - 1.4019868143419456 + - 2.4137595484820267 + - 1.7321642243721556 + - 1.436695594633439 + - 1.7248447501315598 + - 1.5689191472957056 + - !!python/tuple + - 0.9343668487993987 + - 3.0284998238482164 + - 2.158875720847058 + - 1.2209704450309375 + - 1.5328136313597107 + - 1.3348197928022252 + - 1.3711548743147666 + - 1.3826582772521285 + - 2.4318825273771676 + - 1.7161095883110666 + - 1.4607152435439288 + - 1.7240657091314566 + - 1.535582340625456 + - !!python/tuple + - 0.9345012535223384 + - 2.7711671449929107 + - 2.157172017960584 + - 1.2225057253259874 + - 1.5320705853230399 + - 1.3192043911840965 + - 1.4146169631168959 + - 1.287154601912865 + - 2.5290232265122095 + - 1.6568046926130195 + - 1.533397709126244 + - 1.7200255606681945 + - 1.4296688086105702 + - !!python/tuple + - 0.9344586353564277 + - 2.662938526324679 + - 2.1565173694269943 + - 1.2226664740581736 + - 1.5318676141135592 + - 1.3163985122660904 + - 1.3960698359811519 + - 1.3756201287927843 + - 2.4627819792259382 + - 1.6927086717551028 + - 1.4700895300696657 + - 1.7321188910131704 + - 1.5181507149978468 + - !!python/tuple + - 0.934443127371986 + - 2.501798408576099 + - 2.15557385390083 + - 1.2228293029972115 + - 1.531609747103387 + - 1.3132602732502572 + - 1.4168674535569994 + - 1.3127032005756736 + - 2.527371604320512 + - 1.6565680937969762 + - 1.5170752720538139 + - 1.7278552116189327 + - 1.450215047838924 + - !!python/tuple + - 0.9030565668687214 + - 2.4884632899025374 + - 2.15521367118473 + - 1.2126764956474054 + - 1.531529896861466 + - 1.3147033403063622 + - 1.3724843723950895 + - 1.2966246717099725 + - 2.489103276252715 + - 1.6798739031627132 + - 1.5136093435428686 + - 1.7263883547782513 + - 1.497163749490876 + - !!python/tuple + - 0.8885437539497596 + - 2.475922187373509 + - 2.1548799201767808 + - 1.2050660239300812 + - 1.5314614644822646 + - 1.3158486421115083 + - 1.3360134280560692 + - 1.283923675091014 + - 2.4530986821299203 + - 1.700419179301506 + - 1.5106512296565389 + - 1.7250830509446466 + - 1.536771908136428 + - !!python/tuple + - 0.8839139481332144 + - 2.4673984067414763 + - 2.154656214799564 + - 1.2009298700721678 + - 1.5314189179574555 + - 1.316510524796249 + - 1.3145722349055968 + - 1.276673687250866 + - 2.4650698788289684 + - 1.6897178198139398 + - 1.5206715152573693 + - 1.7242417438124888 + - 1.5160418859450024 + - !!python/tuple + - 0.8802100670195105 + - 2.4564067690109046 + - 2.1543704357742235 + - 1.1963469443705192 + - 1.5313672778093272 + - 1.3172760081934314 + - 1.2897065880952225 + - 1.2683871118240007 + - 2.480502680944269 + - 1.6764498327101294 + - 1.5328020031589424 + - 1.7231955332754343 + - 1.4909018139809664 + - !!python/tuple + - 0.8797948113671035 + - 2.453898407793354 + - 2.1543060060749455 + - 1.1954976850088535 + - 1.5313564049913422 + - 1.317426988803292 + - 1.2810898596865516 + - 1.2810009160244813 + - 2.4698629394270935 + - 1.6809098254172095 + - 1.5243267332963168 + - 1.7247652638689586 + - 1.5011228500804286 + - !!python/tuple + - 0.8790870585532101 + - 2.449053634033202 + - 2.15418190240649 + - 1.1939286157922353 + - 1.5313357766414146 + - 1.317709542360585 + - 1.2722827190723462 + - 1.2769020119893253 + - 2.4730193615753664 + - 1.6805906645413327 + - 1.5269532529657532 + - 1.7242735772672704 + - 1.493319822502538 + - !!python/tuple + - 0.8789248416442091 + - 2.4476115076843077 + - 2.1541451557175337 + - 1.1935012806961698 + - 1.5313298483733195 + - 1.3177885541769765 + - 1.2698385848653142 + - 1.2757639831788004 + - 2.4685633670887497 + - 1.6831553488578133 + - 1.5263975081910888 + - 1.724130269961125 + - 1.498334504237396 + - !!python/tuple + - 0.8787591775119463 + - 2.4460299405441512 + - 2.154104918924989 + - 1.1930445583999942 + - 1.5313234138840408 + - 1.3178736399292397 + - 1.2672131194494691 + - 1.2745411561197348 + - 2.4696133617171405 + - 1.6830242981717127 + - 1.5272360247744885 + - 1.7239740834994053 + - 1.4957946733113596 + - !!python/tuple + - 0.8795018592704473 + - 2.4444892693800435 + - 2.1540975294858806 + - 1.1932130416843536 + - 1.5313222435868055 + - 1.3178347085170945 + - 1.267972520718676 + - 1.274321222005441 + - 2.468949646067412 + - 1.6835402909414365 + - 1.5271223263493563 + - 1.723945547374549 + - 1.4968061537774802 + - !!python/tuple + - 0.8794683996944205 + - 2.4442406114316872 + - 2.1540911977167707 + - 1.193142153517601 + - 1.5313212425740061 + - 1.3178480119752507 + - 1.2675644961976253 + - 1.2741334844469474 + - 2.469115715467777 + - 1.6835188498218134 + - 1.527253389563312 + - 1.723921118796219 + - 1.4964077919481458 + - !!python/tuple + - 0.8794583835010692 + - 2.4441652763243265 + - 2.1540892799165077 + - 1.1931207718676724 + - 1.5313209398425525 + - 1.3178520298391707 + - 1.2674413227213572 + - 1.2740768070820105 + - 2.4688809875026108 + - 1.683652746553569 + - 1.5272238140666023 + - 1.723913725731051 + - 1.4966703165182602 + - !!python/tuple + - 0.8794386907229468 + - 2.444016622942226 + - 2.1540854959664677 + - 1.1930786376107985 + - 1.5313203428078173 + - 1.3178599504677082 + - 1.2671985382632251 + - 1.2739650894165726 + - 2.4689803662115906 + - 1.6836397988770493 + - 1.5273020811224216 + - 1.723899142292129 + - 1.496432192048927 + - !!python/tuple + - 0.879436085071544 + - 2.4439968124658247 + - 2.154084991774721 + - 1.1930730374135827 + - 1.5313202633283223 + - 1.317861004039848 + - 1.2671662529491567 + - 1.2739502326918966 + - 2.468918614701018 + - 1.6836750102987676 + - 1.5272942904481503 + - 1.7238972000659554 + - 1.4965012580881278 + - !!python/tuple + - 0.8794309621902809 + - 2.443957826687415 + - 2.1540839995781442 + - 1.193062020467321 + - 1.531320106939936 + - 1.3178630768855588 + - 1.2671027357066764 + - 1.273921003824004 + - 2.4689446846854857 + - 1.6836716070742426 + - 1.5273147984287239 + - 1.7238933782149481 + - 1.4964388503271806 + - !!python/tuple + - 0.8794293637065537 + - 2.443945639205788 + - 2.154083689417143 + - 1.1930585788144368 + - 1.5313200580645223 + - 1.3178637245663216 + - 1.2670828905757558 + - 1.273911871551304 + - 2.4689528345376175 + - 1.683670543380603 + - 1.527321207683974 + - 1.7238921836547958 + - 1.4964193468073657 + - !!python/tuple + - 0.8794288801084368 + - 2.4439419499003048 + - 2.154083595528705 + - 1.1930575372087528 + - 1.5313200432706109 + - 1.3178639205973564 + - 1.2670768842637161 + - 1.2739091075756137 + - 2.468941332867799 + - 1.6836771010826832 + - 1.5273197559062774 + - 1.7238918220653938 + - 1.4964322116046709 + - !!python/tuple + - 0.8794279257702841 + - 2.443934668091758 + - 2.1540834102160744 + - 1.1930554814629357 + - 1.5313200140717356 + - 1.3178643074978182 + - 1.2670650298711272 + - 1.2739036524335403 + - 2.4689462024998727 + - 1.6836764652333602 + - 1.5273235851205047 + - 1.7238911083856383 + - 1.4964205586504207 + - !!python/tuple + - 0.8794276369888738 + - 2.44393246385568 + - 2.154083354121552 + - 1.1930548592602486 + - 1.5313200052335683 + - 1.317864424603558 + - 1.267061441872117 + - 1.2739020013086386 + - 2.4689393304949037 + - 1.683680383247225 + - 1.5273227176593782 + - 1.7238908923584062 + - 1.4964282451052053 + - !!python/tuple + - 0.8794270671132643 + - 2.4439281135986244 + - 2.154083243414259 + - 1.193053631335849 + - 1.531319987790931 + - 1.3178646557157798 + - 1.2670543608613969 + - 1.2738987427681403 + - 2.4689422397676757 + - 1.683680003270753 + - 1.5273250052140117 + - 1.7238904660134204 + - 1.496421283484323 + - !!python/tuple + - 0.8794268946482023 + - 2.443926796777684 + - 2.154083209903366 + - 1.1930532596724888 + - 1.5313199825112174 + - 1.3178647256695089 + - 1.2670522175776593 + - 1.2738977564703735 + - 2.4689381343484955 + - 1.6836823439131217 + - 1.5273244869627236 + - 1.7238903369614134 + - 1.4964258754692368 + - !!python/tuple + - 0.8794265543122107 + - 2.443924198048993 + - 2.1540831437701575 + - 1.193052526216987 + - 1.5313199720918713 + - 1.3178648637199721 + - 1.267047987916318 + - 1.273895810061251 + - 2.4689398723014198 + - 1.6836821168856166 + - 1.5273258534614174 + - 1.7238900822804417 + - 1.4964217167883975 + - !!python/tuple + - 0.8794264568842098 + - 2.4439234540179435 + - 2.1540831248358905 + - 1.1930523162341653 + - 1.531319969108808 + - 1.3178649032433216 + - 1.2670467769854392 + - 1.273895252813667 + - 2.468940369887482 + - 1.6836820518871454 + - 1.5273262446905036 + - 1.7238900093646294 + - 1.496420526158402 + - !!python/tuple + - 0.879426427394428 + - 2.443923228804481 + - 2.1540831191046133 + - 1.193052252674545 + - 1.5313199682058585 + - 1.3178649152066755 + - 1.267046410448324 + - 1.2738950841401557 + - 2.4689396677384727 + - 1.6836824522039693 + - 1.5273261560512856 + - 1.7238899872935485 + - 1.4964213115274663 + - !!python/tuple + - 0.8794263691968311 + - 2.4439227843446294 + - 2.1540831077939124 + - 1.1930521272398322 + - 1.5313199664238863 + - 1.3178649388163448 + - 1.2670456870879254 + - 1.2738947512632368 + - 2.4689399649810198 + - 1.6836824133748471 + - 1.5273263897580038 + - 1.7238899437362067 + - 1.4964206002842126 + - !!python/tuple + - 0.8794263515811943 + - 2.443922649809685 + - 2.1540831043702426 + - 1.193052089271907 + - 1.5313199658844974 + - 1.3178649459627896 + - 1.2670454681331111 + - 1.2738946505043165 + - 2.468939545540292 + - 1.683682652510675 + - 1.5273263368076466 + - 1.723889930551724 + - 1.4964210694379017 + - !!python/tuple + - 0.8794263168170596 + - 2.443922384305736 + - 2.154083097613651 + - 1.193052014342602 + - 1.5313199648200173 + - 1.3178649600662335 + - 1.267045036027872 + - 1.2738944516575406 + - 2.4689397231023595 + - 1.6836826293151739 + - 1.5273264764151626 + - 1.7238899045322371 + - 1.4964206445674517 + - !!python/tuple + - 0.8794263166283341 + - 2.4439223828643653 + - 2.1540830975769705 + - 1.193052013935827 + - 1.5313199648142384 + - 1.3178649601427983 + - 1.267045033682064 + - 1.2738944505780434 + - 2.4689397186085835 + - 1.6836826318772096 + - 1.5273264758478653 + - 1.7238899043909823 + - 1.4964206495938392 + - !!python/tuple + - 0.8794263162567036 + - 2.443922380026077 + - 2.154083097504741 + - 1.1930520131348221 + - 1.5313199648028588 + - 1.3178649602935664 + - 1.2670450290627935 + - 1.2738944484523411 + - 2.4689397205067563 + - 1.6836826316292455 + - 1.5273264773402937 + - 1.7238899041128293 + - 1.4964206450519015 + - !!python/tuple + - 0.8794263161986364 + - 2.4439223795825944 + - 2.1540830974934555 + - 1.1930520130096651 + - 1.5313199648010807 + - 1.317864960317124 + - 1.2670450283410324 + - 1.2738944481202001 + - 2.4689397208033457 + - 1.6836826315905011 + - 1.5273264775734856 + - 1.7238899040693678 + - 1.4964206443422237 + - !!python/tuple + - 0.8794263161810599 + - 2.4439223794483556 + - 2.1540830974900396 + - 1.193052012971781 + - 1.5313199648005424 + - 1.3178649603242547 + - 1.2670450281225605 + - 1.2738944480196635 + - 2.468939720384827 + - 1.683682631829111 + - 1.5273264775206516 + - 1.7238899040562123 + - 1.4964206448103456 + - !!python/tuple + - 0.8794263161463726 + - 2.443922379183435 + - 2.154083097483298 + - 1.1930520128970166 + - 1.5313199647994804 + - 1.3178649603383272 + - 1.2670450276914063 + - 1.2738944478212542 + - 2.468939720561999 + - 1.6836826318059663 + - 1.5273264776599522 + - 1.72388990403025 + - 1.4964206443864094 + - !!python/tuple + - 0.879426316141765 + - 2.4439223791482454 + - 2.154083097482402 + - 1.1930520128870856 + - 1.5313199647993394 + - 1.3178649603401964 + - 1.2670450276341356 + - 1.2738944477948992 + - 2.468939720452288 + - 1.683682631868516 + - 1.5273264776461022 + - 1.7238899040268014 + - 1.496420644509124 + - !!python/tuple + - 0.8794263161326921 + - 2.443922379078951 + - 2.1540830974806386 + - 1.19305201286753 + - 1.5313199647990616 + - 1.3178649603438772 + - 1.2670450275213605 + - 1.2738944477430023 + - 2.46893972049863 + - 1.6836826318624623 + - 1.5273264776825384 + - 1.7238899040200106 + - 1.4964206443982369 + - !!python/tuple + - 0.8794263161298568 + - 2.443922379057297 + - 2.1540830974800875 + - 1.1930520128614188 + - 1.5313199647989748 + - 1.3178649603450274 + - 1.2670450274861182 + - 1.2738944477267844 + - 2.4689397205131116 + - 1.6836826318605704 + - 1.5273264776939246 + - 1.7238899040178886 + - 1.4964206443635846 + - !!python/tuple + - 0.8794263161289986 + - 2.443922379050742 + - 2.1540830974799205 + - 1.193052012859569 + - 1.5313199647989486 + - 1.3178649603453756 + - 1.2670450274754508 + - 1.2738944477218754 + - 2.4689397204926764 + - 1.6836826318722213 + - 1.5273264776913449 + - 1.7238899040172462 + - 1.496420644386442 + - !!python/tuple + - 0.8794263161273048 + - 2.4439223790378066 + - 2.1540830974795915 + - 1.1930520128559183 + - 1.5313199647988966 + - 1.3178649603460628 + - 1.2670450274543985 + - 1.2738944477121876 + - 2.4689397205013273 + - 1.6836826318710911 + - 1.5273264776981466 + - 1.7238899040159785 + - 1.4964206443657422 + - !!python/tuple + - 0.8794263161267921 + - 2.443922379033891 + - 2.154083097479492 + - 1.1930520128548134 + - 1.5313199647988809 + - 1.3178649603462709 + - 1.267045027448026 + - 1.273894447709255 + - 2.46893972048912 + - 1.683682631878051 + - 1.5273264776966056 + - 1.7238899040155948 + - 1.4964206443793964 + - !!python/tuple + - 0.8794263161257804 + - 2.443922379026164 + - 2.1540830974792953 + - 1.1930520128526327 + - 1.5313199647988498 + - 1.3178649603466814 + - 1.2670450274354503 + - 1.273894447703468 + - 2.468939720494288 + - 1.6836826318773759 + - 1.5273264777006688 + - 1.7238899040148377 + - 1.4964206443670311 + - !!python/tuple + - 0.8794263161256046 + - 2.4439223790248215 + - 2.154083097479261 + - 1.193052012852254 + - 1.5313199647988445 + - 1.3178649603467527 + - 1.2670450274332656 + - 1.2738944477024625 + - 2.468939720490103 + - 1.683682631879762 + - 1.5273264777001405 + - 1.7238899040147062 + - 1.4964206443717123 + - !!python/tuple + - 0.8794263161252586 + - 2.4439223790221782 + - 2.154083097479194 + - 1.1930520128515079 + - 1.5313199647988338 + - 1.317864960346893 + - 1.2670450274289635 + - 1.2738944477004828 + - 2.468939720491871 + - 1.683682631879531 + - 1.5273264777015305 + - 1.723889904014447 + - 1.4964206443674823 + - !!python/tuple + - 0.8794263161251504 + - 2.4439223790213522 + - 2.154083097479173 + - 1.1930520128512747 + - 1.5313199647988305 + - 1.317864960346937 + - 1.267045027427619 + - 1.2738944476998642 + - 2.4689397204924233 + - 1.6836826318794589 + - 1.5273264777019648 + - 1.723889904014366 + - 1.4964206443661605 + - !!python/tuple + - 0.8794263161251177 + - 2.443922379021102 + - 2.154083097479167 + - 1.193052012851204 + - 1.5313199647988294 + - 1.3178649603469503 + - 1.267045027427212 + - 1.273894447699677 + - 2.468939720491644 + - 1.6836826318799034 + - 1.5273264777018665 + - 1.7238899040143416 + - 1.4964206443670325 + - !!python/tuple + - 0.8794263161250531 + - 2.443922379020609 + - 2.1540830974791545 + - 1.1930520128510649 + - 1.5313199647988274 + - 1.3178649603469765 + - 1.267045027426409 + - 1.2738944476993075 + - 2.468939720491974 + - 1.6836826318798603 + - 1.5273264777021258 + - 1.7238899040142932 + - 1.496420644366243 + - !!python/tuple + - 0.8794263161250335 + - 2.4439223790204596 + - 2.1540830974791505 + - 1.1930520128510227 + - 1.5313199647988267 + - 1.3178649603469845 + - 1.2670450274261658 + - 1.2738944476991956 + - 2.4689397204915084 + - 1.683682631880126 + - 1.527326477702067 + - 1.7238899040142786 + - 1.4964206443667638 + - !!python/tuple + - 0.8794263161249949 + - 2.4439223790201647 + - 2.154083097479143 + - 1.1930520128509394 + - 1.5313199647988256 + - 1.3178649603470003 + - 1.2670450274256861 + - 1.2738944476989749 + - 2.4689397204917056 + - 1.6836826318801001 + - 1.527326477702222 + - 1.7238899040142497 + - 1.4964206443662922 + - !!python/tuple + - 0.8794263161249883 + - 2.443922379020114 + - 2.1540830974791416 + - 1.1930520128509252 + - 1.5313199647988254 + - 1.317864960347003 + - 1.267045027425604 + - 1.2738944476989371 + - 2.4689397204917394 + - 1.6836826318800957 + - 1.5273264777022484 + - 1.7238899040142448 + - 1.4964206443662116 + - !!python/tuple + - 0.8794263161249863 + - 2.443922379020099 + - 2.154083097479141 + - 1.193052012850921 + - 1.5313199647988254 + - 1.3178649603470038 + - 1.2670450274255791 + - 1.2738944476989258 + - 2.468939720491692 + - 1.6836826318801228 + - 1.5273264777022424 + - 1.7238899040142432 + - 1.4964206443662649 + - !!python/tuple + - 0.8794263161249842 + - 2.4439223790200835 + - 2.1540830974791407 + - 1.1930520128509166 + - 1.5313199647988254 + - 1.3178649603470047 + - 1.2670450274255536 + - 1.273894447698914 + - 2.4689397204917025 + - 1.6836826318801215 + - 1.5273264777022506 + - 1.7238899040142417 + - 1.4964206443662396 + - !!python/tuple + - 0.8794263161249837 + - 2.4439223790200795 + - 2.1540830974791407 + - 1.1930520128509154 + - 1.5313199647988254 + - 1.317864960347005 + - 1.2670450274255471 + - 1.2738944476989111 + - 2.46893972049169 + - 1.6836826318801286 + - 1.527326477702249 + - 1.7238899040142412 + - 1.4964206443662535 + - !!python/tuple + - 0.8794263161249837 + - 2.4439223790200795 + - 2.1540830974791407 + - 1.1930520128509154 + - 1.5313199647988254 + - 1.317864960347005 + - 1.2670450274255471 + - 1.2738944476989111 + - 2.46893972049169 + - 1.6836826318801286 + - 1.527326477702249 + - 1.7238899040142412 + - 1.4964206443662535 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.29493512442281 + - 9.851973258985236 + - 9.778528658277436 + - 9.436930113422287 + - 9.858047722239702 + - 9.73781544151515 + - 9.543805156661652 + - 9.640910186855765 + - 9.666706531497418 + - 9.695519746019842 + - 9.56232119691342 + - 9.662690135039211 + - 9.540970467226336 + - !!python/tuple + - 7.547139216830049 + - 9.442111005000152 + - 9.244051852754913 + - 8.026070448279773 + - 9.502327675197206 + - 9.080822179180267 + - 8.400706617154563 + - 8.741108536256204 + - 8.831539734834607 + - 8.932547813968567 + - 8.465613686674828 + - 8.817459872520667 + - 8.390769792846427 + - !!python/tuple + - 3.156565493633954 + - 8.343858768016975 + - 7.856432524282414 + - 4.518225407100619 + - 8.437715682408495 + - 7.293607262220992 + - 5.757644790980347 + - 6.5063889523427445 + - 6.789352050758792 + - 7.009770044187604 + - 5.649185102656081 + - 6.780547384399895 + - 5.498921057925287 + - !!python/tuple + - 0.5426847136190771 + - 7.447484227330901 + - 6.764141026724564 + - 2.4413064978595167 + - 7.582240255339972 + - 5.963970464698751 + - 4.218259237655685 + - 5.083739409471054 + - 5.607419967918917 + - 5.950094636295808 + - 3.7258839197638522 + - 5.457299949650785 + - 3.7716595824400736 + - !!python/tuple + - 1.941974455012346 + - 7.235975860133928 + - 6.552268180512054 + - 2.229697521890419 + - 7.3823072233053715 + - 5.6691616414630435 + - 4.019272342772857 + - 4.884929854715976 + - 5.427585531834763 + - 5.786838918674585 + - 3.392286053999155 + - 5.2552748610370426 + - 3.533411006869109 + - !!python/tuple + - 0.8070422312265859 + - 6.595570098428289 + - 5.815186944699976 + - 1.5658014372436657 + - 6.720345078041375 + - 4.7163439379367285 + - 3.369077711478336 + - 4.226941471176488 + - 4.857625568718436 + - 5.217001948638611 + - 2.333203166356485 + - 4.560162407073894 + - 2.7565443454469034 + - !!python/tuple + - 1.9715174407044915 + - 5.9317536410778455 + - 5.144901040382753 + - 1.3428967180654765 + - 6.090301528574086 + - 3.7991634406844836 + - 2.8304113821190127 + - 3.630155518987662 + - 4.336703489739346 + - 4.719632396488825 + - 1.4991916245491188 + - 3.967790820519115 + - 2.1687600873620245 + - !!python/tuple + - 0.5717440433581038 + - 5.222769282802908 + - 4.300726447645108 + - 1.311172742247755 + - 5.263466950430509 + - 2.8106410779681354 + - 2.181077563370123 + - 2.9125555102111074 + - 3.6927202296403365 + - 4.048697567709174 + - 1.0482422789652386 + - 3.21587447386979 + - 1.5384964334887299 + - !!python/tuple + - 1.717250792874305 + - 5.0034047615080475 + - 4.159248784433146 + - 1.3276805480503795 + - 5.057353791587176 + - 2.6130017345345573 + - 2.0740455214620237 + - 2.782115682150752 + - 3.5433348470309003 + - 3.8913303270074167 + - 1.1813163870725027 + - 3.0648843854967605 + - 1.5038050001278338 + - !!python/tuple + - 1.0640729526046315 + - 4.638014932664903 + - 3.7779803971108956 + - 1.3181049114460064 + - 4.597554236726348 + - 2.2093290241139805 + - 1.8484165787811433 + - 2.4789436150524744 + - 3.2109297120981273 + - 3.5164046588598192 + - 1.2734478274665746 + - 2.7186693698702635 + - 1.4351900702368878 + - !!python/tuple + - 1.1083969429594354 + - 2.587420495940811 + - 1.8635809095221954 + - 1.331078184542 + - 2.24111461879683 + - 0.48872425735597735 + - 1.065346868550067 + - 1.0671235527973206 + - 1.596904810574963 + - 1.774547899348395 + - 1.0140953436137667 + - 1.1110324632736965 + - 1.3457030809982804 + - !!python/tuple + - 1.0580698208453818 + - 2.5031798741210074 + - 1.8899920025854724 + - 1.2695827497006555 + - 2.1363969632995214 + - 2.153945116588988 + - 1.1803877678004393 + - 1.2924581800812822 + - 1.5739050569037705 + - 1.7082606507236027 + - 1.158638628878244 + - 1.310157067261726 + - 1.3306234470515867 + - !!python/tuple + - 1.033740219982737 + - 2.3537060625847896 + - 1.8034916949148885 + - 1.2643994144609483 + - 2.021356587316596 + - 1.912426269284562 + - 1.3569002967854207 + - 1.4708992650481107 + - 1.5963372668645655 + - 1.68595394370103 + - 1.2096665686129915 + - 1.477487105169392 + - 1.3497986672789042 + - !!python/tuple + - 1.0357330361529309 + - 2.071576742237827 + - 1.674593271320293 + - 1.096419667586201 + - 1.9374779457568616 + - 1.5370179338409482 + - 1.3924563913296482 + - 1.5136018135739462 + - 1.579553112088893 + - 1.6691534952787368 + - 1.2686308715301677 + - 1.536778069806391 + - 1.3052239781693846 + - !!python/tuple + - 1.01754786231103 + - 2.0094021292474977 + - 1.6988671166175948 + - 1.1987157800795314 + - 1.9199318224596924 + - 1.5531597291071342 + - 1.3538491944447517 + - 1.4658427079648575 + - 1.5519936808016506 + - 1.648183106260582 + - 1.256054765794833 + - 1.511535955924363 + - 1.2739684415054056 + - !!python/tuple + - 1.033952689854641 + - 1.9680186857016542 + - 1.7048646029808 + - 1.15862221242314 + - 1.908990680508855 + - 1.5498327911999672 + - 1.356859430505843 + - 1.4512155773258433 + - 1.5489571583504924 + - 1.6383582439777644 + - 1.2569582010455034 + - 1.5028160508711506 + - 1.2743459779439286 + - !!python/tuple + - 1.0120798562210978 + - 1.9161749028393311 + - 1.710909414153862 + - 1.1711465848652696 + - 1.8958271782332607 + - 1.5471778725921936 + - 1.3579580211535773 + - 1.4421239320489339 + - 1.546539190277956 + - 1.6291704982584059 + - 1.2569885516330557 + - 1.4965436608890783 + - 1.274383890985231 + - !!python/tuple + - 1.0265539771305863 + - 1.9210556378810582 + - 1.7117913545117054 + - 1.1642891615199416 + - 1.8929236668795566 + - 1.5470587734481145 + - 1.3570691438279865 + - 1.4423824865055548 + - 1.546410835919815 + - 1.6135629419313633 + - 1.257688361702073 + - 1.4964367101253844 + - 1.2717633072171273 + - !!python/tuple + - 1.023426471941158 + - 1.9242090538669936 + - 1.7123062997590237 + - 1.1634415122343538 + - 1.8910648912622425 + - 1.5469982552952717 + - 1.356741292121386 + - 1.4424962906412033 + - 1.5463456613693725 + - 1.6050385625262382 + - 1.257868791493897 + - 1.4963856210063886 + - 1.2710357935780963 + - !!python/tuple + - 1.024031703957864 + - 1.9221106787424072 + - 1.7123847228051219 + - 1.1636064883013912 + - 1.8907618414686571 + - 1.546986335445135 + - 1.3568218202745588 + - 1.442510450321701 + - 1.546336700808134 + - 1.6060736655418089 + - 1.2577754218981794 + - 1.496378894746336 + - 1.2713724210012656 + - !!python/tuple + - 1.0239348303469298 + - 1.922583000937862 + - 1.7124459308743754 + - 1.163546115035188 + - 1.890522682780717 + - 1.5469801027839332 + - 1.3567868685509923 + - 1.4425211802576108 + - 1.5463298154467051 + - 1.6050329693716356 + - 1.25779647356243 + - 1.49637375815565 + - 1.2712898573234648 + - !!python/tuple + - 1.0239209409721692 + - 1.9226614934822324 + - 1.7124559996118829 + - 1.1635369423513977 + - 1.8904829880402978 + - 1.5469790902701164 + - 1.356781321873065 + - 1.4425229038536038 + - 1.5463286969675356 + - 1.6048630497499135 + - 1.2577997523010052 + - 1.4963729279016136 + - 1.2712769604045289 + - !!python/tuple + - 1.0239206752472745 + - 1.9226630303699066 + - 1.7124561964245788 + - 1.163536765320448 + - 1.8904822109796542 + - 1.546979070519362 + - 1.3567812140857427 + - 1.4425229374135735 + - 1.5463286751499683 + - 1.6048597324670026 + - 1.2577998158260044 + - 1.4963729117194835 + - 1.2712767104131881 + - !!python/tuple + - 1.0239211916696804 + - 1.92266094871092 + - 1.7124562696370278 + - 1.163536919825509 + - 1.8904819219121105 + - 1.546979059527478 + - 1.3567812923588618 + - 1.4425229498966137 + - 1.5463286670343692 + - 1.604860791065553 + - 1.2577997284737494 + - 1.4963729057002244 + - 1.2712770269639537 + - !!python/tuple + - 1.0239211094098937 + - 1.922661424257785 + - 1.712456330524048 + - 1.1635368650522966 + - 1.8904816815069407 + - 1.54697905341779 + - 1.3567812590101096 + - 1.4425229602778211 + - 1.5463286602851454 + - 1.6048597647501528 + - 1.2577997481313274 + - 1.4963729006944217 + - 1.2712769496076348 + - !!python/tuple + - 1.0239211094098937 + - 1.922661424257785 + - 1.712456330524048 + - 1.1635368650522966 + - 1.8904816815069407 + - 1.54697905341779 + - 1.3567812590101096 + - 1.4425229602778211 + - 1.5463286602851454 + - 1.6048597647501528 + - 1.2577997481313274 + - 1.4963729006944217 + - 1.2712769496076348 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.28092485812772 + - 9.960513426703173 + - 9.843213677727181 + - 9.411293999180913 + - 9.839020591252204 + - 9.771305350310069 + - 9.481252423638146 + - 9.67932907908207 + - 9.645828184146291 + - 9.76267805429943 + - 9.568300766665581 + - 9.723025300007931 + - 9.503865369452553 + - !!python/tuple + - 7.48286964635947 + - 9.715459058022782 + - 9.462799181130801 + - 7.972049996618251 + - 9.430770004379063 + - 9.157013549643366 + - 8.207736206482974 + - 8.86612210428606 + - 8.758643374689116 + - 9.17328057941903 + - 8.465266647943494 + - 9.020623235787927 + - 8.274096626692428 + - !!python/tuple + - 2.980432822120262 + - 8.803664654236487 + - 8.495855489365638 + - 4.4916336899709925 + - 8.274938796843719 + - 7.450587221284694 + - 5.172870341994317 + - 6.939552956332637 + - 6.591825028493666 + - 7.67548972423655 + - 5.57563633783295 + - 7.230777745578541 + - 5.188771698259964 + - !!python/tuple + - 0.3403686552385552 + - 7.68441972421983 + - 7.402038214970843 + - 2.6325664288954265 + - 7.391459117236641 + - 5.704119861225383 + - 3.704493462850171 + - 5.6229488936070116 + - 5.668060241559239 + - 6.7846119918201495 + - 3.3900581085795847 + - 6.153041638623062 + - 3.5128853889381375 + - !!python/tuple + - 2.3102615159521758 + - 7.580631260596864 + - 7.315192504031631 + - 2.5029780363473657 + - 7.312328238749242 + - 5.563123206397002 + - 3.591268395914505 + - 5.51064205416017 + - 5.606272170933888 + - 6.699728534337898 + - 3.251153542213798 + - 6.053200240891553 + - 3.3689948548911373 + - !!python/tuple + - 1.6041651458050732 + - 7.234537131618449 + - 6.997098548310788 + - 2.0625016936609475 + - 7.033974236168103 + - 5.077409197716076 + - 3.1959613689332844 + - 5.116021364093877 + - 5.370178300363504 + - 6.401253056798815 + - 2.749259182498764 + - 5.705945870380996 + - 2.888574708867758 + - !!python/tuple + - 0.7763552416916281 + - 6.691255742318946 + - 6.516442739503267 + - 1.4794358312365556 + - 6.537890714785013 + - 4.324842252401619 + - 2.6304236537876777 + - 4.457138793614046 + - 5.013737600775279 + - 5.98945309555648 + - 2.054815616901191 + - 5.134057697003653 + - 2.1780631243690562 + - !!python/tuple + - 1.736810784984961 + - 6.160496356651201 + - 6.019181101032472 + - 1.2157750617502887 + - 6.05357057525997 + - 3.589151429723966 + - 2.180000333430803 + - 3.84100565389047 + - 4.669688511598374 + - 5.581800691171049 + - 1.5158657257679122 + - 4.5938989171369 + - 1.618224936066147 + - !!python/tuple + - 0.6463330507082476 + - 5.54093776052533 + - 5.404279167442926 + - 1.2858536123299755 + - 5.458682540880575 + - 2.810236601426235 + - 1.784489498856503 + - 3.161739714003708 + - 4.146080406466139 + - 5.11610534425072 + - 1.165262642005861 + - 3.984383736930974 + - 1.3469067480161663 + - !!python/tuple + - 1.5298265357049652 + - 5.313572489724704 + - 5.187334769522119 + - 1.2664540585656598 + - 5.2405571594877305 + - 2.5527643078641664 + - 1.6914874440008778 + - 2.928377285596316 + - 3.958342548315966 + - 4.936891890451107 + - 1.2368909342478562 + - 3.766639827026628 + - 1.3479703493291295 + - !!python/tuple + - 0.804205965650307 + - 4.841988252145883 + - 4.6959854670078425 + - 1.263242026067802 + - 4.788295275595115 + - 2.044645489920574 + - 1.5434826710069145 + - 2.513417330760859 + - 3.573265183114838 + - 4.565939348241119 + - 1.2306595185438665 + - 3.346835206324645 + - 1.3647482116163758 + - !!python/tuple + - 1.5597141652260622 + - 4.3689903337714675 + - 4.21144068645972 + - 1.264205188901175 + - 4.272927282382845 + - 1.753581759003301 + - 1.4500527177296538 + - 2.201507197645495 + - 3.246492181640337 + - 4.141997391327087 + - 1.2616443512943372 + - 2.9479934479406835 + - 1.3001981855192761 + - !!python/tuple + - 0.8213582855818383 + - 4.029580046523473 + - 3.8120277876653597 + - 1.221195150353691 + - 3.856852374820635 + - 1.639515996698409 + - 1.3663808429107884 + - 1.9866329602384591 + - 2.925717268173805 + - 3.6940126139550826 + - 1.2295727150016864 + - 2.6369452633403427 + - 1.2857520219059244 + - !!python/tuple + - 1.536172165957622 + - 3.551949517212685 + - 3.338006485831626 + - 1.2781605033738768 + - 3.400442544310869 + - 1.527814319558081 + - 1.375223617559275 + - 1.801590454552729 + - 2.604311733572046 + - 3.230233142641987 + - 1.2051858306944978 + - 2.3354602999755425 + - 1.2934885285621063 + - !!python/tuple + - 0.8557173900864912 + - 3.2822095356031964 + - 3.045133656633284 + - 1.189345693282877 + - 3.063987377922515 + - 1.5575969299840307 + - 1.31452708781253 + - 1.7022951120830279 + - 2.312716715455538 + - 2.850283952269238 + - 1.2572517391414622 + - 2.1410605578899053 + - 1.265363635204138 + - !!python/tuple + - 1.544857901094633 + - 2.762801774802565 + - 2.5057118557641394 + - 1.2438080991851261 + - 2.64204083986826 + - 1.3339494980067677 + - 1.3710398799014962 + - 1.6037838256178998 + - 1.994490112814638 + - 2.312364953948369 + - 1.1665269368491489 + - 1.8765449525711821 + - 1.2839166914245381 + - !!python/tuple + - 0.9163602914144354 + - 2.568674604125861 + - 2.345262272348397 + - 1.175178810193621 + - 2.396610628340006 + - 1.4245395966056629 + - 1.3241397210662522 + - 1.5656527597891314 + - 1.7796636418992189 + - 2.151245410664055 + - 1.257437266969095 + - 1.7802650867347818 + - 1.248345705778352 + - !!python/tuple + - 1.280298236393081 + - 2.1523363333187673 + - 2.0149728370110265 + - 1.227629911160979 + - 2.135631654006612 + - 1.3830469838401445 + - 1.3130051350628718 + - 1.5782240121337048 + - 1.660878323306391 + - 1.7954870804129424 + - 1.0493608274399642 + - 1.6711137971098025 + - 1.329199742955013 + - !!python/tuple + - 1.0153910111965003 + - 2.1129817728467213 + - 2.0147681316289865 + - 1.1655706985506664 + - 2.0551031083017284 + - 1.4575356250637006 + - 1.2624590881433435 + - 1.5133233607748764 + - 1.613557177088487 + - 1.7655908822377908 + - 1.2803971694601954 + - 1.6204434576522775 + - 1.2222062026617293 + - !!python/tuple + - 0.9319144430176434 + - 1.9581747991955893 + - 1.9129341220255418 + - 1.188739698847936 + - 1.950162068394971 + - 1.4374974613237397 + - 1.3181973581494748 + - 1.522552435356082 + - 1.5021270583993866 + - 1.725689480509395 + - 1.1284899889102469 + - 1.5900602957546481 + - 1.2808936659313632 + - !!python/tuple + - 1.0055517468747999 + - 1.9352947792048256 + - 1.9034720709390964 + - 1.1652642338486612 + - 1.92219451652815 + - 1.4625204791288415 + - 1.286439701197195 + - 1.4939748529595847 + - 1.5079372701523162 + - 1.7009470809437004 + - 1.2423181288261766 + - 1.5717125807482986 + - 1.2178067366463787 + - !!python/tuple + - 0.9790867569514178 + - 1.8915736165720698 + - 1.8756601195250542 + - 1.1765916698620387 + - 1.8958611373065817 + - 1.450713202817663 + - 1.2986042972909535 + - 1.4884957073325973 + - 1.5023746954157027 + - 1.6993216203579085 + - 1.207646056898344 + - 1.5730638204713234 + - 1.2476702857142077 + - !!python/tuple + - 0.9965052821079927 + - 1.862329631830115 + - 1.8255722093175633 + - 1.1727117530717186 + - 1.8480592955247621 + - 1.4723347226445085 + - 1.2553916816689583 + - 1.465193961724969 + - 1.4949276744786049 + - 1.69109078956781 + - 1.204670585909959 + - 1.5659934118969099 + - 1.2357560925158158 + - !!python/tuple + - 0.9851881680889496 + - 1.8496353331390705 + - 1.8182095439134802 + - 1.1738797920106625 + - 1.8407918960337566 + - 1.4626710763977209 + - 1.2778313684328781 + - 1.4651215632189118 + - 1.4948105427636442 + - 1.6919021884783594 + - 1.2023418173953657 + - 1.565625890386291 + - 1.2460239784484133 + - !!python/tuple + - 0.9829438954152225 + - 1.852921303251246 + - 1.8217182125202962 + - 1.168818944348248 + - 1.8374835936483997 + - 1.4689993936358305 + - 1.2697677997936005 + - 1.4650944022669288 + - 1.4905502231792205 + - 1.6902241839171193 + - 1.2071944150556737 + - 1.5654773489671032 + - 1.2374220522625778 + - !!python/tuple + - 0.9845261369344354 + - 1.8491549509423366 + - 1.8134923589594139 + - 1.1729482769020276 + - 1.8305825247037648 + - 1.4700386653570807 + - 1.269836736891599 + - 1.4650426401159249 + - 1.491916408306796 + - 1.6894059120689353 + - 1.2064182416577143 + - 1.5651844981155068 + - 1.2392604930950366 + - !!python/tuple + - 0.9822153712406569 + - 1.8532100610489322 + - 1.8099163037732973 + - 1.1735609004531158 + - 1.8275635437984308 + - 1.4707248458964468 + - 1.2688476497867072 + - 1.4650249664001878 + - 1.4872547873245967 + - 1.689070699435049 + - 1.2062732059607189 + - 1.5650741756885935 + - 1.2396520013589847 + - !!python/tuple + - 0.9831753562790311 + - 1.851721554332438 + - 1.8101139470834904 + - 1.1728330440960644 + - 1.8255936904480128 + - 1.4717565471434488 + - 1.2666016481101774 + - 1.465014655516231 + - 1.488233534603581 + - 1.6883068296834867 + - 1.2092409215504645 + - 1.5650069935220265 + - 1.2364195728140794 + - !!python/tuple + - 0.9841348117431061 + - 1.849107477239367 + - 1.8056925488906137 + - 1.1737625898726902 + - 1.8221455646739917 + - 1.4717897121738397 + - 1.2679627836733194 + - 1.4649979467008325 + - 1.489831454399265 + - 1.6880400309548802 + - 1.2076899096022184 + - 1.5648948829774667 + - 1.238220500460223 + - !!python/tuple + - 0.9835892531431243 + - 1.8501836591079872 + - 1.8071706721997387 + - 1.1721379390653912 + - 1.8215714008200277 + - 1.4733646679952865 + - 1.26613662953274 + - 1.4649955824361875 + - 1.4886984510883245 + - 1.6876280819331655 + - 1.2087599948880285 + - 1.5648779738656629 + - 1.2361038284663664 + - !!python/tuple + - 0.9837298140544792 + - 1.8496116523774233 + - 1.8062206847054534 + - 1.1724450469878975 + - 1.8208857060141443 + - 1.473271614620503 + - 1.2665056646544535 + - 1.4649928312542695 + - 1.4890495601898972 + - 1.687593024172292 + - 1.20844630813449 + - 1.5648581040479976 + - 1.2365648766119615 + - !!python/tuple + - 0.9834877981952251 + - 1.8501520477065867 + - 1.805840643734764 + - 1.1725534889359794 + - 1.8206111657423174 + - 1.4732798892479466 + - 1.2665079408743516 + - 1.4649917645500201 + - 1.488493306603524 + - 1.6875791113555971 + - 1.2083311500224427 + - 1.5648503058601284 + - 1.2367355587902789 + - !!python/tuple + - 0.9836882154541285 + - 1.849445329966986 + - 1.804720829669093 + - 1.172869618320463 + - 1.8198019379042365 + - 1.4731712950193105 + - 1.2669193303549613 + - 1.4649886606758522 + - 1.4889432895376238 + - 1.6875382485917643 + - 1.2080031685916544 + - 1.5648275044350897 + - 1.237223285764171 + - !!python/tuple + - 0.983407657841469 + - 1.8500838830958788 + - 1.8042984549396066 + - 1.1729715261704583 + - 1.8194963832124906 + - 1.4731840977933761 + - 1.266902130569211 + - 1.4649875348407215 + - 1.4882917848192314 + - 1.6875229879553295 + - 1.207892179918703 + - 1.5648191067966466 + - 1.2373901761554895 + - !!python/tuple + - 0.9835107794375955 + - 1.8497558331635517 + - 1.803806983997665 + - 1.1730888734235665 + - 1.8191406941177586 + - 1.473136960797757 + - 1.267071402247063 + - 1.464986244069956 + - 1.4885085170982593 + - 1.687505297680775 + - 1.207768129187184 + - 1.5648094235067689 + - 1.2375774682169365 + - !!python/tuple + - 0.9833925689832442 + - 1.850041399538192 + - 1.8036235133243317 + - 1.1731288130916804 + - 1.8190078455189216 + - 1.4731432022535806 + - 1.26706036156786 + - 1.4649857706057756 + - 1.4882207544404435 + - 1.6874987231492016 + - 1.2077239884459892 + - 1.5648058472839501 + - 1.2376444402999829 + - !!python/tuple + - 0.9834218936490959 + - 1.8499499584975665 + - 1.8036722471242568 + - 1.173084855904545 + - 1.8189110853984616 + - 1.4731932652901616 + - 1.2669263785794367 + - 1.464985428081381 + - 1.4882820056003534 + - 1.6874540748873668 + - 1.207911791885924 + - 1.5648032535001524 + - 1.2374449790111557 + - !!python/tuple + - 0.9834774013722203 + - 1.8497717030777099 + - 1.803409935991695 + - 1.173144656204314 + - 1.8187225112929126 + - 1.4731672783329781 + - 1.2670182933068406 + - 1.4649847638333364 + - 1.4884008451813144 + - 1.6874452975626248 + - 1.20784317519127 + - 1.5647982140821868 + - 1.2375456835855068 + - !!python/tuple + - 0.9834277463993055 + - 1.8498931975868107 + - 1.8034388876697742 + - 1.1731183150492033 + - 1.8186672705010696 + - 1.4732061981314624 + - 1.2669103842227414 + - 1.464984571138291 + - 1.4882789805313295 + - 1.687419606073417 + - 1.2079508498400013 + - 1.5647967467855557 + - 1.237430955134774 + - !!python/tuple + - 0.9834468312381914 + - 1.8498316727378497 + - 1.803348933383125 + - 1.1731385669649452 + - 1.8186028641531293 + - 1.4731971114854154 + - 1.266942382178482 + - 1.4649843471121737 + - 1.4883201490591433 + - 1.6874167240670483 + - 1.2079266056966476 + - 1.5647950390809113 + - 1.2374659864200894 + - !!python/tuple + - 0.983425316434899 + - 1.8498848828080736 + - 1.803315325167549 + - 1.1731457698746357 + - 1.8185787987656807 + - 1.4731981220472115 + - 1.2669408422946815 + - 1.4649842636843675 + - 1.4882668998856305 + - 1.6874156481989293 + - 1.2079176267846479 + - 1.564794402327463 + - 1.2374789717975272 + - !!python/tuple + - 0.9834427550444044 + - 1.849828855607703 + - 1.8032337910633554 + - 1.173163881368971 + - 1.8185204136808804 + - 1.4731898938957295 + - 1.2669696957101748 + - 1.464984061532757 + - 1.488304480422975 + - 1.687413038932152 + - 1.207895914915774 + - 1.564792858702578 + - 1.2375103819687878 + - !!python/tuple + - 0.9834273502802402 + - 1.8498670194985019 + - 1.803243075030192 + - 1.17315552538487 + - 1.8185032352102586 + - 1.4732020947586597 + - 1.2669358928107015 + - 1.4649840022350729 + - 1.488266319114389 + - 1.6874049970223264 + - 1.207929608519304 + - 1.5647924053878888 + - 1.237474402943702 + - !!python/tuple + - 0.9834333486456339 + - 1.8498477199373935 + - 1.8032150456993554 + - 1.1731617289043734 + - 1.8184831896678062 + - 1.473199249022768 + - 1.2669458586323394 + - 1.4649839331025944 + - 1.4882792786349033 + - 1.687404112566645 + - 1.2079220751679214 + - 1.5647918767108475 + - 1.2374852502140934 + - !!python/tuple + - 0.9834333486456339 + - 1.8498477199373935 + - 1.8032150456993554 + - 1.1731617289043734 + - 1.8184831896678062 + - 1.473199249022768 + - 1.2669458586323394 + - 1.4649839331025944 + - 1.4882792786349033 + - 1.687404112566645 + - 1.2079220751679214 + - 1.5647918767108475 + - 1.2374852502140934 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.360550663534099 + - 9.931176078953275 + - 9.853510042319503 + - 9.395801474938432 + - 9.920903431502488 + - 9.863755626664688 + - 9.534142071007032 + - 9.618984370741618 + - 9.680440517243184 + - 9.750172487219722 + - 9.545171618885304 + - 9.55862231881673 + - 9.473179546270563 + - !!python/tuple + - 7.761478735588445 + - 9.703469076690213 + - 9.443151848069002 + - 7.896770140139568 + - 9.721654010692507 + - 9.502227472707043 + - 8.375069507703913 + - 8.679639046730061 + - 8.915569660372455 + - 9.12086473062143 + - 8.398862740002668 + - 8.449020315243914 + - 8.151685423752703 + - !!python/tuple + - 3.750579546130888 + - 8.916754445304958 + - 8.214708457594995 + - 4.1789295774954525 + - 9.215600174439176 + - 8.446546385140701 + - 5.471202411213533 + - 6.520495789767187 + - 7.061950987674508 + - 7.472113874474382 + - 5.366407522521694 + - 5.858033203961302 + - 4.870390169399155 + - !!python/tuple + - 1.3096350996085357 + - 7.939416652041561 + - 7.0056086456737665 + - 2.1290934950954408 + - 8.678160682224878 + - 7.428543008313921 + - 3.7783431749363716 + - 5.181324730396629 + - 5.965846349284462 + - 6.350371881134346 + - 3.142179866483336 + - 4.566356976642345 + - 3.0394057116559647 + - !!python/tuple + - 0.9102182751383112 + - 6.834572506946047 + - 5.894491073530205 + - 1.1414377810811818 + - 8.104123889421436 + - 6.372356850211298 + - 2.996252166539265 + - 4.4505266271504595 + - 5.169993241295127 + - 5.527639149633441 + - 1.3677938468920408 + - 3.7491879678505278 + - 2.146270796078042 + - !!python/tuple + - 2.23255490778115 + - 5.608640308017515 + - 4.9560248976598675 + - 1.680269136041523 + - 7.4588702492954075 + - 5.288387643615335 + - 2.3647864595400323 + - 3.797489191207721 + - 4.416940888810553 + - 4.710331802509149 + - 0.7735397775844082 + - 3.000706587144548 + - 1.6163632912532933 + - !!python/tuple + - 1.80687675395507 + - 5.380419525448352 + - 4.695356219048763 + - 1.4727427622894385 + - 7.2406921313669175 + - 5.031114183786502 + - 2.231397573390984 + - 3.5647475702641604 + - 4.223719446095873 + - 4.483394668087517 + - 1.4511473438903675 + - 2.8207336508996854 + - 1.5372460112990987 + - !!python/tuple + - 0.32805681355660044 + - 4.325000880394388 + - 3.5452839598998205 + - 0.9687620372826692 + - 6.233055217755856 + - 3.8984599443303716 + - 1.6889575924760003 + - 2.796394690292063 + - 3.3216040288433444 + - 3.5488545966066942 + - 0.46149619957315546 + - 2.2666823439288883 + - 1.475530418366103 + - !!python/tuple + - 1.815424689625836 + - 4.256599996395047 + - 3.49208965533638 + - 1.0488929020168114 + - 6.177531962046148 + - 3.83691375333316 + - 1.688314893996819 + - 2.7581693282974924 + - 3.283492187257118 + - 3.4999072621293768 + - 1.1484095427854224 + - 2.2402953034714166 + - 1.47320587409772 + - !!python/tuple + - 1.4783136017778484 + - 4.031634626450465 + - 3.265304242508398 + - 1.2418022050800335 + - 5.954089513213362 + - 3.605739241593988 + - 1.6683984844651276 + - 2.6057246958780653 + - 3.121984387242471 + - 3.300132536215066 + - 1.1558368794931293 + - 2.146742093371401 + - 1.4591724946952274 + - !!python/tuple + - 0.6257747421597935 + - 3.2459809394355967 + - 2.49667193948026 + - 1.2820625926808806 + - 5.119512577678652 + - 2.782272393778241 + - 1.538132043524811 + - 2.1334457977743426 + - 2.513223538961955 + - 2.5854327186679993 + - 1.1378353622143575 + - 1.8714964718064948 + - 1.4283593786518887 + - !!python/tuple + - 1.368475022048664 + - 3.1378682374934987 + - 2.4359193039523483 + - 1.263699413183755 + - 4.968905577648437 + - 2.6942319837361888 + - 1.505814000902359 + - 2.07674601354859 + - 2.4327497831908995 + - 2.4918477444308706 + - 1.1566879176840614 + - 1.8461084876724432 + - 1.4036272319499241 + - !!python/tuple + - 0.9948423279688754 + - 2.9569487069050586 + - 2.2317093858264547 + - 1.1689767554095425 + - 4.55029570796087 + - 2.493684353523867 + - 1.424559570004246 + - 1.8939725690086022 + - 2.198121155421873 + - 2.2570231218838344 + - 1.2018130023491362 + - 1.746208751406493 + - 1.3196710189277523 + - !!python/tuple + - 1.3993656913395376 + - 2.5293323110707426 + - 2.0195981030587804 + - 1.2906576545469368 + - 3.879768111498496 + - 2.155581042519171 + - 1.3668062425071557 + - 1.749670488555487 + - 1.902076345126012 + - 1.933452072614516 + - 1.0971276009171687 + - 1.6634573700428006 + - 1.362052769063319 + - !!python/tuple + - 1.022471340323209 + - 2.439461651728916 + - 1.9568072999941344 + - 1.1527050139656325 + - 3.542336790937149 + - 2.0764429918732143 + - 1.3523847939065392 + - 1.6319372312207865 + - 1.807641493704946 + - 1.8352245232628268 + - 1.2576353668316367 + - 1.5940265230657233 + - 1.2688794100064156 + - !!python/tuple + - 1.298192155266429 + - 2.103680892164735 + - 1.8578670614574682 + - 1.2367588191229368 + - 2.928019682542563 + - 1.9237108541076673 + - 1.3235046906474563 + - 1.5656521036243134 + - 1.6348298839157807 + - 1.6909962522839705 + - 1.0602420617217578 + - 1.5758870361891404 + - 1.2893008162993944 + - !!python/tuple + - 1.0981083224476642 + - 2.0936940043869647 + - 1.875548555027631 + - 1.1474038402566569 + - 2.786318709080123 + - 1.926945273310261 + - 1.3440375801383293 + - 1.5123344359278346 + - 1.6424331840799895 + - 1.7141239928801113 + - 1.2288812637422923 + - 1.4546588381288494 + - 1.2552981413586066 + - !!python/tuple + - 1.0354500995333464 + - 1.98303362419659 + - 1.7679248419625937 + - 1.1852557993499966 + - 2.3195969281762587 + - 1.8541116699656612 + - 1.2634254837329484 + - 1.5219644942937394 + - 1.6599853909500242 + - 1.619649126102587 + - 1.1633923446084735 + - 1.5150524658444986 + - 1.259565519114121 + - !!python/tuple + - 1.1045163165115914 + - 1.9637059877813952 + - 1.7892366715053152 + - 1.1257696053517892 + - 2.3091233019313413 + - 1.8597128236218106 + - 1.3157954016476296 + - 1.457489667840849 + - 1.6463559257948492 + - 1.6639113645398123 + - 1.2294205331403583 + - 1.4059896433550634 + - 1.2235418374902525 + - !!python/tuple + - 1.0755452413536652 + - 1.9588664454225992 + - 1.7798597213582465 + - 1.1497297419369152 + - 2.2740470134366855 + - 1.85670575923833 + - 1.3105847927380765 + - 1.4754376573461974 + - 1.6234201842631553 + - 1.6559208690757847 + - 1.2151757015962295 + - 1.4318452024086021 + - 1.250370015542824 + - !!python/tuple + - 1.0765897125025892 + - 1.955074190749619 + - 1.767796589615718 + - 1.1432997338044597 + - 2.2822998634353238 + - 1.8520953134050657 + - 1.3073604626292572 + - 1.4555074643582144 + - 1.6157423271785845 + - 1.6505408427358048 + - 1.2240582079258688 + - 1.4355172072214828 + - 1.2314890006115629 + - !!python/tuple + - 1.0765437443394594 + - 1.950150920488697 + - 1.7711235823749392 + - 1.1431275836988832 + - 2.2582021624836184 + - 1.8512853103053737 + - 1.3051953216287522 + - 1.449476914685054 + - 1.6073450161334162 + - 1.644504682725782 + - 1.2252617007633437 + - 1.4462392952169871 + - 1.2321264417856226 + - !!python/tuple + - 1.0765711569711505 + - 1.9466212366059896 + - 1.7556587291931376 + - 1.1431854576262455 + - 2.256259565151128 + - 1.8458747934526951 + - 1.3073455362062443 + - 1.4470050913668926 + - 1.6100155119766464 + - 1.641238176339291 + - 1.2252585320949563 + - 1.4419979089558046 + - 1.229886531209421 + - !!python/tuple + - 1.076567447996876 + - 1.946014622819529 + - 1.757446772445422 + - 1.1431811510928056 + - 2.2517486730288843 + - 1.846142309481099 + - 1.3074043618457534 + - 1.4468013711411671 + - 1.610345182345313 + - 1.6408128108411513 + - 1.225258584184896 + - 1.441653877074067 + - 1.229915529099456 + - !!python/tuple + - 1.0765636933682006 + - 1.9451015941576042 + - 1.7534754741111622 + - 1.1431763704831948 + - 2.251434848687539 + - 1.8447104578035414 + - 1.3074793223700067 + - 1.4465240745978145 + - 1.61081602218827 + - 1.6402011246391694 + - 1.2252586468555253 + - 1.4411864846385314 + - 1.2299505487773794 + - !!python/tuple + - 1.0765632413232264 + - 1.9448585268559146 + - 1.752460915594563 + - 1.1431756565722697 + - 2.251347989500191 + - 1.8443365852227973 + - 1.3072312197066096 + - 1.4465096668230113 + - 1.6101559863939037 + - 1.640050435934478 + - 1.2252469025574015 + - 1.441940067681997 + - 1.2302009555325017 + - !!python/tuple + - 1.076563078190043 + - 1.944755296436823 + - 1.7528896513749561 + - 1.143175389894216 + - 2.250450856745586 + - 1.8444157108764154 + - 1.307248362083594 + - 1.4464829809172683 + - 1.6102213310485354 + - 1.6399877498664523 + - 1.225247519664661 + - 1.4418703584800925 + - 1.230190786318013 + - !!python/tuple + - 1.076562803471218 + - 1.9445694370970728 + - 1.7520985274431737 + - 1.1431749346419824 + - 2.2503965906392316 + - 1.844125383090288 + - 1.3072782910852483 + - 1.4464358425136712 + - 1.6103377955777771 + - 1.6398758830300264 + - 1.225248586711885 + - 1.441747261657806 + - 1.2301731909887386 + - !!python/tuple + - 1.076562735446447 + - 1.9445171843423554 + - 1.7523271603611419 + - 1.1431748188846758 + - 2.249929477641368 + - 1.8441686486380715 + - 1.307286235485062 + - 1.44642305173044 + - 1.6103699312212643 + - 1.639844944114341 + - 1.2252488647878994 + - 1.4417138798088098 + - 1.2301685998129075 + - !!python/tuple + - 1.0765626174782077 + - 1.9444234022008828 + - 1.7519249346950962 + - 1.1431746167467818 + - 2.2499054011097277 + - 1.844021133890181 + - 1.3073002685582682 + - 1.446400321534776 + - 1.6104273049114508 + - 1.6397896712562292 + - 1.2252493535525402 + - 1.441654567572948 + - 1.230160527344339 + - !!python/tuple + - 1.0765626174782077 + - 1.9444234022008828 + - 1.7519249346950962 + - 1.1431746167467818 + - 2.2499054011097277 + - 1.844021133890181 + - 1.3073002685582682 + - 1.446400321534776 + - 1.6104273049114508 + - 1.6397896712562292 + - 1.2252493535525402 + - 1.441654567572948 + - 1.230160527344339 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.34616323997991 + - 9.895677216344668 + - 9.743811386100932 + - 9.319571162627003 + - 9.968469128841143 + - 9.814089924793947 + - 9.585395776046322 + - 9.562687718064167 + - 9.641179666872873 + - 9.68924582321333 + - 9.569748387603212 + - 9.699475153089491 + - 9.594452727103835 + - !!python/tuple + - 7.6973070202293865 + - 9.582031264326979 + - 9.097678420476301 + - 7.638779984613785 + - 9.8314888075541 + - 9.338511351847718 + - 8.557824447244302 + - 8.486445342982382 + - 8.756710275522853 + - 8.905502684620833 + - 8.47805177781836 + - 8.962309087070759 + - 8.573328866213632 + - !!python/tuple + - 3.5015747169077187 + - 8.700833317311119 + - 7.122214930415846 + - 3.557460348913084 + - 9.235741810464713 + - 7.869276879141433 + - 6.158921003994205 + - 5.9605582694800265 + - 6.676572704241984 + - 6.952323099558246 + - 5.671415220370545 + - 7.091377498007086 + - 6.078428072125814 + - !!python/tuple + - 1.0428460866874834 + - 7.701592579147599 + - 5.594525490868825 + - 1.320586735652184 + - 8.614616191622263 + - 6.594988394279094 + - 4.810910368897991 + - 4.277797967233472 + - 5.565927123652676 + - 5.713289643319446 + - 3.8509087795705135 + - 5.920862335051124 + - 4.498375407759005 + - !!python/tuple + - 1.4230660177670402 + - 6.3574782750465495 + - 4.191964817569922 + - 0.8974876285289719 + - 7.862651376406583 + - 5.142848690051068 + - 3.6012767270735737 + - 2.8183605276117873 + - 4.610564172294633 + - 4.50580223255693 + - 2.051024576621544 + - 4.820379509002601 + - 3.0215984107102507 + - !!python/tuple + - 0.5954503236715886 + - 5.3750557079533 + - 3.1116455973933386 + - 2.3326094007438583 + - 7.060137237302327 + - 4.066582160821012 + - 2.694693112336131 + - 2.0612408130549014 + - 3.9113477226281708 + - 3.597508454593811 + - 1.0120783214993494 + - 4.012947219657288 + - 2.045853999838404 + - !!python/tuple + - 1.9017835561895255 + - 5.133453706410459 + - 2.9580307513233612 + - 1.9239254122922267 + - 6.851390179753493 + - 3.864722114478588 + - 2.45312531794844 + - 1.9401800754761798 + - 3.6960359413690664 + - 3.33693760516228 + - 1.2838897963801843 + - 3.79510277041985 + - 1.8552260446658255 + - !!python/tuple + - 1.1284443397851849 + - 4.723222979146406 + - 2.5696053113293624 + - 1.3158714259906745 + - 6.34155893683654 + - 3.4282397857335405 + - 2.080491873720309 + - 1.7550182499111295 + - 3.2620233661274054 + - 2.9135268532579484 + - 1.2230759409507928 + - 3.3734752885398285 + - 1.6184944278972364 + - !!python/tuple + - 1.1194686629535875 + - 3.0155852503638885 + - 1.813485571566741 + - 0.9279928968560857 + - 4.622516225818249 + - 2.051595803598091 + - 1.3929857896563977 + - 1.3570079962270172 + - 2.3637865219717797 + - 1.7855162747194175 + - 1.2006329518826857 + - 2.3112183166748737 + - 1.4491668571181409 + - !!python/tuple + - 0.9148116849496736 + - 2.5115893883616955 + - 1.667935668705316 + - 2.0234818443362363 + - 3.530063569017339 + - 1.7555435258519068 + - 1.631218308976991 + - 1.5850154165755754 + - 1.908160306912173 + - 1.6504722710693707 + - 1.2632830584205024 + - 1.7324055048547176 + - 1.4626151283245326 + - !!python/tuple + - 1.2136311822149821 + - 2.359416124570165 + - 1.6610379545375218 + - 1.3365542034522524 + - 3.3218318456759675 + - 1.7641715035831882 + - 1.486191135455758 + - 1.4092000577298944 + - 1.7344087580433614 + - 1.5797228335629316 + - 1.271053494735746 + - 1.6325361737048445 + - 1.342772744284545 + - !!python/tuple + - 0.8544150807521622 + - 2.169737440657721 + - 1.5272495237004073 + - 0.8603305403689153 + - 2.9501691308611666 + - 1.7149131111042004 + - 1.4350908353229117 + - 1.3947271927183384 + - 1.6398023620807973 + - 1.5718422134156302 + - 1.2492665162331107 + - 1.5923477022551507 + - 1.3812893445293848 + - !!python/tuple + - 1.113150953736234 + - 2.1032336915855323 + - 1.5103517406602407 + - 1.1646505840097459 + - 2.8478423250746356 + - 1.692391629703674 + - 1.4426292976129982 + - 1.380594735970746 + - 1.6320129220064854 + - 1.5641717202546284 + - 1.256791004974139 + - 1.5810783336477576 + - 1.3709453383872912 + - !!python/tuple + - 1.0309983568773033 + - 2.0611851069859455 + - 1.527965951899841 + - 1.0572221260963317 + - 2.742443203364935 + - 1.6984845641775679 + - 1.4223620561970411 + - 1.3524886153396867 + - 1.598147329275024 + - 1.5370885108654015 + - 1.2799877007490799 + - 1.5586202049158095 + - 1.336401632207709 + - !!python/tuple + - 1.0739952671940818 + - 1.9590967810691842 + - 1.4241285639445618 + - 1.10771330269679 + - 2.4578077044074487 + - 1.6676302434782315 + - 1.4186870378718215 + - 1.3439346317022889 + - 1.576591832418441 + - 1.4892324508214123 + - 1.2850025942733818 + - 1.5638479757849821 + - 1.3303929542522748 + - !!python/tuple + - 1.0290301550874865 + - 1.9524864267225281 + - 1.4794780898689741 + - 1.0547870121594722 + - 2.3933587931467097 + - 1.6825396588491048 + - 1.4157497239301908 + - 1.32500863021725 + - 1.5419976531100767 + - 1.5148845913069688 + - 1.2552494362915874 + - 1.5422970149292419 + - 1.3415734505723134 + - !!python/tuple + - 1.0594913737108766 + - 1.9250363668934094 + - 1.4974019037518536 + - 1.0699968154016288 + - 2.3145082556614645 + - 1.686574190727551 + - 1.4010639901207955 + - 1.3003051627834403 + - 1.5484492806733323 + - 1.501853542465889 + - 1.310767447350109 + - 1.526949103216297 + - 1.3082523241057165 + - !!python/tuple + - 1.0392716022201678 + - 1.9249711408319101 + - 1.4814209096170847 + - 1.0649638156713004 + - 2.2965437893538776 + - 1.6828764997503933 + - 1.3925734687383036 + - 1.3130315023639063 + - 1.5276451824630353 + - 1.511624855468581 + - 1.2741645618931836 + - 1.5426426676320106 + - 1.3344372789478138 + - !!python/tuple + - 1.0429084508853939 + - 1.915727901702172 + - 1.4669638939031386 + - 1.062595477368915 + - 2.280346561305396 + - 1.6774945954532305 + - 1.3928411539220003 + - 1.3140839928154717 + - 1.5273522476070613 + - 1.5119018709725338 + - 1.2868396738012253 + - 1.5356951879117786 + - 1.3315572268826834 + - !!python/tuple + - 1.0425875669128208 + - 1.9114974358414176 + - 1.4750255868608744 + - 1.0603412622463602 + - 2.2722477574765514 + - 1.6794432975360392 + - 1.3865645709604424 + - 1.3142167875009925 + - 1.523800636834203 + - 1.5084815905716271 + - 1.2772673865036683 + - 1.537356459044871 + - 1.3349258181142938 + - !!python/tuple + - 1.0425361290997062 + - 1.9097806819939023 + - 1.4778380185816442 + - 1.0599455913289206 + - 2.2688054254792047 + - 1.6801895906287958 + - 1.387376372290842 + - 1.312212590225777 + - 1.5240856180018558 + - 1.5088551907296677 + - 1.2811316603554743 + - 1.532444063390171 + - 1.3313198982543846 + - !!python/tuple + - 1.042516643612334 + - 1.9089045597410714 + - 1.4760647187346685 + - 1.0603674428893448 + - 2.2670131858544695 + - 1.6795567367817785 + - 1.3862141448142717 + - 1.3135162363617705 + - 1.523386795726436 + - 1.5081819397592733 + - 1.2786775978755012 + - 1.5349508487165822 + - 1.3336590280927045 + - !!python/tuple + - 1.0424603051169534 + - 1.90597630187008 + - 1.4755722031131924 + - 1.0606510158313862 + - 2.2609596173856747 + - 1.6780572244422485 + - 1.3836054694837796 + - 1.3121763289415664 + - 1.5239819970581774 + - 1.5059924070445623 + - 1.2835602727550317 + - 1.5381754497099176 + - 1.3298027142744675 + - !!python/tuple + - 1.0413395733354947 + - 1.9065201723180552 + - 1.4736693361488062 + - 1.0607216727494146 + - 2.259029064393274 + - 1.677668485657138 + - 1.3836885921369964 + - 1.3134869689938937 + - 1.5223160476703552 + - 1.5063729093694314 + - 1.2804902087740917 + - 1.5386740732870507 + - 1.3326357793174635 + - !!python/tuple + - 1.0414673225995368 + - 1.9059201445770253 + - 1.4748672156192275 + - 1.0605182053469984 + - 2.2577857940869763 + - 1.6780217749936757 + - 1.3841636908190589 + - 1.3127173109421515 + - 1.5224882572890754 + - 1.5066073909165623 + - 1.2818501942434506 + - 1.5366325598395665 + - 1.3313030455158887 + - !!python/tuple + - 1.0415156193214812 + - 1.9056675867596313 + - 1.474842112512943 + - 1.0605377606804611 + - 2.2572583509150417 + - 1.677898469620552 + - 1.3843572660039138 + - 1.3125550904773005 + - 1.5225593575148086 + - 1.506704078310934 + - 1.2822253576379778 + - 1.5363285286005377 + - 1.3309952798887945 + - !!python/tuple + - 1.0415408030990534 + - 1.9055299482223436 + - 1.4748285652852826 + - 1.0605479866819767 + - 2.2569699411420387 + - 1.6778315341938084 + - 1.3844034435923143 + - 1.312633312481495 + - 1.5224482775850807 + - 1.5067563163363153 + - 1.2817852999957948 + - 1.536371472352433 + - 1.3312762831270921 + - !!python/tuple + - 1.0415747112002962 + - 1.9053401402759738 + - 1.4748099829577266 + - 1.0605617762914097 + - 2.2565714840897693 + - 1.6777394261114622 + - 1.3845468466907245 + - 1.3125114376159235 + - 1.5225029099930114 + - 1.5068280142472885 + - 1.2820722949499646 + - 1.5361431608319918 + - 1.3310424588230496 + - !!python/tuple + - 1.0415925533333592 + - 1.9052368770530757 + - 1.4747999483072796 + - 1.0605690477854388 + - 2.256354154543822 + - 1.677689464751771 + - 1.3845801519429377 + - 1.3125712373810023 + - 1.5224190371589832 + - 1.5068667654413141 + - 1.2817402449646609 + - 1.5361769678136492 + - 1.33125512822713 + - !!python/tuple + - 1.0416165114824174 + - 1.9050956880873882 + - 1.4747862836850179 + - 1.0605788230631512 + - 2.256056592196461 + - 1.6776212649673057 + - 1.3846856789320048 + - 1.3124805886537747 + - 1.5224603529727012 + - 1.5069195595876361 + - 1.2819565530762318 + - 1.5360072266424738 + - 1.3310797679456765 + - !!python/tuple + - 1.0416292111611374 + - 1.9050189592568034 + - 1.474778898925428 + - 1.0605840129529676 + - 2.2558945733544333 + - 1.6775842846848665 + - 1.384709687427222 + - 1.3125256384716584 + - 1.5223977312676684 + - 1.5069481096757156 + - 1.2817087654941364 + - 1.5360332330056734 + - 1.3312388191402313 + - !!python/tuple + - 1.0416462369312698 + - 1.9049146955385037 + - 1.4747688944410138 + - 1.0605909767087476 + - 2.255674183078142 + - 1.6775340947873845 + - 1.3847869948079483 + - 1.312458695482873 + - 1.5224286172329422 + - 1.5069868015568857 + - 1.281870058333666 + - 1.5359079278313739 + - 1.3311085278899029 + - !!python/tuple + - 1.041590194807652 + - 1.9049478397151278 + - 1.4747641195460033 + - 1.060577274666327 + - 2.2555684102680713 + - 1.6775244473142263 + - 1.3847865103916326 + - 1.3124883301476629 + - 1.5223378569629735 + - 1.5070052771980282 + - 1.2817081750371675 + - 1.5359252934909475 + - 1.331212605984476 + - !!python/tuple + - 1.0416006365568902 + - 1.9048870825760353 + - 1.4747583417173231 + - 1.0605814236886697 + - 2.2554400790945905 + - 1.6774953113785576 + - 1.384831253162581 + - 1.3124494629875416 + - 1.5223561427317593 + - 1.5070276387190498 + - 1.281802397289378 + - 1.5358525253906616 + - 1.331136656861378 + - !!python/tuple + - 1.041568170968478 + - 1.9049064758622671 + - 1.4747555745655223 + - 1.0605734731557848 + - 2.2553784186436707 + - 1.6774897313110344 + - 1.3848308548824269 + - 1.3124668063323595 + - 1.5223032548547637 + - 1.5070383512603263 + - 1.281708033364796 + - 1.535862777635403 + - 1.331197385716358 + - !!python/tuple + - 1.0415744195988896 + - 1.9048711172406454 + - 1.4747522296123747 + - 1.0605759178650274 + - 2.2553037670268408 + - 1.677472812738894 + - 1.3848567907129117 + - 1.3124442346283833 + - 1.5223139938077412 + - 1.5070513024172167 + - 1.2817629458623172 + - 1.53582051354054 + - 1.3311531772547778 + - !!python/tuple + - 1.0415744195988896 + - 1.9048711172406454 + - 1.4747522296123747 + - 1.0605759178650274 + - 2.2553037670268408 + - 1.677472812738894 + - 1.3848567907129117 + - 1.3124442346283833 + - 1.5223139938077412 + - 1.5070513024172167 + - 1.2817629458623172 + - 1.53582051354054 + - 1.3311531772547778 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.371365536281052 + - 9.781797467894897 + - 9.827985123869738 + - 9.400455134088018 + - 9.887826010275708 + - 9.755502030565689 + - 9.451628417857622 + - 9.736636229334257 + - 9.629642952277003 + - 9.694293541398617 + - 9.418437391540005 + - 9.760298956625348 + - 9.638953943589248 + - !!python/tuple + - 7.792596836778664 + - 9.202079592623585 + - 9.429512643282324 + - 7.927069915480695 + - 9.605109999443219 + - 9.077828721566329 + - 8.087165323615547 + - 9.025197032338415 + - 8.696280168787068 + - 8.93086959083589 + - 8.037171564853864 + - 9.144086086092047 + - 8.697499289205739 + - !!python/tuple + - 3.7398247615107625 + - 7.756636052350542 + - 8.1641057488718 + - 4.438716917535105 + - 8.684321261295116 + - 6.97358658459896 + - 5.086420071510897 + - 6.936557575416298 + - 6.649769768013759 + - 7.0307757828324045 + - 4.723545237697225 + - 7.349748936855994 + - 6.166157839196549 + - !!python/tuple + - 1.2805237638154905 + - 6.660617829571809 + - 7.0397341868489365 + - 2.46625538680821 + - 7.909416097766367 + - 5.380247988931101 + - 3.4582239790056324 + - 5.426668185814366 + - 5.687299716725106 + - 5.892884874996451 + - 2.6896128814856306 + - 6.088636943660894 + - 4.564069403775476 + - !!python/tuple + - 0.8466368824914956 + - 5.773883715608536 + - 6.17037102868829 + - 1.3917369567269793 + - 7.187471800322536 + - 4.100475360149097 + - 2.4927314634292688 + - 4.256465565723159 + - 5.1034613121699985 + - 5.110738710934848 + - 1.4237944867042889 + - 5.131864336191591 + - 3.428563565413331 + - !!python/tuple + - 2.8711303315991366 + - 4.627719657182942 + - 5.051550218792992 + - 1.338485257223713 + - 6.150403865631755 + - 2.568222487192193 + - 1.7516442292279644 + - 2.939492849557226 + - 4.408241276183397 + - 4.306678709894381 + - 1.006991272997345 + - 4.0075926946450995 + - 2.2257031478248352 + - !!python/tuple + - 2.094306812544137 + - 4.270489480683157 + - 4.694954027290012 + - 1.344974664556838 + - 5.724589403554483 + - 2.240580650224164 + - 1.6466973465490293 + - 2.634543666638543 + - 4.102296019015081 + - 3.9607028529438835 + - 1.4418816421790646 + - 3.6681021904153095 + - 1.9300324709639358 + - !!python/tuple + - 1.1517390590779797 + - 3.767998656659804 + - 4.160363255095483 + - 1.3463646934839049 + - 5.116139703670479 + - 1.8467521900597523 + - 1.545395735799336 + - 2.3204141258415163 + - 3.6366886475278624 + - 3.484116273568514 + - 1.0733276458486465 + - 3.2152377140615043 + - 1.7293019334772286 + - !!python/tuple + - 1.0387565190219104 + - 2.795299242992626 + - 3.2092621095182126 + - 1.2697449827967544 + - 3.899728539409816 + - 1.3960064694072707 + - 1.4447125620107215 + - 1.752930894651017 + - 2.751808477904249 + - 2.5419166145185366 + - 1.8755984900403904 + - 2.373760448308105 + - 1.3477214326938296 + - !!python/tuple + - 1.1944652686310628 + - 2.569035766956845 + - 2.894733024981395 + - 1.301796544345183 + - 3.52986907918765 + - 1.4800276492687259 + - 1.4189109355395433 + - 1.8586815602529934 + - 2.4437303032045916 + - 2.383158271218819 + - 1.2643645560417243 + - 2.297075880140692 + - 1.5761967183078074 + - !!python/tuple + - 0.649209648019871 + - 1.3784632418890415 + - 1.4994949493584646 + - 1.248064536618991 + - 1.53490595186958 + - 1.6638234722385075 + - 1.525593346291339 + - 1.3394230103911582 + - 1.3100887234071885 + - 1.5528049493439364 + - 1.028008720737132 + - 1.1982051645488239 + - 1.2744156019823931 + - !!python/tuple + - 1.8557842128445388 + - 1.537467035196994 + - 1.6171306387761906 + - 1.2145763779486207 + - 1.732316123706325 + - 1.5897113722914882 + - 1.3462055201831873 + - 1.4940777118434978 + - 1.4602669943377173 + - 1.4983944026028873 + - 1.2397841692471345 + - 1.5565958576529515 + - 1.3802436128439357 + - !!python/tuple + - 1.4351162047489114 + - 1.6475500535389083 + - 1.700410779070074 + - 1.214169799019687 + - 1.8391776097103143 + - 1.560404905224494 + - 1.309542613498606 + - 1.52122616243757 + - 1.511897868738185 + - 1.5497970999467738 + - 1.2299688189031912 + - 1.612064138140221 + - 1.4007048948127339 + - !!python/tuple + - 0.966459616603746 + - 1.7244852848298229 + - 1.803732009708447 + - 1.2214466487515112 + - 1.9439519723353964 + - 1.5046446990437028 + - 1.3528719577019304 + - 1.5330275788632861 + - 1.5997645118161323 + - 1.6266877285391452 + - 1.2161112638591278 + - 1.6531680030172882 + - 1.4304639938942758 + - !!python/tuple + - 1.2082444030564858 + - 1.740334803677205 + - 1.8290784722715636 + - 1.218584228515788 + - 1.9766247538693544 + - 1.4998592947275704 + - 1.329591730973327 + - 1.542534967724805 + - 1.6091471436039064 + - 1.6303797476076476 + - 1.221392458705002 + - 1.6718180789315251 + - 1.4291595880559376 + - !!python/tuple + - 1.1341598802475497 + - 1.748708629937806 + - 1.843360033587605 + - 1.2244481862799346 + - 1.9890207484762672 + - 1.4980085196099628 + - 1.3371222407716743 + - 1.5442707621188878 + - 1.6134599951566708 + - 1.6374202637223916 + - 1.2149420779864133 + - 1.676719006340591 + - 1.4289841386825295 + - !!python/tuple + - 1.11818424602336 + - 1.75828303114357 + - 1.8605057200060378 + - 1.2174416343277716 + - 2.0164455064223854 + - 1.4963206211483193 + - 1.3419851778870726 + - 1.5388648724276568 + - 1.6179253526046387 + - 1.6448564694476873 + - 1.222804316189113 + - 1.674385397552542 + - 1.428463978887494 + - !!python/tuple + - 1.122650310673748 + - 1.7615717341472754 + - 1.8669767527604921 + - 1.2279160093222952 + - 2.0098673414787886 + - 1.4959707017232422 + - 1.35391398936814 + - 1.5416025651002296 + - 1.6201661149421986 + - 1.6470438315939802 + - 1.2162083504403687 + - 1.6780220466579134 + - 1.4285986895227394 + - !!python/tuple + - 1.123011736171198 + - 1.7630569797643683 + - 1.8700309728759283 + - 1.2273203743266763 + - 2.013231365008335 + - 1.4958409824263112 + - 1.3506733074110846 + - 1.5426653872191036 + - 1.6205235603817199 + - 1.6479689638031656 + - 1.21493480251263 + - 1.679590618902378 + - 1.4286444220386987 + - !!python/tuple + - 1.1231160929713169 + - 1.7637991844164589 + - 1.8715934139928956 + - 1.2286275744415764 + - 2.0112002636401205 + - 1.4957822229825668 + - 1.35320927280282 + - 1.5431579794042691 + - 1.6210227992699755 + - 1.6484160187178438 + - 1.2144902959899315 + - 1.6803563631136669 + - 1.4286643228128966 + - !!python/tuple + - 1.1231218259555997 + - 1.7638519779607575 + - 1.8717059835562049 + - 1.2285894814755929 + - 2.0113432568266014 + - 1.495778254978372 + - 1.353075424795245 + - 1.5431916482627193 + - 1.6210323068661276 + - 1.6484472513531825 + - 1.2144638411829802 + - 1.6804101549155515 + - 1.4286656395322106 + - !!python/tuple + - 1.1231253675754616 + - 1.7638851317738264 + - 1.8717767414443849 + - 1.228639472537719 + - 2.011249305906186 + - 1.4957757721470364 + - 1.3531793888741204 + - 1.543212732856682 + - 1.621054178267419 + - 1.6484668401132268 + - 1.2144474221322468 + - 1.6804439056605138 + - 1.4286664622856817 + - !!python/tuple + - 1.1231283198543685 + - 1.7639130552696538 + - 1.8718363713533541 + - 1.2286190319595292 + - 2.0113255385392934 + - 1.495773685784275 + - 1.3531081376797889 + - 1.5432304598754858 + - 1.621059131961519 + - 1.6484833253024873 + - 1.2144336952789039 + - 1.680472316027607 + - 1.4286671530592485 + - !!python/tuple + - 1.1231301594387149 + - 1.763930606778221 + - 1.8718738706030382 + - 1.2286455058663772 + - 2.0112754956530896 + - 1.4957723769185443 + - 1.3531634017012435 + - 1.5432415857330049 + - 1.6210707214759625 + - 1.6484936801452854 + - 1.2144251209050827 + - 1.6804901651308417 + - 1.4286675860942222 + - !!python/tuple + - 1.1231316982944155 + - 1.7639453696465104 + - 1.8719054216320838 + - 1.2286346174022178 + - 2.011315969259724 + - 1.495771277348402 + - 1.3531256030575927 + - 1.5432509351070247 + - 1.62107331927319 + - 1.648502386051567 + - 1.2144179371434116 + - 1.680505173847157 + - 1.4286679497167014 + - !!python/tuple + - 1.123132167885512 + - 1.7639498954459778 + - 1.8719150966448916 + - 1.2286414452005876 + - 2.01130302324681 + - 1.4957709406025004 + - 1.3531398842801394 + - 1.5432537990477537 + - 1.6210763092251494 + - 1.6485050540281074 + - 1.214415742121033 + - 1.68050977386288 + - 1.4286680610337228 + - !!python/tuple + - 1.1231325629318982 + - 1.7639537081825432 + - 1.8719232479630792 + - 1.2286386321739766 + - 2.011313490367053 + - 1.4957706570017921 + - 1.3531301233228128 + - 1.5432562111755976 + - 1.6210769785722203 + - 1.6485073014028193 + - 1.2144138948099916 + - 1.6805136488248371 + - 1.4286681547715587 + - !!python/tuple + - 1.123132811205919 + - 1.7639561072185819 + - 1.8719283772518918 + - 1.2286422516357038 + - 2.0113066221689575 + - 1.4957704786028627 + - 1.3531376977575302 + - 1.5432577286159803 + - 1.6210785636929026 + - 1.6485087153559068 + - 1.2144127334447012 + - 1.6805160868562443 + - 1.4286682137314035 + - !!python/tuple + - 1.123133020169101 + - 1.7639581279121213 + - 1.8719326978044988 + - 1.2286407592447386 + - 2.011312172794825 + - 1.4957703283635724 + - 1.353132522169832 + - 1.5432590065826333 + - 1.6210789180389298 + - 1.6485099062502049 + - 1.2144117557596843 + - 1.6805181403116658 + - 1.4286682633815142 + - !!python/tuple + - 1.123133025874815 + - 1.7639581831217224 + - 1.871932815855319 + - 1.2286408425425321 + - 2.0113120146647856 + - 1.4957703242592952 + - 1.3531326965339374 + - 1.5432590414955931 + - 1.6210789545202247 + - 1.6485099387863367 + - 1.2144117290593714 + - 1.6805181964144644 + - 1.428668264737797 + - !!python/tuple + - 1.1231330306829568 + - 1.763958229647044 + - 1.8719329153372504 + - 1.2286408081943974 + - 2.011312142475225 + - 1.49577032080062 + - 1.3531325773980787 + - 1.5432590709167782 + - 1.621078962678136 + - 1.6485099662046103 + - 1.214411706559204 + - 1.6805182436924422 + - 1.4286682658807353 + - !!python/tuple + - 1.123133033708814 + - 1.7639582589267588 + - 1.8719329779441252 + - 1.2286408523703578 + - 2.011312058612094 + - 1.4957703186239837 + - 1.3531326698705128 + - 1.5432590894323248 + - 1.6210789820255609 + - 1.6485099834596941 + - 1.214411692399353 + - 1.6805182734458015 + - 1.428668266600016 + - !!python/tuple + - 1.1231330362586853 + - 1.7639582836008219 + - 1.871933030703067 + - 1.2286408341540702 + - 2.0113121263950773 + - 1.4957703167897325 + - 1.3531326066880907 + - 1.5432591050353814 + - 1.6210789863519375 + - 1.6485099980005706 + - 1.2144116804669023 + - 1.680518298518993 + - 1.428668267206153 + - !!python/tuple + - 1.1231330362586853 + - 1.7639582836008219 + - 1.871933030703067 + - 1.2286408341540702 + - 2.0113121263950773 + - 1.4957703167897325 + - 1.3531326066880907 + - 1.5432591050353814 + - 1.6210789863519375 + - 1.6485099980005706 + - 1.2144116804669023 + - 1.680518298518993 + - 1.428668267206153 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.339421707230136 + - 9.82988015917654 + - 9.823860309017512 + - 9.397290962579252 + - 9.888507462347716 + - 9.64786860435319 + - 9.547813545313097 + - 9.656968191136473 + - 9.769684909566946 + - 9.72683019067072 + - 9.456909655066625 + - 9.737568501889745 + - 9.529601139203228 + - !!python/tuple + - 7.686912388427596 + - 9.404256453180363 + - 9.38317610498668 + - 7.889525674496716 + - 9.609560065548985 + - 8.766906163924464 + - 8.438014206222558 + - 8.777281329194944 + - 9.204122235742672 + - 9.043401274094037 + - 8.10905752677978 + - 9.06588904625022 + - 8.346584267576599 + - !!python/tuple + - 3.5787624610629765 + - 8.210114824731718 + - 8.271843597342446 + - 4.1571064716573485 + - 8.830448910505263 + - 6.4233240893008166 + - 5.722360231313585 + - 6.55658751709123 + - 7.858976535581621 + - 7.391676446004665 + - 4.783908387272531 + - 7.255358388071286 + - 5.416407159227225 + - !!python/tuple + - 1.0984058805814145 + - 7.243323122317647 + - 7.403911489392296 + - 2.041036166033749 + - 8.131927309995877 + - 4.7046573812991355 + - 4.208959911669079 + - 5.223724345391831 + - 6.911380193929663 + - 6.46334536086147 + - 2.5925364058715967 + - 5.916806625023111 + - 3.7403382223919515 + - !!python/tuple + - 1.0038459259785957 + - 6.425562941318139 + - 6.59014378560692 + - 0.8657984762730708 + - 7.552655157632352 + - 3.427309397565538 + - 3.1685335552903333 + - 4.21680101884862 + - 6.219077675354153 + - 5.686291558665467 + - 1.1902769280849135 + - 4.94051918227188 + - 2.592288726453855 + - !!python/tuple + - 1.1908587639400359 + - 5.913359720592258 + - 6.097316555892151 + - 1.8275637706403682 + - 7.071418182421774 + - 2.7008681731509636 + - 2.7233692652257195 + - 3.7060701687639033 + - 5.805095880423053 + - 5.261040625773599 + - 1.1184473344227426 + - 4.399882425905141 + - 2.1196570960788867 + - !!python/tuple + - 0.8482219535761796 + - 5.139935909560416 + - 5.386963166366884 + - 0.9356151418828274 + - 6.37616632373012 + - 1.790088875914394 + - 2.118668116390078 + - 2.933052889907347 + - 5.161145031236879 + - 4.657149157045713 + - 1.2623818357341552 + - 3.4819101477006824 + - 1.5249749598486773 + - !!python/tuple + - 1.648435514244635 + - 4.622536609902919 + - 4.872435211495201 + - 1.6843691764437765 + - 5.790727966713621 + - 1.474923738210619 + - 1.7823968788680926 + - 2.489264070785963 + - 4.660067232603797 + - 4.307912957084495 + - 0.9669827277928915 + - 3.0416289827224507 + - 1.564441902989521 + - !!python/tuple + - 1.036756711102673 + - 4.252460949817016 + - 4.4854361054834335 + - 1.2532663400139175 + - 5.404359934700705 + - 1.4606216129543894 + - 1.6168168847867714 + - 2.1748559042946525 + - 4.282121001608963 + - 3.967069891805819 + - 1.3506359299937152 + - 2.6753998334390072 + - 1.455895507660474 + - !!python/tuple + - 1.211184213506297 + - 3.3388921188579594 + - 3.6154715266464312 + - 1.191955039936599 + - 4.478279430008501 + - 1.2750673840707778 + - 1.4603262612762073 + - 1.6741976578080222 + - 3.44405537894174 + - 3.294065995789305 + - 0.5820384841336178 + - 2.1297945213515437 + - 1.6080516216595795 + - !!python/tuple + - 1.144950316560446 + - 3.258258252403736 + - 3.5319897935857996 + - 1.1857949381585258 + - 4.3785990066730145 + - 1.3305037414541756 + - 1.4428155791328647 + - 1.6575374399896476 + - 3.3560168741756553 + - 3.1936430673952474 + - 1.3208542799193421 + - 2.081359938709034 + - 1.5507465786781154 + - !!python/tuple + - 0.9748535210755475 + - 2.843541044807337 + - 3.125690508298159 + - 1.1892815010027988 + - 3.9215489094474045 + - 1.4390664395883463 + - 1.400290496378349 + - 1.6264989000772483 + - 2.9135711818244356 + - 2.7845237669597918 + - 0.9301996407362803 + - 1.9624388710659373 + - 1.4440403226736251 + - !!python/tuple + - 1.1611097374337738 + - 2.593028880289908 + - 2.8649365778220295 + - 1.191969433987403 + - 3.61519310880439 + - 1.4056859853314583 + - 1.426012733449809 + - 1.5862464396955245 + - 2.6759788499241295 + - 2.53637930870646 + - 1.3482246717117465 + - 1.8353929609072848 + - 1.4111247406021044 + - !!python/tuple + - 0.9097959019965901 + - 2.4122448288080767 + - 2.5081721293991017 + - 1.1924674779707527 + - 3.1687407395045657 + - 1.2995783457854853 + - 1.4109519862044086 + - 1.5964940409209067 + - 2.333619465383929 + - 2.2571392189158375 + - 0.9347582816839499 + - 1.8053195537443807 + - 1.4477356711987883 + - !!python/tuple + - 1.1843354507897006 + - 2.2713731847606478 + - 2.3855860487042704 + - 1.1561054424808908 + - 2.996363110015248 + - 1.3433079427923724 + - 1.386347437323019 + - 1.565903763883061 + - 2.218231398628435 + - 2.099318140948097 + - 1.3035520151441786 + - 1.7158917405729497 + - 1.349433037057913 + - !!python/tuple + - 0.9683123153135886 + - 2.1306291265178525 + - 2.187564399522078 + - 1.1850577518862928 + - 2.7714882866489283 + - 1.3250269925097091 + - 1.3539898541796607 + - 1.571886620791891 + - 2.037947695713539 + - 1.949022847592979 + - 1.0484418975336998 + - 1.7316732275149336 + - 1.402194950881727 + - !!python/tuple + - 1.1512443303578377 + - 2.019437590637951 + - 2.122923991692324 + - 1.1273287573193926 + - 2.5941360221461927 + - 1.3713720192753416 + - 1.2987540163459856 + - 1.5445626179476961 + - 1.9453206804209873 + - 1.8038834021206518 + - 1.2627964845717827 + - 1.6491216075435235 + - 1.2732219512489795 + - !!python/tuple + - 1.0218331225324317 + - 1.956069380575435 + - 2.0354504598546193 + - 1.1600402420215867 + - 2.4909112456386797 + - 1.315421126630126 + - 1.3547747007360247 + - 1.5196324806581947 + - 1.8624630637361257 + - 1.786340171531637 + - 1.1071316709852623 + - 1.6333024762205275 + - 1.3426049999637109 + - !!python/tuple + - 1.077021810614048 + - 1.896490408999618 + - 2.009670192933915 + - 1.128838797640383 + - 2.3909240845297024 + - 1.3667115241607763 + - 1.3033259788861855 + - 1.4875351269828636 + - 1.8240163056608252 + - 1.7151720060596358 + - 1.1954373186050788 + - 1.5969375968432655 + - 1.264556218550465 + - !!python/tuple + - 1.033668381911971 + - 1.8550167238242785 + - 1.963751917202629 + - 1.1590427813836024 + - 2.306811135827626 + - 1.3196102528573748 + - 1.328510622362201 + - 1.4752910906192513 + - 1.7866625411179662 + - 1.7093293504576221 + - 1.1306925684490483 + - 1.5788498824813004 + - 1.3076270916872148 + - !!python/tuple + - 1.0564502024132032 + - 1.8345762870736213 + - 1.9587554196525523 + - 1.1330776513434295 + - 2.2668157415980423 + - 1.3528601326098681 + - 1.3083108342169694 + - 1.4718358899155788 + - 1.7779132278338232 + - 1.6804997993116888 + - 1.1697646660976093 + - 1.5666161419854525 + - 1.2659871205426922 + - !!python/tuple + - 1.0409504307950166 + - 1.7957275308752685 + - 1.918115239441506 + - 1.1506658652642516 + - 2.179910223386134 + - 1.35129718338922 + - 1.3147347283664212 + - 1.467174788397285 + - 1.740408997319134 + - 1.652888156659404 + - 1.1397880475306854 + - 1.5476704602431084 + - 1.301931136041561 + - !!python/tuple + - 1.0516784016839869 + - 1.7906819065869355 + - 1.9214142015050348 + - 1.13609332785713 + - 2.1608460991521405 + - 1.3625082202825334 + - 1.3054375279829562 + - 1.4673789655167602 + - 1.7432540793776314 + - 1.6435758011366115 + - 1.164027491243207 + - 1.5473822203564362 + - 1.2713287761021566 + - !!python/tuple + - 1.0515056251948407 + - 1.7881312235465052 + - 1.9133021222209798 + - 1.1408238595763591 + - 2.1501340227670767 + - 1.3465226542770437 + - 1.313934910792074 + - 1.4674603912784348 + - 1.740221341550944 + - 1.652720768502446 + - 1.1555051900506819 + - 1.5472572259068078 + - 1.280053143428279 + - !!python/tuple + - 1.0509620917505111 + - 1.768680411207955 + - 1.8804528107622847 + - 1.1383126402781076 + - 2.0632180418086863 + - 1.3605322259727897 + - 1.309290611559263 + - 1.4680057780778626 + - 1.7173864167029784 + - 1.641807314155796 + - 1.1603791445303193 + - 1.5463819966180345 + - 1.3007589287930876 + - !!python/tuple + - 1.0511018855478387 + - 1.7688557422490991 + - 1.8834713590344805 + - 1.1367985300057415 + - 2.061766943352971 + - 1.362654616700573 + - 1.307290090661344 + - 1.4679734204432484 + - 1.7198855955841923 + - 1.6398268719027442 + - 1.162959177680797 + - 1.5464192709965563 + - 1.2914842040263976 + - !!python/tuple + - 1.0511596577787843 + - 1.7689542829215763 + - 1.8822979511270357 + - 1.1380803030606297 + - 2.060930221506206 + - 1.3579556744866057 + - 1.3095995369153655 + - 1.4679561921750488 + - 1.7199804264147793 + - 1.642692984793512 + - 1.160609053342543 + - 1.54643948933168 + - 1.2919477725415687 + - !!python/tuple + - 1.0511913850348755 + - 1.7690183130579937 + - 1.8834853226486805 + - 1.1374874629615486 + - 2.060378305379848 + - 1.3589710525699301 + - 1.3087651170129282 + - 1.467945342582179 + - 1.7209218675413587 + - 1.6418575125728845 + - 1.1616371980381799 + - 1.5464523586165382 + - 1.2887716511962564 + - !!python/tuple + - 1.0512429452174512 + - 1.7691343630678475 + - 1.8833016492678503 + - 1.1380031396443637 + - 2.0593679121342214 + - 1.3581764891300803 + - 1.3092007265767536 + - 1.4679260832306305 + - 1.7209852947366726 + - 1.6420669480017571 + - 1.1607567771363743 + - 1.5464753652393415 + - 1.2885109343550183 + - !!python/tuple + - 1.051249689933111 + - 1.7691532705891826 + - 1.8836736462502308 + - 1.1378163329894853 + - 2.0592001352250944 + - 1.3584965106091018 + - 1.30894270482446 + - 1.467923068609056 + - 1.7209955820019898 + - 1.6419203392476096 + - 1.1608856891596848 + - 1.546479016109637 + - 1.2879774896443366 + - !!python/tuple + - 1.0512675925968782 + - 1.7692051370788662 + - 1.883582836671082 + - 1.1380317790185919 + - 2.0587384469052834 + - 1.3581443056844484 + - 1.3091389985266626 + - 1.4679148523730048 + - 1.7210237807444628 + - 1.6420178345662184 + - 1.160530728743697 + - 1.546488988243575 + - 1.2879023189149426 + - !!python/tuple + - 1.0512690922723278 + - 1.7692099167279929 + - 1.8835744336460747 + - 1.138050310118615 + - 2.0586955252101538 + - 1.3581127973675298 + - 1.3091564457936673 + - 1.4679141089535817 + - 1.7210263739212437 + - 1.6420267645907962 + - 1.1605000261577416 + - 1.5464898961672155 + - 1.2878956581181693 + - !!python/tuple + - 1.0512691657500548 + - 1.769210152895049 + - 1.8835792190793967 + - 1.1380478749508351 + - 2.058693402679339 + - 1.3581169511423188 + - 1.3091531213163257 + - 1.4679140722820434 + - 1.7210265020279119 + - 1.6420248743078825 + - 1.1605017933958852 + - 1.5464899409788258 + - 1.2878889357569503 + - !!python/tuple + - 1.0512693870009844 + - 1.7692108643199904 + - 1.8835779664014767 + - 1.1380506195785478 + - 2.058687008552223 + - 1.358112270401293 + - 1.3091557127519056 + - 1.4679139618225754 + - 1.7210268879302162 + - 1.6420262036816615 + - 1.1604972468300565 + - 1.5464900759610285 + - 1.287887953534307 + - !!python/tuple + - 1.0512695322701031 + - 1.7692113320132004 + - 1.8835771428398203 + - 1.1380524222535313 + - 2.0586828045208514 + - 1.3581091945036996 + - 1.309157415539659 + - 1.4679138892242534 + - 1.7210271416164429 + - 1.642027077543741 + - 1.160494260427459 + - 1.5464901646841345 + - 1.2878873081593636 + - !!python/tuple + - 1.0512695554279707 + - 1.7692114066312363 + - 1.8835786557401124 + - 1.1380516520661965 + - 2.058682133735836 + - 1.358110508052576 + - 1.3091563643784097 + - 1.4679138776434657 + - 1.7210271820900063 + - 1.642026479891955 + - 1.1604948198753957 + - 1.5464901788379102 + - 1.287885183549693 + - !!python/tuple + - 1.0512696252220937 + - 1.7692116315476338 + - 1.8835782595241581 + - 1.1380525187951904 + - 2.0586801118055047 + - 1.3581090288700581 + - 1.3091571832974598 + - 1.467913842737148 + - 1.721027304086526 + - 1.6420269002074928 + - 1.1604933842365805 + - 1.5464902214999958 + - 1.28788487386092 + - !!python/tuple + - 1.0512696365578236 + - 1.769211668092271 + - 1.883578195145442 + - 1.1380526595813723 + - 2.0586797832676695 + - 1.358108788561604 + - 1.3091573163357062 + - 1.4679138370659828 + - 1.7210273239084606 + - 1.6420269684989741 + - 1.1604931510349108 + - 1.5464902284314113 + - 1.2878848235508034 + - !!python/tuple + - 1.0512696365578236 + - 1.769211668092271 + - 1.883578195145442 + - 1.1380526595813723 + - 2.0586797832676695 + - 1.358108788561604 + - 1.3091573163357062 + - 1.4679138370659828 + - 1.7210273239084606 + - 1.6420269684989741 + - 1.1604931510349108 + - 1.5464902284314113 + - 1.2878848235508034 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.302785222103184 + - 9.849176034964493 + - 9.852527345407196 + - 9.412750437900575 + - 9.974178755085488 + - 9.78466952540739 + - 9.545583562071728 + - 9.71107358745629 + - 9.647562917665487 + - 9.66118651733887 + - 9.572287615636219 + - 9.603015041872267 + - 9.511223016844987 + - !!python/tuple + - 7.5518549065897655 + - 9.470358346756443 + - 9.442341462628965 + - 7.979405420381283 + - 9.909322916668097 + - 9.178136706851758 + - 8.405781193203314 + - 9.033999811522278 + - 8.76240400190725 + - 8.818653139988935 + - 8.46349947758468 + - 8.624117497551147 + - 8.306831922167143 + - !!python/tuple + - 3.1851327475626725 + - 8.247598988506146 + - 8.403984098913455 + - 4.544214244480752 + - 9.745087002038265 + - 7.465067536632201 + - 5.551856589712289 + - 7.320675462531032 + - 6.523095569452973 + - 6.870805857618389 + - 5.592251590329575 + - 6.1480315122688705 + - 5.363199920379017 + - !!python/tuple + - 0.5419786574497274 + - 7.328776269749256 + - 7.538300496292845 + - 2.708511584512986 + - 9.300163878162982 + - 6.044101743432428 + - 3.981215300786026 + - 6.2284191176317005 + - 5.35062584872666 + - 5.61397177639433 + - 3.545060449231494 + - 4.5647260892786115 + - 3.4895859379927323 + - !!python/tuple + - 1.9366492000914968 + - 7.087710531494108 + - 7.361549874996794 + - 2.5226245907046283 + - 9.18800106508296 + - 5.714989677671548 + - 3.799209590558925 + - 6.055090827090798 + - 5.2030603533747835 + - 5.4102701449581 + - 3.183506600185092 + - 4.359976184636706 + - 3.265947294449177 + - !!python/tuple + - 0.8397845755211037 + - 6.4000791034514215 + - 6.802933667427103 + - 1.9509545854771053 + - 8.81712562107427 + - 4.700037593172898 + - 3.221825819985898 + - 5.508438502601281 + - 4.669095300262224 + - 4.769001579529345 + - 2.071074358422932 + - 3.7191849437311704 + - 2.577535226676366 + - !!python/tuple + - 2.086776574189017 + - 5.460456059320201 + - 6.079073344722891 + - 1.471914767440393 + - 8.270745823442503 + - 3.4304660937938722 + - 2.562894928904019 + - 4.731105104503897 + - 4.064761214582584 + - 3.940619006485177 + - 0.931109942951468 + - 2.8880999521169626 + - 1.7950034531812094 + - !!python/tuple + - 1.335561724486249 + - 5.13413697086111 + - 5.752471983105114 + - 1.4531509036575239 + - 7.974623868505237 + - 2.949878452663924 + - 2.318928371846227 + - 4.401207162439918 + - 3.7674447722733784 + - 3.5905910160633665 + - 1.4109842340561052 + - 2.5680870323649665 + - 1.6383527761956491 + - !!python/tuple + - 0.7255449498816848 + - 4.612473775539135 + - 5.230448651410027 + - 1.459901943547305 + - 7.432296263895652 + - 2.2527053615563544 + - 2.05022135779494 + - 3.8768728313559664 + - 3.3024944403953698 + - 3.0897504404824705 + - 1.0195512151494164 + - 2.1141154830940447 + - 1.5131686479813127 + - !!python/tuple + - 1.417544248384258 + - 4.421486523745632 + - 5.02686463408401 + - 1.4635049635229525 + - 7.160431515902472 + - 2.0968824244067488 + - 1.9509167867785189 + - 3.6685053572683155 + - 3.1510583696304177 + - 2.8865165314226133 + - 1.186173169621775 + - 1.987398379362232 + - 1.4591821854055136 + - !!python/tuple + - 0.8126046666577366 + - 4.1076963692979085 + - 4.595210585047001 + - 1.4672180724310235 + - 6.643246558874124 + - 1.8446263597722181 + - 1.7927387233859235 + - 3.312474664116853 + - 2.857097595868922 + - 2.5190707502221312 + - 1.1560339579232262 + - 1.788230371986877 + - 1.40589169442583 + - !!python/tuple + - 1.3912693280653983 + - 3.8564453642810865 + - 4.305814737743018 + - 1.4760320659138315 + - 6.273044600927618 + - 1.723924160855917 + - 1.7271793190078295 + - 3.0718943367437617 + - 2.6784056227273774 + - 2.2904323543046377 + - 1.1708186535785667 + - 1.7024271566535252 + - 1.4027384210931872 + - !!python/tuple + - 0.8446101893304371 + - 3.619852149728525 + - 3.946843335726232 + - 1.3942130295536748 + - 5.80684798517925 + - 1.6933033754606939 + - 1.609564191109133 + - 2.7850349010445585 + - 2.4274704686778157 + - 2.041186902685484 + - 1.1663901585534175 + - 1.6334830435866896 + - 1.401549804050375 + - !!python/tuple + - 1.3299570444567053 + - 3.3459189800711937 + - 3.6583393579699592 + - 1.4563578329582714 + - 5.389482902557897 + - 1.623741225587453 + - 1.6591787758641368 + - 2.569664594980913 + - 2.307936940565652 + - 1.9676503665656735 + - 1.1466063804520896 + - 1.6066337588322779 + - 1.4145860075038916 + - !!python/tuple + - 0.8319674474594536 + - 3.1614987813381368 + - 3.371267128526697 + - 1.3619157231727548 + - 4.9503576368808995 + - 1.6552577904206467 + - 1.5375061986568272 + - 2.334679344081711 + - 2.1099222428414333 + - 1.806211804694219 + - 1.169762554483626 + - 1.6101598255403318 + - 1.396176226693616 + - !!python/tuple + - 1.3022282492365347 + - 2.98809209757386 + - 3.1376657059050226 + - 1.3954220152990202 + - 4.604296108688496 + - 1.6515396210061397 + - 1.5279781032738817 + - 2.182815907439984 + - 2.015914233565436 + - 1.7604794884637893 + - 1.154972191221928 + - 1.5798843568433851 + - 1.39415638246625 + - !!python/tuple + - 0.8452720416119284 + - 2.8077639555387908 + - 2.8880499858247015 + - 1.331508668543786 + - 4.250614221829608 + - 1.6523175313246197 + - 1.4847573933031117 + - 1.9934704512411792 + - 1.8901406662364906 + - 1.6775356036981013 + - 1.172659555860059 + - 1.5580330930361506 + - 1.3608675742850895 + - !!python/tuple + - 1.2457145293786445 + - 2.619142830643288 + - 2.717876983851423 + - 1.3360829920778854 + - 4.044351773361321 + - 1.5978951094407905 + - 1.4563187371324189 + - 1.9087967038265468 + - 1.8230518821456363 + - 1.644115172191993 + - 1.160266858765688 + - 1.5535592196145491 + - 1.3616750953799965 + - !!python/tuple + - 0.9229258363984556 + - 2.525405266376373 + - 2.5463515426536105 + - 1.3026112487456283 + - 3.8009299529284144 + - 1.6240684223909876 + - 1.424990280031936 + - 1.8250317725317364 + - 1.7531517856988017 + - 1.5994252674419507 + - 1.1813673738803576 + - 1.534704141280404 + - 1.3262180086576472 + - !!python/tuple + - 1.2196429291862911 + - 2.315703313527299 + - 2.3862704219875663 + - 1.2944954540423732 + - 3.559114914111398 + - 1.5703880479067438 + - 1.389894552023828 + - 1.767002165161171 + - 1.6877316044369657 + - 1.5662995254540402 + - 1.1603915597106587 + - 1.4634350769996483 + - 1.3187582058598548 + - !!python/tuple + - 0.99414633545087 + - 2.262552639445686 + - 2.3375558561286547 + - 1.2330560470721463 + - 3.4149361150007884 + - 1.6189022521231566 + - 1.370052814087789 + - 1.7197449259938047 + - 1.6497402993028312 + - 1.5594148714138616 + - 1.2002667009047363 + - 1.4266967022195862 + - 1.3041791549029922 + - !!python/tuple + - 1.0923431125867835 + - 2.0294064618563383 + - 2.162123669624259 + - 1.3321704027373296 + - 3.0520596530822104 + - 1.5567813639649928 + - 1.360567036132149 + - 1.7036460153198079 + - 1.6083491831007202 + - 1.54748113408695 + - 1.1189408366585245 + - 1.4491666602078759 + - 1.3324683168767333 + - !!python/tuple + - 0.9999750551029148 + - 2.020046069731526 + - 2.1425243936321863 + - 1.2130585958053517 + - 2.968989242561125 + - 1.6021307205839241 + - 1.3562800653872151 + - 1.6636514451861373 + - 1.5799569896592087 + - 1.5479532088680301 + - 1.2118136654258072 + - 1.4063368971323775 + - 1.297209774170665 + - !!python/tuple + - 1.0909886119014194 + - 1.9890220637336284 + - 2.0032464115011672 + - 1.2135842382931696 + - 2.6280968772751736 + - 1.581186470002454 + - 1.3726310144333413 + - 1.627739833047181 + - 1.560775621373588 + - 1.5491172980853583 + - 1.204835006842325 + - 1.3472553539566499 + - 1.2672344880270123 + - !!python/tuple + - 1.0069370777897406 + - 1.9767430956426353 + - 2.0018093773768983 + - 1.17453053628749 + - 2.6119449036618554 + - 1.600059181577887 + - 1.3328382230182616 + - 1.6258327530477854 + - 1.5501923320071003 + - 1.5455384884980212 + - 1.2155258586241509 + - 1.3544870410182723 + - 1.2640874645806754 + - !!python/tuple + - 1.0153411881107994 + - 1.9641758437856598 + - 1.9948588093797956 + - 1.192017905985214 + - 2.6028404620811516 + - 1.591944962699601 + - 1.324447983530903 + - 1.628477050134021 + - 1.5521383418319872 + - 1.5441377220320818 + - 1.2126179297951756 + - 1.3624402053159383 + - 1.2642651762913255 + - !!python/tuple + - 1.016450482059357 + - 1.9590231541582512 + - 1.994826800761302 + - 1.1774626596705202 + - 2.5936704659060896 + - 1.6017739372267978 + - 1.3155784454325388 + - 1.6271081392194788 + - 1.5472879921316325 + - 1.5429820465800546 + - 1.2157425224029683 + - 1.3619039031854843 + - 1.2634869313543016 + - !!python/tuple + - 1.0168342370027985 + - 1.9549959591503734 + - 1.9924751196325996 + - 1.1835000253134933 + - 2.590556817123348 + - 1.5985930210412334 + - 1.3146692044579629 + - 1.628013858983505 + - 1.5482570874724448 + - 1.542664782866955 + - 1.2146113873103408 + - 1.3640020685749839 + - 1.2636438456314643 + - !!python/tuple + - 1.0167351834746001 + - 1.9556423045203872 + - 1.9925351437910008 + - 1.1801609959214872 + - 2.5882494727599386 + - 1.600991077341029 + - 1.3132537544592466 + - 1.6271260381641404 + - 1.5471897029199715 + - 1.542445232977677 + - 1.2160465630116861 + - 1.3623178760338475 + - 1.2626255854518067 + - !!python/tuple + - 1.01672700505422 + - 1.9537059069797453 + - 1.9896034562000264 + - 1.1829399093383592 + - 2.5843399894910504 + - 1.5994384906850756 + - 1.3124774978595617 + - 1.6266163314362128 + - 1.5484548927945223 + - 1.5420917144602897 + - 1.216739959041635 + - 1.362089065095086 + - 1.262584530393949 + - !!python/tuple + - 1.0167238930492715 + - 1.952592860497137 + - 1.9897524364272379 + - 1.1801492305871053 + - 2.5820221102731833 + - 1.6017547542049473 + - 1.3112330682236037 + - 1.6263352630856014 + - 1.5473305161517055 + - 1.5419001635352811 + - 1.2170690314531531 + - 1.361971775312867 + - 1.2625644727377945 + - !!python/tuple + - 1.0167233065077512 + - 1.9523304286200653 + - 1.9893397087934683 + - 1.1805602037954033 + - 2.5814653828986587 + - 1.6015146103700253 + - 1.311170141085253 + - 1.6262705908306492 + - 1.5475152360792546 + - 1.5418565358621363 + - 1.217138606584693 + - 1.3619458965423592 + - 1.262560164577688 + - !!python/tuple + - 1.016722925418689 + - 1.9521513870137641 + - 1.9893659898662968 + - 1.1801502634495304 + - 2.5810838718043247 + - 1.6018823363524417 + - 1.3109847969374249 + - 1.6262267213739343 + - 1.5473370301977662 + - 1.541827011684034 + - 1.217184909814296 + - 1.3619285102914207 + - 1.262557287530262 + - !!python/tuple + - 1.0167227579183988 + - 1.9520700332034842 + - 1.9892372403768035 + - 1.1802793425423614 + - 2.580909989990755 + - 1.6018063405838097 + - 1.31096703360591 + - 1.6262068660003572 + - 1.5473950204828582 + - 1.5418136706411727 + - 1.2172055956058918 + - 1.3619206928808056 + - 1.2625559992024875 + - !!python/tuple + - 1.0167198391553136 + - 1.9520987272178467 + - 1.989243231586272 + - 1.1801665036257474 + - 2.580824986626087 + - 1.6018928684343312 + - 1.3109263998762957 + - 1.6261759801657902 + - 1.5473554693746512 + - 1.5418071742576347 + - 1.2172487165506922 + - 1.3618623366749296 + - 1.2625210980493 + - !!python/tuple + - 1.0167197560049326 + - 1.9520395418963683 + - 1.989149623827665 + - 1.1802604272377601 + - 2.5806984857480564 + - 1.6018374595765767 + - 1.3109137998449392 + - 1.6261616686920082 + - 1.5473976585198745 + - 1.541797524900067 + - 1.2172633207259305 + - 1.3618569874945599 + - 1.2625203975148904 + - !!python/tuple + - 1.0167196987445495 + - 1.9519983379639478 + - 1.9891559481771326 + - 1.1801669420078325 + - 2.5806103286104274 + - 1.6019221025692858 + - 1.3108718224954121 + - 1.6261517182307863 + - 1.5473565805255978 + - 1.5417908195012051 + - 1.2172734312636864 + - 1.3618532763980133 + - 1.2625199121594008 + - !!python/tuple + - 1.0167196768650144 + - 1.9519824737960083 + - 1.9891308208110579 + - 1.1801921928371242 + - 2.580576362769071 + - 1.6019071803234324 + - 1.3108685212080613 + - 1.626147890621944 + - 1.5473679221960086 + - 1.5417882411214905 + - 1.2172773088581397 + - 1.361851851022917 + - 1.2625197259164116 + - !!python/tuple + - 1.0167196615998106 + - 1.9519713731562918 + - 1.9891325335299737 + - 1.1801670673179017 + - 2.58055258938062 + - 1.6019299807693734 + - 1.3108572428301022 + - 1.626145213264092 + - 1.5473568564241407 + - 1.5417864378406891 + - 1.2172800180684207 + - 1.3618508545739525 + - 1.262519595764857 + - !!python/tuple + - 1.016719641433926 + - 1.9519566788672496 + - 1.9891092500062313 + - 1.1801904748640226 + - 2.58052111376315 + - 1.6019161413551617 + - 1.3108542038699706 + - 1.6261416700228628 + - 1.5473673700320882 + - 1.5417840516013976 + - 1.2172836005845429 + - 1.3618495364012428 + - 1.2625194236346338 + - !!python/tuple + - 1.0167191147280066 + - 1.951961928770616 + - 1.9891103673580535 + - 1.1801700143483445 + - 2.5805056712112404 + - 1.6019318548939103 + - 1.3108468855665327 + - 1.6261360702403318 + - 1.5473601798220569 + - 1.5417828816957393 + - 1.2172913828852692 + - 1.3618389553109052 + - 1.2625130975405532 + - !!python/tuple + - 1.0167191013199832 + - 1.9519512519651594 + - 1.9890934515827607 + - 1.1801870227197029 + - 2.5804828011913186 + - 1.601921795272845 + - 1.3108446878751525 + - 1.6261335001043464 + - 1.5473678189907982 + - 1.5417811496983393 + - 1.217293971549441 + - 1.361838008564301 + - 1.2625129801844344 + - !!python/tuple + - 1.0167190919582576 + - 1.951943782576812 + - 1.989094613096928 + - 1.180170105608513 + - 2.5804667986208445 + - 1.6019371457255107 + - 1.3108371094961997 + - 1.6261317024858204 + - 1.5473603660835866 + - 1.5417799384124777 + - 1.2172957807280118 + - 1.3618373466453748 + - 1.2625128981546783 + - !!python/tuple + - 1.0167190822706682 + - 1.951936042571632 + - 1.9890823469911447 + - 1.1801824422649798 + - 2.5804502141511687 + - 1.6019298468983996 + - 1.3108355229898017 + - 1.6261298400462878 + - 1.5473659069462808 + - 1.5417786835333576 + - 1.2172976541310276 + - 1.3618366610462875 + - 1.2625128132047252 + - !!python/tuple + - 1.0167188050243072 + - 1.951938812904837 + - 1.9890829390246432 + - 1.1801716588215272 + - 2.5804420757330857 + - 1.6019381288683623 + - 1.310831671566465 + - 1.6261268899628005 + - 1.5473621163118951 + - 1.54177806796258 + - 1.2173017506218191 + - 1.3618310866188237 + - 1.2625094806361088 + - !!python/tuple + - 1.0167188050243072 + - 1.951938812904837 + - 1.9890829390246432 + - 1.1801716588215272 + - 2.5804420757330857 + - 1.6019381288683623 + - 1.310831671566465 + - 1.6261268899628005 + - 1.5473621163118951 + - 1.54177806796258 + - 1.2173017506218191 + - 1.3618310866188237 + - 1.2625094806361088 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.267986660505976 + - 9.906174284677068 + - 9.726353370286091 + - 9.373917751267834 + - 9.983300930755911 + - 9.751796479445455 + - 9.44144491145248 + - 9.733588900312535 + - 9.718766900785877 + - 9.796563502034878 + - 9.539489269434016 + - 9.757137790294783 + - 9.572172688407035 + - !!python/tuple + - 7.4380398734495845 + - 9.671586412325336 + - 9.042194720873232 + - 7.808744819597533 + - 9.941548385022733 + - 9.1312460147246 + - 8.045063418569063 + - 9.067519117380305 + - 9.015642099098011 + - 9.287933108738912 + - 8.388190758862908 + - 9.149940783314094 + - 8.502576110001655 + - !!python/tuple + - 2.993028797418858 + - 8.73976425266993 + - 7.260771537740844 + - 4.001136792853204 + - 9.83414238932593 + - 7.164572769394998 + - 4.6785364816051365 + - 7.263206046220007 + - 7.366911783857442 + - 7.903385388442532 + - 5.517210686450474 + - 7.6197813219546155 + - 5.791973124099398 + - !!python/tuple + - 0.4186538171798855 + - 7.684325792432645 + - 5.8346260992280605 + - 1.891718348890869 + - 9.48906620080346 + - 5.365011177666384 + - 3.257075445180749 + - 5.926515393445808 + - 6.585891944414071 + - 7.2319411361551165 + - 3.4258324207530726 + - 6.332555250900629 + - 4.208302244279727 + - !!python/tuple + - 2.1727522648477464 + - 7.519637141970153 + - 5.683505554816117 + - 1.7806943269423041 + - 9.429549549008135 + - 5.149671367280479 + - 3.1378448337092846 + - 5.786676486115257 + - 6.505432886292378 + - 7.158697354584127 + - 3.1940654996584303 + - 6.207548132236985 + - 4.055927621823644 + - !!python/tuple + - 1.3470781522884954 + - 7.142807589927722 + - 5.198532620301773 + - 1.400925554772531 + - 9.18506105325655 + - 4.55752412926937 + - 2.7111760094856967 + - 5.290488447401654 + - 6.2771905915452795 + - 6.907299443770892 + - 2.52200998138368 + - 5.785673898537766 + - 3.540206582056774 + - !!python/tuple + - 0.21730498726873515 + - 5.879490609090132 + - 3.8598315840055677 + - 1.0135225519640338 + - 8.275725990378325 + - 2.939288653105447 + - 1.581856304711979 + - 3.9226917523924616 + - 5.641636610774708 + - 6.003777583904575 + - 0.6598006733893496 + - 4.78756061211158 + - 2.189764371046557 + - !!python/tuple + - 1.4950246410578016 + - 5.8527711637610444 + - 3.843775751354268 + - 1.035798984432808 + - 8.254448730144187 + - 2.9154198472868242 + - 1.5796993936493777 + - 3.899849157696489 + - 5.631043808924542 + - 5.986146979265032 + - 0.7675137278012357 + - 4.769457483804907 + - 2.1707565213186593 + - !!python/tuple + - 1.2812812381257483 + - 5.664852801700894 + - 3.710847439809701 + - 1.178058549867612 + - 8.084434632910176 + - 2.7494843233573105 + - 1.5528493726120647 + - 3.7344619850813516 + - 5.535622634980683 + - 5.842341953090106 + - 1.286697254350365 + - 4.640320420926902 + - 2.027248722742975 + - !!python/tuple + - 0.3501419422637233 + - 4.377168667323449 + - 2.7704957622404294 + - 1.4598552271360243 + - 6.91556467772682 + - 1.6125244173187672 + - 1.2865852552899426 + - 2.674503815446124 + - 4.804926471911304 + - 4.894013397512073 + - 1.098168999105552 + - 3.807359733996737 + - 1.3189554887229413 + - !!python/tuple + - 1.1237048485357706 + - 4.341562489032315 + - 2.755599684707901 + - 1.4299872054634264 + - 6.877692422244162 + - 1.6205996351772327 + - 1.2826650770396968 + - 2.664672595424588 + - 4.771653024904372 + - 4.8563190707857755 + - 1.1087709996759751 + - 3.7841576619080466 + - 1.3450817339232226 + - !!python/tuple + - 0.9611057976910453 + - 4.095465077562371 + - 2.635821025211718 + - 1.1894267291989742 + - 6.570246546215989 + - 1.690785174381606 + - 1.2192305990609422 + - 2.5788456158394872 + - 4.504273758376768 + - 4.550654942485329 + - 1.192478570042483 + - 3.5950139695218972 + - 1.4742917856823987 + - !!python/tuple + - 1.1075764622610145 + - 3.702949591072857 + - 2.377697424681222 + - 1.152006778200114 + - 6.047730157038682 + - 1.7021710292068573 + - 1.3020805961061779 + - 2.4175160949272105 + - 4.075310796269906 + - 4.1142193022515645 + - 1.141112654004059 + - 3.3293446868268637 + - 1.5866482857613242 + - !!python/tuple + - 0.4852029778758312 + - 2.7029868365136305 + - 1.8940423408427114 + - 1.1367564236748056 + - 4.7278137058965894 + - 1.7531056175569852 + - 1.0608008727573794 + - 1.9485844793595088 + - 3.0953617398021587 + - 2.9249389262275924 + - 1.3988412284864322 + - 2.6240280970481438 + - 1.3998073586520334 + - !!python/tuple + - 1.1516935414938003 + - 2.6624250337619517 + - 1.8705824615891595 + - 1.152849020046025 + - 4.6629812712617325 + - 1.7275415716912175 + - 1.120940836658632 + - 1.9397616299567493 + - 3.0549928842974814 + - 2.889239064507207 + - 1.3457690041523611 + - 2.5902108797057153 + - 1.4232115507281404 + - !!python/tuple + - 0.9571246351154258 + - 2.531727896174155 + - 1.8089262843704694 + - 1.1795716952936632 + - 4.389970033890712 + - 1.6581141389126972 + - 1.2803243753551583 + - 1.904056475052741 + - 2.8555098669429824 + - 2.7408045932869647 + - 1.1621667838720207 + - 2.4422625800228697 + - 1.4755489985545212 + - !!python/tuple + - 1.3067688862660494 + - 2.0963156212169567 + - 1.787122068423243 + - 1.1138670758469102 + - 3.400369909608134 + - 1.5629807910321936 + - 1.1319476161533784 + - 1.8057291442013967 + - 2.2074693529084195 + - 2.139564974244065 + - 1.279742702155483 + - 1.9852088934732754 + - 1.3402069750439107 + - !!python/tuple + - 0.9428058416314629 + - 2.063810317776472 + - 1.6870538046843502 + - 1.193885156374689 + - 3.200901008302786 + - 1.5480166373769613 + - 1.3063395207400768 + - 1.704487884416043 + - 2.095588775330795 + - 2.1054728760440713 + - 1.159035792407897 + - 1.8931860688641977 + - 1.4322434529465602 + - !!python/tuple + - 1.1475705874588211 + - 2.0078098723939264 + - 1.672793182096325 + - 1.1171269500628447 + - 2.968328799945176 + - 1.5641320672607841 + - 1.2368607239426128 + - 1.5470649918500112 + - 1.955592781420909 + - 1.993423782019624 + - 1.2450504574970014 + - 1.8046242146406617 + - 1.3216246801702094 + - !!python/tuple + - 0.9750042038442523 + - 1.98788437398558 + - 1.6531407780923784 + - 1.1452181069785043 + - 2.8629895427326133 + - 1.5360031616212753 + - 1.2130928946584498 + - 1.579150676926685 + - 1.8837440076607372 + - 1.9471126761142767 + - 1.1661845376019342 + - 1.8012029450465725 + - 1.393434122302276 + - !!python/tuple + - 1.0613784112792795 + - 1.9420131782941157 + - 1.6392584664974503 + - 1.115097447787928 + - 2.79739148115991 + - 1.4971713443173442 + - 1.2466373050128101 + - 1.531068468833702 + - 1.8715232545241143 + - 1.9113616399838127 + - 1.214141081076764 + - 1.7578857334952078 + - 1.3463796308042988 + - !!python/tuple + - 0.9889012279947681 + - 1.9353869410103341 + - 1.6321598228692582 + - 1.1122213700660628 + - 2.745757025323655 + - 1.5148595316609803 + - 1.220007477654492 + - 1.519159828978281 + - 1.8212492756498264 + - 1.8884324269986308 + - 1.2013595353017745 + - 1.7415253236336394 + - 1.3555553699562648 + - !!python/tuple + - 1.0354536208478586 + - 1.909499721165848 + - 1.627976159091484 + - 1.1207624143597716 + - 2.7023074326102954 + - 1.493038861431314 + - 1.2406704317257524 + - 1.5043248453973512 + - 1.8254397603175108 + - 1.872285966500153 + - 1.209061170676023 + - 1.7228759375306735 + - 1.339356079344056 + - !!python/tuple + - 1.005643673646104 + - 1.9097730358475367 + - 1.6255177316872778 + - 1.1136350194837257 + - 2.667305713265317 + - 1.5083980531481682 + - 1.2235105918876923 + - 1.5041770943808346 + - 1.7947767005981103 + - 1.8612369642275435 + - 1.202467629638406 + - 1.7180247380273104 + - 1.3500377465753135 + - !!python/tuple + - 1.0230716808780247 + - 1.8963139508639735 + - 1.6212459356787434 + - 1.111291715702703 + - 2.5881785090825282 + - 1.505055230955663 + - 1.2566668129428606 + - 1.485807714204055 + - 1.784098380694399 + - 1.839524030921248 + - 1.2166771196759616 + - 1.6922916266936947 + - 1.3227169540868255 + - !!python/tuple + - 1.01290245216074 + - 1.8937487427397126 + - 1.6201483360131976 + - 1.1135536811732207 + - 2.5781797481912307 + - 1.4943872329297125 + - 1.237247469667003 + - 1.5027838481683862 + - 1.7584470658831672 + - 1.8356492653996401 + - 1.2008250645575487 + - 1.6957428535829826 + - 1.340032399956468 + - !!python/tuple + - 1.0102095760071637 + - 1.88776199885867 + - 1.6195832373473917 + - 1.1110006636377563 + - 2.5525476925162054 + - 1.5020990756218207 + - 1.2424538905540001 + - 1.4874584519126732 + - 1.7220890964830189 + - 1.8267485270134538 + - 1.2159441781511025 + - 1.684364881536715 + - 1.3262849135401713 + - !!python/tuple + - 1.0168610159939047 + - 1.8813055255560183 + - 1.6191668041458558 + - 1.1156561165338668 + - 2.547955654960288 + - 1.4895213248242425 + - 1.2361119856094982 + - 1.496926836382788 + - 1.7197692799415472 + - 1.8256578164539745 + - 1.2070689643082502 + - 1.6872454756491961 + - 1.335383602294644 + - !!python/tuple + - 1.0150701025949278 + - 1.8811322021471735 + - 1.6191713402091854 + - 1.1099524729979762 + - 2.551301867637324 + - 1.491171816150805 + - 1.2370820760920604 + - 1.494951988293743 + - 1.7172769731270179 + - 1.8249839022142083 + - 1.211948109137473 + - 1.6801532431825477 + - 1.3304996744292281 + - !!python/tuple + - 1.0168149904040955 + - 1.8786111982868077 + - 1.6191739396005302 + - 1.1117694326971388 + - 2.546461665733759 + - 1.4891384249632935 + - 1.2384017210699598 + - 1.494112031182852 + - 1.7223582042324426 + - 1.824586552498806 + - 1.2118358539769363 + - 1.6798823816600943 + - 1.3301927667802131 + - !!python/tuple + - 1.0126567923947256 + - 1.8785574272574284 + - 1.61918310742642 + - 1.1120360703143355 + - 2.53947773728947 + - 1.4931063488944756 + - 1.2396242987242592 + - 1.4911962765849325 + - 1.7160773093800166 + - 1.8231606242357905 + - 1.211471761924617 + - 1.6789212687110082 + - 1.3291607701940207 + - !!python/tuple + - 1.0155694804962607 + - 1.8754576802807073 + - 1.6191855991539728 + - 1.1138312334743 + - 2.537217180082653 + - 1.4903404312685178 + - 1.2402985625659262 + - 1.4904601847577126 + - 1.7176186972302188 + - 1.8227431175825148 + - 1.211408112794862 + - 1.678653071529347 + - 1.3289384417382888 + - !!python/tuple + - 1.015449717078653 + - 1.87547148941829 + - 1.6191858588858228 + - 1.1137916543732698 + - 2.536968423594254 + - 1.4904803068426233 + - 1.2398996240676656 + - 1.490593521979796 + - 1.7171344526510979 + - 1.8226986182486136 + - 1.2111814233158575 + - 1.6788179432726174 + - 1.3293802961112122 + - !!python/tuple + - 1.015375151997323 + - 1.8754803244045761 + - 1.6191860245936534 + - 1.1134913187294595 + - 2.5371758291787327 + - 1.4905693478598219 + - 1.2399128882238466 + - 1.490520221612883 + - 1.7170017400356297 + - 1.822670160794184 + - 1.2114131998732065 + - 1.6784465018339307 + - 1.3291527730453911 + - !!python/tuple + - 1.0151122884190125 + - 1.8755120170439135 + - 1.6191866179449286 + - 1.1134186777320652 + - 2.5366003539351407 + - 1.490887722253147 + - 1.2399600880314114 + - 1.4903450154763662 + - 1.7165261462651 + - 1.8225681086441117 + - 1.2113992280564583 + - 1.6783846694189195 + - 1.3290953705938295 + - !!python/tuple + - 1.0144926586722254 + - 1.8755917172903924 + - 1.6191881003326116 + - 1.1132441549069794 + - 2.535142969226879 + - 1.491678990790995 + - 1.2400753357317795 + - 1.489909574873325 + - 1.7153344211025543 + - 1.8223117407537486 + - 1.211365216974046 + - 1.6782298999736707 + - 1.3289541012119719 + - !!python/tuple + - 1.0144356681256625 + - 1.8756004714737955 + - 1.6191882603943897 + - 1.1129416206279668 + - 2.5353604503089215 + - 1.4917632708043476 + - 1.2400870411078826 + - 1.4898381751542062 + - 1.7152047488066113 + - 1.8222836591781912 + - 1.2116031845252628 + - 1.6778476187125342 + - 1.3287222748125407 + - !!python/tuple + - 1.0139436410929896 + - 1.8756774316744553 + - 1.6191896649062845 + - 1.1128350235715254 + - 2.533920075447454 + - 1.4925017286627422 + - 1.2401890920630423 + - 1.4894333469883887 + - 1.7140659496936528 + - 1.8220368623012075 + - 1.2115467798185293 + - 1.6777153127362636 + - 1.3286123193138422 + - !!python/tuple + - 1.0142660469209477 + - 1.8753011933155497 + - 1.6191899224148307 + - 1.112556393502057 + - 2.5342916183777793 + - 1.4921582326928222 + - 1.2402633512593193 + - 1.489317713501105 + - 1.7142761762719143 + - 1.8219909613543757 + - 1.211946390340423 + - 1.6770712880117917 + - 1.3282247586307647 + - !!python/tuple + - 1.0142060530211756 + - 1.8753123828724205 + - 1.6191900955171306 + - 1.1125496293409463 + - 2.5341055286954033 + - 1.492251462672622 + - 1.2399580444965856 + - 1.489428724879409 + - 1.7139218877109967 + - 1.8219600236056457 + - 1.2117649198910365 + - 1.6772062001088692 + - 1.328571192667892 + - !!python/tuple + - 1.0144550741810596 + - 1.875014650329218 + - 1.6191902973917915 + - 1.112719393132889 + - 2.5338875382724853 + - 1.4919803819340358 + - 1.2400207615215133 + - 1.489370515856062 + - 1.714090029961162 + - 1.821923878491802 + - 1.2117535723642427 + - 1.6771900309184586 + - 1.3285563033505565 + - !!python/tuple + - 1.0142908329205478 + - 1.8750459107859307 + - 1.6191907316738996 + - 1.1126945266875319 + - 2.533416126459057 + - 1.4922208348496149 + - 1.2400568302978634 + - 1.489245547171457 + - 1.7137270192419145 + - 1.821845956899805 + - 1.211729401223858 + - 1.677155222260763 + - 1.3285244570244004 + - !!python/tuple + - 1.0142709454098935 + - 1.8750499070406015 + - 1.619190786886505 + - 1.1125836989871858 + - 2.533499083649052 + - 1.4922512731471602 + - 1.2400613286952584 + - 1.4892202853948364 + - 1.713680755511643 + - 1.8218360045222002 + - 1.2118174869099203 + - 1.6770128688996193 + - 1.3284385076043421 + - !!python/tuple + - 1.0143485887844805 + - 1.8749567508576632 + - 1.619190848772814 + - 1.1126367964126194 + - 2.533430954088081 + - 1.4921661157296753 + - 1.24008052151072 + - 1.489202592662757 + - 1.7137340264773706 + - 1.821824842605532 + - 1.211813644447571 + - 1.67700817477192 + - 1.3284343622420736 + - !!python/tuple + - 1.014338415878146 + - 1.874958805094118 + - 1.6191908762569465 + - 1.112581571471155 + - 2.5334724187292035 + - 1.4921814000707874 + - 1.2400827181741585 + - 1.4891900192819576 + - 1.7137108944403376 + - 1.82181988224405 + - 1.2118574784163656 + - 1.676937145933151 + - 1.3283915588289459 + - !!python/tuple + - 1.0142642718248305 + - 1.874973827886693 + - 1.6191910771800024 + - 1.112572891518906 + - 2.533250566584353 + - 1.4922931057987503 + - 1.240098757479824 + - 1.489132673526232 + - 1.7135417613105794 + - 1.8217836088064807 + - 1.2118442751834386 + - 1.6769223485078992 + - 1.3283786703588776 + - !!python/tuple + - 1.0143146880622511 + - 1.8749134559113212 + - 1.6191911169164812 + - 1.1125288606770938 + - 2.533311078852646 + - 1.4922377764643135 + - 1.24011109060251 + - 1.4891144739734197 + - 1.713576493513368 + - 1.8217764194948072 + - 1.2119080686454424 + - 1.67681891806479 + - 1.3283164191020227 + - !!python/tuple + - 1.0144066106246206 + - 1.8748028365563771 + - 1.6191911896882178 + - 1.11259248928535 + - 2.533230137626897 + - 1.4921364890779247 + - 1.2401336371267182 + - 1.4890937789937602 + - 1.713640114931014 + - 1.8217632476444192 + - 1.211902926954508 + - 1.6768137924171478 + - 1.3283120690064152 + - !!python/tuple + - 1.0143548990604692 + - 1.874813530993668 + - 1.6191913246042369 + - 1.1125864296844525 + - 2.533079782731379 + - 1.4922126320477833 + - 1.240143974569516 + - 1.4890554402487195 + - 1.71352554529296 + - 1.8217388083175377 + - 1.2118934293392702 + - 1.676804287161659 + - 1.3283040213834225 + - !!python/tuple + - 1.014353470316674 + - 1.8748138315263847 + - 1.6191913283889883 + - 1.1125787142423917 + - 2.5330856044897416 + - 1.4922147651394801 + - 1.2401442628123158 + - 1.4890537048723411 + - 1.7135223288382448 + - 1.8217381217245112 + - 1.2118995440909495 + - 1.6767943615415832 + - 1.328298057327317 + - !!python/tuple + - 1.014349496758005 + - 1.874814667749945 + - 1.619191338919432 + - 1.112578255201957 + - 2.533073824120481 + - 1.4922206998860026 + - 1.2401450646643606 + - 1.489050717116183 + - 1.7135133793930335 + - 1.8217362113146376 + - 1.2118988021329424 + - 1.6767936226070654 + - 1.3282974357691024 + - !!python/tuple + - 1.0143395752890165 + - 1.8748167584444266 + - 1.6191913652436476 + - 1.112577108602044 + - 2.5330443669513514 + - 1.4922355341020965 + - 1.2401470682057927 + - 1.4890432490834404 + - 1.7134910060454234 + - 1.8217314350866232 + - 1.211896948358854 + - 1.6767917753329218 + - 1.3282958824699478 + - !!python/tuple + - 1.0143462754196908 + - 1.8748086840562337 + - 1.6191913705154986 + - 1.1125712030239723 + - 2.5330524900111913 + - 1.4922281304433156 + - 1.2401487009531713 + - 1.4890408312753636 + - 1.7134956707305231 + - 1.8217304782955195 + - 1.211905476741846 + - 1.6767779313910665 + - 1.3282875655284794 + - !!python/tuple + - 1.0143426230724661 + - 1.8748094560378894 + - 1.6191913802072402 + - 1.1125707880947673 + - 2.533041634265496 + - 1.4922335948755332 + - 1.2401494365786294 + - 1.4890380831098573 + - 1.7134874293540545 + - 1.821728719235067 + - 1.211904787814174 + - 1.6767772555026406 + - 1.3282869993254838 + - !!python/tuple + - 1.0143454242916157 + - 1.874806079438634 + - 1.6191913824108983 + - 1.1125727230166793 + - 2.5330391652959428 + - 1.492230498618273 + - 1.2401501190233035 + - 1.4890374583094605 + - 1.7134893805239941 + - 1.8217283192267784 + - 1.2119046312462327 + - 1.6767771018172015 + - 1.328286870622186 + - !!python/tuple + - 1.014343875477678 + - 1.8748064071671533 + - 1.6191913865203702 + - 1.1125725462987308 + - 2.533034560786483 + - 1.492232816188439 + - 1.240150430603076 + - 1.4890362931829646 + - 1.7134858853105839 + - 1.8217275732570646 + - 1.2119043393045166 + - 1.676776815216012 + - 1.328286630626705 + - !!python/tuple + - 1.0143429079425847 + - 1.8748066120026354 + - 1.6191913890887175 + - 1.1125724358877027 + - 2.5330316827299697 + - 1.4922342645684001 + - 1.2401506252990553 + - 1.4890355650307803 + - 1.7134837008127264 + - 1.8217271070183152 + - 1.2119041568840818 + - 1.6767766360926564 + - 1.3282864806520625 + - !!python/tuple + - 1.0143439421299143 + - 1.874805365402601 + - 1.6191913899020531 + - 1.112573150117855 + - 2.5330307712534283 + - 1.4922331213918518 + - 1.2401508771817762 + - 1.489035334448177 + - 1.7134844212863958 + - 1.8217269593672598 + - 1.2119040991233052 + - 1.6767765793679419 + - 1.328286433162215 + - !!python/tuple + - 1.0143432590326737 + - 1.8748055100608434 + - 1.6191913917150806 + - 1.1125730720443072 + - 2.5330287394126887 + - 1.4922341439214821 + - 1.240151014571126 + - 1.4890348204548631 + - 1.7134828791139822 + - 1.8217266302315325 + - 1.2119039703725587 + - 1.6767764529210298 + - 1.328286327303915 + - !!python/tuple + - 1.0143439892438402 + - 1.8748046298496752 + - 1.6191913922893229 + - 1.112573576322058 + - 2.533028095833939 + - 1.4922333367261138 + - 1.24015119240768 + - 1.4890346576602635 + - 1.71348338785604 + - 1.8217265259819415 + - 1.211903929596934 + - 1.6767764128710918 + - 1.3282862937770996 + - !!python/tuple + - 1.0143438927690847 + - 1.8748046502840137 + - 1.619191392545352 + - 1.1125730534700389 + - 2.533028490763171 + - 1.4922334811341063 + - 1.2401512118044342 + - 1.4890345402258809 + - 1.7134831700651434 + - 1.8217264795013681 + - 1.2119043440345698 + - 1.6767757399997663 + - 1.3282858896250807 + - !!python/tuple + - 1.0143435147959128 + - 1.874804730345158 + - 1.6191913935484639 + - 1.1125730102802658 + - 2.533027366499622 + - 1.4922340469170703 + - 1.2401512877992278 + - 1.4890342558536676 + - 1.7134823167683322 + - 1.8217262973919304 + - 1.211904272771046 + - 1.6767756700601948 + - 1.3282858310862693 + - !!python/tuple + - 1.0143435147959128 + - 1.874804730345158 + - 1.6191913935484639 + - 1.1125730102802658 + - 2.533027366499622 + - 1.4922340469170703 + - 1.2401512877992278 + - 1.4890342558536676 + - 1.7134823167683322 + - 1.8217262973919304 + - 1.211904272771046 + - 1.6767756700601948 + - 1.3282858310862693 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 128.0 + - 256.0 + - 384.0 + - 512.0 + - 1024.0 + - 1152.0 + - 1536.0 + - 1664.0 + - 1792.0 + - 1920.0 + - 2048.0 + - 2176.0 + - 2304.0 + - 2432.0 + - 2560.0 + - 2688.0 + - 2816.0 + - 2944.0 + - 3072.0 + - 3200.0 + - 5248.0 + - 5376.0 + - 5504.0 + - 5632.0 + - 6656.0 + - 6784.0 + - 6912.0 + - 7040.0 + - 7168.0 + - 7296.0 + - 8448.0 + - 8576.0 + - 8704.0 + - 8832.0 + - 8960.0 + - 9088.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 65.56739386963778 + - 58.791542710431756 + - 42.47900081787588 + - 38.00476005987355 + - 30.4769854535951 + - 26.001111179636045 + - 25.01504536522595 + - 24.191841479533096 + - 22.252334210388913 + - 19.599229609792324 + - 18.90430025371906 + - 18.689415624334128 + - 18.589278313001174 + - 18.553589730122056 + - 18.4225203083103 + - 18.445681506540794 + - 18.418374881063997 + - 18.422938118053565 + - 18.418381177096123 + - 18.417570505017743 + - 18.416645015640853 + - 18.416998903949796 + - 18.416707836323162 + - 18.41670722784657 + - 18.416743472053756 + - 18.416742892869824 + - 18.416796526518773 + - 18.416726848638387 + - 18.41674922755812 + - 18.416743692768414 + - 18.416745858079004 + - 18.41674151325006 + - 18.416743214235325 + - 18.416739802987326 + - 18.416741139216114 + - 18.416741139216114 +- !!python/tuple + - !!python/tuple + - 6.0 + - 12.0 + - 18.0 + - 24.0 + - 48.0 + - 56.0 + - 63.0 + - 84.0 + - 91.0 + - 98.0 + - 105.0 + - 112.0 + - 119.0 + - 126.0 + - 133.0 + - 140.0 + - 147.0 + - 154.0 + - 161.0 + - 168.0 + - 177.0 + - 185.0 + - 193.0 + - 201.0 + - 209.0 + - 217.0 + - 225.0 + - 233.0 + - 241.0 + - 249.0 + - 257.0 + - 307.0 + - 316.0 + - 325.0 + - 334.0 + - 397.0 + - 406.0 + - 415.0 + - 424.0 + - 433.0 + - 496.0 + - 505.0 + - 534.0 + - 544.0 + - 584.0 + - 594.0 + - 624.0 + - 634.0 + - 644.0 + - 654.0 + - 704.0 + - 714.0 + - 724.0 + - 734.0 + - 744.0 + - 754.0 + - 764.0 + - 774.0 + - 784.0 + - 854.0 + - 864.0 + - 896.0 + - 907.0 + - 918.0 + - 929.0 + - 940.0 + - 951.0 + - 962.0 + - 973.0 + - 984.0 + - 995.0 + - 1006.0 + - 1017.0 + - 1028.0 + - 1039.0 + - 1050.0 + - 1061.0 + - 1072.0 + - 1083.0 + - 1094.0 + - 1105.0 + - 1116.0 + - 1127.0 + - 1138.0 + - 1149.0 + - 1160.0 + - 1171.0 + - 1182.0 + - 1193.0 + - 1204.0 + - 1215.0 + - 1226.0 + - 1237.0 + - 1248.0 + - 1259.0 + - 1270.0 + - 1281.0 + - 1292.0 + - 1303.0 + - 1314.0 + - 1325.0 + - 1336.0 + - 1347.0 + - 1358.0 + - 1369.0 + - 1380.0 + - 1391.0 + - 1402.0 + - 1481.0 + - 1493.0 + - 1505.0 + - 1517.0 + - 1529.0 + - 1541.0 + - 1553.0 + - 1565.0 + - 1577.0 + - 1589.0 + - 1601.0 + - 1613.0 + - 1625.0 + - 1637.0 + - 1649.0 + - 1661.0 + - 1673.0 + - 1685.0 + - 1697.0 + - 1709.0 + - 1721.0 + - 1733.0 + - 1745.0 + - 1757.0 + - 1769.0 + - 1781.0 + - 1793.0 + - 1805.0 + - 1817.0 + - 2021.0 + - 2033.0 + - 2045.0 + - 2057.0 + - 2069.0 + - 2081.0 + - 2093.0 + - 2165.0 + - 2177.0 + - 2225.0 + - 2237.0 + - 2249.0 + - 2261.0 + - 2273.0 + - 2285.0 + - 2297.0 + - 2309.0 + - 2321.0 + - 2393.0 + - 2407.0 + - 2420.0 + - 2433.0 + - 2446.0 + - 2459.0 + - 2472.0 + - 2485.0 + - 2498.0 + - 2511.0 + - 2524.0 + - 2537.0 + - 2550.0 + - 2563.0 + - 2576.0 + - 2589.0 + - 2602.0 + - 2615.0 + - 2628.0 + - 2641.0 + - 2654.0 + - 2667.0 + - 2680.0 + - 2693.0 + - 2706.0 + - 2719.0 + - 2732.0 + - 2745.0 + - 2758.0 + - 2771.0 + - 2784.0 + - 2797.0 + - 2810.0 + - 2823.0 + - 2836.0 + - 2849.0 + - 2862.0 + - 2875.0 + - 2888.0 + - 2901.0 + - 2914.0 + - 2927.0 + - 2940.0 + - 2953.0 + - 2966.0 + - 2979.0 + - 2992.0 + - 3005.0 + - 3018.0 + - 3031.0 + - 3226.0 + - 3239.0 + - 3252.0 + - 3265.0 + - 3278.0 + - 3291.0 + - 3330.0 + - 3343.0 + - 3356.0 + - 3369.0 + - 3382.0 + - 3395.0 + - 3512.0 + - 3525.0 + - 3538.0 + - 3551.0 + - 3564.0 + - 3577.0 + - 3590.0 + - 3603.0 + - 3616.0 + - 3629.0 + - 3642.0 + - 3655.0 + - 3668.0 + - 3681.0 + - 3694.0 + - 3707.0 + - 3720.0 + - 3733.0 + - 3746.0 + - 3759.0 + - 3772.0 + - 3785.0 + - 3798.0 + - 3811.0 + - 3824.0 + - 3837.0 + - 3850.0 + - 3863.0 + - 3878.0 + - 3892.0 + - 3906.0 + - 3920.0 + - 3934.0 + - 3948.0 + - 3962.0 + - 3976.0 + - 3990.0 + - 4004.0 + - 4018.0 + - 4172.0 + - 4186.0 + - 4200.0 + - 4214.0 + - 4228.0 + - 4242.0 + - 4354.0 + - 4368.0 + - 4410.0 + - 4424.0 + - 4480.0 + - 4494.0 + - 4550.0 + - 4564.0 + - 4634.0 + - 4648.0 + - 4662.0 + - 4732.0 + - 4746.0 + - 4802.0 + - 4816.0 + - 4830.0 + - 4844.0 + - 4858.0 + - 4872.0 + - 4886.0 + - 5012.0 + - 5026.0 + - 5040.0 + - 5054.0 + - 5068.0 + - 5250.0 + - 5264.0 + - 5334.0 + - 5348.0 + - 5362.0 + - 5432.0 + - 5446.0 + - 5502.0 + - 5516.0 + - 5530.0 + - 5544.0 + - 5558.0 + - 5670.0 + - 5684.0 + - 5740.0 + - 5754.0 + - 5768.0 + - 5782.0 + - 5796.0 + - 5922.0 + - 5936.0 + - 5992.0 + - 6020.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 65.3955680436889 + - 58.83344478557817 + - 43.72842280062673 + - 45.0348774552056 + - 40.392565479407985 + - 40.099838675498354 + - 38.5454759944102 + - 37.37104208553436 + - 36.27314390193479 + - 35.02193990473593 + - 34.27285733969924 + - 33.10979051595366 + - 32.46944437290974 + - 30.421949896881156 + - 29.796888539494322 + - 28.11834310963543 + - 26.96511941872461 + - 26.709439862408022 + - 26.084238532291728 + - 25.78315933126633 + - 25.35019715833344 + - 25.1440603190449 + - 24.757332463993443 + - 24.558953521907235 + - 24.412253115383475 + - 24.25948821457931 + - 24.107572436593 + - 24.015658918032383 + - 23.407853904699962 + - 23.128829703442126 + - 22.8823164565614 + - 22.600033029710406 + - 21.229682333404885 + - 20.81022637497422 + - 20.625914822962663 + - 20.475393727678085 + - 20.439887850552154 + - 20.391350683573258 + - 20.37137982035149 + - 20.337525708908913 + - 20.32293449462835 + - 20.29992309499637 + - 20.279035238312098 + - 20.272436604917715 + - 20.2660292472882 + - 20.263208949990045 + - 20.25892097032944 + - 20.250259978103454 + - 20.24196530471391 + - 20.2409264623867 + - 20.239419536301526 + - 20.237935153513888 + - 20.23595365317463 + - 20.235255947892128 + - 20.233826169877844 + - 20.232418594791167 + - 20.23151214473684 + - 20.23061820897952 + - 20.23009424652129 + - 20.229911163943765 + - 20.22958307695201 + - 20.22920233601619 + - 20.228797441325188 + - 20.228248582527208 + - 20.227666074806695 + - 20.226877965831587 + - 20.226043931921883 + - 20.224865604904593 + - 20.22330336535859 + - 20.2219759792182 + - 20.22021775632437 + - 20.21873468203635 + - 20.216772087175965 + - 20.21512974761936 + - 20.212958392674384 + - 20.211156929754235 + - 20.20877725739892 + - 20.206821700928355 + - 20.204239032563493 + - 20.20213866360429 + - 20.199365144052514 + - 20.197132277077447 + - 20.194185174321657 + - 20.19183713014849 + - 20.18873885484265 + - 20.186296322952774 + - 20.181679207913938 + - 20.175751868210142 + - 20.170004034664498 + - 20.162718771337538 + - 20.155782940791042 + - 20.14711256724305 + - 20.139020254460192 + - 20.129635380339433 + - 20.11751196663688 + - 20.10919598202052 + - 20.098349851680442 + - 20.09105406613882 + - 20.081454118451155 + - 20.075095171514036 + - 20.066662101073035 + - 20.06114396444662 + - 20.053775916764188 + - 20.049001747240677 + - 20.04258961857887 + - 20.015227426269814 + - 19.986756047548855 + - 19.943242662118195 + - 19.91680500361134 + - 19.73920516455752 + - 19.710669687843954 + - 19.670716985874197 + - 19.625913911615807 + - 19.58591625788217 + - 19.557690964467298 + - 19.53018068153528 + - 19.48736030823651 + - 19.47469137067642 + - 19.436723250933404 + - 19.422212022930243 + - 19.40358163975203 + - 19.398464241625355 + - 19.391977998734333 + - 19.385573766035638 + - 19.37522448851307 + - 19.366318086596213 + - 19.364082320775427 + - 19.35966470630263 + - 19.358760719628947 + - 19.35344836518709 + - 19.351813730191168 + - 19.35077733056319 + - 19.34865450156175 + - 19.346385805636444 + - 19.345306207963855 + - 19.34483957087468 + - 19.343721314219945 + - 19.342919231366178 + - 19.342055620076437 + - 19.341666755101603 + - 19.341124348005984 + - 19.34086489914683 + - 19.340753970749425 + - 19.340624099817568 + - 19.340442481101718 + - 19.340389176343436 + - 19.34036638635515 + - 19.340230141007783 + - 19.340187871336504 + - 19.340161356365588 + - 19.340105472634008 + - 19.340044813664512 + - 19.340015751729066 + - 19.340003341866254 + - 19.339983538271735 + - 19.339927841518502 + - 19.339830048279058 + - 19.339751998890893 + - 19.339409193561536 + - 19.339164843217937 + - 19.33855428892754 + - 19.337731352583504 + - 19.336797271563842 + - 19.335541064096287 + - 19.334122387584824 + - 19.332220700562633 + - 19.330089034395016 + - 19.327244988761084 + - 19.324091100155332 + - 19.319933814435736 + - 19.31534315274489 + - 19.30958173479615 + - 19.30591740661873 + - 19.298016437699115 + - 19.285796425056702 + - 19.277614481788277 + - 19.263434493681675 + - 19.251009902379398 + - 19.24234768504069 + - 19.215613649378135 + - 19.196019017429844 + - 19.182917665078524 + - 19.16460425602788 + - 19.149188909377745 + - 19.12886922394873 + - 19.118057509117975 + - 19.10228505202181 + - 19.09430595914183 + - 19.079048312009746 + - 19.070901621596416 + - 19.0565006362493 + - 19.045501346331548 + - 19.033818267682978 + - 19.02755815290646 + - 19.025894055093378 + - 19.000090720013308 + - 18.996879408117564 + - 18.9739348687772 + - 18.962793611785976 + - 18.960142307155376 + - 18.94352440095209 + - 18.925764602682563 + - 18.91221774217486 + - 18.912646732366166 + - 18.912917178385033 + - 18.90797501866757 + - 18.908183050410212 + - 18.904281877113373 + - 18.90444412492541 + - 18.901341468291676 + - 18.887266741153606 + - 18.877851942218616 + - 18.880640449561795 + - 18.867872641734625 + - 18.860085527641004 + - 18.860220316408032 + - 18.860448012671387 + - 18.85739382875945 + - 18.857565781534646 + - 18.855266933296512 + - 18.855399114021065 + - 18.853655024518666 + - 18.853758134819046 + - 18.85242761959219 + - 18.852509150067355 + - 18.851652439579276 + - 18.851947472287083 + - 18.851082017250462 + - 18.85113013531536 + - 18.850572766571872 + - 18.85076165308176 + - 18.85021078296348 + - 18.85023799608255 + - 18.849883562652238 + - 18.8500014607059 + - 18.84974783469866 + - 18.84945885019234 + - 18.849490095482277 + - 18.84910254807707 + - 18.847632118049233 + - 18.846249105147614 + - 18.847306052882207 + - 18.844417404057808 + - 18.844510947831917 + - 18.840184591167837 + - 18.83347898788907 + - 18.822492401841544 + - 18.808469987165648 + - 18.7872330454903 + - 18.779627152292964 + - 18.755300510630917 + - 18.738005964252785 + - 18.73367132236414 + - 18.702959170582968 + - 18.651352240368247 + - 18.552331018258133 + - 18.546669376569128 + - 18.57382548634083 + - 18.502612817124813 + - 18.538618801713447 + - 18.52365574563279 + - 18.51317337354755 + - 18.518526302728183 + - 18.5275299762121 + - 18.518351033961252 + - 18.52080468666265 + - 18.519274596060193 + - 18.52007197897758 + - 18.519644437502883 + - 18.51977205099696 + - 18.519692176553985 + - 18.519768461307166 + - 18.519747440508294 + - 18.51976744060478 + - 18.51977369242569 + - 18.519769776492968 + - 18.51977351183494 + - 18.519771172124294 + - 18.519773403666832 + - 18.519772005886896 + - 18.519773338949896 + - 18.519773720611465 + - 18.519773481546828 + - 18.51977370953894 + - 18.519773566729498 + - 18.519773702923573 + - 18.51977370139355 + - 18.519773702849488 + - 18.51977370307698 + - 18.519773702934483 + - 18.51977370307038 + - 18.519773703033025 + - 18.519773703068566 + - 18.519773703079675 + - 18.519773703072715 + - 18.519773703079355 + - 18.5197737030752 + - 18.519773703079164 + - 18.519773703077735 + - 18.519773703079096 + - 18.519773703079515 + - 18.51977370307925 + - 18.519773703079508 + - 18.519773703079345 + - 18.5197737030795 + - 18.519773703079522 + - 18.519773703079508 + - 18.519773703079515 + - 18.51977370307951 + - 18.51977370307951 +- !!python/tuple + - !!python/tuple + - 161.0 + - 322.0 + - 483.0 + - 644.0 + - 1127.0 + - 1288.0 + - 1449.0 + - 1610.0 + - 1771.0 + - 1932.0 + - 2093.0 + - 2254.0 + - 2415.0 + - 2576.0 + - 2737.0 + - 2898.0 + - 3059.0 + - 3220.0 + - 3381.0 + - 5957.0 + - 6440.0 + - 6601.0 + - 7567.0 + - 8855.0 + - 9016.0 + - 9177.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.33826853573558 + - 57.36312787550206 + - 40.72856234631455 + - 32.51159902424981 + - 31.267752894757354 + - 27.58804323996827 + - 25.30975041200169 + - 22.926766089204943 + - 22.25031149218883 + - 21.05705794129319 + - 19.56452304986026 + - 18.455658656062493 + - 18.260981844285137 + - 18.125335431007514 + - 18.142475097635835 + - 18.131173423802505 + - 18.13381300845258 + - 18.128876245883887 + - 18.127620162136747 + - 18.127813959222827 + - 18.127655741411065 + - 18.127630065649797 + - 18.12762956489595 + - 18.127629764874985 + - 18.12762960995224 + - 18.12762960995224 +- !!python/tuple + - !!python/tuple + - 115.0 + - 230.0 + - 345.0 + - 460.0 + - 805.0 + - 920.0 + - 1035.0 + - 1610.0 + - 1725.0 + - 1840.0 + - 1955.0 + - 2070.0 + - 2185.0 + - 2300.0 + - 2415.0 + - 2530.0 + - 2645.0 + - 2760.0 + - 2875.0 + - 2990.0 + - 3105.0 + - 3220.0 + - 3335.0 + - 3450.0 + - 5060.0 + - 5175.0 + - 5290.0 + - 5405.0 + - 5520.0 + - 5635.0 + - 5750.0 + - 5865.0 + - 5980.0 + - 6095.0 + - 6210.0 + - 7705.0 + - 7820.0 + - 7935.0 + - 8050.0 + - 8165.0 + - 8280.0 + - 8395.0 + - 8510.0 + - 8625.0 + - 8740.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.73534603141549 + - 57.311355312669676 + - 39.53628297681947 + - 31.98252606674823 + - 31.04404880317291 + - 28.65546635944885 + - 25.985494980153945 + - 24.52696416646836 + - 22.730404684853912 + - 22.277395383844443 + - 21.125584133430554 + - 20.55272134787789 + - 19.685327872167967 + - 19.28871363874283 + - 18.636828260257424 + - 18.473294858494985 + - 18.051493138427727 + - 18.085327903441378 + - 17.929704767408428 + - 17.951588100905088 + - 17.943181960313936 + - 17.954360823200048 + - 17.96165353261146 + - 17.968423927480156 + - 17.964717002411422 + - 17.967663369590092 + - 17.967673971360753 + - 17.96749902035061 + - 17.96925288965881 + - 17.96821741143132 + - 17.968622941944965 + - 17.968645092313785 + - 17.96911990054058 + - 17.969133225477616 + - 17.96933989668485 + - 17.969344098149453 + - 17.969325747759953 + - 17.969436287825737 + - 17.96939475809187 + - 17.96943275275454 + - 17.969433523755765 + - 17.969467942191354 + - 17.969454885058948 + - 17.969466725906475 + - 17.969466725906475 +- !!python/tuple + - !!python/tuple + - 155.0 + - 310.0 + - 465.0 + - 620.0 + - 1085.0 + - 1550.0 + - 1705.0 + - 1860.0 + - 2015.0 + - 2170.0 + - 2325.0 + - 3410.0 + - 3565.0 + - 3720.0 + - 3875.0 + - 4030.0 + - 4185.0 + - 4340.0 + - 4495.0 + - 4650.0 + - 4805.0 + - 4960.0 + - 5115.0 + - 5270.0 + - 7750.0 + - 7905.0 + - 8525.0 + - 8680.0 + - 8835.0 + - 8990.0 + - 9145.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 62.201856413239646 + - 55.976832544213686 + - 41.42893668353909 + - 33.20392639838395 + - 28.87744926709205 + - 26.222207512870988 + - 25.294020312355986 + - 24.754713920368282 + - 22.356135975901353 + - 21.644685372631297 + - 20.24134421886945 + - 19.712031519204665 + - 19.320568630542027 + - 18.640072301860172 + - 18.51788718669868 + - 18.161945842445533 + - 18.19129006375819 + - 18.037745632125244 + - 18.098997055311592 + - 18.068682836749954 + - 18.075578733291547 + - 18.069856501660727 + - 18.06945371876881 + - 18.069247618542345 + - 18.06876929183266 + - 18.068257091183856 + - 18.068230588736604 + - 18.06814958200149 + - 18.068135452721165 + - 18.068093220944743 + - 18.068093220944743 +- !!python/tuple + - !!python/tuple + - 136.0 + - 272.0 + - 408.0 + - 544.0 + - 952.0 + - 1088.0 + - 1224.0 + - 1360.0 + - 1496.0 + - 1632.0 + - 1768.0 + - 1904.0 + - 3128.0 + - 3264.0 + - 3400.0 + - 3536.0 + - 3672.0 + - 3808.0 + - 3944.0 + - 5440.0 + - 5576.0 + - 6120.0 + - 6256.0 + - 6392.0 + - 6800.0 + - 6936.0 + - 7616.0 + - 7752.0 + - 7888.0 + - 8024.0 + - 8160.0 + - 8296.0 + - 8432.0 + - 8568.0 + - 8704.0 + - 8840.0 + - 8976.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.18503641324183 + - 57.015653875182835 + - 40.33922322729084 + - 31.55397234227899 + - 25.985640764494846 + - 23.53838698074781 + - 22.519974660546218 + - 20.98391479355507 + - 18.78847144703299 + - 18.64610491891286 + - 18.112429451907644 + - 18.125666563863362 + - 17.996610081812776 + - 17.976373554792414 + - 17.977931415556245 + - 17.966643990008393 + - 17.95854346497246 + - 17.967754350881805 + - 17.967801788086852 + - 17.969307067967346 + - 17.96771705552617 + - 17.968924935896037 + - 17.969166696645956 + - 17.97035132413054 + - 17.96957920720093 + - 17.969456469856464 + - 17.969531964692802 + - 17.969439981277507 + - 17.969497642000864 + - 17.969429251537594 + - 17.969472661338113 + - 17.96942216852895 + - 17.9694645852986 + - 17.969435168906905 + - 17.969459930691826 + - 17.96944281389799 + - 17.96944281389799 +- !!python/tuple + - !!python/tuple + - 115.0 + - 230.0 + - 345.0 + - 460.0 + - 805.0 + - 1150.0 + - 1265.0 + - 1380.0 + - 2070.0 + - 2185.0 + - 2300.0 + - 2415.0 + - 2530.0 + - 2645.0 + - 3565.0 + - 3680.0 + - 3795.0 + - 4485.0 + - 4600.0 + - 5175.0 + - 5290.0 + - 6095.0 + - 6210.0 + - 6325.0 + - 6440.0 + - 6555.0 + - 7360.0 + - 7475.0 + - 7590.0 + - 7705.0 + - 8855.0 + - 8970.0 + - 9085.0 + - 9200.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.46090171851359 + - 55.042057092995236 + - 39.32722580315888 + - 30.49175427500768 + - 26.316755362462438 + - 23.571351703232093 + - 22.072511752804544 + - 20.510088764888025 + - 18.983842766829536 + - 18.44069565266074 + - 18.269085206693568 + - 18.11295474262927 + - 17.853292982010554 + - 17.738130251767032 + - 17.745403558746737 + - 17.734037305243756 + - 18.345604466118836 + - 17.732336453022295 + - 17.732734974248903 + - 17.733181763546625 + - 17.733192095181398 + - 17.733214529720794 + - 17.73321995354089 + - 17.733231862467804 + - 17.733234718490642 + - 17.73323779357067 + - 17.733238530436985 + - 17.733240161085003 + - 17.733240551397145 + - 17.73324058893057 + - 17.73324059791724 + - 17.733240617822705 + - 17.73324062258863 + - 17.73324062258863 +- !!python/tuple + - !!python/tuple + - 125.0 + - 250.0 + - 375.0 + - 500.0 + - 875.0 + - 1250.0 + - 1375.0 + - 1500.0 + - 1625.0 + - 1750.0 + - 1875.0 + - 2000.0 + - 2125.0 + - 2250.0 + - 2375.0 + - 2500.0 + - 2625.0 + - 2750.0 + - 2875.0 + - 3000.0 + - 3125.0 + - 3250.0 + - 3375.0 + - 3500.0 + - 3625.0 + - 3750.0 + - 5625.0 + - 5750.0 + - 5875.0 + - 6500.0 + - 6625.0 + - 6750.0 + - 7625.0 + - 8250.0 + - 8375.0 + - 8750.0 + - 8875.0 + - 9000.0 + - 9750.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 63.104067843368824 + - 56.503360780691594 + - 40.653023848619675 + - 31.924949843966417 + - 28.04335419540771 + - 26.28210327061325 + - 24.217209576049022 + - 23.007597287650967 + - 21.976001622745656 + - 20.669789002931555 + - 20.150751121974803 + - 19.481446991853755 + - 19.132471870966523 + - 18.716283637887976 + - 18.576131287280433 + - 18.35593501417983 + - 18.317365882923884 + - 18.200145710055942 + - 18.191267227412837 + - 18.135446603407964 + - 18.140533259834662 + - 18.10008225860206 + - 18.109206111578853 + - 18.10271713765997 + - 18.078901098990077 + - 18.082030668235994 + - 18.081327799145246 + - 18.08245135507577 + - 18.08226257162849 + - 18.08244440200909 + - 18.08235311169249 + - 18.08234491327966 + - 18.082347233659767 + - 18.082346013819482 + - 18.082345212162046 + - 18.08234594569872 + - 18.082345560040693 + - 18.08234549738497 + - 18.08234549738497 +- !!python/tuple + - !!python/tuple + - 109.0 + - 218.0 + - 327.0 + - 436.0 + - 763.0 + - 872.0 + - 981.0 + - 1090.0 + - 1199.0 + - 2071.0 + - 2180.0 + - 2289.0 + - 2398.0 + - 2507.0 + - 2616.0 + - 2725.0 + - 2834.0 + - 2943.0 + - 3052.0 + - 3161.0 + - 3270.0 + - 3379.0 + - 3488.0 + - 3597.0 + - 3706.0 + - 3815.0 + - 5341.0 + - 5450.0 + - 5886.0 + - 5995.0 + - 6104.0 + - 6213.0 + - 6976.0 + - 7085.0 + - 7521.0 + - 7630.0 + - 7739.0 + - 7848.0 + - 8502.0 + - 8611.0 + - 8720.0 + - 8829.0 + - 8938.0 + - 9047.0 + - 9701.0 + - 9810.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 69.59956980064081 + - 62.031370855412 + - 44.1618907656046 + - 35.274571776624036 + - 33.853946350398786 + - 30.143206230620503 + - 27.05449119442519 + - 25.61421721497668 + - 24.251789664061107 + - 23.638175664402368 + - 22.76055497922722 + - 22.180797602760713 + - 21.51568101784029 + - 21.06208221200999 + - 20.571692594532283 + - 20.24454851531106 + - 19.918690170759 + - 19.691393600391635 + - 19.50877732340782 + - 19.323711675194122 + - 19.23312517842205 + - 19.076403418514786 + - 19.028080173768515 + - 18.95377973665594 + - 18.94009414336682 + - 18.93637782574079 + - 18.93114276720633 + - 18.93030689079251 + - 18.9300860119555 + - 18.92965358463188 + - 18.92858036227216 + - 18.928518073059067 + - 18.928354178093088 + - 18.928334748243866 + - 18.928328507869427 + - 18.928314204100683 + - 18.928276553965787 + - 18.92827271500931 + - 18.92826258407866 + - 18.928259027413183 + - 18.928257902960887 + - 18.928255313230277 + - 18.928248489606034 + - 18.928246611890867 + - 18.928246019123563 + - 18.928246019123563 +- !!python/tuple + - !!python/tuple + - 93.0 + - 186.0 + - 279.0 + - 372.0 + - 651.0 + - 744.0 + - 837.0 + - 1209.0 + - 1302.0 + - 1395.0 + - 1488.0 + - 1581.0 + - 1674.0 + - 1767.0 + - 1860.0 + - 1953.0 + - 2046.0 + - 2139.0 + - 2232.0 + - 2325.0 + - 2418.0 + - 2511.0 + - 2604.0 + - 2697.0 + - 2790.0 + - 2883.0 + - 2976.0 + - 3069.0 + - 3162.0 + - 3255.0 + - 3348.0 + - 3441.0 + - 3534.0 + - 5301.0 + - 5394.0 + - 5487.0 + - 5580.0 + - 5673.0 + - 5766.0 + - 5859.0 + - 5952.0 + - 6045.0 + - 6138.0 + - 6231.0 + - 6324.0 + - 6417.0 + - 6510.0 + - 6603.0 + - 7254.0 + - 7347.0 + - 7905.0 + - 7998.0 + - 8091.0 + - 8184.0 + - 8277.0 + - 8742.0 + - 8835.0 + - 9114.0 + - 9207.0 + - 9300.0 + - 9393.0 + - 9486.0 + - 9951.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 62.56577178226692 + - 55.660585027257895 + - 39.42919584583152 + - 32.56833758432123 + - 31.531460073123363 + - 29.285946579133586 + - 28.701295518120663 + - 25.64024288599398 + - 24.832346993587958 + - 23.74519172264209 + - 22.41251582737056 + - 21.864738662724964 + - 21.093480912879787 + - 19.879786584373274 + - 19.21362333376243 + - 18.937820795172694 + - 18.20097133618882 + - 18.069444747540363 + - 17.948930054857446 + - 17.927234159066572 + - 17.902178029988676 + - 17.8823132092491 + - 17.875907876492064 + - 17.865441508710827 + - 17.848808885321173 + - 17.84881253806114 + - 17.836717279346743 + - 17.840356120584143 + - 17.837184964300796 + - 17.838020787402762 + - 17.836098957613878 + - 17.836837736920174 + - 17.836833290240783 + - 17.836670153697227 + - 17.836520821297924 + - 17.836147586149195 + - 17.83598213729345 + - 17.835632167314486 + - 17.83551825312872 + - 17.835521703350015 + - 17.835599770449477 + - 17.835488623460048 + - 17.835427512157576 + - 17.835452224695064 + - 17.835421728112205 + - 17.83537042692178 + - 17.83535235539106 + - 17.835381972872348 + - 17.83534732954764 + - 17.83534307265898 + - 17.835340367394142 + - 17.835333604543575 + - 17.835331191250393 + - 17.835328701546985 + - 17.835329608581745 + - 17.83532855263318 + - 17.83532789266751 + - 17.83532822756594 + - 17.83532776164788 + - 17.83532799812315 + - 17.835327709629862 + - 17.835327451839284 + - 17.835327451839284 +problem_name: FIXEDSAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0128 + - 0.0256 + - 0.0384 + - 0.0512 + - 0.1024 + - 0.1152 + - 0.1536 + - 0.1664 + - 0.1792 + - 0.192 + - 0.2048 + - 0.2176 + - 0.2304 + - 0.2432 + - 0.256 + - 0.2688 + - 0.2816 + - 0.2944 + - 0.3072 + - 0.32 + - 0.5248 + - 0.5376 + - 0.5504 + - 0.5632 + - 0.6656 + - 0.6784 + - 0.6912 + - 0.704 + - 0.7168 + - 0.7296 + - 0.8448 + - 0.8576 + - 0.8704 + - 0.8832 + - 0.896 + - 0.9088 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9452245527789879 + - 0.8095943498036591 + - 0.4830710369465098 + - 0.3935114867276628 + - 0.24283025512845685 + - 0.15323800730519554 + - 0.1335002203596002 + - 0.11702239233722608 + - 0.07819985057747243 + - 0.025093442682901913 + - 0.011183247874435143 + - 0.006881965981582604 + - 0.004877547120781694 + - 0.004163179342318895 + - 0.001539601600349956 + - 0.0020032124358515036 + - 0.001456623812670587 + - 0.0015479647740609236 + - 0.0014567498384782838 + - 0.0014405228559260283 + - 0.0014219976095636547 + - 0.0014290812868825355 + - 0.0014232550725291897 + - 0.001423242892833687 + - 0.001423968382379136 + - 0.0014239567890261355 + - 0.001425030357869728 + - 0.001423635636404093 + - 0.001424083588602954 + - 0.001423972800358967 + - 0.001424016142738836 + - 0.0014239291735865026 + - 0.0014239632217040604 + - 0.0014238949397646261 + - 0.001423921686659959 + - 0.001423921686659959 +- !!python/tuple + - !!python/tuple + - 0.0006 + - 0.0012 + - 0.0018 + - 0.0024 + - 0.0048 + - 0.0056 + - 0.0063 + - 0.0084 + - 0.0091 + - 0.0098 + - 0.0105 + - 0.0112 + - 0.0119 + - 0.0126 + - 0.0133 + - 0.014 + - 0.0147 + - 0.0154 + - 0.0161 + - 0.0168 + - 0.0177 + - 0.0185 + - 0.0193 + - 0.0201 + - 0.0209 + - 0.0217 + - 0.0225 + - 0.0233 + - 0.0241 + - 0.0249 + - 0.0257 + - 0.0307 + - 0.0316 + - 0.0325 + - 0.0334 + - 0.0397 + - 0.0406 + - 0.0415 + - 0.0424 + - 0.0433 + - 0.0496 + - 0.0505 + - 0.0534 + - 0.0544 + - 0.0584 + - 0.0594 + - 0.0624 + - 0.0634 + - 0.0644 + - 0.0654 + - 0.0704 + - 0.0714 + - 0.0724 + - 0.0734 + - 0.0744 + - 0.0754 + - 0.0764 + - 0.0774 + - 0.0784 + - 0.0854 + - 0.0864 + - 0.0896 + - 0.0907 + - 0.0918 + - 0.0929 + - 0.094 + - 0.0951 + - 0.0962 + - 0.0973 + - 0.0984 + - 0.0995 + - 0.1006 + - 0.1017 + - 0.1028 + - 0.1039 + - 0.105 + - 0.1061 + - 0.1072 + - 0.1083 + - 0.1094 + - 0.1105 + - 0.1116 + - 0.1127 + - 0.1138 + - 0.1149 + - 0.116 + - 0.1171 + - 0.1182 + - 0.1193 + - 0.1204 + - 0.1215 + - 0.1226 + - 0.1237 + - 0.1248 + - 0.1259 + - 0.127 + - 0.1281 + - 0.1292 + - 0.1303 + - 0.1314 + - 0.1325 + - 0.1336 + - 0.1347 + - 0.1358 + - 0.1369 + - 0.138 + - 0.1391 + - 0.1402 + - 0.1481 + - 0.1493 + - 0.1505 + - 0.1517 + - 0.1529 + - 0.1541 + - 0.1553 + - 0.1565 + - 0.1577 + - 0.1589 + - 0.1601 + - 0.1613 + - 0.1625 + - 0.1637 + - 0.1649 + - 0.1661 + - 0.1673 + - 0.1685 + - 0.1697 + - 0.1709 + - 0.1721 + - 0.1733 + - 0.1745 + - 0.1757 + - 0.1769 + - 0.1781 + - 0.1793 + - 0.1805 + - 0.1817 + - 0.2021 + - 0.2033 + - 0.2045 + - 0.2057 + - 0.2069 + - 0.2081 + - 0.2093 + - 0.2165 + - 0.2177 + - 0.2225 + - 0.2237 + - 0.2249 + - 0.2261 + - 0.2273 + - 0.2285 + - 0.2297 + - 0.2309 + - 0.2321 + - 0.2393 + - 0.2407 + - 0.242 + - 0.2433 + - 0.2446 + - 0.2459 + - 0.2472 + - 0.2485 + - 0.2498 + - 0.2511 + - 0.2524 + - 0.2537 + - 0.255 + - 0.2563 + - 0.2576 + - 0.2589 + - 0.2602 + - 0.2615 + - 0.2628 + - 0.2641 + - 0.2654 + - 0.2667 + - 0.268 + - 0.2693 + - 0.2706 + - 0.2719 + - 0.2732 + - 0.2745 + - 0.2758 + - 0.2771 + - 0.2784 + - 0.2797 + - 0.281 + - 0.2823 + - 0.2836 + - 0.2849 + - 0.2862 + - 0.2875 + - 0.2888 + - 0.2901 + - 0.2914 + - 0.2927 + - 0.294 + - 0.2953 + - 0.2966 + - 0.2979 + - 0.2992 + - 0.3005 + - 0.3018 + - 0.3031 + - 0.3226 + - 0.3239 + - 0.3252 + - 0.3265 + - 0.3278 + - 0.3291 + - 0.333 + - 0.3343 + - 0.3356 + - 0.3369 + - 0.3382 + - 0.3395 + - 0.3512 + - 0.3525 + - 0.3538 + - 0.3551 + - 0.3564 + - 0.3577 + - 0.359 + - 0.3603 + - 0.3616 + - 0.3629 + - 0.3642 + - 0.3655 + - 0.3668 + - 0.3681 + - 0.3694 + - 0.3707 + - 0.372 + - 0.3733 + - 0.3746 + - 0.3759 + - 0.3772 + - 0.3785 + - 0.3798 + - 0.3811 + - 0.3824 + - 0.3837 + - 0.385 + - 0.3863 + - 0.3878 + - 0.3892 + - 0.3906 + - 0.392 + - 0.3934 + - 0.3948 + - 0.3962 + - 0.3976 + - 0.399 + - 0.4004 + - 0.4018 + - 0.4172 + - 0.4186 + - 0.42 + - 0.4214 + - 0.4228 + - 0.4242 + - 0.4354 + - 0.4368 + - 0.441 + - 0.4424 + - 0.448 + - 0.4494 + - 0.455 + - 0.4564 + - 0.4634 + - 0.4648 + - 0.4662 + - 0.4732 + - 0.4746 + - 0.4802 + - 0.4816 + - 0.483 + - 0.4844 + - 0.4858 + - 0.4872 + - 0.4886 + - 0.5012 + - 0.5026 + - 0.504 + - 0.5054 + - 0.5068 + - 0.525 + - 0.5264 + - 0.5334 + - 0.5348 + - 0.5362 + - 0.5432 + - 0.5446 + - 0.5502 + - 0.5516 + - 0.553 + - 0.5544 + - 0.5558 + - 0.567 + - 0.5684 + - 0.574 + - 0.5754 + - 0.5768 + - 0.5782 + - 0.5796 + - 0.5922 + - 0.5936 + - 0.5992 + - 0.602 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9417851661835211 + - 0.8104330912139504 + - 0.5080803462038567 + - 0.5342312615376225 + - 0.4413074796011241 + - 0.4354480539883521 + - 0.4043348372160454 + - 0.38082654199242316 + - 0.35885023968159974 + - 0.3338052603695824 + - 0.3188110968388252 + - 0.2955303331868432 + - 0.28271271436451756 + - 0.24172862471294357 + - 0.22921695691173635 + - 0.19561801088917513 + - 0.17253427430772988 + - 0.16741641246202724 + - 0.1549019428682095 + - 0.14887532979964416 + - 0.14020885439813782 + - 0.13608267442510055 + - 0.12834165765179395 + - 0.12437076520610804 + - 0.12143430667921912 + - 0.11837645696901344 + - 0.11533560389840783 + - 0.11349579825840114 + - 0.10132954557799867 + - 0.09574440089839448 + - 0.0908100183499948 + - 0.08515963471835994 + - 0.05772973126855046 + - 0.049333605756869604 + - 0.04564429608600095 + - 0.04263135996538104 + - 0.04192064935379029 + - 0.04094909527821841 + - 0.04054934443235148 + - 0.039871696724540266 + - 0.03957962871595648 + - 0.03911901635457198 + - 0.03870091032254111 + - 0.038568827435002485 + - 0.03844057325771789 + - 0.038384120203184706 + - 0.03829828898610853 + - 0.03812492447352144 + - 0.037958892456435404 + - 0.037938098257686265 + - 0.03790793456518495 + - 0.03787822211518421 + - 0.03783855901059488 + - 0.03782459325089042 + - 0.03779597380844244 + - 0.037767798795411096 + - 0.037749654653521515 + - 0.03773176100660348 + - 0.03772127300548131 + - 0.03771760829582823 + - 0.03771104107582301 + - 0.03770341989743625 + - 0.03769531524049591 + - 0.03768432889672509 + - 0.03767266901245204 + - 0.03765689366884589 + - 0.037640199059445 + - 0.03761661283702494 + - 0.03758534195138384 + - 0.037558772056706775 + - 0.03752357823051978 + - 0.037493891972367764 + - 0.03745460729314181 + - 0.03742173306934574 + - 0.03737826970142353 + - 0.037342210352454455 + - 0.037294577156715275 + - 0.03725543336285076 + - 0.0372037368561959 + - 0.03716169439369692 + - 0.03710617767543895 + - 0.03706148303945454 + - 0.03700249175768562 + - 0.03695549165388772 + - 0.036893474396021406 + - 0.03684458295962267 + - 0.03675216353730004 + - 0.03663351773646405 + - 0.03651846505715527 + - 0.03637263810190673 + - 0.036233805638984984 + - 0.036060253343257756 + - 0.03589827191841676 + - 0.03571041767664124 + - 0.03546774690029202 + - 0.03530128830269958 + - 0.035084184528582155 + - 0.03493814695328355 + - 0.03474598764770886 + - 0.03461870249289564 + - 0.03444990022307834 + - 0.03433944531887501 + - 0.03419196129373633 + - 0.03409639815837544 + - 0.033968048480752536 + - 0.03342034759277109 + - 0.03285044444936091 + - 0.03197944991901533 + - 0.03145025514994115 + - 0.027895291846692063 + - 0.027324105672774913 + - 0.026524384287188004 + - 0.025627574438092066 + - 0.024826953266380025 + - 0.024261975939554252 + - 0.023711310765495826 + - 0.022854188053450877 + - 0.022600597687844608 + - 0.021840601096074674 + - 0.021550134149082183 + - 0.02117721529466844 + - 0.02107478185415765 + - 0.02094494865399042 + - 0.020816757027519228 + - 0.02060959860888619 + - 0.020431321803304075 + - 0.020386569141984705 + - 0.020298143063321797 + - 0.020280048230191913 + - 0.020173712406943076 + - 0.020140992403053018 + - 0.020120247099089956 + - 0.02007775506058701 + - 0.020032343247132333 + - 0.020010733260722575 + - 0.020001392724510424 + - 0.019979008912721096 + - 0.01996295385813041 + - 0.0199456672070858 + - 0.019937883412219665 + - 0.01992702621026149 + - 0.01992183289939884 + - 0.01991961247856872 + - 0.019917012890644698 + - 0.019913377482676603 + - 0.019912310497139957 + - 0.019911854316703816 + - 0.019909127133995164 + - 0.0199082810345221 + - 0.019907750292213467 + - 0.019906631684133223 + - 0.019905417491531935 + - 0.019904835767389703 + - 0.01990458736284649 + - 0.019904190960168638 + - 0.019903076094778517 + - 0.019901118596509476 + - 0.019899556305055577 + - 0.019892694472451934 + - 0.019887803384097003 + - 0.019875582099953024 + - 0.019859109627232637 + - 0.01984041240450514 + - 0.019815267272210987 + - 0.01978687004525233 + - 0.019748804540158583 + - 0.019706135610721313 + - 0.019649207192794487 + - 0.01958607673999838 + - 0.01950286158477626 + - 0.019410971671274486 + - 0.019295647076997994 + - 0.01922229930668921 + - 0.019064147955207254 + - 0.018819543586529576 + - 0.018655768054842835 + - 0.018371931438615943 + - 0.018123232079580602 + - 0.017949843044275583 + - 0.01741471578157946 + - 0.01702249584552571 + - 0.016760249961295118 + - 0.016393675883980195 + - 0.016085111462187662 + - 0.015678378345656937 + - 0.015461963456582175 + - 0.015146250860908327 + - 0.014986535725282881 + - 0.014681127927970359 + - 0.01451805804222827 + - 0.014229797789784508 + - 0.014009628265827018 + - 0.013775771545652552 + - 0.013650464684885075 + - 0.013617154932522421 + - 0.013100657227345495 + - 0.013036377349585047 + - 0.012577103310827415 + - 0.01235409207406687 + - 0.012301021695637859 + - 0.01196838599594211 + - 0.011612893381435055 + - 0.01134172989257332 + - 0.011350316861996673 + - 0.011355730299743592 + - 0.011256804554495311 + - 0.011260968664186742 + - 0.011182880035369486 + - 0.011186127701701229 + - 0.011124022744093926 + - 0.010842293105454337 + - 0.010653839867547867 + - 0.010709656591981047 + - 0.010454087169562969 + - 0.010298214816364242 + - 0.010300912843136265 + - 0.010305470571706441 + - 0.010244335878194554 + - 0.010247777805895475 + - 0.010201762442537924 + - 0.010204408264897248 + - 0.01016949734261465 + - 0.010171561270915428 + - 0.010144928742242652 + - 0.01014656071358254 + - 0.010129412193838054 + - 0.010135317776045233 + - 0.01011799421926618 + - 0.010118957384299663 + - 0.010107800699473667 + - 0.010111581584719465 + - 0.010100554980946726 + - 0.010101099697879935 + - 0.010094005109028265 + - 0.01009636503940055 + - 0.01009128828283765 + - 0.010085503765685797 + - 0.010086129193387269 + - 0.010078371771921566 + - 0.01004893861017545 + - 0.010021255251117401 + - 0.010042411860436131 + - 0.009984590633674769 + - 0.00998646307165658 + - 0.009899863673484197 + - 0.009765639601496488 + - 0.009545724367141418 + - 0.009265041851541582 + - 0.008839948288780958 + - 0.00868770338051407 + - 0.008200764209506944 + - 0.007854584404118906 + - 0.00776781916306372 + - 0.007153063129907686 + - 0.006120062514118423 + - 0.004137984080265462 + - 0.004024656677787007 + - 0.004568232472741144 + - 0.0031427895943124096 + - 0.0038635107086550727 + - 0.003563999653044982 + - 0.0033541771200259825 + - 0.0034613251157867312 + - 0.0036415489774765143 + - 0.003457816812862783 + - 0.003506930851247379 + - 0.0034763034814740573 + - 0.0034922644588322054 + - 0.0034837064879395512 + - 0.0034862608894010417 + - 0.0034846620663663234 + - 0.003486189035645128 + - 0.0034857682685487507 + - 0.0034861686045482253 + - 0.0034862937453931236 + - 0.0034862153613292508 + - 0.003486290130561654 + - 0.0034862432972675686 + - 0.0034862879653926953 + - 0.003486259986446285 + - 0.003486286669972986 + - 0.0034862943095793964 + - 0.003486289524293472 + - 0.0034862940879439273 + - 0.003486291229369709 + - 0.0034862939555261076 + - 0.003486293924900104 + - 0.0034862939540431753 + - 0.0034862939585967936 + - 0.0034862939557444976 + - 0.0034862939584647356 + - 0.0034862939577169757 + - 0.0034862939584283962 + - 0.0034862939586507687 + - 0.003486293958511457 + - 0.0034862939586443684 + - 0.0034862939585611655 + - 0.003486293958640528 + - 0.003486293958611941 + - 0.0034862939586391773 + - 0.0034862939586475686 + - 0.003486293958642235 + - 0.0034862939586474263 + - 0.003486293958644155 + - 0.003486293958647284 + - 0.003486293958647711 + - 0.0034862939586474263 + - 0.0034862939586475686 + - 0.0034862939586474974 + - 0.0034862939586474974 +- !!python/tuple + - !!python/tuple + - 0.0161 + - 0.0322 + - 0.0483 + - 0.0644 + - 0.1127 + - 0.1288 + - 0.1449 + - 0.161 + - 0.1771 + - 0.1932 + - 0.2093 + - 0.2254 + - 0.2415 + - 0.2576 + - 0.2737 + - 0.2898 + - 0.3059 + - 0.322 + - 0.3381 + - 0.5957 + - 0.644 + - 0.6601 + - 0.7567 + - 0.8855 + - 0.9016 + - 0.9177 + - 1.0 + - !!python/tuple + - 1.0 + - 0.920621515521775 + - 0.7810021937124991 + - 0.44803302923125377 + - 0.2835565115175645 + - 0.25865881246112493 + - 0.18500315568194012 + - 0.13939924387308764 + - 0.09169975346311508 + - 0.07815936242718793 + - 0.05427436001105295 + - 0.02439873176650791 + - 0.002202922078662168 + - -0.0016938659226620216 + - -0.00440905994529388 + - -0.004065980321921367 + - -0.00429220257503165 + - -0.004239366791976707 + - -0.004338184504098846 + - -0.00436332715991814 + - -0.004359447981125175 + - -0.004362614980136727 + - -0.0043631289242347495 + - -0.004363138947675954 + - -0.004363134944754939 + - -0.004363138045797574 + - -0.004363138045797574 +- !!python/tuple + - !!python/tuple + - 0.0115 + - 0.023 + - 0.0345 + - 0.046 + - 0.0805 + - 0.092 + - 0.1035 + - 0.161 + - 0.1725 + - 0.184 + - 0.1955 + - 0.207 + - 0.2185 + - 0.23 + - 0.2415 + - 0.253 + - 0.2645 + - 0.276 + - 0.2875 + - 0.299 + - 0.3105 + - 0.322 + - 0.3335 + - 0.345 + - 0.506 + - 0.5175 + - 0.529 + - 0.5405 + - 0.552 + - 0.5635 + - 0.575 + - 0.5865 + - 0.598 + - 0.6095 + - 0.621 + - 0.7705 + - 0.782 + - 0.7935 + - 0.805 + - 0.8165 + - 0.828 + - 0.8395 + - 0.851 + - 0.8625 + - 0.874 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9285696979818974 + - 0.7799658776777278 + - 0.4241675267152772 + - 0.2729662150472528 + - 0.25418099400922656 + - 0.20636944767302254 + - 0.15292542247183735 + - 0.123730443766147 + - 0.08776924547188411 + - 0.07870149265353181 + - 0.05564602847459191 + - 0.04417920400399292 + - 0.02681684606462553 + - 0.018877936587656 + - 0.005829340311969074 + - 0.002555940711957105 + - -0.005887139214664031 + - -0.005209878758582555 + - -0.008324940915626682 + - -0.007886908719494936 + - -0.008055171942495054 + - -0.007831407959690211 + - -0.007685431958377646 + - -0.007549910972351163 + - -0.007624111391999344 + - -0.007565134834059486 + - -0.007564922621560582 + - -0.007568424564041185 + - -0.007533317882286437 + - -0.007554044742849276 + - -0.007545927358835641 + - -0.007545483981472625 + - -0.00753597988602227 + - -0.007535713164709712 + - -0.007531576288451997 + - -0.00753149218898119 + - -0.007531859503285181 + - -0.007529646855573941 + - -0.007530478143939276 + - -0.00752971761604562 + - -0.007529702183142763 + - -0.007529013239525877 + - -0.007529274600272585 + - -0.007529037585539557 + - -0.007529037585539557 +- !!python/tuple + - !!python/tuple + - 0.0155 + - 0.031 + - 0.0465 + - 0.062 + - 0.1085 + - 0.155 + - 0.1705 + - 0.186 + - 0.2015 + - 0.217 + - 0.2325 + - 0.341 + - 0.3565 + - 0.372 + - 0.3875 + - 0.403 + - 0.4185 + - 0.434 + - 0.4495 + - 0.465 + - 0.4805 + - 0.496 + - 0.5115 + - 0.527 + - 0.775 + - 0.7905 + - 0.8525 + - 0.868 + - 0.8835 + - 0.899 + - 0.9145 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8778575877133269 + - 0.753253131233325 + - 0.4620522146124756 + - 0.2974146232252887 + - 0.21081281369646224 + - 0.1576636270316581 + - 0.13908437913393668 + - 0.12828924304069408 + - 0.08027761973072807 + - 0.06603672401723006 + - 0.03794646036529732 + - 0.027351365047210915 + - 0.019515568510493093 + - 0.0058942753305672 + - 0.003448532119782293 + - -0.0036762401979766024 + - -0.003088865623288517 + - -0.0061623189708895 + - -0.004936267399788333 + - -0.005543058121713712 + - -0.005405025005923912 + - -0.00551956521929703 + - -0.0055276276049814575 + - -0.005531753052086444 + - -0.00554132757596528 + - -0.005551580144436601 + - -0.005552110636062769 + - -0.005553732123853441 + - -0.005554014945467013 + - -0.005554860286409963 + - -0.005554860286409963 +- !!python/tuple + - !!python/tuple + - 0.0136 + - 0.0272 + - 0.0408 + - 0.0544 + - 0.0952 + - 0.1088 + - 0.1224 + - 0.136 + - 0.1496 + - 0.1632 + - 0.1768 + - 0.1904 + - 0.3128 + - 0.3264 + - 0.34 + - 0.3536 + - 0.3672 + - 0.3808 + - 0.3944 + - 0.544 + - 0.5576 + - 0.612 + - 0.6256 + - 0.6392 + - 0.68 + - 0.6936 + - 0.7616 + - 0.7752 + - 0.7888 + - 0.8024 + - 0.816 + - 0.8296 + - 0.8432 + - 0.8568 + - 0.8704 + - 0.884 + - 0.8976 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9175543135735842 + - 0.7740469097069 + - 0.4402397435615005 + - 0.26438798225112287 + - 0.15292834059375038 + - 0.10394238744588852 + - 0.0835571300876524 + - 0.052810275316616064 + - 0.008864737005158198 + - 0.006015028436871345 + - -0.004667395101096768 + - -0.004402431757130469 + - -0.0069857170809264485 + - -0.007390785640255467 + - -0.007359602403398392 + - -0.007585539452804228 + - -0.007747685259879321 + - -0.007563313688527796 + - -0.00756236415206396 + - -0.007532233411153475 + - -0.00756406021859997 + - -0.007539882435486685 + - -0.007535043182260405 + - -0.007511330845255194 + - -0.0075267860808297645 + - -0.007529242877850743 + - -0.0075277317201031 + - -0.007529572924845313 + - -0.007528418747247717 + - -0.0075297876988667635 + - -0.007528918777764879 + - -0.007529929477350004 + - -0.007529080433452516 + - -0.007529669252640324 + - -0.007529173603335759 + - -0.007529516225121207 + - -0.007529516225121207 +- !!python/tuple + - !!python/tuple + - 0.0115 + - 0.023 + - 0.0345 + - 0.046 + - 0.0805 + - 0.115 + - 0.1265 + - 0.138 + - 0.207 + - 0.2185 + - 0.23 + - 0.2415 + - 0.253 + - 0.2645 + - 0.3565 + - 0.368 + - 0.3795 + - 0.4485 + - 0.46 + - 0.5175 + - 0.529 + - 0.6095 + - 0.621 + - 0.6325 + - 0.644 + - 0.6555 + - 0.736 + - 0.7475 + - 0.759 + - 0.7705 + - 0.8855 + - 0.897 + - 0.9085 + - 0.92 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8630261173518979 + - 0.7345420082753099 + - 0.41998289127526894 + - 0.24312587824632495 + - 0.15955616329458153 + - 0.10460223251870926 + - 0.07460039777831323 + - 0.04332584023486383 + - 0.012775426767515436 + - 0.0019034120775100543 + - -0.0015316633207431696 + - -0.004656880512520188 + - -0.009854452960639665 + - -0.012159631175320552 + - -0.012014043546728826 + - -0.012241558471932553 + - 0.0 + - -0.012275603926386549 + - -0.012267626845192654 + - -0.012258683596335281 + - -0.012258476791066342 + - -0.012258027725545207 + - -0.012257919158547034 + - -0.0122576807810891 + - -0.012257623612927017 + - -0.012257562059962167 + - -0.012257547310327679 + - -0.012257514670129937 + - -0.012257506857367559 + - -0.012257506106072118 + - -0.012257505926188591 + - -0.012257505527746824 + - -0.01225750543234869 + - -0.01225750543234869 +- !!python/tuple + - !!python/tuple + - 0.0125 + - 0.025 + - 0.0375 + - 0.05 + - 0.0875 + - 0.125 + - 0.1375 + - 0.15 + - 0.1625 + - 0.175 + - 0.1875 + - 0.2 + - 0.2125 + - 0.225 + - 0.2375 + - 0.25 + - 0.2625 + - 0.275 + - 0.2875 + - 0.3 + - 0.3125 + - 0.325 + - 0.3375 + - 0.35 + - 0.3625 + - 0.375 + - 0.5625 + - 0.575 + - 0.5875 + - 0.65 + - 0.6625 + - 0.675 + - 0.7625 + - 0.825 + - 0.8375 + - 0.875 + - 0.8875 + - 0.9 + - 0.975 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8959168863194994 + - 0.7637924907776554 + - 0.4465209975271796 + - 0.2718137288726059 + - 0.19411698003435968 + - 0.15886254264964753 + - 0.1175301780011538 + - 0.0933177275883404 + - 0.07266858312927418 + - 0.04652251253360872 + - 0.03613308521414887 + - 0.022735822953272894 + - 0.015750491462487706 + - 0.0074197750399916315 + - 0.004614387006261864 + - 0.00020678351655578265 + - -0.0005652433444119244 + - -0.0029116047778801626 + - -0.003089322731640291 + - -0.004206667606269683 + - -0.004104849513249516 + - -0.004914545207388078 + - -0.00473191574843397 + - -0.004861803614775917 + - -0.005338522197131003 + - -0.00527587853774772 + - -0.005289947659870296 + - -0.005267457774049252 + - -0.0052712365963213355 + - -0.005267596951522688 + - -0.005269424282713895 + - -0.005269588387911954 + - -0.005269541941551534 + - -0.005269566358732734 + - -0.005269582405271854 + - -0.00526956772228583 + - -0.005269575441888161 + - -0.005269576696049172 + - -0.005269576696049172 +- !!python/tuple + - !!python/tuple + - 0.0109 + - 0.0218 + - 0.0327 + - 0.0436 + - 0.0763 + - 0.0872 + - 0.0981 + - 0.109 + - 0.1199 + - 0.2071 + - 0.218 + - 0.2289 + - 0.2398 + - 0.2507 + - 0.2616 + - 0.2725 + - 0.2834 + - 0.2943 + - 0.3052 + - 0.3161 + - 0.327 + - 0.3379 + - 0.3488 + - 0.3597 + - 0.3706 + - 0.3815 + - 0.5341 + - 0.545 + - 0.5886 + - 0.5995 + - 0.6104 + - 0.6213 + - 0.6976 + - 0.7085 + - 0.7521 + - 0.763 + - 0.7739 + - 0.7848 + - 0.8502 + - 0.8611 + - 0.872 + - 0.8829 + - 0.8938 + - 0.9047 + - 0.9701 + - 0.981 + - 1.0 + - !!python/tuple + - 1.0 + - 1.025935422469676 + - 0.8744450288673271 + - 0.5167569458947124 + - 0.33886211762000584 + - 0.310425879812589 + - 0.23614909541917295 + - 0.17432320263477355 + - 0.14549366556513466 + - 0.1182223573666364 + - 0.10593982792985196 + - 0.08837275497195063 + - 0.0767679235199253 + - 0.06345448210932841 + - 0.0543749293478213 + - 0.04455894582151126 + - 0.038010599816793104 + - 0.0314879899816061 + - 0.026938261947418565 + - 0.023282886093971403 + - 0.019578481903085105 + - 0.017765238864632674 + - 0.01462818587934195 + - 0.013660913821652415 + - 0.012173664009052454 + - 0.011899723547252468 + - 0.011825335119570683 + - 0.011720546505574664 + - 0.011703815015315365 + - 0.011699393749146277 + - 0.011690737979664833 + - 0.011669255606001938 + - 0.011668008781298055 + - 0.011664728144374354 + - 0.011664339222845276 + - 0.011664214311120982 + - 0.011663927996824456 + - 0.011663174365241056 + - 0.011663097521987865 + - 0.011662894734153804 + - 0.011662823541435859 + - 0.011662801033607744 + - 0.011662749195738231 + - 0.011662612609275598 + - 0.011662575023608013 + - 0.011662563158360707 + - 0.011662563158360707 +- !!python/tuple + - !!python/tuple + - 0.0093 + - 0.0186 + - 0.0279 + - 0.0372 + - 0.0651 + - 0.0744 + - 0.0837 + - 0.1209 + - 0.1302 + - 0.1395 + - 0.1488 + - 0.1581 + - 0.1674 + - 0.1767 + - 0.186 + - 0.1953 + - 0.2046 + - 0.2139 + - 0.2232 + - 0.2325 + - 0.2418 + - 0.2511 + - 0.2604 + - 0.2697 + - 0.279 + - 0.2883 + - 0.2976 + - 0.3069 + - 0.3162 + - 0.3255 + - 0.3348 + - 0.3441 + - 0.3534 + - 0.5301 + - 0.5394 + - 0.5487 + - 0.558 + - 0.5673 + - 0.5766 + - 0.5859 + - 0.5952 + - 0.6045 + - 0.6138 + - 0.6231 + - 0.6324 + - 0.6417 + - 0.651 + - 0.6603 + - 0.7254 + - 0.7347 + - 0.7905 + - 0.7998 + - 0.8091 + - 0.8184 + - 0.8277 + - 0.8742 + - 0.8835 + - 0.9114 + - 0.9207 + - 0.93 + - 0.9393 + - 0.9486 + - 0.9951 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8851419737199395 + - 0.7469228984836164 + - 0.4220239953757188 + - 0.28469223044618336 + - 0.2639373608364443 + - 0.21898958323364345 + - 0.20728679634949118 + - 0.14601461370282356 + - 0.12984320124180918 + - 0.10808193662728885 + - 0.08140615849564736 + - 0.07044146545849425 + - 0.05500342783045787 + - 0.0307092684315031 + - 0.017374876224216095 + - 0.01185421861071264 + - -0.0028950784644542755 + - -0.005527807179400453 + - -0.007940114038869418 + - -0.008374394350037378 + - -0.008875935454285793 + - -0.009273563679238223 + - -0.009401777325250963 + - -0.009611279504863485 + - -0.009944209794113718 + - -0.00994413667830119 + - -0.01018624388460306 + - -0.01011340627881341 + - -0.010176882373590448 + - -0.01016015195045873 + - -0.010198620647339156 + - -0.010183832721082723 + - -0.01018392172894523 + - -0.010187187184752226 + - -0.010190176327097945 + - -0.010197647264370648 + - -0.010200959005044943 + - -0.010207964250314758 + - -0.01021024443678498 + - -0.01021017537472861 + - -0.010208612728752927 + - -0.010210837525074769 + - -0.010212060771891086 + - -0.010211566108357778 + - -0.010212176549411756 + - -0.010213203430124848 + - -0.01021356516259539 + - -0.010212972318256807 + - -0.01021366576341245 + - -0.010213750972290228 + - -0.010213805122774105 + - -0.010213940492748094 + - -0.010213988798921934 + - -0.010214038634576636 + - -0.010214020478730863 + - -0.01021404161534012 + - -0.01021405482567715 + - -0.010214048122114591 + - -0.010214057448258275 + - -0.01021405271480287 + - -0.010214058489487483 + - -0.010214063649605028 + - -0.010214063649605028 +solver_name: ASTRODF diff --git a/test/expected_results/FIXEDSAN1_NELDMD.yaml b/test/expected_results/FIXEDSAN1_NELDMD.yaml new file mode 100644 index 000000000..fad079497 --- /dev/null +++ b/test/expected_results/FIXEDSAN1_NELDMD.yaml @@ -0,0 +1,8789 @@ +all_est_objectives: +- - 68.30388079811371 + - 20.602861478351684 + - 19.550473774615597 + - 19.650943962691645 + - 19.535426428721642 + - 19.147682538393166 + - 19.42033912468433 + - 19.39025929263015 + - 19.37985153375054 + - 19.361284272387177 + - 19.257076394479608 + - 19.281037868713394 + - 19.297546199256303 + - 19.272654301258303 + - 19.184489476267498 + - 19.225953614577257 + - 19.144574530118653 + - 18.89404660423832 + - 19.148903348679635 + - 19.035512581024385 + - 18.866650611806197 + - 19.062644580038853 + - 19.08441618520984 + - 18.933016230488104 + - 18.996096859401263 + - 18.916205707935834 + - 18.950893879472588 + - 19.049795688185633 + - 18.951853725462033 + - 19.004308809821506 + - 18.936896112921602 + - 18.982187350624216 + - 19.11327531367916 + - 18.985251379853697 + - 18.98869528774911 + - 18.98753245495066 + - 19.08958356940782 + - 19.068906027838796 + - 19.025779003826404 + - 19.126482359159574 + - 18.980974032395384 + - 19.066191246055737 + - 19.151844069671 + - 19.104580557429163 + - 19.09422673701847 + - 19.017307600889556 + - 19.017307600889556 +- - 68.00555254312637 + - 19.90206921883772 + - 20.000616508508397 + - 19.706828487777464 + - 19.59307375028523 + - 19.68657327645212 + - 19.53972135847216 + - 19.38280336844126 + - 19.3835747522605 + - 19.286076656086045 + - 19.29991685396895 + - 19.121876279310403 + - 18.98600711883577 + - 19.043761622025578 + - 18.87542257317631 + - 18.750366210132494 + - 18.762225993700078 + - 18.85271565825245 + - 18.74041816067535 + - 18.793957034251015 + - 18.61015291722325 + - 18.67758792964873 + - 18.610144022334254 + - 18.56810669420163 + - 18.602465343929 + - 18.5479840655088 + - 18.543313505678046 + - 18.513337501268573 + - 18.44943441908964 + - 18.473686726281734 + - 18.435403611153248 + - 18.44824860170343 + - 18.43529447004498 + - 18.408375318700628 + - 18.38821864400594 + - 18.40650365339571 + - 18.415671999611206 + - 18.421112380162327 + - 18.40148772461147 + - 18.383474325916158 + - 18.40591637455421 + - 18.40591637455421 +- - 67.15565001348712 + - 19.689638292190743 + - 19.283541393427345 + - 18.823257891242278 + - 18.627823055436593 + - 19.323084215874484 + - 19.53343371231825 + - 18.732201041090573 + - 19.04187788945769 + - 18.89938254372162 + - 18.48578592852954 + - 18.674338450444665 + - 18.69486233373364 + - 18.424933532567962 + - 18.723334015274293 + - 18.648632671984384 + - 18.678126659056957 + - 18.501781575513 + - 18.76050772682638 + - 18.654880749287244 + - 18.585956003877907 + - 18.617416044405015 + - 18.664536721332826 + - 18.673311628309325 + - 18.7074722289078 + - 18.61978203562052 + - 18.670277830590603 + - 18.735823026169744 + - 18.708729137998965 + - 18.6555638590126 + - 18.68595069271583 + - 18.685454743302166 + - 18.662042538154218 + - 18.726822057326707 + - 18.70661961095457 + - 18.614012085292362 + - 18.711269358313714 + - 18.719769050438764 + - 18.686423421404115 + - 18.720914319929236 + - 18.700140094088354 + - 18.67636795883543 + - 18.678117173025143 + - 18.63821978868628 + - 18.648594332446383 + - 18.667009774070365 + - 18.667009774070365 +- - 67.71943959541662 + - 20.86161040058471 + - 21.084793335487884 + - 20.58510519977571 + - 20.46361483202189 + - 20.417494278890246 + - 20.335569385763673 + - 20.283552991462 + - 20.359570948155955 + - 20.13508175414589 + - 20.1480619277304 + - 20.162547172612474 + - 20.079071597135222 + - 20.165619214156504 + - 20.108514707343804 + - 20.06979009595968 + - 20.099939738380378 + - 20.094596411991247 + - 20.103397935688395 + - 20.119461797587917 + - 20.09626266110564 + - 19.963433477260775 + - 20.030830132019517 + - 20.08534342364223 + - 20.024824550987958 + - 19.971858641018503 + - 19.951599144844906 + - 20.045260531718114 + - 20.01025900607469 + - 20.0027547471312 + - 19.975513484296815 + - 19.988344346104974 + - 20.02562781587976 + - 20.029261546113275 + - 20.027058427586017 + - 20.0073147500899 + - 20.017865373079243 + - 20.016272967892156 + - 19.994393250100348 + - 19.966402402133124 + - 19.96551894110104 + - 19.96869315508699 + - 19.97122665279551 + - 19.989816942025293 + - 19.992379261252257 + - 19.992379261252257 +- - 64.758578697695 + - 20.347011655327602 + - 19.576089039776193 + - 19.31068000538444 + - 19.434729686455476 + - 19.335356541781238 + - 19.09954249324733 + - 19.241870090848735 + - 19.221497093089937 + - 19.031539482554937 + - 18.56488731950947 + - 18.96486842777767 + - 18.888416919219136 + - 18.83144430828138 + - 18.617690951857213 + - 18.645811670513158 + - 18.45090570643557 + - 18.72308058661684 + - 18.456685157355388 + - 18.645022326923552 + - 18.438393444185714 + - 18.540873961130373 + - 18.552967513516432 + - 18.412077061237355 + - 18.455600959281814 + - 18.36559116406745 + - 18.323123375146384 + - 18.40574897634344 + - 18.317646826023225 + - 18.298139789586862 + - 18.298139789586862 +- - 67.09349230810763 + - 19.081318081042955 + - 19.01949754633134 + - 18.737012735909936 + - 19.085882719703303 + - 19.048364591106022 + - 18.8969137399605 + - 18.927886670480493 + - 18.89241256224566 + - 18.563653671022173 + - 18.562885138930426 + - 18.53853158122392 + - 18.494475325241147 + - 18.39299665066912 + - 18.488245784561215 + - 18.50523215334026 + - 18.479054464960136 + - 18.415340717032493 + - 18.409289783578615 + - 18.42742453881577 + - 18.318458294123904 + - 18.331660553349927 + - 18.39043999528695 + - 18.40897081918293 + - 18.39610040181205 + - 18.382257146787868 + - 18.358338170698342 + - 18.29733301285573 + - 18.335712071779632 + - 18.310966334480856 + - 18.332259055510132 + - 18.320624434328266 + - 18.31146297467101 + - 18.27228590660628 + - 18.269997339030425 + - 18.292552057474865 + - 18.22872125916453 + - 18.20224427767926 + - 18.13861956966844 + - 18.196989155747747 + - 18.196989155747747 +- - 64.04874061726181 + - 18.92216240677038 + - 18.761745488376402 + - 18.66873047150173 + - 18.668163182175146 + - 18.646139688972227 + - 18.558303351014114 + - 18.585459684710603 + - 18.555863507567103 + - 18.504594928361687 + - 18.454618252302417 + - 18.40251680167821 + - 18.351496030196166 + - 18.327279656159146 + - 18.321243953362515 + - 18.342791646155522 + - 18.3186302477342 + - 18.224581902558334 + - 18.243274597880216 + - 18.245859348719375 + - 18.220368125145196 + - 18.228756575908054 + - 18.173438689616773 + - 18.15090299548455 + - 18.109553299556396 + - 18.080457848732184 + - 18.06933668393295 + - 18.079542047609863 + - 18.053407188357276 + - 18.04764669056073 + - 17.975662680422342 + - 17.949164512190993 + - 18.03327328552479 + - 17.941266630748586 + - 17.922707643194844 + - 17.931923338166214 + - 17.899335525570763 + - 17.905548909844992 + - 17.909101923829027 + - 17.894981605588043 + - 17.878416130970326 + - 17.901409065085524 + - 17.874933702318266 + - 17.876894471773333 + - 17.86981138836087 + - 17.88581660160158 + - 17.88581660160158 +- - 65.76447222250123 + - 19.28382734469478 + - 19.183144691108975 + - 19.01836571786082 + - 19.185279384015395 + - 18.93035106577565 + - 18.932839970207425 + - 18.6203550584881 + - 18.800068066494422 + - 18.632949841709223 + - 18.58707245537919 + - 18.580752238428815 + - 18.458897888044568 + - 18.571313038954514 + - 18.510476653982252 + - 18.554542187694434 + - 18.508122179947847 + - 18.59128988694886 + - 18.340447532338686 + - 18.482133246652936 + - 18.4686339053745 + - 18.38049282752962 + - 18.427337438292334 + - 18.34496974325293 + - 18.50961590675144 + - 18.466201567861194 + - 18.358361832908674 + - 18.36628926049115 + - 18.511153226756004 + - 18.39082290709463 + - 18.393748609782502 + - 18.380124608923587 + - 18.414933974391346 + - 18.42365502352284 + - 18.4656692854748 + - 18.36833583048088 + - 18.414557959229835 + - 18.377889723874375 + - 18.324720764373676 + - 18.32093436485276 + - 18.353832548537355 + - 18.340178871048558 + - 18.340178871048558 +- - 72.64729923751366 + - 19.724360134093878 + - 19.667928602233065 + - 19.611754182353224 + - 19.39576665944722 + - 19.506918894732173 + - 19.533283476638235 + - 19.4659174566485 + - 19.507140261011585 + - 19.50594407109949 + - 19.520991733776096 + - 19.505332595321892 + - 19.54065665174508 + - 19.509932677815645 + - 19.49172784571806 + - 19.523397344309856 + - 19.51349045205799 + - 19.52009024885998 + - 19.558754450957984 + - 19.527894499875206 + - 19.533569694232707 + - 19.554511866105784 + - 19.536955727908065 + - 19.564850907387314 + - 19.554618693801814 + - 19.5675671918295 + - 19.529979376778723 + - 19.562810159855776 + - 19.51891462591078 + - 19.600945681424747 + - 19.544690609715616 + - 19.552143484067912 + - 19.574996713034185 + - 19.554632752541472 + - 19.596005696089716 + - 19.564554783006756 + - 19.62021693979 + - 19.53353324953705 + - 19.583799735325638 + - 19.600497190989316 + - 19.579742828431595 + - 19.61975608977043 + - 19.62382080893566 + - 19.542530606399954 + - 19.671766399273587 + - 19.60820925486516 + - 19.66019322616449 + - 19.617998421147014 + - 19.617998421147014 +- - 65.3640980466472 + - 19.625281430322477 + - 19.02518844742391 + - 18.639106170307304 + - 18.259274115535987 + - 18.246450793869766 + - 18.1912122851349 + - 18.18482122175151 + - 18.1339958494245 + - 18.15769716256729 + - 18.156601406958668 + - 18.09514517722545 + - 18.132501913292007 + - 18.17403718806715 + - 18.126308937684165 + - 18.129540790641634 + - 18.107117926046886 + - 18.114055508674763 + - 18.118551837600904 + - 18.060072926910117 + - 18.0620611522465 + - 18.017014636118805 + - 18.026988263738307 + - 18.011039135852236 + - 18.037994902956978 + - 17.990279669736466 + - 17.981955987807936 + - 18.02827334752508 + - 17.989484966011954 + - 17.985161046058302 + - 17.91155843370221 + - 17.982824338599162 + - 17.941640154486464 + - 17.978654331810915 + - 17.9137594761836 + - 17.94298743837654 + - 17.9214907625456 + - 17.90334627211861 + - 17.848263141943743 + - 17.88301041647362 + - 17.824245846875854 + - 17.826732345174538 + - 17.826732345174538 +all_intermediate_budgets: +- - 0 + - 1650 + - 1710 + - 2490 + - 2580 + - 3090 + - 3480 + - 3720 + - 3810 + - 3990 + - 4170 + - 4290 + - 4500 + - 4560 + - 4680 + - 4860 + - 4920 + - 5070 + - 5130 + - 5310 + - 5670 + - 5940 + - 6150 + - 6210 + - 6270 + - 6330 + - 6510 + - 6570 + - 6630 + - 6810 + - 7080 + - 7380 + - 7440 + - 8010 + - 8070 + - 8430 + - 8490 + - 8670 + - 8760 + - 9030 + - 9210 + - 9510 + - 9570 + - 9660 + - 9720 + - 9840 + - 10000 +- - 0 + - 2070 + - 2880 + - 3240 + - 3630 + - 3900 + - 4020 + - 4110 + - 4410 + - 4650 + - 4740 + - 4980 + - 5130 + - 5430 + - 5490 + - 5760 + - 5850 + - 5910 + - 6090 + - 6150 + - 6210 + - 6300 + - 6630 + - 6780 + - 6840 + - 6900 + - 7050 + - 7350 + - 7410 + - 7470 + - 7800 + - 8460 + - 8520 + - 8940 + - 9000 + - 9060 + - 9120 + - 9480 + - 9660 + - 9720 + - 9960 + - 10000 +- - 0 + - 2100 + - 2190 + - 2580 + - 2730 + - 2790 + - 2850 + - 2910 + - 3150 + - 3270 + - 3690 + - 3810 + - 4050 + - 4350 + - 4650 + - 5190 + - 5490 + - 5730 + - 5850 + - 5940 + - 6000 + - 6210 + - 6270 + - 6330 + - 6390 + - 6510 + - 7050 + - 7200 + - 7380 + - 7530 + - 8040 + - 8160 + - 8370 + - 8490 + - 8610 + - 8700 + - 9000 + - 9060 + - 9150 + - 9330 + - 9390 + - 9510 + - 9660 + - 9780 + - 9930 + - 9990 + - 10000 +- - 0 + - 2490 + - 2550 + - 2700 + - 2910 + - 3030 + - 3240 + - 3360 + - 3510 + - 3750 + - 3840 + - 3900 + - 4110 + - 4230 + - 4950 + - 5130 + - 5190 + - 5280 + - 5460 + - 5610 + - 5730 + - 5880 + - 5940 + - 6270 + - 6330 + - 6480 + - 6570 + - 6630 + - 6780 + - 6870 + - 6990 + - 7500 + - 7590 + - 7800 + - 8280 + - 8520 + - 8820 + - 8880 + - 8940 + - 9120 + - 9660 + - 9780 + - 9870 + - 9930 + - 9990 + - 10000 +- - 0 + - 2130 + - 2190 + - 2550 + - 2790 + - 2970 + - 3060 + - 3210 + - 4080 + - 4530 + - 4680 + - 4860 + - 4920 + - 5160 + - 5580 + - 6030 + - 6150 + - 6210 + - 6360 + - 6690 + - 6900 + - 6960 + - 7470 + - 7530 + - 7710 + - 8010 + - 8070 + - 8790 + - 8850 + - 9690 + - 10000 +- - 0 + - 2040 + - 2100 + - 2520 + - 2790 + - 2910 + - 3000 + - 3120 + - 3180 + - 3300 + - 3750 + - 4230 + - 4290 + - 4920 + - 4980 + - 5220 + - 5340 + - 5490 + - 5910 + - 6090 + - 6360 + - 6420 + - 6540 + - 6630 + - 6840 + - 6960 + - 7110 + - 7170 + - 7620 + - 7680 + - 7980 + - 8040 + - 8220 + - 8280 + - 8700 + - 8850 + - 8940 + - 9120 + - 9660 + - 9990 + - 10000 +- - 0 + - 1650 + - 2160 + - 2310 + - 2490 + - 3000 + - 3060 + - 3120 + - 3180 + - 3300 + - 3360 + - 3600 + - 3720 + - 3840 + - 4050 + - 4740 + - 4800 + - 4860 + - 5100 + - 5190 + - 5400 + - 5670 + - 5730 + - 6090 + - 6300 + - 6570 + - 6990 + - 7230 + - 7320 + - 7470 + - 7590 + - 7740 + - 7800 + - 7980 + - 8070 + - 8190 + - 8250 + - 8550 + - 8670 + - 8970 + - 9270 + - 9390 + - 9720 + - 9780 + - 9840 + - 9900 + - 10000 +- - 0 + - 2580 + - 2940 + - 3120 + - 3270 + - 3360 + - 3600 + - 3900 + - 4410 + - 4530 + - 4620 + - 4830 + - 5010 + - 5370 + - 5700 + - 5940 + - 6240 + - 6420 + - 6480 + - 6660 + - 6900 + - 6990 + - 7050 + - 7170 + - 7290 + - 7440 + - 7530 + - 7590 + - 7800 + - 7950 + - 8160 + - 8250 + - 8370 + - 8460 + - 8520 + - 8820 + - 8970 + - 9060 + - 9180 + - 9330 + - 9570 + - 9630 + - 10000 +- - 0 + - 2100 + - 2370 + - 2520 + - 2640 + - 3420 + - 3630 + - 3930 + - 4080 + - 4770 + - 4830 + - 5250 + - 5310 + - 5370 + - 5430 + - 5670 + - 5730 + - 5790 + - 5910 + - 6270 + - 6510 + - 6720 + - 6780 + - 6960 + - 7140 + - 7230 + - 7290 + - 7560 + - 7620 + - 7800 + - 8100 + - 8190 + - 8250 + - 8370 + - 8490 + - 8610 + - 8670 + - 8730 + - 8850 + - 8970 + - 9060 + - 9210 + - 9330 + - 9390 + - 9510 + - 9600 + - 9750 + - 9840 + - 10000 +- - 0 + - 2040 + - 2100 + - 2610 + - 3000 + - 3420 + - 3930 + - 4140 + - 4200 + - 4740 + - 4830 + - 5010 + - 5070 + - 5130 + - 5190 + - 5310 + - 5490 + - 5550 + - 5640 + - 5730 + - 6120 + - 6420 + - 6510 + - 6690 + - 6960 + - 7020 + - 7230 + - 7410 + - 7470 + - 7650 + - 7710 + - 7980 + - 8040 + - 8100 + - 8430 + - 8520 + - 8700 + - 8760 + - 8820 + - 9000 + - 9300 + - 9600 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.1202943812116022 + - 1.4091472159500076 + - 1.1440392762886722 + - 1.8473915496539877 + - 1.4527676278493926 + - 1.3521189379394822 + - 0.9967577205304108 + - 1.202549920978767 + - 1.4747512173610906 + - 0.5924342351937242 + - 3.076869184550653 + - 1.4327364380998828 + - 1.136292897621031 + - !!python/tuple + - 1.4900300139349922 + - 2.6705951167639403 + - 1.1940325942502508 + - 1.548250340876664 + - 1.6193742260659343 + - 1.5426126865223808 + - 1.283618231483839 + - 1.2191446061385829 + - 1.6514200258478107 + - 0.8677088373361042 + - 2.2031656657389753 + - 1.8968737355782144 + - 2.1724230024186557 + - !!python/tuple + - 1.1426546132673436 + - 2.3660713060167513 + - 1.2865081932374798 + - 1.7419882645964333 + - 1.6220015022124374 + - 1.610115384602656 + - 1.0998476311806762 + - 1.1820542156172626 + - 1.5253489217415765 + - 0.7803415110035183 + - 2.451864873472633 + - 1.6702114490710596 + - 2.062623736996828 + - !!python/tuple + - 1.1650510171888069 + - 2.4730515621612645 + - 1.3449160526536283 + - 1.8807496972971862 + - 1.470632884182458 + - 1.6416345947960318 + - 1.2268188814346657 + - 1.2687851337298894 + - 1.597352377542915 + - 0.9895431879280925 + - 2.451285566467153 + - 1.572579385930942 + - 1.8500060960657345 + - !!python/tuple + - 0.8914706173515563 + - 2.8535335084134945 + - 1.5269034150285754 + - 1.5597948455275623 + - 2.003523652624129 + - 1.522034215524759 + - 1.3813343858541554 + - 1.2899791377239747 + - 1.571156436717266 + - 1.0946720903445153 + - 2.1228688231752044 + - 1.3103088757515642 + - 1.9887098071035874 + - !!python/tuple + - 0.9547870367778581 + - 3.2354156105007825 + - 1.4119808186948308 + - 1.6262583156985304 + - 1.605995275422349 + - 1.4788511565303237 + - 1.261639301771605 + - 1.3047159413698228 + - 1.5017533510582122 + - 1.0147549964857585 + - 2.1008725523032896 + - 1.2286569750005696 + - 1.7676761535320278 + - !!python/tuple + - 1.3623044379732048 + - 3.2399976758963396 + - 1.466813753814498 + - 1.7033639246868695 + - 1.7041959395676793 + - 1.7633699241084164 + - 1.586979259653869 + - 1.3081604353269842 + - 1.7423848527983352 + - 1.1588681755703933 + - 1.9938558077194983 + - 1.363867053082804 + - 1.8022698229487664 + - !!python/tuple + - 0.8062283707627573 + - 3.1422071833693765 + - 1.5019875211172007 + - 1.6470813867632699 + - 1.6229321873172493 + - 1.4743014764870277 + - 1.2755695350757934 + - 1.2844866917383269 + - 1.518384452856182 + - 1.115822765902069 + - 2.0569252399642757 + - 1.1967906184339898 + - 1.6451592621026996 + - !!python/tuple + - 0.9537909919218657 + - 3.0959606137586984 + - 1.5159192597419286 + - 1.5938659783001248 + - 1.7311346983908913 + - 1.56181481527524 + - 1.5148430793166154 + - 1.248648964632856 + - 1.5424683266341925 + - 1.147331502870551 + - 1.9489295303728977 + - 0.9481662361335206 + - 1.68379154891215 + - !!python/tuple + - 0.9183414863333739 + - 3.1234263096512636 + - 1.4079317004997791 + - 1.517225013190746 + - 1.8130948496464212 + - 1.5756690108909264 + - 1.3673362344156272 + - 1.1884469010411396 + - 1.545427556282057 + - 1.047049573571936 + - 1.854585706423868 + - 1.0960637973705958 + - 1.4454298695689753 + - !!python/tuple + - 0.9910400564739723 + - 3.107514553394404 + - 1.7116109915476219 + - 1.3653734089713623 + - 1.8106336244841332 + - 1.3425109755448685 + - 1.566965358608583 + - 1.305919201186698 + - 1.7388448492089361 + - 1.3156866838640473 + - 1.9097280069299454 + - 0.9254108217203347 + - 1.3890999456262678 + - !!python/tuple + - 1.1377163659883447 + - 2.820162160882551 + - 1.6038004612209502 + - 1.7785864639609772 + - 1.6627647153826204 + - 1.8048970594055822 + - 1.5344020533308533 + - 1.2375651199287574 + - 1.6796246323769672 + - 1.27711898770638 + - 2.005492560617624 + - 1.1218575004290972 + - 1.5419029720158566 + - !!python/tuple + - 0.8412730529974508 + - 3.111102111886026 + - 1.5435321105444704 + - 1.5002967464827537 + - 1.7471110237076157 + - 1.5241153062975699 + - 1.481855954591099 + - 1.1967551720398288 + - 1.7320496068584303 + - 1.283943802092248 + - 1.7696731616768466 + - 0.9984599610956062 + - 1.6462254483952072 + - !!python/tuple + - 1.0953193914963189 + - 3.2195807788300312 + - 1.6111630456530603 + - 1.4594352202331387 + - 1.6296113228455877 + - 1.595164825605551 + - 1.5587193723297579 + - 1.1480484282000143 + - 1.669822303168721 + - 1.215411161654644 + - 1.7200108390669149 + - 1.1788739106163415 + - 1.3613835979326392 + - !!python/tuple + - 0.8290070014764703 + - 3.1513697989823015 + - 1.7015751075899037 + - 1.4052698761541098 + - 1.9101855249371056 + - 1.5022772062933658 + - 1.5977802954043894 + - 1.2218415856806975 + - 1.6989995955128068 + - 1.3747252788109043 + - 1.7052218117531963 + - 0.9740784094978552 + - 1.5010718793261082 + - !!python/tuple + - 1.0704502017354764 + - 3.466583686678171 + - 1.8400393682919927 + - 1.388528223856195 + - 2.0595306019319395 + - 1.656774526727307 + - 1.7118847535171162 + - 1.2990069963735513 + - 2.060646365464465 + - 1.5955090330397657 + - 1.5793818489327016 + - 1.4202291623747036 + - 1.4374434601583748 + - !!python/tuple + - 0.8624661230487487 + - 2.6790736749277304 + - 1.6765552562916064 + - 1.092048580929874 + - 1.6858984202234706 + - 1.1557576167845018 + - 1.3940755204188706 + - 1.1012792662305286 + - 1.6947984215738265 + - 1.3852399453578559 + - 1.630188266043021 + - 1.261011832547069 + - 1.343084379040688 + - !!python/tuple + - 0.9868242967068654 + - 3.124282952436917 + - 1.6272879766959374 + - 1.6390706981914955 + - 1.8867401129441281 + - 1.9653214545367854 + - 1.7052567540247876 + - 1.0991197718462065 + - 1.8656044519272004 + - 1.5098881930434134 + - 1.4784803934005883 + - 1.5422248479246174 + - 1.7203998968984535 + - !!python/tuple + - 0.8415837528224026 + - 3.163101929503231 + - 1.712834849131203 + - 1.327839702112251 + - 1.6755108461763126 + - 1.4017149301854763 + - 1.4773034145820518 + - 1.1772409803154695 + - 1.819798829429148 + - 1.4996437849949027 + - 1.5750151055608224 + - 1.3771086126461376 + - 1.401617358887258 + - !!python/tuple + - 0.9584342494065714 + - 2.440281309623529 + - 1.7144146404864522 + - 1.284831664313089 + - 1.5742205881647808 + - 1.545042053339793 + - 1.5515210186090873 + - 0.9417110500084751 + - 1.8081883550243014 + - 1.582401288298098 + - 1.393144366490675 + - 1.4640513080615694 + - 1.3687412509767227 + - !!python/tuple + - 1.04650256364976 + - 2.9883942226935925 + - 1.7567633990738896 + - 1.4181823031472263 + - 1.672089303861633 + - 1.6608102182186095 + - 1.6157304771183885 + - 1.1079755797720137 + - 1.9544410361083575 + - 1.6017173406314997 + - 1.4802967507850897 + - 1.3859877744351032 + - 1.2660770426352759 + - !!python/tuple + - 0.943991915938227 + - 2.8512516165628607 + - 1.8022287698619945 + - 1.4328222903789967 + - 1.677359250264985 + - 1.5568707117679668 + - 1.625720512621607 + - 1.148868226884987 + - 1.8892972770307281 + - 1.605106226177996 + - 1.6019198413946083 + - 1.146763834681779 + - 1.433495246818278 + - !!python/tuple + - 0.9929496408410634 + - 2.7492046961693526 + - 1.7627678055194202 + - 1.456737345261691 + - 1.7671804317888693 + - 1.646481547480625 + - 1.5663934290027468 + - 1.1297690722759963 + - 1.831045063469615 + - 1.5377504391005394 + - 1.616718033723612 + - 1.2931437390794138 + - 1.4783538844850757 + - !!python/tuple + - 0.9357455565444661 + - 2.9972975326724933 + - 1.8301583641829597 + - 1.289610163834439 + - 1.897919887107458 + - 1.543888870995011 + - 1.6785879127236827 + - 1.1602798118587212 + - 1.979602634850223 + - 1.7012293884859364 + - 1.4233618202935356 + - 1.3008243598981912 + - 1.4839645639219092 + - !!python/tuple + - 0.947669662307569 + - 2.7632459062830304 + - 1.8009740683995665 + - 1.2108256779930762 + - 1.6934873934675574 + - 1.4108222243225281 + - 1.5153641596319813 + - 1.0895698347432192 + - 1.8802407984580989 + - 1.6052017285354483 + - 1.4535224194847407 + - 1.2462336395438478 + - 1.3139678915787454 + - !!python/tuple + - 1.0368154648468761 + - 2.9557973109623497 + - 1.8419752586565574 + - 1.2933304162462935 + - 1.7570655260346721 + - 1.54768969300242 + - 1.6622687529510363 + - 1.1360866967939611 + - 1.8841124009697046 + - 1.6682168162955273 + - 1.4188128702618044 + - 1.3131815968275844 + - 1.4211305350726948 + - !!python/tuple + - 1.0134638888989538 + - 2.8475960290919793 + - 1.8105762530097373 + - 1.4917708085403885 + - 1.7143057954983933 + - 1.7784731354417664 + - 1.655012134185879 + - 1.0968536098004043 + - 1.9516865557518077 + - 1.7446407423455117 + - 1.3834659137763192 + - 1.3594253480242413 + - 1.558030136181645 + - !!python/tuple + - 0.8808756482740462 + - 2.8914664880539886 + - 1.7857114935888825 + - 1.3672877973932693 + - 1.7606599631935227 + - 1.6285279672633823 + - 1.5606635024449178 + - 1.0778744776209495 + - 1.8617768440232978 + - 1.654923076472293 + - 1.3695512533420193 + - 1.3728454554506264 + - 1.5331612196783433 + - !!python/tuple + - 0.9014562534739405 + - 2.7449577062442203 + - 1.754904548019391 + - 1.43605222723583 + - 1.6508426656330535 + - 1.5984877471849002 + - 1.5515024004681144 + - 1.0958577233836526 + - 1.8179079011363481 + - 1.6106916070461403 + - 1.515803927350467 + - 1.201795239313201 + - 1.4523998700635876 + - !!python/tuple + - 0.9542619553620618 + - 2.6094614360909434 + - 1.7729012787301102 + - 1.330712444534291 + - 1.686918240012196 + - 1.5852831188937657 + - 1.5798984419055773 + - 1.0417175793086901 + - 1.8202724526834657 + - 1.661901197591356 + - 1.3727039106735441 + - 1.1912099355580854 + - 1.3753362158638245 + - !!python/tuple + - 0.8861835442865726 + - 2.768163852553896 + - 1.7691714440721273 + - 1.4087171084858063 + - 1.5790292171642593 + - 1.5876797777290468 + - 1.5335357474436624 + - 1.0658293412770994 + - 1.854665440590823 + - 1.6901046261618358 + - 1.4110970629147528 + - 1.3993701626088146 + - 1.415135346655245 + - !!python/tuple + - 0.8735357273154569 + - 2.82316869501746 + - 1.8320291715238868 + - 1.5375134228467366 + - 1.661282871283602 + - 1.7186618982902144 + - 1.5604085185194403 + - 1.1393222780375447 + - 1.9204658802552597 + - 1.81554264892584 + - 1.4080766392006279 + - 1.2497629540483746 + - 1.4948244071612746 + - !!python/tuple + - 0.9320761001249435 + - 2.7112871277151482 + - 1.7729897218453712 + - 1.4073987248927395 + - 1.5494216368336349 + - 1.6752699204929788 + - 1.4985184542836494 + - 1.0356698746458959 + - 1.8599156720834094 + - 1.814489284497482 + - 1.2224803673786604 + - 1.4251378749488905 + - 1.3955048878973604 + - !!python/tuple + - 0.8764507637220327 + - 2.6094274205539643 + - 1.7931186371029963 + - 1.4247123947396847 + - 1.570578609557768 + - 1.6165020314513587 + - 1.5169532300187405 + - 1.0599680854590776 + - 1.8284602372303804 + - 1.7855083931906546 + - 1.3377313138717342 + - 1.2671479575369924 + - 1.5009577086580883 + - !!python/tuple + - 0.9367168376067929 + - 2.5504930476977083 + - 1.8189988649489308 + - 1.4045531399185132 + - 1.5456268859532907 + - 1.596797882702644 + - 1.516255365906289 + - 1.0618065118583062 + - 1.8771093769789249 + - 1.7971330150275069 + - 1.3670664716505982 + - 1.2914819097702273 + - 1.3096934307365367 + - !!python/tuple + - 0.9119391497471063 + - 2.7207335722666564 + - 1.8064203338366847 + - 1.4508553033318368 + - 1.5582822075132379 + - 1.6466127493088671 + - 1.5453495965259259 + - 1.0901865990349338 + - 1.8805833654000148 + - 1.8286845861702368 + - 1.31315015865759 + - 1.1907472898195688 + - 1.3629840452938162 + - !!python/tuple + - 0.9178545217709073 + - 2.8113270208306225 + - 1.7858929703881352 + - 1.5376839651702998 + - 1.5620458208773593 + - 1.6828576789135044 + - 1.4943343267763858 + - 1.1561202504121377 + - 1.8565941058571687 + - 1.8185662131125502 + - 1.395079438443907 + - 1.2515521483066885 + - 1.497836569296159 + - !!python/tuple + - 0.8750708658097872 + - 2.6031165069110953 + - 1.7753300583390264 + - 1.4718972693380161 + - 1.4816706879393782 + - 1.6463547583756286 + - 1.4360161755114818 + - 1.0669626994019201 + - 1.8281955226699724 + - 1.850167950206407 + - 1.2858090834525182 + - 1.3039250257002748 + - 1.4120195422606963 + - !!python/tuple + - 0.969505555951089 + - 2.7508822769185315 + - 1.807633521891651 + - 1.5473861011260455 + - 1.5105428543565576 + - 1.7611181753835878 + - 1.4479093322933207 + - 1.1320557168553658 + - 1.9593770079913693 + - 1.9710912242267935 + - 1.2329764565654369 + - 1.3494403381260605 + - 1.298319340091879 + - !!python/tuple + - 0.9475003165550477 + - 2.740063962805446 + - 1.7621716089097244 + - 1.4349469877363608 + - 1.5605604243312126 + - 1.6091302072745606 + - 1.4882494579637742 + - 1.125304472273732 + - 1.850426727286211 + - 1.8194326441004338 + - 1.3276103419858432 + - 1.3030094105251064 + - 1.3824884338993424 + - !!python/tuple + - 0.9172739580883646 + - 2.7106785088911374 + - 1.785386004414553 + - 1.500830826660156 + - 1.5245168653034842 + - 1.711268274889378 + - 1.4648972579266355 + - 1.1039097917338923 + - 1.8602265678417407 + - 1.9194619255582108 + - 1.2190500943446922 + - 1.2818856205776363 + - 1.442385466696984 + - !!python/tuple + - 0.8999795544205431 + - 2.7635072332475654 + - 1.8323496600568678 + - 1.5172870720939173 + - 1.6057854159557563 + - 1.7128694617399494 + - 1.4277907225081363 + - 1.1871942050311597 + - 1.8597104563543254 + - 2.020419330749684 + - 1.1837465497619897 + - 1.1083317381575102 + - 1.3468828464418314 + - !!python/tuple + - 0.9376648228014728 + - 2.7311104540422755 + - 1.75190897636587 + - 1.5598230172119882 + - 1.433998791676565 + - 1.6998572812812176 + - 1.3869472437675787 + - 1.1420286699869782 + - 1.8100679817417396 + - 1.8924121380759302 + - 1.2829098947502886 + - 1.2330125060017718 + - 1.3156503641317019 + - !!python/tuple + - 0.9853169726140121 + - 2.7957151784273266 + - 1.8128517678236373 + - 1.4841176464412316 + - 1.5681391481394726 + - 1.6911422192167533 + - 1.463595557802512 + - 1.1749103927759528 + - 1.881199234850995 + - 1.9669515506621342 + - 1.2118682825708795 + - 1.1848670050105827 + - 1.3263305768658071 + - !!python/tuple + - 0.9211067851106589 + - 2.6873045444546646 + - 1.7379776561101525 + - 1.5007234334960602 + - 1.5450217647728972 + - 1.6991429142821475 + - 1.3754000148679268 + - 1.1270162119547218 + - 1.8817405310861948 + - 1.9182737553039484 + - 1.2265067191806724 + - 1.3190167905857377 + - 1.395683498274796 + - !!python/tuple + - 0.9211067851106589 + - 2.6873045444546646 + - 1.7379776561101525 + - 1.5007234334960602 + - 1.5450217647728972 + - 1.6991429142821475 + - 1.3754000148679268 + - 1.1270162119547218 + - 1.8817405310861948 + - 1.9182737553039484 + - 1.2265067191806724 + - 1.3190167905857377 + - 1.395683498274796 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.139032478291163 + - 1.3563421138141942 + - 2.0807325045955736 + - 1.558236704823493 + - 0.9626678859012681 + - 3.9161442504388715 + - 2.09438328331573 + - 1.850495662840119 + - 1.8499199065728869 + - 1.793649123801062 + - 1.529909200657862 + - 1.3443925130166678 + - 2.101022820730887 + - !!python/tuple + - 1.2105666398951045 + - 1.2697302077979067 + - 2.1564057031002646 + - 1.3901514714134373 + - 0.8588655570586572 + - 3.8938179161778184 + - 2.0133800489354607 + - 1.4482473696476958 + - 2.0154006986064714 + - 2.1308289206326476 + - 1.3669885181956625 + - 1.3448967326684849 + - 1.7667084355416565 + - !!python/tuple + - 1.0834707859998114 + - 1.7053860537477867 + - 2.1701444005975743 + - 1.3648116737798612 + - 1.0503146787798465 + - 4.111778322275926 + - 2.0254262235285876 + - 1.6835648052077856 + - 1.9954191762911302 + - 1.7948490105985524 + - 1.5719472694400207 + - 1.3449050947872248 + - 2.1335649597521678 + - !!python/tuple + - 1.2313891487534316 + - 1.5084832712065992 + - 1.8536928090674691 + - 1.0890684252038882 + - 0.7711117601938022 + - 3.4295369383004783 + - 1.8514381668259565 + - 1.6712469118998126 + - 1.8312351501591675 + - 1.6642880651874505 + - 1.5347731097311095 + - 1.1842453838756781 + - 1.944786637904647 + - !!python/tuple + - 0.8806884046741337 + - 1.8170379126418024 + - 2.81876493759615 + - 1.0117454798150591 + - 0.9606791402772513 + - 3.0902102814360473 + - 1.8608709157081624 + - 1.462692781378563 + - 1.6585254409371113 + - 2.0951078858718963 + - 1.4574450104904726 + - 1.2396796379577357 + - 2.4190822430905223 + - !!python/tuple + - 1.168025060445888 + - 1.7011803643795242 + - 2.4202468393642125 + - 1.0042964659101692 + - 0.9162854067628561 + - 3.513572262130296 + - 1.815989368691564 + - 1.660546484700172 + - 1.831986969112882 + - 1.7801507330387736 + - 1.65095545316157 + - 1.2722939448725388 + - 1.8768495294975032 + - !!python/tuple + - 1.1394056383836744 + - 1.8304133728258212 + - 2.3438706732046772 + - 1.271289105942437 + - 0.9773796470794864 + - 3.2075016181796006 + - 1.5732136320511771 + - 1.855505351804089 + - 1.9499648657129378 + - 1.6025584497360528 + - 1.505488291199423 + - 1.0827827015990021 + - 2.2210496748699726 + - !!python/tuple + - 0.9319259128220057 + - 1.771923944001168 + - 2.532350448144557 + - 1.1644285548879572 + - 0.9161464864848747 + - 3.043037633149374 + - 1.5318713840665898 + - 1.5250024808534368 + - 1.7167714889814918 + - 1.7616870091043202 + - 1.4478898166178151 + - 1.2412801817513426 + - 2.3450618510244037 + - !!python/tuple + - 1.2103622592063208 + - 1.8027782328639834 + - 2.5583676036586023 + - 1.0878833480040504 + - 0.8709190849956133 + - 2.7589966221776066 + - 1.4086731434133806 + - 1.4783449161871263 + - 1.6676348851002645 + - 1.3175550137422671 + - 1.2190586564958428 + - 1.0096739245049577 + - 1.8425081794808995 + - !!python/tuple + - 0.9877892279848236 + - 1.7880986331758828 + - 2.5616839719678746 + - 1.3238854053577616 + - 1.0272901102347873 + - 2.627085076682096 + - 1.6434658310015846 + - 1.8192766589083909 + - 1.8205850629642084 + - 2.3290782609431098 + - 1.6383003225019435 + - 1.31543511678454 + - 1.9825433054927342 + - !!python/tuple + - 1.1323948225266676 + - 2.307450683113732 + - 2.276319348392214 + - 0.9523723845833758 + - 0.9961586359214224 + - 2.1415718917481916 + - 1.1035238587632348 + - 1.6746227975240773 + - 1.7928364264887087 + - 1.4277556655353907 + - 1.464197103118201 + - 0.9221951405678976 + - 2.3977192905574496 + - !!python/tuple + - 1.048052610357493 + - 2.216555143061235 + - 2.751703577348194 + - 1.1786305457862023 + - 1.0502858438813967 + - 1.8778996172362508 + - 1.237178054268944 + - 1.3945280589720217 + - 1.48404630394716 + - 1.9034351530862903 + - 1.383002307714902 + - 1.3038038437439479 + - 2.2065525466308387 + - !!python/tuple + - 1.3312373815376595 + - 2.232976379261281 + - 2.795318559856245 + - 1.1922918094340824 + - 1.1049285012153556 + - 1.5670541345053568 + - 1.0613291214458092 + - 1.498589294219994 + - 1.8701761976192772 + - 1.9607059141500613 + - 1.3794990901056574 + - 1.153001923460246 + - 2.0331220666995646 + - !!python/tuple + - 1.0701439575272729 + - 2.5938812170273837 + - 2.7136461070207267 + - 1.028449177905181 + - 1.232816781192565 + - 1.6796921580325654 + - 1.4034313618474714 + - 1.4656443083452504 + - 1.8522975175645637 + - 2.3310200088798303 + - 1.6647652927783732 + - 1.4566962222095379 + - 1.9102150026859763 + - !!python/tuple + - 0.9196855984714474 + - 2.1619807939954834 + - 2.2701988031561773 + - 1.720464954080953 + - 1.3313008518430598 + - 2.2215991169620017 + - 1.1778905275898184 + - 1.7236082659716052 + - 1.7840400330978898 + - 1.8334662675576665 + - 1.53947285484459 + - 1.4016241591542304 + - 1.595432105696923 + - !!python/tuple + - 1.1644759963257223 + - 1.96758895771878 + - 2.4289253733333553 + - 1.2119839243241375 + - 0.9641050314259085 + - 1.9058294660258719 + - 1.2402762067671893 + - 1.4122138533095214 + - 1.5739542371980073 + - 1.626035852591293 + - 1.2424200201891924 + - 1.1454696422793815 + - 1.4243318681880708 + - !!python/tuple + - 0.9871201544744053 + - 2.0411430898765497 + - 2.588112746960892 + - 1.311723341087424 + - 1.0570566937624435 + - 1.4815399631210964 + - 1.0682633686528833 + - 1.3971204339685301 + - 1.6418907835386882 + - 2.078708166356351 + - 1.4078344529570823 + - 1.3731208897537708 + - 1.6677379672627746 + - !!python/tuple + - 1.169581014812745 + - 2.3405426435650427 + - 2.502676878350787 + - 1.25649929031238 + - 1.1321598885540913 + - 1.3185846354497395 + - 1.0545853232643836 + - 1.3777631013759415 + - 1.6448439278677989 + - 2.029675613864523 + - 1.4122019946541795 + - 1.366552116414996 + - 1.502978506729581 + - !!python/tuple + - 1.2284015152460708 + - 2.1475597598367844 + - 2.3178345007868746 + - 1.3610140501887076 + - 1.1511876567360735 + - 1.6133566476069934 + - 1.1966208086124406 + - 1.7167058155033694 + - 1.9814540673835759 + - 2.208078645030797 + - 1.5765670844977697 + - 1.307637346485906 + - 1.2372487013558744 + - !!python/tuple + - 1.037058637445581 + - 2.2855861715253063 + - 1.8819769525483694 + - 0.9795345716417159 + - 1.0107542991061882 + - 1.8273560104167967 + - 1.1346263945050041 + - 1.4824876009299905 + - 1.750946021112421 + - 1.841917144941951 + - 1.5373407316831074 + - 1.1556507968878424 + - 1.5805150098025296 + - !!python/tuple + - 1.0775240846038656 + - 2.1760274219598488 + - 2.1650044650209104 + - 1.3629151918618168 + - 1.16779237483737 + - 1.9160274716699348 + - 1.3487685933929494 + - 1.3874486083090105 + - 1.8398098643769514 + - 2.2533382504484534 + - 1.5471136919379194 + - 1.5321734113483747 + - 1.2179067091072349 + - !!python/tuple + - 1.2734593819455282 + - 2.2247583701015006 + - 2.3313369871897356 + - 1.2583790760937443 + - 1.2311685162178316 + - 1.7766466086767445 + - 1.272908235219278 + - 1.2969989721717163 + - 1.8668215995887523 + - 1.9279543299918038 + - 1.532010678531073 + - 1.518246020543554 + - 1.1629567851741598 + - !!python/tuple + - 1.1843111634595784 + - 2.4217547386316847 + - 1.8014570866522588 + - 1.3468368365219263 + - 1.2629098615185004 + - 1.9948026057324815 + - 1.370831307246457 + - 1.643670198054107 + - 1.9632090058594973 + - 2.0127302301080303 + - 1.6618577547669462 + - 1.4004501209163025 + - 1.2237218842972166 + - !!python/tuple + - 0.9848616337164403 + - 2.2234541747530745 + - 2.0812580221863826 + - 1.3434815265354774 + - 1.1601638423525698 + - 1.808439732793943 + - 1.3226812470961349 + - 1.5276006427075033 + - 1.7322600565052397 + - 2.1645363657663514 + - 1.590180358216641 + - 1.4693195386811517 + - 1.3116470103021598 + - !!python/tuple + - 0.9082010890652938 + - 2.404551789424392 + - 2.1124138403105204 + - 1.3678985101183374 + - 1.2704457210969489 + - 1.6127927173276326 + - 1.1321947090948654 + - 1.43904940972392 + - 1.814758894979402 + - 2.0685905153484367 + - 1.5433823826155635 + - 1.4363597762445544 + - 1.216395547818105 + - !!python/tuple + - 1.0475686037345258 + - 2.296367904758559 + - 2.110786700043694 + - 1.3888859353036782 + - 1.1822897808635282 + - 1.6032168072055222 + - 1.1126899678671496 + - 1.5818976227199357 + - 1.7653598794907177 + - 1.845187058419673 + - 1.5208170121215856 + - 1.3386891702046169 + - 1.4050615391773036 + - !!python/tuple + - 1.0426694814824584 + - 2.2782552787483317 + - 1.980924401697644 + - 1.1711833888719934 + - 1.1072412368033944 + - 1.8238306461555156 + - 1.1850919975481933 + - 1.477435892377105 + - 1.77630601660562 + - 1.9189098769823554 + - 1.5385423711444024 + - 1.2920271751558714 + - 1.461781624470046 + - !!python/tuple + - 1.0136743198007436 + - 2.381548712565709 + - 1.9664192269308858 + - 1.3332520198827513 + - 1.2303484144662966 + - 1.7103989651163167 + - 1.0971655930444684 + - 1.571163956888366 + - 1.7537523370866348 + - 1.6870164486022814 + - 1.5310556645360118 + - 1.287688120700579 + - 1.505708986916014 + - !!python/tuple + - 1.0840071944234095 + - 2.415909918445678 + - 1.8263634199708174 + - 1.1601804730114633 + - 1.1732441979979868 + - 1.611541891690139 + - 1.2346510851523003 + - 1.3463273226541812 + - 1.817974135129956 + - 1.989625956926374 + - 1.5682012629805686 + - 1.429342943816799 + - 1.1974298878809795 + - !!python/tuple + - 1.0811910788445798 + - 2.39505522974489 + - 1.917750217673818 + - 1.3073813014516953 + - 1.247107556302586 + - 1.760970942949051 + - 1.1071223404935013 + - 1.4662699790988252 + - 1.916547987833821 + - 1.7542741073028156 + - 1.527038722473438 + - 1.3163524406222238 + - 1.4182478414162194 + - !!python/tuple + - 1.053765774237366 + - 2.319718157819885 + - 1.87917085780403 + - 1.3226064051769941 + - 1.209449425051249 + - 1.7966642627373162 + - 1.189518919342685 + - 1.4432706196043594 + - 1.8065326833909174 + - 1.8625020110561956 + - 1.537466077260197 + - 1.3910473970698196 + - 1.2693522886093795 + - !!python/tuple + - 1.0802199733275626 + - 2.403310868478744 + - 1.870241498623267 + - 1.210517683393658 + - 1.1943304193608522 + - 1.670091947334769 + - 1.1994480921910555 + - 1.3780490394889062 + - 1.8045492094122717 + - 1.8966182621109395 + - 1.5464591112805608 + - 1.3973305538128056 + - 1.2637342802596296 + - !!python/tuple + - 1.0848932627612253 + - 2.4203191288015358 + - 1.9019126235426485 + - 1.3115814877905199 + - 1.2632074401308433 + - 1.7213040830521131 + - 1.186721318036537 + - 1.3961653508955432 + - 1.8112472308000507 + - 1.7975926764060919 + - 1.5335786106945282 + - 1.4151228608311441 + - 1.2545957252172657 + - !!python/tuple + - 1.0636959512387398 + - 2.4300109294953023 + - 1.7795216875832915 + - 1.2460464916397682 + - 1.2406273717387521 + - 1.761156696415993 + - 1.1850865776039066 + - 1.4266944564985893 + - 1.8333697335449022 + - 1.768099937179691 + - 1.5627147928249099 + - 1.3619660109088514 + - 1.2792882962454102 + - !!python/tuple + - 1.0797465806153084 + - 2.3458997458576647 + - 1.8116789175059556 + - 1.2911613615856359 + - 1.2095292504046826 + - 1.7898656324880433 + - 1.1569835927047083 + - 1.4167523428153366 + - 1.838324258897444 + - 1.714006869728745 + - 1.4770875599971145 + - 1.309619646809101 + - 1.3176216951686381 + - !!python/tuple + - 1.0496159334204909 + - 2.439382516056316 + - 1.8358194003093977 + - 1.2847718891759947 + - 1.2656223642868736 + - 1.7088949299869298 + - 1.1723836662266454 + - 1.4163924954666558 + - 1.8647247309731063 + - 1.887737362971872 + - 1.5756914427466935 + - 1.4057193270145296 + - 1.363822244716531 + - !!python/tuple + - 1.1045795055440695 + - 2.397641347074677 + - 1.9430121397862055 + - 1.2660762842226436 + - 1.249484206516374 + - 1.6605128890378689 + - 1.161051759979908 + - 1.3796333163373014 + - 1.8567675017739562 + - 1.8284764141975542 + - 1.531973395372458 + - 1.3918962910773605 + - 1.2935758695140682 + - !!python/tuple + - 1.082611256179332 + - 2.487371503659101 + - 1.7950159638036496 + - 1.2610763862274386 + - 1.2969126932089963 + - 1.6546059913009408 + - 1.1659143938381324 + - 1.3647418939916027 + - 1.9467063380360337 + - 1.837880669450427 + - 1.5452473237396516 + - 1.3740933327221225 + - 1.3027337601218585 + - !!python/tuple + - 1.0480065454769218 + - 2.4912832098574262 + - 1.7966362364020017 + - 1.2510203438130245 + - 1.285260299862213 + - 1.6148757527324968 + - 1.208336284243705 + - 1.378199617899776 + - 1.833176309605854 + - 1.8589093188652592 + - 1.5533499139207914 + - 1.3958075545603312 + - 1.2864945265102643 + - !!python/tuple + - 1.0619945729507232 + - 2.436422522873815 + - 1.7743099643837936 + - 1.315207716539536 + - 1.2959323456773726 + - 1.7091837871733992 + - 1.17530338665315 + - 1.4176333140036346 + - 1.9513758231021463 + - 1.838738212917233 + - 1.5473713748794764 + - 1.372531944818713 + - 1.3217271046315318 + - !!python/tuple + - 1.0619945729507232 + - 2.436422522873815 + - 1.7743099643837936 + - 1.315207716539536 + - 1.2959323456773726 + - 1.7091837871733992 + - 1.17530338665315 + - 1.4176333140036346 + - 1.9513758231021463 + - 1.838738212917233 + - 1.5473713748794764 + - 1.372531944818713 + - 1.3217271046315318 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.6749764147323978 + - 2.0186205764509224 + - 2.6075754558910575 + - 1.1486823474932817 + - 1.6154248492109948 + - 2.7316056801794204 + - 1.955862275547379 + - 1.1437524687465006 + - 1.8689815175224154 + - 0.7293396856672065 + - 1.6701519249058068 + - 1.651977661219096 + - 1.8887799830413554 + - !!python/tuple + - 1.693682863872791 + - 1.9933382740551493 + - 2.8119935563096408 + - 1.05384176358188 + - 1.670985748091498 + - 2.334562991976257 + - 1.8139199789740976 + - 1.1440833564031414 + - 1.9432942052999989 + - 0.8737861775232125 + - 1.4089641469029182 + - 1.6844176755858118 + - 1.5623665403738287 + - !!python/tuple + - 1.3560808020747142 + - 1.9273292175225407 + - 1.7463010518500153 + - 1.008018116896193 + - 2.0773316026288757 + - 2.4498231453237733 + - 1.7044247604072686 + - 1.0320919521433065 + - 2.171210255775651 + - 0.8210786060953859 + - 1.4857134500373588 + - 1.5465758935654583 + - 1.6636041189960096 + - !!python/tuple + - 1.7320993954582078 + - 1.59223486837609 + - 1.443054846711156 + - 1.2766709133803185 + - 2.1799995158158123 + - 2.0766275932297242 + - 1.4911363199152339 + - 1.0217238118038845 + - 2.451779615150619 + - 1.2353399894620987 + - 1.2127713201614887 + - 1.635556440836562 + - 1.3993321293454948 + - !!python/tuple + - 0.928451354210722 + - 1.5111139709782992 + - 3.1994310518383493 + - 1.5442090178805385 + - 2.2840816819376766 + - 2.3059411761632767 + - 1.6883225712806993 + - 1.0743311181709947 + - 2.7173322663759456 + - 0.9805159500922673 + - 1.4237758459718994 + - 1.8283480992971972 + - 1.6898374382003496 + - !!python/tuple + - 0.9184253413290324 + - 1.8147565135551313 + - 3.930604523509597 + - 1.2535206516273947 + - 2.032546718539307 + - 2.046427731806234 + - 1.9912404062221656 + - 1.4002623042735782 + - 2.2247630239069234 + - 0.8802199740863474 + - 1.1638575150962256 + - 1.5181649713530974 + - 1.480837334506071 + - !!python/tuple + - 1.169233805353012 + - 1.6745745335016409 + - 2.343367675677249 + - 1.3399291594874967 + - 2.194816698588141 + - 2.1617448900374523 + - 1.908478242224616 + - 1.4127304986785987 + - 2.2932755334708026 + - 0.8493648186485908 + - 1.377772295871822 + - 1.3622268660918913 + - 1.5522904360629117 + - !!python/tuple + - 0.643565481493146 + - 2.0160625180139693 + - 2.8932063528283685 + - 1.2369799386335676 + - 2.284108905426598 + - 1.8222470993369893 + - 1.7395497931055937 + - 1.2620681478234141 + - 2.503227593764408 + - 0.908408250796373 + - 1.0913144200722087 + - 1.385024623551719 + - 1.3376655236545727 + - !!python/tuple + - 0.8824370554846541 + - 1.5291039995610523 + - 3.038081765375379 + - 1.2429136615458845 + - 2.524329718436466 + - 1.9165028667662076 + - 1.7067299627527959 + - 1.1494824609751417 + - 2.7395695965347575 + - 1.1183123044152417 + - 1.0186393335832415 + - 1.6773502431417975 + - 1.2981954691533693 + - !!python/tuple + - 1.236273898474912 + - 1.498233159177361 + - 2.344188220968997 + - 1.1552369613519915 + - 2.230346781864175 + - 1.8205852456963645 + - 1.62722236723866 + - 1.385811293239553 + - 2.5166658661651433 + - 1.0109425279347812 + - 1.170009071238471 + - 1.557406733431462 + - 1.2862758798695544 + - !!python/tuple + - 0.9406725896892181 + - 1.967372506020499 + - 2.831959270918259 + - 1.2410565191795584 + - 2.370721440325752 + - 1.8875600543561388 + - 1.5726411539248457 + - 1.2300750636680573 + - 2.8292575255762498 + - 1.2513058334254952 + - 1.0344515510924706 + - 1.5854564159066689 + - 1.3069689023201332 + - !!python/tuple + - 0.9621516794374871 + - 1.6645969995694583 + - 2.8437172324982263 + - 1.2558242686747958 + - 2.2945404989648934 + - 1.6434021290663732 + - 1.4722721563780927 + - 1.414612809366762 + - 2.604073108265859 + - 1.1577909748589033 + - 0.8817260140315093 + - 1.3777384596233833 + - 1.1465070763527556 + - !!python/tuple + - 1.2512965897315302 + - 1.7951157768952908 + - 2.168939968196704 + - 1.0967289708281682 + - 1.7847269546554698 + - 1.787479123199267 + - 1.3399543711084942 + - 1.4708566650765824 + - 2.417584240924923 + - 1.1080247047083904 + - 1.1349214504691736 + - 1.1796954755986264 + - 1.2914093748224884 + - !!python/tuple + - 1.3263067012638778 + - 1.7926487084191975 + - 2.804683795064247 + - 1.1742251955431098 + - 1.7385692768916723 + - 1.8417136435491788 + - 1.294744346015085 + - 1.458929745681313 + - 2.8412338806897774 + - 1.422867613999955 + - 0.9698090490454392 + - 1.4957393028061714 + - 1.3266628098245743 + - !!python/tuple + - 1.1174995120426052 + - 1.7175210799960872 + - 2.5865790118009633 + - 1.1503389180992076 + - 1.769996921774942 + - 1.7270688592903396 + - 1.1261303937116223 + - 1.2648316684997745 + - 2.763158748398747 + - 1.3015565970467202 + - 0.9548741087105801 + - 1.3681806295166088 + - 1.2294075691048825 + - !!python/tuple + - 1.0821992270822849 + - 1.6861849372624422 + - 2.766984235986495 + - 1.2150022610524613 + - 1.9307272479433069 + - 1.6960352587712435 + - 1.1023670176391693 + - 1.4019138321448736 + - 2.8846498967914282 + - 1.3968530681692692 + - 0.9927807931800974 + - 1.4766833662824792 + - 1.2716264299268065 + - !!python/tuple + - 1.1607994651071505 + - 1.6876862742636973 + - 2.422753762469737 + - 1.1608164263824103 + - 1.7934281026520107 + - 1.7525887958129598 + - 1.2537295241874464 + - 1.4348824707828145 + - 2.703265498985166 + - 1.2642928412976957 + - 1.064511772328537 + - 1.2718675349110187 + - 1.2856463028941802 + - !!python/tuple + - 1.145174800061569 + - 1.9127253273866311 + - 2.642052759597396 + - 1.143153254560926 + - 1.5416389393880001 + - 1.7268318851120112 + - 1.1323911227981582 + - 1.4641974463192353 + - 2.9039285613154036 + - 1.4569319029727663 + - 0.9457152079149371 + - 1.2254912738751975 + - 1.2801061228165163 + - !!python/tuple + - 1.0188140747350212 + - 1.773170369716492 + - 2.683118024312441 + - 1.2153701165840962 + - 1.8001819814343043 + - 1.8183601805914167 + - 1.1812651050690286 + - 1.3320543310782669 + - 2.752030511522171 + - 1.2565362990538738 + - 1.056949751152572 + - 1.3339348142824994 + - 1.3382767843774386 + - !!python/tuple + - 0.9768624388572913 + - 1.716187892562407 + - 2.500347324419209 + - 1.2070665767303805 + - 1.8578477579680257 + - 1.731916177356514 + - 1.1525402419547164 + - 1.3150838621635954 + - 2.8398464310767486 + - 1.3086015243059912 + - 1.037896701812985 + - 1.2927166558324767 + - 1.2858297185444283 + - !!python/tuple + - 1.136059028511144 + - 1.7009217595785722 + - 2.5049007900326457 + - 1.1394252974463526 + - 1.686222678575506 + - 1.7686372419648624 + - 1.117273032292326 + - 1.355952209791801 + - 2.773521991235445 + - 1.3150648471901158 + - 0.9965375552580215 + - 1.3168142069871391 + - 1.2954748958959252 + - !!python/tuple + - 1.0215698587898845 + - 1.6290606031106056 + - 2.6646690501505885 + - 1.238016364373231 + - 1.7869976565156596 + - 1.803963804133736 + - 1.2242413557133918 + - 1.345039886903706 + - 2.91546333298197 + - 1.3240533139419712 + - 1.0527792328134389 + - 1.3396939664135057 + - 1.33248789088281 + - !!python/tuple + - 1.0341098226362209 + - 1.8024623837057523 + - 2.7256055817515894 + - 1.2087420986534965 + - 1.85306797591099 + - 1.7892765421628751 + - 1.2051355771705943 + - 1.3324374488168842 + - 2.987235561159739 + - 1.4120192233698377 + - 1.0000202393209978 + - 1.420609120715881 + - 1.3106438855212486 + - !!python/tuple + - 1.110958747304863 + - 1.683845994568897 + - 2.75976633987223 + - 1.2095199490045556 + - 1.72662387787132 + - 1.7337769867290644 + - 1.1308906307899318 + - 1.412549980750448 + - 2.8503069943743524 + - 1.3843264138414861 + - 1.0064660138341908 + - 1.3655674179468298 + - 1.3048898039327803 + - !!python/tuple + - 1.0622647458234526 + - 1.7505290513021992 + - 2.6372873918213733 + - 1.2491041216679803 + - 1.7945372206291341 + - 1.7970185132818906 + - 1.211758477317097 + - 1.492648847407042 + - 2.9326425041801496 + - 1.3958022510451529 + - 1.0947848166698726 + - 1.3340617195125923 + - 1.3826556777865524 + - !!python/tuple + - 1.0063695488267805 + - 1.734044954464216 + - 2.648357572959549 + - 1.2163396994179199 + - 1.755364626982931 + - 1.7503591320183651 + - 1.1526461484780535 + - 1.3692155029610942 + - 2.9396808570897988 + - 1.3828011898273906 + - 1.0267654454637016 + - 1.3136332198791942 + - 1.315084504917282 + - !!python/tuple + - 1.0323882818991779 + - 1.7741888345834194 + - 2.7757277591093263 + - 1.2208364206926818 + - 1.6831456378914114 + - 1.7796116684953485 + - 1.1437412589087623 + - 1.4074468084419063 + - 2.9096245614734055 + - 1.3800328596723155 + - 1.0310822885524298 + - 1.3247864483339522 + - 1.3455974245337567 + - !!python/tuple + - 0.9977423177333109 + - 1.8451118728235263 + - 2.6326092755590285 + - 1.2236578614501892 + - 1.6587258320202478 + - 1.7952474029679983 + - 1.1668171615728045 + - 1.414502658306099 + - 3.03706431102432 + - 1.427875339636409 + - 1.0351570949698998 + - 1.2792322509825482 + - 1.361098469215604 + - !!python/tuple + - 1.0946452070088948 + - 1.8317816427670341 + - 2.666692621812647 + - 1.2099659511275163 + - 1.6990870821169413 + - 1.8041451717810184 + - 1.1903576655736472 + - 1.4199054813312542 + - 2.944625114253893 + - 1.4304515008724064 + - 1.061322022988723 + - 1.3518136745700091 + - 1.370170164206016 + - !!python/tuple + - 1.0408390703651824 + - 1.812587096824105 + - 2.636433508949341 + - 1.199614200916539 + - 1.6509754838310662 + - 1.8006826656503105 + - 1.1433888012552766 + - 1.410795782413172 + - 2.9253900426563497 + - 1.3933221461411902 + - 1.0441313823790133 + - 1.293519431524718 + - 1.367696584934305 + - !!python/tuple + - 1.0515735243589692 + - 1.80663685342282 + - 2.642552359080466 + - 1.2202270494867138 + - 1.6438918993765144 + - 1.7965225552186759 + - 1.185003803998569 + - 1.4763588530607903 + - 2.968405663234109 + - 1.4203780775973258 + - 1.0727672484186443 + - 1.2688689404479594 + - 1.3812152240293871 + - !!python/tuple + - 1.063825115115287 + - 1.8351473742710955 + - 2.694825234169201 + - 1.2177275270031136 + - 1.7118693316017684 + - 1.7914646456845957 + - 1.2105685594528954 + - 1.459230590714931 + - 2.9381003261503533 + - 1.416860956945291 + - 1.0543546934431411 + - 1.329919221772658 + - 1.3716459704007096 + - !!python/tuple + - 1.0385758581756437 + - 1.858733400080237 + - 2.7419606025842143 + - 1.2371154500933907 + - 1.6803961649886143 + - 1.8020990552213332 + - 1.1706351445911232 + - 1.4835737365389678 + - 3.026698468523131 + - 1.4751109528226638 + - 1.0649047026893061 + - 1.3325483075878481 + - 1.4017398403787387 + - !!python/tuple + - 1.1074440728855528 + - 1.8166873493960787 + - 2.71291793066835 + - 1.1862005065371526 + - 1.6124706619495481 + - 1.8075074189328841 + - 1.198737654742267 + - 1.4865259120820606 + - 2.978871644736648 + - 1.4606697904414194 + - 1.0630069767307122 + - 1.3310916784556333 + - 1.3954154181281022 + - !!python/tuple + - 1.0688164681602135 + - 1.8014507824589825 + - 2.589698544451365 + - 1.2009991087621115 + - 1.717663538571486 + - 1.7817340370408736 + - 1.183831366868355 + - 1.4380577557253091 + - 2.9317339155402657 + - 1.4182331227700853 + - 1.0736567409786661 + - 1.3173183658521306 + - 1.3679812185812548 + - !!python/tuple + - 1.025181253679634 + - 1.8539482635083473 + - 2.676447994054393 + - 1.2016827021903596 + - 1.6299314592379601 + - 1.785300374277342 + - 1.1772347891208237 + - 1.4632275930594865 + - 3.0121818054661027 + - 1.4434998080231773 + - 1.044907182757104 + - 1.2885029465287714 + - 1.3761666963867032 + - !!python/tuple + - 1.0583333225849627 + - 1.8333784347284037 + - 2.7488147966330576 + - 1.2064319006310558 + - 1.6722531306991402 + - 1.7838747293294817 + - 1.1566280974225722 + - 1.4383625034024412 + - 2.979406331255398 + - 1.4571823543243876 + - 1.030967445778298 + - 1.3557159896924706 + - 1.3736178001374157 + - !!python/tuple + - 1.0604015015989434 + - 1.803737310165032 + - 2.7232595573022897 + - 1.199050870557828 + - 1.6511726851034252 + - 1.81017412472857 + - 1.2172605936691143 + - 1.5084178177635146 + - 2.948153406260199 + - 1.4305213473587823 + - 1.0946155097315433 + - 1.322395470891387 + - 1.4208963330279722 + - !!python/tuple + - 1.046948852092325 + - 1.8073515492384151 + - 2.757643293748843 + - 1.1969610304120248 + - 1.639971178859723 + - 1.781486021021395 + - 1.2066368650520667 + - 1.5091348316089879 + - 3.0191229699457716 + - 1.476290980175044 + - 1.0682505029018574 + - 1.3237689353309718 + - 1.4010472105427985 + - !!python/tuple + - 1.0610321114489771 + - 1.827835948321947 + - 2.7018741464748537 + - 1.1748432356527867 + - 1.6181608680342743 + - 1.786810394397207 + - 1.186270208377657 + - 1.4868311790045978 + - 2.9608831748350593 + - 1.4469732595257123 + - 1.0561635564424128 + - 1.301368863115534 + - 1.3898249712212145 + - !!python/tuple + - 1.034669697292769 + - 1.8397079978970785 + - 2.6218844602696327 + - 1.1583078836216705 + - 1.6065462522803553 + - 1.7984549643794572 + - 1.2195920807142056 + - 1.4865122342817176 + - 3.057753368912414 + - 1.4870657986597506 + - 1.07162125143553 + - 1.296289239494296 + - 1.4118313686584432 + - !!python/tuple + - 1.0720859523247421 + - 1.77406514013821 + - 2.722117807160469 + - 1.1725412100536383 + - 1.656806247084618 + - 1.7966808863862607 + - 1.1999868428283818 + - 1.4888761718370607 + - 2.9514070179388314 + - 1.450482210677691 + - 1.0843774105121051 + - 1.3485441938916873 + - 1.4129817500048378 + - !!python/tuple + - 1.0623358664532567 + - 1.8271000734015912 + - 2.6757706378409827 + - 1.1516112787831179 + - 1.6580451970728585 + - 1.7973283065109131 + - 1.2641860510412002 + - 1.5060733190177906 + - 2.9539695320123887 + - 1.4365802337072913 + - 1.090113676002459 + - 1.3306143198199576 + - 1.413323185762402 + - !!python/tuple + - 1.0450447018599949 + - 1.821929334522561 + - 2.579189936855594 + - 1.1258121103491487 + - 1.6180249980058108 + - 1.7573297825776188 + - 1.1992611912889986 + - 1.4886778641222207 + - 3.0658592557459983 + - 1.5088507083944145 + - 1.0656931365442224 + - 1.3087465781533623 + - 1.3907214658956952 + - !!python/tuple + - 1.0245980044161147 + - 1.7807271333272265 + - 2.6930474980659724 + - 1.150637064706232 + - 1.6533185365109815 + - 1.7614505217449983 + - 1.2349958008658224 + - 1.5144481008797435 + - 2.993126257937769 + - 1.4633310174480716 + - 1.0751998285714635 + - 1.301865776199661 + - 1.3975108710860482 + - !!python/tuple + - 1.0245980044161147 + - 1.7807271333272265 + - 2.6930474980659724 + - 1.150637064706232 + - 1.6533185365109815 + - 1.7614505217449983 + - 1.2349958008658224 + - 1.5144481008797435 + - 2.993126257937769 + - 1.4633310174480716 + - 1.0751998285714635 + - 1.301865776199661 + - 1.3975108710860482 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 2.2251237397355177 + - 1.7494496832481417 + - 1.187576295409837 + - 2.1927909638940433 + - 0.9613877917393209 + - 0.9743093675374388 + - 1.2564763146129945 + - 1.312652544103753 + - 1.094147846391631 + - 1.239861529248519 + - 1.5094080697645387 + - 0.9983650470834826 + - 2.2602388135003446 + - !!python/tuple + - 2.27330013342701 + - 1.861561679516065 + - 1.1499966520115288 + - 1.5147433676908015 + - 0.9895528281276412 + - 0.878896572391699 + - 1.3222169466563245 + - 1.4135639003046385 + - 0.8690667475210401 + - 1.2614717044250796 + - 2.576388667671301 + - 1.0521424257071443 + - 2.2220564813093966 + - !!python/tuple + - 1.799027541423213 + - 1.8681501143927721 + - 1.2538380511162732 + - 2.100659885655437 + - 1.0035532480807021 + - 0.9754177723140791 + - 1.3776527572693686 + - 1.280554285431459 + - 1.0351175940803494 + - 1.3513517003219344 + - 2.2788523965514935 + - 1.1461091027398131 + - 2.32448312590616 + - !!python/tuple + - 2.177184932405974 + - 1.9730510899698717 + - 1.3978782193193462 + - 2.0528337435837374 + - 1.1677188284667426 + - 1.1006671978443807 + - 1.5780551142561492 + - 1.281438292825881 + - 0.9702238356829589 + - 1.344111839333786 + - 1.8630870161290964 + - 1.1525317529337524 + - 2.1930918044712366 + - !!python/tuple + - 2.1254683518880766 + - 1.9691240010796034 + - 1.401007465941285 + - 1.9158754385147816 + - 1.1534840417196262 + - 1.007213736688756 + - 1.4331423361497753 + - 1.3318638618025194 + - 1.0255036753801607 + - 1.3847270749724538 + - 1.8024103725497893 + - 1.1443284825694158 + - 2.414903334110808 + - !!python/tuple + - 1.9850826179459746 + - 1.9698283671112 + - 1.4301545641115005 + - 1.783371777045196 + - 1.1571623560290094 + - 0.8748371824503887 + - 1.6031632129805877 + - 1.3134363014936286 + - 0.9539963894801802 + - 1.4504132269543217 + - 1.6726181561597273 + - 1.200413050226831 + - 2.351397589992076 + - !!python/tuple + - 2.0284822909368323 + - 1.961137808096149 + - 1.489435632033925 + - 2.089807105154307 + - 1.2396277455267704 + - 1.076187514716521 + - 1.5100636255254762 + - 1.2857668949546288 + - 0.9568702224923338 + - 1.4808758605586585 + - 1.652388450273436 + - 1.2573486499624702 + - 2.3304205113919463 + - !!python/tuple + - 2.0338588082280986 + - 2.116912756880676 + - 1.4541863544025007 + - 1.9449307667908768 + - 1.209154430426422 + - 1.0676671441507948 + - 1.5216536640945972 + - 0.9937334956171759 + - 1.009355257780051 + - 1.4060052990671155 + - 1.8257984579088404 + - 1.1933854838607296 + - 2.325300882695714 + - !!python/tuple + - 1.6366365213637648 + - 2.2201606451102793 + - 1.7451718891267933 + - 1.7862752830811353 + - 1.320895001711301 + - 0.9334951297162024 + - 1.8917406186495545 + - 1.2343348652202417 + - 0.7756577517003488 + - 1.5587560498352993 + - 1.8150747547564363 + - 1.3313001105859472 + - 2.304201519008271 + - !!python/tuple + - 1.7241881921629028 + - 2.226030217364282 + - 1.5317215760783887 + - 1.6981921651083187 + - 1.2517865831617505 + - 0.8863221130277037 + - 1.6234781630967061 + - 1.278545805147039 + - 0.9076847063196323 + - 1.52771357563578 + - 1.8739592389968909 + - 1.2690074062741559 + - 2.5076237895735916 + - !!python/tuple + - 1.7141693634923114 + - 2.2694813395291162 + - 1.5487021925544662 + - 1.8016607358070496 + - 1.2811448378230401 + - 0.961176862850859 + - 1.7976733761179928 + - 1.2199174582234038 + - 0.834278871382349 + - 1.5090962631760854 + - 1.9456434004911376 + - 1.296392049516145 + - 2.300076945389833 + - !!python/tuple + - 1.7030636407374344 + - 2.0183801863236006 + - 1.669810491168758 + - 1.9808917845954284 + - 1.335883427912346 + - 1.062890248969842 + - 1.6739872722479787 + - 1.101142587701073 + - 0.8711143851931209 + - 1.5289711424387247 + - 1.7729849330818652 + - 1.2895610592405458 + - 2.3631758965935026 + - !!python/tuple + - 1.7138980583193546 + - 2.309494908886653 + - 1.7142796125673878 + - 1.882682167000092 + - 1.3694805289538858 + - 1.0691662594764717 + - 1.7231387191729937 + - 1.0412615030275472 + - 0.8037504284533954 + - 1.5728406420667533 + - 1.948510903124061 + - 1.3576064724136516 + - 2.316064063995893 + - !!python/tuple + - 1.5803449342871438 + - 2.2292665459055114 + - 1.7167246409772048 + - 1.9680854292413792 + - 1.3618864887787292 + - 1.0866681275308703 + - 1.8244771627139493 + - 1.0262229925230106 + - 0.8198718993302632 + - 1.497762364607051 + - 1.8715058872942074 + - 1.2825691722358212 + - 2.30034224324514 + - !!python/tuple + - 1.5573844416684364 + - 2.3634418178855308 + - 1.7906347669635463 + - 1.8335210873516337 + - 1.4405226717811046 + - 1.04806492588882 + - 1.8544211701606157 + - 1.0265279870649833 + - 0.8338745216595493 + - 1.6623292852834874 + - 1.9061181736965969 + - 1.441015580681503 + - 2.414996469188454 + - !!python/tuple + - 1.5849243687413126 + - 2.3068243284632897 + - 1.673189238143558 + - 1.9267378859025737 + - 1.3761445358595754 + - 1.0862538638236559 + - 1.7168081870944985 + - 0.9204054388944827 + - 0.8630324259714992 + - 1.501338935865502 + - 1.7770039619457159 + - 1.2722568520166555 + - 2.3978394748549743 + - !!python/tuple + - 1.5803996112970058 + - 2.292012921440601 + - 1.6993032305310853 + - 1.7965590347557043 + - 1.3798419821622376 + - 1.0248546092337025 + - 1.7909571029491325 + - 1.0888826403010583 + - 0.7837713078672619 + - 1.5191789150600887 + - 1.917396646309716 + - 1.281432275241124 + - 2.3729429000176188 + - !!python/tuple + - 1.6578089091444856 + - 2.2256719392417734 + - 1.6366427739889726 + - 1.9357196325006167 + - 1.346978637183513 + - 1.0885988038511436 + - 1.6810849752439723 + - 1.039785785593017 + - 0.8924294094539751 + - 1.4973917878509115 + - 1.9442815030195026 + - 1.2638751655896585 + - 2.4058490321428616 + - !!python/tuple + - 1.5059418342619866 + - 2.2438586924651727 + - 1.6545481980002452 + - 1.840014509928972 + - 1.344668527753286 + - 1.0205095017006267 + - 1.7055526645160424 + - 0.9581710099276899 + - 0.7751744064566155 + - 1.5192892506362856 + - 1.8672542269762507 + - 1.296872267662791 + - 2.3531082442081495 + - !!python/tuple + - 1.510114808200302 + - 2.413831201522707 + - 1.702088780056282 + - 1.8481679677113139 + - 1.3934384212716462 + - 1.0547222395003737 + - 1.814107322143765 + - 1.0157349966496123 + - 0.8032825439279772 + - 1.5384452887403468 + - 1.9381975827581397 + - 1.3200101158116637 + - 2.383080267170129 + - !!python/tuple + - 1.4023872474639207 + - 2.233799773027255 + - 1.599190185920678 + - 1.9067904611958215 + - 1.3777154841133932 + - 1.0462647263215386 + - 1.832554422153582 + - 1.0562589676510248 + - 0.8935933307912711 + - 1.4651045210031517 + - 1.727556294809152 + - 1.2304954489907152 + - 2.4815721348046993 + - !!python/tuple + - 1.628426337030675 + - 2.3953026283253265 + - 1.5671767933187686 + - 1.7218389440873483 + - 1.3965564095409368 + - 1.0019371283952032 + - 1.6317415180192787 + - 1.0932673675357936 + - 0.8783630270669993 + - 1.6077246504755025 + - 1.8483471897415382 + - 1.368553036289813 + - 2.5548380589737953 + - !!python/tuple + - 1.4919744318652923 + - 2.335952855892131 + - 1.658529540020954 + - 1.7924704048938982 + - 1.4067652646710496 + - 1.0522991457022663 + - 1.724292392549344 + - 0.9489780626104842 + - 0.83261606375669 + - 1.5407479363193164 + - 1.973982964597063 + - 1.2995033786016492 + - 2.459751619130587 + - !!python/tuple + - 1.4492167844003006 + - 2.3377498284734344 + - 1.6066625177936817 + - 1.8770203581273255 + - 1.3834416990741247 + - 1.0629802483531052 + - 1.695545257155278 + - 0.9587102434283112 + - 0.8839800694253033 + - 1.5270591878269313 + - 1.870152725700168 + - 1.2965179384105612 + - 2.5020748345177752 + - !!python/tuple + - 1.4484777528899073 + - 2.435188688992363 + - 1.647910306797347 + - 1.7994241080866296 + - 1.4371647367265235 + - 1.054148166783978 + - 1.8015777234520278 + - 1.080336348801504 + - 0.8902836344563221 + - 1.536832201241133 + - 1.89942076640766 + - 1.2881820866161022 + - 2.5655573861799557 + - !!python/tuple + - 1.4592687056475995 + - 2.210652355341891 + - 1.5021949822211111 + - 1.7062106745350196 + - 1.3817026244088455 + - 0.9759635894552599 + - 1.6279238885551361 + - 1.0530211173736483 + - 0.925471945229298 + - 1.5283511048316591 + - 1.7345261593367236 + - 1.2606646130187893 + - 2.649225741661809 + - !!python/tuple + - 1.4212232278554944 + - 2.422983381140753 + - 1.4385496583079251 + - 1.6191859670264614 + - 1.3608507726678265 + - 0.9519576951813724 + - 1.7468373618405257 + - 1.09977112139474 + - 0.89340698690331 + - 1.5262215952397873 + - 2.064037715739466 + - 1.295731044551524 + - 2.577858007797998 + - !!python/tuple + - 1.6030314595914281 + - 2.315623692472996 + - 1.5189765758472737 + - 1.7709193725022003 + - 1.4094856449879962 + - 1.0693757836222193 + - 1.6131535098301208 + - 1.0970961210128456 + - 0.9344796509930334 + - 1.5612043655017729 + - 1.990669532331593 + - 1.321870723547124 + - 2.6066941994007666 + - !!python/tuple + - 1.4798387686399554 + - 2.40012511122194 + - 1.4387986158851338 + - 1.634231225829113 + - 1.3799722419636296 + - 0.9755661547736878 + - 1.6059965544124812 + - 1.0382551280166048 + - 0.9474658434911636 + - 1.5343174509878628 + - 1.9088208977477898 + - 1.2797924375642165 + - 2.686279389933688 + - !!python/tuple + - 1.3775693659679669 + - 2.3712301697223275 + - 1.5016054979628786 + - 1.733309689514712 + - 1.4275712564123868 + - 1.0467006053126304 + - 1.5831172451660334 + - 1.013665341215257 + - 0.9180979080286626 + - 1.5160945165997037 + - 1.9838610188181005 + - 1.2447826075202022 + - 2.701007467866496 + - !!python/tuple + - 1.4044695730494867 + - 2.42161033131225 + - 1.4470390637746866 + - 1.588819138830151 + - 1.4110405945116526 + - 0.9698769194984311 + - 1.6373204206488445 + - 1.095622073962054 + - 0.901175423294852 + - 1.563976412337416 + - 2.0211917990534145 + - 1.3092368373537187 + - 2.6979000575412946 + - !!python/tuple + - 1.4352425809027065 + - 2.3929874532478017 + - 1.471928081422762 + - 1.6629365499301358 + - 1.4023466219294352 + - 1.0258477217230806 + - 1.597590331563162 + - 1.0119404351006351 + - 0.9019209949012765 + - 1.5016282056609411 + - 2.0436932873740252 + - 1.245617432194356 + - 2.658250986925812 + - !!python/tuple + - 1.4174055439798658 + - 2.4360018956349467 + - 1.52896334863456 + - 1.644173606603939 + - 1.4495587822413674 + - 1.0327503018433797 + - 1.6374741601850042 + - 1.0092695726181948 + - 0.8679259183598207 + - 1.5825095074055247 + - 2.1002574803858445 + - 1.3322678857639971 + - 2.644412426856589 + - !!python/tuple + - 1.4920406157014328 + - 2.4521028362792876 + - 1.4434929863866004 + - 1.5902059253226708 + - 1.4103121322789578 + - 0.9969601963204446 + - 1.6448112024556778 + - 1.0611220648186577 + - 0.9014097759414117 + - 1.5550532265217396 + - 2.0409612073132224 + - 1.3165004838684868 + - 2.6496424538697325 + - !!python/tuple + - 1.4360878686625358 + - 2.4069117138705645 + - 1.4499094885578132 + - 1.66473096298053 + - 1.4204784116067872 + - 1.0361295727825928 + - 1.5818698945402594 + - 1.0391896932045186 + - 0.9212843001271256 + - 1.519360346447089 + - 2.0575970526565284 + - 1.2592574825119567 + - 2.6978457829988303 + - !!python/tuple + - 1.461428962685095 + - 2.470054536488317 + - 1.4479100207955415 + - 1.6068695876783834 + - 1.4380297016655792 + - 1.0231385835234659 + - 1.579135322475932 + - 1.0624709108108528 + - 0.9011091968362901 + - 1.5579370134793091 + - 2.0807182868784935 + - 1.3032945470676394 + - 2.70799400417618 + - !!python/tuple + - 1.4112048158567134 + - 2.4780412015047943 + - 1.4652040108515834 + - 1.5767781716027467 + - 1.452128879461525 + - 1.0155344835734113 + - 1.6172973219948763 + - 1.0283005098695184 + - 0.9213022804533206 + - 1.5801683593769873 + - 2.1171504362717517 + - 1.3241134899620488 + - 2.7378283634730667 + - !!python/tuple + - 1.417367857391346 + - 2.487140912617993 + - 1.4605251678384925 + - 1.6038447543587733 + - 1.454962008403867 + - 1.0145837791803753 + - 1.6356049586407906 + - 1.0518711327271268 + - 0.9110434444543707 + - 1.5893494094833247 + - 2.053216910141046 + - 1.3379098414783597 + - 2.7148724207344754 + - !!python/tuple + - 1.3467743757356905 + - 2.359293010695741 + - 1.4713800254240577 + - 1.6013459193904531 + - 1.470026884440334 + - 1.0343007216179674 + - 1.5932706641693548 + - 1.039855015631781 + - 0.8908393643107405 + - 1.538986453356976 + - 2.067142066654752 + - 1.2635360199872037 + - 2.7523270757937905 + - !!python/tuple + - 1.404654513647972 + - 2.3876984922149482 + - 1.469346775909312 + - 1.6455960730831038 + - 1.4627522532211525 + - 1.0424377475362148 + - 1.6078166967198801 + - 1.0682870570154313 + - 0.8947260467200437 + - 1.557273494393924 + - 2.0392447752624863 + - 1.2957661893130363 + - 2.7125861874110195 + - !!python/tuple + - 1.3501196190957407 + - 2.4220123890588656 + - 1.483034985300829 + - 1.6162049503317126 + - 1.4898632104943883 + - 1.050628014827224 + - 1.61262173204477 + - 1.0395815657295424 + - 0.8994353587820428 + - 1.5620788804685481 + - 2.0864658672140575 + - 1.2917392118707802 + - 2.7586223442325233 + - !!python/tuple + - 1.3750916242052171 + - 2.3474586036486285 + - 1.50746608184906 + - 1.6351262780000835 + - 1.4852622326438638 + - 1.0640671133137092 + - 1.586346142190043 + - 1.03606739182523 + - 0.8920416132887039 + - 1.5518208564336777 + - 2.101727851718124 + - 1.276756470336776 + - 2.7448640397147903 + - !!python/tuple + - 1.438559255407574 + - 2.4036725999693127 + - 1.4945087484634758 + - 1.6001677000481542 + - 1.457408701464339 + - 1.0250169798628839 + - 1.6551858434580575 + - 1.0504742456967606 + - 0.8813688175766667 + - 1.5726330517879763 + - 2.0487511317861418 + - 1.321827636703673 + - 2.6728859372581923 + - !!python/tuple + - 1.3680289028804977 + - 2.412318472587052 + - 1.4683897296354678 + - 1.560225069238808 + - 1.4803763104896879 + - 1.0207730881018096 + - 1.6115253417121918 + - 1.0292615917056849 + - 0.8866139512191433 + - 1.5898534664961315 + - 2.1075620530790515 + - 1.3256378996823628 + - 2.741477362133784 + - !!python/tuple + - 1.3680289028804977 + - 2.412318472587052 + - 1.4683897296354678 + - 1.560225069238808 + - 1.4803763104896879 + - 1.0207730881018096 + - 1.6115253417121918 + - 1.0292615917056849 + - 0.8866139512191433 + - 1.5898534664961315 + - 2.1075620530790515 + - 1.3256378996823628 + - 2.741477362133784 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 2.8040424696109145 + - 2.8857061154898354 + - 1.6384724995463822 + - 1.72627287288458 + - 1.7565761736841932 + - 2.425717000744158 + - 1.541542922293774 + - 1.2307640237425073 + - 1.3486267028118122 + - 3.1602424168180216 + - 0.9766527849630098 + - 1.0921023330576585 + - 1.2801233286725786 + - !!python/tuple + - 2.4653367209264143 + - 3.0144854120026197 + - 1.7445221907258912 + - 1.6111124845854543 + - 1.9253653954964922 + - 2.239566802507671 + - 1.4059894532207815 + - 1.3586395661379478 + - 1.1697589249637275 + - 2.533517452765364 + - 1.451494467029046 + - 1.412782756009943 + - 1.1078020623430345 + - !!python/tuple + - 2.31256594332725 + - 2.608252384543769 + - 1.4813779844242096 + - 1.143087233084855 + - 1.773058132614328 + - 2.149203177696974 + - 1.2439055489497783 + - 1.761027515424407 + - 1.119947417511843 + - 2.5575364752251817 + - 0.9962844602237879 + - 1.522748791892228 + - 1.0431100574388164 + - !!python/tuple + - 1.7024060583301042 + - 2.628070343996269 + - 1.4195248755470429 + - 1.106554409035183 + - 1.4220146175975599 + - 2.5834059312453035 + - 1.752610811809673 + - 1.7504491132411142 + - 1.1493925796218545 + - 2.2066957253391406 + - 0.9396813444981413 + - 1.849020500242642 + - 0.8259367905300079 + - !!python/tuple + - 1.960929501229773 + - 3.039319473205229 + - 1.4131186480505908 + - 1.0972181338494458 + - 1.7973344543385652 + - 2.1611952752273775 + - 1.399141329705183 + - 1.7813107912091948 + - 1.0258626880794177 + - 2.2897612560517033 + - 1.1456205576305358 + - 1.5455419632577048 + - 0.9083778488403949 + - !!python/tuple + - 1.8949923162574889 + - 2.8739301899793896 + - 1.7579011101071627 + - 1.055468105631081 + - 1.7401926584071368 + - 2.3962613966264725 + - 1.5336307142711363 + - 1.9218942567980217 + - 1.3433027284816461 + - 2.1180452878103453 + - 1.306803787035834 + - 1.6525813249470993 + - 1.0940184022867507 + - !!python/tuple + - 1.782586396905792 + - 2.6069271456639918 + - 1.5077943741264201 + - 0.8855037373449817 + - 2.179242513804497 + - 2.252350745331508 + - 1.4865816360099537 + - 1.6071159178259136 + - 1.0566673301794702 + - 2.0362892075692454 + - 1.324014702989398 + - 1.176538414392136 + - 1.0118162893859695 + - !!python/tuple + - 1.4838217732895305 + - 2.507025620919519 + - 1.556591292593461 + - 0.9655848901011117 + - 1.8697513362798865 + - 2.4800823052050314 + - 1.823002981530478 + - 1.8583211351200957 + - 1.2122071071431588 + - 1.9649308858561056 + - 1.3152141864021794 + - 1.0194152472404094 + - 1.0406998475609979 + - !!python/tuple + - 1.4657479101456725 + - 2.4247894333626907 + - 1.5566702043890932 + - 0.8333205662573899 + - 1.9677321968218466 + - 2.3625868681938855 + - 1.9300804279252466 + - 1.8517137797998557 + - 1.135881032414699 + - 1.8520692601681503 + - 1.0602804844003277 + - 1.4077299519064956 + - 1.0152109725616054 + - !!python/tuple + - 1.6669398540725915 + - 1.998466859856817 + - 1.8321500926193743 + - 1.0419125797178204 + - 1.9911713016986423 + - 2.294325118940172 + - 1.7130320495837243 + - 1.550126627888756 + - 1.3096553176896721 + - 1.894270046990902 + - 1.3006866114928133 + - 1.6955727848301783 + - 1.1696776491166525 + - !!python/tuple + - 1.5286684642194146 + - 2.17124266368108 + - 1.6721864771216834 + - 0.7627530845720074 + - 2.0185747023257 + - 2.2505721822764624 + - 1.6714125616835291 + - 1.499595930214911 + - 1.1438431847108261 + - 1.8491669218943394 + - 1.1850273568168728 + - 1.2003760118034634 + - 1.0654394284645945 + - !!python/tuple + - 1.6631906438688326 + - 2.2117944556058142 + - 1.7158792158653378 + - 0.9154418340378551 + - 2.085739388379189 + - 2.3414186112991637 + - 1.7777661550363344 + - 1.6138772481045802 + - 1.2796674409844935 + - 1.9796069470598865 + - 1.124152674279176 + - 1.1636287517835777 + - 1.196192244074583 + - !!python/tuple + - 1.3232996395211725 + - 2.26107531376702 + - 1.7052257824212729 + - 0.9665723007340619 + - 2.0292180520803873 + - 2.3538898995232462 + - 1.8268229884597322 + - 1.3199816307706973 + - 1.2028281340840212 + - 1.8331049646462119 + - 1.2316662283053013 + - 1.2607513980000975 + - 1.100823645666235 + - !!python/tuple + - 1.41126699969708 + - 2.017562190288565 + - 1.8116593889602954 + - 0.799860231357649 + - 2.174057344105778 + - 2.1197835693449205 + - 1.7230222101256356 + - 1.6415240831622002 + - 1.24885738389603 + - 1.7178379531817125 + - 1.0786178974213285 + - 1.2527728025722769 + - 1.2106559695999213 + - !!python/tuple + - 1.3784727717813916 + - 1.93033210674422 + - 1.8335773591933289 + - 0.9132790260851845 + - 2.0300461666652927 + - 2.340307813736489 + - 1.8843102623509522 + - 1.4589499173704636 + - 1.2791476516352414 + - 1.7150958491310744 + - 1.0911903160505716 + - 1.3523243553199138 + - 1.1724106507541985 + - !!python/tuple + - 1.426468362233006 + - 1.840423628709714 + - 1.888472133152571 + - 0.932799107551666 + - 2.0366124201505533 + - 2.1791244488739716 + - 1.8039142434226068 + - 1.4295415801215212 + - 1.3711574367502808 + - 1.7166685620981053 + - 1.157075136507404 + - 1.427394495373274 + - 1.261764369991543 + - !!python/tuple + - 1.268249686297799 + - 2.09132062274203 + - 1.8693426244999523 + - 0.8174473502440092 + - 2.117557472804627 + - 2.2860553579485234 + - 1.8581557700415958 + - 1.4776498640596785 + - 1.313319025378488 + - 1.6117886413184386 + - 1.1630741207892137 + - 1.2254585348603073 + - 1.2212424604320629 + - !!python/tuple + - 1.308535400889089 + - 1.9887882313863718 + - 1.8563062809172401 + - 0.908734670868852 + - 2.1526954297660037 + - 2.0977164501390844 + - 1.6954050644039191 + - 1.3216921873739365 + - 1.2558058844272004 + - 1.64464683025929 + - 1.0423074150967793 + - 1.3907554670720048 + - 1.2043490970623212 + - !!python/tuple + - 1.218697156280772 + - 1.9140515794926243 + - 1.7543266550019672 + - 0.9201723502377327 + - 2.1437087085708475 + - 2.2739782740476433 + - 1.8976777082724716 + - 1.4416712902846092 + - 1.2553949211530095 + - 1.7588636601196863 + - 1.1832577708825878 + - 1.2244907252943407 + - 1.212841587801011 + - !!python/tuple + - 1.133378845312183 + - 2.222129597511453 + - 1.922380571409688 + - 0.972550428727204 + - 2.1722262092569538 + - 2.098358147329532 + - 1.786279703036684 + - 1.3976073401271387 + - 1.3752327182106838 + - 1.5710446346141056 + - 1.291307657677853 + - 1.3940134593258429 + - 1.2864636085091026 + - !!python/tuple + - 1.2633559600559467 + - 2.0381438223677506 + - 1.8400405654152716 + - 0.9871034941235873 + - 2.0914583689939343 + - 2.2182039109635463 + - 1.8909986953295532 + - 1.4109407943426382 + - 1.3335465800173916 + - 1.6722790594804788 + - 1.1032267998458973 + - 1.2534626694947173 + - 1.237920067453012 + - !!python/tuple + - 1.1091587601890271 + - 2.0723347796348817 + - 1.8444504377255053 + - 0.9573386776662145 + - 2.1200372286770772 + - 2.2244597614146544 + - 1.981091825121816 + - 1.5263455183061794 + - 1.3522650324576668 + - 1.6455195102811198 + - 1.2055071883256971 + - 1.3002061743339082 + - 1.2645250451126582 + - !!python/tuple + - 1.1354049906841528 + - 2.0148489988810807 + - 1.8557161067868866 + - 0.9789125294328844 + - 2.2336408160176955 + - 2.0443039246428736 + - 1.7733224729065875 + - 1.327654614621813 + - 1.310066181960567 + - 1.7066495722497577 + - 1.14509818709202 + - 1.2842834664709004 + - 1.2998215619968865 + - !!python/tuple + - 1.0719346480012053 + - 2.052518053233795 + - 1.8190462461576247 + - 0.9069763230530763 + - 2.24856896005036 + - 2.0160790978117067 + - 1.811946353349731 + - 1.4382661912900587 + - 1.316965142723168 + - 1.5920978126611978 + - 1.1501586916328048 + - 1.2449273499788904 + - 1.283263583317542 + - !!python/tuple + - 1.0817751016700612 + - 2.0432355886623137 + - 1.8682225624040658 + - 1.0223623380137439 + - 2.1483978107594197 + - 2.026658942486458 + - 1.8364942935743276 + - 1.351944714305855 + - 1.3674671719675744 + - 1.6175954099818741 + - 1.1453142308159432 + - 1.3097488058521962 + - 1.3031256308260009 + - !!python/tuple + - 1.2029702660314316 + - 2.091155698003359 + - 1.859525465087681 + - 1.0187755335382989 + - 2.19915707595675 + - 1.9783468582503945 + - 1.7651781818427468 + - 1.4604369377740651 + - 1.375431112510702 + - 1.7037246601153928 + - 1.165790622058291 + - 1.2895977680063677 + - 1.336823129642884 + - !!python/tuple + - 1.153849621973947 + - 2.0887658173848607 + - 1.8850040777313184 + - 0.92229309169209 + - 2.1986847398422977 + - 1.9968633480499698 + - 1.7790392327963702 + - 1.4425543146857862 + - 1.3701383607270934 + - 1.589844400561815 + - 1.1685247120381956 + - 1.247814832368124 + - 1.3161375984413615 + - !!python/tuple + - 1.1076770051254663 + - 2.067926502311666 + - 1.855912278156896 + - 0.968996216093662 + - 2.2125898933067036 + - 1.9102387842559967 + - 1.7581853489207582 + - 1.4604621060812915 + - 1.3863078857298432 + - 1.6550783239718578 + - 1.123341782181979 + - 1.2398972455094008 + - 1.3496814281998493 + - !!python/tuple + - 1.1398714808857868 + - 2.1130831710350706 + - 1.8563695990600673 + - 0.9899651484664566 + - 2.1948002181174298 + - 1.9025001968813255 + - 1.769560403782982 + - 1.5012913725576666 + - 1.414622185564257 + - 1.6597711305810485 + - 1.1928416568218538 + - 1.2625535711438833 + - 1.3661020791167426 + - !!python/tuple + - 1.1398714808857868 + - 2.1130831710350706 + - 1.8563695990600673 + - 0.9899651484664566 + - 2.1948002181174298 + - 1.9025001968813255 + - 1.769560403782982 + - 1.5012913725576666 + - 1.414622185564257 + - 1.6597711305810485 + - 1.1928416568218538 + - 1.2625535711438833 + - 1.3661020791167426 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 0.9201390961958607 + - 1.577296570827184 + - 2.0669015791267844 + - 1.8806696002871344 + - 1.6794019421361304 + - 2.4533344931873615 + - 1.526904626925668 + - 1.2958844045215463 + - 1.4236110169463374 + - 1.4469195034826354 + - 1.5686256509759837 + - 2.5451982334715884 + - 1.37789082403896 + - !!python/tuple + - 0.9864927204878238 + - 1.6442826671534585 + - 2.0760933101750383 + - 1.831981994319842 + - 1.9968452026573287 + - 2.3718764671137778 + - 1.5407982670274578 + - 1.3670467558491342 + - 1.6083146598569416 + - 1.4898408151118456 + - 1.5193139419667603 + - 2.3663751674115523 + - 1.9935886699173953 + - !!python/tuple + - 1.0129380305490736 + - 1.852313499117759 + - 1.8822978881288268 + - 1.6341897852666416 + - 2.5021223618342137 + - 2.1450145519243202 + - 1.5992411971292289 + - 1.0142605513785263 + - 1.7504008777999407 + - 1.5683428100876156 + - 1.5974989048249022 + - 2.6878572104442737 + - 1.5798403158532937 + - !!python/tuple + - 0.9065162066676293 + - 1.5736310393999127 + - 1.767940832795361 + - 1.6640657400320729 + - 2.4973406059588394 + - 2.4344553162587896 + - 1.6200710927462443 + - 1.201056010526571 + - 1.384378818517682 + - 1.3519053967998897 + - 1.4670949324890663 + - 2.3818032717520876 + - 2.2729437266388937 + - !!python/tuple + - 1.039055940645262 + - 1.8171171737593257 + - 2.0564070268315646 + - 1.7201401257679008 + - 2.58643749138146 + - 2.285132768476286 + - 1.667780118924504 + - 1.4572455543040364 + - 1.4791519457821578 + - 1.443807155428546 + - 1.5019879515532504 + - 2.6026109041938463 + - 2.0873947055050923 + - !!python/tuple + - 0.9121343155041208 + - 1.6942497077506498 + - 1.747763253691443 + - 1.6556255017632555 + - 2.7047476403216657 + - 2.319428423947368 + - 1.6302232487021362 + - 1.3732608567330473 + - 1.8630174879516541 + - 1.3793682387291466 + - 1.479904373661923 + - 2.421547552082405 + - 2.05010892169237 + - !!python/tuple + - 0.9986157077259993 + - 1.9525508761417203 + - 2.050768426350949 + - 1.5792507676810998 + - 3.4728513782788957 + - 1.9119929770502084 + - 1.8589965395247603 + - 1.3296862797940567 + - 1.535804558949813 + - 1.4169304645579164 + - 1.6767313196934506 + - 2.621454775183159 + - 1.9892621792394576 + - !!python/tuple + - 0.9419978485309666 + - 1.955640808961527 + - 1.6600991990789793 + - 1.6899313212615255 + - 3.3290956608968005 + - 1.748157406467712 + - 1.5164455682691702 + - 1.2761186188876055 + - 1.4474394199047804 + - 1.4733065236139926 + - 1.3257448880501048 + - 2.560496406209158 + - 2.0239387419617567 + - !!python/tuple + - 1.1616567115679244 + - 1.8944593251299637 + - 2.206160872268699 + - 1.5689559788990457 + - 2.9642412313695443 + - 1.79888641779652 + - 1.7216236476807338 + - 1.1758546299366173 + - 1.5835230022056646 + - 1.5313642943036865 + - 1.5008531201465931 + - 2.3857152617606507 + - 1.6285877240315325 + - !!python/tuple + - 0.932165923252621 + - 1.6302974348191726 + - 1.6742692956412077 + - 1.7131826374041925 + - 2.8429885852380705 + - 1.696303878188171 + - 1.5720036889423081 + - 1.1923491640045392 + - 1.4745303934488592 + - 1.4159048990976175 + - 1.2075932204378876 + - 2.329649621209571 + - 1.4498310441317512 + - !!python/tuple + - 0.9004140563693517 + - 1.5894936525972332 + - 1.8543234532240578 + - 1.5233543827262759 + - 2.876895981203811 + - 1.5034013225122043 + - 1.5931903819733566 + - 1.147802857261254 + - 1.2173326728164107 + - 1.2876908596063883 + - 1.2023082767298305 + - 2.080695520419407 + - 1.5843553589294062 + - !!python/tuple + - 0.9779038279316743 + - 1.6298900343081075 + - 1.8177061284124876 + - 1.5548391946738618 + - 3.167774921277533 + - 1.4361049259538579 + - 1.7410208882772285 + - 1.1966689248497577 + - 1.5306995278292819 + - 1.4043626763914827 + - 1.2518916936905664 + - 2.0447460395171633 + - 1.6676037467933331 + - !!python/tuple + - 1.107453323434024 + - 1.770702467491359 + - 1.8272588805320429 + - 1.591972860465739 + - 2.8748963578895137 + - 1.3057434664258862 + - 1.481874103104753 + - 1.1930680430888996 + - 1.3514618683663555 + - 1.4520612263849424 + - 1.0979967006041558 + - 1.9561832381173887 + - 1.409822427729379 + - !!python/tuple + - 1.0316362170470406 + - 1.6501648955092005 + - 2.0331449827292665 + - 1.3662913902254052 + - 2.3868479367664155 + - 1.5697663292339197 + - 1.6482774266170093 + - 1.1100614198223768 + - 1.1974248780370138 + - 1.3234622401974008 + - 1.3845407576250102 + - 1.722106703477324 + - 1.9653448786173402 + - !!python/tuple + - 0.9519786497121601 + - 1.5243161924271034 + - 1.7366909508701354 + - 1.5881507816551834 + - 2.5305370511494383 + - 1.4522673719491777 + - 1.579667072282918 + - 1.2038693534365392 + - 1.2015673236425737 + - 1.2951848505056438 + - 1.1586087521189254 + - 1.811834495518994 + - 1.65404196967883 + - !!python/tuple + - 0.9545446289502195 + - 1.5528518022242328 + - 1.9004644791751293 + - 1.4754834888630404 + - 2.5616627713044835 + - 1.6402462946014067 + - 1.5373234272813074 + - 1.2517071350977798 + - 1.3857841181931887 + - 1.3499382118713585 + - 1.2483808246036658 + - 1.7809805346426453 + - 1.9499567365900696 + - !!python/tuple + - 1.1550540440502692 + - 1.7714490873995756 + - 1.9138557997310488 + - 1.5473800442930536 + - 2.7045207279470596 + - 1.4802710888200004 + - 1.6473821551815158 + - 1.2426260581601931 + - 1.4354957024536457 + - 1.4419736372222314 + - 1.3174773889318887 + - 1.8412174433482482 + - 1.8332582419309524 + - !!python/tuple + - 1.0956078760097756 + - 1.5709330974878752 + - 1.9435316586625553 + - 1.5831673367938923 + - 2.1435514619432965 + - 1.5167035089663934 + - 1.5484248967350454 + - 1.2604010355916964 + - 1.3466542425417907 + - 1.4672297070557692 + - 1.2791755975213368 + - 1.5683084726658225 + - 1.7856513529518536 + - !!python/tuple + - 1.0110939942485428 + - 1.5755066681930558 + - 1.917648855498035 + - 1.4639445133298228 + - 2.39558837051315 + - 1.5399527103004091 + - 1.5224781622283148 + - 1.2221352837172281 + - 1.3077885448191173 + - 1.3459355581549302 + - 1.17721102847507 + - 1.6799772095523418 + - 1.8551142491193044 + - !!python/tuple + - 1.2085074453368512 + - 1.7782502076564555 + - 1.9291375881595818 + - 1.4591169001023943 + - 2.4433401266819397 + - 1.2929309517954115 + - 1.5301822996725938 + - 1.1794772482059246 + - 1.3250705557104303 + - 1.4514575180664884 + - 1.198961335828172 + - 1.5940738851779397 + - 1.6806652458509856 + - !!python/tuple + - 1.0833131348453495 + - 1.601722267209725 + - 1.938425487470129 + - 1.409067050043258 + - 2.3608266720079043 + - 1.4593489904043442 + - 1.5371515266859404 + - 1.172229329929075 + - 1.3575845178124788 + - 1.3762185142216983 + - 1.2168617251717269 + - 1.5590790191054955 + - 1.7945896715387235 + - !!python/tuple + - 1.1221276535912028 + - 1.7042340965195117 + - 1.9424968841194983 + - 1.4640109044734606 + - 2.367698394041706 + - 1.455124298673419 + - 1.470137648901158 + - 1.214059178968955 + - 1.2606616194982565 + - 1.3935106114895937 + - 1.207102654736529 + - 1.6367532798801863 + - 1.838849727984096 + - !!python/tuple + - 1.0400462249696256 + - 1.6410089555678153 + - 1.7971016703627867 + - 1.4580794612612886 + - 2.4242061852431824 + - 1.5350783293930064 + - 1.4894014489484246 + - 1.1992956729501452 + - 1.334208226792068 + - 1.3831319433077613 + - 1.208376958150327 + - 1.6667562062407082 + - 1.9383593591359323 + - !!python/tuple + - 1.085882270686231 + - 1.6878084513454263 + - 1.9269054389380456 + - 1.4888461607825314 + - 2.493997390965763 + - 1.551415858767949 + - 1.5520183516884627 + - 1.2950159141307886 + - 1.3552957264014074 + - 1.4071320208988132 + - 1.2620701872726547 + - 1.727925639067224 + - 1.8766436407671976 + - !!python/tuple + - 1.0463364816929532 + - 1.628638847012548 + - 1.8254847729688068 + - 1.5225020249795422 + - 2.343654717754471 + - 1.547063151036738 + - 1.5300978255608386 + - 1.2411490405044399 + - 1.3188957663514844 + - 1.3763697839743583 + - 1.2428856828932162 + - 1.7219309678286239 + - 1.7778705163503572 + - !!python/tuple + - 1.0431501248470005 + - 1.6046398319198811 + - 1.8949571163902057 + - 1.4272489371799029 + - 2.3004985126630526 + - 1.491113668653373 + - 1.471880160883495 + - 1.2155603779268218 + - 1.309111915840444 + - 1.3754546566142567 + - 1.1873650430607148 + - 1.5850394995596 + - 1.8188355703185408 + - !!python/tuple + - 1.157809790055782 + - 1.7730171527251821 + - 1.8927883578522715 + - 1.415025931454983 + - 2.459467971691149 + - 1.4297564795015223 + - 1.5201287607660134 + - 1.2062176185978122 + - 1.3866631268045748 + - 1.4392621510173562 + - 1.2920561345390715 + - 1.6319531553647622 + - 1.8215102667268093 + - !!python/tuple + - 1.0550259223771419 + - 1.6724331818102194 + - 1.8347276886465202 + - 1.4147115112788837 + - 2.454052935917505 + - 1.5293900266543057 + - 1.5592536001366764 + - 1.2337850710472882 + - 1.3964822374486388 + - 1.3912438701218326 + - 1.2744113177633234 + - 1.6697415676854046 + - 1.8799338247179558 + - !!python/tuple + - 1.1394119198306443 + - 1.7404928191069011 + - 1.9859115206007294 + - 1.4139709621860705 + - 2.4021369525120777 + - 1.4485608724364563 + - 1.5507362848876025 + - 1.2538546383118119 + - 1.3325162471789151 + - 1.4028705270442914 + - 1.2832961465976784 + - 1.6401979277009888 + - 1.7714356498095074 + - !!python/tuple + - 1.1514629488390478 + - 1.7433511410434013 + - 1.8798644492967282 + - 1.4619188485133083 + - 2.371674402598204 + - 1.4042138670747288 + - 1.5422359152062508 + - 1.2352043581204963 + - 1.3040401312649026 + - 1.4283341543040522 + - 1.2761068564075302 + - 1.6043124484041948 + - 1.7926617649715448 + - !!python/tuple + - 1.1913150751337014 + - 1.815431777645957 + - 1.8064586319105258 + - 1.4421531284129772 + - 2.255946335825974 + - 1.4681287021611826 + - 1.4894872604570322 + - 1.2472862678708516 + - 1.3176034512831776 + - 1.4360001354600462 + - 1.2867146341736528 + - 1.5981583574732838 + - 1.8389423608412199 + - !!python/tuple + - 1.149234611514171 + - 1.8703710807144782 + - 1.8115719629427083 + - 1.3584766106787842 + - 2.530280696838456 + - 1.4863802295761164 + - 1.5473090310507038 + - 1.2847176791102328 + - 1.3713893189941906 + - 1.4138132359899098 + - 1.3703613940126314 + - 1.6982382339926416 + - 1.9142127991164513 + - !!python/tuple + - 1.0865143953003196 + - 1.6750080681209947 + - 1.8190757325627374 + - 1.4660167560660926 + - 2.2446245041175343 + - 1.4698781677803978 + - 1.4658321431173487 + - 1.26558245337977 + - 1.3404524846415575 + - 1.4318169334593922 + - 1.232317441637687 + - 1.611481676407174 + - 1.6780635432257611 + - !!python/tuple + - 1.1787847247225245 + - 1.7812027301445337 + - 1.8586834209856975 + - 1.4367103019852956 + - 2.265354601314778 + - 1.4792536870467263 + - 1.5473811264846478 + - 1.2918056790340242 + - 1.3728747222860889 + - 1.4539885922783027 + - 1.3440498547880027 + - 1.6001581005138632 + - 1.7549076343279775 + - !!python/tuple + - 1.1787811699800617 + - 1.837442495857898 + - 1.7298048472760974 + - 1.4471267060710533 + - 2.3404462005013746 + - 1.4381948258662838 + - 1.495493439810624 + - 1.2675987479320892 + - 1.3399351709299125 + - 1.4610592638954114 + - 1.3033040516696794 + - 1.6332004501139135 + - 1.7985645027555512 + - !!python/tuple + - 1.1552213371575502 + - 1.8794508988220266 + - 1.756928398874485 + - 1.351609724242762 + - 2.4033788169455663 + - 1.5324411967897131 + - 1.4861215547238538 + - 1.3072690973695773 + - 1.4291465996622732 + - 1.4362983638065836 + - 1.3254211632946564 + - 1.7108630545462167 + - 1.7850175771638588 + - !!python/tuple + - 1.1230159144507588 + - 1.8182741038665637 + - 1.6981988488107247 + - 1.3576491767230778 + - 2.2091804188193036 + - 1.4713996090213277 + - 1.4762193045153933 + - 1.2762603457278334 + - 1.3428110555975763 + - 1.418832820963473 + - 1.3283481685364678 + - 1.6171930104539478 + - 1.6890789673986912 + - !!python/tuple + - 1.0879516879850342 + - 1.7804784668513194 + - 1.7174087110266503 + - 1.266971291377038 + - 2.2830401106338836 + - 1.470323049084031 + - 1.438491294311825 + - 1.3009859546586613 + - 1.4222458557349202 + - 1.4231367577255276 + - 1.2872960643712266 + - 1.568100083882968 + - 1.66871975501304 + - !!python/tuple + - 1.1361304643412415 + - 1.836640941552416 + - 1.7554102355602004 + - 1.3384480036178288 + - 2.3510903486941324 + - 1.4188942755604366 + - 1.4867295109345817 + - 1.3005426040723163 + - 1.331932089466087 + - 1.4149351376828934 + - 1.3113401012010928 + - 1.6271844793069574 + - 1.665080011331518 + - !!python/tuple + - 1.1361304643412415 + - 1.836640941552416 + - 1.7554102355602004 + - 1.3384480036178288 + - 2.3510903486941324 + - 1.4188942755604366 + - 1.4867295109345817 + - 1.3005426040723163 + - 1.331932089466087 + - 1.4149351376828934 + - 1.3113401012010928 + - 1.6271844793069574 + - 1.665080011331518 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.7756927300125973 + - 0.928191340644354 + - 1.2030931787091061 + - 1.1523779762690027 + - 1.224051222900321 + - 1.107906284011693 + - 1.1445632839039896 + - 1.9243398590519225 + - 1.263164488079668 + - 2.0916563023178227 + - 1.4465465209406498 + - 1.5319399816789907 + - 1.6949121807713357 + - !!python/tuple + - 1.6471715733276993 + - 1.1209737100061186 + - 1.9134422455782727 + - 1.2846042502413695 + - 1.2275751187362631 + - 1.1712186162338258 + - 1.318767494974479 + - 2.101355826954978 + - 1.8046961393922867 + - 2.329476759410972 + - 1.804960529495741 + - 1.8687848805597753 + - 1.4380563120115364 + - !!python/tuple + - 1.66785444375712 + - 1.1062598316168288 + - 1.7970720691374886 + - 1.3396416797431403 + - 1.3153415612751354 + - 1.1771396485432322 + - 1.3964800570142157 + - 2.0785370135018773 + - 1.961143701665532 + - 2.026291846016896 + - 1.6041482152033621 + - 1.9114830837094505 + - 1.6970683650623053 + - !!python/tuple + - 1.6178824887676821 + - 1.201230780700691 + - 2.2976952022033768 + - 1.2622015275437153 + - 1.2533166261089885 + - 1.2452926152295634 + - 1.417003560056415 + - 2.0773406166913144 + - 1.9014413426771002 + - 2.159100477476989 + - 1.6735072249885379 + - 1.7661171877424244 + - 1.509013727954207 + - !!python/tuple + - 1.828848501293613 + - 1.217184325580062 + - 1.9965409486399406 + - 1.2786179488876046 + - 1.4751692187941123 + - 1.3533417177557943 + - 1.4264885555420304 + - 2.1627627805996372 + - 1.4755443498863507 + - 2.2523451100798724 + - 1.6920228809373776 + - 1.8321206424322674 + - 1.5944572262312882 + - !!python/tuple + - 1.7750717883956255 + - 1.2174821798284556 + - 1.9510645532963626 + - 1.340744818175062 + - 1.4368239213145306 + - 1.3062828267084552 + - 1.4929571422146752 + - 2.087358072904978 + - 1.925751029078473 + - 2.196042259949612 + - 1.418376087735235 + - 1.752490373571875 + - 1.666788579809019 + - !!python/tuple + - 1.7374011067883415 + - 1.0898788398467811 + - 1.8789009412891675 + - 1.1755716981595932 + - 1.3716987063543078 + - 1.1873789784951467 + - 1.2359414543244727 + - 2.0278515447263405 + - 1.536904694087528 + - 2.125524234959746 + - 1.5398794509789013 + - 1.7053669878967055 + - 1.603454378396366 + - !!python/tuple + - 1.643173230686604 + - 1.082634652660989 + - 1.8970219829108408 + - 1.1551659458595538 + - 1.3572670181746163 + - 1.1251904173869531 + - 1.3319040122760735 + - 1.9569667201451018 + - 1.8989473676809427 + - 2.099819503490241 + - 1.598308495657308 + - 1.7875374323782003 + - 1.4678215049377437 + - !!python/tuple + - 1.4423077818616308 + - 1.372562381538973 + - 2.319782867884439 + - 1.4577332564437397 + - 1.5399175133171719 + - 1.3638462968695866 + - 1.5998891944306808 + - 2.4644971815466636 + - 1.8180777255095586 + - 2.260768862630624 + - 1.5129406401880678 + - 1.7997491703724695 + - 1.558908031904009 + - !!python/tuple + - 1.7264077795721895 + - 1.2682331798343158 + - 2.1103956383245177 + - 1.2719952791995477 + - 1.5621873458451019 + - 1.3227036015040947 + - 1.4401422215847934 + - 2.101774790321123 + - 1.6147536246358503 + - 2.0517420370514614 + - 1.4598062488033143 + - 1.6966682293986015 + - 1.8106207547226243 + - !!python/tuple + - 1.2727228589645854 + - 1.2132568632382406 + - 1.79780580830124 + - 1.1879850040521749 + - 1.2141338171350755 + - 1.123192347658343 + - 1.3963330174142672 + - 2.0806006933487735 + - 1.4721951028407125 + - 2.1866852191879422 + - 1.3136047784593574 + - 1.4720408777063207 + - 1.5984986665694099 + - !!python/tuple + - 1.422064468754678 + - 1.219492138189389 + - 1.9860144666630999 + - 1.1923316687054881 + - 1.3926496915392996 + - 1.1444926135648839 + - 1.3749594215386087 + - 2.0492347879542123 + - 1.711849177467737 + - 2.1467851203606205 + - 1.3723064098795936 + - 1.5096063598032206 + - 1.691576123895696 + - !!python/tuple + - 1.3709192373063557 + - 1.332850597856762 + - 2.024723663416009 + - 1.2719334558684838 + - 1.4662653660419598 + - 1.245015378767086 + - 1.5670911594341543 + - 2.18224239267155 + - 1.645537192723732 + - 2.2144555945360627 + - 1.487602499013415 + - 1.5900691415509645 + - 1.7190041408605299 + - !!python/tuple + - 1.399966129490727 + - 1.3105030119175423 + - 1.9969794586110665 + - 1.3237959500004923 + - 1.4648348728987948 + - 1.2296125968986877 + - 1.47739982577728 + - 2.230943193903913 + - 1.8547530941622854 + - 2.170662271628721 + - 1.402439372443444 + - 1.6393489118537663 + - 1.6385318251142618 + - !!python/tuple + - 1.3262314072118349 + - 1.2451202192267872 + - 2.0555367601311416 + - 1.2113305592932597 + - 1.4875895074267202 + - 1.1113745845575675 + - 1.4243900532512839 + - 2.149426161457786 + - 1.9518824996597812 + - 2.184112841994284 + - 1.5120331946222736 + - 1.7928594297061815 + - 1.5002403410411205 + - !!python/tuple + - 1.2573350363823748 + - 1.412533570271779 + - 2.216135218355288 + - 1.3034218111137448 + - 1.5458101657374317 + - 1.2984697375669505 + - 1.5690485307514341 + - 2.3960081047027826 + - 1.6175097999464874 + - 2.2360572893980253 + - 1.4332569856110104 + - 1.7584674651710543 + - 1.5604972317571786 + - !!python/tuple + - 1.120689107165366 + - 1.3150485795889986 + - 1.9380675749541778 + - 1.0567984006900195 + - 1.4475855195815281 + - 1.0721188125761558 + - 1.3698698147757562 + - 2.0628974597185223 + - 1.5313417001453915 + - 2.1582764016315057 + - 1.3001582818737334 + - 1.5391545020405173 + - 1.6615955514212193 + - !!python/tuple + - 1.1108300810979856 + - 1.3055580806135145 + - 2.0798574036966424 + - 1.17477898357751 + - 1.5698572459690396 + - 1.09201220507047 + - 1.276918493264223 + - 2.34195237065216 + - 1.6922131988502953 + - 2.1850922655003964 + - 1.3149454529888684 + - 1.7090383693923115 + - 1.4395516837182147 + - !!python/tuple + - 1.140368206160723 + - 1.2546288468688072 + - 2.0245270769628494 + - 1.164982623763681 + - 1.4590701471759382 + - 1.0863434452023182 + - 1.4062254568605268 + - 2.1969398190842 + - 1.7422889279268734 + - 2.1116014264966694 + - 1.4275506623123801 + - 1.6427698119618905 + - 1.467769964184201 + - !!python/tuple + - 1.0869058920209431 + - 1.3114402452167067 + - 2.059041611746735 + - 1.1052737144415075 + - 1.5878616884611962 + - 1.085346719995386 + - 1.3924753425006018 + - 2.239770969879626 + - 1.627731734958256 + - 2.1684717310662216 + - 1.387774243301209 + - 1.7705557311377826 + - 1.5086938596971615 + - !!python/tuple + - 1.1683436596416705 + - 1.3103884745745544 + - 2.031486533070745 + - 1.0167670913121352 + - 1.6695172028982093 + - 1.081447075864517 + - 1.2043666198447762 + - 2.2203615157380936 + - 1.4957751786933073 + - 2.22961358248048 + - 1.3881202614907413 + - 1.7755643178639169 + - 1.3364898015207916 + - !!python/tuple + - 1.0063014119414624 + - 1.3918929394481616 + - 2.0239078490499183 + - 1.1666351161602315 + - 1.6996310417773866 + - 1.1076474955707964 + - 1.4262211115740369 + - 2.3407515877915586 + - 1.6108196509851234 + - 2.2002401877961244 + - 1.3401835032258742 + - 1.6583963759614362 + - 1.5223812557951797 + - !!python/tuple + - 1.1630846462120377 + - 1.3887863286967626 + - 1.9782598915114784 + - 1.0907810514854568 + - 1.7443880047761124 + - 1.1779855110899384 + - 1.5721217008361472 + - 2.203704128073963 + - 1.5537267194276356 + - 2.1585453985037883 + - 1.5562036783581459 + - 1.7568940253028178 + - 1.5861330837188778 + - !!python/tuple + - 1.136038047644321 + - 1.4989194430782988 + - 2.154469919924926 + - 1.183910122341038 + - 1.9825972754988828 + - 1.2203521781626885 + - 1.4734243183405364 + - 2.483802336014723 + - 1.916154940292725 + - 2.223240309770265 + - 1.4318953980763218 + - 1.7913416941547298 + - 1.3782628583769017 + - !!python/tuple + - 1.0885840941757592 + - 1.4280056573190743 + - 1.880224225215498 + - 1.0853734949199616 + - 1.9242867032117048 + - 1.1091574115027298 + - 1.4303181206299245 + - 2.2832040179998376 + - 1.690567985642907 + - 2.227752306602455 + - 1.4428006329722471 + - 1.8042082022485215 + - 1.482582953912491 + - !!python/tuple + - 1.2212503435763777 + - 1.4016675547420903 + - 1.9499906058253988 + - 1.090788710904598 + - 1.8179584895099798 + - 1.1824749324759107 + - 1.466336385352 + - 2.162433714710978 + - 1.5889167056933695 + - 2.1747255013870417 + - 1.557957707556002 + - 1.5906829740862223 + - 1.4258631755641056 + - !!python/tuple + - 1.1337570745874515 + - 1.4985235691648215 + - 2.0365034842585192 + - 1.004491413176916 + - 2.0442636692221434 + - 1.169153356397102 + - 1.4365964136881724 + - 2.270198652468724 + - 1.6528259224404604 + - 2.255141076602655 + - 1.5685019670141014 + - 1.7841607340113383 + - 1.351769379757923 + - !!python/tuple + - 1.1870750097636078 + - 1.5385925802042861 + - 1.9760113103527845 + - 1.1342215566772473 + - 1.977224138909896 + - 1.2551729741287179 + - 1.4531552351588475 + - 2.3696507390057686 + - 1.601620848270531 + - 2.258936749500749 + - 1.4306666296793562 + - 1.7154269691067234 + - 1.507706347581975 + - !!python/tuple + - 1.1665134125177077 + - 1.4807912779630634 + - 1.896327659193187 + - 1.0895852033985634 + - 1.9480859773502153 + - 1.1638085027296072 + - 1.4832966874723634 + - 2.2132001490910014 + - 1.7739300123489792 + - 2.2613323672349637 + - 1.611665331357077 + - 1.6390536129451239 + - 1.3975989873624595 + - !!python/tuple + - 1.317260616378249 + - 1.4996552443507345 + - 1.7825305557839792 + - 1.0463449787361665 + - 2.219683365909795 + - 1.247264721357626 + - 1.431017452071682 + - 2.211507729205425 + - 1.4669680505630482 + - 2.158662293932649 + - 1.3997083198333784 + - 1.5879314963831175 + - 1.4093390017173202 + - !!python/tuple + - 1.1883261594772399 + - 1.5508375113382762 + - 1.8037045852135367 + - 1.070386987864488 + - 2.064030110970225 + - 1.2174284585319046 + - 1.5697902049358066 + - 2.1527547229141204 + - 1.9049705916050599 + - 2.193515526003635 + - 1.5291114261193222 + - 1.5944341462656437 + - 1.3720465458738855 + - !!python/tuple + - 1.2300879710641348 + - 1.453238633314816 + - 1.758636035111842 + - 1.01040155518519 + - 2.0487056746220125 + - 1.136823652011839 + - 1.2938065421313665 + - 2.113261181227495 + - 1.6262592301101568 + - 2.190106814000588 + - 1.6909281922882216 + - 1.5841464238031804 + - 1.2257875906762805 + - !!python/tuple + - 1.2367268816238601 + - 1.508422968905203 + - 1.7629674495707812 + - 1.0954805491179553 + - 2.0649909199670784 + - 1.2179291871924598 + - 1.395917950945781 + - 2.2275742915599634 + - 1.673489998094674 + - 2.1901070426132208 + - 1.4630225935698766 + - 1.4870495769109247 + - 1.3525425463811611 + - !!python/tuple + - 1.1206102682982482 + - 1.5123437512891535 + - 1.6823623715338978 + - 1.0694917922275604 + - 2.1051483848842727 + - 1.1625972359463042 + - 1.3542261119857955 + - 2.234167662864795 + - 1.5871195582174091 + - 2.17239977635523 + - 1.3618476839016238 + - 1.4854058413309064 + - 1.3326194108985858 + - !!python/tuple + - 1.2629347978614962 + - 1.4725857241503288 + - 1.6548712038361 + - 1.106082018629369 + - 2.0337150604570975 + - 1.1684925729942024 + - 1.364201703929513 + - 2.131475216929283 + - 1.8067029176835279 + - 2.1435127293646645 + - 1.4600463479212977 + - 1.5112862345087992 + - 1.3124821395780693 + - !!python/tuple + - 1.2439094863804465 + - 1.526453057749295 + - 1.652959819223018 + - 1.0170375702011478 + - 2.2170558462954317 + - 1.222056431370738 + - 1.340905310136723 + - 2.170312666923386 + - 1.5092976693104214 + - 2.1083422734988497 + - 1.3764441946436332 + - 1.4592465081585393 + - 1.275701202266937 + - !!python/tuple + - 1.2610216327692734 + - 1.510470162631003 + - 1.6130461381969998 + - 1.1239435012882106 + - 2.0841926133560746 + - 1.2197941633395755 + - 1.3769603542076125 + - 2.1539140277232685 + - 1.6257014810920336 + - 2.128995753645988 + - 1.4564368122489972 + - 1.4064164851423464 + - 1.3238766347046078 + - !!python/tuple + - 1.221285087561072 + - 1.5081234212304147 + - 1.5963387024721847 + - 1.0779091039989366 + - 2.17797765326575 + - 1.1597212783674578 + - 1.2980437209698106 + - 2.1896256341302367 + - 1.8551947251998522 + - 2.1084663750126618 + - 1.4699944882425648 + - 1.5190199383822296 + - 1.242082932216592 + - !!python/tuple + - 1.2005985358144384 + - 1.5611794301846957 + - 1.4851150753390203 + - 1.0768539401825084 + - 2.276610260308674 + - 1.1690260332940348 + - 1.2566788351805642 + - 2.1732356648646984 + - 1.6971976612202349 + - 2.112873307057495 + - 1.44735109656798 + - 1.549240337708408 + - 1.1780466694160352 + - !!python/tuple + - 1.2425311125890726 + - 1.570626971015125 + - 1.5727170486778879 + - 1.1595523231726792 + - 2.201149595501401 + - 1.240920389534649 + - 1.3594158785486647 + - 2.267822048178656 + - 1.7816547251412298 + - 2.1212613025508285 + - 1.400592370033821 + - 1.5062604527987085 + - 1.2890411887264497 + - !!python/tuple + - 1.2003915054633123 + - 1.5243518071805668 + - 1.596632028390522 + - 1.0590549576593924 + - 2.143151755692039 + - 1.1793482420516626 + - 1.2604438150457093 + - 2.1903064004859325 + - 1.612961467369466 + - 2.1126536876150435 + - 1.4599398274132254 + - 1.4995801334969119 + - 1.2590861684341719 + - !!python/tuple + - 1.135717039725457 + - 1.6014692967542044 + - 1.520403318923838 + - 1.0940179538789148 + - 2.243646450154129 + - 1.189743230904654 + - 1.3902942680089465 + - 2.204404181086659 + - 1.9978682617288515 + - 2.0554276127107696 + - 1.505124373077449 + - 1.6020724377536804 + - 1.2091247369435056 + - !!python/tuple + - 1.2291261688379316 + - 1.5637864490244318 + - 1.5320566955274821 + - 1.0888288317757602 + - 2.321020688051556 + - 1.2109240328914626 + - 1.280559902683745 + - 2.253754914340256 + - 1.7042557972992292 + - 2.0566068500438908 + - 1.4308669174199102 + - 1.5787909897070667 + - 1.223219707430383 + - !!python/tuple + - 1.1917922743464922 + - 1.5467074835708918 + - 1.5454172063086862 + - 1.1273904997196493 + - 2.17843608911989 + - 1.1963493976450161 + - 1.3193184435354337 + - 2.2000058785384464 + - 1.7366795871010976 + - 2.0687290847097612 + - 1.4429682305277793 + - 1.448369172159822 + - 1.2476556949626305 + - !!python/tuple + - 1.155875239865349 + - 1.6645519405812783 + - 1.6262454345738135 + - 1.1573422933733346 + - 2.2970743673069287 + - 1.298677226560303 + - 1.3677375350320748 + - 2.356555241150184 + - 1.5306018389480804 + - 2.114963904461967 + - 1.4253069662504887 + - 1.5766998493184101 + - 1.234717971968044 + - !!python/tuple + - 1.155875239865349 + - 1.6645519405812783 + - 1.6262454345738135 + - 1.1573422933733346 + - 2.2970743673069287 + - 1.298677226560303 + - 1.3677375350320748 + - 2.356555241150184 + - 1.5306018389480804 + - 2.114963904461967 + - 1.4253069662504887 + - 1.5766998493184101 + - 1.234717971968044 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.172790763797728 + - 2.6364453132893146 + - 1.5937309051914605 + - 1.4499444645342938 + - 2.7858129718055697 + - 3.72570038644014 + - 2.0809008631320443 + - 1.5638999202994261 + - 1.759341389694989 + - 1.9084680358647164 + - 1.0248078125437954 + - 1.0136709107990431 + - 1.7442004969969787 + - !!python/tuple + - 1.1071387988008574 + - 2.211341215431222 + - 1.405206572474631 + - 1.2635939514085317 + - 2.60283309249618 + - 3.6126218617761996 + - 1.8868793791146716 + - 1.3734993765837245 + - 1.6440186854723327 + - 1.7174071553034573 + - 0.8932489868738138 + - 0.8693649300673667 + - 1.6646743837591098 + - !!python/tuple + - 1.0066860384337055 + - 2.18706404848039 + - 1.5977192698905867 + - 1.3042831359657505 + - 2.3071452953765075 + - 3.4133029775021875 + - 2.056754951593373 + - 1.3024143694116035 + - 1.552174724638095 + - 1.8869052961731285 + - 0.8809806649837157 + - 0.9243494121463168 + - 1.6369002337397376 + - !!python/tuple + - 0.8450264220979495 + - 2.564142057444559 + - 1.5356364409893923 + - 1.3065926192991602 + - 2.587161479067096 + - 3.1358991889698884 + - 1.7624710264432433 + - 1.350378797138077 + - 1.5694837519819533 + - 1.5481553336732161 + - 0.8565757180785891 + - 0.8206408260719983 + - 1.5544828511846382 + - !!python/tuple + - 1.0478982094865388 + - 2.2504667887811203 + - 1.517668144885302 + - 1.2012928938074117 + - 2.4767180544855703 + - 2.980078394356057 + - 1.6762789468803059 + - 1.242687090128107 + - 1.5522545543384358 + - 1.6867952541767621 + - 0.994471695100762 + - 0.8069246176957481 + - 1.371584608517058 + - !!python/tuple + - 0.9093644318968777 + - 2.339332294303598 + - 1.7430987975398191 + - 1.3053851667798626 + - 2.40116705974169 + - 2.3471863787726277 + - 1.617272542426739 + - 1.1064263204567872 + - 1.5672981878951608 + - 1.5547374515454804 + - 0.9111556608583022 + - 0.7210559242083688 + - 1.2517038788710615 + - !!python/tuple + - 0.8780275962023564 + - 2.3954326423550087 + - 1.7085410043498446 + - 1.2589507875682713 + - 2.266315115541427 + - 1.971761740314625 + - 1.5228594485418792 + - 1.2398791659832948 + - 1.5602425529031931 + - 1.8485028083954849 + - 1.0504704111232377 + - 0.805467004478847 + - 1.2153785704565323 + - !!python/tuple + - 0.7844033326583242 + - 2.556987127763837 + - 1.8550099979712045 + - 1.20294941383398 + - 1.9942308044971035 + - 1.1832911089648133 + - 1.2803195191673649 + - 1.0652975414693986 + - 1.5188821097547958 + - 1.8526952123870633 + - 1.3143592308408893 + - 0.8515453453818324 + - 1.1070682018204077 + - !!python/tuple + - 0.8199228007292267 + - 2.1712826411747153 + - 1.9607904084106695 + - 1.332099350206523 + - 2.2614352899125176 + - 1.4742804735503396 + - 1.4934827940737008 + - 1.1193010067124871 + - 1.6230484744060365 + - 1.8031925179487007 + - 1.0983959952965008 + - 0.8354486713942393 + - 1.0432647059303999 + - !!python/tuple + - 0.8951530140556339 + - 2.644077057363601 + - 1.97754711391114 + - 1.3577901508516128 + - 2.280355707479567 + - 1.757510522552646 + - 1.6444445845683142 + - 1.1824416781613847 + - 1.54746581830587 + - 1.934738996170125 + - 1.2220019776245983 + - 0.9177040534153618 + - 1.2796920334920168 + - !!python/tuple + - 0.9523451825563252 + - 2.553392288104873 + - 1.9499184207201283 + - 1.337277731172959 + - 2.395515086794315 + - 1.6034200488702672 + - 1.4899863358200052 + - 1.286586112995853 + - 1.6420768062695759 + - 1.905038098535599 + - 1.2650738662544896 + - 0.8975071186843722 + - 1.142063226687656 + - !!python/tuple + - 0.8597321494380739 + - 2.3861599067066717 + - 1.8568456670270557 + - 1.2911491479199646 + - 2.468969657022139 + - 1.7315837072128328 + - 1.5748502791759393 + - 1.3327470776984487 + - 1.5726744838212934 + - 2.0324226101328957 + - 1.3043698636300958 + - 0.9885240442422187 + - 1.2544360175884806 + - !!python/tuple + - 0.8151289465579785 + - 2.6799809770101524 + - 1.9574600932672421 + - 1.2998440967605527 + - 2.431221743369863 + - 1.5874575396014787 + - 1.5931182238535309 + - 1.2643321065959192 + - 1.5447932444530112 + - 1.937205771211517 + - 1.2579495085519994 + - 0.9862728004055309 + - 1.2949430415726695 + - !!python/tuple + - 0.947296977017051 + - 2.3008244360605445 + - 1.8555910106962372 + - 1.2296386332337883 + - 2.4365080277554267 + - 1.3558177429989948 + - 1.4059174421785579 + - 1.1990889891703738 + - 1.6973629373851402 + - 2.00268338590445 + - 1.3662979754558844 + - 0.9574162733703195 + - 1.1741993174698682 + - !!python/tuple + - 0.9195424405411451 + - 2.4945168651158998 + - 1.894038307767263 + - 1.2303578686241254 + - 2.404659918321129 + - 1.3122651633122948 + - 1.3934875915696487 + - 1.2095502806306766 + - 1.5838855861570482 + - 1.9584872279867391 + - 1.3742702815153736 + - 0.9515657653674903 + - 1.2038243365824868 + - !!python/tuple + - 0.9366016521826346 + - 2.4811652058593876 + - 1.9413661759957423 + - 1.2931663900341874 + - 2.5921594703428266 + - 1.5113300041149675 + - 1.5543314296797373 + - 1.228059919670844 + - 1.6441229815093714 + - 1.9699473605703512 + - 1.3507076329879835 + - 0.9983679484147626 + - 1.3085222255271658 + - !!python/tuple + - 0.8296393899942448 + - 2.6452975887360974 + - 1.7496121312826711 + - 1.2148332375930142 + - 2.555096731951091 + - 1.554462803166602 + - 1.4173239628690806 + - 1.2603609473702686 + - 1.5450739046348025 + - 1.7783844452498072 + - 1.2481452314631813 + - 0.9254590478745783 + - 1.3967422238231468 + - !!python/tuple + - 0.86216697760667 + - 2.3671431832604735 + - 1.8647690192808857 + - 1.1686407186914174 + - 2.2368736275626153 + - 1.5206709889297094 + - 1.5663427497875766 + - 1.26404557025929 + - 1.4731122437545872 + - 2.0797292308358566 + - 1.3657202950496317 + - 1.0682307135867224 + - 1.3961573151814115 + - !!python/tuple + - 0.8004070250926058 + - 2.1914725356086273 + - 1.803108275934905 + - 1.1580479171474312 + - 2.4856892046847365 + - 1.3992475219003846 + - 1.4230587681022424 + - 1.1670463019519952 + - 1.54793763431304 + - 1.801208357252746 + - 1.2148146807243472 + - 0.9543661672852659 + - 1.2669369808832973 + - !!python/tuple + - 0.9823252289001718 + - 2.4194552968120724 + - 1.7255017344036983 + - 1.1288576822790808 + - 2.6951079166969363 + - 1.6649524326915404 + - 1.375068399176499 + - 1.355489269631818 + - 1.5669999561654961 + - 1.7180945423935117 + - 1.2662065874090382 + - 0.969224276674233 + - 1.3936105446035727 + - !!python/tuple + - 0.826207772006112 + - 2.314645870453917 + - 1.6639148863000233 + - 1.0853760623480675 + - 2.6740189306460653 + - 1.7108887574328548 + - 1.5565192966768737 + - 1.3082819003775352 + - 1.485811993642257 + - 1.8344265999771934 + - 1.2967023247477203 + - 1.1143814062488704 + - 1.6767441307460156 + - !!python/tuple + - 0.8232764426696557 + - 2.3623361686379405 + - 1.6506100114279496 + - 1.03892706697575 + - 2.409326804306297 + - 1.4096507319209524 + - 1.3416681517870133 + - 1.2692035646073934 + - 1.4339102591999238 + - 1.8434706622798664 + - 1.3378124499042874 + - 1.0311555671899746 + - 1.4710558342933164 + - !!python/tuple + - 0.8944148636563887 + - 2.049557309439823 + - 1.6692582385868937 + - 1.006378088886596 + - 2.435332950186319 + - 1.3150048535071137 + - 1.3829109581148515 + - 1.1903840864756983 + - 1.5016293033328458 + - 1.9371516583669335 + - 1.305130770158272 + - 1.036518093268035 + - 1.4490200648579816 + - !!python/tuple + - 0.8771464860797693 + - 2.34438327993812 + - 1.6771080105959042 + - 1.0721886531914695 + - 2.762717873490593 + - 1.3215139224681802 + - 1.3138791255356788 + - 1.257123553356924 + - 1.5470347704647178 + - 1.7446620841049874 + - 1.3220040486475468 + - 1.0216864926857467 + - 1.45942412975203 + - !!python/tuple + - 0.8807977227419401 + - 2.294835404876231 + - 1.6931582016007836 + - 1.0116002248803584 + - 2.5080610660576226 + - 1.3748644132002656 + - 1.3678859537389543 + - 1.1076064534473005 + - 1.5014210822273149 + - 1.7552340361932832 + - 1.2672163370650407 + - 0.993456506998678 + - 1.4506443097923762 + - !!python/tuple + - 0.8411172182265342 + - 2.17838024072337 + - 1.6409941939161687 + - 1.0187760747994385 + - 2.5911013981001982 + - 1.6852596043362609 + - 1.4620957594297654 + - 1.3049812213858596 + - 1.4008302129595767 + - 1.6923034104635655 + - 1.1897123163223347 + - 1.0507858390648053 + - 1.5783732002896271 + - !!python/tuple + - 0.8527528654836747 + - 1.9728201796739917 + - 1.588051559051915 + - 0.9684318923597688 + - 2.6741075210093395 + - 1.507380311516612 + - 1.3519369003167023 + - 1.3448620820258226 + - 1.5036922873843173 + - 1.7422285529965462 + - 1.243900158484816 + - 1.0709424744469727 + - 1.4956116220254285 + - !!python/tuple + - 0.8273152753583725 + - 2.1630658002975736 + - 1.6920242801760497 + - 0.9655957337715895 + - 2.4711035597560613 + - 1.1090348344074819 + - 1.2234475377813698 + - 1.2202501929828924 + - 1.4286299542946994 + - 1.5938316279428957 + - 1.3053450768142285 + - 1.0438533701348065 + - 1.5158468656899156 + - !!python/tuple + - 0.9539794265936694 + - 1.9884072746637105 + - 1.6491775726173241 + - 0.9696278846931445 + - 2.763578696067346 + - 1.4556543689747024 + - 1.3663098232478712 + - 1.2405261840673485 + - 1.5377771721750717 + - 1.6960097148473845 + - 1.2545131726730927 + - 1.0597549536538038 + - 1.5290060183070082 + - !!python/tuple + - 0.8430377429469331 + - 2.0722632541286092 + - 1.6323589213236873 + - 0.9449426743357647 + - 2.6217496749449785 + - 1.3376645700918819 + - 1.361502298892081 + - 1.2232731956982363 + - 1.4603519440020702 + - 1.7034675693823047 + - 1.2918602387667961 + - 1.1167787568578516 + - 1.6232787148669172 + - !!python/tuple + - 0.9562758971946506 + - 2.1118261696556764 + - 1.6727791552197186 + - 0.9669242585121143 + - 2.55891092357283 + - 1.3172426444225904 + - 1.3137659691749777 + - 1.2271162731828262 + - 1.5071246924889405 + - 1.7014079182424238 + - 1.30565827925844 + - 1.0613279030624128 + - 1.5103666888399232 + - !!python/tuple + - 0.8975958077242898 + - 2.084393390024757 + - 1.5702834852473027 + - 0.9151306167912152 + - 2.757012807990128 + - 1.4724745359067462 + - 1.3192237679278336 + - 1.3263740509007536 + - 1.4867268681387504 + - 1.5347658338435384 + - 1.226506124670343 + - 1.114021971377158 + - 1.7096010137100266 + - !!python/tuple + - 0.8306052029591946 + - 1.9013037323620425 + - 1.7363053708648784 + - 0.9824185109488268 + - 2.7034031051100618 + - 1.2846626410690922 + - 1.3315787354522735 + - 1.2672746049551915 + - 1.5325482126385748 + - 1.4322677439592533 + - 1.1870671735692642 + - 1.1160970985438206 + - 1.5780332767466836 + - !!python/tuple + - 0.9288144034424267 + - 2.3940870329164965 + - 1.806738526390481 + - 0.9879160884387764 + - 2.6463790591577836 + - 1.26382011708367 + - 1.3892155825432804 + - 1.1998518053570293 + - 1.4318625399738183 + - 1.4657166602956246 + - 1.340062645580126 + - 1.1767235579268747 + - 1.8232235897084423 + - !!python/tuple + - 0.8653635000356699 + - 2.146514861822372 + - 1.72300591404188 + - 0.9397720971927668 + - 2.5720124119987746 + - 1.271844959251895 + - 1.3604205652604893 + - 1.3346625130551937 + - 1.4268151600688923 + - 1.525439383479779 + - 1.2852232639469772 + - 1.2162341291964522 + - 1.768941576917567 + - !!python/tuple + - 1.047501058341442 + - 2.1117860987217094 + - 1.8523802172952692 + - 0.9626127597705545 + - 2.695867712827155 + - 1.263132067719438 + - 1.336597122845122 + - 1.352416768643508 + - 1.5251087448855472 + - 1.3280218554334937 + - 1.2086147528045605 + - 1.1829281829962817 + - 1.718543688917442 + - !!python/tuple + - 0.936138164211221 + - 2.0825754160554233 + - 1.8988949230525063 + - 0.9887864386959895 + - 2.5566700607093833 + - 1.118318322304845 + - 1.4025243097481328 + - 1.2253033292344233 + - 1.4757288908626556 + - 1.5433543425307241 + - 1.28388440579235 + - 1.2009605862272514 + - 1.6512823896076818 + - !!python/tuple + - 0.8606144326413108 + - 2.0719481532954727 + - 1.8108878845763456 + - 0.9227495897966536 + - 2.4608060649259427 + - 1.3893497243295208 + - 1.4581033502429763 + - 1.2710261616071528 + - 1.3731956133079164 + - 1.4493099406900178 + - 1.19179401864466 + - 1.20861418216553 + - 1.7762411113949332 + - !!python/tuple + - 0.9356498502429466 + - 2.137384991758068 + - 1.8368898520938233 + - 1.0128508143789698 + - 2.660420799668189 + - 1.4354878006473357 + - 1.542954398939923 + - 1.2302670575952428 + - 1.5194555175672075 + - 1.4613894528707294 + - 1.2107471376886825 + - 1.2397610106121637 + - 1.8921687991325196 + - !!python/tuple + - 0.9587856851398397 + - 2.1653692054298137 + - 1.8912264594476729 + - 0.9886753792487768 + - 2.613795309724869 + - 1.3388714172166125 + - 1.4486046139485147 + - 1.3897366880574455 + - 1.4368271465155895 + - 1.363652261459432 + - 1.28080257717474 + - 1.2996830098751329 + - 1.9099245573605992 + - !!python/tuple + - 0.9632169469062921 + - 1.6337684831521564 + - 1.8873214224489883 + - 0.9056466139726185 + - 2.518903700284752 + - 1.2120450256408393 + - 1.4038749821495644 + - 1.3979964164136496 + - 1.5482318839853857 + - 1.3341097355635614 + - 1.073234687845161 + - 1.2898588184225954 + - 1.6968271016534358 + - !!python/tuple + - 0.9632169469062921 + - 1.6337684831521564 + - 1.8873214224489883 + - 0.9056466139726185 + - 2.518903700284752 + - 1.2120450256408393 + - 1.4038749821495644 + - 1.3979964164136496 + - 1.5482318839853857 + - 1.3341097355635614 + - 1.073234687845161 + - 1.2898588184225954 + - 1.6968271016534358 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.1290644615477048 + - 1.4082273087779111 + - 1.5029373197161995 + - 1.1480818258617933 + - 2.7140371453626804 + - 1.9917178827233835 + - 1.6396485225396282 + - 1.2719186858799971 + - 1.2004395291344796 + - 2.5776903774787225 + - 1.7061767538765054 + - 1.855896583168854 + - 1.8558448177962772 + - !!python/tuple + - 1.1274253843840252 + - 1.4980121573413374 + - 1.8735670756746972 + - 1.3026557040190245 + - 2.3823997847846696 + - 1.8627353822101842 + - 1.3868512323288085 + - 1.1160196756087393 + - 1.320607829508288 + - 2.473576108006907 + - 1.7119328293788012 + - 2.1856919990209485 + - 1.7987069970956524 + - !!python/tuple + - 0.9984710298095956 + - 1.1149931668617736 + - 1.4195400304941788 + - 1.1326371784103304 + - 2.214676119237571 + - 1.9515933222587627 + - 1.388036360179992 + - 1.4520007947780835 + - 1.5587268154976799 + - 2.5640755412993688 + - 1.7318885617445101 + - 1.7197854877053178 + - 1.8497761777260835 + - !!python/tuple + - 1.0438696032285282 + - 1.1574421866597597 + - 1.5960315847594293 + - 1.1827306567881644 + - 2.0020887979597406 + - 1.9662428341971334 + - 1.0693417592526635 + - 1.3173613520216525 + - 1.2538669734243517 + - 2.2507569734299926 + - 1.6356686812802006 + - 1.6160101014273103 + - 1.521617138845409 + - !!python/tuple + - 0.8266377758914123 + - 1.1646463976293804 + - 1.5384538354991086 + - 1.2026432836651504 + - 2.284067956645654 + - 1.973370313875277 + - 1.1229491071917113 + - 1.359135763815142 + - 1.4031608795243586 + - 2.5566250675989988 + - 1.4621458473297873 + - 1.7126893809562884 + - 1.5158752614523068 + - !!python/tuple + - 1.1019136395166376 + - 1.394434734430373 + - 1.7476467713370651 + - 1.3336800973554932 + - 2.2809064287488994 + - 2.088047836932984 + - 1.2616000220749748 + - 1.4457459642162704 + - 1.3664655087083 + - 2.577882215418871 + - 1.705841839484344 + - 1.8262457527599314 + - 1.4692959892356634 + - !!python/tuple + - 0.9012414425659019 + - 1.1788852083307129 + - 1.7060992050236312 + - 1.1724794177986642 + - 2.2745788845215476 + - 1.89109626307854 + - 1.0490105561541332 + - 1.4935778510788342 + - 1.1868268038366305 + - 2.509708812190303 + - 1.4967081599342689 + - 1.5021561586839596 + - 1.3743173126435728 + - !!python/tuple + - 0.9910269771385218 + - 1.3266150966547139 + - 1.9199538884267278 + - 1.290662436172596 + - 2.2858919878953605 + - 1.7997174035229575 + - 1.0419964974779143 + - 1.2003480068021757 + - 1.2626253547330257 + - 2.4710883808665765 + - 1.5818362247867856 + - 1.5659148134501946 + - 1.2978230916494686 + - !!python/tuple + - 0.9836293102429049 + - 1.289517252223212 + - 1.7383018223232602 + - 1.251817973663103 + - 2.415829095816845 + - 1.9839325301076416 + - 1.1258684076970158 + - 1.4427408726816122 + - 1.236054530513267 + - 2.548119900266008 + - 1.6529067398590178 + - 1.5417580554753114 + - 1.241001498190402 + - !!python/tuple + - 0.9304607453256144 + - 1.3009194860190085 + - 1.7495601544322144 + - 1.244230117144094 + - 2.326527491267067 + - 1.8398274678054012 + - 1.105033719062062 + - 1.2964816134250294 + - 1.2779455832093827 + - 2.6651024539367705 + - 1.4404908693154634 + - 1.606057427409842 + - 1.172055330398198 + - !!python/tuple + - 0.9496703664990243 + - 1.2503139608612193 + - 1.7967965425122827 + - 1.2617476061260633 + - 2.342013074430916 + - 1.8903227632831303 + - 1.0212399749664334 + - 1.4065330948244816 + - 1.281616884436566 + - 2.5784543239649675 + - 1.5049502524446865 + - 1.4967191432981268 + - 1.2453871355767427 + - !!python/tuple + - 0.9820662909944325 + - 1.3188071529310639 + - 1.8680245087030838 + - 1.2989868236885207 + - 2.3312239597869113 + - 1.9098280598084556 + - 1.0215450134574726 + - 1.3956686566295224 + - 1.2440082286523029 + - 2.5658710431411205 + - 1.5596835203240245 + - 1.5425029831207309 + - 1.1585993665742318 + - !!python/tuple + - 0.8900740743884535 + - 1.2751468942535293 + - 1.7973189346567504 + - 1.25089086015183 + - 2.2876587204271193 + - 1.8709853404438679 + - 1.037829127383822 + - 1.3491765422101853 + - 1.2433021991753872 + - 2.54916852043473 + - 1.5164816569635766 + - 1.5485485993513897 + - 1.2097950627575471 + - !!python/tuple + - 0.9614510236297699 + - 1.286838941978449 + - 1.6193895523191615 + - 1.2297201537360596 + - 2.268237491178348 + - 1.9309111358452706 + - 1.0184406974972182 + - 1.283937100687682 + - 1.2408218391255286 + - 2.5437170418491113 + - 1.4022385958901544 + - 1.4471417393715307 + - 1.2134021477832393 + - !!python/tuple + - 0.9268710471757438 + - 1.2768237285231483 + - 1.7082640971389833 + - 1.2733009092904104 + - 2.3171938245237294 + - 2.0003278553623307 + - 1.0741581124917872 + - 1.4821438409121082 + - 1.2907580548101034 + - 2.641220201908196 + - 1.4962675353162473 + - 1.5551145565871893 + - 1.1943765807461855 + - !!python/tuple + - 0.9378045718360244 + - 1.3293727666931472 + - 1.8371543144803053 + - 1.312196062999425 + - 2.3482835199255048 + - 1.9575732623003825 + - 1.0547978012732702 + - 1.4070808926885041 + - 1.2557031215873256 + - 2.572825824963001 + - 1.5002553971824049 + - 1.5897151649655767 + - 1.2676749152998288 + - !!python/tuple + - 0.9192166989177601 + - 1.3246376875542758 + - 1.8263005390408762 + - 1.2754039092337313 + - 2.412210621051357 + - 1.8650780893579642 + - 1.1171067121460239 + - 1.3869028300363455 + - 1.2854178643100065 + - 2.6486694726317377 + - 1.5206339215068856 + - 1.5263778289625893 + - 1.2667375560278353 + - !!python/tuple + - 0.9485263820741783 + - 1.3645542699825244 + - 1.8356241725404336 + - 1.328271438515403 + - 2.332697907033941 + - 1.9089495243231627 + - 1.0500603838636235 + - 1.3196001139507705 + - 1.2972971367063768 + - 2.6416658287196357 + - 1.4508229097889083 + - 1.549318637356006 + - 1.146614974044655 + - !!python/tuple + - 0.9807609292603413 + - 1.3623336289356582 + - 1.7497624460654637 + - 1.3370411841148282 + - 2.330338128539929 + - 2.0194724471464136 + - 1.0918052520144759 + - 1.4200250138408153 + - 1.338465328411531 + - 2.6622638324148795 + - 1.4628256735409924 + - 1.5576262732251114 + - 1.2530691705510015 + - !!python/tuple + - 0.9385399800722647 + - 1.3522960572844536 + - 1.6619886906024401 + - 1.276716745622116 + - 2.2085298249841196 + - 1.8814001245094707 + - 1.1010961004007422 + - 1.2553780465477637 + - 1.3701214887021607 + - 2.693032041130619 + - 1.3915853538306528 + - 1.5150709034313905 + - 1.176525746364373 + - !!python/tuple + - 0.9307125511774217 + - 1.3711331115735947 + - 1.7263305032534288 + - 1.3096041434527974 + - 2.299466552902652 + - 1.9239015331501723 + - 1.0650416011193191 + - 1.2963242560752504 + - 1.341111335081768 + - 2.6843878312861364 + - 1.4073102601537055 + - 1.5399394492088438 + - 1.1615946163933448 + - !!python/tuple + - 0.9694425229848698 + - 1.4153119607103692 + - 1.7500861293001813 + - 1.3065522371457758 + - 2.376721944424184 + - 1.920217470278074 + - 1.1206215366639807 + - 1.2838730684051796 + - 1.294374229244021 + - 2.6614555853104935 + - 1.4616625828356948 + - 1.5624080878152116 + - 1.1986268980790096 + - !!python/tuple + - 0.9522279875400199 + - 1.4447683893784904 + - 1.855956745145626 + - 1.357147285552466 + - 2.332625360858678 + - 1.9003468406174604 + - 1.0999004441711495 + - 1.294095779205979 + - 1.3282057303955996 + - 2.6871065274557306 + - 1.4402859103398016 + - 1.607157785957864 + - 1.1955010806661508 + - !!python/tuple + - 0.9642058440405568 + - 1.403657444996485 + - 1.7631993311572796 + - 1.3179534921898552 + - 2.3587999217034827 + - 1.8659346888081143 + - 1.0803845228535924 + - 1.2440588794514187 + - 1.3506793370045516 + - 2.6990023864959998 + - 1.3715786189282766 + - 1.4988473317362079 + - 1.216697437196855 + - !!python/tuple + - 0.9568696228509617 + - 1.3829583799793723 + - 1.691934308348031 + - 1.3163474338284802 + - 2.318709163257315 + - 1.9622360188386692 + - 1.099893453578507 + - 1.3508851310176406 + - 1.357326282599164 + - 2.731164592913807 + - 1.4115638578684107 + - 1.5010447541057075 + - 1.1342223571754686 + - !!python/tuple + - 0.9565120367656803 + - 1.4021133099106624 + - 1.6780927964140546 + - 1.30942853191103 + - 2.292997693433435 + - 1.9430304126052367 + - 1.1336131717895432 + - 1.302691303271243 + - 1.3741362665270187 + - 2.701208621911295 + - 1.4222056783097643 + - 1.5226253177996452 + - 1.2561857944927481 + - !!python/tuple + - 1.0024131974258685 + - 1.4511070319343702 + - 1.800816093138111 + - 1.3536942549552906 + - 2.3444049830899707 + - 1.915300138859131 + - 1.1314350731370664 + - 1.275300615721762 + - 1.3586405875015013 + - 2.690983995627676 + - 1.468379210077932 + - 1.5168828198033322 + - 1.204513710914013 + - !!python/tuple + - 0.9669141485696677 + - 1.4262346275732545 + - 1.677511259694912 + - 1.3065297362950954 + - 2.33532657738841 + - 1.9401967230938153 + - 1.0403843927824774 + - 1.302784944561725 + - 1.3445024338519393 + - 2.653863976974842 + - 1.416273977941073 + - 1.597932917785024 + - 1.2136109872583232 + - !!python/tuple + - 0.9452807255354194 + - 1.4502902886062954 + - 1.7731903516911522 + - 1.37228104731373 + - 2.3235149309480088 + - 1.908043683071063 + - 1.076923905019851 + - 1.3040046459516077 + - 1.442600565580383 + - 2.7792522189188498 + - 1.356666239248892 + - 1.495104831942363 + - 1.2051977256180153 + - !!python/tuple + - 0.9733893411969927 + - 1.4490812919888643 + - 1.6681534700873235 + - 1.3295771997246675 + - 2.3962522291061474 + - 1.9783311373394445 + - 1.130404426347005 + - 1.3642755705937173 + - 1.3971685918347987 + - 2.747094884439328 + - 1.4179348532411304 + - 1.547269135267002 + - 1.277127492908469 + - !!python/tuple + - 1.0443222356982589 + - 1.4490881483824565 + - 1.6687536987678302 + - 1.3325823839370956 + - 2.260379375731498 + - 1.9132010694796244 + - 1.0704296502462582 + - 1.2998476208809029 + - 1.445882046582821 + - 2.7295064898153956 + - 1.4265812466949197 + - 1.4882768616543365 + - 1.1774967609323526 + - !!python/tuple + - 0.9886276296858975 + - 1.4801305706612533 + - 1.7535046814082025 + - 1.349278137737971 + - 2.4299795385617258 + - 1.9094649731497573 + - 1.0387504206749318 + - 1.3317474507420752 + - 1.3924640534272774 + - 2.7323103441715775 + - 1.4260093673255854 + - 1.5343243984316988 + - 1.162806465626254 + - !!python/tuple + - 0.968898016898841 + - 1.4648077473645449 + - 1.5964792441937585 + - 1.3221121348490317 + - 2.305631451664357 + - 1.9467485637480977 + - 1.0716364285152968 + - 1.2998395548395758 + - 1.443940059170692 + - 2.7523877184602963 + - 1.3529344923207254 + - 1.5124921613019078 + - 1.2289337053524052 + - !!python/tuple + - 0.9823192942861865 + - 1.4751179689433187 + - 1.708846678036166 + - 1.3588851030037947 + - 2.3761805413325643 + - 1.935099471565592 + - 1.119132716758333 + - 1.3349936024587998 + - 1.4558783440615384 + - 2.795401303313333 + - 1.4090367947930056 + - 1.444382954290829 + - 1.2315043169833921 + - !!python/tuple + - 1.0043746933674538 + - 1.4653422915566803 + - 1.6675397321944314 + - 1.345629896467817 + - 2.337549006765963 + - 1.9085599534293554 + - 1.001677650985556 + - 1.325418175663283 + - 1.4769399897381936 + - 2.7510762306358565 + - 1.343643888972979 + - 1.4756709847151521 + - 1.2485594186856503 + - !!python/tuple + - 1.0084473525687605 + - 1.5415415439828275 + - 1.7020580145280375 + - 1.3756852670746886 + - 2.421226390731296 + - 1.9131964149007314 + - 1.0571762808902212 + - 1.310780782762889 + - 1.4688866022955507 + - 2.832892406701801 + - 1.3384176522925688 + - 1.527509704141751 + - 1.173430282911493 + - !!python/tuple + - 1.033810353213427 + - 1.4931286295506034 + - 1.6025285643373426 + - 1.3176427660613141 + - 2.3986510989677825 + - 1.970590798121464 + - 1.0442110387094643 + - 1.3633134295332954 + - 1.4116267638470665 + - 2.7161305989541287 + - 1.4394721599701263 + - 1.5387928641276574 + - 1.2219603233406449 + - !!python/tuple + - 1.0018999444318308 + - 1.4466491390399279 + - 1.6164273563409752 + - 1.3517238141562935 + - 2.2921184491176017 + - 1.9619786359573945 + - 1.0358289482512468 + - 1.3947268599443032 + - 1.5456397772414967 + - 2.7985298595457087 + - 1.415085399080518 + - 1.4928811226887309 + - 1.1889133893082375 + - !!python/tuple + - 0.9508226994001796 + - 1.5060150879153171 + - 1.667290848809891 + - 1.3601111585470769 + - 2.4411596095066503 + - 1.9575579884019751 + - 1.0231812291158884 + - 1.3776174940171853 + - 1.4667670835204965 + - 2.8021480165858716 + - 1.364453651182969 + - 1.5264508701593982 + - 1.2112586047903162 + - !!python/tuple + - 0.9720414009597146 + - 1.5292213616462405 + - 1.6226032541984483 + - 1.3328139777057082 + - 2.3708634676964957 + - 1.8894671564920555 + - 1.014319455280608 + - 1.3503432276020748 + - 1.4481626656909987 + - 2.8082758084474264 + - 1.2533591990575443 + - 1.506878314075744 + - 1.2323305671484734 + - !!python/tuple + - 1.0297602511712691 + - 1.5391681423945065 + - 1.7550108046516562 + - 1.3855592796170002 + - 2.4690794580541144 + - 1.8913705289890879 + - 1.01491997469366 + - 1.4207020859335973 + - 1.5194713128372903 + - 2.8498233193763327 + - 1.4050147686086887 + - 1.511574010065159 + - 1.2069123410549625 + - !!python/tuple + - 0.9754572753178533 + - 1.5593841182165715 + - 1.5544027286187183 + - 1.3266987954241034 + - 2.455298540548184 + - 1.9494579917126444 + - 1.1221589267041834 + - 1.3909591209597651 + - 1.492960898220061 + - 2.905832451015457 + - 1.388924562052057 + - 1.5853693732272496 + - 1.1407772267866974 + - !!python/tuple + - 0.9759483589662736 + - 1.4545826016577037 + - 1.534880582978147 + - 1.2954174115778667 + - 2.337613181191376 + - 1.9367675549384151 + - 1.0364972016852005 + - 1.3960846610480302 + - 1.4993777206699548 + - 2.783652413435337 + - 1.3868275348485926 + - 1.5058660118482332 + - 1.2468102127643834 + - !!python/tuple + - 1.0125590690074011 + - 1.6195518708447614 + - 1.5739527466521754 + - 1.376067728418979 + - 2.4725950808592443 + - 1.890465149536974 + - 1.0195508969230351 + - 1.4046204290570572 + - 1.631865594015839 + - 2.9599560298933185 + - 1.2797534605402614 + - 1.5124784635457458 + - 1.244537035713086 + - !!python/tuple + - 0.9734864944920477 + - 1.5293327428410417 + - 1.6949765674240747 + - 1.3532394800380698 + - 2.5178774769605323 + - 1.8957565681457786 + - 1.0327472968609508 + - 1.4040926559272089 + - 1.4819383540453306 + - 2.8457861638781825 + - 1.3850928834505172 + - 1.5314834513734337 + - 1.1805621168767548 + - !!python/tuple + - 0.982409411715493 + - 1.652460044434077 + - 1.6496357161189508 + - 1.3728297471009627 + - 2.577205088094209 + - 1.8719577714537061 + - 0.9801936376060894 + - 1.4437622048109142 + - 1.551623263793974 + - 2.920808980476412 + - 1.3343679811494706 + - 1.5491687400992067 + - 1.2094153149696034 + - !!python/tuple + - 1.0367836436827296 + - 1.6531643017758417 + - 1.5838250787591792 + - 1.3341762403155362 + - 2.5301658307438486 + - 1.8375865296641467 + - 1.0850161128900169 + - 1.4684551689401493 + - 1.562540317108617 + - 2.960337544925145 + - 1.337440567106651 + - 1.5576227835767271 + - 1.268029999941034 + - !!python/tuple + - 1.0367836436827296 + - 1.6531643017758417 + - 1.5838250787591792 + - 1.3341762403155362 + - 2.5301658307438486 + - 1.8375865296641467 + - 1.0850161128900169 + - 1.4684551689401493 + - 1.562540317108617 + - 2.960337544925145 + - 1.337440567106651 + - 1.5576227835767271 + - 1.268029999941034 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 2.5635901875974336 + - 2.00399935836982 + - 1.1173940747422846 + - 1.0156664710300147 + - 1.5805212097507575 + - 1.07676612488273 + - 0.9521445745755989 + - 1.9033068827974864 + - 1.7270818948007567 + - 1.9962412824641949 + - 1.382009173924383 + - 0.8281044285613428 + - 2.150041382811793 + - !!python/tuple + - 2.452318610586074 + - 2.2491621720716086 + - 1.210855070659711 + - 1.1043162712957368 + - 1.6625579750449542 + - 1.5996320513116875 + - 1.0077724601592615 + - 1.9368263000704213 + - 1.6213703397610337 + - 1.8598235359158433 + - 1.5380621774464702 + - 0.9529934315213158 + - 1.994410324058447 + - !!python/tuple + - 1.7809504579197784 + - 2.8587794007685043 + - 1.2643629621469743 + - 0.9539204508905998 + - 1.8024937909217702 + - 1.0242309183643485 + - 1.0877318202320747 + - 1.837298354349821 + - 1.6227407756406913 + - 1.636999102805119 + - 1.5453027309491991 + - 0.9683667157341482 + - 1.8055111822744383 + - !!python/tuple + - 1.5741821216560532 + - 2.563560183213702 + - 1.3809926358420088 + - 0.977701072181858 + - 1.7298397795655807 + - 1.4879077955610551 + - 0.9883127829454974 + - 1.8936564199766712 + - 1.9584790433449057 + - 1.6008942923578733 + - 1.505104360840543 + - 1.2304847372958398 + - 1.766496600961868 + - !!python/tuple + - 1.3285758283363056 + - 3.4652960178513266 + - 1.6761177611726767 + - 1.1050152794095849 + - 2.017504641163642 + - 1.8242433571839844 + - 1.2286860228479977 + - 1.9203692284454226 + - 1.874923566515295 + - 1.256723763422802 + - 1.4443912168004167 + - 1.312619166857874 + - 1.589816717327719 + - !!python/tuple + - 1.3210996309362786 + - 3.1772808223163045 + - 1.6120602464025184 + - 1.1272141173364165 + - 1.8654479775412653 + - 1.5301241591455839 + - 1.0797385802487176 + - 1.9474872388836855 + - 1.7886122227169086 + - 1.583996218227703 + - 1.7054726823151127 + - 1.3392908362153866 + - 1.6999708228387864 + - !!python/tuple + - 1.2695766738432215 + - 3.053799070406042 + - 1.6229835317661236 + - 1.017448602978581 + - 2.0406942203433784 + - 1.71213494315605 + - 1.1194893691434724 + - 2.0259287252081077 + - 1.9266849705600406 + - 1.4539663887342074 + - 1.8480079025778653 + - 1.4815089280523328 + - 1.5621442960527347 + - !!python/tuple + - 1.360895160384592 + - 2.972008258227242 + - 1.6404579553351195 + - 0.9289385039488884 + - 1.9105163180287925 + - 1.886052469395683 + - 1.0619866340608874 + - 1.8856374205251631 + - 1.9535927425326416 + - 1.3885718147593606 + - 1.375982748440593 + - 1.2628887434064124 + - 1.6061644056920925 + - !!python/tuple + - 1.1636421715757237 + - 3.1711747883398456 + - 1.5645799688499895 + - 1.0674023916361333 + - 2.0092164345026893 + - 1.4387548581498355 + - 1.094188815349785 + - 1.956113534282485 + - 1.9070808947654478 + - 1.40123889454159 + - 1.5911333532595326 + - 1.3335491683554697 + - 1.6402942064953403 + - !!python/tuple + - 1.1547122614199092 + - 3.0614077539162654 + - 1.5614286773565291 + - 0.9988117134686734 + - 1.894060902875172 + - 1.7500624303016536 + - 1.0061341197983742 + - 1.8841703258362243 + - 1.9361814138674118 + - 1.318302620892997 + - 1.5451428813633479 + - 1.369698717198355 + - 1.516573672634283 + - !!python/tuple + - 1.254903161779882 + - 2.8204494271986214 + - 1.5018127836942736 + - 0.9867532123130913 + - 1.764852543835437 + - 1.4494898806587238 + - 1.0330998766556065 + - 1.8969459990723938 + - 1.784618997954098 + - 1.5036214259785154 + - 1.6399451977950092 + - 1.2844492620105123 + - 1.539951008011959 + - !!python/tuple + - 1.1003067578433428 + - 3.0954584822014266 + - 1.5905016189446552 + - 1.0520851467151056 + - 1.9022875963855497 + - 1.6927892573567203 + - 1.0673082220811896 + - 1.8680730472088831 + - 1.973161813178569 + - 1.3145164939651908 + - 1.554921767738448 + - 1.4243410400996155 + - 1.518714941879772 + - !!python/tuple + - 1.0833182668299486 + - 3.1420831179834776 + - 1.5893803314963562 + - 0.9623724918164658 + - 1.9529057191796568 + - 1.5381286354177486 + - 1.1095055280028787 + - 1.913010875052409 + - 1.9387557872403838 + - 1.4213896249993003 + - 1.645253300747001 + - 1.37337523903679 + - 1.5836941191013025 + - !!python/tuple + - 1.0774576456153393 + - 3.114855532746584 + - 1.6254233703260983 + - 1.0676967326416298 + - 1.942143391284601 + - 1.6827436929347064 + - 1.0956241695794309 + - 1.9548374857612552 + - 1.9666763080053258 + - 1.377138438044085 + - 1.6064301644712713 + - 1.4281228574719158 + - 1.5824055689146403 + - !!python/tuple + - 1.1427533261119847 + - 2.9691458548678744 + - 1.5539347758164288 + - 0.9530570151978988 + - 1.9378415282583146 + - 1.7108130047613557 + - 1.0474374816737841 + - 1.894788600851494 + - 1.9951562597828256 + - 1.3208700588989322 + - 1.5528549705767558 + - 1.3836015161077913 + - 1.5062003941976 + - !!python/tuple + - 1.266833417206422 + - 2.9893646091006856 + - 1.6044845794434135 + - 0.9702949562527807 + - 1.9019959331148053 + - 1.756412803439249 + - 1.0534608565288908 + - 1.8942748562086464 + - 1.9521304801819026 + - 1.398527600001532 + - 1.4763816693183625 + - 1.3169909834117512 + - 1.5908931998054663 + - !!python/tuple + - 1.1498715364438805 + - 3.0076709861866626 + - 1.5442804462437105 + - 1.002312632160116 + - 1.837231299807228 + - 1.6142463507899178 + - 1.0179859205139352 + - 1.8452077164629375 + - 1.9441693899029535 + - 1.3777457434742066 + - 1.4516537606948174 + - 1.3090113289817422 + - 1.5739976695542595 + - !!python/tuple + - 1.1582665903981069 + - 2.8842143814622405 + - 1.5355766777674265 + - 0.9999757783528661 + - 1.8952173138832207 + - 1.6031639753772846 + - 0.9910782533977464 + - 1.9133203292223189 + - 1.9749608703556745 + - 1.4591160697852101 + - 1.6561971016597044 + - 1.4044077308503211 + - 1.5778017253595138 + - !!python/tuple + - 1.1817905604400765 + - 2.851127368876356 + - 1.6450420739582758 + - 0.9929929492839134 + - 1.8459057450284766 + - 1.5141576609449694 + - 1.1279677687602263 + - 1.9216712657294222 + - 2.015179752178109 + - 1.5826623893354133 + - 1.6220361510546777 + - 1.4121464779163841 + - 1.6407421238618962 + - !!python/tuple + - 1.165843572801039 + - 2.8674769066471946 + - 1.6200516008347035 + - 1.0177324636985654 + - 1.7944590648560248 + - 1.5694864809239486 + - 1.0409792878714141 + - 1.9106610815045397 + - 1.9472600947119232 + - 1.5576565577099974 + - 1.575632051743741 + - 1.3642661762872583 + - 1.6336322283442892 + - !!python/tuple + - 1.1012423523976445 + - 2.849431175718354 + - 1.6951505962406692 + - 0.9298918421934799 + - 1.7597858616786228 + - 1.5991977980315684 + - 1.1797026972205567 + - 1.8758359872092887 + - 1.9510597582454052 + - 1.4955651631940243 + - 1.4778514860725078 + - 1.341691213545335 + - 1.5361889671651894 + - !!python/tuple + - 1.134998329713921 + - 2.786669482580748 + - 1.602429455561964 + - 0.9917090093895049 + - 1.8509135882260952 + - 1.459061392431043 + - 1.0962514257712028 + - 1.9314129539976093 + - 1.9586973020173337 + - 1.5424542461843038 + - 1.5870886248707556 + - 1.3556556047391919 + - 1.6054356502967815 + - !!python/tuple + - 1.0292787786593964 + - 2.733097198078417 + - 1.7442882639664854 + - 0.9739139697319348 + - 1.8456221429480766 + - 1.715568846172578 + - 1.1128664557461336 + - 1.92284072266009 + - 2.137694585755826 + - 1.524828304472475 + - 1.4835312231473814 + - 1.4613234640373416 + - 1.6063244585360847 + - !!python/tuple + - 1.1683647094796572 + - 2.8279701488420477 + - 1.6234640390612918 + - 0.9758180927379967 + - 1.7730208687508155 + - 1.6170017390075744 + - 1.0517123863259918 + - 1.8792683634503056 + - 1.9143716881466606 + - 1.4911924911291803 + - 1.5328653036715645 + - 1.3494855404308086 + - 1.5543420964715866 + - !!python/tuple + - 1.1339789277680974 + - 2.8245859330304004 + - 1.6872255299193648 + - 0.9867106912531324 + - 1.7897935767258504 + - 1.5659420770344377 + - 1.1636212391691187 + - 1.905249533096139 + - 1.9327028076411326 + - 1.5518348286706738 + - 1.496966737776717 + - 1.3332573001898564 + - 1.6078803315360417 + - !!python/tuple + - 1.0847566447632533 + - 2.8322742682971978 + - 1.7524467262580226 + - 0.9998313836011036 + - 1.7902966417336499 + - 1.6198658340393566 + - 1.184812535999352 + - 1.9008133509486194 + - 2.002342883271008 + - 1.5280730484977911 + - 1.4653535069141725 + - 1.3908513888467708 + - 1.5888030151240187 + - !!python/tuple + - 1.0571271255892285 + - 2.7882063773635566 + - 1.5937345019310374 + - 1.0600602616943084 + - 1.8910246213269586 + - 1.5698204525875055 + - 0.9937545773542915 + - 1.895415945396294 + - 1.9963730632055992 + - 1.4701939511370459 + - 1.5258989352015684 + - 1.3959557679613943 + - 1.6098720080396307 + - !!python/tuple + - 1.0607379079575057 + - 2.6341842139000007 + - 1.6779533791458325 + - 0.9464506817064857 + - 1.8233265558428107 + - 1.5936613403251754 + - 1.105009847033855 + - 1.9375136896428191 + - 2.0131807128632446 + - 1.5592821713691394 + - 1.5992401477314815 + - 1.4235391641795418 + - 1.554569877247153 + - !!python/tuple + - 1.0056586264669103 + - 2.8391231061182554 + - 1.7312624636164293 + - 0.9893342556285338 + - 1.8420882616533754 + - 1.5808335444428514 + - 1.2029226722149682 + - 1.900691958416834 + - 1.9904208855360208 + - 1.5107290619342053 + - 1.4875674507072199 + - 1.382912142314241 + - 1.5678138550552922 + - !!python/tuple + - 1.085554469208864 + - 2.6381916643691663 + - 1.7709573380443488 + - 0.9974079204223396 + - 1.7273241011039402 + - 1.7284525075762063 + - 1.1674167470520602 + - 1.8566565725978315 + - 2.0019022955546637 + - 1.500332068798263 + - 1.3274794568547041 + - 1.3589078424201648 + - 1.5249958248318587 + - !!python/tuple + - 1.022618351922747 + - 2.7662843742890537 + - 1.7145687228580233 + - 1.0144385647523948 + - 1.8273533911387656 + - 1.6958709743119638 + - 1.0860020539439996 + - 1.889001484047071 + - 2.0125407359034506 + - 1.4705980308379885 + - 1.4905254585457959 + - 1.4293217336528066 + - 1.5324278651741519 + - !!python/tuple + - 1.073836581602456 + - 2.6884405490576087 + - 1.7710531696801026 + - 1.023635387320405 + - 1.806517095103799 + - 1.6233899668872747 + - 1.1639254897665618 + - 1.9149797104904682 + - 2.020867306795281 + - 1.6010732851655165 + - 1.498996344174153 + - 1.4226990723195203 + - 1.6101745241212169 + - !!python/tuple + - 1.0508341462010624 + - 2.6613354508426292 + - 1.61885724923805 + - 1.014939287647069 + - 1.8522150535521709 + - 1.6652907483379005 + - 1.0000506301982797 + - 1.8949650191907141 + - 1.9350873155728279 + - 1.504197092028161 + - 1.5587009336102913 + - 1.387403592913175 + - 1.5382469900259481 + - !!python/tuple + - 1.0715398218559493 + - 2.437644556999372 + - 1.6578360269995602 + - 1.0459863579358943 + - 1.7576728953817145 + - 1.674658216711447 + - 0.9618022125232224 + - 1.8410940603941066 + - 1.9720436479463235 + - 1.5447759171893143 + - 1.3995856705009975 + - 1.364433690300983 + - 1.5541967353506547 + - !!python/tuple + - 1.0813020393380064 + - 2.668746019494896 + - 1.6706584484135036 + - 1.0605038721052147 + - 1.8872071797087053 + - 1.7639092013521056 + - 1.0446269637543872 + - 1.889007591534396 + - 2.0047178716375322 + - 1.433926237971547 + - 1.4656135363609444 + - 1.4204423285921095 + - 1.5208070683090376 + - !!python/tuple + - 1.01037615971907 + - 2.6409078408964666 + - 1.7193034997237513 + - 1.0057084883336778 + - 1.8313277602818467 + - 1.615624210711573 + - 1.1134810776281983 + - 1.8724518861299755 + - 2.006230217371902 + - 1.534857655518902 + - 1.4245644986258306 + - 1.3739143395396396 + - 1.5624484076555867 + - !!python/tuple + - 1.1242622222700414 + - 2.5207053074117107 + - 1.6643566714903002 + - 1.0641581412364411 + - 1.7990240934971509 + - 1.6072675854598102 + - 1.0379433588579912 + - 1.8770117683417944 + - 1.9582309331755958 + - 1.5945109776245499 + - 1.436630487813428 + - 1.3471754205179038 + - 1.6069731389250255 + - !!python/tuple + - 1.1166734063180042 + - 2.3293838552160366 + - 1.7734049104347858 + - 1.0533993093327179 + - 1.724258984564082 + - 1.7346935246958144 + - 1.069404414887976 + - 1.8515363293110505 + - 1.9676055118977733 + - 1.6379222273857443 + - 1.343588399384704 + - 1.355820927178241 + - 1.5445115327642585 + - !!python/tuple + - 1.0712525705290716 + - 2.5047982371411237 + - 1.6545436606771264 + - 0.9995745314792603 + - 1.7790652857755624 + - 1.6372820937942365 + - 1.0387747775745977 + - 1.837530315191013 + - 1.8914612912439166 + - 1.5031674808969795 + - 1.3768987379868811 + - 1.2983621921756843 + - 1.4998187388097146 + - !!python/tuple + - 1.066636736087745 + - 2.463182079346542 + - 1.8054483176793839 + - 1.0271017249135075 + - 1.8747089667437036 + - 1.78433930067207 + - 1.1726610995612703 + - 1.8903013924582024 + - 2.004833138277893 + - 1.5547601115583898 + - 1.3364174895140795 + - 1.3664332697383907 + - 1.5250365883668258 + - !!python/tuple + - 1.1042587511671047 + - 2.5310638551690916 + - 1.719454210287176 + - 1.0316026870263602 + - 1.8940339985461894 + - 1.733608386212545 + - 1.1256166878786336 + - 1.874041608875181 + - 1.865837336322716 + - 1.5438901986205886 + - 1.4195389124492748 + - 1.309743065518443 + - 1.5061920622779714 + - !!python/tuple + - 1.1042587511671047 + - 2.5310638551690916 + - 1.719454210287176 + - 1.0316026870263602 + - 1.8940339985461894 + - 1.733608386212545 + - 1.1256166878786336 + - 1.874041608875181 + - 1.865837336322716 + - 1.5438901986205886 + - 1.4195389124492748 + - 1.309743065518443 + - 1.5061920622779714 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1650.0 + - 1710.0 + - 2490.0 + - 2580.0 + - 3090.0 + - 3480.0 + - 3720.0 + - 3810.0 + - 3990.0 + - 4170.0 + - 4290.0 + - 4500.0 + - 4560.0 + - 4680.0 + - 4860.0 + - 4920.0 + - 5070.0 + - 5130.0 + - 5310.0 + - 5670.0 + - 5940.0 + - 6150.0 + - 6210.0 + - 6270.0 + - 6330.0 + - 6510.0 + - 6570.0 + - 6630.0 + - 6810.0 + - 7080.0 + - 7380.0 + - 7440.0 + - 8010.0 + - 8070.0 + - 8430.0 + - 8490.0 + - 8670.0 + - 8760.0 + - 9030.0 + - 9210.0 + - 9510.0 + - 9570.0 + - 9660.0 + - 9720.0 + - 9840.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 20.602861478351684 + - 19.550473774615597 + - 19.650943962691645 + - 19.535426428721642 + - 19.147682538393166 + - 19.42033912468433 + - 19.39025929263015 + - 19.37985153375054 + - 19.361284272387177 + - 19.257076394479608 + - 19.281037868713394 + - 19.297546199256303 + - 19.272654301258303 + - 19.184489476267498 + - 19.225953614577257 + - 19.144574530118653 + - 18.89404660423832 + - 19.148903348679635 + - 19.035512581024385 + - 18.866650611806197 + - 19.062644580038853 + - 19.08441618520984 + - 18.933016230488104 + - 18.996096859401263 + - 18.916205707935834 + - 18.950893879472588 + - 19.049795688185633 + - 18.951853725462033 + - 19.004308809821506 + - 18.936896112921602 + - 18.982187350624216 + - 19.11327531367916 + - 18.985251379853697 + - 18.98869528774911 + - 18.98753245495066 + - 19.08958356940782 + - 19.068906027838796 + - 19.025779003826404 + - 19.126482359159574 + - 18.980974032395384 + - 19.066191246055737 + - 19.151844069671 + - 19.104580557429163 + - 19.09422673701847 + - 19.017307600889556 + - 19.017307600889556 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2070.0 + - 2880.0 + - 3240.0 + - 3630.0 + - 3900.0 + - 4020.0 + - 4110.0 + - 4410.0 + - 4650.0 + - 4740.0 + - 4980.0 + - 5130.0 + - 5430.0 + - 5490.0 + - 5760.0 + - 5850.0 + - 5910.0 + - 6090.0 + - 6150.0 + - 6210.0 + - 6300.0 + - 6630.0 + - 6780.0 + - 6840.0 + - 6900.0 + - 7050.0 + - 7350.0 + - 7410.0 + - 7470.0 + - 7800.0 + - 8460.0 + - 8520.0 + - 8940.0 + - 9000.0 + - 9060.0 + - 9120.0 + - 9480.0 + - 9660.0 + - 9720.0 + - 9960.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 19.90206921883772 + - 20.000616508508397 + - 19.706828487777464 + - 19.59307375028523 + - 19.68657327645212 + - 19.53972135847216 + - 19.38280336844126 + - 19.3835747522605 + - 19.286076656086045 + - 19.29991685396895 + - 19.121876279310403 + - 18.98600711883577 + - 19.043761622025578 + - 18.87542257317631 + - 18.750366210132494 + - 18.762225993700078 + - 18.85271565825245 + - 18.74041816067535 + - 18.793957034251015 + - 18.61015291722325 + - 18.67758792964873 + - 18.610144022334254 + - 18.56810669420163 + - 18.602465343929 + - 18.5479840655088 + - 18.543313505678046 + - 18.513337501268573 + - 18.44943441908964 + - 18.473686726281734 + - 18.435403611153248 + - 18.44824860170343 + - 18.43529447004498 + - 18.408375318700628 + - 18.38821864400594 + - 18.40650365339571 + - 18.415671999611206 + - 18.421112380162327 + - 18.40148772461147 + - 18.383474325916158 + - 18.40591637455421 + - 18.40591637455421 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2100.0 + - 2190.0 + - 2580.0 + - 2730.0 + - 2790.0 + - 2850.0 + - 2910.0 + - 3150.0 + - 3270.0 + - 3690.0 + - 3810.0 + - 4050.0 + - 4350.0 + - 4650.0 + - 5190.0 + - 5490.0 + - 5730.0 + - 5850.0 + - 5940.0 + - 6000.0 + - 6210.0 + - 6270.0 + - 6330.0 + - 6390.0 + - 6510.0 + - 7050.0 + - 7200.0 + - 7380.0 + - 7530.0 + - 8040.0 + - 8160.0 + - 8370.0 + - 8490.0 + - 8610.0 + - 8700.0 + - 9000.0 + - 9060.0 + - 9150.0 + - 9330.0 + - 9390.0 + - 9510.0 + - 9660.0 + - 9780.0 + - 9930.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 19.689638292190743 + - 19.283541393427345 + - 18.823257891242278 + - 18.627823055436593 + - 19.323084215874484 + - 19.53343371231825 + - 18.732201041090573 + - 19.04187788945769 + - 18.89938254372162 + - 18.48578592852954 + - 18.674338450444665 + - 18.69486233373364 + - 18.424933532567962 + - 18.723334015274293 + - 18.648632671984384 + - 18.678126659056957 + - 18.501781575513 + - 18.76050772682638 + - 18.654880749287244 + - 18.585956003877907 + - 18.617416044405015 + - 18.664536721332826 + - 18.673311628309325 + - 18.7074722289078 + - 18.61978203562052 + - 18.670277830590603 + - 18.735823026169744 + - 18.708729137998965 + - 18.6555638590126 + - 18.68595069271583 + - 18.685454743302166 + - 18.662042538154218 + - 18.726822057326707 + - 18.70661961095457 + - 18.614012085292362 + - 18.711269358313714 + - 18.719769050438764 + - 18.686423421404115 + - 18.720914319929236 + - 18.700140094088354 + - 18.67636795883543 + - 18.678117173025143 + - 18.63821978868628 + - 18.648594332446383 + - 18.667009774070365 + - 18.667009774070365 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2490.0 + - 2550.0 + - 2700.0 + - 2910.0 + - 3030.0 + - 3240.0 + - 3360.0 + - 3510.0 + - 3750.0 + - 3840.0 + - 3900.0 + - 4110.0 + - 4230.0 + - 4950.0 + - 5130.0 + - 5190.0 + - 5280.0 + - 5460.0 + - 5610.0 + - 5730.0 + - 5880.0 + - 5940.0 + - 6270.0 + - 6330.0 + - 6480.0 + - 6570.0 + - 6630.0 + - 6780.0 + - 6870.0 + - 6990.0 + - 7500.0 + - 7590.0 + - 7800.0 + - 8280.0 + - 8520.0 + - 8820.0 + - 8880.0 + - 8940.0 + - 9120.0 + - 9660.0 + - 9780.0 + - 9870.0 + - 9930.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 20.86161040058471 + - 21.084793335487884 + - 20.58510519977571 + - 20.46361483202189 + - 20.417494278890246 + - 20.335569385763673 + - 20.283552991462 + - 20.359570948155955 + - 20.13508175414589 + - 20.1480619277304 + - 20.162547172612474 + - 20.079071597135222 + - 20.165619214156504 + - 20.108514707343804 + - 20.06979009595968 + - 20.099939738380378 + - 20.094596411991247 + - 20.103397935688395 + - 20.119461797587917 + - 20.09626266110564 + - 19.963433477260775 + - 20.030830132019517 + - 20.08534342364223 + - 20.024824550987958 + - 19.971858641018503 + - 19.951599144844906 + - 20.045260531718114 + - 20.01025900607469 + - 20.0027547471312 + - 19.975513484296815 + - 19.988344346104974 + - 20.02562781587976 + - 20.029261546113275 + - 20.027058427586017 + - 20.0073147500899 + - 20.017865373079243 + - 20.016272967892156 + - 19.994393250100348 + - 19.966402402133124 + - 19.96551894110104 + - 19.96869315508699 + - 19.97122665279551 + - 19.989816942025293 + - 19.992379261252257 + - 19.992379261252257 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2130.0 + - 2190.0 + - 2550.0 + - 2790.0 + - 2970.0 + - 3060.0 + - 3210.0 + - 4080.0 + - 4530.0 + - 4680.0 + - 4860.0 + - 4920.0 + - 5160.0 + - 5580.0 + - 6030.0 + - 6150.0 + - 6210.0 + - 6360.0 + - 6690.0 + - 6900.0 + - 6960.0 + - 7470.0 + - 7530.0 + - 7710.0 + - 8010.0 + - 8070.0 + - 8790.0 + - 8850.0 + - 9690.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 20.347011655327602 + - 19.576089039776193 + - 19.31068000538444 + - 19.434729686455476 + - 19.335356541781238 + - 19.09954249324733 + - 19.241870090848735 + - 19.221497093089937 + - 19.031539482554937 + - 18.56488731950947 + - 18.96486842777767 + - 18.888416919219136 + - 18.83144430828138 + - 18.617690951857213 + - 18.645811670513158 + - 18.45090570643557 + - 18.72308058661684 + - 18.456685157355388 + - 18.645022326923552 + - 18.438393444185714 + - 18.540873961130373 + - 18.552967513516432 + - 18.412077061237355 + - 18.455600959281814 + - 18.36559116406745 + - 18.323123375146384 + - 18.40574897634344 + - 18.317646826023225 + - 18.298139789586862 + - 18.298139789586862 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2040.0 + - 2100.0 + - 2520.0 + - 2790.0 + - 2910.0 + - 3000.0 + - 3120.0 + - 3180.0 + - 3300.0 + - 3750.0 + - 4230.0 + - 4290.0 + - 4920.0 + - 4980.0 + - 5220.0 + - 5340.0 + - 5490.0 + - 5910.0 + - 6090.0 + - 6360.0 + - 6420.0 + - 6540.0 + - 6630.0 + - 6840.0 + - 6960.0 + - 7110.0 + - 7170.0 + - 7620.0 + - 7680.0 + - 7980.0 + - 8040.0 + - 8220.0 + - 8280.0 + - 8700.0 + - 8850.0 + - 8940.0 + - 9120.0 + - 9660.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 19.081318081042955 + - 19.01949754633134 + - 18.737012735909936 + - 19.085882719703303 + - 19.048364591106022 + - 18.8969137399605 + - 18.927886670480493 + - 18.89241256224566 + - 18.563653671022173 + - 18.562885138930426 + - 18.53853158122392 + - 18.494475325241147 + - 18.39299665066912 + - 18.488245784561215 + - 18.50523215334026 + - 18.479054464960136 + - 18.415340717032493 + - 18.409289783578615 + - 18.42742453881577 + - 18.318458294123904 + - 18.331660553349927 + - 18.39043999528695 + - 18.40897081918293 + - 18.39610040181205 + - 18.382257146787868 + - 18.358338170698342 + - 18.29733301285573 + - 18.335712071779632 + - 18.310966334480856 + - 18.332259055510132 + - 18.320624434328266 + - 18.31146297467101 + - 18.27228590660628 + - 18.269997339030425 + - 18.292552057474865 + - 18.22872125916453 + - 18.20224427767926 + - 18.13861956966844 + - 18.196989155747747 + - 18.196989155747747 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1650.0 + - 2160.0 + - 2310.0 + - 2490.0 + - 3000.0 + - 3060.0 + - 3120.0 + - 3180.0 + - 3300.0 + - 3360.0 + - 3600.0 + - 3720.0 + - 3840.0 + - 4050.0 + - 4740.0 + - 4800.0 + - 4860.0 + - 5100.0 + - 5190.0 + - 5400.0 + - 5670.0 + - 5730.0 + - 6090.0 + - 6300.0 + - 6570.0 + - 6990.0 + - 7230.0 + - 7320.0 + - 7470.0 + - 7590.0 + - 7740.0 + - 7800.0 + - 7980.0 + - 8070.0 + - 8190.0 + - 8250.0 + - 8550.0 + - 8670.0 + - 8970.0 + - 9270.0 + - 9390.0 + - 9720.0 + - 9780.0 + - 9840.0 + - 9900.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 18.92216240677038 + - 18.761745488376402 + - 18.66873047150173 + - 18.668163182175146 + - 18.646139688972227 + - 18.558303351014114 + - 18.585459684710603 + - 18.555863507567103 + - 18.504594928361687 + - 18.454618252302417 + - 18.40251680167821 + - 18.351496030196166 + - 18.327279656159146 + - 18.321243953362515 + - 18.342791646155522 + - 18.3186302477342 + - 18.224581902558334 + - 18.243274597880216 + - 18.245859348719375 + - 18.220368125145196 + - 18.228756575908054 + - 18.173438689616773 + - 18.15090299548455 + - 18.109553299556396 + - 18.080457848732184 + - 18.06933668393295 + - 18.079542047609863 + - 18.053407188357276 + - 18.04764669056073 + - 17.975662680422342 + - 17.949164512190993 + - 18.03327328552479 + - 17.941266630748586 + - 17.922707643194844 + - 17.931923338166214 + - 17.899335525570763 + - 17.905548909844992 + - 17.909101923829027 + - 17.894981605588043 + - 17.878416130970326 + - 17.901409065085524 + - 17.874933702318266 + - 17.876894471773333 + - 17.86981138836087 + - 17.88581660160158 + - 17.88581660160158 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2580.0 + - 2940.0 + - 3120.0 + - 3270.0 + - 3360.0 + - 3600.0 + - 3900.0 + - 4410.0 + - 4530.0 + - 4620.0 + - 4830.0 + - 5010.0 + - 5370.0 + - 5700.0 + - 5940.0 + - 6240.0 + - 6420.0 + - 6480.0 + - 6660.0 + - 6900.0 + - 6990.0 + - 7050.0 + - 7170.0 + - 7290.0 + - 7440.0 + - 7530.0 + - 7590.0 + - 7800.0 + - 7950.0 + - 8160.0 + - 8250.0 + - 8370.0 + - 8460.0 + - 8520.0 + - 8820.0 + - 8970.0 + - 9060.0 + - 9180.0 + - 9330.0 + - 9570.0 + - 9630.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 19.28382734469478 + - 19.183144691108975 + - 19.01836571786082 + - 19.185279384015395 + - 18.93035106577565 + - 18.932839970207425 + - 18.6203550584881 + - 18.800068066494422 + - 18.632949841709223 + - 18.58707245537919 + - 18.580752238428815 + - 18.458897888044568 + - 18.571313038954514 + - 18.510476653982252 + - 18.554542187694434 + - 18.508122179947847 + - 18.59128988694886 + - 18.340447532338686 + - 18.482133246652936 + - 18.4686339053745 + - 18.38049282752962 + - 18.427337438292334 + - 18.34496974325293 + - 18.50961590675144 + - 18.466201567861194 + - 18.358361832908674 + - 18.36628926049115 + - 18.511153226756004 + - 18.39082290709463 + - 18.393748609782502 + - 18.380124608923587 + - 18.414933974391346 + - 18.42365502352284 + - 18.4656692854748 + - 18.36833583048088 + - 18.414557959229835 + - 18.377889723874375 + - 18.324720764373676 + - 18.32093436485276 + - 18.353832548537355 + - 18.340178871048558 + - 18.340178871048558 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2100.0 + - 2370.0 + - 2520.0 + - 2640.0 + - 3420.0 + - 3630.0 + - 3930.0 + - 4080.0 + - 4770.0 + - 4830.0 + - 5250.0 + - 5310.0 + - 5370.0 + - 5430.0 + - 5670.0 + - 5730.0 + - 5790.0 + - 5910.0 + - 6270.0 + - 6510.0 + - 6720.0 + - 6780.0 + - 6960.0 + - 7140.0 + - 7230.0 + - 7290.0 + - 7560.0 + - 7620.0 + - 7800.0 + - 8100.0 + - 8190.0 + - 8250.0 + - 8370.0 + - 8490.0 + - 8610.0 + - 8670.0 + - 8730.0 + - 8850.0 + - 8970.0 + - 9060.0 + - 9210.0 + - 9330.0 + - 9390.0 + - 9510.0 + - 9600.0 + - 9750.0 + - 9840.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 19.724360134093878 + - 19.667928602233065 + - 19.611754182353224 + - 19.39576665944722 + - 19.506918894732173 + - 19.533283476638235 + - 19.4659174566485 + - 19.507140261011585 + - 19.50594407109949 + - 19.520991733776096 + - 19.505332595321892 + - 19.54065665174508 + - 19.509932677815645 + - 19.49172784571806 + - 19.523397344309856 + - 19.51349045205799 + - 19.52009024885998 + - 19.558754450957984 + - 19.527894499875206 + - 19.533569694232707 + - 19.554511866105784 + - 19.536955727908065 + - 19.564850907387314 + - 19.554618693801814 + - 19.5675671918295 + - 19.529979376778723 + - 19.562810159855776 + - 19.51891462591078 + - 19.600945681424747 + - 19.544690609715616 + - 19.552143484067912 + - 19.574996713034185 + - 19.554632752541472 + - 19.596005696089716 + - 19.564554783006756 + - 19.62021693979 + - 19.53353324953705 + - 19.583799735325638 + - 19.600497190989316 + - 19.579742828431595 + - 19.61975608977043 + - 19.62382080893566 + - 19.542530606399954 + - 19.671766399273587 + - 19.60820925486516 + - 19.66019322616449 + - 19.617998421147014 + - 19.617998421147014 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2040.0 + - 2100.0 + - 2610.0 + - 3000.0 + - 3420.0 + - 3930.0 + - 4140.0 + - 4200.0 + - 4740.0 + - 4830.0 + - 5010.0 + - 5070.0 + - 5130.0 + - 5190.0 + - 5310.0 + - 5490.0 + - 5550.0 + - 5640.0 + - 5730.0 + - 6120.0 + - 6420.0 + - 6510.0 + - 6690.0 + - 6960.0 + - 7020.0 + - 7230.0 + - 7410.0 + - 7470.0 + - 7650.0 + - 7710.0 + - 7980.0 + - 8040.0 + - 8100.0 + - 8430.0 + - 8520.0 + - 8700.0 + - 8760.0 + - 8820.0 + - 9000.0 + - 9300.0 + - 9600.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 19.625281430322477 + - 19.02518844742391 + - 18.639106170307304 + - 18.259274115535987 + - 18.246450793869766 + - 18.1912122851349 + - 18.18482122175151 + - 18.1339958494245 + - 18.15769716256729 + - 18.156601406958668 + - 18.09514517722545 + - 18.132501913292007 + - 18.17403718806715 + - 18.126308937684165 + - 18.129540790641634 + - 18.107117926046886 + - 18.114055508674763 + - 18.118551837600904 + - 18.060072926910117 + - 18.0620611522465 + - 18.017014636118805 + - 18.026988263738307 + - 18.011039135852236 + - 18.037994902956978 + - 17.990279669736466 + - 17.981955987807936 + - 18.02827334752508 + - 17.989484966011954 + - 17.985161046058302 + - 17.91155843370221 + - 17.982824338599162 + - 17.941640154486464 + - 17.978654331810915 + - 17.9137594761836 + - 17.94298743837654 + - 17.9214907625456 + - 17.90334627211861 + - 17.848263141943743 + - 17.88301041647362 + - 18.597872402170136 + - 17.826732345174538 + - 17.826732345174538 +problem_name: FIXEDSAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.165 + - 0.171 + - 0.249 + - 0.258 + - 0.309 + - 0.348 + - 0.372 + - 0.381 + - 0.399 + - 0.417 + - 0.429 + - 0.45 + - 0.456 + - 0.468 + - 0.486 + - 0.492 + - 0.507 + - 0.513 + - 0.531 + - 0.567 + - 0.594 + - 0.615 + - 0.621 + - 0.627 + - 0.633 + - 0.651 + - 0.657 + - 0.663 + - 0.681 + - 0.708 + - 0.738 + - 0.744 + - 0.801 + - 0.807 + - 0.843 + - 0.849 + - 0.867 + - 0.876 + - 0.903 + - 0.921 + - 0.951 + - 0.957 + - 0.966 + - 0.972 + - 0.984 + - 1.0 + - !!python/tuple + - 1.0 + - 0.04033695605187988 + - 0.019164712741713556 + - 0.021186001340784563 + - 0.018861985840488826 + - 0.011061240963937456 + - 0.01654662583168342 + - 0.015941470981698885 + - 0.015732084647622185 + - 0.015358543058535797 + - 0.013262058523356872 + - 0.013744122463050365 + - 0.014076241880312923 + - 0.013575459403479978 + - 0.011801733694336125 + - 0.012635921343834518 + - 0.010998713145373646 + - 0.005958519133319777 + - 0.011085801581976716 + - 0.008804572987799276 + - 0.005407358553015399 + - 0.009350422471393748 + - 0.009788429985446379 + - 0.006742521460349612 + - 0.008011595983708583 + - 0.006404322455948339 + - 0.007102189226106946 + - 0.00909192471090431 + - 0.007121499688170198 + - 0.00817680640162887 + - 0.006820578068769911 + - 0.0077317604220547885 + - 0.010369026364045877 + - 0.0077934034573408665 + - 0.007862689002621022 + - 0.007839294792625585 + - 0.00989238893054654 + - 0.00947639210770142 + - 0.008608750037775892 + - 0.01063472956385243 + - 0.007707350531420106 + - 0.00942177533458551 + - 0.011144963866100198 + - 0.010194102717376485 + - 0.009985801533177241 + - 0.008438319878319762 + - 0.008438319878319762 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.207 + - 0.288 + - 0.324 + - 0.363 + - 0.39 + - 0.402 + - 0.411 + - 0.441 + - 0.465 + - 0.474 + - 0.498 + - 0.513 + - 0.543 + - 0.549 + - 0.576 + - 0.585 + - 0.591 + - 0.609 + - 0.615 + - 0.621 + - 0.63 + - 0.663 + - 0.678 + - 0.684 + - 0.69 + - 0.705 + - 0.735 + - 0.741 + - 0.747 + - 0.78 + - 0.846 + - 0.852 + - 0.894 + - 0.9 + - 0.906 + - 0.912 + - 0.948 + - 0.966 + - 0.972 + - 0.996 + - 1.0 + - !!python/tuple + - 1.0 + - 0.026238212617652433 + - 0.028220815784772146 + - 0.022310302544789103 + - 0.020021751499086627 + - 0.021902802285182696 + - 0.018948392492101365 + - 0.01579147052039648 + - 0.015806989445454733 + - 0.013845494259645132 + - 0.014123935404479294 + - 0.010542063103643418 + - 0.007808607634993834 + - 0.008970529604864226 + - 0.0055838354348490184 + - 0.003067914984193398 + - 0.0033065135751949516 + - 0.005127011085909508 + - 0.0028677772185957155 + - 0.003944887920167037 + - 0.00024706298995667803 + - 0.0016037402730793367 + - 0.0002468840399809493 + - -0.0005988352098482658 + - 9.240214426954646e-05 + - -0.0010036681333158027 + - -0.0010976318206340227 + - -0.001700697835726064 + - -0.002986318714190064 + - -0.0024984037120658535 + - -0.003268594607772747 + - -0.0030101753348377273 + - -0.0032707903404777137 + - -0.003812357692454994 + - -0.004217875563335458 + - -0.003850012401922089 + - -0.003665560933953393 + - -0.0035561097684567613 + - -0.00395092432275636 + - -0.0043133231408594664 + - -0.0038618274492463953 + - -0.0038618274492463953 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.219 + - 0.258 + - 0.273 + - 0.279 + - 0.285 + - 0.291 + - 0.315 + - 0.327 + - 0.369 + - 0.381 + - 0.405 + - 0.435 + - 0.465 + - 0.519 + - 0.549 + - 0.573 + - 0.585 + - 0.594 + - 0.6 + - 0.621 + - 0.627 + - 0.633 + - 0.639 + - 0.651 + - 0.705 + - 0.72 + - 0.738 + - 0.753 + - 0.804 + - 0.816 + - 0.837 + - 0.849 + - 0.861 + - 0.87 + - 0.9 + - 0.906 + - 0.915 + - 0.933 + - 0.939 + - 0.951 + - 0.966 + - 0.978 + - 0.993 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.021964465167347947 + - 0.013794489104724928 + - 0.004534371122235102 + - 0.0006025559933897553 + - 0.014590023160329478 + - 0.01882189578965393 + - 0.0027024628059129953 + - 0.008932632122674923 + - 0.006065869122898458 + - -0.0022549884261022675 + - 0.0015383663010198473 + - 0.001951271781691039 + - -0.0034792347078967402 + - 0.00252407338977547 + - 0.0010212099392473088 + - 0.0016145785887198825 + - -0.0019331833264844835 + - 0.003271944980187053 + - 0.0011469105839880813 + - -0.00023973758257364456 + - 0.0003931847047383123 + - 0.0013411722508808554 + - 0.0015177083932844022 + - 0.002204961337161175 + - 0.00044078440730663373 + - 0.0014566735643648228 + - 0.0027753309600065472 + - 0.0022302482015006436 + - 0.0011606535850336112 + - 0.0017719847838935164 + - 0.0017620071286830166 + - 0.0012909935449437224 + - 0.00259424683892128 + - 0.0021878081200603357 + - 0.0003247028607419496 + - 0.0022813530959937735 + - 0.002452352385603658 + - 0.0017814952777661622 + - 0.002475393251837555 + - 0.0020574513065620467 + - 0.0015791965438065893 + - 0.0016143877459602162 + - 0.0008117205106221127 + - 0.001020438613219762 + - 0.0013909258484306592 + - 0.0013909258484306592 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.249 + - 0.255 + - 0.27 + - 0.291 + - 0.303 + - 0.324 + - 0.336 + - 0.351 + - 0.375 + - 0.384 + - 0.39 + - 0.411 + - 0.423 + - 0.495 + - 0.513 + - 0.519 + - 0.528 + - 0.546 + - 0.561 + - 0.573 + - 0.588 + - 0.594 + - 0.627 + - 0.633 + - 0.648 + - 0.657 + - 0.663 + - 0.678 + - 0.687 + - 0.699 + - 0.75 + - 0.759 + - 0.78 + - 0.828 + - 0.852 + - 0.882 + - 0.888 + - 0.894 + - 0.912 + - 0.966 + - 0.978 + - 0.987 + - 0.993 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.04554254247056606 + - 0.050032601964488096 + - 0.03997973005146296 + - 0.03753555133596311 + - 0.036607684572567814 + - 0.03495949563585049 + - 0.03391301461715097 + - 0.03544236608082955 + - 0.030926026884532602 + - 0.031187165809249972 + - 0.03147858419808315 + - 0.029799198180756842 + - 0.03154038842745435 + - 0.030391543274614453 + - 0.029612470228240324 + - 0.03021902954357573 + - 0.030111530942067293 + - 0.030288602567433737 + - 0.030611780034663885 + - 0.03014505302859495 + - 0.02747275669800274 + - 0.02882866229037861 + - 0.02992537661892567 + - 0.028707840256476387 + - 0.027642256604143173 + - 0.02723467014070768 + - 0.029118977287785935 + - 0.028414806368153616 + - 0.028263833494135755 + - 0.02771578580908755 + - 0.02797392083586241 + - 0.028724000574267383 + - 0.028797105020807765 + - 0.02875278203856969 + - 0.028355572965999554 + - 0.028567833481977806 + - 0.028535797009155414 + - 0.028095614453808766 + - 0.027532486396044453 + - 0.02751471266887151 + - 0.027578572433281993 + - 0.02762954208041885 + - 0.028003546950850132 + - 0.028055096437716056 + - 0.028055096437716056 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.213 + - 0.219 + - 0.255 + - 0.279 + - 0.297 + - 0.306 + - 0.321 + - 0.408 + - 0.453 + - 0.468 + - 0.486 + - 0.492 + - 0.516 + - 0.558 + - 0.603 + - 0.615 + - 0.621 + - 0.636 + - 0.669 + - 0.69 + - 0.696 + - 0.747 + - 0.753 + - 0.771 + - 0.801 + - 0.807 + - 0.879 + - 0.885 + - 0.969 + - 1.0 + - !!python/tuple + - 1.0 + - 0.03518969455813738 + - 0.019680048130476864 + - 0.014340471629431343 + - 0.016836139358026483 + - 0.01483692139864698 + - 0.010092745470145919 + - 0.012956133663936588 + - 0.01254626374244716 + - 0.008724641031931902 + - -0.0006636035305413454 + - 0.007383333271988989 + - 0.005845259485223735 + - 0.0046990678521332575 + - 0.00039871537318402823 + - 0.0009644562074096102 + - -0.00295671892548426 + - 0.0025189748379981307 + - -0.002840446243240696 + - 0.0009485759624436873 + - -0.0032084442732568585 + - -0.0011467112906296975 + - -0.0009034096702355374 + - -0.0037378849545268203 + - -0.00286225845686561 + - -0.004673101816030002 + - -0.005527481201773061 + - -0.003865195215361046 + - -0.005637660017169675 + - -0.006030108275757951 + - -0.006030108275757951 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.204 + - 0.21 + - 0.252 + - 0.279 + - 0.291 + - 0.3 + - 0.312 + - 0.318 + - 0.33 + - 0.375 + - 0.423 + - 0.429 + - 0.492 + - 0.498 + - 0.522 + - 0.534 + - 0.549 + - 0.591 + - 0.609 + - 0.636 + - 0.642 + - 0.654 + - 0.663 + - 0.684 + - 0.696 + - 0.711 + - 0.717 + - 0.762 + - 0.768 + - 0.798 + - 0.804 + - 0.822 + - 0.828 + - 0.87 + - 0.885 + - 0.894 + - 0.912 + - 0.966 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.009726101420613614 + - 0.008482377840575359 + - 0.0027992658881688566 + - 0.009817934154877596 + - 0.009063133481719086 + - 0.006016201007497674 + - 0.006639323473362815 + - 0.005925644999077434 + - -0.0006884224312559211 + - -0.0007038839844272305 + - -0.0011938359739837297 + - -0.002080172604192188 + - -0.004121750229248682 + - -0.0022055003237368654 + - -0.0018637635935666323 + - -0.002390413976989083 + - -0.0036722257736660187 + - -0.0037939602208515158 + - -0.0034291199163816806 + - -0.0056213346648256515 + - -0.005355727756283365 + - -0.004173185769230142 + - -0.003800377239758855 + - -0.004059308056901895 + - -0.004337810706197521 + - -0.004819019655807681 + - -0.006046339245758705 + - -0.005274218124742813 + - -0.0057720600979235745 + - -0.005343686914954133 + - -0.005577755623291923 + - -0.005762068545469849 + - -0.006550244247543018 + - -0.0065962863187072635 + - -0.006142523903009444 + - -0.007426690553485117 + - -0.007959362203044313 + - -0.009239382668658947 + - -0.008065086281502822 + - -0.008065086281502822 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.165 + - 0.216 + - 0.231 + - 0.249 + - 0.3 + - 0.306 + - 0.312 + - 0.318 + - 0.33 + - 0.336 + - 0.36 + - 0.372 + - 0.384 + - 0.405 + - 0.474 + - 0.48 + - 0.486 + - 0.51 + - 0.519 + - 0.54 + - 0.567 + - 0.573 + - 0.609 + - 0.63 + - 0.657 + - 0.699 + - 0.723 + - 0.732 + - 0.747 + - 0.759 + - 0.774 + - 0.78 + - 0.798 + - 0.807 + - 0.819 + - 0.825 + - 0.855 + - 0.867 + - 0.897 + - 0.927 + - 0.939 + - 0.972 + - 0.978 + - 0.984 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.006524161063528651 + - 0.0032968466286993035 + - 0.0014255433421078115 + - 0.0014141304496851572 + - 0.0009710553786095123 + - -0.0007960617324333571 + - -0.00024972267659589353 + - -0.0008451472157732317 + - -0.0018765834718697952 + - -0.002882028843004212 + - -0.003930221049652185 + - -0.004956671837565535 + - -0.005443863925977069 + - -0.005565291958349972 + - -0.0051317891789402015 + - -0.005617875251852376 + - -0.0075099673391248465 + - -0.007133902233011698 + - -0.007081901460417585 + - -0.007594741344302905 + - -0.007425980040920057 + - -0.00853888144009568 + - -0.008992261119121814 + - -0.009824146383349327 + - -0.010409497164133126 + - -0.010633236006943575 + - -0.010427921518690554 + - -0.010953710253211412 + - -0.011069601630983313 + - -0.012517796979219344 + - -0.013050894869926485 + - -0.011358769993114616 + - -0.013209786756386059 + - -0.013583161890553079 + - -0.013397757846479353 + - -0.014053368981774441 + - -0.013928366301520273 + - -0.013856885728070619 + - -0.014140962416114157 + - -0.014474231474570064 + - -0.014011652907970167 + - -0.014544291991687422 + - -0.014504844658893202 + - -0.014647344200518882 + - -0.014325346644142652 + - -0.014325346644142652 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.258 + - 0.294 + - 0.312 + - 0.327 + - 0.336 + - 0.36 + - 0.39 + - 0.441 + - 0.453 + - 0.462 + - 0.483 + - 0.501 + - 0.537 + - 0.57 + - 0.594 + - 0.624 + - 0.642 + - 0.648 + - 0.666 + - 0.69 + - 0.699 + - 0.705 + - 0.717 + - 0.729 + - 0.744 + - 0.753 + - 0.759 + - 0.78 + - 0.795 + - 0.816 + - 0.825 + - 0.837 + - 0.846 + - 0.852 + - 0.882 + - 0.897 + - 0.906 + - 0.918 + - 0.933 + - 0.957 + - 0.963 + - 1.0 + - !!python/tuple + - 1.0 + - 0.013800241955872388 + - 0.011774678913597939 + - 0.008459607384708053 + - 0.011817625289203394 + - 0.006688902897957237 + - 0.006738975404523232 + - 0.00045231264878231895 + - 0.004067831452359928 + - 0.0007056981775657883 + - -0.00021727648506629838 + - -0.00034442845631350963 + - -0.002795929880720608 + - -0.0005343290292806788 + - -0.0017582531973139935 + - -0.0008717299150345432 + - -0.00180562119386785 + - -0.0001324289644994402 + - -0.005178948745609955 + - -0.002328474147335592 + - -0.0026000578394096826 + - -0.004373305796533395 + - -0.0034308722301612036 + - -0.0050879695851386575 + - -0.0017755699615964332 + - -0.0026489923161821844 + - -0.0048185436125466104 + - -0.004659057308208331 + - -0.0017446417085707625 + - -0.004165482237604146 + - -0.004106622096098387 + - -0.004380713726035556 + - -0.003680408740962582 + - -0.0035049561264209857 + - -0.0026597009287538257 + - -0.0046178838151885795 + - -0.0036879735238458744 + - -0.00442567579644382 + - -0.005495344458573565 + - -0.005571520350444712 + - -0.004909665078894104 + - -0.005184353751942158 + - -0.005184353751942158 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.237 + - 0.252 + - 0.264 + - 0.342 + - 0.363 + - 0.393 + - 0.408 + - 0.477 + - 0.483 + - 0.525 + - 0.531 + - 0.537 + - 0.543 + - 0.567 + - 0.573 + - 0.579 + - 0.591 + - 0.627 + - 0.651 + - 0.672 + - 0.678 + - 0.696 + - 0.714 + - 0.723 + - 0.729 + - 0.756 + - 0.762 + - 0.78 + - 0.81 + - 0.819 + - 0.825 + - 0.837 + - 0.849 + - 0.861 + - 0.867 + - 0.873 + - 0.885 + - 0.897 + - 0.906 + - 0.921 + - 0.933 + - 0.939 + - 0.951 + - 0.96 + - 0.975 + - 0.984 + - 1.0 + - !!python/tuple + - 1.0 + - 0.02266300932777521 + - 0.021527703281647027 + - 0.020397569889474946 + - 0.016052269796465846 + - 0.01828846294236379 + - 0.018818873304347585 + - 0.017463584031205473 + - 0.01829291645385175 + - 0.018268851155697683 + - 0.01857158443004839 + - 0.018256549307343148 + - 0.01896720899543976 + - 0.01834909511100353 + - 0.017982844979780557 + - 0.018619981205637324 + - 0.018420671452720718 + - 0.018553448093110294 + - 0.019331305807815866 + - 0.018710456295278934 + - 0.018824631513540153 + - 0.019245952246161813 + - 0.018892752728351576 + - 0.01945395609952239 + - 0.01924810143696343 + - 0.01950860310357368 + - 0.018752400457982755 + - 0.01941289974441775 + - 0.018529796567125077 + - 0.02018012130977048 + - 0.019048365340531916 + - 0.019198304444330568 + - 0.019658072381925375 + - 0.01924838427479556 + - 0.0200807372414365 + - 0.01944799858271277 + - 0.02056782611623462 + - 0.018823898308504543 + - 0.0198351741564499 + - 0.020171098448150633 + - 0.0197535561182094 + - 0.020558554600889824 + - 0.020640329808684625 + - 0.019004909762718136 + - 0.021604913203834918 + - 0.02032625200251394 + - 0.021372080725779008 + - 0.02052319330996872 + - 0.02052319330996872 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.204 + - 0.21 + - 0.261 + - 0.3 + - 0.342 + - 0.393 + - 0.414 + - 0.42 + - 0.474 + - 0.483 + - 0.501 + - 0.507 + - 0.513 + - 0.519 + - 0.531 + - 0.549 + - 0.555 + - 0.564 + - 0.573 + - 0.612 + - 0.642 + - 0.651 + - 0.669 + - 0.696 + - 0.702 + - 0.723 + - 0.741 + - 0.747 + - 0.765 + - 0.771 + - 0.798 + - 0.804 + - 0.81 + - 0.843 + - 0.852 + - 0.87 + - 0.876 + - 0.882 + - 0.9 + - 0.93 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.02066971501650868 + - 0.008596869051521905 + - 0.000829552995056694 + - -0.0068120192620774005 + - -0.007070002594073702 + - -0.00818130705237687 + - -0.008309884332863378 + - -0.009332404023484035 + - -0.008855574080633073 + - -0.008877618812124927 + - -0.010114013198165236 + - -0.009362459467095477 + - -0.008526840673401868 + - -0.009487051559836271 + - -0.009422032197755824 + - -0.009873141939180532 + - -0.009733569624851557 + - -0.009643111165779072 + - -0.010819606977411377 + - -0.010779607279174784 + - -0.011685866252312741 + - -0.01148521389777132 + - -0.011806083112595905 + - -0.011263779114052715 + - -0.012223728117409129 + - -0.012391186382458825 + - -0.011459360206673541 + - -0.012239716199135225 + - -0.012326706084124764 + - -0.013807464944699395 + - -0.012373716647526402 + - -0.013202272096691354 + - -0.012457610062483998 + - -0.013763183728958722 + - -0.013175167045741685 + - -0.013607643451002514 + - -0.013972679610865797 + - -0.015080858117900437 + - -0.014381802296457469 + - 0.0 + - -0.015514020978166695 + - -0.015514020978166695 +solver_name: NELDMD diff --git a/test/expected_results/FIXEDSAN1_RNDSRCH.yaml b/test/expected_results/FIXEDSAN1_RNDSRCH.yaml new file mode 100644 index 000000000..790d47a31 --- /dev/null +++ b/test/expected_results/FIXEDSAN1_RNDSRCH.yaml @@ -0,0 +1,1949 @@ +all_est_objectives: +- - 68.30388079811371 + - 34.16907654394531 + - 32.49814674727327 + - 26.186915923980006 + - 26.24209182283739 + - 22.34589146956033 + - 22.921536173995154 + - 22.921536173995154 +- - 68.00555254312637 + - 30.207293927655346 + - 30.87266366632 + - 29.46132079967327 + - 29.23362968301862 + - 23.241391013872466 + - 23.20337358204479 + - 20.12882499342447 + - 20.12882499342447 +- - 67.15565001348712 + - 38.7426958119958 + - 40.783956697354995 + - 26.21494853152009 + - 20.987249395699855 + - 20.987249395699855 +- - 67.71943959541662 + - 40.67170010977999 + - 35.3658363468242 + - 36.70601338779254 + - 23.19887889257823 + - 22.240731074538086 + - 22.240731074538086 +- - 64.758578697695 + - 32.28970656838881 + - 30.490443287534802 + - 31.76913788046797 + - 26.893386422180843 + - 27.27656491413306 + - 25.008259340809563 + - 22.8049995425414 + - 21.78643710212243 + - 21.78643710212243 +- - 67.09349230810763 + - 35.55377282243274 + - 36.94819975487169 + - 36.095885312605695 + - 26.255845378470458 + - 25.143196532202595 + - 25.82288228271916 + - 23.540482530320123 + - 24.643657489293094 + - 25.082237799779314 + - 22.09945094965493 + - 22.804990390508216 + - 21.406929129892525 + - 21.406929129892525 +- - 64.04874061726181 + - 45.88206626427629 + - 34.99668432011886 + - 32.77703849675279 + - 31.960330359263857 + - 27.160993722224706 + - 24.769125081044436 + - 24.1909670507419 + - 22.113256791639675 + - 20.516039430734164 + - 20.516039430734164 +- - 65.76447222250123 + - 56.843736599256744 + - 34.997889727136005 + - 28.572253273194047 + - 28.234083713690904 + - 26.91176481048815 + - 30.69666152260831 + - 24.793905875709367 + - 23.140635787267 + - 22.494021012517784 + - 22.76601561608304 + - 22.76601561608304 +- - 72.64729923751366 + - 48.872226153540026 + - 34.24975510019724 + - 27.40299933447764 + - 26.845525741661906 + - 28.4597033452617 + - 26.805308496563967 + - 24.813618944153653 + - 20.88555564875412 + - 20.88555564875412 +- - 65.3640980466472 + - 31.934628573309368 + - 24.836088925815517 + - 22.59326025639513 + - 22.486501737428906 + - 21.628126798361173 + - 21.628126798361173 +all_intermediate_budgets: +- - 0 + - 20 + - 40 + - 150 + - 280 + - 500 + - 2070 + - 10000 +- - 0 + - 20 + - 140 + - 150 + - 220 + - 270 + - 560 + - 660 + - 10000 +- - 0 + - 20 + - 40 + - 50 + - 300 + - 10000 +- - 0 + - 20 + - 30 + - 40 + - 60 + - 1460 + - 10000 +- - 0 + - 20 + - 40 + - 80 + - 100 + - 450 + - 620 + - 730 + - 5290 + - 10000 +- - 0 + - 20 + - 50 + - 60 + - 80 + - 100 + - 440 + - 900 + - 3740 + - 4740 + - 5310 + - 5660 + - 7430 + - 10000 +- - 0 + - 20 + - 30 + - 50 + - 170 + - 230 + - 490 + - 640 + - 4530 + - 6880 + - 10000 +- - 0 + - 20 + - 30 + - 40 + - 50 + - 100 + - 240 + - 250 + - 700 + - 2620 + - 9670 + - 10000 +- - 0 + - 20 + - 30 + - 50 + - 640 + - 980 + - 1010 + - 4050 + - 7180 + - 10000 +- - 0 + - 20 + - 30 + - 620 + - 3630 + - 3930 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 0.1960868262262368 + - 1.7796135691996542 + - 1.282065190484172 + - 0.9056949268349317 + - 0.5562335504646729 + - 1.143675436199959 + - 0.29529862159736137 + - 0.22487410478955897 + - 0.1948749140929799 + - 0.9412745736035046 + - 0.449697122817846 + - 1.40601584063612 + - 0.557898739560154 + - !!python/tuple + - 3.3226997394609703 + - 1.9364777802467783 + - 0.464973268499735 + - 0.7357740288917657 + - 0.5999184021770918 + - 0.6531938866020958 + - 0.45330302474652984 + - 1.2779851104193691 + - 5.412685346242693 + - 1.595542036265024 + - 3.173189622641203 + - 9.790103973990748 + - 1.1585631268428283 + - !!python/tuple + - 1.8918325515677208 + - 0.2597923869447275 + - 0.8319503523528583 + - 2.9415236941968086 + - 2.3765492760398743 + - 1.3047095191807443 + - 0.5100204429133709 + - 0.40543767572837586 + - 0.6533535810007305 + - 1.589660081945687 + - 1.6209828815823202 + - 0.9971355126498859 + - 2.392981828984503 + - !!python/tuple + - 0.8891474417413014 + - 0.9853352375975648 + - 1.1588468993180858 + - 0.3898780587485494 + - 2.263150594087709 + - 3.8363424654332086 + - 1.3833544581818535 + - 2.42531634316093 + - 5.19516315002669 + - 3.616905007896433 + - 0.5476505650315783 + - 6.332698095344877 + - 1.1494393764787216 + - !!python/tuple + - 1.088547037194216 + - 0.7628873832417162 + - 0.5615212071905158 + - 1.5805579060742112 + - 0.8568821670538687 + - 1.3350313139313676 + - 0.996618633462476 + - 2.3942902592925117 + - 2.600745939674508 + - 2.5092289477097554 + - 0.7644326210979902 + - 1.947353619917127 + - 0.6068126368925623 + - !!python/tuple + - 0.9705074213645866 + - 1.606254802097452 + - 1.1036705986023219 + - 1.113798167160827 + - 1.3245630397696917 + - 2.756338244770717 + - 0.5457806548187588 + - 1.0357479550973214 + - 3.2465784290662665 + - 1.9544359703272818 + - 0.382861746866544 + - 0.5013734093103732 + - 1.4329924509318634 + - !!python/tuple + - 0.9705074213645866 + - 1.606254802097452 + - 1.1036705986023219 + - 1.113798167160827 + - 1.3245630397696917 + - 2.756338244770717 + - 0.5457806548187588 + - 1.0357479550973214 + - 3.2465784290662665 + - 1.9544359703272818 + - 0.382861746866544 + - 0.5013734093103732 + - 1.4329924509318634 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 0.7751772441855151 + - 0.5217046225116457 + - 0.4107329784631801 + - 0.9965720707775172 + - 0.5333369471741016 + - 6.452003025605502 + - 2.5855155692925162 + - 0.27253616504913164 + - 2.200219673772379 + - 1.1305832483582257 + - 0.3333347373565818 + - 0.47340968558107493 + - 0.9520202041701443 + - !!python/tuple + - 0.4332455021748569 + - 4.10854281608518 + - 0.7811953114147323 + - 3.035803152498639 + - 1.2274106484326013 + - 0.7806172525391532 + - 1.3164075228291978 + - 0.14013875854118027 + - 2.3463572362868814 + - 2.0604876534934946 + - 0.2623102864567002 + - 2.561588241476667 + - 1.879116705147793 + - !!python/tuple + - 0.26081081603696077 + - 0.5995655306906057 + - 0.20026705068361683 + - 1.1998980471532668 + - 0.8290306429717449 + - 1.9251606226697626 + - 0.6227797942067801 + - 1.4063817500187927 + - 0.5342769627380625 + - 0.35429577092935943 + - 1.4940605407147047 + - 0.510950009437429 + - 1.2205583963562716 + - !!python/tuple + - 1.6347551356078875 + - 10.473183975219085 + - 4.113486148548108 + - 0.4835484381718076 + - 1.8543999988578022 + - 1.0581598562411845 + - 1.0059689440881627 + - 0.4159560460890282 + - 3.606918101465911 + - 0.36238604092196464 + - 1.6231947554488795 + - 1.1809037790646033 + - 0.7348098800729296 + - !!python/tuple + - 2.6467261336898322 + - 1.6934697755237704 + - 5.029686183658338 + - 1.2175042220916146 + - 1.5987368537505082 + - 0.7985402767156081 + - 1.8256154055393072 + - 1.2654698769663544 + - 0.9242448981385025 + - 2.8061006255959753 + - 1.2408101775179443 + - 0.4413268565714861 + - 1.346761693491472 + - !!python/tuple + - 0.7247416623322506 + - 0.7527355029361963 + - 3.324657520224106 + - 1.3307423736429849 + - 1.0114636541022988 + - 1.0804851238887183 + - 2.1158906379371905 + - 1.0969684738022811 + - 3.0414931576677557 + - 2.720815663322172 + - 1.8439755453153246 + - 3.8991779680523426 + - 4.472867813588693 + - !!python/tuple + - 1.7489054906238037 + - 2.7680503607059572 + - 0.9130362187124103 + - 0.5124144711747488 + - 1.0308750094359473 + - 2.248438243392407 + - 1.5483102061029619 + - 1.2111762107528863 + - 2.077914657680098 + - 1.12552399234821 + - 0.9142525502642843 + - 2.3911605047328286 + - 1.013134783180605 + - !!python/tuple + - 1.7489054906238037 + - 2.7680503607059572 + - 0.9130362187124103 + - 0.5124144711747488 + - 1.0308750094359473 + - 2.248438243392407 + - 1.5483102061029619 + - 1.2111762107528863 + - 2.077914657680098 + - 1.12552399234821 + - 0.9142525502642843 + - 2.3911605047328286 + - 1.013134783180605 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 0.29360035955537117 + - 0.2130231182497829 + - 0.20043495403197642 + - 0.11180421103285271 + - 3.2804801697178894 + - 2.5158079488849325 + - 0.7954848263033159 + - 0.5631992923544212 + - 5.095633150539393 + - 2.2320835160697015 + - 0.4315395084767616 + - 0.993149376419048 + - 1.0132092179402108 + - !!python/tuple + - 1.4495535717259753 + - 3.221139876599047 + - 15.439307300953633 + - 0.40188863162155913 + - 0.9987821371130792 + - 0.21501725329800797 + - 4.7356245268973645 + - 3.9353164689929625 + - 0.31736555248299053 + - 0.9939416857491911 + - 0.6000720150990749 + - 2.6499232687273184 + - 0.5108740548751163 + - !!python/tuple + - 4.279580377488005 + - 1.327934529801055 + - 2.3134279656751717 + - 1.0566676115615157 + - 0.8704266324829311 + - 3.538208007095113 + - 2.505105245893458 + - 0.7296117911890161 + - 0.4031329834179283 + - 0.501584480640956 + - 2.505487875530965 + - 3.106673606007229 + - 2.3920037688119495 + - !!python/tuple + - 1.1644093438743712 + - 3.757123616767149 + - 2.52911189645091 + - 1.0251641359822403 + - 1.793201682781496 + - 0.7245371834794012 + - 0.6914259983893175 + - 1.5176820768448778 + - 1.2563039716794584 + - 0.7966601547750229 + - 0.5049051177816402 + - 1.040946544269545 + - 1.086338372038444 + - !!python/tuple + - 1.1644093438743712 + - 3.757123616767149 + - 2.52911189645091 + - 1.0251641359822403 + - 1.793201682781496 + - 0.7245371834794012 + - 0.6914259983893175 + - 1.5176820768448778 + - 1.2563039716794584 + - 0.7966601547750229 + - 0.5049051177816402 + - 1.040946544269545 + - 1.086338372038444 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 0.17508472216749252 + - 8.547621076504065 + - 1.0125980758658424 + - 1.85994704497255 + - 0.2975778085022722 + - 0.7908803393131751 + - 1.941915053575107 + - 0.6543353587900118 + - 0.3704952942449984 + - 0.5117489454283721 + - 7.184644691730161 + - 0.31054470162340975 + - 1.2489076651916537 + - !!python/tuple + - 0.918170777367521 + - 1.3097948533313313 + - 1.340992094243764 + - 0.11915370968433643 + - 0.5945747823377834 + - 0.136905935170129 + - 0.7710338802756364 + - 1.2896768036850625 + - 1.756984634103518 + - 1.0628823584884428 + - 1.2724587214707253 + - 0.5339166373874368 + - 4.511365745871041 + - !!python/tuple + - 2.541899018622927 + - 0.3333870838465204 + - 2.5632960695687013 + - 13.176705675677333 + - 1.3407734262783733 + - 5.538925285840035 + - 1.1609697249601687 + - 0.5416162280425767 + - 5.468309722933678 + - 1.5714442044992383 + - 0.6131265129179446 + - 1.6188850111118278 + - 2.498103384229155 + - !!python/tuple + - 1.9993795064420339 + - 1.3360129157038265 + - 0.6505396792586321 + - 1.9768917174067064 + - 0.6585265915141895 + - 0.9484552893970917 + - 0.5785474194125769 + - 1.0427685020712512 + - 0.7839766846245362 + - 0.721114895986973 + - 1.462009994274223 + - 0.6455524522870727 + - 2.2437076333578685 + - !!python/tuple + - 0.6018065938183127 + - 1.1389992546772403 + - 0.6522762615437921 + - 0.7353695883158387 + - 1.227765604994862 + - 3.3398478988643534 + - 2.1730562879240476 + - 1.7072014646949398 + - 3.8025776835743312 + - 0.880036953226712 + - 1.5284212246760482 + - 1.284861281315746 + - 0.8376152346865527 + - !!python/tuple + - 0.6018065938183127 + - 1.1389992546772403 + - 0.6522762615437921 + - 0.7353695883158387 + - 1.227765604994862 + - 3.3398478988643534 + - 2.1730562879240476 + - 1.7072014646949398 + - 3.8025776835743312 + - 0.880036953226712 + - 1.5284212246760482 + - 1.284861281315746 + - 0.8376152346865527 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 3.4528226147962853 + - 0.38216210341942375 + - 1.0468045557450762 + - 5.2195317074515755 + - 0.25180847320436694 + - 0.4704107693122268 + - 1.319478262152733 + - 0.9461870795003202 + - 0.41749210598824515 + - 1.078966868693468 + - 0.43113934303827933 + - 0.40728442606166204 + - 1.0458804284695542 + - !!python/tuple + - 2.0791883189048863 + - 0.4926110138993005 + - 2.3328540115212637 + - 0.789079808952555 + - 0.8117928935922794 + - 1.705034880658747 + - 2.0391338196946425 + - 2.5831366997274863 + - 3.293192518438951 + - 0.9511095024712266 + - 0.10030278246411245 + - 0.9665025125765994 + - 2.4224660805564406 + - !!python/tuple + - 0.8139568466303583 + - 1.5582433606067658 + - 3.0561239480996005 + - 2.566449834571651 + - 0.6618946362895177 + - 7.984886298104498 + - 8.541954476673583 + - 0.9666066350300742 + - 2.188757831291287 + - 1.9635736427516781 + - 3.5779192974766616 + - 1.6383084046250977 + - 0.8169224005183288 + - !!python/tuple + - 3.6814510898559365 + - 1.0059501670228672 + - 0.7306016896620006 + - 2.265866487382744 + - 0.9286705000093992 + - 3.9308534921463205 + - 2.4328384560567065 + - 0.8207472857930803 + - 2.128155388902591 + - 5.505473436328707 + - 2.6625839363648014 + - 0.6176372822284746 + - 1.701586125136389 + - !!python/tuple + - 0.8441595656757271 + - 3.437873481281108 + - 0.24077510024046722 + - 0.716701369052779 + - 3.243842192022816 + - 1.2686227000062547 + - 0.8899520258025329 + - 2.1216819609769066 + - 3.226405466573146 + - 0.2619591069883925 + - 2.3113204902818985 + - 0.7340305268345818 + - 1.5066465986068382 + - !!python/tuple + - 1.2595689669472212 + - 0.7280963272797721 + - 1.5278377686849054 + - 0.2352686322156852 + - 0.6592923661982336 + - 2.8488138953570887 + - 1.0784109848156005 + - 2.725562147926489 + - 2.6395005928325452 + - 5.252427622612166 + - 2.071714370497954 + - 1.918205008569566 + - 1.3559224547291253 + - !!python/tuple + - 0.8817376818649778 + - 1.666745517892401 + - 4.082759932592676 + - 1.4110959231587734 + - 2.385458041107272 + - 2.8966110321468412 + - 2.372276127732376 + - 0.9445220427281892 + - 0.9270727429913929 + - 0.5406129713023505 + - 0.7184757583331692 + - 0.49647951557269454 + - 0.9084819340551599 + - !!python/tuple + - 2.9524336025256623 + - 0.5910179629495939 + - 0.9274083675955731 + - 0.8931140692701992 + - 2.1525943198563673 + - 0.9996765234916601 + - 0.8194889298207728 + - 1.8629701752607744 + - 2.053629490099883 + - 0.6490871185594933 + - 1.3395436030126475 + - 1.4325322764529191 + - 0.6472965717891054 + - !!python/tuple + - 2.9524336025256623 + - 0.5910179629495939 + - 0.9274083675955731 + - 0.8931140692701992 + - 2.1525943198563673 + - 0.9996765234916601 + - 0.8194889298207728 + - 1.8629701752607744 + - 2.053629490099883 + - 0.6490871185594933 + - 1.3395436030126475 + - 1.4325322764529191 + - 0.6472965717891054 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 0.27007830820374823 + - 0.6384147853652827 + - 2.3266083676327756 + - 0.2779469309837803 + - 7.821427263780955 + - 0.471025292850293 + - 3.9992226917786384 + - 3.0148128881698075 + - 2.135563257591183 + - 0.8619363806552448 + - 0.11741132927665278 + - 1.4482100832632707 + - 2.472433023868224 + - !!python/tuple + - 0.28939396854093513 + - 1.1804026690778417 + - 0.47399562590043687 + - 0.6271857474156067 + - 2.0349995616893737 + - 4.531798767562955 + - 0.24260563614448882 + - 2.2836203440535456 + - 1.935372636431445 + - 0.3144446468694502 + - 0.41518739232236584 + - 0.4870936390232905 + - 9.64528114940956 + - !!python/tuple + - 1.6389349191267708 + - 2.3664517827330602 + - 1.123063647321865 + - 2.7913622503052284 + - 0.9509601205204969 + - 0.5308517354163529 + - 0.2100884252444188 + - 0.09172247543727279 + - 1.2811035014719996 + - 3.085184994761554 + - 0.4518372454484249 + - 2.3773044104557814 + - 1.3975636920602268 + - !!python/tuple + - 0.5477070932137251 + - 1.0464366742144566 + - 3.4655703576764556 + - 1.2697306277692262 + - 1.2560630849394987 + - 1.1179300066242086 + - 1.7682104995873915 + - 0.16393605826208216 + - 1.067676959322938 + - 1.0583972321793176 + - 2.0057229799487657 + - 1.491222318390817 + - 0.48444554228949727 + - !!python/tuple + - 0.3900572903547295 + - 1.2037056908829395 + - 1.0248722780096902 + - 1.5827775558447446 + - 0.4386846057416709 + - 4.424844277026339 + - 0.7968408843238749 + - 1.7964680201888668 + - 1.0062117989010408 + - 0.6585354390605542 + - 1.3059208622875769 + - 2.5570947741229237 + - 3.1553752785729134 + - !!python/tuple + - 0.8550631728053273 + - 2.01142955130705 + - 0.5740177545938762 + - 2.774362913487717 + - 1.908785910149397 + - 0.4257998771581972 + - 0.6359096766181784 + - 0.23832340535444993 + - 0.5900285506129237 + - 1.4959760442751424 + - 1.1066273135728384 + - 1.4550391168348598 + - 1.766301188021202 + - !!python/tuple + - 0.5376266078758605 + - 2.782357554730955 + - 3.6694712437904595 + - 1.0231014445372586 + - 1.9145077800448838 + - 3.2379704834488017 + - 0.5667078463668666 + - 1.1918120398075096 + - 0.8294029675152975 + - 1.851828317518678 + - 0.3977761474159041 + - 0.8971169123053802 + - 0.6334957651692111 + - !!python/tuple + - 0.9060761235997769 + - 1.3827500181710461 + - 3.6105563404185412 + - 1.2056003114422804 + - 0.3917313276374664 + - 0.8938240252142996 + - 1.1174079617549466 + - 3.747147988416174 + - 0.6634134768930036 + - 0.6829538324363477 + - 0.5241546719137201 + - 0.9904452535667024 + - 1.1263249193129992 + - !!python/tuple + - 1.2523460780885571 + - 0.6283479485902376 + - 1.4084169656990417 + - 2.431572952683806 + - 1.4915619176381967 + - 1.2382151679718514 + - 3.004856223536792 + - 5.938401396075091 + - 1.6992613390411595 + - 3.6023645143179888 + - 1.6256306381821735 + - 0.5854003593327513 + - 1.3693574096745036 + - !!python/tuple + - 2.7695080473966143 + - 1.7062501284459082 + - 2.0088855189595747 + - 2.529001801599469 + - 1.182311369020207 + - 2.7960625886949524 + - 0.5103567083479312 + - 1.3655010719979281 + - 2.3799008190205804 + - 2.388745284736591 + - 0.6041458845212236 + - 0.9878517885101654 + - 1.4257106431539825 + - !!python/tuple + - 1.9007036126115402 + - 1.1093520111208748 + - 1.1416847929947942 + - 1.6116743512630005 + - 0.6439338057999712 + - 1.0990832027635586 + - 0.8096208058520002 + - 3.398712918677974 + - 1.1497061317151946 + - 1.5753739862979765 + - 0.600616732611201 + - 2.0148436462638553 + - 0.86003127152636 + - !!python/tuple + - 0.9239091519127332 + - 1.724401427941022 + - 2.4875989893594457 + - 1.9338125142229443 + - 0.8602395454007443 + - 1.6005467839978316 + - 1.3292196157828806 + - 0.4968016129000951 + - 1.3425086651992069 + - 1.1862805810792507 + - 1.7846258968269022 + - 1.3382675564152509 + - 3.5473418306287434 + - !!python/tuple + - 0.9239091519127332 + - 1.724401427941022 + - 2.4875989893594457 + - 1.9338125142229443 + - 0.8602395454007443 + - 1.6005467839978316 + - 1.3292196157828806 + - 0.4968016129000951 + - 1.3425086651992069 + - 1.1862805810792507 + - 1.7846258968269022 + - 1.3382675564152509 + - 3.5473418306287434 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 4.120766951920165 + - 0.8303265780493678 + - 1.916595459077094 + - 1.2969280523966775 + - 0.2091541999508758 + - 0.6618990616195053 + - 0.5401544030307659 + - 0.18847696854500573 + - 13.852640477267222 + - 0.47715437615856493 + - 0.318038918707349 + - 11.915396304585908 + - 0.923668500245831 + - !!python/tuple + - 1.1930169398852213 + - 0.40864802468637723 + - 1.8569562529843955 + - 0.6970204800051785 + - 0.8618852452955894 + - 1.6025930413081309 + - 6.242370418682751 + - 0.6245262739276292 + - 3.9134619640646884 + - 0.39764594765793004 + - 0.12129240391516787 + - 0.5050796220905376 + - 0.5942216231922297 + - !!python/tuple + - 0.46776262864633733 + - 0.31705401075001866 + - 1.459990571870951 + - 3.052980007843861 + - 0.17060341085951214 + - 0.28750390970986467 + - 1.7805196453982268 + - 1.4733429003143024 + - 0.8597477085321563 + - 0.301648502620239 + - 2.4265434506718804 + - 1.373458631402735 + - 1.392601478358769 + - !!python/tuple + - 1.0994805003598533 + - 3.7016140398598156 + - 0.530210083618412 + - 0.8447996948332717 + - 0.658550584693966 + - 1.4027981939866991 + - 0.6422071609155717 + - 0.3485571224148962 + - 5.050252607910085 + - 0.38804130609753246 + - 3.0543625444498996 + - 10.81411465446241 + - 0.6252778711619539 + - !!python/tuple + - 2.535017768692632 + - 1.4360515562626734 + - 2.764414503459689 + - 0.2957576651282315 + - 0.7805352896765877 + - 0.3470329551569332 + - 0.4520224534456865 + - 5.40005505748787 + - 0.9139907865284846 + - 3.8433945551073507 + - 2.296050068899301 + - 1.1970954162612666 + - 0.8280217658102049 + - !!python/tuple + - 1.338862911788443 + - 1.0108243110456516 + - 1.5820151112406675 + - 0.8330271316277849 + - 0.3440414567996678 + - 1.9638422730606848 + - 2.7443140721214547 + - 0.2872224640811312 + - 1.3449546996973905 + - 3.3170018224546873 + - 1.5471692301302518 + - 1.155008980091221 + - 2.739130140484818 + - !!python/tuple + - 0.8586288574482208 + - 1.313850555746207 + - 0.7789192406544468 + - 2.148822613538061 + - 2.7820756572350493 + - 1.6312015257414587 + - 1.0371216325723087 + - 1.2784891216199026 + - 0.5191516779678875 + - 0.5913394310004741 + - 5.3334959959287485 + - 3.4689258190518397 + - 0.7647916693330995 + - !!python/tuple + - 0.8367420375884408 + - 2.1516540447584935 + - 1.0273048832023044 + - 3.59004302923051 + - 2.6976670493474213 + - 2.0968805047923476 + - 1.1387235950113086 + - 0.7384485303489904 + - 1.6286354890292953 + - 2.959259715611303 + - 2.4734098159531688 + - 1.2699115109323806 + - 0.4139069213747204 + - !!python/tuple + - 0.5507877450004839 + - 1.428315948067548 + - 0.7910854556316915 + - 1.2074769491222896 + - 3.985111571417026 + - 0.7392172301894188 + - 1.8092269075335632 + - 0.7385145814657954 + - 1.331908688697583 + - 1.410065526829309 + - 0.7392416702970157 + - 2.25768658736719 + - 1.8891039498760325 + - !!python/tuple + - 0.5507877450004839 + - 1.428315948067548 + - 0.7910854556316915 + - 1.2074769491222896 + - 3.985111571417026 + - 0.7392172301894188 + - 1.8092269075335632 + - 0.7385145814657954 + - 1.331908688697583 + - 1.410065526829309 + - 0.7392416702970157 + - 2.25768658736719 + - 1.8891039498760325 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 2.548069258956034 + - 18.23915537882541 + - 1.0631548967019449 + - 0.7894990503250062 + - 4.912905086378925 + - 0.12937352989901288 + - 0.1502733386624141 + - 0.39747745267688517 + - 1.051286717928634 + - 0.17317331663569221 + - 3.67932416639645 + - 0.37552592590253087 + - 4.0999390391980635 + - !!python/tuple + - 0.3039588200767704 + - 4.1909455120235775 + - 1.869757123137606 + - 0.46303118281479444 + - 0.1630249638427801 + - 1.0225744413191966 + - 4.699621047371819 + - 1.7237309194231039 + - 0.2936118882934686 + - 6.886863775426381 + - 0.9515856035012531 + - 2.4281982097388233 + - 3.290005285720988 + - !!python/tuple + - 0.40601489911606187 + - 1.2196688732218726 + - 1.5558214270776025 + - 3.3786761173646274 + - 3.755798881188687 + - 0.32106311826493744 + - 0.864040894686677 + - 0.4573872708959465 + - 6.091286970665916 + - 0.4856228438732626 + - 1.349672846835693 + - 0.876636693349439 + - 2.2071685893360806 + - !!python/tuple + - 1.820923460155582 + - 1.34449057052263 + - 0.6793179293446895 + - 1.5772278706223595 + - 1.84349320949622 + - 0.9035875872797207 + - 0.404563001984442 + - 0.32373984768121805 + - 6.712373545496626 + - 5.368189030637078 + - 1.650146329003648 + - 0.8029545947729944 + - 0.5790988694938836 + - !!python/tuple + - 0.3472220433191754 + - 3.279965632077217 + - 0.4075746281272966 + - 1.0221128735773264 + - 3.257230334428174 + - 7.551513081735918 + - 3.5191538640020963 + - 2.4302652610538704 + - 1.2627641035807815 + - 2.743099004165318 + - 0.48743355566415936 + - 1.5648607901884715 + - 3.508941544870646 + - !!python/tuple + - 0.9999136740172931 + - 4.034625789403536 + - 0.8602726202429262 + - 0.9862858614282454 + - 3.294364781952306 + - 0.39948994259653986 + - 0.6795241461864332 + - 0.5705725512309127 + - 2.153786763143043 + - 1.2409557238002913 + - 2.0092561852078945 + - 11.976662783813042 + - 2.7800226249165094 + - !!python/tuple + - 0.42801058409422693 + - 1.3685763217239117 + - 0.43014005851448833 + - 0.8674304092121992 + - 1.355231336735557 + - 1.211066578607376 + - 0.5768225589338197 + - 1.7459063374558619 + - 2.2059612015735164 + - 0.9812749799685884 + - 1.3396325343701583 + - 5.749000224445424 + - 0.8804235296284157 + - !!python/tuple + - 0.9974575064683567 + - 1.1322328692347956 + - 0.7269806242668817 + - 0.6814388089355268 + - 0.4837201235122313 + - 1.1235530619718286 + - 1.908287453069364 + - 1.720966370576439 + - 0.8188218312454323 + - 0.9661645044338953 + - 0.3439910164501693 + - 2.2689661263007608 + - 1.4692469223443863 + - !!python/tuple + - 0.8823108503193715 + - 2.0173985703810766 + - 1.013229879417321 + - 0.7060624918002655 + - 2.7027234893023566 + - 0.5326745003138752 + - 3.009706520726319 + - 0.9069060883335127 + - 2.2464685428488145 + - 1.0183829424587123 + - 1.3819046225020246 + - 0.5414935758301459 + - 0.7494523423620643 + - !!python/tuple + - 1.319169415329032 + - 3.158970157859914 + - 1.0043726739781451 + - 0.5655260069170466 + - 0.967673737997059 + - 1.413663932876745 + - 4.126513097741671 + - 1.9973220531387739 + - 1.7375721829859858 + - 0.6784174292651408 + - 0.7602616762282888 + - 3.3488808386878945 + - 0.9407930614850596 + - !!python/tuple + - 1.319169415329032 + - 3.158970157859914 + - 1.0043726739781451 + - 0.5655260069170466 + - 0.967673737997059 + - 1.413663932876745 + - 4.126513097741671 + - 1.9973220531387739 + - 1.7375721829859858 + - 0.6784174292651408 + - 0.7602616762282888 + - 3.3488808386878945 + - 0.9407930614850596 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.4627964070707205 + - 2.969125924886805 + - 1.4888902976159992 + - 0.153719412926101 + - 14.555002110737568 + - 0.3758084464727329 + - 5.65776427549407 + - 0.5553107975336472 + - 1.3186888944173676 + - 9.194640688930994 + - 3.7815266808361887 + - 0.20856841105219873 + - 0.5584862256178065 + - !!python/tuple + - 1.6734241647214056 + - 0.7484072363361304 + - 0.26879217138168754 + - 2.376820071749523 + - 1.066678308287756 + - 6.5089995993691465 + - 0.5503142250909925 + - 6.72805667048759 + - 1.4055456752672457 + - 0.27321775444400687 + - 1.1324196555254926 + - 0.6821536321847486 + - 5.1347450950782685 + - !!python/tuple + - 0.4921026997933175 + - 0.9471014775831271 + - 1.1446543830903728 + - 0.7833831473605346 + - 0.21695078343988258 + - 1.7990048200494824 + - 0.9859415366594801 + - 0.5937425096523907 + - 0.7366495288047914 + - 1.4860534272008352 + - 0.4737374868112754 + - 3.451755397777542 + - 3.002102537914641 + - !!python/tuple + - 1.2992187416830376 + - 0.6044542264822146 + - 1.5267386473746758 + - 0.8826352963138898 + - 4.296414937500422 + - 4.848325717803301 + - 3.7523971744943703 + - 0.34220361286177226 + - 1.717255358406573 + - 2.2825212076170875 + - 0.40005472483237986 + - 0.8054327499724282 + - 1.5483375344380754 + - !!python/tuple + - 0.4091393371451913 + - 0.29120217517303076 + - 1.0087358179366932 + - 1.8125233418935667 + - 0.303436264298658 + - 0.8572412900667297 + - 0.8934265261691425 + - 4.594706863090209 + - 2.085895678488764 + - 3.0901448345883424 + - 1.8991908890327012 + - 2.1437738214511306 + - 1.8479812054624758 + - !!python/tuple + - 0.2967527661452117 + - 5.997225176183151 + - 1.3997376948093858 + - 0.487876534993193 + - 1.7188878314023077 + - 2.0957983859488225 + - 1.587001606336021 + - 2.5644415038735286 + - 2.338766735029648 + - 4.708262014326727 + - 0.8462185248531371 + - 0.712434913654852 + - 1.9394859553623962 + - !!python/tuple + - 0.8772058606777483 + - 0.6189045108783521 + - 0.9229116776472783 + - 3.807555847108082 + - 1.5109188975392676 + - 0.8977058564028751 + - 1.0685646514399936 + - 0.9302780793714241 + - 0.9931717456964266 + - 0.5381732081658053 + - 0.41915633411430236 + - 1.0875456164371615 + - 1.3999794334691993 + - !!python/tuple + - 1.2493670285667695 + - 1.4794520936987328 + - 0.9267468033252025 + - 1.8061737254771086 + - 1.00231572562388 + - 2.9305228701768664 + - 1.0867788182753515 + - 0.986743304651486 + - 1.5646814668948499 + - 1.5630675795174587 + - 1.3509156952138555 + - 0.8860870576248263 + - 1.07669329774634 + - !!python/tuple + - 1.2493670285667695 + - 1.4794520936987328 + - 0.9267468033252025 + - 1.8061737254771086 + - 1.00231572562388 + - 2.9305228701768664 + - 1.0867788182753515 + - 0.986743304651486 + - 1.5646814668948499 + - 1.5630675795174587 + - 1.3509156952138555 + - 0.8860870576248263 + - 1.07669329774634 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 1.3310682630745383 + - 0.28229305685198036 + - 0.7996460111285008 + - 0.4712767251273452 + - 0.35192355501778627 + - 2.397574920002393 + - 0.2150057600464826 + - 0.32060362664555675 + - 4.908603555973955 + - 1.2891168201317171 + - 0.704215100180957 + - 2.5986023181440108 + - 1.1552128374905983 + - !!python/tuple + - 4.922583451705812 + - 1.4027611590745326 + - 0.8900817259485452 + - 1.1640115198323826 + - 0.9111061514985421 + - 1.7809901834000417 + - 1.044335972749202 + - 1.3702561668067026 + - 2.2210058321743866 + - 2.8513437864827123 + - 0.655447265210883 + - 0.4343576841046355 + - 2.8232694729588417 + - !!python/tuple + - 1.729097075210244 + - 1.800694058763542 + - 3.749004921818054 + - 1.4367929012141967 + - 4.735385069887286 + - 1.8233000905655896 + - 2.4451151229418957 + - 0.3410991065815714 + - 0.6620081066033399 + - 0.789433758982264 + - 1.5871283322972862 + - 1.3057760203259277 + - 1.7050163279442896 + - !!python/tuple + - 1.3033733628865563 + - 1.633797049135927 + - 0.9667518796385395 + - 1.655182980909616 + - 0.8858413872430319 + - 0.38647243328497116 + - 1.181937214733375 + - 4.355368325753974 + - 2.188299092697157 + - 1.4238339509753148 + - 1.0176721828500341 + - 0.7632929672249932 + - 0.6929128442346624 + - !!python/tuple + - 1.278491828286026 + - 3.211038432597595 + - 3.9371934345646156 + - 1.454016880808018 + - 2.1815320227593276 + - 2.8680572515314853 + - 1.7000641221177037 + - 2.177519303253505 + - 0.493080601978754 + - 3.6580656549625012 + - 1.0823267652579978 + - 1.324587683602705 + - 0.5116986686913414 + - !!python/tuple + - 1.278491828286026 + - 3.211038432597595 + - 3.9371934345646156 + - 1.454016880808018 + - 2.1815320227593276 + - 2.8680572515314853 + - 1.7000641221177037 + - 2.177519303253505 + - 0.493080601978754 + - 3.6580656549625012 + - 1.0823267652579978 + - 1.324587683602705 + - 0.5116986686913414 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 150.0 + - 280.0 + - 500.0 + - 2070.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 34.16907654394531 + - 32.49814674727327 + - 26.186915923980006 + - 26.24209182283739 + - 22.34589146956033 + - 22.921536173995154 + - 22.921536173995154 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 140.0 + - 150.0 + - 220.0 + - 270.0 + - 560.0 + - 660.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 30.207293927655346 + - 30.87266366632 + - 29.46132079967327 + - 29.23362968301862 + - 23.241391013872466 + - 23.20337358204479 + - 20.728108290659872 + - 20.728108290659872 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 50.0 + - 300.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 38.7426958119958 + - 40.783956697354995 + - 26.21494853152009 + - 20.987249395699855 + - 20.987249395699855 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 60.0 + - 1460.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 40.67170010977999 + - 35.3658363468242 + - 36.70601338779254 + - 23.19887889257823 + - 22.240731074538086 + - 22.240731074538086 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 80.0 + - 100.0 + - 450.0 + - 620.0 + - 730.0 + - 5290.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 32.28970656838881 + - 30.490443287534802 + - 31.76913788046797 + - 26.893386422180843 + - 27.27656491413306 + - 25.008259340809563 + - 22.8049995425414 + - 21.78643710212243 + - 21.78643710212243 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 60.0 + - 80.0 + - 100.0 + - 440.0 + - 900.0 + - 3740.0 + - 4740.0 + - 5310.0 + - 5660.0 + - 7430.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 35.55377282243274 + - 36.94819975487169 + - 36.095885312605695 + - 26.255845378470458 + - 25.143196532202595 + - 25.82288228271916 + - 23.540482530320123 + - 24.643657489293094 + - 25.082237799779314 + - 22.09945094965493 + - 22.804990390508216 + - 21.406929129892525 + - 21.406929129892525 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 50.0 + - 170.0 + - 230.0 + - 490.0 + - 640.0 + - 4530.0 + - 6880.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 45.88206626427629 + - 34.99668432011886 + - 32.77703849675279 + - 31.960330359263857 + - 27.160993722224706 + - 24.769125081044436 + - 24.1909670507419 + - 22.113256791639675 + - 20.516039430734164 + - 20.516039430734164 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 50.0 + - 100.0 + - 240.0 + - 250.0 + - 700.0 + - 2620.0 + - 9670.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 56.843736599256744 + - 34.997889727136005 + - 28.572253273194047 + - 28.234083713690904 + - 26.91176481048815 + - 30.69666152260831 + - 24.793905875709367 + - 23.140635787267 + - 22.494021012517784 + - 22.76601561608304 + - 22.76601561608304 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 50.0 + - 640.0 + - 980.0 + - 1010.0 + - 4050.0 + - 7180.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 48.872226153540026 + - 34.24975510019724 + - 27.40299933447764 + - 26.845525741661906 + - 28.4597033452617 + - 26.805308496563967 + - 24.813618944153653 + - 20.88555564875412 + - 20.88555564875412 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 620.0 + - 3630.0 + - 3930.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 31.934628573309368 + - 24.836088925815517 + - 22.59326025639513 + - 22.486501737428906 + - 21.628126798361173 + - 21.628126798361173 +problem_name: FIXEDSAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.004 + - 0.015 + - 0.028 + - 0.05 + - 0.207 + - 1.0 + - !!python/tuple + - 1.0 + - 0.28251707843902274 + - 0.24739563513696702 + - 0.11473923271482112 + - 0.11589898054337694 + - 0.03400434913898652 + - 0.04610388371500707 + - 0.04610388371500707 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.014 + - 0.015 + - 0.022 + - 0.027 + - 0.056 + - 0.066 + - 1.0 + - !!python/tuple + - 1.0 + - 0.19924396677973738 + - 0.21322944097378035 + - 0.18356428174960565 + - 0.17877841901623695 + - 0.0528269451183127 + - 0.05202785285298544 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.004 + - 0.005 + - 0.03 + - 1.0 + - !!python/tuple + - 1.0 + - 0.37865044689528754 + - 0.42155591700697903 + - 0.1153284529431567 + - 0.005446913237181447 + - 0.005446913237181447 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.004 + - 0.006 + - 0.146 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41919638437810963 + - 0.3076718944263279 + - 0.33584121192418603 + - 0.05193337851805253 + - 0.03179397210294856 + - 0.03179397210294856 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.004 + - 0.008 + - 0.01 + - 0.045 + - 0.062 + - 0.073 + - 0.529 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2430144098220906 + - 0.20519551196663044 + - 0.2320725236374936 + - 0.12958860795281965 + - 0.13764267563805135 + - 0.08996493014336461 + - 0.04365438840864086 + - 0.02224512090259275 + - 0.02224512090259275 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.005 + - 0.006 + - 0.008 + - 0.01 + - 0.044 + - 0.09 + - 0.374 + - 0.474 + - 0.531 + - 0.566 + - 0.743 + - 1.0 + - !!python/tuple + - 1.0 + - 0.31162215031716173 + - 0.34093175180015345 + - 0.3230168678719428 + - 0.11618806792773652 + - 0.0928011886901258 + - 0.1070875725929847 + - 0.0591135801151653 + - 0.08230132675238772 + - 0.0915198908948303 + - 0.028824390792187467 + - 0.043654196041124776 + - 0.014268204244635235 + - 0.014268204244635235 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.005 + - 0.017 + - 0.023 + - 0.049 + - 0.064 + - 0.453 + - 0.688 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5287136003871608 + - 0.29991265044037885 + - 0.25325768917793556 + - 0.2360912177904037 + - 0.13521347300365907 + - 0.08493854282137922 + - 0.07278618039338178 + - 0.02911457718868963 + - -0.004457496930659033 + - -0.004457496930659033 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.004 + - 0.005 + - 0.01 + - 0.024 + - 0.025 + - 0.07 + - 0.262 + - 0.967 + - 1.0 + - !!python/tuple + - 1.0 + - 0.759118063777914 + - 0.2999379870130421 + - 0.16487688100713888 + - 0.15776886064971513 + - 0.12997490516542778 + - 0.20953003401860967 + - 0.08545941286423661 + - 0.050709160765159446 + - 0.03711789906472337 + - 0.04283498129439478 + - 0.04283498129439478 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.005 + - 0.064 + - 0.098 + - 0.101 + - 0.405 + - 0.718 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5915640751491893 + - 0.2842128692165512 + - 0.14030021357555456 + - 0.12858261944235588 + - 0.1625111826274707 + - 0.1277372890782165 + - 0.08587376385435869 + - 0.003309402029564125 + - 0.003309402029564125 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.062 + - 0.363 + - 0.393 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2355509893379816 + - 0.08634606268373332 + - 0.039203818822764025 + - 0.03695985065704485 + - 0.018917580530306517 + - 0.018917580530306517 +solver_name: RNDSRCH diff --git a/test/expected_results/FIXEDSAN1_SPSA.yaml b/test/expected_results/FIXEDSAN1_SPSA.yaml new file mode 100644 index 000000000..6587bdc56 --- /dev/null +++ b/test/expected_results/FIXEDSAN1_SPSA.yaml @@ -0,0 +1,2749 @@ +all_est_objectives: +- - 68.30388079811371 + - 71.06011334382784 + - 70.59417175492776 + - 70.1745119372691 + - 69.166334772578 + - 69.166334772578 +- - 68.00555254312637 + - 68.60671730711798 + - 68.70673380926505 + - 68.35348308170325 + - 68.14640732577581 + - 68.13421044519104 + - 67.98540481560958 + - 67.84272826246419 + - 67.76131227960596 + - 67.61865369915745 + - 66.98294642624319 + - 66.98294642624319 +- - 67.15565001348712 + - 67.30164392766724 + - 67.28965387563986 + - 66.95359139573686 + - 66.95178815779154 + - 66.70011371687639 + - 66.6501415226439 + - 66.55725129957237 + - 66.49717233271483 + - 65.74713957747576 + - 65.45210518031612 + - 65.26009307386468 + - 64.81560646802231 + - 64.48810168324394 + - 64.31101838729904 + - 64.31101838729904 +- - 67.71943959541662 + - 67.833151268344 + - 67.80894905455095 + - 67.79317483983758 + - 67.76755706085846 + - 67.68396392003339 + - 67.68606208577124 + - 67.67056970660963 + - 67.4148262271308 + - 67.39455678968929 + - 66.91918829579093 + - 66.62937257905591 + - 66.45401071829832 + - 66.45401071829832 +- - 64.758578697695 + - 64.74627264786044 + - 65.12790508459203 + - 64.82483603257877 + - 64.80210557542557 + - 64.80210557542557 +- - 67.09349230810763 + - 67.17161529766265 + - 67.37035352986472 + - 67.32743536515704 + - 67.21168492444491 + - 67.19333431258579 + - 67.19014338501566 + - 66.97705184913644 + - 66.9114291891046 + - 66.82055291555079 + - 66.63102826238872 + - 65.99349029780886 + - 65.91976206181896 + - 65.65500614046942 + - 65.53817834813579 + - 64.64538423541552 + - 64.64538423541552 +- - 64.04874061726181 + - 64.8549017214195 + - 64.81400524523126 + - 64.55314424274253 + - 64.53434776218148 + - 64.49795489160205 + - 64.39154072368993 + - 64.3803524970017 + - 64.3642917572931 + - 64.26764694078051 + - 63.98342446561216 + - 63.9582336844814 + - 63.88003717611822 + - 63.62145682335812 + - 63.575497800686 + - 63.575497800686 +- - 65.76447222250123 + - 65.86571047959201 + - 66.327085650905 + - 65.99752629534586 + - 65.53671821196497 + - 65.4276407100947 + - 65.17134175050559 + - 64.99269816338527 + - 64.98445389173803 + - 64.98445389173803 +- - 72.64729923751366 + - 72.71467655181688 + - 72.75991263408142 + - 72.74731134031715 + - 72.74604478232717 + - 72.74337781909838 + - 72.69627423956577 + - 72.69642790767305 + - 72.6009491783633 + - 72.52512428551917 + - 72.49745754284743 + - 72.4530091777572 + - 72.3937842275172 + - 72.3168811247919 + - 72.30903296106811 + - 72.20722254343086 + - 72.1886974660341 + - 72.14580504988146 + - 72.14053468102817 + - 72.14053468102817 +- - 65.3640980466472 + - 65.37711575418051 + - 65.40283369995744 + - 65.406516710446 + - 65.46899750500235 + - 65.46945114776501 + - 65.47952190432466 + - 65.47298560243898 + - 65.4548647495026 + - 65.44256336395445 + - 65.42767277300955 + - 65.44081538889996 + - 65.3726709301738 + - 65.27122094020223 + - 65.2536466411443 + - 65.02873326338073 + - 65.02873326338073 +all_intermediate_budgets: +- - 0 + - 210 + - 1290 + - 2730 + - 9330 + - 10000 +- - 0 + - 210 + - 270 + - 1230 + - 2130 + - 2250 + - 2370 + - 3150 + - 3570 + - 4050 + - 8910 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 1230 + - 1350 + - 1530 + - 1590 + - 2490 + - 2970 + - 3330 + - 5190 + - 6390 + - 7050 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 870 + - 1410 + - 1470 + - 1590 + - 2130 + - 2190 + - 4290 + - 5790 + - 7050 + - 10000 +- - 0 + - 210 + - 270 + - 570 + - 810 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 450 + - 570 + - 630 + - 750 + - 990 + - 1230 + - 1710 + - 2370 + - 2550 + - 3810 + - 4590 + - 7110 + - 10000 +- - 0 + - 210 + - 330 + - 570 + - 750 + - 990 + - 1470 + - 1530 + - 1770 + - 2070 + - 3690 + - 3870 + - 4230 + - 6570 + - 7890 + - 10000 +- - 0 + - 210 + - 270 + - 690 + - 2430 + - 2970 + - 3870 + - 4950 + - 5070 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 510 + - 750 + - 990 + - 1290 + - 2130 + - 2670 + - 3030 + - 4050 + - 4950 + - 5850 + - 6570 + - 8970 + - 9090 + - 9450 + - 9510 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 510 + - 690 + - 870 + - 1470 + - 2070 + - 2250 + - 2490 + - 2730 + - 3450 + - 4350 + - 4830 + - 9090 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 10.649033340216858 + - 10.649033340216858 + - 10.649033340216858 + - 10.649033340216858 + - 10.649033340216858 + - 10.649033340216858 + - 10.649033340216858 + - 10.649033340216858 + - 9.350966659783142 + - 10.649033340216858 + - 9.350966659783142 + - 10.649033340216858 + - 10.649033340216858 + - !!python/tuple + - 10.437726225909218 + - 10.512726455631904 + - 10.48306243661103 + - 10.590586356764762 + - 10.584528089794334 + - 10.599242550615985 + - 10.622376834239942 + - 10.659270837534676 + - 9.329774553455612 + - 10.743046080684318 + - 9.161856542103644 + - 10.553912765863826 + - 10.623671787390466 + - !!python/tuple + - 10.2354448290255 + - 10.49766050639614 + - 10.450269681388448 + - 10.661541629488166 + - 10.552971554148638 + - 10.60942996287422 + - 10.56289711951419 + - 10.524827343257929 + - 9.203650718873313 + - 10.725914855987856 + - 8.973461920508694 + - 10.546616506361072 + - 10.602433433663887 + - !!python/tuple + - 9.814002021447248 + - 10.525030137692564 + - 10.333398993407599 + - 10.479260021970177 + - 10.478155642411988 + - 10.688157407445114 + - 10.452390830779237 + - 10.429803185792622 + - 8.989714896474425 + - 10.761580519504058 + - 8.659127569997398 + - 10.304299609275372 + - 10.585464138563747 + - !!python/tuple + - 9.814002021447248 + - 10.525030137692564 + - 10.333398993407599 + - 10.479260021970177 + - 10.478155642411988 + - 10.688157407445114 + - 10.452390830779237 + - 10.429803185792622 + - 8.989714896474425 + - 10.761580519504058 + - 8.659127569997398 + - 10.304299609275372 + - 10.585464138563747 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 10.222026535957482 + - 9.777973464042518 + - 10.222026535957482 + - 10.222026535957482 + - 10.222026535957482 + - 9.777973464042518 + - 10.222026535957482 + - 9.777973464042518 + - 10.222026535957482 + - 10.222026535957482 + - 10.222026535957482 + - 9.777973464042518 + - 9.777973464042518 + - !!python/tuple + - 10.166601698294047 + - 9.722548626379082 + - 10.166601698294047 + - 10.277451373620918 + - 10.277451373620918 + - 9.833398301705953 + - 10.277451373620918 + - 9.722548626379082 + - 10.166601698294047 + - 10.277451373620918 + - 10.277451373620918 + - 9.833398301705953 + - 9.833398301705953 + - !!python/tuple + - 10.02556333100744 + - 9.791396622678626 + - 10.204454557353738 + - 10.246008046615046 + - 10.241876177866935 + - 9.744005804723205 + - 10.208162944706693 + - 9.590623662747685 + - 10.169861576948314 + - 10.207880432075967 + - 10.322783830872613 + - 9.826090824035983 + - 9.774521532594097 + - !!python/tuple + - 9.878941009268072 + - 9.670943390266924 + - 10.189804091670432 + - 10.234870825465304 + - 10.269297869480955 + - 9.657003918089888 + - 10.280882278637709 + - 9.389318118155895 + - 10.209666303394226 + - 10.357353098480992 + - 10.322014428821468 + - 9.769591385421755 + - 9.7392490360354 + - !!python/tuple + - 9.872039045097566 + - 9.67828222437635 + - 10.182465257561006 + - 10.227531991355878 + - 10.261959035371529 + - 9.663905882260394 + - 10.273543444528283 + - 9.396656952265321 + - 10.20276433922372 + - 10.364691932590418 + - 10.328916392991975 + - 9.776930219531181 + - 9.732347071864893 + - !!python/tuple + - 9.892614962906826 + - 9.69885814218561 + - 10.161889339751745 + - 10.186031961741417 + - 10.241383117562268 + - 9.705405911874855 + - 10.252967526719022 + - 9.35515692265086 + - 10.161264309609258 + - 10.344116014781157 + - 10.287416363377513 + - 9.73543018991672 + - 9.690847042250432 + - !!python/tuple + - 9.937012646512908 + - 9.701959095675893 + - 10.178803904515725 + - 10.09715437927347 + - 10.25830859268682 + - 9.712146838150467 + - 10.219286294759982 + - 9.285226021475665 + - 10.183172894639355 + - 10.318992711470582 + - 10.268622019658963 + - 9.717596670636084 + - 9.650826082075053 + - !!python/tuple + - 9.907745087896474 + - 9.683031903697595 + - 10.218157244524937 + - 10.101606804468416 + - 10.285448998027166 + - 9.700233872734708 + - 10.217226502950309 + - 9.224885697678483 + - 10.195085860055114 + - 10.308515262303066 + - 10.245899550369641 + - 9.713896918582373 + - 9.619624919314498 + - !!python/tuple + - 9.87585805749708 + - 9.687575840002165 + - 10.175594890730526 + - 10.048487923356557 + - 10.308328281567412 + - 9.70138680161342 + - 10.179886562040352 + - 9.163513544349566 + - 10.226972890454508 + - 10.345855203213024 + - 10.224764168060283 + - 9.74976176352062 + - 9.572406601034164 + - !!python/tuple + - 9.753876019698858 + - 9.701721571820482 + - 10.135871025907129 + - 9.922341985723396 + - 10.181148079957577 + - 9.795911003344798 + - 9.989837038357749 + - 8.917005664211466 + - 10.197293763427464 + - 10.331734687245316 + - 10.101815851143446 + - 9.745373381772193 + - 9.521433316658158 + - !!python/tuple + - 9.753876019698858 + - 9.701721571820482 + - 10.135871025907129 + - 9.922341985723396 + - 10.181148079957577 + - 9.795911003344798 + - 9.989837038357749 + - 8.917005664211466 + - 10.197293763427464 + - 10.331734687245316 + - 10.101815851143446 + - 9.745373381772193 + - 9.521433316658158 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 10.07317047385077 + - 9.92682952614923 + - 9.92682952614923 + - 10.07317047385077 + - 10.07317047385077 + - 9.92682952614923 + - 10.07317047385077 + - 10.07317047385077 + - 9.92682952614923 + - 10.07317047385077 + - 10.07317047385077 + - 9.92682952614923 + - 9.92682952614923 + - !!python/tuple + - 10.081015817809147 + - 9.934674870107608 + - 9.918984182190853 + - 10.065325129892392 + - 10.065325129892392 + - 9.934674870107608 + - 10.065325129892392 + - 10.081015817809147 + - 9.918984182190853 + - 10.065325129892392 + - 10.065325129892392 + - 9.934674870107608 + - 9.918984182190853 + - !!python/tuple + - 9.903354099400328 + - 10.112336588516428 + - 10.096645900599672 + - 9.887663411483572 + - 10.24298684830121 + - 9.75701315169879 + - 9.887663411483572 + - 9.903354099400328 + - 9.741322463782033 + - 9.887663411483572 + - 10.24298684830121 + - 10.112336588516428 + - 10.096645900599672 + - !!python/tuple + - 9.90062570434509 + - 10.115064983571665 + - 10.093917505544434 + - 9.89039180653881 + - 10.245715243356448 + - 9.754284756643552 + - 9.884935016428335 + - 9.906082494455566 + - 9.738594068726796 + - 9.884935016428335 + - 10.245715243356448 + - 10.115064983571665 + - 10.093917505544434 + - !!python/tuple + - 9.61300078754607 + - 10.112023177641433 + - 10.145011356691274 + - 9.872436579384836 + - 10.314249397787783 + - 9.710778765949343 + - 9.866875361476225 + - 10.001031309344114 + - 9.859072240931763 + - 9.903191360986813 + - 10.364951529960901 + - 10.076307896377624 + - 9.913698570266984 + - !!python/tuple + - 9.565120259173788 + - 10.120581973830113 + - 10.192891885063556 + - 9.880995375573516 + - 10.305690601599103 + - 9.702219969760662 + - 9.818994833103943 + - 9.953150780971832 + - 9.81119171255948 + - 9.911750157175494 + - 10.412832058333183 + - 10.067749100188944 + - 9.922257366455664 + - !!python/tuple + - 9.489699984190977 + - 10.045161698847302 + - 10.117471610080745 + - 9.848718241215945 + - 10.233116438218797 + - 9.667096723800586 + - 9.743574558121132 + - 10.028571055954643 + - 9.738617549179175 + - 9.9843243205558 + - 10.44795530429326 + - 9.995174936808638 + - 9.997677641438475 + - !!python/tuple + - 9.466471913169832 + - 10.021933627826156 + - 10.0942435390596 + - 9.825490170194799 + - 10.209888367197651 + - 9.64386865277944 + - 9.720346487099986 + - 10.005342984933497 + - 9.76184562020032 + - 9.961096249534654 + - 10.471183375314405 + - 10.018403007829784 + - 10.020905712459621 + - !!python/tuple + - 9.14870962619153 + - 10.039146740207242 + - 10.01161911292204 + - 9.697814600344126 + - 10.346129211802912 + - 9.587639291095675 + - 9.465751729584111 + - 9.933998571723977 + - 9.812242373324201 + - 9.87153629375557 + - 10.462969253984683 + - 9.95428195834016 + - 9.925241467056063 + - !!python/tuple + - 9.021994382196588 + - 9.978213455406848 + - 9.890679770286724 + - 9.707026913514454 + - 10.312343063461107 + - 9.648572575896068 + - 9.394467038894778 + - 9.918490976468544 + - 9.846028521666007 + - 9.833386756637157 + - 10.362662413193544 + - 9.929851886336973 + - 9.883945354549525 + - !!python/tuple + - 8.925061117999064 + - 10.032126289214375 + - 9.949848636691257 + - 9.698870644183572 + - 10.348503529734067 + - 9.623159711393853 + - 9.335298172490244 + - 9.921342544694909 + - 9.864628812570867 + - 9.736453492439633 + - 10.29974538668484 + - 9.882683582506765 + - 9.89054508288006 + - !!python/tuple + - 8.644117659327986 + - 9.908304531688891 + - 9.934952008016001 + - 9.677995479819295 + - 10.172836243958422 + - 9.534386842780503 + - 9.121149146000146 + - 9.905774427578315 + - 9.926301206003188 + - 9.794774547819323 + - 10.265738145823985 + - 9.886719457691282 + - 9.860896807410889 + - !!python/tuple + - 8.471709607054636 + - 9.90660230133293 + - 9.99354697542224 + - 9.634717178025708 + - 10.129768568748679 + - 9.49602484942067 + - 9.042850813848561 + - 9.890461890476205 + - 9.898916558605299 + - 9.700484340882605 + - 10.188146140907323 + - 9.893357531673098 + - 9.867287346819692 + - !!python/tuple + - 8.367068673182779 + - 9.982635121561525 + - 10.065084478142872 + - 9.596132165905232 + - 10.158541884120265 + - 9.519778137038145 + - 8.989268033855932 + - 9.893677947339103 + - 9.941269404453017 + - 9.653920445073268 + - 10.097795305290258 + - 9.878149472131984 + - 9.862767266449005 + - !!python/tuple + - 8.367068673182779 + - 9.982635121561525 + - 10.065084478142872 + - 9.596132165905232 + - 10.158541884120265 + - 9.519778137038145 + - 8.989268033855932 + - 9.893677947339103 + - 9.941269404453017 + - 9.653920445073268 + - 10.097795305290258 + - 9.878149472131984 + - 9.862767266449005 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 10.05543284388838 + - 10.05543284388838 + - 9.94456715611162 + - 9.94456715611162 + - 9.94456715611162 + - 9.94456715611162 + - 10.05543284388838 + - 9.94456715611162 + - 10.05543284388838 + - 9.94456715611162 + - 10.05543284388838 + - 10.05543284388838 + - 10.05543284388838 + - !!python/tuple + - 9.912301561131798 + - 10.19856412664496 + - 9.80143587335504 + - 10.087698438868202 + - 9.80143587335504 + - 10.087698438868202 + - 9.912301561131798 + - 10.087698438868202 + - 9.912301561131798 + - 10.087698438868202 + - 10.19856412664496 + - 10.19856412664496 + - 9.912301561131798 + - !!python/tuple + - 9.976315302142954 + - 10.262577867656116 + - 9.737422132343884 + - 10.023684697857046 + - 9.737422132343884 + - 10.151712179879357 + - 9.848287820120643 + - 10.023684697857046 + - 9.976315302142954 + - 10.023684697857046 + - 10.134550385633805 + - 10.262577867656116 + - 9.976315302142954 + - !!python/tuple + - 10.00449011385272 + - 10.28629549077492 + - 9.68865974962639 + - 10.013579204716132 + - 9.814627064259069 + - 10.141562388755156 + - 9.854838713826856 + - 10.062022336699618 + - 9.997205438076405 + - 10.052350686559377 + - 10.071860272004093 + - 10.211596976117972 + - 9.930462512229694 + - !!python/tuple + - 10.001222689895934 + - 10.292900939080939 + - 9.640000799454066 + - 9.978642474126262 + - 9.785347671682873 + - 10.151044351941769 + - 9.8620404117928 + - 10.044101014863474 + - 10.00619314588939 + - 10.048018672412327 + - 10.044366889274938 + - 10.179210219353559 + - 9.9089362342684 + - !!python/tuple + - 9.996442201403694 + - 10.288120450588698 + - 9.635220310961826 + - 9.983422962618503 + - 9.790128160175113 + - 10.15582484043401 + - 9.86682090028504 + - 10.048881503355714 + - 10.001412657397148 + - 10.052799160904568 + - 10.049147377767179 + - 10.174429730861318 + - 9.90415574577616 + - !!python/tuple + - 10.007070226907784 + - 10.277492425084608 + - 9.598838808623197 + - 9.994050988122593 + - 9.779500134671023 + - 10.119443338095381 + - 9.830439397946412 + - 10.038253477851624 + - 10.037794159735776 + - 10.063427186408658 + - 10.038519352263089 + - 10.185057756365408 + - 9.89352772027207 + - !!python/tuple + - 9.92853998678874 + - 10.259849636751921 + - 9.499106811480813 + - 9.936773871844283 + - 9.800401316682871 + - 10.098942360876206 + - 9.840076597940998 + - 9.97499995161766 + - 10.021228408408588 + - 10.012947941762922 + - 10.053391706629467 + - 10.140647232081841 + - 9.844410754441666 + - !!python/tuple + - 9.916389218766813 + - 10.247698868729994 + - 9.486956043458886 + - 9.94892463986621 + - 9.812552084704798 + - 10.08679159285428 + - 9.82792582991907 + - 9.962849183595733 + - 10.00907764038666 + - 10.02509870978485 + - 10.065542474651394 + - 10.152798000103768 + - 9.83225998641974 + - !!python/tuple + - 9.774175341241918 + - 10.211741945759847 + - 9.20009207646509 + - 9.922509582063903 + - 9.947357773267235 + - 10.082843707955263 + - 9.925265174556227 + - 9.884493419431916 + - 9.919396168397842 + - 10.000145404355788 + - 10.040209422689632 + - 10.043737314910395 + - 9.582376139150568 + - !!python/tuple + - 9.668779694238726 + - 10.156469854566783 + - 9.10243285447578 + - 9.93505645620409 + - 9.956261628085258 + - 10.0741246282338 + - 9.891071551046842 + - 9.790247728571035 + - 9.892114234672068 + - 9.974922620269616 + - 10.021663426502226 + - 10.085695000928908 + - 9.484233439196128 + - !!python/tuple + - 9.642858003581521 + - 10.145515409909363 + - 9.039938186981226 + - 9.921769025664856 + - 9.931310918692835 + - 10.061867551096741 + - 9.827964662829269 + - 9.785091328370056 + - 9.847970421784511 + - 9.971938147697182 + - 10.01750511266235 + - 10.066005241153833 + - 9.436167535756299 + - !!python/tuple + - 9.642858003581521 + - 10.145515409909363 + - 9.039938186981226 + - 9.921769025664856 + - 9.931310918692835 + - 10.061867551096741 + - 9.827964662829269 + - 9.785091328370056 + - 9.847970421784511 + - 9.971938147697182 + - 10.01750511266235 + - 10.066005241153833 + - 9.436167535756299 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.904748493586107 + - 9.904748493586107 + - 9.904748493586107 + - 9.904748493586107 + - 10.095251506413893 + - 10.095251506413893 + - 9.904748493586107 + - 10.095251506413893 + - 9.904748493586107 + - 10.095251506413893 + - 10.095251506413893 + - 10.095251506413893 + - 10.095251506413893 + - !!python/tuple + - 10.026983705588705 + - 10.026983705588705 + - 9.782513281583508 + - 10.026983705588705 + - 9.973016294411295 + - 9.973016294411295 + - 10.026983705588705 + - 10.217486718416492 + - 9.782513281583508 + - 10.217486718416492 + - 10.217486718416492 + - 9.973016294411295 + - 10.217486718416492 + - !!python/tuple + - 10.072449924715063 + - 10.050791551225306 + - 9.738883772649952 + - 10.003175859952105 + - 10.08097607560249 + - 10.05029777558385 + - 10.003175859952105 + - 10.361068592131645 + - 9.637094697675554 + - 10.04208958265514 + - 10.04208958265514 + - 9.797619158649944 + - 10.073904844701339 + - !!python/tuple + - 10.048877920086762 + - 10.076341138832555 + - 9.762455777278253 + - 9.998975029334206 + - 10.086989543003762 + - 10.0758473631911 + - 9.975813635561481 + - 10.333706367741021 + - 9.611545110068304 + - 9.997168821037489 + - 10.06763917026239 + - 9.77025693425932 + - 10.11882560631899 + - !!python/tuple + - 10.048877920086762 + - 10.076341138832555 + - 9.762455777278253 + - 9.998975029334206 + - 10.086989543003762 + - 10.0758473631911 + - 9.975813635561481 + - 10.333706367741021 + - 9.611545110068304 + - 9.997168821037489 + - 10.06763917026239 + - 9.77025693425932 + - 10.11882560631899 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 10.118105200555467 + - 9.881894799444533 + - 10.118105200555467 + - 10.118105200555467 + - 10.118105200555467 + - 10.118105200555467 + - 9.881894799444533 + - 9.881894799444533 + - 9.881894799444533 + - 9.881894799444533 + - 10.118105200555467 + - 10.118105200555467 + - 9.881894799444533 + - !!python/tuple + - 9.662175365007464 + - 10.337824634992536 + - 9.662175365007464 + - 9.662175365007464 + - 9.662175365007464 + - 10.57403503610347 + - 10.337824634992536 + - 10.337824634992536 + - 10.337824634992536 + - 10.337824634992536 + - 10.57403503610347 + - 10.57403503610347 + - 9.42596496389653 + - !!python/tuple + - 9.769665384298502 + - 10.230334615701498 + - 9.554685345716425 + - 9.554685345716425 + - 9.769665384298502 + - 10.68152505539451 + - 10.230334615701498 + - 10.230334615701498 + - 10.445314654283575 + - 10.445314654283575 + - 10.68152505539451 + - 10.68152505539451 + - 9.31847494460549 + - !!python/tuple + - 9.82846502791668 + - 10.37470388916964 + - 9.613484989334603 + - 9.613484989334603 + - 9.82846502791668 + - 10.740324699012687 + - 10.085965342233356 + - 10.085965342233356 + - 10.386515010665397 + - 10.589683927751716 + - 10.622725411776331 + - 10.740324699012687 + - 9.17410567113735 + - !!python/tuple + - 9.846493586885938 + - 10.392732448138897 + - 9.595456430365346 + - 9.595456430365346 + - 9.810436468947422 + - 10.74007368924931 + - 10.067936783264098 + - 10.103993901202614 + - 10.368486451696139 + - 10.571655368782459 + - 10.640753970745589 + - 10.740575708776063 + - 9.156077112168092 + - !!python/tuple + - 9.851054199715795 + - 10.397293060968755 + - 9.590895817535488 + - 9.600017043195203 + - 9.805875856117565 + - 10.744634302079168 + - 10.06337617043424 + - 10.099433288372756 + - 10.363925838866281 + - 10.567094755952601 + - 10.636193357915731 + - 10.745136321605921 + - 9.151516499338234 + - !!python/tuple + - 9.781990695752032 + - 10.386054685823467 + - 9.659959321499251 + - 9.53095353923144 + - 9.874939360081328 + - 10.675570798115405 + - 9.994312666470478 + - 10.030369784408993 + - 10.294862334902518 + - 10.555856380807313 + - 10.705256861879494 + - 10.733897946460633 + - 9.162754874483522 + - !!python/tuple + - 9.785749986874585 + - 10.404137372670267 + - 9.641876634652451 + - 9.513096988135604 + - 9.87140620470974 + - 10.672037642743817 + - 9.997845821842066 + - 10.012287097562194 + - 10.249966325716056 + - 10.51096037162085 + - 10.682202830662384 + - 10.751754497556469 + - 9.15899558336097 + - !!python/tuple + - 9.775206932012697 + - 10.412197468258523 + - 9.652419689514339 + - 9.502553933273717 + - 9.838930494242366 + - 10.612889341700136 + - 9.967853070648324 + - 9.993674602574142 + - 10.2419062301278 + - 10.514280532238285 + - 10.652210079468642 + - 10.721761746362727 + - 9.167055678949225 + - !!python/tuple + - 9.70590880764259 + - 10.387928056482384 + - 9.691343544489353 + - 9.49062721725679 + - 9.85472322662143 + - 10.585900922496187 + - 9.881253724587868 + - 9.923484387798997 + - 10.252169235462048 + - 10.557473608055343 + - 10.633277695673584 + - 10.709541077427541 + - 9.14368863402889 + - !!python/tuple + - 9.650125839176901 + - 10.53322646688017 + - 9.647519272326875 + - 9.344954459415007 + - 9.863777734889691 + - 10.456154885852495 + - 9.840967976311301 + - 9.816192825912704 + - 10.063343197383247 + - 10.47946207925385 + - 10.482512090431033 + - 10.693724594615343 + - 8.987194089805612 + - !!python/tuple + - 9.678074367969552 + - 10.550280124853325 + - 9.66457293030003 + - 9.327900801441851 + - 9.81094240300809 + - 10.508990217734096 + - 9.777237773610205 + - 9.844141354705355 + - 10.010507865501646 + - 10.415731876552753 + - 10.418781887729937 + - 10.746559926496944 + - 8.923463887104516 + - !!python/tuple + - 9.717076853899373 + - 10.447984230301818 + - 9.699135524493292 + - 9.17006638344692 + - 9.835051256777474 + - 10.476389892891751 + - 9.763996446949227 + - 9.886096319524869 + - 10.002815018052742 + - 10.37625958693801 + - 10.407871680564961 + - 10.67233189656619 + - 8.810687204136867 + - !!python/tuple + - 9.651529912077729 + - 10.389951186889997 + - 9.685951340841308 + - 9.141772864845143 + - 9.830290974120961 + - 10.494479453510175 + - 9.71886501462062 + - 9.904893931705049 + - 9.993982971855333 + - 10.376433418509757 + - 10.434890381131359 + - 10.695016822323113 + - 8.75996248849063 + - !!python/tuple + - 9.489075038662364 + - 10.275990655994484 + - 9.640701053438693 + - 8.963897529811746 + - 9.768976807512644 + - 10.293348788834994 + - 9.754833063667604 + - 9.767757459678876 + - 9.963815344096538 + - 10.285069218453863 + - 10.259641244394867 + - 10.567161830553054 + - 8.516613404595304 + - !!python/tuple + - 9.489075038662364 + - 10.275990655994484 + - 9.640701053438693 + - 8.963897529811746 + - 9.768976807512644 + - 10.293348788834994 + - 9.754833063667604 + - 9.767757459678876 + - 9.963815344096538 + - 10.285069218453863 + - 10.259641244394867 + - 10.567161830553054 + - 8.516613404595304 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.593382027463038 + - 9.593382027463038 + - 10.406617972536962 + - 10.406617972536962 + - 10.406617972536962 + - 10.406617972536962 + - 9.593382027463038 + - 10.406617972536962 + - 10.406617972536962 + - 10.406617972536962 + - 10.406617972536962 + - 10.406617972536962 + - 9.593382027463038 + - !!python/tuple + - 9.296993675898426 + - 9.354935921234679 + - 10.11022962097235 + - 10.703006324101574 + - 10.645064078765321 + - 10.645064078765321 + - 9.354935921234679 + - 10.645064078765321 + - 10.645064078765321 + - 10.645064078765321 + - 10.645064078765321 + - 10.168171866308603 + - 9.296993675898426 + - !!python/tuple + - 9.21532768204413 + - 9.215937260357101 + - 9.826031559801503 + - 10.78467231795587 + - 10.895411549928646 + - 10.760580662627138 + - 9.128070527087115 + - 10.726730072619617 + - 10.384348094610235 + - 10.905780062920407 + - 10.726730072619617 + - 10.052655282446786 + - 9.0466462047351 + - !!python/tuple + - 9.206059346512173 + - 9.230694198986505 + - 9.8112746211721 + - 10.765861336931817 + - 10.880654611299242 + - 10.755366369489831 + - 9.142827465716518 + - 10.71746173708766 + - 10.389562387747542 + - 10.910994356057714 + - 10.735998408151573 + - 10.057869575584093 + - 9.041431911597794 + - !!python/tuple + - 9.217291385791057 + - 9.225445533746154 + - 9.787022220695476 + - 10.723639029721703 + - 10.885903276539594 + - 10.713144062279717 + - 9.185049772926632 + - 10.725233433045048 + - 10.400794427026426 + - 10.936735958748592 + - 10.741247073391925 + - 10.069101614862976 + - 8.99920960438768 + - !!python/tuple + - 9.20669580368596 + - 9.288735669816958 + - 9.775083820369773 + - 10.695835471260818 + - 10.879845489839308 + - 10.669749923961067 + - 9.160423659315384 + - 10.720224347678247 + - 10.392604452089554 + - 10.881117880044393 + - 10.757490162163695 + - 10.048687699540555 + - 8.961710167308581 + - !!python/tuple + - 9.198909056944617 + - 9.296522416558302 + - 9.767297073628429 + - 10.703622218002161 + - 10.872058743097964 + - 10.67753667070241 + - 9.15263691257404 + - 10.712437600936903 + - 10.38481770534821 + - 10.888904626785736 + - 10.749703415422351 + - 10.056474446281898 + - 8.953923420567238 + - !!python/tuple + - 9.195513362475406 + - 9.312349784982484 + - 9.751469705204247 + - 10.68779484957798 + - 10.887886111522146 + - 10.6741409762332 + - 9.164873851559886 + - 10.705451477029357 + - 10.395137633541559 + - 10.89038331046245 + - 10.767447794639029 + - 10.03873006706522 + - 8.941686481581392 + - !!python/tuple + - 9.222070079093532 + - 9.29388780241281 + - 9.778026421822373 + - 10.601621020167771 + - 10.87883182607633 + - 10.616335432344771 + - 9.222679395448315 + - 10.735740752902297 + - 10.33733208965313 + - 10.836310325828835 + - 10.825253338527459 + - 9.9800725056705 + - 8.85178009291637 + - !!python/tuple + - 9.244175086339913 + - 9.380997396667693 + - 9.762936266866225 + - 10.520669575595234 + - 10.91786274964218 + - 10.575346860747464 + - 9.205327492761855 + - 10.695216384511086 + - 10.334894262703669 + - 10.769251854998961 + - 10.732176155849233 + - 9.929918518290423 + - 8.670747725655994 + - !!python/tuple + - 9.255292957862874 + - 9.370902774045 + - 9.755235131549444 + - 10.509551704072273 + - 10.90674487811922 + - 10.56525223812477 + - 9.194209621238894 + - 10.706334256034047 + - 10.32616987848662 + - 10.760527470781913 + - 10.723451771632185 + - 9.938642902507471 + - 8.660653103033301 + - !!python/tuple + - 9.239775157258771 + - 9.348612322522287 + - 9.745680681387585 + - 10.495002235011812 + - 10.927314350582135 + - 10.542722703695324 + - 9.18988927288237 + - 10.700607913633158 + - 10.34071934754708 + - 10.768304288923764 + - 10.70288229916927 + - 9.913078411145955 + - 8.639901200623862 + - !!python/tuple + - 9.154471826610134 + - 9.34955048733725 + - 9.684131926173073 + - 10.453862352960645 + - 10.922155442603465 + - 10.500346838699823 + - 9.13421592901928 + - 10.682130170431503 + - 10.322181327090739 + - 10.739911182816957 + - 10.669296419943961 + - 9.96486918382777 + - 8.545721594691845 + - !!python/tuple + - 9.159267943363279 + - 9.320434229859202 + - 9.660813588293298 + - 10.435735048623716 + - 10.94894367527046 + - 10.484529386473316 + - 9.155231246222797 + - 10.697846963026482 + - 10.293712936156322 + - 10.766978512896625 + - 10.675273128106738 + - 9.966911643741277 + - 8.471642010304308 + - !!python/tuple + - 9.159267943363279 + - 9.320434229859202 + - 9.660813588293298 + - 10.435735048623716 + - 10.94894367527046 + - 10.484529386473316 + - 9.155231246222797 + - 10.697846963026482 + - 10.293712936156322 + - 10.766978512896625 + - 10.675273128106738 + - 9.966911643741277 + - 8.471642010304308 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 10.07308256618205 + - 9.92691743381795 + - 9.92691743381795 + - 9.92691743381795 + - 10.07308256618205 + - 9.92691743381795 + - 10.07308256618205 + - 10.07308256618205 + - 9.92691743381795 + - 9.92691743381795 + - 10.07308256618205 + - 10.07308256618205 + - 10.07308256618205 + - !!python/tuple + - 10.175773145647257 + - 9.824226854352743 + - 10.029608013283157 + - 10.029608013283157 + - 9.970391986716843 + - 10.029608013283157 + - 10.175773145647257 + - 10.175773145647257 + - 9.824226854352743 + - 10.029608013283157 + - 10.175773145647257 + - 10.175773145647257 + - 10.175773145647257 + - !!python/tuple + - 10.061992619623142 + - 9.674610045889088 + - 9.93090602404944 + - 9.948624079184926 + - 9.989399026006568 + - 10.091727893917946 + - 10.152347429429154 + - 10.252753199440386 + - 9.757688296789576 + - 10.081068034055926 + - 10.095409790897632 + - 10.122143430266457 + - 10.091516532948605 + - !!python/tuple + - 9.881923938104372 + - 9.535495927844206 + - 9.983020416544523 + - 9.79051036054907 + - 9.978822241238891 + - 10.032827621672755 + - 10.139810009104554 + - 10.223942110735386 + - 9.68917222511842 + - 9.971048621406588 + - 10.137346843144734 + - 10.052279064801755 + - 9.97821380638463 + - !!python/tuple + - 9.86136720034604 + - 9.514666445023499 + - 9.96745711804889 + - 9.767146363070138 + - 9.994385539734525 + - 9.991289727908372 + - 10.160118667454606 + - 10.173734443529737 + - 9.669404997450274 + - 9.942311202558736 + - 10.126421963401198 + - 10.044864715276733 + - 9.975437875611705 + - !!python/tuple + - 9.791723998487312 + - 9.471006029723684 + - 9.9660740810833 + - 9.672560723251207 + - 10.00213587221179 + - 10.026141262852748 + - 10.116905813887952 + - 10.103203823849134 + - 9.624981099910562 + - 9.934342365525564 + - 10.120291382984762 + - 10.033076416226708 + - 9.919631271364173 + - !!python/tuple + - 9.733318643408424 + - 9.385712432391696 + - 9.976206868575328 + - 9.598936123468864 + - 9.982486060451311 + - 10.039775250722034 + - 10.09971813696275 + - 10.088172576134546 + - 9.582796298251488 + - 9.940659993043266 + - 10.10425794167362 + - 10.061041566858123 + - 9.880688658715393 + - !!python/tuple + - 9.741479398891753 + - 9.377551676908366 + - 9.968046113091999 + - 9.590775367985534 + - 9.98162819116345 + - 10.031614495238705 + - 10.100576006250611 + - 10.087314706846685 + - 9.581938428963626 + - 9.932499237559936 + - 10.10511581096148 + - 10.061899436145984 + - 9.879830789427531 + - !!python/tuple + - 9.741479398891753 + - 9.377551676908366 + - 9.968046113091999 + - 9.590775367985534 + - 9.98162819116345 + - 10.031614495238705 + - 10.100576006250611 + - 10.087314706846685 + - 9.581938428963626 + - 9.932499237559936 + - 10.10511581096148 + - 10.061899436145984 + - 9.879830789427531 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 10.061793021317536 + - 10.061793021317536 + - 10.061793021317536 + - 9.938206978682464 + - 10.061793021317536 + - 10.061793021317536 + - 10.061793021317536 + - 9.938206978682464 + - 10.061793021317536 + - 9.938206978682464 + - 10.061793021317536 + - 9.938206978682464 + - 9.938206978682464 + - !!python/tuple + - 10.07571294096077 + - 10.07571294096077 + - 10.07571294096077 + - 9.92428705903923 + - 10.047873101674302 + - 10.047873101674302 + - 10.07571294096077 + - 9.92428705903923 + - 10.07571294096077 + - 9.952126898325698 + - 10.07571294096077 + - 9.952126898325698 + - 9.952126898325698 + - !!python/tuple + - 10.06907994419721 + - 10.06907994419721 + - 10.06907994419721 + - 9.93092005580279 + - 10.054506098437862 + - 10.041240104910742 + - 10.08234593772433 + - 9.93092005580279 + - 10.06907994419721 + - 9.945493901562138 + - 10.06907994419721 + - 9.958759895089258 + - 9.945493901562138 + - !!python/tuple + - 10.03789218395423 + - 10.064481383467587 + - 10.100267704440189 + - 9.935518616532413 + - 10.074693964238563 + - 10.07242786515372 + - 10.051158177481351 + - 9.899732295559811 + - 10.08926780999791 + - 9.965681767362838 + - 10.053481489025309 + - 9.97435835026116 + - 9.976681661805117 + - !!python/tuple + - 10.032762122832843 + - 10.066192985572112 + - 10.105397765561577 + - 9.937230218636937 + - 10.05933060759008 + - 10.060482967522102 + - 10.046028116359963 + - 9.889402919619286 + - 10.075519975040521 + - 9.98104512401132 + - 10.063810864965834 + - 9.977872889691454 + - 9.976585581391685 + - !!python/tuple + - 10.013520603193816 + - 10.046527160542622 + - 10.12189568823788 + - 9.917858193070243 + - 10.042538885450982 + - 10.079724487161128 + - 10.029399687755992 + - 9.872611197480188 + - 10.058597746973755 + - 10.000417149578015 + - 10.044145039936344 + - 9.997408208793276 + - 9.995827101030711 + - !!python/tuple + - 10.015613018157698 + - 10.045350049509036 + - 10.111506450215902 + - 9.905104731687082 + - 10.043715996484568 + - 10.082923087050116 + - 10.05044997219725 + - 9.84391567611889 + - 10.078996445276957 + - 10.01754632188375 + - 10.01982522949762 + - 9.987018970771299 + - 10.016225799333913 + - !!python/tuple + - 9.974995257647782 + - 10.075796555331655 + - 10.096659573418782 + - 9.887130855165863 + - 10.042664348117944 + - 10.055307374974939 + - 10.044029901764697 + - 9.794431573594922 + - 10.053095272488425 + - 10.019896404258448 + - 10.04461778996892 + - 9.956711977576015 + - 10.005938116909705 + - !!python/tuple + - 9.949491318686755 + - 10.069142959054028 + - 10.096036970654142 + - 9.865646136521983 + - 10.053770624053284 + - 10.03918336307659 + - 10.033326947277677 + - 9.781786231915662 + - 10.056538354813869 + - 10.011032264521676 + - 10.046075982574676 + - 9.94216747048071 + - 10.003782474114958 + - !!python/tuple + - 9.941799016164936 + - 10.06727735606373 + - 10.085243474640098 + - 9.857827354398555 + - 10.059491884500051 + - 10.025415003360234 + - 10.041019249799497 + - 9.767390037648365 + - 10.064230657335688 + - 10.005437483676516 + - 10.053768285096496 + - 9.931500454068274 + - 9.99286234868761 + - !!python/tuple + - 9.93971415978551 + - 10.050907558904491 + - 10.081648732152932 + - 9.850080033901293 + - 10.068361232384628 + - 10.017416004654816 + - 10.037003023344411 + - 9.747135260613891 + - 10.062843422288491 + - 10.003550423392792 + - 10.041768449301177 + - 9.946207097858203 + - 9.977944604543907 + - !!python/tuple + - 9.9252715664096 + - 10.049944641755518 + - 10.083967152863947 + - 9.826463733568302 + - 10.074653038840863 + - 10.007703395597234 + - 10.037676931225027 + - 9.720206469629334 + - 10.0554455863328 + - 9.997048345900899 + - 10.0539586067466 + - 9.94033120536328 + - 9.965302785388184 + - !!python/tuple + - 9.90650740991505 + - 10.049680528113115 + - 10.078346009505655 + - 9.811124705032604 + - 10.077312620255427 + - 9.992607623984572 + - 10.022062070541388 + - 9.701689506206403 + - 10.061639226218151 + - 9.981240903602234 + - 10.044086163349697 + - 9.938943547160942 + - 9.959055068582241 + - !!python/tuple + - 9.908404905217191 + - 10.048624444756003 + - 10.073977369455905 + - 9.808764152208772 + - 10.077662535262588 + - 9.994573745637394 + - 10.022030655437304 + - 9.694441902268013 + - 10.063939805874542 + - 9.978635419319312 + - 10.042677972378508 + - 9.93827646620843 + - 9.955892600627775 + - !!python/tuple + - 9.866248458550066 + - 10.066486260884476 + - 10.081410447153727 + - 9.778922328831966 + - 10.093908125851373 + - 9.984420943726983 + - 10.011360600741464 + - 9.653192426974966 + - 10.066092827749424 + - 9.989974470852152 + - 10.02121871662988 + - 9.941505878887407 + - 9.948727137279432 + - !!python/tuple + - 9.862594864446022 + - 10.062832666780432 + - 10.081349567566589 + - 9.775268734727922 + - 10.090254531747329 + - 9.980767349622939 + - 10.011299721154325 + - 9.649538832870922 + - 10.066153707336563 + - 9.986320876748108 + - 10.017565122525836 + - 9.941566758474545 + - 9.945073543175388 + - !!python/tuple + - 9.85058968205799 + - 10.055493020641915 + - 10.084102736087154 + - 9.765735606612324 + - 10.099787659862926 + - 9.981811471302954 + - 10.008062117497229 + - 9.638018085619422 + - 10.066923486853003 + - 9.985460668055563 + - 10.006044375274335 + - 9.935857100545014 + - 9.939848320382389 + - !!python/tuple + - 9.849027123363996 + - 10.053930461947921 + - 10.08254017739316 + - 9.767298165306318 + - 10.098225101168932 + - 9.98024891260896 + - 10.009624676191223 + - 9.636455526925428 + - 10.06536092815901 + - 9.983898109361569 + - 10.004481816580341 + - 9.93429454185102 + - 9.938285761688395 + - !!python/tuple + - 9.849027123363996 + - 10.053930461947921 + - 10.08254017739316 + - 9.767298165306318 + - 10.098225101168932 + - 9.98024891260896 + - 10.009624676191223 + - 9.636455526925428 + - 10.06536092815901 + - 9.983898109361569 + - 10.004481816580341 + - 9.93429454185102 + - 9.938285761688395 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.955298683435482 + - 10.044701316564518 + - 10.044701316564518 + - 10.044701316564518 + - 10.044701316564518 + - 10.044701316564518 + - 10.044701316564518 + - 9.955298683435482 + - 10.044701316564518 + - 9.955298683435482 + - 9.955298683435482 + - 9.955298683435482 + - 10.044701316564518 + - !!python/tuple + - 9.967083432176578 + - 10.056486065305615 + - 10.056486065305615 + - 10.056486065305615 + - 10.032916567823422 + - 10.032916567823422 + - 10.032916567823422 + - 9.967083432176578 + - 10.056486065305615 + - 9.943513934694385 + - 9.943513934694385 + - 9.967083432176578 + - 10.056486065305615 + - !!python/tuple + - 9.963082883322647 + - 10.052485516451684 + - 10.060486614159545 + - 10.052485516451684 + - 10.028916018969491 + - 10.028916018969491 + - 10.036917116677353 + - 9.971083981030509 + - 10.060486614159545 + - 9.947514483548316 + - 9.939513385840455 + - 9.971083981030509 + - 10.060486614159545 + - !!python/tuple + - 9.98122654902667 + - 10.06178322402909 + - 10.083434492809504 + - 10.06178322402909 + - 10.02442252433802 + - 10.038213726546898 + - 10.055060782381377 + - 9.97557747566198 + - 10.083434492809504 + - 9.970462362198274 + - 9.916565507190496 + - 9.994031859680467 + - 10.042342948455522 + - !!python/tuple + - 9.976101172431463 + - 10.066908600624298 + - 10.078309116214296 + - 10.07614007359247 + - 10.01432977926087 + - 10.039074998655877 + - 10.065153527458527 + - 9.974716203553001 + - 10.097791342372883 + - 9.956105512634895 + - 9.902208657627117 + - 9.979675010117088 + - 10.04746832505073 + - !!python/tuple + - 9.991750330802088 + - 10.073830554482928 + - 10.05797113252935 + - 10.06921811973384 + - 10.021251733119499 + - 10.054724157026502 + - 10.04481554377358 + - 9.986326982725952 + - 10.109402121545834 + - 9.976443496319842 + - 9.88187067394217 + - 9.995324168487713 + - 10.0405463711921 + - !!python/tuple + - 9.973034799424711 + - 10.067574258564258 + - 10.050591609040021 + - 10.051480826848374 + - 10.03034451946302 + - 10.111159779101632 + - 10.034272595362113 + - 10.003638289608189 + - 10.134840213148228 + - 10.010571500025064 + - 9.819504395186831 + - 10.009496318142117 + - 10.056630183732759 + - !!python/tuple + - 9.962815297939525 + - 10.081887796067917 + - 10.055356759376423 + - 10.046046032488213 + - 10.050880168947309 + - 10.084803718900186 + - 10.05637698477803 + - 10.013319872463683 + - 10.139962973268311 + - 10.014616948720224 + - 9.77412456945369 + - 10.019514930031296 + - 10.042550962804093 + - !!python/tuple + - 9.949844787826052 + - 10.084883099611403 + - 10.069261405377617 + - 10.042116593057006 + - 10.046950729516102 + - 10.09870836490138 + - 10.060306424209237 + - 10.016315176007168 + - 10.142958276811797 + - 10.027587458833697 + - 9.760219923452496 + - 10.022510233574781 + - 10.02958045269062 + - !!python/tuple + - 9.9355658118284 + - 10.099162075609055 + - 10.06807990436441 + - 10.026119736340892 + - 10.04815781432427 + - 10.084429388903729 + - 10.076973986028264 + - 10.002036200009517 + - 10.159625838630824 + - 10.042537139934261 + - 9.74355236163347 + - 10.021303148766613 + - 10.030761953703827 + - !!python/tuple + - 9.928932420083473 + - 10.103868344578121 + - 10.072275702560535 + - 10.027560899023648 + - 10.058566783128448 + - 10.088625187099854 + - 10.084117848546132 + - 10.008669591754444 + - 10.169524336662061 + - 10.043978302617017 + - 9.733143392829291 + - 10.022744311449369 + - 10.041170922508005 + - !!python/tuple + - 9.885961217773128 + - 10.083413223334263 + - 10.10419826246459 + - 10.034416636486005 + - 10.066744764348782 + - 10.079277913090168 + - 10.079873360071874 + - 9.977205484013988 + - 10.16287644875455 + - 10.059565038848001 + - 9.683895861097119 + - 10.03315448140197 + - 10.030968178421547 + - !!python/tuple + - 9.847416000226264 + - 10.072289520932404 + - 10.096063919960145 + - 10.019180746995627 + - 10.076103788126634 + - 10.08890537320832 + - 10.062404775710785 + - 9.951937548611646 + - 10.136369678066554 + - 10.074138964725098 + - 9.63953187366214 + - 10.02970624365706 + - 10.03422498049325 + - !!python/tuple + - 9.839294279311519 + - 10.070475958317337 + - 10.098440170829745 + - 10.021975322140788 + - 10.074367228127128 + - 10.085478873867038 + - 10.062242002886643 + - 9.956977382508265 + - 10.135442655039041 + - 10.073288944313147 + - 9.628344439570105 + - 10.02832913593244 + - 10.025701129428233 + - !!python/tuple + - 9.750980057922597 + - 10.08025603019244 + - 10.070560004828234 + - 9.999674038863962 + - 10.075520297270621 + - 10.063752551242871 + - 10.050593884934159 + - 9.901988115746562 + - 10.126786624105293 + - 10.068559243318031 + - 9.547872060407006 + - 9.98319190296855 + - 10.018764701084255 + - !!python/tuple + - 9.750980057922597 + - 10.08025603019244 + - 10.070560004828234 + - 9.999674038863962 + - 10.075520297270621 + - 10.063752551242871 + - 10.050593884934159 + - 9.901988115746562 + - 10.126786624105293 + - 10.068559243318031 + - 9.547872060407006 + - 9.98319190296855 + - 10.018764701084255 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 1290.0 + - 2730.0 + - 9330.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 71.06011334382784 + - 70.59417175492776 + - 70.1745119372691 + - 69.166334772578 + - 69.166334772578 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 1230.0 + - 2130.0 + - 2250.0 + - 2370.0 + - 3150.0 + - 3570.0 + - 4050.0 + - 8910.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 68.60671730711798 + - 68.70673380926505 + - 68.35348308170325 + - 68.14640732577581 + - 68.13421044519104 + - 67.98540481560958 + - 67.84272826246419 + - 67.76131227960596 + - 67.61865369915745 + - 66.98294642624319 + - 66.98294642624319 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 1230.0 + - 1350.0 + - 1530.0 + - 1590.0 + - 2490.0 + - 2970.0 + - 3330.0 + - 5190.0 + - 6390.0 + - 7050.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 67.30164392766724 + - 67.28965387563986 + - 66.95359139573686 + - 66.95178815779154 + - 66.70011371687639 + - 66.6501415226439 + - 66.55725129957237 + - 66.49717233271483 + - 65.74713957747576 + - 65.45210518031612 + - 65.26009307386468 + - 64.81560646802231 + - 64.48810168324394 + - 64.31101838729904 + - 64.31101838729904 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 870.0 + - 1410.0 + - 1470.0 + - 1590.0 + - 2130.0 + - 2190.0 + - 4290.0 + - 5790.0 + - 7050.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 67.833151268344 + - 67.80894905455095 + - 67.79317483983758 + - 67.76755706085846 + - 67.68396392003339 + - 67.68606208577124 + - 67.67056970660963 + - 67.4148262271308 + - 67.39455678968929 + - 66.91918829579093 + - 66.62937257905591 + - 66.45401071829832 + - 66.45401071829832 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 570.0 + - 810.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.74627264786044 + - 65.12790508459203 + - 64.82483603257877 + - 64.80210557542557 + - 64.80210557542557 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 450.0 + - 570.0 + - 630.0 + - 750.0 + - 990.0 + - 1230.0 + - 1710.0 + - 2370.0 + - 2550.0 + - 3810.0 + - 4590.0 + - 7110.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 67.17161529766265 + - 67.37035352986472 + - 67.32743536515704 + - 67.21168492444491 + - 67.19333431258579 + - 67.19014338501566 + - 66.97705184913644 + - 66.9114291891046 + - 66.82055291555079 + - 66.63102826238872 + - 65.99349029780886 + - 65.91976206181896 + - 65.65500614046942 + - 65.53817834813579 + - 64.64538423541552 + - 64.64538423541552 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 330.0 + - 570.0 + - 750.0 + - 990.0 + - 1470.0 + - 1530.0 + - 1770.0 + - 2070.0 + - 3690.0 + - 3870.0 + - 4230.0 + - 6570.0 + - 7890.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.8549017214195 + - 64.81400524523126 + - 64.55314424274253 + - 64.53434776218148 + - 64.49795489160205 + - 64.39154072368993 + - 64.3803524970017 + - 64.3642917572931 + - 64.26764694078051 + - 63.98342446561216 + - 63.9582336844814 + - 63.88003717611822 + - 63.62145682335812 + - 68.05187837254445 + - 68.05187837254445 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 690.0 + - 2430.0 + - 2970.0 + - 3870.0 + - 4950.0 + - 5070.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 65.86571047959201 + - 66.327085650905 + - 65.99752629534586 + - 65.53671821196497 + - 65.4276407100947 + - 65.17134175050559 + - 64.99269816338527 + - 64.98445389173803 + - 64.98445389173803 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 510.0 + - 750.0 + - 990.0 + - 1290.0 + - 2130.0 + - 2670.0 + - 3030.0 + - 4050.0 + - 4950.0 + - 5850.0 + - 6570.0 + - 8970.0 + - 9090.0 + - 9450.0 + - 9510.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 72.71467655181688 + - 72.75991263408142 + - 72.74731134031715 + - 72.74604478232717 + - 72.74337781909838 + - 72.69627423956577 + - 72.69642790767305 + - 72.6009491783633 + - 72.52512428551917 + - 72.49745754284743 + - 72.4530091777572 + - 72.3937842275172 + - 72.3168811247919 + - 72.30903296106811 + - 72.20722254343086 + - 72.1886974660341 + - 72.14580504988146 + - 72.14053468102817 + - 72.14053468102817 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 510.0 + - 690.0 + - 870.0 + - 1470.0 + - 2070.0 + - 2250.0 + - 2490.0 + - 2730.0 + - 3450.0 + - 4350.0 + - 4830.0 + - 9090.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 65.37711575418051 + - 65.40283369995744 + - 65.406516710446 + - 65.46899750500235 + - 65.46945114776501 + - 65.47952190432466 + - 65.47298560243898 + - 65.4548647495026 + - 65.44256336395445 + - 65.42767277300955 + - 65.44081538889996 + - 65.3726709301738 + - 65.27122094020223 + - 65.2536466411443 + - 65.02873326338073 + - 65.02873326338073 +problem_name: FIXEDSAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.129 + - 0.273 + - 0.933 + - 1.0 + - !!python/tuple + - 1.0 + - 11.937325462197263 + - 10.088368699786962 + - 8.423067992023269 + - 4.42240346503036 + - 4.42240346503036 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.123 + - 0.213 + - 0.225 + - 0.237 + - 0.315 + - 0.357 + - 0.405 + - 0.891 + - 1.0 + - !!python/tuple + - 1.0 + - 2.20172061169719 + - 2.5986076730861396 + - 1.1968325641211084 + - 0.37511128322604603 + - 0.3267114293071199 + - -0.2637814171221031 + - -0.829952765763269 + - -1.1530289531226483 + - -1.7191289822245661 + - -4.241752609668762 + - -4.241752609668762 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.039 + - 0.123 + - 0.135 + - 0.153 + - 0.159 + - 0.249 + - 0.297 + - 0.333 + - 0.519 + - 0.639 + - 0.705 + - 1.0 + - !!python/tuple + - 1.0 + - -2.977092157674559 + - -3.02467127124976 + - -4.358239704743391 + - -4.365395342000657 + - -5.364093828122901 + - -5.562394277491977 + - -5.931002725849971 + - -6.169409029764827 + - -9.145700839436026 + - -10.316460987847986 + - -11.078406457292175 + - -12.842225217521573 + - -14.14183487024041 + - -14.844539598359102 + - -14.844539598359102 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.087 + - 0.141 + - 0.147 + - 0.159 + - 0.213 + - 0.219 + - 0.429 + - 0.579 + - 0.705 + - 1.0 + - !!python/tuple + - 1.0 + - -0.8679563448897842 + - -0.9639959514069627 + - -1.0265914390406294 + - -1.1282483136569825 + - -1.4599639336008814 + - -1.4516379592254012 + - -1.5131150625771557 + - -2.527960371709057 + - -2.6083938730760603 + - -4.494758628591917 + - -5.644809927028207 + - -6.340683628884281 + - -6.340683628884281 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.057 + - 0.081 + - 1.0 + - !!python/tuple + - 1.0 + - -13.117356776296262 + - -11.602956921336505 + - -12.805600313869894 + - -12.895799672474697 + - -12.895799672474697 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.045 + - 0.057 + - 0.063 + - 0.075 + - 0.099 + - 0.123 + - 0.171 + - 0.237 + - 0.255 + - 0.381 + - 0.459 + - 0.711 + - 1.0 + - !!python/tuple + - 1.0 + - -3.4930738182116 + - -2.7044376304720474 + - -2.8747461686169564 + - -3.3340688931925637 + - -3.406888080617711 + - -3.4195503697322818 + - -4.265143563519419 + - -4.525548438129698 + - -4.886165100245227 + - -5.638239818311698 + - -8.168128025298998 + - -8.460697574275981 + - -9.511306197393257 + - -9.974904085666475 + - -13.51770376588184 + - -13.51770376588184 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.033 + - 0.057 + - 0.075 + - 0.099 + - 0.147 + - 0.153 + - 0.177 + - 0.207 + - 0.369 + - 0.387 + - 0.423 + - 0.657 + - 0.789 + - 1.0 + - !!python/tuple + - 1.0 + - -12.68629317318343 + - -12.848579215057251 + - -13.883731959716174 + - -13.958320450357048 + - -14.102735213418255 + - -14.525009593007011 + - -14.569406890624126 + - -14.6331393712632 + - -15.01664685653553 + - -16.144502965564268 + - -16.244465420583722 + - -16.554766038470778 + - -17.580868672903684 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.069 + - 0.243 + - 0.297 + - 0.387 + - 0.495 + - 0.507 + - 1.0 + - !!python/tuple + - 1.0 + - -8.675185915429237 + - -6.844349683314508 + - -8.152112316212527 + - -9.980698221050378 + - -10.413541284460822 + - -11.430590858528024 + - -12.139487158699636 + - -12.172202207487834 + - -12.172202207487834 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.051 + - 0.075 + - 0.099 + - 0.129 + - 0.213 + - 0.267 + - 0.303 + - 0.405 + - 0.495 + - 0.585 + - 0.657 + - 0.897 + - 0.909 + - 0.945 + - 0.951 + - 1.0 + - !!python/tuple + - 1.0 + - 18.502989281708043 + - 18.682495816862822 + - 18.632491164186177 + - 18.627465188792815 + - 18.616882103242087 + - 18.429964935971917 + - 18.430574724179078 + - 18.051694524537822 + - 17.75080498876117 + - 17.641017384101243 + - 17.46463668066227 + - 17.229619298959662 + - 16.924451193725847 + - 16.893307986647326 + - 16.48930228151465 + - 16.41579077719118 + - 16.245584414868485 + - 16.22467045405488 + - 16.22467045405488 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.051 + - 0.069 + - 0.087 + - 0.147 + - 0.207 + - 0.225 + - 0.249 + - 0.273 + - 0.345 + - 0.435 + - 0.483 + - 0.909 + - 1.0 + - !!python/tuple + - 1.0 + - -10.614035211454047 + - -10.511980853370638 + - -10.497365873057499 + - -10.249428598584009 + - -10.247628446217858 + - -10.20766551119097 + - -10.233602967431358 + - -10.305510421875272 + - -10.354324974038283 + - -10.41341405189642 + - -10.361261316220453 + - -10.631673232186072 + - -11.034248682570727 + - -11.103987293293331 + - -11.996492106512903 + - -11.996492106512903 +solver_name: SPSA diff --git a/test/expected_results/FIXEDSAN1_STRONG.yaml b/test/expected_results/FIXEDSAN1_STRONG.yaml new file mode 100644 index 000000000..566d916d0 --- /dev/null +++ b/test/expected_results/FIXEDSAN1_STRONG.yaml @@ -0,0 +1,2089 @@ +all_est_objectives: +- - 68.30388079811371 + - 64.77533564113695 + - 61.26049127219263 + - 57.764945137850354 + - 54.33006006093741 + - 50.96056245035337 + - 47.76550174878428 + - 44.66569152438721 + - 41.611285577254215 + - 41.611285577254215 +- - 68.00555254312637 + - 64.12165717572489 + - 60.25005229236851 + - 56.500566720589205 + - 52.80343593331602 + - 49.15928586577631 + - 45.59295472745258 + - 42.10003444634719 + - 42.10003444634719 +- - 67.15565001348712 + - 63.44818341788816 + - 59.82283871661548 + - 56.255768424050096 + - 52.828453242362166 + - 49.42394423298395 + - 46.20185037363548 + - 42.99627286962369 + - 39.88488795299308 + - 39.88488795299308 +- - 67.71943959541662 + - 64.09571813543337 + - 60.36593321313504 + - 56.51945153604289 + - 52.78107002831135 + - 48.99798839328177 + - 45.17001638698517 + - 41.52376947203019 + - 38.02525679634855 + - 34.64461909296893 + - 31.71377618575876 + - 31.71377618575876 +- - 64.758578697695 + - 61.50267625625066 + - 58.563628389581844 + - 55.65278841300775 + - 52.86632502854933 + - 49.86349189658797 + - 46.824941796968105 + - 43.704735877325504 + - 40.59121641313349 + - 37.50950425894563 + - 37.50950425894563 +- - 67.09349230810763 + - 63.69532319421208 + - 60.48990972093021 + - 57.249301628331914 + - 53.87777478741084 + - 50.53546944117176 + - 47.116809816768 + - 43.625889200879136 + - 40.232519983839765 + - 40.232519983839765 +- - 64.04874061726181 + - 60.83258503384364 + - 57.57540183810115 + - 54.20014053561061 + - 50.76930272074904 + - 47.34510154781586 + - 44.03690812660497 + - 40.816737989985924 + - 37.676969272624554 + - 34.76187411550433 + - 31.987489928861255 + - 31.987489928861255 +- - 65.76447222250123 + - 62.27994810653351 + - 58.80435672156049 + - 55.35967108349571 + - 51.944373288026306 + - 48.60388447269688 + - 45.43173559425824 + - 42.369219555606314 + - 39.6061873474749 + - 39.6061873474749 +- - 72.64729923751366 + - 69.32158767994972 + - 65.84089532187849 + - 62.324435998030275 + - 58.79121841660665 + - 55.26394038482617 + - 51.72128106285688 + - 48.250869428088365 + - 46.385416913550245 + - 42.87176754766969 + - 39.98307632891716 + - 36.591629410732715 + - 36.591629410732715 +- - 65.3640980466472 + - 61.76486685755126 + - 58.07372615152498 + - 58.07372615152498 +all_intermediate_budgets: +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 3412 + - 3925 + - 10000 +- - 10 + - 280 + - 2035 + - 2467 + - 2926 + - 3412 + - 3925 + - 4465 + - 5032 + - 5626 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 3412 + - 3925 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 3412 + - 3925 + - 4465 + - 10000 +- - 10 + - 280 + - 577 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.129869370902941 + - 9.989151324742803 + - 9.707249126536787 + - 9.179224637317796 + - 9.470247241168282 + - 9.989879969754536 + - 9.12002020938751 + - 9.697773430398156 + - 9.532454601525966 + - 9.866437062411922 + - 9.068301491862506 + - 9.837843557171094 + - 9.545974215552569 + - !!python/tuple + - 8.302979805879033 + - 9.958980160185853 + - 9.470078789208198 + - 8.248660086495676 + - 9.030991150423478 + - 9.981853875552439 + - 8.135536977619488 + - 9.402100920906634 + - 9.113989595432168 + - 9.6901943311802 + - 8.209141682581958 + - 9.677717293802917 + - 9.129401366890777 + - !!python/tuple + - 7.332540292850583 + - 9.917586081469262 + - 9.271705338088159 + - 7.391023175598237 + - 8.633911982112416 + - 9.975426277384592 + - 7.244555738383719 + - 8.82373835900228 + - 8.737011412843078 + - 9.510998364986571 + - 7.464375574537007 + - 9.384764473722841 + - 8.704130949137186 + - !!python/tuple + - 6.393465008412445 + - 9.868009231939892 + - 8.687756767672044 + - 6.586906707110214 + - 8.200393790215356 + - 9.856983265810115 + - 6.408130886830504 + - 8.282906898184471 + - 8.380020176987248 + - 9.326230761851415 + - 6.734987450427592 + - 9.105249677564458 + - 8.301277153261646 + - !!python/tuple + - 5.189526672905117 + - 9.79894930676348 + - 8.239033544782218 + - 5.836380594609327 + - 7.811949844690329 + - 9.747450625243564 + - 5.6161348449157105 + - 7.8164405278521905 + - 7.9808437537371875 + - 9.169457031487624 + - 6.082151234395564 + - 8.871415606483778 + - 7.971742307869129 + - !!python/tuple + - 3.956105918189764 + - 9.695885790218934 + - 7.822276216929206 + - 5.136735629571233 + - 7.2298904718929204 + - 9.61988129841237 + - 4.9287159803208045 + - 7.336701404838226 + - 7.647249190030633 + - 9.031085585817001 + - 5.4212179177162 + - 8.640231024500386 + - 7.616230159192401 + - !!python/tuple + - 2.701729113813043 + - 9.547030352879407 + - 7.289442246293657 + - 4.483242333637959 + - 6.71592303089239 + - 9.369245322135445 + - 4.302088505865551 + - 6.831144556131236 + - 7.347521108533944 + - 8.874647205607918 + - 4.76690325538323 + - 8.408841489773138 + - 7.26665035781915 + - !!python/tuple + - 1.638852702684036 + - 9.285129715872024 + - 6.760847568861006 + - 3.7921885901910235 + - 6.260531178053019 + - 9.063630470555957 + - 3.691477625915852 + - 6.190660007318432 + - 7.056042709539595 + - 8.677871127166366 + - 4.132973797556147 + - 8.096905134318797 + - 6.685242952416565 + - !!python/tuple + - 1.638852702684036 + - 9.285129715872024 + - 6.760847568861006 + - 3.7921885901910235 + - 6.260531178053019 + - 9.063630470555957 + - 3.691477625915852 + - 6.190660007318432 + - 7.056042709539595 + - 8.677871127166366 + - 4.132973797556147 + - 8.096905134318797 + - 6.685242952416565 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.854134582395979 + - 10.008373274569921 + - 9.839478537192562 + - 9.239216935277433 + - 10.008373274569921 + - 9.636204357336274 + - 9.320512280888332 + - 9.265703226440039 + - 9.974735575732513 + - 9.491987565255563 + - 9.85688517909013 + - 9.623252569513888 + - 9.273421563312768 + - !!python/tuple + - 7.632898879226845 + - 10.017457243763575 + - 9.641089367900305 + - 8.504065189162471 + - 9.752888546561987 + - 9.237405217248325 + - 8.69240369704572 + - 8.586500575544088 + - 9.950650362500019 + - 9.016786795477554 + - 9.6141758649076 + - 9.25860137282086 + - 8.617471506902515 + - !!python/tuple + - 6.402487699363133 + - 10.027148815623137 + - 9.417669822562205 + - 7.789361041444517 + - 9.215470226695786 + - 8.818190754735921 + - 8.10388876363867 + - 8.003047623802923 + - 9.92791518930281 + - 8.569390530311829 + - 9.293002543918345 + - 8.917721988131712 + - 8.022561146558097 + - !!python/tuple + - 5.198053791225705 + - 9.79469411783405 + - 9.196127053605089 + - 7.120937762885366 + - 8.652034357991855 + - 8.270234834866908 + - 7.539144187082204 + - 7.46914633584646 + - 9.903431448993379 + - 8.140838243710954 + - 8.875799404905338 + - 8.593072672201778 + - 7.462188009364652 + - !!python/tuple + - 3.964415895615362 + - 9.583799407740765 + - 8.995375395631465 + - 6.484390398488614 + - 8.121856493198498 + - 7.762927910368401 + - 6.788881737666223 + - 7.009097883168979 + - 9.837980202596516 + - 7.754366696634934 + - 8.437240522892358 + - 8.304005080163114 + - 6.966565275241396 + - !!python/tuple + - 2.7831482461964736 + - 9.381183948195453 + - 8.546257526982707 + - 5.886286571413935 + - 7.59856389025285 + - 7.242376404143782 + - 6.089351266558255 + - 6.576422460624156 + - 9.727663574270945 + - 7.395816210293029 + - 7.810919112029724 + - 8.034030688209638 + - 6.546011050296909 + - !!python/tuple + - 1.814011547836539 + - 9.121193406814944 + - 8.094946147707175 + - 5.172271252504937 + - 7.07196325774463 + - 6.7145094764649595 + - 5.460458767833108 + - 6.074897908593382 + - 9.588351029931307 + - 7.04899049530311 + - 7.185504464870668 + - 7.428051372276595 + - 6.123347712593725 + - !!python/tuple + - 1.814011547836539 + - 9.121193406814944 + - 8.094946147707175 + - 5.172271252504937 + - 7.07196325774463 + - 6.7145094764649595 + - 5.460458767833108 + - 6.074897908593382 + - 9.588351029931307 + - 7.04899049530311 + - 7.185504464870668 + - 7.428051372276595 + - 6.123347712593725 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.979657493053075 + - 10.007958834095463 + - 10.007958834095463 + - 8.86111362068149 + - 9.85962017284391 + - 10.007958834095463 + - 9.347865463086592 + - 9.526677378260821 + - 9.75397345936988 + - 9.773196762805485 + - 9.200545991726733 + - 9.755177561371623 + - 9.573860122559035 + - !!python/tuple + - 7.992259085609101 + - 9.864157371903818 + - 10.016441865867767 + - 7.771688893859285 + - 9.661352776297528 + - 9.914195419439062 + - 8.77925931351563 + - 9.074153011573427 + - 9.51641201302143 + - 9.549063558653845 + - 8.247737154507739 + - 9.51954687027572 + - 9.16007648814544 + - !!python/tuple + - 6.958890827518641 + - 9.73000631656529 + - 9.806155832116794 + - 6.799353826058649 + - 9.431159953725249 + - 9.775550910259243 + - 8.292060245361636 + - 8.656075084558285 + - 9.306977078584985 + - 9.274696560358137 + - 7.181068204648053 + - 9.300366388682669 + - 8.792419388012938 + - !!python/tuple + - 5.899146625797108 + - 9.60069229977139 + - 9.616023176868913 + - 5.872632919034707 + - 8.999586045732059 + - 9.630508559898633 + - 7.864458371560073 + - 8.25426277629599 + - 9.104801199203413 + - 8.991397738127757 + - 6.1182884492382135 + - 9.088847967838197 + - 8.44848033655667 + - !!python/tuple + - 4.847393467811665 + - 9.293651271426615 + - 9.440530556719276 + - 4.963542714969557 + - 8.57792143035468 + - 9.392462822483532 + - 7.451145654884812 + - 7.8556810210146395 + - 8.903417073314463 + - 8.69290106495363 + - 5.075814008237007 + - 8.878220079677527 + - 8.105896176258728 + - !!python/tuple + - 3.735633789290944 + - 9.003435377979983 + - 9.288022201926365 + - 4.131227503252677 + - 8.09903985672861 + - 9.158797759004576 + - 7.051934782915516 + - 7.480940381437669 + - 8.713490025046196 + - 8.390879302909777 + - 4.026935975467429 + - 8.679445883000971 + - 7.769614724988643 + - !!python/tuple + - 2.630740472724023 + - 8.722413037671625 + - 9.147989697879826 + - 3.34335262310131 + - 7.651147462636757 + - 8.929033819623724 + - 6.470705245141694 + - 7.119039755704441 + - 8.529985937407346 + - 7.851473108351228 + - 3.142106590438751 + - 8.48687383041643 + - 7.330248656290658 + - !!python/tuple + - 1.7418381376177978 + - 8.225709950107918 + - 8.902813386008708 + - 2.6372611482420867 + - 7.155777191945629 + - 8.425538076983859 + - 5.896545901500143 + - 6.7020878540867805 + - 8.355412837254423 + - 7.287874272846325 + - 2.297161178635566 + - 8.241573709372643 + - 6.801258802332762 + - !!python/tuple + - 1.7418381376177978 + - 8.225709950107918 + - 8.902813386008708 + - 2.6372611482420867 + - 7.155777191945629 + - 8.425538076983859 + - 5.896545901500143 + - 6.7020878540867805 + - 8.355412837254423 + - 7.287874272846325 + - 2.297161178635566 + - 8.241573709372643 + - 6.801258802332762 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.330761066658459 + - 9.732625809123938 + - 10.008415757367496 + - 9.245129640937062 + - 10.008415757367496 + - 9.808805722374743 + - 9.598534003115986 + - 9.25919370467983 + - 9.580058092800298 + - 9.759853030428134 + - 9.778438632999674 + - 9.139641587014253 + - 8.931914138741126 + - !!python/tuple + - 8.395887912399688 + - 9.475974491523601 + - 10.016739256986186 + - 8.462450901806507 + - 10.016739256986186 + - 9.609021286579928 + - 9.18786543562971 + - 8.594161447057779 + - 9.232030436574442 + - 9.419721229912275 + - 9.580034673637996 + - 8.367199346585846 + - 7.970798493905485 + - !!python/tuple + - 7.520462304046137 + - 9.176042122899128 + - 10.024775887542125 + - 7.65898662432153 + - 10.01371001890958 + - 9.412053272668343 + - 8.323827265783521 + - 8.006937931510205 + - 8.872732710962739 + - 9.119517925748724 + - 9.233906287310322 + - 7.685151460289554 + - 7.220038148368588 + - !!python/tuple + - 6.703588252966521 + - 8.861914952365005 + - 10.032867569344132 + - 6.762168736639288 + - 9.996962519819705 + - 9.207245688575096 + - 7.5224447301400525 + - 7.416709951808463 + - 8.533615406509904 + - 8.854537344219498 + - 8.884576756913832 + - 7.010308583487897 + - 6.423656229440958 + - !!python/tuple + - 5.849364647347919 + - 8.509714314283581 + - 9.99036763529956 + - 5.834480935150639 + - 9.965647173808144 + - 8.966693200767672 + - 6.718597480725167 + - 6.879946118576161 + - 8.112424411680882 + - 8.619348563717823 + - 8.458111451210186 + - 6.399825555924468 + - 5.714123934996768 + - !!python/tuple + - 4.986596821916372 + - 8.14253626095392 + - 9.906604386139467 + - 4.996848953743579 + - 9.919337401666857 + - 8.66656659880709 + - 5.948403607942969 + - 6.36359833506823 + - 7.669951660500644 + - 8.391993958118722 + - 7.748195771069767 + - 5.831134328139606 + - 5.093421193525789 + - !!python/tuple + - 4.155792475901692 + - 7.7696026107866265 + - 9.742834311043133 + - 4.225252155565418 + - 9.857677391120998 + - 7.968776956256799 + - 5.240157065424067 + - 5.866112408945523 + - 7.30735898121879 + - 8.160047113612519 + - 7.020848455801566 + - 5.302019425473019 + - 4.5326938676960795 + - !!python/tuple + - 3.3590948020933538 + - 7.391518215957595 + - 9.444287870962855 + - 3.4783515896885824 + - 9.770656581426303 + - 7.2151662991127195 + - 4.538577164912853 + - 5.383333280746403 + - 6.954929060491069 + - 7.917773660199863 + - 6.283104186338191 + - 4.797140912072037 + - 3.991888272529343 + - !!python/tuple + - 2.54477881276239 + - 7.029191553925354 + - 9.146637651997638 + - 2.6983994612458115 + - 9.659864215320098 + - 6.519160888173989 + - 3.8258509341848432 + - 4.931145821304869 + - 6.544333195465538 + - 7.6518373055232125 + - 5.536412682918776 + - 4.327721440546172 + - 3.4605472573050595 + - !!python/tuple + - 1.9862205668765414 + - 6.65873651055544 + - 8.83444403204168 + - 2.008015133712157 + - 9.519029710514678 + - 5.803540779681664 + - 2.998747772194576 + - 4.465017705468212 + - 5.926845958374168 + - 7.359445355383796 + - 4.763760447896698 + - 3.8615411103923036 + - 2.948434285984 + - !!python/tuple + - 1.9862205668765414 + - 6.65873651055544 + - 8.83444403204168 + - 2.008015133712157 + - 9.519029710514678 + - 5.803540779681664 + - 2.998747772194576 + - 4.465017705468212 + - 5.926845958374168 + - 7.359445355383796 + - 4.763760447896698 + - 3.8615411103923036 + - 2.948434285984 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.248088064157821 + - 10.008904710496985 + - 9.908680791611037 + - 8.852506395174453 + - 10.008904710496985 + - 10.006252250627519 + - 9.400369124853432 + - 9.7090027425286 + - 9.90983952188916 + - 9.596035315160638 + - 9.384382905517992 + - 9.507961661063746 + - 9.065810036058673 + - !!python/tuple + - 8.325887039856488 + - 10.017015694836223 + - 9.847088053059313 + - 7.634815516437674 + - 10.017015694836223 + - 10.012754037606335 + - 9.043645240155438 + - 9.1670607738975 + - 9.786247713679963 + - 9.354169124221622 + - 8.969240450946174 + - 8.87720806083131 + - 8.292579086496346 + - !!python/tuple + - 7.411562522209291 + - 10.014688583064702 + - 9.737708425352404 + - 6.422077597161103 + - 10.02103711790891 + - 10.019641726580055 + - 8.572380657769965 + - 8.698373153121734 + - 9.598177897880634 + - 8.977255415656884 + - 8.486696650272302 + - 8.33031532881115 + - 7.564491376556777 + - !!python/tuple + - 6.544143606131132 + - 9.987776376746856 + - 9.555196078589166 + - 5.255046333984866 + - 9.984546170714841 + - 9.992837251791531 + - 8.160004873256094 + - 8.234111088086294 + - 9.391101184435298 + - 8.626338889599845 + - 7.993075169302427 + - 7.482539368789236 + - 6.985237640209993 + - !!python/tuple + - 5.636220025793032 + - 9.869854395986161 + - 9.170911033244371 + - 4.159664640678914 + - 9.910004724896678 + - 9.79290323698347 + - 7.769197567012141 + - 7.829490806983043 + - 9.15380005103576 + - 8.264971632529395 + - 7.329612972471374 + - 6.699656090727221 + - 6.524511330336058 + - !!python/tuple + - 4.740817229230817 + - 9.620053171956707 + - 8.740306533683462 + - 3.1114534971926906 + - 9.799945024910889 + - 9.512104833291216 + - 7.395374988346603 + - 7.488201820198147 + - 8.904150137545326 + - 7.892361194268989 + - 6.546869278289611 + - 5.971730553716775 + - 6.123541164496242 + - !!python/tuple + - 3.8281120285648247 + - 9.269000598416845 + - 8.274428355733885 + - 2.250491121779336 + - 9.65878087790494 + - 9.052018376439115 + - 7.029927390415099 + - 7.136324673456342 + - 8.667772926342996 + - 7.550629981876727 + - 5.638154645567134 + - 5.27053596924995 + - 5.7974035481421256 + - !!python/tuple + - 2.8996200106798353 + - 8.754743793882417 + - 7.751823584581235 + - 2.3469036023553294 + - 9.475911328494854 + - 8.468286792571954 + - 6.603836831834101 + - 6.739163253681449 + - 8.420377845949591 + - 7.0630265691489695 + - 4.641781080698855 + - 4.563636669090112 + - 5.503926306000297 + - !!python/tuple + - 2.1655993732788454 + - 8.24236244410471 + - 7.054245933975581 + - 2.091882166552123 + - 9.280684733909412 + - 7.793814265698254 + - 6.179269279315333 + - 6.3042415899950335 + - 8.186157779406642 + - 6.561830205295661 + - 3.71087378025055 + - 3.865947112133515 + - 5.1501304363748535 + - !!python/tuple + - 2.1655993732788454 + - 8.24236244410471 + - 7.054245933975581 + - 2.091882166552123 + - 9.280684733909412 + - 7.793814265698254 + - 6.179269279315333 + - 6.3042415899950335 + - 8.186157779406642 + - 6.561830205295661 + - 3.71087378025055 + - 3.865947112133515 + - 5.1501304363748535 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.964153275380378 + - 9.764358094005729 + - 9.612149191880116 + - 9.488432934148863 + - 10.01040687020203 + - 9.212141686068136 + - 9.285370344680215 + - 9.787538373425392 + - 9.238308190325025 + - 9.797601653636843 + - 9.330613686682339 + - 9.858367258936699 + - 9.56020066295111 + - !!python/tuple + - 8.067786756816854 + - 9.554456043371951 + - 9.27469149390307 + - 9.03377603445818 + - 10.019996076443508 + - 8.548499140356373 + - 8.677967094825128 + - 9.610494621926659 + - 8.38404027570352 + - 9.599769088528452 + - 8.302499910121243 + - 9.740632943836749 + - 9.171240099824951 + - !!python/tuple + - 7.182026557350763 + - 9.341463941487428 + - 8.926086752124554 + - 8.538824088444638 + - 10.030134087344983 + - 7.898441384164032 + - 8.030039534422496 + - 9.43987486455693 + - 7.550786249301024 + - 9.28122104008933 + - 7.32654917209206 + - 9.627445669404148 + - 8.757857572249168 + - !!python/tuple + - 6.282992121852917 + - 9.126558288512193 + - 8.588323540856361 + - 8.041091168202323 + - 10.040975740459816 + - 7.279221531350037 + - 7.392851670593454 + - 9.025895269964114 + - 6.80227050247227 + - 8.907087007307108 + - 6.388064390300653 + - 9.501436513829084 + - 8.282559496786611 + - !!python/tuple + - 5.368809251340997 + - 8.904054063570015 + - 8.278408724040977 + - 7.4896175539855205 + - 10.05227258064313 + - 6.733344191519114 + - 6.772106954785368 + - 8.62663003217464 + - 6.015626328596971 + - 8.511693264278577 + - 5.468204335199938 + - 9.333184479531804 + - 7.811233440957395 + - !!python/tuple + - 4.219861477359421 + - 8.670486907483639 + - 8.020018052029464 + - 6.94961070367645 + - 10.053341715474547 + - 6.284992158226037 + - 6.235584200194903 + - 8.22393333377974 + - 5.355774240311587 + - 8.030102273613426 + - 4.669280793630849 + - 9.143659757335833 + - 7.28738502175846 + - !!python/tuple + - 3.1391764177662314 + - 8.33066734700465 + - 7.802375425677366 + - 6.331772471974341 + - 10.030958495080299 + - 5.856544238219369 + - 5.7377783383393455 + - 7.76554310192447 + - 4.726489402797095 + - 7.555057070409482 + - 3.9079498582542964 + - 8.82616441381509 + - 6.701335768429907 + - !!python/tuple + - 2.0576967282800402 + - 7.889256010635311 + - 7.494779692800532 + - 5.704620258399462 + - 9.994944740357656 + - 5.2131795385897455 + - 5.320582839060089 + - 7.278129090148836 + - 4.203194981699534 + - 7.151964567830282 + - 3.281279488814955 + - 8.416908888753904 + - 6.131900438290468 + - !!python/tuple + - 2.0576967282800402 + - 7.889256010635311 + - 7.494779692800532 + - 5.704620258399462 + - 9.994944740357656 + - 5.2131795385897455 + - 5.320582839060089 + - 7.278129090148836 + - 4.203194981699534 + - 7.151964567830282 + - 3.281279488814955 + - 8.416908888753904 + - 6.131900438290468 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 9.235500081300437 + - 9.954444483738365 + - 9.465118740320538 + - 9.239560768235126 + - 10.010946147303308 + - 9.463570517996036 + - 9.205694384879154 + - 9.666683581105916 + - 8.933451815083963 + - 9.968327151328326 + - 9.762896059535619 + - 9.76022374437664 + - 9.483316346274457 + - !!python/tuple + - 8.482342451866451 + - 9.87187703629618 + - 8.82536735393269 + - 8.57232037272396 + - 10.02218434947813 + - 8.63438010943869 + - 8.534020484158821 + - 9.35672354953287 + - 7.963386200364909 + - 9.945528793267272 + - 9.416350124136587 + - 9.530421070007272 + - 9.012051959047396 + - !!python/tuple + - 7.778896015707968 + - 9.795998942364662 + - 8.336492688681524 + - 7.673571279224221 + - 10.03339251697893 + - 7.965568947146054 + - 7.767460847913289 + - 9.04170629278091 + - 7.1264435315540995 + - 9.882794442490852 + - 8.978074914941848 + - 9.176591521754396 + - 8.467364364849752 + - !!python/tuple + - 7.07990576319205 + - 9.691538504961327 + - 7.760013012882049 + - 6.828680224621633 + - 10.045050512976404 + - 7.150571162365267 + - 7.172324363416736 + - 8.658638267433618 + - 6.436906976966346 + - 9.811580576079683 + - 8.514959921115347 + - 8.723695508803662 + - 7.8437276782110725 + - !!python/tuple + - 6.353701846280889 + - 9.589066082130955 + - 7.31618892092209 + - 5.894874895504396 + - 10.055887784652748 + - 6.502980033752721 + - 6.396702677645882 + - 8.276882022633922 + - 5.900211512061095 + - 9.691223920117528 + - 8.145299145803458 + - 8.277567573353831 + - 7.076831635806033 + - !!python/tuple + - 5.517411990010513 + - 9.452855542306466 + - 6.810062424578336 + - 5.066279601842513 + - 10.066783686274546 + - 5.680024845080095 + - 5.740566894048141 + - 7.886996422019268 + - 5.4427667281459176 + - 9.575353913597601 + - 7.729616467000745 + - 7.841830123654087 + - 6.373914813151188 + - !!python/tuple + - 4.746236265083409 + - 9.298897467999055 + - 6.374943096760723 + - 4.166678972533609 + - 10.077537935550408 + - 4.937604636898633 + - 5.116267344441097 + - 7.511743304773605 + - 5.040477378218488 + - 9.15650484764946 + - 7.342001791087929 + - 7.429762138192579 + - 5.5715494854023655 + - !!python/tuple + - 3.9168882700316088 + - 9.116014933798867 + - 5.940342156591339 + - 3.348186506930177 + - 10.061947928335021 + - 4.156020193340487 + - 4.46026347207449 + - 7.147965739379039 + - 4.647008939018663 + - 8.694605613463716 + - 6.938749305229533 + - 7.042435259679597 + - 4.819663518913021 + - !!python/tuple + - 3.1397523912789427 + - 8.876789645622946 + - 5.517551872278159 + - 2.6028439254127376 + - 10.017347201404107 + - 3.338367025107803 + - 3.878784738316267 + - 6.722637121170602 + - 4.28039869161914 + - 8.231440707406476 + - 6.5003559209137 + - 6.583703742123728 + - 4.005152714096082 + - !!python/tuple + - 2.4024051069670063 + - 8.55327860529571 + - 5.130327769591315 + - 2.153405814893469 + - 9.853522819721334 + - 2.511542418352174 + - 3.2968772964711883 + - 6.208023774860778 + - 3.9107121393380524 + - 7.729418130980406 + - 5.859550650770598 + - 6.106461082817279 + - 3.1935400118259607 + - !!python/tuple + - 2.4024051069670063 + - 8.55327860529571 + - 5.130327769591315 + - 2.153405814893469 + - 9.853522819721334 + - 2.511542418352174 + - 3.2968772964711883 + - 6.208023774860778 + - 3.9107121393380524 + - 7.729418130980406 + - 5.859550650770598 + - 6.106461082817279 + - 3.1935400118259607 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.938195147788543 + - 10.007968590723852 + - 9.820302919133436 + - 9.154409262530127 + - 9.850487511609362 + - 9.36637650652157 + - 9.82008002905815 + - 9.079021930413045 + - 9.4250509516719 + - 10.007968590723852 + - 9.352246162831312 + - 9.844707516837344 + - 9.784461118510421 + - !!python/tuple + - 7.794584357967202 + - 10.016004853323993 + - 9.656322944431041 + - 8.316669707522832 + - 9.694318464842345 + - 8.78641011710935 + - 9.655591360451664 + - 8.235791849045548 + - 8.898847334514539 + - 9.686166621516268 + - 8.759332648661358 + - 9.703095932254787 + - 9.449047226054011 + - !!python/tuple + - 6.729599329642202 + - 10.024038476194022 + - 9.506803035362633 + - 7.30329805428097 + - 9.550107676551443 + - 8.25615883839521 + - 9.505605531172742 + - 7.39327434583952 + - 8.417775399710807 + - 9.39202326911491 + - 8.217239426030837 + - 9.516137008348426 + - 9.081079621709748 + - !!python/tuple + - 5.665506417171802 + - 10.032491725060991 + - 9.362338821287876 + - 6.318236837610299 + - 9.410788369131698 + - 7.742695055155122 + - 9.24890290529266 + - 6.580854249718909 + - 7.951918665550863 + - 9.049964819268759 + - 7.692315528640327 + - 9.335313135752925 + - 8.606555777400501 + - !!python/tuple + - 4.568259490149543 + - 10.041250558736039 + - 9.137608944224288 + - 5.370094097668291 + - 9.277504894418085 + - 7.248133839846766 + - 8.994960024809545 + - 5.837156912773553 + - 7.437705542974564 + - 8.721810726851329 + - 7.094672135990779 + - 9.162129211144185 + - 8.151258341809326 + - !!python/tuple + - 3.5251282489699767 + - 10.049386888640072 + - 8.914556602317518 + - 4.499934729797232 + - 9.147039754925459 + - 6.818045909282658 + - 8.784226464808752 + - 4.774624223063501 + - 7.022802260434897 + - 8.43827612275388 + - 6.579248213525642 + - 8.954115384324533 + - 7.741341236953002 + - !!python/tuple + - 2.5183705785053085 + - 10.006251460125634 + - 8.666072110597085 + - 3.6636824280935683 + - 8.953915765618902 + - 6.231547931833246 + - 8.542165443047748 + - 3.767841353539332 + - 6.6071868719380085 + - 8.124836749201839 + - 6.02783566725759 + - 8.756211796729472 + - 7.346585847625595 + - !!python/tuple + - 1.6599437053309525 + - 9.91986994420403 + - 8.386092700846273 + - 2.8635760660025587 + - 8.733261858577608 + - 5.6155184188420595 + - 8.255280346453198 + - 2.8212654986439736 + - 6.19610744035868 + - 7.575442373561573 + - 5.4515797673510376 + - 8.560315034701556 + - 6.808694986311057 + - !!python/tuple + - 1.6599437053309525 + - 9.91986994420403 + - 8.386092700846273 + - 2.8635760660025587 + - 8.733261858577608 + - 5.6155184188420595 + - 8.255280346453198 + - 2.8212654986439736 + - 6.19610744035868 + - 7.575442373561573 + - 5.4515797673510376 + - 8.560315034701556 + - 6.808694986311057 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.956159205357935 + - 10.008348988256524 + - 9.341241662669955 + - 9.719107533945598 + - 9.90608356075667 + - 8.872087031407212 + - 9.637594416055075 + - 9.728828157593279 + - 9.610199474588539 + - 10.008348988256524 + - 9.410288017627623 + - 9.445490065462224 + - 9.677001574603098 + - !!python/tuple + - 7.777079327144906 + - 10.016765572922521 + - 8.74687603203257 + - 9.436759569235283 + - 9.77689903959177 + - 7.883678479365834 + - 9.097791864342994 + - 9.481144007501758 + - 9.253840579233783 + - 9.879509024283564 + - 8.870813177675572 + - 8.93825776140818 + - 9.304945833206965 + - !!python/tuple + - 6.5503558187546815 + - 10.025562241262303 + - 8.178796069323479 + - 9.100471963375648 + - 9.618943502254865 + - 6.9696728493516655 + - 8.569954056610255 + - 9.244728155142019 + - 8.81642104774395 + - 9.756831537178583 + - 8.326147722711891 + - 8.453496457901322 + - 8.949464732259504 + - !!python/tuple + - 5.398190218919211 + - 10.034482386568172 + - 7.648809298107397 + - 8.78498017809202 + - 9.46850276753876 + - 6.118214315140895 + - 7.874461338780614 + - 9.024345586452922 + - 8.408174006550924 + - 9.621078155643358 + - 7.81792861435682 + - 8.001203234550673 + - 8.345999140189496 + - !!python/tuple + - 4.2894974707473965 + - 10.043650813358115 + - 7.145219198711628 + - 8.46444103960302 + - 9.32260425200583 + - 5.312110430904589 + - 7.14129345748703 + - 8.805987412615666 + - 7.793672055582637 + - 9.492255670192192 + - 7.318764125922204 + - 7.571294587562781 + - 7.7716575975859 + - !!python/tuple + - 3.176941556661889 + - 10.053156112947931 + - 6.6608055707388125 + - 8.145522005376598 + - 9.182232406176794 + - 4.548723885664309 + - 6.402984360313161 + - 8.56759586997781 + - 7.211277541654518 + - 9.108688548050077 + - 6.838371989383307 + - 7.157460572110574 + - 7.194572988023817 + - !!python/tuple + - 2.110701832611445 + - 10.053447917434845 + - 6.180228996869319 + - 7.769609735044619 + - 9.038966659652539 + - 3.8356778663063196 + - 5.609516263567832 + - 8.296317156406374 + - 6.656215841686867 + - 8.702221604587871 + - 6.328617506495471 + - 6.735317181378077 + - 6.605198841604266 + - !!python/tuple + - 3.2479136631834162 + - 10.00570557124003 + - 5.779600873624396 + - 7.367039905612012 + - 8.89838112304403 + - 3.273420789039164 + - 4.9076472267955165 + - 7.866991485551281 + - 6.226617036695709 + - 8.239569259215632 + - 5.858204445288585 + - 6.153224305304893 + - 5.964618105748134 + - !!python/tuple + - 2.1756852530965824 + - 10.000459954348935 + - 5.448950756935191 + - 6.869525211636629 + - 8.761001670700484 + - 2.896805872927053 + - 4.263217118631437 + - 7.401272303174615 + - 5.815804509832793 + - 7.740315828316409 + - 5.422998579509737 + - 5.367445263367635 + - 5.274923861344503 + - !!python/tuple + - 2.543538104143016 + - 9.925709551453428 + - 5.094136746330696 + - 6.283734038431753 + - 8.607222793374616 + - 2.5607719982272306 + - 3.4990253447996817 + - 6.849990068193276 + - 5.270831303523581 + - 7.154775063169702 + - 4.818080716213187 + - 4.489593865344022 + - 4.507341932771636 + - !!python/tuple + - 1.7196190935456876 + - 9.613280085748361 + - 4.762002084405086 + - 5.732381771782974 + - 8.462481806175084 + - 2.4034893631115124 + - 2.886936056807828 + - 6.289266930070831 + - 4.772154702758699 + - 6.604868834869578 + - 4.21273910595992 + - 3.6755622275359854 + - 3.8042559934800404 + - !!python/tuple + - 1.7196190935456876 + - 9.613280085748361 + - 4.762002084405086 + - 5.732381771782974 + - 8.462481806175084 + - 2.4034893631115124 + - 2.886936056807828 + - 6.289266930070831 + - 4.772154702758699 + - 6.604868834869578 + - 4.21273910595992 + - 3.6755622275359854 + - 3.8042559934800404 +- - !!python/tuple + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - 10.0 + - !!python/tuple + - 8.849180831204407 + - 10.010460146021154 + - 9.47566322153158 + - 9.451077595563373 + - 10.010460146021154 + - 9.339890993866556 + - 9.349841748736171 + - 9.487151006023277 + - 9.609306038610807 + - 9.947643403697676 + - 9.470882038194599 + - 9.286813388178148 + - 9.81641388843737 + - !!python/tuple + - 7.756345590199937 + - 10.021252672490009 + - 8.985045259039095 + - 8.792172036127305 + - 10.021252672490009 + - 8.722015474601621 + - 8.550903016009679 + - 9.007301170832449 + - 9.25168674509095 + - 9.782512340661517 + - 8.97578244658187 + - 8.639329692098087 + - 9.569902290909717 + - !!python/tuple + - 7.756345590199937 + - 10.021252672490009 + - 8.985045259039095 + - 8.792172036127305 + - 10.021252672490009 + - 8.722015474601621 + - 8.550903016009679 + - 9.007301170832449 + - 9.25168674509095 + - 9.782512340661517 + - 8.97578244658187 + - 8.639329692098087 + - 9.569902290909717 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.77533564113695 + - 61.26049127219263 + - 57.764945137850354 + - 54.33006006093741 + - 50.96056245035337 + - 47.76550174878428 + - 44.66569152438721 + - 41.611285577254215 + - 41.611285577254215 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.12165717572489 + - 60.25005229236851 + - 56.500566720589205 + - 52.80343593331602 + - 49.15928586577631 + - 45.59295472745258 + - 42.10003444634719 + - 42.10003444634719 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 63.44818341788816 + - 59.82283871661548 + - 56.255768424050096 + - 52.828453242362166 + - 49.42394423298395 + - 46.20185037363548 + - 42.99627286962369 + - 39.88488795299308 + - 39.88488795299308 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 3412.0 + - 3925.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 64.09571813543337 + - 60.36593321313504 + - 56.51945153604289 + - 52.78107002831135 + - 48.99798839328177 + - 45.17001638698517 + - 41.52376947203019 + - 38.02525679634855 + - 34.64461909296893 + - 34.549793597034466 + - 34.549793597034466 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 3412.0 + - 3925.0 + - 4465.0 + - 5032.0 + - 5626.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.50267625625066 + - 58.563628389581844 + - 55.65278841300775 + - 52.86632502854933 + - 49.86349189658797 + - 46.824941796968105 + - 43.704735877325504 + - 40.59121641313349 + - 37.50950425894563 + - 37.50950425894563 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 63.69532319421208 + - 60.48990972093021 + - 57.249301628331914 + - 53.87777478741084 + - 50.53546944117176 + - 47.116809816768 + - 43.625889200879136 + - 40.232519983839765 + - 40.232519983839765 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 3412.0 + - 3925.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 60.83258503384364 + - 57.57540183810115 + - 54.20014053561061 + - 50.76930272074904 + - 47.34510154781586 + - 44.03690812660497 + - 40.816737989985924 + - 37.676969272624554 + - 34.76187411550433 + - 31.987489928861255 + - 31.987489928861255 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 62.27994810653351 + - 58.80435672156049 + - 55.35967108349571 + - 51.944373288026306 + - 48.60388447269688 + - 45.43173559425824 + - 42.369219555606314 + - 39.6061873474749 + - 39.6061873474749 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 3412.0 + - 3925.0 + - 4465.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 69.32158767994972 + - 65.84089532187849 + - 62.324435998030275 + - 58.79121841660665 + - 55.26394038482617 + - 51.72128106285688 + - 48.250869428088365 + - 46.385416913550245 + - 42.87176754766969 + - 39.98307632891716 + - 36.591629410732715 + - 36.591629410732715 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 10000.0 + - !!python/tuple + - 68.30388079811371 + - 61.76486685755126 + - 58.07372615152498 + - 58.07372615152498 +problem_name: FIXEDSAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8954631735126897 + - 0.7913322471449954 + - 0.6877730510832364 + - 0.5860110020474942 + - 0.48618612482562384 + - 0.3915291227702718 + - 0.29969401533777235 + - 0.2092040569236299 + - 0.2092040569236299 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8760972679404853 + - 0.7613969396426845 + - 0.6503145231802593 + - 0.5407831717546169 + - 0.43282142934899825 + - 0.3271651537969903 + - 0.22368375137311705 + - 0.22368375137311705 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8561449062064906 + - 0.748740292368888 + - 0.6430621186023839 + - 0.5415243355993719 + - 0.440662209211627 + - 0.34520432169258763 + - 0.25023574840794854 + - 0.15805772865894693 + - 0.15805772865894693 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 0.3412 + - 0.3925 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8753287968472812 + - 0.764830032650835 + - 0.6508740055132041 + - 0.5401205585169537 + - 0.4280428236787083 + - 0.3146351648226806 + - 0.20661130112778578 + - 0.10296421818815948 + - 0.0028093041109235888 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.2035 + - 0.2467 + - 0.2926 + - 0.3412 + - 0.3925 + - 0.4465 + - 0.5032 + - 0.5626 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7985072296179412 + - 0.7114348745232716 + - 0.6251982075610251 + - 0.5426463267218561 + - 0.45368426668826856 + - 0.36366405427610426 + - 0.27122470312271757 + - 0.1789834451783325 + - 0.08768451193124055 + - 0.08768451193124055 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8634666795624597 + - 0.7685029658590897 + - 0.6724965748909857 + - 0.5726115796062289 + - 0.4735923015458162 + - 0.3723109484451328 + - 0.2688887881866488 + - 0.16835668975292573 + - 0.16835668975292573 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 0.3412 + - 0.3925 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7786550790201436 + - 0.682157633352635 + - 0.5821620007531368 + - 0.4805198560723033 + - 0.3790743288229782 + - 0.28106565208100687 + - 0.18566475685205555 + - 0.09264583743476555 + - 0.006283106315583616 + - -0.07591091570360357 + - -0.07591091570360357 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8215347179826095 + - 0.7185667021607538 + - 0.616514301290182 + - 0.5153325458741977 + - 0.41636708443453496 + - 0.32238886901008657 + - 0.23165864068520367 + - 0.14980093285647383 + - 0.14980093285647383 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 0.3412 + - 0.3925 + - 0.4465 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0301506266714706 + - 0.9270314892071362 + - 0.8228527181178743 + - 0.7181774661883641 + - 0.6136781796051471 + - 0.508723206275102 + - 0.4059086459495733 + - 0.3506426716862114 + - 0.246547148529294 + - 0.16096666159317646 + - 0.06049151326577612 + - 0.06049151326577612 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8062748993445341 + - 0.6969210103165926 + - 0.6969210103165926 +solver_name: STRONG diff --git a/test/expected_results/HOTEL1_RNDSRCH.yaml b/test/expected_results/HOTEL1_RNDSRCH.yaml new file mode 100644 index 000000000..57042f7d1 --- /dev/null +++ b/test/expected_results/HOTEL1_RNDSRCH.yaml @@ -0,0 +1,3282 @@ +all_est_objectives: +- - 0.0 + - 36831.0 + - 37319.0 + - 39584.0 + - 39584.0 +- - 0.0 + - 38624.0 + - 39816.0 + - 39816.0 +- - 0.0 + - 36061.0 + - 37133.0 + - 39026.0 + - 39026.0 +- - 0.0 + - 36698.0 + - 37325.0 + - 39030.0 +- - 0.0 + - 31166.0 + - 38914.0 + - 37365.0 + - 37365.0 +- - 0.0 + - 36846.0 + - 37614.0 + - 37614.0 +- - 0.0 + - 33624.0 + - 33959.0 + - 35094.0 + - 38828.0 + - 38828.0 +- - 0.0 + - 33750.0 + - 34843.0 + - 37056.0 + - 40026.0 + - 40026.0 +- - 0.0 + - 31352.0 + - 32652.0 + - 34027.0 + - 34691.0 + - 37709.0 + - 38153.0 + - 38153.0 +- - 0.0 + - 36654.0 + - 38319.0 + - 38319.0 +all_intermediate_budgets: +- - 0 + - 20 + - 40 + - 70 + - 100 +- - 0 + - 20 + - 60 + - 100 +- - 0 + - 20 + - 40 + - 90 + - 100 +- - 0 + - 20 + - 40 + - 100 +- - 0 + - 20 + - 30 + - 50 + - 100 +- - 0 + - 20 + - 70 + - 100 +- - 0 + - 20 + - 30 + - 40 + - 90 + - 100 +- - 0 + - 20 + - 40 + - 50 + - 80 + - 100 +- - 0 + - 20 + - 30 + - 40 + - 50 + - 60 + - 70 + - 100 +- - 0 + - 20 + - 70 + - 100 +all_recommended_xs: +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 65.0 + - 55.0 + - 75.0 + - 74.0 + - 82.0 + - 6.0 + - 76.0 + - 41.0 + - 24.0 + - 21.0 + - 2.0 + - 22.0 + - 84.0 + - 51.0 + - 42.0 + - 59.0 + - 100.0 + - 28.0 + - 39.0 + - 57.0 + - 15.0 + - 87.0 + - 46.0 + - 27.0 + - 98.0 + - 5.0 + - 90.0 + - 14.0 + - 54.0 + - 63.0 + - 3.0 + - 71.0 + - 54.0 + - 96.0 + - 54.0 + - 65.0 + - 58.0 + - 82.0 + - 17.0 + - 50.0 + - 20.0 + - 10.0 + - 73.0 + - 81.0 + - 67.0 + - 100.0 + - 39.0 + - 46.0 + - 87.0 + - 94.0 + - 44.0 + - 24.0 + - 45.0 + - 85.0 + - 88.0 + - 85.0 + - !!python/tuple + - 20.0 + - 41.0 + - 40.0 + - 97.0 + - 93.0 + - 36.0 + - 60.0 + - 29.0 + - 37.0 + - 49.0 + - 56.0 + - 88.0 + - 60.0 + - 71.0 + - 47.0 + - 91.0 + - 71.0 + - 42.0 + - 88.0 + - 58.0 + - 92.0 + - 90.0 + - 36.0 + - 94.0 + - 35.0 + - 1.0 + - 56.0 + - 85.0 + - 74.0 + - 11.0 + - 39.0 + - 91.0 + - 28.0 + - 69.0 + - 67.0 + - 0.0 + - 100.0 + - 1.0 + - 55.0 + - 73.0 + - 26.0 + - 84.0 + - 31.0 + - 65.0 + - 32.0 + - 96.0 + - 7.0 + - 14.0 + - 64.0 + - 14.0 + - 25.0 + - 21.0 + - 33.0 + - 9.0 + - 78.0 + - 76.0 + - !!python/tuple + - 80.0 + - 27.0 + - 51.0 + - 77.0 + - 61.0 + - 41.0 + - 45.0 + - 68.0 + - 95.0 + - 28.0 + - 86.0 + - 68.0 + - 78.0 + - 28.0 + - 81.0 + - 21.0 + - 82.0 + - 31.0 + - 96.0 + - 83.0 + - 11.0 + - 31.0 + - 26.0 + - 63.0 + - 45.0 + - 54.0 + - 3.0 + - 89.0 + - 56.0 + - 91.0 + - 83.0 + - 100.0 + - 35.0 + - 82.0 + - 86.0 + - 70.0 + - 17.0 + - 37.0 + - 64.0 + - 54.0 + - 8.0 + - 68.0 + - 75.0 + - 60.0 + - 33.0 + - 2.0 + - 34.0 + - 67.0 + - 64.0 + - 55.0 + - 39.0 + - 77.0 + - 14.0 + - 60.0 + - 31.0 + - 4.0 + - !!python/tuple + - 80.0 + - 27.0 + - 51.0 + - 77.0 + - 61.0 + - 41.0 + - 45.0 + - 68.0 + - 95.0 + - 28.0 + - 86.0 + - 68.0 + - 78.0 + - 28.0 + - 81.0 + - 21.0 + - 82.0 + - 31.0 + - 96.0 + - 83.0 + - 11.0 + - 31.0 + - 26.0 + - 63.0 + - 45.0 + - 54.0 + - 3.0 + - 89.0 + - 56.0 + - 91.0 + - 83.0 + - 100.0 + - 35.0 + - 82.0 + - 86.0 + - 70.0 + - 17.0 + - 37.0 + - 64.0 + - 54.0 + - 8.0 + - 68.0 + - 75.0 + - 60.0 + - 33.0 + - 2.0 + - 34.0 + - 67.0 + - 64.0 + - 55.0 + - 39.0 + - 77.0 + - 14.0 + - 60.0 + - 31.0 + - 4.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 72.0 + - 24.0 + - 88.0 + - 72.0 + - 92.0 + - 50.0 + - 22.0 + - 45.0 + - 97.0 + - 7.0 + - 34.0 + - 78.0 + - 36.0 + - 9.0 + - 66.0 + - 27.0 + - 64.0 + - 78.0 + - 96.0 + - 11.0 + - 30.0 + - 3.0 + - 83.0 + - 43.0 + - 23.0 + - 95.0 + - 49.0 + - 73.0 + - 67.0 + - 40.0 + - 26.0 + - 44.0 + - 74.0 + - 58.0 + - 19.0 + - 6.0 + - 3.0 + - 43.0 + - 73.0 + - 71.0 + - 95.0 + - 75.0 + - 52.0 + - 97.0 + - 1.0 + - 14.0 + - 76.0 + - 63.0 + - 73.0 + - 36.0 + - 56.0 + - 18.0 + - 18.0 + - 67.0 + - 84.0 + - 73.0 + - !!python/tuple + - 11.0 + - 100.0 + - 97.0 + - 17.0 + - 61.0 + - 26.0 + - 94.0 + - 94.0 + - 89.0 + - 11.0 + - 42.0 + - 30.0 + - 7.0 + - 52.0 + - 27.0 + - 67.0 + - 39.0 + - 52.0 + - 1.0 + - 94.0 + - 52.0 + - 77.0 + - 84.0 + - 43.0 + - 7.0 + - 90.0 + - 54.0 + - 31.0 + - 50.0 + - 95.0 + - 62.0 + - 86.0 + - 93.0 + - 50.0 + - 23.0 + - 55.0 + - 89.0 + - 69.0 + - 92.0 + - 16.0 + - 63.0 + - 69.0 + - 97.0 + - 42.0 + - 80.0 + - 96.0 + - 81.0 + - 89.0 + - 94.0 + - 4.0 + - 72.0 + - 100.0 + - 24.0 + - 39.0 + - 24.0 + - 48.0 + - !!python/tuple + - 11.0 + - 100.0 + - 97.0 + - 17.0 + - 61.0 + - 26.0 + - 94.0 + - 94.0 + - 89.0 + - 11.0 + - 42.0 + - 30.0 + - 7.0 + - 52.0 + - 27.0 + - 67.0 + - 39.0 + - 52.0 + - 1.0 + - 94.0 + - 52.0 + - 77.0 + - 84.0 + - 43.0 + - 7.0 + - 90.0 + - 54.0 + - 31.0 + - 50.0 + - 95.0 + - 62.0 + - 86.0 + - 93.0 + - 50.0 + - 23.0 + - 55.0 + - 89.0 + - 69.0 + - 92.0 + - 16.0 + - 63.0 + - 69.0 + - 97.0 + - 42.0 + - 80.0 + - 96.0 + - 81.0 + - 89.0 + - 94.0 + - 4.0 + - 72.0 + - 100.0 + - 24.0 + - 39.0 + - 24.0 + - 48.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 38.0 + - 95.0 + - 3.0 + - 14.0 + - 11.0 + - 73.0 + - 90.0 + - 94.0 + - 28.0 + - 50.0 + - 16.0 + - 70.0 + - 51.0 + - 44.0 + - 15.0 + - 61.0 + - 12.0 + - 68.0 + - 96.0 + - 33.0 + - 84.0 + - 41.0 + - 61.0 + - 40.0 + - 56.0 + - 57.0 + - 83.0 + - 31.0 + - 8.0 + - 64.0 + - 13.0 + - 54.0 + - 90.0 + - 69.0 + - 13.0 + - 18.0 + - 81.0 + - 4.0 + - 88.0 + - 1.0 + - 48.0 + - 37.0 + - 99.0 + - 16.0 + - 92.0 + - 12.0 + - 68.0 + - 34.0 + - 48.0 + - 64.0 + - 9.0 + - 0.0 + - 49.0 + - 88.0 + - 45.0 + - 31.0 + - !!python/tuple + - 98.0 + - 68.0 + - 51.0 + - 32.0 + - 69.0 + - 43.0 + - 71.0 + - 58.0 + - 48.0 + - 96.0 + - 64.0 + - 84.0 + - 39.0 + - 93.0 + - 37.0 + - 91.0 + - 66.0 + - 14.0 + - 29.0 + - 90.0 + - 21.0 + - 50.0 + - 12.0 + - 31.0 + - 64.0 + - 100.0 + - 99.0 + - 18.0 + - 5.0 + - 24.0 + - 68.0 + - 56.0 + - 71.0 + - 71.0 + - 92.0 + - 68.0 + - 77.0 + - 14.0 + - 99.0 + - 48.0 + - 41.0 + - 3.0 + - 22.0 + - 66.0 + - 82.0 + - 62.0 + - 24.0 + - 12.0 + - 63.0 + - 26.0 + - 42.0 + - 14.0 + - 77.0 + - 23.0 + - 45.0 + - 91.0 + - !!python/tuple + - 42.0 + - 83.0 + - 45.0 + - 49.0 + - 59.0 + - 64.0 + - 48.0 + - 54.0 + - 37.0 + - 97.0 + - 71.0 + - 7.0 + - 78.0 + - 0.0 + - 79.0 + - 65.0 + - 84.0 + - 81.0 + - 86.0 + - 11.0 + - 98.0 + - 0.0 + - 82.0 + - 44.0 + - 23.0 + - 75.0 + - 3.0 + - 73.0 + - 86.0 + - 30.0 + - 86.0 + - 18.0 + - 46.0 + - 49.0 + - 76.0 + - 60.0 + - 40.0 + - 92.0 + - 49.0 + - 44.0 + - 85.0 + - 17.0 + - 16.0 + - 30.0 + - 67.0 + - 17.0 + - 51.0 + - 80.0 + - 39.0 + - 97.0 + - 20.0 + - 52.0 + - 86.0 + - 83.0 + - 15.0 + - 39.0 + - !!python/tuple + - 42.0 + - 83.0 + - 45.0 + - 49.0 + - 59.0 + - 64.0 + - 48.0 + - 54.0 + - 37.0 + - 97.0 + - 71.0 + - 7.0 + - 78.0 + - 0.0 + - 79.0 + - 65.0 + - 84.0 + - 81.0 + - 86.0 + - 11.0 + - 98.0 + - 0.0 + - 82.0 + - 44.0 + - 23.0 + - 75.0 + - 3.0 + - 73.0 + - 86.0 + - 30.0 + - 86.0 + - 18.0 + - 46.0 + - 49.0 + - 76.0 + - 60.0 + - 40.0 + - 92.0 + - 49.0 + - 44.0 + - 85.0 + - 17.0 + - 16.0 + - 30.0 + - 67.0 + - 17.0 + - 51.0 + - 80.0 + - 39.0 + - 97.0 + - 20.0 + - 52.0 + - 86.0 + - 83.0 + - 15.0 + - 39.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 22.0 + - 21.0 + - 29.0 + - 51.0 + - 91.0 + - 100.0 + - 32.0 + - 20.0 + - 35.0 + - 99.0 + - 42.0 + - 17.0 + - 62.0 + - 30.0 + - 12.0 + - 34.0 + - 14.0 + - 57.0 + - 30.0 + - 28.0 + - 31.0 + - 2.0 + - 49.0 + - 10.0 + - 67.0 + - 0.0 + - 74.0 + - 2.0 + - 22.0 + - 78.0 + - 71.0 + - 45.0 + - 55.0 + - 28.0 + - 75.0 + - 50.0 + - 93.0 + - 39.0 + - 65.0 + - 4.0 + - 55.0 + - 64.0 + - 93.0 + - 10.0 + - 43.0 + - 82.0 + - 45.0 + - 65.0 + - 68.0 + - 96.0 + - 53.0 + - 60.0 + - 38.0 + - 13.0 + - 99.0 + - 46.0 + - !!python/tuple + - 33.0 + - 20.0 + - 38.0 + - 67.0 + - 21.0 + - 97.0 + - 36.0 + - 2.0 + - 20.0 + - 53.0 + - 24.0 + - 28.0 + - 25.0 + - 78.0 + - 38.0 + - 49.0 + - 26.0 + - 84.0 + - 62.0 + - 74.0 + - 83.0 + - 46.0 + - 52.0 + - 100.0 + - 54.0 + - 76.0 + - 5.0 + - 0.0 + - 39.0 + - 43.0 + - 51.0 + - 32.0 + - 74.0 + - 78.0 + - 66.0 + - 99.0 + - 38.0 + - 40.0 + - 50.0 + - 70.0 + - 59.0 + - 54.0 + - 96.0 + - 100.0 + - 11.0 + - 30.0 + - 80.0 + - 57.0 + - 86.0 + - 19.0 + - 81.0 + - 97.0 + - 3.0 + - 19.0 + - 7.0 + - 88.0 + - !!python/tuple + - 26.0 + - 31.0 + - 75.0 + - 29.0 + - 61.0 + - 5.0 + - 23.0 + - 32.0 + - 57.0 + - 0.0 + - 46.0 + - 68.0 + - 60.0 + - 19.0 + - 27.0 + - 0.0 + - 99.0 + - 35.0 + - 94.0 + - 16.0 + - 52.0 + - 54.0 + - 100.0 + - 83.0 + - 46.0 + - 97.0 + - 100.0 + - 62.0 + - 91.0 + - 63.0 + - 61.0 + - 3.0 + - 80.0 + - 81.0 + - 43.0 + - 30.0 + - 38.0 + - 39.0 + - 64.0 + - 27.0 + - 85.0 + - 48.0 + - 59.0 + - 40.0 + - 51.0 + - 68.0 + - 8.0 + - 8.0 + - 95.0 + - 57.0 + - 58.0 + - 18.0 + - 31.0 + - 92.0 + - 5.0 + - 42.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 91.0 + - 43.0 + - 9.0 + - 93.0 + - 95.0 + - 1.0 + - 40.0 + - 7.0 + - 19.0 + - 81.0 + - 72.0 + - 21.0 + - 14.0 + - 33.0 + - 91.0 + - 91.0 + - 83.0 + - 84.0 + - 25.0 + - 54.0 + - 98.0 + - 4.0 + - 6.0 + - 39.0 + - 14.0 + - 60.0 + - 93.0 + - 23.0 + - 6.0 + - 25.0 + - 4.0 + - 73.0 + - 0.0 + - 57.0 + - 31.0 + - 5.0 + - 36.0 + - 29.0 + - 9.0 + - 23.0 + - 30.0 + - 60.0 + - 77.0 + - 0.0 + - 15.0 + - 56.0 + - 98.0 + - 80.0 + - 69.0 + - 7.0 + - 34.0 + - 85.0 + - 53.0 + - 60.0 + - 14.0 + - 30.0 + - !!python/tuple + - 87.0 + - 77.0 + - 63.0 + - 99.0 + - 70.0 + - 85.0 + - 93.0 + - 33.0 + - 51.0 + - 71.0 + - 82.0 + - 72.0 + - 17.0 + - 96.0 + - 79.0 + - 73.0 + - 70.0 + - 5.0 + - 68.0 + - 22.0 + - 68.0 + - 26.0 + - 55.0 + - 0.0 + - 4.0 + - 30.0 + - 89.0 + - 64.0 + - 46.0 + - 45.0 + - 100.0 + - 82.0 + - 88.0 + - 78.0 + - 71.0 + - 93.0 + - 15.0 + - 34.0 + - 40.0 + - 71.0 + - 19.0 + - 47.0 + - 19.0 + - 26.0 + - 41.0 + - 7.0 + - 49.0 + - 10.0 + - 87.0 + - 12.0 + - 8.0 + - 83.0 + - 66.0 + - 47.0 + - 90.0 + - 20.0 + - !!python/tuple + - 6.0 + - 13.0 + - 5.0 + - 25.0 + - 12.0 + - 89.0 + - 91.0 + - 6.0 + - 58.0 + - 4.0 + - 70.0 + - 73.0 + - 94.0 + - 13.0 + - 99.0 + - 47.0 + - 78.0 + - 52.0 + - 71.0 + - 63.0 + - 68.0 + - 46.0 + - 94.0 + - 4.0 + - 35.0 + - 69.0 + - 90.0 + - 95.0 + - 13.0 + - 8.0 + - 47.0 + - 37.0 + - 95.0 + - 36.0 + - 43.0 + - 99.0 + - 35.0 + - 35.0 + - 77.0 + - 24.0 + - 36.0 + - 51.0 + - 3.0 + - 81.0 + - 82.0 + - 27.0 + - 69.0 + - 100.0 + - 68.0 + - 89.0 + - 3.0 + - 63.0 + - 87.0 + - 17.0 + - 75.0 + - 77.0 + - !!python/tuple + - 6.0 + - 13.0 + - 5.0 + - 25.0 + - 12.0 + - 89.0 + - 91.0 + - 6.0 + - 58.0 + - 4.0 + - 70.0 + - 73.0 + - 94.0 + - 13.0 + - 99.0 + - 47.0 + - 78.0 + - 52.0 + - 71.0 + - 63.0 + - 68.0 + - 46.0 + - 94.0 + - 4.0 + - 35.0 + - 69.0 + - 90.0 + - 95.0 + - 13.0 + - 8.0 + - 47.0 + - 37.0 + - 95.0 + - 36.0 + - 43.0 + - 99.0 + - 35.0 + - 35.0 + - 77.0 + - 24.0 + - 36.0 + - 51.0 + - 3.0 + - 81.0 + - 82.0 + - 27.0 + - 69.0 + - 100.0 + - 68.0 + - 89.0 + - 3.0 + - 63.0 + - 87.0 + - 17.0 + - 75.0 + - 77.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 30.0 + - 60.0 + - 18.0 + - 96.0 + - 22.0 + - 15.0 + - 7.0 + - 51.0 + - 77.0 + - 76.0 + - 84.0 + - 92.0 + - 31.0 + - 23.0 + - 41.0 + - 29.0 + - 58.0 + - 24.0 + - 21.0 + - 23.0 + - 64.0 + - 3.0 + - 36.0 + - 42.0 + - 19.0 + - 41.0 + - 8.0 + - 29.0 + - 99.0 + - 28.0 + - 96.0 + - 58.0 + - 81.0 + - 84.0 + - 65.0 + - 85.0 + - 0.0 + - 36.0 + - 98.0 + - 14.0 + - 7.0 + - 14.0 + - 59.0 + - 35.0 + - 57.0 + - 9.0 + - 90.0 + - 58.0 + - 95.0 + - 57.0 + - 66.0 + - 36.0 + - 60.0 + - 97.0 + - 65.0 + - 1.0 + - !!python/tuple + - 11.0 + - 17.0 + - 15.0 + - 41.0 + - 89.0 + - 88.0 + - 83.0 + - 18.0 + - 30.0 + - 68.0 + - 78.0 + - 45.0 + - 17.0 + - 48.0 + - 20.0 + - 10.0 + - 32.0 + - 47.0 + - 66.0 + - 68.0 + - 85.0 + - 4.0 + - 83.0 + - 94.0 + - 63.0 + - 9.0 + - 78.0 + - 12.0 + - 80.0 + - 28.0 + - 94.0 + - 76.0 + - 97.0 + - 62.0 + - 92.0 + - 55.0 + - 44.0 + - 7.0 + - 27.0 + - 84.0 + - 51.0 + - 96.0 + - 37.0 + - 39.0 + - 36.0 + - 13.0 + - 46.0 + - 49.0 + - 7.0 + - 21.0 + - 55.0 + - 75.0 + - 2.0 + - 36.0 + - 90.0 + - 64.0 + - !!python/tuple + - 11.0 + - 17.0 + - 15.0 + - 41.0 + - 89.0 + - 88.0 + - 83.0 + - 18.0 + - 30.0 + - 68.0 + - 78.0 + - 45.0 + - 17.0 + - 48.0 + - 20.0 + - 10.0 + - 32.0 + - 47.0 + - 66.0 + - 68.0 + - 85.0 + - 4.0 + - 83.0 + - 94.0 + - 63.0 + - 9.0 + - 78.0 + - 12.0 + - 80.0 + - 28.0 + - 94.0 + - 76.0 + - 97.0 + - 62.0 + - 92.0 + - 55.0 + - 44.0 + - 7.0 + - 27.0 + - 84.0 + - 51.0 + - 96.0 + - 37.0 + - 39.0 + - 36.0 + - 13.0 + - 46.0 + - 49.0 + - 7.0 + - 21.0 + - 55.0 + - 75.0 + - 2.0 + - 36.0 + - 90.0 + - 64.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 8.0 + - 44.0 + - 74.0 + - 74.0 + - 60.0 + - 85.0 + - 94.0 + - 73.0 + - 7.0 + - 32.0 + - 68.0 + - 52.0 + - 32.0 + - 93.0 + - 77.0 + - 51.0 + - 9.0 + - 36.0 + - 39.0 + - 12.0 + - 4.0 + - 42.0 + - 86.0 + - 35.0 + - 56.0 + - 27.0 + - 46.0 + - 97.0 + - 4.0 + - 85.0 + - 52.0 + - 14.0 + - 38.0 + - 26.0 + - 82.0 + - 62.0 + - 2.0 + - 84.0 + - 93.0 + - 22.0 + - 10.0 + - 18.0 + - 69.0 + - 50.0 + - 36.0 + - 26.0 + - 92.0 + - 46.0 + - 30.0 + - 80.0 + - 91.0 + - 86.0 + - 90.0 + - 24.0 + - 39.0 + - 71.0 + - !!python/tuple + - 43.0 + - 9.0 + - 27.0 + - 11.0 + - 39.0 + - 25.0 + - 3.0 + - 76.0 + - 76.0 + - 64.0 + - 19.0 + - 94.0 + - 98.0 + - 92.0 + - 62.0 + - 68.0 + - 14.0 + - 44.0 + - 54.0 + - 25.0 + - 91.0 + - 99.0 + - 38.0 + - 67.0 + - 35.0 + - 30.0 + - 70.0 + - 6.0 + - 23.0 + - 18.0 + - 57.0 + - 10.0 + - 58.0 + - 60.0 + - 68.0 + - 67.0 + - 3.0 + - 99.0 + - 46.0 + - 83.0 + - 5.0 + - 14.0 + - 16.0 + - 57.0 + - 78.0 + - 59.0 + - 71.0 + - 30.0 + - 52.0 + - 100.0 + - 2.0 + - 94.0 + - 56.0 + - 13.0 + - 80.0 + - 50.0 + - !!python/tuple + - 32.0 + - 51.0 + - 63.0 + - 7.0 + - 80.0 + - 66.0 + - 97.0 + - 38.0 + - 59.0 + - 11.0 + - 53.0 + - 67.0 + - 39.0 + - 90.0 + - 2.0 + - 32.0 + - 96.0 + - 76.0 + - 50.0 + - 89.0 + - 30.0 + - 60.0 + - 69.0 + - 28.0 + - 19.0 + - 52.0 + - 81.0 + - 53.0 + - 20.0 + - 79.0 + - 39.0 + - 12.0 + - 27.0 + - 39.0 + - 43.0 + - 10.0 + - 42.0 + - 87.0 + - 61.0 + - 95.0 + - 12.0 + - 91.0 + - 54.0 + - 89.0 + - 68.0 + - 44.0 + - 98.0 + - 98.0 + - 41.0 + - 68.0 + - 94.0 + - 0.0 + - 37.0 + - 68.0 + - 92.0 + - 20.0 + - !!python/tuple + - 45.0 + - 73.0 + - 22.0 + - 26.0 + - 28.0 + - 68.0 + - 29.0 + - 24.0 + - 99.0 + - 41.0 + - 40.0 + - 1.0 + - 82.0 + - 15.0 + - 17.0 + - 11.0 + - 48.0 + - 31.0 + - 94.0 + - 69.0 + - 90.0 + - 85.0 + - 60.0 + - 20.0 + - 18.0 + - 57.0 + - 34.0 + - 53.0 + - 98.0 + - 57.0 + - 60.0 + - 15.0 + - 88.0 + - 21.0 + - 97.0 + - 17.0 + - 13.0 + - 69.0 + - 48.0 + - 37.0 + - 82.0 + - 8.0 + - 17.0 + - 79.0 + - 32.0 + - 15.0 + - 46.0 + - 93.0 + - 95.0 + - 76.0 + - 77.0 + - 69.0 + - 61.0 + - 35.0 + - 15.0 + - 29.0 + - !!python/tuple + - 45.0 + - 73.0 + - 22.0 + - 26.0 + - 28.0 + - 68.0 + - 29.0 + - 24.0 + - 99.0 + - 41.0 + - 40.0 + - 1.0 + - 82.0 + - 15.0 + - 17.0 + - 11.0 + - 48.0 + - 31.0 + - 94.0 + - 69.0 + - 90.0 + - 85.0 + - 60.0 + - 20.0 + - 18.0 + - 57.0 + - 34.0 + - 53.0 + - 98.0 + - 57.0 + - 60.0 + - 15.0 + - 88.0 + - 21.0 + - 97.0 + - 17.0 + - 13.0 + - 69.0 + - 48.0 + - 37.0 + - 82.0 + - 8.0 + - 17.0 + - 79.0 + - 32.0 + - 15.0 + - 46.0 + - 93.0 + - 95.0 + - 76.0 + - 77.0 + - 69.0 + - 61.0 + - 35.0 + - 15.0 + - 29.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 94.0 + - 35.0 + - 8.0 + - 35.0 + - 90.0 + - 58.0 + - 41.0 + - 66.0 + - 39.0 + - 85.0 + - 19.0 + - 34.0 + - 24.0 + - 85.0 + - 92.0 + - 71.0 + - 85.0 + - 36.0 + - 16.0 + - 29.0 + - 30.0 + - 86.0 + - 3.0 + - 32.0 + - 71.0 + - 81.0 + - 95.0 + - 95.0 + - 100.0 + - 68.0 + - 90.0 + - 53.0 + - 65.0 + - 26.0 + - 52.0 + - 79.0 + - 63.0 + - 3.0 + - 80.0 + - 60.0 + - 2.0 + - 2.0 + - 55.0 + - 7.0 + - 31.0 + - 49.0 + - 79.0 + - 70.0 + - 14.0 + - 30.0 + - 44.0 + - 95.0 + - 36.0 + - 47.0 + - 68.0 + - 77.0 + - !!python/tuple + - 58.0 + - 1.0 + - 53.0 + - 63.0 + - 9.0 + - 9.0 + - 56.0 + - 43.0 + - 25.0 + - 34.0 + - 81.0 + - 66.0 + - 3.0 + - 52.0 + - 61.0 + - 98.0 + - 91.0 + - 68.0 + - 56.0 + - 100.0 + - 51.0 + - 16.0 + - 20.0 + - 32.0 + - 51.0 + - 25.0 + - 38.0 + - 70.0 + - 12.0 + - 79.0 + - 28.0 + - 61.0 + - 26.0 + - 39.0 + - 57.0 + - 19.0 + - 60.0 + - 40.0 + - 50.0 + - 43.0 + - 70.0 + - 34.0 + - 99.0 + - 41.0 + - 18.0 + - 53.0 + - 2.0 + - 69.0 + - 55.0 + - 39.0 + - 67.0 + - 4.0 + - 92.0 + - 100.0 + - 73.0 + - 34.0 + - !!python/tuple + - 6.0 + - 46.0 + - 72.0 + - 6.0 + - 51.0 + - 50.0 + - 14.0 + - 55.0 + - 45.0 + - 96.0 + - 31.0 + - 62.0 + - 79.0 + - 70.0 + - 17.0 + - 24.0 + - 100.0 + - 18.0 + - 61.0 + - 6.0 + - 96.0 + - 72.0 + - 49.0 + - 93.0 + - 28.0 + - 22.0 + - 59.0 + - 87.0 + - 1.0 + - 19.0 + - 60.0 + - 30.0 + - 14.0 + - 18.0 + - 70.0 + - 86.0 + - 24.0 + - 83.0 + - 46.0 + - 16.0 + - 57.0 + - 19.0 + - 37.0 + - 98.0 + - 95.0 + - 79.0 + - 84.0 + - 94.0 + - 100.0 + - 34.0 + - 92.0 + - 25.0 + - 54.0 + - 21.0 + - 87.0 + - 90.0 + - !!python/tuple + - 83.0 + - 44.0 + - 19.0 + - 55.0 + - 78.0 + - 65.0 + - 56.0 + - 66.0 + - 56.0 + - 55.0 + - 8.0 + - 85.0 + - 34.0 + - 68.0 + - 71.0 + - 52.0 + - 52.0 + - 9.0 + - 44.0 + - 57.0 + - 52.0 + - 38.0 + - 38.0 + - 40.0 + - 4.0 + - 47.0 + - 23.0 + - 34.0 + - 26.0 + - 36.0 + - 88.0 + - 16.0 + - 94.0 + - 3.0 + - 67.0 + - 99.0 + - 70.0 + - 64.0 + - 56.0 + - 29.0 + - 76.0 + - 79.0 + - 74.0 + - 10.0 + - 5.0 + - 97.0 + - 81.0 + - 94.0 + - 61.0 + - 25.0 + - 9.0 + - 0.0 + - 86.0 + - 58.0 + - 79.0 + - 39.0 + - !!python/tuple + - 83.0 + - 44.0 + - 19.0 + - 55.0 + - 78.0 + - 65.0 + - 56.0 + - 66.0 + - 56.0 + - 55.0 + - 8.0 + - 85.0 + - 34.0 + - 68.0 + - 71.0 + - 52.0 + - 52.0 + - 9.0 + - 44.0 + - 57.0 + - 52.0 + - 38.0 + - 38.0 + - 40.0 + - 4.0 + - 47.0 + - 23.0 + - 34.0 + - 26.0 + - 36.0 + - 88.0 + - 16.0 + - 94.0 + - 3.0 + - 67.0 + - 99.0 + - 70.0 + - 64.0 + - 56.0 + - 29.0 + - 76.0 + - 79.0 + - 74.0 + - 10.0 + - 5.0 + - 97.0 + - 81.0 + - 94.0 + - 61.0 + - 25.0 + - 9.0 + - 0.0 + - 86.0 + - 58.0 + - 79.0 + - 39.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 41.0 + - 12.0 + - 13.0 + - 23.0 + - 43.0 + - 8.0 + - 28.0 + - 3.0 + - 77.0 + - 76.0 + - 66.0 + - 21.0 + - 71.0 + - 39.0 + - 92.0 + - 86.0 + - 17.0 + - 92.0 + - 100.0 + - 21.0 + - 44.0 + - 30.0 + - 20.0 + - 65.0 + - 95.0 + - 58.0 + - 68.0 + - 9.0 + - 58.0 + - 56.0 + - 54.0 + - 19.0 + - 15.0 + - 57.0 + - 25.0 + - 32.0 + - 38.0 + - 85.0 + - 21.0 + - 62.0 + - 61.0 + - 4.0 + - 77.0 + - 78.0 + - 26.0 + - 15.0 + - 8.0 + - 22.0 + - 11.0 + - 28.0 + - 14.0 + - 96.0 + - 2.0 + - 43.0 + - 70.0 + - 19.0 + - !!python/tuple + - 1.0 + - 61.0 + - 77.0 + - 82.0 + - 18.0 + - 47.0 + - 31.0 + - 76.0 + - 35.0 + - 33.0 + - 99.0 + - 85.0 + - 11.0 + - 43.0 + - 50.0 + - 31.0 + - 42.0 + - 22.0 + - 92.0 + - 30.0 + - 77.0 + - 43.0 + - 4.0 + - 5.0 + - 37.0 + - 14.0 + - 31.0 + - 57.0 + - 67.0 + - 48.0 + - 31.0 + - 30.0 + - 18.0 + - 18.0 + - 12.0 + - 11.0 + - 55.0 + - 48.0 + - 100.0 + - 62.0 + - 66.0 + - 20.0 + - 4.0 + - 28.0 + - 95.0 + - 63.0 + - 59.0 + - 55.0 + - 74.0 + - 27.0 + - 25.0 + - 90.0 + - 68.0 + - 84.0 + - 8.0 + - 86.0 + - !!python/tuple + - 44.0 + - 34.0 + - 94.0 + - 30.0 + - 56.0 + - 69.0 + - 37.0 + - 19.0 + - 61.0 + - 16.0 + - 79.0 + - 57.0 + - 73.0 + - 61.0 + - 30.0 + - 84.0 + - 32.0 + - 48.0 + - 97.0 + - 18.0 + - 6.0 + - 71.0 + - 42.0 + - 40.0 + - 5.0 + - 40.0 + - 97.0 + - 24.0 + - 14.0 + - 26.0 + - 87.0 + - 55.0 + - 1.0 + - 94.0 + - 54.0 + - 77.0 + - 98.0 + - 74.0 + - 77.0 + - 6.0 + - 14.0 + - 90.0 + - 29.0 + - 68.0 + - 32.0 + - 40.0 + - 17.0 + - 8.0 + - 84.0 + - 4.0 + - 100.0 + - 78.0 + - 76.0 + - 86.0 + - 3.0 + - 62.0 + - !!python/tuple + - 80.0 + - 19.0 + - 98.0 + - 19.0 + - 100.0 + - 35.0 + - 65.0 + - 74.0 + - 42.0 + - 50.0 + - 65.0 + - 2.0 + - 19.0 + - 19.0 + - 53.0 + - 91.0 + - 76.0 + - 14.0 + - 68.0 + - 42.0 + - 79.0 + - 56.0 + - 10.0 + - 87.0 + - 30.0 + - 66.0 + - 29.0 + - 30.0 + - 19.0 + - 26.0 + - 30.0 + - 18.0 + - 47.0 + - 19.0 + - 43.0 + - 66.0 + - 94.0 + - 78.0 + - 70.0 + - 21.0 + - 7.0 + - 61.0 + - 16.0 + - 20.0 + - 14.0 + - 81.0 + - 66.0 + - 65.0 + - 74.0 + - 82.0 + - 21.0 + - 2.0 + - 50.0 + - 29.0 + - 86.0 + - 89.0 + - !!python/tuple + - 24.0 + - 46.0 + - 48.0 + - 41.0 + - 47.0 + - 13.0 + - 72.0 + - 1.0 + - 73.0 + - 34.0 + - 61.0 + - 69.0 + - 46.0 + - 57.0 + - 40.0 + - 88.0 + - 46.0 + - 11.0 + - 70.0 + - 74.0 + - 45.0 + - 85.0 + - 64.0 + - 61.0 + - 75.0 + - 37.0 + - 7.0 + - 98.0 + - 32.0 + - 17.0 + - 9.0 + - 15.0 + - 96.0 + - 82.0 + - 80.0 + - 51.0 + - 96.0 + - 92.0 + - 54.0 + - 87.0 + - 79.0 + - 82.0 + - 1.0 + - 22.0 + - 77.0 + - 10.0 + - 66.0 + - 37.0 + - 22.0 + - 92.0 + - 25.0 + - 5.0 + - 75.0 + - 64.0 + - 4.0 + - 72.0 + - !!python/tuple + - 46.0 + - 76.0 + - 28.0 + - 52.0 + - 23.0 + - 46.0 + - 59.0 + - 96.0 + - 40.0 + - 11.0 + - 53.0 + - 37.0 + - 77.0 + - 39.0 + - 69.0 + - 10.0 + - 81.0 + - 98.0 + - 96.0 + - 54.0 + - 82.0 + - 27.0 + - 86.0 + - 83.0 + - 4.0 + - 11.0 + - 39.0 + - 23.0 + - 36.0 + - 37.0 + - 53.0 + - 56.0 + - 80.0 + - 31.0 + - 70.0 + - 48.0 + - 39.0 + - 96.0 + - 7.0 + - 91.0 + - 52.0 + - 98.0 + - 71.0 + - 65.0 + - 12.0 + - 3.0 + - 23.0 + - 87.0 + - 72.0 + - 22.0 + - 44.0 + - 91.0 + - 43.0 + - 18.0 + - 56.0 + - 26.0 + - !!python/tuple + - 46.0 + - 76.0 + - 28.0 + - 52.0 + - 23.0 + - 46.0 + - 59.0 + - 96.0 + - 40.0 + - 11.0 + - 53.0 + - 37.0 + - 77.0 + - 39.0 + - 69.0 + - 10.0 + - 81.0 + - 98.0 + - 96.0 + - 54.0 + - 82.0 + - 27.0 + - 86.0 + - 83.0 + - 4.0 + - 11.0 + - 39.0 + - 23.0 + - 36.0 + - 37.0 + - 53.0 + - 56.0 + - 80.0 + - 31.0 + - 70.0 + - 48.0 + - 39.0 + - 96.0 + - 7.0 + - 91.0 + - 52.0 + - 98.0 + - 71.0 + - 65.0 + - 12.0 + - 3.0 + - 23.0 + - 87.0 + - 72.0 + - 22.0 + - 44.0 + - 91.0 + - 43.0 + - 18.0 + - 56.0 + - 26.0 +- - !!python/tuple + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - 0.0 + - !!python/tuple + - 20.0 + - 22.0 + - 12.0 + - 13.0 + - 24.0 + - 10.0 + - 100.0 + - 22.0 + - 17.0 + - 15.0 + - 87.0 + - 0.0 + - 50.0 + - 27.0 + - 49.0 + - 73.0 + - 93.0 + - 8.0 + - 22.0 + - 93.0 + - 79.0 + - 85.0 + - 63.0 + - 21.0 + - 25.0 + - 68.0 + - 81.0 + - 38.0 + - 9.0 + - 78.0 + - 37.0 + - 92.0 + - 8.0 + - 77.0 + - 72.0 + - 85.0 + - 14.0 + - 39.0 + - 55.0 + - 56.0 + - 67.0 + - 86.0 + - 52.0 + - 71.0 + - 67.0 + - 80.0 + - 76.0 + - 28.0 + - 84.0 + - 13.0 + - 64.0 + - 45.0 + - 91.0 + - 71.0 + - 80.0 + - 22.0 + - !!python/tuple + - 98.0 + - 100.0 + - 90.0 + - 90.0 + - 54.0 + - 76.0 + - 99.0 + - 17.0 + - 75.0 + - 19.0 + - 93.0 + - 75.0 + - 31.0 + - 21.0 + - 46.0 + - 51.0 + - 22.0 + - 87.0 + - 95.0 + - 65.0 + - 93.0 + - 37.0 + - 68.0 + - 41.0 + - 13.0 + - 0.0 + - 46.0 + - 0.0 + - 22.0 + - 34.0 + - 39.0 + - 36.0 + - 31.0 + - 52.0 + - 39.0 + - 7.0 + - 16.0 + - 99.0 + - 62.0 + - 1.0 + - 86.0 + - 1.0 + - 100.0 + - 43.0 + - 33.0 + - 3.0 + - 31.0 + - 9.0 + - 62.0 + - 36.0 + - 31.0 + - 88.0 + - 88.0 + - 92.0 + - 40.0 + - 31.0 + - !!python/tuple + - 98.0 + - 100.0 + - 90.0 + - 90.0 + - 54.0 + - 76.0 + - 99.0 + - 17.0 + - 75.0 + - 19.0 + - 93.0 + - 75.0 + - 31.0 + - 21.0 + - 46.0 + - 51.0 + - 22.0 + - 87.0 + - 95.0 + - 65.0 + - 93.0 + - 37.0 + - 68.0 + - 41.0 + - 13.0 + - 0.0 + - 46.0 + - 0.0 + - 22.0 + - 34.0 + - 39.0 + - 36.0 + - 31.0 + - 52.0 + - 39.0 + - 7.0 + - 16.0 + - 99.0 + - 62.0 + - 1.0 + - 86.0 + - 1.0 + - 100.0 + - 43.0 + - 33.0 + - 3.0 + - 31.0 + - 9.0 + - 62.0 + - 36.0 + - 31.0 + - 88.0 + - 88.0 + - 92.0 + - 40.0 + - 31.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 70.0 + - 100.0 + - !!python/tuple + - 0.0 + - 36831.0 + - 37319.0 + - 39584.0 + - 39584.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 60.0 + - 100.0 + - !!python/tuple + - 0.0 + - 38624.0 + - 39816.0 + - 39816.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 90.0 + - 100.0 + - !!python/tuple + - 0.0 + - 36061.0 + - 37133.0 + - 39026.0 + - 39026.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 100.0 + - !!python/tuple + - 0.0 + - 36698.0 + - 37325.0 + - 39030.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 50.0 + - 100.0 + - !!python/tuple + - 0.0 + - 31166.0 + - 38914.0 + - 37365.0 + - 37365.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 70.0 + - 100.0 + - !!python/tuple + - 0.0 + - 36846.0 + - 37614.0 + - 37614.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 90.0 + - 100.0 + - !!python/tuple + - 0.0 + - 33624.0 + - 33959.0 + - 35094.0 + - 38828.0 + - 38828.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 50.0 + - 80.0 + - 100.0 + - !!python/tuple + - 0.0 + - 33750.0 + - 34843.0 + - 37056.0 + - 40498.0 + - 40498.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 50.0 + - 60.0 + - 70.0 + - 100.0 + - !!python/tuple + - 0.0 + - 31352.0 + - 32652.0 + - 34027.0 + - 34691.0 + - 37709.0 + - 38153.0 + - 38153.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 70.0 + - 100.0 + - !!python/tuple + - 0.0 + - 36654.0 + - 38319.0 + - 38319.0 +problem_name: HOTEL-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.4 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.09054768136698109 + - 0.07849770359030075 + - 0.02256901575386439 + - 0.02256901575386439 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.6 + - 1.0 + - !!python/tuple + - 1.0 + - 0.046273890068645365 + - 0.016840337794458985 + - 0.016840337794458985 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.4 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 0.10956096597362833 + - 0.08309052298878956 + - 0.036347473949330834 + - 0.036347473949330834 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.4 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0938317941626747 + - 0.07834954812583338 + - 0.03624870363968591 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 0.5 + - 1.0 + - !!python/tuple + - 1.0 + - 0.23043113240160007 + - 0.03911304261938861 + - 0.07736184502938416 + - 0.07736184502938416 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.09017729270581264 + - 0.07121339325398784 + - 0.07121339325398784 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 0.4 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1697367771247963 + - 0.16146476369203416 + - 0.1334386883302879 + - 0.04123660427675441 + - 0.04123660427675441 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.4 + - 0.5 + - 0.8 + - 1.0 + - !!python/tuple + - 1.0 + - 0.16662551237098128 + - 0.13963652526050668 + - 0.0849918514494543 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 0.6 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.22583831300311127 + - 0.193737962368512 + - 0.15978566842807052 + - 0.14338979702701368 + - 0.06886759839992099 + - 0.05790409402933478 + - 0.05790409402933478 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.2 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.09491826756876882 + - 0.05380512617907057 + - 0.05380512617907057 +solver_name: RNDSRCH diff --git a/test/expected_results/IRONORE1_RNDSRCH.yaml b/test/expected_results/IRONORE1_RNDSRCH.yaml new file mode 100644 index 000000000..74c431366 --- /dev/null +++ b/test/expected_results/IRONORE1_RNDSRCH.yaml @@ -0,0 +1,399 @@ +all_est_objectives: +- - 152700.98469043188 + - 248637.1545694286 + - 248637.1545694286 +- - 133145.92876656458 + - 133145.92876656458 +- - 110208.01327425054 + - 107759.44427986823 + - 112431.44576792093 + - 112431.44576792093 +- - 145554.7585106055 + - 145554.7585106055 +- - 146391.39502516043 + - 194373.66957177193 + - 194373.66957177193 +- - 133265.08840579027 + - 133265.08840579027 +- - 105150.1358889471 + - 105150.1358889471 +- - 169184.40059734188 + - 144469.62659953252 + - 203779.2687858544 + - 260709.07364016137 + - 260709.07364016137 +- - 156372.6117499876 + - 197855.1286951518 + - 211685.0241424202 + - 211685.0241424202 +- - 106114.5439436892 + - 230865.50189332722 + - 230865.50189332722 +all_intermediate_budgets: +- - 0 + - 80 + - 1000 +- - 0 + - 1000 +- - 0 + - 330 + - 530 + - 1000 +- - 0 + - 1000 +- - 0 + - 700 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 40 + - 50 + - 290 + - 1000 +- - 0 + - 140 + - 360 + - 1000 +- - 0 + - 540 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 106.04208455290791 + - 1717.1639026711428 + - 97.66810871178754 + - 68.74180720329448 + - !!python/tuple + - 106.04208455290791 + - 1717.1639026711428 + - 97.66810871178754 + - 68.74180720329448 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 27.30183995910418 + - 3684.661514592841 + - 47.100149029711666 + - 100.49702956782365 + - !!python/tuple + - 20.234251678135664 + - 1639.8984085157767 + - 19.023066684981703 + - 105.52339096424797 + - !!python/tuple + - 20.234251678135664 + - 1639.8984085157767 + - 19.023066684981703 + - 105.52339096424797 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 19.43057951053071 + - 4523.015305913609 + - 95.33915164608602 + - 97.42837688353313 + - !!python/tuple + - 19.43057951053071 + - 4523.015305913609 + - 95.33915164608602 + - 97.42837688353313 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 46.20031637628806 + - 1315.9533298551744 + - 104.36517401825118 + - 23.648951463720735 + - !!python/tuple + - 111.97881993274402 + - 1743.441481887965 + - 113.58952843057406 + - 67.19165591948381 + - !!python/tuple + - 96.41189511709807 + - 8689.944235572471 + - 101.38676788412684 + - 79.68718768258695 + - !!python/tuple + - 96.41189511709807 + - 8689.944235572471 + - 101.38676788412684 + - 79.68718768258695 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 57.866334150734936 + - 2176.5511407069566 + - 100.1193670841009 + - 91.42973478979306 + - !!python/tuple + - 17.20340129146427 + - 3415.010435064405 + - 96.39031491554285 + - 100.15485449202394 + - !!python/tuple + - 17.20340129146427 + - 3415.010435064405 + - 96.39031491554285 + - 100.15485449202394 +- - !!python/tuple + - 80.0 + - 7000.0 + - 40.0 + - 100.0 + - !!python/tuple + - 107.94498227259388 + - 3774.5559125009777 + - 99.13828483086061 + - 66.7427027808016 + - !!python/tuple + - 107.94498227259388 + - 3774.5559125009777 + - 99.13828483086061 + - 66.7427027808016 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 80.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 248637.1545694286 + - 248637.1545694286 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 330.0 + - 530.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 107759.44427986823 + - 112431.44576792093 + - 112431.44576792093 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 700.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 194373.66957177193 + - 194373.66957177193 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 50.0 + - 290.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 144469.62659953252 + - 203779.2687858544 + - 253061.37538277043 + - 253061.37538277043 +- !!python/tuple + - !!python/tuple + - 0.0 + - 140.0 + - 360.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 197855.1286951518 + - 211685.0241424202 + - 211685.0241424202 +- !!python/tuple + - !!python/tuple + - 0.0 + - 540.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 230865.50189332722 + - 230865.50189332722 +problem_name: IRONORE-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.08 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0440833358939842 + - 0.0440833358939842 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.33 + - 0.53 + - 1.0 + - !!python/tuple + - 1.0 + - 1.447801568931063 + - 1.4012493240083121 + - 1.4012493240083121 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.584769602889546 + - 0.584769602889546 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.05 + - 0.29 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0820179956864968 + - 0.49105136256387855 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.14 + - 0.36 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5500800296489186 + - 0.4122777019391264 + - 0.4122777019391264 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.54 + - 1.0 + - !!python/tuple + - 1.0 + - 0.22116168875314704 + - 0.22116168875314704 +solver_name: RNDSRCH diff --git a/test/expected_results/IRONORECONT1_ADAM.yaml b/test/expected_results/IRONORECONT1_ADAM.yaml new file mode 100644 index 000000000..0f73e3907 --- /dev/null +++ b/test/expected_results/IRONORECONT1_ADAM.yaml @@ -0,0 +1,429 @@ +all_est_objectives: +- - 152700.98469043188 + - 155904.37612388507 + - 155904.37612388507 +- - 133145.92876656458 + - 134604.94835851304 + - 126959.21709119408 + - 127108.44619092188 + - 127108.44619092188 +- - 110208.01327425054 + - 112607.73756976832 + - 109669.16603250684 + - 109669.16603250684 +- - 145554.7585106055 + - 140936.56544540767 + - 140936.56544540767 +- - 146391.39502516043 + - 147098.93819070616 + - 145177.9503350341 + - 145367.008469743 + - 142519.2439307187 + - 142519.2439307187 +- - 133265.08840579027 + - 133265.08840579027 +- - 105150.1358889471 + - 102147.97953122928 + - 105171.70746854838 + - 105171.70746854838 +- - 169184.40059734188 + - 169184.40059734188 +- - 156372.6117499876 + - 155641.49947265227 + - 155641.49947265227 +- - 106114.5439436892 + - 108413.96462640546 + - 106788.86801929041 + - 106788.86801929041 +all_intermediate_budgets: +- - 0 + - 660 + - 1000 +- - 0 + - 240 + - 660 + - 870 + - 1000 +- - 0 + - 240 + - 660 + - 1000 +- - 0 + - 240 + - 1000 +- - 0 + - 240 + - 450 + - 660 + - 870 + - 1000 +- - 0 + - 1000 +- - 0 + - 240 + - 660 + - 1000 +- - 0 + - 1000 +- - 0 + - 240 + - 1000 +- - 0 + - 450 + - 660 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 81.12995300468414 + - 41.41124488794527 + - 99.99111430063535 + - !!python/tuple + - 81.12995300468414 + - 41.41124488794527 + - 99.99111430063535 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.4999999998809 + - 40.49999999998566 + - 100.49999999999933 + - !!python/tuple + - 81.094007612972 + - 41.09400761327011 + - 101.43774270873399 + - !!python/tuple + - 81.30614703045066 + - 41.30614703083772 + - 101.62802738791422 + - !!python/tuple + - 81.30614703045066 + - 41.30614703083772 + - 101.62802738791422 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.4999999999358 + - 40.0 + - 99.50000000000493 + - !!python/tuple + - 81.2923504369394 + - 40.0 + - 100.08157191787059 + - !!python/tuple + - 81.2923504369394 + - 40.0 + - 100.08157191787059 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.49999999998296 + - 40.49999999999757 + - 99.50000000000121 + - !!python/tuple + - 80.49999999998296 + - 40.49999999999757 + - 99.50000000000121 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.49999999997595 + - 100.49999999999922 + - !!python/tuple + - 80.0 + - 41.00020266354943 + - 100.97834113678329 + - !!python/tuple + - 80.0 + - 41.36404348124356 + - 101.43844907842401 + - !!python/tuple + - 80.0 + - 41.77630099707339 + - 101.91420556036523 + - !!python/tuple + - 80.0 + - 41.77630099707339 + - 101.91420556036523 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.49999999996712 + - 40.49999999999158 + - 99.50000000001452 + - !!python/tuple + - 81.48701369639784 + - 41.37292314915543 + - 100.08021254757897 + - !!python/tuple + - 81.48701369639784 + - 41.37292314915543 + - 100.08021254757897 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 79.50000000320561 + - 40.499999999934495 + - 100.49999999999743 + - !!python/tuple + - 79.50000000320561 + - 40.499999999934495 + - 100.49999999999743 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.99999999330991 + - 40.99839279349292 + - 99.81501725221348 + - !!python/tuple + - 81.3345974556348 + - 41.383651867363206 + - 100.21259501109517 + - !!python/tuple + - 81.3345974556348 + - 41.383651867363206 + - 100.21259501109517 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 155904.37612388507 + - 155904.37612388507 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 660.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 134604.94835851304 + - 126959.21709119408 + - 127108.44619092188 + - 127108.44619092188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 112607.73756976832 + - 109669.16603250684 + - 109669.16603250684 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 140936.56544540767 + - 140936.56544540767 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 450.0 + - 660.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 147098.93819070616 + - 145177.9503350341 + - 145367.008469743 + - 142519.2439307187 + - 142519.2439307187 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 102147.97953122928 + - 105171.70746854838 + - 105171.70746854838 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 155641.49947265227 + - 155641.49947265227 +- !!python/tuple + - !!python/tuple + - 0.0 + - 450.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 108413.96462640546 + - 106788.86801929041 + - 106788.86801929041 +problem_name: IRONORECONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 1.0 + - !!python/tuple + - 0.0 + - 3.203391433453187e+18 + - 3.203391433453187e+18 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 0.66 + - 0.87 + - 1.0 + - !!python/tuple + - 0.0 + - -1.8096036331918846e+19 + - -2.5741767599237804e+19 + - -2.559253849951e+19 + - -2.559253849951e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 0.66 + - 1.0 + - !!python/tuple + - 0.0 + - -4.009324712066356e+19 + - -4.303181865792505e+19 + - -4.303181865792505e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 1.0 + - !!python/tuple + - 0.0 + - -1.176441924502421e+19 + - -1.176441924502421e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 0.45 + - 0.66 + - 0.87 + - 1.0 + - !!python/tuple + - 0.0 + - -5.602046499725722e+18 + - -7.523034355397772e+18 + - -7.333976220688869e+18 + - -1.0181740759713196e+19 + - -1.0181740759713196e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 0.66 + - 1.0 + - !!python/tuple + - 0.0 + - -5.0553005159202595e+19 + - -4.7529277221883494e+19 + - -4.7529277221883494e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 1.0 + - !!python/tuple + - 0.0 + - 2.940514782220387e+18 + - 2.940514782220387e+18 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.45 + - 0.66 + - 1.0 + - !!python/tuple + - 0.0 + - -4.428702006402642e+19 + - -4.591211667114147e+19 + - -4.591211667114147e+19 +solver_name: ADAM diff --git a/test/expected_results/IRONORECONT1_ALOE.yaml b/test/expected_results/IRONORECONT1_ALOE.yaml new file mode 100644 index 000000000..07fa17106 --- /dev/null +++ b/test/expected_results/IRONORECONT1_ALOE.yaml @@ -0,0 +1,269 @@ +all_est_objectives: +- - 152700.98469043188 + - 152700.98469043188 +- - 133145.92876656458 + - 133145.92876656458 +- - 110208.01327425054 + - 110208.01327425054 +- - 145554.7585106055 + - 145554.7585106055 +- - 146391.39502516043 + - 146391.39502516043 +- - 133265.08840579027 + - 133265.08840579027 +- - 105150.1358889471 + - 105150.1358889471 +- - 169184.40059734188 + - 169184.40059734188 +- - 156372.6117499876 + - 156372.6117499876 +- - 106114.5439436892 + - 106114.5439436892 +all_intermediate_budgets: +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +problem_name: IRONORECONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +solver_name: ALOE diff --git a/test/expected_results/IRONORECONT1_ASTRODF.yaml b/test/expected_results/IRONORECONT1_ASTRODF.yaml new file mode 100644 index 000000000..f84cd9ab8 --- /dev/null +++ b/test/expected_results/IRONORECONT1_ASTRODF.yaml @@ -0,0 +1,1039 @@ +all_est_objectives: +- - 152700.98469043188 + - 173790.5531214831 + - 225102.47095529095 + - 244380.83160276755 + - 254544.67927187483 + - 256722.445601694 + - 256821.54653900067 + - 254140.69223063756 + - 254140.69223063756 +- - 133145.92876656458 + - 157005.62112506654 + - 211421.39916575735 + - 219926.5728172673 + - 219285.7539778292 + - 239977.32367890776 + - 250574.42458846935 + - 248427.12956464986 + - 250574.42458846935 + - 250574.42458846935 +- - 110208.01327425051 + - 136094.3209986965 + - 167963.24110333595 + - 178191.6657557974 + - 228236.85796508827 + - 240170.9468122245 + - 239884.70553584245 + - 239941.95018204217 + - 239262.81977046945 + - 239262.81977046945 +- - 145554.75851060552 + - 162761.65164111153 + - 184831.07657897766 + - 204457.7216833123 + - 234309.26002952136 + - 244175.19132386683 + - 245016.00798568144 + - 245426.89280894664 + - 240990.0517419236 + - 244753.63432290178 + - 244753.63432290178 +- - 146391.39502516045 + - 149799.04611267112 + - 251731.60810788482 + - 237885.3308454876 + - 252458.32081264793 + - 250634.64181579027 + - 245106.04336271327 + - 241741.28231565602 + - 241794.95211071175 + - 241794.95211071175 +- - 133265.08840579024 + - 153934.91743867903 + - 172509.0554105407 + - 196799.09738726736 + - 222960.4287792954 + - 250659.24836156174 + - 247240.44071118123 + - 247240.44071118123 +- - 105150.1358889471 + - 130245.04365294233 + - 155881.34899939763 + - 194968.15564181417 + - 212872.29791895096 + - 230087.05448179384 + - 224796.23032860018 + - 226754.17141268478 + - 226754.17141268478 +- - 169184.40059734188 + - 186438.5647823636 + - 192688.7929033532 + - 222710.89710845574 + - 199855.3545738408 + - 240900.61585372876 + - 250784.10402937085 + - 262369.4499080799 + - 262369.4499080799 +- - 156372.6117499876 + - 185669.97039557883 + - 195808.02225813284 + - 225164.91186158935 + - 243957.08708089805 + - 255633.55119565557 + - 260937.77752193355 + - 269647.8951580856 + - 269647.9249439514 + - 269647.9249439514 + - 269647.9249439514 +- - 106114.54394368925 + - 136308.492233317 + - 163635.07514685215 + - 183763.60496128208 + - 206833.6174025474 + - 233362.82441502827 + - 240672.23983011144 + - 242871.54230719403 + - 244512.3211252974 + - 244512.3211252974 +all_intermediate_budgets: +- - 5 + - 48 + - 108 + - 215 + - 252 + - 435 + - 846 + - 918 + - 1000 +- - 5 + - 48 + - 111 + - 171 + - 209 + - 355 + - 521 + - 698 + - 742 + - 1000 +- - 5 + - 40 + - 100 + - 240 + - 277 + - 394 + - 572 + - 730 + - 823 + - 1000 +- - 5 + - 40 + - 100 + - 160 + - 272 + - 381 + - 503 + - 704 + - 750 + - 835 + - 1000 +- - 5 + - 44 + - 74 + - 214 + - 332 + - 443 + - 572 + - 681 + - 776 + - 1000 +- - 5 + - 85 + - 115 + - 234 + - 401 + - 575 + - 719 + - 1000 +- - 5 + - 40 + - 100 + - 160 + - 272 + - 381 + - 461 + - 639 + - 1000 +- - 5 + - 66 + - 96 + - 202 + - 277 + - 409 + - 446 + - 655 + - 1000 +- - 5 + - 44 + - 74 + - 171 + - 286 + - 359 + - 396 + - 432 + - 893 + - 959 + - 1000 +- - 5 + - 43 + - 73 + - 168 + - 282 + - 355 + - 392 + - 518 + - 773 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 80.0 + - 88.47478052571736 + - 100.0 + - !!python/tuple + - 96.83152101587409 + - 88.47478052571736 + - 100.0 + - !!python/tuple + - 101.72859138031787 + - 97.12141516664379 + - 80.3780952610946 + - !!python/tuple + - 99.71651299225164 + - 100.84688799730397 + - 80.15918098221466 + - !!python/tuple + - 99.41446745085389 + - 99.72165544830357 + - 80.12466681165117 + - !!python/tuple + - 102.06807328284724 + - 102.89870210674158 + - 77.25785932804442 + - !!python/tuple + - 102.06807328284724 + - 102.89870210674158 + - 77.25785932804442 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 80.0 + - 88.47478052571736 + - 100.0 + - !!python/tuple + - 113.66304203174818 + - 88.47478052571736 + - 100.0 + - !!python/tuple + - 109.0524583041591 + - 87.39522733075398 + - 16.12898772220828 + - !!python/tuple + - 106.98331060839263 + - 96.23219686647283 + - 40.812529431010006 + - !!python/tuple + - 99.03916258349958 + - 98.33802672433292 + - 40.812529431010006 + - !!python/tuple + - 96.49240150627259 + - 98.66984364936707 + - 40.812529431010006 + - !!python/tuple + - 99.03916258349958 + - 98.33802672433292 + - 45.949102006655174 + - !!python/tuple + - 99.03916258349958 + - 98.33802672433292 + - 45.949102006655174 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 64.99317713028798 + - 83.90598075312887 + - 99.97077600396719 + - !!python/tuple + - 68.7291501771595 + - 91.30800601928004 + - 101.4121476698681 + - !!python/tuple + - 89.44976351967355 + - 94.94336896077618 + - 101.10114158137466 + - !!python/tuple + - 102.59938931332519 + - 94.94336896077618 + - 101.10114158137466 + - !!python/tuple + - 98.49013125280905 + - 94.94336896077618 + - 101.10114158137466 + - !!python/tuple + - 98.3867322518222 + - 94.50783636800593 + - 99.1148637599229 + - !!python/tuple + - 97.54111530352357 + - 94.50021069215744 + - 100.76742962569978 + - !!python/tuple + - 97.54111530352357 + - 94.50021069215744 + - 100.76742962569978 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 64.00042390077145 + - 83.20678103384913 + - 99.97229968497935 + - !!python/tuple + - 87.107452686979 + - 104.42620257643718 + - 87.76567161238822 + - !!python/tuple + - 101.48025447645703 + - 91.52813803151075 + - 96.11545637061664 + - !!python/tuple + - 98.31127547629868 + - 98.30480219489978 + - 85.30125027741394 + - !!python/tuple + - 100.31925481514519 + - 98.5784951266076 + - 87.74181882764746 + - !!python/tuple + - 100.34565417113717 + - 100.45540555322225 + - 87.63525364907781 + - !!python/tuple + - 103.80180939373368 + - 97.08083942860412 + - 91.20782789316648 + - !!python/tuple + - 100.24713994313211 + - 101.75000962083325 + - 85.73259641523259 + - !!python/tuple + - 100.24713994313211 + - 101.75000962083325 + - 85.73259641523259 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 101.54434690031883 + - 40.0 + - 100.0 + - !!python/tuple + - 101.54434690031883 + - 93.86086725079707 + - 100.0 + - !!python/tuple + - 84.71282588444474 + - 93.86086725079707 + - 100.0 + - !!python/tuple + - 95.23252651936605 + - 93.86086725079707 + - 100.0 + - !!python/tuple + - 92.53759410913753 + - 97.57534856023274 + - 101.93370571838614 + - !!python/tuple + - 91.60559225897144 + - 93.63083464211351 + - 102.61059884803626 + - !!python/tuple + - 90.17545823103897 + - 92.15925902707342 + - 102.50724352234744 + - !!python/tuple + - 88.12519137433235 + - 93.63980723244504 + - 102.05949662500618 + - !!python/tuple + - 88.12519137433235 + - 93.63980723244504 + - 102.05949662500618 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 80.0 + - 115.4052141511159 + - 100.0 + - !!python/tuple + - 80.0 + - 81.74217211936772 + - 100.0 + - !!python/tuple + - 101.03940126984261 + - 81.74217211936772 + - 100.0 + - !!python/tuple + - 101.03940126984261 + - 94.89179791301936 + - 100.0 + - !!python/tuple + - 92.82088514881035 + - 94.89179791301936 + - 100.0 + - !!python/tuple + - 92.82088514881035 + - 94.89179791301936 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 63.79209316990699 + - 83.05136851797755 + - 100.00570758977737 + - !!python/tuple + - 87.84643518014653 + - 102.97498569765473 + - 87.45029012306836 + - !!python/tuple + - 101.50734752968182 + - 89.4441341439015 + - 95.99148066081324 + - !!python/tuple + - 100.46920369641218 + - 98.57020510842206 + - 86.5813932730656 + - !!python/tuple + - 103.74321759601467 + - 95.31887031144483 + - 102.35750445262579 + - !!python/tuple + - 98.60664502036951 + - 95.31887031144483 + - 102.35750445262579 + - !!python/tuple + - 98.60664502036951 + - 95.31887031144483 + - 102.35750445262579 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 80.0 + - 115.4052141511159 + - 100.0 + - !!python/tuple + - 80.0 + - 81.74217211936772 + - 100.0 + - !!python/tuple + - 122.07880253968523 + - 81.74217211936772 + - 100.0 + - !!python/tuple + - 108.82737167187479 + - 104.45891074989993 + - 100.0 + - !!python/tuple + - 105.77957655104105 + - 104.85895620953315 + - 34.32376859655881 + - !!python/tuple + - 97.04039825411124 + - 99.45856139583628 + - 34.32063010213948 + - !!python/tuple + - 97.04039825411124 + - 99.45856139583628 + - 34.32063010213948 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 80.0 + - 115.4052141511159 + - 100.0 + - !!python/tuple + - 80.0 + - 81.74217211936772 + - 100.0 + - !!python/tuple + - 101.03940126984261 + - 81.74217211936772 + - 100.0 + - !!python/tuple + - 101.03940126984261 + - 108.04142370667098 + - 100.0 + - !!python/tuple + - 96.86535134281313 + - 104.83486695678202 + - 34.46289780709621 + - !!python/tuple + - 100.07190809270209 + - 100.66081702975254 + - 0.01 + - !!python/tuple + - 100.02679232808546 + - 99.33513236793632 + - 0.01 + - !!python/tuple + - 100.02679232808546 + - 99.33513236793632 + - 5.146572575645168 + - !!python/tuple + - 100.02679232808546 + - 99.33513236793632 + - 5.146572575645168 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 61.54434690031883 + - 100.0 + - !!python/tuple + - 80.0 + - 115.4052141511159 + - 100.0 + - !!python/tuple + - 80.0 + - 81.74217211936772 + - 100.0 + - !!python/tuple + - 80.0 + - 102.78157338921034 + - 100.0 + - !!python/tuple + - 106.29925158730326 + - 102.78157338921034 + - 100.0 + - !!python/tuple + - 102.47134110476343 + - 103.38401775663664 + - 34.3661625002124 + - !!python/tuple + - 102.42713699452898 + - 98.62901185782722 + - 32.32680775734099 + - !!python/tuple + - 99.36101415901298 + - 99.57932284887721 + - 32.37368382433424 + - !!python/tuple + - 99.36101415901298 + - 99.57932284887721 + - 32.37368382433424 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 5.0 + - 48.0 + - 108.0 + - 215.0 + - 252.0 + - 435.0 + - 846.0 + - 918.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 173790.5531214831 + - 225102.47095529095 + - 244380.83160276755 + - 254544.67927187483 + - 256722.445601694 + - 256821.54653900067 + - 254140.69223063756 + - 254140.69223063756 +- !!python/tuple + - !!python/tuple + - 5.0 + - 48.0 + - 111.0 + - 171.0 + - 209.0 + - 355.0 + - 521.0 + - 698.0 + - 742.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 157005.62112506654 + - 211421.39916575735 + - 219926.5728172673 + - 219285.7539778292 + - 239977.32367890776 + - 250574.42458846935 + - 248427.12956464986 + - 250574.42458846935 + - 250574.42458846935 +- !!python/tuple + - !!python/tuple + - 5.0 + - 40.0 + - 100.0 + - 240.0 + - 277.0 + - 394.0 + - 572.0 + - 730.0 + - 823.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 136094.3209986965 + - 167963.24110333595 + - 178191.6657557974 + - 228236.85796508827 + - 240170.9468122245 + - 239884.70553584245 + - 239941.95018204217 + - 239262.81977046945 + - 239262.81977046945 +- !!python/tuple + - !!python/tuple + - 5.0 + - 40.0 + - 100.0 + - 160.0 + - 272.0 + - 381.0 + - 503.0 + - 704.0 + - 750.0 + - 835.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 162761.65164111153 + - 184831.07657897766 + - 204457.7216833123 + - 234309.26002952136 + - 244175.19132386683 + - 245016.00798568144 + - 245426.89280894664 + - 240990.0517419236 + - 244753.63432290178 + - 244753.63432290178 +- !!python/tuple + - !!python/tuple + - 5.0 + - 44.0 + - 74.0 + - 214.0 + - 332.0 + - 443.0 + - 572.0 + - 681.0 + - 776.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 149799.04611267112 + - 251731.60810788482 + - 237885.3308454876 + - 252458.32081264793 + - 250634.64181579027 + - 245106.04336271327 + - 241741.28231565602 + - 241794.95211071175 + - 241794.95211071175 +- !!python/tuple + - !!python/tuple + - 5.0 + - 85.0 + - 115.0 + - 234.0 + - 401.0 + - 575.0 + - 719.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 153934.91743867903 + - 172509.0554105407 + - 196799.09738726736 + - 222960.4287792954 + - 250659.24836156174 + - 247240.44071118123 + - 247240.44071118123 +- !!python/tuple + - !!python/tuple + - 5.0 + - 40.0 + - 100.0 + - 160.0 + - 272.0 + - 381.0 + - 461.0 + - 639.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 130245.04365294233 + - 155881.34899939763 + - 194968.15564181417 + - 212872.29791895096 + - 230087.05448179384 + - 224796.23032860018 + - 226754.17141268478 + - 226754.17141268478 +- !!python/tuple + - !!python/tuple + - 5.0 + - 66.0 + - 96.0 + - 202.0 + - 277.0 + - 409.0 + - 446.0 + - 655.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 186438.5647823636 + - 192688.7929033532 + - 222710.89710845574 + - 199855.3545738408 + - 240900.61585372876 + - 250784.10402937085 + - 262369.4499080799 + - 262369.4499080799 +- !!python/tuple + - !!python/tuple + - 5.0 + - 44.0 + - 74.0 + - 171.0 + - 286.0 + - 359.0 + - 396.0 + - 432.0 + - 893.0 + - 959.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 185669.97039557883 + - 195808.02225813284 + - 225164.91186158935 + - 243957.08708089805 + - 255633.55119565557 + - 260937.77752193355 + - 269647.8951580856 + - 256834.39429019316 + - 269647.9249439514 + - 269647.9249439514 +- !!python/tuple + - !!python/tuple + - 5.0 + - 43.0 + - 73.0 + - 168.0 + - 282.0 + - 355.0 + - 392.0 + - 518.0 + - 773.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 136308.492233317 + - 163635.07514685215 + - 183763.60496128208 + - 206833.6174025474 + - 233362.82441502827 + - 240672.23983011144 + - 242871.54230719403 + - 244512.3211252974 + - 244512.3211252974 +problem_name: IRONORECONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.048 + - 0.108 + - 0.215 + - 0.252 + - 0.435 + - 0.846 + - 0.918 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7974754834965131 + - 0.30472375251002015 + - 0.11959238380161674 + - 0.02198828432794901 + - 0.0010750506386897416 + - 0.0001233778020125067 + - 0.02586779852795457 + - 0.02586779852795457 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.048 + - 0.111 + - 0.171 + - 0.209 + - 0.355 + - 0.521 + - 0.698 + - 0.742 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9586622924268051 + - 0.4361039871735835 + - 0.3544282436806955 + - 0.36058206925791497 + - 0.1618795608064296 + - 0.06011490189156505 + - 0.0807355176197224 + - 0.06011490189156505 + - 0.06011490189156505 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.04 + - 0.1 + - 0.24 + - 0.277 + - 0.394 + - 0.572 + - 0.73 + - 0.823 + - 1.0 + - !!python/tuple + - 1.0 + - 1.1594748866436182 + - 0.8534355451188543 + - 0.755211308615175 + - 0.27462402734165775 + - 0.16002018508771534 + - 0.16276897894246575 + - 0.16221925482971714 + - 0.16874098896079934 + - 0.16874098896079934 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.04 + - 0.1 + - 0.16 + - 0.272 + - 0.381 + - 0.503 + - 0.704 + - 0.75 + - 0.835 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9033867517701762 + - 0.6914526086100667 + - 0.5029766412930451 + - 0.2163103498411084 + - 0.12156716096190655 + - 0.11349274310651988 + - 0.10954698905079042 + - 0.1521542664277255 + - 0.11601233469377414 + - 0.11601233469377414 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.044 + - 0.074 + - 0.214 + - 0.332 + - 0.443 + - 0.572 + - 0.681 + - 0.776 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0278675075455075 + - 0.04900239223819706 + - 0.1819691059529948 + - 0.04202372220754847 + - 0.05953663188626741 + - 0.112628127443037 + - 0.14494014968440772 + - 0.1444247551029568 + - 0.1444247551029568 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.085 + - 0.115 + - 0.234 + - 0.401 + - 0.575 + - 0.719 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9881504624405387 + - 0.8097817905296533 + - 0.5765229154953496 + - 0.32529392479409797 + - 0.0593003336044187 + - 0.09213136894188395 + - 0.09213136894188395 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.04 + - 0.1 + - 0.16 + - 0.272 + - 0.381 + - 0.461 + - 0.639 + - 1.0 + - !!python/tuple + - 1.0 + - 1.2156458827555863 + - 0.9694587517955138 + - 0.5941055698278107 + - 0.42217091075968166 + - 0.25685646817100516 + - 0.3076646014447454 + - 0.28886236408778204 + - 0.28886236408778204 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.066 + - 0.096 + - 0.202 + - 0.277 + - 0.409 + - 0.446 + - 0.655 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6760157933788711 + - 0.6159944405295552 + - 0.3276901938858213 + - 0.5471734761720793 + - 0.15301312516037055 + - 0.05810133639219837 + - -0.05315350413628883 + - -0.05315350413628883 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.044 + - 0.074 + - 0.171 + - 0.286 + - 0.359 + - 0.396 + - 0.432 + - 0.893 + - 0.959 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6833966559640766 + - 0.5860402753219771 + - 0.3041241283688497 + - 0.12366163039114227 + - 0.011531775432621008 + - -0.03940505979312324 + - -0.12304889388661522 + - -0.0 + - -0.1230491799222489 + - -0.1230491799222489 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.043 + - 0.073 + - 0.168 + - 0.282 + - 0.355 + - 0.392 + - 0.518 + - 0.773 + - 1.0 + - !!python/tuple + - 1.0 + - 1.1574181861529333 + - 0.894999208242142 + - 0.7017036089547056 + - 0.4801607580105626 + - 0.22539903346465184 + - 0.1552062351765995 + - 0.13408618844485753 + - 0.11832968124500945 + - 0.11832968124500945 +solver_name: ASTRODF diff --git a/test/expected_results/IRONORECONT1_NELDMD.yaml b/test/expected_results/IRONORECONT1_NELDMD.yaml new file mode 100644 index 000000000..188674694 --- /dev/null +++ b/test/expected_results/IRONORECONT1_NELDMD.yaml @@ -0,0 +1,489 @@ +all_est_objectives: +- - 152700.98469043188 + - 156702.28684759123 + - 180275.32234557465 + - 197482.63036573437 + - 202908.8437780399 + - 202908.8437780399 +- - 133145.92876656458 + - 132809.50206028402 + - 132809.50206028402 +- - 110208.01327425054 + - 126468.15733332263 + - 132258.0848802002 + - 189003.7572772607 + - 189003.7572772607 +- - 145554.7585106055 + - 210710.80233874824 + - 214167.9186000399 + - 229850.94969916038 + - 229850.94969916038 +- - 146391.39502516043 + - 143015.1345821515 + - 144207.9538440267 + - 144878.4487585495 + - 144878.4487585495 +- - 133265.08840579027 + - 245669.48821620655 + - 245669.48821620655 +- - 105150.1358889471 + - 106360.93219289248 + - 106360.93219289248 +- - 169184.40059734188 + - 218264.68870523464 + - 226539.5401274235 + - 233153.43111423292 + - 233153.43111423292 +- - 156372.6117499876 + - 261108.3196805129 + - 266823.80389861023 + - 266823.80389861023 +- - 106114.5439436892 + - 95301.92806177046 + - 95301.92806177046 +all_intermediate_budgets: +- - 0 + - 480 + - 630 + - 840 + - 990 + - 1000 +- - 0 + - 810 + - 1000 +- - 0 + - 540 + - 720 + - 900 + - 1000 +- - 0 + - 840 + - 900 + - 990 + - 1000 +- - 0 + - 690 + - 750 + - 810 + - 1000 +- - 0 + - 990 + - 1000 +- - 0 + - 870 + - 1000 +- - 0 + - 840 + - 900 + - 990 + - 1000 +- - 0 + - 660 + - 960 + - 1000 +- - 0 + - 510 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 71.84677291324282 + - 59.313560684071284 + - 103.72927038686147 + - !!python/tuple + - 57.01458254813238 + - 81.82035193522378 + - 102.68125854016773 + - !!python/tuple + - 53.35830908053868 + - 93.63100010512471 + - 103.75555296071246 + - !!python/tuple + - 47.83760313612027 + - 97.61041256787956 + - 102.26289379497409 + - !!python/tuple + - 47.83760313612027 + - 97.61041256787956 + - 102.26289379497409 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 81.75200674676572 + - 40.59763606068053 + - 100.07218623080225 + - !!python/tuple + - 81.75200674676572 + - 40.59763606068053 + - 100.07218623080225 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 72.99402336126965 + - 61.01444415352947 + - 100.27025191408053 + - !!python/tuple + - 77.78692868226355 + - 62.860690909278254 + - 101.0162252365504 + - !!python/tuple + - 67.02403415536372 + - 97.2866127479025 + - 98.17365677049985 + - !!python/tuple + - 67.02403415536372 + - 97.2866127479025 + - 98.17365677049985 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 77.05992216766845 + - 102.0282154661873 + - 99.37299152796103 + - !!python/tuple + - 79.28183844548062 + - 89.42792181444659 + - 99.98720277010761 + - !!python/tuple + - 88.6060134858426 + - 97.82621392212657 + - 96.13571418562641 + - !!python/tuple + - 88.6060134858426 + - 97.82621392212657 + - 96.13571418562641 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.94647133838484 + - 41.59867781940778 + - 102.09635916368613 + - !!python/tuple + - 71.40647090729277 + - 43.54690728286649 + - 101.68315577157618 + - !!python/tuple + - 96.25182809429393 + - 42.141913172792854 + - 101.95920876321753 + - !!python/tuple + - 96.25182809429393 + - 42.141913172792854 + - 101.95920876321753 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 96.65400053674381 + - 94.28745024745508 + - 98.03003176273842 + - !!python/tuple + - 96.65400053674381 + - 94.28745024745508 + - 98.03003176273842 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 86.21007564291517 + - 40.63353104415674 + - 100.53231292940292 + - !!python/tuple + - 86.21007564291517 + - 40.63353104415674 + - 100.53231292940292 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 79.97022618071836 + - 94.12882651103612 + - 91.8612501735434 + - !!python/tuple + - 81.50969219963497 + - 100.94067633361448 + - 92.36620967836129 + - !!python/tuple + - 84.30569552825581 + - 102.50533697678345 + - 94.31393706259712 + - !!python/tuple + - 84.30569552825581 + - 102.50533697678345 + - 94.31393706259712 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 99.94506698217423 + - 106.12087418716565 + - 95.75645937152834 + - !!python/tuple + - 101.70183362266981 + - 103.17509215814843 + - 95.30266657128709 + - !!python/tuple + - 101.70183362266981 + - 103.17509215814843 + - 95.30266657128709 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 86.63835328843174 + - 38.52866321064975 + - 97.49557513910626 + - !!python/tuple + - 86.63835328843174 + - 38.52866321064975 + - 97.49557513910626 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 480.0 + - 630.0 + - 840.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 156702.28684759123 + - 180275.32234557465 + - 197482.63036573437 + - 202908.8437780399 + - 202908.8437780399 +- !!python/tuple + - !!python/tuple + - 0.0 + - 810.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 132809.50206028402 + - 132809.50206028402 +- !!python/tuple + - !!python/tuple + - 0.0 + - 540.0 + - 720.0 + - 900.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 126468.15733332263 + - 132258.0848802002 + - 189003.7572772607 + - 189003.7572772607 +- !!python/tuple + - !!python/tuple + - 0.0 + - 840.0 + - 900.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 210710.80233874824 + - 214167.9186000399 + - 229850.94969916038 + - 229850.94969916038 +- !!python/tuple + - !!python/tuple + - 0.0 + - 690.0 + - 750.0 + - 810.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 143015.1345821515 + - 144207.9538440267 + - 144878.4487585495 + - 144878.4487585495 +- !!python/tuple + - !!python/tuple + - 0.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 245669.48821620655 + - 245669.48821620655 +- !!python/tuple + - !!python/tuple + - 0.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 106360.93219289248 + - 106360.93219289248 +- !!python/tuple + - !!python/tuple + - 0.0 + - 840.0 + - 900.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 218264.68870523464 + - 226539.5401274235 + - 233153.43111423292 + - 233153.43111423292 +- !!python/tuple + - !!python/tuple + - 0.0 + - 660.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 261108.3196805129 + - 254094.67916689013 + - 254094.67916689013 +- !!python/tuple + - !!python/tuple + - 0.0 + - 510.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 95301.92806177046 + - 95301.92806177046 +problem_name: IRONORECONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.48 + - 0.63 + - 0.84 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.960536972463427 + - 0.7280468198982036 + - 0.558338948920537 + - 0.5048226682452589 + - 0.5048226682452589 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.81 + - 1.0 + - !!python/tuple + - 1.0 + - 1.1961806671791242 + - 1.1961806671791242 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.54 + - 0.72 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 1.2587224727588957 + - 1.2016190446140431 + - 0.6419622268004282 + - 0.6419622268004282 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.84 + - 0.9 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.42787549119452223 + - 0.3937795222179273 + - 0.2391049028532903 + - 0.2391049028532903 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.69 + - 0.75 + - 0.81 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0955271445457513 + - 1.0837629094221153 + - 1.077150122325394 + - 1.077150122325394 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.08309383531379019 + - 0.08309383531379019 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - 1.4570309104211476 + - 1.4570309104211476 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.84 + - 0.9 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.353374937629623 + - 0.2717638328669878 + - 0.20653402719751351 + - 0.20653402719751351 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.66 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - -0.06917235386122776 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.51 + - 1.0 + - !!python/tuple + - 1.0 + - 1.5661008500088573 + - 1.5661008500088573 +solver_name: NELDMD diff --git a/test/expected_results/IRONORECONT1_RNDSRCH.yaml b/test/expected_results/IRONORECONT1_RNDSRCH.yaml new file mode 100644 index 000000000..f529fc408 --- /dev/null +++ b/test/expected_results/IRONORECONT1_RNDSRCH.yaml @@ -0,0 +1,349 @@ +all_est_objectives: +- - 152700.98469043188 + - 152700.98469043188 +- - 133145.92876656458 + - 197958.6340204278 + - 191042.02925983866 + - 191042.02925983866 +- - 110208.01327425054 + - 110208.01327425054 +- - 145554.7585106055 + - 145554.7585106055 +- - 146391.39502516043 + - 205587.07807997617 + - 205587.07807997617 +- - 133265.08840579027 + - 133265.08840579027 +- - 105150.1358889471 + - 105150.1358889471 +- - 169184.40059734188 + - 141129.60452255065 + - 210946.56634402252 + - 210946.56634402252 +- - 156372.6117499876 + - 235143.55378604916 + - 235143.55378604916 +- - 106114.5439436892 + - 170045.30380932428 + - 212270.46308484938 + - 212270.46308484938 +all_intermediate_budgets: +- - 0 + - 1000 +- - 0 + - 140 + - 180 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 960 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +- - 0 + - 230 + - 310 + - 1000 +- - 0 + - 330 + - 1000 +- - 0 + - 70 + - 850 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 89.51286085366789 + - 110.69874262239097 + - 28.284950503085465 + - !!python/tuple + - 48.98708330069736 + - 98.01083372144204 + - 99.73877755543312 + - !!python/tuple + - 48.98708330069736 + - 98.01083372144204 + - 99.73877755543312 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 82.31961648623096 + - 97.24186772912596 + - 31.03681099951429 + - !!python/tuple + - 82.31961648623096 + - 97.24186772912596 + - 31.03681099951429 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 126.52678555423246 + - 17.98040104682185 + - 97.12547689041833 + - !!python/tuple + - 94.51644538396839 + - 85.06518197933129 + - 22.02606581205134 + - !!python/tuple + - 94.51644538396839 + - 85.06518197933129 + - 22.02606581205134 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 91.31252825949757 + - 90.48184614967685 + - 89.29705684153677 + - !!python/tuple + - 91.31252825949757 + - 90.48184614967685 + - 89.29705684153677 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 89.00817259485456 + - 116.40115198323831 + - 91.11061514985424 + - !!python/tuple + - 113.00855572188193 + - 94.53529333943227 + - 31.416681866883046 + - !!python/tuple + - 113.00855572188193 + - 94.53529333943227 + - 31.416681866883046 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 140.0 + - 180.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 197958.6340204278 + - 191042.02925983866 + - 191042.02925983866 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 205587.07807997617 + - 205587.07807997617 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 230.0 + - 310.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 141129.60452255065 + - 210946.56634402252 + - 210946.56634402252 +- !!python/tuple + - !!python/tuple + - 0.0 + - 330.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 222453.43002346347 + - 222453.43002346347 +- !!python/tuple + - !!python/tuple + - 0.0 + - 70.0 + - 850.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 170045.30380932428 + - 212270.46308484938 + - 212270.46308484938 +problem_name: IRONORECONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.14 + - 0.18 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3511675595900013 + - 0.4503268754758595 + - 0.4503268754758595 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2418030201372763 + - 0.2418030201372763 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.23 + - 0.31 + - 1.0 + - !!python/tuple + - 1.0 + - 1.1658921076190794 + - 0.1649671724697489 + - 0.1649671724697489 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.33 + - 1.0 + - !!python/tuple + - 1.0 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.07 + - 0.85 + - 1.0 + - !!python/tuple + - 1.0 + - 0.751344644104127 + - 0.14598723944366002 + - 0.14598723944366002 +solver_name: RNDSRCH diff --git a/test/expected_results/IRONORECONT1_SPSA.yaml b/test/expected_results/IRONORECONT1_SPSA.yaml new file mode 100644 index 000000000..ee755f452 --- /dev/null +++ b/test/expected_results/IRONORECONT1_SPSA.yaml @@ -0,0 +1,529 @@ +all_est_objectives: +- - 152700.98469043188 + - 151840.12738894694 + - 151590.3834876948 + - 151590.3834876948 + - 151590.3834876948 + - 151590.3834876948 +- - 133145.92876656458 + - 132654.04299391358 + - 132786.38950275752 + - 132786.38950275752 +- - 110208.01327425051 + - 113442.82976724167 + - 113270.35324138927 + - 112762.40523104482 + - 114516.01041623985 + - 114822.45110103954 + - 115766.436169948 + - 116179.41260646742 + - 116179.41260646742 +- - 145554.75851060552 + - 144201.24083957472 + - 143338.85115667948 + - 143338.85115667948 +- - 146391.39502516045 + - 71107.94297101063 + - 139114.51313938183 + - 142433.56195206303 + - 142433.56195206303 +- - 133265.08840579024 + - 135105.92130258455 + - 135008.0881794654 + - 135373.38341067923 + - 133600.30038033338 + - 133600.30038033338 +- - 105150.1358889471 + - 104111.53813769328 + - 103002.70840704137 + - 101818.91578405153 + - 101818.91578405153 +- - 169184.40059734188 + - 57288.42123109125 + - 57288.42123109125 +- - 156372.6117499876 + - 156372.6117499876 +- - 106114.54394368925 + - 106114.54394368925 +all_intermediate_budgets: +- - 0 + - 210 + - 330 + - 390 + - 450 + - 1000 +- - 0 + - 270 + - 390 + - 1000 +- - 0 + - 390 + - 450 + - 510 + - 630 + - 750 + - 870 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 1000 +- - 0 + - 210 + - 570 + - 690 + - 1000 +- - 0 + - 210 + - 270 + - 390 + - 750 + - 1000 +- - 0 + - 210 + - 330 + - 390 + - 1000 +- - 0 + - 210 + - 1000 +- - 0 + - 1000 +- - 0 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 79.9 + - 40.1 + - 99.9 + - !!python/tuple + - 79.84017410829041 + - 40.15982636137829 + - 99.84017410829041 + - !!python/tuple + - 79.84017426524126 + - 40.15982651832914 + - 99.84017426524126 + - !!python/tuple + - 79.84017440615371 + - 40.159826659241595 + - 99.84017440615371 + - !!python/tuple + - 79.84017440615371 + - 40.159826659241595 + - 99.84017440615371 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0621233334677 + - 39.9378766665323 + - 99.78492748186042 + - !!python/tuple + - 80.09269687285098 + - 39.907303127149 + - 99.64969446094611 + - !!python/tuple + - 80.09269687285098 + - 39.907303127149 + - 99.64969446094611 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.33245538732317 + - 40.010953164806715 + - 99.66754461267683 + - !!python/tuple + - 80.40414923155963 + - 39.93925932057025 + - 99.59585076844037 + - !!python/tuple + - 80.4683877619487 + - 39.875020790181175 + - 99.5316122380513 + - !!python/tuple + - 80.55782556455779 + - 39.84761268383893 + - 99.44217443544221 + - !!python/tuple + - 80.57923244217581 + - 39.826205806220905 + - 99.36389524060102 + - !!python/tuple + - 80.59778443418914 + - 39.807653814207576 + - 99.294808571531 + - !!python/tuple + - 80.61425217614229 + - 39.79118607225444 + - 99.23268501900066 + - !!python/tuple + - 80.61425217614229 + - 39.79118607225444 + - 99.23268501900066 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 79.89007837426807 + - 40.10992162573192 + - 99.89007837426807 + - !!python/tuple + - 79.80900926727551 + - 40.19099073272449 + - 99.80900926727551 + - !!python/tuple + - 79.80900926727551 + - 40.19099073272449 + - 99.80900926727551 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 0.0 + - 120.0 + - 20.0 + - !!python/tuple + - 20.0 + - 100.0 + - 0.0 + - !!python/tuple + - 120.0 + - 0.0 + - 100.0 + - !!python/tuple + - 120.0 + - 0.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.13682602164862 + - 39.863173978351384 + - 99.86317397835138 + - !!python/tuple + - 80.2377375876352 + - 39.76226241236481 + - 99.7622624123648 + - !!python/tuple + - 80.36934490905305 + - 39.730154315428834 + - 99.63065509094695 + - !!python/tuple + - 80.5878048444836 + - 39.58294888794957 + - 99.41219609192802 + - !!python/tuple + - 80.5878048444836 + - 39.58294888794957 + - 99.41219609192802 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.14178766885254 + - 39.858212331147456 + - 99.85821233114746 + - !!python/tuple + - 80.30591739729843 + - 39.81320032574625 + - 99.69408260270157 + - !!python/tuple + - 80.37807711533934 + - 39.74104060770535 + - 99.62192288466066 + - !!python/tuple + - 80.37807711533934 + - 39.74104060770535 + - 99.62192288466066 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 120.0 + - 0.0 + - 60.0 + - !!python/tuple + - 120.0 + - 0.0 + - 60.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 330.0 + - 390.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 151840.12738894694 + - 151590.3834876948 + - 151590.3834876948 + - 151590.3834876948 + - 151590.3834876948 +- !!python/tuple + - !!python/tuple + - 0.0 + - 270.0 + - 390.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 132654.04299391358 + - 132786.38950275752 + - 132786.38950275752 +- !!python/tuple + - !!python/tuple + - 0.0 + - 390.0 + - 450.0 + - 510.0 + - 630.0 + - 750.0 + - 870.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 113442.82976724167 + - 113270.35324138927 + - 112762.40523104482 + - 114516.01041623985 + - 114822.45110103954 + - 115766.436169948 + - 116179.41260646742 + - 116179.41260646742 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 144201.24083957472 + - 143338.85115667948 + - 143338.85115667948 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 570.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 71107.94297101063 + - 139114.51313938183 + - 142433.56195206303 + - 142433.56195206303 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 390.0 + - 750.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 135105.92130258455 + - 135008.0881794654 + - 135373.38341067923 + - 133600.30038033338 + - 133600.30038033338 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 330.0 + - 390.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 104111.53813769328 + - 103002.70840704137 + - 101818.91578405153 + - 101818.91578405153 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 57288.42123109125 + - 57288.42123109125 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +problem_name: IRONORECONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.33 + - 0.39 + - 0.45 + - 1.0 + - !!python/tuple + - 0.0 + - -8.608573014849389e+17 + - -1.1106012027370743e+18 + - -1.1106012027370743e+18 + - -1.1106012027370743e+18 + - -1.1106012027370743e+18 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.27 + - 0.39 + - 1.0 + - !!python/tuple + - 0.0 + - -2.0046941696518304e+19 + - -1.991459518767436e+19 + - -1.991459518767436e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.39 + - 0.45 + - 0.51 + - 0.63 + - 0.75 + - 0.87 + - 0.99 + - 1.0 + - !!python/tuple + - 0.0 + - -3.9258154923190215e+19 + - -3.943063144904262e+19 + - -3.9938579459387064e+19 + - -3.818497427419203e+19 + - -3.787853358939234e+19 + - -3.693454852048387e+19 + - -3.652157208396446e+19 + - -3.652157208396446e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 1.0 + - !!python/tuple + - 0.0 + - -8.499743850857164e+18 + - -9.362133533752406e+18 + - -9.362133533752406e+18 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.57 + - 0.69 + - 1.0 + - !!python/tuple + - 0.0 + - -8.159304171942124e+19 + - -1.3586471551050054e+19 + - -1.0267422738368854e+19 + - -1.0267422738368854e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.39 + - 0.75 + - 1.0 + - !!python/tuple + - 0.0 + - -1.759506338784733e+19 + - -1.769289651096647e+19 + - -1.7327601279752649e+19 + - -1.9100684310098498e+19 + - -1.9100684310098498e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.33 + - 0.39 + - 1.0 + - !!python/tuple + - 0.0 + - -4.85894465527386e+19 + - -4.969827628339051e+19 + - -5.088206890638035e+19 + - -5.088206890638035e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 1.0 + - !!python/tuple + - 0.0 + - -9.541256345934062e+19 + - -9.541256345934062e+19 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 0.0 + - 0.0 +solver_name: SPSA diff --git a/test/expected_results/IRONORECONT1_STRONG.yaml b/test/expected_results/IRONORECONT1_STRONG.yaml new file mode 100644 index 000000000..5872d0045 --- /dev/null +++ b/test/expected_results/IRONORECONT1_STRONG.yaml @@ -0,0 +1,469 @@ +all_est_objectives: +- - 152700.98469043188 + - 151261.39466714693 + - 143141.5385002208 + - 151489.31619242203 + - 151489.31619242203 +- - 133145.92876656458 + - 127679.80863817634 + - 127679.80863817634 +- - 110208.01327425054 + - 88493.38899143093 + - 110474.85330152012 + - 88478.78046809668 + - 88478.78046809668 +- - 145554.7585106055 + - 145554.7585106055 +- - 146391.39502516043 + - 141692.68599963858 + - 141692.68599963858 +- - 133265.08840579027 + - 132622.81142005543 + - 133334.13999107914 + - 132741.1865782531 + - 132741.1865782531 +- - 105150.1358889471 + - 105150.1358889471 +- - 169184.40059734188 + - 167306.4259984403 + - 169184.40059734188 + - 167306.4259984403 + - 169139.1449088558 + - 166990.48584664016 + - 169212.11244850873 + - 169212.11244850873 +- - 156372.6117499876 + - 156372.6117499876 +- - 106114.5439436892 + - 100238.39278009595 + - 98995.01751320418 + - 105733.48095440367 + - 105733.48095440367 +all_intermediate_budgets: +- - 10 + - 80 + - 430 + - 535 + - 1000 +- - 10 + - 157 + - 1000 +- - 10 + - 80 + - 332 + - 430 + - 1000 +- - 10 + - 1000 +- - 10 + - 80 + - 1000 +- - 10 + - 80 + - 241 + - 332 + - 1000 +- - 10 + - 1000 +- - 10 + - 80 + - 157 + - 241 + - 332 + - 535 + - 892 + - 1000 +- - 10 + - 1000 +- - 10 + - 80 + - 157 + - 332 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.02058501656855 + - 40.07940496945405 + - 101.99831706891545 + - !!python/tuple + - 80.1441685984694 + - 40.26686403296491 + - 103.98567365438073 + - !!python/tuple + - 80.1532856249583 + - 40.372263845728085 + - 101.98847367458464 + - !!python/tuple + - 80.1532856249583 + - 40.372263845728085 + - 101.98847367458464 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.06505954227995 + - 40.0 + - 98.00105846609804 + - !!python/tuple + - 80.06505954227995 + - 40.0 + - 98.00105846609804 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.04795602656348 + - 101.99942497221483 + - !!python/tuple + - 80.0 + - 40.3192295476598 + - 100.01790770588784 + - !!python/tuple + - 80.06042847260716 + - 40.61018419944908 + - 101.99570794612964 + - !!python/tuple + - 80.06042847260716 + - 40.61018419944908 + - 101.99570794612964 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 79.99895105312721 + - 40.131115272333616 + - 101.99569729294583 + - !!python/tuple + - 79.99895105312721 + - 40.131115272333616 + - 101.99569729294583 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.004957428204 + - 40.04878752753128 + - 101.99939870987829 + - !!python/tuple + - 80.02122587549277 + - 40.167631842136245 + - 100.00299910896948 + - !!python/tuple + - 80.02673155335975 + - 40.20139944511904 + - 102.00270644668169 + - !!python/tuple + - 80.02673155335975 + - 40.20139944511904 + - 102.00270644668169 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.04000755764358 + - 101.9995998087946 + - !!python/tuple + - 80.0 + - 40.042988209180855 + - 99.99960202986674 + - !!python/tuple + - 80.0 + - 40.06124813179 + - 101.99951867193617 + - !!python/tuple + - 80.0 + - 40.064680432562 + - 99.99952161711049 + - !!python/tuple + - 80.0 + - 40.41922979837048 + - 101.96784444307293 + - !!python/tuple + - 80.0 + - 40.53182049120039 + - 99.97101612399088 + - !!python/tuple + - 80.0 + - 40.53182049120039 + - 99.97101612399088 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 80.0 + - 40.0 + - 100.0 +- - !!python/tuple + - 80.0 + - 40.0 + - 100.0 + - !!python/tuple + - 79.99623298607793 + - 40.38463127888887 + - 98.03733737262198 + - !!python/tuple + - 80.02195340175747 + - 42.318140478616414 + - 97.52657261778252 + - !!python/tuple + - 80.09583709666668 + - 43.689347183596375 + - 98.98064736546387 + - !!python/tuple + - 80.09583709666668 + - 43.689347183596375 + - 98.98064736546387 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 80.0 + - 430.0 + - 535.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 151261.39466714693 + - 143141.5385002208 + - 151489.31619242203 + - 151489.31619242203 +- !!python/tuple + - !!python/tuple + - 10.0 + - 157.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 127679.80863817634 + - 127679.80863817634 +- !!python/tuple + - !!python/tuple + - 10.0 + - 80.0 + - 332.0 + - 430.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 88493.38899143093 + - 110474.85330152012 + - 88478.78046809668 + - 88478.78046809668 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 10.0 + - 80.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 141692.68599963858 + - 141692.68599963858 +- !!python/tuple + - !!python/tuple + - 10.0 + - 80.0 + - 241.0 + - 332.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 132622.81142005543 + - 133334.13999107914 + - 132741.1865782531 + - 132741.1865782531 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 10.0 + - 80.0 + - 157.0 + - 241.0 + - 332.0 + - 535.0 + - 892.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 167306.4259984403 + - 169184.40059734188 + - 167306.4259984403 + - 169139.1449088558 + - 166990.48584664016 + - 153738.47690718542 + - 153738.47690718542 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 152700.98469043188 +- !!python/tuple + - !!python/tuple + - 10.0 + - 80.0 + - 157.0 + - 332.0 + - 1000.0 + - !!python/tuple + - 152700.98469043188 + - 100238.39278009595 + - 98995.01751320418 + - 105733.48095440367 + - 105733.48095440367 +problem_name: IRONORECONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.08 + - 0.43 + - 0.535 + - 1.0 + - !!python/tuple + - 1.0 + - 2.3875670583723827 + - 10.213993161436846 + - 2.1678820124562788 + - 2.1678820124562788 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.157 + - 1.0 + - !!python/tuple + - 1.0 + - 25.116977118681746 + - 25.116977118681746 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.08 + - 0.332 + - 0.43 + - 1.0 + - !!python/tuple + - 1.0 + - 62.88730350181862 + - 41.70019100581138 + - 62.90138411186884 + - 62.90138411186884 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.08 + - 1.0 + - !!python/tuple + - 1.0 + - 11.61048797574581 + - 11.61048797574581 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.08 + - 0.241 + - 0.332 + - 1.0 + - !!python/tuple + - 1.0 + - 20.352601345968544 + - 19.666978302694485 + - 20.23850395199667 + - 20.23850395199667 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.08 + - 0.157 + - 0.241 + - 0.332 + - 0.535 + - 0.892 + - 1.0 + - !!python/tuple + - 1.0 + - -13.077639400236567 + - -14.887748978482875 + - -13.077639400236567 + - -14.844128710537436 + - -12.77311648748763 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.08 + - 0.157 + - 0.332 + - 1.0 + - !!python/tuple + - 1.0 + - 51.56673299631951 + - 52.765175979132884 + - 46.270222732847245 + - 46.270222732847245 +solver_name: STRONG diff --git a/test/expected_results/MM11_ADAM.yaml b/test/expected_results/MM11_ADAM.yaml new file mode 100644 index 000000000..46f89a597 --- /dev/null +++ b/test/expected_results/MM11_ADAM.yaml @@ -0,0 +1,733 @@ +all_est_objectives: +- - 2.780124829249758 + - 2.3515693140469414 + - 1.9929649117012829 + - 1.7169370058922488 + - 1.5511154208236317 + - 1.5303410366637242 + - 1.5261609292431466 + - 1.5261609292431466 +- - 2.789035151306537 + - 2.362368815945796 + - 2.0065975542240633 + - 1.735708570878337 + - 1.5726966460108827 + - 1.5513719943214748 + - 1.5513719943214748 +- - 2.7862478107466546 + - 2.359309127990847 + - 2.003610688457385 + - 1.7337173506186243 + - 1.5780341133157114 + - 1.5684057574831007 + - 1.559128019864952 + - 1.559128019864952 +- - 2.7881760005848144 + - 2.3612140349150756 + - 2.005830212070105 + - 1.7359609188286895 + - 1.5796852556288525 + - 1.5615413077245457 + - 1.5621335196458133 + - 1.5621335196458133 +- - 2.77940256374346 + - 2.3504152649837766 + - 1.9918847966708026 + - 1.7176381954055875 + - 1.5557574082202281 + - 1.5340242579669152 + - 1.5339234192469267 + - 1.5339234192469267 +- - 2.789186580392257 + - 2.3625075136218787 + - 2.0069290172719323 + - 1.7371929294144368 + - 1.5806049332218277 + - 1.5733346982893142 + - 1.5612849861589906 + - 1.5612849861589906 +- - 2.7840784985550453 + - 2.356666754670753 + - 2.00004929567104 + - 1.727769410929042 + - 1.5664440172306886 + - 1.5788904719176906 + - 1.564427686838332 + - 1.544724462170458 + - 1.5455045709134936 + - 1.5455045709134936 +- - 2.7894024528762422 + - 2.363368705933955 + - 2.009931651086992 + - 1.743005417264496 + - 1.5909499889195007 + - 1.6179846697393816 + - 1.6100615708404098 + - 1.578961063331163 + - 1.5781401211011075 + - 1.5781401211011075 +- - 2.7873753797816248 + - 2.3597703809940542 + - 2.0033062282461684 + - 1.73144071069541 + - 1.5728126248456211 + - 1.5644441418451154 + - 1.5528899505766143 + - 1.5528899505766143 +- - 2.789809403279113 + - 2.3632949134187036 + - 2.0083880393265803 + - 1.7401777754025674 + - 1.5892418603028589 + - 1.5989836601508005 + - 1.5760801449254385 + - 1.5760801449254385 +all_intermediate_budgets: +- - 0 + - 60 + - 90 + - 120 + - 150 + - 420 + - 450 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 450 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 420 + - 450 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 450 + - 660 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 420 + - 450 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 420 + - 450 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 420 + - 450 + - 690 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 420 + - 450 + - 690 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 420 + - 450 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 420 + - 450 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005366897 + - !!python/tuple + - 4.003004560324342 + - !!python/tuple + - 3.5123680289566863 + - !!python/tuple + - 3.033809830342704 + - !!python/tuple + - 2.7040480453692326 + - !!python/tuple + - 2.8413787796611714 + - !!python/tuple + - 2.8413787796611714 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005377763 + - !!python/tuple + - 4.003063613212165 + - !!python/tuple + - 3.512698763886283 + - !!python/tuple + - 3.0349726782257616 + - !!python/tuple + - 2.8392016843721897 + - !!python/tuple + - 2.8392016843721897 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005375356 + - !!python/tuple + - 4.003021944059994 + - !!python/tuple + - 3.512528800915691 + - !!python/tuple + - 3.034401582766069 + - !!python/tuple + - 2.7037094220298323 + - !!python/tuple + - 2.8428708705357044 + - !!python/tuple + - 2.8428708705357044 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.50000000538071 + - !!python/tuple + - 4.003092018928721 + - !!python/tuple + - 3.512809639456232 + - !!python/tuple + - 3.0351971311398613 + - !!python/tuple + - 2.8725004151149482 + - !!python/tuple + - 2.885706874900098 + - !!python/tuple + - 2.885706874900098 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005399897 + - !!python/tuple + - 4.003102733658987 + - !!python/tuple + - 3.5128936519448044 + - !!python/tuple + - 3.0354861202091614 + - !!python/tuple + - 2.7346144472620906 + - !!python/tuple + - 2.8758091523718465 + - !!python/tuple + - 2.8758091523718465 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005388163 + - !!python/tuple + - 4.003058472726469 + - !!python/tuple + - 3.5126780187496123 + - !!python/tuple + - 3.0349493734745496 + - !!python/tuple + - 2.686477889201978 + - !!python/tuple + - 2.831428970373489 + - !!python/tuple + - 2.831428970373489 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.50000000536467 + - !!python/tuple + - 4.003002495195689 + - !!python/tuple + - 3.5123763945691593 + - !!python/tuple + - 3.033685402293352 + - !!python/tuple + - 2.577816876095712 + - !!python/tuple + - 2.6278661195002937 + - !!python/tuple + - 2.7742979094324003 + - !!python/tuple + - 2.758756384492122 + - !!python/tuple + - 2.758756384492122 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005356673 + - !!python/tuple + - 4.002969569343121 + - !!python/tuple + - 3.512261056149438 + - !!python/tuple + - 3.0334024427985837 + - !!python/tuple + - 2.577291436683673 + - !!python/tuple + - 2.601520363685287 + - !!python/tuple + - 2.7536124514626565 + - !!python/tuple + - 2.761757587335865 + - !!python/tuple + - 2.761757587335865 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005375804 + - !!python/tuple + - 4.003037907171925 + - !!python/tuple + - 3.5126043084811345 + - !!python/tuple + - 3.034601110312652 + - !!python/tuple + - 2.688011660379207 + - !!python/tuple + - 2.8343104838743054 + - !!python/tuple + - 2.8343104838743054 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.500000005357146 + - !!python/tuple + - 4.002973607736823 + - !!python/tuple + - 3.512297952023572 + - !!python/tuple + - 3.0336148245939447 + - !!python/tuple + - 2.662123654203705 + - !!python/tuple + - 2.8068534006951547 + - !!python/tuple + - 2.8068534006951547 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 420.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.3515693140469414 + - 1.9929649117012829 + - 1.7169370058922488 + - 1.5511154208236317 + - 1.5303410366637242 + - 1.5261609292431466 + - 1.5261609292431466 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.362368815945796 + - 2.0065975542240633 + - 1.735708570878337 + - 1.5726966460108827 + - 1.5513719943214748 + - 1.5513719943214748 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 420.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.359309127990847 + - 2.003610688457385 + - 1.7337173506186243 + - 1.5780341133157114 + - 1.5684057574831007 + - 1.559128019864952 + - 1.559128019864952 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 450.0 + - 660.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.3612140349150756 + - 2.005830212070105 + - 1.7359609188286895 + - 1.5796852556288525 + - 1.5615413077245457 + - 1.5621335196458133 + - 1.5621335196458133 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 420.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.3504152649837766 + - 1.9918847966708026 + - 1.7176381954055875 + - 1.5557574082202281 + - 1.5340242579669152 + - 1.5339234192469267 + - 1.5339234192469267 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 420.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.3625075136218787 + - 2.0069290172719323 + - 1.7371929294144368 + - 1.5806049332218277 + - 1.5733346982893142 + - 1.5612849861589906 + - 1.5612849861589906 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 420.0 + - 450.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.356666754670753 + - 2.00004929567104 + - 1.727769410929042 + - 1.5664440172306886 + - 1.5788904719176906 + - 1.564427686838332 + - 1.544724462170458 + - 1.5455045709134936 + - 1.5455045709134936 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 420.0 + - 450.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.363368705933955 + - 2.009931651086992 + - 1.743005417264496 + - 1.5909499889195007 + - 1.6179846697393816 + - 1.6100615708404098 + - 1.578961063331163 + - 1.5781401211011075 + - 1.5781401211011075 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 420.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.3597703809940542 + - 2.0033062282461684 + - 1.73144071069541 + - 1.5728126248456211 + - 1.5644441418451154 + - 1.5528899505766143 + - 1.5528899505766143 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 420.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.3632949134187036 + - 2.0083880393265803 + - 1.7401777754025674 + - 1.5892418603028589 + - 1.5989836601508005 + - 1.5760801449254385 + - 1.5760801449254385 +problem_name: MM1-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.42 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6582393518660647 + - 0.37226269628310277 + - 0.15213841215691806 + - 0.019900486433743075 + - 0.0033335149604829754 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6668516427771488 + - 0.3831343350302059 + - 0.16710819317373143 + - 0.037110890327457347 + - 0.020105096389294166 + - 0.020105096389294166 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.42 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6644116299865631 + - 0.3807523958319064 + - 0.16552025251634706 + - 0.04136736637497404 + - 0.03368903063296431 + - 0.026290302792314472 + - 0.026290302792314472 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.45 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6659307382513374 + - 0.3825224018206819 + - 0.16730943337717838 + - 0.042684104690273554 + - 0.028214830172712736 + - 0.028687102078837345 + - 0.028687102078837345 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.42 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6573190310632421 + - 0.37140133573638007 + - 0.15269759054581342 + - 0.02360233733756248 + - 0.006270777590748142 + - 0.00619036162343997 + - 0.00619036162343997 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.42 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.666962250168703 + - 0.3833986672393447 + - 0.16829192624299436 + - 0.043417521013478975 + - 0.03761971859470502 + - 0.028010421125886305 + - 0.028010421125886305 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.18 + - 0.42 + - 0.45 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6623044135666328 + - 0.3779122879258284 + - 0.1607769423703764 + - 0.03212459943011884 + - 0.04205028763129942 + - 0.030516634167047096 + - 0.014803881457204153 + - 0.015425995652861282 + - 0.015425995652861282 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.18 + - 0.42 + - 0.45 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6676490261692498 + - 0.38579318100090004 + - 0.1729272174583384 + - 0.05166740420199694 + - 0.07322678148529703 + - 0.06690833890578575 + - 0.042106582245101346 + - 0.041451904522679474 + - 0.041451904522679474 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.42 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6647794659371873 + - 0.38050959760524694 + - 0.16370469791927902 + - 0.03720338009908303 + - 0.03052975655979165 + - 0.02131562266930231 + - 0.02131562266930231 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.15 + - 0.42 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.667590178769216 + - 0.3845621951962821 + - 0.17067225472622646 + - 0.05030522095522818 + - 0.05807402502358317 + - 0.03980913300775936 + - 0.03980913300775936 +solver_name: ADAM diff --git a/test/expected_results/MM11_ALOE.yaml b/test/expected_results/MM11_ALOE.yaml new file mode 100644 index 000000000..6d1a00aca --- /dev/null +++ b/test/expected_results/MM11_ALOE.yaml @@ -0,0 +1,597 @@ +all_est_objectives: +- - 2.780124829249758 + - 2.035952177385108 + - 1.592857746182603 + - 1.566912998677102 + - 1.52820742293875 + - 1.52820742293875 +- - 2.789035151306537 + - 2.050325411609458 + - 1.6160742436985371 + - 1.5635044328755934 + - 1.5513475758529471 + - 1.5513475758529471 +- - 2.7862478107466546 + - 2.047000231143581 + - 1.6170782897659357 + - 1.606151586183517 + - 1.5682976764169407 + - 1.561433323232891 + - 1.561433323232891 +- - 2.7881760005848144 + - 2.049815263790909 + - 1.6201449741395655 + - 1.568675748030519 + - 1.5606790355908446 + - 1.5606790355908446 +- - 2.77940256374346 + - 2.0385221946654397 + - 1.6009268695541974 + - 1.5599805882247384 + - 1.5386203845687287 + - 1.5386203845687287 +- - 2.789186580392257 + - 2.0518055444610774 + - 1.6215963404997191 + - 1.6039376041779427 + - 1.5661490661488384 + - 1.5636415129479904 + - 1.5636415129479904 +- - 2.7840784985550453 + - 2.042468931374539 + - 1.6065488836916555 + - 1.5918136856287677 + - 1.5564865669020582 + - 1.5564865669020582 +- - 2.7894024528762422 + - 2.050892533482739 + - 1.626255315051936 + - 1.6341350702053306 + - 1.598637923437767 + - 1.5744587256257643 + - 1.5744587256257643 +- - 2.7873753797816248 + - 2.046926151385223 + - 1.6134366158590898 + - 1.5970923068394582 + - 1.5630249177482174 + - 1.556611155324415 + - 1.55434563019834 + - 1.55434563019834 +- - 2.789809403279113 + - 2.0496482669772584 + - 1.62356321697659 + - 1.6451509375181501 + - 1.5945320358682213 + - 1.5748038426535356 + - 1.5748038426535356 +all_intermediate_budgets: +- - 0 + - 60 + - 90 + - 120 + - 240 + - 1000 +- - 0 + - 60 + - 90 + - 240 + - 480 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 240 + - 480 + - 1000 +- - 0 + - 60 + - 90 + - 240 + - 720 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 240 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 240 + - 960 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 240 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 240 + - 720 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 240 + - 480 + - 720 + - 1000 +- - 0 + - 60 + - 90 + - 120 + - 240 + - 480 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.068363045037878 + - !!python/tuple + - 3.1954320291559255 + - !!python/tuple + - 2.547897453307919 + - !!python/tuple + - 2.7223159323474233 + - !!python/tuple + - 2.7223159323474233 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.070245430133758 + - !!python/tuple + - 3.203625828952614 + - !!python/tuple + - 2.6816920968594635 + - !!python/tuple + - 2.8371370389618575 + - !!python/tuple + - 2.8371370389618575 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.06982905131844 + - !!python/tuple + - 3.2005773304543097 + - !!python/tuple + - 2.560031561771191 + - !!python/tuple + - 2.7043929379029112 + - !!python/tuple + - 2.899527251791048 + - !!python/tuple + - 2.899527251791048 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.070754629536532 + - !!python/tuple + - 3.2062270171567624 + - !!python/tuple + - 2.706137838724983 + - !!python/tuple + - 2.841088088250815 + - !!python/tuple + - 2.841088088250815 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.0740564892409665 + - !!python/tuple + - 3.2126838001722193 + - !!python/tuple + - 2.586211377512199 + - !!python/tuple + - 2.688745836222321 + - !!python/tuple + - 2.688745836222321 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.072039930037046 + - !!python/tuple + - 3.205974870923861 + - !!python/tuple + - 2.5717788385211624 + - !!python/tuple + - 2.736841697665817 + - !!python/tuple + - 2.764129255958059 + - !!python/tuple + - 2.764129255958059 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.067976139171115 + - !!python/tuple + - 3.195091275017534 + - !!python/tuple + - 2.541931358448408 + - !!python/tuple + - 2.6651435290553014 + - !!python/tuple + - 2.6651435290553014 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.066584889852278 + - !!python/tuple + - 3.1910395194526617 + - !!python/tuple + - 2.535314233392871 + - !!python/tuple + - 2.642684808417655 + - !!python/tuple + - 2.82147879603828 + - !!python/tuple + - 2.82147879603828 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.06990648820933 + - !!python/tuple + - 3.2017545501170552 + - !!python/tuple + - 2.565896832903402 + - !!python/tuple + - 2.6966927874536335 + - !!python/tuple + - 2.920604432561996 + - !!python/tuple + - 2.7790004170607694 + - !!python/tuple + - 2.7790004170607694 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.066667179797703 + - !!python/tuple + - 3.1922253533293192 + - !!python/tuple + - 2.5388575105295192 + - !!python/tuple + - 2.679986733110489 + - !!python/tuple + - 2.840555536981438 + - !!python/tuple + - 2.840555536981438 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.035952177385108 + - 1.592857746182603 + - 1.566912998677102 + - 1.52820742293875 + - 1.52820742293875 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 240.0 + - 480.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.050325411609458 + - 1.6160742436985371 + - 1.5635044328755934 + - 1.5513475758529471 + - 1.5513475758529471 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 480.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.047000231143581 + - 1.6170782897659357 + - 1.606151586183517 + - 1.5682976764169407 + - 1.561433323232891 + - 1.561433323232891 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 240.0 + - 720.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.049815263790909 + - 1.6201449741395655 + - 1.568675748030519 + - 1.5606790355908446 + - 1.5606790355908446 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0385221946654397 + - 1.6009268695541974 + - 1.5599805882247384 + - 1.5386203845687287 + - 1.5386203845687287 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0518055444610774 + - 1.6215963404997191 + - 1.6039376041779427 + - 1.5661490661488384 + - 1.5636415129479904 + - 1.5636415129479904 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.042468931374539 + - 1.6065488836916555 + - 1.5918136856287677 + - 1.5564865669020582 + - 1.5564865669020582 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 720.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.050892533482739 + - 1.626255315051936 + - 1.6341350702053306 + - 1.598637923437767 + - 1.5744587256257643 + - 1.5744587256257643 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 480.0 + - 720.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.046926151385223 + - 1.6134366158590898 + - 1.5970923068394582 + - 1.5630249177482174 + - 1.556611155324415 + - 1.55434563019834 + - 1.55434563019834 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 240.0 + - 480.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0496482669772584 + - 1.62356321697659 + - 1.6451509375181501 + - 1.5945320358682213 + - 1.5748038426535356 + - 1.5748038426535356 +problem_name: MM1-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4055736839241784 + - 0.05164104510245329 + - 0.030917036174458817 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.24 + - 0.48 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41705466034633976 + - 0.07018579685596199 + - 0.028194359914566765 + - 0.01848376961415028 + - 0.01848376961415028 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 0.48 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4143985901861881 + - 0.0709878034918128 + - 0.06225982868505923 + - 0.032023081775277594 + - 0.02654000984940928 + - 0.02654000984940928 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.24 + - 0.72 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41664716715551303 + - 0.0734373935032388 + - 0.03232507582989516 + - 0.025937503934686867 + - 0.025937503934686867 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 1.0 + - !!python/tuple + - 1.0 + - 0.40762654880757737 + - 0.058086457020937156 + - 0.025379601821827566 + - 0.008317610712564852 + - 0.008317610712564852 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41823695307919734 + - 0.0745967082893718 + - 0.06049135578547866 + - 0.0303068261682615 + - 0.028303856013675188 + - 0.028303856013675188 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41077910239394316 + - 0.06257717989859436 + - 0.05080707590562598 + - 0.0225886658502798 + - 0.0225886658502798 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 0.72 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41750766297288855 + - 0.07831817947327799 + - 0.08461232884261499 + - 0.05625810468324169 + - 0.03694437225160234 + - 0.03694437225160234 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 0.48 + - 0.72 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4143394171465096 + - 0.06807892636582355 + - 0.05502350518768615 + - 0.027811335343649615 + - 0.0226881839348825 + - 0.020878539692655056 + - 0.020878539692655056 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.09 + - 0.12 + - 0.24 + - 0.48 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41651377431920567 + - 0.07616779953465333 + - 0.09341152538488508 + - 0.05297842540979475 + - 0.037220043015529364 + - 0.037220043015529364 +solver_name: ALOE diff --git a/test/expected_results/MM11_ASTRODF.yaml b/test/expected_results/MM11_ASTRODF.yaml new file mode 100644 index 000000000..4766747a5 --- /dev/null +++ b/test/expected_results/MM11_ASTRODF.yaml @@ -0,0 +1,453 @@ +all_est_objectives: +- - 2.780124829249758 + - 2.034806875025934 + - 1.525562739201967 + - 1.5249926454660743 + - 1.5249926454660743 +- - 2.789035151306537 + - 2.0505910115567536 + - 1.6199369245683521 + - 1.6199369245683521 +- - 2.7862478107466546 + - 2.0421134032449793 + - 1.562275365764938 + - 1.574025227344856 + - 1.574025227344856 +- - 2.7881760005848144 + - 2.048149242549329 + - 1.56073304284217 + - 1.56073304284217 +- - 2.77940256374346 + - 2.035772549125488 + - 1.5539302645491306 + - 1.5539302645491306 +- - 2.789186580392257 + - 2.049705477931481 + - 1.5618265734469037 + - 1.5692572160319629 + - 1.5692572160319636 + - 1.5692572160319636 +- - 2.7840784985550453 + - 2.045464723037422 + - 1.60540472657332 + - 1.6054047265733216 + - 1.6054047265733216 +- - 2.7894024528762422 + - 2.0521462716603533 + - 1.6472481305527231 + - 1.6472481305527242 + - 1.6472481305527242 +- - 2.7873753797816248 + - 2.0457195427959194 + - 1.5652235047631016 + - 1.5652235047631016 +- - 2.789809403279113 + - 2.0480483663925177 + - 1.574605763706296 + - 1.5753177627529744 + - 1.5753177627529744 + - 1.5753177627529744 +all_intermediate_budgets: +- - 5 + - 10 + - 37 + - 73 + - 1000 +- - 5 + - 10 + - 37 + - 1000 +- - 5 + - 10 + - 37 + - 67 + - 1000 +- - 5 + - 10 + - 37 + - 1000 +- - 5 + - 10 + - 37 + - 1000 +- - 5 + - 10 + - 37 + - 61 + - 432 + - 1000 +- - 5 + - 10 + - 37 + - 441 + - 1000 +- - 5 + - 10 + - 37 + - 441 + - 1000 +- - 5 + - 10 + - 37 + - 1000 +- - 5 + - 10 + - 37 + - 73 + - 441 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.066647913188763 + - !!python/tuple + - 2.8271313796167554 + - !!python/tuple + - 2.78839648794263 + - !!python/tuple + - 2.78839648794263 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.070646716667843 + - !!python/tuple + - 2.5081467166678433 + - !!python/tuple + - 2.5081467166678433 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.062414420910377 + - !!python/tuple + - 2.7543269307907234 + - !!python/tuple + - 2.672571462658245 + - !!python/tuple + - 2.672571462658245 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.068232144545219 + - !!python/tuple + - 2.8115120500554696 + - !!python/tuple + - 2.8115120500554696 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.069936763976676 + - !!python/tuple + - 2.608587209340911 + - !!python/tuple + - 2.608587209340911 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.068862521402341 + - !!python/tuple + - 2.8628132321539663 + - !!python/tuple + - 2.7120570709979193 + - !!python/tuple + - 2.712057070997915 + - !!python/tuple + - 2.712057070997915 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.072486467334651 + - !!python/tuple + - 2.5099864673346506 + - !!python/tuple + - 2.5099864673346493 + - !!python/tuple + - 2.5099864673346493 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.06849967289261 + - !!python/tuple + - 2.50599967289261 + - !!python/tuple + - 2.505999672892609 + - !!python/tuple + - 2.505999672892609 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.068086743695246 + - !!python/tuple + - 2.6834542096862353 + - !!python/tuple + - 2.6834542096862353 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.064236014488024 + - !!python/tuple + - 2.8605960781257047 + - !!python/tuple + - 2.822982330114382 + - !!python/tuple + - 2.82298233011438 + - !!python/tuple + - 2.82298233011438 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 73.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.034806875025934 + - 1.525562739201967 + - 1.5249926454660743 + - 1.5249926454660743 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0505910115567536 + - 1.6199369245683521 + - 1.6199369245683521 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 67.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0421134032449793 + - 1.562275365764938 + - 1.574025227344856 + - 1.574025227344856 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.048149242549329 + - 1.56073304284217 + - 1.56073304284217 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.035772549125488 + - 1.5539302645491306 + - 1.5539302645491306 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 61.0 + - 432.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.049705477931481 + - 1.5618265734469037 + - 1.5692572160319629 + - 1.5692572160319636 + - 1.5692572160319636 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 441.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.045464723037422 + - 1.60540472657332 + - 1.6054047265733216 + - 1.6054047265733216 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 441.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0521462716603533 + - 1.6472481305527231 + - 1.6472481305527242 + - 1.6472481305527242 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0457195427959194 + - 1.5652235047631016 + - 1.5652235047631016 +- !!python/tuple + - !!python/tuple + - 5.0 + - 10.0 + - 37.0 + - 73.0 + - 441.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.0480483663925177 + - 1.574605763706296 + - 1.5753177627529744 + - 1.5753177627529744 + - 1.5753177627529744 +problem_name: MM1-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 0.073 + - 1.0 + - !!python/tuple + - 1.0 + - 0.40618369614504596 + - 0.0004542101168772499 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41875937282257103 + - 0.07564484468565032 + - 0.07564484468565032 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 0.067 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41200501784601545 + - 0.029704218233391432 + - 0.03906567173743378 + - 0.03906567173743378 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41681394505092095 + - 0.028475405091082727 + - 0.028475405091082727 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 1.0 + - !!python/tuple + - 1.0 + - 0.40695307654340585 + - 0.023055435480764972 + - 0.023055435480764972 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 0.061 + - 0.432 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41805384265075823 + - 0.029346652453601303 + - 0.035266859648559065 + - 0.03526685964855959 + - 0.03526685964855959 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 0.441 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41467511095313336 + - 0.06406662353668431 + - 0.06406662353668556 + - 0.06406662353668556 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 0.441 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4199984933898656 + - 0.09740446995638431 + - 0.09740446995638519 + - 0.09740446995638519 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 1.0 + - !!python/tuple + - 1.0 + - 0.41487813320193695 + - 0.03205308557681037 + - 0.03205308557681037 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.01 + - 0.037 + - 0.073 + - 0.441 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4167335741082309 + - 0.03952820179517629 + - 0.04009547196470698 + - 0.04009547196470698 + - 0.04009547196470698 +solver_name: ASTRODF diff --git a/test/expected_results/MM11_NELDMD.yaml b/test/expected_results/MM11_NELDMD.yaml new file mode 100644 index 000000000..a7fc3e6cd --- /dev/null +++ b/test/expected_results/MM11_NELDMD.yaml @@ -0,0 +1,837 @@ +all_est_objectives: +- - 2.780124829249758 + - 1.6683056866596468 + - 1.5496492049629453 + - 1.5452079161867536 + - 1.5250349821216245 + - 1.525622279450619 + - 1.5252586847845537 + - 1.525414963266624 + - 1.5254033544186683 + - 1.5254090962422737 + - 1.5254090962422737 +- - 2.789035151306537 + - 1.561673944750553 + - 1.5514290426483672 + - 1.552461013569492 + - 1.5518158441296028 + - 1.5517526116560172 + - 1.551783846682045 + - 1.5517681352627728 + - 1.5517700907323322 + - 1.5517700907323322 +- - 2.7862478107466546 + - 1.6144334205541704 + - 1.5592020173515204 + - 1.5591999725236543 + - 1.559008920642735 + - 1.5590475273945048 + - 1.5590267731742895 + - 1.5590365684333594 + - 1.5590315548831564 + - 1.5590315548831564 +- - 2.7881760005848144 + - 1.579870619828843 + - 1.5662693257795268 + - 1.561309817782972 + - 1.563162577680771 + - 1.5625793357465865 + - 1.5628610777851808 + - 1.5627884547021904 + - 1.5627884547021904 +- - 2.77940256374346 + - 1.5382852472903161 + - 1.5459176007779607 + - 1.5318238461768876 + - 1.5336426699299093 + - 1.5333475251362936 + - 1.5333118810184296 + - 1.533329670412443 + - 1.533329670412443 +- - 2.789186580392257 + - 1.5819468122108233 + - 1.5613458531779025 + - 1.5613743864756326 + - 1.5613420209362925 + - 1.561338529608415 + - 1.5613402640669054 + - 1.5613402640669054 +- - 2.7840784985550453 + - 1.579274907719421 + - 1.5440492724774233 + - 1.5514153393285162 + - 1.5455253789693542 + - 1.5465761710040804 + - 1.5468774837473296 + - 1.5467253658991973 + - 1.546763072641365 + - 1.5467441946406921 + - 1.5467536289031614 + - 1.5467489105128482 + - 1.5467489105128482 +- - 2.7894024528762422 + - 1.6146983829893813 + - 1.574961439086795 + - 1.580807881068225 + - 1.5769389137206653 + - 1.5786447180545737 + - 1.5784079713332384 + - 1.5784079713332384 +- - 2.7873753797816248 + - 1.5550090726829153 + - 1.552903327969908 + - 1.5528935545748355 + - 1.5528885539458732 + - 1.5528894822747321 + - 1.5528894822747321 +- - 2.789809403279113 + - 1.6071636040170318 + - 1.600053373109708 + - 1.5751806098350274 + - 1.5785598520921098 + - 1.574969732859681 + - 1.576220799621273 + - 1.5754752904883853 + - 1.575815330141899 + - 1.5756390663047677 + - 1.5756390663047677 +all_intermediate_budgets: +- - 0 + - 120 + - 240 + - 300 + - 360 + - 540 + - 600 + - 660 + - 900 + - 960 + - 1000 +- - 0 + - 120 + - 300 + - 420 + - 480 + - 660 + - 720 + - 780 + - 960 + - 1000 +- - 0 + - 180 + - 360 + - 540 + - 600 + - 660 + - 780 + - 840 + - 900 + - 1000 +- - 0 + - 180 + - 360 + - 480 + - 540 + - 660 + - 720 + - 840 + - 1000 +- - 0 + - 180 + - 360 + - 420 + - 540 + - 720 + - 900 + - 960 + - 1000 +- - 0 + - 180 + - 300 + - 480 + - 660 + - 840 + - 900 + - 1000 +- - 0 + - 180 + - 240 + - 300 + - 360 + - 480 + - 600 + - 660 + - 780 + - 840 + - 900 + - 960 + - 1000 +- - 0 + - 180 + - 360 + - 420 + - 540 + - 600 + - 780 + - 1000 +- - 0 + - 180 + - 480 + - 660 + - 780 + - 900 + - 1000 +- - 0 + - 180 + - 300 + - 360 + - 420 + - 480 + - 540 + - 600 + - 660 + - 720 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.402793206539716 + - !!python/tuple + - 2.604189809809574 + - !!python/tuple + - 3.003491508174645 + - !!python/tuple + - 2.8038406589921094 + - !!python/tuple + - 2.8287970151399264 + - !!python/tuple + - 2.816318837066018 + - !!python/tuple + - 2.8225579261029723 + - !!python/tuple + - 2.8221679830381623 + - !!python/tuple + - 2.8223629545705675 + - !!python/tuple + - 2.8223629545705675 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.970106601179852 + - !!python/tuple + - 2.8432382637535927 + - !!python/tuple + - 2.8749553481101575 + - !!python/tuple + - 2.859096805931875 + - !!python/tuple + - 2.85711448815959 + - !!python/tuple + - 2.8581056470457327 + - !!python/tuple + - 2.8576100676026615 + - !!python/tuple + - 2.8576720150330455 + - !!python/tuple + - 2.8576720150330455 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.5398676148660257 + - !!python/tuple + - 2.8473841630077725 + - !!python/tuple + - 2.808944594490054 + - !!python/tuple + - 2.8281643787489132 + - !!python/tuple + - 2.8185544866194836 + - !!python/tuple + - 2.8209569596518413 + - !!python/tuple + - 2.8197557231356623 + - !!python/tuple + - 2.820356341393752 + - !!python/tuple + - 2.820356341393752 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.6455592511292894 + - !!python/tuple + - 2.9398643447381283 + - !!python/tuple + - 2.8662880713359185 + - !!python/tuple + - 2.9030762080370236 + - !!python/tuple + - 2.8938791738617473 + - !!python/tuple + - 2.8984776909493855 + - !!python/tuple + - 2.897328061677476 + - !!python/tuple + - 2.897328061677476 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.691382899199186 + - !!python/tuple + - 2.979960036799288 + - !!python/tuple + - 2.835671467999237 + - !!python/tuple + - 2.8717436101992497 + - !!python/tuple + - 2.867234592424248 + - !!python/tuple + - 2.866670965202373 + - !!python/tuple + - 2.8669527788133107 + - !!python/tuple + - 2.8669527788133107 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.6451804034362896 + - !!python/tuple + - 2.8414153698165987 + - !!python/tuple + - 2.8168859990190604 + - !!python/tuple + - 2.8199521703687527 + - !!python/tuple + - 2.8203354417874644 + - !!python/tuple + - 2.8201438060781086 + - !!python/tuple + - 2.8201438060781086 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.5766612978753325 + - !!python/tuple + - 2.818995168087799 + - !!python/tuple + - 2.697828232981566 + - !!python/tuple + - 2.7584117005346824 + - !!python/tuple + - 2.7432658336464035 + - !!python/tuple + - 2.739479366924334 + - !!python/tuple + - 2.7413726002853687 + - !!python/tuple + - 2.7408992919451096 + - !!python/tuple + - 2.7411359461152394 + - !!python/tuple + - 2.7410176190301745 + - !!python/tuple + - 2.7410767825727067 + - !!python/tuple + - 2.7410767825727067 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.587000339321399 + - !!python/tuple + - 2.8886252969062243 + - !!python/tuple + - 2.7378128181138117 + - !!python/tuple + - 2.7755159378119147 + - !!python/tuple + - 2.7566643779628635 + - !!python/tuple + - 2.7590208229439948 + - !!python/tuple + - 2.7590208229439948 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.768364681234213 + - !!python/tuple + - 2.838103284945644 + - !!python/tuple + - 2.829385959481715 + - !!python/tuple + - 2.831565290847697 + - !!python/tuple + - 2.8310204580062015 + - !!python/tuple + - 2.8310204580062015 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.126465518801294 + - !!python/tuple + - 2.6580818985016177 + - !!python/tuple + - 2.892273708651456 + - !!python/tuple + - 2.775177803576537 + - !!python/tuple + - 2.8337257561139966 + - !!python/tuple + - 2.804451779845267 + - !!python/tuple + - 2.8190887679796317 + - !!python/tuple + - 2.8117702739124493 + - !!python/tuple + - 2.8154295209460405 + - !!python/tuple + - 2.8154295209460405 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 240.0 + - 300.0 + - 360.0 + - 540.0 + - 600.0 + - 660.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.6683056866596468 + - 1.5496492049629453 + - 1.5452079161867536 + - 1.5250349821216245 + - 1.525622279450619 + - 1.5252586847845537 + - 1.525414963266624 + - 1.5254033544186683 + - 1.5254090962422737 + - 1.5254090962422737 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 300.0 + - 420.0 + - 480.0 + - 660.0 + - 720.0 + - 780.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.561673944750553 + - 1.5514290426483672 + - 1.552461013569492 + - 1.5518158441296028 + - 1.5517526116560172 + - 1.551783846682045 + - 1.5517681352627728 + - 1.5517700907323322 + - 1.5517700907323322 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 360.0 + - 540.0 + - 600.0 + - 660.0 + - 780.0 + - 840.0 + - 900.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.6144334205541704 + - 1.5592020173515204 + - 1.5591999725236543 + - 1.559008920642735 + - 1.5590475273945048 + - 1.5590267731742895 + - 1.5590365684333594 + - 1.5590315548831564 + - 1.5590315548831564 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 360.0 + - 480.0 + - 540.0 + - 660.0 + - 720.0 + - 840.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.579870619828843 + - 1.5662693257795268 + - 1.561309817782972 + - 1.563162577680771 + - 1.5625793357465865 + - 1.5628610777851808 + - 1.5627884547021904 + - 1.5627884547021904 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 360.0 + - 420.0 + - 540.0 + - 720.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5382852472903161 + - 1.5459176007779607 + - 1.5318238461768876 + - 1.5336426699299093 + - 1.5333475251362936 + - 1.5333118810184296 + - 1.533329670412443 + - 1.533329670412443 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 300.0 + - 480.0 + - 660.0 + - 840.0 + - 900.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5819468122108233 + - 1.5613458531779025 + - 1.5613743864756326 + - 1.5613420209362925 + - 1.561338529608415 + - 1.5613402640669054 + - 1.5613402640669054 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 240.0 + - 300.0 + - 360.0 + - 480.0 + - 600.0 + - 660.0 + - 780.0 + - 840.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.579274907719421 + - 1.5440492724774233 + - 1.5514153393285162 + - 1.5455253789693542 + - 1.5465761710040804 + - 1.5468774837473296 + - 1.5467253658991973 + - 1.546763072641365 + - 1.5467441946406921 + - 1.5467536289031614 + - 1.5467489105128482 + - 1.5467489105128482 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 360.0 + - 420.0 + - 540.0 + - 600.0 + - 780.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.6146983829893813 + - 1.574961439086795 + - 1.580807881068225 + - 1.5769389137206653 + - 1.5786447180545737 + - 1.5784079713332384 + - 1.5784079713332384 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 480.0 + - 660.0 + - 780.0 + - 900.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5550090726829153 + - 1.552903327969908 + - 1.5528935545748355 + - 1.5528885539458732 + - 1.5528894822747321 + - 1.5528894822747321 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 300.0 + - 360.0 + - 420.0 + - 480.0 + - 540.0 + - 600.0 + - 660.0 + - 720.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.6071636040170318 + - 1.600053373109708 + - 1.5751806098350274 + - 1.5785598520921098 + - 1.574969732859681 + - 1.576220799621273 + - 1.5754752904883853 + - 1.575815330141899 + - 1.5756390663047677 + - 1.5756390663047677 +problem_name: MM1-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.24 + - 0.3 + - 0.36 + - 0.54 + - 0.6 + - 0.66 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.11415175165813903 + - 0.01961152255166635 + - 0.016072900367482316 + - 0.0 + - 0.0004679324992854249 + - 0.0001782363736278565 + - 0.00030275214628583034 + - 0.0002935027304114401 + - 0.0002980775611445573 + - 0.0002980775611445573 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.3 + - 0.42 + - 0.48 + - 0.66 + - 0.72 + - 0.78 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.02919230261703169 + - 0.021029618387191175 + - 0.021851847109291164 + - 0.021337804675304866 + - 0.021287423841032063 + - 0.02131231052631546 + - 0.021299792363326405 + - 0.021301350394860055 + - 0.021301350394860055 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.36 + - 0.54 + - 0.6 + - 0.66 + - 0.78 + - 0.84 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 0.07122871612506887 + - 0.027222780351602825 + - 0.027221151123328194 + - 0.027068929446643988 + - 0.027099689596491457 + - 0.027083153553065727 + - 0.027090957981642908 + - 0.027086963406900342 + - 0.027086963406900342 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.36 + - 0.48 + - 0.54 + - 0.66 + - 0.72 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.04369060735587348 + - 0.032853698683208844 + - 0.028902182377102962 + - 0.03037837940159353 + - 0.02991367806127194 + - 0.030138157638761154 + - 0.030080294782841667 + - 0.030080294782841667 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.36 + - 0.42 + - 0.54 + - 0.72 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.010557224408284868 + - 0.016638345616546365 + - 0.005409066188207361 + - 0.006858224395632478 + - 0.006623066096574414 + - 0.0065946664422026555 + - 0.006608840243428223 + - 0.006608840243428223 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.3 + - 0.48 + - 0.66 + - 0.84 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 0.045344825487532346 + - 0.028930893783710963 + - 0.028953627851551127 + - 0.028927840423332966 + - 0.028925058687917404 + - 0.028926440627620252 + - 0.028926440627620252 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.24 + - 0.3 + - 0.36 + - 0.48 + - 0.6 + - 0.66 + - 0.78 + - 0.84 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.043215970332249165 + - 0.015149744378306355 + - 0.02101870018887858 + - 0.016325840651659578 + - 0.01716306520345612 + - 0.01740313785159254 + - 0.01728193708777442 + - 0.017311980149834098 + - 0.017296938995038605 + - 0.017304455797513607 + - 0.017300696393098117 + - 0.017300696393098117 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.36 + - 0.42 + - 0.54 + - 0.6 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.07143982645778106 + - 0.03977918957707373 + - 0.0444373755984232 + - 0.04135475377942556 + - 0.042713863119535046 + - 0.04252523381791409 + - 0.04252523381791409 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.48 + - 0.66 + - 0.78 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 0.023882027752735673 + - 0.022204263632640525 + - 0.02219647662432798 + - 0.02219249234465773 + - 0.02219323199597514 + - 0.02219323199597514 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.3 + - 0.36 + - 0.42 + - 0.48 + - 0.54 + - 0.6 + - 0.66 + - 0.72 + - 1.0 + - !!python/tuple + - 1.0 + - 0.06543644830155555 + - 0.05977133123954335 + - 0.039953815121797805 + - 0.04264624567951024 + - 0.03978579768796316 + - 0.04078259227159762 + - 0.04018860361445608 + - 0.040459532149406514 + - 0.04031909293102344 + - 0.04031909293102344 +solver_name: NELDMD diff --git a/test/expected_results/MM11_RNDSRCH.yaml b/test/expected_results/MM11_RNDSRCH.yaml new file mode 100644 index 000000000..66ee12ecf --- /dev/null +++ b/test/expected_results/MM11_RNDSRCH.yaml @@ -0,0 +1,541 @@ +all_est_objectives: +- - 2.780124829249758 + - 2.196460893102585 + - 1.655787132316997 + - 1.5361115618655143 + - 1.52808683854167 + - 1.5252306418027917 + - 1.5252306418027917 +- - 2.789035151306537 + - 1.9951293825583039 + - 1.5939016302197992 + - 1.5639859332728037 + - 1.5532920105495318 + - 1.5532920105495318 +- - 2.7862478107466546 + - 1.9089553675651008 + - 1.5889219928597031 + - 1.5804144038970156 + - 1.5690752917282367 + - 1.5595989289396175 + - 1.5595989289396175 +- - 2.7881760005848144 + - 1.868446105064759 + - 1.581582348076511 + - 1.569510297674972 + - 1.568518640275931 + - 1.568518640275931 +- - 2.77940256374346 + - 2.6081206125056284 + - 1.5332297684291223 + - 1.5332297684291223 +- - 2.789186580392257 + - 1.7014679541440914 + - 1.7397677922700994 + - 1.5707760565039974 + - 1.5650785466226378 + - 1.5650785466226378 +- - 2.7840784985550453 + - 1.57210759125869 + - 1.5660516591137232 + - 1.5455542903669686 + - 1.5444762166653039 + - 1.5444762166653039 +- - 2.7894024528762422 + - 1.7186604460215469 + - 1.5839870373192968 + - 1.5750988106954111 + - 1.5788266138908664 + - 1.5788266138908664 +- - 2.7873753797816248 + - 1.577014511503288 + - 1.5534596523718895 + - 1.5534596523718895 +- - 2.789809403279113 + - 2.4245746936975716 + - 1.6868352025745261 + - 1.597098283752918 + - 1.5747560839659127 + - 1.5749795500903272 + - 1.5749795500903272 +all_intermediate_budgets: +- - 0 + - 60 + - 130 + - 230 + - 620 + - 800 + - 1000 +- - 0 + - 20 + - 240 + - 370 + - 990 + - 1000 +- - 0 + - 80 + - 200 + - 370 + - 420 + - 690 + - 1000 +- - 0 + - 40 + - 60 + - 120 + - 130 + - 1000 +- - 0 + - 40 + - 70 + - 1000 +- - 0 + - 20 + - 50 + - 150 + - 370 + - 1000 +- - 0 + - 20 + - 200 + - 230 + - 420 + - 1000 +- - 0 + - 80 + - 170 + - 320 + - 410 + - 1000 +- - 0 + - 120 + - 340 + - 1000 +- - 0 + - 40 + - 100 + - 240 + - 540 + - 890 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.296923990261382 + - !!python/tuple + - 2.377685478570012 + - !!python/tuple + - 2.9477762989744125 + - !!python/tuple + - 2.8725872351049087 + - !!python/tuple + - 2.77219439380347 + - !!python/tuple + - 2.77219439380347 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.985053300589926 + - !!python/tuple + - 2.5692082889849917 + - !!python/tuple + - 2.6789668737056265 + - !!python/tuple + - 2.7655068232601354 + - !!python/tuple + - 2.7655068232601354 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.8484877158342767 + - !!python/tuple + - 3.0893992471426497 + - !!python/tuple + - 3.0474371736837815 + - !!python/tuple + - 2.6995692418538133 + - !!python/tuple + - 2.8627075639581703 + - !!python/tuple + - 2.8627075639581703 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.773796218317722 + - !!python/tuple + - 2.638230326582391 + - !!python/tuple + - 2.9681054377092035 + - !!python/tuple + - 2.960071657577079 + - !!python/tuple + - 2.960071657577079 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 1.9121296882013306 + - !!python/tuple + - 2.865358591560582 + - !!python/tuple + - 2.865358591560582 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.4301202689575265 + - !!python/tuple + - 2.3471789635658644 + - !!python/tuple + - 2.971703077078345 + - !!python/tuple + - 2.747361422254152 + - !!python/tuple + - 2.747361422254152 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.061329038300266 + - !!python/tuple + - 2.6213500819625137 + - !!python/tuple + - 2.75793594287965 + - !!python/tuple + - 2.781142773961063 + - !!python/tuple + - 2.781142773961063 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.455741882800734 + - !!python/tuple + - 2.9876013780902837 + - !!python/tuple + - 2.891632856275529 + - !!python/tuple + - 2.754896253073897 + - !!python/tuple + - 2.754896253073897 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0560414166146552 + - !!python/tuple + - 2.798595332742973 + - !!python/tuple + - 2.798595332742973 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 2.0277986812387483 + - !!python/tuple + - 2.46722995472664 + - !!python/tuple + - 3.078337396380813 + - !!python/tuple + - 2.8431466204775697 + - !!python/tuple + - 2.833368087907807 + - !!python/tuple + - 2.833368087907807 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 130.0 + - 230.0 + - 620.0 + - 800.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.196460893102585 + - 1.655787132316997 + - 1.5361115618655143 + - 1.52808683854167 + - 1.5252306418027917 + - 1.5252306418027917 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 240.0 + - 370.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.9951293825583039 + - 1.5939016302197992 + - 1.5639859332728037 + - 1.5532920105495318 + - 1.5532920105495318 +- !!python/tuple + - !!python/tuple + - 0.0 + - 80.0 + - 200.0 + - 370.0 + - 420.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.9089553675651008 + - 1.5889219928597031 + - 1.5804144038970156 + - 1.5690752917282367 + - 1.5595989289396175 + - 1.5595989289396175 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 60.0 + - 120.0 + - 130.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.868446105064759 + - 1.581582348076511 + - 1.569510297674972 + - 1.568518640275931 + - 1.568518640275931 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 70.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.6081206125056284 + - 1.5332297684291223 + - 1.5332297684291223 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 150.0 + - 370.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.7014679541440914 + - 1.7397677922700994 + - 1.5707760565039974 + - 1.5650785466226378 + - 1.5650785466226378 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 200.0 + - 230.0 + - 420.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.57210759125869 + - 1.5660516591137232 + - 1.5455542903669686 + - 1.5444762166653039 + - 1.5444762166653039 +- !!python/tuple + - !!python/tuple + - 0.0 + - 80.0 + - 170.0 + - 320.0 + - 410.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.7186604460215469 + - 1.5839870373192968 + - 1.5750988106954111 + - 1.5788266138908664 + - 1.5788266138908664 +- !!python/tuple + - !!python/tuple + - 0.0 + - 120.0 + - 340.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.577014511503288 + - 1.5534596523718895 + - 1.5534596523718895 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 100.0 + - 240.0 + - 540.0 + - 890.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.4245746936975716 + - 1.6868352025745261 + - 1.597098283752918 + - 1.5747560839659127 + - 1.5749795500903272 + - 1.5749795500903272 +problem_name: MM1-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.13 + - 0.23 + - 0.62 + - 0.8 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5348899198149807 + - 0.10403784782828383 + - 0.00867078688511538 + - 0.002276045874982568 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.24 + - 0.37 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.37445287854229603 + - 0.054722532866867485 + - 0.030883314193093953 + - 0.022361541735905172 + - 0.022361541735905172 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.08 + - 0.2 + - 0.37 + - 0.42 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.30578253497450825 + - 0.050754359765175956 + - 0.04397483281558038 + - 0.034938921834234686 + - 0.02738739846006202 + - 0.02738739846006202 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.06 + - 0.12 + - 0.13 + - 1.0 + - !!python/tuple + - 1.0 + - 0.273501516458711 + - 0.04490554409879345 + - 0.035285569345305155 + - 0.03449533746044924 + - 0.03449533746044924 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.07 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8629332907389862 + - 0.006374343515451717 + - 0.006374343515451717 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.05 + - 0.15 + - 0.37 + - 1.0 + - !!python/tuple + - 1.0 + - 0.14043997821031245 + - 0.1709603507717055 + - 0.0362942271601928 + - 0.031753995849574494 + - 0.031753995849574494 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.2 + - 0.23 + - 0.42 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0373553004905279 + - 0.03252944966936244 + - 0.016195507770678717 + - 0.015336412468103461 + - 0.015336412468103461 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.08 + - 0.17 + - 0.32 + - 0.41 + - 1.0 + - !!python/tuple + - 1.0 + - 0.15414033004032052 + - 0.04682179270910701 + - 0.03973894324434981 + - 0.04270955481681981 + - 0.04270955481681981 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.12 + - 0.34 + - 1.0 + - !!python/tuple + - 1.0 + - 0.041265526781862544 + - 0.02249513214060598 + - 0.02249513214060598 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.04 + - 0.1 + - 0.24 + - 0.54 + - 0.89 + - 1.0 + - !!python/tuple + - 1.0 + - 0.716669230673911 + - 0.12877943207348239 + - 0.05726988193031496 + - 0.0394658311900214 + - 0.03964390686098225 + - 0.03964390686098225 +solver_name: RNDSRCH diff --git a/test/expected_results/MM11_SPSA.yaml b/test/expected_results/MM11_SPSA.yaml new file mode 100644 index 000000000..7823ff6fe --- /dev/null +++ b/test/expected_results/MM11_SPSA.yaml @@ -0,0 +1,1349 @@ +all_est_objectives: +- - 2.780124829249758 + - 2.6893551138342264 + - 2.6257317225670054 + - 2.576067221538355 + - 2.5350946867274846 + - 2.500118232668328 + - 2.4695277450866824 + - 2.44231526621196 + - 2.417786478457059 + - 2.3954512886928754 + - 2.3749384803161497 + - 2.355974043875788 + - 2.3383351981520986 + - 2.3218478008517467 + - 2.3063688616357227 + - 2.3063688616357227 +- - 2.789035151306537 + - 2.698602375009207 + - 2.635260454269838 + - 2.585841590528148 + - 2.545107808634954 + - 2.5103527824475167 + - 2.479979638398922 + - 2.4529797693132105 + - 2.428657700324564 + - 2.4065190173202713 + - 2.386193828775252 + - 2.367414706908724 + - 2.349962835823599 + - 2.333660825871027 + - 2.3183624159715324 + - 2.3183624159715324 +- - 2.7862478107466546 + - 2.695726447273908 + - 2.632316299991869 + - 2.582833952440025 + - 2.542042839736181 + - 2.50721938725384 + - 2.4767744007042687 + - 2.4497204079248234 + - 2.425372033106726 + - 2.403205203830921 + - 2.3828574732359105 + - 2.3640456113067616 + - 2.346556852281289 + - 2.33022178385454 + - 2.3149023762161005 + - 2.3149023762161005 +- - 2.7881760005848144 + - 2.69761352449041 + - 2.634245563320202 + - 2.5848473714702744 + - 2.5441445259338336 + - 2.5094169182363713 + - 2.4790880895128082 + - 2.452128144196195 + - 2.4278422208751125 + - 2.405737496018033 + - 2.3854503517294976 + - 2.366708342444746 + - 2.34928425954856 + - 2.3330055481105108 + - 2.3177295691308033 + - 2.3177295691308033 +- - 2.77940256374346 + - 2.6885602551680954 + - 2.624895734274738 + - 2.575246289996016 + - 2.534323197809421 + - 2.4993971094734384 + - 2.4688598713337506 + - 2.4417015815213814 + - 2.4172287215729593 + - 2.3949566562280804 + - 2.3745143523966554 + - 2.355614765054877 + - 2.3380344787131704 + - 2.321612646675303 + - 2.3062041734249403 + - 2.3062041734249403 +- - 2.789186580392257 + - 2.69872839078544 + - 2.6353478144599247 + - 2.585911794470485 + - 2.545137157764509 + - 2.5103194712926706 + - 2.4798806907626223 + - 2.4528174647841468 + - 2.428449588900828 + - 2.4062837954613556 + - 2.38593949634555 + - 2.3671290861781547 + - 2.3496340702989933 + - 2.3332783248904185 + - 2.3179280456169598 + - 2.3179280456169598 +- - 2.7840784985550453 + - 2.693483139515207 + - 2.6299924722853016 + - 2.5804321647694564 + - 2.539560564218672 + - 2.5046625625512844 + - 2.474159315791943 + - 2.4470404377242776 + - 2.422604102858047 + - 2.4003543764144073 + - 2.3799272307242676 + - 2.3610528320760276 + - 2.3435042143325218 + - 2.3270979684962527 + - 2.3116902366692744 + - 2.3116902366692744 +- - 2.7894024528762422 + - 2.6989732313654495 + - 2.6355904042017766 + - 2.5861609109477017 + - 2.5453847549562134 + - 2.510576711134216 + - 2.4801587722887715 + - 2.4531042333907265 + - 2.428733476601435 + - 2.4065532483576972 + - 2.386189741085131 + - 2.3673710473425045 + - 2.349882128494207 + - 2.3335443993177587 + - 2.3182074661114944 + - 2.3182074661114944 +- - 2.7873753797816248 + - 2.696739105506379 + - 2.6332829812261918 + - 2.5837853391428136 + - 2.5429699446833505 + - 2.508125065376736 + - 2.4776849794557214 + - 2.4506321465152903 + - 2.426261826986175 + - 2.404084297421792 + - 2.3837360546370494 + - 2.364923645616419 + - 2.3474304464137767 + - 2.3310822630373997 + - 2.3157347860686723 + - 2.3157347860686723 +- - 2.789809403279113 + - 2.6993382275745255 + - 2.635978464435007 + - 2.5865514847370155 + - 2.5457588403958513 + - 2.510914649024044 + - 2.4804643633997516 + - 2.4533900324261664 + - 2.429023622604677 + - 2.406858055069522 + - 2.386510065793446 + - 2.36770157910432 + - 2.3502150302384344 + - 2.3338695863360535 + - 2.3185329122227234 + - 2.3185329122227234 +all_intermediate_budgets: +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 630 + - 690 + - 750 + - 810 + - 870 + - 930 + - 990 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828220242877965 + - !!python/tuple + - 4.77115832083815 + - !!python/tuple + - 4.72335624727182 + - !!python/tuple + - 4.681991245539889 + - !!python/tuple + - 4.645378954588567 + - !!python/tuple + - 4.612444103015849 + - !!python/tuple + - 4.582458610463398 + - !!python/tuple + - 4.554898657638181 + - !!python/tuple + - 4.5293647642366315 + - !!python/tuple + - 4.505556753022126 + - !!python/tuple + - 4.4832379952675225 + - !!python/tuple + - 4.462218240075169 + - !!python/tuple + - 4.44234161983448 + - !!python/tuple + - 4.44234161983448 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828268158857999 + - !!python/tuple + - 4.77125483623946 + - !!python/tuple + - 4.723516406221872 + - !!python/tuple + - 4.682219351774142 + - !!python/tuple + - 4.645691726023227 + - !!python/tuple + - 4.612860645066557 + - !!python/tuple + - 4.582980956756656 + - !!python/tuple + - 4.55552124554624 + - !!python/tuple + - 4.530091984205565 + - !!python/tuple + - 4.506399094048837 + - !!python/tuple + - 4.484204055878757 + - !!python/tuple + - 4.463313252399073 + - !!python/tuple + - 4.4435677552669315 + - !!python/tuple + - 4.4435677552669315 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.82823275038073 + - !!python/tuple + - 4.771172505640116 + - !!python/tuple + - 4.723397826999343 + - !!python/tuple + - 4.682055296320445 + - !!python/tuple + - 4.645470553365277 + - !!python/tuple + - 4.612599470427851 + - !!python/tuple + - 4.582700704662213 + - !!python/tuple + - 4.555214194443703 + - !!python/tuple + - 4.529748789482905 + - !!python/tuple + - 4.506008016885366 + - !!python/tuple + - 4.483762945089934 + - !!python/tuple + - 4.462827836579086 + - !!python/tuple + - 4.443047831595066 + - !!python/tuple + - 4.443047831595066 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828297566124756 + - !!python/tuple + - 4.77133985569511 + - !!python/tuple + - 4.723662803100284 + - !!python/tuple + - 4.682430559303072 + - !!python/tuple + - 4.64598210005234 + - !!python/tuple + - 4.613221916775125 + - !!python/tuple + - 4.583404666246024 + - !!python/tuple + - 4.55600793339497 + - !!python/tuple + - 4.530632771098147 + - !!python/tuple + - 4.506973585550731 + - !!python/tuple + - 4.484800768623449 + - !!python/tuple + - 4.4639247852540915 + - !!python/tuple + - 4.444193643993287 + - !!python/tuple + - 4.444193643993287 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828242201209381 + - !!python/tuple + - 4.771246332527541 + - !!python/tuple + - 4.723544599544323 + - !!python/tuple + - 4.682284832130809 + - !!python/tuple + - 4.645777394471526 + - !!python/tuple + - 4.612955155466781 + - !!python/tuple + - 4.583085669022965 + - !!python/tuple + - 4.555644025130447 + - !!python/tuple + - 4.530235421844776 + - !!python/tuple + - 4.506549316233132 + - !!python/tuple + - 4.484344301558649 + - !!python/tuple + - 4.463436572342118 + - !!python/tuple + - 4.443680365996487 + - !!python/tuple + - 4.443680365996487 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828231076513509 + - !!python/tuple + - 4.77118550921551 + - !!python/tuple + - 4.723394504996684 + - !!python/tuple + - 4.6820319457613335 + - !!python/tuple + - 4.645431670927908 + - !!python/tuple + - 4.612525516390918 + - !!python/tuple + - 4.58258464984244 + - !!python/tuple + - 4.555080790570565 + - !!python/tuple + - 4.529610075601056 + - !!python/tuple + - 4.505863936314343 + - !!python/tuple + - 4.483602781215476 + - !!python/tuple + - 4.462634686662743 + - !!python/tuple + - 4.442809303376708 + - !!python/tuple + - 4.442809303376708 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828219519984449 + - !!python/tuple + - 4.771140758673956 + - !!python/tuple + - 4.72332673450608 + - !!python/tuple + - 4.681939665803397 + - !!python/tuple + - 4.645321340494432 + - !!python/tuple + - 4.6123957586347775 + - !!python/tuple + - 4.5824260924707305 + - !!python/tuple + - 4.554874501548692 + - !!python/tuple + - 4.529352338311443 + - !!python/tuple + - 4.505558750506951 + - !!python/tuple + - 4.483254550686459 + - !!python/tuple + - 4.462247367333751 + - !!python/tuple + - 4.442377777121173 + - !!python/tuple + - 4.442377777121173 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828155661607371 + - !!python/tuple + - 4.771043245392114 + - !!python/tuple + - 4.723177248151984 + - !!python/tuple + - 4.681738456913568 + - !!python/tuple + - 4.645066791335436 + - !!python/tuple + - 4.612087630607224 + - !!python/tuple + - 4.582070938331959 + - !!python/tuple + - 4.5544816827586825 + - !!python/tuple + - 4.528920891992621 + - !!python/tuple + - 4.505093949146738 + - !!python/tuple + - 4.482765194735517 + - !!python/tuple + - 4.461742626587014 + - !!python/tuple + - 4.4418663689176245 + - !!python/tuple + - 4.4418663689176245 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.828281141238867 + - !!python/tuple + - 4.77130191027399 + - !!python/tuple + - 4.7235850644093755 + - !!python/tuple + - 4.682297832549167 + - !!python/tuple + - 4.645788402306379 + - !!python/tuple + - 4.6129703155455335 + - !!python/tuple + - 4.583087744250107 + - !!python/tuple + - 4.5556364244958685 + - !!python/tuple + - 4.53022182901151 + - !!python/tuple + - 4.506525035647594 + - !!python/tuple + - 4.484315641542505 + - !!python/tuple + - 4.4634046793896625 + - !!python/tuple + - 4.443634821147837 + - !!python/tuple + - 4.443634821147837 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 4.9 + - !!python/tuple + - 4.82824690497898 + - !!python/tuple + - 4.771193308305304 + - !!python/tuple + - 4.723367579680743 + - !!python/tuple + - 4.681961154914757 + - !!python/tuple + - 4.645321235876418 + - !!python/tuple + - 4.612375186030649 + - !!python/tuple + - 4.582403553392493 + - !!python/tuple + - 4.554873753200952 + - !!python/tuple + - 4.529374807930152 + - !!python/tuple + - 4.5055998794636265 + - !!python/tuple + - 4.483311991698895 + - !!python/tuple + - 4.462319081864513 + - !!python/tuple + - 4.442467634606434 + - !!python/tuple + - 4.442467634606434 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.6893551138342264 + - 2.6257317225670054 + - 2.576067221538355 + - 2.5350946867274846 + - 2.500118232668328 + - 2.4695277450866824 + - 2.44231526621196 + - 2.417786478457059 + - 2.3954512886928754 + - 2.3749384803161497 + - 2.355974043875788 + - 2.3383351981520986 + - 2.3218478008517467 + - 2.3063688616357227 + - 2.3063688616357227 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.698602375009207 + - 2.635260454269838 + - 2.585841590528148 + - 2.545107808634954 + - 2.5103527824475167 + - 2.479979638398922 + - 2.4529797693132105 + - 2.428657700324564 + - 2.4065190173202713 + - 2.386193828775252 + - 2.367414706908724 + - 2.349962835823599 + - 2.333660825871027 + - 2.3183624159715324 + - 2.3183624159715324 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.695726447273908 + - 2.632316299991869 + - 2.582833952440025 + - 2.542042839736181 + - 2.50721938725384 + - 2.4767744007042687 + - 2.4497204079248234 + - 2.425372033106726 + - 2.403205203830921 + - 2.3828574732359105 + - 2.3640456113067616 + - 2.346556852281289 + - 2.33022178385454 + - 2.3149023762161005 + - 2.3149023762161005 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.69761352449041 + - 2.634245563320202 + - 2.5848473714702744 + - 2.5441445259338336 + - 2.5094169182363713 + - 2.4790880895128082 + - 2.452128144196195 + - 2.4278422208751125 + - 2.405737496018033 + - 2.3854503517294976 + - 2.366708342444746 + - 2.34928425954856 + - 2.3330055481105108 + - 2.3177295691308033 + - 2.3177295691308033 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.6885602551680954 + - 2.624895734274738 + - 2.575246289996016 + - 2.534323197809421 + - 2.4993971094734384 + - 2.4688598713337506 + - 2.4417015815213814 + - 2.4172287215729593 + - 2.3949566562280804 + - 2.3745143523966554 + - 2.355614765054877 + - 2.3380344787131704 + - 2.321612646675303 + - 2.307408082366422 + - 2.307408082366422 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.69872839078544 + - 2.6353478144599247 + - 2.585911794470485 + - 2.545137157764509 + - 2.5103194712926706 + - 2.4798806907626223 + - 2.4528174647841468 + - 2.428449588900828 + - 2.4062837954613556 + - 2.38593949634555 + - 2.3671290861781547 + - 2.3496340702989933 + - 2.3332783248904185 + - 2.3179280456169598 + - 2.3179280456169598 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.693483139515207 + - 2.6299924722853016 + - 2.5804321647694564 + - 2.539560564218672 + - 2.5046625625512844 + - 2.474159315791943 + - 2.4470404377242776 + - 2.422604102858047 + - 2.4003543764144073 + - 2.3799272307242676 + - 2.3610528320760276 + - 2.3435042143325218 + - 2.3270979684962527 + - 2.3116902366692744 + - 2.3116902366692744 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.6989732313654495 + - 2.6355904042017766 + - 2.5861609109477017 + - 2.5453847549562134 + - 2.510576711134216 + - 2.4801587722887715 + - 2.4531042333907265 + - 2.428733476601435 + - 2.4065532483576972 + - 2.386189741085131 + - 2.3673710473425045 + - 2.349882128494207 + - 2.3335443993177587 + - 2.3182074661114944 + - 2.3182074661114944 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.696739105506379 + - 2.6332829812261918 + - 2.5837853391428136 + - 2.5429699446833505 + - 2.508125065376736 + - 2.4776849794557214 + - 2.4506321465152903 + - 2.426261826986175 + - 2.404084297421792 + - 2.3837360546370494 + - 2.364923645616419 + - 2.3474304464137767 + - 2.3310822630373997 + - 2.3157347860686723 + - 2.3157347860686723 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 2.6993382275745255 + - 2.635978464435007 + - 2.5865514847370155 + - 2.5457588403958513 + - 2.510914649024044 + - 2.4804643633997516 + - 2.4533900324261664 + - 2.429023622604677 + - 2.406858055069522 + - 2.386510065793446 + - 2.36770157910432 + - 2.3502150302384344 + - 2.3338695863360535 + - 2.3185329122227234 + - 2.3185329122227234 +problem_name: MM1-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8079828649736138 + - 0.6733919250784318 + - 0.5683300643423927 + - 0.4816554646354735 + - 0.40766516433458655 + - 0.3429530766344328 + - 0.2853869356966791 + - 0.233497960075186 + - 0.18624939121985906 + - 0.14285594575390417 + - 0.10273797539343814 + - 0.06542420168014354 + - 0.03054623848325078 + - -0.002198400495752984 + - -0.002198400495752984 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8275448145680561 + - 0.6935493063551823 + - 0.58900707452711 + - 0.5028375403150145 + - 0.42931565555721785 + - 0.3650633432605885 + - 0.3079469638140722 + - 0.25649528762742535 + - 0.2096624154047783 + - 0.16666586688174612 + - 0.12693991684858083 + - 0.09002167521617199 + - 0.05553588629489449 + - 0.02317314475811034 + - 0.02317314475811034 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8214609858180487 + - 0.6873211490127992 + - 0.5826446215191456 + - 0.496353807891781 + - 0.4226871719793982 + - 0.3582828817775003 + - 0.3010520073525625 + - 0.24954468297992652 + - 0.2026522692417775 + - 0.15960803455120479 + - 0.11981282515112082 + - 0.08281654959968886 + - 0.04826082773358631 + - 0.015853666913832123 + - 0.015853666913832123 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8254529688162042 + - 0.6914023738499829 + - 0.5869038719974163 + - 0.500799781535637 + - 0.42733589872119354 + - 0.3631773324687312 + - 0.3061454090296686 + - 0.2547701965346557 + - 0.20800916045370915 + - 0.16509309195753155 + - 0.1254456510569935 + - 0.08858619344085328 + - 0.0541496909361797 + - 0.0218344004785783 + - 0.0218344004785783 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8063013957399309 + - 0.6716234489290692 + - 0.5665934397193996 + - 0.48002343250809454 + - 0.406139677455511 + - 0.3415402353138426 + - 0.28408872763736137 + - 0.2323180634716134 + - 0.1852030300150654 + - 0.1419587321005047 + - 0.1019779455800668 + - 0.0647880502408073 + - 0.03004878587977525 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8278113923380714 + - 0.6937341108721848 + - 0.5891555861734599 + - 0.5028996263945719 + - 0.42924518808369233 + - 0.36485402629233643 + - 0.30760361966531125 + - 0.25605504212077074 + - 0.20916481962365463 + - 0.16612784399303146 + - 0.12633570569580782 + - 0.08932619419762723 + - 0.05472673158833814 + - 0.022254263932676394 + - 0.022254263932676394 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.816715421431994 + - 0.6824052501750945 + - 0.5775638037008562 + - 0.49110272352915846 + - 0.4172783839061743 + - 0.3527508482086303 + - 0.29538271338695826 + - 0.24368931553858209 + - 0.19662153850226108 + - 0.15340930660056157 + - 0.11348180504137073 + - 0.07635890245921047 + - 0.041652609643402935 + - 0.00905860503374429 + - 0.00905860503374429 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8283293358668838 + - 0.6942472929065665 + - 0.589682575070848 + - 0.5034234013471981 + - 0.4297893614036376 + - 0.36544228877295 + - 0.30821025907140465 + - 0.25665558716699244 + - 0.20973482882709016 + - 0.16665721965241057 + - 0.1268475580174044 + - 0.08985094437169877 + - 0.05528959387128966 + - 0.02284535890948208 + - 0.02284535890948208 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.82360319516254 + - 0.689366097157108 + - 0.5846572151263347 + - 0.49831503510296404 + - 0.4246030722068964 + - 0.3602091489500857 + - 0.3029807280853863 + - 0.2514269811750196 + - 0.20451193170702184 + - 0.16146661351404354 + - 0.12167024677928706 + - 0.08466457833623614 + - 0.05008111268971095 + - 0.01761457311836153 + - 0.01761457311836153 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.829101460424523 + - 0.6950682078324476 + - 0.5905088072529926 + - 0.5042147535514605 + - 0.4305042459345033 + - 0.3660887459018648 + - 0.308814847415956 + - 0.2572693712251098 + - 0.21037962661315207 + - 0.16733484470044863 + - 0.1275467753901644 + - 0.09055517528042446 + - 0.05597750480408133 + - 0.023533817935684712 + - 0.023533817935684712 +solver_name: SPSA diff --git a/test/expected_results/MM11_STRONG.yaml b/test/expected_results/MM11_STRONG.yaml new file mode 100644 index 000000000..08baa5393 --- /dev/null +++ b/test/expected_results/MM11_STRONG.yaml @@ -0,0 +1,309 @@ +all_est_objectives: +- - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- - 2.789035151306537 + - 1.5662895013251565 + - 1.5662895013251565 +- - 2.7862478107466546 + - 1.5723579791841462 + - 1.5723579791841462 +- - 2.7881760005848144 + - 1.5739275057088853 + - 1.5739275057088853 +- - 2.77940256374346 + - 1.5491966229359848 + - 1.5491966229359848 +- - 2.789186580392257 + - 1.5747964194287298 + - 1.5747964194287298 +- - 2.7840784985550453 + - 1.560315508339037 + - 1.560315508339037 +- - 2.7894024528762422 + - 1.5857086812993637 + - 1.5857086812993637 +- - 2.7873753797816248 + - 1.566676491059211 + - 1.566676491059211 +- - 2.789809403279113 + - 1.584334567965197 + - 1.584334567965197 +all_intermediate_budgets: +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +- - 10 + - 40 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +- - !!python/tuple + - 5.0 + - !!python/tuple + - 3.0 + - !!python/tuple + - 3.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +- !!python/tuple + - !!python/tuple + - 10.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 2.780124829249758 + - 1.5445738822352317 + - 1.5445738822352317 +problem_name: MM1-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +solver_name: STRONG diff --git a/test/expected_results/NETWORK1_RNDSRCH.yaml b/test/expected_results/NETWORK1_RNDSRCH.yaml new file mode 100644 index 000000000..5d0d901b8 --- /dev/null +++ b/test/expected_results/NETWORK1_RNDSRCH.yaml @@ -0,0 +1,749 @@ +all_est_objectives: +- - 109.7019095215723 + - 82.91567112438206 + - 73.45310288943298 + - 73.45310288943298 +- - 112.27320453592472 + - 69.3284861104339 + - 69.3284861104339 +- - 108.64923613716142 + - 104.38647330163158 + - 85.59928839006163 + - 85.59928839006163 +- - 109.93840318078419 + - 108.4323639562708 + - 86.42871199024263 + - 75.62954492624394 + - 75.62954492624394 +- - 111.91072174923305 + - 111.2063752475262 + - 72.69237521342161 + - 72.69237521342161 +- - 111.46339127715159 + - 77.90666840972538 + - 77.90666840972538 +- - 114.22577943932667 + - 81.88400834039747 + - 81.88400834039747 +- - 111.39925864193513 + - 79.81634307842793 + - 76.6305916315754 + - 76.6305916315754 +- - 109.65793854951664 + - 97.74034926515185 + - 86.1858825654137 + - 77.83539716356131 + - 77.83539716356131 +- - 111.34263449590317 + - 121.73283084005503 + - 90.52072878202424 + - 78.60586371811831 + - 78.60586371811831 +all_intermediate_budgets: +- - 0 + - 210 + - 680 + - 1000 +- - 0 + - 260 + - 1000 +- - 0 + - 240 + - 630 + - 1000 +- - 0 + - 50 + - 180 + - 640 + - 1000 +- - 0 + - 60 + - 130 + - 1000 +- - 0 + - 150 + - 1000 +- - 0 + - 110 + - 1000 +- - 0 + - 80 + - 540 + - 1000 +- - 0 + - 60 + - 550 + - 760 + - 1000 +- - 0 + - 150 + - 220 + - 390 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.13038506604800462 + - 0.2128181604552324 + - 0.15472563542845738 + - 0.18320259343259263 + - 0.041706761796296815 + - 0.07622417158833443 + - 0.02453188098230158 + - 0.04059847655962057 + - 0.10210403428625214 + - 0.03370321942290739 + - !!python/tuple + - 0.07750254149774963 + - 0.3152027797170702 + - 0.0525177304228838 + - 0.09311968138324922 + - 0.15073656008321193 + - 0.08239724858920736 + - 0.10015665071878692 + - 0.04166665945872144 + - 0.07216706484470087 + - 0.014533083284418755 + - !!python/tuple + - 0.07750254149774963 + - 0.3152027797170702 + - 0.0525177304228838 + - 0.09311968138324922 + - 0.15073656008321193 + - 0.08239724858920736 + - 0.10015665071878692 + - 0.04166665945872144 + - 0.07216706484470087 + - 0.014533083284418755 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.01964726567595716 + - 0.362756087810667 + - 0.1664945709666455 + - 0.17739052316085743 + - 0.0748861996897315 + - 0.0521730064526511 + - 0.026671236352175526 + - 0.016620527458595376 + - 0.03429168558114113 + - 0.06906889685157844 + - !!python/tuple + - 0.01964726567595716 + - 0.362756087810667 + - 0.1664945709666455 + - 0.17739052316085743 + - 0.0748861996897315 + - 0.0521730064526511 + - 0.026671236352175526 + - 0.016620527458595376 + - 0.03429168558114113 + - 0.06906889685157844 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.30201046601824155 + - 0.1743011283966991 + - 0.16345917539283658 + - 0.0038570623314832784 + - 0.018131615584223243 + - 0.025583782982420353 + - 0.11557866506853084 + - 0.0726704411003624 + - 0.024400327626882545 + - 0.10000733549832018 + - !!python/tuple + - 0.4555019271908164 + - 0.156095220927308 + - 0.06084960633798644 + - 0.0231562421057912 + - 0.02201869189317931 + - 0.07361172624289049 + - 0.042586633437867116 + - 0.03725490793967418 + - 0.05949276224015226 + - 0.06943228168433463 + - !!python/tuple + - 0.4555019271908164 + - 0.156095220927308 + - 0.06084960633798644 + - 0.0231562421057912 + - 0.02201869189317931 + - 0.07361172624289049 + - 0.042586633437867116 + - 0.03725490793967418 + - 0.05949276224015226 + - 0.06943228168433463 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.22642843543796448 + - 0.24982927693168372 + - 0.0008727751009467721 + - 0.037726155915675096 + - 0.14401024842259924 + - 0.021704217815717675 + - 0.1435420097551226 + - 0.058498602560773064 + - 0.06346248919866598 + - 0.05392578886085162 + - !!python/tuple + - 0.38604003444374874 + - 0.13465770613937897 + - 0.011718599066698008 + - 0.039897229433160264 + - 0.16352501890333646 + - 0.11997324392472258 + - 0.06875503060853579 + - 0.012214828334259393 + - 0.0356743726112565 + - 0.02754393653490315 + - !!python/tuple + - 0.10735834151084894 + - 0.2401936523467593 + - 0.1370188855090275 + - 0.13833567987454687 + - 0.06373914891000428 + - 0.05712804627539135 + - 0.08629018640440553 + - 0.011013065584461263 + - 0.08866973678431347 + - 0.07025325680024143 + - !!python/tuple + - 0.10735834151084894 + - 0.2401936523467593 + - 0.1370188855090275 + - 0.13833567987454687 + - 0.06373914891000428 + - 0.05712804627539135 + - 0.08629018640440553 + - 0.011013065584461263 + - 0.08866973678431347 + - 0.07025325680024143 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.04189057855143169 + - 0.4426616120095564 + - 0.035825653422402425 + - 0.13337836015957888 + - 0.05096150880629348 + - 0.04626059498642898 + - 0.10572484107302163 + - 0.12815127122274483 + - 0.008586528744539539 + - 0.006559051024002237 + - !!python/tuple + - 0.04078665369649632 + - 0.2794808152748241 + - 0.12715883123131239 + - 0.20462961499882645 + - 0.14356305547350107 + - 0.06206932141198862 + - 0.040106983428775035 + - 0.03810374648614891 + - 0.0032347364450885205 + - 0.06086624155303848 + - !!python/tuple + - 0.04078665369649632 + - 0.2794808152748241 + - 0.12715883123131239 + - 0.20462961499882645 + - 0.14356305547350107 + - 0.06206932141198862 + - 0.040106983428775035 + - 0.03810374648614891 + - 0.0032347364450885205 + - 0.06086624155303848 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.18814046246642357 + - 0.2692222219815108 + - 0.14010689635834542 + - 0.052825172744684415 + - 0.15860141126153798 + - 0.031131780467188282 + - 0.015458241920123024 + - 0.05230554945672381 + - 0.01800079789752334 + - 0.07420746544593917 + - !!python/tuple + - 0.18814046246642357 + - 0.2692222219815108 + - 0.14010689635834542 + - 0.052825172744684415 + - 0.15860141126153798 + - 0.031131780467188282 + - 0.015458241920123024 + - 0.05230554945672381 + - 0.01800079789752334 + - 0.07420746544593917 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.018553447380570624 + - 0.35074173614302007 + - 0.041485754300258325 + - 0.054968831189140775 + - 0.16104817371160665 + - 0.1005849941664155 + - 0.11898145478784736 + - 0.054836433238603516 + - 0.050420202387136515 + - 0.04837897269540069 + - !!python/tuple + - 0.018553447380570624 + - 0.35074173614302007 + - 0.041485754300258325 + - 0.054968831189140775 + - 0.16104817371160665 + - 0.1005849941664155 + - 0.11898145478784736 + - 0.054836433238603516 + - 0.050420202387136515 + - 0.04837897269540069 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.27329939287430816 + - 0.23599916645993707 + - 0.24479468324382683 + - 0.0035892197218295838 + - 0.033639845553594436 + - 0.014075107434938866 + - 0.1020485413340181 + - 0.005694158418783535 + - 0.06045986592985626 + - 0.026400019028907092 + - !!python/tuple + - 0.002377465672350981 + - 0.3260083754225866 + - 0.0805956859470428 + - 0.1619454971937162 + - 0.17253375484871414 + - 0.028574972422016398 + - 0.09551525676142873 + - 0.05525157174817952 + - 0.07071962804146331 + - 0.006477791942501528 + - !!python/tuple + - 0.002377465672350981 + - 0.3260083754225866 + - 0.0805956859470428 + - 0.1619454971937162 + - 0.17253375484871414 + - 0.028574972422016398 + - 0.09551525676142873 + - 0.05525157174817952 + - 0.07071962804146331 + - 0.006477791942501528 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.20007500230737948 + - 0.11527480997458438 + - 0.19453698780559514 + - 0.06579787513162884 + - 0.11964109175666014 + - 0.030028921621970562 + - 0.06061708340198941 + - 0.12720715078918338 + - 0.04040828491347267 + - 0.046412792297536073 + - !!python/tuple + - 0.40125794678861926 + - 0.06570721152246035 + - 0.07081900655072895 + - 0.18398854314807894 + - 0.01678897121411908 + - 0.12574797487071812 + - 0.048474111153786185 + - 0.00014965311505179047 + - 0.02485919554355391 + - 0.062207386092883565 + - !!python/tuple + - 0.24650728926847776 + - 0.1711132112998211 + - 0.016304812854514267 + - 0.07316167865686066 + - 0.1366710967576512 + - 0.10567572235878285 + - 0.09904375678925394 + - 0.05690555213457361 + - 0.04865877244060637 + - 0.04595810743945804 + - !!python/tuple + - 0.24650728926847776 + - 0.1711132112998211 + - 0.016304812854514267 + - 0.07316167865686066 + - 0.1366710967576512 + - 0.10567572235878285 + - 0.09904375678925394 + - 0.05690555213457361 + - 0.04865877244060637 + - 0.04595810743945804 +- - !!python/tuple + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - 0.1 + - !!python/tuple + - 0.45531750179103053 + - 0.044579644994718885 + - 0.037879492524068435 + - 0.01801125146427292 + - 0.11009504701863687 + - 0.17317241004161318 + - 0.05564690742653076 + - 0.07090593948490329 + - 0.0167101204261403 + - 0.017681684828084646 + - !!python/tuple + - 0.3257902825042526 + - 0.02288639561481796 + - 0.13699753484875923 + - 0.13986155665165445 + - 0.06321935293238135 + - 0.14717124964176304 + - 0.012870382650854498 + - 0.07825137235235645 + - 0.0015910256798009087 + - 0.07136084712335944 + - !!python/tuple + - 0.12772573703947634 + - 0.16243107312698102 + - 0.15341230613371123 + - 0.07740447431816379 + - 0.17321876094650315 + - 0.09859037270272719 + - 0.08971224173357253 + - 0.0470689177561795 + - 0.020440503420493316 + - 0.049995612822191976 + - !!python/tuple + - 0.12772573703947634 + - 0.16243107312698102 + - 0.15341230613371123 + - 0.07740447431816379 + - 0.17321876094650315 + - 0.09859037270272719 + - 0.08971224173357253 + - 0.0470689177561795 + - 0.020440503420493316 + - 0.049995612822191976 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 680.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 82.91567112438206 + - 73.45310288943298 + - 73.45310288943298 +- !!python/tuple + - !!python/tuple + - 0.0 + - 260.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 69.07312550277236 + - 69.07312550277236 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 630.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 104.38647330163158 + - 85.59928839006163 + - 85.59928839006163 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 180.0 + - 640.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 108.4323639562708 + - 86.42871199024263 + - 75.62954492624394 + - 75.62954492624394 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 130.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 111.2063752475262 + - 72.69237521342161 + - 72.69237521342161 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 77.90666840972538 + - 77.90666840972538 +- !!python/tuple + - !!python/tuple + - 0.0 + - 110.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 81.88400834039747 + - 81.88400834039747 +- !!python/tuple + - !!python/tuple + - 0.0 + - 80.0 + - 540.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 79.81634307842793 + - 76.6305916315754 + - 76.6305916315754 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 550.0 + - 760.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 97.74034926515185 + - 86.1858825654137 + - 77.83539716356131 + - 77.83539716356131 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 220.0 + - 390.0 + - 1000.0 + - !!python/tuple + - 109.7019095215723 + - 121.73283084005503 + - 90.52072878202424 + - 78.60586371811831 + - 78.60586371811831 +problem_name: NETWORK-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.68 + - 1.0 + - !!python/tuple + - 1.0 + - 0.34070784927268344 + - 0.10780478649407531 + - 0.10780478649407531 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.26 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8691706791549277 + - 0.4067599679981121 + - 0.4067599679981121 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.05 + - 0.18 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9687525581687592 + - 0.42717464739873623 + - 0.16137375463754375 + - 0.16137375463754375 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.13 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0370295533643767 + - 0.08908092619691842 + - 0.08908092619691842 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 1.0 + - !!python/tuple + - 1.0 + - 0.21742080449332493 + - 0.21742080449332493 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.11 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3153154382296355 + - 0.3153154382296355 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.08 + - 0.54 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2644238028557395 + - 0.18601260931919633 + - 0.18601260931919633 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.06 + - 0.55 + - 0.76 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7055890166221676 + - 0.42119786441855733 + - 0.21566659875260932 + - 0.21566659875260932 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.22 + - 0.39 + - 1.0 + - !!python/tuple + - 1.0 + - 1.2961181735814618 + - 0.5278918332709032 + - 0.2346301629636497 + - 0.2346301629636497 +solver_name: RNDSRCH diff --git a/test/expected_results/PARAMESTI1_ADAM.yaml b/test/expected_results/PARAMESTI1_ADAM.yaml new file mode 100644 index 000000000..833b8e815 --- /dev/null +++ b/test/expected_results/PARAMESTI1_ADAM.yaml @@ -0,0 +1,753 @@ +all_est_objectives: +- - -9.3297480290724 + - -7.113610789849786 + - -6.091318171542374 + - -5.730896508135272 + - -5.6338491443875345 + - -5.55723503097639 + - -5.412640414778833 + - -5.412640414778833 +- - -9.021588601147258 + - -6.942664963804881 + - -6.03168449582261 + - -5.696959474022699 + - -5.5204660888034605 + - -5.318325270297051 + - -5.074522570628822 + - -5.074522570628822 +- - -9.221874900363291 + - -7.081371178202193 + - -6.135129572846429 + - -5.801981348295094 + - -5.6567310595877025 + - -5.485160224083971 + - -5.247015981577733 + - -5.247015981577733 +- - -9.024800808326528 + - -6.896737761304142 + - -5.927078969642903 + - -5.5860555891662305 + - -5.480520501407916 + - -5.382945513225892 + - -5.220938660074158 + - -5.220938660074158 +- - -9.13630921975174 + - -6.894195481017029 + - -5.8096347332881235 + - -5.410370821201566 + - -5.346286188670786 + - -5.346286188670786 +- - -8.424449086285406 + - -6.42042914834591 + - -5.5200609307241395 + - -5.205412171716275 + - -5.097788694207831 + - -4.992940415398514 + - -4.837570762374299 + - -4.837570762374299 +- - -9.11642083853037 + - -6.99418172248923 + - -6.04031474016805 + - -5.769847585166621 + - -5.822026502826198 + - -5.822026502826198 +- - -9.025313812446148 + - -6.99142337656143 + - -6.127922408977537 + - -5.908827347726871 + - -5.938395961043343 + - -5.963174448621478 + - -5.879601685312403 + - -5.879601685312403 +- - -9.167759709525823 + - -6.9786328041244925 + - -5.949454733974003 + - -5.606071455900012 + - -5.595890223235151 + - -5.668597828613445 + - -5.688394956356872 + - -5.688394956356872 +- - -9.203555672298497 + - -7.052103592185319 + - -6.086016683453081 + - -5.757042444148981 + - -5.6576821778055635 + - -5.555381712465505 + - -5.380024888556369 + - -5.380024888556369 +all_intermediate_budgets: +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.499999998791309 + - 1.4999999977642131 + - !!python/tuple + - 1.9501941923588508 + - 1.9870942199326072 + - !!python/tuple + - 2.3107878532807606 + - 2.4582134482168443 + - !!python/tuple + - 2.5529285525385585 + - 2.910688626601515 + - !!python/tuple + - 2.6735728102941936 + - 3.342105880932273 + - !!python/tuple + - 2.6899542500362976 + - 3.7502815215869814 + - !!python/tuple + - 2.6899542500362976 + - 3.7502815215869814 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.4999999985559338 + - 1.4999999977293828 + - !!python/tuple + - 1.932993291938198 + - 1.9867117742303981 + - !!python/tuple + - 2.2440348916506143 + - 2.456897788889597 + - !!python/tuple + - 2.4083163624171244 + - 2.9077290626998678 + - !!python/tuple + - 2.4425440702872296 + - 3.336642733544894 + - !!python/tuple + - 2.3797113794507663 + - 3.741323114809531 + - !!python/tuple + - 2.3797113794507663 + - 3.741323114809531 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.499999998835872 + - 1.4999999978958247 + - !!python/tuple + - 1.9404733052245104 + - 1.988477408601106 + - !!python/tuple + - 2.2721224509352322 + - 2.462940275831444 + - !!python/tuple + - 2.46684538895786 + - 2.9212635241473257 + - !!python/tuple + - 2.5328462591232808 + - 3.361541749606111 + - !!python/tuple + - 2.4976513195908367 + - 3.782049400125965 + - !!python/tuple + - 2.4976513195908367 + - 3.782049400125965 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.4999999986312154 + - 1.4999999976417437 + - !!python/tuple + - 1.9469294217038196 + - 1.9857183716205575 + - !!python/tuple + - 2.2982941289497942 + - 2.4534635467107977 + - !!python/tuple + - 2.5254015181952383 + - 2.8999730046233423 + - !!python/tuple + - 2.6284990850479986 + - 3.3222819279102254 + - !!python/tuple + - 2.6280624990716146 + - 3.717724608129799 + - !!python/tuple + - 2.6280624990716146 + - 3.717724608129799 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.499999998718335 + - 1.4999999976014837 + - !!python/tuple + - 1.9595288332775824 + - 1.9852468651195 + - !!python/tuple + - 2.348494517090238 + - 2.4518252940297622 + - !!python/tuple + - 2.6410910913081436 + - 2.896258221564911 + - !!python/tuple + - 2.6410910913081436 + - 2.896258221564911 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.4999999985606116 + - 1.499999997627275 + - !!python/tuple + - 1.9426900620229344 + - 1.9855500305407885 + - !!python/tuple + - 2.2817412903056398 + - 2.4528792403729023 + - !!python/tuple + - 2.4889684793692197 + - 2.8986491396548595 + - !!python/tuple + - 2.5693714423172214 + - 3.3198248303688933 + - !!python/tuple + - 2.5476548391529565 + - 3.71368057328699 + - !!python/tuple + - 2.5476548391529565 + - 3.71368057328699 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.4999999988836588 + - 1.4999999977117935 + - !!python/tuple + - 1.9619539124383973 + - 1.986515986950996 + - !!python/tuple + - 2.3578282363369873 + - 2.4562228448737224 + - !!python/tuple + - 2.662726547849891 + - 2.906208192220516 + - !!python/tuple + - 2.662726547849891 + - 2.906208192220516 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.499999998917367 + - 1.4999999978230236 + - !!python/tuple + - 1.9546640245311062 + - 1.9877242918214686 + - !!python/tuple + - 2.3283490653507433 + - 2.460372846851994 + - !!python/tuple + - 2.5928458019910554 + - 2.915531225784439 + - !!python/tuple + - 2.740909309994595 + - 3.3510233212102682 + - !!python/tuple + - 2.784719556038789 + - 3.764878314249248 + - !!python/tuple + - 2.784719556038789 + - 3.764878314249248 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.4999999990221817 + - 1.499999997835602 + - !!python/tuple + - 1.9613678832195347 + - 1.9878565225567881 + - !!python/tuple + - 2.355106404555104 + - 2.46082472241322 + - !!python/tuple + - 2.6556464246400378 + - 2.9165421641279994 + - !!python/tuple + - 2.850969410096739 + - 3.352881364520679 + - !!python/tuple + - 2.945190256098377 + - 3.7679153464688175 + - !!python/tuple + - 2.945190256098377 + - 3.7679153464688175 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.4999999986853543 + - 1.4999999976895564 + - !!python/tuple + - 1.9464715710867926 + - 1.9862658938665052 + - !!python/tuple + - 2.296292244742408 + - 2.4553593193822 + - !!python/tuple + - 2.5206706851870417 + - 2.904259882762772 + - !!python/tuple + - 2.6204538832727606 + - 3.330226864240831 + - !!python/tuple + - 2.6167692363059434 + - 3.730788548055702 + - !!python/tuple + - 2.6167692363059434 + - 3.730788548055702 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.113610789849786 + - -6.091318171542374 + - -5.730896508135272 + - -5.6338491443875345 + - -5.55723503097639 + - -5.412640414778833 + - -5.412640414778833 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.942664963804881 + - -6.03168449582261 + - -5.696959474022699 + - -5.5204660888034605 + - -5.318325270297051 + - -5.074522570628822 + - -5.074522570628822 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.081371178202193 + - -6.135129572846429 + - -5.801981348295094 + - -5.6567310595877025 + - -5.485160224083971 + - -5.247015981577733 + - -5.247015981577733 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.896737761304142 + - -5.927078969642903 + - -5.5860555891662305 + - -5.480520501407916 + - -5.382945513225892 + - -5.220938660074158 + - -5.220938660074158 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.894195481017029 + - -5.8096347332881235 + - -5.410370821201566 + - -5.346286188670786 + - -5.346286188670786 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.42042914834591 + - -5.5200609307241395 + - -5.205412171716275 + - -5.097788694207831 + - -4.992940415398514 + - -4.837570762374299 + - -4.837570762374299 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.99418172248923 + - -6.04031474016805 + - -5.769847585166621 + - -5.822026502826198 + - -5.822026502826198 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.99142337656143 + - -6.127922408977537 + - -5.908827347726871 + - -5.938395961043343 + - -5.963174448621478 + - -5.879601685312403 + - -5.879601685312403 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.9786328041244925 + - -5.949454733974003 + - -5.606071455900012 + - -5.595890223235151 + - -5.668597828613445 + - -5.688394956356872 + - -5.688394956356872 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.052103592185319 + - -6.086016683453081 + - -5.757042444148981 + - -5.6576821778055635 + - -5.555381712465505 + - -5.380024888556369 + - -5.380024888556369 +problem_name: PARAMESTI-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5263086526464572 + - 0.3077972900895577 + - 0.23075845858893987 + - 0.21001493437159452 + - 0.19363894376699067 + - 0.16273236571105973 + - 0.16273236571105973 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.48976959846221346 + - 0.2950508068396086 + - 0.2235045398652028 + - 0.18577971490227962 + - 0.14257284351418933 + - 0.09046089518792703 + - 0.09046089518792703 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5194175518566613 + - 0.3171618192107074 + - 0.24595258696500058 + - 0.21490586127330538 + - 0.17823321356993288 + - 0.12733074006750678 + - 0.12733074006750678 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4799528244611659 + - 0.27269175264399687 + - 0.19979923420334275 + - 0.1772414895706835 + - 0.15638518753220398 + - 0.12175680658551133 + - 0.12175680658551133 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4794094212128293 + - 0.2475884704224869 + - 0.16224724826411954 + - 0.1485493890382124 + - 0.1485493890382124 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3781435751804547 + - 0.185693113823119 + - 0.11843807566048306 + - 0.095433945245829 + - 0.07302300355058117 + - 0.039813300208964376 + - 0.039813300208964376 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5007811199513055 + - 0.29689549046281954 + - 0.23908411091466122 + - 0.2502371664981162 + - 0.2502371664981162 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5001915334510284 + - 0.3156213139102095 + - 0.2687905342429987 + - 0.27511071876648474 + - 0.2804070311782499 + - 0.26254365423873277 + - 0.26254365423873277 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.49745759469315554 + - 0.27747449162174276 + - 0.2040775535753415 + - 0.2019013517890164 + - 0.217442340381661 + - 0.22167390508286322 + - 0.22167390508286322 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5131617108334844 + - 0.30666411611840183 + - 0.23634705817517207 + - 0.21510915936429775 + - 0.19324280361512702 + - 0.15576091453577803 + - 0.15576091453577803 +solver_name: ADAM diff --git a/test/expected_results/PARAMESTI1_ALOE.yaml b/test/expected_results/PARAMESTI1_ALOE.yaml new file mode 100644 index 000000000..e46579298 --- /dev/null +++ b/test/expected_results/PARAMESTI1_ALOE.yaml @@ -0,0 +1,438 @@ +all_est_objectives: +- - -9.3297480290724 + - -7.295050664540807 + - -5.610730325244643 + - -5.610730325244643 +- - -9.021588601147258 + - -7.81013537260554 + - -7.062481146904462 + - -7.062481146904462 +- - -9.221874900363291 + - -7.767562378042587 + - -6.330371571915617 + - -6.330371571915617 +- - -9.024800808326528 + - -7.790730292083086 + - -5.8570888082431996 + - -5.8570888082431996 +- - -9.13630921975174 + - -7.6148677873585235 + - -5.1590377310827185 + - -5.1590377310827185 +- - -8.424449086285406 + - -7.0100747126909 + - -5.580607260147753 + - -5.580607260147753 +- - -9.11642083853037 + - -7.829917794317795 + - -5.343172453085259 + - -5.416813002763193 + - -5.416813002763193 +- - -9.025313812446148 + - -8.41042361359692 + - -5.510642004614506 + - -5.510642004614506 +- - -9.167759709525823 + - -8.214044891622796 + - -5.378919440958355 + - -5.378919440958355 +- - -9.203555672298497 + - -7.073346241703353 + - -5.580603116879344 + - -5.580603116879344 +all_intermediate_budgets: +- - 0 + - 630 + - 780 + - 1000 +- - 0 + - 480 + - 630 + - 1000 +- - 0 + - 630 + - 780 + - 1000 +- - 0 + - 480 + - 630 + - 1000 +- - 0 + - 480 + - 630 + - 1000 +- - 0 + - 480 + - 630 + - 1000 +- - 0 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 630 + - 780 + - 1000 +- - 0 + - 630 + - 780 + - 1000 +- - 0 + - 630 + - 780 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.12608491500362 + - 2.1484016294747956 + - !!python/tuple + - 1.591487330009342 + - 2.8223380842330794 + - !!python/tuple + - 1.591487330009342 + - 2.8223380842330794 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.3539357528102576 + - 2.4717918199879088 + - !!python/tuple + - 0.8715817527857754 + - 3.149198654230543 + - !!python/tuple + - 0.8715817527857754 + - 3.149198654230543 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.208006367181534 + - 2.2200195816463566 + - !!python/tuple + - 1.1412663469966966 + - 2.9557636463521284 + - !!python/tuple + - 1.1412663469966966 + - 2.9557636463521284 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.4706087501058804 + - 2.4194181687036247 + - !!python/tuple + - 1.2649033311399722 + - 3.053642584136713 + - !!python/tuple + - 1.2649033311399722 + - 3.053642584136713 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.623532316196333 + - 2.396641595939994 + - !!python/tuple + - 1.7436758741788376 + - 3.0122902395085194 + - !!python/tuple + - 1.7436758741788376 + - 3.0122902395085194 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.3541318206929787 + - 2.411143749541737 + - !!python/tuple + - 1.2233571357185227 + - 3.0386052304086877 + - !!python/tuple + - 1.2233571357185227 + - 3.0386052304086877 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.3010166604566837 + - 2.12217110914683 + - !!python/tuple + - 1.9814484083007682 + - 2.773783423003484 + - !!python/tuple + - 2.5414830882301627 + - 3.320298969162711 + - !!python/tuple + - 2.5414830882301627 + - 3.320298969162711 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.373184966861831 + - 2.179333810511733 + - !!python/tuple + - 1.5584142308273996 + - 2.87981536278661 + - !!python/tuple + - 1.5584142308273996 + - 2.87981536278661 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.6268794214258655 + - 2.186167884801846 + - !!python/tuple + - 1.7041570551439684 + - 2.89254542374119 + - !!python/tuple + - 1.7041570551439684 + - 2.89254542374119 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.9550377674284287 + - 2.111403240149155 + - !!python/tuple + - 1.6120954974769643 + - 2.7539021977896283 + - !!python/tuple + - 1.6120954974769643 + - 2.7539021977896283 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 630.0 + - 780.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.295050664540807 + - -5.610730325244643 + - -5.610730325244643 +- !!python/tuple + - !!python/tuple + - 0.0 + - 480.0 + - 630.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.81013537260554 + - -7.062481146904462 + - -7.062481146904462 +- !!python/tuple + - !!python/tuple + - 0.0 + - 630.0 + - 780.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.767562378042587 + - -6.330371571915617 + - -6.330371571915617 +- !!python/tuple + - !!python/tuple + - 0.0 + - 480.0 + - 630.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.790730292083086 + - -5.8570888082431996 + - -5.8570888082431996 +- !!python/tuple + - !!python/tuple + - 0.0 + - 480.0 + - 630.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.6148677873585235 + - -5.1590377310827185 + - -5.1590377310827185 +- !!python/tuple + - !!python/tuple + - 0.0 + - 480.0 + - 630.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.0100747126909 + - -5.580607260147753 + - -5.580607260147753 +- !!python/tuple + - !!python/tuple + - 0.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.829917794317795 + - -5.343172453085259 + - -5.416813002763193 + - -5.416813002763193 +- !!python/tuple + - !!python/tuple + - 0.0 + - 630.0 + - 780.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.41042361359692 + - -5.510642004614506 + - -5.510642004614506 +- !!python/tuple + - !!python/tuple + - 0.0 + - 630.0 + - 780.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.214044891622796 + - -5.378919440958355 + - -5.378919440958355 +- !!python/tuple + - !!python/tuple + - 0.0 + - 630.0 + - 780.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.073346241703353 + - -5.580603116879344 + - -5.580603116879344 +problem_name: PARAMESTI-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.63 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5650907719055498 + - 0.20507337010598944 + - 0.20507337010598944 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.48 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.675188271756226 + - 0.5153798757513169 + - 0.5153798757513169 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.63 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6660884476124495 + - 0.35889409280921647 + - 0.35889409280921647 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.48 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6710405057354674 + - 0.2577316079074069 + - 0.2577316079074069 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.48 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6334505292044252 + - 0.10852570612050728 + - 0.10852570612050728 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.48 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5041781893244759 + - 0.1986346735128264 + - 0.1986346735128264 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6794166930962694 + - 0.14788383927951237 + - 0.1636242413536331 + - 0.1636242413536331 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.63 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.803497719674461 + - 0.18367985231542425 + - 0.18367985231542425 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.63 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7615224756520644 + - 0.1555246290960209 + - 0.1555246290960209 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.63 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5177022506039755 + - 0.19863378790413752 + - 0.19863378790413752 +solver_name: ALOE diff --git a/test/expected_results/PARAMESTI1_ASTRODF.yaml b/test/expected_results/PARAMESTI1_ASTRODF.yaml new file mode 100644 index 000000000..9aa03cc6e --- /dev/null +++ b/test/expected_results/PARAMESTI1_ASTRODF.yaml @@ -0,0 +1,1005 @@ +all_est_objectives: +- - -9.3297480290724 + - -6.4827028342137485 + - -4.737792030082565 + - -4.688538585352649 + - -4.665539059812156 + - -4.656960862421889 + - -4.6633994515198856 + - -4.6633994515198856 +- - -9.021588601147258 + - -4.729450828466801 + - -4.756441741308396 + - -4.635759157428621 + - -4.607957493153382 + - -4.605722895666344 + - -4.608800994944769 + - -4.615006486935498 + - -4.6100020259549925 + - -4.6284716326509 + - -4.597600652364742 + - -4.601602658902346 + - -4.601602658902346 +- - -9.221874900363291 + - -5.199171574761933 + - -4.719161508016352 + - -4.602295045954421 + - -4.580763100344229 + - -4.597992083535532 + - -4.688020305814912 + - -4.721378800611331 + - -4.7026188966581985 + - -4.7026188966581985 +- - -9.024800808326528 + - -6.011365343788555 + - -4.611632365419948 + - -4.588346120410911 + - -4.567578367498325 + - -4.5591290191318325 + - -4.5371291060155325 + - -4.540355791062886 + - -4.540355791062886 +- - -9.13630921975174 + - -7.2707670113006175 + - -4.880719904898839 + - -4.619344347510497 + - -4.6677894727448415 + - -4.650601330501333 + - -4.622512510140705 + - -4.614634760012191 + - -4.597158242531631 + - -4.597158242531631 +- - -8.424449086285406 + - -4.999725278456079 + - -4.551599497020859 + - -4.451850082455772 + - -4.426726144245905 + - -4.760343701694075 + - -4.592899112313421 + - -4.448524562513982 + - -4.456123440800812 + - -4.456123440800812 +- - -9.11642083853037 + - -7.44015731874586 + - -5.117656281111162 + - -4.833157538538527 + - -4.930873152431534 + - -4.910318194954211 + - -4.837590636755322 + - -4.872959084272729 + - -4.872959084272729 +- - -9.025313812446148 + - -6.036486868121213 + - -5.414974234033826 + - -4.969027351304257 + - -4.773046000444783 + - -4.8825469927828955 + - -4.749922384129488 + - -4.874655742189269 + - -4.925245484738889 + - -4.869833879538768 + - -4.785109730802941 + - -4.875609125774046 + - -4.850980037901715 + - -4.850980037901715 +- - -9.167759709525823 + - -7.207333233323596 + - -5.520284933237711 + - -4.980463579819717 + - -4.930340764635415 + - -4.996564492804204 + - -4.975072551193193 + - -5.072957190039479 + - -5.0071639968731665 + - -5.068718343202193 + - -4.9668161873882966 + - -4.9176871519768035 + - -4.867844515007601 + - -4.867844515007601 +- - -9.203555672298497 + - -6.344259024598269 + - -4.753502275608756 + - -4.930342137763599 + - -4.838273667469733 + - -4.712306487974755 + - -4.712306487974755 +all_intermediate_budgets: +- - 5 + - 30 + - 110 + - 161 + - 377 + - 697 + - 931 + - 1000 +- - 5 + - 30 + - 90 + - 185 + - 257 + - 369 + - 398 + - 512 + - 741 + - 794 + - 828 + - 928 + - 1000 +- - 5 + - 30 + - 110 + - 186 + - 235 + - 349 + - 377 + - 528 + - 840 + - 1000 +- - 5 + - 30 + - 90 + - 239 + - 287 + - 381 + - 437 + - 535 + - 1000 +- - 5 + - 30 + - 70 + - 185 + - 285 + - 414 + - 449 + - 643 + - 946 + - 1000 +- - 5 + - 30 + - 115 + - 230 + - 278 + - 333 + - 447 + - 609 + - 840 + - 1000 +- - 5 + - 30 + - 95 + - 166 + - 328 + - 628 + - 819 + - 922 + - 1000 +- - 5 + - 30 + - 90 + - 161 + - 210 + - 320 + - 406 + - 463 + - 581 + - 750 + - 796 + - 829 + - 960 + - 1000 +- - 5 + - 30 + - 70 + - 161 + - 342 + - 374 + - 531 + - 566 + - 663 + - 694 + - 756 + - 855 + - 922 + - 1000 +- - 5 + - 30 + - 110 + - 185 + - 874 + - 980 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.0 + - 4.16227766016838 + - !!python/tuple + - 1.9840804329245634 + - 4.252545049268786 + - !!python/tuple + - 1.883346833561736 + - 5.483695587671548 + - !!python/tuple + - 1.9453266327524925 + - 5.40972444303779 + - !!python/tuple + - 1.998319176958772 + - 5.380918730659214 + - !!python/tuple + - 1.9673548096580025 + - 5.436199422580417 + - !!python/tuple + - 1.9673548096580025 + - 5.436199422580417 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.9131410951505046 + - 4.02756888284104 + - !!python/tuple + - 2.2066969780202412 + - 5.982070083565299 + - !!python/tuple + - 2.1157592674055477 + - 5.371169061016917 + - !!python/tuple + - 1.8587123383097643 + - 5.524803974295228 + - !!python/tuple + - 1.9662683027922998 + - 5.566489772205832 + - !!python/tuple + - 1.891669156669272 + - 5.594200895852521 + - !!python/tuple + - 1.9378910767824225 + - 5.676330782605485 + - !!python/tuple + - 1.911484349366545 + - 5.6236797455868555 + - !!python/tuple + - 2.0185775922279756 + - 5.705499191451447 + - !!python/tuple + - 1.8612151231405116 + - 5.372689448680318 + - !!python/tuple + - 2.0400966167368058 + - 5.22797949583618 + - !!python/tuple + - 2.0400966167368058 + - 5.22797949583618 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4675205473873447 + - 3.8011396685984704 + - !!python/tuple + - 1.9041119829892774 + - 4.167116185155712 + - !!python/tuple + - 1.97875785064843 + - 4.780221168828095 + - !!python/tuple + - 2.0017989750500442 + - 5.5519177117387235 + - !!python/tuple + - 2.0017989750500442 + - 5.7931803506065505 + - !!python/tuple + - 2.0017989750500442 + - 6.396336947776118 + - !!python/tuple + - 2.085760636535123 + - 6.43914142882269 + - !!python/tuple + - 2.041929888201833 + - 6.42184080600748 + - !!python/tuple + - 2.041929888201833 + - 6.42184080600748 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.0125619018342547 + - 3.439179081429916 + - !!python/tuple + - 1.879985189080018 + - 4.333532932079608 + - !!python/tuple + - 1.879985189080018 + - 4.4879410209550175 + - !!python/tuple + - 1.879985189080018 + - 4.6809511320492785 + - !!python/tuple + - 1.879985189080018 + - 4.801582451483192 + - !!python/tuple + - 1.972395477619635 + - 4.920736579050591 + - !!python/tuple + - 2.021214043837824 + - 4.8401231075374405 + - !!python/tuple + - 2.021214043837824 + - 4.8401231075374405 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.6029183488966536 + - 2.795777288245154 + - !!python/tuple + - 1.7955538260341608 + - 6.3112336571250225 + - !!python/tuple + - 2.1174929534596387 + - 5.784142654740214 + - !!python/tuple + - 1.924626139415743 + - 5.7915787172181945 + - !!python/tuple + - 1.9146005506650494 + - 5.6713647296852585 + - !!python/tuple + - 1.975706093813323 + - 5.663539607486801 + - !!python/tuple + - 1.9568958507957068 + - 5.571192658676245 + - !!python/tuple + - 1.9825897685601803 + - 5.51819011588945 + - !!python/tuple + - 1.9825897685601803 + - 5.51819011588945 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.66616292256853 + - 3.687731592897233 + - !!python/tuple + - 1.7000870101296877 + - 3.8957215719958875 + - !!python/tuple + - 2.00716895459507 + - 3.8630396041239132 + - !!python/tuple + - 1.8257338527279314 + - 4.203763709154563 + - !!python/tuple + - 1.4512931646026666 + - 4.508106960648904 + - !!python/tuple + - 1.5736613058553153 + - 4.783743511533697 + - !!python/tuple + - 1.7318287459105988 + - 4.681224256296628 + - !!python/tuple + - 1.7228433838130486 + - 4.581232805600998 + - !!python/tuple + - 1.7228433838130486 + - 4.581232805600998 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.420032822603017 + - 3.0355444327069048 + - !!python/tuple + - 1.5584641939405666 + - 3.6994813580091535 + - !!python/tuple + - 2.3466546487103286 + - 4.650604227705722 + - !!python/tuple + - 2.443159704257459 + - 4.650604227705722 + - !!python/tuple + - 2.4191500311942633 + - 4.595273274284602 + - !!python/tuple + - 2.344257198208235 + - 4.586589642935468 + - !!python/tuple + - 2.390132292856555 + - 4.668913757798665 + - !!python/tuple + - 2.390132292856555 + - 4.668913757798665 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.826600704767348 + - 3.5813813870374576 + - !!python/tuple + - 1.2893581466986541 + - 3.989652346589951 + - !!python/tuple + - 1.5055303538335876 + - 4.385651587788145 + - !!python/tuple + - 1.7355136411585128 + - 5.912508974241393 + - !!python/tuple + - 2.217523749837514 + - 5.93480020088164 + - !!python/tuple + - 1.9532604067122887 + - 5.958923801272479 + - !!python/tuple + - 2.107978909508674 + - 6.302683502291178 + - !!python/tuple + - 2.2026334006982955 + - 6.232552802127495 + - !!python/tuple + - 2.1309075372597888 + - 6.215927178036105 + - !!python/tuple + - 2.0037570332666728 + - 6.091380516642951 + - !!python/tuple + - 2.172043334724161 + - 6.102727973915953 + - !!python/tuple + - 2.0960272085347618 + - 6.224423429986562 + - !!python/tuple + - 2.0960272085347618 + - 6.224423429986562 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.472145408555807 + - 2.971927249914774 + - !!python/tuple + - 1.4126762190508564 + - 6.345884371379098 + - !!python/tuple + - 2.3098164912854116 + - 6.296185725313416 + - !!python/tuple + - 2.2147673270631882 + - 6.279485961039283 + - !!python/tuple + - 2.1938134436834917 + - 6.519836945403354 + - !!python/tuple + - 2.2013478276207414 + - 6.444819781069003 + - !!python/tuple + - 2.3028387819932794 + - 6.603649006870039 + - !!python/tuple + - 2.227931339154208 + - 6.514767147997049 + - !!python/tuple + - 2.1048653990086703 + - 6.782331996538361 + - !!python/tuple + - 2.1803747962617255 + - 6.439356080394397 + - !!python/tuple + - 2.2290830018653387 + - 6.2144848507756 + - !!python/tuple + - 2.2747813695426866 + - 5.930531121363696 + - !!python/tuple + - 2.2747813695426866 + - 5.930531121363696 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.0 + - 4.16227766016838 + - !!python/tuple + - 1.9878329613923948 + - 4.134918194041799 + - !!python/tuple + - 1.605926598196039 + - 4.224342709121425 + - !!python/tuple + - 1.7024316537431696 + - 4.224342709121425 + - !!python/tuple + - 1.8927643189935706 + - 4.37260307959225 + - !!python/tuple + - 1.8927643189935706 + - 4.37260307959225 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 110.0 + - 161.0 + - 377.0 + - 697.0 + - 931.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.4827028342137485 + - -4.737792030082565 + - -4.688538585352649 + - -4.665539059812156 + - -4.656960862421889 + - -4.6633994515198856 + - -4.6633994515198856 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 90.0 + - 185.0 + - 257.0 + - 369.0 + - 398.0 + - 512.0 + - 741.0 + - 794.0 + - 828.0 + - 928.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -4.729450828466801 + - -4.756441741308396 + - -4.635759157428621 + - -4.607957493153382 + - -4.605722895666344 + - -4.608800994944769 + - -4.615006486935498 + - -4.6100020259549925 + - -4.6284716326509 + - -4.597600652364742 + - -4.601602658902346 + - -4.601602658902346 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 110.0 + - 186.0 + - 235.0 + - 349.0 + - 377.0 + - 528.0 + - 840.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.199171574761933 + - -4.719161508016352 + - -4.602295045954421 + - -4.580763100344229 + - -4.597992083535532 + - -4.688020305814912 + - -4.721378800611331 + - -4.7026188966581985 + - -4.7026188966581985 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 90.0 + - 239.0 + - 287.0 + - 381.0 + - 437.0 + - 535.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.011365343788555 + - -4.611632365419948 + - -4.588346120410911 + - -4.567578367498325 + - -4.5591290191318325 + - -4.5371291060155325 + - -4.540355791062886 + - -4.540355791062886 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 70.0 + - 185.0 + - 285.0 + - 414.0 + - 449.0 + - 643.0 + - 946.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.2707670113006175 + - -4.880719904898839 + - -4.619344347510497 + - -4.6677894727448415 + - -4.650601330501333 + - -4.622512510140705 + - -4.614634760012191 + - -4.597158242531631 + - -4.597158242531631 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 115.0 + - 230.0 + - 278.0 + - 333.0 + - 447.0 + - 609.0 + - 840.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -4.999725278456079 + - -4.551599497020859 + - -4.451850082455772 + - -4.426726144245905 + - -4.760343701694075 + - -4.592899112313421 + - -4.448524562513982 + - -4.456123440800812 + - -4.456123440800812 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 95.0 + - 166.0 + - 328.0 + - 628.0 + - 819.0 + - 922.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.44015731874586 + - -5.117656281111162 + - -4.833157538538527 + - -4.930873152431534 + - -4.910318194954211 + - -4.837590636755322 + - -4.872959084272729 + - -4.872959084272729 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 90.0 + - 161.0 + - 210.0 + - 320.0 + - 406.0 + - 463.0 + - 581.0 + - 750.0 + - 796.0 + - 829.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.036486868121213 + - -5.414974234033826 + - -4.969027351304257 + - -4.773046000444783 + - -4.8825469927828955 + - -4.749922384129488 + - -4.874655742189269 + - -4.925245484738889 + - -4.869833879538768 + - -4.785109730802941 + - -4.875609125774046 + - -4.850980037901715 + - -4.850980037901715 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 70.0 + - 161.0 + - 342.0 + - 374.0 + - 531.0 + - 566.0 + - 663.0 + - 694.0 + - 756.0 + - 855.0 + - 922.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.207333233323596 + - -5.520284933237711 + - -4.980463579819717 + - -4.930340764635415 + - -4.996564492804204 + - -4.975072551193193 + - -5.072957190039479 + - -5.0071639968731665 + - -5.068718343202193 + - -4.9668161873882966 + - -4.9176871519768035 + - -4.867844515007601 + - -4.867844515007601 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 110.0 + - 185.0 + - 874.0 + - 980.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.344259024598269 + - -4.753502275608756 + - -4.930342137763599 + - -4.838273667469733 + - -4.712306487974755 + - -4.712306487974755 +problem_name: PARAMESTI-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.11 + - 0.161 + - 0.377 + - 0.697 + - 0.931 + - 1.0 + - !!python/tuple + - 1.0 + - 0.391454351084277 + - 0.0184859558098965 + - 0.007958209520997458 + - 0.0030421438329400743 + - 0.0012085850588068013 + - 0.002584810272167491 + - 0.002584810272167491 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.09 + - 0.185 + - 0.257 + - 0.369 + - 0.398 + - 0.512 + - 0.741 + - 0.794 + - 0.828 + - 0.928 + - 1.0 + - !!python/tuple + - 1.0 + - 0.016703054028369333 + - 0.022472264366047694 + - -0.0033232029670901436 + - -0.009265708501552734 + - -0.00974334566034135 + - -0.009085413033841852 + - -0.007759011487017339 + - -0.008828696984232111 + - -0.004880885122208915 + - -0.011479445891398717 + - -0.010624031418249776 + - -0.010624031418249776 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.11 + - 0.186 + - 0.235 + - 0.349 + - 0.377 + - 0.528 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.11710417055421372 + - 0.014503748867451104 + - -0.010476036181410154 + - -0.015078411948902349 + - -0.011395778889461224 + - 0.007847429137819235 + - 0.014977687167933242 + - 0.01096782531348446 + - 0.01096782531348446 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.09 + - 0.239 + - 0.287 + - 0.381 + - 0.437 + - 0.535 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2907076613277948 + - -0.008480217799761918 + - -0.01345756874080953 + - -0.017896601073535943 + - -0.01970261883324263 + - -0.024405020968489725 + - -0.02371532866942315 + - -0.02371532866942315 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.07 + - 0.185 + - 0.285 + - 0.414 + - 0.449 + - 0.643 + - 0.946 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5599002285500099 + - 0.04903627390294414 + - -0.006831809423879948 + - 0.0035231614862328603 + - -0.00015074196781853804 + - -0.0061546260805482745 + - -0.007838466777074631 + - -0.011574009398667042 + - -0.011574009398667042 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.115 + - 0.23 + - 0.278 + - 0.333 + - 0.447 + - 0.609 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0744732435747391 + - -0.021312027046123276 + - -0.04263310488678876 + - -0.04800325612599347 + - 0.02330629433481487 + - -0.012484383131805379 + - -0.04334392278831471 + - -0.041719689942822435 + - -0.041719689942822435 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.095 + - 0.166 + - 0.328 + - 0.628 + - 0.819 + - 0.922 + - 1.0 + - !!python/tuple + - 1.0 + - 0.596106796240066 + - 0.09968057033850768 + - 0.03886998952046514 + - 0.05975634979781604 + - 0.05536280172240743 + - 0.03981754828627558 + - 0.04737742646611278 + - 0.04737742646611278 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.09 + - 0.161 + - 0.21 + - 0.32 + - 0.406 + - 0.463 + - 0.581 + - 0.75 + - 0.796 + - 0.829 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2960772966094465 + - 0.16323121116512782 + - 0.06791167228928553 + - 0.026021364910417226 + - 0.04942680735286526 + - 0.021078775266501194 + - 0.047740080980580364 + - 0.058553456112079315 + - 0.04670942521827263 + - 0.028599943793677366 + - 0.04794386328558612 + - 0.0426794845224615 + - 0.0426794845224615 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.07 + - 0.161 + - 0.342 + - 0.374 + - 0.531 + - 0.566 + - 0.663 + - 0.694 + - 0.756 + - 0.855 + - 0.922 + - 1.0 + - !!python/tuple + - 1.0 + - 0.546341487139121 + - 0.18574099355303214 + - 0.07035612491534735 + - 0.059642553825258474 + - 0.07379763703393759 + - 0.06920381197708575 + - 0.09012630072899033 + - 0.0760632428253314 + - 0.089220262495418 + - 0.06743904397185407 + - 0.05693788972636451 + - 0.04628420571991862 + - 0.04628420571991862 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.11 + - 0.185 + - 0.874 + - 0.98 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3618624857661715 + - 0.021843964167342446 + - 0.0596428473264588 + - 0.03996354363966204 + - 0.013038513040820198 + - 0.013038513040820198 +solver_name: ASTRODF diff --git a/test/expected_results/PARAMESTI1_NELDMD.yaml b/test/expected_results/PARAMESTI1_NELDMD.yaml new file mode 100644 index 000000000..efd925336 --- /dev/null +++ b/test/expected_results/PARAMESTI1_NELDMD.yaml @@ -0,0 +1,978 @@ +all_est_objectives: +- - -9.3297480290724 + - -5.867950215750366 + - -4.7202380510708615 + - -4.694823847044888 + - -4.655198077345353 + - -4.661967909741396 + - -4.655967863198644 + - -4.6492988520413725 + - -4.651310583758861 + - -4.651310583758861 +- - -9.021588601147258 + - -5.929883734755116 + - -5.3467481102346275 + - -4.652984194166658 + - -4.590499264296341 + - -4.622332659431041 + - -4.610358399371889 + - -4.600552935302669 + - -4.603202646108965 + - -4.603202646108965 +- - -9.221874900363291 + - -6.019829971904972 + - -5.3829217502408735 + - -5.279166453444705 + - -4.604291996427448 + - -4.578415056005802 + - -4.603180218321457 + - -4.620152192597657 + - -4.599126482543894 + - -4.599126482543894 +- - -9.024800808326528 + - -5.734087953656552 + - -4.606668202390721 + - -4.565489048216158 + - -4.545390349729361 + - -4.571777222639254 + - -4.54780930174518 + - -4.553233368761266 + - -4.559581894519441 + - -4.559581894519441 +- - -9.13630921975174 + - -5.475417795997355 + - -4.540360424246259 + - -4.537699837965463 + - -4.542377764329675 + - -4.539808206043169 + - -4.539808206043169 +- - -8.424449086285406 + - -5.3596694505776075 + - -5.146749834259806 + - -4.683818836530865 + - -4.429541155862943 + - -4.3775741479083115 + - -4.378594336349297 + - -4.384614485737898 + - -4.372875154483052 + - -4.3734048950853674 + - -4.371124359027138 + - -4.371124359027138 +- - -9.11642083853037 + - -5.881934601716681 + - -4.7251873070916215 + - -4.715875742288187 + - -4.696277779605798 + - -4.726352470687171 + - -4.710413941483059 + - -4.705356459888807 + - -4.705356459888807 +- - -9.025313812446148 + - -6.088615711543225 + - -4.82649664895539 + - -4.870798601041617 + - -4.761345408443866 + - -4.763201692787459 + - -4.72546686841366 + - -4.715708447564118 + - -4.725676909868124 + - -4.722128371983504 + - -4.722128371983504 +- - -9.167759709525823 + - -5.694102357619153 + - -4.7148426493318025 + - -4.831096521295991 + - -4.832034339523149 + - -4.717085706181333 + - -4.786011922147847 + - -4.782726250119326 + - -4.7440072471174375 + - -4.764953828796595 + - -4.754338205341492 + - -4.754338205341492 +- - -9.203555672298497 + - -5.9242974253633385 + - -4.731536971239586 + - -4.667281849494766 + - -4.664347863830486 + - -4.646522980651593 + - -4.652671882310159 + - -4.642859806432569 + - -4.646438448397804 + - -4.646438448397804 +all_intermediate_budgets: +- - 0 + - 150 + - 270 + - 480 + - 600 + - 690 + - 750 + - 810 + - 960 + - 1000 +- - 0 + - 150 + - 210 + - 480 + - 600 + - 720 + - 780 + - 840 + - 960 + - 1000 +- - 0 + - 150 + - 210 + - 300 + - 540 + - 720 + - 780 + - 900 + - 960 + - 1000 +- - 0 + - 150 + - 270 + - 540 + - 660 + - 720 + - 840 + - 900 + - 960 + - 1000 +- - 0 + - 150 + - 270 + - 840 + - 900 + - 960 + - 1000 +- - 0 + - 150 + - 210 + - 300 + - 360 + - 480 + - 660 + - 720 + - 780 + - 840 + - 960 + - 1000 +- - 0 + - 150 + - 270 + - 570 + - 690 + - 750 + - 810 + - 870 + - 1000 +- - 0 + - 150 + - 270 + - 480 + - 540 + - 600 + - 690 + - 870 + - 930 + - 990 + - 1000 +- - 0 + - 150 + - 270 + - 480 + - 540 + - 600 + - 660 + - 720 + - 780 + - 900 + - 960 + - 1000 +- - 0 + - 150 + - 270 + - 480 + - 540 + - 600 + - 720 + - 900 + - 960 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 2.17562497625 + - 4.52687492875 + - !!python/tuple + - 1.893320294453125 + - 5.598085844609374 + - !!python/tuple + - 2.023596170727539 + - 4.886765058198241 + - !!python/tuple + - 1.9693346972143555 + - 5.418140779885253 + - !!python/tuple + - 2.03178373159729 + - 5.371039645582885 + - !!python/tuple + - 2.012077692566681 + - 5.1406776354661545 + - !!python/tuple + - 1.9948174418701459 + - 5.230328688991021 + - !!python/tuple + - 1.9948174418701459 + - 5.230328688991021 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 1.2474999949999996 + - 4.712499924999999 + - !!python/tuple + - 1.7192968604687495 + - 4.952265545156248 + - !!python/tuple + - 1.8706005683496087 + - 5.069731363095701 + - !!python/tuple + - 1.7775161586090082 + - 4.94685752524597 + - !!python/tuple + - 1.8124643543141168 + - 4.910731045873259 + - !!python/tuple + - 1.8327954124055856 + - 4.9992628243276584 + - !!python/tuple + - 1.8204040790758984 + - 5.039459008627613 + - !!python/tuple + - 1.8204040790758984 + - 5.039459008627613 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 1.2474999949999996 + - 4.712499924999999 + - !!python/tuple + - 1.4949999899999993 + - 7.434999869999996 + - !!python/tuple + - 1.8005077963281244 + - 5.598085844609373 + - !!python/tuple + - 1.8965228090368647 + - 5.575305693702391 + - !!python/tuple + - 1.9114024168905634 + - 5.8907684864016705 + - !!python/tuple + - 1.8671148124996182 + - 5.981024260029982 + - !!python/tuple + - 1.870746909670505 + - 5.800728920273264 + - !!python/tuple + - 1.870746909670505 + - 5.800728920273264 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 2.17562497625 + - 4.52687492875 + - !!python/tuple + - 1.8498144359570312 + - 4.895224530683592 + - !!python/tuple + - 2.038521097183838 + - 4.775885543836669 + - !!python/tuple + - 1.9353155328625489 + - 4.516542287357176 + - !!python/tuple + - 1.9826810256800844 + - 4.709758149542693 + - !!python/tuple + - 1.9386823273807146 + - 4.691934720795096 + - !!python/tuple + - 1.9479986046964741 + - 4.608694361263035 + - !!python/tuple + - 1.9479986046964741 + - 4.608694361263035 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 2.17562497625 + - 4.52687492875 + - !!python/tuple + - 2.1362707266139744 + - 4.516538274772572 + - !!python/tuple + - 2.1522356795947872 + - 4.472089871954433 + - !!python/tuple + - 2.1599390896771906 + - 4.510594501056751 + - !!python/tuple + - 2.1599390896771906 + - 4.510594501056751 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 1.2474999949999996 + - 4.712499924999999 + - !!python/tuple + - 1.7424999849999994 + - 6.197499894999996 + - !!python/tuple + - 2.1137499774999995 + - 5.331249912499998 + - !!python/tuple + - 1.9590624806249997 + - 4.372187431874998 + - !!python/tuple + - 1.8957372865917965 + - 4.870571210869139 + - !!python/tuple + - 1.8912658511352536 + - 4.4220983195385735 + - !!python/tuple + - 1.9262820247442622 + - 4.509261098539428 + - !!python/tuple + - 1.9022556122657772 + - 4.668125459954069 + - !!python/tuple + - 1.920147490986051 + - 4.58965960403344 + - !!python/tuple + - 1.920147490986051 + - 4.58965960403344 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 2.17562497625 + - 4.52687492875 + - !!python/tuple + - 2.216230444179687 + - 5.174628821914063 + - !!python/tuple + - 2.169945044724121 + - 4.813409346789552 + - !!python/tuple + - 2.2334817255694572 + - 4.97839927265564 + - !!python/tuple + - 2.208971914663238 + - 5.035266565818329 + - !!python/tuple + - 2.1955859324202347 + - 4.910121133013268 + - !!python/tuple + - 2.1955859324202347 + - 4.910121133013268 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 2.17562497625 + - 4.52687492875 + - !!python/tuple + - 2.19882810078125 + - 5.957734274843751 + - !!python/tuple + - 2.0267382605078126 + - 5.905527244648438 + - !!python/tuple + - 2.144204078447266 + - 5.229252844248046 + - !!python/tuple + - 2.0424487094091797 + - 5.554338286899414 + - !!python/tuple + - 2.0496959092749787 + - 5.361873958207015 + - !!python/tuple + - 2.0684833024653817 + - 5.391211144427699 + - !!python/tuple + - 2.05076915763968 + - 5.465440419108385 + - !!python/tuple + - 2.05076915763968 + - 5.465440419108385 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 2.17562497625 + - 4.52687492875 + - !!python/tuple + - 2.071210915859375 + - 6.008007711328125 + - !!python/tuple + - 2.2500683341210936 + - 5.817548730800782 + - !!python/tuple + - 2.168132300620117 + - 5.219826574907227 + - !!python/tuple + - 2.14015561661499 + - 5.763347682091065 + - !!python/tuple + - 2.2021061463693234 + - 5.654567929649964 + - !!python/tuple + - 2.1696315910561372 + - 5.464392190388871 + - !!python/tuple + - 2.1956423446390962 + - 5.557768574668098 + - !!python/tuple + - 2.1695927043906247 + - 5.537847449300931 + - !!python/tuple + - 2.1695927043906247 + - 5.537847449300931 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4849999699999996 + - 2.4849999699999996 + - !!python/tuple + - 2.17562497625 + - 4.52687492875 + - !!python/tuple + - 1.893320294453125 + - 5.598085844609374 + - !!python/tuple + - 1.8498144359570312 + - 4.895224530683592 + - !!python/tuple + - 2.023596170727539 + - 4.886765058198241 + - !!python/tuple + - 1.9204057126071166 + - 4.803665847230528 + - !!python/tuple + - 1.9384056950773427 + - 4.929465567360628 + - !!python/tuple + - 1.956302530519776 + - 4.8418488942306075 + - !!python/tuple + - 1.956302530519776 + - 4.8418488942306075 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 480.0 + - 600.0 + - 690.0 + - 750.0 + - 810.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.867950215750366 + - -4.7202380510708615 + - -4.694823847044888 + - -4.655198077345353 + - -4.661967909741396 + - -4.655967863198644 + - -4.6492988520413725 + - -4.651310583758861 + - -4.651310583758861 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 210.0 + - 480.0 + - 600.0 + - 720.0 + - 780.0 + - 840.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.929883734755116 + - -5.3467481102346275 + - -4.652984194166658 + - -4.590499264296341 + - -4.622332659431041 + - -4.610358399371889 + - -4.600552935302669 + - -4.603202646108965 + - -4.603202646108965 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 210.0 + - 300.0 + - 540.0 + - 720.0 + - 780.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.019829971904972 + - -5.3829217502408735 + - -5.279166453444705 + - -4.604291996427448 + - -4.578415056005802 + - -4.603180218321457 + - -4.620152192597657 + - -4.599126482543894 + - -4.599126482543894 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 540.0 + - 660.0 + - 720.0 + - 840.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.734087953656552 + - -4.606668202390721 + - -4.565489048216158 + - -4.545390349729361 + - -4.571777222639254 + - -4.54780930174518 + - -4.553233368761266 + - -4.559581894519441 + - -4.559581894519441 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 840.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.475417795997355 + - -4.540360424246259 + - -4.537699837965463 + - -4.542377764329675 + - -4.539808206043169 + - -4.539808206043169 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 210.0 + - 300.0 + - 360.0 + - 480.0 + - 660.0 + - 720.0 + - 780.0 + - 840.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.3596694505776075 + - -5.146749834259806 + - -4.683818836530865 + - -4.429541155862943 + - -4.3775741479083115 + - -4.378594336349297 + - -4.384614485737898 + - -4.372875154483052 + - -4.3734048950853674 + - -4.371124359027138 + - -4.371124359027138 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 570.0 + - 690.0 + - 750.0 + - 810.0 + - 870.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.881934601716681 + - -4.7251873070916215 + - -4.715875742288187 + - -4.696277779605798 + - -4.726352470687171 + - -4.710413941483059 + - -4.705356459888807 + - -4.705356459888807 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 480.0 + - 540.0 + - 600.0 + - 690.0 + - 870.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.088615711543225 + - -4.82649664895539 + - -4.870798601041617 + - -4.761345408443866 + - -4.763201692787459 + - -4.72546686841366 + - -4.715708447564118 + - -4.725676909868124 + - -4.722128371983504 + - -4.722128371983504 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 480.0 + - 540.0 + - 600.0 + - 660.0 + - 720.0 + - 780.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.694102357619153 + - -4.7148426493318025 + - -4.831096521295991 + - -4.832034339523149 + - -4.717085706181333 + - -4.786011922147847 + - -4.782726250119326 + - -4.7440072471174375 + - -4.764953828796595 + - -4.754338205341492 + - -4.754338205341492 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 480.0 + - 540.0 + - 600.0 + - 720.0 + - 900.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -5.9242974253633385 + - -4.731536971239586 + - -4.667281849494766 + - -4.664347863830486 + - -4.646522980651593 + - -4.652671882310159 + - -4.642859806432569 + - -4.646438448397804 + - -4.646438448397804 +problem_name: PARAMESTI-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.48 + - 0.6 + - 0.69 + - 0.75 + - 0.81 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.26005319461474913 + - 0.014733856065213572 + - 0.009301661554008965 + - 0.0008317961022292755 + - 0.0022788233766611486 + - 0.0009963350538634151 + - -0.00042914204416672456 + - 8.583596464463521e-07 + - 8.583596464463521e-07 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.21 + - 0.48 + - 0.6 + - 0.72 + - 0.78 + - 0.84 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2732912610776354 + - 0.1486481231075991 + - 0.0003585865521893236 + - -0.012997341995784938 + - -0.0061930685215105495 + - -0.008752523450832201 + - -0.010848406054206122 + - -0.010282039919601542 + - -0.010282039919601542 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.21 + - 0.3 + - 0.54 + - 0.72 + - 0.78 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2925169450789758 + - 0.15638010827980414 + - 0.13420278755047776 + - -0.010049195215325359 + - -0.015580297963283557 + - -0.010286833778345855 + - -0.006659135448181532 + - -0.01115330519009053 + - -0.01115330519009053 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.54 + - 0.66 + - 0.72 + - 0.84 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.23144061856632045 + - -0.009541289755135011 + - -0.018343185539653608 + - -0.02263920990031227 + - -0.016999110920919568 + - -0.022122167625458097 + - -0.020962792850506517 + - -0.01960581835142098 + - -0.01960581835142098 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.84 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1761508046806427 + - -0.023714338343176367 + - -0.02428302907125723 + - -0.02328313917136025 + - -0.02383237299375003 + - -0.02383237299375003 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.21 + - 0.3 + - 0.36 + - 0.48 + - 0.66 + - 0.72 + - 0.78 + - 0.84 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.15141001303406726 + - 0.1058992124633597 + - 0.006949380221533246 + - -0.047401557538879625 + - -0.05850931818667998 + - -0.05829125658444155 + - -0.057004471350799564 + - -0.05951371109494478 + - -0.05940048095052158 + - -0.05988793731332792 + - -0.05988793731332792 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.57 + - 0.69 + - 0.75 + - 0.81 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2630423067117146 + - 0.015791741701255604 + - 0.013801428285803061 + - 0.009612434398555463 + - 0.01604079122025422 + - 0.012633988049445915 + - 0.011552969587142973 + - 0.011552969587142973 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.48 + - 0.54 + - 0.6 + - 0.69 + - 0.87 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.30721964900510257 + - 0.0374462483796341 + - 0.046915630962401485 + - 0.023520405542173106 + - 0.023917179630088523 + - 0.015851496926230224 + - 0.013765669641506757 + - 0.0158963925300783 + - 0.015137905347086734 + - 0.015137905347086734 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.48 + - 0.54 + - 0.6 + - 0.66 + - 0.72 + - 0.78 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2228938415317294 + - 0.013580608389909403 + - 0.03842945451331094 + - 0.03862990977922724 + - 0.014060053706941017 + - 0.028792783941920707 + - 0.028090483388233955 + - 0.019814436049855076 + - 0.024291692386891214 + - 0.022022641134808285 + - 0.022022641134808285 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.48 + - 0.54 + - 0.6 + - 0.72 + - 0.9 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2720972075796432 + - 0.017148959527055415 + - 0.0034146588461343927 + - 0.0027875299852356305 + - -0.001022474548775562 + - 0.0002918310185151715 + - -0.0018054648350670141 + - -0.001040543013346868 + - -0.001040543013346868 +solver_name: NELDMD diff --git a/test/expected_results/PARAMESTI1_RNDSRCH.yaml b/test/expected_results/PARAMESTI1_RNDSRCH.yaml new file mode 100644 index 000000000..76b99e21a --- /dev/null +++ b/test/expected_results/PARAMESTI1_RNDSRCH.yaml @@ -0,0 +1,699 @@ +all_est_objectives: +- - -9.3297480290724 + - -4.9139666294486055 + - -4.677525352081667 + - -4.752769831482711 + - -4.752769831482711 +- - -9.021588601147258 + - -6.586783896709451 + - -4.6277315234116285 + - -4.6277315234116285 +- - -9.221874900363291 + - -6.065826226236476 + - -6.7657143898971155 + - -7.0160182931505926 + - -5.572490447286542 + - -4.610682079548275 + - -4.90236834271688 + - -4.607834636416828 + - -4.610306220169427 + - -4.610306220169427 +- - -9.024800808326528 + - -7.5586770984901 + - -6.661370916817069 + - -4.852303832839037 + - -4.683148741809484 + - -4.678724710010372 + - -4.678724710010372 +- - -9.13630921975174 + - -8.420165790632925 + - -6.9820640775551315 + - -5.712573689761196 + - -4.922272142404696 + - -4.6561975594762695 + - -4.643841238670722 + - -4.643841238670722 +- - -8.424449086285406 + - -6.216714615074481 + - -6.663270598308714 + - -5.1766946753005785 + - -5.473298954487285 + - -5.9457375951469835 + - -5.57340485439436 + - -4.626752002311564 + - -4.471162435037758 + - -4.471162435037758 +- - -9.11642083853037 + - -11.258431544661484 + - -7.408425690208477 + - -7.715484034640367 + - -5.192749018720189 + - -4.831869458853549 + - -4.831869458853549 +- - -9.025313812446148 + - -8.30837461693214 + - -9.945189528244288 + - -5.937607083362692 + - -5.207401475031656 + - -5.029505292936013 + - -4.834546067797007 + - -4.834546067797007 +- - -9.167759709525823 + - -6.81361722405467 + - -5.190625919529371 + - -5.416720086087675 + - -4.971809794036174 + - -4.971809794036174 +- - -9.203555672298497 + - -6.083970987489381 + - -5.070771796791368 + - -5.200510320169485 + - -5.200510320169485 +all_intermediate_budgets: +- - 0 + - 30 + - 70 + - 140 + - 1000 +- - 0 + - 30 + - 40 + - 1000 +- - 0 + - 30 + - 70 + - 230 + - 260 + - 330 + - 490 + - 920 + - 950 + - 1000 +- - 0 + - 20 + - 140 + - 150 + - 280 + - 700 + - 1000 +- - 0 + - 20 + - 40 + - 70 + - 160 + - 290 + - 580 + - 1000 +- - 0 + - 30 + - 90 + - 120 + - 130 + - 170 + - 240 + - 270 + - 280 + - 1000 +- - 0 + - 30 + - 60 + - 90 + - 150 + - 420 + - 1000 +- - 0 + - 20 + - 30 + - 40 + - 60 + - 310 + - 660 + - 1000 +- - 0 + - 20 + - 240 + - 780 + - 960 + - 1000 +- - 0 + - 70 + - 100 + - 740 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.4113681969383234 + - 4.318464516345555 + - !!python/tuple + - 1.926850322118231 + - 5.518432243083116 + - !!python/tuple + - 1.8335257714086588 + - 4.421207443720462 + - !!python/tuple + - 1.8335257714086588 + - 4.421207443720462 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.7671853413978944 + - 8.793537060533582 + - !!python/tuple + - 1.8238893372167329 + - 4.647975737037824 + - !!python/tuple + - 1.8238893372167329 + - 4.647975737037824 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.998069279500845 + - 4.170376173532159 + - !!python/tuple + - 1.0691241703410232 + - 8.57228763192795 + - !!python/tuple + - 1.2508345745442417 + - 9.870697642375042 + - !!python/tuple + - 1.513793527560554 + - 8.200691640526955 + - !!python/tuple + - 2.067354669750149 + - 4.902396919950507 + - !!python/tuple + - 1.634378629818269 + - 6.7555156515788415 + - !!python/tuple + - 2.1040986388112692 + - 5.250778883849738 + - !!python/tuple + - 2.110124972883145 + - 5.3495508527631355 + - !!python/tuple + - 2.110124972883145 + - 5.3495508527631355 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.0155504388116512 + - 1.9046428891517506 + - !!python/tuple + - 2.3057927322352514 + - 1.5023677912290445 + - !!python/tuple + - 2.3112392099894947 + - 6.447737434699523 + - !!python/tuple + - 2.316519693782576 + - 5.50220301529817 + - !!python/tuple + - 1.8012368987214926 + - 4.157777887889603 + - !!python/tuple + - 1.8012368987214926 + - 4.157777887889603 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.2858672849508923 + - 0.9037923294791962 + - !!python/tuple + - 3.6408893489290457 + - 6.190815109989965 + - !!python/tuple + - 2.531722107645636 + - 8.10740335244683 + - !!python/tuple + - 2.614549844182648 + - 5.925052174276405 + - !!python/tuple + - 1.860375892780299 + - 4.217514228784236 + - !!python/tuple + - 1.9703032648710255 + - 5.769749555133261 + - !!python/tuple + - 1.9703032648710255 + - 5.769749555133261 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 3.3183198378445877 + - 5.472627408804023 + - !!python/tuple + - 0.9640260783064701 + - 7.31223616037637 + - !!python/tuple + - 2.40758780168329 + - 2.6346541621973896 + - !!python/tuple + - 2.4699074515469257 + - 7.628763803835695 + - !!python/tuple + - 1.5567598637207534 + - 8.460953527055294 + - !!python/tuple + - 1.5533405918848802 + - 7.83305806517044 + - !!python/tuple + - 2.340478342985617 + - 5.731474312871381 + - !!python/tuple + - 2.042242430054216 + - 5.657577207725509 + - !!python/tuple + - 2.042242430054216 + - 5.657577207725509 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 4.527815174005356 + - 6.971020440727531 + - !!python/tuple + - 2.418986025254497 + - 1.1964182808657648 + - !!python/tuple + - 3.6256504790939625 + - 6.459370152919783 + - !!python/tuple + - 2.5605649494793057 + - 6.228412361864413 + - !!python/tuple + - 2.1456882812555795 + - 3.9313017447736964 + - !!python/tuple + - 2.1456882812555795 + - 3.9313017447736964 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 0.6578676336995484 + - 2.8637598553584076 + - !!python/tuple + - 3.7938722500636772 + - 9.122615619097846 + - !!python/tuple + - 1.2569842204574306 + - 2.970262204579669 + - !!python/tuple + - 1.8969748412889353 + - 3.0981233762366847 + - !!python/tuple + - 2.395060817332159 + - 4.669572055263209 + - !!python/tuple + - 2.0889145155889493 + - 6.162766039873318 + - !!python/tuple + - 2.0889145155889493 + - 6.162766039873318 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.7218048328849036 + - 9.602482721795422 + - !!python/tuple + - 1.7973545568878178 + - 6.867724390697357 + - !!python/tuple + - 2.4142837612123746 + - 7.282372642618956 + - !!python/tuple + - 2.420635437823872 + - 5.960116426624407 + - !!python/tuple + - 2.420635437823872 + - 5.960116426624407 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.2989873956398523 + - 7.993845434677753 + - !!python/tuple + - 2.5023846930582114 + - 4.267474222866501 + - !!python/tuple + - 1.5866377463845192 + - 3.4663955975347864 + - !!python/tuple + - 1.5866377463845192 + - 3.4663955975347864 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 70.0 + - 140.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -4.9139666294486055 + - -4.677525352081667 + - -4.752769831482711 + - -4.752769831482711 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 40.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.586783896709451 + - -4.6277315234116285 + - -4.6277315234116285 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 70.0 + - 230.0 + - 260.0 + - 330.0 + - 490.0 + - 920.0 + - 950.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.065826226236476 + - -6.7657143898971155 + - -7.0160182931505926 + - -5.572490447286542 + - -4.610682079548275 + - -4.90236834271688 + - -4.607834636416828 + - -4.610306220169427 + - -4.610306220169427 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 140.0 + - 150.0 + - 280.0 + - 700.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.5586770984901 + - -6.661370916817069 + - -4.852303832839037 + - -4.683148741809484 + - -4.678724710010372 + - -4.678724710010372 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 70.0 + - 160.0 + - 290.0 + - 580.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.420165790632925 + - -6.9820640775551315 + - -5.712573689761196 + - -4.922272142404696 + - -4.6561975594762695 + - -4.643841238670722 + - -4.643841238670722 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 90.0 + - 120.0 + - 130.0 + - 170.0 + - 240.0 + - 270.0 + - 280.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.216714615074481 + - -6.663270598308714 + - -5.1766946753005785 + - -5.473298954487285 + - -5.9457375951469835 + - -5.57340485439436 + - -4.626752002311564 + - -4.471162435037758 + - -4.471162435037758 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 60.0 + - 90.0 + - 150.0 + - 420.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -11.258431544661484 + - -7.408425690208477 + - -7.715484034640367 + - -5.192749018720189 + - -4.831869458853549 + - -4.831869458853549 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 60.0 + - 310.0 + - 660.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.30837461693214 + - -9.945189528244288 + - -5.937607083362692 + - -5.207401475031656 + - -5.029505292936013 + - -4.834546067797007 + - -4.834546067797007 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 240.0 + - 780.0 + - 960.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.81361722405467 + - -5.190625919529371 + - -5.416720086087675 + - -4.971809794036174 + - -4.971809794036174 +- !!python/tuple + - !!python/tuple + - 0.0 + - 70.0 + - 100.0 + - 740.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.083970987489381 + - -5.070771796791368 + - -5.200510320169485 + - -5.200510320169485 +problem_name: PARAMESTI-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.07 + - 0.14 + - 1.0 + - !!python/tuple + - 1.0 + - 0.05614264144568514 + - 0.005604170603858714 + - 0.021687406875317804 + - 0.021687406875317804 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4137013030577352 + - -0.005039080804558551 + - -0.005039080804558551 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.07 + - 0.23 + - 0.26 + - 0.33 + - 0.49 + - 0.92 + - 0.95 + - 1.0 + - !!python/tuple + - 1.0 + - 0.30234847865996883 + - 0.4519470510649436 + - 0.5054486082255379 + - 0.19689973401883 + - -0.00868333797975651 + - 0.05366354945999608 + - -0.009291968686183755 + - -0.00876367656729113 + - -0.00876367656729113 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.14 + - 0.15 + - 0.28 + - 0.7 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6214399719845375 + - 0.42964400977487743 + - 0.04296244091901553 + - 0.006806149890032407 + - 0.005860529038324058 + - 0.005860529038324058 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.04 + - 0.07 + - 0.16 + - 0.29 + - 0.58 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8055800749025879 + - 0.49819101702176005 + - 0.22684202220164507 + - 0.057917914904838184 + - 0.001045431805321295 + - -0.0015956872314967336 + - -0.0015956872314967336 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.09 + - 0.12 + - 0.13 + - 0.17 + - 0.24 + - 0.27 + - 0.28 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3346003279334154 + - 0.4300500598467744 + - 0.11229981430689306 + - 0.17569790994471665 + - 0.2766799665949946 + - 0.1970951852423669 + - -0.005248449909250613 + - -0.03850515912908981 + - -0.03850515912908981 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.06 + - 0.09 + - 0.15 + - 0.42 + - 1.0 + - !!python/tuple + - 1.0 + - 1.412249149984248 + - 0.5893242750091753 + - 0.6549568894140089 + - 0.11573137234883972 + - 0.03859466713037267 + - 0.03859466713037267 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.04 + - 0.06 + - 0.31 + - 0.66 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7816851144482729 + - 1.131548402238067 + - 0.2749420990055641 + - 0.1188632820741834 + - 0.08083861433497054 + - 0.039166782644847624 + - 0.039166782644847624 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.24 + - 0.78 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.46218610921194936 + - 0.11527756754899947 + - 0.16360438074913697 + - 0.06850640939459136 + - 0.06850640939459136 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.07 + - 0.1 + - 0.74 + - 1.0 + - !!python/tuple + - 1.0 + - 0.306226855979377 + - 0.08965918079892757 + - 0.1173903225598942 + - 0.1173903225598942 +solver_name: RNDSRCH diff --git a/test/expected_results/PARAMESTI1_SPSA.yaml b/test/expected_results/PARAMESTI1_SPSA.yaml new file mode 100644 index 000000000..448dffb74 --- /dev/null +++ b/test/expected_results/PARAMESTI1_SPSA.yaml @@ -0,0 +1,861 @@ +all_est_objectives: +- - -9.3297480290724 + - -8.912024860676235 + - -8.616526224237235 + - -8.443719327695721 + - -8.232193209664235 + - -8.228009166427567 + - -8.160170853499398 + - -8.105784880491006 + - -8.10930873345766 + - -8.10930873345766 +- - -9.021588601147258 + - -8.392469263201098 + - -7.959471621929607 + - -7.640739990084552 + - -7.631317117055995 + - -7.625722966039507 + - -7.625722966039507 +- - -9.221874900363291 + - -8.806344065323719 + - -8.485447325685637 + - -8.23084178465483 + - -8.02217830791484 + - -7.8644667565957995 + - -7.751381824981025 + - -7.664541556819798 + - -7.664541556819798 +- - -9.024800808326528 + - -7.9710658404012324 + - -7.838086450664579 + - -7.837371083533701 + - -7.837371083533701 +- - -9.13630921975174 + - -8.703653100981613 + - -8.369430874576977 + - -8.112279411876015 + - -7.821496526487987 + - -7.808376132131774 + - -7.798870629154784 + - -7.7922977695566695 + - -7.788146725999574 + - -7.723131811991301 + - -7.723131811991301 +- - -8.424449086285406 + - -8.012019934421104 + - -7.691393862466139 + - -7.437463086933672 + - -7.230104226340734 + - -7.056556186827816 + - -6.908503780358809 + - -6.90272107541902 + - -6.90272107541902 +- - -9.11642083853037 + - -8.975612946501688 + - -8.940939019242343 + - -8.815468436680709 + - -8.852051298986865 + - -8.677677575151254 + - -8.721652294625562 + - -8.673171032337592 + - -8.673171032337592 +- - -9.025313812446148 + - -8.499846023831314 + - -7.606226502466273 + - -7.524970244859174 + - -7.466630451801584 + - -7.479493425280383 + - -7.479493425280383 +- - -9.167759709525823 + - -8.614024109767424 + - -8.130489868451177 + - -7.747551095737505 + - -7.683917137891253 + - -7.699359981228662 + - -7.7677353029032865 + - -7.868633985220929 + - -8.065430277494448 + - -8.065430277494448 +- - -9.203555672298497 + - -8.65433225386843 + - -8.584450769348903 + - -8.549979530858266 + - -8.390618244785934 + - -8.392066306922947 + - -8.399868116410529 + - -8.41249600352193 + - -8.244759226033 + - -8.260930203574858 + - -8.260930203574858 +all_intermediate_budgets: +- - 0 + - 210 + - 330 + - 450 + - 630 + - 690 + - 810 + - 930 + - 990 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 510 + - 630 + - 810 + - 1000 +- - 0 + - 450 + - 570 + - 630 + - 1000 +- - 0 + - 210 + - 270 + - 390 + - 570 + - 630 + - 690 + - 750 + - 810 + - 930 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 570 + - 1000 +- - 0 + - 210 + - 270 + - 390 + - 450 + - 690 + - 750 + - 930 + - 1000 +- - 0 + - 210 + - 570 + - 690 + - 810 + - 870 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 570 + - 630 + - 690 + - 810 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 450 + - 510 + - 570 + - 630 + - 870 + - 930 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.0730633963883887 + - 1.0730633963883887 + - !!python/tuple + - 1.1805715652878457 + - 1.049089776197757 + - !!python/tuple + - 1.2524913870438799 + - 1.0361844323726819 + - !!python/tuple + - 1.328572051408539 + - 1.0487953467548086 + - !!python/tuple + - 1.3513708813772705 + - 1.0259965167860772 + - !!python/tuple + - 1.3886982244185373 + - 1.0207014419585896 + - !!python/tuple + - 1.4209979807504574 + - 1.0162059758668376 + - !!python/tuple + - 1.4372085985583558 + - 0.999995358058939 + - !!python/tuple + - 1.4372085985583558 + - 0.999995358058939 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.1193169611955687 + - 1.1193169611955687 + - !!python/tuple + - 1.2136590735199597 + - 1.2136590735199597 + - !!python/tuple + - 1.2915792151512941 + - 1.2915792151512941 + - !!python/tuple + - 1.3163133639980131 + - 1.2668450663045752 + - !!python/tuple + - 1.3380252596958442 + - 1.245133170606744 + - !!python/tuple + - 1.3380252596958442 + - 1.245133170606744 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.0745392310831705 + - 1.0745392310831705 + - !!python/tuple + - 1.13738099367939 + - 1.13738099367939 + - !!python/tuple + - 1.1911524060782868 + - 1.1911524060782868 + - !!python/tuple + - 1.23824741327678 + - 1.23824741327678 + - !!python/tuple + - 1.300838484388867 + - 1.244510362121538 + - !!python/tuple + - 1.3494254815774906 + - 1.2506909348353845 + - !!python/tuple + - 1.4032643555340354 + - 1.2425407030788798 + - !!python/tuple + - 1.4032643555340354 + - 1.2425407030788798 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.2937596768617545 + - 1.0946389662756095 + - !!python/tuple + - 1.352998317523935 + - 1.0973875248786362 + - !!python/tuple + - 1.375207414328079 + - 1.0751784280744923 + - !!python/tuple + - 1.375207414328079 + - 1.0751784280744923 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.0757440256108675 + - 1.0757440256108675 + - !!python/tuple + - 1.1392822819785051 + - 1.1392822819785051 + - !!python/tuple + - 1.2295567245212893 + - 1.1309320806415393 + - !!python/tuple + - 1.3233583762926442 + - 1.1552821600558072 + - !!python/tuple + - 1.3471574728162425 + - 1.1314830635322088 + - !!python/tuple + - 1.3692444110565627 + - 1.1093961252918887 + - !!python/tuple + - 1.3898901791159637 + - 1.0887503572324877 + - !!python/tuple + - 1.4093034190941822 + - 1.0693371172542692 + - !!python/tuple + - 1.443523309704177 + - 1.0668667429837633 + - !!python/tuple + - 1.443523309704177 + - 1.0668667429837633 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.0796222219458678 + - 1.0796222219458678 + - !!python/tuple + - 1.1475538029875172 + - 1.1475538029875172 + - !!python/tuple + - 1.205874201033764 + - 1.205874201033764 + - !!python/tuple + - 1.2570088619352995 + - 1.2570088619352995 + - !!python/tuple + - 1.302637041456653 + - 1.302637041456653 + - !!python/tuple + - 1.3439145741725413 + - 1.3439145741725413 + - !!python/tuple + - 1.3612590029341 + - 1.3265701454109826 + - !!python/tuple + - 1.3612590029341 + - 1.3265701454109826 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.124972388127519 + - 0.8750276118724809 + - !!python/tuple + - 1.2171416936373776 + - 0.7828583063626225 + - !!python/tuple + - 1.3206108928739766 + - 0.7367952268816605 + - !!python/tuple + - 1.3745167329233412 + - 0.6828893868322958 + - !!python/tuple + - 1.4724842473176212 + - 0.6842563637316478 + - !!python/tuple + - 1.5053672227876727 + - 0.6513733882615962 + - !!python/tuple + - 1.5590271782392187 + - 0.6431935427271662 + - !!python/tuple + - 1.5590271782392187 + - 0.6431935427271662 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.1 + - 1.1 + - !!python/tuple + - 1.3981068340246212 + - 1.2156178806199396 + - !!python/tuple + - 1.4546376721887446 + - 1.2128205093609163 + - !!python/tuple + - 1.5014368713169834 + - 1.2105899293501294 + - !!python/tuple + - 1.522337058602577 + - 1.1896897420645358 + - !!python/tuple + - 1.522337058602577 + - 1.1896897420645358 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.1 + - 1.1 + - !!python/tuple + - 1.1985654273148323 + - 1.1985654273148323 + - !!python/tuple + - 1.2862280522339695 + - 1.2862280522339695 + - !!python/tuple + - 1.425766006028836 + - 1.146690098439103 + - !!python/tuple + - 1.5511660400211125 + - 1.0271143689670317 + - !!python/tuple + - 1.6425912473413449 + - 0.9356891616467992 + - !!python/tuple + - 1.7274391282551507 + - 0.8508412807329935 + - !!python/tuple + - 1.7854430541848345 + - 0.7502220737849604 + - !!python/tuple + - 1.7854430541848345 + - 0.7502220737849604 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 1.1 + - 1.1 + - !!python/tuple + - 1.1690717861244158 + - 1.0309282138755844 + - !!python/tuple + - 1.2251016190343054 + - 0.9748983809656948 + - !!python/tuple + - 1.3049502996555016 + - 0.9592985531012901 + - !!python/tuple + - 1.340384108117733 + - 0.9238647446390587 + - !!python/tuple + - 1.3726100598347148 + - 0.8916387929220767 + - !!python/tuple + - 1.4022524779347325 + - 0.8619963748220592 + - !!python/tuple + - 1.475375980292931 + - 0.8801001198361377 + - !!python/tuple + - 1.495289175958094 + - 0.8601869241709746 + - !!python/tuple + - 1.495289175958094 + - 0.8601869241709746 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 330.0 + - 450.0 + - 630.0 + - 690.0 + - 810.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.912024860676235 + - -8.616526224237235 + - -8.443719327695721 + - -8.232193209664235 + - -8.228009166427567 + - -8.160170853499398 + - -8.105784880491006 + - -8.10930873345766 + - -8.10930873345766 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.392469263201098 + - -7.959471621929607 + - -7.640739990084552 + - -7.631317117055995 + - -7.625722966039507 + - -7.625722966039507 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 510.0 + - 630.0 + - 810.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.806344065323719 + - -8.485447325685637 + - -8.23084178465483 + - -8.02217830791484 + - -7.8644667565957995 + - -7.751381824981025 + - -7.664541556819798 + - -7.664541556819798 +- !!python/tuple + - !!python/tuple + - 0.0 + - 450.0 + - 570.0 + - 630.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.9710658404012324 + - -7.838086450664579 + - -7.837371083533701 + - -7.837371083533701 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 390.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 810.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.703653100981613 + - -8.369430874576977 + - -8.112279411876015 + - -7.821496526487987 + - -7.808376132131774 + - -7.798870629154784 + - -7.7922977695566695 + - -7.788146725999574 + - -7.723131811991301 + - -7.723131811991301 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 570.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.012019934421104 + - -7.691393862466139 + - -7.437463086933672 + - -7.230104226340734 + - -7.056556186827816 + - -6.908503780358809 + - -6.90272107541902 + - -6.90272107541902 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 390.0 + - 450.0 + - 690.0 + - 750.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.975612946501688 + - -8.940939019242343 + - -8.815468436680709 + - -8.852051298986865 + - -8.677677575151254 + - -8.721652294625562 + - -8.673171032337592 + - -8.673171032337592 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 570.0 + - 690.0 + - 810.0 + - 870.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.499846023831314 + - -7.606226502466273 + - -7.524970244859174 + - -7.466630451801584 + - -7.479493425280383 + - -7.479493425280383 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 570.0 + - 630.0 + - 690.0 + - 810.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.614024109767424 + - -8.130489868451177 + - -7.747551095737505 + - -7.683917137891253 + - -7.699359981228662 + - -7.7677353029032865 + - -7.868633985220929 + - -8.065430277494448 + - -8.065430277494448 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 450.0 + - 510.0 + - 570.0 + - 630.0 + - 870.0 + - 930.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -8.65433225386843 + - -8.584450769348903 + - -8.549979530858266 + - -8.390618244785934 + - -8.392066306922947 + - -8.399868116410529 + - -8.41249600352193 + - -8.244759226033 + - -8.260930203574858 + - -8.260930203574858 +problem_name: PARAMESTI-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.33 + - 0.45 + - 0.63 + - 0.69 + - 0.81 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9107131783373756 + - 0.8475514098518528 + - 0.810614558556737 + - 0.7654016132222021 + - 0.7645072890607355 + - 0.7500070941791189 + - 0.7383822884696515 + - 0.7391354993403985 + - 0.7391354993403985 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7996600419894645 + - 0.7071083568028796 + - 0.6389806192870211 + - 0.6369665141396322 + - 0.6357707845226211 + - 0.6357707845226211 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.51 + - 0.63 + - 0.81 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8881242892316236 + - 0.8195337677286126 + - 0.7651127509973261 + - 0.7205116849211509 + - 0.6868014092598206 + - 0.6626299127144278 + - 0.6440681183896936 + - 0.6440681183896936 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.45 + - 0.57 + - 0.63 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7095865792126352 + - 0.68116271394845 + - 0.6810098068025924 + - 0.6810098068025924 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.39 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 0.81 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8661744657282243 + - 0.7947356694573543 + - 0.7397704711452306 + - 0.6776166774500697 + - 0.674812240445715 + - 0.6727804734446682 + - 0.6713755483958528 + - 0.6704882777969553 + - 0.6565915742582086 + - 0.6565915742582086 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.57 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7183403692002635 + - 0.6498077019389624 + - 0.5955309139009173 + - 0.5512087048240012 + - 0.5141134368900183 + - 0.48246776862633306 + - 0.48123173628781346 + - 0.48123173628781346 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.39 + - 0.45 + - 0.69 + - 0.75 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9243049024947014 + - 0.916893475516795 + - 0.8900745907225919 + - 0.89789404568646 + - 0.8606222907044808 + - 0.8700217284958813 + - 0.8596590334208034 + - 0.8596590334208034 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.57 + - 0.69 + - 0.81 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8226114375606285 + - 0.6316034857041266 + - 0.6142352535091227 + - 0.6017653330147265 + - 0.6045147472343452 + - 0.6045147472343452 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.57 + - 0.63 + - 0.69 + - 0.81 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8470165919021967 + - 0.7436628906029883 + - 0.6618111081455617 + - 0.6482095790091247 + - 0.6515104311125048 + - 0.6661254096781581 + - 0.687692139358675 + - 0.7297566375275363 + - 0.7297566375275363 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.45 + - 0.51 + - 0.57 + - 0.63 + - 0.87 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8556323124228374 + - 0.8406953969776855 + - 0.8333272939935477 + - 0.7992643934747709 + - 0.799573911537368 + - 0.8012415201956047 + - 0.803940685551504 + - 0.7680875539298612 + - 0.7715440420950588 + - 0.7715440420950588 +solver_name: SPSA diff --git a/test/expected_results/PARAMESTI1_STRONG.yaml b/test/expected_results/PARAMESTI1_STRONG.yaml new file mode 100644 index 000000000..9f453f393 --- /dev/null +++ b/test/expected_results/PARAMESTI1_STRONG.yaml @@ -0,0 +1,501 @@ +all_est_objectives: +- - -9.3297480290724 + - -6.64433315459862 + - -5.661188090912796 + - -4.943885720610079 + - -4.943885720610079 +- - -9.021588601147258 + - -6.891456894957851 + - -5.288299586606307 + - -4.904422103074254 + - -4.904422103074254 +- - -9.221874900363291 + - -7.213709448468816 + - -5.319836437443148 + - -4.96711185378729 + - -4.96711185378729 +- - -9.024800808326528 + - -6.428837743153482 + - -5.0703017728322575 + - -5.0703017728322575 +- - -9.13630921975174 + - -6.308322406631954 + - -4.952435739635593 + - -4.713537605180783 + - -4.713537605180783 +- - -8.424449086285406 + - -6.042843047057676 + - -5.054085528226357 + - -4.512438926083051 + - -4.512438926083051 +- - -9.11642083853037 + - -6.963505403680768 + - -5.176883308136016 + - -5.176883308136016 +- - -9.025313812446148 + - -7.329276379718164 + - -4.952466649175628 + - -5.320373350152129 + - -4.795445127025609 + - -4.795445127025609 +- - -9.167759709525823 + - -6.798056975702029 + - -5.000556998946068 + - -5.044211783584297 + - -5.044211783584297 +- - -9.203555672298497 + - -6.6563065744646375 + - -4.985816370439636 + - -4.985816370439636 +all_intermediate_budgets: +- - 10 + - 60 + - 115 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 1000 +- - 10 + - 60 + - 115 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 1000 +- - 10 + - 60 + - 115 + - 640 + - 735 + - 1000 +- - 10 + - 60 + - 115 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.7235752627097733 + - 2.014538473284743 + - !!python/tuple + - 1.3528970774056803 + - 3.4709866571661605 + - !!python/tuple + - 1.981579189502094 + - 3.5733397319894196 + - !!python/tuple + - 1.981579189502094 + - 3.5733397319894196 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.757989242641407 + - 1.9536633697259698 + - !!python/tuple + - 1.445259281436565 + - 3.4625503929835544 + - !!python/tuple + - 2.0608287204410662 + - 3.5756718108043257 + - !!python/tuple + - 2.0608287204410662 + - 3.5756718108043257 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.8048422954247303 + - 1.8617100954764259 + - !!python/tuple + - 1.4981778515222535 + - 3.3758527674334085 + - !!python/tuple + - 2.0448355816264945 + - 3.5249846667978666 + - !!python/tuple + - 2.0448355816264945 + - 3.5249846667978666 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.7004220444998888 + - 2.052884072715899 + - !!python/tuple + - 1.5320420740412382 + - 3.676117957475283 + - !!python/tuple + - 1.5320420740412382 + - 3.676117957475283 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.772876978697469 + - 1.9256928315616009 + - !!python/tuple + - 1.6943491754237276 + - 3.60996649625078 + - !!python/tuple + - 2.2694427147826253 + - 3.709496596194767 + - !!python/tuple + - 2.2694427147826253 + - 3.709496596194767 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.712570773694229 + - 2.0330059753400995 + - !!python/tuple + - 1.3801142052728335 + - 3.524501698857495 + - !!python/tuple + - 1.959940808140287 + - 3.6269720239479293 + - !!python/tuple + - 1.959940808140287 + - 3.6269720239479293 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.7981823398505754 + - 1.8755228567259163 + - !!python/tuple + - 2.5177076844347854 + - 3.85575869310233 + - !!python/tuple + - 2.5177076844347854 + - 3.85575869310233 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.8136032050021926 + - 1.84311530338725 + - !!python/tuple + - 1.9165776781031663 + - 3.6306681568971886 + - !!python/tuple + - 2.4670227812032044 + - 3.7840300914062803 + - !!python/tuple + - 2.184580223481484 + - 5.335445209957497 + - !!python/tuple + - 2.184580223481484 + - 5.335445209957497 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.830445762421378 + - 1.8058959677487039 + - !!python/tuple + - 1.801443558738546 + - 3.5208754034317895 + - !!python/tuple + - 2.453056849547389 + - 3.65960959879201 + - !!python/tuple + - 2.453056849547389 + - 3.65960959879201 +- - !!python/tuple + - 1.0 + - 1.0 + - !!python/tuple + - 2.702386709915425 + - 2.04970447741416 + - !!python/tuple + - 1.6796825368233415 + - 3.768447091751757 + - !!python/tuple + - 1.6796825368233415 + - 3.768447091751757 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 640.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.64433315459862 + - -5.661188090912796 + - -4.943885720610079 + - -4.943885720610079 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 640.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.891456894957851 + - -5.288299586606307 + - -4.904422103074254 + - -4.904422103074254 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 640.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.213709448468816 + - -5.319836437443148 + - -4.96711185378729 + - -4.96711185378729 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.428837743153482 + - -5.0703017728322575 + - -5.0703017728322575 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 640.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.308322406631954 + - -4.952435739635593 + - -4.713537605180783 + - -4.713537605180783 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 640.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.042843047057676 + - -5.054085528226357 + - -4.512438926083051 + - -4.512438926083051 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.963505403680768 + - -5.176883308136016 + - -5.176883308136016 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 640.0 + - 735.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -7.329276379718164 + - -4.952466649175628 + - -5.320373350152129 + - -4.795445127025609 + - -4.795445127025609 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 640.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.798056975702029 + - -5.000556998946068 + - -5.044211783584297 + - -5.044211783584297 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 1000.0 + - !!python/tuple + - -9.3297480290724 + - -6.6563065744646375 + - -4.985816370439636 + - -4.985816370439636 +problem_name: PARAMESTI-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.426002249509174 + - 0.21585853565475338 + - 0.06253773934532754 + - 0.06253773934532754 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.47882405831325064 + - 0.13615496184560227 + - 0.054102533334102754 + - 0.054102533334102754 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5477043801448874 + - 0.1428958500450313 + - 0.0675022415989809 + - 0.0675022415989809 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 1.0 + - !!python/tuple + - 1.0 + - 0.37994088201382853 + - 0.08955871487175535 + - 0.08955871487175535 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3541811632007132 + - 0.06436527509555703 + - 0.013301659906344828 + - 0.013301659906344828 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.29743590694780697 + - 0.08609255103477279 + - -0.02968245793928011 + - -0.02968245793928011 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 1.0 + - !!python/tuple + - 1.0 + - 0.49422416737136304 + - 0.11234013389558652 + - 0.11234013389558652 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.64 + - 0.735 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5724063951664033 + - 0.06437188189833357 + - 0.143010613201404 + - 0.03080909748483842 + - 0.03080909748483842 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.45886016220972153 + - 0.07465102083173891 + - 0.08398207370505525 + - 0.08398207370505525 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4285615248502414 + - 0.07150026461751684 + - 0.07150026461751684 +solver_name: STRONG diff --git a/test/expected_results/RMITD1_RNDSRCH.yaml b/test/expected_results/RMITD1_RNDSRCH.yaml new file mode 100644 index 000000000..7687bf7eb --- /dev/null +++ b/test/expected_results/RMITD1_RNDSRCH.yaml @@ -0,0 +1,849 @@ +all_est_objectives: +- - 4623.9086779196805 + - 5045.137040795801 + - 5047.792790840968 + - 6145.89906859654 + - 5464.526949614165 + - 6346.421126172966 + - 6346.421126172966 +- - 3599.750089189216 + - 4367.434627751413 + - 4454.881008809493 + - 298.41705391716073 + - 1125.0002479370141 + - 1355.2718465915043 + - 1355.2718465915043 +- - 3468.2265138786647 + - 3837.8471556437894 + - 727.4208805334198 + - 727.4208805334198 +- - 3447.4408084158763 + - 4154.022755953219 + - 4297.10848016509 + - 5094.783912775001 + - 4309.790379022121 + - 5004.851524333924 + - 5840.098997823016 + - 5840.098997823016 +- - 3593.529465588236 + - 4787.570737603875 + - 4785.372949123558 + - 5640.791588256094 + - 4091.374304792376 + - 5038.8774760433 + - 5459.531065200089 + - 4573.338571632367 + - 4573.338571632367 +- - 1687.229142574786 + - -2001.0117340067914 + - -1520.8871107874068 + - 878.0404242693552 + - 1194.160063822785 + - 1332.0720730335056 + - 1332.0720730335056 +- - 4318.787709810091 + - 4448.099411047704 + - 4445.741309257204 + - 5032.434640094703 + - 4891.1751749832065 + - 5216.957115095141 + - 5419.665048721934 + - 5419.665048721934 +- - 3361.824928108058 + - 4846.553105572239 + - 4584.868876403944 + - 5060.177347740511 + - 4815.600694555556 + - 5391.257569651006 + - 5451.311393161031 + - 5451.311393161031 +- - 2944.4879781391846 + - 3882.5484080748956 + - 2207.8632893811937 + - 3105.2427220035065 + - 4716.497997060296 + - 5038.762212704685 + - 4183.8635488933905 + - 4665.243432846848 + - 4474.210326119698 + - 4509.539699936045 + - 4509.539699936045 +- - 4635.436790453269 + - 1090.7779633076855 + - 2419.2857430021304 + - 3352.3964873681634 + - 6703.765593268022 + - 4304.266327355488 + - 5607.234038798578 + - 6323.861695206392 + - 6323.861695206392 +all_intermediate_budgets: +- - 0 + - 60 + - 470 + - 640 + - 3820 + - 6890 + - 10000 +- - 0 + - 40 + - 80 + - 100 + - 560 + - 3000 + - 10000 +- - 0 + - 40 + - 1520 + - 10000 +- - 0 + - 80 + - 90 + - 120 + - 2410 + - 2530 + - 3830 + - 10000 +- - 0 + - 170 + - 370 + - 620 + - 1100 + - 2410 + - 3180 + - 9900 + - 10000 +- - 0 + - 40 + - 60 + - 170 + - 2210 + - 2610 + - 10000 +- - 0 + - 40 + - 510 + - 1960 + - 4970 + - 5590 + - 8240 + - 10000 +- - 0 + - 80 + - 940 + - 1420 + - 1790 + - 2090 + - 4280 + - 10000 +- - 0 + - 50 + - 170 + - 290 + - 340 + - 510 + - 780 + - 1940 + - 3680 + - 7980 + - 10000 +- - 0 + - 80 + - 130 + - 190 + - 240 + - 980 + - 2350 + - 4640 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 175.08312738903112 + - 53.492317145318246 + - 0.5331458316404216 + - !!python/tuple + - 166.4121454613577 + - 30.632435756629945 + - 8.620546616863853 + - !!python/tuple + - 140.52437241866008 + - 11.884035093681723 + - 2.659614047314907 + - !!python/tuple + - 156.02410134231044 + - 34.125807811079554 + - 7.328905985786684 + - !!python/tuple + - 137.76632194765725 + - 29.45593607771087 + - 0.5305126566315611 + - !!python/tuple + - 137.76632194765725 + - 29.45593607771087 + - 0.5305126566315611 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 74.67673442623595 + - 61.807044282524195 + - 3.8593686657838253 + - !!python/tuple + - 124.39646354747573 + - 11.170866834824043 + - 6.58037494139699 + - !!python/tuple + - 196.8124005796805 + - 142.57180552346063 + - 5.375621960994175 + - !!python/tuple + - 196.01101488114594 + - 99.4937594269174 + - 0.8546394709881885 + - !!python/tuple + - 199.60318298951304 + - 16.12808610187888 + - 0.4920994635570534 + - !!python/tuple + - 199.60318298951304 + - 16.12808610187888 + - 0.4920994635570534 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 128.0789472256836 + - 103.57650517111483 + - 2.1196934489757373 + - !!python/tuple + - 180.03116362879098 + - 153.774543848146 + - 0.676706233237613 + - !!python/tuple + - 180.03116362879098 + - 153.774543848146 + - 0.676706233237613 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 73.54768586762218 + - 59.0969318738584 + - 4.855643447948116 + - !!python/tuple + - 103.95805487019834 + - 16.78715792757665 + - 9.87193543775067 + - !!python/tuple + - 87.09110541151603 + - 22.306904997638483 + - 6.649804763300203 + - !!python/tuple + - 108.62152208417575 + - 13.049186327082746 + - 2.4801144180502273 + - !!python/tuple + - 41.68537465635639 + - 18.023337272194713 + - 1.8893856073245885 + - !!python/tuple + - 64.31580995621357 + - 9.641142656411434 + - 0.5292650102840555 + - !!python/tuple + - 64.31580995621357 + - 9.641142656411434 + - 0.5292650102840555 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 114.29500025076793 + - 11.828055945279923 + - 8.327346791533783 + - !!python/tuple + - 87.86185678915732 + - 18.224624216258952 + - 14.876355951251938 + - !!python/tuple + - 74.29960240943294 + - 28.197069760642602 + - 4.3169785518971135 + - !!python/tuple + - 52.95440093952124 + - 13.73577054055414 + - 11.679573270806866 + - !!python/tuple + - 44.77589947948863 + - 15.334883935203743 + - 2.184397087980666 + - !!python/tuple + - 58.52546793718294 + - 10.655472058881584 + - 3.730679810042819 + - !!python/tuple + - 39.324398799677134 + - 7.681895698847787 + - 2.3801612889099744 + - !!python/tuple + - 39.324398799677134 + - 7.681895698847787 + - 2.3801612889099744 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 187.4788060774076 + - 64.32024584585129 + - 30.49268302099734 + - !!python/tuple + - 179.14687107842164 + - 40.23227327696812 + - 29.360415997674345 + - !!python/tuple + - 147.93607275250906 + - 43.32850845817704 + - 3.5323898621688348 + - !!python/tuple + - 142.13722244942147 + - 32.85186896873376 + - 3.2918003584943887 + - !!python/tuple + - 139.32074694398682 + - 5.425412796550864 + - 2.7180409443919817 + - !!python/tuple + - 139.32074694398682 + - 5.425412796550864 + - 2.7180409443919817 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 73.67178507236095 + - 35.18890201097625 + - 21.669836181058997 + - !!python/tuple + - 46.37794728544844 + - 11.930589536568762 + - 10.870361994261689 + - !!python/tuple + - 50.79043208724118 + - 36.552024400518526 + - 5.983515885791579 + - !!python/tuple + - 34.21166621056073 + - 14.629569007770707 + - 2.8005354531368645 + - !!python/tuple + - 42.42803021916893 + - 30.01831039875014 + - 1.4640068878683803 + - !!python/tuple + - 43.212950646014356 + - 23.720527331780104 + - 2.1647072048529745 + - !!python/tuple + - 43.212950646014356 + - 23.720527331780104 + - 2.1647072048529745 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 67.62310142293691 + - 45.48901400103115 + - 4.946184258164448 + - !!python/tuple + - 96.00618052512536 + - 48.366375188391196 + - 12.99321020547946 + - !!python/tuple + - 88.9967418534966 + - 40.91598124022691 + - 7.602371177937186 + - !!python/tuple + - 88.66113830393105 + - 22.17612625393883 + - 11.43710780397952 + - !!python/tuple + - 78.82402976867701 + - 40.25406319947102 + - 3.1550181229235066 + - !!python/tuple + - 81.32844067092884 + - 14.062872465019458 + - 3.4907240714110914 + - !!python/tuple + - 81.32844067092884 + - 14.062872465019458 + - 3.4907240714110914 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 34.361809293566346 + - 24.692619623631444 + - 2.8665420124867786 + - !!python/tuple + - 141.02101398919964 + - 70.62930359758789 + - 17.605200563995567 + - !!python/tuple + - 127.77508585183367 + - 56.2811271535406 + - 8.987842749215497 + - !!python/tuple + - 82.43973803414626 + - 43.01925733406225 + - 2.0121365363067945 + - !!python/tuple + - 82.3727822242162 + - 21.680640128807433 + - 2.1555115581365314 + - !!python/tuple + - 108.56938105598819 + - 2.615016918611601 + - 1.3671675893410244 + - !!python/tuple + - 97.80383080784158 + - 18.756835605348883 + - 0.1573580859067109 + - !!python/tuple + - 100.70187625149039 + - 42.45408913829609 + - 0.37706584633088114 + - !!python/tuple + - 101.35199508658029 + - 36.76466128021701 + - 0.6297145343806183 + - !!python/tuple + - 101.35199508658029 + - 36.76466128021701 + - 0.6297145343806183 +- - !!python/tuple + - 100.0 + - 50.0 + - 30.0 + - !!python/tuple + - 194.97353982983537 + - 134.56862023805104 + - 35.92891010297772 + - !!python/tuple + - 188.17971645420906 + - 36.05281289177599 + - 10.182423358304439 + - !!python/tuple + - 158.4908694415588 + - 116.8038640858614 + - 10.775367506145603 + - !!python/tuple + - 94.2937604182172 + - 42.742687997054105 + - 3.896170950123006 + - !!python/tuple + - 137.61937181112108 + - 106.25602940592312 + - 6.7447301938440365 + - !!python/tuple + - 122.08009944126492 + - 73.34863461007271 + - 4.840569618818927 + - !!python/tuple + - 104.42834289769998 + - 65.34399161849875 + - 0.4907858330019408 + - !!python/tuple + - 104.42834289769998 + - 65.34399161849875 + - 0.4907858330019408 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 470.0 + - 640.0 + - 3820.0 + - 6890.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 5045.137040795801 + - 5047.792790840968 + - 6145.89906859654 + - 5464.526949614165 + - 6346.421126172966 + - 6346.421126172966 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 80.0 + - 100.0 + - 560.0 + - 3000.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 4367.434627751413 + - 4454.881008809493 + - 298.41705391716073 + - 1125.0002479370141 + - 1355.2718465915043 + - 1355.2718465915043 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 1520.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 3837.8471556437894 + - 727.4208805334198 + - 727.4208805334198 +- !!python/tuple + - !!python/tuple + - 0.0 + - 80.0 + - 90.0 + - 120.0 + - 2410.0 + - 2530.0 + - 3830.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 4154.022755953219 + - 4297.10848016509 + - 5094.783912775001 + - 4309.790379022121 + - 5004.851524333924 + - 5840.098997823016 + - 5840.098997823016 +- !!python/tuple + - !!python/tuple + - 0.0 + - 170.0 + - 370.0 + - 620.0 + - 1100.0 + - 2410.0 + - 3180.0 + - 9900.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 4787.570737603875 + - 4785.372949123558 + - 5640.791588256094 + - 4091.374304792376 + - 5038.8774760433 + - 5459.531065200089 + - 4573.338571632367 + - 4573.338571632367 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 60.0 + - 170.0 + - 2210.0 + - 2610.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - -2001.0117340067914 + - -1520.8871107874068 + - 878.0404242693552 + - 1194.160063822785 + - 1332.0720730335056 + - 1332.0720730335056 +- !!python/tuple + - !!python/tuple + - 0.0 + - 40.0 + - 510.0 + - 1960.0 + - 4970.0 + - 5590.0 + - 8240.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 4448.099411047704 + - 4445.741309257204 + - 5032.434640094703 + - 4891.1751749832065 + - 5216.957115095141 + - 5419.665048721934 + - 5419.665048721934 +- !!python/tuple + - !!python/tuple + - 0.0 + - 80.0 + - 940.0 + - 1420.0 + - 1790.0 + - 2090.0 + - 4280.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 4846.553105572239 + - 4584.868876403944 + - 5060.177347740511 + - 4815.600694555556 + - 5391.257569651006 + - 5451.311393161031 + - 5451.311393161031 +- !!python/tuple + - !!python/tuple + - 0.0 + - 50.0 + - 170.0 + - 290.0 + - 340.0 + - 510.0 + - 780.0 + - 1940.0 + - 3680.0 + - 7980.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 3882.5484080748956 + - 2207.8632893811937 + - 3105.2427220035065 + - 4716.497997060296 + - 5038.762212704685 + - 4183.8635488933905 + - 4665.243432846848 + - 4474.210326119698 + - 4509.539699936045 + - 4509.539699936045 +- !!python/tuple + - !!python/tuple + - 0.0 + - 80.0 + - 130.0 + - 190.0 + - 240.0 + - 980.0 + - 2350.0 + - 4640.0 + - 10000.0 + - !!python/tuple + - 4623.9086779196805 + - 1090.7779633076855 + - 2419.2857430021304 + - 3352.3964873681634 + - 6766.77963956426 + - 4304.266327355488 + - 5607.234038798578 + - 6323.861695206392 + - 6323.861695206392 +problem_name: RMITD-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.047 + - 0.064 + - 0.382 + - 0.689 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8034280316380589 + - 0.8021886896092094 + - 0.2897423979702518 + - 0.6077140029704176 + - 0.19616604122008505 + - 0.19616604122008505 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.004 + - 0.008 + - 0.01 + - 0.056 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 1.11968711824413 + - 1.078879070245305 + - 3.018549740709937 + - 2.6328134043579436 + - 2.5253540179664435 + - 2.5253540179664435 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.004 + - 0.152 + - 1.0 + - !!python/tuple + - 1.0 + - 1.3668263448176161 + - 2.818349246002121 + - 2.818349246002121 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.008 + - 0.009 + - 0.012 + - 0.241 + - 0.253 + - 0.383 + - 1.0 + - !!python/tuple + - 1.0 + - 1.2192786828404454 + - 1.152505775477858 + - 0.780259640788664 + - 1.146587594176219 + - 0.8222278180848167 + - 0.4324481773881747 + - 0.4324481773881747 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.017 + - 0.037 + - 0.062 + - 0.11 + - 0.241 + - 0.318 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.923624864672864 + - 0.9246504926829755 + - 0.5254577020559414 + - 1.2485144381809172 + - 0.8063491430183247 + - 0.6100454006623445 + - 1.0235992307481279 + - 1.0235992307481279 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.004 + - 0.006 + - 0.017 + - 0.221 + - 0.261 + - 1.0 + - !!python/tuple + - 1.0 + - 4.091609588494341 + - 3.8675528758816022 + - 2.748060578867288 + - 2.600539031741175 + - 2.5361805091426524 + - 2.5361805091426524 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.004 + - 0.051 + - 0.196 + - 0.497 + - 0.559 + - 0.824 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0820437954588964 + - 1.0831442358646453 + - 0.809355780405231 + - 0.8752764390169308 + - 0.7232458473746287 + - 0.6286494217124777 + - 0.6286494217124777 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.008 + - 0.094 + - 0.142 + - 0.179 + - 0.209 + - 0.428 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8960999371228185 + - 1.0182184565540868 + - 0.7964092669929086 + - 0.9105443024489169 + - 0.6419061597892897 + - 0.6138812228775792 + - 0.6138812228775792 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.005 + - 0.017 + - 0.029 + - 0.034 + - 0.051 + - 0.078 + - 0.194 + - 0.368 + - 0.798 + - 1.0 + - !!python/tuple + - 1.0 + - 1.3459658948739575 + - 2.1274805771245577 + - 1.7087062091460001 + - 0.9567919297065108 + - 0.8064029322294708 + - 1.205353069271409 + - 0.9807105720936904 + - 1.0698587803369617 + - 1.0533718455430754 + - 1.0533718455430754 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.008 + - 0.013 + - 0.019 + - 0.024 + - 0.098 + - 0.235 + - 0.464 + - 1.0 + - !!python/tuple + - 1.0 + - 2.648783700862902 + - 2.0288174016906635 + - 1.5933685290950397 + - -0.0 + - 1.14916546832987 + - 0.5411177908145113 + - 0.20669370778067922 + - 0.20669370778067922 +solver_name: RNDSRCH diff --git a/test/expected_results/SAN1_ADAM.yaml b/test/expected_results/SAN1_ADAM.yaml new file mode 100644 index 000000000..d8ec0bf24 --- /dev/null +++ b/test/expected_results/SAN1_ADAM.yaml @@ -0,0 +1,8569 @@ +all_est_objectives: +- - 55.228104638490976 + - 51.98624404104605 + - 48.76052038582583 + - 45.555158805271816 + - 42.375816991898056 + - 39.23022840446282 + - 36.12921511353964 + - 33.08833077490451 + - 30.130914826871532 + - 27.29208723685515 + - 24.627546111139182 + - 22.22997585942509 + - 20.238014456287225 + - 18.94705406490078 + - 18.99490217105762 + - 18.859106385366427 + - 18.90960461539854 + - 18.919598938401393 + - 19.02529897785151 + - 19.042298922191865 + - 18.952875775616086 + - 18.97576941121191 + - 19.03795237325694 + - 19.021133815579308 + - 19.03531230789991 + - 19.024935455780966 + - 19.00097979853086 + - 19.011487229171063 + - 18.99122559840228 + - 19.040740974070403 + - 19.028123125591097 + - 19.014591736247496 + - 19.014591736247496 +- - 54.98944203450111 + - 51.762497809054956 + - 48.55142327888958 + - 45.3601642780199 + - 42.19397670724609 + - 39.060006675366814 + - 35.96820357344928 + - 32.932808015769744 + - 29.9748749973568 + - 27.126750954459926 + - 24.440431373188353 + - 22.004023001678917 + - 19.975725608125373 + - 18.655196206188908 + - 18.60802783626473 + - 18.266446706062876 + - 18.20816186638503 + - 18.25197078353057 + - 18.253735642839246 + - 18.25179634263437 + - 18.206320179247133 + - 18.211235054774942 + - 18.212525643176164 + - 18.226147400683193 + - 18.226147400683193 +- - 54.30952001078969 + - 51.1250709174858 + - 47.95652814982719 + - 44.80787549798857 + - 41.684423042724994 + - 38.593395460034664 + - 35.544858077561386 + - 32.5532256066455 + - 29.639818033151126 + - 26.837384875500806 + - 24.198528203607825 + - 21.813077735608047 + - 19.839581454318793 + - 18.576266597864095 + - 18.6383312096953 + - 18.65353311935151 + - 18.300904365846296 + - 18.41966673483236 + - 18.431905024114837 + - 18.422781984635776 + - 18.4872284064759 + - 18.448550946858838 + - 18.498864276277914 + - 18.495310611648794 + - 18.46100323923643 + - 18.46399838685284 + - 18.480495105493475 + - 18.478411981119752 + - 18.476426556229868 + - 18.471738945429852 + - 18.471699212609675 + - 18.471723063701692 + - 18.47541972851094 + - 18.476340311375353 + - 18.477068358805052 + - 18.471374031344787 + - 18.47041159510455 + - 18.469993872057454 + - 18.47684182745188 + - 18.477027032386857 + - 18.476701057879055 + - 18.471725059438093 + - 18.47203014865108 + - 18.47489319060399 + - 18.474745071919454 + - 18.474512227621986 + - 18.473460256083595 + - 18.473375259363976 + - 18.473329356847106 + - 18.473321008947252 + - 18.473872118613293 + - 18.47404997023167 + - 18.474202178547753 + - 18.4743023909864 + - 18.473774199587293 + - 18.47358784765706 + - 18.473448606536063 + - 18.473379887668038 + - 18.473926718774184 + - 18.4740448095205 + - 18.47410951194349 + - 18.4741148872552 + - 18.473710929234908 + - 18.47366883080124 + - 18.473660577386962 + - 18.47368098515475 + - 18.473872117799246 + - 18.473870436878578 + - 18.47386316512029 + - 18.4738094759264 + - 18.47379980189486 + - 18.473791295938483 + - 18.4738277863572 + - 18.473839454245404 + - 18.473801231656527 + - 18.47379896589131 + - 18.473828182603196 + - 18.47382622725372 + - 18.473813859236312 + - 18.473817338148596 + - 18.473817919055293 + - 18.473815170464697 + - 18.473816894738324 + - 18.473818786980434 + - 18.473820178039436 + - 18.473817973070148 + - 18.473817367280546 + - 18.473816611636444 + - 18.47381716169617 + - 18.47381874119251 + - 18.47381744989061 + - 18.473817978866492 + - 18.473817629590823 + - 18.473817828735033 + - 18.47381807237111 + - 18.473817988980347 + - 18.47381768513895 + - 18.473817725893074 + - 18.473817999050777 + - 18.47381794316518 + - 18.47381786283254 + - 18.473817904216528 + - 18.47381784981672 + - 18.473817840484756 + - 18.473817904879237 + - 18.47381790713169 + - 18.473817902945797 + - 18.473817902945797 +- - 54.76055167633331 + - 51.629465152488194 + - 48.522082053026445 + - 45.39089895846003 + - 42.29388720473791 + - 39.23384753833002 + - 36.21689042153264 + - 33.251646714451084 + - 30.357500671619373 + - 27.567073540398955 + - 24.94191951688811 + - 22.600664522568515 + - 20.62716048641754 + - 19.34143454320231 + - 19.27992612847415 + - 18.771913709093965 + - 18.580449623574115 + - 18.756186890366138 + - 18.74599518802007 + - 18.797862086953398 + - 18.59479985506836 + - 18.348364690667214 + - 18.15095917803523 + - 18.02046477248837 + - 18.130283350511096 + - 18.06069745831741 + - 18.0836586969195 + - 18.09647084547955 + - 18.108504617440463 + - 18.119615325320066 + - 18.09192364253646 + - 18.05731932817274 + - 18.052994600718204 + - 18.09988618491549 + - 18.087068223728295 + - 18.08690628682348 + - 18.082532641518945 + - 18.082429518467304 + - 18.083885497389396 + - 18.083885497389396 +- - 52.39186295815599 + - 49.32726745394636 + - 46.278750096854566 + - 43.250479542212396 + - 40.24803534436404 + - 37.27903487478736 + - 34.35410710562561 + - 31.488926829646207 + - 28.70811861818205 + - 26.045385078893993 + - 23.563696562132776 + - 21.35293754331001 + - 19.58244304174118 + - 18.465297623320165 + - 18.54772766384801 + - 18.256379605703604 + - 18.22996770895012 + - 18.34499900860201 + - 18.19242517304938 + - 18.13857699283189 + - 18.295291813080787 + - 18.292651903383856 + - 18.31079421264206 + - 18.28180164650201 + - 18.265877861814726 + - 18.281155018230198 + - 18.267306478465727 + - 18.27834724088086 + - 18.27834724088086 +- - 54.25979384648611 + - 51.10579599894569 + - 48.00488168528059 + - 44.962601700975526 + - 41.89118895726379 + - 38.849050949145884 + - 35.843895104310356 + - 32.89988414092291 + - 30.037505010136535 + - 27.27492798601024 + - 24.671989907477823 + - 22.305456274788625 + - 20.341453186504857 + - 19.03551736131802 + - 18.34706863544604 + - 18.182908210591403 + - 18.17052294381892 + - 18.130528542019388 + - 18.128062039164654 + - 18.14849760799093 + - 18.11054608320778 + - 18.122405617103894 + - 18.132146172921523 + - 18.14438212955257 + - 18.15498777473148 + - 18.133785340738775 + - 18.11009983493868 + - 18.096627125135768 + - 18.113477965483966 + - 18.106718315566354 + - 18.109347242659013 + - 18.09971397249196 + - 18.113564489508043 + - 18.10864970323175 + - 18.10864970323175 +- - 51.823992493809435 + - 48.99020292784388 + - 46.033162496154794 + - 43.070891052577224 + - 40.1219200225204 + - 37.197763119623104 + - 34.31705211006138 + - 31.493012592679506 + - 28.742220765509533 + - 26.097113744303265 + - 23.607796924213307 + - 21.360312943957545 + - 19.50018129200676 + - 18.28858089439648 + - 17.814961131518647 + - 17.81470170563944 + - 18.005479326154564 + - 17.893711579367576 + - 17.857302760067768 + - 17.72839377229257 + - 17.73548205083985 + - 17.844112736764902 + - 17.83363371771105 + - 17.82423390317269 + - 17.816524784110285 + - 17.738185968577703 + - 17.72458680347753 + - 17.71510608515037 + - 17.709040023125908 + - 17.707737076995244 + - 17.711770992117284 + - 17.73258733332738 + - 17.741876846024212 + - 17.746524024956006 + - 17.749877060916653 + - 17.752958237412557 + - 17.757441300079194 + - 17.725719268238308 + - 17.715550416443044 + - 17.73800155702708 + - 17.740795587413704 + - 17.731851121369235 + - 17.74306716850205 + - 17.74306716850205 +- - 53.19657777800099 + - 50.08168757184273 + - 46.98269326674508 + - 43.90356842095372 + - 40.84960798240563 + - 37.82801139737437 + - 34.848795668107975 + - 31.92626988495444 + - 29.08149748924578 + - 26.34655984973993 + - 23.772322986338377 + - 21.457104421978652 + - 19.57675504778375 + - 18.447898852590853 + - 18.722855569860393 + - 18.81983330875907 + - 18.313842006992758 + - 18.365351949961468 + - 18.343461103491794 + - 18.322820374086234 + - 18.34476447608613 + - 18.369505544898434 + - 18.304436181221725 + - 18.34037030215351 + - 18.34169240664045 + - 18.357033677657864 + - 18.33259354314329 + - 18.321170674390256 + - 18.304389902715386 + - 18.33731946503271 + - 18.338660767735238 + - 18.32964188175149 + - 18.343303939953586 + - 18.343303939953586 +- - 58.70283939001095 + - 55.243807835028726 + - 51.800675950724106 + - 48.3774160999953 + - 44.97931530623554 + - 41.613551756470585 + - 38.290095304596996 + - 35.02315823878325 + - 31.833613850619354 + - 28.753187665617318 + - 25.833048949855844 + - 23.159403881930725 + - 20.89053409445306 + - 19.351841683242206 + - 19.188932948834214 + - 19.338803610156823 + - 19.08252460105875 + - 19.205477986973825 + - 19.217532807782483 + - 19.161998198590048 + - 19.18826292383673 + - 19.164981988814393 + - 19.15768302521157 + - 19.181250162057847 + - 19.186085426459616 + - 19.166226543382987 + - 19.16586179687627 + - 19.166884389026965 + - 19.170253523901014 + - 19.171267555529077 + - 19.17910774390585 + - 19.17897390636631 + - 19.18153437407186 + - 19.176298231222255 + - 19.176298231222255 +- - 52.87627843731777 + - 49.83270410310528 + - 46.82556836172902 + - 43.88348344447279 + - 40.903465923935165 + - 37.940017467134595 + - 35.04039460056154 + - 32.21162619013505 + - 29.461991867532717 + - 26.830331366756674 + - 24.370641754413622 + - 22.142986374176747 + - 20.28594937760092 + - 19.04889016970365 + - 18.795953355003125 + - 18.15521341988251 + - 17.939735836149634 + - 18.08529204806063 + - 18.03617680994856 + - 18.010629808073922 + - 17.912248701929418 + - 17.91667470814065 + - 17.924813990220983 + - 17.938538967735703 + - 17.95593523796653 + - 17.96219271612408 + - 17.89400415447985 + - 17.89909734007762 + - 17.901912145487046 + - 17.885713787278693 + - 17.906570690112698 + - 17.907855495038866 + - 17.88311045961252 + - 17.890684437466845 + - 17.904503239735835 + - 17.912786917998268 + - 17.876402472656608 + - 17.880439959628212 + - 17.89738662793362 + - 17.896219356423543 + - 17.889077654609434 + - 17.889077654609434 +all_intermediate_budgets: +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 630 + - 1110 + - 1140 + - 1410 + - 1440 + - 1770 + - 1800 + - 2070 + - 2340 + - 2370 + - 2400 + - 2670 + - 2700 + - 3600 + - 3900 + - 4920 + - 6090 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 600 + - 630 + - 1110 + - 1410 + - 2040 + - 2070 + - 2340 + - 2370 + - 3390 + - 3630 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 600 + - 630 + - 1110 + - 1140 + - 1410 + - 1770 + - 2070 + - 2370 + - 2400 + - 2640 + - 2670 + - 2910 + - 2940 + - 2970 + - 3150 + - 3180 + - 3210 + - 3420 + - 3450 + - 3480 + - 3690 + - 3720 + - 3750 + - 3960 + - 3990 + - 4020 + - 4230 + - 4260 + - 4470 + - 4500 + - 4530 + - 4680 + - 4710 + - 4740 + - 4770 + - 4920 + - 4950 + - 4980 + - 5010 + - 5160 + - 5190 + - 5220 + - 5250 + - 5400 + - 5430 + - 5460 + - 5490 + - 5640 + - 5670 + - 5700 + - 5730 + - 5910 + - 5940 + - 5970 + - 6150 + - 6180 + - 6210 + - 6390 + - 6420 + - 6630 + - 6660 + - 6840 + - 6870 + - 7050 + - 7080 + - 7260 + - 7290 + - 7440 + - 7470 + - 7500 + - 7680 + - 7710 + - 7890 + - 7920 + - 8130 + - 8340 + - 8550 + - 8730 + - 8760 + - 8940 + - 8970 + - 9120 + - 9150 + - 9330 + - 9360 + - 9540 + - 9570 + - 9750 + - 9780 + - 9930 + - 9960 + - 9990 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 600 + - 630 + - 1020 + - 1050 + - 1080 + - 1290 + - 1320 + - 1350 + - 1380 + - 1710 + - 1980 + - 2190 + - 2220 + - 2250 + - 2280 + - 2460 + - 2580 + - 2610 + - 2850 + - 3090 + - 3570 + - 8370 + - 8610 + - 9120 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 630 + - 660 + - 1080 + - 1110 + - 1140 + - 1440 + - 1800 + - 1830 + - 2100 + - 2700 + - 2880 + - 3480 + - 3840 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 600 + - 630 + - 1320 + - 1350 + - 1380 + - 1680 + - 1890 + - 1920 + - 1950 + - 2010 + - 2040 + - 2160 + - 2250 + - 2400 + - 2550 + - 2760 + - 2790 + - 3480 + - 4440 + - 4650 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 630 + - 660 + - 1080 + - 1110 + - 1140 + - 1410 + - 1440 + - 1710 + - 1740 + - 1770 + - 1800 + - 1950 + - 1980 + - 2010 + - 2040 + - 2070 + - 2100 + - 2190 + - 2250 + - 2280 + - 2310 + - 2340 + - 2370 + - 2610 + - 2700 + - 2910 + - 2940 + - 3870 + - 6060 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 600 + - 630 + - 1110 + - 1140 + - 1440 + - 1770 + - 1800 + - 2100 + - 2340 + - 2490 + - 2520 + - 2640 + - 2670 + - 2730 + - 2850 + - 3030 + - 3210 + - 4110 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 600 + - 630 + - 1410 + - 1440 + - 1770 + - 2070 + - 2370 + - 2400 + - 2640 + - 2670 + - 2940 + - 2970 + - 3000 + - 3180 + - 3240 + - 3420 + - 3480 + - 3840 + - 8910 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 240 + - 270 + - 300 + - 330 + - 360 + - 390 + - 420 + - 450 + - 600 + - 630 + - 1350 + - 1380 + - 1410 + - 1650 + - 1680 + - 1710 + - 1740 + - 1770 + - 1800 + - 2040 + - 2070 + - 2100 + - 2220 + - 2340 + - 2370 + - 2490 + - 2550 + - 2580 + - 2610 + - 2820 + - 2910 + - 3060 + - 3930 + - 5250 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000004124182 + - 7.5000000913820495 + - 7.500000009545579 + - 7.500000008157616 + - 7.5000000097584 + - 7.5000000313269375 + - 7.500000011205014 + - 7.500000010625556 + - 7.500000025449949 + - 7.500000033023004 + - 7.500000008264776 + - 7.500000007109057 + - 7.500000007565298 + - !!python/tuple + - 7.0000233684983035 + - 7.000623797613359 + - 7.000054753069591 + - 7.000046645867261 + - 7.000056000584368 + - 7.000188564567918 + - 7.000064511413696 + - 7.000061095794086 + - 7.000151231876611 + - 7.000199508909265 + - 7.000047270027257 + - 7.0000405541677875 + - 7.000043201252534 + - !!python/tuple + - 6.500092770615149 + - 6.502556423363367 + - 6.500217785549605 + - 6.500185446324585 + - 6.500222764616507 + - 6.500755933168188 + - 6.500256752713133 + - 6.500243108261 + - 6.500604985297759 + - 6.500800298754108 + - 6.500187934946993 + - 6.500161167634525 + - 6.500171715487428 + - !!python/tuple + - 6.00023890696337 + - 6.006834083872247 + - 6.000562118872341 + - 6.000478372131921 + - 6.00057502125307 + - 6.001969074850372 + - 6.000663155138077 + - 6.000627761487711 + - 6.0015719682138196 + - 6.002086139895857 + - 6.000484813374852 + - 6.0004155618521935 + - 6.000442843091826 + - !!python/tuple + - 5.500503966898216 + - 5.515067792822218 + - 5.501188928015531 + - 5.501011107217611 + - 5.501216344849384 + - 5.504210022933875 + - 5.501403773367173 + - 5.501328472873201 + - 5.503351123643299 + - 5.5044641105353005 + - 5.501024775598028 + - 5.500877897089432 + - 5.500935739555776 + - !!python/tuple + - 5.000947038049604 + - 5.0298457090695265 + - 5.0022412816144355 + - 5.001904518375648 + - 5.002293251825439 + - 5.008039487892475 + - 5.002648869057178 + - 5.002505927615156 + - 5.006376923273256 + - 5.008533356416788 + - 5.001930385117514 + - 5.001652590699418 + - 5.001761945618582 + - !!python/tuple + - 4.501652819779853 + - 4.555476793376273 + - 4.5039266314770305 + - 4.503333354304964 + - 4.504018287961532 + - 4.514306541220499 + - 4.5046461802656514 + - 4.504393647907821 + - 4.511299912079088 + - 4.515204047757326 + - 4.5033788837200515 + - 4.50289027497851 + - 4.503082525051421 + - !!python/tuple + - 4.002746277578234 + - 4.099377860395322 + - 4.006555365741722 + - 4.005558151391445 + - 4.006709634182205 + - 4.0243476716533015 + - 4.007767921820285 + - 4.0073419808466015 + - 4.019131044670168 + - 4.02591398075867 + - 4.005634597171703 + - 4.004814927101702 + - 4.005137246927359 + - !!python/tuple + - 3.504418600092969 + - 3.6745291194070226 + - 3.5106106948443294 + - 3.5089827497898844 + - 3.510862960222454 + - 3.5403698662735756 + - 3.5125965240736594 + - 3.511898167861896 + - 3.531516265762777 + - 3.543046573842663 + - 3.5091073780270694 + - 3.507772563259096 + - 3.5082970636957187 + - !!python/tuple + - 3.00697625539405 + - 3.302865382641384 + - 3.0168844981064904 + - 3.014265364344723 + - 3.0172912314329445 + - 3.0662377733466304 + - 3.020092515665591 + - 3.0189627376148556 + - 3.0512968517253216 + - 3.0707905587010638 + - 3.0144655250339385 + - 3.0123247819828634 + - 3.0131651567453344 + - !!python/tuple + - 2.5109417720736595 + - 3.0159002767407084 + - 2.5267660817246758 + - 2.522552904090966 + - 2.5274222088640887 + - 2.6092000561773485 + - 2.5319542609467987 + - 2.5301237222136033 + - 2.583746853493017 + - 2.6170175422303887 + - 2.522874147618232 + - 2.5194448836228647 + - 2.5207893705581896 + - !!python/tuple + - 2.0173169280190844 + - 2.686037938781734 + - 2.052066006933434 + - 2.0360366421202305 + - 2.0440103307216186 + - 2.183815622536106 + - 2.051484389432799 + - 2.0484596681090776 + - 2.139519210755539 + - 2.1974748120804777 + - 2.036560803691676 + - 2.030979717432927 + - 2.0331640553039607 + - !!python/tuple + - 1.5281382818033955 + - 2.3533547067656375 + - 1.598728811731395 + - 1.559497834707433 + - 1.5731288251748492 + - 1.8200087560708154 + - 1.5845052602977434 + - 1.5845673777785143 + - 1.7074685543708294 + - 1.843859589918664 + - 1.5599358132038077 + - 1.5523798938381508 + - 1.5586502480249782 + - !!python/tuple + - 1.0486309631488235 + - 2.090485859099559 + - 1.1793417752875823 + - 1.1056640648314215 + - 1.136222227290178 + - 1.56128369009871 + - 1.150350829756073 + - 1.15711016607541 + - 1.3355367145000892 + - 1.5789947498983063 + - 1.1101145044289893 + - 1.0943430551719446 + - 1.1090153023540739 + - !!python/tuple + - 0.9996896676923013 + - 1.8194377521690979 + - 1.3358339642964154 + - 1.244513000481702 + - 1.4457023944967973 + - 1.8542539686920438 + - 1.374436439435021 + - 1.4203776715573844 + - 1.847591630441383 + - 1.935351567365612 + - 1.2518844338738546 + - 1.2116998540946275 + - 1.2232915088900944 + - !!python/tuple + - 1.0212418979249152 + - 2.4917089494350506 + - 1.6413630959264585 + - 1.2974900680464094 + - 1.562496964968076 + - 1.9655086200706717 + - 1.4678535738850143 + - 1.4999720825045018 + - 1.750010586503036 + - 2.049804903311446 + - 1.3817303388661606 + - 1.3137543668589573 + - 1.3815070624753598 + - !!python/tuple + - 0.9210656088300089 + - 2.3300448980370527 + - 1.5387645806396948 + - 1.1961877235438303 + - 1.4564089733527887 + - 1.885831482979842 + - 1.3682282732176432 + - 1.3972147570177726 + - 1.7498379799704902 + - 1.9960263476496614 + - 1.2738689332902533 + - 1.2072858002556615 + - 1.2707081781982703 + - !!python/tuple + - 0.8817412545108465 + - 2.203573584425984 + - 1.3774048239621863 + - 1.2662778521088294 + - 1.4850192651856227 + - 2.024900809467626 + - 1.430399313788551 + - 1.4773732455164037 + - 1.867221679165702 + - 2.0448207706723247 + - 1.2461008807827065 + - 1.2527611097339253 + - 1.1867701433567888 + - !!python/tuple + - 0.9410849066756974 + - 2.3063591614154695 + - 1.440699296525729 + - 1.3298501196390489 + - 1.5354579888613216 + - 2.046742124112675 + - 1.498566057568621 + - 1.5317052993963478 + - 1.8647455344722292 + - 2.1620856296459317 + - 1.3093455346206546 + - 1.3195050008989329 + - 1.2622246299059376 + - !!python/tuple + - 0.9247354703144184 + - 2.4317514995655523 + - 1.595287580139063 + - 1.2581330110026065 + - 1.5085107784182794 + - 1.989152566511916 + - 1.4306211815470407 + - 1.532768044983843 + - 1.8049576741930402 + - 2.0912522898162456 + - 1.2840338674436629 + - 1.311923050631544 + - 1.3229874060170004 + - !!python/tuple + - 0.8892699150271084 + - 2.3783971855368615 + - 1.5580976164875848 + - 1.2222728382072705 + - 1.4638606627073758 + - 1.9837739230342148 + - 1.396995584822602 + - 1.4952219937479259 + - 1.8132378594565144 + - 2.070509390073701 + - 1.247185251755717 + - 1.2715803527333895 + - 1.2845981298330573 + - !!python/tuple + - 0.9035915130094386 + - 2.3256387083889307 + - 1.4306931494384023 + - 1.2795078464878717 + - 1.464312538562609 + - 1.9815552150949143 + - 1.4589694764942638 + - 1.4739779435437574 + - 1.823874892578978 + - 2.1204853915482746 + - 1.2647996874178065 + - 1.2878772209330205 + - 1.233599872851612 + - !!python/tuple + - 0.9271941561722536 + - 2.3808792780188286 + - 1.5760236867213844 + - 1.2755513862674186 + - 1.532572823786887 + - 2.007824026515189 + - 1.4558169962312046 + - 1.4967812457647716 + - 1.8217769281697498 + - 2.218829707576278 + - 1.30063638228651 + - 1.3243526115169422 + - 1.3175749048233716 + - !!python/tuple + - 0.9131632027225585 + - 2.364732447174768 + - 1.5657803729670934 + - 1.2590593117582782 + - 1.5195545072607097 + - 2.0082729971177455 + - 1.4436527205638492 + - 1.4706992028109984 + - 1.8251094737566083 + - 2.2228233582709485 + - 1.2885236679081657 + - 1.3067999366133123 + - 1.3084310128822594 + - !!python/tuple + - 0.8998867725938078 + - 2.346856060303465 + - 1.552186204275939 + - 1.2440737168674394 + - 1.5201459525000796 + - 2.0034708114908266 + - 1.4289707558346703 + - 1.451173226378201 + - 1.8275349621581234 + - 2.19278762722689 + - 1.276397130234141 + - 1.290889145185709 + - 1.2913666904265377 + - !!python/tuple + - 0.9092272937497597 + - 2.3213347260238635 + - 1.4772665676037378 + - 1.272946227779164 + - 1.5116239573790697 + - 1.9672872889349602 + - 1.4507008646078874 + - 1.4575713413342974 + - 1.8157179133434924 + - 2.133903826712359 + - 1.2744820882069445 + - 1.295927739836374 + - 1.2469200050882245 + - !!python/tuple + - 0.9169320938893494 + - 2.332772835838801 + - 1.4845539058530637 + - 1.2817131743752208 + - 1.507226548802226 + - 1.9753573947810226 + - 1.4588352234743331 + - 1.4740487725711031 + - 1.815731461881078 + - 2.157277927210956 + - 1.2803373041878237 + - 1.3062498679627248 + - 1.2578619587960844 + - !!python/tuple + - 0.9024033502894013 + - 2.326504661089689 + - 1.5175008506920253 + - 1.2603256134416603 + - 1.5027647416658017 + - 1.984506675405623 + - 1.4372682117386701 + - 1.486869571577479 + - 1.819813692953252 + - 2.128595647158864 + - 1.2658497311491066 + - 1.2916298719359371 + - 1.2649516795029387 + - !!python/tuple + - 0.9104278362259391 + - 2.3370745646482343 + - 1.5091801739990978 + - 1.269031099471119 + - 1.499531109908478 + - 2.0179063960495665 + - 1.4496433321964861 + - 1.4853627185250786 + - 1.8211423135039595 + - 2.1903473341819653 + - 1.277328681127974 + - 1.292959345473706 + - 1.2735564804846362 + - !!python/tuple + - 0.9078773583087485 + - 2.333455590841981 + - 1.511128275195131 + - 1.2656516549157437 + - 1.493778746303316 + - 1.9942131863637607 + - 1.447121782911333 + - 1.4755291105224768 + - 1.8208786629834404 + - 2.1754232637658584 + - 1.2762531483435726 + - 1.2909173565300984 + - 1.2723324818657886 + - !!python/tuple + - 0.9074139578413448 + - 2.3329856087264167 + - 1.5115950711745074 + - 1.2661115156077045 + - 1.494342469244091 + - 1.9786735341523216 + - 1.4470921187528103 + - 1.4765278355172025 + - 1.8209267418721853 + - 2.1658439379673515 + - 1.2714962165326646 + - 1.2986619800640662 + - 1.2723661988124708 + - !!python/tuple + - 0.9074139578413448 + - 2.3329856087264167 + - 1.5115950711745074 + - 1.2661115156077045 + - 1.494342469244091 + - 1.9786735341523216 + - 1.4470921187528103 + - 1.4765278355172025 + - 1.8209267418721853 + - 2.1658439379673515 + - 1.2714962165326646 + - 1.2986619800640662 + - 1.2723661988124708 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000005237717 + - 7.500000016234681 + - 7.500000016747055 + - 7.500000006092244 + - 7.500000027248814 + - 7.500000018671792 + - 7.500000007248482 + - 7.500000008371401 + - 7.50000002338919 + - 7.500000019572623 + - 7.500000011620657 + - 7.500000006571748 + - 7.500000008300393 + - !!python/tuple + - 7.000029752930528 + - 7.000094525375216 + - 7.0000976198872005 + - 7.000034673995387 + - 7.0001625618356105 + - 7.000109305714526 + - 7.000041362530924 + - 7.000047891356739 + - 7.000138357310984 + - 7.000114808297803 + - 7.000066966797593 + - 7.000037443614002 + - 7.000047477543382 + - !!python/tuple + - 6.50011816310917 + - 6.5003768859362445 + - 6.500389295789957 + - 6.5001377490202055 + - 6.500650731674818 + - 6.500436198880105 + - 6.500164388364336 + - 6.500190412469758 + - 6.50055307113792 + - 6.500458306055092 + - 6.500266564704514 + - 6.500148777326669 + - 6.500188762387369 + - !!python/tuple + - 6.000304439775498 + - 6.000975493945802 + - 6.001007830989961 + - 6.000355027872347 + - 6.00169211920772 + - 6.001130169403407 + - 6.00042389094981 + - 6.000491226449439 + - 6.001435827689185 + - 6.001187897693853 + - 6.000688617713993 + - 6.000383528279212 + - 6.000486955144382 + - !!python/tuple + - 5.500642556287685 + - 5.502070065672481 + - 5.502139229184435 + - 5.500749642081303 + - 5.503610500457097 + - 5.502401192897407 + - 5.500895553989482 + - 5.501038385601552 + - 5.503057758984093 + - 5.502524971634045 + - 5.501457971114473 + - 5.500810011035678 + - 5.501029320765379 + - !!python/tuple + - 5.001208254549291 + - 5.003917716828954 + - 5.00404983706243 + - 5.001410320253737 + - 5.006877863130182 + - 5.0045509407191435 + - 5.001685966165147 + - 5.001956144523193 + - 5.005811547461302 + - 5.004788087838064 + - 5.002751809612649 + - 5.001524320565468 + - 5.001938987324688 + - !!python/tuple + - 4.50211036600631 + - 4.506896447197922 + - 4.507131632483311 + - 4.5024647863424985 + - 4.512203390296241 + - 4.508025104063039 + - 4.502948937493864 + - 4.503424230867155 + - 4.510282803881192 + - 4.508448738974207 + - 4.504828167144223 + - 4.502664925566258 + - 4.503394026403364 + - !!python/tuple + - 4.003509930053003 + - 4.0115812367349655 + - 4.01198159209788 + - 4.00410245612819 + - 4.020693569669149 + - 4.0135055809926055 + - 4.004913252268997 + - 4.005710750638811 + - 4.0173773540968805 + - 4.014229830168261 + - 4.008075130109454 + - 4.004437431632411 + - 4.005660025426454 + - !!python/tuple + - 3.5056542304500646 + - 3.5188852724992783 + - 3.5195492256301435 + - 3.506614996582062 + - 3.5341579625395276 + - 3.5220828307647767 + - 3.507932510675638 + - 3.5092315577590867 + - 3.528562222838961 + - 3.523290271569101 + - 3.5131007322421737 + - 3.5071589257937688 + - 3.509148839526665 + - !!python/tuple + - 3.0089415307758127 + - 3.030341723366209 + - 3.031431419698729 + - 3.0104738283376173 + - 3.055734891732314 + - 3.0356023091376447 + - 3.0125809445700247 + - 3.014665023310935 + - 3.046355557513794 + - 3.0375969301538044 + - 3.0209092817664827 + - 3.011342927403801 + - 3.0145321276913357 + - !!python/tuple + - 2.514055141987605 + - 2.548718699752133 + - 2.5505168105361107 + - 2.5164915661437943 + - 2.5912719471110948 + - 2.557424946359421 + - 2.519854472735729 + - 2.5231944508683037 + - 2.5754082831997187 + - 2.5607424707611504 + - 2.5332798947142696 + - 2.5178768947512897 + - 2.5229810674916116 + - !!python/tuple + - 2.0222745286130372 + - 2.0795172803449895 + - 2.0825557824962067 + - 2.0261993112308034 + - 2.1525758935567043 + - 2.0942786061830607 + - 2.031644635063925 + - 2.0370837021432506 + - 2.125105429802607 + - 2.099934088546973 + - 2.053679648355797 + - 2.028438604053503 + - 2.036735321482459 + - !!python/tuple + - 1.536321788995749 + - 1.6351010747374215 + - 1.640471971418061 + - 1.5428814815354874 + - 1.7649466811891272 + - 1.6612528957633677 + - 1.5520499210845284 + - 1.5612799946482172 + - 1.7161238483333205 + - 1.6713040017885008 + - 1.5898241202316874 + - 1.5466426667158693 + - 1.560686756942889 + - !!python/tuple + - 0.8680296186065082 + - 1.42638165778884 + - 1.39997050114739 + - 0.9327602541254654 + - 1.417025463545979 + - 1.3834718596245374 + - 0.973274026518146 + - 1.1621724330249679 + - 1.5029344646131366 + - 1.5294286326654578 + - 1.1132549577907151 + - 0.9904954177181119 + - 1.0811634179359135 + - !!python/tuple + - 1.0698718045869833 + - 1.6440325551291826 + - 1.6087916359382584 + - 1.144587958609652 + - 1.600562253147105 + - 1.5684087756652108 + - 1.1877040695363317 + - 1.3890215177342133 + - 1.7370287181845239 + - 1.7339967334490665 + - 1.3216135624931429 + - 1.2045835150599833 + - 1.2923617583561255 + - !!python/tuple + - 1.1033399393679824 + - 1.765923895967155 + - 1.6604802336205051 + - 1.1854182349761573 + - 1.865915746705859 + - 1.6069285211230706 + - 1.3604704794730624 + - 1.482562292307944 + - 1.8838317979125672 + - 1.7005972683428345 + - 1.390265427949684 + - 1.35817313358367 + - 1.371909254027436 + - !!python/tuple + - 1.0018503623156378 + - 1.7267602932297665 + - 1.7055128631995504 + - 1.135433076068824 + - 1.8704259840486765 + - 1.58574210392448 + - 1.177030792007473 + - 1.4838092645281953 + - 1.8855133045718226 + - 1.8526440386540712 + - 1.335228545587293 + - 1.1867573142326115 + - 1.3443195307013818 + - !!python/tuple + - 0.9958978303976382 + - 1.7213194820641167 + - 1.6886824264009141 + - 1.1283881668161235 + - 1.813965354605966 + - 1.5788643004407765 + - 1.1818574038330487 + - 1.4628689142959572 + - 1.881808494095038 + - 1.8632854120984474 + - 1.3115878377727492 + - 1.2049879783535857 + - 1.3224945605536198 + - !!python/tuple + - 1.0202463400089377 + - 1.746319506000441 + - 1.7082015177056216 + - 1.1560149937976565 + - 1.7957776248654098 + - 1.5861440481031013 + - 1.204590488000168 + - 1.5050958267938568 + - 1.9083442857434778 + - 1.851175367291511 + - 1.3230774042581774 + - 1.2227611942035592 + - 1.3530873140141244 + - !!python/tuple + - 1.0310275588441848 + - 1.7862171848281445 + - 1.6917082918195923 + - 1.1457637809870889 + - 1.8272119959563733 + - 1.6121504130712587 + - 1.32449207960446 + - 1.4555803484783842 + - 1.8403286452396634 + - 1.7970851957911498 + - 1.39056387307719 + - 1.3035885509440273 + - 1.390449612316442 + - !!python/tuple + - 1.0157372000732037 + - 1.7710113460766699 + - 1.6751857339200673 + - 1.1341463348474288 + - 1.7858427458970396 + - 1.5844141945626287 + - 1.3120524752557643 + - 1.4492368528128912 + - 1.8762344766154664 + - 1.7789788808311813 + - 1.3625779380367333 + - 1.2989427564057068 + - 1.3690966083835017 + - !!python/tuple + - 1.0216424595119904 + - 1.7663920245203917 + - 1.7036967006657822 + - 1.1379166391900946 + - 1.816262100602556 + - 1.6389609991936327 + - 1.2890381663548784 + - 1.4669813928801012 + - 1.8951812593450459 + - 1.7755311106041858 + - 1.3580744839378052 + - 1.2636188332729363 + - 1.3678245902041688 + - !!python/tuple + - 1.0103429786297418 + - 1.7526323641408947 + - 1.6865988223987254 + - 1.1356664852857803 + - 1.7793422172743814 + - 1.6053817081507138 + - 1.254247691140135 + - 1.455948894962764 + - 1.8858250960779082 + - 1.8200921341992962 + - 1.3491009713254658 + - 1.2695339455459607 + - 1.329034747794125 + - !!python/tuple + - 1.0103429786297418 + - 1.7526323641408947 + - 1.6865988223987254 + - 1.1356664852857803 + - 1.7793422172743814 + - 1.6053817081507138 + - 1.254247691140135 + - 1.455948894962764 + - 1.8858250960779082 + - 1.8200921341992962 + - 1.3491009713254658 + - 1.2695339455459607 + - 1.329034747794125 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000004607316 + - 7.500000013800738 + - 7.500000042034455 + - 7.5000000061448695 + - 7.500000019759492 + - 7.50000001438083 + - 7.500000005915077 + - 7.500000012199774 + - 7.500000021719485 + - 7.500000014732831 + - 7.500000005748414 + - 7.500000013164968 + - 7.500000010892708 + - !!python/tuple + - 7.000026134621178 + - 7.000079918920728 + - 7.000258945830293 + - 7.000034977674561 + - 7.00011595241798 + - 7.0000833861285185 + - 7.000033652178842 + - 7.000070395353817 + - 7.00012800781946 + - 7.0000854943135415 + - 7.000032691683903 + - 7.000076128973419 + - 7.000062669439702 + - !!python/tuple + - 6.500103769729486 + - 6.500318369861583 + - 6.501042122104476 + - 6.500138958054214 + - 6.500462904400096 + - 6.500332251138428 + - 6.500133681204523 + - 6.500280270367671 + - 6.500511392375646 + - 6.500340694185461 + - 6.50012985797145 + - 6.500303202895633 + - 6.500249393850973 + - !!python/tuple + - 6.000267286049764 + - 6.0008231966731636 + - 6.0027269430723855 + - 6.000358151826639 + - 6.0011999105694835 + - 6.000859297687899 + - 6.000344518265355 + - 6.000724198948596 + - 6.001326691745716 + - 6.000881263801329 + - 6.000334641955635 + - 6.00078377141402 + - 6.000644064205767 + - !!python/tuple + - 5.500563964947275 + - 5.5017447813969325 + - 5.505861894834418 + - 5.500756257813573 + - 5.502550742378874 + - 5.501821819704775 + - 5.500727387898639 + - 5.501533742663851 + - 5.502822996631407 + - 5.501868715393689 + - 5.500706478193456 + - 5.501660697914585 + - 5.50136315195615 + - !!python/tuple + - 5.001060082756917 + - 5.003297365348344 + - 5.011266169230945 + - 5.001422810302379 + - 5.004837491850183 + - 5.003444131729696 + - 5.001368311410553 + - 5.002895807508027 + - 5.005360045010743 + - 5.003533520054979 + - 5.001328848286843 + - 5.003137286949417 + - 5.002571746562737 + - !!python/tuple + - 4.5018507418997356 + - 4.505794354804422 + - 4.520204880326453 + - 4.502486707434556 + - 4.508537057412154 + - 4.506054766401421 + - 4.502391068971174 + - 4.505082911198355 + - 4.509472554586715 + - 4.5062134705784676 + - 4.50232183529813 + - 4.505510557202696 + - 4.504509904376928 + - !!python/tuple + - 4.003076434770939 + - 4.0097096645890336 + - 4.034712980521179 + - 4.004139132427405 + - 4.014380952788149 + - 4.01015121745065 + - 4.00397914325994 + - 4.008505514759136 + - 4.015984472614232 + - 4.010420522496706 + - 4.00386336446686 + - 4.009228941723174 + - 4.0075380169630375 + - !!python/tuple + - 3.5049524483662786 + - 3.515790660756728 + - 3.5582268252133487 + - 3.5066745239488495 + - 3.5235424886667195 + - 3.516519375163068 + - 3.5064149031148837 + - 3.5138078339902945 + - 3.5262243722946227 + - 3.51696424450769 + - 3.506227103891278 + - 3.514998290030471 + - 3.5122194763234873 + - !!python/tuple + - 3.00782459170149 + - 3.0252815999851967 + - 3.096878604450848 + - 3.010568886009389 + - 3.038014128077212 + - 3.0264703126777115 + - 3.010154405942747 + - 3.0220562169627088 + - 3.042461787771199 + - 3.0271968723607037 + - 3.0098547524152846 + - 3.023991073967628 + - 3.019482324319567 + - !!python/tuple + - 2.5122840910367334 + - 2.540407498101838 + - 2.6622123809630773 + - 2.5166429667551853 + - 2.561437465828464 + - 2.54235410325474 + - 2.515983031042414 + - 2.535144550369177 + - 2.5688693871384274 + - 2.5435456940111885 + - 2.515506273345378 + - 2.53829836204702 + - 2.5309651365650683 + - !!python/tuple + - 2.019432703555196 + - 2.065548878419282 + - 2.2764399333662957 + - 2.026443772104093 + - 2.101120841398654 + - 2.0688087234240675 + - 2.025378685016236 + - 2.0567742159271094 + - 2.1138509643206427 + - 2.070807851236996 + - 2.024610022528024 + - 2.0620254576036485 + - 2.0498490217531025 + - !!python/tuple + - 1.5315991636906339 + - 1.6105220962398943 + - 1.9528015988591585 + - 1.543846838378997 + - 1.6734146846032005 + - 1.6108775290294135 + - 1.542623130657037 + - 1.5952007709778842 + - 1.7063192060095365 + - 1.6197517967555193 + - 1.5402201351764435 + - 1.60435725683646 + - 1.5831902048108129 + - !!python/tuple + - 1.0547911780583779 + - 1.201067506407884 + - 1.7457934788704255 + - 1.0787607754972206 + - 1.257689883180784 + - 1.194887510517194 + - 1.0880206596145825 + - 1.1723255520592515 + - 1.3913637455703838 + - 1.2183537123698291 + - 1.0703258840510472 + - 1.1895059799482028 + - 1.1498080350434856 + - !!python/tuple + - 0.8335599887229803 + - 1.311998085239658 + - 1.7393060761735564 + - 0.9366425098822624 + - 1.3969170166633147 + - 1.2930800790512231 + - 0.9288205615348585 + - 1.2340083985616777 + - 1.7547946899693363 + - 1.3750305993771412 + - 0.893978860955505 + - 1.281305008108316 + - 1.1865374790031695 + - !!python/tuple + - 1.0306527966374666 + - 1.529202048276178 + - 1.9349100714853782 + - 1.1417592580804026 + - 1.5994896233709548 + - 1.5074486139699685 + - 1.1384630679522112 + - 1.4505578811001374 + - 1.97490505859449 + - 1.592623460439776 + - 1.0980034212689391 + - 1.4982907091404662 + - 1.4048100021501073 + - !!python/tuple + - 1.0776071264200646 + - 1.6487881113691538 + - 2.2285322300235118 + - 1.1678154681019797 + - 1.572053842540849 + - 1.4679671511843122 + - 1.2799844281719555 + - 1.5450723642170883 + - 2.310877770030727 + - 1.7189162899613986 + - 1.1164510569185322 + - 1.6014309854640416 + - 1.556690299427257 + - !!python/tuple + - 0.9735876306158128 + - 1.5561866168161715 + - 2.1128559767989623 + - 1.0679176468688865 + - 1.4549433054001284 + - 1.3914987970533688 + - 1.1817136387932101 + - 1.4426916841463462 + - 2.187488840953947 + - 1.6168647788596908 + - 1.012853692100723 + - 1.4990759991961853 + - 1.4542322803533858 + - !!python/tuple + - 0.9182141689034671 + - 1.592919021660137 + - 2.2505240486427085 + - 1.1427421693429187 + - 1.5831500204177027 + - 1.5800803150016465 + - 1.1847875781428838 + - 1.5207692711944993 + - 2.0168011488972897 + - 1.6567701592938038 + - 1.0562885443566208 + - 1.5727077430053917 + - 1.4605952102497826 + - !!python/tuple + - 0.9789660453123451 + - 1.635176308711055 + - 2.3148865922845543 + - 1.1324654548512259 + - 1.5308648577419346 + - 1.4863498699363071 + - 1.2545037951498113 + - 1.5319373141764434 + - 2.2800335102543206 + - 1.7278644993335845 + - 1.0394330516065609 + - 1.5927514484082168 + - 1.5638579392759133 + - !!python/tuple + - 0.9450043882995429 + - 1.619812281515239 + - 2.24138904872553 + - 1.1502773412722602 + - 1.4844650311540044 + - 1.5552082447666498 + - 1.2167412207388935 + - 1.5345837313976405 + - 2.0930740035762243 + - 1.6792876093213958 + - 1.0676422188415728 + - 1.588185473230503 + - 1.4869868844464624 + - !!python/tuple + - 0.9632687027601757 + - 1.6347412989249668 + - 2.251890990367428 + - 1.1436125352300643 + - 1.442807998307615 + - 1.5021281618554845 + - 1.2868873538150507 + - 1.536598854178266 + - 2.2415615321514397 + - 1.7262364746931125 + - 1.0393443386650882 + - 1.5964327483608953 + - 1.5595162155100346 + - !!python/tuple + - 0.9487338316877754 + - 1.621328914111466 + - 2.2453219155420956 + - 1.129177730594772 + - 1.4432753471998718 + - 1.5016495531078125 + - 1.2743038360582084 + - 1.5220242003954165 + - 2.2362557698763794 + - 1.7112966706827923 + - 1.0269595792465036 + - 1.581670112110089 + - 1.5455760618466776 + - !!python/tuple + - 0.9429308358927702 + - 1.616341315711513 + - 2.2697343574714646 + - 1.1351073708604813 + - 1.4893888970451195 + - 1.538793114814184 + - 1.2154593915016878 + - 1.5255291269187252 + - 2.150393101120105 + - 1.6810355008132671 + - 1.0542669697561748 + - 1.5806590283051285 + - 1.495541825788195 + - !!python/tuple + - 0.9523639678437359 + - 1.6250788598048516 + - 2.2712196540903493 + - 1.1447728701914566 + - 1.48329484618499 + - 1.5385447067875402 + - 1.2199130828473452 + - 1.5352314499572803 + - 2.147027104625259 + - 1.6898223788518754 + - 1.0625530607280687 + - 1.59038907919819 + - 1.5024269695704726 + - !!python/tuple + - 0.9624243561608847 + - 1.6360237743718604 + - 2.2506264021933298 + - 1.1497848901977545 + - 1.4696707947661538 + - 1.5147494520866507 + - 1.2672714926748863 + - 1.541059676194336 + - 2.18963152273192 + - 1.7202782887515513 + - 1.0480311630481707 + - 1.5996577227456374 + - 1.5450900201871014 + - !!python/tuple + - 0.9564426188820967 + - 1.6305362414652615 + - 2.252117484154111 + - 1.1435329238505143 + - 1.4750353366142155 + - 1.5155322831133873 + - 1.26731905023599 + - 1.534803618152239 + - 2.1948475541290056 + - 1.7155505081690439 + - 1.0424312084373224 + - 1.5934747383308947 + - 1.542431728893545 + - !!python/tuple + - 0.9506589011217133 + - 1.6251500192629844 + - 2.254687464321969 + - 1.1376841260297266 + - 1.4793012666467429 + - 1.5174177854310178 + - 1.2656977891111814 + - 1.528954177068071 + - 2.1984063341083484 + - 1.7099985676914558 + - 1.038199859774694 + - 1.5875314296587364 + - 1.5383207240202819 + - !!python/tuple + - 0.943555737100768 + - 1.617153527533488 + - 2.2637954538966243 + - 1.132304697112804 + - 1.4694748005114726 + - 1.530381104862677 + - 1.2410926049473998 + - 1.523787768593602 + - 2.187174411702486 + - 1.6898773557121713 + - 1.0469896886771302 + - 1.5801720438161349 + - 1.512512341748847 + - !!python/tuple + - 0.9469996480724688 + - 1.6201572964418343 + - 2.262074979881072 + - 1.1359814177937413 + - 1.4665678323852636 + - 1.5301122545838737 + - 1.2382289609062762 + - 1.5274969726658907 + - 2.1825599814758343 + - 1.6912767337729373 + - 1.0510775609389937 + - 1.5836717661462933 + - 1.511812130037811 + - !!python/tuple + - 0.9508284456833378 + - 1.6236177755547883 + - 2.2599214919556636 + - 1.1399651224993932 + - 1.4650544723710817 + - 1.5290429787055195 + - 1.2364733244384825 + - 1.53149563068378 + - 2.178218011876192 + - 1.6938069506593163 + - 1.054579594897329 + - 1.5875913831644641 + - 1.512482113826145 + - !!python/tuple + - 0.9591360886122958 + - 1.632778737484774 + - 2.2581842108579004 + - 1.1479635067014597 + - 1.4770790936857596 + - 1.5202595512306227 + - 1.2484521421924948 + - 1.539050355250555 + - 2.1730266510731324 + - 1.711246656478072 + - 1.0504416046833378 + - 1.5967863146034993 + - 1.5312446703672422 + - !!python/tuple + - 0.9569174827982782 + - 1.630887317307231 + - 2.259702513255086 + - 1.1456550684014875 + - 1.4766825007567723 + - 1.5209247191032969 + - 1.2508496770024495 + - 1.5366852347048734 + - 2.175579143839981 + - 1.710656747815854 + - 1.0478431472123555 + - 1.5945788516155734 + - 1.5322165375259453 + - !!python/tuple + - 0.9544508683486665 + - 1.6286780232806841 + - 2.2609144060890194 + - 1.1431108308416005 + - 1.4753365211615712 + - 1.5220069930181122 + - 1.2527021774182883 + - 1.5341176992031216 + - 2.1783374384345744 + - 1.709273675425767 + - 1.0457028848101886 + - 1.592073639573791 + - 1.5322912434011486 + - !!python/tuple + - 0.9495881884443811 + - 1.6229508899670733 + - 2.2573455353840304 + - 1.1380209366915062 + - 1.4702516252521118 + - 1.5263368759438243 + - 1.2486503605645365 + - 1.5295679444615025 + - 2.18656208710716 + - 1.6978521904779396 + - 1.04971881026404 + - 1.5863339685760514 + - 1.5208769369619117 + - !!python/tuple + - 0.9510903967838872 + - 1.6242144867712518 + - 2.2569167148609375 + - 1.1395427891645258 + - 1.4717271743594034 + - 1.5255932153862386 + - 1.246962791630838 + - 1.5311406289695082 + - 2.1854212902147814 + - 1.6981373381127618 + - 1.0512984270993873 + - 1.587802266373626 + - 1.5200168369552773 + - !!python/tuple + - 0.9527013713547459 + - 1.6256595295443055 + - 2.256929004640862 + - 1.141191518926011 + - 1.4731249817423255 + - 1.5247079424630348 + - 1.2454856196277915 + - 1.5328046205863093 + - 2.183942148074846 + - 1.698960697973142 + - 1.0524846133216348 + - 1.5894344951927364 + - 1.5197386912489335 + - !!python/tuple + - 0.9549859861871439 + - 1.6288107019015163 + - 2.2602002185035643 + - 1.1439015186344519 + - 1.4707559338916327 + - 1.5233855570093187 + - 1.2458760889077352 + - 1.5350132327207382 + - 2.176654274276454 + - 1.7062292970857709 + - 1.0486593790957022 + - 1.592519107789699 + - 1.526658918723996 + - !!python/tuple + - 0.9539598800395016 + - 1.627939491526269 + - 2.259834889772374 + - 1.1428764466228325 + - 1.4702471919255973 + - 1.5239955319087308 + - 1.2469470503383453 + - 1.533952227800123 + - 2.1770278760464743 + - 1.7060334836486541 + - 1.0477661081545055 + - 1.591516844641993 + - 1.5272814622028112 + - !!python/tuple + - 0.9529192385058801 + - 1.6269888193222768 + - 2.2593029957326736 + - 1.1418082187355418 + - 1.4701946885708235 + - 1.5245782463074773 + - 1.2479664199835614 + - 1.5328815025698845 + - 2.177711192426205 + - 1.7054905242196188 + - 1.0471955933666408 + - 1.590451277137331 + - 1.5275324140639628 + - !!python/tuple + - 0.9522448209900397 + - 1.6255377263852873 + - 2.2587518982167523 + - 1.1406790521386623 + - 1.4731724545526117 + - 1.5241825567670686 + - 1.2488386379419423 + - 1.5321893869763765 + - 2.1829743184147725 + - 1.7009399849154005 + - 1.0504999546874714 + - 1.5891180341714386 + - 1.5232528638133316 + - !!python/tuple + - 0.9529370518957897 + - 1.6261439842131897 + - 2.259146895249097 + - 1.1413743866567088 + - 1.4727320442623468 + - 1.5238066225696068 + - 1.2481938831449122 + - 1.532900751062581 + - 2.1829469345586228 + - 1.7011148274761587 + - 1.0509241292379397 + - 1.5898063259456092 + - 1.5228409552101068 + - !!python/tuple + - 0.953778776167264 + - 1.627532464596571 + - 2.258563986622771 + - 1.1426389789184153 + - 1.471826537767768 + - 1.5243323144662484 + - 1.2461409196274027 + - 1.533827520889567 + - 2.1794976567363684 + - 1.7042804173656685 + - 1.04883273810468 + - 1.5911759998683366 + - 1.5250009281534598 + - !!python/tuple + - 0.9533247867690858 + - 1.6271523966631596 + - 2.2584031107460554 + - 1.1421969253813715 + - 1.4722400624408858 + - 1.5245614047166547 + - 1.246440964638426 + - 1.5333640621334519 + - 2.1792380245168785 + - 1.7042776598143325 + - 1.048537080425306 + - 1.5907397602036915 + - 1.5253898188756296 + - !!python/tuple + - 0.9528822475574453 + - 1.6267422000006213 + - 2.258365096391811 + - 1.141738432352155 + - 1.4725588562249945 + - 1.5247063818244446 + - 1.246821569956173 + - 1.532906986365264 + - 2.1791435822091545 + - 1.704109614924683 + - 1.0484085389096596 + - 1.590281229084019 + - 1.5256379952080978 + - !!python/tuple + - 0.9523422567605351 + - 1.6258703465895208 + - 2.259186073927053 + - 1.1409043555170277 + - 1.4718877587426797 + - 1.5241784814056372 + - 1.2483650797001797 + - 1.5322870553279992 + - 2.1804734241142194 + - 1.7023878876597083 + - 1.049628673067794 + - 1.58940402476703 + - 1.5248373553566146 + - !!python/tuple + - 0.9525937904869932 + - 1.6260386584783526 + - 2.2592491354668205 + - 1.1411155721129576 + - 1.471641588872402 + - 1.5240024215054244 + - 1.24839490251364 + - 1.5325351175676711 + - 2.1808352141354415 + - 1.7022056084179438 + - 1.0499158077158506 + - 1.5896087084148582 + - 1.5244922225289697 + - !!python/tuple + - 0.9528922939127797 + - 1.6262781276818397 + - 2.259220665959186 + - 1.1413963392972584 + - 1.471513498932982 + - 1.5238766843956852 + - 1.2483187169216552 + - 1.5328368455936656 + - 2.181136578891724 + - 1.7021441794368692 + - 1.0501089056132715 + - 1.5898859281598476 + - 1.5241866791973009 + - !!python/tuple + - 0.9531905565742144 + - 1.6265484645054267 + - 2.2591158346599562 + - 1.14170091867791 + - 1.4715246801851745 + - 1.523818364614095 + - 1.2481548508476699 + - 1.5331445036012556 + - 2.1813513378605545 + - 1.7022003801569514 + - 1.0501876559064967 + - 1.5901899620162274 + - 1.5239551511738365 + - !!python/tuple + - 0.9535963130389319 + - 1.6271939699678544 + - 2.2586200372556364 + - 1.14234064687139 + - 1.4723836259861613 + - 1.5242912197877978 + - 1.2470187796258532 + - 1.533625708431069 + - 2.181011953566055 + - 1.7033044227302159 + - 1.0493454862473774 + - 1.5908492509446375 + - 1.524204628416283 + - !!python/tuple + - 0.9534320541389035 + - 1.6270920620582072 + - 2.2586819904547557 + - 1.1422121306963706 + - 1.4723781505840403 + - 1.5243908864297548 + - 1.2469112592253808 + - 1.5334673990466012 + - 2.180772928173296 + - 1.7034553535934767 + - 1.0491596327080925 + - 1.5907236942611704 + - 1.5244298550206932 + - !!python/tuple + - 0.9532337911799291 + - 1.626938279269045 + - 2.2587847111466264 + - 1.1420315713432494 + - 1.472279991931684 + - 1.524445969070373 + - 1.2468761911155342 + - 1.5332689749701953 + - 2.180537791358767 + - 1.703528454943584 + - 1.049040975238244 + - 1.5905447218860589 + - 1.5246475341242498 + - !!python/tuple + - 0.9530338743915112 + - 1.6267596423540451 + - 2.258899942298379 + - 1.1418297120533767 + - 1.472123227382771 + - 1.5244508541942572 + - 1.2469107396796846 + - 1.5330630190084387 + - 2.1803317163391718 + - 1.7035211524902305 + - 1.0490016292901074 + - 1.5903431262362984 + - 1.5248304740966827 + - !!python/tuple + - 0.9527618446918328 + - 1.6263105596392422 + - 2.258965019351113 + - 1.141375551681842 + - 1.4718283823552745 + - 1.5240719081592038 + - 1.2476091942805798 + - 1.5327267369818387 + - 2.180169256266222 + - 1.7028228711842008 + - 1.0495995973953027 + - 1.589881690789997 + - 1.524832978039554 + - !!python/tuple + - 0.9528732475840063 + - 1.626376439176169 + - 2.258880777868534 + - 1.1414580074398943 + - 1.471946110114321 + - 1.5240264123895255 + - 1.2477236430583947 + - 1.5328320302949838 + - 2.180295100743814 + - 1.7027090529373825 + - 1.0497151415354897 + - 1.5899632485206965 + - 1.524692330593049 + - !!python/tuple + - 0.953006834058836 + - 1.6264781942789983 + - 2.2588043247651934 + - 1.1415769816235577 + - 1.4720710802119095 + - 1.52401601984837 + - 1.2477961726092746 + - 1.5329647541987246 + - 2.180442145327716 + - 1.702645081226148 + - 1.049781547246791 + - 1.590081843916508 + - 1.524545539545565 + - !!python/tuple + - 0.9531403331441315 + - 1.6265973927810058 + - 2.2587535724986956 + - 1.141711526616708 + - 1.4721694625822086 + - 1.5240393197220563 + - 1.2478223089064158 + - 1.5331025308296855 + - 2.1805919961576476 + - 1.7026351525755257 + - 1.0497928823463685 + - 1.5902164434780046 + - 1.524412487182442 + - !!python/tuple + - 0.9533028750323636 + - 1.6268943347457474 + - 2.2589270588296366 + - 1.1420149833587911 + - 1.4719657292839945 + - 1.5243082006536106 + - 1.2474557132550876 + - 1.533317572928458 + - 2.180920361106686 + - 1.703077968041045 + - 1.0493634296955687 + - 1.590521219181734 + - 1.5243182204792307 + - !!python/tuple + - 0.9532248685489455 + - 1.6268485589244095 + - 2.258967344575541 + - 1.1419587728703613 + - 1.4718966196804995 + - 1.524318396706976 + - 1.2473628526796592 + - 1.5332446420547436 + - 2.1808716285207397 + - 1.7031590969350554 + - 1.0492957801472589 + - 1.5904648399165 + - 1.524404041735821 + - !!python/tuple + - 0.9531339261289646 + - 1.6267791111552017 + - 2.2589817092057105 + - 1.1418782857404206 + - 1.471866808553286 + - 1.5243044367594676 + - 1.2472904199959596 + - 1.5331544368907588 + - 2.180796068858467 + - 1.7032080279275306 + - 1.0492642058022699 + - 1.5903841080850416 + - 1.5245000376222195 + - !!python/tuple + - 0.9530453402229889 + - 1.6266987489949447 + - 2.2589690132827163 + - 1.141787941183766 + - 1.4718806864622587 + - 1.5242712190539949 + - 1.2472451196215892 + - 1.5330623689178857 + - 2.1807048479393853 + - 1.7032208356945888 + - 1.049270452362338 + - 1.5902935551200623 + - 1.5245923032780915 + - !!python/tuple + - 0.9529622729449976 + - 1.6265119032674955 + - 2.258804301405165 + - 1.1415960703111567 + - 1.4721280845101015 + - 1.5241085073301557 + - 1.2474027881349514 + - 1.5329376066099267 + - 2.1803845375323943 + - 1.702935819164276 + - 1.049576516107119 + - 1.590103301051651 + - 1.524702125899775 + - !!python/tuple + - 0.9530180750715055 + - 1.6265456980248068 + - 2.258812661334976 + - 1.1416365563828759 + - 1.472111506158918 + - 1.5241178399500845 + - 1.2474683545280947 + - 1.532989768356452 + - 2.1803907024565996 + - 1.7028800494958303 + - 1.0496120457619844 + - 1.5901443927760353 + - 1.5246500696365373 + - !!python/tuple + - 0.9530801533779865 + - 1.6265943332780224 + - 2.258837194152378 + - 1.1416923005625865 + - 1.4720702009208027 + - 1.5241409526584353 + - 1.2475263360385744 + - 1.5330517210451218 + - 2.180420168253271 + - 1.7028454896756997 + - 1.0496215240390552 + - 1.590200588219697 + - 1.5245881194612727 + - !!python/tuple + - 0.9531380750827724 + - 1.6266488559378394 + - 2.258870087851301 + - 1.1417532532147383 + - 1.4720180071058537 + - 1.524172106015332 + - 1.2475703755952063 + - 1.5331128439105939 + - 2.1804672789987922 + - 1.70283517330212 + - 1.0496058360462919 + - 1.5902617357840059 + - 1.5245257629183042 + - !!python/tuple + - 0.9531276099289558 + - 1.6267332660650344 + - 2.2588851678089865 + - 1.1418362157423672 + - 1.472026397182703 + - 1.524230658719808 + - 1.2474839513991145 + - 1.5331369587940757 + - 2.1807274685680262 + - 1.703060045169177 + - 1.049378983980936 + - 1.5903411105373109 + - 1.5244623988377006 + - !!python/tuple + - 0.953085651046417 + - 1.626698731262909 + - 2.258861599499517 + - 1.1417970842257732 + - 1.472059063124762 + - 1.5242085067842848 + - 1.2474425597421623 + - 1.5330944188697229 + - 2.180722879771778 + - 1.7030829572055317 + - 1.049382301165746 + - 1.5903015533701568 + - 1.5245023831538074 + - !!python/tuple + - 0.9530488223822622 + - 1.6266618330050382 + - 2.2588449288177763 + - 1.1417560796046808 + - 1.4720764651982254 + - 1.524185768493672 + - 1.2474071993848128 + - 1.533054504292039 + - 2.180703413489544 + - 1.7030894837110873 + - 1.0494014576069524 + - 1.5902604638686937 + - 1.5245440119515563 + - !!python/tuple + - 0.9530804082677625 + - 1.6266228895597838 + - 2.258905107537655 + - 1.1417188499257505 + - 1.4719708778601803 + - 1.524187071317294 + - 1.2474242347799989 + - 1.5330607115182968 + - 2.1805176292852817 + - 1.7029387303160122 + - 1.0495432396927695 + - 1.5902271418414782 + - 1.5245965285072829 + - !!python/tuple + - 0.9531080432549696 + - 1.6266473956506557 + - 2.2589087721308267 + - 1.1417463388493603 + - 1.4719766512716548 + - 1.5242029252757727 + - 1.247451744295513 + - 1.5330895189241818 + - 2.1805112900996364 + - 1.7029244591031805 + - 1.0495336782993165 + - 1.5902549168812 + - 1.524570473199437 + - !!python/tuple + - 0.953130328470322 + - 1.6266719955013538 + - 2.2589041439962334 + - 1.141773533094301 + - 1.4719935219230649 + - 1.5242155466133596 + - 1.2474774353025742 + - 1.5331147629837394 + - 2.1805158454891513 + - 1.7029213382593318 + - 1.0495150730818914 + - 1.590282052509922 + - 1.5245427787150743 + - !!python/tuple + - 0.9530900311721177 + - 1.6266825856073974 + - 2.258861732435997 + - 1.141782160889407 + - 1.472027444694727 + - 1.5241864312494156 + - 1.2474900930852602 + - 1.53309213805924 + - 2.1806364532383538 + - 1.7030236691774001 + - 1.0494350616816315 + - 1.5902870455506148 + - 1.5245047663045923 + - !!python/tuple + - 0.9530726726466834 + - 1.6266654911931215 + - 2.2588703616678285 + - 1.1417631340828691 + - 1.4720108217633825 + - 1.524178229211439 + - 1.2474726515091887 + - 1.5330732294574354 + - 2.1806459760702785 + - 1.7030318708421213 + - 1.0494464383291273 + - 1.5902679033441038 + - 1.524522010046751 + - !!python/tuple + - 0.9531007820585214 + - 1.6266551405339373 + - 2.2588765016193393 + - 1.1417532085791806 + - 1.4720339711700239 + - 1.5242071956074539 + - 1.2474333677314873 + - 1.5330872453110065 + - 2.1805751991074787 + - 1.7029626535429168 + - 1.0494993603238523 + - 1.5902612161528618 + - 1.5245653851230512 + - !!python/tuple + - 0.9531108419330832 + - 1.626666651899674 + - 2.258870422200195 + - 1.141765960507456 + - 1.4720357718385497 + - 1.524209124114672 + - 1.2474440967363365 + - 1.5330989997398619 + - 2.18056610552143 + - 1.7029585166642722 + - 1.049488911922038 + - 1.5902739287750634 + - 1.5245537789197572 + - !!python/tuple + - 0.9530889053156634 + - 1.6266711375482892 + - 2.2588865105050244 + - 1.141770351440219 + - 1.4720034491610943 + - 1.5241848206676147 + - 1.2474814701066872 + - 1.5330868321054516 + - 2.1805940033338556 + - 1.7030018507274414 + - 1.0494601849430245 + - 1.5902757755418475 + - 1.52452041613662 + - !!python/tuple + - 0.9530811971926325 + - 1.6266631107732972 + - 2.2588880509770624 + - 1.1417614422805862 + - 1.472008484274766 + - 1.5241842844947242 + - 1.247477062329692 + - 1.5330781284388302 + - 2.1806033699943037 + - 1.7030069117098672 + - 1.0494672187706284 + - 1.590266810539423 + - 1.5245266671386748 + - !!python/tuple + - 0.9530925608494893 + - 1.6266550645660176 + - 2.2588725928636726 + - 1.1417526302088992 + - 1.47201990078776 + - 1.52420178528733 + - 1.2474428670522975 + - 1.5330815807266143 + - 2.1806056378480814 + - 1.702982164759358 + - 1.0494883851801426 + - 1.5902600065512107 + - 1.52455761783312 + - !!python/tuple + - 0.95309825472682 + - 1.6266605280864936 + - 2.258874035970004 + - 1.1417586880328223 + - 1.4720144632116612 + - 1.5242014767801026 + - 1.2474431009830163 + - 1.533087827870529 + - 2.1805990564616775 + - 1.7029774641358841 + - 1.0494835739948027 + - 1.5902661690488884 + - 1.5245549392717004 + - !!python/tuple + - 0.9530926157573859 + - 1.62666890102353 + - 2.258882272026485 + - 1.141768089018137 + - 1.4720204881731351 + - 1.5241893244870577 + - 1.2474667227123524 + - 1.5330883572624636 + - 2.1805833158966883 + - 1.7029903116503062 + - 1.0494685060342692 + - 1.5902740436343408 + - 1.5245305509092082 + - !!python/tuple + - 0.9530885055519353 + - 1.6266652312730567 + - 2.258879980592398 + - 1.1417640346256523 + - 1.4720226151784581 + - 1.5241900788520055 + - 1.2474685091367768 + - 1.533083956597576 + - 2.1805866395122684 + - 1.7029941665198587 + - 1.0494718619677412 + - 1.5902698683286667 + - 1.5245311493237068 + - !!python/tuple + - 0.9530881436314836 + - 1.6266561473548338 + - 2.2588774900096036 + - 1.1417538017811146 + - 1.4720125693150923 + - 1.5241982082242598 + - 1.2474587338337932 + - 1.5330791654994882 + - 2.1806037341175175 + - 1.7029916067946185 + - 1.049483709444558 + - 1.5902605609275302 + - 1.5245467757496862 + - !!python/tuple + - 0.9530912136983826 + - 1.6266579120855187 + - 2.258879290140214 + - 1.1417557164081524 + - 1.4720119900733368 + - 1.5241980627459228 + - 1.2474557498274477 + - 1.5330819714222568 + - 2.1806041507797422 + - 1.7029883541229143 + - 1.0494822696516053 + - 1.5902626836074478 + - 1.5245484992640512 + - !!python/tuple + - 0.9530941382986361 + - 1.6266603666858703 + - 2.258880872359404 + - 1.1417584128442773 + - 1.4720129858640405 + - 1.5241971430777417 + - 1.2474534510473125 + - 1.533085040771513 + - 2.180603293551747 + - 1.7029854113652514 + - 1.049479881842529 + - 1.5902654973077415 + - 1.5245489377244916 + - !!python/tuple + - 0.9530928305099233 + - 1.6266662212954222 + - 2.2588774623354086 + - 1.1417651208203086 + - 1.4720184140818047 + - 1.5241923266554105 + - 1.2474581282893096 + - 1.533087249891505 + - 2.180589748616834 + - 1.7029873892130012 + - 1.0494729118835715 + - 1.5902713734928018 + - 1.5245375001513348 + - !!python/tuple + - 0.9530907677514375 + - 1.6266645736298266 + - 2.2588770782368894 + - 1.1417633240361922 + - 1.4720165759748811 + - 1.5241932255898527 + - 1.2474601374634144 + - 1.5330851165656854 + - 2.1805892172709673 + - 1.7029895359729563 + - 1.049474640008712 + - 1.5902694733281963 + - 1.5245366637179207 + - !!python/tuple + - 0.9530914671717856 + - 1.6266601406956176 + - 2.258880657768341 + - 1.14175821005945 + - 1.4720177182513647 + - 1.5241957364885201 + - 1.2474602590872443 + - 1.533083204478207 + - 2.1805973907174936 + - 1.702989447328533 + - 1.0494791386033588 + - 1.5902649684811738 + - 1.5245437342573298 + - !!python/tuple + - 0.9530929139277671 + - 1.6266612577221737 + - 2.2588802212822987 + - 1.1417594182209883 + - 1.4720185692905814 + - 1.5241949689657153 + - 1.247458822972196 + - 1.5330846886264504 + - 2.1805984406850247 + - 1.7029879266491468 + - 1.0494778734004548 + - 1.590266262234349 + - 1.5245446244978635 + - !!python/tuple + - 0.9530914312642648 + - 1.6266637183965937 + - 2.2588792191015186 + - 1.1417623451729229 + - 1.472015435686046 + - 1.5241946137680273 + - 1.2474573828236826 + - 1.5330851090782525 + - 2.1805937444012904 + - 1.7029882819573465 + - 1.0494760423800424 + - 1.5902686729582833 + - 1.524539724023576 + - !!python/tuple + - 0.9530925426281761 + - 1.6266619752709481 + - 2.258878562883198 + - 1.1417602463492984 + - 1.4720165489372679 + - 1.5241941933133585 + - 1.2474597955575952 + - 1.5330848251535143 + - 2.1805952426377506 + - 1.702988475219074 + - 1.0494769294519337 + - 1.5902669595792336 + - 1.5245425997563689 + - !!python/tuple + - 0.9530916558763142 + - 1.6266631590053395 + - 2.2588796002084788 + - 1.1417616951756138 + - 1.4720173639052516 + - 1.5241949401067618 + - 1.2474574031461998 + - 1.533084952672933 + - 2.1805955570001108 + - 1.7029881007895333 + - 1.0494766489537004 + - 1.5902681185910634 + - 1.5245409905282705 + - !!python/tuple + - 0.9530920595055583 + - 1.626662115376266 + - 2.2588788993089306 + - 1.141760441326016 + - 1.4720161691984324 + - 1.5241942590514619 + - 1.2474593469422963 + - 1.533084596838925 + - 2.1805941950673593 + - 1.702988826087596 + - 1.0494769138167424 + - 1.5902670577704183 + - 1.5245414923545733 + - !!python/tuple + - 0.9530923890687607 + - 1.6266623908307247 + - 2.258879085654148 + - 1.1417607326878818 + - 1.4720163568172482 + - 1.5241941666996397 + - 1.2474593466638482 + - 1.5330849563623998 + - 2.180594472907957 + - 1.7029884824455168 + - 1.0494765654419824 + - 1.5902673755173773 + - 1.5245418457422866 + - !!python/tuple + - 0.9530919958982503 + - 1.6266630619320752 + - 2.258879094282635 + - 1.141761556109075 + - 1.4720167207508457 + - 1.5241947911801657 + - 1.2474580202275765 + - 1.5330851119416278 + - 2.1805958050796077 + - 1.7029879258487213 + - 1.0494766050067768 + - 1.5902680496711916 + - 1.5245416714681364 + - !!python/tuple + - 0.953091775572888 + - 1.6266628615046972 + - 2.2588789783959906 + - 1.1417613438658725 + - 1.4720165103305596 + - 1.52419479656041 + - 1.247457947948619 + - 1.53308485989965 + - 2.180595692505161 + - 1.702988163385832 + - 1.0494768428822838 + - 1.5902678198072189 + - 1.5245414184843018 + - !!python/tuple + - 0.9530919641866793 + - 1.626662341539405 + - 2.258879263250073 + - 1.1417607150708202 + - 1.4720168031698162 + - 1.5241943458313634 + - 1.2474586220836612 + - 1.5330846630436343 + - 2.1805946940518868 + - 1.7029886949798572 + - 1.0494768200638445 + - 1.5902672854005155 + - 1.524541262690214 + - !!python/tuple + - 0.9530921431938209 + - 1.626662450465795 + - 2.2588793142323946 + - 1.141760823262641 + - 1.4720169054421541 + - 1.5241943366443444 + - 1.2474587717857515 + - 1.5330848368520118 + - 2.1805946303299084 + - 1.7029885674944687 + - 1.0494766411716412 + - 1.590267415271918 + - 1.5245414365667922 + - !!python/tuple + - 0.953092078631972 + - 1.6266629159028008 + - 2.2588790272891304 + - 1.1417613765554049 + - 1.472016495710442 + - 1.5241946740870722 + - 1.2474585199580144 + - 1.533085080519911 + - 2.1805953033542447 + - 1.7029880320479518 + - 1.0494766317086555 + - 1.5902679038738488 + - 1.5245417773948353 + - !!python/tuple + - 0.9530919569773154 + - 1.6266628304439967 + - 2.2588790659945914 + - 1.1417612906382435 + - 1.4720165563724044 + - 1.524194646209199 + - 1.2474584012125753 + - 1.5330849544244747 + - 2.180595388525609 + - 1.7029881220747176 + - 1.0494767545336994 + - 1.5902678034110642 + - 1.5245416602116348 + - !!python/tuple + - 0.9530920709334977 + - 1.6266625413301894 + - 2.25887917591455 + - 1.1417609375947635 + - 1.47201669189635 + - 1.52419444700918 + - 1.2474584562573292 + - 1.5330848447447356 + - 2.1805950349968213 + - 1.7029884882683803 + - 1.0494766537467901 + - 1.5902675046465593 + - 1.5245413943179433 + - !!python/tuple + - 0.9530921509035554 + - 1.626662607871529 + - 2.2588791252614517 + - 1.141761005520732 + - 1.4720166166582642 + - 1.5241944866748096 + - 1.2474585431478602 + - 1.533084934884531 + - 2.1805949545331402 + - 1.7029884233383854 + - 1.049476575176052 + - 1.5902675818052816 + - 1.5245414736419698 + - !!python/tuple + - 0.9530920194121791 + - 1.626662776786267 + - 2.258879195024539 + - 1.1417612206506493 + - 1.4720167615581548 + - 1.5241945634428065 + - 1.2474585845553647 + - 1.533084961195566 + - 2.1805951024330508 + - 1.702988177799558 + - 1.049476721489933 + - 1.5902677520131447 + - 1.5245416720631906 + - !!python/tuple + - 0.9530919694289073 + - 1.6266627257988149 + - 2.2588792072588624 + - 1.1417611676640573 + - 1.4720167594886484 + - 1.5241945286281302 + - 1.2474585245948142 + - 1.533084898278378 + - 2.180595167539828 + - 1.7029882254303816 + - 1.0494767666686877 + - 1.5902676936669722 + - 1.524541617902898 + - !!python/tuple + - 0.9530920556552428 + - 1.62666260662423 + - 2.258879107325138 + - 1.141761016377834 + - 1.4720166166676958 + - 1.5241945093242912 + - 1.2474584148531487 + - 1.5330848744526722 + - 2.1805951842986455 + - 1.7029884067884264 + - 1.0494766544475675 + - 1.5902675725654838 + - 1.5245414503384958 + - !!python/tuple + - 0.9530920980033648 + - 1.626662636984166 + - 2.258879112247619 + - 1.141761045912281 + - 1.4720166439422078 + - 1.5241945349983799 + - 1.2474584461599465 + - 1.533084919959098 + - 2.1805951371549135 + - 1.702988386087703 + - 1.0494766162057878 + - 1.5902676083013931 + - 1.5245414746738573 + - !!python/tuple + - 0.9530921268517423 + - 1.6266626751301245 + - 2.2588791301360183 + - 1.14176108637894 + - 1.4720166815814146 + - 1.524194557204264 + - 1.247458485665016 + - 1.5330849623567735 + - 2.1805950893162134 + - 1.70298835075605 + - 1.0494765947766358 + - 1.5902676513893805 + - 1.5245415120792951 + - !!python/tuple + - 0.9530921268517423 + - 1.6266626751301245 + - 2.2588791301360183 + - 1.14176108637894 + - 1.4720166815814146 + - 1.524194557204264 + - 1.247458485665016 + - 1.5330849623567735 + - 2.1805950893162134 + - 1.70298835075605 + - 1.0494765947766358 + - 1.5902676513893805 + - 1.5245415120792951 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000004991823 + - 7.5000000509361895 + - 7.5000000150591175 + - 7.500000004856597 + - 8.499999680000204 + - 7.500000016120839 + - 7.500000005233186 + - 7.500000009747434 + - 7.500000009375219 + - 7.500000018730817 + - 7.500000008794973 + - 7.500000010345399 + - 7.500000004901938 + - !!python/tuple + - 7.000028340358025 + - 7.000319804264779 + - 7.000087451371517 + - 7.000027564194506 + - 8.99750976311397 + - 7.000093838744914 + - 7.0000297268907135 + - 7.000055936273 + - 7.000053755297859 + - 7.000109665607668 + - 7.000050362534651 + - 7.000059447525856 + - 7.000027824392847 + - !!python/tuple + - 6.49987976432042 + - 6.665256190783601 + - 6.50034853383582 + - 6.50010945570572 + - 8.754004655589764 + - 6.505634849107181 + - 6.500118059501745 + - 6.50022250791954 + - 6.500213803789322 + - 6.500437644365155 + - 6.500200268013463 + - 6.500236525868246 + - 6.500110490724682 + - !!python/tuple + - 5.999710085695139 + - 6.440904454374517 + - 6.0009016656731955 + - 6.000281960996544 + - 8.408260000946436 + - 6.013746736767222 + - 6.000304172264211 + - 6.000574356013013 + - 6.000551802450687 + - 6.001133942706835 + - 6.0005167430831134 + - 6.000610692769292 + - 6.000284632602463 + - !!python/tuple + - 5.499618839890015 + - 6.300165975381775 + - 5.501912285602572 + - 5.500595001171152 + - 8.012733808110182 + - 5.523587985421214 + - 5.500641990249746 + - 5.501214931115031 + - 5.501167010222732 + - 5.502409280250037 + - 5.501092551487935 + - 5.501292173857604 + - 5.500600652186784 + - !!python/tuple + - 4.999701777499933 + - 6.226212957555685 + - 5.003616601371448 + - 5.001118583935581 + - 7.587648479898153 + - 5.034998933625022 + - 5.0012071869894905 + - 5.002290571701891 + - 5.002199744209246 + - 5.004566427949423 + - 5.002058694300171 + - 5.002437055519655 + - 5.001129237518256 + - !!python/tuple + - 4.50030540194959 + - 6.156906542007216 + - 4.508614418245949 + - 4.501953219573123 + - 7.1432950040769 + - 4.548194362134406 + - 4.502108494635711 + - 4.504013560548752 + - 4.50385339387584 + - 4.50805275455445 + - 4.5036048264148505 + - 4.50427204410474 + - 4.5019718854751325 + - !!python/tuple + - 4.00187547193269 + - 5.929295242864107 + - 4.016913117781942 + - 4.003885992471589 + - 6.685793199100445 + - 4.062779027864413 + - 4.00350680375306 + - 4.009482951565249 + - 4.006432138037288 + - 4.013552820177382 + - 4.005316508789822 + - 4.009107650082023 + - 4.006929952180278 + - !!python/tuple + - 3.5049217145997282 + - 5.61227349964808 + - 3.5290468497414995 + - 3.5069938611652103 + - 6.301468219004929 + - 3.5738194302264934 + - 3.5056491659071183 + - 3.5186103483530675 + - 3.5104092694194295 + - 3.522161520240555 + - 3.5077843665905926 + - 3.517065245940068 + - 3.515382911332008 + - !!python/tuple + - 3.009389341430811 + - 5.2432859515653 + - 3.0462648610319394 + - 3.011558540809428 + - 5.895759456848161 + - 3.081427500900937 + - 3.0133993860845516 + - 3.031851879351675 + - 3.016559902285004 + - 3.0378132439530066 + - 3.0105208934130547 + - 3.0287712489515988 + - 3.0295514014590723 + - !!python/tuple + - 2.5158664840280274 + - 4.8382020680534 + - 2.571055639448141 + - 2.5181421944345397 + - 5.474488559591608 + - 2.5891491037913443 + - 2.5267029710798647 + - 2.5504516436659577 + - 2.5262428085422584 + - 2.563772592004018 + - 2.5150093571879797 + - 2.5456422871819555 + - 2.549312190038999 + - !!python/tuple + - 2.025526634428056 + - 4.406963944227799 + - 2.1084598096924574 + - 2.0278817351950607 + - 5.0422935679236796 + - 2.1025430290192686 + - 2.046394571932966 + - 2.077129876082159 + - 2.042073483057277 + - 2.106870266580824 + - 2.0237359068575453 + - 2.070643780689773 + - 2.0753986288579926 + - !!python/tuple + - 1.5409163050122872 + - 3.9566407674241337 + - 1.6696006712071727 + - 1.5432526926439696 + - 4.603289004007822 + - 1.6334008810448595 + - 1.5750235258369147 + - 1.6180110028113042 + - 1.5698056092652843 + - 1.682370073125528 + - 1.5419061158048655 + - 1.610409971206802 + - 1.610129308360133 + - !!python/tuple + - 1.0711029781370365 + - 3.4852458853684056 + - 1.3075607782411718 + - 1.0751256537531582 + - 4.143741957575628 + - 1.1800220225861042 + - 1.1253500246195176 + - 1.18175179492141 + - 1.1414755481109606 + - 1.329085745449953 + - 1.0875932568581705 + - 1.1803229162529367 + - 1.1609345922819745 + - !!python/tuple + - 0.8611256105938507 + - 1.041150378723648 + - 1.422755899446009 + - 0.8595037344655905 + - 1.7799979343382868 + - 1.2735659627917695 + - 0.8920446070585948 + - 1.1276256893720416 + - 1.2055306153997547 + - 1.630215990470781 + - 1.0399725876400088 + - 1.189885602618382 + - 0.8402486076137936 + - !!python/tuple + - 1.0566662621224483 + - 0.9147203395006351 + - 1.5625346876902202 + - 1.0529224308915737 + - 1.5198012307632567 + - 1.471470944463847 + - 1.0839759390302715 + - 1.3285768649881062 + - 1.414186912886292 + - 1.831174106762754 + - 1.2613778692610376 + - 1.3942535223372845 + - 1.0332554676304972 + - !!python/tuple + - 1.3050967111958505 + - 3.0844842577234104 + - 1.809739099007041 + - 1.2297100755720596 + - 4.209503057001418 + - 1.7492740570648946 + - 1.2322003819886675 + - 1.6609474256688332 + - 1.7179543421808205 + - 2.1913934716115477 + - 1.7210832763609363 + - 1.734273775391935 + - 1.1995159393558203 + - !!python/tuple + - 1.2045233474146082 + - 3.0976862539834764 + - 1.7583492005138164 + - 1.128754845383155 + - 4.2746114802888675 + - 1.6212835527496838 + - 1.1540726240404697 + - 1.5540621530470264 + - 1.6242053410855208 + - 2.1033711095633034 + - 1.604940683503933 + - 1.6234743969534795 + - 1.1195998024923652 + - !!python/tuple + - 1.1026228484480087 + - 3.0856298577810564 + - 1.7114774671735051 + - 1.0311090231483033 + - 4.297865693498317 + - 1.486146502038987 + - 1.0865935715900013 + - 1.4388212129342612 + - 1.535113252298588 + - 2.0191875173052374 + - 1.4846363979653197 + - 1.5121382445009106 + - 1.0453413528780708 + - !!python/tuple + - 0.817146098002735 + - 2.3742423777376747 + - 1.5880146380260238 + - 0.903806880420334 + - 3.548171453824552 + - 1.3374542124507003 + - 1.0852363714127458 + - 1.1727294163467803 + - 1.326421923211151 + - 1.7351435684700305 + - 1.0351631220424995 + - 1.2300116413075959 + - 1.0010568015514931 + - !!python/tuple + - 0.8692090313184261 + - 2.2350593627866333 + - 1.6142858473947819 + - 0.9610037291072024 + - 3.357704488917248 + - 1.426181765164313 + - 1.1213549569672205 + - 1.2392089447594834 + - 1.3684641232968766 + - 1.7151066762471594 + - 1.102024721099842 + - 1.2884314187701569 + - 1.0388664527921518 + - !!python/tuple + - 0.9310884214709962 + - 2.09645579567058 + - 1.6511366522766495 + - 1.0198261587130018 + - 3.1574573234983077 + - 1.5052280940301883 + - 1.1569582323257241 + - 1.3109856348811473 + - 1.4188312477033964 + - 1.7164048474593043 + - 1.1819163507828028 + - 1.3546273193177993 + - 1.0782556388695257 + - !!python/tuple + - 0.9950649371317188 + - 1.962203273841887 + - 1.6940415590768954 + - 1.074835554590507 + - 2.9513538162535395 + - 1.5670835019633846 + - 1.189354132622514 + - 1.3806518549156004 + - 1.472961323661154 + - 1.7371204902540405 + - 1.2651964896742123 + - 1.4217863945723273 + - 1.1156815766593406 + - !!python/tuple + - 1.0143352682084619 + - 1.9286908705404682 + - 1.5013004576145734 + - 1.0071378961035844 + - 2.5151674424705703 + - 1.4456735432656778 + - 1.1065505898871304 + - 1.3837002866845953 + - 1.415566460288933 + - 2.09049915231919 + - 1.3949095334034103 + - 1.4133844227417036 + - 1.0594530296721418 + - !!python/tuple + - 0.9909067613551508 + - 2.0514015710067848 + - 1.742886370355171 + - 1.0423277062122054 + - 2.959377681432606 + - 1.5118485555135173 + - 1.1839526051433236 + - 1.3336571883650234 + - 1.4822784039264199 + - 1.8869742804201468 + - 1.228073916180682 + - 1.407914840699704 + - 1.1114361847564451 + - !!python/tuple + - 1.0420708850847875 + - 1.9391572803430202 + - 1.525973496036798 + - 1.0645674583611338 + - 2.841747509821108 + - 1.5183894049865378 + - 1.18475799170877 + - 1.4048560632766036 + - 1.4544101668854992 + - 1.955291989603087 + - 1.3947490459202492 + - 1.4834393518856983 + - 1.1141062699394249 + - !!python/tuple + - 1.0301203412240523 + - 1.927007645194533 + - 1.5259556631007918 + - 1.0476694864724336 + - 2.8268685367286857 + - 1.5192113471881554 + - 1.172050515747095 + - 1.3968286764145588 + - 1.4333142941895576 + - 1.9713727712689608 + - 1.3957524087814273 + - 1.45204328734474 + - 1.1044697537903294 + - !!python/tuple + - 1.016044118277526 + - 1.9175524148584882 + - 1.5368122882969664 + - 1.031436970165671 + - 2.813706699987401 + - 1.494510051975446 + - 1.1591521441952075 + - 1.3861480090061924 + - 1.4233923585545853 + - 1.984697911768425 + - 1.389363684305786 + - 1.4226459982568014 + - 1.0951058810224532 + - !!python/tuple + - 1.0014087271603638 + - 1.9110355905053833 + - 1.555920764385852 + - 1.0174422831553624 + - 2.8025194811687366 + - 1.4495688042824737 + - 1.1472731917408552 + - 1.3740759694822442 + - 1.424573639447478 + - 1.9944120117741262 + - 1.3767166533833202 + - 1.3978161893559382 + - 1.0869254598559603 + - !!python/tuple + - 0.9695746564019126 + - 1.9278453176820052 + - 1.6672567634915558 + - 1.0022138922857815 + - 2.781559626419329 + - 1.4474447020788819 + - 1.129564106894734 + - 1.3345501016273391 + - 1.3952039632008615 + - 1.9745342193655484 + - 1.268945937282619 + - 1.3931616789856738 + - 1.084884459699621 + - !!python/tuple + - 1.0038166929746306 + - 1.9625466258085829 + - 1.6141036873673504 + - 1.0440067805886617 + - 2.802801922748705 + - 1.4533620147873634 + - 1.1628883302072373 + - 1.3589781614101664 + - 1.4630696981913798 + - 1.9370960303954212 + - 1.2726832563193828 + - 1.4483358392982126 + - 1.1063157880047374 + - !!python/tuple + - 1.0111943322928232 + - 1.9697739418706524 + - 1.598431156094077 + - 1.0483852532568008 + - 2.8101794771869906 + - 1.4931881146949089 + - 1.1679582721206276 + - 1.3665218127747607 + - 1.4512202666052434 + - 1.9324412217683449 + - 1.2834977236056526 + - 1.460796999921856 + - 1.1095871000868096 + - !!python/tuple + - 0.9948222572639562 + - 1.976789042406129 + - 1.6169715924556882 + - 1.019398511131591 + - 2.8579212922730663 + - 1.4534948282090585 + - 1.1528479438201527 + - 1.3637591234116297 + - 1.4285866326040688 + - 1.9638943946295204 + - 1.3379352162295404 + - 1.4145465144943554 + - 1.092563470795442 + - !!python/tuple + - 0.9972315324641275 + - 1.9467174221828036 + - 1.6028336092639317 + - 1.0301798391168717 + - 2.8519425715224367 + - 1.4785627795748912 + - 1.1522042245668342 + - 1.3567504147338534 + - 1.4330144332943973 + - 1.958927380973734 + - 1.2917225006443123 + - 1.4214908521187326 + - 1.0982270402454084 + - !!python/tuple + - 0.9958556305839685 + - 1.9649155005317138 + - 1.603701320586783 + - 1.0265372382612337 + - 2.83074625900191 + - 1.4746746305511642 + - 1.151070141386258 + - 1.3578982036926308 + - 1.4290050163771852 + - 1.961601552026682 + - 1.3055284666349543 + - 1.419158614849826 + - 1.0962377140997437 + - !!python/tuple + - 0.9978896970759865 + - 1.9585533779879407 + - 1.6097283213273454 + - 1.0271786754597287 + - 2.8373257424981224 + - 1.4769512966591631 + - 1.1542883894855511 + - 1.3614871272411235 + - 1.4327827025203614 + - 1.9565083863590558 + - 1.3101188979369998 + - 1.426710784414541 + - 1.0974411565060211 + - !!python/tuple + - 0.9978900376176232 + - 1.9585544519451465 + - 1.609791752428684 + - 1.0271477159543136 + - 2.8373272477251175 + - 1.4772786554250934 + - 1.154239120358933 + - 1.361513834751861 + - 1.4326337759476577 + - 1.9565064983620923 + - 1.3100893912031473 + - 1.4270098160853943 + - 1.0974592485041639 + - !!python/tuple + - 0.997889969585882 + - 1.9585540903623058 + - 1.5980954556460347 + - 1.0256824853720194 + - 2.8159162014030565 + - 1.474074216003927 + - 1.1536473470198247 + - 1.3614756426140722 + - 1.4161785216375156 + - 1.9565070588685733 + - 1.310232434647356 + - 1.4259324350233433 + - 1.097423810752678 + - !!python/tuple + - 0.997889969585882 + - 1.9585540903623058 + - 1.5980954556460347 + - 1.0256824853720194 + - 2.8159162014030565 + - 1.474074216003927 + - 1.1536473470198247 + - 1.3614756426140722 + - 1.4161785216375156 + - 1.9565070588685733 + - 1.310232434647356 + - 1.4259324350233433 + - 1.097423810752678 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000006254853 + - 7.500000085307558 + - 7.500000019867091 + - 7.500000004068173 + - 7.500000124897405 + - 7.500000024498239 + - 7.500000013420368 + - 7.500000008572655 + - 7.500000014310969 + - 7.500000013789192 + - 7.5000000074254025 + - 7.50000000621344 + - 7.500000006814877 + - !!python/tuple + - 7.000035612560682 + - 7.000575217844773 + - 7.000116611619278 + - 7.000023048217947 + - 7.000910954840373 + - 7.000145272171889 + - 7.000077650200458 + - 7.000049064921623 + - 7.0000829681099255 + - 7.000079849998021 + - 7.000042389014648 + - 7.000035373467683 + - 7.000038850196085 + - !!python/tuple + - 6.50014148586305 + - 6.502352027912718 + - 6.500465554072388 + - 6.5000914973062685 + - 6.503780322765462 + - 6.500580944820194 + - 6.500309289876583 + - 6.5001950925118885 + - 6.500330577266271 + - 6.500318093980248 + - 6.500168478598729 + - 6.500140533887606 + - 6.50015437960211 + - !!python/tuple + - 6.0003646837240305 + - 6.006270936637631 + - 6.001206833484923 + - 6.000235622396738 + - 6.010257086726933 + - 6.0015088962004635 + - 6.000799591567933 + - 6.0005033422765806 + - 6.000854943551322 + - 6.00082247936119 + - 6.000434470035211 + - 6.000362223735474 + - 6.000398010506054 + - !!python/tuple + - 5.5007700917771025 + - 5.513782564139503 + - 5.502565595895787 + - 5.5004970245949965 + - 5.523015337792044 + - 5.50321514151332 + - 5.501694431937526 + - 5.501064101943423 + - 5.501812525876254 + - 5.501743251109064 + - 5.500917984062757 + - 5.500764881573415 + - 5.5008406976517366 + - !!python/tuple + - 5.001448930307909 + - 5.027198196356917 + - 5.004865971580109 + - 5.000933961834413 + - 5.046533724839672 + - 5.006114696739157 + - 5.003201496088321 + - 5.002004825917146 + - 5.003426420884004 + - 5.003294450955988 + - 5.001728371651564 + - 5.001439092498986 + - 5.001582292910986 + - !!python/tuple + - 4.502532555403633 + - 4.550336112893142 + - 4.508587979988517 + - 4.501629934114192 + - 4.588525417562642 + - 4.510827824248333 + - 4.505624362027562 + - 4.503509948265612 + - 4.506023330719382 + - 4.50578918579159 + - 4.503023487903043 + - 4.50251528645954 + - 4.502766752708749 + - !!python/tuple + - 4.004215851509716 + - 4.0897348743880855 + - 4.0144681076829345 + - 4.002708119219968 + - 4.162379932365355 + - 4.018316361692838 + - 4.009421654209712 + - 4.005854737003313 + - 4.010097892810741 + - 4.00970090431651 + - 4.005038240831208 + - 4.004186953072417 + - 4.004607965438634 + - !!python/tuple + - 3.5067990642810796 + - 3.6568659465715463 + - 3.523687988719674 + - 3.504356935772707 + - 3.7902499595014323 + - 3.5301425066618854 + - 3.5153158118772 + - 3.5094664256286525 + - 3.5164313252681474 + - 3.5157762120490568 + - 3.508135900283701 + - 3.506752149166851 + - 3.507436049942722 + - !!python/tuple + - 3.0107678058771423 + - 3.271525875945975 + - 3.038254888677619 + - 3.006878339062292 + - 3.5028257903162148 + - 3.0489960485674135 + - 3.024507963435438 + - 3.015042502885598 + - 3.026326587532389 + - 3.0252580485557417 + - 3.012906822871829 + - 3.010692864432742 + - 3.0117861620460453 + - !!python/tuple + - 2.5169598865086757 + - 2.963922508600959 + - 2.5618387104820775 + - 2.5107869982026156 + - 3.327302574878278 + - 2.5798587529825747 + - 2.5391425966182326 + - 2.523800845208179 + - 2.542118548036366 + - 2.5403689680917423 + - 2.5203758335820012 + - 2.5168404744316164 + - 2.5185843432017605 + - !!python/tuple + - 2.026955704580879 + - 2.7662073194163863 + - 2.10180629716659 + - 2.0170379708431074 + - 3.2686561799061233 + - 2.132790507647835 + - 2.063434702041005 + - 2.038074384172071 + - 2.068413858508161 + - 2.0654844309286404 + - 2.0324916691200374 + - 2.0267627797710097 + - 2.0295842547099654 + - !!python/tuple + - 1.5444697753966397 + - 2.587224236529649 + - 1.6746340019712842 + - 1.5291978405752649 + - 3.027300371913835 + - 1.7250601952448228 + - 1.6068210445091284 + - 1.5847907694733319 + - 1.6155462777312668 + - 1.6104091919557761 + - 1.547988235619892 + - 1.5538524599467247 + - 1.5537685889399955 + - !!python/tuple + - 1.0791972379494525 + - 2.3605428387601997 + - 1.3197939385813158 + - 1.053080104381792 + - 2.704725580341814 + - 1.4025431492285327 + - 1.1941275728387177 + - 1.1816147295537955 + - 1.2104816069753002 + - 1.2008558519221324 + - 1.0752611452383554 + - 1.112254433998127 + - 1.1029279800831895 + - !!python/tuple + - 1.1387373030564714 + - 1.5223528401419586 + - 1.5858024443174399 + - 1.0035671865061961 + - 1.5131897008640136 + - 1.7471842395723736 + - 1.555631817919349 + - 1.335405214668831 + - 1.5004403481713222 + - 1.5308018909434682 + - 1.1588330617149754 + - 1.1646060647458287 + - 1.223553640450612 + - !!python/tuple + - 1.3205707950504713 + - 1.8194119516270435 + - 1.7621544063204702 + - 1.1718584847176878 + - 1.7816108925343608 + - 1.964953716913961 + - 1.7494906892671414 + - 1.5352386836374876 + - 1.6521882066452824 + - 1.715414740371123 + - 1.342549655415386 + - 1.359112891653366 + - 1.4167856766995262 + - !!python/tuple + - 1.3306648700568073 + - 2.4775269097703534 + - 1.9516605591826672 + - 1.136262116746891 + - 2.7776994917512585 + - 1.8621973270964312 + - 1.846667225037245 + - 1.6625409293845 + - 1.7582391643719364 + - 1.7450669802293846 + - 1.3260644952981042 + - 1.580694226584994 + - 1.4982397884176422 + - !!python/tuple + - 1.2370569947408534 + - 2.2592644673827778 + - 1.8745304678056707 + - 1.0391523002918115 + - 2.5280272114587112 + - 1.7587606165788316 + - 1.7618577206346755 + - 1.5752103935084871 + - 1.7033146492643938 + - 1.6627344202829293 + - 1.2208305615185342 + - 1.4852792773462797 + - 1.397134796944138 + - !!python/tuple + - 1.1477720788834078 + - 2.0458479329081447 + - 1.8090360656289783 + - 0.9443349991066361 + - 2.2651425872698 + - 1.692797047745156 + - 1.680055013781523 + - 1.4909305325922522 + - 1.650608885023723 + - 1.5852792222568974 + - 1.1215317968765985 + - 1.3904813489231667 + - 1.2973039132259696 + - !!python/tuple + - 1.1598381221215652 + - 2.0032581632500475 + - 1.6712036883290418 + - 0.9631617728558008 + - 2.253210109900597 + - 1.9597037669045154 + - 1.593787268584474 + - 1.415255048179512 + - 1.4549295401925615 + - 1.5715850054834009 + - 1.1558824581089957 + - 1.245152362168922 + - 1.3076881082113383 + - !!python/tuple + - 1.1515084969173726 + - 2.099494564651853 + - 1.783125089843804 + - 0.9203686189064234 + - 2.305921759697002 + - 1.9467902324202462 + - 1.6983795559130304 + - 1.4262560132437785 + - 1.6007553768246026 + - 1.6705316839427173 + - 1.1300934862805818 + - 1.378100233377388 + - 1.334252284486001 + - !!python/tuple + - 1.123691969231476 + - 2.0417655824834275 + - 1.7226300645244204 + - 0.8901520093287613 + - 2.2405065991160193 + - 1.937480596041705 + - 1.6751457664746252 + - 1.3995421352738813 + - 1.5599407000694556 + - 1.6451754859972003 + - 1.0980728756673337 + - 1.3388155213134882 + - 1.3018343527901495 + - !!python/tuple + - 1.1480652284293027 + - 2.0703787996486054 + - 1.7210067127829176 + - 0.9514195705177229 + - 2.1512014639937354 + - 1.9069397347697055 + - 1.6434732740147189 + - 1.3850325775065322 + - 1.545371038299811 + - 1.596149617676757 + - 1.1489470379307671 + - 1.2670195744142687 + - 1.320654768375631 + - !!python/tuple + - 1.1491710944573912 + - 2.0559361095515016 + - 1.7285633176208408 + - 0.9447185091709575 + - 2.19111833115529 + - 1.9022444911898984 + - 1.643265262844597 + - 1.3890770897603602 + - 1.5156987701794165 + - 1.6390346946897816 + - 1.1248405771475862 + - 1.2982061916867749 + - 1.3361593112263341 + - !!python/tuple + - 1.1765856671753805 + - 2.0694192533461617 + - 1.7159158768519545 + - 0.9525511147858872 + - 2.289632685787036 + - 1.94915326331976 + - 1.6755414592599462 + - 1.4597809255573226 + - 1.6137384441526974 + - 1.6586316231716103 + - 1.1500168633916819 + - 1.3182008475360578 + - 1.339245450789647 + - !!python/tuple + - 1.1515304290510908 + - 2.0806425053524658 + - 1.7655463806499005 + - 0.939015894721672 + - 2.216944794422779 + - 1.9120000770825032 + - 1.6618719149949643 + - 1.414510198785438 + - 1.5752605455957545 + - 1.6588332483096013 + - 1.1393544154877464 + - 1.3257413225852985 + - 1.3321111715719096 + - !!python/tuple + - 1.154262371657978 + - 2.0575367059334004 + - 1.7316292086860257 + - 0.9400129766054404 + - 2.2350165484273443 + - 1.9211832933631496 + - 1.661932858096283 + - 1.4177073343192896 + - 1.5643880356800546 + - 1.6504868682385188 + - 1.1336087693308656 + - 1.2998984231610722 + - 1.3283750308579347 + - !!python/tuple + - 1.154262371657978 + - 2.0575367059334004 + - 1.7316292086860257 + - 0.9400129766054404 + - 2.2350165484273443 + - 1.9211832933631496 + - 1.661932858096283 + - 1.4177073343192896 + - 1.5643880356800546 + - 1.6504868682385188 + - 1.1336087693308656 + - 1.2998984231610722 + - 1.3283750308579347 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000006505632 + - 7.500000015956839 + - 7.5000000176519555 + - 7.5000000060960845 + - 8.499999680000204 + - 7.500000013563389 + - 7.500000012263008 + - 7.500000008732775 + - 7.50000000716359 + - 7.500000015625834 + - 7.500000008286039 + - 7.500000011763539 + - 7.500000011694754 + - !!python/tuple + - 7.000037061376037 + - 7.000092850198147 + - 7.0001031018264 + - 7.000034696155739 + - 8.99750976311397 + - 7.000078502807669 + - 7.000070770253003 + - 7.0000499993745615 + - 7.000040870280003 + - 7.00009085710973 + - 7.000047393907685 + - 7.000067811890447 + - 7.000067404984429 + - !!python/tuple + - 6.500147255076979 + - 6.500370169853852 + - 6.500411290708204 + - 6.500137837245412 + - 9.491171387123492 + - 6.500312701941107 + - 6.5002817693644355 + - 6.500198819475874 + - 6.500162427070507 + - 6.500362180898479 + - 6.500188428899695 + - 6.500269942450348 + - 6.500268316048358 + - !!python/tuple + - 6.000379593668983 + - 6.000957999066266 + - 6.001065177189366 + - 6.002064474711317 + - 9.289274304898301 + - 6.000808461008086 + - 6.000728091506061 + - 6.000740966294281 + - 6.000418818753902 + - 6.0009371935724065 + - 6.000434356170951 + - 6.004536189627703 + - 6.00422083396693 + - !!python/tuple + - 5.500801675169924 + - 5.502032661072455 + - 5.505164681892403 + - 5.5051231048746985 + - 8.969407303757967 + - 5.503667109022588 + - 5.501542034547545 + - 5.501673054897685 + - 5.500884801131435 + - 5.501988191113679 + - 5.500893722666591 + - 5.511307493894414 + - 5.510504102815241 + - !!python/tuple + - 5.0015085754534265 + - 5.003846296044968 + - 5.012016116185122 + - 5.0090898911883714 + - 8.591129822719857 + - 5.008425237898019 + - 5.006117518632941 + - 5.0030789833767235 + - 5.004148980160734 + - 5.003761413615169 + - 5.001699909052291 + - 5.01998779541872 + - 5.018584502443396 + - !!python/tuple + - 4.50263727552641 + - 4.506769379750325 + - 4.521527255905752 + - 4.513889226900096 + - 8.174956170032283 + - 4.515031805383169 + - 4.513801978368423 + - 4.5051222663953014 + - 4.509606217861612 + - 4.506618424116346 + - 4.503036317201881 + - 4.530444568109427 + - 4.528359774374155 + - !!python/tuple + - 4.004391137196902 + - 4.011365070056027 + - 4.034071665955521 + - 4.019596196322596 + - 7.732951088047158 + - 4.02375630183362 + - 4.0244713634944045 + - 4.008070543433747 + - 4.017030381592574 + - 4.011108393018036 + - 4.005171131030648 + - 4.042873721238812 + - 4.040039089697487 + - !!python/tuple + - 3.5070837203129304 + - 3.518527065585934 + - 3.5505600393729293 + - 3.526440946492893 + - 7.272495614589069 + - 3.5352374817380383 + - 3.5384695996018403 + - 3.512354058261455 + - 3.5264942981418277 + - 3.518101991372351 + - 3.508516861725647 + - 3.5578188616529647 + - 3.554167785662448 + - !!python/tuple + - 3.0112226943747777 + - 3.0297544092609066 + - 3.0727275831563383 + - 3.034871248210374 + - 6.79847266125763 + - 3.0506779003805753 + - 3.0567290269051686 + - 3.0186853929032798 + - 3.038404126661982 + - 3.0290579951074705 + - 3.0137439540506583 + - 3.0763262236497333 + - 3.0717832314415965 + - !!python/tuple + - 2.517685099478368 + - 2.547750762357594 + - 2.62517592866709 + - 2.545710133044242 + - 6.310847839838982 + - 2.572426718118791 + - 2.5811508293203174 + - 2.5283160914438323 + - 2.5536704629904547 + - 2.546604114529198 + - 2.5220198988456923 + - 2.600330323289296 + - 2.5947980768432526 + - !!python/tuple + - 2.0281282524609554 + - 2.077883953124621 + - 2.214174693934541 + - 2.062231142622311 + - 5.8107417047807 + - 2.10488415298394 + - 2.11597947616989 + - 2.046397298846454 + - 2.077168420947262 + - 2.0759512169265495 + - 2.035539852341614 + - 2.137247126050055 + - 2.1303041478285447 + - !!python/tuple + - 1.546120611198651 + - 1.6322171421387117 + - 1.8225823103522032 + - 1.5921010824812896 + - 5.29985866244608 + - 1.6516051341012776 + - 1.680201105708784 + - 1.5781693734877502 + - 1.6163729257240607 + - 1.6218869128320919 + - 1.5599268315729564 + - 1.695220759449045 + - 1.6847650602067223 + - !!python/tuple + - 0.9370612313078559 + - 1.4135611831349466 + - 1.4607328862520665 + - 0.9405998559828146 + - 2.0926263049884684 + - 1.2406750638459114 + - 1.2841940057648018 + - 1.1123067538266136 + - 1.0443115938976757 + - 1.3824391755883618 + - 1.0374512840175365 + - 1.2649875060734057 + - 1.2578997823962248 + - !!python/tuple + - 1.1451273239668445 + - 1.6311869018779834 + - 1.5913790271148582 + - 1.1420376940604404 + - 1.6158430706652003 + - 1.463908525203473 + - 1.4788247762691733 + - 1.3103999343159518 + - 1.2566699916031574 + - 1.5667771053130486 + - 1.2564591470251245 + - 1.4634652013510272 + - 1.4579064699321158 + - !!python/tuple + - 0.9294625834614384 + - 1.6698542635343638 + - 1.7859935698571905 + - 1.1535259404807903 + - 2.912386318412439 + - 1.4591787299951173 + - 1.4837273167933198 + - 1.2750927595043282 + - 1.3831146230683555 + - 1.5393887453068775 + - 1.0881779337608413 + - 1.574498354754583 + - 1.6101470026953506 + - !!python/tuple + - 0.991394521658798 + - 1.72051576033714 + - 1.7668437377961332 + - 1.2126501566619385 + - 2.7481190526474046 + - 1.551495468922089 + - 1.5291336016676629 + - 1.3391927112748248 + - 1.4506083612232983 + - 1.5743196282665228 + - 1.1481140003629888 + - 1.6072074651236223 + - 1.649373667045938 + - !!python/tuple + - 1.060773155581205 + - 1.768287772902367 + - 1.73242539658688 + - 1.2647895660201898 + - 2.5843532070588764 + - 1.6385335514428763 + - 1.5846919333982745 + - 1.4051039955827436 + - 1.4949450348681723 + - 1.6118517955986595 + - 1.2126429752437184 + - 1.6383575577757095 + - 1.6825313911441278 + - !!python/tuple + - 1.264337950818693 + - 1.6218000643326422 + - 1.5164139121102045 + - 1.1771010188706483 + - 2.258116839689876 + - 1.4388513441088875 + - 1.6130142912503902 + - 1.412256399234557 + - 1.2739581477035022 + - 1.5156128376835043 + - 1.4153726460928928 + - 1.5673617698918931 + - 1.453533352010976 + - !!python/tuple + - 1.0273028359937963 + - 1.7202968726695447 + - 1.720481194010111 + - 1.1414949176648002 + - 2.494360009434959 + - 1.4730780079328627 + - 1.511808205935359 + - 1.3407134752172194 + - 1.3150738020178312 + - 1.541958872130978 + - 1.2162830133420248 + - 1.5565569422557164 + - 1.6214912517775737 + - !!python/tuple + - 1.033446290369491 + - 1.701250682294471 + - 1.7365613691550812 + - 1.1661130876899581 + - 2.491821951334557 + - 1.5107391833256667 + - 1.5529695169771518 + - 1.3515877190307461 + - 1.3530155607572172 + - 1.5756647682547886 + - 1.2126239368237584 + - 1.5676982304101026 + - 1.6580074948070012 + - !!python/tuple + - 1.0511023513912268 + - 1.677066472659623 + - 1.7354546788640737 + - 1.1908862954749382 + - 2.4838859777789013 + - 1.5478866527439659 + - 1.6105547730058476 + - 1.3514857341140198 + - 1.3959014899527415 + - 1.6006116534303847 + - 1.219600565193963 + - 1.571347930958157 + - 1.6817486135230255 + - !!python/tuple + - 1.1024925201953064 + - 1.6543170150261406 + - 1.6628814160015573 + - 1.231531023938823 + - 2.488197079016685 + - 1.6064797627783094 + - 1.660967642148918 + - 1.3893725260133807 + - 1.451212926116423 + - 1.578612799162295 + - 1.2504570158131603 + - 1.6027651270633116 + - 1.6805093499418369 + - !!python/tuple + - 1.1298613913234334 + - 1.6564912249120662 + - 1.6060791430492103 + - 1.2443065104901125 + - 2.499203307105395 + - 1.623340975271053 + - 1.6475982644771532 + - 1.433342825000701 + - 1.4483822440676795 + - 1.5506307824646164 + - 1.2682986029668148 + - 1.627331397991516 + - 1.6623040520766075 + - !!python/tuple + - 1.1974090586862285 + - 1.6600473295828986 + - 1.6080326842136938 + - 1.2420461972632189 + - 2.422580483043173 + - 1.5944569011374343 + - 1.7050477527211867 + - 1.419944338564598 + - 1.38784261014193 + - 1.5921551122674202 + - 1.3390945672219634 + - 1.6178500180013924 + - 1.5683088994148757 + - !!python/tuple + - 1.1831671411608984 + - 1.6588845165895627 + - 1.676231186943496 + - 1.2039117863199733 + - 2.385087385019607 + - 1.4794594038192894 + - 1.6343732396736814 + - 1.3890532746693924 + - 1.3364650276671453 + - 1.5659679098936126 + - 1.3543833188988734 + - 1.591730615326226 + - 1.517630843786024 + - !!python/tuple + - 1.110804855602142 + - 1.7092311999459107 + - 1.6111309528123687 + - 1.1619194042311767 + - 2.2982229168104764 + - 1.4608467535824214 + - 1.5852360748314025 + - 1.3393255572532623 + - 1.3478692171762703 + - 1.4797990854647716 + - 1.3034946499981668 + - 1.5720528795793793 + - 1.5615379776688216 + - !!python/tuple + - 1.121404241446328 + - 1.6286414614738283 + - 1.5761798807561005 + - 1.1970811978632658 + - 2.377799706493222 + - 1.5159274035637507 + - 1.5875846093660992 + - 1.351086838915287 + - 1.380106554757497 + - 1.5523207470196576 + - 1.2809137107218165 + - 1.5839680009847128 + - 1.5880178613138 + - !!python/tuple + - 1.1636399242409026 + - 1.6974110997595895 + - 1.637683625524524 + - 1.206964233889294 + - 2.434206947493992 + - 1.5335857435416937 + - 1.654737533462408 + - 1.3907724365446008 + - 1.3754247063964364 + - 1.5595931369370855 + - 1.3120139956594878 + - 1.601399638186626 + - 1.5659105600104113 + - !!python/tuple + - 1.1619659663097925 + - 1.699650393470551 + - 1.653512534961873 + - 1.2012967001302546 + - 2.4059414103216468 + - 1.5319829187084888 + - 1.6432003859374151 + - 1.4081838092524388 + - 1.3799289607178205 + - 1.5423015612224802 + - 1.3138270471308415 + - 1.5957596284570426 + - 1.5760182872337585 + - !!python/tuple + - 1.1400535391554645 + - 1.6737991198982272 + - 1.6278110573919056 + - 1.1877633337231017 + - 2.367750546694284 + - 1.5397805152373771 + - 1.605661437894548 + - 1.384713742664236 + - 1.3553940562753677 + - 1.5469199618307685 + - 1.3045129789731709 + - 1.587084743469781 + - 1.5679732448073367 + - !!python/tuple + - 1.1428093783125406 + - 1.6591286203893123 + - 1.5955860413547942 + - 1.1923604633440152 + - 2.3881124340894613 + - 1.5103978226644117 + - 1.6092531442758549 + - 1.3842169552162005 + - 1.3759497433217533 + - 1.5145159666315229 + - 1.3017422105606027 + - 1.5966158010237035 + - 1.5754261024694203 + - !!python/tuple + - 1.139622894866102 + - 1.6843010121925932 + - 1.5975180393178228 + - 1.1956278668679508 + - 2.372486867907074 + - 1.5158350002689094 + - 1.6241720537685294 + - 1.3696252145220758 + - 1.3730572940779862 + - 1.5186288645483539 + - 1.2968098798202012 + - 1.6149876754468024 + - 1.5653360335242958 + - !!python/tuple + - 1.139622894866102 + - 1.6843010121925932 + - 1.5975180393178228 + - 1.1956278668679508 + - 2.372486867907074 + - 1.5158350002689094 + - 1.6241720537685294 + - 1.3696252145220758 + - 1.3730572940779862 + - 1.5186288645483539 + - 1.2968098798202012 + - 1.6149876754468024 + - 1.5653360335242958 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000006065898 + - 8.499999680000204 + - 7.500000012952635 + - 7.500000006381678 + - 7.500000023739355 + - 7.50000001149018 + - 7.500000006105482 + - 7.500000021012574 + - 7.500000011999216 + - 7.500000012054927 + - 7.500000009741287 + - 7.500000015007505 + - 7.500000009093252 + - !!python/tuple + - 7.000214173919602 + - 8.262969304104006 + - 7.000074865561115 + - 7.002002945005545 + - 7.000140537071889 + - 7.000426557279161 + - 7.000706468929746 + - 7.000123648175005 + - 7.000069206999029 + - 7.000594537783743 + - 6.999644416231112 + - 7.000087141611611 + - 7.00295220480807 + - !!python/tuple + - 6.500549624963738 + - 7.9116169892968635 + - 6.5002981483495965 + - 6.50448558174056 + - 6.500561855420832 + - 6.499461545463028 + - 6.501654307353936 + - 6.500493849899115 + - 6.500275519288072 + - 6.501472065809258 + - 6.499234581447615 + - 6.500347292870349 + - 6.5065694057108905 + - !!python/tuple + - 6.001023076207641 + - 7.511476656132699 + - 6.000770637067875 + - 6.007231180102365 + - 6.001458847949019 + - 5.997749252251746 + - 6.002789575007223 + - 6.001280800518211 + - 6.000711862786262 + - 6.002648525955974 + - 5.998923258458529 + - 6.000898435831003 + - 6.010545556187735 + - !!python/tuple + - 5.50168683564844 + - 7.085133621412891 + - 5.501632697197438 + - 5.510228362999724 + - 5.503107324752341 + - 5.495723641766569 + - 5.504141758165772 + - 5.502724390261897 + - 5.5015074676103355 + - 5.504228902197235 + - 5.498844929270029 + - 5.501905387056733 + - 5.51487735933239 + - !!python/tuple + - 5.002678167462994 + - 6.643169590111573 + - 5.003084004626115 + - 5.014406574566252 + - 5.005906980578818 + - 4.99207965044878 + - 5.005786757246269 + - 5.017884285919136 + - 5.002845863136427 + - 5.006390520360284 + - 4.996559298441268 + - 5.01070590490015 + - 5.021021887995046 + - !!python/tuple + - 4.504106601855431 + - 6.181840032542105 + - 4.5054161491301 + - 4.519630917934373 + - 4.510454293260205 + - 4.4875354389933575 + - 4.507849139448407 + - 4.544100967503697 + - 4.504994532774853 + - 4.509404622954988 + - 4.492957861657815 + - 4.525677570546676 + - 4.528779759359123 + - !!python/tuple + - 4.006151505031442 + - 5.705971656197089 + - 4.009069136834286 + - 4.025954221310354 + - 4.017672632054834 + - 3.98272396648574 + - 4.010521715732251 + - 4.080372694186218 + - 4.008356154325986 + - 4.013686421067546 + - 3.9887814725649644 + - 4.046209178153156 + - 4.03824177829439 + - !!python/tuple + - 3.510193592697355 + - 5.22445374709999 + - 3.514735114851998 + - 3.5351161075288053 + - 3.5290587917602094 + - 3.477368587359698 + - 3.514775577265131 + - 3.6270523553072596 + - 3.5135623457539262 + - 3.5221830068130844 + - 3.4836861115982525 + - 3.572502169431291 + - 3.551851442517888 + - !!python/tuple + - 3.0164881570014783 + - 4.731432509633356 + - 3.023562914737724 + - 3.0473157552539027 + - 3.0471845478662734 + - 2.9724925808297327 + - 3.020969407658382 + - 3.18600657200431 + - 3.0216578317468095 + - 3.0356268015654866 + - 2.9787622226098716 + - 3.105674242193199 + - 3.070033914071418 + - !!python/tuple + - 2.5268365639575183 + - 4.234747795653188 + - 2.537599591020027 + - 2.565359004873774 + - 2.5768041470245704 + - 2.4675822485678074 + - 2.529867182262307 + - 2.7660925565477292 + - 2.5344964530425904 + - 2.555773163084478 + - 2.4749689192207427 + - 2.6600005219215985 + - 2.5961091763122868 + - !!python/tuple + - 2.0433936066040856 + - 3.7304535627326114 + - 2.060860149806502 + - 2.0912588692704395 + - 2.1275137568170823 + - 1.9620022086536335 + - 2.0478082755236238 + - 2.349408171211611 + - 2.0643782208621166 + - 2.086372317386014 + - 1.9812662938701957 + - 2.233394931039501 + - 2.1281803707279643 + - !!python/tuple + - 1.5693681847145053 + - 3.2159053481023854 + - 1.60232196239812 + - 1.6286837736902795 + - 1.7204123507991214 + - 1.4609980164991367 + - 1.5841619505640787 + - 1.937404233282636 + - 1.6223077537658814 + - 1.6358652727512788 + - 1.5093353253831476 + - 1.8202937963270716 + - 1.6672810403349607 + - !!python/tuple + - 1.1103260911062858 + - 1.3971620384678345 + - 1.4959198263495967 + - 1.1496563082839866 + - 1.9031399479791513 + - 1.3037486980859623 + - 1.1452836961807742 + - 1.5995120369049642 + - 1.4825850680909212 + - 1.4722204269620223 + - 1.340860092822905 + - 1.4384459827590086 + - 1.309650137246688 + - !!python/tuple + - 1.2909221351610412 + - 1.658742951336413 + - 1.6679865815658872 + - 1.3420096708781777 + - 2.080730569388016 + - 1.494979688800118 + - 1.344805272684091 + - 1.780638121793203 + - 1.6943330362978433 + - 1.671357199182796 + - 1.5562701091036832 + - 1.61309047240411 + - 1.50120426889243 + - !!python/tuple + - 1.2176427261999239 + - 3.0846572856083 + - 1.6612772636509734 + - 1.4118938627644324 + - 2.032772269576958 + - 1.2684463269894712 + - 1.479574306333389 + - 1.931590062844142 + - 1.8844694174188006 + - 1.7016419280084654 + - 1.6057320314520054 + - 1.798559579166681 + - 1.5467607922190194 + - !!python/tuple + - 1.1336941950978807 + - 2.8818682682038523 + - 1.629843040179217 + - 1.3162345679061254 + - 1.9834262735931498 + - 1.1406484124370817 + - 1.3957881497146034 + - 1.7853511119706662 + - 1.8006499373486955 + - 1.5908410350846307 + - 1.4977882709211325 + - 1.7027489553927793 + - 1.4262305975305956 + - !!python/tuple + - 1.0585013114844501 + - 2.665678759552745 + - 1.5973872776225286 + - 1.2276335956623616 + - 1.933059329658425 + - 1.025895543640771 + - 1.3136747165086229 + - 1.6852302433277546 + - 1.710916215336898 + - 1.4927106684618625 + - 1.3819840202907172 + - 1.6273175994519526 + - 1.3268943245696356 + - !!python/tuple + - 1.1418713523397066 + - 1.8487686676206843 + - 1.4857488902877867 + - 1.1985000467371871 + - 1.8926379111977405 + - 1.3763833062761985 + - 1.1736376126168997 + - 1.6697659802614053 + - 1.596408509631595 + - 1.5874063935089513 + - 1.424089323761566 + - 1.4498454050011373 + - 1.328438110821535 + - !!python/tuple + - 1.182666615365443 + - 1.9487000792743319 + - 1.4834711671222187 + - 1.2504598299823644 + - 1.924667475445475 + - 1.432115510992756 + - 1.2298335278012542 + - 1.747350088551548 + - 1.6499899343700244 + - 1.6508164586720275 + - 1.4922905690797226 + - 1.4988152510486037 + - 1.3918760140565622 + - !!python/tuple + - 1.1714263129125764 + - 2.5948335087672905 + - 1.6354035257566257 + - 1.3382424753737665 + - 1.9321659086110945 + - 1.2239927001510937 + - 1.3987311108359661 + - 1.8087098822046537 + - 1.7812474629417188 + - 1.7065887034097849 + - 1.5590758440461443 + - 1.7435294074221657 + - 1.5360340258448202 + - !!python/tuple + - 1.1446025453292195 + - 2.5901803032897592 + - 1.6375140715754501 + - 1.3125833973316026 + - 1.9119043282791515 + - 1.177625836000153 + - 1.3632954357500084 + - 1.7654860138070356 + - 1.751786549974431 + - 1.6654298965544845 + - 1.5245608722721602 + - 1.7304477304576487 + - 1.4965022068558045 + - !!python/tuple + - 1.1194974989216155 + - 2.5749714032782713 + - 1.634041588900714 + - 1.2851252746458672 + - 1.8943823497500083 + - 1.1427597403548988 + - 1.32213138756835 + - 1.711395801048277 + - 1.722095771061785 + - 1.623254617572962 + - 1.4942196513949613 + - 1.704330992677159 + - 1.4495945128980723 + - !!python/tuple + - 1.0994983801542648 + - 2.542122210212872 + - 1.6257557128446116 + - 1.25885629319966 + - 1.881360349219608 + - 1.1167099886025784 + - 1.2820352430769513 + - 1.6848157871014515 + - 1.6897465585206486 + - 1.58323724992028 + - 1.459464627928234 + - 1.6772014561318551 + - 1.4046189505430833 + - !!python/tuple + - 1.104539678153353 + - 2.2077955920320758 + - 1.5580118155681255 + - 1.202590200240039 + - 1.8983448830206817 + - 1.1481973357366977 + - 1.1957708024747242 + - 1.6115644961401827 + - 1.6137353383713318 + - 1.5197608067453179 + - 1.3667947343663176 + - 1.5348051560085965 + - 1.3334925602611325 + - !!python/tuple + - 1.1214807411160912 + - 2.1292702352170187 + - 1.549004603439683 + - 1.2103110711862155 + - 1.91198279206755 + - 1.1750824861452531 + - 1.2062980293700365 + - 1.6230459848710197 + - 1.6248230068119816 + - 1.5346834117098496 + - 1.3755746576972483 + - 1.5305659836099121 + - 1.344701676346333 + - !!python/tuple + - 1.1364934854768423 + - 2.0828600944936446 + - 1.5438634852743442 + - 1.2186171575363236 + - 1.9252746733877166 + - 1.2108515091125904 + - 1.2181725303754 + - 1.6344825561158265 + - 1.6413809772216092 + - 1.554217504827991 + - 1.3964303498391577 + - 1.5197588288606176 + - 1.3534125691003809 + - !!python/tuple + - 1.1482126388896754 + - 2.0681383300309815 + - 1.542813783704024 + - 1.2266342655514861 + - 1.9366776473322467 + - 1.2510847759177455 + - 1.2284502370845702 + - 1.6755228333695855 + - 1.6458664379941597 + - 1.5788195141097359 + - 1.4087965505997528 + - 1.5134200700025406 + - 1.3759920314688145 + - !!python/tuple + - 1.1557597276893115 + - 2.0830533607789588 + - 1.545618120851768 + - 1.2336019606345154 + - 1.9450209038850323 + - 1.2916300688163498 + - 1.2381383572535376 + - 1.7045835925025632 + - 1.6547535155930786 + - 1.6030915233827814 + - 1.4303652075989177 + - 1.5033571977076579 + - 1.391894723034534 + - !!python/tuple + - 1.158759957143455 + - 2.124092495728906 + - 1.5516331047895113 + - 1.2389356808560572 + - 1.9496005931856666 + - 1.3289884721497573 + - 1.2464487773385005 + - 1.717957446556482 + - 1.6669303324860294 + - 1.6249340954162814 + - 1.4586678088065492 + - 1.4915584808410816 + - 1.4002026269755656 + - !!python/tuple + - 1.1601373437809346 + - 2.2038898640486915 + - 1.5788389536974639 + - 1.2646804231652773 + - 1.94103546811308 + - 1.3496963690264037 + - 1.2851594373078656 + - 1.7694650475637046 + - 1.6954548631303907 + - 1.6688778766695247 + - 1.506579109431847 + - 1.5732391372618386 + - 1.4384537300570728 + - !!python/tuple + - 1.1520652507431983 + - 2.2518543543621745 + - 1.5940128393358264 + - 1.2745528532995567 + - 1.9239296422183485 + - 1.3045916699959736 + - 1.312559653258568 + - 1.7422915036001994 + - 1.7084366502350778 + - 1.674917445299233 + - 1.513638445809277 + - 1.6208403452420166 + - 1.4585433851608143 + - !!python/tuple + - 1.1445943770681712 + - 2.288613884655799 + - 1.5983419782522235 + - 1.2737789200551053 + - 1.9152634327632059 + - 1.2788334906185965 + - 1.3151936298233575 + - 1.7538366215609964 + - 1.6986243998402555 + - 1.6697403058496114 + - 1.5002030044347658 + - 1.6346706933749289 + - 1.465432999998131 + - !!python/tuple + - 1.1349419194901504 + - 2.34039499387221 + - 1.6000666115501057 + - 1.2681528918162719 + - 1.9079818541768567 + - 1.2572352921085963 + - 1.3107061498712984 + - 1.7429071507705691 + - 1.6904144549595805 + - 1.6591896802919377 + - 1.4920020295750036 + - 1.62405259316767 + - 1.458618022138915 + - !!python/tuple + - 1.1276789946821073 + - 2.374179115236623 + - 1.599233342432418 + - 1.2630828074420701 + - 1.9028998023611121 + - 1.2315988097457664 + - 1.3062742852670144 + - 1.7195277963490148 + - 1.689099616104727 + - 1.6445916903670228 + - 1.487953425663779 + - 1.6116419394709947 + - 1.442860353475716 + - !!python/tuple + - 1.123392320283532 + - 2.3902085616099753 + - 1.5961552728000967 + - 1.2590004457034925 + - 1.9004884083385427 + - 1.2047695298445538 + - 1.3003313393115907 + - 1.7225495823434829 + - 1.6843354489798978 + - 1.6275195741662996 + - 1.4764449200373633 + - 1.6087843237888404 + - 1.4264257329908299 + - !!python/tuple + - 1.148238612695503 + - 2.2320023168537553 + - 1.564506017883528 + - 1.2599928567294716 + - 1.9319399661592704 + - 1.2335669090359704 + - 1.2522176202263406 + - 1.6931254612865896 + - 1.6604021899708192 + - 1.588215437108015 + - 1.4182648763107526 + - 1.5829130690816022 + - 1.3990473958897687 + - !!python/tuple + - 1.147112178216937 + - 2.2131054339925913 + - 1.5731786585014427 + - 1.253310022556913 + - 1.9285708882376515 + - 1.2771714621008925 + - 1.2729489553916993 + - 1.703302558517261 + - 1.6821132991250332 + - 1.6150112702554178 + - 1.443952343118938 + - 1.5292221794965937 + - 1.4041706230075013 + - !!python/tuple + - 1.1273957589202903 + - 2.2923945357841373 + - 1.5850207776074987 + - 1.2454596541346983 + - 1.9120120102434466 + - 1.2382003725420259 + - 1.2699281174537143 + - 1.710259954454016 + - 1.6638116648638939 + - 1.6289220018942605 + - 1.4658300112737908 + - 1.6036308985578265 + - 1.4281801244526777 + - !!python/tuple + - 1.1314262074194257 + - 2.2790545693229585 + - 1.5829392136647793 + - 1.2510505457045877 + - 1.9136592429577755 + - 1.215696118655933 + - 1.274163894255317 + - 1.6880534654107575 + - 1.6713917007838137 + - 1.6239320216305846 + - 1.469802599839764 + - 1.6213275660780442 + - 1.4270728564771917 + - !!python/tuple + - 1.1360273307257547 + - 2.2553242500891733 + - 1.5794493797920695 + - 1.254040936377468 + - 1.9184999841383772 + - 1.2421148841976928 + - 1.2651645304650128 + - 1.7171767096976933 + - 1.682873145562501 + - 1.6137254196509436 + - 1.4640772339895056 + - 1.569089019288396 + - 1.4056438708508783 + - !!python/tuple + - 1.1433709146313489 + - 2.260879227496519 + - 1.577910851474198 + - 1.2626799789370147 + - 1.9197733457602384 + - 1.2370593432367076 + - 1.2565429796788627 + - 1.6991349576630952 + - 1.658788566684632 + - 1.6093780025870335 + - 1.475990406468493 + - 1.6084816887869693 + - 1.4106223578969004 + - !!python/tuple + - 1.1433709146313489 + - 2.260879227496519 + - 1.577910851474198 + - 1.2626799789370147 + - 1.9197733457602384 + - 1.2370593432367076 + - 1.2565429796788627 + - 1.6991349576630952 + - 1.658788566684632 + - 1.6093780025870335 + - 1.475990406468493 + - 1.6084816887869693 + - 1.4106223578969004 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.50000000472508 + - 7.500000025580184 + - 7.500000018510686 + - 7.5000000045986255 + - 7.500000078905275 + - 7.500000008474921 + - 7.50000001477649 + - 7.500000006733071 + - 7.500000012387224 + - 7.500000007315256 + - 7.500000007411383 + - 7.500000017434096 + - 7.5000000087725995 + - !!python/tuple + - 7.000026809773702 + - 7.000152049280539 + - 7.000108323864657 + - 7.000026084808472 + - 7.000525147388741 + - 7.00004849488092 + - 7.000085756020544 + - 7.000038376751552 + - 7.000071506984623 + - 7.000041749855678 + - 7.000042307644297 + - 7.000101780066199 + - 7.000050231887482 + - !!python/tuple + - 6.5001064549522525 + - 6.500608283796009 + - 6.500432255650836 + - 6.500103571622787 + - 6.502142210764259 + - 6.500192819172335 + - 6.500341742437276 + - 6.500152493812902 + - 6.500284715304718 + - 6.500165931679247 + - 6.500168154343344 + - 6.500405986211337 + - 6.50019974689348 + - !!python/tuple + - 6.00027421597138 + - 6.0015806258109246 + - 6.001119876885095 + - 6.000266774810058 + - 6.0056955555601945 + - 6.000497456741032 + - 6.000883991454973 + - 6.000393135302608 + - 6.000735742033327 + - 6.0004278824383395 + - 6.000433631316969 + - 6.001051343220914 + - 6.000515393648968 + - !!python/tuple + - 5.50057862019182 + - 5.503369798705549 + - 5.502379135149787 + - 5.50056288385492 + - 5.512476487513968 + - 5.501051609031566 + - 5.5018745397848265 + - 5.500830366705403 + - 5.501558333074705 + - 5.5009040164070315 + - 5.500916205649598 + - 5.502232347423504 + - 5.501089686401582 + - !!python/tuple + - 5.001087704813038 + - 5.006412957571695 + - 5.0045087054647155 + - 5.001058045272995 + - 5.024524141614307 + - 5.00198117526609 + - 5.003544624456039 + - 5.001562774159898 + - 5.002942559924216 + - 5.001701963899393 + - 5.001725009135143 + - 5.004227836749543 + - 5.002053268725035 + - !!python/tuple + - 4.501899123588965 + - 4.511364830974038 + - 4.50794970946344 + - 4.501847173437303 + - 4.5451781562247495 + - 4.503468301628811 + - 4.50623319111928 + - 4.502732464640897 + - 4.505165663176999 + - 4.502977059966655 + - 4.50301757581218 + - 4.507448742811435 + - 4.503595269062052 + - !!python/tuple + - 4.003157182482273 + - 4.01924317107943 + - 4.013376796901601 + - 4.003070479748108 + - 4.080120539210934 + - 4.005784773721889 + - 4.01045399717701 + - 4.004550534053401 + - 4.008645411552652 + - 4.004960397012015 + - 4.005028327465053 + - 4.012521937747404 + - 4.005998105588609 + - !!python/tuple + - 3.505083098031633 + - 3.531705533384837 + - 3.5218683534407105 + - 3.5049428144611365 + - 3.639323056538602 + - 3.509352290367906 + - 3.517019564169965 + - 3.50734270565007 + - 3.5140378600952866 + - 3.5080092187249807 + - 3.5081197658132086 + - 3.520446422616181 + - 3.5097003847836006 + - !!python/tuple + - 3.0080323813353953 + - 3.0516142278179816 + - 3.0352484651607172 + - 3.007809272326038 + - 3.240297068389586 + - 3.014859038999627 + - 3.0272872660246426 + - 3.0116368332935037 + - 3.0224296996380864 + - 3.012703830481714 + - 3.012880965868821 + - 3.032906132335111 + - 3.0154187263655747 + - !!python/tuple + - 2.5126132495439846 + - 2.584283903967499 + - 2.5568373397660715 + - 2.512259829490555 + - 2.911278265083246 + - 2.5235060688733073 + - 2.5436940380183026 + - 2.518345928487123 + - 2.5357525327806463 + - 2.5200510340105593 + - 2.5203344536521395 + - 2.552954736929846 + - 2.5244056549222176 + - !!python/tuple + - 2.019960149356552 + - 2.1404496223511194 + - 2.093278569761149 + - 2.0193938398316877 + - 2.686458795470134 + - 2.03759268041885 + - 2.0710569181188205 + - 2.02919800529833 + - 2.05778487453824 + - 2.031963892575795 + - 2.032424413559054 + - 2.0866841503822497 + - 2.0390634307009248 + - !!python/tuple + - 1.5324739147190667 + - 1.7434258105174025 + - 1.6594770605736207 + - 1.5315347419575887 + - 2.5849467159628103 + - 1.56214718925848 + - 1.620189694856883 + - 1.547921128405369 + - 1.5969599319246497 + - 1.5525897706346206 + - 1.5533689250753597 + - 1.6477804421668218 + - 1.5646562340980317 + - !!python/tuple + - 1.0563582288517517 + - 1.4417222405948942 + - 1.2920826173965674 + - 1.054675858740859 + - 2.596277689763282 + - 1.110570448852239 + - 1.2191729000771299 + - 1.0843558720027502 + - 1.1756262598781877 + - 1.0929209460404439 + - 1.0943542847754673 + - 1.2705211487007557 + - 1.115225616697098 + - !!python/tuple + - 0.8418861050968547 + - 1.789279874998661 + - 1.4588133808148895 + - 0.8372206775768616 + - 1.329563725888695 + - 1.0383650598697445 + - 1.4048112316193373 + - 0.9646614352087093 + - 1.2986573849127014 + - 1.0165866367977092 + - 0.9836198157103355 + - 1.4285235859192338 + - 1.0908926209013203 + - !!python/tuple + - 1.0436036115758633 + - 1.93315665585041 + - 1.6599149935363613 + - 1.0328670602578378 + - 1.4189794039189645 + - 1.2471822874864784 + - 1.6270431842011701 + - 1.1674832097030763 + - 1.5098839043801577 + - 1.2356733835538851 + - 1.1964537617114024 + - 1.6196471439269304 + - 1.3047565873103413 + - !!python/tuple + - 1.0965975132081027 + - 2.162290559051687 + - 1.8011217685538323 + - 1.043747805681024 + - 2.7029385435220585 + - 1.2932476629679925 + - 1.7514638271158771 + - 1.3042223761011147 + - 1.5680190876450535 + - 1.415640463681565 + - 1.2258303664187242 + - 1.695205999923691 + - 1.4775310937607995 + - !!python/tuple + - 0.9913332970008975 + - 2.092748686150952 + - 1.7050213084696766 + - 0.9516275550637193 + - 2.4165854507964686 + - 1.1937372377108608 + - 1.65919809567136 + - 1.2306229235250314 + - 1.4868088766897842 + - 1.3377330220119301 + - 1.1239740884502007 + - 1.5735295658900892 + - 1.3980996305873723 + - !!python/tuple + - 1.0034807087995126 + - 1.8559656048717121 + - 1.8718815888398976 + - 1.0074596514447691 + - 2.2024958876916165 + - 1.3406325009253477 + - 1.726505023501411 + - 1.138434563570633 + - 1.5882150063469176 + - 1.2628765982373582 + - 1.2625549825480702 + - 1.8172699640864547 + - 1.3351833959047499 + - !!python/tuple + - 0.9918842596712816 + - 2.2685752310978233 + - 1.8387277014172958 + - 0.9813260372057525 + - 2.348431609565123 + - 1.2640502459773262 + - 1.7616146523522525 + - 1.320402476110631 + - 1.5600792198317912 + - 1.3550420657866917 + - 1.1665043198315737 + - 1.716952667964607 + - 1.4602967292891975 + - !!python/tuple + - 0.9557588713213446 + - 2.1983933536453546 + - 1.7961023462022898 + - 0.947021614096546 + - 2.329126074264702 + - 1.2290261007501417 + - 1.7293975595710684 + - 1.2846432904252387 + - 1.5611085035043337 + - 1.3038145467531335 + - 1.1452648665152554 + - 1.6718464037422127 + - 1.4172382604700884 + - !!python/tuple + - 0.9855207618421189 + - 2.003182727837879 + - 1.7604593077673123 + - 0.9883972832801575 + - 2.216881828388543 + - 1.3144714980445762 + - 1.7352923107911404 + - 1.1555327345121529 + - 1.5555123818141166 + - 1.2988256120423656 + - 1.2130592545795338 + - 1.7023205667333343 + - 1.3595891823331596 + - !!python/tuple + - 0.9928314351128761 + - 2.214626148609066 + - 1.8285131543771247 + - 0.9870043721084671 + - 2.3185198275404884 + - 1.2858473618626687 + - 1.7798472840020505 + - 1.2659215903001546 + - 1.6115351499293349 + - 1.3409490204695433 + - 1.203417955562456 + - 1.7001335108666367 + - 1.4319296519442386 + - !!python/tuple + - 0.937184803352501 + - 2.0668128577568523 + - 1.8243097206936476 + - 0.941758928538338 + - 2.1956865692772793 + - 1.2433753019418037 + - 1.7105588434864811 + - 1.2038484373797842 + - 1.5818829584309135 + - 1.2926331097941155 + - 1.171581574681976 + - 1.6716198624289806 + - 1.3821799912178396 + - !!python/tuple + - 0.9339858927890113 + - 2.0682113330300314 + - 1.8278368526582056 + - 0.9405692212050407 + - 2.196230953409112 + - 1.2487002164969832 + - 1.7060411328319056 + - 1.1950256742359018 + - 1.5738481518133216 + - 1.266488243582053 + - 1.1793050715050675 + - 1.6598274717603383 + - 1.3636048876933893 + - !!python/tuple + - 0.9562409259195256 + - 2.0841070232274936 + - 1.772660105960019 + - 0.9635512154697196 + - 2.1916423507810148 + - 1.2854046715536442 + - 1.7077597003034053 + - 1.1696091195735927 + - 1.5424013835467865 + - 1.2833137191808912 + - 1.1839716295038256 + - 1.6992225755868509 + - 1.359570372998552 + - !!python/tuple + - 0.9678242932539515 + - 2.055811344235789 + - 1.7664778164614805 + - 0.9715447018177604 + - 2.2215927557564514 + - 1.290986623008582 + - 1.7230335483853285 + - 1.1752978825535554 + - 1.5457935607548066 + - 1.2898824732447782 + - 1.1927659835097035 + - 1.6831786887047213 + - 1.3640027109011246 + - !!python/tuple + - 0.9858816072761998 + - 2.0434612764553637 + - 1.789647685185105 + - 0.9857982041637868 + - 2.230775735161036 + - 1.298252204281193 + - 1.7366165546468628 + - 1.212714813641632 + - 1.5427060362994722 + - 1.2946411911747477 + - 1.1996914799999878 + - 1.7117995918856546 + - 1.379128841483756 + - !!python/tuple + - 0.9875178312076089 + - 2.1503805803936897 + - 1.8401710450104736 + - 0.9846532365922119 + - 2.266093980302177 + - 1.2927154131905707 + - 1.7520211914067112 + - 1.2435208288830772 + - 1.5667392024726983 + - 1.295667004031561 + - 1.2028432798213997 + - 1.7266508051154685 + - 1.3950585777367945 + - !!python/tuple + - 0.9596576237597028 + - 2.088468963538024 + - 1.8547228680251195 + - 0.9597075257006302 + - 2.2519113003680764 + - 1.2644749406510403 + - 1.7248765462256426 + - 1.2108971833352438 + - 1.5747098268873434 + - 1.3033821520351754 + - 1.1854236507758613 + - 1.714545924127448 + - 1.3914445320113986 + - !!python/tuple + - 0.9636251475948356 + - 2.1201877986623336 + - 1.7882589986363733 + - 0.9695595996655207 + - 2.216185638638433 + - 1.286720727699082 + - 1.7344632127987842 + - 1.2109284571879335 + - 1.5393063665556153 + - 1.2872163125331717 + - 1.1898656344206888 + - 1.669584427274376 + - 1.3751897754020443 + - !!python/tuple + - 0.9634207075374415 + - 2.1589929312795553 + - 1.7908123969083043 + - 0.9671275600216214 + - 2.236763494553958 + - 1.281369938028847 + - 1.737240507571136 + - 1.2137017289706173 + - 1.5677409682578916 + - 1.2963530850665739 + - 1.1875186247854057 + - 1.6933171722011047 + - 1.385392136720399 + - !!python/tuple + - 0.9634207075374415 + - 2.1589929312795553 + - 1.7908123969083043 + - 0.9671275600216214 + - 2.236763494553958 + - 1.281369938028847 + - 1.737240507571136 + - 1.2137017289706173 + - 1.5677409682578916 + - 1.2963530850665739 + - 1.1875186247854057 + - 1.6933171722011047 + - 1.385392136720399 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000004428298 + - 7.500000021203211 + - 7.500000010945209 + - 7.500000010319432 + - 7.5000000750454845 + - 7.500000008111764 + - 7.500000007029879 + - 7.500000015721518 + - 7.500000010650049 + - 7.500000020852428 + - 7.500000008955916 + - 7.500000009944866 + - 7.5000000074867925 + - !!python/tuple + - 7.000025108971925 + - 7.000124822572011 + - 7.000062978913045 + - 7.000059294855596 + - 7.0004955181913555 + - 7.000046378888913 + - 7.000040095324474 + - 7.000091432963977 + - 7.000061239987707 + - 7.000122662350155 + - 7.000051302711508 + - 7.000057094567631 + - 7.000042745382121 + - !!python/tuple + - 6.500099690935563 + - 6.500498574633197 + - 6.500250630114147 + - 6.500235916241819 + - 6.502018466194354 + - 6.500184381897858 + - 6.500159339623583 + - 6.500364488923307 + - 6.50024368416257 + - 6.500489884292556 + - 6.500204018393065 + - 6.500227131521272 + - 6.500169898736859 + - !!python/tuple + - 6.000256760936954 + - 6.0012931578889575 + - 6.000647271076393 + - 6.000609112152075 + - 6.005357526073796 + - 6.000475617273627 + - 6.000410834874435 + - 6.000943203748028 + - 6.000629255036067 + - 6.001270430078765 + - 6.000526455374995 + - 6.0005863391662695 + - 6.000438143474684 + - !!python/tuple + - 5.500541709862562 + - 5.502750936062694 + - 5.501369974641911 + - 5.501288812946431 + - 5.511712616097319 + - 5.5010052618108505 + - 5.5008678773967095 + - 5.502001035914395 + - 5.501331649575203 + - 5.502702116414557 + - 5.501113174207285 + - 5.501240399377332 + - 5.5009257734842665 + - !!python/tuple + - 5.001018143747151 + - 5.005221624192838 + - 5.002584697983828 + - 5.0024306797885965 + - 5.022968167227355 + - 5.001893457194206 + - 5.0016336536186685 + - 5.003785927999492 + - 5.00251195598646 + - 5.005127891975351 + - 5.002097751341392 + - 5.002338858938769 + - 5.001743100054525 + - !!python/tuple + - 4.501777298322652 + - 4.509224510331895 + - 4.504532785553563 + - 4.504260789170212 + - 4.542193661767651 + - 4.503313886984054 + - 4.502856995159386 + - 4.506662013785609 + - 4.504404294097546 + - 4.509056642973175 + - 4.503673635503365 + - 4.504098744249078 + - 4.503049385227203 + - !!python/tuple + - 4.002953890511191 + - 4.015558812185424 + - 4.007576610380244 + - 4.007118056676751 + - 4.074588494279138 + - 4.00552546916796 + - 4.004759156592007 + - 4.011182496287587 + - 4.007359929218441 + - 4.015270941241421 + - 4.006129830913652 + - 4.006845096743444 + - 4.005081668111228 + - !!python/tuple + - 3.5047542353130337 + - 3.5255114526286424 + - 3.5122827530355756 + - 3.511531369550938 + - 3.629269201924316 + - 3.5089294771433335 + - 3.5076818613938086 + - 3.5182246820392677 + - 3.5119275782793875 + - 3.5250297192380766 + - 3.5099154304616516 + - 3.5110845662665007 + - 3.508206585885186 + - !!python/tuple + - 3.007509477929463 + - 3.0412774495032946 + - 3.019584692257422 + - 3.0183700414738484 + - 3.2223781437794314 + - 3.0141798229599477 + - 3.0121795626369114 + - 3.029258943725428 + - 3.0190102817486215 + - 3.0404779934263293 + - 3.015764714838846 + - 3.0176487232775844 + - 3.013020114866992 + - !!python/tuple + - 2.5117852008762176 + - 2.56688641134875 + - 2.531131001603709 + - 2.5291648657042525 + - 2.880712755664454 + - 2.5224156540584115 + - 2.5192127789442074 + - 2.5469348544006647 + - 2.5302006825246814 + - 2.565549466485059 + - 2.5249622390976665 + - 2.5279993052951184 + - 2.5205571638447144 + - !!python/tuple + - 2.0186339131186464 + - 2.110447542771973 + - 2.050123095967136 + - 2.0468784364499917 + - 2.63909523451761 + - 2.035812779488289 + - 2.0306031303512317 + - 2.076508454594685 + - 2.048586676621802 + - 2.1081556240732677 + - 2.039974447861841 + - 2.044959309929641 + - 2.032786443747114 + - !!python/tuple + - 1.530275964118312 + - 1.690015630766966 + - 1.5839572488803055 + - 1.578063312495952 + - 2.4041004398263857 + - 1.5657394222207932 + - 1.5502905192234901 + - 1.629790277022508 + - 1.5810095986987935 + - 1.6859344610514657 + - 1.5662127308260414 + - 1.5747597715198676 + - 1.5539818015605276 + - !!python/tuple + - 1.0524250014738912 + - 1.3476234596701735 + - 1.1516146064628516 + - 1.1402146356428844 + - 2.2189390160824765 + - 1.1254210546526657 + - 1.0886975975807383 + - 1.237104950493016 + - 1.145725823990336 + - 1.3402696409205552 + - 1.1181173765328807 + - 1.1340422812950721 + - 1.095482479755892 + - !!python/tuple + - 0.8278754718967251 + - 1.6761716090260208 + - 1.1720302463054355 + - 1.1527724385153395 + - 2.03180578378485 + - 1.033552863797317 + - 0.9851271371891861 + - 1.3510876068435647 + - 1.189334025814303 + - 1.593941935693796 + - 1.0675343538720448 + - 1.124904007916208 + - 0.9876688274993072 + - !!python/tuple + - 1.0238389088712467 + - 1.8644912415326564 + - 1.3878364072962657 + - 1.3656193988577616 + - 2.2944181475842096 + - 1.2454668752089066 + - 1.1942030188721455 + - 1.5648814205735961 + - 1.4030573734039875 + - 1.8021312868422443 + - 1.2852854798613746 + - 1.3385169977078994 + - 1.197425249448506 + - !!python/tuple + - 0.8552926761469547 + - 1.9964095540400422 + - 1.4484499700001245 + - 1.4312654351721636 + - 2.63830542605523 + - 1.2521150335717133 + - 1.186517123280064 + - 1.6458577412122433 + - 1.4225910294344655 + - 1.8753381018758772 + - 1.2971234623966992 + - 1.4240692978916836 + - 1.2382747477203655 + - !!python/tuple + - 0.9186914852557915 + - 2.050783187557993 + - 1.512032822247481 + - 1.4928916293258658 + - 2.616845197076718 + - 1.3174443605508137 + - 1.2420403434014737 + - 1.7285130310188876 + - 1.4820933111800352 + - 1.9521112676248784 + - 1.3591364468950586 + - 1.4840007440281362 + - 1.2986017651767077 + - !!python/tuple + - 0.9934277980361081 + - 1.9784922958778415 + - 1.4568208614649436 + - 1.3978249470916764 + - 2.5293665888886485 + - 1.4160839240807879 + - 1.1778642915564166 + - 1.7320683100386571 + - 1.4538891400955185 + - 2.0021370578931936 + - 1.3322873084250406 + - 1.361343726189386 + - 1.1792566508159454 + - !!python/tuple + - 0.9019024377260532 + - 2.000693911060741 + - 1.4621872853935667 + - 1.4268395015369801 + - 2.5210146564847142 + - 1.3065306892153994 + - 1.186583849201344 + - 1.6879847530094805 + - 1.4311032202873915 + - 1.9638107751354474 + - 1.3218526157866162 + - 1.4075895886923306 + - 1.2355384318644562 + - !!python/tuple + - 0.9616945945821048 + - 1.993588890954481 + - 1.460977770045973 + - 1.4103465105170123 + - 2.5550181453857888 + - 1.3859794533138305 + - 1.1807944961928794 + - 1.7369139554201787 + - 1.4534793162025195 + - 1.970383737924102 + - 1.3281294426528958 + - 1.3821835873457484 + - 1.1926542611909607 + - !!python/tuple + - 0.947775675173668 + - 1.9813090747457152 + - 1.4465284284961968 + - 1.3963714016054576 + - 2.555675501362698 + - 1.3725591146486207 + - 1.1724952997351012 + - 1.7054027335581032 + - 1.4428706852691082 + - 1.9471701224345106 + - 1.3162277936744207 + - 1.3692112238636185 + - 1.1796894717359476 + - !!python/tuple + - 0.9132946750762126 + - 1.9893175821388873 + - 1.4525441984470406 + - 1.4114956894444766 + - 2.522332901645663 + - 1.3241632838160708 + - 1.1719807996117704 + - 1.697031163655122 + - 1.4247867181944858 + - 1.97338528824736 + - 1.314195974422572 + - 1.3881334424996952 + - 1.2166123951618224 + - !!python/tuple + - 0.921529348211847 + - 1.9976700005403543 + - 1.4622023105530617 + - 1.4210215832367954 + - 2.5242052621377167 + - 1.331224728124151 + - 1.1827700705202777 + - 1.6996958759320995 + - 1.4346852095096247 + - 1.989443650059845 + - 1.324367110436724 + - 1.396074558883914 + - 1.2243559176166166 + - !!python/tuple + - 0.9462563196329359 + - 1.9948097808310405 + - 1.4596703468478949 + - 1.4124037219312067 + - 2.539915393829059 + - 1.3670081216770034 + - 1.1879507565177916 + - 1.7008332442119742 + - 1.452660074274937 + - 1.9656663273695325 + - 1.3281744650047935 + - 1.3850226557433478 + - 1.1980670719434618 + - !!python/tuple + - 0.940898203872539 + - 1.9898254401647142 + - 1.4539010382008237 + - 1.4068542037959575 + - 2.536772782438475 + - 1.3624143894705716 + - 1.1796672107141233 + - 1.7008155508734122 + - 1.4451809413258556 + - 1.964140150908499 + - 1.3210801470398443 + - 1.3796486215850854 + - 1.1947674099817163 + - !!python/tuple + - 0.9353848403631011 + - 1.9858050684524424 + - 1.4492358042139357 + - 1.4026371536186566 + - 2.5337332332156275 + - 1.3571088727500438 + - 1.171429299932933 + - 1.704271737457909 + - 1.4374178955435037 + - 1.9643417304843773 + - 1.3145410765133434 + - 1.3758474344642275 + - 1.1935470611436743 + - !!python/tuple + - 0.9240469642106867 + - 1.9898311467080827 + - 1.4539465076913745 + - 1.4106209946778177 + - 2.5338055969921554 + - 1.33890247260472 + - 1.1750825589884992 + - 1.7081323247322722 + - 1.4322692903454486 + - 1.9556090248539575 + - 1.3180617233303242 + - 1.3887524332512915 + - 1.2106255893707616 + - !!python/tuple + - 0.9300318327566827 + - 1.99657797629536 + - 1.4617211133060604 + - 1.4183161463441696 + - 2.5379095475876277 + - 1.3429365795473027 + - 1.1854093030647135 + - 1.7099684064220584 + - 1.4410066777905777 + - 1.9579532369605361 + - 1.3271614225509534 + - 1.3963863109511867 + - 1.215745915303688 + - !!python/tuple + - 0.9424496488949748 + - 1.9992754382069744 + - 1.4644320581834152 + - 1.4187418574481212 + - 2.5357748045351904 + - 1.3587575775361278 + - 1.184100038074961 + - 1.7195445963812808 + - 1.4468175041509912 + - 1.9910130969800774 + - 1.3280105181407145 + - 1.3904688839350487 + - 1.209175540549421 + - !!python/tuple + - 0.9399093156816617 + - 1.9949480066789973 + - 1.4593888803352315 + - 1.4134921208820554 + - 2.533286724121398 + - 1.3582233865445839 + - 1.1789194042235558 + - 1.7121577407831186 + - 1.4429450270416946 + - 1.993499645451988 + - 1.3227837512130423 + - 1.3842323994271102 + - 1.204625810399586 + - !!python/tuple + - 0.9356392820119501 + - 1.9971626354809056 + - 1.4623030904016225 + - 1.417689394406126 + - 2.5358670546169395 + - 1.3501496403136846 + - 1.1805109790607906 + - 1.7169054344862127 + - 1.4404462403875706 + - 1.991216311499875 + - 1.3249870868086011 + - 1.3902889457740037 + - 1.2124335239014186 + - !!python/tuple + - 0.9346503442183427 + - 1.9942718022713013 + - 1.4588648289454158 + - 1.4140047734382013 + - 2.535588998877987 + - 1.3511544994616187 + - 1.179324672735827 + - 1.7122845467022862 + - 1.4405211710370773 + - 1.980463265236145 + - 1.3224066402925854 + - 1.3872774144979412 + - 1.208893832470549 + - !!python/tuple + - 0.9346503442183427 + - 1.9942718022713013 + - 1.4588648289454158 + - 1.4140047734382013 + - 2.535588998877987 + - 1.3511544994616187 + - 1.179324672735827 + - 1.7122845467022862 + - 1.4405211710370773 + - 1.980463265236145 + - 1.3224066402925854 + - 1.3872774144979412 + - 1.208893832470549 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.500000005155554 + - 7.5000000739430845 + - 7.500000018189263 + - 7.500000005027403 + - 8.499999680000204 + - 7.500000019923688 + - 7.500000004875169 + - 7.500000018986351 + - 7.500000012093379 + - 7.500000026965327 + - 7.500000009115302 + - 7.5000000097661035 + - 7.500000007282026 + - !!python/tuple + - 7.000029280762432 + - 7.000487132356225 + - 7.000106366998118 + - 7.000028544659364 + - 8.99750976311397 + - 7.000116958480351 + - 7.000027670762227 + - 7.000111224733738 + - 7.000069764808018 + - 7.0001607706494555 + - 7.000052234460359 + - 7.000056045759408 + - 7.000041557086853 + - !!python/tuple + - 6.500116284494393 + - 6.501983500050247 + - 6.500424397948051 + - 6.500113355979171 + - 9.491171387123492 + - 6.500466948366264 + - 6.500109879607612 + - 6.500443907165335 + - 6.500277749342947 + - 6.500643495746533 + - 6.500207735571051 + - 6.500222944932552 + - 6.500165163573126 + - !!python/tuple + - 6.000299589402749 + - 6.005262189833444 + - 6.0010993708925815 + - 6.001451753008066 + - 9.29123682373969 + - 6.001210476658461 + - 6.000300558852218 + - 6.00324561173596 + - 6.003681624043926 + - 6.001673102873884 + - 5.999428159007168 + - 6.00324396472678 + - 6.00171345000855 + - !!python/tuple + - 5.500632293572443 + - 5.511497646345015 + - 5.502335199065126 + - 5.503586506301012 + - 8.979860963068498 + - 5.5025734131409685 + - 5.500642431183244 + - 5.507857755819048 + - 5.50912057018821 + - 5.503569419829985 + - 5.4982329158223235 + - 5.508050229373863 + - 5.5042019438719105 + - !!python/tuple + - 5.001188899708019 + - 5.022531373067298 + - 5.004424601171532 + - 5.006347561297673 + - 8.610578776028111 + - 5.004880961526082 + - 5.001202141002228 + - 5.014192420839063 + - 5.016185022349767 + - 5.006798457168939 + - 4.996979483153494 + - 5.014244435539815 + - 5.007472589838992 + - !!python/tuple + - 4.502076439912131 + - 4.541358166133213 + - 4.507799622488072 + - 4.512513811895132 + - 8.221000707657339 + - 4.508614785379348 + - 4.502792561758623 + - 4.523813579588365 + - 4.524842902910058 + - 4.515718625196536 + - 4.493311619592723 + - 4.53534062490598 + - 4.516432761998749 + - !!python/tuple + - 4.003453257081745 + - 4.073044181785976 + - 4.013120528615487 + - 4.0214082114046015 + - 7.798399003499099 + - 4.0145139916697925 + - 4.0053692706948665 + - 4.037061381959765 + - 4.03535054794677 + - 4.03074633175746 + - 3.98819078322988 + - 4.068422720637075 + - 4.029976379112904 + - !!python/tuple + - 3.5055624290283207 + - 3.626468745878 + - 3.5214417686455683 + - 3.53335166852861 + - 7.359844353337542 + - 3.523764601795982 + - 3.513072151548599 + - 3.565285215098931 + - 3.5482931828894047 + - 3.553769642085222 + - 3.482058744823494 + - 3.6196807486003855 + - 3.5519301949919058 + - !!python/tuple + - 3.0087953102601532 + - 3.2173865557817245 + - 3.0345451035660105 + - 3.0482715617444276 + - 6.900308210985879 + - 3.0383816863521154 + - 3.025383668921192 + - 3.1093322458999313 + - 3.064753965050124 + - 3.0878166914346625 + - 2.9759606809884027 + - 3.1876666335766735 + - 3.081621616074409 + - !!python/tuple + - 2.5138230518933558 + - 2.8721549914902353 + - 2.5556701471649097 + - 2.566549880776704 + - 6.423138456935429 + - 2.562050077680721 + - 2.5423514834203966 + - 2.6724322722737375 + - 2.5867177001223047 + - 2.6388258297902194 + - 2.4712889464042798 + - 2.7724457092233945 + - 2.6193084739826364 + - !!python/tuple + - 2.0219015774847797 + - 2.62568809159553 + - 2.0912936905809127 + - 2.0898502394223124 + - 5.931187972971808 + - 2.10216746900146 + - 2.0716419618491213 + - 2.224504201667366 + - 2.143138445908495 + - 2.218557185607469 + - 1.9727908817903639 + - 2.3741440595391166 + - 2.1649550663227655 + - !!python/tuple + - 1.5357006837267624 + - 2.502479499970967 + - 1.655953866834041 + - 1.6207119391988871 + - 5.4269102677813885 + - 1.675276528248579 + - 1.6151027789970418 + - 1.7778183007932504 + - 1.7426301761368823 + - 1.850611599514167 + - 1.485591242415977 + - 1.9976243560822085 + - 1.7226446752327198 + - !!python/tuple + - 1.0652422753881414 + - 2.399547385304959 + - 1.289666680342589 + - 1.168514364510207 + - 4.9119124532918335 + - 1.3419346484586174 + - 1.1792578438939263 + - 1.3592591019859965 + - 1.4096324245838436 + - 1.5775108140037006 + - 1.0246775772805774 + - 1.6526829191665091 + - 1.3021152393218403 + - !!python/tuple + - 0.8736967830275724 + - 1.6540089622300895 + - 1.4970425100734885 + - 0.847512265036366 + - 2.2304841865842184 + - 1.5648921486279048 + - 0.8468283061296034 + - 1.5431059151627085 + - 1.4330565766506227 + - 2.0440999501129085 + - 1.0475172206882908 + - 1.2605751007625712 + - 0.9916318291401027 + - !!python/tuple + - 1.0744708051321226 + - 1.7842304105457165 + - 1.6876148695576387 + - 1.0512879887867852 + - 1.7160679869998607 + - 1.7428399343520753 + - 1.0472232384275855 + - 1.7068300910286807 + - 1.623563084511744 + - 2.2576514893747555 + - 1.2571688904254859 + - 1.3989505859595242 + - 1.1952101603457355 + - !!python/tuple + - 0.8649487570915066 + - 2.467836486215544 + - 1.8693233908885183 + - 1.0857814286333838 + - 2.4179730923918883 + - 1.9686257231850421 + - 1.1603419412705547 + - 1.6582812446764073 + - 1.945764225793455 + - 2.3779327196955515 + - 1.0890759434464519 + - 1.7673277460072063 + - 1.360906141621251 + - !!python/tuple + - 0.924248009556048 + - 2.562735865013065 + - 1.9130597883982952 + - 1.1280980567665062 + - 2.3079744775464435 + - 1.9949007157526304 + - 1.2063204477266198 + - 1.6528295852398154 + - 1.9780213173671861 + - 2.4289224568931957 + - 1.1849430930466833 + - 1.6484767344732318 + - 1.3788429468504702 + - !!python/tuple + - 0.9907101659605652 + - 2.618859847419845 + - 1.9331809802823872 + - 1.1612911087723692 + - 2.2147692365473803 + - 1.9932234814304985 + - 1.2405301444395211 + - 1.6330672654149083 + - 1.9866029299817087 + - 2.47064663124996 + - 1.2796480615747199 + - 1.52654106949047 + - 1.3899723796435608 + - !!python/tuple + - 1.2327291055279852 + - 2.3410072472092778 + - 1.5648167952307146 + - 1.0755114063329811 + - 2.090001197757988 + - 1.5374451852518147 + - 1.084642942214094 + - 1.593804982190478 + - 1.534122970318021 + - 2.193506766795632 + - 1.455290927355785 + - 1.490551537743004 + - 1.3383256681570899 + - !!python/tuple + - 1.206731370149624 + - 2.358523077486889 + - 1.53528090418464 + - 1.0450831285657745 + - 2.1329052382375124 + - 1.5656057232953426 + - 1.0550320608450285 + - 1.53844176999091 + - 1.5433334568530812 + - 2.1617978041388723 + - 1.4117226356597214 + - 1.4933867689296947 + - 1.308298156288506 + - !!python/tuple + - 1.1720447994823926 + - 2.3931673995520057 + - 1.5253265419695237 + - 1.0191000120880294 + - 2.183080616725934 + - 1.6153826835395866 + - 1.0327053789645884 + - 1.486484608807718 + - 1.5750602070334965 + - 2.141412673651382 + - 1.3616251702103366 + - 1.4875289686288025 + - 1.2782126025831777 + - !!python/tuple + - 1.1313233426231946 + - 2.439767436515804 + - 1.5346823864993997 + - 1.005538513861071 + - 2.213954981637507 + - 1.6775236785118854 + - 1.027089136922683 + - 1.4475261370418424 + - 1.6240004245152804 + - 2.1338158946977277 + - 1.3024679923330793 + - 1.4959550326786943 + - 1.2647958060084254 + - !!python/tuple + - 1.0875841765094652 + - 2.4925328042248442 + - 1.5603507639673102 + - 1.004906456359743 + - 2.2264984787487765 + - 1.742593858645521 + - 1.0373877018492628 + - 1.4271082379260727 + - 1.6838636366295043 + - 2.1385865131337485 + - 1.2390005778915907 + - 1.5163766090876234 + - 1.268056670533796 + - !!python/tuple + - 1.0464065817217714 + - 2.5139602459916395 + - 1.5973713451067941 + - 1.0115668185290767 + - 2.2348990609792425 + - 1.7975473249364804 + - 1.0598552554487208 + - 1.4386887247902183 + - 1.745005758138945 + - 2.1480340114691625 + - 1.1849087943063248 + - 1.5350695340358067 + - 1.2758573072962869 + - !!python/tuple + - 1.0091110567441104 + - 2.349941834259931 + - 1.7517899718883139 + - 1.11717100685902 + - 2.435839119262314 + - 1.7299335448433502 + - 1.1747528118901553 + - 1.6087326368279642 + - 1.7584479186069533 + - 2.3878832165912027 + - 1.25945577980691 + - 1.483809439267055 + - 1.352582321983269 + - !!python/tuple + - 1.029728617062024 + - 2.4104332750938435 + - 1.7293773743340188 + - 1.128551599569701 + - 2.4097514780239675 + - 1.7045552912016393 + - 1.1823585705426136 + - 1.6084673681130264 + - 1.7549158379084682 + - 2.369885392074739 + - 1.2875513577960067 + - 1.5014928197983075 + - 1.359174286873818 + - !!python/tuple + - 1.0494346416872937 + - 2.479654652197194 + - 1.7213210208531113 + - 1.1366872650865267 + - 2.3652092576081376 + - 1.697592971523222 + - 1.1832729726087698 + - 1.611467062930646 + - 1.7598191945838513 + - 2.3235505458255825 + - 1.310926606853462 + - 1.5319085916518134 + - 1.3608654917327474 + - !!python/tuple + - 1.1046041802204927 + - 2.522863871849969 + - 1.7069872035915046 + - 1.093923340183838 + - 2.2954389075949138 + - 1.7300339664444713 + - 1.1101801290675508 + - 1.5276966927099005 + - 1.720290698784091 + - 2.1639626782826467 + - 1.3524375637801263 + - 1.5470801554398645 + - 1.3248810038232939 + - !!python/tuple + - 1.0832453138766878 + - 2.438417981921828 + - 1.6485243877735887 + - 1.0523225270125216 + - 2.2247010676674264 + - 1.7581344095583094 + - 1.0974603935875176 + - 1.4844711111812483 + - 1.6923875242075506 + - 2.21583743070295 + - 1.2646584594783241 + - 1.5086158103785199 + - 1.3425298808574517 + - !!python/tuple + - 1.0677731887886115 + - 2.4480473111351544 + - 1.6405598113395394 + - 1.0504275383526125 + - 2.205792663571616 + - 1.7628600466543862 + - 1.1089691533620105 + - 1.509790892182898 + - 1.7120409946883055 + - 2.222251451092573 + - 1.245256892373193 + - 1.4882991857756598 + - 1.3370409819827664 + - !!python/tuple + - 1.0283582272458867 + - 2.3182213877405013 + - 1.6544612764631188 + - 1.057763846258549 + - 2.2492549536614805 + - 1.7236898579455273 + - 1.129926641124695 + - 1.582377507669644 + - 1.7496285816321955 + - 2.2765972170640234 + - 1.2293718484788827 + - 1.456373675304688 + - 1.2943462593827175 + - !!python/tuple + - 1.0214048780889136 + - 2.356183340281798 + - 1.6755411028027791 + - 1.070128779235693 + - 2.3087944534210463 + - 1.7152632899743188 + - 1.1223524968678138 + - 1.5686524400445419 + - 1.7361827278679878 + - 2.3050453048057284 + - 1.2502243840092597 + - 1.4601030115395117 + - 1.2837968180351662 + - !!python/tuple + - 1.0212615394107578 + - 2.4076210650743897 + - 1.6846125662918767 + - 1.0829754486599368 + - 2.3254327104910595 + - 1.718595441935651 + - 1.1155478643181416 + - 1.554577952780534 + - 1.7288271758062177 + - 2.3094689716953734 + - 1.2563750983405688 + - 1.4937972753850397 + - 1.2917884556606656 + - !!python/tuple + - 1.025941209772401 + - 2.43337108690055 + - 1.6911765994071937 + - 1.0991343340739634 + - 2.3190330873186036 + - 1.720077098559961 + - 1.1157746382209686 + - 1.5551127623116374 + - 1.733650737688774 + - 2.294231094789161 + - 1.2582888575744724 + - 1.5540065878752027 + - 1.3078364009431076 + - !!python/tuple + - 1.0739810050297691 + - 2.397612829710856 + - 1.6661025198335542 + - 1.0833885245044579 + - 2.3290951876922446 + - 1.7317769808921728 + - 1.1336706236532812 + - 1.5453502998375803 + - 1.747637279722466 + - 2.2184903898715636 + - 1.2876995889599996 + - 1.531906664192334 + - 1.3350199295593765 + - !!python/tuple + - 1.0666567976488164 + - 2.3866165305849947 + - 1.6573338660319212 + - 1.0706479657397852 + - 2.3052919639874068 + - 1.7341944446783495 + - 1.1329331520651782 + - 1.5594193851614429 + - 1.726834320039005 + - 2.2443500222081294 + - 1.266517166645053 + - 1.4985538556807139 + - 1.3322378174047929 + - !!python/tuple + - 1.0405800139957886 + - 2.4197093051946625 + - 1.675873671885551 + - 1.0749546985957634 + - 2.2916501963680194 + - 1.7297388832487446 + - 1.1142275831410717 + - 1.5327510192926166 + - 1.738837033599204 + - 2.2561399179356036 + - 1.2532156378213368 + - 1.5032445177562794 + - 1.3017920829401564 + - !!python/tuple + - 1.0517302012710317 + - 2.459505449596552 + - 1.6709561916699518 + - 1.0829477085164734 + - 2.3146871004715277 + - 1.7399536462412941 + - 1.1254611056494055 + - 1.5205255081717481 + - 1.7486791294702875 + - 2.230776007559664 + - 1.2695307620292433 + - 1.5158802141124657 + - 1.3195660800833884 + - !!python/tuple + - 1.0503631600283085 + - 2.4298487268406603 + - 1.6721215681157706 + - 1.0812829605268528 + - 2.319031799127921 + - 1.733614274272235 + - 1.1190078086043684 + - 1.5589098013790923 + - 1.733179563797495 + - 2.24013223134584 + - 1.2678870682618342 + - 1.5178701765407263 + - 1.3191757377175566 + - !!python/tuple + - 1.0503631600283085 + - 2.4298487268406603 + - 1.6721215681157706 + - 1.0812829605268528 + - 2.319031799127921 + - 1.733614274272235 + - 1.1190078086043684 + - 1.5589098013790923 + - 1.733179563797495 + - 2.24013223134584 + - 1.2678870682618342 + - 1.5178701765407263 + - 1.3191757377175566 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 630.0 + - 1110.0 + - 1140.0 + - 1410.0 + - 1440.0 + - 1770.0 + - 1800.0 + - 2070.0 + - 2340.0 + - 2370.0 + - 2400.0 + - 2670.0 + - 2700.0 + - 3600.0 + - 3900.0 + - 4920.0 + - 6090.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.98624404104605 + - 48.76052038582583 + - 45.555158805271816 + - 42.375816991898056 + - 39.23022840446282 + - 36.12921511353964 + - 33.08833077490451 + - 30.130914826871532 + - 27.29208723685515 + - 24.627546111139182 + - 22.22997585942509 + - 20.238014456287225 + - 18.94705406490078 + - 18.99490217105762 + - 18.859106385366427 + - 18.90960461539854 + - 18.919598938401393 + - 19.02529897785151 + - 19.042298922191865 + - 18.952875775616086 + - 18.97576941121191 + - 19.03795237325694 + - 19.021133815579308 + - 19.03531230789991 + - 19.024935455780966 + - 19.00097979853086 + - 19.011487229171063 + - 18.99122559840228 + - 19.040740974070403 + - 19.028123125591097 + - 19.014591736247496 + - 19.014591736247496 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 600.0 + - 630.0 + - 1110.0 + - 1410.0 + - 2040.0 + - 2070.0 + - 2340.0 + - 2370.0 + - 3390.0 + - 3630.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.762497809054956 + - 48.55142327888958 + - 45.3601642780199 + - 42.19397670724609 + - 39.060006675366814 + - 35.96820357344928 + - 32.932808015769744 + - 29.9748749973568 + - 27.126750954459926 + - 24.440431373188353 + - 22.004023001678917 + - 19.975725608125373 + - 18.655196206188908 + - 18.60802783626473 + - 18.266446706062876 + - 18.20816186638503 + - 18.25197078353057 + - 18.253735642839246 + - 18.25179634263437 + - 18.206320179247133 + - 18.211235054774942 + - 18.212525643176164 + - 18.226147400683193 + - 18.226147400683193 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 600.0 + - 630.0 + - 1110.0 + - 1140.0 + - 1410.0 + - 1770.0 + - 2070.0 + - 2370.0 + - 2400.0 + - 2640.0 + - 2670.0 + - 2910.0 + - 2940.0 + - 2970.0 + - 3150.0 + - 3180.0 + - 3210.0 + - 3420.0 + - 3450.0 + - 3480.0 + - 3690.0 + - 3720.0 + - 3750.0 + - 3960.0 + - 3990.0 + - 4020.0 + - 4230.0 + - 4260.0 + - 4470.0 + - 4500.0 + - 4530.0 + - 4680.0 + - 4710.0 + - 4740.0 + - 4770.0 + - 4920.0 + - 4950.0 + - 4980.0 + - 5010.0 + - 5160.0 + - 5190.0 + - 5220.0 + - 5250.0 + - 5400.0 + - 5430.0 + - 5460.0 + - 5490.0 + - 5640.0 + - 5670.0 + - 5700.0 + - 5730.0 + - 5910.0 + - 5940.0 + - 5970.0 + - 6150.0 + - 6180.0 + - 6210.0 + - 6390.0 + - 6420.0 + - 6630.0 + - 6660.0 + - 6840.0 + - 6870.0 + - 7050.0 + - 7080.0 + - 7260.0 + - 7290.0 + - 7440.0 + - 7470.0 + - 7500.0 + - 7680.0 + - 7710.0 + - 7890.0 + - 7920.0 + - 8130.0 + - 8340.0 + - 8550.0 + - 8730.0 + - 8760.0 + - 8940.0 + - 8970.0 + - 9120.0 + - 9150.0 + - 9330.0 + - 9360.0 + - 9540.0 + - 9570.0 + - 9750.0 + - 9780.0 + - 9930.0 + - 9960.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.1250709174858 + - 47.95652814982719 + - 44.80787549798857 + - 41.684423042724994 + - 38.593395460034664 + - 35.544858077561386 + - 32.5532256066455 + - 29.639818033151126 + - 26.837384875500806 + - 24.198528203607825 + - 21.813077735608047 + - 19.839581454318793 + - 18.576266597864095 + - 18.6383312096953 + - 18.65353311935151 + - 18.300904365846296 + - 18.41966673483236 + - 18.431905024114837 + - 18.422781984635776 + - 18.4872284064759 + - 18.448550946858838 + - 18.498864276277914 + - 18.495310611648794 + - 18.46100323923643 + - 18.46399838685284 + - 18.480495105493475 + - 18.478411981119752 + - 18.476426556229868 + - 18.471738945429852 + - 18.471699212609675 + - 18.471723063701692 + - 18.47541972851094 + - 18.476340311375353 + - 18.477068358805052 + - 18.471374031344787 + - 18.47041159510455 + - 18.469993872057454 + - 18.47684182745188 + - 18.477027032386857 + - 18.476701057879055 + - 18.471725059438093 + - 18.47203014865108 + - 18.47489319060399 + - 18.474745071919454 + - 18.474512227621986 + - 18.473460256083595 + - 18.473375259363976 + - 18.473329356847106 + - 18.473321008947252 + - 18.473872118613293 + - 18.47404997023167 + - 18.474202178547753 + - 18.4743023909864 + - 18.473774199587293 + - 18.47358784765706 + - 18.473448606536063 + - 18.473379887668038 + - 18.473926718774184 + - 18.4740448095205 + - 18.47410951194349 + - 18.4741148872552 + - 18.473710929234908 + - 18.47366883080124 + - 18.473660577386962 + - 18.47368098515475 + - 18.473872117799246 + - 18.473870436878578 + - 18.47386316512029 + - 18.4738094759264 + - 18.47379980189486 + - 18.473791295938483 + - 18.4738277863572 + - 18.473839454245404 + - 18.473801231656527 + - 18.47379896589131 + - 18.473828182603196 + - 18.47382622725372 + - 18.473813859236312 + - 18.473817338148596 + - 18.473817919055293 + - 18.473815170464697 + - 18.473816894738324 + - 18.473818786980434 + - 18.473820178039436 + - 18.473817973070148 + - 18.473817367280546 + - 18.473816611636444 + - 18.47381716169617 + - 18.47381874119251 + - 18.47381744989061 + - 18.473817978866492 + - 18.473817629590823 + - 18.473817828735033 + - 18.47381807237111 + - 18.473817988980347 + - 18.47381768513895 + - 18.473817725893074 + - 18.473817999050777 + - 18.47381794316518 + - 18.47381786283254 + - 18.473817904216528 + - 18.47381784981672 + - 18.473817840484756 + - 18.473817904879237 + - 18.47381790713169 + - 18.473817902945797 + - 18.473817902945797 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 600.0 + - 630.0 + - 1020.0 + - 1050.0 + - 1080.0 + - 1290.0 + - 1320.0 + - 1350.0 + - 1380.0 + - 1710.0 + - 1980.0 + - 2190.0 + - 2220.0 + - 2250.0 + - 2280.0 + - 2460.0 + - 2580.0 + - 2610.0 + - 2850.0 + - 3090.0 + - 3570.0 + - 8370.0 + - 8610.0 + - 9120.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.629465152488194 + - 48.522082053026445 + - 45.39089895846003 + - 42.29388720473791 + - 39.23384753833002 + - 36.21689042153264 + - 33.251646714451084 + - 30.357500671619373 + - 27.567073540398955 + - 24.94191951688811 + - 22.600664522568515 + - 20.62716048641754 + - 19.34143454320231 + - 19.27992612847415 + - 18.771913709093965 + - 18.580449623574115 + - 18.756186890366138 + - 18.74599518802007 + - 18.797862086953398 + - 18.59479985506836 + - 18.348364690667214 + - 18.15095917803523 + - 18.02046477248837 + - 18.130283350511096 + - 18.06069745831741 + - 18.0836586969195 + - 18.09647084547955 + - 18.108504617440463 + - 18.119615325320066 + - 18.09192364253646 + - 18.05731932817274 + - 18.052994600718204 + - 18.09988618491549 + - 18.087068223728295 + - 18.08690628682348 + - 18.082532641518945 + - 18.082429518467304 + - 18.083885497389396 + - 18.083885497389396 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 630.0 + - 660.0 + - 1080.0 + - 1110.0 + - 1140.0 + - 1440.0 + - 1800.0 + - 1830.0 + - 2100.0 + - 2700.0 + - 2880.0 + - 3480.0 + - 3840.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.32726745394636 + - 46.278750096854566 + - 43.250479542212396 + - 40.24803534436404 + - 37.27903487478736 + - 34.35410710562561 + - 31.488926829646207 + - 28.70811861818205 + - 26.045385078893993 + - 23.563696562132776 + - 21.35293754331001 + - 19.58244304174118 + - 18.465297623320165 + - 18.54772766384801 + - 18.256379605703604 + - 18.22996770895012 + - 18.34499900860201 + - 18.19242517304938 + - 18.13857699283189 + - 18.295291813080787 + - 18.292651903383856 + - 18.31079421264206 + - 18.28180164650201 + - 18.265877861814726 + - 18.281155018230198 + - 18.267306478465727 + - 18.27834724088086 + - 18.27834724088086 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 600.0 + - 630.0 + - 1320.0 + - 1350.0 + - 1380.0 + - 1680.0 + - 1890.0 + - 1920.0 + - 1950.0 + - 2010.0 + - 2040.0 + - 2160.0 + - 2250.0 + - 2400.0 + - 2550.0 + - 2760.0 + - 2790.0 + - 3480.0 + - 4440.0 + - 4650.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.10579599894569 + - 48.00488168528059 + - 44.962601700975526 + - 41.89118895726379 + - 38.849050949145884 + - 35.843895104310356 + - 32.89988414092291 + - 30.037505010136535 + - 27.27492798601024 + - 24.671989907477823 + - 22.305456274788625 + - 20.341453186504857 + - 19.03551736131802 + - 18.34706863544604 + - 18.182908210591403 + - 18.17052294381892 + - 18.130528542019388 + - 18.128062039164654 + - 18.14849760799093 + - 18.11054608320778 + - 18.122405617103894 + - 18.132146172921523 + - 18.14438212955257 + - 18.15498777473148 + - 18.133785340738775 + - 18.11009983493868 + - 18.096627125135768 + - 18.113477965483966 + - 18.106718315566354 + - 18.109347242659013 + - 18.09971397249196 + - 18.113564489508043 + - 18.10864970323175 + - 18.10864970323175 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 630.0 + - 660.0 + - 1080.0 + - 1110.0 + - 1140.0 + - 1410.0 + - 1440.0 + - 1710.0 + - 1740.0 + - 1770.0 + - 1800.0 + - 1950.0 + - 1980.0 + - 2010.0 + - 2040.0 + - 2070.0 + - 2100.0 + - 2190.0 + - 2250.0 + - 2280.0 + - 2310.0 + - 2340.0 + - 2370.0 + - 2610.0 + - 2700.0 + - 2910.0 + - 2940.0 + - 3870.0 + - 6060.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 48.99020292784388 + - 46.033162496154794 + - 43.070891052577224 + - 40.1219200225204 + - 37.197763119623104 + - 34.31705211006138 + - 31.493012592679506 + - 28.742220765509533 + - 26.097113744303265 + - 23.607796924213307 + - 21.360312943957545 + - 19.50018129200676 + - 18.28858089439648 + - 17.814961131518647 + - 17.81470170563944 + - 18.005479326154564 + - 17.893711579367576 + - 17.857302760067768 + - 17.72839377229257 + - 17.73548205083985 + - 17.844112736764902 + - 17.83363371771105 + - 17.82423390317269 + - 17.816524784110285 + - 17.738185968577703 + - 17.72458680347753 + - 17.71510608515037 + - 17.709040023125908 + - 18.41815854150127 + - 17.711770992117284 + - 17.73258733332738 + - 17.741876846024212 + - 17.746524024956006 + - 17.749877060916653 + - 17.752958237412557 + - 17.757441300079194 + - 17.725719268238308 + - 17.715550416443044 + - 17.73800155702708 + - 17.740795587413704 + - 17.731851121369235 + - 17.74306716850205 + - 17.74306716850205 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 600.0 + - 630.0 + - 1110.0 + - 1140.0 + - 1440.0 + - 1770.0 + - 1800.0 + - 2100.0 + - 2340.0 + - 2490.0 + - 2520.0 + - 2640.0 + - 2670.0 + - 2730.0 + - 2850.0 + - 3030.0 + - 3210.0 + - 4110.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.08168757184273 + - 46.98269326674508 + - 43.90356842095372 + - 40.84960798240563 + - 37.82801139737437 + - 34.848795668107975 + - 31.92626988495444 + - 29.08149748924578 + - 26.34655984973993 + - 23.772322986338377 + - 21.457104421978652 + - 19.57675504778375 + - 18.447898852590853 + - 18.722855569860393 + - 18.81983330875907 + - 18.313842006992758 + - 18.365351949961468 + - 18.343461103491794 + - 18.322820374086234 + - 18.34476447608613 + - 18.369505544898434 + - 18.304436181221725 + - 18.34037030215351 + - 18.34169240664045 + - 18.357033677657864 + - 18.33259354314329 + - 18.321170674390256 + - 18.304389902715386 + - 18.33731946503271 + - 18.338660767735238 + - 18.32964188175149 + - 18.343303939953586 + - 18.343303939953586 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 600.0 + - 630.0 + - 1410.0 + - 1440.0 + - 1770.0 + - 2070.0 + - 2370.0 + - 2400.0 + - 2640.0 + - 2670.0 + - 2940.0 + - 2970.0 + - 3000.0 + - 3180.0 + - 3240.0 + - 3420.0 + - 3480.0 + - 3840.0 + - 8910.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 55.243807835028726 + - 51.800675950724106 + - 48.3774160999953 + - 44.97931530623554 + - 41.613551756470585 + - 38.290095304596996 + - 35.02315823878325 + - 31.833613850619354 + - 28.753187665617318 + - 25.833048949855844 + - 23.159403881930725 + - 20.89053409445306 + - 19.351841683242206 + - 19.188932948834214 + - 19.338803610156823 + - 19.08252460105875 + - 19.205477986973825 + - 19.217532807782483 + - 19.161998198590048 + - 19.18826292383673 + - 19.164981988814393 + - 19.15768302521157 + - 19.181250162057847 + - 19.186085426459616 + - 19.166226543382987 + - 19.16586179687627 + - 19.166884389026965 + - 19.170253523901014 + - 19.171267555529077 + - 19.17910774390585 + - 19.17897390636631 + - 19.18153437407186 + - 19.176298231222255 + - 19.176298231222255 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 240.0 + - 270.0 + - 300.0 + - 330.0 + - 360.0 + - 390.0 + - 420.0 + - 450.0 + - 600.0 + - 630.0 + - 1350.0 + - 1380.0 + - 1410.0 + - 1650.0 + - 1680.0 + - 1710.0 + - 1740.0 + - 1770.0 + - 1800.0 + - 2040.0 + - 2070.0 + - 2100.0 + - 2220.0 + - 2340.0 + - 2370.0 + - 2490.0 + - 2550.0 + - 2580.0 + - 2610.0 + - 2820.0 + - 2910.0 + - 3060.0 + - 3930.0 + - 5250.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.83270410310528 + - 46.82556836172902 + - 43.88348344447279 + - 40.903465923935165 + - 37.940017467134595 + - 35.04039460056154 + - 32.21162619013505 + - 29.461991867532717 + - 26.830331366756674 + - 24.370641754413622 + - 22.142986374176747 + - 20.28594937760092 + - 19.04889016970365 + - 18.795953355003125 + - 18.15521341988251 + - 17.939735836149634 + - 18.08529204806063 + - 18.03617680994856 + - 18.010629808073922 + - 17.912248701929418 + - 17.91667470814065 + - 17.924813990220983 + - 17.938538967735703 + - 17.95593523796653 + - 17.96219271612408 + - 17.89400415447985 + - 17.89909734007762 + - 17.901912145487046 + - 17.885713787278693 + - 17.906570690112698 + - 17.907855495038866 + - 17.88311045961252 + - 17.890684437466845 + - 17.904503239735835 + - 17.912786917998268 + - 17.876402472656608 + - 17.880439959628212 + - 17.89738662793362 + - 17.896219356423543 + - 17.889077654609434 + - 17.889077654609434 +problem_name: SAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.063 + - 0.111 + - 0.114 + - 0.141 + - 0.144 + - 0.177 + - 0.18 + - 0.207 + - 0.234 + - 0.237 + - 0.24 + - 0.267 + - 0.27 + - 0.36 + - 0.39 + - 0.492 + - 0.609 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9119297651536077 + - 0.8242979156876825 + - 0.7372192339610568 + - 0.6508474200769347 + - 0.5653925655887757 + - 0.4811486690410222 + - 0.3985382699216438 + - 0.31819542072972834 + - 0.2410742105400579 + - 0.1686877658901465 + - 0.1035540043411133 + - 0.0494392442192351 + - 0.014368277584703165 + - 0.015668146539435338 + - 0.011979040738155748 + - 0.013350904470285512 + - 0.013622415951897568 + - 0.016493923537690004 + - 0.016955753726073403 + - 0.01452643349995408 + - 0.015148375068015679 + - 0.01683767289749861 + - 0.016380770362696848 + - 0.01676595137554714 + - 0.016484047889690264 + - 0.015833254835362347 + - 0.01611870569183786 + - 0.015568266668770677 + - 0.01691342961841627 + - 0.016570645946686387 + - 0.016203044502556375 + - 0.016203044502556375 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.06 + - 0.063 + - 0.111 + - 0.141 + - 0.204 + - 0.207 + - 0.234 + - 0.237 + - 0.339 + - 0.363 + - 1.0 + - !!python/tuple + - 1.0 + - 0.905851347342249 + - 0.818617464366583 + - 0.7319219013668138 + - 0.6459074431431777 + - 0.5607682249649809 + - 0.4767745376672323 + - 0.39431324990327743 + - 0.31395635368237146 + - 0.23658259074904864 + - 0.16360450014838734 + - 0.09741564007535713 + - 0.042313755703963916 + - 0.006439500456291679 + - 0.005158097603924101 + - -0.004121490290658196 + - -0.005704889503584846 + - -0.004514751462357915 + - -0.004466806287322199 + - -0.004519490423282752 + - -0.005754921827268365 + - -0.005621401514175279 + - -0.005586340653237818 + - -0.005216284216014665 + - -0.005216284216014665 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.06 + - 0.063 + - 0.111 + - 0.114 + - 0.141 + - 0.177 + - 0.207 + - 0.237 + - 0.24 + - 0.264 + - 0.267 + - 0.291 + - 0.294 + - 0.297 + - 0.315 + - 0.318 + - 0.321 + - 0.342 + - 0.345 + - 0.348 + - 0.369 + - 0.372 + - 0.375 + - 0.396 + - 0.399 + - 0.402 + - 0.423 + - 0.426 + - 0.447 + - 0.45 + - 0.453 + - 0.468 + - 0.471 + - 0.474 + - 0.477 + - 0.492 + - 0.495 + - 0.498 + - 0.501 + - 0.516 + - 0.519 + - 0.522 + - 0.525 + - 0.54 + - 0.543 + - 0.546 + - 0.549 + - 0.564 + - 0.567 + - 0.57 + - 0.573 + - 0.591 + - 0.594 + - 0.597 + - 0.615 + - 0.618 + - 0.621 + - 0.639 + - 0.642 + - 0.663 + - 0.666 + - 0.684 + - 0.687 + - 0.705 + - 0.708 + - 0.726 + - 0.729 + - 0.744 + - 0.747 + - 0.75 + - 0.768 + - 0.771 + - 0.789 + - 0.792 + - 0.813 + - 0.834 + - 0.855 + - 0.873 + - 0.876 + - 0.894 + - 0.897 + - 0.912 + - 0.915 + - 0.933 + - 0.936 + - 0.954 + - 0.957 + - 0.975 + - 0.978 + - 0.993 + - 0.996 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8885346446801584 + - 0.802456203834038 + - 0.7169181092238935 + - 0.6320646175335319 + - 0.5480919984336329 + - 0.4652736923584011 + - 0.38400129758136714 + - 0.3048540050040322 + - 0.22872150673124877 + - 0.15703282060984244 + - 0.09222831202092989 + - 0.03861518593567747 + - 0.004295253678074635 + - 0.00598133633811633 + - 0.0063943200902836835 + - -0.003185393842903863 + - 4.097244063104776e-05 + - 0.0003734447906374532 + - 0.00012560309440071908 + - 0.0018763913642426665 + - 0.0008256574263240368 + - 0.0021924980428929012 + - 0.002095957161801785 + - 0.001163943506525887 + - 0.0012453113957512126 + - 0.0016934706676275755 + - 0.0016368793222277767 + - 0.0015829421367547756 + - 0.0014555958269377419 + - 0.0014545164224726438 + - 0.001455164374848182 + - 0.0015555900804307733 + - 0.0015805991598243647 + - 0.001600377711734804 + - 0.0014456823626772053 + - 0.0014195362705938215 + - 0.0014081881679371135 + - 0.0015942236317322423 + - 0.0015992550146766173 + - 0.0015903994051915157 + - 0.0014552185921620504 + - 0.001463506819810699 + - 0.001541285851199833 + - 0.0015372619744969149 + - 0.001530936393447314 + - 0.0015023579343640106 + - 0.0015000488649784104 + - 0.0014988018510124228 + - 0.001498575067201546 + - 0.001513546826860993 + - 0.0015183784454106694 + - 0.0015225134233778541 + - 0.0015252358516688912 + - 0.0015108867027265425 + - 0.0015058241598545467 + - 0.0015020414561083678 + - 0.0015001746001275353 + - 0.0015150301259874424 + - 0.0015182382465862801 + - 0.0015199959895294153 + - 0.0015201420183146251 + - 0.001509167864230606 + - 0.0015080241941595831 + - 0.0015077999771977496 + - 0.001508354386262484 + - 0.001513546804746114 + - 0.0015135011398960758 + - 0.0015133035911610224 + - 0.0015118450398839928 + - 0.001511582229622968 + - 0.0015113511519584105 + - 0.0015123424714953238 + - 0.0015126594480041058 + - 0.0015116210713442657 + - 0.0015115595182734695 + - 0.0015123532361401074 + - 0.0015123001160005105 + - 0.001511964119382209 + - 0.0015120586294984264 + - 0.0015120744107412307 + - 0.0015119997409607107 + - 0.001512046583561959 + - 0.001512097989290877 + - 0.001512135779593467 + - 0.0015120758781395982 + - 0.0015120594209136083 + - 0.0015120388926547523 + - 0.0015120538358911833 + - 0.0015120967453899911 + - 0.0015120616651457608 + - 0.0015120760356064067 + - 0.0015120665469842611 + - 0.0015120719570495171 + - 0.0015120785758061977 + - 0.001512076310365153 + - 0.0015120680560363996 + - 0.001512069163186177 + - 0.001512076583944196 + - 0.0015120750657241899 + - 0.00151207288336185 + - 0.0015120740076228767 + - 0.0015120725297666211 + - 0.001512072276249196 + - 0.0015120740256264074 + - 0.001512074086817816 + - 0.001512073973101471 + - 0.001512073973101471 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.06 + - 0.063 + - 0.102 + - 0.105 + - 0.108 + - 0.129 + - 0.132 + - 0.135 + - 0.138 + - 0.171 + - 0.198 + - 0.219 + - 0.222 + - 0.225 + - 0.228 + - 0.246 + - 0.258 + - 0.261 + - 0.285 + - 0.309 + - 0.357 + - 0.837 + - 0.861 + - 0.912 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9022373062834483 + - 0.817820363882224 + - 0.7327568572333382 + - 0.6486216687285283 + - 0.5654908850445461 + - 0.48353050648685786 + - 0.40297500392598745 + - 0.3243509810815641 + - 0.24854464537360127 + - 0.17722821321708884 + - 0.11362434408479852 + - 0.06001100732654757 + - 0.02508224269789261 + - 0.023411270005726865 + - 0.009610314741037471 + - 0.004408892141412734 + - 0.009183071009509328 + - 0.00890619740803182 + - 0.010315243180515797 + - 0.004798738718651218 + - -0.0018960595772174742 + - -0.007258890376041393 + - -0.010803975859269814 + - -0.007820581704511562 + - -0.009710991758640295 + - -0.009087213648735173 + - -0.008739151510141076 + - -0.008412235194393037 + - -0.008110395364192604 + - -0.008862683419997968 + - -0.009802763969764174 + - -0.009920251983550971 + - -0.008646368450178415 + - -0.008994588497918283 + - -0.008998987768278172 + - -0.009117804712291407 + - -0.00912060621195591 + - -0.009081052257754088 + - -0.009081052257754088 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.063 + - 0.066 + - 0.108 + - 0.111 + - 0.114 + - 0.144 + - 0.18 + - 0.183 + - 0.21 + - 0.27 + - 0.288 + - 0.348 + - 0.384 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8396944899349587 + - 0.756876727880667 + - 0.674609002014863 + - 0.5930428896946417 + - 0.5123853287801613 + - 0.4329250719937232 + - 0.35508794969992785 + - 0.2795429270547692 + - 0.20720558832919542 + - 0.13978662199269845 + - 0.07972788099379323 + - 0.031629617092406526 + - 0.0012806071949871551 + - 0.003519948711832992 + - -0.0043949788834626155 + - -0.005112499541707845 + - -0.001987493616711492 + - -0.006132401494343713 + - -0.007595271884743251 + - -0.003337867653941801 + - -0.0034095849471422737 + - -0.0029167206215493196 + - -0.0037043492169202314 + - -0.0041369438380948345 + - -0.0037219158895284757 + - -0.004098133222962802 + - -0.0037981935711621623 + - -0.0037981935711621623 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.06 + - 0.063 + - 0.132 + - 0.135 + - 0.138 + - 0.168 + - 0.189 + - 0.192 + - 0.195 + - 0.201 + - 0.204 + - 0.216 + - 0.225 + - 0.24 + - 0.255 + - 0.276 + - 0.279 + - 0.348 + - 0.444 + - 0.465 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8880110112445286 + - 0.8037698035694462 + - 0.721121489543421 + - 0.6376817383517476 + - 0.5550372813318365 + - 0.4733975028622536 + - 0.3934188211323119 + - 0.31565779634720753 + - 0.24060805254026904 + - 0.16989515142180517 + - 0.105604548375181 + - 0.052249319788079576 + - 0.016771521973710197 + - -0.0019312689529052355 + - -0.006390944727004256 + - -0.006727409951371867 + - -0.007813920692087218 + - -0.007880927116063904 + - -0.0073257627924750955 + - -0.008356775570465921 + - -0.008034592705409127 + - -0.007769975207954392 + - -0.007437566228087691 + - -0.007149447219410938 + - -0.007725444639696197 + - -0.008368898605580502 + - -0.00873490592782468 + - -0.008277126383573296 + - -0.008460762890396779 + - -0.008389343956890836 + - -0.008651046871143184 + - -0.008274775822563262 + - -0.008408293710998676 + - -0.008408293710998676 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.063 + - 0.066 + - 0.108 + - 0.111 + - 0.114 + - 0.141 + - 0.144 + - 0.171 + - 0.174 + - 0.177 + - 0.18 + - 0.195 + - 0.198 + - 0.201 + - 0.204 + - 0.207 + - 0.21 + - 0.219 + - 0.225 + - 0.228 + - 0.231 + - 0.234 + - 0.237 + - 0.261 + - 0.27 + - 0.291 + - 0.294 + - 0.387 + - 0.606 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8305376026845845 + - 0.7502049549839428 + - 0.6697301986294416 + - 0.5896167688980682 + - 0.5101774539044386 + - 0.4319184148400672 + - 0.35519894586989054 + - 0.2804693654482846 + - 0.20861087877088672 + - 0.14098467759333236 + - 0.0799282453363028 + - 0.029394847459284328 + - -0.003520180300274578 + - -0.016386805033435047 + - -0.01639385274490204 + - -0.011211079045303333 + - -0.014247425430937636 + - -0.015236528191476199 + - -0.01873854331085557 + - -0.01854597909115793 + - -0.015594855890954789 + - -0.01587953490206344 + - -0.016134895627493227 + - -0.016344325954886045 + - -0.018472522918993768 + - -0.018841965598000752 + - -0.019099524201922017 + - -0.01926431830426814 + - 0.0 + - -0.01919012724231494 + - -0.018624618638872596 + - -0.018372254436209687 + - -0.01824600652159581 + - -0.018154916033394284 + - -0.01807121103453921 + - -0.017949421596031894 + - -0.01881120041410737 + - -0.019087453244482893 + - -0.01847753274840612 + - -0.018401628524605775 + - -0.01864461899302159 + - -0.018339917456560138 + - -0.018339917456560138 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.06 + - 0.063 + - 0.111 + - 0.114 + - 0.144 + - 0.177 + - 0.18 + - 0.21 + - 0.234 + - 0.249 + - 0.252 + - 0.264 + - 0.267 + - 0.273 + - 0.285 + - 0.303 + - 0.321 + - 0.411 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8601894973416134 + - 0.7760004497148612 + - 0.6923511871574468 + - 0.6093855552464064 + - 0.5272991382473234 + - 0.446364063759126 + - 0.36696906069519764 + - 0.289686350521892 + - 0.21538747400901623 + - 0.14545428647815833 + - 0.08255773785895071 + - 0.03147509380290094 + - 0.0008079422613448218 + - 0.008277573337279081 + - 0.0109121259292104 + - -0.0028339225010993374 + - -0.001434573998034756 + - -0.002029273224488231 + - -0.002590011057441704 + - -0.0019938650608657777 + - -0.0013217350678711047 + - -0.003089446531106059 + - -0.0021132396973035125 + - -0.002077322652397817 + - -0.0016605529299703523 + - -0.0023245075701150883 + - -0.002634827740727012 + - -0.003090703759416504 + - -0.002196120479382377 + - -0.0021596818847972664 + - -0.0024046940877487733 + - -0.0020335428188471678 + - -0.0020335428188471678 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.06 + - 0.063 + - 0.141 + - 0.144 + - 0.177 + - 0.207 + - 0.237 + - 0.24 + - 0.264 + - 0.267 + - 0.294 + - 0.297 + - 0.3 + - 0.318 + - 0.324 + - 0.342 + - 0.348 + - 0.384 + - 0.891 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0004266019976333 + - 0.906888516523876 + - 0.8138902860535316 + - 0.7215755408809584 + - 0.6301392877308837 + - 0.5398523733432156 + - 0.45110089684809207 + - 0.36445191399547283 + - 0.2807672985144969 + - 0.2014371438854391 + - 0.12880337634662253 + - 0.06716596504752768 + - 0.025364969002692774 + - 0.02093929736550136 + - 0.02501076926952747 + - 0.018048547471570774 + - 0.021388769312458773 + - 0.02171625745321547 + - 0.020207572570979892 + - 0.020921095084093035 + - 0.020288631918811674 + - 0.020090344108674902 + - 0.020730582396016637 + - 0.02086193994783237 + - 0.02032244219838433 + - 0.020312533286652855 + - 0.020340313608525624 + - 0.02043184144899493 + - 0.020459389210825154 + - 0.02067238024200227 + - 0.02066874433503334 + - 0.0207383034617651 + - 0.020596055417288005 + - 0.020596055417288005 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.024 + - 0.027 + - 0.03 + - 0.033 + - 0.036 + - 0.039 + - 0.042 + - 0.045 + - 0.06 + - 0.063 + - 0.135 + - 0.138 + - 0.141 + - 0.165 + - 0.168 + - 0.171 + - 0.174 + - 0.177 + - 0.18 + - 0.204 + - 0.207 + - 0.21 + - 0.222 + - 0.234 + - 0.237 + - 0.249 + - 0.255 + - 0.258 + - 0.261 + - 0.282 + - 0.291 + - 0.306 + - 0.393 + - 0.525 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8534254703560424 + - 0.7717319048872742 + - 0.6918055472255651 + - 0.6108486908181788 + - 0.5303419590508396 + - 0.45156914968749784 + - 0.3747212129104911 + - 0.3000230779184598 + - 0.22852988708786362 + - 0.16170855554170838 + - 0.10119079834730023 + - 0.05074147164405649 + - 0.017134815317047167 + - 0.010263389479202467 + - -0.00714331721448142 + - -0.012997104209037727 + - -0.009042841099619597 + - -0.010377133684092732 + - -0.01107115811453676 + - -0.013743835381851479 + - -0.013623595971568972 + - -0.013402479590173403 + - -0.01302961901932236 + - -0.01255702201564871 + - -0.012387027793406087 + - -0.014239477168489723 + - -0.014101112782289526 + - -0.014024644172365226 + - -0.014464698014489095 + - -0.01389808749082656 + - -0.013863183747072544 + - -0.014535421499367684 + - -0.014329662495147251 + - -0.013954253027483845 + - -0.013729213897010605 + - -0.014717654500693964 + - -0.014607969825770334 + - -0.014147586964552449 + - -0.01417929772845853 + - -0.014373313275107043 + - -0.014373313275107043 +solver_name: ADAM diff --git a/test/expected_results/SAN1_ALOE.yaml b/test/expected_results/SAN1_ALOE.yaml new file mode 100644 index 000000000..531e56f17 --- /dev/null +++ b/test/expected_results/SAN1_ALOE.yaml @@ -0,0 +1,5529 @@ +all_est_objectives: +- - 55.228104638490976 + - 51.74290515462544 + - 47.45237639405341 + - 42.26035813158599 + - 36.71048421501159 + - 31.928856459488024 + - 31.895328754327192 + - 31.85448741119961 + - 31.804862825802648 + - 31.744686471908995 + - 31.67180447176584 + - 31.583560045534185 + - 31.47687982669238 + - 31.347599200136006 + - 31.19057513597263 + - 30.99934714094278 + - 30.769393966336743 + - 30.479904963305362 + - 30.126580035784215 + - 29.697307521366366 + - 29.19210118126377 + - 28.59470738947023 + - 27.892271269147923 + - 27.089462829214444 + - 26.202846706214682 + - 25.171734846632457 + - 24.2074999361262 + - 23.093613840398596 + - 22.960732949256464 + - 22.20534682464633 + - 21.668339268024738 + - 21.21131880260852 + - 20.967845728621256 + - 20.464209913113102 + - 20.41562045638525 + - 19.51478425033428 + - 19.23258448865307 + - 19.071667697898942 + - 19.02664054134396 + - 19.022833247447554 + - 19.0085360762555 + - 18.996775248074346 + - 18.999387105768363 + - 18.999387105768363 +- - 54.98944203450111 + - 51.07194777637888 + - 46.32026729423287 + - 40.57503487958934 + - 34.018858556086386 + - 27.956556811156087 + - 27.20644058549137 + - 22.724773752274288 + - 21.099990208633006 + - 19.960863929966305 + - 19.169466696794444 + - 18.68331070953991 + - 18.309811773728345 + - 18.22034780784874 + - 18.22034780784874 +- - 54.30952001078969 + - 50.45118815726307 + - 45.83720775172711 + - 40.2946675344002 + - 33.87392833582399 + - 31.450682202007183 + - 29.431711837680318 + - 29.168771780341668 + - 28.856034553544937 + - 28.49300103179187 + - 28.073499179733293 + - 27.58544275760009 + - 27.003129999223937 + - 26.305662563174188 + - 25.484332703979113 + - 24.602161556896604 + - 23.533804646833797 + - 22.54156545286501 + - 21.3597980401242 + - 20.724983853687448 + - 19.36000942319682 + - 19.10799799615526 + - 19.053936391922697 + - 18.845095091508945 + - 18.538408437709347 + - 18.49880528916911 + - 18.47074736303831 + - 18.460868332983875 + - 18.472844801512586 + - 18.469357971341026 + - 18.468217732949466 + - 18.472510452092948 + - 18.47202921037179 + - 18.47290567885053 + - 18.47271501737672 + - 18.47271501737672 +- - 54.76055167633331 + - 50.02971632099352 + - 44.237519067910135 + - 37.68800424914575 + - 30.576187079894723 + - 26.16038880800539 + - 25.748250158907798 + - 24.32300283263698 + - 22.947322992817394 + - 22.023707199010342 + - 21.48478516753085 + - 21.044308997300856 + - 20.702899034366236 + - 20.385087407299977 + - 20.09607396973056 + - 19.75463819204078 + - 19.828631556804556 + - 19.19992801806071 + - 18.671104731956703 + - 18.229514696507955 + - 18.126015996881993 + - 18.091284908697702 + - 18.113909933579812 + - 18.060598788092854 + - 18.035939605853375 + - 18.072475927998244 + - 18.072475927998244 +- - 52.39186295815599 + - 48.85818502828146 + - 44.6583839988286 + - 39.617306530359315 + - 34.29611961968402 + - 29.901835989945084 + - 28.20409619507546 + - 26.556130467950542 + - 25.179084881288368 + - 23.635846968218324 + - 21.892457029893833 + - 20.924380268489895 + - 20.39336646545886 + - 19.909707016745973 + - 19.634054914303345 + - 19.27397548118142 + - 19.252527948791766 + - 18.573572430957615 + - 18.368984490535922 + - 18.3142722824306 + - 18.233355008665907 + - 18.306749415174203 + - 18.254909542637296 + - 18.254909542637296 +- - 54.25979384648611 + - 50.66221142659251 + - 46.34171422752597 + - 41.11506718041683 + - 35.046837162589576 + - 28.45352925973932 + - 23.57220309356454 + - 23.67161439293576 + - 20.393253117400562 + - 20.251742202354087 + - 19.10595751539815 + - 18.669916284097777 + - 18.20936265460579 + - 18.197924433156142 + - 18.103479815807887 + - 18.103479815807887 +- - 51.823992493809435 + - 48.5269640348791 + - 44.506819416988584 + - 39.64375430622489 + - 33.98942496735826 + - 27.79111494814064 + - 23.36875260065585 + - 23.331378985385403 + - 20.108958264034865 + - 19.584985628922237 + - 18.495914357260304 + - 18.31345481142039 + - 18.202233173086164 + - 17.944901098611467 + - 17.944901098611467 +- - 53.19657777800099 + - 49.23587911344768 + - 44.42751769604405 + - 38.73851833617827 + - 32.38126034666831 + - 29.661689980402265 + - 28.15663181465477 + - 26.398641342021683 + - 25.163547932073108 + - 24.12667265144751 + - 23.507823330571995 + - 21.924881052406718 + - 21.78844701370752 + - 20.065959208852107 + - 19.949179977911225 + - 19.057100622696822 + - 18.948935190874604 + - 18.85707890627266 + - 18.77899400855519 + - 18.7150748710416 + - 18.66670229372697 + - 18.61227285385895 + - 18.56945865319588 + - 18.499814403770095 + - 18.45651109669519 + - 18.37165618766656 + - 18.31038891962592 + - 18.338349781633195 + - 18.338349781633195 +- - 58.70283939001095 + - 54.67952318262257 + - 49.72844295384127 + - 43.78463532629037 + - 36.992241727025565 + - 33.82313706453492 + - 31.96241392767808 + - 31.553590258787807 + - 31.063930561711004 + - 30.4876347760367 + - 29.8181320737578 + - 29.04751079191512 + - 28.15502325559472 + - 27.13681173292967 + - 26.084109807412723 + - 24.951839396900773 + - 23.82972343192668 + - 22.583917294045953 + - 21.644817512735987 + - 20.364296459879185 + - 19.50652439806046 + - 19.314758826341542 + - 19.307827115441928 + - 19.30303943134948 + - 19.308343929293923 + - 19.1712884967085 + - 19.200824769023193 + - 19.17483797722845 + - 19.167695287907573 + - 19.16545567169502 + - 19.165749934506902 + - 19.164668578376688 + - 19.162788975219147 + - 19.162788975219147 +- - 52.87627843731777 + - 48.779758060549945 + - 43.92901678611646 + - 38.17248417897188 + - 32.19686016203408 + - 27.946427780526943 + - 26.52709209746216 + - 22.507635651115937 + - 22.432227419591207 + - 22.345696574506395 + - 22.242486975727648 + - 22.12403955050055 + - 21.981791212354757 + - 21.817668133602595 + - 21.623327507936846 + - 21.405303484541584 + - 21.165034439711125 + - 20.909954534161393 + - 20.635504006728766 + - 20.3885480480245 + - 20.060625695248337 + - 19.84468233120996 + - 18.981232272106634 + - 18.72605454746706 + - 18.60249547854496 + - 18.494853063272597 + - 18.400499248011883 + - 18.28547418576808 + - 17.908723811329875 + - 17.87022534357056 + - 17.84234425047018 + - 17.84797776195343 + - 17.84797776195343 +all_intermediate_budgets: +- - 0 + - 60 + - 90 + - 120 + - 150 + - 960 + - 990 + - 1020 + - 1050 + - 1080 + - 1110 + - 1140 + - 1170 + - 1200 + - 1230 + - 1260 + - 1290 + - 1320 + - 1350 + - 1380 + - 1410 + - 1440 + - 1470 + - 1500 + - 1530 + - 1560 + - 1590 + - 1620 + - 1680 + - 1920 + - 1950 + - 1980 + - 2010 + - 2040 + - 2070 + - 2160 + - 2190 + - 2730 + - 2790 + - 3510 + - 5460 + - 6210 + - 7320 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 270 + - 300 + - 360 + - 570 + - 600 + - 1230 + - 1500 + - 1980 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 210 + - 660 + - 690 + - 720 + - 750 + - 780 + - 810 + - 840 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1050 + - 1470 + - 1500 + - 1530 + - 1560 + - 1980 + - 2010 + - 2040 + - 2520 + - 2550 + - 6300 + - 7020 + - 7050 + - 7080 + - 7110 + - 7140 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 420 + - 450 + - 480 + - 510 + - 540 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1230 + - 1500 + - 2460 + - 2490 + - 2520 + - 2550 + - 3030 + - 5790 + - 5820 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 390 + - 420 + - 450 + - 480 + - 510 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1230 + - 1470 + - 1500 + - 2040 + - 4620 + - 4650 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 330 + - 360 + - 390 + - 600 + - 630 + - 1200 + - 2910 + - 8460 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 270 + - 300 + - 510 + - 540 + - 570 + - 780 + - 2730 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 210 + - 420 + - 450 + - 480 + - 510 + - 540 + - 690 + - 720 + - 900 + - 930 + - 1440 + - 1470 + - 1500 + - 1530 + - 1560 + - 1590 + - 1620 + - 1650 + - 1680 + - 1710 + - 1740 + - 2430 + - 2460 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 210 + - 630 + - 660 + - 690 + - 720 + - 750 + - 780 + - 810 + - 840 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1560 + - 1590 + - 1620 + - 1650 + - 1680 + - 2220 + - 2250 + - 2760 + - 3420 + - 4020 + - 4740 + - 5460 + - 6570 + - 10000 +- - 0 + - 60 + - 90 + - 120 + - 150 + - 180 + - 210 + - 870 + - 900 + - 930 + - 960 + - 990 + - 1020 + - 1050 + - 1080 + - 1110 + - 1140 + - 1170 + - 1200 + - 1230 + - 1260 + - 1290 + - 1680 + - 1710 + - 1740 + - 1770 + - 1800 + - 1830 + - 2460 + - 4980 + - 7020 + - 7860 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.787638378894374 + - 7.945284669011223 + - 7.476197318233128 + - 7.387075836742294 + - 7.487620964326631 + - 7.840392963390204 + - 7.55377119116471 + - 7.5294364198434724 + - 7.803535962438403 + - 7.848590405544335 + - 7.395022986452681 + - 7.296671869198091 + - 7.339087524985206 + - !!python/tuple + - 5.279786528472579 + - 7.877160436063412 + - 6.824276665516119 + - 6.624296207663977 + - 6.8499116812244925 + - 7.641687457634353 + - 6.981989013824463 + - 6.985906579881139 + - 7.443353939200406 + - 7.66008924793665 + - 6.634556073413248 + - 6.4506626888267276 + - 6.5889064822670145 + - !!python/tuple + - 3.417108940688446 + - 7.7924351136788275 + - 5.972457283373769 + - 5.652520494948549 + - 6.274397425865499 + - 7.375093287181539 + - 6.271930061471076 + - 6.141090408858254 + - 7.000326537205483 + - 7.361053243141983 + - 5.819237611008223 + - 5.390853662369932 + - 5.650012538889894 + - !!python/tuple + - 1.1882352628308501 + - 7.5104428515965305 + - 5.178093235030762 + - 4.486014193186193 + - 5.292751458738357 + - 7.068751528744006 + - 5.39394172212449 + - 5.309162957498752 + - 6.4511455347122135 + - 6.990017600610788 + - 4.736410573958486 + - 4.099487072367526 + - 4.501126724152163 + - !!python/tuple + - 0.7780301761265375 + - 6.950021020295996 + - 4.196715926692892 + - 3.0921222889052937 + - 4.374031555656052 + - 6.4491894612770935 + - 4.313730419180508 + - 4.334625414881903 + - 5.770381411274641 + - 6.529272090861314 + - 3.299804267465519 + - 2.810065120935144 + - 3.1311585261444455 + - !!python/tuple + - 0.7871460943017783 + - 6.944658137514027 + - 4.191268792496227 + - 3.0854099089360076 + - 4.369821015071733 + - 6.444380596743158 + - 4.3080134909549335 + - 4.329874590870182 + - 5.7664678989367175 + - 6.52694577625721 + - 3.2918848631006576 + - 2.804047207827986 + - 3.125393210683686 + - !!python/tuple + - 0.7978556933867182 + - 6.937955110262251 + - 4.184462535079083 + - 3.07702764074424 + - 4.364559654728783 + - 6.438370162716175 + - 4.300869901764352 + - 4.323938165983171 + - 5.761576743104115 + - 6.524038184272198 + - 3.281993577370174 + - 2.796534619091082 + - 3.118193351491925 + - !!python/tuple + - 0.8102735816027504 + - 6.929577228822358 + - 4.175958886712269 + - 3.0665627104248436 + - 4.357985799100337 + - 6.430858132997088 + - 4.291944449187523 + - 4.316520935168675 + - 5.75546394856926 + - 6.520404165543252 + - 3.2696420143059295 + - 2.7871592910006826 + - 3.1092041854234953 + - !!python/tuple + - 0.8244510219079899 + - 6.919106291827991 + - 4.165335879876806 + - 3.0535018725879604 + - 4.3497729407546375 + - 6.421469683151285 + - 4.280793969021579 + - 4.307254575004742 + - 5.747824757493335 + - 6.5158623794765775 + - 3.2542223408989215 + - 2.775464384916514 + - 3.0979844912035435 + - !!python/tuple + - 0.8403455673211664 + - 6.906019839958342 + - 4.152067425626711 + - 3.0372079010378252 + - 4.339513870203382 + - 6.409736610382026 + - 4.266865832180738 + - 4.295679758490251 + - 5.738278593863305 + - 6.510186300975777 + - 3.2349790124566793 + - 2.7608840023012715 + - 3.083986283453246 + - !!python/tuple + - 0.8577892414398187 + - 6.889665260060309 + - 4.135498084844889 + - 3.0168911834693537 + - 4.32670103566083 + - 6.395074177737877 + - 4.249471355122353 + - 4.281224030354169 + - 5.72635032225824 + - 6.503093009983406 + - 3.210974407634204 + - 2.7427189863110586 + - 3.0665302179846394 + - !!python/tuple + - 0.8764598055786093 + - 6.869227514179049 + - 4.114812013443847 + - 2.991575825199467 + - 4.310702308522091 + - 6.376752279889844 + - 4.227753029955094 + - 4.26317452322735 + - 5.711446945621586 + - 6.494229227488866 + - 3.181047489485032 + - 2.7201085666873706 + - 3.0447761307499785 + - !!python/tuple + - 0.8958613902425763 + - 6.8436889593138 + - 4.088994925821376 + - 2.960059951478062 + - 4.290731198089399 + - 6.353859577280802 + - 4.200644322120066 + - 4.2406444537788355 + - 5.692828675952245 + - 6.48315393808979 + - 3.14376484050898 + - 2.6919980425129806 + - 3.0176883188716954 + - !!python/tuple + - 0.9153223967455087 + - 6.811779377661347 + - 4.05678783201598 + - 2.9208705822071384 + - 4.265810442508323 + - 6.325258948739979 + - 4.166820666299635 + - 4.212532221254734 + - 5.669573091219387 + - 6.469316791069142 + - 3.0973640660460036 + - 2.657103614039598 + - 2.9839956451900775 + - !!python/tuple + - 0.9340200874641933 + - 6.771913929697376 + - 4.016631338011063 + - 2.872214916774668 + - 4.234727840966326 + - 6.2895322694809375 + - 4.12464028766381 + - 4.177471889158367 + - 5.640530846115468 + - 6.452031297097321 + - 3.0396910449471193 + - 2.613877293582129 + - 2.9421475739612637 + - !!python/tuple + - 0.943064904873237 + - 6.723438258036169 + - 3.9661877967942147 + - 2.811932855124457 + - 4.195983261513596 + - 6.24491214028389 + - 4.072073731105903 + - 4.133773963573226 + - 5.604271148541262 + - 6.430441636021526 + - 2.9681356876405065 + - 2.5604783535440894 + - 2.8902693342025088 + - !!python/tuple + - 0.9506997266931966 + - 6.662896613130495 + - 3.9033995722401174 + - 2.737421254740536 + - 4.164855214825414 + - 6.189197801592356 + - 4.000993201028531 + - 4.079355883857146 + - 5.559014983539932 + - 6.393402332510439 + - 2.8860665028422874 + - 2.4947645732815875 + - 2.824851711146424 + - !!python/tuple + - 0.9564711390821166 + - 6.58730424791232 + - 3.825346633624653 + - 2.6457452891378757 + - 4.126123872821162 + - 6.11965212836038 + - 3.912595907855867 + - 4.011662897847661 + - 5.502553937846176 + - 6.347162137034049 + - 2.7848531073304366 + - 2.4143297155567702 + - 2.7442558850006753 + - !!python/tuple + - 0.960195760320732 + - 6.492950092289684 + - 3.72848972876423 + - 2.533616677538183 + - 4.077994747219676 + - 6.032876461515971 + - 3.802847610379464 + - 3.9275827763742432 + - 5.432152607848532 + - 6.2894556758779006 + - 2.6606656024839372 + - 2.3166393505111658 + - 2.645469034136323 + - !!python/tuple + - 0.9620781185171594 + - 6.375228466626347 + - 3.608597127580909 + - 2.4033178778689965 + - 3.9866018859999106 + - 5.924660397951714 + - 3.6670626411287737 + - 3.8233637199631776 + - 5.344433280787405 + - 6.222881143702775 + - 2.5076352579078685 + - 2.1993674686177442 + - 2.557076540507574 + - !!python/tuple + - 0.9626943165349866 + - 6.228438558824785 + - 3.460721743689267 + - 2.2475508409789273 + - 3.8735030453922525 + - 5.78980519383599 + - 3.499467780169552 + - 3.694557202770307 + - 5.2352435200558185 + - 6.139885718047274 + - 2.3236247224925655 + - 2.061133569075584 + - 2.4507021418434816 + - !!python/tuple + - 0.9627566636563849 + - 6.045551950943492 + - 3.2793094030100964 + - 2.065554754191022 + - 3.7340382176842883 + - 5.6219235820416005 + - 3.2937084158077257 + - 3.5360338453712434 + - 5.099511841255269 + - 6.036501298160296 + - 2.1070179585710482 + - 1.9030148166988756 + - 2.32467932645114 + - !!python/tuple + - 0.9627451601994582 + - 5.817956942877178 + - 3.05861987625206 + - 1.8613695044721932 + - 3.5629529973138427 + - 5.413228842817754 + - 3.043242668504806 + - 3.3421778763178405 + - 4.931106836253374 + - 5.907857265636317 + - 1.8618837005989393 + - 1.731440915479504 + - 2.1790175096889284 + - !!python/tuple + - 0.9627514064757494 + - 5.53520921784925 + - 2.7938804904272025 + - 1.6495318004602364 + - 3.3547389332979565 + - 5.154349704550887 + - 2.7427983931420905 + - 3.1074954419969187 + - 4.72273768898096 + - 5.748018747282707 + - 1.6060393489160503 + - 1.5629230511581544 + - 2.0173932525148146 + - !!python/tuple + - 1.0256379721256925 + - 5.137268564829283 + - 2.5550190969778757 + - 1.4636270958827813 + - 3.1045530501274414 + - 4.834264864623432 + - 2.3488902229949105 + - 2.909711170772723 + - 4.525535341259502 + - 5.452674215873817 + - 1.4302351045021053 + - 1.4350141611017835 + - 1.8758786788702526 + - !!python/tuple + - 0.7732525554818213 + - 4.782872280721051 + - 2.1992268898464955 + - 1.3450454237106761 + - 2.810443372784998 + - 4.460599390947452 + - 1.9492745009371328 + - 2.6386353476654603 + - 4.2636182843060375 + - 5.00819939716426 + - 1.3832050519080878 + - 1.429697999198676 + - 1.75647023631764 + - !!python/tuple + - 1.7989964753166652 + - 4.178395572679629 + - 1.9488910720942174 + - 1.3439890448415215 + - 2.4785118467137477 + - 3.9801836092194804 + - 1.6028806237164905 + - 2.339657781481624 + - 3.7887689753969642 + - 4.713543098302691 + - 1.2202819425448175 + - 1.428706047244198 + - 1.6753629026516776 + - !!python/tuple + - 0.4343342939717416 + - 3.8138704583809293 + - 1.6761833830963409 + - 1.2592424837560199 + - 2.629440470017624 + - 3.5762245015255756 + - 1.3856814627103609 + - 1.856992880179907 + - 3.583502485808339 + - 4.08221621718391 + - 1.5737234464713972 + - 1.3333497770292995 + - 1.3163531498366168 + - !!python/tuple + - 2.213789870145643 + - 3.661630520719936 + - 1.6729148339946946 + - 1.2909690146433481 + - 2.507992643764001 + - 3.4617268817623112 + - 1.396402845240504 + - 1.871963549479346 + - 3.451593166586325 + - 4.037830402009764 + - 1.4649512822528603 + - 1.3659340905864394 + - 1.4125785607306354 + - !!python/tuple + - 1.706497150002253 + - 3.5627572631562083 + - 1.6316981843325409 + - 1.3107270079017248 + - 2.3087831028523214 + - 3.3461699432932557 + - 1.397498666046586 + - 1.8883116024324111 + - 3.2898122270227614 + - 3.950462624063672 + - 1.387430425562561 + - 1.3930882451586726 + - 1.4925379718697815 + - !!python/tuple + - 1.1695504378674046 + - 3.4272109845306344 + - 1.5918762969473363 + - 1.3127905989700301 + - 2.2313896969593756 + - 3.19746791652144 + - 1.4051681798608229 + - 1.8227569663166499 + - 3.155930657685438 + - 3.7939950815264547 + - 1.3674449240085103 + - 1.3745690913478867 + - 1.4518754730124286 + - !!python/tuple + - 0.8085144841260645 + - 3.2628620554319494 + - 1.5573202201036587 + - 1.313907297083646 + - 2.1452392381681027 + - 3.018390521470741 + - 1.4102957393808158 + - 1.757241778070994 + - 2.9949832167180057 + - 3.6027260013092564 + - 1.3546997629515254 + - 1.3626024980555003 + - 1.421444679720743 + - !!python/tuple + - 1.1559081205938186 + - 3.0662185206292403 + - 1.5318323168612167 + - 1.314317286349907 + - 2.0540060557251025 + - 2.806494072918992 + - 1.4130291196032558 + - 1.698209270234018 + - 2.8048799429726556 + - 3.3712119546209633 + - 1.3488783018711683 + - 1.3569811206927773 + - 1.403935700339768 + - !!python/tuple + - 0.6122695662969223 + - 2.871174381266314 + - 1.5172668249379817 + - 1.2695431380486033 + - 1.8370076760992924 + - 2.6218146483762443 + - 1.4247416336269159 + - 1.653051218997934 + - 2.586780750632314 + - 3.1205303781365608 + - 1.3116868253858809 + - 1.3555438505581712 + - 1.3921455513274716 + - !!python/tuple + - 0.911679576633448 + - 2.5628393434506567 + - 1.511470650661486 + - 1.2512704250939846 + - 1.6300379908361398 + - 2.3022889456710844 + - 1.428692924176955 + - 1.5602532289481146 + - 2.197410374154894 + - 2.628539575581547 + - 1.3218356075256152 + - 1.3157742946234166 + - 1.2441903107218788 + - !!python/tuple + - 0.8897954400319382 + - 2.501364808739463 + - 1.5112890912002945 + - 1.2747499796228556 + - 1.563115970546204 + - 2.1703619839521586 + - 1.4256618597152773 + - 1.5395976796656126 + - 2.0128633112859857 + - 2.34768014471082 + - 1.309876839540836 + - 1.3312886639938737 + - 1.3117238940220037 + - !!python/tuple + - 0.954404235198379 + - 2.351016994934256 + - 1.471678312020877 + - 1.266017830413883 + - 1.4977523119608849 + - 2.0660496154509764 + - 1.4507542635806459 + - 1.4629460780045753 + - 1.8383471562759146 + - 2.2035250494572725 + - 1.293306675732982 + - 1.2858608688185267 + - 1.2812629400795414 + - !!python/tuple + - 0.9418043056599386 + - 2.347200237345855 + - 1.498532026343211 + - 1.269427214142825 + - 1.5011232761313404 + - 2.037035220550528 + - 1.4425434045115442 + - 1.5012022222582697 + - 1.831098082897672 + - 2.1766986607962275 + - 1.2648264624076158 + - 1.304318340690006 + - 1.2730653864993693 + - !!python/tuple + - 0.8949023935616395 + - 2.376183138982604 + - 1.4961922338116846 + - 1.2795079364820214 + - 1.5004275212114935 + - 2.0176314544864726 + - 1.4494346846638781 + - 1.483522909282734 + - 1.8211323495880558 + - 2.1379919754393355 + - 1.2748449044413552 + - 1.3016188800026176 + - 1.3047683947610884 + - !!python/tuple + - 0.9090508845017766 + - 2.3358014743470528 + - 1.5000961382351916 + - 1.269470654314215 + - 1.4916579892716746 + - 2.0444027258545066 + - 1.4468861647135807 + - 1.4776316654660664 + - 1.8209320579681505 + - 2.1204312125882936 + - 1.2692383015020037 + - 1.3066427550197686 + - 1.2891922014958013 + - !!python/tuple + - 0.8977311701482452 + - 2.3395922822768758 + - 1.5056272259434254 + - 1.2695151944003846 + - 1.488293871810997 + - 1.9945634132858083 + - 1.4479176847325768 + - 1.4765927130619558 + - 1.8209320498564487 + - 2.115365730765384 + - 1.2659847013887118 + - 1.3050350519876444 + - 1.2844343870767907 + - !!python/tuple + - 0.9092624473989381 + - 2.3399430576705873 + - 1.4995702100099368 + - 1.2689946693357443 + - 1.4863456346888066 + - 1.995448303501922 + - 1.446369293547905 + - 1.4771121733914505 + - 1.8209320497366441 + - 2.125067831076662 + - 1.2686974971485905 + - 1.3044061545134031 + - 1.2866574812855842 + - !!python/tuple + - 0.9092624473989381 + - 2.3399430576705873 + - 1.4995702100099368 + - 1.2689946693357443 + - 1.4863456346888066 + - 1.995448303501922 + - 1.446369293547905 + - 1.4771121733914505 + - 1.8209320497366441 + - 2.125067831076662 + - 1.2686974971485905 + - 1.3044061545134031 + - 1.2866574812855842 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.045385603064696 + - 7.692017373337816 + - 7.701440062017517 + - 7.17928430407825 + - 7.816505785050293 + - 7.732216396424016 + - 7.3102003817479435 + - 7.402728411481593 + - 7.78622604312833 + - 7.744541143787254 + - 7.569731764224024 + - 7.239167347629282 + - 7.397618924635774 + - !!python/tuple + - 5.857768951712353 + - 7.308634434677305 + - 7.288637219152105 + - 6.166788147451054 + - 7.5880657806545475 + - 7.276856011718052 + - 6.5801017360865615 + - 6.659417733337226 + - 7.520095796270571 + - 7.446549179490551 + - 6.99456324848743 + - 6.292447720425007 + - 6.701118049830229 + - !!python/tuple + - 4.3873059644652725 + - 6.832248977950657 + - 6.775702193135361 + - 4.911939708118095 + - 7.304078758426604 + - 6.711028664580411 + - 5.6400284401601635 + - 5.752181603046225 + - 7.189289442338935 + - 7.00792098687725 + - 6.280271588125232 + - 5.219130239693015 + - 5.836735676799032 + - !!python/tuple + - 2.5937763324213 + - 6.242043891348655 + - 6.097075592816642 + - 3.575669951833089 + - 6.681461606457278 + - 5.854723567727057 + - 4.322133038811132 + - 5.300852521776168 + - 6.592191410639241 + - 6.464182906164761 + - 5.052179621809674 + - 4.252844757607307 + - 4.885527182215124 + - !!python/tuple + - 0.5879178090263486 + - 5.51464563559588 + - 5.261288929648632 + - 2.0401196379882185 + - 5.817089343990122 + - 4.801358534385669 + - 2.9165343441333587 + - 4.6010487531648785 + - 5.996115920264654 + - 5.7932251481052495 + - 3.5782307965166122 + - 2.9687869713310913 + - 3.684415157883339 + - !!python/tuple + - 4.485209244682363 + - 4.717158692976525 + - 4.563311123073009 + - 1.2858258230648278 + - 4.952889677229028 + - 3.935110629454184 + - 2.188247036644511 + - 3.964607884403074 + - 5.45474002382459 + - 5.378356850031371 + - 2.4340212640700556 + - 2.18489233655324 + - 3.120869266174423 + - !!python/tuple + - 2.2378204562894477 + - 4.036819312807765 + - 3.7790910442962296 + - 1.1169091707760632 + - 3.9000142175610373 + - 2.9681831314778266 + - 1.136146192562785 + - 3.36355932212032 + - 4.792167948495532 + - 4.713075355999452 + - 1.4082968323835248 + - 1.4055687530058254 + - 2.2596758659160026 + - !!python/tuple + - 0.5336650714175679 + - 3.109498217875951 + - 3.1026220387046086 + - 1.2324998182743445 + - 3.246030965482556 + - 2.3026191892413546 + - 1.8129820214558903 + - 2.254219350686392 + - 4.001243515767202 + - 4.231654139467215 + - 1.3447281519927263 + - 1.2372449006626565 + - 1.6863583977977337 + - !!python/tuple + - 2.0606121141858758 + - 2.52992460787704 + - 2.7718454463482587 + - 1.0769311758711206 + - 2.6873025458336715 + - 2.020231875352594 + - 1.1034651490202914 + - 2.047486049090776 + - 3.235007851314228 + - 3.300494707145152 + - 1.5506345486196156 + - 1.4305416135822269 + - 1.5368939960493035 + - !!python/tuple + - 0.9125958640992133 + - 2.268408537792729 + - 2.394972522459207 + - 1.352518364566341 + - 2.166132581728415 + - 1.774676669862311 + - 1.2487939450709007 + - 2.2251488842835214 + - 2.7230862005240155 + - 2.893980629781858 + - 1.0178794280084875 + - 1.5760587184274895 + - 1.6655219102476817 + - !!python/tuple + - 0.8494852072208576 + - 1.8504730366720283 + - 1.7359317670838923 + - 0.7829134473155184 + - 1.9228894199429967 + - 1.6503615047217093 + - 1.9548541945467868 + - 1.342304764258607 + - 2.0139456201558006 + - 1.9900834791255053 + - 1.6003100007218405 + - 1.0884073462905166 + - 1.4801894296879694 + - !!python/tuple + - 1.1217995880201646 + - 1.8802771163018774 + - 1.7185353238290877 + - 0.9508660763764629 + - 1.9358366774625668 + - 1.6756005379708403 + - 1.3802308348893673 + - 1.3852028418764875 + - 1.8753678179896005 + - 1.9235043505755727 + - 1.537242798040546 + - 1.1084585456489227 + - 1.3537390770557742 + - !!python/tuple + - 1.0308455690731064 + - 1.7772666580052487 + - 1.7131580989281125 + - 1.0857534219963425 + - 1.8703342592634682 + - 1.6616249582777287 + - 1.3832931687926782 + - 1.4075260098531732 + - 1.8725833255877076 + - 1.9139675468348474 + - 1.4601993696928293 + - 1.516414173787981 + - 1.3478685820498628 + - !!python/tuple + - 1.0308455690731064 + - 1.7772666580052487 + - 1.7131580989281125 + - 1.0857534219963425 + - 1.8703342592634682 + - 1.6616249582777287 + - 1.3832931687926782 + - 1.4075260098531732 + - 1.8725833255877076 + - 1.9139675468348474 + - 1.4601993696928293 + - 1.516414173787981 + - 1.3478685820498628 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.914769538577726 + - 7.637700549594735 + - 7.881049972841904 + - 7.186313102011579 + - 7.746957059680917 + - 7.652314919248567 + - 7.154702474493025 + - 7.590156342579812 + - 7.769791974501059 + - 7.660621922947534 + - 7.130194958925988 + - 7.620204167494377 + - 7.540977318738453 + - !!python/tuple + - 5.564843161825772 + - 7.186723140589447 + - 7.697151615626632 + - 6.210305377619383 + - 7.190906303096975 + - 7.178932165850242 + - 6.358422451780006 + - 7.080017964486155 + - 7.527616283386322 + - 7.238168191965309 + - 6.047994501685079 + - 7.147454794125008 + - 6.969649086521706 + - !!python/tuple + - 3.8952126602471067 + - 6.626468472793477 + - 7.468495098625115 + - 5.000552956703301 + - 6.500024947487105 + - 6.590838726982848 + - 5.37119623274326 + - 6.446394228291204 + - 7.226588803300404 + - 6.713299663930472 + - 4.70722671883364 + - 6.560195356507677 + - 6.260178169245668 + - !!python/tuple + - 1.8738307576186126 + - 5.932814881824314 + - 7.1847239540342205 + - 3.5158289373760807 + - 5.644879335146058 + - 5.862786763318491 + - 4.156553995095099 + - 5.662400589963859 + - 6.853235821339831 + - 6.063271192072946 + - 3.0660166010712047 + - 5.8332723871336905 + - 5.382969463017059 + - !!python/tuple + - 0.27997152311707363 + - 5.250170387130312 + - 6.839784935927654 + - 2.1756016513178795 + - 4.804800655018269 + - 5.078893599387651 + - 3.0446529791677714 + - 4.828209937587683 + - 6.4840687395686505 + - 5.506903038967569 + - 1.500476569912642 + - 5.0917934300135945 + - 4.6100403790008695 + - !!python/tuple + - 1.5316153424731775 + - 5.213486467352858 + - 6.810786929127266 + - 2.1339785492316468 + - 4.759898176345442 + - 5.036445070277713 + - 3.0016426845073205 + - 4.7796772901103415 + - 6.468893627158259 + - 5.479449690565252 + - 1.4800775659855991 + - 5.04426130227257 + - 4.554714359500406 + - !!python/tuple + - 1.4410760979455617 + - 5.16770033237173 + - 6.7745639027678175 + - 2.083066638863748 + - 4.7038802840514355 + - 4.983472486703641 + - 2.946225869142262 + - 4.723534798152836 + - 6.449939731962692 + - 5.44078238384364 + - 1.4562333937437495 + - 4.9867701662543595 + - 4.48571119286239 + - !!python/tuple + - 1.3371710522468927 + - 5.1105775262121576 + - 6.729323900747725 + - 2.021249643654274 + - 4.634035339012896 + - 4.9173981160412525 + - 2.877661936785934 + - 4.653532293760473 + - 6.4262709607040245 + - 5.392527957923359 + - 1.4289567384724644 + - 4.915059155046497 + - 4.399707956817999 + - !!python/tuple + - 1.2235935760115604 + - 5.0393505512243 + - 6.672835544349084 + - 1.9469798584039864 + - 4.547017019245835 + - 4.83503360812912 + - 2.7931220242365535 + - 4.566314075313294 + - 6.396722198461714 + - 5.33233728190841 + - 1.3986724141589202 + - 4.825668267327097 + - 4.29261535725053 + - !!python/tuple + - 1.1101026163289014 + - 4.95060256409739 + - 6.602323524872713 + - 1.8591313113736607 + - 4.438715825359593 + - 4.732450470611007 + - 2.6893924284811934 + - 4.457758148418539 + - 6.359845026470501 + - 5.25730360065167 + - 1.3664366692814915 + - 4.714335401706393 + - 4.159433745619423 + - !!python/tuple + - 1.0152775713871018 + - 4.840134354161153 + - 6.5143415301034135 + - 1.7576828735747447 + - 4.304122165486296 + - 4.604835809104418 + - 2.563032944470679 + - 4.322837953923733 + - 6.31384170085643 + - 5.163842802625872 + - 1.3341382844920098 + - 4.575841778946843 + - 3.9941137590049047 + - !!python/tuple + - 0.961732862246945 + - 4.702820673028328 + - 6.404619567015431 + - 1.6449467407980203 + - 4.137200635382728 + - 4.446345216261739 + - 2.4108051032556475 + - 4.1554944532274405 + - 6.256485649513767 + - 5.04755809856498 + - 1.3045154969130959 + - 4.403857231088886 + - 3.789464202393437 + - !!python/tuple + - 0.9516502113451804 + - 4.532473467872501 + - 6.267884043397052 + - 1.5275209038779312 + - 3.9308238750943034 + - 4.249984015324146 + - 2.2306739732324825 + - 3.948566235084991 + - 6.185027148711488 + - 4.9030971075530685 + - 1.2806993030088782 + - 4.190823755898162 + - 3.5372123678905094 + - !!python/tuple + - 0.9537867463415336 + - 4.321755505230119 + - 6.097652807982161 + - 1.4185012898621014 + - 3.6768822064921016 + - 4.007593002120663 + - 2.024012489435232 + - 3.693892337014924 + - 6.096084004634046 + - 4.7240228987626445 + - 1.2650465065706766 + - 3.9279721803472754 + - 3.2284808716408646 + - !!python/tuple + - 0.9525043194699072 + - 4.062248067729603 + - 5.844347255319234 + - 1.4276490093624798 + - 3.3668537467889457 + - 3.5970328342108933 + - 1.8001935334619885 + - 3.4675245252971005 + - 5.985519762940712 + - 4.502750855759531 + - 1.1450946866448846 + - 3.6409436985450956 + - 2.935891729163762 + - !!python/tuple + - 0.9538632878833152 + - 3.7449228490809316 + - 5.533940135935775 + - 1.322298349658774 + - 2.99356757594523 + - 3.2261814750709803 + - 1.5848921700252976 + - 3.1164739385980966 + - 5.848317767393285 + - 4.230673087753361 + - 1.1691498823025286 + - 3.2900810767758024 + - 2.555060780161761 + - !!python/tuple + - 0.951638984474819 + - 3.361647359226288 + - 5.150151870253971 + - 1.2922278381742138 + - 2.55617521709313 + - 2.786104544490797 + - 1.3989723802646126 + - 2.713339440640354 + - 5.6556236134491735 + - 3.898760767631875 + - 0.9430198623064898 + - 2.9112823870353064 + - 2.2138756176451464 + - !!python/tuple + - 0.9568958427997893 + - 2.9094065073589066 + - 4.678304055944308 + - 1.296713983418778 + - 2.074209362795977 + - 2.2871784332531235 + - 1.3428948569268595 + - 2.260777105136176 + - 5.417921931170849 + - 3.499366795052902 + - 1.274296028015346 + - 2.4777908247421614 + - 1.8668494489774121 + - !!python/tuple + - 0.8524242938782796 + - 2.556555450793237 + - 4.079471982911376 + - 1.268731155045649 + - 1.8189556218525103 + - 1.8627304619489733 + - 1.2887787187519084 + - 1.8119166356580978 + - 4.976127944577077 + - 3.0311285809884763 + - 0.6948967512435805 + - 2.0236116783950266 + - 1.5949882588531739 + - !!python/tuple + - 1.6699029772893037 + - 2.043131544865128 + - 3.1999075258963345 + - 1.2650101204507367 + - 1.6190612998060212 + - 1.6603189432668826 + - 1.3502444068290709 + - 1.6978327755653506 + - 3.734513947266821 + - 2.0883083732109804 + - 1.1988530430220807 + - 1.7652943847660367 + - 1.5813178929184624 + - !!python/tuple + - 1.1662202752333657 + - 2.0052166586254283 + - 3.094221348831727 + - 1.2662571112221594 + - 1.567847495909867 + - 1.7034964817941352 + - 1.270232955088953 + - 1.6475518376657052 + - 3.577719750024641 + - 2.029366527445558 + - 1.0601609115214043 + - 1.7175991619862268 + - 1.5645389399650313 + - !!python/tuple + - 0.8379372527583089 + - 1.9651388594780572 + - 2.9675419569136503 + - 1.266831703919649 + - 1.5240936466874677 + - 1.7429434599317448 + - 1.2272391407515586 + - 1.601898406529887 + - 3.386864945828777 + - 1.9664999628759523 + - 1.0419577040219323 + - 1.6724354348895925 + - 1.550464193629637 + - !!python/tuple + - 1.1165468017026547 + - 1.9252892577564613 + - 2.901151807532848 + - 1.0988056969393831 + - 1.5914758278401107 + - 1.7138107129304627 + - 1.1901780191406885 + - 1.566129439946393 + - 3.157349386495519 + - 1.8802827211202893 + - 1.0551086434427823 + - 1.6345353738098434 + - 1.536197507658457 + - !!python/tuple + - 1.3002355523536688 + - 1.7924489222432245 + - 2.301972377520809 + - 1.2039369796933048 + - 1.4862788913977323 + - 1.7264037245454746 + - 1.2174261666444581 + - 1.527939332862636 + - 2.3086406564571846 + - 1.733095668505108 + - 1.0495230983079364 + - 1.5861476989899044 + - 1.5236315107012586 + - !!python/tuple + - 0.8927524661667241 + - 1.739107677578038 + - 2.296157256881491 + - 1.1421885439851265 + - 1.4792272146327692 + - 1.6504605662557443 + - 1.2431028174872125 + - 1.5302357330884744 + - 2.2904953563839654 + - 1.7235949137556512 + - 1.0494588402950837 + - 1.5877931789566708 + - 1.5240428065077425 + - !!python/tuple + - 1.046591182903314 + - 1.6918168800584872 + - 2.2898454101369143 + - 1.1416145223125924 + - 1.4747389604317502 + - 1.5871185346264414 + - 1.2476139799431536 + - 1.5318215946027194 + - 2.2707982128367554 + - 1.715399439051155 + - 1.0494896963710578 + - 1.5890266185736788 + - 1.5243244553566024 + - !!python/tuple + - 0.9818356044409902 + - 1.6773347095162323 + - 2.2681927201263568 + - 1.1415524190493571 + - 1.472016738390279 + - 1.5791922824687261 + - 1.2444314421893565 + - 1.5330829491182298 + - 2.123949261082043 + - 1.7033481885097217 + - 1.0494767409273427 + - 1.5902597826042646 + - 1.524541302812451 + - !!python/tuple + - 0.9310257604089518 + - 1.6593433724474371 + - 2.2669077955289487 + - 1.1417768172592426 + - 1.4720167081385973 + - 1.5556244303624933 + - 1.2469355170464334 + - 1.5330838270788762 + - 2.133043092065544 + - 1.7032316386528048 + - 1.0494766469458563 + - 1.5902629162897821 + - 1.5245414172218454 + - !!python/tuple + - 0.9426284451298206 + - 1.644592142418744 + - 2.2588791543850752 + - 1.141777800200178 + - 1.4720166780832742 + - 1.538174933028376 + - 1.2474512320031512 + - 1.5330849263285449 + - 2.1119274109604746 + - 1.702988302962013 + - 1.0494766730318805 + - 1.5902676592784597 + - 1.524541556184904 + - !!python/tuple + - 0.9724715166921121 + - 1.6339190304910793 + - 2.258879151159081 + - 1.1415090443568117 + - 1.4720166780832742 + - 1.5326892618302126 + - 1.2461682148591042 + - 1.5330849263285449 + - 2.162156298759217 + - 1.702988302962013 + - 1.0494766730318814 + - 1.5902676592784597 + - 1.524541556184904 + - !!python/tuple + - 0.9502309397008396 + - 1.6322041779562666 + - 2.258879151101956 + - 1.1416825180931613 + - 1.4720166780832742 + - 1.5302530813271829 + - 1.2468499034766478 + - 1.5330849263285449 + - 2.164000649317394 + - 1.702988302962013 + - 1.0494766730318819 + - 1.5902676592784597 + - 1.524541556184904 + - !!python/tuple + - 0.9544800677317042 + - 1.6305646108352394 + - 2.2588791510368944 + - 1.1417501129090935 + - 1.4720166780832742 + - 1.5280760031687817 + - 1.2472514987256251 + - 1.5330849263285449 + - 2.1660728293942033 + - 1.702988302962013 + - 1.0494766730318825 + - 1.5902676592784597 + - 1.524541556184904 + - !!python/tuple + - 0.9519205335513851 + - 1.6291193516152473 + - 2.2588791509645985 + - 1.14176193582812 + - 1.4720166780832742 + - 1.5263288188196074 + - 1.2474221662364386 + - 1.5330849263285449 + - 2.1683363524369113 + - 1.702988302962013 + - 1.0494766730318816 + - 1.5902676592784597 + - 1.524541556184904 + - !!python/tuple + - 0.9546318303319351 + - 1.6279804130802373 + - 2.2588791508867736 + - 1.1417608277373619 + - 1.4720166780832742 + - 1.5251258614240284 + - 1.2474596152966446 + - 1.5330849263285449 + - 2.170721006793589 + - 1.702988302962013 + - 1.0494766730318827 + - 1.5902676592784597 + - 1.524541556184904 + - !!python/tuple + - 0.9546318303319351 + - 1.6279804130802373 + - 2.2588791508867736 + - 1.1417608277373619 + - 1.4720166780832742 + - 1.5251258614240284 + - 1.2474596152966446 + - 1.5330849263285449 + - 2.170721006793589 + - 1.702988302962013 + - 1.0494766730318827 + - 1.5902676592784597 + - 1.524541556184904 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.998361970997151 + - 7.901837975833243 + - 7.667975247356404 + - 6.970472540307174 + - 8.015625 + - 7.689842447595692 + - 7.044559181882405 + - 7.48704450958787 + - 7.46667911301654 + - 7.733060238917999 + - 7.431493439980441 + - 7.51669339868151 + - 6.979995452758604 + - !!python/tuple + - 5.7523053320040916 + - 7.779623720780971 + - 7.2546723393178265 + - 5.6897587539237655 + - 8.035080178991446 + - 7.303752803958827 + - 5.855915412910359 + - 6.848618091457695 + - 6.802917757345155 + - 7.400757220468263 + - 6.7239628077530895 + - 6.915152524709171 + - 5.711115155940332 + - !!python/tuple + - 4.2372125176030835 + - 7.264845171919455 + - 6.732409663190246 + - 4.191269296681745 + - 8.059281529213285 + - 6.466951839098713 + - 4.675154348486587 + - 6.040117521898298 + - 6.183629126530803 + - 7.008788697231519 + - 5.854152449558174 + - 6.196119009498867 + - 4.385620994866362 + - !!python/tuple + - 2.410891538625357 + - 6.570446051882203 + - 6.013950997135373 + - 2.4912205349747256 + - 8.089351803195111 + - 5.324175252698047 + - 3.4368563700744463 + - 4.9057902887738525 + - 5.4183947923692255 + - 6.572364947130556 + - 4.76992221885066 + - 5.299860460992256 + - 2.867495754575393 + - !!python/tuple + - 0.47189927103554274 + - 5.933316111298373 + - 4.938582567452421 + - 0.7279241100361635 + - 7.823396523331317 + - 3.9556507137926538 + - 2.1040497097718656 + - 3.5224052754452124 + - 4.321153394109494 + - 6.230198958053832 + - 3.2516609324283743 + - 4.202863850026331 + - 1.5851561837951733 + - !!python/tuple + - 2.8798613661752963 + - 5.698459927137091 + - 4.556340167664322 + - 1.4366255830392682 + - 7.754354205487421 + - 3.566289708286479 + - 1.9083253117787915 + - 3.29793524536106 + - 4.136888184088419 + - 6.156196448003569 + - 2.7804592512472723 + - 3.9287015659308895 + - 1.5610878769352834 + - !!python/tuple + - 2.1729349057912137 + - 5.514542100889252 + - 4.222474872478995 + - 1.1062633640024568 + - 7.619491685192766 + - 3.3113386416581676 + - 1.6288380097392474 + - 2.9362576090088712 + - 3.820572553806023 + - 5.973863134179717 + - 2.3945947918809507 + - 3.541016968833607 + - 1.3688409956732954 + - !!python/tuple + - 1.3884292308582924 + - 5.23860340786271 + - 3.860460000350242 + - 1.044569384937852 + - 7.451507458346954 + - 2.9689185435495835 + - 1.3559401026735984 + - 2.583410855850762 + - 3.427171312884729 + - 5.6049011133344555 + - 2.0589864802988007 + - 3.249879927320618 + - 1.1949696598987454 + - !!python/tuple + - 0.8389577013106235 + - 4.868824857355814 + - 3.421706949895344 + - 1.1303164048184031 + - 7.242508878162564 + - 2.388935839455611 + - 1.255552741736211 + - 2.1780631162335142 + - 3.2910198152158303 + - 5.089391421226443 + - 1.8099570667703107 + - 2.819243328061298 + - 1.006114012170534 + - !!python/tuple + - 1.704478061910383 + - 4.400015323747667 + - 2.9183078513836502 + - 0.9801598070696765 + - 6.982908198847094 + - 1.9851909880050889 + - 1.2313934693892157 + - 1.7748756434968627 + - 2.713550533410002 + - 4.529428611388374 + - 1.4900373682892543 + - 2.4363155606988776 + - 1.4441074817402122 + - !!python/tuple + - 2.066246698263922 + - 3.874653993623635 + - 2.2679609532114595 + - 1.1690469744590783 + - 6.592187968731194 + - 1.675207331630493 + - 1.1789243478859788 + - 1.4402462046295308 + - 2.145663239858636 + - 3.648615337430136 + - 1.5126560710732082 + - 2.02545293543951 + - 1.453104197702089 + - !!python/tuple + - 1.750851971669674 + - 3.7951574192654207 + - 2.2149723513599864 + - 1.076245267535353 + - 6.525751873400589 + - 1.6745380936867242 + - 1.1396034851161199 + - 1.4456749753038043 + - 2.0510081634801938 + - 3.4842335757712326 + - 1.541658034278907 + - 1.9733791468214894 + - 1.2657463643577798 + - !!python/tuple + - 1.403705707273756 + - 3.697230403521708 + - 2.1106478703826292 + - 1.0501508531841661 + - 6.442947866566008 + - 1.653714510749739 + - 1.1497436365058291 + - 1.4479079362221807 + - 2.008938103706989 + - 3.2824710068850735 + - 1.5749956347538638 + - 1.8799901703548414 + - 1.104904356482612 + - !!python/tuple + - 1.0908849683343882 + - 3.5464035706055586 + - 2.047091991940593 + - 1.0279557258285705 + - 6.339831632202637 + - 1.6586222619623445 + - 1.1548963689048288 + - 1.453133734304022 + - 1.8806055204034797 + - 3.048104636363926 + - 1.5762394678409775 + - 1.8237002057345648 + - 1.0703094561080655 + - !!python/tuple + - 0.9964804988334681 + - 3.344202213428184 + - 1.978971062504814 + - 1.212068500750013 + - 6.149383936509828 + - 1.5479753940276766 + - 1.1899917122954344 + - 1.4569262787371597 + - 1.805839474359286 + - 2.9317522203312034 + - 1.349823122717163 + - 1.7675262858948513 + - 1.1833680346492632 + - !!python/tuple + - 0.9993238820149861 + - 3.172925529317856 + - 1.910531096629521 + - 0.9344809449774469 + - 5.9906197416244 + - 1.6073255017898676 + - 1.1462185451742735 + - 1.3986562333470078 + - 1.720842024211806 + - 2.5864244089058133 + - 1.543026496389396 + - 1.6356032944865302 + - 0.9591502609264402 + - !!python/tuple + - 0.7962082385649172 + - 2.6404102532753577 + - 1.782771816258168 + - 1.1362118812106843 + - 4.879438982375679 + - 1.766767385090631 + - 1.012826437682277 + - 1.249027054016765 + - 1.681925304338714 + - 2.011558953373508 + - 1.7020695263287313 + - 1.3520281620686787 + - 0.9880958334447598 + - !!python/tuple + - 0.9716704702844806 + - 2.3850061335790804 + - 1.6483625047081703 + - 0.8451493589059345 + - 4.177702046953604 + - 1.6920406909764474 + - 1.0443127485959045 + - 1.3904564202159388 + - 1.6170453506160523 + - 1.8937210097789943 + - 1.5968067695962762 + - 1.429229238805626 + - 1.3679670273274915 + - !!python/tuple + - 0.9969952340329404 + - 2.421607471239607 + - 1.7505280251809 + - 0.9891496910932581 + - 3.043452842467992 + - 1.6303299597386731 + - 1.2635584443287542 + - 1.3396288086175612 + - 1.7390596698646328 + - 1.8252896816299446 + - 1.5864999235649395 + - 1.3854920085535714 + - 1.7076451260765484 + - !!python/tuple + - 0.9979187651659893 + - 2.3754425422064536 + - 1.7518348337131335 + - 0.9897718252295796 + - 3.035129756774525 + - 1.6396758389256467 + - 1.1522321946055925 + - 1.377380896041384 + - 1.62729315251807 + - 1.8411775704018327 + - 1.4707813921376525 + - 1.4124595124122246 + - 1.4480895936167313 + - !!python/tuple + - 1.0221864375342518 + - 2.3070182343857892 + - 1.7144154736394048 + - 1.0495630583265012 + - 3.025105371000113 + - 1.5215616847154003 + - 1.1563233419030414 + - 1.3699171708976132 + - 1.6014878360107376 + - 1.8627791727145036 + - 1.392684478812147 + - 1.4253549484240358 + - 1.2225585549659626 + - !!python/tuple + - 0.9844491415442309 + - 2.2487741562044987 + - 1.6791447151801249 + - 1.0091735279796317 + - 3.013151391945085 + - 1.5369623153427154 + - 1.1495880811862662 + - 1.3651949012988596 + - 1.4783833620320137 + - 1.8843395612380645 + - 1.3377030374219598 + - 1.4342513377533197 + - 1.0943833058268313 + - !!python/tuple + - 0.9962830284923097 + - 1.969120072078681 + - 1.728053427194073 + - 1.018160919654952 + - 2.8780611353770227 + - 1.5802708060622486 + - 1.1501048703672934 + - 1.364543609448603 + - 1.420359392845135 + - 1.9417919102872174 + - 1.3090269643910855 + - 1.422754703866341 + - 1.1079762393272152 + - !!python/tuple + - 0.963582511177641 + - 2.1211211592003196 + - 1.7051689814400133 + - 1.0195791186975571 + - 2.835601001803777 + - 1.4531513649247303 + - 1.1211846248906856 + - 1.4191573305709768 + - 1.5189793056511471 + - 1.9342874994054875 + - 1.2898652378845925 + - 1.4781659004204024 + - 1.1232560633536446 + - !!python/tuple + - 1.036365622543449 + - 2.0826924962608397 + - 1.6647803767319413 + - 1.0232698467103802 + - 2.8357523051913582 + - 1.5140282666887244 + - 1.1603793610291506 + - 1.3769191007638848 + - 1.408606547130935 + - 1.9403238436028014 + - 1.3066112545624444 + - 1.4547436671972853 + - 1.0865625964166605 + - !!python/tuple + - 1.036365622543449 + - 2.0826924962608397 + - 1.6647803767319413 + - 1.0232698467103802 + - 2.8357523051913582 + - 1.5140282666887244 + - 1.1603793610291506 + - 1.3769191007638848 + - 1.408606547130935 + - 1.9403238436028014 + - 1.3066112545624444 + - 1.4547436671972853 + - 1.0865625964166605 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.200620622031554 + - 7.941388556400439 + - 7.748327529293151 + - 6.770947251898291 + - 7.959967152810169 + - 7.795903705257412 + - 7.627431990131208 + - 7.416750124272365 + - 7.650617665113993 + - 7.637397183273622 + - 7.32663584265273 + - 7.195292803106395 + - 7.26631099311705 + - !!python/tuple + - 6.2059736475281415 + - 7.868413616709854 + - 7.435026330765912 + - 5.242365421479285 + - 7.910123043811395 + - 7.541819377262342 + - 7.1522705344752975 + - 6.729974356109672 + - 7.215714354050151 + - 7.113898765823068 + - 6.488685712713559 + - 6.24106893869573 + - 6.353343051813337 + - !!python/tuple + - 4.973098855205437 + - 7.777656634737763 + - 7.0102539654268465 + - 3.390708949405313 + - 7.848129670316575 + - 7.219812906084912 + - 6.498467313545978 + - 6.074087575428992 + - 6.424109765653007 + - 6.463613259961971 + - 5.224544108600232 + - 5.266926954721827 + - 5.396871407650122 + - !!python/tuple + - 3.494947360545539 + - 7.431940558306197 + - 6.294996247304002 + - 1.3470665932100454 + - 7.5401069265156 + - 6.700381536446482 + - 5.843543349021958 + - 5.1474932999974925 + - 5.591078715369449 + - 5.7922360285984045 + - 3.6769263753283274 + - 4.2917754063022056 + - 4.500414626735798 + - !!python/tuple + - 2.1328304314183515 + - 6.5220850226767855 + - 5.266797103527428 + - 0.5101196965303799 + - 7.158383138190966 + - 5.784912543149624 + - 5.150531886647017 + - 4.122819930675307 + - 4.786676813922759 + - 4.914440696566805 + - 1.7530819675028564 + - 3.245080602564315 + - 3.6802184915338447 + - !!python/tuple + - 1.7901698545070435 + - 6.175753554945024 + - 5.048983707798 + - 2.981029205226665 + - 6.931948162896056 + - 5.5034406948842856 + - 4.915372390184007 + - 3.8220872145316673 + - 4.625664706781355 + - 4.586651257924324 + - 1.4846123878777444 + - 2.9584031116431944 + - 3.339436220768535 + - !!python/tuple + - 1.3832545033175885 + - 5.914535487211644 + - 4.779894463264552 + - 2.000689561488639 + - 6.650200202741886 + - 5.2239682973003205 + - 4.614613294341033 + - 3.4480723974905714 + - 4.310928106989556 + - 4.1830440131218065 + - 1.2919268909136363 + - 2.5779184619960622 + - 2.873586773103206 + - !!python/tuple + - 1.2043340791340884 + - 5.499276351964359 + - 4.449209212953901 + - 1.0982418136553203 + - 6.300266168149855 + - 4.829785886086003 + - 4.245628084473589 + - 3.009775332651754 + - 3.926349130484591 + - 3.6905542013568216 + - 1.2146315437122475 + - 2.199375187425871 + - 2.400200259109432 + - !!python/tuple + - 1.2819328993223227 + - 4.940346428468257 + - 3.9175339206632964 + - 1.0197646175044015 + - 5.866882332234775 + - 4.277681394023464 + - 3.797704793540261 + - 2.7253461767372276 + - 3.4629024705555054 + - 3.100364684003128 + - 0.967462646785935 + - 1.8981755511180571 + - 2.0318911815105696 + - !!python/tuple + - 1.2208399752266488 + - 4.257123989041396 + - 3.281538207302318 + - 1.180492371944878 + - 5.332690587203652 + - 3.610558643589929 + - 3.2648678857657085 + - 2.4171613983982394 + - 2.9197744237401833 + - 2.4224195470174186 + - 1.4213527160421673 + - 1.6599808618451666 + - 1.70555128742906 + - !!python/tuple + - 1.260966137046286 + - 3.527324062330617 + - 2.5388441438849774 + - 0.984487057566142 + - 4.708573045115115 + - 2.909847646142268 + - 2.7713207998477385 + - 2.094452873488751 + - 2.317320605595303 + - 2.0229581931581087 + - 2.2391877222532814 + - 1.5480477822928047 + - 1.6792865763838227 + - !!python/tuple + - 1.2539793696785153 + - 3.4234802771633768 + - 2.4533310151873016 + - 1.0323565745039138 + - 4.582017802898583 + - 2.8025285971541734 + - 2.6770698985882797 + - 2.114167978979625 + - 2.1782153181989865 + - 1.9848363571984153 + - 1.8790027541556613 + - 1.556253522195083 + - 1.712132395495868 + - !!python/tuple + - 1.2488441261554704 + - 3.296209852289991 + - 2.3520734920917823 + - 1.044339083821298 + - 4.425117056049441 + - 2.6730995791550094 + - 2.5640330019852247 + - 2.1366452111407854 + - 2.0169004078336896 + - 1.9420361203339729 + - 1.4716724173763485 + - 1.5642635983261186 + - 1.746290335210149 + - !!python/tuple + - 1.2117387520953744 + - 3.188368133188518 + - 2.2966884166903885 + - 0.9461591266993159 + - 4.231191152365063 + - 2.5743018244786056 + - 2.4217235734919593 + - 2.0169201820709044 + - 1.9095651838365177 + - 1.8890253773799441 + - 1.1826611052806095 + - 1.5161419894861743 + - 1.664530756120334 + - !!python/tuple + - 1.2190221719356529 + - 3.0239364831357767 + - 2.1572225664041995 + - 1.063641332256231 + - 3.992614521817208 + - 2.422113174307332 + - 2.307617773420048 + - 1.8657805483241308 + - 1.8397792033650617 + - 1.8017334471934106 + - 1.1462175399208239 + - 1.501519878204623 + - 1.5806209866029444 + - !!python/tuple + - 1.1668242895427978 + - 2.902742215140025 + - 2.1048120698301074 + - 0.8219583231907099 + - 3.701268543385005 + - 2.3372272860629892 + - 2.14793527970104 + - 1.6996636315801856 + - 1.7737461064084248 + - 1.7618063419770906 + - 1.1712387456987718 + - 1.359458182793176 + - 1.3719904725301644 + - !!python/tuple + - 1.0252324836358513 + - 2.507154979567999 + - 1.8273853925760732 + - 1.3000720403393482 + - 2.7649900746051523 + - 1.9493976658645435 + - 1.7491696152186829 + - 1.396925374046921 + - 1.6794761746206701 + - 1.6387600389351213 + - 1.3643357620143441 + - 1.1322344095305312 + - 1.2785889680722808 + - !!python/tuple + - 1.120697407438888 + - 2.3083282571903996 + - 1.8787935653763164 + - 1.1910079657793688 + - 2.375166667041107 + - 1.9146568669743196 + - 1.6014596183606464 + - 1.7640565053776869 + - 1.4779706661514087 + - 1.6406050017285247 + - 1.7118717412399809 + - 1.4296047885236627 + - 1.4424428719410098 + - !!python/tuple + - 1.212835376269002 + - 2.2158505126913037 + - 1.7157047948772213 + - 0.8551191767077688 + - 2.378483886722584 + - 1.8580807411684825 + - 1.6834089889495505 + - 1.6179908059767207 + - 1.5587663330394907 + - 1.6444523179316868 + - 1.1278841254591359 + - 1.3539870780309098 + - 1.5068696716002308 + - !!python/tuple + - 1.1228836776554012 + - 2.099347583599707 + - 1.7925987919473532 + - 0.8963374250902755 + - 2.163308472413442 + - 1.8580309506582076 + - 1.6202300620236432 + - 1.6038870528999822 + - 1.5236851906833306 + - 1.6468124485648652 + - 1.2293255347102665 + - 1.3549146606650093 + - 1.4519942825907517 + - !!python/tuple + - 1.1555735148619428 + - 2.2079941588081966 + - 1.8020576187309167 + - 1.0318674966822554 + - 2.3599874632534945 + - 1.9335797925131497 + - 1.6710228227819373 + - 1.4292662954865434 + - 1.5906854522710614 + - 1.63877923616692 + - 1.164186547282819 + - 1.2638695830041589 + - 1.2924293349453297 + - !!python/tuple + - 1.1708879491790132 + - 2.165846767097791 + - 1.7733977993574486 + - 0.9539968353800494 + - 2.2970059467362343 + - 1.910000781121462 + - 1.6742734109258517 + - 1.5076149424988186 + - 1.5622541403703187 + - 1.6566623500088584 + - 1.078792793552172 + - 1.3530726558115722 + - 1.365951442981335 + - !!python/tuple + - 1.1708879491790132 + - 2.165846767097791 + - 1.7733977993574486 + - 0.9539968353800494 + - 2.2970059467362343 + - 1.910000781121462 + - 1.6742734109258517 + - 1.5076149424988186 + - 1.5622541403703187 + - 1.6566623500088584 + - 1.078792793552172 + - 1.3530726558115722 + - 1.365951442981335 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.231435114449695 + - 7.686654753612191 + - 7.716745270873191 + - 7.179801376925542 + - 8.015625 + - 7.631360578148912 + - 7.592269728266807 + - 7.42744435287966 + - 7.30202592926761 + - 7.680017082130336 + - 7.396575411721151 + - 7.574957838222754 + - 7.572457871202519 + - !!python/tuple + - 6.275101231620435 + - 7.296598028652551 + - 7.233914766795788 + - 6.251144500960792 + - 8.035080178991446 + - 7.125412891353411 + - 7.1665944629914184 + - 6.714877046250807 + - 6.490888326083351 + - 7.235383852325321 + - 6.657907171389607 + - 7.045908485156296 + - 7.027044911186254 + - !!python/tuple + - 5.0894851649508865 + - 6.811930064121121 + - 6.633996231772721 + - 5.0999981162621575 + - 8.059281529213285 + - 6.496923700956391 + - 6.637816136609185 + - 5.83049802910564 + - 5.581245703661679 + - 6.595380631698721 + - 5.746724492249866 + - 6.388839616526118 + - 6.345337478687623 + - !!python/tuple + - 3.633266202362041 + - 6.211501093713127 + - 5.8911536986949455 + - 3.7967409200981654 + - 7.84073893982694 + - 5.719114894020173 + - 5.983143299821929 + - 4.75079046847881 + - 4.57998428055013 + - 5.730228502567866 + - 4.651228233077688 + - 5.685106554763348 + - 5.543927676759525 + - !!python/tuple + - 1.9772007494791577 + - 5.356086905516247 + - 4.936871177554748 + - 2.2970465755985074 + - 7.569685254177191 + - 4.520564949675258 + - 4.951467723416863 + - 3.5909133189290663 + - 3.579167276983978 + - 4.808883537804677 + - 3.405647879977505 + - 4.744362193266637 + - 4.6518556019538755 + - !!python/tuple + - 0.6244574683659465 + - 3.8151501562551537 + - 3.9135498494180108 + - 1.0068381818740324 + - 7.033912449911761 + - 2.8556280877556777 + - 3.860256656288348 + - 2.5538447927278183 + - 2.4180538102594786 + - 3.922959991682146 + - 1.8336752739135067 + - 3.62879782545284 + - 3.7608136092210662 + - !!python/tuple + - 4.197369536614804 + - 3.1824552867916363 + - 3.1889583031675186 + - 1.7546052875600324 + - 6.561369311005529 + - 2.1793582613732325 + - 3.2727399732399376 + - 1.8388683103188221 + - 2.1018679070196953 + - 3.2330378676905127 + - 1.2850550530770417 + - 2.9640939361349687 + - 3.112165968174252 + - !!python/tuple + - 2.421418688910688 + - 2.620359875321846 + - 2.5124262935370965 + - 0.9117340027109211 + - 5.874369733075607 + - 1.726881155524375 + - 2.44309298671255 + - 1.634096158413905 + - 1.4645461298505498 + - 2.3551051799020484 + - 1.327692532820833 + - 2.310787028107913 + - 2.464562998485529 + - !!python/tuple + - 0.5487485563925423 + - 2.0608777524607165 + - 1.9614339891295922 + - 3.0365376747573416 + - 4.636234626987091 + - 1.3558367311211432 + - 1.967465224495982 + - 1.3071699262382368 + - 2.035596635913996 + - 1.6869675440295082 + - 1.3116852443598284 + - 1.6991143374820095 + - 1.7960363198185978 + - !!python/tuple + - 2.5754208872099196 + - 1.9716951300503243 + - 1.9333894036740433 + - 1.4222216883980616 + - 3.907206187664981 + - 1.6888375635091333 + - 1.7163929093196446 + - 1.2012796359765328 + - 1.5643845398476304 + - 1.5615599108037816 + - 1.4025071739790578 + - 1.6008822081817267 + - 1.6168734211079492 + - !!python/tuple + - 1.3382649693475075 + - 1.8315761364650958 + - 1.6361927020902132 + - 1.1222117643017608 + - 3.440176777938352 + - 1.4059492815087915 + - 1.529079968424373 + - 1.9135971408232886 + - 1.1196834741611714 + - 1.7481649519301294 + - 1.1566160098805363 + - 1.7267690872949786 + - 1.7591893290270468 + - !!python/tuple + - 1.1495853554782995 + - 1.7903324153896694 + - 1.8450286243551275 + - 1.376873375793263 + - 2.60830978954409 + - 1.4708805973891135 + - 1.7053259884463787 + - 1.3096836530462177 + - 1.3632554511519206 + - 1.7622748823849457 + - 1.2406972575757045 + - 1.5992434158609778 + - 1.6413482381666364 + - !!python/tuple + - 1.1294396709497416 + - 1.7434989491491826 + - 1.7324383190350128 + - 1.183769516445321 + - 2.6318320785875344 + - 1.5447383069856224 + - 1.5980569422561612 + - 1.4725039697070956 + - 1.2272850623677822 + - 1.7464128105301238 + - 1.2638432281288157 + - 1.627638453916345 + - 1.66336443385986 + - !!python/tuple + - 1.1086397744573213 + - 1.7492301329379245 + - 1.714903683553619 + - 1.1768563664850191 + - 2.5864394182553077 + - 1.5791472376527564 + - 1.7119639018982489 + - 1.2865958795076362 + - 1.3563851139941738 + - 1.6360213461153448 + - 1.3021996200844348 + - 1.6301924041576983 + - 1.6155803651643377 + - !!python/tuple + - 1.1086397744573213 + - 1.7492301329379245 + - 1.714903683553619 + - 1.1768563664850191 + - 2.5864394182553077 + - 1.5791472376527564 + - 1.7119639018982489 + - 1.2865958795076362 + - 1.3563851139941738 + - 1.6360213461153448 + - 1.3021996200844348 + - 1.6301924041576983 + - 1.6155803651643377 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.17571979765881 + - 8.015625 + - 7.613978178001887 + - 7.216507083079631 + - 7.789379292475336 + - 7.564845840873169 + - 7.18106394642158 + - 7.7620472462191294 + - 7.5833061069435335 + - 7.585231828662844 + - 7.486720811064854 + - 7.666833358118666 + - 7.450141721114201 + - !!python/tuple + - 6.163077233448914 + - 7.963383837932232 + - 7.133481537095735 + - 6.33487286700975 + - 7.5271739174086925 + - 6.873417988530857 + - 6.204126790131254 + - 7.465822156334217 + - 7.064644151957631 + - 7.085864929826576 + - 6.824144806233578 + - 7.252109421670173 + - 6.851279471145422 + - !!python/tuple + - 4.908065152717931 + - 7.898402505202083 + - 6.484259894116761 + - 5.255821172724675 + - 7.2012425775992925 + - 5.9129891751623305 + - 5.254547743469631 + - 7.032136382804192 + - 6.484883539091522 + - 6.465618894116149 + - 6.104639253756942 + - 6.624564980127814 + - 6.030500588329248 + - !!python/tuple + - 3.426813677301416 + - 7.6946669497048 + - 5.680803410273257 + - 4.039463687210833 + - 6.708954221678044 + - 4.683827601554326 + - 4.180136924647635 + - 6.335357822999044 + - 5.9085600908261116 + - 5.75051444817052 + - 5.355474484062899 + - 5.786576449882841 + - 4.980886791562149 + - !!python/tuple + - 1.7850280899545679 + - 7.168821038626479 + - 4.775872369211509 + - 2.671700711584429 + - 6.100756338074787 + - 3.0921679188610574 + - 2.888419709780655 + - 5.513134124283471 + - 5.112739225933511 + - 4.90970481002864 + - 4.2558746747006335 + - 4.91115628084205 + - 3.979620010861038 + - !!python/tuple + - 0.6628135130059227 + - 6.361217285708797 + - 3.8038821416403175 + - 1.202508442309661 + - 5.354701430204206 + - 1.2826579148871864 + - 1.4649110160028351 + - 4.5097249604317895 + - 4.147294193157514 + - 3.8930082142764277 + - 2.94346117386928 + - 3.8522683719669097 + - 2.7977209875716005 + - !!python/tuple + - 5.47862703290873 + - 5.679293089831368 + - 2.9090048602551155 + - 1.399886421238027 + - 4.482782812043717 + - 1.2079599187472512 + - 1.9283929618465332 + - 3.126037767965874 + - 3.3516479865638886 + - 3.147613973146496 + - 2.020292756854131 + - 2.6453724261660154 + - 1.5114771203365236 + - !!python/tuple + - 2.658848355996831 + - 4.846996036818295 + - 1.8276306202555885 + - 1.0401261923013472 + - 3.4496722240441517 + - 1.2286375289090554 + - 0.6916525537799592 + - 2.412632336452187 + - 2.2460232593002507 + - 2.1776003996857876 + - 0.8299782682387631 + - 1.9644342207352063 + - 1.6070131171458726 + - !!python/tuple + - 1.8908117412490149 + - 4.543810626520893 + - 1.825955079188541 + - 1.4269766627140785 + - 3.1539789879314633 + - 1.1910860645205066 + - 2.9936694234030443 + - 2.0555416304247345 + - 2.185979294752788 + - 1.9711108216882662 + - 2.076389831736512 + - 1.7835678049364252 + - 1.3565350338781539 + - !!python/tuple + - 1.2525601487653446 + - 4.09722808373008 + - 1.9278188123416566 + - 1.1791763383720721 + - 2.887091210094154 + - 1.400724433604877 + - 1.6667092536162662 + - 2.278579102583869 + - 1.6878793974689772 + - 1.6642979622865475 + - 1.259592006808398 + - 2.235559648130767 + - 1.7678232371110132 + - !!python/tuple + - 1.209781096296829 + - 3.5971289714597834 + - 1.847585983578981 + - 1.3699333779734784 + - 2.5914596553882108 + - 1.0338302273816875 + - 1.3759792052849167 + - 1.8630075762690859 + - 2.045987511588534 + - 1.607600626324819 + - 1.7341905283844703 + - 1.7113231974683218 + - 1.15044518535181 + - !!python/tuple + - 1.19429523937655 + - 2.6617992255401663 + - 1.6741317988921376 + - 1.3438993117649873 + - 2.13292846427532 + - 1.1349258592980511 + - 1.0746418765321009 + - 2.030350459166036 + - 1.6483111802857995 + - 1.5156486537158091 + - 1.827253987826875 + - 2.115980493064882 + - 1.6875820501763172 + - !!python/tuple + - 1.106775529007432 + - 2.544633318112301 + - 1.7073076343015123 + - 1.4085805958847004 + - 1.9893769766229794 + - 1.1867584140009646 + - 1.2842136658690777 + - 1.8678437290721122 + - 1.9009375754057531 + - 1.6080928460834851 + - 1.3379932946373372 + - 1.7884921887083007 + - 2.0160246227021013 + - !!python/tuple + - 1.106775529007432 + - 2.544633318112301 + - 1.7073076343015123 + - 1.4085805958847004 + - 1.9893769766229794 + - 1.1867584140009646 + - 1.2842136658690777 + - 1.8678437290721122 + - 1.9009375754057531 + - 1.6080928460834851 + - 1.3379932946373372 + - 1.7884921887083007 + - 2.0160246227021013 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.941816913289837 + - 7.804536210802645 + - 7.7298857720031116 + - 6.91271852847976 + - 7.93663289056192 + - 7.41002403468038 + - 7.661624667321303 + - 7.257396765469176 + - 7.59635831397608 + - 7.3164969220900815 + - 7.325362086106457 + - 7.71320567362397 + - 7.430043517770655 + - !!python/tuple + - 5.625496430454817 + - 7.561197041426554 + - 7.393631842037832 + - 5.56024390468254 + - 7.857737128891351 + - 6.67578799184408 + - 7.240418791703346 + - 6.3333442340517125 + - 7.09393698526537 + - 6.465937724732755 + - 6.485827859381625 + - 7.356192199552471 + - 6.720709317312679 + - !!python/tuple + - 3.997045295698956 + - 7.2587007631765195 + - 6.975747072786673 + - 3.887492205808875 + - 7.759618047073793 + - 5.7645967291302505 + - 6.717098513885826 + - 5.187566777132839 + - 6.469881627919736 + - 5.410923019541 + - 5.44443610086574 + - 6.912536463386419 + - 5.840331376828841 + - !!python/tuple + - 2.022014729699036 + - 6.883487089764548 + - 6.457799983163503 + - 1.8626162261740875 + - 7.637774230837637 + - 4.640557281386819 + - 6.068979522678075 + - 3.7792298625378624 + - 5.614719021360888 + - 4.226951769067503 + - 4.097284352884053 + - 6.362748472128634 + - 4.796270850850626 + - !!python/tuple + - 0.5612677236145711 + - 6.223920160404847 + - 5.652496423693372 + - 0.4960136501179975 + - 7.274823381045419 + - 3.4341295935520337 + - 5.583032892413885 + - 2.698295170737417 + - 5.0784887896121536 + - 3.391257539260231 + - 2.83859876572284 + - 5.662195368504573 + - 3.969834891372347 + - !!python/tuple + - 1.9995383174719839 + - 5.99419049962815 + - 5.438852408109441 + - 2.6199345143372135 + - 7.114347177335634 + - 3.0153357431013443 + - 5.438045107411396 + - 2.4108736845195886 + - 4.883918400932014 + - 3.137246406351682 + - 2.4553906109295354 + - 5.45595499211227 + - 3.7321415358030112 + - !!python/tuple + - 1.3405842165919142 + - 5.847584786409907 + - 5.237305306700417 + - 1.9115549402429295 + - 6.8635838894660965 + - 2.618841996208613 + - 5.211022305542523 + - 2.04974940144193 + - 4.570159892549924 + - 2.831452759870948 + - 2.0248724103133986 + - 5.176122822257436 + - 3.416291753039728 + - !!python/tuple + - 0.8232077431856261 + - 5.665740682015891 + - 4.988023354751334 + - 1.1540635539140132 + - 6.551599838909045 + - 2.159049048889219 + - 4.93025437910179 + - 1.664307255936158 + - 4.1839158432801735 + - 2.472341586613921 + - 1.5647541048327975 + - 4.830063093087142 + - 3.035368344131901 + - !!python/tuple + - 1.3255005540192086 + - 5.44081975643673 + - 4.592117927115294 + - 0.9711419919441057 + - 6.080874052969652 + - 1.6655795630617551 + - 4.594332058821271 + - 1.3825294529816392 + - 3.8049175917551645 + - 2.0720362564874812 + - 1.171694402771375 + - 4.441841227346311 + - 2.627477778113697 + - !!python/tuple + - 0.5369997997142006 + - 5.163776192492343 + - 4.1085315103013516 + - 1.2260618201649902 + - 5.498320779602817 + - 1.2767841666326707 + - 4.184172806734431 + - 1.283680113475722 + - 3.349837193433841 + - 1.6799659973522842 + - 1.18034089359045 + - 3.9687829409169 + - 2.1743556434188545 + - !!python/tuple + - 1.807790657836862 + - 4.631920854643882 + - 3.450783206538874 + - 1.4106098168332721 + - 4.872604706923845 + - 1.2905927505768093 + - 3.6249419278071215 + - 1.3126023390968333 + - 2.7601071791329055 + - 1.4656323850779007 + - 1.1671709195482187 + - 3.3009675098521822 + - 1.7150466917255123 + - !!python/tuple + - 0.6080710342245947 + - 4.374922517962876 + - 3.0243162860189425 + - 0.5942129266221298 + - 4.417772590859207 + - 1.276646526914906 + - 3.259668086996567 + - 1.2453436189312959 + - 2.402201094859849 + - 1.4370202133479413 + - 1.214116062775953 + - 2.845326235686473 + - 1.517187895397167 + - !!python/tuple + - 1.1611388200622743 + - 3.9358968581085003 + - 2.5945243684121877 + - 1.3659033286112268 + - 3.965384838974035 + - 1.2819929660803697 + - 2.9000452107345778 + - 1.2676142715851688 + - 2.089330585034397 + - 1.469618341940564 + - 1.2115649605587557 + - 2.419187955546365 + - 1.498653859144809 + - !!python/tuple + - 0.8476607188194593 + - 3.5680834517281355 + - 2.334071105054945 + - 0.7545810323448929 + - 3.7911634658934212 + - 1.232797578324271 + - 2.6613261848946754 + - 1.2662183538586038 + - 1.9252737958459243 + - 1.4435762970307127 + - 1.1831097290268406 + - 2.153543026936235 + - 1.471951015641583 + - !!python/tuple + - 1.5771624243050535 + - 2.885617793915957 + - 1.9449309621661992 + - 0.8263754593272599 + - 2.9722341913697203 + - 1.305846078532608 + - 2.0449390700384638 + - 1.248614338812242 + - 1.5934906808222715 + - 1.3372923656637938 + - 1.1573446151920321 + - 1.8863870069334219 + - 1.4345491280698874 + - !!python/tuple + - 1.4869964912063476 + - 2.8734047199509267 + - 1.932507880785519 + - 0.88533716576895 + - 2.9427043092434397 + - 1.3027766056038959 + - 2.035443874563986 + - 1.2510258754755932 + - 1.6036864395953798 + - 1.3395137567266557 + - 1.1675153030410241 + - 1.8726480512208454 + - 1.4342289200289011 + - !!python/tuple + - 1.3827166169591396 + - 2.8583100190507484 + - 1.9175510912640163 + - 0.9274057017176041 + - 2.9061750216453035 + - 1.299403928052956 + - 2.0239500654405482 + - 1.2536258177670812 + - 1.615593670152626 + - 1.3419795998331308 + - 1.1780558793383051 + - 1.8561687028021925 + - 1.43386506667439 + - !!python/tuple + - 1.2672118574061053 + - 2.8397106270966908 + - 1.8997345302324569 + - 0.9562685361755121 + - 2.8611260544640604 + - 1.295830345590222 + - 2.0101593543839846 + - 1.2563205161515705 + - 1.6292801512258472 + - 1.3446327766668271 + - 1.1884907454907372 + - 1.8366360980971312 + - 1.4334619982889643 + - !!python/tuple + - 1.1489651033727917 + - 2.8168830796283713 + - 1.8974660687527716 + - 0.972624533343752 + - 2.8057999444655275 + - 1.29319032544699 + - 1.991779256822354 + - 1.2589741002967714 + - 1.6253624205614887 + - 1.347375379832238 + - 1.1982320133187077 + - 1.8138472963566612 + - 1.4330298773039516 + - !!python/tuple + - 1.0719662306259792 + - 2.7406068718278234 + - 1.8948477175076717 + - 0.981119061032801 + - 2.7809130448277206 + - 1.2780680928161787 + - 1.970307708792707 + - 1.2614168274120499 + - 1.6210610508526666 + - 1.3500665706747408 + - 1.206652006809107 + - 1.7878175529972078 + - 1.432585914571997 + - !!python/tuple + - 1.021892284263437 + - 2.648174988494302 + - 1.8918894050647934 + - 0.9842721678218026 + - 2.750739823546062 + - 1.264995572597742 + - 1.9308778988194308 + - 1.2680388665610425 + - 1.6051989390167158 + - 1.3525319539408833 + - 1.1863639792655638 + - 1.7977502292932241 + - 1.4351458726140485 + - !!python/tuple + - 0.9624000913608209 + - 2.6131065624109526 + - 1.8886378270029038 + - 0.9848111634630001 + - 2.6478015947056073 + - 1.2748851243286905 + - 1.9055982193634344 + - 1.2672537473640924 + - 1.6033775889923974 + - 1.3545905537653318 + - 1.2066906592147832 + - 1.7598780969808427 + - 1.4337175184027224 + - !!python/tuple + - 1.0181926219184734 + - 2.4771997637714542 + - 1.839636021157675 + - 0.9886716732974129 + - 2.6091858907612053 + - 1.2540513457564408 + - 1.8603140857170466 + - 1.2739040060908597 + - 1.6312251727952747 + - 1.356101255293852 + - 1.1749624570298265 + - 1.7818060542880363 + - 1.437225381573006 + - !!python/tuple + - 0.9308134498983982 + - 2.4386958091014215 + - 1.8474330476919325 + - 0.9821809840670785 + - 2.4601280641260157 + - 1.2782677766430977 + - 1.8374015021177459 + - 1.268106421926203 + - 1.6185509504804971 + - 1.357018790380193 + - 1.2178076206623754 + - 1.7270806596117652 + - 1.4338703977461325 + - !!python/tuple + - 1.0925081799562462 + - 2.2480379574364697 + - 1.8546904216226054 + - 0.9876338079178766 + - 2.4223833879134875 + - 1.2461611906904606 + - 1.7797502504992408 + - 1.277660337586117 + - 1.5810063164099952 + - 1.3574306273331138 + - 1.1557510369017923 + - 1.773722399180309 + - 1.4392477005601214 + - !!python/tuple + - 1.0375194231890885 + - 2.07611681364838 + - 1.768527455014413 + - 0.9770056790943996 + - 2.2397562542927236 + - 1.2983469649956314 + - 1.740093914242945 + - 1.2495342311742947 + - 1.6128736456731247 + - 1.3181489313276582 + - 1.2461651875737756 + - 1.7152770630059944 + - 1.391709941924178 + - !!python/tuple + - 0.9781988589222087 + - 2.0846838931908462 + - 1.7824479643204636 + - 0.9608221021115689 + - 2.2704434093165102 + - 1.293277221766415 + - 1.7303694525985944 + - 1.2237826799765628 + - 1.5812039186584765 + - 1.2916009333681016 + - 1.2059148428676014 + - 1.7324472602032 + - 1.380252522858438 + - !!python/tuple + - 0.9781988589222087 + - 2.0846838931908462 + - 1.7824479643204636 + - 0.9608221021115689 + - 2.2704434093165102 + - 1.293277221766415 + - 1.7303694525985944 + - 1.2237826799765628 + - 1.5812039186584765 + - 1.2916009333681016 + - 1.2059148428676014 + - 1.7324472602032 + - 1.380252522858438 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.870897902852202 + - 7.76418666306823 + - 7.543179120461389 + - 7.515477247147915 + - 7.933373749583111 + - 7.383611223200355 + - 7.288750166337292 + - 7.681964573387778 + - 7.530518588469748 + - 7.760219778018959 + - 7.441709802433043 + - 7.497228019289945 + - 7.332157239213633 + - !!python/tuple + - 5.46646690001231 + - 7.470624412117447 + - 6.974590309852317 + - 6.912423344411136 + - 7.850420369732252 + - 6.616522329387378 + - 6.403685646720808 + - 7.286070964488643 + - 6.946178043288602 + - 7.4617201255797525 + - 6.74688752018853 + - 6.871470451288263 + - 6.501073797195242 + - !!python/tuple + - 3.730119358529824 + - 7.105748670503366 + - 6.268514147097478 + - 6.1636433552826295 + - 7.74725607374709 + - 5.664691946522906 + - 5.306046793370478 + - 6.794159459931923 + - 6.220583104770463 + - 7.090712984392976 + - 5.884470224761591 + - 6.094566989393369 + - 5.470125453611428 + - !!python/tuple + - 1.6346975700548079 + - 6.653340296360805 + - 5.400520580158722 + - 5.238203155325856 + - 7.476008068057938 + - 4.6557163430781285 + - 3.9557419704694974 + - 6.184790453416718 + - 5.3235836590093735 + - 6.630721010859814 + - 4.819946805292081 + - 5.134655761594924 + - 4.200500767679872 + - !!python/tuple + - 0.29977481759974145 + - 6.101674045472532 + - 4.549788611539566 + - 4.400678840357031 + - 7.2071642537211025 + - 3.628643650883572 + - 2.832284983984275 + - 5.419313765335453 + - 4.5415333962326665 + - 6.176305752580483 + - 3.8326791854376334 + - 4.180064355876681 + - 2.9478684334098735 + - !!python/tuple + - 1.6513622655146207 + - 6.0643368757533205 + - 4.493208608062757 + - 4.345163667395113 + - 7.188871946886081 + - 3.562065119684394 + - 2.7769381633817694 + - 5.361740305098931 + - 4.489562780574378 + - 6.147007842480672 + - 3.768194392724121 + - 4.1128275941644 + - 2.8696264996285312 + - !!python/tuple + - 1.5354325119723726 + - 6.017721073815194 + - 4.422689003348189 + - 4.275992483971421 + - 7.166023021490493 + - 3.479322721362592 + - 2.708596631583815 + - 5.2898968196228875 + - 4.424788921960409 + - 6.110427479005076 + - 3.6879826495418753 + - 4.029098150792228 + - 2.7728912399579064 + - !!python/tuple + - 1.4025715879357623 + - 5.959540011103242 + - 4.334873399349482 + - 4.189890776451756 + - 7.137487783720498 + - 3.376690192248769 + - 2.6245593894718304 + - 5.200291955801507 + - 4.344128448764027 + - 6.064768675682585 + - 3.588367411617955 + - 3.92495698779425 + - 2.653780052128652 + - !!python/tuple + - 1.2585591179252442 + - 5.886955715791858 + - 4.225652384984548 + - 4.0828589541273965 + - 7.101859635905666 + - 3.249735894711905 + - 2.5218376846264787 + - 5.08861149143798 + - 4.243804686820429 + - 6.007801284566478 + - 3.4649333092484635 + - 3.7956488253369045 + - 2.508020246807098 + - !!python/tuple + - 1.118844818350349 + - 5.79645426230252 + - 4.090039212539972 + - 3.950060643951135 + - 7.057389150252393 + - 3.093332298669178 + - 2.3935366886344944 + - 4.961871434623642 + - 4.1140883985847445 + - 5.927275606040836 + - 3.291635379620328 + - 3.6531130742060545 + - 2.343500462536705 + - !!python/tuple + - 1.0128165907884064 + - 5.683699390466031 + - 3.9220691323066474 + - 3.785742680236659 + - 7.001903712280616 + - 2.9018490138141804 + - 2.2402502135159423 + - 4.804264774067642 + - 3.953399815900544 + - 5.8269289482594875 + - 3.078699909666177 + - 3.477205265340367 + - 2.1473144941019178 + - !!python/tuple + - 0.970398645889658 + - 5.543366413535765 + - 3.714784240357377 + - 3.5832556124195976 + - 6.932710480448531 + - 2.669789489160434 + - 2.0647599001894887 + - 4.603222500200248 + - 3.7630828784039467 + - 5.702001889313913 + - 2.8518725470698643 + - 3.2402412987519646 + - 1.9009662148623003 + - !!python/tuple + - 0.9731124294863658 + - 5.368965965239341 + - 3.460450828292921 + - 3.3353363068392525 + - 6.846480819338083 + - 2.3935017298897283 + - 1.8636585871242823 + - 4.361170558947892 + - 3.5193899090711045 + - 5.546678075032865 + - 2.5387823321252627 + - 2.97838539186699 + - 1.6549975263613397 + - !!python/tuple + - 0.9717728651193266 + - 5.152684210213523 + - 3.1513688685422716 + - 3.066067697268268 + - 6.715950858373039 + - 2.0755491260334153 + - 1.7005532864742015 + - 4.039530036072497 + - 3.2420129732229173 + - 5.353920669282115 + - 2.1857078420143243 + - 2.6563166082006107 + - 1.4146785342712564 + - !!python/tuple + - 0.9730118223232715 + - 4.8853054304703765 + - 2.85997555231699 + - 2.729813701767738 + - 6.553625739690712 + - 1.8456915011318404 + - 1.5411967485835034 + - 3.6461853779984863 + - 2.9554813663572714 + - 5.0063559939760145 + - 1.8234593122084424 + - 2.2827239603241427 + - 1.2331844858076635 + - !!python/tuple + - 0.9711917432942041 + - 4.556376556300721 + - 2.5226888295912238 + - 2.3442712330092705 + - 6.352109212409574 + - 1.635142408286358 + - 1.4360086328203447 + - 3.1719237630151826 + - 2.6214944327768803 + - 4.578165273919148 + - 1.4849350184608223 + - 1.8784644749907253 + - 1.203693806842711 + - !!python/tuple + - 0.9751082861124712 + - 4.155009207269964 + - 2.3160692218934145 + - 1.9969537250515612 + - 5.86679604757184 + - 1.6816628600186188 + - 1.4516861845671822 + - 2.7162417386226516 + - 2.4386043747206694 + - 3.909830118605867 + - 1.299587791197863 + - 1.6183493596829646 + - 1.339397203855486 + - !!python/tuple + - 0.9634032398306079 + - 3.672353580751009 + - 1.762475843209696 + - 1.7449682718681139 + - 5.268494216373803 + - 1.2551241910030446 + - 1.2008781496806862 + - 2.362094070472312 + - 2.238129939517718 + - 3.42270167008832 + - 1.2477270749319667 + - 1.5682933847217615 + - 1.3109798350878004 + - !!python/tuple + - 1.0115430228364721 + - 3.108649072137757 + - 1.8419504039710168 + - 1.559835863468595 + - 4.537641919892131 + - 1.9644580928474875 + - 1.3625593751267457 + - 2.026072692572197 + - 1.952600772012806 + - 2.5181189615313087 + - 1.3473818859787123 + - 1.566178130213175 + - 1.2959434866256079 + - !!python/tuple + - 1.6261178246585763 + - 2.1855059449776957 + - 1.5018216173831893 + - 1.4981639278459489 + - 3.3019856740897873 + - 1.624939974560606 + - 1.385083656707688 + - 1.8927824594293325 + - 1.5163619480576191 + - 1.8970861268768378 + - 1.279243146768201 + - 1.8616420955949433 + - 1.4909276130608868 + - !!python/tuple + - 1.2145529231175152 + - 2.2245514759044624 + - 1.4882562905573984 + - 1.4702019363404066 + - 3.2270364900194615 + - 1.557901922551593 + - 1.3217540419981015 + - 1.821644242492948 + - 1.5062304140291791 + - 1.9085829314214546 + - 1.3112680746103744 + - 1.7397147937127238 + - 1.3638728999875853 + - !!python/tuple + - 0.9157850584055893 + - 2.1929596826768254 + - 1.4764960082053855 + - 1.446198910680861 + - 3.188947949474186 + - 1.4710297987422247 + - 1.275325771419596 + - 1.7469462725309102 + - 1.4973230396296233 + - 1.9208179827165144 + - 1.3324295586177646 + - 1.614097263518289 + - 1.2611962143370463 + - !!python/tuple + - 0.9539034493628405 + - 2.158161268149785 + - 1.4675723064249055 + - 1.4285828991136251 + - 3.1431833303701247 + - 1.4025204772990376 + - 1.185692937436512 + - 1.7421564796142535 + - 1.4660659488420402 + - 1.9333229021092535 + - 1.3239080693223966 + - 1.5064448678681508 + - 1.2173718407355847 + - !!python/tuple + - 0.9081598257166775 + - 2.1214230139332177 + - 1.4620130563030544 + - 1.4184272775643652 + - 3.0888618900017497 + - 1.3631333320677697 + - 1.252054440052737 + - 1.6535671775211476 + - 1.4766300278496631 + - 1.9454592116109466 + - 1.3459204546275525 + - 1.4204142865754488 + - 1.1941147330295827 + - !!python/tuple + - 0.9865003711198397 + - 2.0988764773569195 + - 1.4588645537347897 + - 1.420832573342699 + - 2.6408054587980265 + - 1.3541744918475938 + - 1.2649720182912838 + - 1.663195538176176 + - 1.4769304308705897 + - 1.9221001837012033 + - 1.3141900736670566 + - 1.4135674539718914 + - 1.2132020493454865 + - !!python/tuple + - 0.8927634831444357 + - 2.079325967609675 + - 1.458864554450025 + - 1.4169962167243197 + - 2.6310875769816695 + - 1.3522225302050874 + - 1.183423966298939 + - 1.6854705769646103 + - 1.4555951215922218 + - 1.934315913432276 + - 1.3182633243283535 + - 1.3992156141356507 + - 1.2099580868066824 + - !!python/tuple + - 0.9185778944880192 + - 2.0289255940656896 + - 1.4588645551227386 + - 1.41687994411676 + - 2.5442262542343554 + - 1.3541047188310575 + - 1.1746719502296288 + - 1.703576635483919 + - 1.4396298304333983 + - 1.9479770214394982 + - 1.3128587205302318 + - 1.4033793837013648 + - 1.2120455532181944 + - !!python/tuple + - 0.9170865999316322 + - 1.9884351402451954 + - 1.4588645551227386 + - 1.414372403171813 + - 2.53738777410161 + - 1.3510576267968932 + - 1.1704291773914592 + - 1.7008994073857098 + - 1.442463662929595 + - 1.9449061636118865 + - 1.3197430715572644 + - 1.3913401888163914 + - 1.2095582930433622 + - !!python/tuple + - 0.9245201860786724 + - 1.9872109472708386 + - 1.4588645551227386 + - 1.4143724031722273 + - 2.5360605059479475 + - 1.3510576253403328 + - 1.1712098660107981 + - 1.7008971411809424 + - 1.442464030494624 + - 1.94615910443927 + - 1.319741686780427 + - 1.3913385925111428 + - 1.209557548311664 + - !!python/tuple + - 0.9246239151258834 + - 1.9902967647457608 + - 1.4588645551227386 + - 1.414150570223452 + - 2.535698404308683 + - 1.3511187279374912 + - 1.1714538438743864 + - 1.7051908132644524 + - 1.4412084842365835 + - 1.9457679586377945 + - 1.3196198534698542 + - 1.39179353968626 + - 1.2095266207755433 + - !!python/tuple + - 0.928570897095176 + - 1.9903986372951108 + - 1.4588645551227386 + - 1.4141505770208613 + - 2.535614229937233 + - 1.3511187283833106 + - 1.171451482584502 + - 1.7051914748635537 + - 1.4412085239030479 + - 1.9457587485077172 + - 1.3196198433373956 + - 1.391793534339433 + - 1.2095266223749823 + - !!python/tuple + - 0.9386119222557892 + - 1.986893129260951 + - 1.4588645551227386 + - 1.4152576065037334 + - 2.526668326601211 + - 1.3506386658445684 + - 1.1731002829601276 + - 1.7027981706750779 + - 1.440802248202271 + - 1.9505219797674358 + - 1.3205369200067816 + - 1.3900967813627267 + - 1.2095488000851857 + - !!python/tuple + - 0.9386119222557892 + - 1.986893129260951 + - 1.4588645551227386 + - 1.4152576065037334 + - 2.526668326601211 + - 1.3506386658445684 + - 1.1731002829601276 + - 1.7027981706750779 + - 1.440802248202271 + - 1.9505219797674358 + - 1.3205369200067816 + - 1.3900967813627267 + - 1.2095488000851857 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.0301721932634695 + - 7.93238043402661 + - 7.725112575329946 + - 7.005450883567205 + - 8.015625 + - 7.749042454271527 + - 6.974394429170041 + - 7.736652934809551 + - 7.586550625536025 + - 7.814576707284144 + - 7.451471855201089 + - 7.4880250999132265 + - 7.313377845870212 + - !!python/tuple + - 5.823647888698709 + - 7.848190384065613 + - 7.382918009761293 + - 5.768203758993515 + - 8.035080178991446 + - 7.4366310703290335 + - 5.85756132999365 + - 7.196032975121002 + - 7.10742090092238 + - 7.591898093711655 + - 6.760126892500238 + - 6.836080174744372 + - 6.5059942363708405 + - !!python/tuple + - 4.329949108344541 + - 7.743488442339374 + - 6.957658137544587 + - 4.236767864616373 + - 8.059281529213285 + - 7.0483490366884585 + - 4.474936926300089 + - 6.524327679749365 + - 6.5122922957346105 + - 7.31507279256318 + - 5.901995808431618 + - 6.026717663649805 + - 5.50446533030939 + - !!python/tuple + - 2.6301715919102855 + - 7.475975928009808 + - 6.299478931126444 + - 2.6118765786554174 + - 7.845531398480724 + - 6.44934518882423 + - 2.9638481762578857 + - 5.732595589571468 + - 5.9050398833992 + - 7.006840179103823 + - 4.7087262050751395 + - 5.125834005628522 + - 4.408727600039576 + - !!python/tuple + - 0.8441519334785961 + - 7.039063547611892 + - 5.487844080015133 + - 1.049579641441489 + - 6.963382175095971 + - 5.671303192687553 + - 1.601187612084326 + - 4.782723294440198 + - 5.158423072517941 + - 6.674889434410043 + - 3.0502964449595877 + - 4.394785787309806 + - 3.4760639109536045 + - !!python/tuple + - 3.572374985093794 + - 5.543294464216534 + - 4.277494869122134 + - 2.2883039901382967 + - 6.010998197691216 + - 4.0935328318408795 + - 1.3630055894154967 + - 4.324929541848865 + - 4.40855588065676 + - 6.266287251144339 + - 0.9149224994745597 + - 3.773965790981501 + - 2.69995677183447 + - !!python/tuple + - 1.0235885106072282 + - 5.145885968350379 + - 3.334100403224351 + - 1.3704247659213111 + - 5.248000915937038 + - 3.252913598342314 + - 1.2100479565173041 + - 3.0596074798968314 + - 3.682845919679903 + - 5.8061524398041655 + - 2.871033607100554 + - 2.446322808568196 + - 1.3651766072503484 + - !!python/tuple + - 1.0537816357236331 + - 5.115855632306637 + - 3.315705128796905 + - 1.3563832675581793 + - 5.223363268800306 + - 3.2269174621316306 + - 1.2174022563728761 + - 3.0586142780417758 + - 3.6588167265835976 + - 5.795707027782017 + - 2.820816742787611 + - 2.452294007027465 + - 1.3881972224859669 + - !!python/tuple + - 1.0868922023626661 + - 5.078355907931994 + - 3.29279701546207 + - 1.3397832755450017 + - 5.192595701869955 + - 3.1945536151036085 + - 1.2258884750282384 + - 3.0573787360726703 + - 3.63229407951936 + - 5.782650864514771 + - 2.761078929774444 + - 2.459688189541069 + - 1.4008695856855058 + - !!python/tuple + - 1.1224788773966567 + - 5.031542065789833 + - 3.2642982411768715 + - 1.3204884782455328 + - 5.154183019177193 + - 3.15430879624591 + - 1.2354966647844188 + - 3.055843587083004 + - 3.5992583327300522 + - 5.766345111354823 + - 2.68699689654589 + - 2.468823730801765 + - 1.4157065367574435 + - !!python/tuple + - 1.1497740207504972 + - 4.979933104257881 + - 3.228891862399543 + - 1.298571071464786 + - 5.1002187387929965 + - 3.106847272314535 + - 1.2461231892070328 + - 3.0539390809638554 + - 3.558151251261817 + - 5.745985652016022 + - 2.5953785336758046 + - 2.480079279738223 + - 1.4328266775668776 + - !!python/tuple + - 1.1776458190733106 + - 4.915559970604697 + - 3.1849810834481613 + - 1.274449633140387 + - 5.032897738828514 + - 3.0480394875434063 + - 1.257539787613485 + - 3.0515808636403734 + - 3.507068365513643 + - 5.720572147304572 + - 2.482525116676165 + - 2.493899437752143 + - 1.4522384033572084 + - !!python/tuple + - 1.205065372981269 + - 4.835316488911339 + - 3.130651080837591 + - 1.2483865191052745 + - 4.961993896658305 + - 2.9753762114516324 + - 1.2693694833719946 + - 3.0373884336896855 + - 3.443700822627528 + - 5.688861827733948 + - 2.3450179784155747 + - 2.4980033979745326 + - 1.4734655152385363 + - !!python/tuple + - 1.2308358573429046 + - 4.735375212785524 + - 3.0636432959827142 + - 1.2226170725314303 + - 4.873661972417522 + - 2.885942111758047 + - 1.2833516290495348 + - 3.0150185731663903 + - 3.3863580791245704 + - 5.649313480197434 + - 2.184034909271747 + - 2.4731128362568775 + - 1.495758009979663 + - !!python/tuple + - 1.2295688929370345 + - 4.643406360780826 + - 2.981362064836576 + - 1.1942836939898545 + - 4.76373386389087 + - 2.7888987337091518 + - 1.296422142306648 + - 2.9318040507418988 + - 3.315623354763776 + - 5.600020304636892 + - 2.005483892721723 + - 2.439198392377012 + - 1.512558670367352 + - !!python/tuple + - 1.2285426617984074 + - 4.529176039269924 + - 2.8809525591962926 + - 1.1720228905109877 + - 4.627128777781213 + - 2.671076591740241 + - 1.3077708646031507 + - 2.8303800423880436 + - 3.2287452293801024 + - 5.538630770977429 + - 1.7982660043987642 + - 2.3986805410451995 + - 1.529515015598161 + - !!python/tuple + - 1.2278258912347415 + - 4.387601054696252 + - 2.759525867114395 + - 1.1579624693594424 + - 4.457724256631049 + - 2.529734305935959 + - 1.316692549022617 + - 2.707945519123087 + - 3.1226876691637315 + - 5.462257779718074 + - 1.5702722977670565 + - 2.3509650130339974 + - 1.5457759830559907 + - !!python/tuple + - 1.176328153821258 + - 4.233657107164772 + - 2.614677860716549 + - 1.1422971752120095 + - 4.24828372410474 + - 2.4003172564233166 + - 1.3227906540202943 + - 2.5564636057156354 + - 3.0039730615200555 + - 5.3631997581481565 + - 1.3971556619506724 + - 2.2542681791518513 + - 1.499221841178804 + - !!python/tuple + - 1.0535815553794572 + - 4.120809144691667 + - 2.4455800598207778 + - 1.1261949764522912 + - 3.990550453469203 + - 2.2649871131812134 + - 1.1249894983091535 + - 2.5166077305791985 + - 2.8621923496350044 + - 5.182312546515715 + - 1.26995209291215 + - 2.1555135448569738 + - 1.4492109045890065 + - !!python/tuple + - 1.2106644793995491 + - 3.887215600326975 + - 2.255134976877074 + - 1.1443850261704662 + - 3.675772149624655 + - 2.1014375670691305 + - 1.3478480370060535 + - 2.3014420352992677 + - 2.6962172170937033 + - 5.031253246063918 + - 1.213950085825922 + - 2.0387238164210886 + - 1.4341013990213234 + - !!python/tuple + - 0.9683590860928304 + - 3.723875421616805 + - 2.184839160745074 + - 1.0633074631563837 + - 3.3524116135457867 + - 2.0355752330186645 + - 0.8687361539129974 + - 2.2839031833153025 + - 2.508112351312782 + - 4.677710130312065 + - 1.2693238757251795 + - 1.939181638006421 + - 1.3176736873825547 + - !!python/tuple + - 1.2418202312653177 + - 3.068698881334758 + - 1.9284806082277197 + - 1.0824678893507182 + - 2.638358584407862 + - 1.8444884392390943 + - 1.9511146717008236 + - 2.097360091314729 + - 1.9405798638316074 + - 3.710856497202214 + - 1.2848022040719582 + - 1.8570016928799045 + - 1.3117936366660563 + - !!python/tuple + - 1.12526384028295 + - 3.022281157983661 + - 1.9174082772856575 + - 1.0544935964159512 + - 2.647995854760461 + - 1.8354701820729513 + - 1.5454105894533146 + - 2.1063218544648596 + - 1.9049069979367446 + - 3.5957404126304793 + - 1.304150310206621 + - 1.7892151422021916 + - 1.287578472015681 + - !!python/tuple + - 1.0699964836749616 + - 2.9663626500368623 + - 1.9055610871888384 + - 1.0999750375472888 + - 2.5913149168431584 + - 1.826050461155245 + - 1.1381361416811278 + - 2.1207654162692124 + - 1.8667407022295874 + - 3.454868780301236 + - 1.2737364104796065 + - 1.7841893049074575 + - 1.310277500038065 + - !!python/tuple + - 1.0678654789883328 + - 2.8997976725526318 + - 1.8397601195903337 + - 1.0645814958247752 + - 2.5293666698606065 + - 1.7917870280199442 + - 1.1804484009610638 + - 1.994591572149482 + - 1.8658797009698682 + - 3.3423024973290416 + - 1.284154324026872 + - 1.6881613585697064 + - 1.3005985177311539 + - !!python/tuple + - 1.0686912477732697 + - 2.8218687999336716 + - 1.8446933443098807 + - 1.1320277748012093 + - 2.3529723990701017 + - 1.7917182847634552 + - 1.094296904304555 + - 1.872888281124049 + - 1.8650683496272682 + - 3.1893178345417987 + - 1.255085669485642 + - 1.7070346573900443 + - 1.3240493993378888 + - !!python/tuple + - 1.0680301143257798 + - 2.732781514500114 + - 1.7649714537490881 + - 1.0190500409536243 + - 2.295800699835203 + - 1.7526856490750902 + - 1.2392763290179436 + - 1.7541762837060029 + - 1.8643666110683745 + - 3.0315982503015877 + - 1.2944321144691695 + - 1.5932890394975068 + - 1.2938585805976064 + - !!python/tuple + - 1.1772461843926525 + - 2.4870977479548464 + - 1.7392280073783948 + - 1.1822507386646448 + - 2.341839081407463 + - 1.7594285654942265 + - 1.2444006772151477 + - 1.5697050165572282 + - 1.855465565630792 + - 2.2084887757465106 + - 1.323023343999501 + - 1.590431318931452 + - 1.5078030342928814 + - !!python/tuple + - 1.0262397530026257 + - 2.470078081524302 + - 1.7449165724390212 + - 1.103412681982514 + - 2.2940543660726886 + - 1.7656302754050242 + - 1.2747074048242015 + - 1.6467945801695556 + - 1.725206589121958 + - 2.157976572854897 + - 1.2318068908652504 + - 1.60164608388014 + - 1.3894512187234809 + - !!python/tuple + - 1.0408979156270963 + - 2.462523086296619 + - 1.7441948904075784 + - 1.174082340857714 + - 2.2708201617313533 + - 1.7624489894458182 + - 1.191609916640834 + - 1.7421379424753778 + - 1.7102962623814937 + - 2.126038893784689 + - 1.2317600179127608 + - 1.573106654605195 + - 1.3720077870542406 + - !!python/tuple + - 1.0305445927940902 + - 2.461206587430774 + - 1.7462488732552166 + - 1.0326491806617584 + - 2.3640561873278076 + - 1.7714218451557147 + - 1.247584957606764 + - 1.6233289844582823 + - 1.7363597031643838 + - 2.1586610380104276 + - 1.298638083814874 + - 1.4852490151934066 + - 1.3026924462966576 + - !!python/tuple + - 1.0305445927940902 + - 2.461206587430774 + - 1.7462488732552166 + - 1.0326491806617584 + - 2.3640561873278076 + - 1.7714218451557147 + - 1.247584957606764 + - 1.6233289844582823 + - 1.7363597031643838 + - 2.1586610380104276 + - 1.298638083814874 + - 1.4852490151934066 + - 1.3026924462966576 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 960.0 + - 990.0 + - 1020.0 + - 1050.0 + - 1080.0 + - 1110.0 + - 1140.0 + - 1170.0 + - 1200.0 + - 1230.0 + - 1260.0 + - 1290.0 + - 1320.0 + - 1350.0 + - 1380.0 + - 1410.0 + - 1440.0 + - 1470.0 + - 1500.0 + - 1530.0 + - 1560.0 + - 1590.0 + - 1620.0 + - 1680.0 + - 1920.0 + - 1950.0 + - 1980.0 + - 2010.0 + - 2040.0 + - 2070.0 + - 2160.0 + - 2190.0 + - 2730.0 + - 2790.0 + - 3510.0 + - 5460.0 + - 6210.0 + - 7320.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.74290515462544 + - 47.45237639405341 + - 42.26035813158599 + - 36.71048421501159 + - 31.928856459488024 + - 31.895328754327192 + - 31.85448741119961 + - 31.804862825802648 + - 31.744686471908995 + - 31.67180447176584 + - 31.583560045534185 + - 31.47687982669238 + - 31.347599200136006 + - 31.19057513597263 + - 30.99934714094278 + - 30.769393966336743 + - 30.479904963305362 + - 30.126580035784215 + - 29.697307521366366 + - 29.19210118126377 + - 28.59470738947023 + - 27.892271269147923 + - 27.089462829214444 + - 26.202846706214682 + - 25.171734846632457 + - 24.2074999361262 + - 23.093613840398596 + - 22.960732949256464 + - 22.20534682464633 + - 21.668339268024738 + - 21.21131880260852 + - 20.967845728621256 + - 20.464209913113102 + - 20.41562045638525 + - 19.51478425033428 + - 19.23258448865307 + - 19.071667697898942 + - 19.02664054134396 + - 19.022833247447554 + - 19.0085360762555 + - 18.996775248074346 + - 18.999387105768363 + - 18.999387105768363 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 270.0 + - 300.0 + - 360.0 + - 570.0 + - 600.0 + - 1230.0 + - 1500.0 + - 1980.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.07194777637888 + - 46.32026729423287 + - 40.57503487958934 + - 34.018858556086386 + - 27.956556811156087 + - 27.20644058549137 + - 22.724773752274288 + - 21.099990208633006 + - 19.960863929966305 + - 19.169466696794444 + - 18.68331070953991 + - 18.309811773728345 + - 18.22034780784874 + - 18.22034780784874 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 210.0 + - 660.0 + - 690.0 + - 720.0 + - 750.0 + - 780.0 + - 810.0 + - 840.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1050.0 + - 1470.0 + - 1500.0 + - 1530.0 + - 1560.0 + - 1980.0 + - 2010.0 + - 2040.0 + - 2520.0 + - 2550.0 + - 6300.0 + - 7020.0 + - 7050.0 + - 7080.0 + - 7110.0 + - 7140.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.45118815726307 + - 45.83720775172711 + - 40.2946675344002 + - 33.87392833582399 + - 31.450682202007183 + - 29.431711837680318 + - 29.168771780341668 + - 28.856034553544937 + - 28.49300103179187 + - 28.073499179733293 + - 27.58544275760009 + - 27.003129999223937 + - 26.305662563174188 + - 25.484332703979113 + - 24.602161556896604 + - 23.533804646833797 + - 22.54156545286501 + - 21.3597980401242 + - 20.724983853687448 + - 19.36000942319682 + - 19.10799799615526 + - 19.053936391922697 + - 18.845095091508945 + - 18.538408437709347 + - 18.49880528916911 + - 18.47074736303831 + - 18.460868332983875 + - 18.472844801512586 + - 18.469357971341026 + - 18.468217732949466 + - 18.472510452092948 + - 18.47202921037179 + - 18.47290567885053 + - 18.47271501737672 + - 18.47271501737672 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1230.0 + - 1500.0 + - 2460.0 + - 2490.0 + - 2520.0 + - 2550.0 + - 3030.0 + - 5790.0 + - 5820.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.02971632099352 + - 44.237519067910135 + - 37.68800424914575 + - 30.576187079894723 + - 26.16038880800539 + - 25.748250158907798 + - 24.32300283263698 + - 22.947322992817394 + - 22.023707199010342 + - 21.48478516753085 + - 21.044308997300856 + - 20.702899034366236 + - 20.385087407299977 + - 20.09607396973056 + - 19.75463819204078 + - 19.828631556804556 + - 19.19992801806071 + - 18.671104731956703 + - 18.229514696507955 + - 18.126015996881993 + - 18.091284908697702 + - 18.113909933579812 + - 18.060598788092854 + - 18.035939605853375 + - 18.072475927998244 + - 18.072475927998244 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 390.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1230.0 + - 1470.0 + - 1500.0 + - 2040.0 + - 4620.0 + - 4650.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 48.85818502828146 + - 44.6583839988286 + - 39.617306530359315 + - 34.29611961968402 + - 29.901835989945084 + - 28.20409619507546 + - 26.556130467950542 + - 25.179084881288368 + - 23.635846968218324 + - 21.892457029893833 + - 20.924380268489895 + - 20.39336646545886 + - 19.909707016745973 + - 19.634054914303345 + - 19.27397548118142 + - 19.252527948791766 + - 18.573572430957615 + - 18.368984490535922 + - 18.3142722824306 + - 18.233355008665907 + - 18.306749415174203 + - 18.254909542637296 + - 18.254909542637296 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 330.0 + - 360.0 + - 390.0 + - 600.0 + - 630.0 + - 1200.0 + - 2910.0 + - 8460.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.66221142659251 + - 46.34171422752597 + - 41.11506718041683 + - 35.046837162589576 + - 28.45352925973932 + - 23.57220309356454 + - 23.67161439293576 + - 20.393253117400562 + - 20.251742202354087 + - 19.10595751539815 + - 18.669916284097777 + - 18.20936265460579 + - 18.197924433156142 + - 18.103479815807887 + - 18.103479815807887 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 270.0 + - 300.0 + - 510.0 + - 540.0 + - 570.0 + - 780.0 + - 2730.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 48.5269640348791 + - 44.506819416988584 + - 39.64375430622489 + - 33.98942496735826 + - 27.79111494814064 + - 23.36875260065585 + - 23.331378985385403 + - 20.108958264034865 + - 19.584985628922237 + - 18.495914357260304 + - 18.31345481142039 + - 18.202233173086164 + - 17.944901098611467 + - 17.944901098611467 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 210.0 + - 420.0 + - 450.0 + - 480.0 + - 510.0 + - 540.0 + - 690.0 + - 720.0 + - 900.0 + - 930.0 + - 1440.0 + - 1470.0 + - 1500.0 + - 1530.0 + - 1560.0 + - 1590.0 + - 1620.0 + - 1650.0 + - 1680.0 + - 1710.0 + - 1740.0 + - 2430.0 + - 2460.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.23587911344768 + - 44.42751769604405 + - 38.73851833617827 + - 32.38126034666831 + - 29.661689980402265 + - 28.15663181465477 + - 26.398641342021683 + - 25.163547932073108 + - 24.12667265144751 + - 23.507823330571995 + - 21.924881052406718 + - 21.78844701370752 + - 20.065959208852107 + - 19.949179977911225 + - 19.057100622696822 + - 18.948935190874604 + - 18.85707890627266 + - 18.77899400855519 + - 18.7150748710416 + - 18.66670229372697 + - 18.61227285385895 + - 18.56945865319588 + - 18.499814403770095 + - 18.45651109669519 + - 18.37165618766656 + - 18.31038891962592 + - 18.338349781633195 + - 18.338349781633195 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 210.0 + - 630.0 + - 660.0 + - 690.0 + - 720.0 + - 750.0 + - 780.0 + - 810.0 + - 840.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1560.0 + - 1590.0 + - 1620.0 + - 1650.0 + - 1680.0 + - 2220.0 + - 2250.0 + - 2760.0 + - 3420.0 + - 4020.0 + - 4740.0 + - 5460.0 + - 6570.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 54.67952318262257 + - 49.72844295384127 + - 43.78463532629037 + - 36.992241727025565 + - 33.82313706453492 + - 31.96241392767808 + - 31.553590258787807 + - 31.063930561711004 + - 30.4876347760367 + - 29.8181320737578 + - 29.04751079191512 + - 28.15502325559472 + - 27.13681173292967 + - 26.084109807412723 + - 24.951839396900773 + - 23.82972343192668 + - 22.583917294045953 + - 21.644817512735987 + - 20.364296459879185 + - 19.50652439806046 + - 19.314758826341542 + - 19.307827115441928 + - 19.30303943134948 + - 19.308343929293923 + - 19.1712884967085 + - 19.200824769023193 + - 19.17483797722845 + - 19.167695287907573 + - 19.16545567169502 + - 19.165749934506902 + - 19.164668578376688 + - 19.162788975219147 + - 19.162788975219147 +- !!python/tuple + - !!python/tuple + - 0.0 + - 60.0 + - 90.0 + - 120.0 + - 150.0 + - 180.0 + - 210.0 + - 870.0 + - 900.0 + - 930.0 + - 960.0 + - 990.0 + - 1020.0 + - 1050.0 + - 1080.0 + - 1110.0 + - 1140.0 + - 1170.0 + - 1200.0 + - 1230.0 + - 1260.0 + - 1290.0 + - 1680.0 + - 1710.0 + - 1740.0 + - 1770.0 + - 1800.0 + - 1830.0 + - 2460.0 + - 4980.0 + - 7020.0 + - 7860.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 48.779758060549945 + - 43.92901678611646 + - 38.17248417897188 + - 32.19686016203408 + - 27.946427780526943 + - 26.52709209746216 + - 22.507635651115937 + - 22.432227419591207 + - 22.345696574506395 + - 22.242486975727648 + - 22.12403955050055 + - 21.981791212354757 + - 21.817668133602595 + - 21.623327507936846 + - 21.405303484541584 + - 21.165034439711125 + - 20.909954534161393 + - 20.635504006728766 + - 20.3885480480245 + - 20.060625695248337 + - 19.84468233120996 + - 18.981232272106634 + - 18.72605454746706 + - 18.60249547854496 + - 18.494853063272597 + - 18.400499248011883 + - 18.28547418576808 + - 17.908723811329875 + - 17.87022534357056 + - 18.635809000546395 + - 17.84797776195343 + - 17.84797776195343 +problem_name: SAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.096 + - 0.099 + - 0.102 + - 0.105 + - 0.108 + - 0.111 + - 0.114 + - 0.117 + - 0.12 + - 0.123 + - 0.126 + - 0.129 + - 0.132 + - 0.135 + - 0.138 + - 0.141 + - 0.144 + - 0.147 + - 0.15 + - 0.153 + - 0.156 + - 0.159 + - 0.162 + - 0.168 + - 0.192 + - 0.195 + - 0.198 + - 0.201 + - 0.204 + - 0.207 + - 0.216 + - 0.219 + - 0.273 + - 0.279 + - 0.351 + - 0.546 + - 0.621 + - 0.732 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9047559213461442 + - 0.7875036777858101 + - 0.645615387588364 + - 0.49394756189394584 + - 0.36327448789950556 + - 0.3623582375091894 + - 0.3612421188723135 + - 0.35988597041177517 + - 0.3582414615651847 + - 0.3562497308231653 + - 0.3538381732891759 + - 0.35092279952040956 + - 0.3473897982614693 + - 0.34309861998402474 + - 0.33787271131401625 + - 0.3315885148568914 + - 0.3236773139337333 + - 0.3140215948442 + - 0.30229036817656474 + - 0.2884840099993882 + - 0.2721583386694357 + - 0.25296205409433203 + - 0.2310227790109453 + - 0.20679319440733876 + - 0.1786148076293032 + - 0.15226404461496015 + - 0.12182359051640522 + - 0.11819220066164188 + - 0.09754889005647636 + - 0.08287346324163779 + - 0.07038393621283046 + - 0.06373026582285926 + - 0.049966827188364114 + - 0.04863896688660517 + - 0.024020773620893762 + - 0.016308774229727374 + - 0.01191121490887226 + - 0.010680705705500714 + - 0.010576659380173799 + - 0.010185944041253394 + - 0.009864542282328017 + - 0.009935919539438627 + - 0.009935919539438627 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.027 + - 0.03 + - 0.036 + - 0.057 + - 0.06 + - 0.123 + - 0.15 + - 0.198 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8864198927764907 + - 0.7565652225704835 + - 0.599558609170531 + - 0.42039039331515604 + - 0.2547188594788377 + - 0.23421956549940018 + - 0.11174387068210662 + - 0.06734153091863865 + - 0.03621130913814237 + - 0.014583881304639166 + - 0.0012981341609040202 + - -0.00890890339440757 + - -0.011353788699357822 + - -0.011353788699357822 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.021 + - 0.066 + - 0.069 + - 0.072 + - 0.075 + - 0.078 + - 0.081 + - 0.084 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.105 + - 0.147 + - 0.15 + - 0.153 + - 0.156 + - 0.198 + - 0.201 + - 0.204 + - 0.252 + - 0.255 + - 0.63 + - 0.702 + - 0.705 + - 0.708 + - 0.711 + - 0.714 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8694556764491579 + - 0.7433640955549691 + - 0.5918966863449401 + - 0.4164297175025101 + - 0.3502068667201173 + - 0.29503212763560677 + - 0.2878464604683905 + - 0.2792999284363188 + - 0.2693788913594152 + - 0.2579146788866789 + - 0.24457699636022084 + - 0.22866346187914494 + - 0.2096029622879002 + - 0.18715753095116297 + - 0.16304941934726191 + - 0.13385319398240755 + - 0.10673712551306896 + - 0.07444160012615197 + - 0.05709329837657606 + - 0.019791062846012394 + - 0.01290405500329487 + - 0.011426650995427647 + - 0.005719403150687536 + - -0.0026617778726090204 + - -0.0037440589334116333 + - -0.004510830343667303 + - -0.004780806027952905 + - -0.004453511215754991 + - -0.004548799858098185 + - -0.00457996047187443 + - -0.004462648369186052 + - -0.004475799818494372 + - -0.004451847550306222 + - -0.004457057976995365 + - -0.004457057976995365 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.123 + - 0.15 + - 0.246 + - 0.249 + - 0.252 + - 0.255 + - 0.303 + - 0.579 + - 0.582 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8579376279386266 + - 0.6996475520605465 + - 0.5206613828524898 + - 0.3263085267316951 + - 0.20563289829939888 + - 0.19436990859316622 + - 0.15542052590418018 + - 0.11782573126677932 + - 0.09258501385058902 + - 0.0778572679662708 + - 0.06581986603368371 + - 0.05648976096696052 + - 0.047804554927667844 + - 0.03990635033211572 + - 0.030575539795710673 + - 0.03259764208456102 + - 0.01541633307447781 + - 0.0009645672892330879 + - -0.011103274526923383 + - -0.013931703239076634 + - -0.01488083986958298 + - -0.014262539637589633 + - -0.015719434991038766 + - -0.016393324994646734 + - -0.015394854647053063 + - -0.015394854647053063 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.039 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.123 + - 0.147 + - 0.15 + - 0.204 + - 0.462 + - 0.465 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8259218368468746 + - 0.7111490149663623 + - 0.5733856584842423 + - 0.4279674271897438 + - 0.30787975427582415 + - 0.2614836546250238 + - 0.2164477885118289 + - 0.1788156705302984 + - 0.1366418225613348 + - 0.08899818862335708 + - 0.06254243490453092 + - 0.04803080632880429 + - 0.03481328498227922 + - 0.027280221050734334 + - 0.01743991377171961 + - 0.016853792239420493 + - -0.0017008107445503787 + - -0.0072918220996713735 + - -0.008787005912314919 + - -0.010998325873361208 + - -0.008992592009750063 + - -0.010409280185037714 + - -0.010409280185037714 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.033 + - 0.036 + - 0.039 + - 0.06 + - 0.063 + - 0.12 + - 0.291 + - 0.846 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8752225534829842 + - 0.7571513277305779 + - 0.6143166966698981 + - 0.44848315406114275 + - 0.26830020057589354 + - 0.13490255276302818 + - 0.13761928035931853 + - 0.04802770873527201 + - 0.0441604762323805 + - 0.012848292424819368 + - 0.000932089199564028 + - -0.0116539926917949 + - -0.01196657820331408 + - -0.014547575533536798 + - -0.014547575533536798 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.027 + - 0.03 + - 0.051 + - 0.054 + - 0.057 + - 0.078 + - 0.273 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8168701775391459 + - 0.7070070342789618 + - 0.5741084274552645 + - 0.4195860275814685 + - 0.2501976382728117 + - 0.12934262575211605 + - 0.12832127372653576 + - 0.04025845434963308 + - 0.025939247916208562 + - -0.0038230627744772184 + - -0.008809345888420821 + - -0.011848828282055976 + - -0.018881239613141053 + - -0.018881239613141053 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.021 + - 0.042 + - 0.045 + - 0.048 + - 0.051 + - 0.054 + - 0.069 + - 0.072 + - 0.09 + - 0.093 + - 0.144 + - 0.147 + - 0.15 + - 0.153 + - 0.156 + - 0.159 + - 0.162 + - 0.165 + - 0.168 + - 0.171 + - 0.174 + - 0.243 + - 0.246 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8362435201023676 + - 0.7048398643990185 + - 0.549369996748339 + - 0.3756378523535019 + - 0.3013170064253231 + - 0.2601865405852183 + - 0.21214390095344487 + - 0.17839107434292092 + - 0.150055183889784 + - 0.13314317249266913 + - 0.08988427740099754 + - 0.08615578657196839 + - 0.03908336941896341 + - 0.03589200826205948 + - 0.011513123590791242 + - 0.008557161688525244 + - 0.006046898721948897 + - 0.003912982378190007 + - 0.0021661901532357233 + - 0.0008442567661303185 + - -0.0006431995117310563 + - -0.0018132327090654603 + - -0.0037164816911699665 + - -0.004899881265314214 + - -0.00721880954104232 + - -0.008893131060709597 + - -0.008129012234060233 + - -0.008129012234060233 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.021 + - 0.063 + - 0.066 + - 0.069 + - 0.072 + - 0.075 + - 0.078 + - 0.081 + - 0.084 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.156 + - 0.159 + - 0.162 + - 0.165 + - 0.168 + - 0.222 + - 0.225 + - 0.276 + - 0.342 + - 0.402 + - 0.474 + - 0.546 + - 0.657 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9850082798495005 + - 0.8497043820626874 + - 0.6872710740690935 + - 0.5016474754167751 + - 0.41504168566674843 + - 0.3641915516585571 + - 0.3530191542518652 + - 0.3396376571760423 + - 0.323888555469597 + - 0.30559228051316445 + - 0.2845326211393049 + - 0.2601425816306896 + - 0.23231673728521457 + - 0.20354833379578327 + - 0.17260547025655684 + - 0.14194010899918583 + - 0.10789452327788765 + - 0.0822306570203096 + - 0.047236376652478325 + - 0.023795047081199568 + - 0.01855444743103536 + - 0.018365016547326966 + - 0.018234177964806222 + - 0.018379140117411458 + - 0.014633667738703868 + - 0.015440839625565918 + - 0.014730668499603654 + - 0.01453547196447648 + - 0.014474267381011374 + - 0.014482309041332238 + - 0.01445275757123827 + - 0.014401391481060767 + - 0.014401391481060767 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.006 + - 0.009 + - 0.012 + - 0.015 + - 0.018 + - 0.021 + - 0.087 + - 0.09 + - 0.093 + - 0.096 + - 0.099 + - 0.102 + - 0.105 + - 0.108 + - 0.111 + - 0.114 + - 0.117 + - 0.12 + - 0.123 + - 0.126 + - 0.129 + - 0.168 + - 0.171 + - 0.174 + - 0.177 + - 0.18 + - 0.183 + - 0.246 + - 0.498 + - 0.702 + - 0.786 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8237785723600686 + - 0.6912167532703835 + - 0.5339013264356889 + - 0.3705985351579166 + - 0.2544420517395976 + - 0.21565422336424434 + - 0.10580988656406214 + - 0.1037491185742415 + - 0.10138439005485655 + - 0.0985638619360434 + - 0.09532691210378769 + - 0.09143952718666624 + - 0.08695434592402981 + - 0.08164337479533608 + - 0.07568518005531596 + - 0.06911906987715839 + - 0.06214820617203395 + - 0.05464797907100358 + - 0.04789912786069078 + - 0.03893761432186481 + - 0.03303628016740269 + - 0.009439781394913384 + - 0.002466244474344644 + - -0.0009103971593105222 + - -0.003852065983191091 + - -0.006430581859710007 + - -0.0095740048190645 + - -0.019869898199624446 + - -0.02092199037061667 + - 0.0 + - -0.021529975773807938 + - -0.021529975773807938 +solver_name: ALOE diff --git a/test/expected_results/SAN1_ASTRODF.yaml b/test/expected_results/SAN1_ASTRODF.yaml new file mode 100644 index 000000000..b3a383bb8 --- /dev/null +++ b/test/expected_results/SAN1_ASTRODF.yaml @@ -0,0 +1,18749 @@ +all_est_objectives: +- - 55.228104638490976 + - 52.59873162680112 + - 46.150472699505535 + - 38.20894692022277 + - 33.823821425110516 + - 28.572426171925848 + - 25.307363008091606 + - 24.92971374117208 + - 22.703466216256597 + - 22.170442372918856 + - 20.261532778106083 + - 19.960729627366373 + - 19.19594144414026 + - 18.82557419298326 + - 18.769904150023255 + - 18.54549180271025 + - 18.562824868172996 + - 18.550073382324328 + - 18.524714288994204 + - 18.525155568196865 + - 18.514371164909857 + - 18.51472224201846 + - 18.509951516345794 + - 18.50991377361457 + - 18.508027842409682 + - 18.508060633792855 + - 18.50721356067611 + - 18.507251717459624 + - 18.50687022426704 + - 18.506878851130544 + - 18.50680986454267 + - 18.50681266417502 + - 18.50679110380958 + - 18.506791988826514 + - 18.506785251014534 + - 18.5067856682792 + - 18.506782503756853 + - 18.50678250647192 + - 18.506782485909863 + - 18.506782487185667 + - 18.506782477523746 + - 18.506782477788896 + - 18.506782475780884 + - 18.50678247586374 + - 18.506782475236236 + - 18.506782475239472 + - 18.506782475214962 + - 18.50678247521597 + - 18.506782475208315 + - 18.506782475208315 +- - 54.98944203450111 + - 52.40892200204887 + - 45.998253923157016 + - 38.405488854507865 + - 34.74757450273338 + - 32.446879329728624 + - 32.48657086779173 + - 30.19607369735305 + - 29.76216925948806 + - 29.03560093109357 + - 28.228223846559413 + - 27.850203565549805 + - 26.99713217145405 + - 26.352067784415325 + - 25.750552051214886 + - 24.99834135947684 + - 24.348799108122968 + - 23.93420591376357 + - 23.599415804283414 + - 23.56922910735042 + - 22.869522309245816 + - 22.814943992379764 + - 22.536420016726066 + - 22.339207892952178 + - 22.171128995532705 + - 22.01029946350065 + - 21.859681126663293 + - 21.593053735116932 + - 21.513058648056596 + - 21.375649209707195 + - 21.320054637182352 + - 21.05207131113096 + - 20.761918199176925 + - 20.6636846561534 + - 20.272153001196187 + - 20.239559065940114 + - 20.114516044907422 + - 20.04828383182252 + - 19.924086676690273 + - 19.87074167903727 + - 19.81113201847169 + - 19.8032886525805 + - 19.800884549002266 + - 19.796889503213876 + - 19.795662905786553 + - 19.79360414702941 + - 19.791483759485963 + - 19.790222967072943 + - 19.78971555166209 + - 19.7888571167154 + - 19.78796925902098 + - 19.787440406371378 + - 19.786895696756012 + - 19.78643491664649 + - 19.785856061108106 + - 19.78507746586745 + - 19.784498812715476 + - 19.783720425287115 + - 19.783143353678373 + - 19.782367017213982 + - 19.78179286705642 + - 19.781020373115545 + - 19.780450433753973 + - 19.779683507301744 + - 19.77911900749858 + - 19.778359293596676 + - 19.777801392921603 + - 19.777050445262642 + - 19.77340390505142 + - 19.7689261344024 + - 19.760243358311286 + - 19.749172597264305 + - 19.70798988422517 + - 19.669252148112058 + - 19.641396619867383 + - 19.60845105715932 + - 19.599174225144115 + - 19.58766940678714 + - 19.577603987412314 + - 19.564641660886906 + - 19.53754320039234 + - 19.506674205529475 + - 19.491719007952675 + - 19.473304354170317 + - 19.46322275866054 + - 19.450208288311305 + - 19.434626388214443 + - 19.425680347117503 + - 19.414546846656037 + - 19.41029240789675 + - 19.404526379181295 + - 19.396019347860634 + - 19.38883406333271 + - 19.38762851783089 + - 19.385111516612078 + - 19.381463495535826 + - 19.376419643225375 + - 19.366762950287466 + - 19.358782987788665 + - 19.3578004512191 + - 19.3555013041117 + - 19.354877100473633 + - 19.353583041716465 + - 19.353075556707605 + - 19.352795734619598 + - 19.352474641471343 + - 19.352199770528273 + - 19.352181732856973 + - 19.352157024317922 + - 19.35211764317374 + - 19.35209844405778 + - 19.35206783401495 + - 19.352052739825513 + - 19.352046710366267 + - 19.352037103007152 + - 19.35203242324534 + - 19.35202496369719 + - 19.352021527508274 + - 19.352013141850396 + - 19.352001367907977 + - 19.351982636639878 + - 19.35195520390508 + - 19.35192963830276 + - 19.351922704845187 + - 19.351908074278864 + - 19.351905978386633 + - 19.351900856693245 + - 19.351893672660903 + - 19.351882226722616 + - 19.351841816841997 + - 19.351806848753835 + - 19.351697964226034 + - 19.35159123364341 + - 19.351413052971917 + - 19.351145038503304 + - 19.350843394734426 + - 19.35039156457843 + - 19.349886135107806 + - 19.34913399184882 + - 19.34830051273068 + - 19.347993780019706 + - 19.347600326317675 + - 19.343943184087014 + - 19.338762432234702 + - 19.332519131759504 + - 19.324001043547145 + - 19.321589607798742 + - 19.316786725557506 + - 19.310344260738546 + - 19.30222608523073 + - 19.29451891368477 + - 19.285122931941796 + - 19.276022734593596 + - 19.26490324431696 + - 19.251138027828034 + - 19.228827505771562 + - 19.221073670902786 + - 19.207818247242756 + - 19.200591083036212 + - 19.188287869206203 + - 19.182013300721138 + - 19.17012651935337 + - 19.16536526240105 + - 19.152114611602915 + - 19.1291290650967 + - 19.12721492562757 + - 19.111608996250837 + - 19.111493511656672 + - 19.11488699035347 + - 19.060238293562385 + - 19.009499091449516 + - 19.006237350446554 + - 18.979460647934857 + - 18.978520975113575 + - 18.978738708617552 + - 18.957580713560954 + - 18.964292097642378 + - 18.938978922785186 + - 18.940607775730474 + - 18.922913818344362 + - 18.908576664114722 + - 18.908469100753926 + - 18.887791010780894 + - 18.875772530922074 + - 18.87946616242649 + - 18.85957562332658 + - 18.848064835848003 + - 18.84979182037034 + - 18.852223312499042 + - 18.845956346736262 + - 18.846113186974822 + - 18.844036565358866 + - 18.840103851170685 + - 18.840122590092587 + - 18.837835032216052 + - 18.833694955769516 + - 18.833558318299282 + - 18.831205111579443 + - 18.827070344309142 + - 18.830033343595236 + - 18.824028789166707 + - 18.823619494296523 + - 18.821731481345026 + - 18.822716450207896 + - 18.820566120359814 + - 18.821037004530336 + - 18.82004971643885 + - 18.819549909478482 + - 18.820044340431156 + - 18.818919633139895 + - 18.819153309914253 + - 18.81864750230143 + - 18.818390370316816 + - 18.818633011153093 + - 18.81806844490684 + - 18.816678445244627 + - 18.814634331187218 + - 18.81095778810285 + - 18.805765967493976 + - 18.797287394620213 + - 18.785958108773954 + - 18.770120248926972 + - 18.749356925873087 + - 18.612336633585638 + - 18.573381637255338 + - 18.562763361467443 + - 18.53452324958955 + - 18.542416952006683 + - 18.509875924474855 + - 18.52268984713614 + - 18.515910627938432 + - 18.521659646458428 + - 18.519115093524682 + - 18.519901304810144 + - 18.52108266241462 + - 18.5218372854356 + - 18.52124595844225 + - 18.52147892402543 + - 18.52195931815647 + - 18.521664900204314 + - 18.520889400511848 + - 18.52117742981985 + - 18.521790741400057 + - 18.522177675665098 + - 18.521894522745065 + - 18.521990925975157 + - 18.521813008591952 + - 18.5221454921004 + - 18.521677581242933 + - 18.52181312242185 + - 18.521567569297474 + - 18.521815764948595 + - 18.521971436180703 + - 18.521757001839124 + - 18.52183750343654 + - 18.52178981148364 + - 18.52184015818428 + - 18.521824483828436 + - 18.52183978099908 + - 18.521828796284282 + - 18.521849021502568 + - 18.521837049474467 + - 18.52184967963332 + - 18.521842204643068 + - 18.521850090040083 + - 18.521847195382623 + - 18.521848151167237 + - 18.521851071911684 + - 18.521849343690263 + - 18.521851166545165 + - 18.521849853771506 + - 18.52185031016417 + - 18.521850423079094 + - 18.521850200828396 + - 18.521850274208692 + - 18.521850803207172 + - 18.52185049018064 + - 18.521850820359855 + - 18.521850624981127 + - 18.52185034890419 + - 18.521850571758552 + - 18.521850626865934 + - 18.521850905435798 + - 18.521850740597362 + - 18.521850914466896 + - 18.521850789247154 + - 18.52185083057994 + - 18.521850749226893 + - 18.52185089934718 + - 18.52185081051614 + - 18.52185090421403 + - 18.521850848769862 + - 18.521850907251796 + - 18.521850865120026 + - 18.521850918253723 + - 18.521850886812707 + - 18.521850919976362 + - 18.52185090035229 + - 18.52185092105157 + - 18.52185092617222 + - 18.521850916091932 + - 18.521850934698627 + - 18.521850923688415 + - 18.521850935301874 + - 18.521850928429796 + - 18.52185093567839 + - 18.521850930455543 + - 18.521850858904067 + - 18.52185083430005 + - 18.521850491847495 + - 18.521850374090672 + - 18.521848735112364 + - 18.52184817153853 + - 18.521840328163712 + - 18.52183763140537 + - 18.521800114512086 + - 18.521787220690964 + - 18.52160817353675 + - 18.521546762629136 + - 18.520701394597385 + - 18.52041415302945 + - 18.516614333142783 + - 18.515373070525232 + - 18.51437247503386 + - 18.502451860657974 + - 18.499481550810973 + - 18.495143603379276 + - 18.490740275162366 + - 18.487639496376392 + - 18.469169388818713 + - 18.46507750309161 + - 18.457581282346677 + - 18.457423310339564 + - 18.45028957127421 + - 18.452190362421234 + - 18.44623125828891 + - 18.44886497533512 + - 18.44502786443492 + - 18.44732669147727 + - 18.444953990393504 + - 18.44654747166235 + - 18.445329715306947 + - 18.446437043847226 + - 18.44602926969775 + - 18.446438359125114 + - 18.446511396654824 + - 18.44646784158899 + - 18.446512373086094 + - 18.44648587104811 + - 18.446512986310687 + - 18.44649686903286 + - 18.44651336628939 + - 18.446507291952003 + - 18.446513512242692 + - 18.446514605439752 + - 18.446513956373774 + - 18.44651462122079 + - 18.446514226491743 + - 18.446514630822225 + - 18.446514390769902 + - 18.44651463666285 + - 18.446514490677025 + - 18.44651464021535 + - 18.446514594958206 + - 18.44651464131687 + - 18.446514627174015 + - 18.446514641661118 + - 18.446514644206587 + - 18.44651464199677 + - 18.44651464454224 + - 18.44651464233242 + - 18.446514644877894 + - 18.44651464418732 + - 18.446514644982784 + - 18.446514644766985 + - 18.446514645015565 + - 18.446514644907662 + - 18.44651464503195 + - 18.446514645015096 + - 18.44651464503451 + - 18.446514645026085 + - 18.446514645035794 + - 18.44651464503158 + - 18.44651464503643 + - 18.446514645034327 + - 18.44651464503675 + - 18.446514645036096 + - 18.44651464503685 + - 18.446514645036746 + - 18.44651464503687 + - 18.446514645036768 + - 18.446514645036885 + - 18.44651464503687 + - 18.446514645036885 + - 18.44651464503688 + - 18.446514645036885 + - 18.44651464503688 + - 18.446514645036885 + - 18.446514645036885 +- - 54.30952001078969 + - 51.52211403526881 + - 44.634978342893604 + - 28.939098039124364 + - 24.01945119984696 + - 21.21733923753959 + - 20.51261988925829 + - 19.23794755781888 + - 18.90027520976452 + - 18.509419800773205 + - 18.21296148724211 + - 18.154052227523877 + - 18.145865139178053 + - 18.144056792353503 + - 18.136436156343592 + - 18.139632285641227 + - 18.142115719231192 + - 18.139580735675146 + - 18.140461504093185 + - 18.140661232580396 + - 18.140623116581256 + - 18.140637308961605 + - 18.140647070743388 + - 18.140647452022975 + - 18.140647466916654 + - 18.140647466206488 + - 18.140647466470597 + - 18.140647466734706 + - 18.140647466734706 +- - 54.76055167633331 + - 51.831478379365635 + - 44.610858001917975 + - 28.58737736618809 + - 25.189320109496656 + - 23.834933638879008 + - 21.805518039763044 + - 21.150914893303465 + - 20.159807430019246 + - 19.290147442035074 + - 18.80902288428333 + - 18.45341463693065 + - 18.24228188982522 + - 18.042969090189832 + - 17.98154125462571 + - 17.946947205914718 + - 17.957573131832145 + - 17.958627685202966 + - 17.96016670372599 + - 17.968479463073162 + - 17.964944055278075 + - 17.96535985788638 + - 17.966280161437833 + - 17.96678890500794 + - 17.96632872953164 + - 17.966640274161936 + - 17.966795244272276 + - 17.966964171663843 + - 17.966919910573864 + - 17.966943864378035 + - 17.966946906394316 + - 17.966956688667146 + - 17.966961359210263 + - 17.96696195067654 + - 17.96696386121788 + - 17.966966511722944 + - 17.966965811684 + - 17.966966418909497 + - 17.9669664758935 + - 17.966966443136986 + - 17.966966471548755 + - 17.96696645521657 + - 17.966966469382406 + - 17.96696647286043 + - 17.966966469767875 + - 17.9669664732459 + - 17.96696647169962 + - 17.966966473438635 + - 17.96696647295542 + - 17.966966473498864 + - 17.96696647334786 + - 17.966966473517683 + - 17.966966473470492 + - 17.966966473523566 + - 17.96696647351619 + - 17.966966473524487 + - 17.966966473517115 + - 17.966966473525407 + - 17.966966473524252 + - 17.96696647352555 + - 17.966966473524398 + - 17.96696647352569 + - 17.96696647352551 + - 17.966966473525712 + - 17.966966473525623 + - 17.96696647352573 + - 17.966966473525634 + - 17.966966473525737 + - 17.966966473525737 +- - 52.39186295815599 + - 49.92903224923593 + - 44.04579960708142 + - 30.768331554574065 + - 27.3516539729615 + - 25.357701793084043 + - 23.88158658535813 + - 21.410593173610376 + - 20.280728177956483 + - 19.574303933041904 + - 18.778427472693444 + - 18.506718814553185 + - 18.437871564273276 + - 18.215022458467097 + - 18.13342098073323 + - 18.163243875558113 + - 18.17543257417943 + - 18.16933940482751 + - 18.173941131374097 + - 18.171075787314525 + - 18.17271842305726 + - 18.17150706779659 + - 18.172225225850642 + - 18.172375036398215 + - 18.172303711974294 + - 18.172327323116054 + - 18.172338947860275 + - 18.17232216729725 + - 18.17233371461493 + - 18.17231706526839 + - 18.17232850806369 + - 18.172315462387203 + - 18.17231979572689 + - 18.172322068877374 + - 18.1723187888261 + - 18.172321046417146 + - 18.172318470001247 + - 18.17231042961295 + - 18.172315946877152 + - 18.172315096616025 + - 18.17231537923365 + - 18.172314971647882 + - 18.17231525212036 + - 18.17231484763952 + - 18.17231512596713 + - 18.172314724590557 + - 18.17231500077393 + - 18.172314685630234 + - 18.172314790379932 + - 18.172314790379932 +- - 54.25979384648611 + - 51.402039731659336 + - 44.418494358297224 + - 28.83866693212967 + - 25.254067022565604 + - 21.936675926099834 + - 20.358335580526827 + - 19.216119278192494 + - 18.41579632255334 + - 18.098085035080835 + - 18.10454051199116 + - 18.015428834111418 + - 17.995800501693257 + - 17.984227894656886 + - 17.97775034839794 + - 17.984376555209643 + - 17.98088208707136 + - 17.984249112164996 + - 17.982709771560938 + - 17.984614590773912 + - 17.983180725408076 + - 17.984211896740106 + - 17.98360958684306 + - 17.98469643804304 + - 17.984223069197203 + - 17.984239024841408 + - 17.98423213349283 + - 17.98422353335593 + - 17.984236454117426 + - 17.984228720830767 + - 17.984240337227376 + - 17.984233393247862 + - 17.984243822377717 + - 17.984237595039406 + - 17.984246946543045 + - 17.984241368214054 + - 17.98424974406239 + - 17.98424475216504 + - 17.98425224664932 + - 17.984247783575984 + - 17.984254483451288 + - 17.98425191575057 + - 17.98425577042536 + - 17.9842534770086 + - 17.98425691974661 + - 17.984254872163632 + - 17.984257945729695 + - 17.984256691599853 + - 17.98425857414626 + - 17.984257454987652 + - 17.98425913488952 + - 17.98425913488952 +- - 51.823992493809435 + - 49.27156578550831 + - 42.9764571240219 + - 27.961823394464023 + - 24.25841470131543 + - 20.833797758688625 + - 19.85136145023612 + - 19.267391821330698 + - 18.429932237099642 + - 17.929980469814954 + - 17.817401640165002 + - 17.752363046381266 + - 17.745343188519236 + - 17.736023581504533 + - 17.736972379716374 + - 17.738932925972005 + - 17.736647138264527 + - 17.738063150192083 + - 17.736478352209616 + - 17.736761835028286 + - 17.736802883642145 + - 17.736683149435624 + - 17.73670798146185 + - 17.736636730173153 + - 17.736651606496125 + - 17.736609333204434 + - 17.73661819464701 + - 17.736618600615323 + - 17.736617452748295 + - 17.73661769424841 + - 17.736617011517886 + - 17.73661715516701 + - 17.736616749102684 + - 17.736616834543444 + - 17.736616832559637 + - 17.73661683297707 + - 17.73661683179714 + - 17.736616832045414 + - 17.736616832057237 + - 17.736616832023827 + - 17.736616832030858 + - 17.736616832010984 + - 17.736616832015166 + - 17.736616832012803 + - 17.736616832013304 + - 17.736616832011894 + - 17.736616832012192 + - 17.736616832012192 +- - 53.19657777800099 + - 50.56621753596579 + - 44.08643251131503 + - 29.637657613456785 + - 25.212055526462397 + - 24.118642130029393 + - 22.99515107327406 + - 21.053224431591556 + - 19.707091704906915 + - 19.51842999474983 + - 18.986959418105187 + - 18.81175971757189 + - 18.30515916693578 + - 18.212636064510065 + - 18.204855478404582 + - 18.19167170789038 + - 18.19456245978692 + - 18.188872438669396 + - 18.192588697296088 + - 18.1898498197532 + - 18.189488696794037 + - 18.187284281136748 + - 18.188475688413327 + - 18.187776642856353 + - 18.187752483745886 + - 18.187738650192674 + - 18.18774292747647 + - 18.187732586640266 + - 18.187735785485906 + - 18.18772806755451 + - 18.18773045586191 + - 18.18772470222902 + - 18.187726483149426 + - 18.187722197583287 + - 18.187723524350574 + - 18.187720334318023 + - 18.18772132206185 + - 18.18771894864285 + - 18.187719683613917 + - 18.187717918391844 + - 18.187717878088048 + - 18.187717890569544 + - 18.18771786059413 + - 18.18771786987709 + - 18.187717847583382 + - 18.18771785448744 + - 18.18771783790692 + - 18.187717843041675 + - 18.187717830710266 + - 18.18771783452914 + - 18.187717825357932 + - 18.187717825545782 + - 18.187717825170424 + - 18.187717825163094 + - 18.18771782516536 + - 18.187717825159908 + - 18.187717825159908 +- - 58.70283939001095 + - 55.681496217019266 + - 48.23331941109421 + - 31.213068977396716 + - 27.282133879365805 + - 25.044859503452226 + - 22.94984866070614 + - 22.08041468900567 + - 21.36590804109186 + - 20.38269187221371 + - 20.000221682601165 + - 19.367405749508386 + - 19.281279168868206 + - 19.05262833350224 + - 19.01900139054402 + - 18.959141525836607 + - 18.92402395368753 + - 18.905793493142422 + - 18.862974540115125 + - 18.86687851317032 + - 18.862133975064538 + - 18.862777403501237 + - 18.86234196546132 + - 18.862355703420555 + - 18.862590120483905 + - 18.862508900958495 + - 18.86271204100058 + - 18.86266191232123 + - 18.86281177452961 + - 18.86278514797998 + - 18.862891845635712 + - 18.862878021622688 + - 18.862952426084345 + - 18.8629451864913 + - 18.862996325374944 + - 18.862992442934775 + - 18.86302724193603 + - 18.863025092132673 + - 18.86304861238357 + - 18.86304737953574 + - 18.86306320441964 + - 18.86306247313775 + - 18.86307308803483 + - 18.863072641236254 + - 18.86307974693499 + - 18.863079467295787 + - 18.86308421744768 + - 18.863084039158192 + - 18.863087211751022 + - 18.86308709651761 + - 18.863089214188427 + - 18.863089138980424 + - 18.8630905519322 + - 18.86309050251157 + - 18.863091445007257 + - 18.863091412379347 + - 18.863092040949105 + - 18.86309201933895 + - 18.8630924384949 + - 18.86309242415107 + - 18.863092703639047 + - 18.863092694104413 + - 18.86309288045361 + - 18.863092874109554 + - 18.863092998353867 + - 18.86309299412996 + - 18.863093076965225 + - 18.863093074151696 + - 18.863093129378143 + - 18.863093127503518 + - 18.863093164322727 + - 18.86309316307344 + - 18.863093187620454 + - 18.86309318678779 + - 18.863093203152975 + - 18.863093202597952 + - 18.863093213508378 + - 18.8630932131384 + - 18.863093220412203 + - 18.86309322016557 + - 18.86309322501489 + - 18.863093224850466 + - 18.86309322808343 + - 18.863093227973813 + - 18.86309323012917 + - 18.863093230056094 + - 18.863093230056094 +- - 52.87627843731777 + - 50.063777893736635 + - 43.20150477779864 + - 28.92926172520723 + - 27.327085301110287 + - 25.185782064561227 + - 24.092737167444728 + - 22.996099330201037 + - 21.122659372464977 + - 19.616189849353333 + - 19.20475681475291 + - 18.699696931733445 + - 17.88870534211233 + - 17.808845854235102 + - 17.782366380855496 + - 17.76955606105867 + - 17.753385764913524 + - 17.759912365455456 + - 17.757221157140908 + - 17.75883731724715 + - 17.760328364503856 + - 17.76068671885371 + - 17.76056241167869 + - 17.76029286177676 + - 17.761641474490915 + - 17.761826980270236 + - 17.76179183545731 + - 17.76130092011113 + - 17.761661829057868 + - 17.762170556746785 + - 17.762064344487715 + - 17.76206149177836 + - 17.762030450840772 + - 17.762227985977756 + - 17.7622410857109 + - 17.762193083964675 + - 17.762177110159087 + - 17.76217688638507 + - 17.762182232606428 + - 17.76218217761103 + - 17.762180032789693 + - 17.76219417719883 + - 17.76219194174962 + - 17.762191917577752 + - 17.762200452746136 + - 17.76219925152712 + - 17.762206497991038 + - 17.76220544215708 + - 17.762204023709906 + - 17.76220479034059 + - 17.76220478798928 + - 17.762205309781187 + - 17.762205231454196 + - 17.76220572901179 + - 17.76220578743019 + - 17.76220551275736 + - 17.762205716601056 + - 17.76220568462819 + - 17.76220568452463 + - 17.76220571637589 + - 17.762205711353715 + - 17.762205731260813 + - 17.76220573362406 + - 17.762205730857264 + - 17.76220574329921 + - 17.76220574319113 + - 17.762205743190044 + - 17.76220574313463 + - 17.762205743502946 + - 17.7622057434449 + - 17.76220574344431 + - 17.762205743824005 + - 17.76220574376434 + - 17.76220574376395 + - 17.762205743744236 + - 17.76220574387523 + - 17.762205743854594 + - 17.762205743854384 + - 17.76220574384375 + - 17.762205743843637 + - 17.762205743858125 + - 17.762205743855844 + - 17.762205743870975 + - 17.76220574386859 + - 17.762205743884405 + - 17.762205743881914 + - 17.762205743898427 + - 17.76220574389583 + - 17.762205743913068 + - 17.762205743910357 + - 17.762205743910332 + - 17.762205743908936 + - 17.762205743908936 +all_intermediate_budgets: +- - 83 + - 166 + - 249 + - 415 + - 664 + - 747 + - 830 + - 913 + - 1328 + - 1411 + - 1494 + - 1577 + - 2158 + - 2241 + - 2324 + - 2407 + - 2490 + - 2573 + - 2656 + - 2739 + - 2822 + - 2905 + - 2988 + - 3071 + - 3154 + - 3237 + - 3320 + - 3403 + - 3486 + - 5146 + - 5229 + - 5561 + - 5644 + - 5976 + - 6059 + - 6142 + - 6225 + - 7221 + - 7304 + - 7387 + - 7470 + - 8051 + - 8134 + - 8466 + - 8549 + - 9130 + - 9213 + - 9545 + - 9628 + - 10000 +- - 6 + - 12 + - 18 + - 30 + - 48 + - 54 + - 60 + - 66 + - 72 + - 114 + - 121 + - 128 + - 135 + - 142 + - 149 + - 156 + - 163 + - 172 + - 180 + - 188 + - 196 + - 204 + - 212 + - 292 + - 302 + - 311 + - 320 + - 329 + - 338 + - 347 + - 356 + - 428 + - 437 + - 446 + - 455 + - 464 + - 473 + - 482 + - 491 + - 529 + - 539 + - 659 + - 669 + - 679 + - 689 + - 699 + - 709 + - 719 + - 809 + - 819 + - 829 + - 839 + - 891 + - 902 + - 913 + - 924 + - 935 + - 946 + - 957 + - 968 + - 979 + - 990 + - 1001 + - 1012 + - 1023 + - 1034 + - 1045 + - 1056 + - 1067 + - 1078 + - 1089 + - 1100 + - 1111 + - 1122 + - 1221 + - 1232 + - 1276 + - 1287 + - 1309 + - 1320 + - 1331 + - 1342 + - 1375 + - 1386 + - 1397 + - 1408 + - 1419 + - 1430 + - 1441 + - 1512 + - 1524 + - 1548 + - 1560 + - 1608 + - 1620 + - 1632 + - 1644 + - 1656 + - 1668 + - 1728 + - 1740 + - 1752 + - 1764 + - 1824 + - 1836 + - 1884 + - 1896 + - 1956 + - 1968 + - 1980 + - 1992 + - 2004 + - 2016 + - 2100 + - 2112 + - 2124 + - 2136 + - 2184 + - 2196 + - 2208 + - 2220 + - 2244 + - 2256 + - 2268 + - 2280 + - 2352 + - 2364 + - 2376 + - 2388 + - 2402 + - 2415 + - 2428 + - 2441 + - 2454 + - 2467 + - 2480 + - 2493 + - 2506 + - 2519 + - 2532 + - 2545 + - 2558 + - 2571 + - 2584 + - 2597 + - 2610 + - 2623 + - 2636 + - 2649 + - 2662 + - 2675 + - 2688 + - 2701 + - 2714 + - 2727 + - 2740 + - 2753 + - 2766 + - 2779 + - 2792 + - 2805 + - 2818 + - 2831 + - 2844 + - 2857 + - 2870 + - 2883 + - 2896 + - 2909 + - 2922 + - 2935 + - 2948 + - 2961 + - 2974 + - 2987 + - 3000 + - 3013 + - 3026 + - 3039 + - 3052 + - 3221 + - 3234 + - 3247 + - 3260 + - 3273 + - 3286 + - 3299 + - 3312 + - 3416 + - 3429 + - 3442 + - 3455 + - 3468 + - 3481 + - 3494 + - 3507 + - 3520 + - 3533 + - 3546 + - 3559 + - 3572 + - 3585 + - 3598 + - 3715 + - 3728 + - 3741 + - 3754 + - 3767 + - 3780 + - 3793 + - 3806 + - 3819 + - 3832 + - 3845 + - 3858 + - 3873 + - 3887 + - 3901 + - 3915 + - 3929 + - 3943 + - 3957 + - 3971 + - 3985 + - 3999 + - 4013 + - 4027 + - 4041 + - 4055 + - 4069 + - 4251 + - 4265 + - 4335 + - 4349 + - 4363 + - 4405 + - 4419 + - 4433 + - 4475 + - 4489 + - 4517 + - 4531 + - 4545 + - 4587 + - 4601 + - 4615 + - 4629 + - 4643 + - 4657 + - 4699 + - 4713 + - 4727 + - 4769 + - 4783 + - 4797 + - 4811 + - 4825 + - 4923 + - 4937 + - 4951 + - 4965 + - 4979 + - 4993 + - 5007 + - 5021 + - 5147 + - 5161 + - 5189 + - 5203 + - 5217 + - 5231 + - 5301 + - 5315 + - 5329 + - 5343 + - 5357 + - 5371 + - 5385 + - 5399 + - 5483 + - 5497 + - 5511 + - 5539 + - 5553 + - 5567 + - 5581 + - 5595 + - 5609 + - 5623 + - 5637 + - 5651 + - 5665 + - 5679 + - 5693 + - 5833 + - 5847 + - 5861 + - 5875 + - 5889 + - 5903 + - 5917 + - 5931 + - 5945 + - 5959 + - 5973 + - 5987 + - 6001 + - 6171 + - 6186 + - 6201 + - 6216 + - 6231 + - 6246 + - 6261 + - 6276 + - 6291 + - 6306 + - 6321 + - 6336 + - 6351 + - 6366 + - 6381 + - 6396 + - 6411 + - 6426 + - 6441 + - 6456 + - 6471 + - 6486 + - 6501 + - 6516 + - 6531 + - 6546 + - 6561 + - 6576 + - 6591 + - 6606 + - 6621 + - 6636 + - 6651 + - 6666 + - 6681 + - 6696 + - 6951 + - 6966 + - 7041 + - 7056 + - 7071 + - 7086 + - 7101 + - 7116 + - 7131 + - 7296 + - 7311 + - 7386 + - 7401 + - 7416 + - 7431 + - 7446 + - 7461 + - 7476 + - 7491 + - 7506 + - 7686 + - 7701 + - 7761 + - 7776 + - 7851 + - 7866 + - 7881 + - 7896 + - 7911 + - 7971 + - 7986 + - 8046 + - 8061 + - 8091 + - 8106 + - 8181 + - 8196 + - 8226 + - 8241 + - 8271 + - 8286 + - 8316 + - 8331 + - 8391 + - 8406 + - 8481 + - 8496 + - 8511 + - 8526 + - 8601 + - 8616 + - 8646 + - 8661 + - 8676 + - 8691 + - 10000 +- - 114 + - 228 + - 342 + - 456 + - 570 + - 684 + - 798 + - 1596 + - 1710 + - 1824 + - 1938 + - 2052 + - 2166 + - 2280 + - 2394 + - 2508 + - 4218 + - 4332 + - 4446 + - 5358 + - 5928 + - 6042 + - 6498 + - 7296 + - 8094 + - 8892 + - 9006 + - 9120 + - 10000 +- - 59 + - 118 + - 177 + - 236 + - 472 + - 531 + - 590 + - 649 + - 708 + - 767 + - 826 + - 885 + - 944 + - 1003 + - 1062 + - 1121 + - 1180 + - 1239 + - 2065 + - 2124 + - 2183 + - 2242 + - 2301 + - 2655 + - 2714 + - 2773 + - 3068 + - 3186 + - 3245 + - 3481 + - 3540 + - 3599 + - 3953 + - 4012 + - 4071 + - 4130 + - 4189 + - 4248 + - 4838 + - 4897 + - 4956 + - 5015 + - 5074 + - 5605 + - 5664 + - 5723 + - 5841 + - 5900 + - 6136 + - 6195 + - 6431 + - 6490 + - 6726 + - 6785 + - 7080 + - 7139 + - 7198 + - 7257 + - 7552 + - 7611 + - 7670 + - 7729 + - 8024 + - 8083 + - 8201 + - 8260 + - 8319 + - 8378 + - 10000 +- - 102 + - 204 + - 306 + - 408 + - 816 + - 918 + - 1020 + - 1122 + - 1224 + - 1326 + - 2040 + - 2142 + - 2244 + - 2346 + - 2448 + - 2550 + - 3672 + - 3774 + - 3876 + - 3978 + - 4590 + - 4692 + - 4794 + - 5508 + - 5814 + - 5916 + - 6324 + - 6426 + - 6528 + - 6630 + - 6732 + - 6834 + - 6936 + - 7548 + - 7650 + - 7752 + - 7854 + - 7956 + - 8058 + - 8670 + - 8772 + - 8874 + - 8976 + - 9078 + - 9180 + - 9282 + - 9384 + - 9486 + - 9588 + - 10000 +- - 95 + - 190 + - 285 + - 380 + - 760 + - 855 + - 950 + - 1520 + - 1615 + - 1710 + - 1805 + - 1900 + - 1995 + - 2090 + - 3325 + - 3420 + - 3515 + - 3610 + - 3705 + - 3800 + - 3895 + - 3990 + - 4085 + - 4180 + - 4275 + - 5985 + - 6080 + - 6270 + - 6365 + - 6460 + - 6555 + - 6650 + - 6745 + - 6840 + - 6935 + - 7030 + - 7125 + - 7220 + - 7315 + - 7410 + - 7505 + - 8645 + - 8740 + - 8835 + - 8930 + - 9025 + - 9120 + - 9690 + - 9785 + - 9880 + - 9975 + - 10000 +- - 75 + - 150 + - 225 + - 300 + - 600 + - 675 + - 750 + - 825 + - 900 + - 975 + - 1050 + - 1125 + - 1200 + - 1275 + - 1350 + - 2325 + - 2400 + - 2475 + - 2550 + - 2625 + - 3300 + - 3375 + - 3450 + - 3525 + - 3600 + - 3675 + - 3750 + - 4725 + - 4800 + - 4875 + - 4950 + - 5025 + - 5100 + - 5175 + - 6375 + - 6450 + - 6525 + - 6600 + - 7275 + - 7350 + - 7425 + - 7500 + - 7575 + - 8175 + - 8250 + - 8325 + - 8400 + - 10000 +- - 78 + - 156 + - 234 + - 312 + - 390 + - 468 + - 546 + - 1014 + - 1092 + - 1170 + - 1248 + - 1326 + - 1404 + - 1482 + - 1560 + - 1638 + - 1716 + - 1794 + - 1872 + - 1950 + - 2028 + - 3276 + - 3354 + - 3432 + - 3978 + - 4368 + - 4446 + - 4524 + - 4602 + - 4680 + - 4758 + - 4836 + - 4914 + - 4992 + - 5070 + - 5148 + - 5226 + - 5304 + - 5382 + - 5460 + - 7020 + - 7098 + - 7176 + - 7254 + - 7332 + - 7410 + - 7488 + - 7566 + - 7644 + - 7722 + - 7800 + - 9126 + - 9204 + - 9828 + - 9906 + - 9984 + - 10000 +- - 73 + - 146 + - 219 + - 292 + - 584 + - 657 + - 949 + - 1022 + - 1095 + - 1168 + - 1241 + - 1314 + - 1387 + - 1460 + - 1533 + - 1606 + - 1679 + - 1752 + - 1825 + - 1898 + - 1971 + - 2044 + - 2117 + - 2190 + - 2263 + - 2336 + - 2409 + - 2482 + - 2555 + - 2628 + - 2701 + - 2774 + - 2847 + - 2920 + - 2993 + - 3066 + - 3139 + - 3212 + - 3285 + - 3358 + - 3431 + - 3504 + - 3577 + - 3650 + - 3723 + - 3796 + - 3869 + - 3942 + - 4015 + - 4088 + - 4161 + - 4234 + - 4307 + - 4380 + - 4453 + - 4526 + - 4599 + - 4672 + - 4745 + - 4818 + - 4891 + - 4964 + - 5037 + - 5110 + - 5183 + - 5256 + - 5329 + - 5402 + - 5475 + - 5548 + - 5621 + - 5694 + - 5767 + - 5840 + - 5913 + - 5986 + - 6059 + - 6132 + - 6205 + - 6278 + - 6351 + - 6424 + - 6497 + - 6570 + - 6643 + - 6716 + - 10000 +- - 61 + - 122 + - 183 + - 244 + - 305 + - 366 + - 427 + - 488 + - 549 + - 610 + - 671 + - 732 + - 793 + - 854 + - 915 + - 976 + - 1037 + - 1098 + - 1159 + - 1220 + - 2074 + - 2135 + - 2196 + - 2257 + - 2318 + - 2379 + - 2440 + - 2806 + - 2867 + - 2928 + - 2989 + - 3233 + - 3294 + - 3355 + - 3599 + - 3660 + - 3782 + - 3843 + - 4087 + - 4148 + - 4209 + - 4270 + - 4331 + - 4392 + - 4697 + - 4758 + - 4819 + - 4880 + - 5246 + - 5368 + - 5429 + - 5612 + - 5673 + - 5734 + - 5795 + - 5856 + - 6161 + - 6222 + - 6527 + - 6588 + - 6649 + - 6832 + - 6893 + - 7076 + - 7137 + - 7564 + - 7625 + - 7686 + - 7747 + - 7808 + - 7869 + - 8113 + - 8174 + - 8418 + - 8479 + - 8540 + - 8601 + - 8662 + - 8723 + - 8784 + - 9272 + - 9333 + - 9394 + - 9455 + - 9516 + - 9577 + - 9638 + - 9699 + - 9760 + - 9821 + - 9882 + - 9943 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.191869184925718 + - 7.871932791412348 + - 7.8067189320284385 + - 7.460734309668463 + - 7.834198884382476 + - 7.863338320459919 + - 7.644178501635524 + - 7.629806990642227 + - 7.727450922566778 + - 7.831733561205043 + - 7.582505688376755 + - 7.506769177933346 + - 7.549130866955261 + - !!python/tuple + - 5.1718962369318575 + - 7.551682432659042 + - 7.323409939595317 + - 6.112558823975738 + - 7.419598362018979 + - 7.521597914592428 + - 6.754514644676623 + - 6.7042180302968974 + - 7.045959825651089 + - 7.410968869448464 + - 6.5386803469590795 + - 6.273645228388588 + - 6.421884866302879 + - !!python/tuple + - 2.5778662479044976 + - 7.13690043991875 + - 6.391286115138557 + - 4.526386553760349 + - 6.848578556935664 + - 6.884072837495552 + - 5.615227182167515 + - 5.757057131529895 + - 6.012944525286632 + - 6.714811130018898 + - 5.127498717748567 + - 4.987792101398302 + - 5.228927484256992 + - !!python/tuple + - 1.0431492677363896 + - 6.819381216519631 + - 5.774397981810057 + - 3.591678049550474 + - 6.41460622147441 + - 6.367305526678525 + - 4.864822931629748 + - 5.144890209108976 + - 5.378329489529542 + - 6.2302191546563535 + - 4.194136755327678 + - 4.258682740028199 + - 4.452162197755205 + - !!python/tuple + - 0.21066979541791464 + - 5.696955303926333 + - 3.9701673790828296 + - 1.32055164981197 + - 4.774589901336183 + - 4.8754832441197244 + - 2.766858806861888 + - 3.6040828671759546 + - 3.848854591236611 + - 4.859593594661533 + - 1.5414634595531167 + - 2.3955127986430362 + - 2.4988928884138373 + - !!python/tuple + - 1.1642876386381875 + - 5.679708636268746 + - 3.956646065648522 + - 1.3252826683329348 + - 4.758343268181229 + - 4.859238043116257 + - 2.7550887451829458 + - 3.5931171326126274 + - 3.837696468645278 + - 4.845989450852878 + - 1.5336743666110328 + - 2.3858191032240152 + - 2.485373149824943 + - !!python/tuple + - 1.0404590017484325 + - 5.5633296489188755 + - 3.8415727668906445 + - 1.3486500167917133 + - 4.6176590804028566 + - 4.7329980061426316 + - 2.651980472923617 + - 3.5049252708824343 + - 3.7456927828227395 + - 4.736454895776044 + - 1.4724396903990864 + - 2.3082152508818883 + - 2.3770567917664946 + - !!python/tuple + - 0.5912321256870559 + - 4.657538833661267 + - 2.953157135984684 + - 1.4767502696244978 + - 3.5258971560533814 + - 3.752875743796757 + - 1.87534383363469 + - 2.82674952175003 + - 3.03613970876544 + - 3.886049795843449 + - 1.0945091099341255 + - 1.7352526915951298 + - 1.5726695175554473 + - !!python/tuple + - 0.9360567648023717 + - 4.590368914161709 + - 2.9108717602064793 + - 1.4619826014410706 + - 3.470021286514155 + - 3.6925928334946225 + - 1.843906311215481 + - 2.7897661515341956 + - 2.9904862416323255 + - 3.833121118698938 + - 1.139593550063506 + - 1.7239145917061416 + - 1.5642064233786535 + - !!python/tuple + - 1.2667496767172053 + - 3.5921668501849906 + - 2.265173907029463 + - 1.2698728562605202 + - 2.533075514618993 + - 2.7825215929203373 + - 1.3957570963923631 + - 2.228959205039407 + - 2.29596325330282 + - 3.0560460482537835 + - 1.6282650680968154 + - 1.5615831132239808 + - 1.4500776987343524 + - !!python/tuple + - 1.031027054219218 + - 3.4428911580045005 + - 2.1753878580215407 + - 1.3198145049758954 + - 2.415512048107366 + - 2.634568847037153 + - 1.4325923365853124 + - 2.165500817051962 + - 2.2110727804042516 + - 2.9397407714208743 + - 1.4801563448709185 + - 1.5702049249044552 + - 1.4775809919280416 + - !!python/tuple + - 0.6371964206194496 + - 2.650079865552195 + - 1.807036413677902 + - 1.3831632648617755 + - 1.855930666727501 + - 1.8991760351630598 + - 1.541998977109571 + - 1.8055634042174142 + - 1.849895650987842 + - 2.2263396379031697 + - 1.039884811168611 + - 1.551027649127654 + - 1.479285066414201 + - !!python/tuple + - 1.117909848798969 + - 2.587621985449468 + - 1.8252253598533832 + - 1.3340207397552588 + - 1.8878117242290475 + - 1.8962588160763567 + - 1.5161318838968507 + - 1.7392456928817237 + - 1.829111522109903 + - 2.162730865105168 + - 1.1820873526231188 + - 1.4936066504160457 + - 1.4313172646265377 + - !!python/tuple + - 0.9585438631907264 + - 2.5122863338549877 + - 1.8302631276485182 + - 1.2875512939586804 + - 1.8903401264732949 + - 1.8910940397086677 + - 1.4843796132263243 + - 1.6883965275517616 + - 1.771961598153313 + - 2.090875856645274 + - 1.277843515307558 + - 1.429185441959004 + - 1.390100028387664 + - !!python/tuple + - 0.9308011808543412 + - 2.124623078090164 + - 1.827132322468163 + - 1.2234852559346805 + - 1.8635556592303142 + - 1.7292281561508729 + - 1.3904074629061267 + - 1.501083973345493 + - 1.537274496575331 + - 1.8445899630280176 + - 1.3720455038697363 + - 1.3414969577007971 + - 1.3560763146747283 + - !!python/tuple + - 0.9736741164235162 + - 2.1271350837447676 + - 1.7274657659211052 + - 1.2616277724196963 + - 1.7370837601242624 + - 1.7540827355562798 + - 1.4517102866913332 + - 1.5396493607498754 + - 1.617220912188938 + - 1.8471756654755602 + - 1.2757324980605491 + - 1.3714489824604654 + - 1.3887126617333587 + - !!python/tuple + - 0.94236072804242 + - 2.107590536200356 + - 1.7169359063929257 + - 1.2505994549073716 + - 1.7638017609471466 + - 1.7678243597588477 + - 1.4376267451550189 + - 1.5443474096506684 + - 1.5925469569116097 + - 1.8283714717255433 + - 1.2783011567646783 + - 1.3663921801413794 + - 1.3874186931102734 + - !!python/tuple + - 0.9654711134289665 + - 2.081017332449028 + - 1.704553588256434 + - 1.2445494352440485 + - 1.7957251965501737 + - 1.7843363433763844 + - 1.424953822177503 + - 1.54913739178411 + - 1.5658466365336199 + - 1.8049352927624887 + - 1.2798375798250639 + - 1.3624391977799357 + - 1.3863653522739194 + - !!python/tuple + - 0.9449070215050793 + - 2.0672851235381255 + - 1.6996713608404757 + - 1.2447349530321905 + - 1.8092729037920618 + - 1.7913195703577462 + - 1.424455081625404 + - 1.5399785882627823 + - 1.5740662075811858 + - 1.7946544691773048 + - 1.2804820325976962 + - 1.3616403685245753 + - 1.3765104494582543 + - !!python/tuple + - 0.9572880571760338 + - 2.054454688082416 + - 1.695766789201209 + - 1.244796391464635 + - 1.820751365487323 + - 1.7971923235171003 + - 1.4218685287273294 + - 1.5452436844316577 + - 1.5614758481163202 + - 1.7859556406108115 + - 1.2800590713853066 + - 1.3615314281191908 + - 1.3818728210375437 + - !!python/tuple + - 0.9500010326660243 + - 2.0457979547840837 + - 1.6935564239527632 + - 1.244807911861191 + - 1.8277626953200912 + - 1.8007380051304285 + - 1.4227119469965404 + - 1.5383216937821595 + - 1.5702029553116124 + - 1.7807157670881848 + - 1.2805079835854207 + - 1.3612502156591084 + - 1.3751032885729928 + - !!python/tuple + - 0.9526447479744025 + - 2.038865886922181 + - 1.6920081911067955 + - 1.244811935668932 + - 1.8329943216318612 + - 1.803355650999157 + - 1.421433586967406 + - 1.5428137458511515 + - 1.5617959855164387 + - 1.7768741496004576 + - 1.2801742144956985 + - 1.3613412980694684 + - 1.379765331932944 + - !!python/tuple + - 0.9520641754321391 + - 2.0345070940639056 + - 1.69114635508415 + - 1.2448131545561516 + - 1.8360896985449484 + - 1.8048878069283893 + - 1.4221252152087076 + - 1.5386833600959482 + - 1.5676114583998813 + - 1.7746467740758773 + - 1.2804322685800444 + - 1.3612129281520753 + - 1.375851781607098 + - !!python/tuple + - 0.9520366583252405 + - 2.0313578842769084 + - 1.6905730732269357 + - 1.2448137184639212 + - 1.8382384405797645 + - 1.8059431040598266 + - 1.4215176116691655 + - 1.5412192414363552 + - 1.5631806503384325 + - 1.773124627775289 + - 1.2802624789158528 + - 1.3612752567651374 + - 1.3783637539299485 + - !!python/tuple + - 0.952032091514914 + - 2.0294078189274334 + - 1.690240033880606 + - 1.2448139694707803 + - 1.8395294209141992 + - 1.8065731515342616 + - 1.421875896540615 + - 1.5391929812263756 + - 1.5661422403105285 + - 1.7722219755888386 + - 1.2803825798817807 + - 1.361217801765003 + - 1.3764972039315146 + - !!python/tuple + - 0.9520303869886799 + - 2.0280135198294746 + - 1.6900114978327485 + - 1.2448141160150445 + - 1.8404349228221821 + - 1.8070132328129418 + - 1.4215968339016265 + - 1.540430682521199 + - 1.5640249212201278 + - 1.7715943999826693 + - 1.2803044144560747 + - 1.361248717480336 + - 1.3776873523423836 + - !!python/tuple + - 0.9520297010329161 + - 2.027142674158879 + - 1.6898730278869467 + - 1.2448141950539229 + - 1.8409925866920929 + - 1.8072834143352008 + - 1.4217666484292042 + - 1.5394830471287553 + - 1.5654301300160591 + - 1.7712104791139154 + - 1.2803590423838986 + - 1.3612227896089522 + - 1.376827217456252 + - !!python/tuple + - 0.952029321920435 + - 2.026519274309927 + - 1.6897758004771688 + - 1.244814246687894 + - 1.8413882575203375 + - 1.80747472593672 + - 1.4216393138336256 + - 1.5400617894103386 + - 1.5644478521004193 + - 1.7709392614358923 + - 1.2803234651323911 + - 1.361237247010257 + - 1.3773758680048556 + - !!python/tuple + - 0.9520292441854984 + - 2.026365953150979 + - 1.6897522215913545 + - 1.2448142585771858 + - 1.8414849453028659 + - 1.8075214066405247 + - 1.4216700061691945 + - 1.5398912397269156 + - 1.564702296532655 + - 1.7708731968855085 + - 1.2803331684787953 + - 1.361232650958698 + - 1.377222149885089 + - !!python/tuple + - 0.952029188826974 + - 2.0262520874733014 + - 1.6897347707975203 + - 1.2448142672677955 + - 1.841556638001907 + - 1.8075560071532306 + - 1.4216471763066596 + - 1.5399962076553344 + - 1.5645241398450558 + - 1.7708242495416326 + - 1.2803268759423223 + - 1.361235240345751 + - 1.3773203311233042 + - !!python/tuple + - 0.9520291663138003 + - 2.0262043177462976 + - 1.689727468513151 + - 1.2448142708709344 + - 1.841586679613151 + - 1.8075705019738133 + - 1.421656784668154 + - 1.5399428503877621 + - 1.5646038288961999 + - 1.7708037510623718 + - 1.2803299042140146 + - 1.3612338063047 + - 1.377272302411646 + - !!python/tuple + - 0.9520291497472922 + - 2.026168707815028 + - 1.689722030897899 + - 1.2448142735436443 + - 1.8416090630544246 + - 1.8075813005603343 + - 1.4216496514611079 + - 1.539975712543806 + - 1.5645480695094134 + - 1.7707884818099229 + - 1.2803279407569759 + - 1.3612346159500954 + - 1.3773029846638487 + - !!python/tuple + - 0.9520291428756104 + - 2.0261537938396605 + - 1.6897197553756211 + - 1.2448142746588948 + - 1.8416184341194881 + - 1.8075858211179676 + - 1.4216526557154407 + - 1.5399590324885706 + - 1.56457298941988 + - 1.7707820903567904 + - 1.280328886696054 + - 1.3612341680279378 + - 1.3772879765199355 + - !!python/tuple + - 0.952029137767707 + - 2.0261426631041535 + - 1.6897180576595585 + - 1.2448142754899552 + - 1.841625426938621 + - 1.80758919430056 + - 1.4216504266979269 + - 1.5399693077352012 + - 1.564555556273646 + - 1.770777321334896 + - 1.2803282734039962 + - 1.361234421086611 + - 1.3772975647766466 + - !!python/tuple + - 0.9520291345632292 + - 2.0261356591236357 + - 1.6897169896459812 + - 1.244814276012295 + - 1.8416298266407325 + - 1.8075913165638076 + - 1.4216518382286107 + - 1.539961471177728 + - 1.5645672652577072 + - 1.7707743209623783 + - 1.2803287177139118 + - 1.3612342107004816 + - 1.3772905146133951 + - !!python/tuple + - 0.9520291321761181 + - 2.026130431767036 + - 1.6897161926701472 + - 1.2448142764018562 + - 1.8416331100797088 + - 1.8075929003539821 + - 1.4216507912026464 + - 1.5399662985957292 + - 1.5645590754751162 + - 1.7707720819059076 + - 1.2803284296381388 + - 1.3612343295894433 + - 1.3772950188031658 + - !!python/tuple + - 0.9520291321553722 + - 2.0261303862729485 + - 1.6897161857348253 + - 1.2448142764052448 + - 1.8416331386541833 + - 1.807592914136911 + - 1.421650800373194 + - 1.539966247683958 + - 1.5645591515485773 + - 1.7707720624208116 + - 1.2803284325243596 + - 1.361234328222795 + - 1.37729497300312 + - !!python/tuple + - 0.9520291321398812 + - 2.0261303523019794 + - 1.6897161805561445 + - 1.244814276407775 + - 1.8416331599910687 + - 1.8075929244287796 + - 1.4216507935709652 + - 1.539966279049471 + - 1.5645590983356568 + - 1.770772047871072 + - 1.2803284306531357 + - 1.3612343289951334 + - 1.377295002264208 + - !!python/tuple + - 0.9520291321301331 + - 2.0261303309247425 + - 1.689716177297309 + - 1.2448142764093673 + - 1.8416331734179299 + - 1.8075929309052394 + - 1.421650797880124 + - 1.539966255126487 + - 1.5645591340819043 + - 1.770772038715223 + - 1.280328432009344 + - 1.3612343283529582 + - 1.3772949807431862 + - !!python/tuple + - 0.9520291321228541 + - 2.026130314962108 + - 1.6897161748638994 + - 1.244814276410556 + - 1.841633183443923 + - 1.807592935741287 + - 1.4216507946838197 + - 1.5399662698648595 + - 1.5645591090776363 + - 1.7707720318784452 + - 1.2803284311300733 + - 1.361234328715873 + - 1.3772949944927038 + - !!python/tuple + - 0.9520291321208282 + - 2.0261303105193322 + - 1.6897161741866245 + - 1.244814276410887 + - 1.841633186234392 + - 1.8075929370872723 + - 1.4216507955793818 + - 1.5399662648930044 + - 1.5645591165066923 + - 1.7707720299756098 + - 1.2803284314119308 + - 1.3612343285824113 + - 1.3772949900200433 + - !!python/tuple + - 0.9520291321193154 + - 2.026130307201856 + - 1.689716173680895 + - 1.244814276411134 + - 1.8416331883180697 + - 1.8075929380923361 + - 1.4216507949151018 + - 1.5399662679560446 + - 1.5645591113101158 + - 1.770772028554739 + - 1.2803284312291943 + - 1.361234328657835 + - 1.3772949928775715 + - !!python/tuple + - 0.9520291321186823 + - 2.026130305813489 + - 1.6897161734692467 + - 1.2448142764112375 + - 1.841633189190091 + - 1.8075929385129565 + - 1.421650795194965 + - 1.53996626640234 + - 1.564559113631696 + - 1.7707720279601031 + - 1.2803284313172747 + - 1.3612343286161281 + - 1.3772949914798651 + - !!python/tuple + - 0.9520291321182096 + - 2.026130304776778 + - 1.6897161733112063 + - 1.2448142764113148 + - 1.8416331898412404 + - 1.807592938827039 + - 1.4216507949873776 + - 1.53996626735954 + - 1.5645591120077658 + - 1.770772027516081 + - 1.2803284312601695 + - 1.361234328639698 + - 1.3772949923728426 + - !!python/tuple + - 0.9520291321181849 + - 2.0261303047225447 + - 1.6897161733029387 + - 1.2448142764113188 + - 1.8416331898753038 + - 1.8075929388434695 + - 1.4216507949983097 + - 1.5399662672988483 + - 1.5645591120984526 + - 1.7707720274928531 + - 1.28032843126361 + - 1.3612343286380688 + - 1.3772949923182447 + - !!python/tuple + - 0.9520291321181664 + - 2.0261303046820482 + - 1.6897161732967652 + - 1.244814276411322 + - 1.8416331899007392 + - 1.8075929388557384 + - 1.4216507949902009 + - 1.539966267336239 + - 1.5645591120350177 + - 1.7707720274755085 + - 1.2803284312613794 + - 1.3612343286389894 + - 1.3772949923531266 + - !!python/tuple + - 0.9520291321181586 + - 2.0261303046651005 + - 1.6897161732941817 + - 1.2448142764113233 + - 1.841633189911384 + - 1.807592938860873 + - 1.4216507949936172 + - 1.539966267317273 + - 1.5645591120633573 + - 1.77077202746825 + - 1.2803284312624545 + - 1.3612343286384803 + - 1.3772949923360647 + - !!python/tuple + - 0.9520291321181529 + - 2.0261303046524453 + - 1.6897161732922525 + - 1.2448142764113241 + - 1.8416331899193326 + - 1.807592938864707 + - 1.4216507949910833 + - 1.5399662673289576 + - 1.5645591120435338 + - 1.7707720274628298 + - 1.2803284312617575 + - 1.361234328638768 + - 1.3772949923469653 + - !!python/tuple + - 0.9520291321181529 + - 2.0261303046524453 + - 1.6897161732922525 + - 1.2448142764113241 + - 1.8416331899193326 + - 1.807592938864707 + - 1.4216507949910833 + - 1.5399662673289576 + - 1.5645591120435338 + - 1.7707720274628298 + - 1.2803284312617575 + - 1.361234328638768 + - 1.3772949923469653 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.257793360802375 + - 8.007193137168198 + - 8.007193137168198 + - 7.424888748849529 + - 8.007193137168198 + - 8.007193137168198 + - 7.390589867411103 + - 7.446076542257198 + - 8.007193137168198 + - 7.781766514153568 + - 8.007193137168198 + - 7.807766074446164 + - 7.378556612486996 + - !!python/tuple + - 5.235522419306658 + - 8.026797739009412 + - 7.8199205622426 + - 5.901416686876583 + - 8.026797739009412 + - 7.413369418988028 + - 6.375074060548251 + - 5.936695438313705 + - 8.026797739009412 + - 7.2876930084793985 + - 7.827612804246285 + - 7.283876769927222 + - 5.9525425171530655 + - !!python/tuple + - 2.437373693802717 + - 8.054088439625456 + - 7.559277824508498 + - 4.386019834312601 + - 6.837282553583822 + - 6.587250321367577 + - 4.720514414485305 + - 5.33519282535385 + - 7.944761041230122 + - 6.600613638521815 + - 6.402324878239453 + - 7.085459807059287 + - 4.577034842653646 + - !!python/tuple + - 0.6567860417501097 + - 8.0728954123848 + - 7.379835848234638 + - 3.3629815502862157 + - 6.019124157102684 + - 6.0199820568496 + - 3.767284412774852 + - 4.860173481703023 + - 7.3348884524416285 + - 6.438813906931253 + - 5.582305311745483 + - 6.7037952461646295 + - 4.182076439734816 + - !!python/tuple + - 1.286984848542763 + - 8.086902484281442 + - 7.24635236244281 + - 2.6307421496787535 + - 5.41259572170601 + - 5.599667749617796 + - 3.0773716909254167 + - 4.511309349160756 + - 7.351855996393168 + - 6.0869361057453535 + - 5.090055901497222 + - 6.420339110270726 + - 3.2625923286044403 + - !!python/tuple + - 0.26356722241160013 + - 8.10218315379372 + - 6.9797312083806125 + - 2.005214226621077 + - 4.755148553402759 + - 5.038116106465227 + - 2.3572247849073213 + - 4.190200026297834 + - 6.854945074145846 + - 5.958435075156517 + - 4.177125464551361 + - 6.312978566480178 + - 3.238999916205504 + - !!python/tuple + - 1.2139795849319392 + - 8.10331714027253 + - 6.969007277622265 + - 1.9574340797608416 + - 4.706925704107147 + - 5.004719548250999 + - 2.309116690686456 + - 4.162839670614871 + - 6.8181364758611185 + - 5.948950468776983 + - 4.129539509355514 + - 6.29007511162482 + - 3.2184424353628276 + - !!python/tuple + - 0.9783870292559098 + - 8.107096581820949 + - 6.933271381198914 + - 1.8011939095804985 + - 4.546385754584665 + - 4.893512570480587 + - 2.1506136881318416 + - 4.071811754827431 + - 6.695480647645166 + - 5.917352865986033 + - 3.971226489783705 + - 6.213764692614028 + - 3.1502107846646696 + - !!python/tuple + - 0.5036688597005105 + - 8.120306759433618 + - 6.8288472456077525 + - 1.380968407990622 + - 4.07338264761903 + - 4.56657684366395 + - 1.7234528331628978 + - 3.569385658139043 + - 6.331026047039056 + - 5.826367260740904 + - 3.507900109451495 + - 5.716740894916425 + - 2.8937809100454 + - !!python/tuple + - 0.9650953587004478 + - 8.12328387460709 + - 6.805362766870072 + - 1.328383707526306 + - 3.9687702636086 + - 4.493872411069188 + - 1.6505185967862066 + - 3.459354854771346 + - 6.249141429793122 + - 5.805971856141001 + - 3.406647247866961 + - 5.6052861678480586 + - 2.8394632276342278 + - !!python/tuple + - 0.4721546948839117 + - 8.137711031671845 + - 6.69161421228085 + - 1.1136749286849483 + - 3.464509480616784 + - 4.142776075086467 + - 1.3257705934599873 + - 2.930581443445926 + - 5.852662523266677 + - 5.707260227644927 + - 2.920281397618572 + - 5.065948286794455 + - 2.5804368412664647 + - !!python/tuple + - 0.939509346178317 + - 8.104415207934624 + - 6.657278712164442 + - 1.1925905967032335 + - 3.385893708545483 + - 4.05899332828545 + - 1.3042977051134408 + - 2.906111896859464 + - 5.788999698684251 + - 5.69143194677019 + - 2.806319193493968 + - 5.023674898681819 + - 2.5805508502152907 + - !!python/tuple + - 0.5544304676710026 + - 7.846196991606588 + - 6.515480477598269 + - 1.5583231285514025 + - 2.780538491995901 + - 3.520268129024468 + - 1.1602722206905394 + - 2.663171031253386 + - 5.295765149566625 + - 5.568813180299965 + - 2.1957528268464666 + - 4.490218232483034 + - 2.321002434837285 + - !!python/tuple + - 0.8894795334894928 + - 7.806180578135249 + - 6.493586572521434 + - 1.5067660058331607 + - 2.804635433237117 + - 3.4401111206468915 + - 1.16672188933754 + - 2.502701309081914 + - 5.302408119812347 + - 5.509414553086773 + - 2.2015955805001926 + - 4.392976000692583 + - 2.1624167729278927 + - !!python/tuple + - 0.5922313320178519 + - 7.471829783121807 + - 6.310761086358925 + - 1.1203061325685502 + - 3.002682688442855 + - 2.775777458529821 + - 1.2078944874619775 + - 1.1899487794993169 + - 4.669144524470581 + - 5.352996279824716 + - 2.081521603312453 + - 3.5833104370010327 + - 1.8056093082421458 + - !!python/tuple + - 1.0441451099461045 + - 7.402855985282762 + - 6.239593952477843 + - 1.2828601344021835 + - 2.8466101715457204 + - 2.6230746110569325 + - 1.2005162152546656 + - 1.3294651371651935 + - 4.540921203565704 + - 5.321133356670035 + - 1.879075135025158 + - 3.507178367303875 + - 1.8565122746877054 + - !!python/tuple + - 0.7489721282878019 + - 7.4140087509969215 + - 5.967606672804736 + - 1.2856200370444377 + - 2.6048140655464684 + - 2.1639751962465086 + - 1.1691466809365327 + - 1.52812765171847 + - 4.570562230691422 + - 5.035775550599865 + - 1.6672180981378073 + - 3.389410575306724 + - 1.6207542755063677 + - !!python/tuple + - 0.9401426820177824 + - 7.343963122710187 + - 5.7990783351651976 + - 1.4178792417723587 + - 2.463310631568253 + - 1.8730782717153236 + - 1.2117571764748116 + - 1.5995174675207628 + - 4.441507672419029 + - 5.006362131959328 + - 1.5152223950243386 + - 3.3182331726240086 + - 1.7159147780912867 + - !!python/tuple + - 0.5042942329338521 + - 7.374029005846078 + - 5.23150896328396 + - 1.1004030464544101 + - 1.8889234911496122 + - 1.0102228228112131 + - 1.107752929453518 + - 1.7772298171580385 + - 3.896468122248538 + - 4.565626128942086 + - 1.3587243071075719 + - 2.7766855446748266 + - 1.704618437954103 + - !!python/tuple + - 1.0378305000586003 + - 7.33705272759979 + - 5.162450148580736 + - 1.1453484870236827 + - 1.9453170538776021 + - 1.0266552914582237 + - 1.1470395499516859 + - 1.6644616184673453 + - 3.909721177627216 + - 4.513468122756498 + - 1.434778545359945 + - 2.7021540127448103 + - 1.5913148700529889 + - !!python/tuple + - 0.7869925705911747 + - 7.206290079401263 + - 4.918684793280245 + - 1.2591928547951852 + - 2.1335420879561964 + - 1.0626620750675466 + - 1.247032007573683 + - 1.2968576355352044 + - 3.9563191048992707 + - 4.329624536794635 + - 1.6641887408673754 + - 2.4434811287827105 + - 1.2263737785865012 + - !!python/tuple + - 0.9060264943936497 + - 7.141105681226228 + - 4.765663607608705 + - 1.392135011611423 + - 2.0268607320533034 + - 1.029873994733693 + - 1.2553643153835745 + - 1.4229667328574267 + - 3.8412311802824646 + - 4.307051383240766 + - 1.5223861160447663 + - 2.405526824295988 + - 1.4167366266732473 + - !!python/tuple + - 0.7940455294777911 + - 7.15317283263363 + - 4.5590728957485425 + - 1.28308156010402 + - 1.857264230318083 + - 1.1072173384694073 + - 1.1872860233091083 + - 1.5537940868116156 + - 3.6449052964217 + - 4.148416378126679 + - 1.4604800615675169 + - 2.2504708552830235 + - 1.5100403669276188 + - !!python/tuple + - 0.8943873514705213 + - 7.111844950784724 + - 4.484380387880511 + - 1.2665464546065044 + - 1.9320753655933574 + - 1.1116842157773719 + - 1.1976916040555072 + - 1.4595034245029843 + - 3.664329406784585 + - 3.9929940802620987 + - 1.5439133616637066 + - 2.1867065390513494 + - 1.3978769238695272 + - !!python/tuple + - 0.9098152778322353 + - 7.06522833835529 + - 4.376916376928088 + - 1.3418618465259498 + - 1.8756820752091343 + - 1.0942640792244531 + - 1.2058680090676603 + - 1.5339683550619323 + - 3.585813529034761 + - 3.8681382155837816 + - 1.4695518997685741 + - 2.1766765580037606 + - 1.4937095890020748 + - !!python/tuple + - 0.9134804131662347 + - 7.01149166131919 + - 4.2808753147716585 + - 1.3027775512054707 + - 1.971346940119461 + - 1.1066281073587598 + - 1.2121376857148416 + - 1.414617572863731 + - 3.4962667251372155 + - 3.7253610454433317 + - 1.5483280563092043 + - 2.098094926236079 + - 1.5061496250246518 + - !!python/tuple + - 0.9141868484890804 + - 6.918837371484405 + - 4.116335395815863 + - 1.3865695023832578 + - 1.8527157287103786 + - 1.1171978854991165 + - 1.2188431900430334 + - 1.559802366064048 + - 3.3439149611636174 + - 3.481740172995151 + - 1.4976836531576654 + - 2.010635467257737 + - 1.5576356517626018 + - !!python/tuple + - 0.9140395112497278 + - 6.8820730649457555 + - 4.0518522096940055 + - 1.3515279300431091 + - 1.9201600667877579 + - 1.1178462211452933 + - 1.2197841305861226 + - 1.4744752324393404 + - 3.3646188832619273 + - 3.3479529459034385 + - 1.5672079117450815 + - 1.9649867756502086 + - 1.4509020296392934 + - !!python/tuple + - 0.9139678856007093 + - 6.836756265365718 + - 3.9496961753226474 + - 1.403664874137626 + - 1.8658282042873484 + - 1.0982262342861249 + - 1.2206489423366071 + - 1.544766030111264 + - 3.2916066365523533 + - 3.2331227856192 + - 1.4907706477984846 + - 1.969401403215243 + - 1.5343572676637738 + - !!python/tuple + - 0.913957073771639 + - 6.809604999310154 + - 3.9027942516161307 + - 1.375543569528212 + - 1.9150962872466641 + - 1.103495375928603 + - 1.2210047215041724 + - 1.4829282248785838 + - 3.3074370811740263 + - 3.1362626017580792 + - 1.5429903680740849 + - 1.9373765716367222 + - 1.4574421234822654 + - !!python/tuple + - 0.913916165418308 + - 6.623253528530895 + - 3.582363629548103 + - 1.2070316021262641 + - 2.236417744763181 + - 1.13039007989132 + - 1.2229883750532249 + - 1.100094133322849 + - 3.0099694172569005 + - 2.6773818471002033 + - 1.7681139031928257 + - 1.727466134797447 + - 1.5276147794633805 + - !!python/tuple + - 0.9139452095843495 + - 6.560365707109033 + - 3.445896295233734 + - 1.3358415272391242 + - 2.1316386957893845 + - 1.0957912814956654 + - 1.22279161357512 + - 1.3455209046693397 + - 2.9163960794333077 + - 2.5364745683505725 + - 1.6259228688499074 + - 1.7641670060338084 + - 1.626027762492593 + - !!python/tuple + - 0.9139439428697428 + - 6.505792438824999 + - 3.357531510104439 + - 1.376060148932618 + - 2.0474819168028153 + - 1.107793379543075 + - 1.222695443313856 + - 1.450977632621504 + - 2.9574056587008957 + - 2.3603444075308992 + - 1.6111059918505208 + - 1.7445361967292536 + - 1.4739428371751044 + - !!python/tuple + - 0.9139434958045306 + - 6.282922598983458 + - 3.002170137935328 + - 1.4946244981360182 + - 1.729301003043509 + - 1.1313011031827975 + - 1.2224519576815602 + - 1.772238534677891 + - 2.629676516085715 + - 1.915431612962903 + - 1.4412044664838957 + - 1.6745499893493148 + - 1.6282048119946062 + - !!python/tuple + - 0.9139438572647264 + - 6.217905242535401 + - 2.9067244458929626 + - 1.400337985253044 + - 1.870148003345391 + - 1.1241192001057259 + - 1.222492386125693 + - 1.5779791131354026 + - 2.690585889630486 + - 1.7520788136146763 + - 1.5827023182951392 + - 1.6375159996088837 + - 1.4192923896479916 + - !!python/tuple + - 0.9139437887951702 + - 6.099287007925717 + - 2.7377004471812874 + - 1.2757732363973708 + - 2.0906232703510548 + - 1.1186943201988815 + - 1.2225322713931257 + - 1.2865118243648004 + - 2.47576740041928 + - 1.7045975783113103 + - 1.6738123119419552 + - 1.5822958973940973 + - 1.5280098774395976 + - !!python/tuple + - 0.9139438264723986 + - 6.035725813437276 + - 2.652793825846329 + - 1.3461992646477976 + - 1.9938948696610654 + - 1.1189682070019942 + - 1.222535625991809 + - 1.433826119833141 + - 2.5133089426207516 + - 1.6162045174036275 + - 1.6256152084048063 + - 1.591374661858747 + - 1.390689382122432 + - !!python/tuple + - 0.9139438226529834 + - 5.964150159001284 + - 2.5609034369530748 + - 1.3963698478834767 + - 1.8952523697360182 + - 1.1190939027966524 + - 1.22253769141453 + - 1.5449659585684237 + - 2.3918200447204643 + - 1.6140885271787784 + - 1.5419860468795274 + - 1.5994999444357023 + - 1.4943924998161484 + - !!python/tuple + - 0.9448182209271692 + - 5.899320581181588 + - 2.5218795577220665 + - 1.372775628653956 + - 1.9670488911563204 + - 1.1300090214004912 + - 1.2397931077426863 + - 1.472064500895566 + - 2.4199816922768016 + - 1.5838717676915044 + - 1.558814210796434 + - 1.5971222670779193 + - 1.4201508130433027 + - !!python/tuple + - 0.9518977401770593 + - 5.857798207800918 + - 2.497610864284782 + - 1.3943124591613687 + - 1.9410902451244183 + - 1.1344753908859726 + - 1.2478098677422556 + - 1.5112185474759767 + - 2.3861536607441516 + - 1.5921546583462889 + - 1.5146638703128334 + - 1.6057665829337004 + - 1.458069505785357 + - !!python/tuple + - 0.9525286494746112 + - 5.85175893154697 + - 2.494149378087455 + - 1.397057636836055 + - 1.9374763565414426 + - 1.1349776110288503 + - 1.2487767701718848 + - 1.516353287370777 + - 2.3813430848833983 + - 1.5932615512440165 + - 1.508819065855783 + - 1.6069243736205154 + - 1.4629796228722098 + - !!python/tuple + - 0.9529330907234053 + - 5.84765932661419 + - 2.491806366752276 + - 1.3955508493774547 + - 1.9418397174978177 + - 1.1353073518710135 + - 1.2494170006154715 + - 1.5119845728913057 + - 2.3831569386666525 + - 1.591507860352508 + - 1.5101940395137352 + - 1.6067143396929926 + - 1.4585827252444656 + - !!python/tuple + - 0.9532278111087263 + - 5.844554791690835 + - 2.4900355207084846 + - 1.3969512787088127 + - 1.9399786792421703 + - 1.1355515044294568 + - 1.2498937607614458 + - 1.5146196882397778 + - 2.3806885098579813 + - 1.5920810754373582 + - 1.5072203165092892 + - 1.6073040768349265 + - 1.4611037219450103 + - !!python/tuple + - 0.9534229657119011 + - 5.842438675475029 + - 2.4888302629111947 + - 1.3961739476252903 + - 1.9422257801283902 + - 1.1357151234527552 + - 1.2502146387049504 + - 1.5123724394279363 + - 2.3816258667467407 + - 1.5911805445629306 + - 1.5079381338281315 + - 1.6071940840107992 + - 1.4588436496901045 + - !!python/tuple + - 0.9535682983941731 + - 5.840831551759109 + - 2.4879158335455185 + - 1.3968961157691882 + - 1.9412614985048133 + - 1.1358379622893369 + - 1.2504562457600745 + - 1.5137354029110863 + - 2.380349223482191 + - 1.5914783861061181 + - 1.5064068389248544 + - 1.6074979516438745 + - 1.4601478861305917 + - !!python/tuple + - 0.9537431124095074 + - 5.838869463565505 + - 2.4868002936288716 + - 1.396175574969837 + - 1.943342594993721 + - 1.1359866270683014 + - 1.250749296691963 + - 1.5116554113927814 + - 2.3787919918163345 + - 1.5918408758741427 + - 1.5064869613090006 + - 1.607395217550528 + - 1.4613175458325942 + - !!python/tuple + - 0.9538860482179599 + - 5.8372357528285965 + - 2.4858723254510253 + - 1.3969097874368974 + - 1.9423602314022514 + - 1.136109096065563 + - 1.2509913645948396 + - 1.513043830381367 + - 2.379517664923351 + - 1.5911462557506244 + - 1.5054263387551023 + - 1.607703523702575 + - 1.4599179458603584 + - !!python/tuple + - 0.9539624073779915 + - 5.83634971273035 + - 2.48536943823215 + - 1.3965843229875075 + - 1.9432990859386827 + - 1.1361749295368262 + - 1.2511217821379674 + - 1.5121058252631445 + - 2.379910876537975 + - 1.5907707257704804 + - 1.5057307030261224 + - 1.607656773800983 + - 1.458974048307266 + - !!python/tuple + - 0.9540199640192915 + - 5.835676377951693 + - 2.4849874382395 + - 1.3968861514929531 + - 1.9428941951571792 + - 1.136224718945145 + - 1.2512205362236481 + - 1.5126774191843206 + - 2.379376556207697 + - 1.5908960904870562 + - 1.5050924548287292 + - 1.607783516241516 + - 1.459520390274628 + - !!python/tuple + - 0.9540900322730211 + - 5.834851582051938 + - 2.4845196619498315 + - 1.3965832217382166 + - 1.9437677293615463 + - 1.1362854858610238 + - 1.2513411749888719 + - 1.5118048932708692 + - 2.3787222886866526 + - 1.5910494537681317 + - 1.5051286816178397 + - 1.6077398680797057 + - 1.4600135079028704 + - !!python/tuple + - 0.9541481066147737 + - 5.834162761919523 + - 2.484129158190485 + - 1.3968920125350663 + - 1.9433531503339658 + - 1.1363360082832739 + - 1.2514415894439475 + - 1.5123901475067316 + - 2.379028331604093 + - 1.5907576158041743 + - 1.5046836110453883 + - 1.6078694230200847 + - 1.4594256050931702 + - !!python/tuple + - 0.9543105518349783 + - 5.833677517223131 + - 2.483973237216386 + - 1.3968415580248323 + - 1.9437148942971476 + - 1.1364378611014134 + - 1.25156605060224 + - 1.512116018025632 + - 2.3788039121581708 + - 1.590864544914234 + - 1.5046859200691705 + - 1.6079009725875952 + - 1.4596697225036572 + - !!python/tuple + - 0.9544769347056963 + - 5.833178949262526 + - 2.4838130615054195 + - 1.3970498024477682 + - 1.9435565850543708 + - 1.1365423170624154 + - 1.251693752569882 + - 1.5124427885429705 + - 2.3789682592751022 + - 1.5907798540454063 + - 1.504468065043785 + - 1.6080102643944167 + - 1.4594574794125865 + - !!python/tuple + - 0.9547184595435261 + - 5.832452883114008 + - 2.4835798365283206 + - 1.396974069193151 + - 1.944097760248263 + - 1.1366941478341013 + - 1.2518794617163969 + - 1.512032538044761 + - 2.379207551991106 + - 1.5906566027193727 + - 1.5046114148750578 + - 1.6080573344619449 + - 1.4590500483661983 + - !!python/tuple + - 0.9549253909351895 + - 5.831827886259073 + - 2.4833791261900173 + - 1.3972349590667574 + - 1.9438991159674512 + - 1.1368244823642684 + - 1.2520389900089144 + - 1.512442271578049 + - 2.3789184381040442 + - 1.5907944227896782 + - 1.5042181817699471 + - 1.6081942133290836 + - 1.4594498028702356 + - !!python/tuple + - 0.9551654349424584 + - 5.83109994885398 + - 2.483145407279326 + - 1.3971587494163231 + - 1.9444415155111072 + - 1.1369759227226828 + - 1.252224463573234 + - 1.5120309486010344 + - 2.3791583719065295 + - 1.5906708342405889 + - 1.5043622074409981 + - 1.608241225194613 + - 1.4590413162299414 + - !!python/tuple + - 0.9553709099153834 + - 5.830473909538769 + - 2.4829444544471215 + - 1.3974198457067672 + - 1.9442423673696403 + - 1.1371058035394537 + - 1.2523836444081262 + - 1.512441382933847 + - 2.3788687775431683 + - 1.5908088770241056 + - 1.5039685613077678 + - 1.6083781817536231 + - 1.45944176279531 + - !!python/tuple + - 0.9556089072109663 + - 5.8297458499457315 + - 2.4827108037106274 + - 1.397343342491272 + - 1.9447846872786525 + - 1.1372564903637794 + - 1.252568436562449 + - 1.5120299761467024 + - 2.3791087759724845 + - 1.5906852482556335 + - 1.5041129174691625 + - 1.608425022001073 + - 1.459033202481265 + - !!python/tuple + - 0.9558124504840573 + - 5.82912026150004 + - 2.482510087904449 + - 1.397604022378659 + - 1.9445855104953844 + - 1.1373856103702915 + - 1.2527268919746475 + - 1.512440131658487 + - 2.3788193920139977 + - 1.5908231843120149 + - 1.5037197977341927 + - 1.6085617295483563 + - 1.4594333852468726 + - !!python/tuple + - 0.9560478646202047 + - 5.828393799195181 + - 2.482277056926769 + - 1.3975274079976006 + - 1.9451264704631743 + - 1.1375351940924703 + - 1.2529105712033155 + - 1.5120296131411177 + - 2.379058888134058 + - 1.5906998074867793 + - 1.5038641419803143 + - 1.6086082883802397 + - 1.4590257166131204 + - !!python/tuple + - 0.9562490274533533 + - 5.827770124512335 + - 2.4820770470261246 + - 1.3977870635114367 + - 1.94492773219151 + - 1.1376632587614413 + - 1.2530679367026398 + - 1.5124385300186802 + - 2.3787703913631026 + - 1.5908373141589005 + - 1.5034724666351316 + - 1.6087444282884444 + - 1.45942469896698 + - !!python/tuple + - 0.9564813554131649 + - 5.827046933992364 + - 2.4818451719585832 + - 1.3977105182174485 + - 1.945466087003272 + - 1.1378114062404918 + - 1.2532500894438166 + - 1.5120298465540776 + - 2.379008832841538 + - 1.5907144739773293 + - 1.5036164626534185 + - 1.6087906004589965 + - 1.4590188621555797 + - !!python/tuple + - 0.956679718769982 + - 5.8264265927534336 + - 2.481646322133747 + - 1.3979685614755442 + - 1.945268242195851 + - 1.1379381359418477 + - 1.253406016984772 + - 1.5124365931870456 + - 2.3787218800310446 + - 1.5908512382090287 + - 1.5032271203067389 + - 1.6089258649133202 + - 1.4594157349309667 + - !!python/tuple + - 0.9569084942105653 + - 5.8257082894626615 + - 2.481416119224632 + - 1.3978922617497738 + - 1.945802792134069 + - 1.1380845329379714 + - 1.2535862508197566 + - 1.5120306582939937 + - 2.3789587337903075 + - 1.590729209508244 + - 1.5033704408184239 + - 1.608971550546488 + - 1.4590126369635719 + - !!python/tuple + - 0.957103671273343 + - 5.825092646554394 + - 2.4812188652661806 + - 1.3981481296622713 + - 1.945606279759856 + - 1.1382096649163775 + - 1.2537404113725346 + - 1.5124343388890906 + - 2.3786739563449606 + - 1.5908649303973152 + - 1.5029842835389475 + - 1.6091056449955168 + - 1.4594065258741624 + - !!python/tuple + - 0.957328467004959 + - 5.824380774327677 + - 2.4809908268940015 + - 1.3980722467084319 + - 1.9461358798545227 + - 1.1383540181420775 + - 1.2539183577282766 + - 1.5120320257104052 + - 2.378908712717256 + - 1.5907439760048245 + - 1.5031266129844703 + - 1.6091507502787752 + - 1.4590070335947576 + - !!python/tuple + - 0.9575201050414598 + - 5.823771129608962 + - 2.480795582988364 + - 1.398325405087754 + - 1.9459411195216818 + - 1.1384773081295696 + - 1.2540704434269878 + - 1.512431787022293 + - 2.3786267119393094 + - 1.590878367057203 + - 1.5027444500263505 + - 1.6092833955695014 + - 1.459397105808754 + - !!python/tuple + - 0.958781769475234 + - 5.8197417893762085 + - 2.479505420277524 + - 1.399996538293065 + - 1.9446544625284108 + - 1.1392902893833015 + - 1.2550738943456048 + - 1.5150713619760678 + - 2.379955610032572 + - 1.590193639295131 + - 1.500996246165361 + - 1.6101593842667323 + - 1.4576833004113319 + - !!python/tuple + - 0.9600247220290844 + - 5.815667546170292 + - 2.478202670854736 + - 1.399546681758268 + - 1.9476889426715709 + - 1.1400997939516058 + - 1.2560769814868205 + - 1.5127510117497118 + - 2.378068971495666 + - 1.5910950303224982 + - 1.5010405745256532 + - 1.61041177481068 + - 1.4597467036731364 + - !!python/tuple + - 0.963401860593385 + - 5.804303657630606 + - 2.4745740912599845 + - 1.398302295647355 + - 1.956127352825637 + - 1.142322919877627 + - 1.2588426761668006 + - 1.506321144796211 + - 2.3818203653844887 + - 1.5891600110625896 + - 1.5033499689770986 + - 1.611111955310061 + - 1.4533607341372234 + - !!python/tuple + - 0.9659357128807985 + - 5.795119084171018 + - 2.471652794130151 + - 1.4021140801853442 + - 1.953121884075808 + - 1.1440428684679833 + - 1.2610067093624848 + - 1.5124331948629077 + - 2.377558276421864 + - 1.5912062369840982 + - 1.4975857935132144 + - 1.6130871480918538 + - 1.4593353816071823 + - !!python/tuple + - 0.9794458730659323 + - 5.7431655532776436 + - 2.4551803372788594 + - 1.4232749173399348 + - 1.9362344822324695 + - 1.1534373593638987 + - 1.2729341574585058 + - 1.5464952798424725 + - 2.3947302126154564 + - 1.5823463757023752 + - 1.4754737272129708 + - 1.6241249313452273 + - 1.4372255199346762 + - !!python/tuple + - 0.9863253390345403 + - 5.704419057664235 + - 2.4431176052719894 + - 1.4171766582857275 + - 1.9654093820518523 + - 1.159098648911337 + - 1.2805601463884206 + - 1.5224623727189925 + - 2.376510392333761 + - 1.5913679603088695 + - 1.4775902954272686 + - 1.6258081514091234 + - 1.4583684649993898 + - !!python/tuple + - 0.9926951604329275 + - 5.657857732339441 + - 2.4288210983302263 + - 1.4104001388260259 + - 1.999475218914523 + - 1.164945887377089 + - 1.2887705623510244 + - 1.495299289527155 + - 2.3919621153219177 + - 1.583395674472842 + - 1.4889522471792 + - 1.6277299811020411 + - 1.432233864120246 + - !!python/tuple + - 0.9959609308784892 + - 5.625129890696788 + - 2.4189409023086 + - 1.4232334698471931 + - 1.9876802736676515 + - 1.168371431666772 + - 1.2938325167449858 + - 1.5177786317287898 + - 2.3765697392595606 + - 1.5909867496941674 + - 1.4691184463307525 + - 1.6340743609770483 + - 1.4549206809018358 + - !!python/tuple + - 0.9972084741045807 + - 5.609740517578208 + - 2.4143507119427463 + - 1.4288807311173866 + - 1.9822581100626218 + - 1.1697957491932043 + - 1.2960102173700743 + - 1.5277865038407668 + - 2.3816890555161057 + - 1.588353501181361 + - 1.4632953437701863 + - 1.636933177902104 + - 1.4484619606234819 + - !!python/tuple + - 0.9981760521495326 + - 5.596658013864967 + - 2.4104707924787703 + - 1.4266698190184524 + - 1.9916955911501488 + - 1.170941045750436 + - 1.2977880082493674 + - 1.5200204516726528 + - 2.3755828122851628 + - 1.5913003660404204 + - 1.464297656805985 + - 1.6372847160544501 + - 1.455352815763623 + - !!python/tuple + - 0.999435012289209 + - 5.578269663473874 + - 2.4050438222772095 + - 1.4236401405475088 + - 2.004840743313971 + - 1.172477010954407 + - 1.3002028713179532 + - 1.509328994932077 + - 2.3817130109117146 + - 1.588142972307246 + - 1.4692356022094657 + - 1.637770679615539 + - 1.4450982824188061 + - !!python/tuple + - 1.0003026941807376 + - 5.564123269291528 + - 2.4008974990207568 + - 1.428827814319594 + - 1.9996757997507573 + - 1.1735827030337067 + - 1.301973322586427 + - 1.518738101971824 + - 2.3751033192086766 + - 1.5913369505594488 + - 1.461129936143133 + - 1.6403347919374092 + - 1.4545826475968748 + - !!python/tuple + - 1.003033876261471 + - 5.5157290782797395 + - 2.3867886270318777 + - 1.4460915494721123 + - 1.9821753396315327 + - 1.1771787660351887 + - 1.3078119111939621 + - 1.5501962832127612 + - 2.3912636654566324 + - 1.5830160407000529 + - 1.4434800094599707 + - 1.6489505842878844 + - 1.4342622251882218 + - !!python/tuple + - 1.0044990543203998 + - 5.480056916123988 + - 2.3765805525208825 + - 1.4388688367267328 + - 2.007990681375752 + - 1.1793845270105958 + - 1.3115895335030634 + - 1.5277074631514023 + - 2.3744191021042145 + - 1.5913478071457778 + - 1.4475309648496837 + - 1.649362375636236 + - 1.454071934855634 + - !!python/tuple + - 1.0054419003852177 + - 5.451377120930152 + - 2.3684867937139344 + - 1.4334477618644232 + - 2.028240247087745 + - 1.1809399061737516 + - 1.3143558051051494 + - 1.5106123902972675 + - 2.384031758925752 + - 1.5864021370090475 + - 1.4561498776277029 + - 1.649678861284495 + - 1.4380836526363014 + - !!python/tuple + - 1.0060403779048344 + - 5.4297037791490625 + - 2.362439074650256 + - 1.4410143763424295 + - 2.0199405272870132 + - 1.1819995973147601 + - 1.316297404204997 + - 1.5250439779801972 + - 2.3738403677602293 + - 1.591370429950372 + - 1.4441943713491858 + - 1.6532929930431632 + - 1.4529663124416101 + - !!python/tuple + - 1.006536879550267 + - 5.409254179743103 + - 2.356781743136976 + - 1.4370583189315242 + - 2.0342340243725334 + - 1.182925275105313 + - 1.3180312623241786 + - 1.512920442266994 + - 2.380711668342417 + - 1.5878371162448903 + - 1.4504795592624893 + - 1.6534172425262676 + - 1.4415879842163686 + - !!python/tuple + - 1.006874714388941 + - 5.393552535254029 + - 2.352473329978121 + - 1.4424388710489802 + - 2.028148015603952 + - 1.1835863727047033 + - 1.3192955308503154 + - 1.5233314949245393 + - 2.373339250574356 + - 1.591409721250961 + - 1.4419707313608199 + - 1.655965120714448 + - 1.452280967441373 + - !!python/tuple + - 0.996354072784712 + - 5.366867285727024 + - 2.339931851607665 + - 1.4247371500000425 + - 2.0105003983104504 + - 1.1931621448411518 + - 1.3228563261928545 + - 1.5265240031202487 + - 2.388824458388588 + - 1.5834495233047488 + - 1.4301036243979297 + - 1.6538504364836426 + - 1.4306241245816989 + - !!python/tuple + - 0.994052248162973 + - 5.358975386141598 + - 2.336292136146449 + - 1.4127527794263959 + - 2.0201265502640506 + - 1.195554832913289 + - 1.32379098894629 + - 1.510540414336027 + - 2.3823764834235464 + - 1.586637239045365 + - 1.4330045322031892 + - 1.6511287429893493 + - 1.4376011848772905 + - !!python/tuple + - 0.9953150832544967 + - 5.34538055195022 + - 2.332678231750832 + - 1.4180731884601252 + - 2.0149790950265873 + - 1.1955444906300474 + - 1.3246933531128986 + - 1.5196246984465724 + - 2.3759719386878095 + - 1.5897595058569403 + - 1.4260771834733112 + - 1.6533782586599073 + - 1.4469803501827958 + - !!python/tuple + - 0.9947984883130135 + - 5.336383029619323 + - 2.329261911688282 + - 1.4147828585665438 + - 1.998645858769287 + - 1.2010640039089373 + - 1.3280440331823815 + - 1.5225933527899425 + - 2.3820017763408625 + - 1.5886847400068036 + - 1.4232883881824243 + - 1.654204043328298 + - 1.4416555629404184 + - !!python/tuple + - 0.9945089752166203 + - 5.330784290287393 + - 2.327151258253533 + - 1.4075993941155063 + - 1.999207124447781 + - 1.2043040866492356 + - 1.3300423126615217 + - 1.5122141095357087 + - 2.3778234645536327 + - 1.5919253836293925 + - 1.426019848377948 + - 1.653167598466596 + - 1.4477143273370308 + - !!python/tuple + - 0.9990351439947647 + - 5.31051835164749 + - 2.3227755846665166 + - 1.4076687292398826 + - 2.0003674099782827 + - 1.2073650409406076 + - 1.334096519829021 + - 1.5028005432865352 + - 2.3856274744683144 + - 1.590462534826782 + - 1.4340899518164687 + - 1.6552429144931786 + - 1.439033444874255 + - !!python/tuple + - 0.9983372577643816 + - 5.30344926340751 + - 2.320145591047131 + - 1.4053632023356382 + - 1.9876424581591923 + - 1.2111838746325834 + - 1.3364252831433694 + - 1.5055169354734368 + - 2.380321165604125 + - 1.594527607649794 + - 1.4292526679914295 + - 1.6558614065652086 + - 1.4484806771597818 + - !!python/tuple + - 0.9980608801176999 + - 5.300414938062937 + - 2.31902311235459 + - 1.401572574075818 + - 1.9879936641353035 + - 1.2127519853585547 + - 1.3373928145612228 + - 1.5000421249283422 + - 2.382350098906863 + - 1.5941246969197114 + - 1.4317109173158309 + - 1.655286162627445 + - 1.4459265346942962 + - !!python/tuple + - 0.9978372406230279 + - 5.297875111790938 + - 2.318085860263928 + - 1.4008049597183887 + - 1.9834618800388346 + - 1.2140402729465176 + - 1.3381915583619695 + - 1.501041539709085 + - 2.3804489442944505 + - 1.5955610098199462 + - 1.429994206874499 + - 1.6555082774728838 + - 1.449259271635019 + - !!python/tuple + - 0.997067067946331 + - 5.28887760243998 + - 2.314772388094008 + - 1.3981126941534137 + - 1.9674619022185087 + - 1.2185337230369353 + - 1.340988729749046 + - 1.5045534710373476 + - 2.38646675953459 + - 1.5943406287361446 + - 1.4270628576298638 + - 1.6562904440673085 + - 1.4438419084525331 + - !!python/tuple + - 0.99665338482878 + - 5.283513936266617 + - 2.3128115309307957 + - 1.3915600831499815 + - 1.9682371999291728 + - 1.221066982197895 + - 1.342588728109727 + - 1.494882074386648 + - 2.382430526974508 + - 1.5973733186998404 + - 1.4296118874637822 + - 1.6552669425191793 + - 1.4496235826030817 + - !!python/tuple + - 1.0018428763311025 + - 5.258809274265507 + - 2.3076459963230405 + - 1.3925575981118736 + - 1.9702734776634065 + - 1.2233392088281498 + - 1.3467204634731325 + - 1.4841793910745045 + - 2.3919094925620894 + - 1.595376903089713 + - 1.4392766558373684 + - 1.6577294990248588 + - 1.438922269107849 + - !!python/tuple + - 1.000763860375437 + - 5.250508403858558 + - 2.304657274203983 + - 1.3903432721148838 + - 1.9556251963786377 + - 1.2270271658966019 + - 1.348986306133745 + - 1.4878925146517024 + - 2.385612383636 + - 1.600057570255723 + - 1.4334146488692385 + - 1.6584085496722107 + - 1.4500618940730683 + - !!python/tuple + - 1.0004040318392529 + - 5.2474648103578305 + - 2.303568913533723 + - 1.386710432052254 + - 1.9561190152356043 + - 1.2283129783691604 + - 1.3497865839766492 + - 1.4825555117358968 + - 2.3876424790555726 + - 1.5996063069748976 + - 1.4358425893790205 + - 1.6578104823898216 + - 1.4474723533400378 + - !!python/tuple + - 1.0001238718124288 + - 5.2450135602686485 + - 2.3026945701723265 + - 1.3861148547016056 + - 1.9518401904842404 + - 1.2293300090674417 + - 1.350422460368119 + - 1.4836663879282184 + - 2.3857897843829043 + - 1.6009616690621677 + - 1.4341412779485023 + - 1.658010698965449 + - 1.45068786546751 + - !!python/tuple + - 0.9999020033007986 + - 5.243018835698718 + - 2.301984507032229 + - 1.3837677087431497 + - 1.9521751297778571 + - 1.2301457264110058 + - 1.3509343241027503 + - 1.4801954692411836 + - 2.3871205482530806 + - 1.6006609442462099 + - 1.4357277581704333 + - 1.6576204895506579 + - 1.4489854963911397 + - !!python/tuple + - 1.0002352889271466 + - 5.241262592632006 + - 2.3016264385227783 + - 1.3848144909778788 + - 1.9504216463420285 + - 1.2302527495460203 + - 1.3511906032205077 + - 1.4816893075781363 + - 2.38635918849322 + - 1.6012153783042484 + - 1.4348983081053768 + - 1.6580690709542905 + - 1.4503961568009953 + - !!python/tuple + - 1.000077843931967 + - 5.239862928382526 + - 2.301129407657957 + - 1.384485252738985 + - 1.947989079455928 + - 1.2308176304781757 + - 1.3515450616469205 + - 1.4823280258121776 + - 2.3872925838132324 + - 1.6010033500652403 + - 1.434414602014651 + - 1.6581825729798814 + - 1.4495440701214075 + - !!python/tuple + - 0.9999776483440914 + - 5.238958341939246 + - 2.300808554889718 + - 1.383426543276115 + - 1.9481462135163772 + - 1.2311797207119743 + - 1.3517727354450593 + - 1.4807574745818952 + - 2.3878952059770544 + - 1.6008668194321432 + - 1.435133413388656 + - 1.6580051711886126 + - 1.4487755018783097 + - !!python/tuple + - 0.9999374394902182 + - 5.238591695392772 + - 2.3006786044939966 + - 1.3829990132088776 + - 1.9482098214754786 + - 1.2313257080944646 + - 1.3518646496106221 + - 1.4801228085918954 + - 2.387617833082272 + - 1.601068436072453 + - 1.4352971798795517 + - 1.6579334191811839 + - 1.4491656192495377 + - !!python/tuple + - 1.0000082658592 + - 5.2382181082071275 + - 2.3006026747879735 + - 1.3832224139209883 + - 1.9478380125084218 + - 1.2313469821742877 + - 1.351918284724991 + - 1.4804406919759632 + - 2.3874557590880956 + - 1.6011861631813644 + - 1.4351210493997406 + - 1.6580286974071226 + - 1.4494656127214127 + - !!python/tuple + - 1.0000018009316731 + - 5.238159341755808 + - 2.3005818559933315 + - 1.3831539351003135 + - 1.947848235259482 + - 1.2313703244080627 + - 1.351932979457227 + - 1.4803390246104018 + - 2.387494905598114 + - 1.6011772634764163 + - 1.4351675978110896 + - 1.6580171929289398 + - 1.4494156930917776 + - !!python/tuple + - 0.9999942717698181 + - 5.238090857284716 + - 2.300557595643575 + - 1.38313829513642 + - 1.9477294458950352 + - 1.2313975173498177 + - 1.3519500997946374 + - 1.4803705980548931 + - 2.3875405236736573 + - 1.6011668936468406 + - 1.4351438559783714 + - 1.6580227564137269 + - 1.4493742342530929 + - !!python/tuple + - 0.9999893248114672 + - 5.238045826484189 + - 2.3005416445686446 + - 1.3830858373443988 + - 1.9477372866279035 + - 1.2314153904660905 + - 1.3519613535990929 + - 1.4802927036645743 + - 2.3875064679608067 + - 1.601191621127629 + - 1.4351639690374318 + - 1.6580139414715198 + - 1.449422053137147 + - !!python/tuple + - 0.9999834798631437 + - 5.23799259526864 + - 2.300522789398609 + - 1.3830736958103458 + - 1.9476449627262722 + - 1.2314365128506808 + - 1.351974654169563 + - 1.4803172534887818 + - 2.387541925526065 + - 1.6011835588021572 + - 1.4351455156824078 + - 1.6580182662815328 + - 1.4493898267423224 + - !!python/tuple + - 0.9999796380878304 + - 5.237957586970073 + - 2.3005103895637253 + - 1.3830329226666256 + - 1.9476510628096462 + - 1.2314503999886168 + - 1.351983399444165 + - 1.4802567019409036 + - 2.3875154493512456 + - 1.6012027812665404 + - 1.4351611520804863 + - 1.658011413609122 + - 1.449427000883522 + - !!python/tuple + - 0.9999866135188259 + - 5.237920742858462 + - 2.300502904196105 + - 1.383054952635514 + - 1.9476144106713826 + - 1.2314524825814017 + - 1.351988678017791 + - 1.4802880436526507 + - 2.3875295267226053 + - 1.6011995796913001 + - 1.4351510908527738 + - 1.6580208064609114 + - 1.4494161793361684 + - !!python/tuple + - 0.9999847778282438 + - 5.237904020430416 + - 2.3004969814306175 + - 1.3830511405255796 + - 1.947585410181765 + - 1.2314591145151832 + - 1.3519928543528044 + - 1.4802957562459809 + - 2.3875406654056675 + - 1.6011970465537821 + - 1.4351452945342085 + - 1.6580221648223115 + - 1.4494060557687303 + - !!python/tuple + - 0.999983571796045 + - 5.237893031932551 + - 2.300493089567955 + - 1.3830383434892362 + - 1.9475873258823346 + - 1.2314634720094897 + - 1.351995598468759 + - 1.4802767508392027 + - 2.3875323549482164 + - 1.6012030797947758 + - 1.435150202570865 + - 1.6580200137689618 + - 1.4494177235202714 + - !!python/tuple + - 0.9999821473461725 + - 5.237880051807382 + - 2.3004884923605156 + - 1.3830353853819535 + - 1.9475648158732592 + - 1.231468618954829 + - 1.3519988397899936 + - 1.4802827379468144 + - 2.387541000900223 + - 1.6012011134204285 + - 1.4351457034406685 + - 1.6580210681705652 + - 1.4494098654110306 + - !!python/tuple + - 0.9999812111340697 + - 5.237871519475837 + - 2.300485470473184 + - 1.3830254493015663 + - 1.9475663036385655 + - 1.2314720019823495 + - 1.3520009703127884 + - 1.4802679810090493 + - 2.3875345479950942 + - 1.6012057980172838 + - 1.435149514419246 + - 1.6580193979436155 + - 1.4494189250673075 + - !!python/tuple + - 0.999979980962753 + - 5.2378603070478755 + - 2.300481499406885 + - 1.3830123926482913 + - 1.9475682587032048 + - 1.231476447433775 + - 1.3520037699507357 + - 1.480248589309646 + - 2.3875420164912873 + - 1.60120409934875 + - 1.435158394734157 + - 1.6580172031244402 + - 1.449409402224204 + - !!python/tuple + - 0.9999789899746283 + - 5.237851273551595 + - 2.3004783000749303 + - 1.3830103349309144 + - 1.9475525931181061 + - 1.2314800287583487 + - 1.352006025418958 + - 1.4802527569028185 + - 2.387535184543187 + - 1.6012090590404524 + - 1.435152143397009 + - 1.6580179369967574 + - 1.449421197415638 + - !!python/tuple + - 0.999975407234712 + - 5.237818611332713 + - 2.3004667324056194 + - 1.3830028951614193 + - 1.9474959521226687 + - 1.2314929769948788 + - 1.3520141801438819 + - 1.4802678251275951 + - 2.3875569405668067 + - 1.6012041104620482 + - 1.4351408218484694 + - 1.6580205903869905 + - 1.4494014233811656 + - !!python/tuple + - 0.9999730576850971 + - 5.237797183884418 + - 2.3004591438543756 + - 1.3829779452305877 + - 1.9474996906045614 + - 1.2315014698299203 + - 1.3520195291347101 + - 1.4802307665887966 + - 2.3875407348785327 + - 1.601215874885102 + - 1.4351503928856444 + - 1.658016395911096 + - 1.4494241758753525 + - !!python/tuple + - 0.9999867784391053 + - 5.237724727536524 + - 2.3004444252167544 + - 1.3829823504883603 + - 1.947506941615447 + - 1.2315055528758057 + - 1.3520299031644165 + - 1.4802013551064113 + - 2.387568418290929 + - 1.601209577271848 + - 1.435177930964455 + - 1.6580233554393635 + - 1.449392757624978 + - !!python/tuple + - 0.999983754874593 + - 5.237697184909417 + - 2.3004346714555353 + - 1.3829760800081181 + - 1.9474591801438592 + - 1.2315164675135704 + - 1.3520367768201318 + - 1.4802140664232406 + - 2.387547587255401 + - 1.601224698847618 + - 1.435158868779154 + - 1.6580255925883558 + - 1.449428722542078 + - !!python/tuple + - 0.9999812702826696 + - 5.237674545126606 + - 2.3004266541378584 + - 1.3829497207318262 + - 1.947463131423967 + - 1.2315254378035538 + - 1.3520424262184128 + - 1.4801749149397396 + - 2.3875626673711783 + - 1.6012212677536317 + - 1.4351767990820625 + - 1.6580211604795763 + - 1.4494094932550554 + - !!python/tuple + - 0.9999850370289655 + - 5.237654648397215 + - 2.3004226126702134 + - 1.3829616215670115 + - 1.9474433413212624 + - 1.2315265574105458 + - 1.3520452738069018 + - 1.4801918436233794 + - 2.387554035699374 + - 1.601227533299821 + - 1.4351674233675136 + - 1.6580262326452948 + - 1.449425461045273 + - !!python/tuple + - 0.999984285807466 + - 5.237647804116641 + - 2.3004201890048432 + - 1.3829536532252007 + - 1.9474445360069188 + - 1.2315292688388393 + - 1.3520469814344322 + - 1.4801800081344065 + - 2.38755859458015 + - 1.601226495983032 + - 1.435172843714463 + - 1.658024892750147 + - 1.4494196478607735 + - !!python/tuple + - 0.9999836801739825 + - 5.2376422858556175 + - 2.300418234914552 + - 1.382952397565747 + - 1.947434967287994 + - 1.2315314548643728 + - 1.352048358182715 + - 1.4801825553066421 + - 2.3875544210291064 + - 1.6012295254102844 + - 1.4351690246216255 + - 1.6580253409528345 + - 1.4494268530617975 + - !!python/tuple + - 0.9999814922487377 + - 5.237622349255537 + - 2.300411175129198 + - 1.382947861170186 + - 1.947400397297535 + - 1.2315393523731504 + - 1.3520533320350558 + - 1.4801917576662695 + - 2.387567700529487 + - 1.6012265037165054 + - 1.4351621127264984 + - 1.6580269602169717 + - 1.4494147826422583 + - !!python/tuple + - 0.9999800552764806 + - 5.237609252555857 + - 2.3004065375099794 + - 1.3829326142654412 + - 1.9474026842037688 + - 1.2315445397812197 + - 1.3520565991595022 + - 1.4801691101138863 + - 2.3875577951653457 + - 1.6012336935857054 + - 1.4351679617005781 + - 1.65802439626514 + - 1.4494286888006815 + - !!python/tuple + - 0.9999924680362007 + - 5.237522841165474 + - 2.3003970590123646 + - 1.3828998499019824 + - 1.9474131763114673 + - 1.2315452007424414 + - 1.3520743648161204 + - 1.4801152208588544 + - 2.3875842798368945 + - 1.6012346760575042 + - 1.435191706862604 + - 1.658023383345985 + - 1.449406323857999 + - !!python/tuple + - 1.0000055216684824 + - 5.237470273864628 + - 2.300392641088235 + - 1.3829210662150864 + - 1.9473865138084414 + - 1.23154058107907 + - 1.3520826442501266 + - 1.480143215484993 + - 2.3875731089484753 + - 1.601246715429938 + - 1.435176099645472 + - 1.6580334949696118 + - 1.4494330719311144 + - !!python/tuple + - 1.0000374255007136 + - 5.237247983165517 + - 2.3003682590676773 + - 1.382922246532739 + - 1.9472393680365405 + - 1.2315422837009764 + - 1.3521283345934225 + - 1.4802044860204309 + - 2.387641239064711 + - 1.6012492393624522 + - 1.4351332899519438 + - 1.6580561596553356 + - 1.4493977919671228 + - !!python/tuple + - 1.0000592666938641 + - 5.237095639186175 + - 2.3003515505436027 + - 1.382864484912192 + - 1.9472578824633335 + - 1.231543449897952 + - 1.3521596342880082 + - 1.4801094695045494 + - 2.3875989833310953 + - 1.601294774259165 + - 1.4351535654246061 + - 1.6580543686409668 + - 1.4494778739382181 + - !!python/tuple + - 1.0001138826190945 + - 5.2367144060862065 + - 2.3003097406569726 + - 1.3827199794728955 + - 1.947304209431231 + - 1.2315463670944586 + - 1.3522379369196518 + - 1.4798717490399096 + - 2.387715825814865 + - 1.6012990810202763 + - 1.4352583361901117 + - 1.6580498874296197 + - 1.4493791714863655 + - !!python/tuple + - 1.000166913957217 + - 5.236343545252468 + - 2.3002690740175264 + - 1.3827220870692523 + - 1.947058731301397 + - 1.2315492021180485 + - 1.3523140525345632 + - 1.4799741253105279 + - 2.3876129480976256 + - 1.6014099095092216 + - 1.4351342865145784 + - 1.658087694710289 + - 1.4496112652392712 + - !!python/tuple + - 1.0002591092983697 + - 5.2356976347554065 + - 2.300198256574511 + - 1.3824774206898045 + - 1.9471373090266821 + - 1.2315541349958614 + - 1.352446523593149 + - 1.4795714854026794 + - 2.387810912246916 + - 1.6014171176574956 + - 1.4353118213468086 + - 1.6580800789833217 + - 1.4494438939080116 + - !!python/tuple + - 1.0003481141330657 + - 5.235072109605972 + - 2.300129690516781 + - 1.382481257290043 + - 1.9467233198990443 + - 1.2315589041905601 + - 1.3525746522621507 + - 1.479744452237581 + - 2.387637362553261 + - 1.6016039686197858 + - 1.4351025259268102 + - 1.6581438298211733 + - 1.449835311173792 + - !!python/tuple + - 1.0005018472413396 + - 5.233988375295436 + - 2.3000109259219865 + - 1.382071212924838 + - 1.9468554081096316 + - 1.2315671535142563 + - 1.3527963670516976 + - 1.4790692344085383 + - 2.3879695195717443 + - 1.601615812085671 + - 1.435400471000878 + - 1.6581309858292805 + - 1.4495540857518054 + - !!python/tuple + - 1.0006489021619016 + - 5.232946223346188 + - 2.29989676393599 + - 1.3820783916031256 + - 1.9461658392827434 + - 1.231575064030399 + - 1.3530091246596374 + - 1.479358214696458 + - 2.387680301817635 + - 1.6019268847521753 + - 1.4350516021279127 + - 1.6582371465957477 + - 1.450206056970743 + - !!python/tuple + - 1.0009003598823103 + - 5.2311551091800315 + - 2.299700632737314 + - 1.3814019923788163 + - 1.9463848248813957 + - 1.231588622860874 + - 1.3533740425850955 + - 1.4782432324458445 + - 2.3882292780468006 + - 1.6019457696702004 + - 1.4355442104605054 + - 1.658215737617897 + - 1.4497401664286924 + - !!python/tuple + - 1.000987786299067 + - 5.230526908183457 + - 2.2996318887337868 + - 1.381407101966475 + - 1.945969314519336 + - 1.2315933562962362 + - 1.3535015848951018 + - 1.4784182318851866 + - 2.3884217091111544 + - 1.6019523794616257 + - 1.4354228190119935 + - 1.6582796794058168 + - 1.4496401317746672 + - !!python/tuple + - 1.0010635141069628 + - 5.229981101501525 + - 2.299572174987293 + - 1.3814115362896513 + - 1.9456084453287716 + - 1.2315974622010797 + - 1.3536122634789682 + - 1.4785701367626731 + - 2.3882701301090963 + - 1.6021150976788177 + - 1.4352400638691636 + - 1.6583351982852663 + - 1.4499815537741851 + - !!python/tuple + - 1.0021036380643464 + - 5.222464500982085 + - 2.298749990233258 + - 1.3814725428682708 + - 1.940640433146679 + - 1.2316539268460254 + - 1.3551348609086447 + - 1.4806604070778577 + - 2.390572603660494 + - 1.602192669982667 + - 1.4337913157518438 + - 1.6590993442588853 + - 1.4487816419183208 + - !!python/tuple + - 1.0030983143558532 + - 5.215004353695251 + - 2.297936246479247 + - 1.3786626745434818 + - 1.941580418530655 + - 1.2317088753096699 + - 1.3566239738280899 + - 1.476000029077482 + - 2.388494458290658 + - 1.6044151977312877 + - 1.4348013374660238 + - 1.6590032239895853 + - 1.452712586854109 + - !!python/tuple + - 1.00477708643352 + - 5.201942133679964 + - 2.296515366382134 + - 1.3788358124062785 + - 1.9329778161227664 + - 1.2318032254282774 + - 1.3591936747956763 + - 1.4796854595462066 + - 2.392496666977604 + - 1.604514281426273 + - 1.4322919484120828 + - 1.6603224419444986 + - 1.450569039197284 + - !!python/tuple + - 1.0062783219921374 + - 5.189476610894344 + - 2.295165953754101 + - 1.3741987293655404 + - 1.934614172481611 + - 1.23189021549887 + - 1.3615842691050692 + - 1.4719110703012643 + - 2.3890131089861595 + - 1.608196170443845 + - 1.4340120366003877 + - 1.660145336801532 + - 1.4571062025427046 + - !!python/tuple + - 1.0068921964566264 + - 5.18405504033105 + - 2.2945817744261374 + - 1.3722284255473163 + - 1.935320148035389 + - 1.231926826484205 + - 1.3625991577002732 + - 1.4685927493047728 + - 2.3906747214863597 + - 1.6082130304950242 + - 1.435514757122498 + - 1.6600693066347663 + - 1.4556340165753126 + - !!python/tuple + - 1.0080274516238068 + - 5.173761836076598 + - 2.2934749053240715 + - 1.3724900924186887 + - 1.9285773242154227 + - 1.2319953574745794 + - 1.3645060420100137 + - 1.4716174713235024 + - 2.393823845075983 + - 1.608244841458119 + - 1.433522976382909 + - 1.6610981934689086 + - 1.4538949852077885 + - !!python/tuple + - 1.0095666315007361 + - 5.159085327640707 + - 2.291902722630605 + - 1.3672009990424874 + - 1.9305499425964383 + - 1.2320904630272227 + - 1.3671716817642279 + - 1.4626362390223926 + - 2.398299044305062 + - 1.6082896636529638 + - 1.43760516029279 + - 1.6608772477656055 + - 1.44998262257911 + - !!python/tuple + - 1.0107226662777349 + - 5.147235114357052 + - 2.290640239186502 + - 1.3676165526850927 + - 1.9228187687532157 + - 1.2321643297613039 + - 1.3692641376552772 + - 1.4662318779326888 + - 2.3949578091495427 + - 1.6117420311936117 + - 1.4335844350007945 + - 1.66205253509289 + - 1.4574073960324896 + - !!python/tuple + - 1.0123519257242821 + - 5.129540459461471 + - 2.2887634432596973 + - 1.3613987445238547 + - 1.9252695219113949 + - 1.2322712355074077 + - 1.372318774487924 + - 1.4555413724810184 + - 2.400351241555204 + - 1.611723152849708 + - 1.4385089569299878 + - 1.6617677851337442 + - 1.4525868383991027 + - !!python/tuple + - 1.0135536430715515 + - 5.115299436657304 + - 2.2872629526853934 + - 1.3620588999396082 + - 1.916020311018982 + - 1.2323533238081916 + - 1.3746956275901407 + - 1.4600272255857019 + - 2.396321194126699 + - 1.6158187845706686 + - 1.433650565400452 + - 1.6631680794391503 + - 1.4614593699411806 + - !!python/tuple + - 1.015233140731544 + - 5.093967600472254 + - 2.285027338301607 + - 1.354784015642725 + - 1.9190793020754084 + - 1.2324717392384692 + - 1.378161405285707 + - 1.4473324392290277 + - 2.4028204107066853 + - 1.6156940540960927 + - 1.4395918903577998 + - 1.6627988892687438 + - 1.4555041732493197 + - !!python/tuple + - 1.016437893123954 + - 5.076965930528139 + - 2.2832598087908864 + - 1.3557945493353574 + - 1.9080956821945014 + - 1.2325608889468997 + - 1.3808144343469047 + - 1.4529199709483052 + - 2.397987870226101 + - 1.6205108373072568 + - 1.4337536121173309 + - 1.6644540101421503 + - 1.4660310195244362 + - !!python/tuple + - 1.0189530724717817 + - 5.038410700323276 + - 2.2792771826252225 + - 1.3580104132353157 + - 1.8834700624526943 + - 1.2327541281801437 + - 1.386642388266272 + - 1.4652505266424278 + - 2.414527861546376 + - 1.6132449952198913 + - 1.4298052229097877 + - 1.6681413956572895 + - 1.4551832975591914 + - !!python/tuple + - 1.0208957368611282 + - 5.002127241614406 + - 2.2755838441525387 + - 1.3458891008812992 + - 1.8895394751284245 + - 1.2329177524579156 + - 1.3917406620857686 + - 1.443295916854808 + - 2.40404271253594 + - 1.6236505858602865 + - 1.4349941661271257 + - 1.667318676809613 + - 1.4740559095702273 + - !!python/tuple + - 1.02177755633219 + - 4.982336581319164 + - 2.2773164020841823 + - 1.3389641779198582 + - 1.892766183253255 + - 1.2440270177413515 + - 1.3827427674115504 + - 1.4320029571780224 + - 2.4125145322002948 + - 1.618028338014902 + - 1.4458312105506153 + - 1.6668866601304402 + - 1.4614199401913135 + - !!python/tuple + - 1.0226629027326788 + - 4.960472804888798 + - 2.275103898885996 + - 1.3409703706989584 + - 1.8789919421632195 + - 1.2434831770309809 + - 1.3859807041316874 + - 1.4397757096271446 + - 2.4061979206962527 + - 1.6241896072399948 + - 1.438065893036087 + - 1.6689284016292214 + - 1.4748093094061585 + - !!python/tuple + - 1.0235502672694352 + - 4.936108995455421 + - 2.2726588847298363 + - 1.33364325367104 + - 1.883161285320546 + - 1.2429107483656796 + - 1.389444693639232 + - 1.425991898512806 + - 2.4166260903884176 + - 1.6194731686723056 + - 1.4468884075602655 + - 1.6683537915783002 + - 1.4651251576966038 + - !!python/tuple + - 1.0242257330204263 + - 4.915227088219504 + - 2.2705827484773864 + - 1.335793966139254 + - 1.8701287543887373 + - 1.2424505022491754 + - 1.392282308101596 + - 1.4336429606685093 + - 2.4105515451432673 + - 1.625333521677621 + - 1.4394216739108203 + - 1.6702747340366617 + - 1.4778147606924796 + - !!python/tuple + - 1.0249150520859742 + - 4.891660851320347 + - 2.2682584213736128 + - 1.328946149225495 + - 1.8743265894537415 + - 1.241958706833286 + - 1.3953640593911294 + - 1.4205274909647272 + - 2.420620692323153 + - 1.6207317577250868 + - 1.4479180287140103 + - 1.6696840463471836 + - 1.4683208455299395 + - !!python/tuple + - 1.025442582140676 + - 4.871444123568882 + - 2.266282456683126 + - 1.331232269749154 + - 1.8618195824498671 + - 1.241562173718036 + - 1.3978960604894155 + - 1.4281390853357443 + - 2.4147003257586337 + - 1.6263862561480633 + - 1.440641561798653 + - 1.671518510031226 + - 1.480527333572465 + - !!python/tuple + - 1.025768593454145 + - 4.857677114967054 + - 2.267548587023486 + - 1.3268076021715955 + - 1.8643640380256177 + - 1.2490192955132327 + - 1.3914476556678792 + - 1.42059166588703 + - 2.4205732581487673 + - 1.6224104414150022 + - 1.4480907775899212 + - 1.671154538318954 + - 1.4715523697395463 + - !!python/tuple + - 1.0266500377994656 + - 4.817955348156703 + - 2.2636725796984534 + - 1.3314865194918164 + - 1.8400559751952592 + - 1.2475164686433158 + - 1.396716019329822 + - 1.4355643184845652 + - 2.4324574529945604 + - 1.6218687160979586 + - 1.439475910148078 + - 1.6747017709992604 + - 1.4637511050089653 + - !!python/tuple + - 1.027384144669046 + - 4.7775359872437075 + - 2.259788777292115 + - 1.320058132558621 + - 1.8482356879609 + - 1.2461403012248973 + - 1.4016943683540488 + - 1.4128436311258008 + - 2.4204158476619084 + - 1.6331563174369417 + - 1.4446493660071802 + - 1.6734936719564157 + - 1.4844127790328572 + - !!python/tuple + - 1.0229835319937184 + - 4.762306838536274 + - 2.261789623409785 + - 1.3220083731020786 + - 1.8227010868985438 + - 1.2578821066440116 + - 1.391658341749944 + - 1.4210844940794738 + - 2.4293812519235796 + - 1.6268939335432653 + - 1.4459264387173456 + - 1.6753256966952847 + - 1.4726656523171964 + - !!python/tuple + - 1.0239648062386064 + - 4.734459637818055 + - 2.2591297038419156 + - 1.3146797634762208 + - 1.828744168642047 + - 1.2561975135255288 + - 1.39535670401099 + - 1.406083084960039 + - 2.4210939153369426 + - 1.6345270739506006 + - 1.4492007022396394 + - 1.6744727797314378 + - 1.4865445738985323 + - !!python/tuple + - 1.0203094573629647 + - 4.720812188296995 + - 2.257347774837186 + - 1.3174104978045609 + - 1.806094315699422 + - 1.2556330836144372 + - 1.397735515637096 + - 1.413716426298804 + - 2.4291459134530644 + - 1.630614502480077 + - 1.4467544655341071 + - 1.676099374524813 + - 1.4805595236263271 + - !!python/tuple + - 0.983372575642282 + - 4.569669035876949 + - 2.237757478281236 + - 1.264418499787982 + - 1.7260772690819801 + - 1.2496746639323328 + - 1.423190146962953 + - 1.3036664496884713 + - 2.4914084231335467 + - 1.625752663847562 + - 1.5013179103913634 + - 1.6695164151188688 + - 1.4149885154501878 + - !!python/tuple + - 1.0000131235853877 + - 4.498479427926444 + - 2.231650734394875 + - 1.2832395191570856 + - 1.6905195616323418 + - 1.2468230888553382 + - 1.428670654735323 + - 1.3475576149190085 + - 2.4685226838926133 + - 1.6455485469010565 + - 1.469313612211319 + - 1.6760884797039168 + - 1.4650323374647027 + - !!python/tuple + - 1.011332814293477 + - 4.422096638262583 + - 2.239983397093828 + - 1.2665574976936027 + - 1.7167828345382508 + - 1.2879026977992596 + - 1.3880138040569556 + - 1.3165960669406707 + - 2.444453127412193 + - 1.6579676642069747 + - 1.4896449247104169 + - 1.6736547077708281 + - 1.48555495762933 + - !!python/tuple + - 1.0052771803068203 + - 4.390089924815228 + - 2.2360887894639156 + - 1.278183189190145 + - 1.6669976037950331 + - 1.2830585133424937 + - 1.3943385578975285 + - 1.3429626669920172 + - 2.4576908513090236 + - 1.6555215018410516 + - 1.4768054928808272 + - 1.677597052254589 + - 1.4756372557359159 + - !!python/tuple + - 0.9939252530366066 + - 4.313277140676823 + - 2.2269066714501897 + - 1.2603669683409668 + - 1.6398428755876642 + - 1.2726449926110557 + - 1.4082773283740442 + - 1.3003873991223713 + - 2.424188153385263 + - 1.681875526702168 + - 1.4842306077874696 + - 1.6739951323044762 + - 1.5294680183909712 + - !!python/tuple + - 0.9919094249878355 + - 4.283451556039143 + - 2.23158484657159 + - 1.2535528767219162 + - 1.6305087338142479 + - 1.2936296726363763 + - 1.3874189324954307 + - 1.2876763177587869 + - 2.4423131686646036 + - 1.6668955004696344 + - 1.5044311929854404 + - 1.6727502795234395 + - 1.4984913524515164 + - !!python/tuple + - 0.9903882205451857 + - 4.254760943105724 + - 2.2282061015135803 + - 1.2654353115644514 + - 1.5891303813399327 + - 1.2886878701944995 + - 1.3932024343467106 + - 1.3142879739990505 + - 2.459536841010713 + - 1.6569000097269817 + - 1.4955805983564812 + - 1.6763664136266772 + - 1.4847252515010174 + - !!python/tuple + - 0.9977066739536856 + - 4.2182839506154615 + - 2.2251788263660823 + - 1.260465917957826 + - 1.606181571169203 + - 1.2836179641044394 + - 1.3980784740471008 + - 1.30192865449758 + - 2.4479828632466014 + - 1.6659134010396974 + - 1.4970631862485924 + - 1.6751756816784118 + - 1.502726607627479 + - !!python/tuple + - 0.9932370735908477 + - 4.171616505338283 + - 2.2198441131986932 + - 1.2523869362496245 + - 1.5940959527527232 + - 1.2771039454222335 + - 1.4062164686131386 + - 1.281629212774135 + - 2.476039334321424 + - 1.6496269463433255 + - 1.5153496619212221 + - 1.6731261718332295 + - 1.4729136797163895 + - !!python/tuple + - 0.9917043110756143 + - 4.147446843895935 + - 2.217153569630535 + - 1.248896226930153 + - 1.5883241062387299 + - 1.274257784677901 + - 1.4014877400195613 + - 1.3047868082010254 + - 2.4583552050826603 + - 1.6583153013190244 + - 1.499050087680903 + - 1.6761910950707157 + - 1.493913172365172 + - !!python/tuple + - 0.9896919016079617 + - 4.108890753482842 + - 2.2129200214614517 + - 1.2438134309075037 + - 1.5794950697742112 + - 1.2700900082448918 + - 1.4079107239265485 + - 1.2875366874906553 + - 2.4744424952383253 + - 1.6552724541314567 + - 1.5090572616959117 + - 1.6744255438889737 + - 1.4752455580870742 + - !!python/tuple + - 0.9890618202456707 + - 4.092009908500255 + - 2.211106971010444 + - 1.241902025138175 + - 1.5758873063243712 + - 1.2685069047821227 + - 1.40451197053414 + - 1.3034720974470353 + - 2.462024762169871 + - 1.6612258792261483 + - 1.4978236023027316 + - 1.6765458885715032 + - 1.4899171732320402 + - !!python/tuple + - 0.9877288280037675 + - 4.051175425478836 + - 2.2067633162614357 + - 1.2375668111926286 + - 1.5674183780305124 + - 1.2649012657661989 + - 1.4110275242623287 + - 1.2852735404848215 + - 2.4436184223016295 + - 1.6752637517812148 + - 1.4999797179793075 + - 1.6746427407031546 + - 1.5180468613783906 + - !!python/tuple + - 0.9873658156823976 + - 4.035161696891132 + - 2.2095582466942734 + - 1.2351859477893097 + - 1.5643385466249968 + - 1.2769097867052728 + - 1.3994184116425146 + - 1.2790903159364222 + - 2.4534478721520485 + - 1.6671732310587277 + - 1.5105545407568008 + - 1.6739405775233662 + - 1.5013563736550526 + - !!python/tuple + - 0.9867070640148711 + - 4.002127049308654 + - 2.206057205311665 + - 1.2325145426492266 + - 1.5581684660155437 + - 1.2729858744534162 + - 1.3934588791252227 + - 1.3114944369890842 + - 2.458165739430981 + - 1.6640672815639526 + - 1.4952998689334438 + - 1.6781482956211338 + - 1.4895830213511392 + - !!python/tuple + - 0.9861960170551131 + - 3.9679809653615 + - 2.202506676314692 + - 1.2301008518438068 + - 1.5521749473696307 + - 1.2693912849052895 + - 1.3999777880835038 + - 1.295221147352959 + - 2.4426855871274293 + - 1.6757676082839028 + - 1.49731036377078 + - 1.6764554966971597 + - 1.5133658686982763 + - !!python/tuple + - 0.9858964474721396 + - 3.9409592423163637 + - 2.1997520156971353 + - 1.2284416931275497 + - 1.5477316570191348 + - 1.2668852670891075 + - 1.4046787268035423 + - 1.2837616724193683 + - 2.459443143605417 + - 1.6656596219138555 + - 1.5081705548747593 + - 1.67518227785936 + - 1.4950158231950352 + - !!python/tuple + - 0.9856187104323146 + - 3.909406408262395 + - 2.1965855185749867 + - 1.2267072784997723 + - 1.542806014419316 + - 1.2642374041823403 + - 1.3984766034737903 + - 1.314533558287403 + - 2.463904333750316 + - 1.6627368977665198 + - 1.4936018601796508 + - 1.6791836344222433 + - 1.4840882619311637 + - !!python/tuple + - 0.985406129213863 + - 3.8775609320569817 + - 2.193447986681615 + - 1.2251725125811983 + - 1.53813220664701 + - 1.261864653287295 + - 1.4041863827569399 + - 1.298868527917066 + - 2.449214554410572 + - 1.673839380567241 + - 1.4956185897142915 + - 1.6775353069762244 + - 1.5069132258202207 + - !!python/tuple + - 0.9754566815303666 + - 3.8689229631370985 + - 2.1958985894574035 + - 1.2217574391094665 + - 1.5363316301113057 + - 1.2734300036082036 + - 1.3926753913073213 + - 1.293101190422012 + - 2.4557917166856678 + - 1.6671291971337674 + - 1.5045549195484598 + - 1.6768902917623807 + - 1.4933238220177563 + - !!python/tuple + - 0.9656064010009601 + - 3.8593969738592624 + - 2.194477638508881 + - 1.2190516886297307 + - 1.5343961446135326 + - 1.2734263342145893 + - 1.3932070694925633 + - 1.2870164498969279 + - 2.46028346634746 + - 1.6657471392638292 + - 1.508243400289837 + - 1.676192535505221 + - 1.4861348481101015 + - !!python/tuple + - 0.9665137030016759 + - 3.8535423426958397 + - 2.1939058737003365 + - 1.2189515728099123 + - 1.5336327897317643 + - 1.2727897678426314 + - 1.392228415377483 + - 1.292717765658854 + - 2.45589043591908 + - 1.6677726602521399 + - 1.5042422199882528 + - 1.6769332164620931 + - 1.4912268324769922 + - !!python/tuple + - 0.9679248773752112 + - 3.843977396711532 + - 2.192974929069702 + - 1.2187918527841353 + - 1.532399894332395 + - 1.2717711376773648 + - 1.394120814012309 + - 1.2886861060240111 + - 2.4600311819508285 + - 1.6668440700134588 + - 1.5067004694553576 + - 1.6764687790531283 + - 1.4864937835422436 + - !!python/tuple + - 0.962622900110966 + - 3.8383704427846164 + - 2.1921520968352266 + - 1.2172956537853405 + - 1.531324578764807 + - 1.2718203986810963 + - 1.3944011686021793 + - 1.2852180514275744 + - 2.455064690578478 + - 1.6697760877397279 + - 1.5069954620774129 + - 1.6760617613210849 + - 1.4925915781866177 + - !!python/tuple + - 0.9581746506192916 + - 3.83331225645128 + - 2.1914134646550556 + - 1.2159921489785392 + - 1.5303706757437618 + - 1.271863506556017 + - 1.391862287575537 + - 1.292758893047334 + - 2.4552518790018385 + - 1.6690048728075793 + - 1.503426328687888 + - 1.6770366872116051 + - 1.4899415990928428 + - !!python/tuple + - 0.9603587208405904 + - 3.8233102290941203 + - 2.1904551683070017 + - 1.2159481468166624 + - 1.5291462857894544 + - 1.2708293289729613 + - 1.393856687446046 + - 1.288530261502467 + - 2.4595967012871567 + - 1.668011269406103 + - 1.5060218662432407 + - 1.6765480724841195 + - 1.4850082096511528 + - !!python/tuple + - 0.9551039612411872 + - 3.817149614976107 + - 2.1895641639564247 + - 1.2144084332697975 + - 1.528023778526999 + - 1.2709159983059295 + - 1.3941728934117625 + - 1.2847088915363296 + - 2.454118942627968 + - 1.671228583262115 + - 1.506361345766522 + - 1.6760977999136815 + - 1.4917681936653782 + - !!python/tuple + - 0.950936891038726 + - 3.8118446053557253 + - 2.1888010900755406 + - 1.2131330415147759 + - 1.5270750493306446 + - 1.2709881585039013 + - 1.3915036973080952 + - 1.2926665814675586 + - 2.4543200038675566 + - 1.6703972878162505 + - 1.5026130900064474 + - 1.677124267159419 + - 1.488991918322461 + - !!python/tuple + - 0.9537168579441067 + - 3.801980116103833 + - 2.1878717471658504 + - 1.213208348737961 + - 1.5259326846689403 + - 1.269996957506534 + - 1.3934862858333776 + - 1.2884871798683377 + - 2.458622204046283 + - 1.6693922298314376 + - 1.5051981985577974 + - 1.6766395906239284 + - 1.484133652592781 + - !!python/tuple + - 0.9488823754567373 + - 3.7956985838929667 + - 2.1869770152025447 + - 1.2117418797031594 + - 1.5248481822597268 + - 1.2701150313016858 + - 1.393820004628327 + - 1.2845750217656864 + - 2.453016952033902 + - 1.6726657456834857 + - 1.505563298047823 + - 1.6761770469920403 + - 1.4910761125472516 + - !!python/tuple + - 0.9451575044919569 + - 3.790422656612049 + - 2.1862297201991447 + - 1.2105585127708742 + - 1.5239546506253323 + - 1.2702108336273468 + - 1.3911614678579762 + - 1.2925283523745241 + - 2.453222336871193 + - 1.671816633254878 + - 1.5018330910801994 + - 1.6772014353611624 + - 1.4883153645015184 + - !!python/tuple + - 0.9374687319861443 + - 3.7787066743523963 + - 2.184578041511723 + - 1.20801766432567 + - 1.5220022726910325 + - 1.2704175024120374 + - 1.3919016981845056 + - 1.2849599958197973 + - 2.4588591676351856 + - 1.669953465658885 + - 1.5065507953303123 + - 1.6763205384451343 + - 1.479535314438238 + - !!python/tuple + - 0.9351646699501358 + - 3.7745281940201765 + - 2.1839951412424057 + - 1.2071785642875201 + - 1.5213309001101363 + - 1.270486528092632 + - 1.3898228212728185 + - 1.291272951385793 + - 2.4532585670097617 + - 1.672135942057856 + - 1.5021769743686566 + - 1.677133304698759 + - 1.4852295852531312 + - !!python/tuple + - 0.9380592596158883 + - 3.767733301682922 + - 2.1833753750169977 + - 1.2074039417286653 + - 1.520623569107962 + - 1.2698128275895655 + - 1.3912277845804306 + - 1.2884124640893575 + - 2.4562411036165237 + - 1.6714208386989196 + - 1.5039735276342099 + - 1.6767976171246586 + - 1.4819247191239433 + - !!python/tuple + - 0.9353731942685631 + - 3.762945366998482 + - 2.182712276306774 + - 1.2064594954150458 + - 1.5198741621795235 + - 1.2699084690905156 + - 1.3915303993705823 + - 1.2854106497223978 + - 2.451946292057798 + - 1.67391011124008 + - 1.5042737842098863 + - 1.6764406180932314 + - 1.4872926774843693 + - !!python/tuple + - 0.9331858504243117 + - 3.7587687350559946 + - 2.1821363234142193 + - 1.2056607815292275 + - 1.5192300823783458 + - 1.2699897251101424 + - 1.3917892132875038 + - 1.282857556145265 + - 2.453971834964251 + - 1.6732203345354284 + - 1.5059307463959282 + - 1.6761325423949813 + - 1.484159203358453 + - !!python/tuple + - 0.9324694293773771 + - 3.757315753736086 + - 2.1819367103868936 + - 1.205390343706425 + - 1.5190089078789344 + - 1.270017349725969 + - 1.3910639056606193 + - 1.285078989241089 + - 2.452021482926862 + - 1.6739707354880757 + - 1.5044063256392846 + - 1.6764170594411323 + - 1.4861238725666108 + - !!python/tuple + - 0.9314775829649627 + - 3.7552621716749943 + - 2.181654954079291 + - 1.2050116757162197 + - 1.5186977134957667 + - 1.2700560841882707 + - 1.391195444751582 + - 1.2838258550030979 + - 2.4530185118178682 + - 1.6736308586714324 + - 1.5052211003727336 + - 1.6762655166427884 + - 1.4845897776439232 + - !!python/tuple + - 0.930928385192426 + - 3.754091111563746 + - 2.1814945784435493 + - 1.2047985833259145 + - 1.5185213818851695 + - 1.2700779254608223 + - 1.3906134158126142 + - 1.2856114102399039 + - 2.453064495915224 + - 1.6734379413647675 + - 1.5043872732256942 + - 1.6764946211416123 + - 1.4839984253129495 + - !!python/tuple + - 0.9303676988753017 + - 3.7528753909237986 + - 2.181328261893824 + - 1.2045790273260975 + - 1.518338989373355 + - 1.2701004549971173 + - 1.3906937060111668 + - 1.2848654904181989 + - 2.451973770380061 + - 1.6740657953526294 + - 1.5044620230134478 + - 1.6764046119656322 + - 1.4853565037010477 + - !!python/tuple + - 0.929374407876172 + - 3.7506838533556026 + - 2.1810287766259284 + - 1.2041863326375088 + - 1.5180114352075493 + - 1.2701407991134346 + - 1.3908377210001248 + - 1.283529432143882 + - 2.4530388965745047 + - 1.6737022170871403 + - 1.5053319632885924 + - 1.676242798543833 + - 1.483723713143225 + - !!python/tuple + - 0.9290425511426343 + - 3.7499280875004493 + - 2.1809257008866605 + - 1.2040528184223214 + - 1.5178992437849388 + - 1.270154545803395 + - 1.3904628868845412 + - 1.2846841649344278 + - 2.4520231781916344 + - 1.6740923266104548 + - 1.5045391717403898 + - 1.676390846680051 + - 1.4847486172124165 + - !!python/tuple + - 0.9285857875195709 + - 3.7488765211748785 + - 2.180782379723785 + - 1.2038679517008415 + - 1.5177435076556327 + - 1.2701735940161134 + - 1.3905330837475447 + - 1.2840437126851196 + - 2.4525345488001906 + - 1.673917688375698 + - 1.5049565894883585 + - 1.676313189012274 + - 1.4839669150394477 + - !!python/tuple + - 0.9283310436059811 + - 3.7482810998335636 + - 2.1807013047762682 + - 1.203763984916702 + - 1.5176556141041082 + - 1.2701843177082166 + - 1.390238441467235 + - 1.284952135371726 + - 2.4525581891630743 + - 1.673819038925524 + - 1.5045325742281637 + - 1.6764297700439843 + - 1.4836671400883863 + - !!python/tuple + - 0.9280702364887308 + - 3.7476662688509847 + - 2.1806176318216974 + - 1.2036570409695266 + - 1.5175650232054048 + - 1.270195355015648 + - 1.3902800962115998 + - 1.2845766356372046 + - 2.452006111691099 + - 1.6741363910969438 + - 1.5045701210372735 + - 1.6763842895033993 + - 1.4843555702493956 + - !!python/tuple + - 0.9276071932587442 + - 3.746564985714488 + - 2.1804678401052895 + - 1.203466242674109 + - 1.5174030670154373 + - 1.2702150587065295 + - 1.3903545196382991 + - 1.283906218300413 + - 2.4525419415191108 + - 1.6739532845712362 + - 1.5050073756840656 + - 1.6763029374923695 + - 1.4835380399910951 + - !!python/tuple + - 0.9274506313121298 + - 3.7461866493706553 + - 2.1804164315047454 + - 1.2034011612469453 + - 1.5173476187904524 + - 1.2702217870741899 + - 1.3901674978556637 + - 1.2844840193915736 + - 2.452033158676047 + - 1.6741485153854272 + - 1.5046105622153922 + - 1.676377061600025 + - 1.4840518238107072 + - !!python/tuple + - 0.9277094494689413 + - 3.740118771254936 + - 2.180317026220997 + - 1.203728493319585 + - 1.5174618946826681 + - 1.2707615350390695 + - 1.3908814240263658 + - 1.283680418866788 + - 2.453370155619663 + - 1.6741325362148816 + - 1.5052633884679276 + - 1.676580417854791 + - 1.4827690733233694 + - !!python/tuple + - 0.9278026391019103 + - 3.7378503753011483 + - 2.1802799507926713 + - 1.2038488352815155 + - 1.517504274315754 + - 1.2709604886622066 + - 1.3906449196232151 + - 1.285284826800722 + - 2.45223714939911 + - 1.6747343900916587 + - 1.5042178965013322 + - 1.6768963173496836 + - 1.4841633685747022 + - !!python/tuple + - 0.9284601252655255 + - 3.7216225298036596 + - 2.180014946557769 + - 1.204704419806704 + - 1.5178065491262247 + - 1.2723763395368146 + - 1.3925415376489472 + - 1.2831038419949146 + - 2.4558144901766497 + - 1.6746816510424873 + - 1.5059743876591862 + - 1.6774317937479535 + - 1.4807273854847134 + - !!python/tuple + - 0.9286707282859215 + - 3.7158562467773395 + - 2.179921363860193 + - 1.2049949762534038 + - 1.517911664022519 + - 1.2728606363742896 + - 1.3919217730790618 + - 1.2871971805753224 + - 2.4529246198215966 + - 1.6762109300543406 + - 1.5033061463336355 + - 1.6782310905256534 + - 1.4842957668603167 + - !!python/tuple + - 0.9300259728484822 + - 3.677404728248437 + - 2.17929869143886 + - 1.2069020596153217 + - 1.5186072906559454 + - 1.2760472987910534 + - 1.396335237833036 + - 1.2818480562738819 + - 2.4614099786843266 + - 1.676026145510781 + - 1.507527706937742 + - 1.679448910813662 + - 1.4761295309393931 + - !!python/tuple + - 0.930367121384858 + - 3.664777240479459 + - 2.1790971954681075 + - 1.2074627037028307 + - 1.5188241654098562 + - 1.2770014698751264 + - 1.3948846537421193 + - 1.290887995275333 + - 2.4550305802177497 + - 1.679371692968606 + - 1.5016308977129915 + - 1.6811801700774278 + - 1.4840666529403341 + - !!python/tuple + - 0.9322799106152887 + - 3.5881083248552113 + - 2.1778796488183936 + - 1.2107498497753464 + - 1.5201190678035705 + - 1.2826277397706964 + - 1.4033126922239687 + - 1.2795134332867755 + - 2.4719807333577934 + - 1.6787469555209085 + - 1.5102785291364285 + - 1.6833840497818104 + - 1.4677284734154867 + - !!python/tuple + - 0.9325917524630042 + - 3.5646839429083377 + - 2.177518455555016 + - 1.2115444847800327 + - 1.52047465462122 + - 1.2840462559656003 + - 1.4002988950247741 + - 1.2965691257137821 + - 2.459954066304799 + - 1.684943347229449 + - 1.4991441291879117 + - 1.6865285695618673 + - 1.4828976751439782 + - !!python/tuple + - 0.9381477555312546 + - 3.0781316561587704 + - 2.1700820678949273 + - 1.227001728097764 + - 1.527632818656157 + - 1.3119496524458818 + - 1.4495165854591063 + - 1.217220042895927 + - 2.355502026974436 + - 1.7295132993778997 + - 1.5317710652271093 + - 1.697931741518628 + - 1.6973271738788145 + - !!python/tuple + - 0.9370971531928209 + - 3.034782072392021 + - 2.177754944911378 + - 1.2247594020105277 + - 1.5278455908871538 + - 1.3360001717804841 + - 1.4058476115049223 + - 1.2771038641618775 + - 2.364708534232037 + - 1.7020313145662442 + - 1.5262570300328955 + - 1.7100583870399053 + - 1.664488296217878 + - !!python/tuple + - 0.9355574450654268 + - 2.9469519409826312 + - 2.193073406039569 + - 1.2207580024108096 + - 1.5282518411887593 + - 1.380198057683037 + - 1.3621758719848212 + - 1.265967467686404 + - 2.4001409111686822 + - 1.6749912349901224 + - 1.557820229868948 + - 1.7099976463808448 + - 1.591679978092115 + - !!python/tuple + - 0.9350257173610917 + - 2.876085452239599 + - 2.1912988403195164 + - 1.2212335635536766 + - 1.5285410619919706 + - 1.3687315372675246 + - 1.3582001347193526 + - 1.3254670549485894 + - 2.414292107151841 + - 1.6616817377210382 + - 1.5325330280121958 + - 1.7183640736699899 + - 1.5636888555526904 + - !!python/tuple + - 0.9345500855765594 + - 2.7566374198485533 + - 2.1883723578331824 + - 1.2218731590799723 + - 1.5289821753182717 + - 1.352049368848823 + - 1.3824570340693563 + - 1.295097075351348 + - 2.461709008008851 + - 1.6408057046446891 + - 1.5530345654687705 + - 1.7171748717130402 + - 1.5078353901365307 + - !!python/tuple + - 0.9345107078202511 + - 2.7034969032228324 + - 2.1871157160061014 + - 1.2220587767948532 + - 1.5291465834577087 + - 1.3464327173887627 + - 1.3769245883564754 + - 1.3375736099739741 + - 2.430385582384931 + - 1.6596006015425748 + - 1.5201859969511888 + - 1.723308750511222 + - 1.5438681590562242 + - !!python/tuple + - 0.9344674089595139 + - 2.6112452615132193 + - 2.184965709408491 + - 1.2223308966917623 + - 1.5294114824253322 + - 1.3377702647920218 + - 1.3925717572872105 + - 1.3102474303136897 + - 2.468104456445279 + - 1.6429704297621124 + - 1.538638271899158 + - 1.721822325007027 + - 1.5015760022613562 + - !!python/tuple + - 0.9344601314337683 + - 2.5665490079609223 + - 2.1839486359497444 + - 1.2224264171660166 + - 1.5295236445036229 + - 1.3344159878335429 + - 1.3987871195479546 + - 1.2997943243354368 + - 2.4500675285563167 + - 1.6593658021086537 + - 1.53468923333711 + - 1.7211592603999113 + - 1.5286412529023208 + - !!python/tuple + - 0.9066791140656085 + - 2.553326470717097 + - 2.1826370333142004 + - 1.213521115212275 + - 1.529660928359577 + - 1.3324335062733181 + - 1.3618291962630704 + - 1.2876367583133095 + - 2.45749739880114 + - 1.6603155786796768 + - 1.5394411752877712 + - 1.720327899674244 + - 1.5086191654213201 + - !!python/tuple + - 0.9049222580455359 + - 2.5518156025602217 + - 2.182489159954686 + - 1.2126870749049 + - 1.5296753557880873 + - 1.3322369400532756 + - 1.3562302719266937 + - 1.2935546195991765 + - 2.4568565195728906 + - 1.660417800379207 + - 1.536249690540522 + - 1.7211356879372985 + - 1.5073109338528183 + - !!python/tuple + - 0.9067647541474363 + - 2.543950046979987 + - 2.1823179018805234 + - 1.2129635304231747 + - 1.5296919365208343 + - 1.3317469231636523 + - 1.3580267906662504 + - 1.2920429786019798 + - 2.459013800348137 + - 1.6605355809047266 + - 1.5368738992372755 + - 1.7210230466711913 + - 1.5048886583525884 + - !!python/tuple + - 0.90359026489163 + - 2.541270054837391 + - 2.1820537427582924 + - 1.2114840690075548 + - 1.5297172832983996 + - 1.3314145523570435 + - 1.3514221142070493 + - 1.2897530005614994 + - 2.460531457536253 + - 1.6607161704965538 + - 1.5378282952804616 + - 1.7208501483320402 + - 1.501188181511263 + - !!python/tuple + - 0.901743427939586 + - 2.539542927180184 + - 2.181883959945149 + - 1.210566676335616 + - 1.529733348441224 + - 1.3312062238741367 + - 1.3472754742860682 + - 1.2883222592599035 + - 2.461509045954151 + - 1.6608311670077813 + - 1.5384333975812114 + - 1.720739862941005 + - 1.498845494018868 + - !!python/tuple + - 0.9010670092316948 + - 2.5388675275376293 + - 2.181817680079509 + - 1.2102167206573637 + - 1.5297395637930642 + - 1.3311261994176389 + - 1.3456813130616336 + - 1.287773850638171 + - 2.459781024628655 + - 1.6619150747155846 + - 1.5381551748048956 + - 1.720697020251325 + - 1.5007751329323333 + - !!python/tuple + - 0.9017017005590059 + - 2.536497918271394 + - 2.181766784277216 + - 1.2103208216947776 + - 1.5297443198001508 + - 1.3309847652164224 + - 1.3462880218671953 + - 1.2873557259185884 + - 2.460431207574352 + - 1.6619459325329833 + - 1.538336436198052 + - 1.7206641846088977 + - 1.5000700536768743 + - !!python/tuple + - 0.9005982870773905 + - 2.535400204887656 + - 2.1816588426959553 + - 1.2097533598140122 + - 1.5297543793431863 + - 1.3308569440223066 + - 1.343695959762106 + - 1.2864738075477413 + - 2.4610578941062347 + - 1.6620112598326295 + - 1.5387198525101755 + - 1.7205946480833136 + - 1.4985790911711492 + - !!python/tuple + - 0.9010189941562322 + - 2.5338545063551767 + - 2.1816257463047513 + - 1.2098238640347776 + - 1.5297574460724044 + - 1.3307656603668703 + - 1.344100072085089 + - 1.2862065543102517 + - 2.4604214120590164 + - 1.6625534337876773 + - 1.5385792963282017 + - 1.7205733939400527 + - 1.4995494568722807 + - !!python/tuple + - 0.9001504406823436 + - 2.532971139814538 + - 2.1815388223103294 + - 1.209372167183546 + - 1.529765486338619 + - 1.3306646662267128 + - 1.3420271614785826 + - 1.2855071610765378 + - 2.4581406566624766 + - 1.6639757332453857 + - 1.5382107729280419 + - 1.7205176259103212 + - 1.5020931063727803 + - !!python/tuple + - 0.9009807939504475 + - 2.5299652666337984 + - 2.1814746169470207 + - 1.209513424462928 + - 1.529771397703173 + - 1.3304885087187548 + - 1.3428266249736271 + - 1.2849954480423902 + - 2.458969333321001 + - 1.6640065964170028 + - 1.5384409360306008 + - 1.72047653769701 + - 1.5011894252415154 + - !!python/tuple + - 0.8996205977438433 + - 2.5285892501101594 + - 2.181338858883466 + - 1.208811908877005 + - 1.5297838541032707 + - 1.3303347603974167 + - 1.339596192212063 + - 1.2839210488267097 + - 2.4597678649497223 + - 1.664071707198859 + - 1.53892597686545 + - 1.7203898219297595 + - 1.4992857642314508 + - !!python/tuple + - 0.8988023352859971 + - 2.527716164921157 + - 2.1812528380851437 + - 1.208375689223706 + - 1.5297916895371373 + - 1.3302386104996047 + - 1.3375751429314409 + - 1.2832504263701205 + - 2.460274425907172 + - 1.6641127658230779 + - 1.5392311403498942 + - 1.7203350942246762 + - 1.4980891127198663 + - !!python/tuple + - 0.8985157058253023 + - 2.5273998619333025 + - 2.181221701371365 + - 1.2082196641637548 + - 1.5297945126188668 + - 1.3302040956844898 + - 1.3368495043922104 + - 1.283009988144196 + - 2.4594489299574307 + - 1.664624515118999 + - 1.5390961096215001 + - 1.7203153345753643 + - 1.4990138206859838 + - !!python/tuple + - 0.8988257333122613 + - 2.5263338452748294 + - 2.1811990852991103 + - 1.208274198350997 + - 1.5297965597288565 + - 1.3301427866616855 + - 1.3371479374507507 + - 1.282835948077503 + - 2.4597428608691136 + - 1.6646345499306983 + - 1.5391762973952723 + - 1.7203009953265282 + - 1.4986986976795957 + - !!python/tuple + - 0.8986450551471968 + - 2.5261351591649057 + - 2.1811795080340657 + - 1.2081762788245096 + - 1.5297983296258375 + - 1.3301212864606342 + - 1.3366920237356936 + - 1.2826856703294414 + - 2.4592232446056084 + - 1.6649561520124796 + - 1.5390913539053244 + - 1.7202885910182892 + - 1.4992799521166196 + - !!python/tuple + - 0.8979694799359513 + - 2.5253865868720737 + - 2.181105763049713 + - 1.2078084273135647 + - 1.529804989578937 + - 1.3300404510947552 + - 1.3349778388489746 + - 1.2821208226928726 + - 2.459660267883061 + - 1.6649873545478386 + - 1.5393531654958847 + - 1.7202418925124054 + - 1.4982494809205709 + - !!python/tuple + - 0.8981724483085649 + - 2.524700304342666 + - 2.181091239675721 + - 1.2078445603156165 + - 1.5298062959832945 + - 1.3300012480950176 + - 1.3349817714624974 + - 1.2827383938020285 + - 2.4592245654539044 + - 1.6652262395207706 + - 1.5389114596034132 + - 1.7203247453826687 + - 1.4987634379867396 + - !!python/tuple + - 0.898615447387671 + - 2.523193927652686 + - 2.181059365826593 + - 1.2079237000894463 + - 1.5298091608512001 + - 1.3299153318578794 + - 1.3354112792274015 + - 1.2824934106752226 + - 2.459640491246018 + - 1.6652392103027387 + - 1.5390253659596194 + - 1.7203044442387896 + - 1.4983183743013575 + - !!python/tuple + - 0.8983671940474133 + - 2.5229199468879004 + - 2.1810323235930964 + - 1.207789490945178 + - 1.529811587268165 + - 1.3298862863167025 + - 1.3347848245799034 + - 1.2822863008701648 + - 2.458919946594666 + - 1.6656841608459496 + - 1.538907897090827 + - 1.7202872366466857 + - 1.4991253542201612 + - !!python/tuple + - 0.8978726134020019 + - 2.5223683186136636 + - 2.180977892033514 + - 1.2075203654705202 + - 1.5298164641172844 + - 1.3298279757898253 + - 1.333527132543966 + - 1.2818706795776769 + - 2.4592441933945453 + - 1.6657047564104273 + - 1.5391027586789883 + - 1.7202526282456159 + - 1.4983623115208156 + - !!python/tuple + - 0.8975682529459215 + - 2.522021502616482 + - 2.1809436889505864 + - 1.2073525376878342 + - 1.5298195195597308 + - 1.3297915290695592 + - 1.3327409659823064 + - 1.281611104671381 + - 2.459448035406229 + - 1.665717673038871 + - 1.539224853116019 + - 1.7202309164073892 + - 1.497884386941763 + - !!python/tuple + - 0.8976621786138977 + - 2.5217079951939323 + - 2.180937076276804 + - 1.207369571904359 + - 1.5298201091923873 + - 1.3297738039683098 + - 1.332744608492358 + - 1.2818940651978792 + - 2.459248765846871 + - 1.6658266336668024 + - 1.539022878387506 + - 1.7202688188909716 + - 1.4981196917736992 + - !!python/tuple + - 0.8975065165504454 + - 2.5215291047864343 + - 2.1809194334063724 + - 1.207283348170575 + - 1.5298216817922774 + - 1.3297551021281457 + - 1.332340334515155 + - 1.2817599556698551 + - 2.4593540338302073 + - 1.66583316653282 + - 1.5390860456638498 + - 1.7202575897033974 + - 1.4978732550072866 + - !!python/tuple + - 0.8975777364137364 + - 2.5212918527721766 + - 2.180914431657244 + - 1.2072962997795325 + - 1.5298221271980794 + - 1.3297417087249572 + - 1.3324097132921289 + - 1.2817220107865541 + - 2.459255985330843 + - 1.6659156031261766 + - 1.5390642071552225 + - 1.7202544078947433 + - 1.4980233064753534 + - !!python/tuple + - 0.8974807110325104 + - 2.5211799955012193 + - 2.1809033986247472 + - 1.2072424806021413 + - 1.529823109423627 + - 1.3297300504874108 + - 1.3321571979821232 + - 1.2816383575508743 + - 2.4593218559997725 + - 1.6659196282585176 + - 1.5391036975369545 + - 1.7202473903899766 + - 1.4978691904042962 + - !!python/tuple + - 0.8975041174355759 + - 2.521102091050105 + - 2.180901756770727 + - 1.2072467452840643 + - 1.5298232555037954 + - 1.3297256571906606 + - 1.3321800200621832 + - 1.2816259242945285 + - 2.459289657312977 + - 1.665946691856486 + - 1.5390965232804585 + - 1.7202463464383153 + - 1.4979184688301383 + - !!python/tuple + - 0.8974747137469313 + - 2.5210680877049945 + - 2.1808984029072365 + - 1.207230407176389 + - 1.5298235538795133 + - 1.3297221187733348 + - 1.3321033281869068 + - 1.2816005311918 + - 2.4593096859285484 + - 1.6659479091957243 + - 1.5391085232576882 + - 1.7202442140312846 + - 1.4978716340623803 + - !!python/tuple + - 0.8974641950152151 + - 2.52105590753375 + - 2.1808972015768364 + - 1.2072245577242917 + - 1.529823660736187 + - 1.3297208517511507 + - 1.3320758666068955 + - 1.2815914389813565 + - 2.45927753710064 + - 1.6659677120447205 + - 1.5391032726964795 + - 1.7202434502939294 + - 1.4979076955451993 + - !!python/tuple + - 0.8974253906993664 + - 2.521010952924886 + - 2.180892767756989 + - 1.2072029724374271 + - 1.5298240550926498 + - 1.329716176026116 + - 1.3319745243397736 + - 1.281557886353715 + - 2.459304019517997 + - 1.665969315610727 + - 1.5391191363426677 + - 1.7202406316244705 + - 1.4978457759665957 + - !!python/tuple + - 0.8974432788675313 + - 2.5209515134487344 + - 2.1808915153542476 + - 1.207206234846231 + - 1.529824166458129 + - 1.3297128260006246 + - 1.331991966931452 + - 1.2815484135955841 + - 2.459279451416821 + - 1.665989961945929 + - 1.5391136606027433 + - 1.7202398355511839 + - 1.4978833794413011 + - !!python/tuple + - 0.8974190669215001 + - 2.520923441877034 + - 2.180888746610897 + - 1.2071927620501528 + - 1.5298244126421205 + - 1.3297099085228288 + - 1.3319287015741987 + - 1.2815274746833716 + - 2.459295991208332 + - 1.6659909595246658 + - 1.5391235660877451 + - 1.7202380757013045 + - 1.497844712793635 + - !!python/tuple + - 0.8974302360658235 + - 2.520886336623849 + - 2.180887964858238 + - 1.2071948000312347 + - 1.529824482141562 + - 1.3297078178064863 + - 1.331939595021469 + - 1.2815215644334272 + - 2.4592806541070855 + - 1.6660038474103709 + - 1.539120147444413 + - 1.7202375788497524 + - 1.4978681877376498 + - !!python/tuple + - 0.8974151277493909 + - 2.5208688112601005 + - 2.1808862362737904 + - 1.207186391158195 + - 1.5298246358098144 + - 1.3297059972702017 + - 1.331900104478795 + - 1.2815084970394581 + - 2.4592909812509918 + - 1.6660044687449758 + - 1.539126331362078 + - 1.7202364802542354 + - 1.4978440472068675 + - !!python/tuple + - 0.8974123639716524 + - 2.520865603159068 + - 2.1808859198537083 + - 1.2071848522729614 + - 1.529824663936393 + - 1.3297056640743323 + - 1.3318928768832363 + - 1.2815061054965722 + - 2.4592825107017946 + - 1.6660096853107247 + - 1.5391249474709712 + - 1.7202362791649137 + - 1.497853549561294 + - !!python/tuple + - 0.8974156591395325 + - 2.5208546585628775 + - 2.1808856892807174 + - 1.2071854537182494 + - 1.529824684431673 + - 1.3297050475043428 + - 1.3318960911316688 + - 1.281504362858709 + - 2.459285536853982 + - 1.6660097681081034 + - 1.5391257722916591 + - 1.7202361326339757 + - 1.4978503296057128 + - !!python/tuple + - 0.8974100661182232 + - 2.5208481666997784 + - 2.180885048971458 + - 1.207182339674841 + - 1.529824741347071 + - 1.3297043733136216 + - 1.3318814654269249 + - 1.2814995236176379 + - 2.459289362462866 + - 1.666009998037437 + - 1.5391280628197228 + - 1.720235725715217 + - 1.4978413877993444 + - !!python/tuple + - 0.8974126485363596 + - 2.520839590059732 + - 2.180884868288155 + - 1.207182811072007 + - 1.529824757406975 + - 1.3297038901698834 + - 1.33188398452115 + - 1.2814981581723963 + - 2.459285817310676 + - 1.6660129768560816 + - 1.539127272533155 + - 1.7202356108925294 + - 1.497846814093422 + - !!python/tuple + - 0.8974091583209103 + - 2.52083553847855 + - 2.180884468668603 + - 1.207180867717434 + - 1.5298247929265205 + - 1.3297034694531948 + - 1.331874856953384 + - 1.2814951382610815 + - 2.4592882049421343 + - 1.6660131202770951 + - 1.5391287020456215 + - 1.7202353569390958 + - 1.497841233469546 + - !!python/tuple + - 0.8974079052676875 + - 2.520834083656841 + - 2.18088432517577 + - 1.2071801699491056 + - 1.5298248056803756 + - 1.3297033183908211 + - 1.331871579611575 + - 1.2814940539392743 + - 2.459284363460428 + - 1.6660154859689797 + - 1.5391280744077442 + - 1.7202352657522013 + - 1.497845542930102 + - !!python/tuple + - 0.8974070315707369 + - 2.520833069218927 + - 2.1808842251192764 + - 1.2071796834101611 + - 1.5298248145734754 + - 1.3297032130576152 + - 1.3318692943770614 + - 1.2814932978618514 + - 2.459284961286274 + - 1.6660155218631143 + - 1.5391284323272156 + - 1.7202352021685228 + - 1.4978441456465175 + - !!python/tuple + - 0.897407421013025 + - 2.520831775936511 + - 2.180884197874293 + - 1.2071797545053442 + - 1.529824816995018 + - 1.3297031402073143 + - 1.3318696742782918 + - 1.2814930919873038 + - 2.4592853188786785 + - 1.666015531636909 + - 1.5391285297867427 + - 1.7202351848549926 + - 1.497843765174053 + - !!python/tuple + - 0.8974072088904432 + - 2.5208315296392385 + - 2.1808841735813767 + - 1.2071796363788492 + - 1.5298248191541766 + - 1.3297031146337066 + - 1.3318691194454126 + - 1.2814929084203739 + - 2.4592846685234337 + - 1.6660159321409664 + - 1.539128423529005 + - 1.720235169417442 + - 1.4978444947533343 + - !!python/tuple + - 0.8974074619758973 + - 2.5208306891746926 + - 2.180884155875714 + - 1.2071796825815944 + - 1.5298248207278569 + - 1.3297030672907233 + - 1.331869366332098 + - 1.2814927746297151 + - 2.4592849009120044 + - 1.666015938492194 + - 1.5391284868650108 + - 1.7202351581659372 + - 1.4978442474952647 + - !!python/tuple + - 0.8974064493101632 + - 2.5208295133647813 + - 2.1808840399025478 + - 1.2071791186523573 + - 1.5298248310355484 + - 1.329702945204522 + - 1.331866717589047 + - 1.2814918982945245 + - 2.459285593840215 + - 1.666015980093093 + - 1.539128901719305 + - 1.7202350844679368 + - 1.4978426279416164 + - !!python/tuple + - 0.8974069170706304 + - 2.5208279600269314 + - 2.1808840071792246 + - 1.207179204046712 + - 1.5298248339439782 + - 1.3297028577063417 + - 1.3318671738926722 + - 1.2814916510284775 + - 2.459284951766162 + - 1.6660165195861552 + - 1.5391287585851539 + - 1.720235063673168 + - 1.4978436107155821 + - !!python/tuple + - 0.8974062850200014 + - 2.5208272261354976 + - 2.1808839347935653 + - 1.2071788520697189 + - 1.5298248403775616 + - 1.3297027815067668 + - 1.3318655206695678 + - 1.2814911040653831 + - 2.459285384265088 + - 1.6660165455491327 + - 1.539129017519567 + - 1.7202350176741237 + - 1.4978425998568734 + - !!python/tuple + - 0.8974065769776954 + - 2.5208262566085122 + - 2.180883914369111 + - 1.2071789053701838 + - 1.5298248421928649 + - 1.3297027268945212 + - 1.3318658054780752 + - 1.2814909497346487 + - 2.4592849835096806 + - 1.6660168822771657 + - 1.5391289281810858 + - 1.720235004694987 + - 1.4978432132629063 + - !!python/tuple + - 0.8974063134919354 + - 2.520825950663988 + - 2.180883884192977 + - 1.2071787586391425 + - 1.5298248448748837 + - 1.3297026951288553 + - 1.3318651162857718 + - 1.2814907217190465 + - 2.4592841756461663 + - 1.666017379776033 + - 1.5391287961879838 + - 1.720234985518958 + - 1.4978441195392667 + - !!python/tuple + - 0.8974058869004758 + - 2.5208254553246454 + - 2.1808838353363362 + - 1.2071785210753918 + - 1.5298248492171966 + - 1.3297026436988353 + - 1.331864000452888 + - 1.2814903525518526 + - 2.4592844675627408 + - 1.666017397297092 + - 1.5391289709560172 + - 1.720234954472054 + - 1.4978434372564258 + - !!python/tuple + - 0.8974060769808732 + - 2.520824824117293 + - 2.180883822039091 + - 1.2071785557772494 + - 1.5298248503990348 + - 1.329702608143919 + - 1.3318641858791926 + - 1.2814902520766736 + - 2.4592846420921326 + - 1.6660174020657663 + - 1.5391290185222712 + - 1.720234946022073 + - 1.4978432515609796 + - !!python/tuple + - 0.8974055437445679 + - 2.520824204941017 + - 2.180883760968066 + - 1.2071782588230313 + - 1.5298248558269276 + - 1.3297025438567136 + - 1.3318627910876224 + - 1.2814897906192075 + - 2.4592850069892696 + - 1.6660174239671222 + - 1.5391292369823986 + - 1.7202349072133722 + - 1.4978423987074603 + - !!python/tuple + - 0.8974057900674296 + - 2.520823386975579 + - 2.180883743736535 + - 1.2071783037930626 + - 1.5298248573584328 + - 1.3297024977822027 + - 1.331863031379551 + - 1.281489660417297 + - 2.459284668881782 + - 1.6660177080554261 + - 1.5391291616093816 + - 1.7202348962633003 + - 1.4978429162235571 + - !!python/tuple + - 0.8974054572515475 + - 2.520823000516645 + - 2.180883705619034 + - 1.2071781184501895 + - 1.5298248607462395 + - 1.329702457657762 + - 1.3318621608234895 + - 1.2814893724009935 + - 2.4592848966329437 + - 1.666017721724448 + - 1.5391292979612061 + - 1.7202348720408926 + - 1.497842383914679 + - !!python/tuple + - 0.8974053377495137 + - 2.5208228617512787 + - 2.1808836919322316 + - 1.207178051899717 + - 1.5298248619626924 + - 1.3297024432503843 + - 1.331861848235197 + - 1.2814892689837918 + - 2.4592845302131314 + - 1.6660179473725376 + - 1.539129238093144 + - 1.7202348633433937 + - 1.4978427949722875 + - !!python/tuple + - 0.8974054803230272 + - 2.520822388309814 + - 2.180883681958571 + - 1.207178077928901 + - 1.5298248628491287 + - 1.3297024165823972 + - 1.331861987318319 + - 1.2814891936231305 + - 2.4592846611202357 + - 1.666017950948967 + - 1.5391292737703632 + - 1.720234857005473 + - 1.4978426556905506 + - !!python/tuple + - 0.897405402684508 + - 2.5208222981564203 + - 2.180883673066495 + - 1.2071780346922536 + - 1.5298248636394358 + - 1.3297024072222152 + - 1.331861784235225 + - 1.2814891264349606 + - 2.4592844230635684 + - 1.6660180975485555 + - 1.5391292348751209 + - 1.720234851354864 + - 1.497842922747462 + - !!python/tuple + - 0.8974051153336684 + - 2.5208219644851484 + - 2.1808836401555864 + - 1.2071778746671304 + - 1.5298248665644798 + - 1.329702372578807 + - 1.3318610325948563 + - 1.281488877761706 + - 2.4592846197060214 + - 1.666018109349684 + - 1.5391293526022514 + - 1.720234830441117 + - 1.497842463147425 + - !!python/tuple + - 0.8974052480771136 + - 2.5208215236891918 + - 2.1808836308696566 + - 1.2071778989017934 + - 1.5298248673897898 + - 1.3297023477497485 + - 1.3318611620886873 + - 1.2814888075979227 + - 2.459284437502131 + - 1.6660182624426456 + - 1.5391293119841274 + - 1.7202348245402348 + - 1.4978427420334859 + - !!python/tuple + - 0.8974050687276013 + - 2.520821315427647 + - 2.1808836103282476 + - 1.2071777990221437 + - 1.5298248692154577 + - 1.3297023261271244 + - 1.3318606929518932 + - 1.2814886523887512 + - 2.4592845602370517 + - 1.6660182698081354 + - 1.53912938546371 + - 1.7202348114868944 + - 1.49784245517319 + - !!python/tuple + - 0.897405151579833 + - 2.5208210403039253 + - 2.1808836045324185 + - 1.2071778141483371 + - 1.5298248697305756 + - 1.3297023106300454 + - 1.3318607737760069 + - 1.2814886085960515 + - 2.459284446514089 + - 1.6660183653613934 + - 1.5391293601118008 + - 1.7202348078038519 + - 1.4978426292405582 + - !!python/tuple + - 0.8974050396385241 + - 2.520820910316647 + - 2.1808835917114138 + - 1.2071777518081814 + - 1.5298248708700721 + - 1.3297022971342458 + - 1.3318604809627617 + - 1.2814885117218984 + - 2.459284523119647 + - 1.6660183699585127 + - 1.5391294059743672 + - 1.7202347996565623 + - 1.4978424501955239 + - !!python/tuple + - 0.8974049994313233 + - 2.520820863627441 + - 2.180883587106329 + - 1.2071777294167072 + - 1.5298248712793594 + - 1.3297022922867923 + - 1.3318603757893988 + - 1.281488476926415 + - 2.4592843998330443 + - 1.66601844588051 + - 1.5391293858309507 + - 1.720234796730197 + - 1.497842588501092 + - !!python/tuple + - 0.8974048977278299 + - 2.5208207455276024 + - 2.1808835754578175 + - 1.2071776727777561 + - 1.5298248723146468 + - 1.3297022800252174 + - 1.331860109754653 + - 1.2814883889116677 + - 2.4592844694329963 + - 1.6660184500571604 + - 1.5391294274993381 + - 1.7202347893279888 + - 1.4978424258298575 + - !!python/tuple + - 0.8974049447113674 + - 2.5208205895122586 + - 2.1808835721711595 + - 1.2071776813554898 + - 1.5298248726067556 + - 1.3297022712372533 + - 1.3318601555881084 + - 1.2814883640781092 + - 2.459284404943721 + - 1.6660185042428453 + - 1.5391294131229305 + - 1.720234787239437 + - 1.497842524538862 + - !!python/tuple + - 0.8974048812327856 + - 2.5208205157996897 + - 2.180883564900686 + - 1.2071776460040635 + - 1.5298248732529347 + - 1.3297022635841491 + - 1.3318599895413898 + - 1.2814883091433793 + - 2.4592844483848793 + - 1.6660185068496953 + - 1.539129439130447 + - 1.7202347826193156 + - 1.497842423006837 + - !!python/tuple + - 0.8974049105578018 + - 2.5208204184219665 + - 2.180883562849303 + - 1.2071776513579067 + - 1.5298248734352557 + - 1.329702258099103 + - 1.3318600181485938 + - 1.2814882936434167 + - 2.4592844081335867 + - 1.6660185406699453 + - 1.5391294301573406 + - 1.7202347813157368 + - 1.4978424846165403 + - !!python/tuple + - 0.8974048709373496 + - 2.520820372413864 + - 2.180883558311397 + - 1.207177629293137 + - 1.5298248738385718 + - 1.3297022533223821 + - 1.3318599145096734 + - 1.2814882593556394 + - 2.459284435247631 + - 1.6660185422970148 + - 1.5391294463900729 + - 1.7202347784320635 + - 1.4978424212447687 + - !!python/tuple + - 0.8974048886011465 + - 2.520820313758833 + - 2.180883557075756 + - 1.207177632518004 + - 1.529824873948392 + - 1.3297022500184907 + - 1.331859931741106 + - 1.281488250019315 + - 2.459284451465832 + - 1.666018542740055 + - 1.5391294508101345 + - 1.720234777646859 + - 1.49784240398907 + - !!python/tuple + - 0.8974048789813968 + - 2.520820302588168 + - 2.1808835559739626 + - 1.2071776271607293 + - 1.529824874046316 + - 1.3297022488587145 + - 1.3318599065778134 + - 1.281488241694324 + - 2.459284421968762 + - 1.6660185609048435 + - 1.5391294459906952 + - 1.7202347769467097 + - 1.4978424370795251 + - !!python/tuple + - 0.897404843366406 + - 2.520820261231239 + - 2.1808835518948144 + - 1.2071776073266025 + - 1.529824874408859 + - 1.3297022445648985 + - 1.3318598134162722 + - 1.2814882108728813 + - 2.459284446341725 + - 1.66601856236742 + - 1.5391294605823829 + - 1.7202347743545607 + - 1.4978423801143064 + - !!python/tuple + - 0.8974048598193998 + - 2.52082020659689 + - 2.180883550743874 + - 1.207177610330416 + - 1.5298248745111511 + - 1.3297022414874833 + - 1.3318598294665407 + - 1.2814882021765504 + - 2.4592844237584965 + - 1.6660185813424695 + - 1.5391294555479658 + - 1.7202347736231807 + - 1.4978424146808038 + - !!python/tuple + - 0.8974048375901503 + - 2.5208201807837662 + - 2.1808835481978543 + - 1.2071775979508566 + - 1.529824874737434 + - 1.3297022388074795 + - 1.3318597713193372 + - 1.2814881829392113 + - 2.459284438971 + - 1.6660185822553404 + - 1.5391294646554363 + - 1.7202347720052789 + - 1.497842379125691 + - !!python/tuple + - 0.8974048478593702 + - 2.5208201466834654 + - 2.1808835474794894 + - 1.2071775998257028 + - 1.5298248748012802 + - 1.329702236886696 + - 1.3318597813371962 + - 1.2814881775113558 + - 2.459284424875565 + - 1.6660185940987113 + - 1.5391294615131796 + - 1.7202347715487845 + - 1.4978424007005429 + - !!python/tuple + - 0.8974048339848708 + - 2.520820130572065 + - 2.1808835458903775 + - 1.2071775920989363 + - 1.5298248749425156 + - 1.329702235213958 + - 1.3318597450443115 + - 1.2814881655042714 + - 2.459284434370532 + - 1.6660185946684833 + - 1.5391294671976563 + - 1.7202347705389625 + - 1.4978423785086272 + - !!python/tuple + - 0.897404829000649 + - 2.5208201247842643 + - 2.1808835453195106 + - 1.2071775893232013 + - 1.5298248749932526 + - 1.3297022346130498 + - 1.3318597320065895 + - 1.2814881611908906 + - 2.4592844190873575 + - 1.666018604080116 + - 1.5391294647005827 + - 1.7202347701761977 + - 1.4978423956536264 + - !!python/tuple + - 0.89740482373393 + - 2.5208200775141734 + - 2.180883328660287 + - 1.2071776027087322 + - 1.5298249007141038 + - 1.329702248923023 + - 1.3318596378785275 + - 1.281488154987949 + - 2.4592844621813157 + - 1.6660186273497566 + - 1.5391293510445 + - 1.7202347865809866 + - 1.4978423440607964 + - !!python/tuple + - 0.8974048438912392 + - 2.520820035702815 + - 2.180883293208834 + - 1.2071776117198343 + - 1.5298249049227466 + - 1.3297022497846447 + - 1.3318596560540323 + - 1.2814881539729768 + - 2.4592844458673198 + - 1.666018645879483 + - 1.539129325189003 + - 1.7202347892652643 + - 1.4978423757817925 + - !!python/tuple + - 0.8974048186839786 + - 2.5208198094630996 + - 2.1808822562545913 + - 1.2071776757843233 + - 1.529825028025448 + - 1.3297023182736674 + - 1.3318592055472327 + - 1.2814881242850582 + - 2.4592846521196425 + - 1.6660187572504201 + - 1.5391287812190386 + - 1.7202348677803236 + - 1.4978421288529855 + - !!python/tuple + - 0.8974049151586455 + - 2.5208196093502795 + - 2.180882086580957 + - 1.2071777189121942 + - 1.529825048168333 + - 1.3297023223974238 + - 1.3318592925370536 + - 1.2814881194273309 + - 2.459284574039402 + - 1.6660188459352843 + - 1.539128657472569 + - 1.7202348806274905 + - 1.4978422806725562 + - !!python/tuple + - 0.8974047945117274 + - 2.520818526559391 + - 2.1808771236828397 + - 1.2071780255248277 + - 1.529825637340967 + - 1.329702650187264 + - 1.3318571364004477 + - 1.281487977340478 + - 2.4592855611705917 + - 1.666019378959112 + - 1.5391260540188534 + - 1.720235256402852 + - 1.4978410988629487 + - !!python/tuple + - 0.89740525623422 + - 2.520817568831343 + - 2.1808763116377587 + - 1.207178231931046 + - 1.529825733742541 + - 1.3297026699223904 + - 1.3318575527345984 + - 1.2814879540921351 + - 2.4592851874825956 + - 1.6660198033989364 + - 1.5391254617802512 + - 1.7202353178881553 + - 1.497841825464816 + - !!python/tuple + - 0.8974046787619823 + - 2.5208123869378496 + - 2.180852560777427 + - 1.20717969923217 + - 1.5298285533120333 + - 1.3297042385993065 + - 1.3318472342429317 + - 1.2814872741215655 + - 2.4592899115936744 + - 1.6660223542537589 + - 1.53911300258786 + - 1.7202371162216632 + - 1.4978361696984706 + - !!python/tuple + - 0.8974068882244388 + - 2.5208078039822746 + - 2.180848675014257 + - 1.2071806869072206 + - 1.5298290145917548 + - 1.3297043330153515 + - 1.3318492266388957 + - 1.2814871628830566 + - 2.4592881233940527 + - 1.666024385283818 + - 1.5391101686920379 + - 1.72023741043258 + - 1.4978396467163528 + - !!python/tuple + - 0.897404123434675 + - 2.5207830137856586 + - 2.1807350506948486 + - 1.2071877053450595 + - 1.52984250287903 + - 1.329711837085574 + - 1.331799865084658 + - 1.2814839101763842 + - 2.459310723890854 + - 1.6660365879406176 + - 1.539050566406638 + - 1.720246013481066 + - 1.4978125894945695 + - !!python/tuple + - 0.8974146890562711 + - 2.520761098670548 + - 2.1807164709506575 + - 1.2071924276512416 + - 1.5298447080966697 + - 1.3297122880860055 + - 1.3318093956376025 + - 1.2814833784839192 + - 2.459302172624745 + - 1.666046299725908 + - 1.5390370175036305 + - 1.720247420112933 + - 1.4978292174324412 + - !!python/tuple + - 0.8974014351091991 + - 2.5206427008613055 + - 2.180173799240061 + - 1.2072259217155932 + - 1.529909115656609 + - 1.3297481163782212 + - 1.3315736942388372 + - 1.2814678498600436 + - 2.459410120045806 + - 1.6661045648741941 + - 1.538752415316163 + - 1.7202885039791613 + - 1.4976999919765885 + - !!python/tuple + - 0.897451795331547 + - 2.520538256079552 + - 2.180085284250163 + - 1.2072484132948098 + - 1.529919612626572 + - 1.3297502547512365 + - 1.331619187791431 + - 1.2814653212494647 + - 2.459369358435963 + - 1.666150842234662 + - 1.538687898193388 + - 1.7202952021805995 + - 1.4977792677866668 + - !!python/tuple + - 0.8973878824197407 + - 2.5199772590060423 + - 2.177513915504468 + - 1.207406529665715 + - 1.5302245102398355 + - 1.329919766678599 + - 1.3305034896284333 + - 1.2813918850158303 + - 2.45988101090194 + - 1.6664265849997073 + - 1.5373406966170404 + - 1.7204897714830267 + - 1.4971669599738733 + - !!python/tuple + - 0.8976242826909488 + - 2.5194872490966285 + - 2.1770993952981033 + - 1.2075117321880784 + - 1.530273472545506 + - 1.329929553915816 + - 1.3307185291917898 + - 1.2813801411020445 + - 2.459689612363539 + - 1.6666435245173223 + - 1.5370392411053844 + - 1.7205210713209742 + - 1.4975395344593923 + - !!python/tuple + - 0.8973084996337145 + - 2.51692354866985 + - 2.165347316604144 + - 1.2082216764010107 + - 1.5316607452779756 + - 1.3306987724847932 + - 1.3256441056793615 + - 1.2810476171428984 + - 2.462031510325857 + - 1.6678964927062878 + - 1.530911145225801 + - 1.7214081542713784 + - 1.4947413186681193 + - !!python/tuple + - 0.8983470161515593 + - 2.5147771564663053 + - 2.1635468907158275 + - 1.2086762129187338 + - 1.5318695349640847 + - 1.3307367695643668 + - 1.326618208835459 + - 1.2809985462740616 + - 2.4611898636800484 + - 1.6688432877751582 + - 1.5296154624483838 + - 1.721542753927069 + - 1.4963862714513008 + - !!python/tuple + - 0.8982941536252245 + - 2.514451830491304 + - 2.1620552395372754 + - 1.2087591480500712 + - 1.5320420533154748 + - 1.3308312375784037 + - 1.3259886661871598 + - 1.2809581198895175 + - 2.460213749935057 + - 1.6696263402158253 + - 1.5285448812447162 + - 1.7216541075194454 + - 1.497745038977288 + - !!python/tuple + - 0.8969153152159026 + - 2.505825668310023 + - 2.122521044639412 + - 1.2109445121023201 + - 1.5366042698886195 + - 1.3333248966739724 + - 1.3093716072464534 + - 1.2798916725284935 + - 2.4681767024343975 + - 1.6736820446115819 + - 1.5084517417111678 + - 1.724601834935086 + - 1.4881966322878213 + - !!python/tuple + - 0.8995476480672756 + - 2.5004536412864584 + - 2.1181557921572036 + - 1.2120300308995642 + - 1.53707807225768 + - 1.3333788145102345 + - 1.3120882235240594 + - 1.2797888924450505 + - 2.466044542434176 + - 1.67601679180529 + - 1.5054329034734888 + - 1.7249169596813942 + - 1.4924077068151766 + - !!python/tuple + - 0.8992012190349623 + - 2.4989691311838786 + - 2.1113761692617707 + - 1.2123114735129663 + - 1.5378092058289974 + - 1.3337599773016988 + - 1.3094825501711589 + - 1.2796315009088732 + - 2.461412142567252 + - 1.6796281323768962 + - 1.5007774267264378 + - 1.7254047189064965 + - 1.4988993450586614 + - !!python/tuple + - 0.8979144368974077 + - 2.4929958390819325 + - 2.084163431805707 + - 1.2134108847503986 + - 1.5407146650678216 + - 1.3352615062033173 + - 1.2992316824125187 + - 1.2790135446151782 + - 2.472282510190106 + - 1.6746989605107436 + - 1.4918958376516178 + - 1.727352286835886 + - 1.4879988895391405 + - !!python/tuple + - 0.9008641435194356 + - 2.486890458747515 + - 2.079350285039227 + - 1.2145923818678355 + - 1.5412079112475845 + - 1.3352882117941665 + - 1.30253273776284 + - 1.2789140218200783 + - 2.469833640603229 + - 1.677358447371496 + - 1.4886552004281992 + - 1.727689578159074 + - 1.4928149976162912 + - !!python/tuple + - 0.8939675037911267 + - 2.4650143040549946 + - 1.979625640757385 + - 1.2176082415704825 + - 1.5513561248152266 + - 1.340388620151137 + - 1.2665799719873099 + - 1.2768845762354637 + - 2.490906229034296 + - 1.6869115116985565 + - 1.4444022946413442 + - 1.734652985672892 + - 1.4681751013521704 + - !!python/tuple + - 0.9010744361910322 + - 2.4515657571736766 + - 1.9700780066005512 + - 1.220021310573669 + - 1.552181500002116 + - 1.340243505180985 + - 1.2754251075162453 + - 1.2767600097202803 + - 2.487415564219422 + - 1.6896256271077665 + - 1.4400994262515616 + - 1.7352710855604678 + - 1.477908940932946 + - !!python/tuple + - 0.8995094068028325 + - 2.4472373549643214 + - 1.9508318304012835 + - 1.2200938678672915 + - 1.553823105140292 + - 1.3409555379822096 + - 1.2700294501066185 + - 1.2765174290950048 + - 2.4759398392259717 + - 1.6950554591826097 + - 1.4315965409218696 + - 1.7365096197807577 + - 1.4971828209856217 + - !!python/tuple + - 0.8969265375990286 + - 2.4376158626758246 + - 1.9085971934567427 + - 1.2202397613552733 + - 1.5573286276581337 + - 1.3424296833493232 + - 1.2590246968272119 + - 1.2760221975293888 + - 2.495761393691068 + - 1.684463158822911 + - 1.4247140516613421 + - 1.7391956884653872 + - 1.477105197614696 + - !!python/tuple + - 0.896363231688001 + - 2.4324427365178267 + - 1.886615444462935 + - 1.2203010708322066 + - 1.5590450960131188 + - 1.3430981880490334 + - 1.2542501836183968 + - 1.2758057020760456 + - 2.4812975993319872 + - 1.6915066293076348 + - 1.4153704534257678 + - 1.740560095744096 + - 1.501237522627974 + - !!python/tuple + - 0.895674476375848 + - 2.423048365445781 + - 1.8474595916852437 + - 1.2203991309490076 + - 1.5620114666077867 + - 1.3442087300786358 + - 1.2465139467612998 + - 1.2754527173978933 + - 2.5014375704614227 + - 1.680988589895157 + - 1.410854961469564 + - 1.742963776333594 + - 1.4801352468101152 + - !!python/tuple + - 0.8955416335943925 + - 2.4183587948609393 + - 1.8286747186305483 + - 1.2204371527991877 + - 1.563359240685014 + - 1.3446748909029216 + - 1.243444845673829 + - 1.275310242803895 + - 2.487583008325982 + - 1.6878634602935776 + - 1.4030878261100537 + - 1.7440970999410101 + - 1.5028927516843986 + - !!python/tuple + - 0.8954017777657818 + - 2.411185671008296 + - 1.8005552099051543 + - 1.2204887308878043 + - 1.5653276370842242 + - 1.3453305729615246 + - 1.2392461473305838 + - 1.2751134697248412 + - 2.503576655083341 + - 1.6797060692191672 + - 1.4010523250970752 + - 1.7457822994944165 + - 1.4858037505906156 + - !!python/tuple + - 0.8953675441208796 + - 2.4077470620857313 + - 1.7875564090999443 + - 1.2205090701262948 + - 1.566204779734611 + - 1.3456053220605457 + - 1.2375700962430574 + - 1.275033504550668 + - 2.4929531079655765 + - 1.6850136142580148 + - 1.3957362478264737 + - 1.746555082892721 + - 1.5029056743300142 + - !!python/tuple + - 0.8953314605893903 + - 2.4029931017775583 + - 1.769913817914006 + - 1.2205347703587766 + - 1.5673762409545149 + - 1.3459620136666939 + - 1.2354424756034386 + - 1.2749311177130396 + - 2.5038849626108726 + - 1.6795415387209918 + - 1.3950007281503753 + - 1.7476011297169367 + - 1.4911318344570015 + - !!python/tuple + - 0.8953200803814408 + - 2.400740472869225 + - 1.7617779413629773 + - 1.2205454746059217 + - 1.567904898995727 + - 1.346116553776733 + - 1.2345509414673115 + - 1.2748876442810155 + - 2.4967055023600766 + - 1.683131398178993 + - 1.3916748603878393 + - 1.7480822812876349 + - 1.5024918799407279 + - !!python/tuple + - 0.8953075722642243 + - 2.397793629323229 + - 1.7512756562048908 + - 1.2205586683324359 + - 1.5685808009967068 + - 1.3463104573227753 + - 1.2334493708558898 + - 1.2748335965593938 + - 2.503627065255383 + - 1.6797099440974048 + - 1.3914439958795313 + - 1.748702949467917 + - 1.4950153218052382 + - !!python/tuple + - 0.8953029060664811 + - 2.396399490290485 + - 1.746396243186282 + - 1.2205644330559948 + - 1.5688910018369562 + - 1.3463972364631538 + - 1.2329665788561677 + - 1.2748097059303427 + - 2.4990942431661747 + - 1.681974367465938 + - 1.3894432039560807 + - 1.748991193475886 + - 1.502101204544103 + - !!python/tuple + - 0.895297582246805 + - 2.3946309891647273 + - 1.7402604869626723 + - 1.2205714799349847 + - 1.5692789131377287 + - 1.3465044917290345 + - 1.232375626144105 + - 1.274780346429171 + - 2.50330467982039 + - 1.6799092184113698 + - 1.3893824481598982 + - 1.7493536541944623 + - 1.497548298485898 + - !!python/tuple + - 0.8952962686335799 + - 2.3941302932825357 + - 1.7385429419162086 + - 1.2205733824198597 + - 1.5693867496554883 + - 1.3465338624107488 + - 1.2322158222930668 + - 1.2747723657118486 + - 2.5016567277129287 + - 1.6807315966175145 + - 1.3886759144825418 + - 1.7494551344606628 + - 1.5001044998901938 + - !!python/tuple + - 0.8952946596477929 + - 2.39349381579553 + - 1.736366683351054 + - 1.2205757689891914 + - 1.5695231266647383 + - 1.3465708510143608 + - 1.2320152694316524 + - 1.2747623354953392 + - 2.503180090394647 + - 1.6799907647223546 + - 1.3886638931958872 + - 1.7495837291177285 + - 1.4984717205830778 + - !!python/tuple + - 0.8952943882238735 + - 2.3933812167910897 + - 1.7359832768591765 + - 1.2205761841124199 + - 1.5695470954279163 + - 1.3465773171681819 + - 1.231980365880554 + - 1.2747605866315508 + - 2.5034496740641914 + - 1.6798603399176297 + - 1.3886617889937172 + - 1.7496063876605317 + - 1.498185140107016 + - !!python/tuple + - 0.8952942605046741 + - 2.3933277938796222 + - 1.7358015023714752 + - 1.2205763804839587 + - 1.5695584543281735 + - 1.3465803786241373 + - 1.2319638534040895 + - 1.2747597589950386 + - 2.5032729292242997 + - 1.6799485577969477 + - 1.3885868183420431 + - 1.7496171304545536 + - 1.498458693731629 + - !!python/tuple + - 0.8952940972936646 + - 2.393259257940854 + - 1.735568386402394 + - 1.2205766320528644 + - 1.5695730186009527 + - 1.3465843022424628 + - 1.2319426985490172 + - 1.274758698510428 + - 2.503437104885236 + - 1.6798691523596334 + - 1.3885856458041184 + - 1.7496309076897063 + - 1.4982841578931563 + - !!python/tuple + - 0.8952940202416318 + - 2.3932267392843243 + - 1.7354578280777064 + - 1.2205767512004335 + - 1.5695799241344752 + - 1.3465861615295809 + - 1.2319326786538818 + - 1.2747581961176428 + - 2.5033294683700045 + - 1.6799228738784253 + - 1.3885400396786112 + - 1.7496374418376628 + - 1.4984506996317322 + - !!python/tuple + - 0.8952939216963539 + - 2.393185050691123 + - 1.7353161235842702 + - 1.2205769038153642 + - 1.569588774002735 + - 1.3465885436738332 + - 1.23191984392199 + - 1.274757552529904 + - 2.503429364482542 + - 1.679874566453655 + - 1.3885393664593413 + - 1.7496458168359599 + - 1.4983444962954529 + - !!python/tuple + - 0.8952938750799903 + - 2.393165269853382 + - 1.7352489045216122 + - 1.2205769761500158 + - 1.5695929713821302 + - 1.346589673100901 + - 1.2319137604533539 + - 1.274757247442343 + - 2.5033638709819734 + - 1.6799072533608657 + - 1.3885116352283138 + - 1.7496497896497134 + - 1.4984458130104314 + - !!python/tuple + - 0.8952938154302119 + - 2.3931399218764384 + - 1.7351627784219619 + - 1.2205770687942137 + - 1.5695983489833065 + - 1.3465911198618854 + - 1.231905968788537 + - 1.2747568566659822 + - 2.503424622959859 + - 1.679877878258509 + - 1.3885112406702556 + - 1.7496548799424203 + - 1.4983812240515935 + - !!python/tuple + - 0.8952937979179182 + - 2.393132466274282 + - 1.7351374503553219 + - 1.220577096025426 + - 1.5695999302856012 + - 1.3465915451968804 + - 1.23190367851064 + - 1.274756741792975 + - 2.5033999334094594 + - 1.6798902002482314 + - 1.3885007909129583 + - 1.7496563769116775 + - 1.4984194138219438 + - !!python/tuple + - 0.8952937754889221 + - 2.3931229122526565 + - 1.7351049951539936 + - 1.2205771309141429 + - 1.5696019564987493 + - 1.3465920901690134 + - 1.231900744181045 + - 1.2747565946132293 + - 2.5034228335321758 + - 1.6798791287798018 + - 1.3885006443204706 + - 1.7496582951209894 + - 1.4983950702270448 + - !!python/tuple + - 0.8952937715503795 + - 2.393121233389565 + - 1.735099292379953 + - 1.2205771370433531 + - 1.569602312516424 + - 1.3465921859162087 + - 1.2319002286772514 + - 1.2747565687559397 + - 2.5034268576342598 + - 1.6798771834080661 + - 1.3885006185648663 + - 1.7496586321745644 + - 1.4983907930003524 + - !!python/tuple + - 0.8952937696817139 + - 2.3931204367449785 + - 1.7350965863617682 + - 1.2205771399516223 + - 1.5696024814489966 + - 1.3465922313482035 + - 1.2318999840738158 + - 1.2747565564867525 + - 2.5034242193057414 + - 1.6798785001407945 + - 1.3884995020800668 + - 1.7496587921096238 + - 1.498394873828981 + - !!python/tuple + - 0.8952937672869136 + - 2.393119415740562 + - 1.7350931182630276 + - 1.220577143678872 + - 1.5696026979564506 + - 1.3465922895743936 + - 1.2318996705888492 + - 1.2747565407624657 + - 2.5034266665920706 + - 1.6798773170542052 + - 1.388499486440692 + - 1.7496589970863299 + - 1.4983922726011132 + - !!python/tuple + - 0.8952937661506304 + - 2.3931189312589733 + - 1.7350914726102649 + - 1.220577145447459 + - 1.5696028006913392 + - 1.3465923172030503 + - 1.231899521839512 + - 1.2747565333012334 + - 2.5034250620739003 + - 1.6798781178339446 + - 1.3884988074537572 + - 1.7496590943501618 + - 1.4983947543746519 + - !!python/tuple + - 0.8952937646944015 + - 2.3931183103388523 + - 1.735089363519454 + - 1.220577147714082 + - 1.569602932357523 + - 1.3465923526121029 + - 1.2318993312021076 + - 1.274756523738892 + - 2.503426550389379 + - 1.679877398342537 + - 1.3884987979515877 + - 1.7496592190048186 + - 1.4983931724389914 + - !!python/tuple + - 0.8952937640034305 + - 2.393118015703001 + - 1.735088362728506 + - 1.2205771487896109 + - 1.5696029948346908 + - 1.3465923694140318 + - 1.231899240743254 + - 1.2747565192014825 + - 2.5034255746028067 + - 1.6798778853359408 + - 1.3884983850303139 + - 1.7496592781550797 + - 1.4983946817236111 + - !!python/tuple + - 0.8952937631178948 + - 2.3931176380949233 + - 1.7350870801078935 + - 1.220577150168008 + - 1.5696030749057743 + - 1.3465923909474236 + - 1.2318991248112101 + - 1.2747565133863346 + - 2.5034264797137578 + - 1.6798774477818557 + - 1.3884983792549148 + - 1.74965935396247 + - 1.4983937196777826 + - !!python/tuple + - 0.8952937626977063 + - 2.3931174589142126 + - 1.7350864714866334 + - 1.2205771508220717 + - 1.56960311290056 + - 1.34659240116527 + - 1.231899069800243 + - 1.2747565106269831 + - 2.5034258862944827 + - 1.6798777439441535 + - 1.3884981281406295 + - 1.7496593899341313 + - 1.4983946375394372 + - !!python/tuple + - 0.895293762159198 + - 2.3931172292754193 + - 1.7350856914758452 + - 1.2205771516603188 + - 1.5696031615947563 + - 1.3465924142604633 + - 1.2318989992982667 + - 1.2747565070906004 + - 2.5034264367301615 + - 1.6798774778495416 + - 1.3884981246295867 + - 1.7496594360355198 + - 1.498394052479186 + - !!python/tuple + - 0.895293762028939 + - 2.3931171737274832 + - 1.7350855027972532 + - 1.2205771518630832 + - 1.5696031733734968 + - 1.3465924174280808 + - 1.231898982244457 + - 1.2747565062351798 + - 2.5034262527635462 + - 1.6798775696631525 + - 1.3884980467816372 + - 1.7496594471870905 + - 1.4983943370262782 + - !!python/tuple + - 0.8952937618619989 + - 2.393117102536944 + - 1.7350852609858245 + - 1.220577152122947 + - 1.5696031884691863 + - 1.3465924214877125 + - 1.2318989603882322 + - 1.2747565051388696 + - 2.503426423404735 + - 1.6798774871709605 + - 1.388498045693294 + - 1.7496594614789998 + - 1.4983941556513405 + - !!python/tuple + - 0.8952937618212934 + - 2.393117085178214 + - 1.7350852020238137 + - 1.2205771521863107 + - 1.569603192150038 + - 1.3465924224775907 + - 1.2318989550589339 + - 1.2747565048715515 + - 2.5034263659151392 + - 1.6798775158627266 + - 1.3884980213658258 + - 1.7496594649638628 + - 1.4983942445723226 + - !!python/tuple + - 0.895293761769125 + - 2.3931170629311653 + - 1.7350851264577678 + - 1.220577152267518 + - 1.5696031968674378 + - 1.346592423746224 + - 1.2318989482288774 + - 1.274756504528955 + - 2.503426419240534 + - 1.679877490083915 + - 1.38849802102573 + - 1.749659469430083 + - 1.4983941878926545 + - !!python/tuple + - 0.8952937617599587 + - 2.3931170590222233 + - 1.735085113180355 + - 1.2205771522817865 + - 1.5696031976963134 + - 1.3465924239691305 + - 1.2318989470287955 + - 1.2747565044687588 + - 2.5034264286101306 + - 1.6798774855544216 + - 1.3884980209659732 + - 1.7496594702148252 + - 1.4983941779336942 + - !!python/tuple + - 0.8952937617535984 + - 2.3931170563099218 + - 1.7350851039675437 + - 1.220577152291687 + - 1.5696031982714462 + - 1.3465924241237988 + - 1.2318989461960936 + - 1.2747565044269904 + - 2.50342641962738 + - 1.6798774900375109 + - 1.3884980171648071 + - 1.749659470759335 + - 1.4983941918275987 + - !!python/tuple + - 0.8952937617444321 + - 2.3931170524009797 + - 1.7350850906901314 + - 1.2205771523059556 + - 1.5696031991003219 + - 1.3465924243467051 + - 1.231898944996012 + - 1.274756504366794 + - 2.503426428996977 + - 1.6798774855080172 + - 1.3884980171050505 + - 1.749659471544077 + - 1.498394181868638 + - !!python/tuple + - 0.8952937617380718 + - 2.393117049688678 + - 1.7350850814773204 + - 1.2205771523158562 + - 1.5696031996754547 + - 1.3465924245013734 + - 1.2318989441633104 + - 1.2747565043250257 + - 2.503426420014226 + - 1.6798774899911064 + - 1.3884980133038844 + - 1.7496594720885867 + - 1.4983941957625426 + - !!python/tuple + - 0.8952937617289055 + - 2.393117045779736 + - 1.7350850681999088 + - 1.2205771523301248 + - 1.5696032005043303 + - 1.3465924247242798 + - 1.231898942963229 + - 1.2747565042648294 + - 2.5034264293838238 + - 1.6798774854616128 + - 1.3884980132441282 + - 1.7496594728733286 + - 1.4983941858035812 + - !!python/tuple + - 0.895293761726918 + - 2.393117044932142 + - 1.7350850653209056 + - 1.2205771523332187 + - 1.5696032006840592 + - 1.3465924247726135 + - 1.2318989427030098 + - 1.2747565042517768 + - 2.503426426576714 + - 1.679877486862578 + - 1.388498012056264 + - 1.7496594730434878 + - 1.4983941901454265 + - !!python/tuple + - 0.8952937617240535 + - 2.393117043710598 + - 1.7350850611717146 + - 1.2205771523376776 + - 1.569603200943083 + - 1.3465924248422718 + - 1.2318989423279845 + - 1.2747565042329654 + - 2.5034264295047133 + - 1.6798774854471112 + - 1.3884980120375903 + - 1.7496594732887196 + - 1.4983941870332511 + - !!python/tuple + - 0.8952937617234323 + - 2.393117043445725 + - 1.735085060272026 + - 1.2205771523386444 + - 1.5696032009992482 + - 1.3465924248573762 + - 1.231898942246666 + - 1.2747565042288864 + - 2.5034264286274914 + - 1.679877485884913 + - 1.3884980116663828 + - 1.7496594733418944 + - 1.4983941883900778 + - !!python/tuple + - 0.8952937617225372 + - 2.3931170430639925 + - 1.7350850589754039 + - 1.2205771523400377 + - 1.569603201080193 + - 1.3465924248791443 + - 1.2318989421294706 + - 1.2747565042230078 + - 2.503426429542491 + - 1.6798774854425798 + - 1.3884980116605472 + - 1.7496594734185293 + - 1.4983941874175228 + - !!python/tuple + - 0.8952937617222266 + - 2.393117042931556 + - 1.7350850585255597 + - 1.220577152340521 + - 1.5696032011082757 + - 1.3465924248866965 + - 1.2318989420888113 + - 1.2747565042209683 + - 2.50342642910388 + - 1.6798774856614807 + - 1.3884980114749434 + - 1.7496594734451167 + - 1.4983941880959362 + - !!python/tuple + - 0.8952937617217791 + - 2.3931170427406894 + - 1.7350850578772485 + - 1.2205771523412179 + - 1.5696032011487482 + - 1.3465924248975807 + - 1.2318989420302136 + - 1.274756504218029 + - 2.50342642956138 + - 1.679877485440314 + - 1.3884980114720256 + - 1.7496594734834343 + - 1.4983941876096587 + - !!python/tuple + - 0.8952937617217306 + - 2.393117042719996 + - 1.7350850578069603 + - 1.2205771523412934 + - 1.569603201153136 + - 1.3465924248987606 + - 1.2318989420238606 + - 1.2747565042177105 + - 2.503426429492847 + - 1.6798774854745173 + - 1.388498011443025 + - 1.7496594734875885 + - 1.4983941877156608 + - !!python/tuple + - 0.8952937617216606 + - 2.3931170426901733 + - 1.7350850577056618 + - 1.2205771523414022 + - 1.5696032011594598 + - 1.3465924249004613 + - 1.2318989420147048 + - 1.2747565042172513 + - 2.5034264295643314 + - 1.67987748543996 + - 1.3884980114425691 + - 1.7496594734935758 + - 1.49839418763968 + - !!python/tuple + - 0.8952937617216363 + - 2.393117042679827 + - 1.7350850576705177 + - 1.22057715234144 + - 1.5696032011616539 + - 1.3465924249010512 + - 1.2318989420115283 + - 1.2747565042170919 + - 2.503426429530065 + - 1.6798774854570617 + - 1.3884980114280687 + - 1.749659473495653 + - 1.498394187692681 + - !!python/tuple + - 0.8952937617216014 + - 2.3931170426649153 + - 1.7350850576198684 + - 1.2205771523414943 + - 1.5696032011648158 + - 1.3465924249019017 + - 1.2318989420069504 + - 1.2747565042168623 + - 2.503426429565807 + - 1.679877485439783 + - 1.3884980114278407 + - 1.7496594734986466 + - 1.4983941876546905 + - !!python/tuple + - 0.8952937617215893 + - 2.393117042659742 + - 1.7350850576022965 + - 1.2205771523415132 + - 1.5696032011659127 + - 1.3465924249021968 + - 1.231898942005362 + - 1.2747565042167825 + - 2.5034264295486737 + - 1.6798774854483338 + - 1.3884980114205905 + - 1.749659473499685 + - 1.498394187681191 + - !!python/tuple + - 0.8952937617215718 + - 2.3931170426522863 + - 1.7350850575769718 + - 1.2205771523415405 + - 1.5696032011674936 + - 1.346592424902622 + - 1.231898942003073 + - 1.2747565042166678 + - 2.5034264295665447 + - 1.6798774854396945 + - 1.3884980114204766 + - 1.749659473501182 + - 1.4983941876621958 + - !!python/tuple + - 0.8952937617215657 + - 2.3931170426496995 + - 1.7350850575681858 + - 1.22057715234155 + - 1.569603201168042 + - 1.3465924249027694 + - 1.231898942002279 + - 1.274756504216628 + - 2.5034264295579782 + - 1.67987748544397 + - 1.3884980114168515 + - 1.7496594735017013 + - 1.498394187675446 + - !!python/tuple + - 0.895293761721557 + - 2.393117042645972 + - 1.7350850575555234 + - 1.2205771523415636 + - 1.5696032011688326 + - 1.346592424902982 + - 1.2318989420011346 + - 1.2747565042165705 + - 2.5034264295669137 + - 1.6798774854396503 + - 1.3884980114167944 + - 1.7496594735024495 + - 1.4983941876659486 + - !!python/tuple + - 0.8952937617215551 + - 2.3931170426451636 + - 1.7350850575527779 + - 1.2205771523415665 + - 1.569603201169004 + - 1.346592424903028 + - 1.2318989420008863 + - 1.274756504216558 + - 2.5034264295642368 + - 1.6798774854409864 + - 1.3884980114156615 + - 1.7496594735026119 + - 1.4983941876700893 + - !!python/tuple + - 0.8952937617215523 + - 2.3931170426439987 + - 1.7350850575488208 + - 1.2205771523415707 + - 1.569603201169251 + - 1.3465924249030945 + - 1.2318989420005286 + - 1.27475650421654 + - 2.503426429567029 + - 1.6798774854396366 + - 1.3884980114156438 + - 1.7496594735028457 + - 1.4983941876671212 + - !!python/tuple + - 0.895293761721552 + - 2.3931170426438726 + - 1.7350850575483918 + - 1.2205771523415712 + - 1.5696032011692778 + - 1.3465924249031016 + - 1.2318989420004898 + - 1.274756504216538 + - 2.503426429566611 + - 1.6798774854398453 + - 1.3884980114154668 + - 1.749659473502871 + - 1.4983941876677682 + - !!python/tuple + - 0.8952937617215515 + - 2.3931170426436905 + - 1.7350850575477736 + - 1.2205771523415718 + - 1.5696032011693164 + - 1.346592424903112 + - 1.2318989420004338 + - 1.2747565042165352 + - 2.503426429567047 + - 1.6798774854396343 + - 1.388498011415464 + - 1.7496594735029076 + - 1.4983941876673044 + - !!python/tuple + - 0.8952937617215512 + - 2.3931170426435644 + - 1.7350850575473447 + - 1.2205771523415723 + - 1.5696032011693433 + - 1.3465924249031191 + - 1.231898942000395 + - 1.2747565042165332 + - 2.5034264295666286 + - 1.679877485439843 + - 1.388498011415287 + - 1.749659473502933 + - 1.4983941876679514 + - !!python/tuple + - 0.8952937617215507 + - 2.3931170426433823 + - 1.7350850575467265 + - 1.220577152341573 + - 1.569603201169382 + - 1.3465924249031296 + - 1.231898942000339 + - 1.2747565042165303 + - 2.5034264295670647 + - 1.6798774854396321 + - 1.388498011415284 + - 1.7496594735029696 + - 1.4983941876674876 + - !!python/tuple + - 0.8952937617215507 + - 2.393117042643363 + - 1.7350850575466594 + - 1.220577152341573 + - 1.5696032011693861 + - 1.3465924249031307 + - 1.231898942000333 + - 1.27475650421653 + - 2.5034264295669995 + - 1.6798774854396648 + - 1.3884980114152563 + - 1.7496594735029736 + - 1.4983941876675886 + - !!python/tuple + - 0.8952937617215506 + - 2.3931170426433344 + - 1.7350850575465628 + - 1.220577152341573 + - 1.5696032011693921 + - 1.3465924249031322 + - 1.2318989420003243 + - 1.2747565042165296 + - 2.503426429567068 + - 1.679877485439632 + - 1.3884980114152559 + - 1.7496594735029793 + - 1.4983941876675162 + - !!python/tuple + - 0.8952937617215506 + - 2.3931170426433246 + - 1.7350850575465293 + - 1.220577152341573 + - 1.5696032011693941 + - 1.346592424903133 + - 1.2318989420003212 + - 1.2747565042165294 + - 2.503426429567035 + - 1.679877485439648 + - 1.388498011415242 + - 1.7496594735029813 + - 1.4983941876675668 + - !!python/tuple + - 0.8952937617215506 + - 2.3931170426433104 + - 1.735085057546481 + - 1.220577152341573 + - 1.5696032011693972 + - 1.3465924249031338 + - 1.2318989420003168 + - 1.2747565042165292 + - 2.503426429567069 + - 1.6798774854396317 + - 1.3884980114152419 + - 1.7496594735029842 + - 1.4983941876675306 + - !!python/tuple + - 0.8952937617215506 + - 2.3931170426433006 + - 1.7350850575464474 + - 1.220577152341573 + - 1.5696032011693992 + - 1.3465924249031345 + - 1.2318989420003137 + - 1.274756504216529 + - 2.5034264295670363 + - 1.6798774854396479 + - 1.388498011415228 + - 1.7496594735029862 + - 1.4983941876675813 + - !!python/tuple + - 0.8952937617215506 + - 2.3931170426432864 + - 1.735085057546399 + - 1.220577152341573 + - 1.5696032011694023 + - 1.3465924249031354 + - 1.2318989420003092 + - 1.2747565042165288 + - 2.5034264295670705 + - 1.6798774854396314 + - 1.3884980114152279 + - 1.7496594735029891 + - 1.498394187667545 + - !!python/tuple + - 0.8952937617215506 + - 2.3931170426432864 + - 1.735085057546399 + - 1.220577152341573 + - 1.5696032011694023 + - 1.3465924249031354 + - 1.2318989420003092 + - 1.2747565042165288 + - 2.5034264295670705 + - 1.6798774854396314 + - 1.3884980114152279 + - 1.7496594735029891 + - 1.498394187667545 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.300113097627007 + - 7.813466107598671 + - 7.759518212804281 + - 7.45267811937132 + - 7.791213509015498 + - 7.7095391464215 + - 7.611459750396479 + - 7.602871705593315 + - 7.6868670320171155 + - 7.648173590750293 + - 7.562642740797874 + - 7.671253744706488 + - 7.562890109583181 + - !!python/tuple + - 5.573333366091838 + - 7.287962290821991 + - 7.186832802584218 + - 6.08038150531935 + - 7.2676103833270025 + - 6.981146377429579 + - 6.637172548830286 + - 6.6070550137991875 + - 6.901630233277951 + - 6.765927694264077 + - 6.465978922911839 + - 6.846871957312675 + - 6.466846385455451 + - !!python/tuple + - 1.2565563490044784 + - 5.86665575468654 + - 5.706528110641871 + - 2.6899999915353487 + - 5.698027578062817 + - 5.062306287957771 + - 4.450362190747003 + - 4.149912880691211 + - 4.970267272112462 + - 4.5451217179586125 + - 3.627660800888333 + - 4.909643063650663 + - 3.7180680031154805 + - !!python/tuple + - 0.26765721112934204 + - 3.789396858876305 + - 3.850812194344787 + - 0.46241054811187876 + - 3.8230617154236786 + - 2.3686864719997773 + - 2.5635127740840318 + - 2.1613655828686893 + - 3.2699119961897614 + - 3.0025524346210664 + - 0.6282891491508904 + - 3.0486983527444664 + - 1.621172917677943 + - !!python/tuple + - 2.2670169235173803 + - 3.7327389707499137 + - 3.7944679159668184 + - 1.099875808574418 + - 3.7676334341600253 + - 2.315655421727672 + - 2.522581960253855 + - 2.130167931186475 + - 3.2269003732742023 + - 2.9635178088607317 + - 0.9206038585046672 + - 3.004014715261836 + - 1.615105147764209 + - !!python/tuple + - 1.9193418202726757 + - 3.6091932364794173 + - 3.6210326683428153 + - 1.2147967807051887 + - 3.589643081601 + - 2.1798348449038967 + - 2.376604289606609 + - 2.02621915357558 + - 3.0661163954790758 + - 2.8197646718136222 + - 1.2030904679835293 + - 2.8582842187183553 + - 1.5776434551034586 + - !!python/tuple + - 0.6415951459550029 + - 3.109980233550771 + - 2.9198193105568313 + - 1.3891022035283767 + - 2.85561817934298 + - 1.6683972401503677 + - 1.8379884119257912 + - 1.6627732867020204 + - 2.424188904793424 + - 2.258637834670882 + - 1.342214758714435 + - 2.273081745045622 + - 1.462087613216311 + - !!python/tuple + - 1.4617118231706798 + - 2.9434395929600994 + - 2.77965188967785 + - 1.3285321147297766 + - 2.705459106087759 + - 1.5992236370649096 + - 1.7692341885265634 + - 1.625676472280661 + - 2.3064128757385736 + - 2.1690960329217472 + - 1.2980099533319762 + - 2.1751118768020485 + - 1.4639377203567652 + - !!python/tuple + - 1.037859229569447 + - 2.7068049721741017 + - 2.5220754851351233 + - 1.2216956538040822 + - 2.4499233128735747 + - 1.52729415557067 + - 1.6291478503950767 + - 1.5708337738727212 + - 2.0735667037393766 + - 1.9870003680513573 + - 1.2579027026054654 + - 2.004320053870205 + - 1.4307922175777659 + - !!python/tuple + - 1.1477444272769635 + - 2.0096464218234575 + - 1.940495675523577 + - 1.2481900330928664 + - 1.8041003412261012 + - 1.500734699118383 + - 1.4083956601519658 + - 1.374951669087078 + - 1.5338701353117625 + - 1.6428382857686283 + - 1.242672431491639 + - 1.5845559298077523 + - 1.363187988204094 + - !!python/tuple + - 0.9699485159724958 + - 1.8712491435591827 + - 1.814707436214472 + - 1.1851055512489943 + - 1.7552707627670767 + - 1.5112388278904934 + - 1.4780920305234575 + - 1.4047248045633078 + - 1.5657187440028004 + - 1.567630585343332 + - 1.2730145928410552 + - 1.5679506534427885 + - 1.363403352942845 + - !!python/tuple + - 1.0800512130675513 + - 1.8476955492436036 + - 1.786719219304949 + - 1.1934515014192704 + - 1.7250161929464198 + - 1.5194995537536191 + - 1.4798027558380844 + - 1.4053444724550712 + - 1.567443517135351 + - 1.5457230105135475 + - 1.2703237518087864 + - 1.5648887098970057 + - 1.3464296010331822 + - !!python/tuple + - 1.0333399219882067 + - 1.8219152025763032 + - 1.7569443236568971 + - 1.195438534929261 + - 1.693923579594602 + - 1.5264165191242083 + - 1.481162588851709 + - 1.4057748975159499 + - 1.5689795116426557 + - 1.5264279240250256 + - 1.2691148390150904 + - 1.562162382533576 + - 1.336015134111646 + - !!python/tuple + - 1.0551751933714077 + - 1.8093327309512268 + - 1.7431538133448576 + - 1.1951714049864846 + - 1.7013757140694037 + - 1.5286255783203606 + - 1.4814872775691097 + - 1.4058662132158457 + - 1.5695209678201691 + - 1.4977945407505084 + - 1.2722214039377422 + - 1.561210194959977 + - 1.3305377377004968 + - !!python/tuple + - 1.049364328165654 + - 1.7977921043313627 + - 1.7309524631719833 + - 1.19518607169124 + - 1.682686023405803 + - 1.5302346519695895 + - 1.481783428992189 + - 1.4059206718602715 + - 1.5699349941988874 + - 1.503979874288515 + - 1.2696539682600378 + - 1.5604880867577755 + - 1.3326838374411298 + - !!python/tuple + - 1.0521717215202824 + - 1.7884565251686229 + - 1.7215485947063156 + - 1.1951864945722714 + - 1.6688307730468679 + - 1.5312066280525933 + - 1.4819467828806852 + - 1.4059453484164899 + - 1.5702014075240343 + - 1.5075273179077677 + - 1.2691042855736265 + - 1.5600294512191861 + - 1.3333996980233065 + - !!python/tuple + - 1.0516739189814588 + - 1.7866540909996476 + - 1.719838957807271 + - 1.1951626486436466 + - 1.6745510986005843 + - 1.5313391957559916 + - 1.4819425407963467 + - 1.4059476384293594 + - 1.5702406732651981 + - 1.4993741612566918 + - 1.2703076716414954 + - 1.5599630644536024 + - 1.3318745801304375 + - !!python/tuple + - 1.0513726897614837 + - 1.7848171421251222 + - 1.7181185334616542 + - 1.195171089220738 + - 1.671127764636149 + - 1.5314660021929374 + - 1.4819655796509614 + - 1.405949716208922 + - 1.57027871299619 + - 1.501340430409428 + - 1.2699373846434283 + - 1.5598989559318033 + - 1.3323123759978093 + - !!python/tuple + - 1.051338601238594 + - 1.7844296182280435 + - 1.717760818601418 + - 1.1951723752344685 + - 1.670424166336838 + - 1.531490890315013 + - 1.481970006612066 + - 1.405950099851379 + - 1.5702862885879196 + - 1.5017213903007156 + - 1.2698757983300168 + - 1.559886236058261 + - 1.3323892558763615 + - !!python/tuple + - 1.0513368077145562 + - 1.7844069553963373 + - 1.7177399643203286 + - 1.1951720661999272 + - 1.6705123695451392 + - 1.5314923239437324 + - 1.4819698778677726 + - 1.405950121682564 + - 1.5702867262714464 + - 1.501606101549953 + - 1.2698917388114976 + - 1.559885501727713 + - 1.332368614639935 + - !!python/tuple + - 1.0513346406309323 + - 1.7843794104369357 + - 1.7177146221514303 + - 1.1951721541371836 + - 1.6704623676521975 + - 1.5314940648795894 + - 1.4819701873568543 + - 1.4059501481748502 + - 1.570287257867043 + - 1.5016331012840458 + - 1.2698874741714952 + - 1.5598846098745278 + - 1.3323739805023487 + - !!python/tuple + - 1.0513331598762712 + - 1.7843604535001276 + - 1.7176971850973546 + - 1.1951722143979948 + - 1.670427969302953 + - 1.531495261740775 + - 1.481970400060637 + - 1.4059501663722878 + - 1.5702876234061462 + - 1.5016516598099436 + - 1.2698845487504775 + - 1.559883996646207 + - 1.332377663859762 + - !!python/tuple + - 1.0513331023006196 + - 1.7843597127521134 + - 1.717696503843741 + - 1.195172216745755 + - 1.6704266255500608 + - 1.5314953084740006 + - 1.4819704083642455 + - 1.4059501670824166 + - 1.570287637681235 + - 1.5016523843667415 + - 1.2698844346959075 + - 1.559883972699219 + - 1.332377807532243 + - !!python/tuple + - 1.0513331000519752 + - 1.7843596838162739 + - 1.7176964772320908 + - 1.195172216837455 + - 1.670426573059611 + - 1.531495310299488 + - 1.4819704086885974 + - 1.4059501671101549 + - 1.5702876382388498 + - 1.5016524126691533 + - 1.2698844302409855 + - 1.559883971763801 + - 1.3323778131441313 + - !!python/tuple + - 1.0513331000192856 + - 1.7843596833956163 + - 1.7176964768452216 + - 1.195172216831707 + - 1.6704265747043747 + - 1.531495310326026 + - 1.481970408686177 + - 1.405950167110558 + - 1.5702876382469562 + - 1.5016524105224616 + - 1.2698844305375758 + - 1.5598839717502022 + - 1.332377812759979 + - !!python/tuple + - 1.0513330999794108 + - 1.7843596828824984 + - 1.7176964763733185 + - 1.195172216833333 + - 1.670426573773564 + - 1.5314953103583973 + - 1.4819704086919285 + - 1.40595016711105 + - 1.5702876382568443 + - 1.5016524110243465 + - 1.269884430458577 + - 1.5598839717336146 + - 1.332377812859494 + - !!python/tuple + - 1.051333099939536 + - 1.7843596823693804 + - 1.7176964759014153 + - 1.195172216834959 + - 1.6704265728427534 + - 1.5314953103907685 + - 1.4819704086976802 + - 1.4059501671115417 + - 1.5702876382667323 + - 1.5016524115262315 + - 1.2698844303795782 + - 1.559883971717027 + - 1.3323778129590091 + - !!python/tuple + - 1.051333099939536 + - 1.7843596823693804 + - 1.7176964759014153 + - 1.195172216834959 + - 1.6704265728427534 + - 1.5314953103907685 + - 1.4819704086976802 + - 1.4059501671115417 + - 1.5702876382667323 + - 1.5016524115262315 + - 1.2698844303795782 + - 1.559883971717027 + - 1.3323778129590091 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.3546819420125455 + - 7.948129351556138 + - 7.866926078598213 + - 7.350139126616886 + - 7.862983086537345 + - 7.84774547763592 + - 7.492715964197588 + - 7.659094561962781 + - 7.712865884388733 + - 7.786644214702956 + - 7.592158470628041 + - 7.701582254538635 + - 7.389344125316253 + - !!python/tuple + - 5.747213194772512 + - 7.58745849390005 + - 7.428243092513521 + - 5.785017609538294 + - 7.507896066576433 + - 7.328133529181062 + - 6.354247013399807 + - 6.775713228925805 + - 7.0027360536999295 + - 7.257965172876286 + - 6.5192351359504315 + - 6.928280742538014 + - 5.862371745812746 + - !!python/tuple + - 1.734553818761798 + - 6.682366626952422 + - 6.327774390500497 + - 1.8776075082486785 + - 6.617029225489299 + - 6.024894383852565 + - 3.5063185534741637 + - 4.563043005166777 + - 5.2230554553832675 + - 5.932262547171127 + - 3.8336592150310533 + - 4.990597052018184 + - 2.0488642629912914 + - !!python/tuple + - 0.7846441412119085 + - 5.9186318602179835 + - 5.515130013383547 + - 1.2207426558691727 + - 6.264927181365339 + - 4.984889240462491 + - 2.906188945021104 + - 3.8024922470671387 + - 4.7363084726571 + - 5.647645736929035 + - 2.4245768229918987 + - 4.343212725414479 + - 1.4982956208517537 + - !!python/tuple + - 1.8499581524544302 + - 5.374296566127043 + - 4.933571090536545 + - 1.2246120088675638 + - 5.9646407481290495 + - 4.258884924811045 + - 2.438958569412609 + - 3.2139182981902334 + - 4.461253416822835 + - 5.245447715652516 + - 1.6634818427976068 + - 3.8633183093187604 + - 1.2223626432400954 + - !!python/tuple + - 0.785025633467624 + - 4.70764905372394 + - 4.300125472075554 + - 1.102770076844897 + - 5.579204440066375 + - 3.3865979538638715 + - 1.8569584176370904 + - 2.4486251544047506 + - 4.15717038401871 + - 4.586519992455967 + - 1.2940571620617964 + - 3.253066666136408 + - 1.0498988326513865 + - !!python/tuple + - 1.6547860028978372 + - 4.283388900482103 + - 3.830998610288745 + - 1.2195347177659035 + - 5.334899339157367 + - 2.919467065633797 + - 1.6464677397243996 + - 2.154652957111954 + - 3.870128970366843 + - 4.1837801283811284 + - 1.2209017167274523 + - 2.930218422973527 + - 1.2742629862544623 + - !!python/tuple + - 0.9102473762976815 + - 3.970472485832087 + - 3.458651720521214 + - 1.0907905645484053 + - 4.954341329638342 + - 2.5648447990677545 + - 1.4272354249059434 + - 1.8148183688280286 + - 3.416729600377364 + - 3.788660347335437 + - 1.2882686940364996 + - 2.5554463519592256 + - 1.0888093720282737 + - !!python/tuple + - 1.4810633095760743 + - 3.4140628515204394 + - 2.720678082646284 + - 1.3080710570470353 + - 4.332597087621215 + - 1.9914055066896514 + - 1.3871089347064869 + - 1.6348248543277286 + - 2.8438805974756534 + - 3.0426377166585494 + - 1.1633637814714461 + - 2.089105937414473 + - 1.3725069281933706 + - !!python/tuple + - 0.9058051066542422 + - 3.164403547757918 + - 2.5071924155880385 + - 1.0630262920406874 + - 4.005955488277104 + - 1.8464044168264888 + - 1.3322677373567415 + - 1.507870849375563 + - 2.5034704511611827 + - 2.712775561585834 + - 1.341253495757281 + - 1.876973704579312 + - 1.0246776658513361 + - !!python/tuple + - 1.3020847639055533 + - 2.8453627749841637 + - 2.281991322929814 + - 1.192244538653198 + - 3.6226457768298164 + - 1.7193387417216255 + - 1.2990976398748253 + - 1.4853056993382217 + - 2.0768145338518926 + - 2.439824582133675 + - 1.1113840758297862 + - 1.7055922532630001 + - 1.3779674211016513 + - !!python/tuple + - 0.9790631796160316 + - 2.6870583355292825 + - 2.168529318567085 + - 1.1096960537299214 + - 3.3920692457017787 + - 1.684392217826628 + - 1.3215965523333442 + - 1.4580125790386973 + - 1.972675747265768 + - 2.1864356965086706 + - 1.3311871072308126 + - 1.644381639802 + - 1.0854404189283033 + - !!python/tuple + - 1.1466248806826627 + - 2.3918024012082184 + - 2.0011735377614404 + - 1.1399488276418561 + - 3.0032719987809413 + - 1.6351049678967056 + - 1.2988899685393465 + - 1.4806262473196188 + - 1.6492542699293775 + - 1.9966634054965569 + - 1.0881740564160458 + - 1.5876019586290178 + - 1.317369578093142 + - !!python/tuple + - 1.0181983054837032 + - 2.307312792981373 + - 1.954526683163162 + - 1.1220156663944592 + - 2.8535889743505 + - 1.6326991643020623 + - 1.3192180496237935 + - 1.4290556960034924 + - 1.6774021605961986 + - 1.8619275556334658 + - 1.2967756705801934 + - 1.5752131317189637 + - 1.1283368652350474 + - !!python/tuple + - 1.0540723853730265 + - 1.9303319358577637 + - 1.7624769082886529 + - 1.1148358879546874 + - 2.1488272800971084 + - 1.6243847329386818 + - 1.3437169873903734 + - 1.4477005536011134 + - 1.475283710023278 + - 1.5867542025401153 + - 1.0943382208439338 + - 1.5431499628126013 + - 1.0546244736280168 + - !!python/tuple + - 1.0282439215696058 + - 1.8546547896154277 + - 1.7619393364048654 + - 1.1118374911211313 + - 2.1435152802884927 + - 1.541642503684014 + - 1.3514685216632414 + - 1.3679283256650174 + - 1.5859294710073766 + - 1.6434461941764087 + - 1.2506877980517122 + - 1.48882127893758 + - 1.1121896157843094 + - !!python/tuple + - 1.0364606199930522 + - 1.771114274477521 + - 1.7641225683303503 + - 1.0967238362713345 + - 2.137175858083455 + - 1.537383738198547 + - 1.3145595885825998 + - 1.3897695263987297 + - 1.5651611505452139 + - 1.696222539335777 + - 1.2223561108614345 + - 1.4857154818558014 + - 1.1267668192190943 + - !!python/tuple + - 1.0318750824904868 + - 1.7676005227037066 + - 1.7604675692281895 + - 1.098952527859439 + - 2.1353620251477996 + - 1.550174610836624 + - 1.2985358570212475 + - 1.3822032274846645 + - 1.562307254259961 + - 1.7048959778817487 + - 1.2346191868337466 + - 1.4830229836298319 + - 1.108529758238182 + - !!python/tuple + - 1.0306623372749064 + - 1.7485834063441519 + - 1.756337225693904 + - 1.1004486473103612 + - 2.1331835937842514 + - 1.5461710482074589 + - 1.312852369448783 + - 1.3749451720929358 + - 1.5592813538280372 + - 1.7175660436724725 + - 1.239025154702287 + - 1.4802736576714677 + - 1.111050299306995 + - !!python/tuple + - 1.03055610873128 + - 1.7413474016683383 + - 1.7547654526846705 + - 1.1006759488491693 + - 2.1322835281968655 + - 1.5447853965782687 + - 1.3104091876391855 + - 1.3841882923858464 + - 1.5576975738806742 + - 1.7109858155725508 + - 1.2355353266410944 + - 1.4895178485862681 + - 1.1144317516215387 + - !!python/tuple + - 1.0301568021891536 + - 1.7414573886184737 + - 1.7536895744319994 + - 1.1007568451681196 + - 2.1316455350316783 + - 1.5497380660223745 + - 1.3039970612790248 + - 1.3815251459183377 + - 1.557041790863496 + - 1.7138635962364996 + - 1.2387471617647206 + - 1.4880048117185518 + - 1.1091213201337267 + - !!python/tuple + - 1.030216475908921 + - 1.7364472585897703 + - 1.7526610736379558 + - 1.1008572958707752 + - 2.1310198729144245 + - 1.5484117159407014 + - 1.30756042036074 + - 1.3825097642948496 + - 1.5564305860193175 + - 1.7129272878883393 + - 1.2395884187194366 + - 1.4893835837821159 + - 1.1098479113208153 + - !!python/tuple + - 1.0302530255207576 + - 1.732454599860052 + - 1.7518402414934802 + - 1.1009230397804433 + - 2.130507434260581 + - 1.54738134800471 + - 1.3074388016516545 + - 1.3839705451157376 + - 1.5556208318402465 + - 1.7161603302287247 + - 1.2373058604080345 + - 1.488929554135538 + - 1.1122101297796663 + - !!python/tuple + - 1.0299606427571957 + - 1.7344747031411696 + - 1.7516400350071795 + - 1.1009286804148262 + - 2.1283214600281393 + - 1.549290094780543 + - 1.3060000262267801 + - 1.3841233544354519 + - 1.5555131209410002 + - 1.7157052043560352 + - 1.2379480874511322 + - 1.4892096739603686 + - 1.1111522626797292 + - !!python/tuple + - 1.0299977764887154 + - 1.732969564435375 + - 1.7513416361367091 + - 1.1009488144711956 + - 2.128150990170737 + - 1.5488688479892159 + - 1.3070749325635909 + - 1.3843482378000063 + - 1.555353426033504 + - 1.7153635623299452 + - 1.2382641553033005 + - 1.4896239619314768 + - 1.1112435444253146 + - !!python/tuple + - 1.0300150072156877 + - 1.7322165671735048 + - 1.7511922653701968 + - 1.1009583244194676 + - 2.128064953287337 + - 1.5486597337459016 + - 1.3075988685810744 + - 1.384458655966147 + - 1.5552741244109387 + - 1.715192749847316 + - 1.2384169701128664 + - 1.4898289228995123 + - 1.1112867537897093 + - !!python/tuple + - 1.0300214534812981 + - 1.7319241588355718 + - 1.7511342429631047 + - 1.1009619132209747 + - 2.1280313932202564 + - 1.5485788454666478 + - 1.3078362205380751 + - 1.3842807474332481 + - 1.5552434441679148 + - 1.715433592933182 + - 1.2384753076215538 + - 1.4897271344881335 + - 1.1113030774113255 + - !!python/tuple + - 1.0300131214817583 + - 1.7319453508662646 + - 1.7511055095908021 + - 1.100962474271435 + - 2.1280147468450488 + - 1.5487314215641728 + - 1.3076187654505869 + - 1.3843025153125883 + - 1.5552282748193658 + - 1.7153667609444294 + - 1.2385655736794392 + - 1.489766774139545 + - 1.111150919604152 + - !!python/tuple + - 1.0300157448346323 + - 1.7318273916421767 + - 1.751082149169792 + - 1.100963902363387 + - 2.128001202307277 + - 1.5486985222481586 + - 1.307699995276426 + - 1.3843201796951699 + - 1.5552159516496467 + - 1.715339642009039 + - 1.2385885676527764 + - 1.4897989647697392 + - 1.1111583157232794 + - !!python/tuple + - 1.0300132122533687 + - 1.7318339285164017 + - 1.7510733905755227 + - 1.10096406949613 + - 2.127996120674117 + - 1.548745088619965 + - 1.3076392244227537 + - 1.3842932921258322 + - 1.5552113342173923 + - 1.715365948207921 + - 1.2386159957525553 + - 1.4897835191789235 + - 1.1111120962582781 + - !!python/tuple + - 1.0300142865652848 + - 1.731785679765374 + - 1.7510638411378168 + - 1.1009646505767512 + - 2.1279905788366293 + - 1.5487316003461113 + - 1.3076724681053873 + - 1.3843005391785173 + - 1.5552063010596597 + - 1.715354840223718 + - 1.2386253280756339 + - 1.4897966886547112 + - 1.1111152181345403 + - !!python/tuple + - 1.0300147983721477 + - 1.7317626395410322 + - 1.7510592809017078 + - 1.1009649275561317 + - 2.127987931676938 + - 1.5487251609020383 + - 1.3076883297705038 + - 1.38430399778106 + - 1.5552038981508856 + - 1.7153495359251862 + - 1.238629779688109 + - 1.4898029752193895 + - 1.1111167063150473 + - !!python/tuple + - 1.0300143034925917 + - 1.7317639254748554 + - 1.7510575701655993 + - 1.1009649597990785 + - 2.127986938488524 + - 1.5487342653304803 + - 1.3076764457300571 + - 1.3842987420007675 + - 1.5552029968306855 + - 1.715354680406364 + - 1.238635132086692 + - 1.4897999532738233 + - 1.1111076832816802 + - !!python/tuple + - 1.0300145129674083 + - 1.7317544976852022 + - 1.7510557043865622 + - 1.1009650730201568 + - 2.1279858552358455 + - 1.5487316291816144 + - 1.3076829368418728 + - 1.3843001580532523 + - 1.555202013870153 + - 1.7153525093549393 + - 1.2386369508607962 + - 1.4898025257615721 + - 1.1111082959025307 + - !!python/tuple + - 1.0300146148991067 + - 1.7317499079515872 + - 1.751054796065157 + - 1.100965128120037 + - 2.127985327845771 + - 1.5487303458872141 + - 1.3076866731320838 + - 1.3842973672920922 + - 1.5552015353575566 + - 1.715356302617117 + - 1.238637836106726 + - 1.4898009209257526 + - 1.1111085940428929 + - !!python/tuple + - 1.0300144841473382 + - 1.731750248153318 + - 1.7510543441121884 + - 1.1009651366173958 + - 2.1279850654258703 + - 1.5487327516231852 + - 1.3076832457684389 + - 1.384297710447149 + - 1.5552012972701983 + - 1.7153552484524208 + - 1.2386392498856829 + - 1.4898015441316257 + - 1.1111062105144545 + - !!python/tuple + - 1.0300145507157323 + - 1.7317472511489185 + - 1.7510537510149822 + - 1.1009651725888476 + - 2.1279847210482385 + - 1.5487319135499318 + - 1.3076853089820755 + - 1.38429816075575 + - 1.5552009848323551 + - 1.715354558150122 + - 1.2386398277203354 + - 1.4898023619490859 + - 1.1111064055131306 + - !!python/tuple + - 1.0300145569618928 + - 1.7317469698966332 + - 1.751053695356019 + - 1.1009651759641883 + - 2.127984688729721 + - 1.5487318349026147 + - 1.3076855025932672 + - 1.3842982030131414 + - 1.5552009555122275 + - 1.7153544933691427 + - 1.2386398819432531 + - 1.4898024386950213 + - 1.1111064238106874 + - !!python/tuple + - 1.03001455084413 + - 1.7317469858194658 + - 1.7510536742096856 + - 1.1009651763615382 + - 2.12798467645103 + - 1.5487319474690842 + - 1.3076853422236099 + - 1.3842982190677997 + - 1.5552009443727413 + - 1.7153544440451851 + - 1.238639948089116 + - 1.4898024678527966 + - 1.111106312291893 + - !!python/tuple + - 1.030014553958425 + - 1.731746845589347 + - 1.7510536464586157 + - 1.100965178044435 + - 2.1279846603372663 + - 1.5487319082559448 + - 1.3076854387567798 + - 1.3842982401368582 + - 1.555200929754014 + - 1.7153544117460147 + - 1.2386399751237176 + - 1.4898025061175288 + - 1.1111063214155832 + - !!python/tuple + - 1.030014550908157 + - 1.7317468535284568 + - 1.7510536359152207 + - 1.1009651782425454 + - 2.1279846542151994 + - 1.548731964380803 + - 1.3076853587975863 + - 1.3842982481415589 + - 1.5552009241999614 + - 1.7153543871534598 + - 1.2386400081034494 + - 1.4898025206553376 + - 1.1111062658132869 + - !!python/tuple + - 1.0300145524609163 + - 1.7317467836110938 + - 1.751053622078819 + - 1.100965179081616 + - 2.127984646181032 + - 1.5487319448294607 + - 1.3076854069281265 + - 1.3842982586463513 + - 1.55520091691122 + - 1.7153543710494354 + - 1.2386400215825106 + - 1.4898025397337153 + - 1.1111062703624375 + - !!python/tuple + - 1.0300145528421523 + - 1.7317467664448136 + - 1.751053618681672 + - 1.100965179287626 + - 2.1279846442084627 + - 1.5487319400291697 + - 1.3076854187452391 + - 1.384298261225511 + - 1.5552009151216712 + - 1.7153543670955365 + - 1.2386400248919172 + - 1.4898025444178824 + - 1.1111062714793531 + - !!python/tuple + - 1.0300145522645732 + - 1.7317467679481242 + - 1.7510536166852442 + - 1.1009651793251385 + - 2.1279846430492273 + - 1.5487319506566168 + - 1.3076854036046714 + - 1.3842982627412257 + - 1.5552009140699932 + - 1.7153543624388499 + - 1.2386400311367356 + - 1.4898025471706633 + - 1.1111062609508742 + - !!python/tuple + - 1.0300145526458093 + - 1.7317467507818451 + - 1.751053613288098 + - 1.1009651795311484 + - 2.1279846410766585 + - 1.5487319458563231 + - 1.3076854154217874 + - 1.3842982653203841 + - 1.5552009122804449 + - 1.7153543584849524 + - 1.2386400344461368 + - 1.4898025518548283 + - 1.1111062620677978 + - !!python/tuple + - 1.0300145523570199 + - 1.7317467515335017 + - 1.751053612289884 + - 1.1009651795499045 + - 2.127984640497041 + - 1.5487319511700472 + - 1.3076854078515026 + - 1.384298266078241 + - 1.555200911754606 + - 1.7153543561566091 + - 1.238640037568545 + - 1.4898025532312182 + - 1.1111062568035597 + - !!python/tuple + - 1.030014552547638 + - 1.731746742950362 + - 1.751053610591311 + - 1.1009651796529094 + - 2.1279846395107564 + - 1.5487319487698998 + - 1.3076854137600606 + - 1.3842982673678197 + - 1.555200910859832 + - 1.7153543541796608 + - 1.238640039223244 + - 1.4898025555733003 + - 1.1111062573620234 + - !!python/tuple + - 1.0300145524573914 + - 1.7317467431852547 + - 1.7510536102793692 + - 1.1009651796587707 + - 2.127984639329626 + - 1.5487319504304387 + - 1.3076854113943464 + - 1.38429826760465 + - 1.5552009106955074 + - 1.7153543534520534 + - 1.2386400401989963 + - 1.489802556003422 + - 1.111106255716949 + - !!python/tuple + - 1.0300145525169595 + - 1.7317467405030236 + - 1.7510536097485652 + - 1.1009651796909596 + - 2.127984639021412 + - 1.5487319496803924 + - 1.3076854132407707 + - 1.3842982680076434 + - 1.5552009104158906 + - 1.715354352834257 + - 1.2386400407160896 + - 1.4898025567353226 + - 1.1111062558914693 + - !!python/tuple + - 1.0300145524887574 + - 1.7317467405764275 + - 1.7510536096510834 + - 1.1009651796927913 + - 2.1279846389648087 + - 1.5487319501993109 + - 1.307685412501485 + - 1.384298268081653 + - 1.5552009103645392 + - 1.7153543526068797 + - 1.238640041021012 + - 1.4898025568697357 + - 1.1111062553773836 + - !!python/tuple + - 1.0300145525073725 + - 1.7317467397382302 + - 1.7510536094852072 + - 1.1009651797028503 + - 2.127984638868492 + - 1.5487319499649215 + - 1.3076854130784925 + - 1.3842982682075884 + - 1.555200910277159 + - 1.7153543524138184 + - 1.2386400411826037 + - 1.4898025570984545 + - 1.111106255431921 + - !!python/tuple + - 1.0300145524985593 + - 1.731746739761169 + - 1.7510536094547442 + - 1.1009651797034228 + - 2.1279846388508035 + - 1.5487319501270835 + - 1.3076854128474658 + - 1.3842982682307163 + - 1.5552009102611115 + - 1.715354352342763 + - 1.238640041277892 + - 1.4898025571404587 + - 1.1111062552712694 + - !!python/tuple + - 1.0300145525043765 + - 1.7317467394992323 + - 1.7510536094029079 + - 1.1009651797065663 + - 2.1279846388207044 + - 1.5487319500538368 + - 1.3076854130277806 + - 1.384298268270071 + - 1.5552009102338051 + - 1.7153543522824313 + - 1.2386400413283893 + - 1.4898025572119333 + - 1.1111062552883124 + - !!python/tuple + - 1.0300145525029993 + - 1.7317467395028165 + - 1.7510536093981481 + - 1.1009651797066557 + - 2.1279846388179404 + - 1.5487319500791745 + - 1.3076854129916826 + - 1.3842982682736849 + - 1.5552009102312978 + - 1.7153543522713288 + - 1.238640041343278 + - 1.4898025572184965 + - 1.1111062552632105 + - !!python/tuple + - 1.0300145525039082 + - 1.7317467394618888 + - 1.7510536093900486 + - 1.100965179707147 + - 2.1279846388132375 + - 1.5487319500677297 + - 1.3076854130198567 + - 1.384298268279834 + - 1.5552009102270312 + - 1.715354352261902 + - 1.2386400413511682 + - 1.4898025572296645 + - 1.1111062552658735 + - !!python/tuple + - 1.030014552502531 + - 1.731746739465473 + - 1.7510536093852889 + - 1.1009651797072364 + - 2.1279846388104735 + - 1.5487319500930674 + - 1.3076854129837587 + - 1.3842982682834477 + - 1.555200910224524 + - 1.7153543522507995 + - 1.238640041366057 + - 1.4898025572362277 + - 1.1111062552407716 + - !!python/tuple + - 1.0300145525034399 + - 1.7317467394245454 + - 1.7510536093771893 + - 1.1009651797077276 + - 2.1279846388057706 + - 1.5487319500816226 + - 1.3076854130119329 + - 1.3842982682895968 + - 1.5552009102202573 + - 1.7153543522413726 + - 1.2386400413739471 + - 1.4898025572473956 + - 1.1111062552434345 + - !!python/tuple + - 1.0300145525032247 + - 1.7317467394251054 + - 1.7510536093764457 + - 1.1009651797077415 + - 2.127984638805339 + - 1.5487319500855816 + - 1.3076854130062925 + - 1.3842982682901614 + - 1.5552009102198656 + - 1.7153543522396377 + - 1.2386400413762735 + - 1.489802557248421 + - 1.1111062552395123 + - !!python/tuple + - 1.0300145525033668 + - 1.7317467394187105 + - 1.7510536093751803 + - 1.1009651797078184 + - 2.127984638804604 + - 1.5487319500837933 + - 1.3076854130106947 + - 1.3842982682911222 + - 1.555200910219199 + - 1.7153543522381647 + - 1.2386400413775063 + - 1.489802557250166 + - 1.1111062552399285 + - !!python/tuple + - 1.0300145525031517 + - 1.7317467394192705 + - 1.7510536093744367 + - 1.1009651797078324 + - 2.1279846388041723 + - 1.5487319500877523 + - 1.3076854130050544 + - 1.384298268291687 + - 1.5552009102188074 + - 1.7153543522364298 + - 1.2386400413798326 + - 1.4898025572511915 + - 1.1111062552360063 + - !!python/tuple + - 1.0300145525032938 + - 1.7317467394128756 + - 1.7510536093731712 + - 1.1009651797079092 + - 2.1279846388034374 + - 1.548731950085964 + - 1.3076854130094566 + - 1.3842982682926477 + - 1.5552009102181408 + - 1.7153543522349568 + - 1.2386400413810654 + - 1.4898025572529365 + - 1.1111062552364224 + - !!python/tuple + - 1.0300145525032602 + - 1.731746739412963 + - 1.751053609373055 + - 1.1009651797079114 + - 2.12798463880337 + - 1.5487319500865826 + - 1.3076854130085753 + - 1.3842982682927358 + - 1.5552009102180795 + - 1.7153543522346857 + - 1.238640041381429 + - 1.4898025572530968 + - 1.1111062552358095 + - !!python/tuple + - 1.0300145525032824 + - 1.7317467394119639 + - 1.7510536093728573 + - 1.1009651797079234 + - 2.127984638803255 + - 1.5487319500863033 + - 1.3076854130092632 + - 1.384298268292886 + - 1.5552009102179754 + - 1.7153543522344556 + - 1.2386400413816216 + - 1.4898025572533695 + - 1.1111062552358746 + - !!python/tuple + - 1.0300145525032656 + - 1.7317467394120076 + - 1.751053609372799 + - 1.1009651797079245 + - 2.127984638803221 + - 1.5487319500866126 + - 1.3076854130088225 + - 1.3842982682929301 + - 1.5552009102179447 + - 1.7153543522343202 + - 1.2386400413818035 + - 1.4898025572534497 + - 1.1111062552355682 + - !!python/tuple + - 1.0300145525032767 + - 1.731746739411508 + - 1.7510536093727003 + - 1.1009651797079305 + - 2.127984638803164 + - 1.548731950086473 + - 1.3076854130091664 + - 1.3842982682930052 + - 1.5552009102178925 + - 1.7153543522342052 + - 1.2386400413818999 + - 1.489802557253586 + - 1.1111062552356006 + - !!python/tuple + - 1.0300145525032598 + - 1.7317467394115518 + - 1.751053609372642 + - 1.1009651797079316 + - 2.12798463880313 + - 1.5487319500867822 + - 1.3076854130087257 + - 1.3842982682930494 + - 1.5552009102178619 + - 1.7153543522340697 + - 1.2386400413820817 + - 1.4898025572536662 + - 1.1111062552352942 + - !!python/tuple + - 1.030014552503271 + - 1.7317467394110522 + - 1.7510536093725433 + - 1.1009651797079376 + - 2.1279846388030728 + - 1.5487319500866426 + - 1.3076854130090696 + - 1.3842982682931244 + - 1.5552009102178097 + - 1.7153543522339547 + - 1.238640041382178 + - 1.4898025572538025 + - 1.1111062552353266 + - !!python/tuple + - 1.030014552503271 + - 1.7317467394110522 + - 1.7510536093725433 + - 1.1009651797079376 + - 2.1279846388030728 + - 1.5487319500866426 + - 1.3076854130090696 + - 1.3842982682931244 + - 1.5552009102178097 + - 1.7153543522339547 + - 1.238640041382178 + - 1.4898025572538025 + - 1.1111062552353266 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.36357916480895 + - 7.92391940544224 + - 7.859278767908292 + - 7.417324693862357 + - 7.938470052992052 + - 7.8868351220266435 + - 7.592743288181266 + - 7.600169442610166 + - 7.664633359690055 + - 7.778996758641538 + - 7.573323229742848 + - 7.470165906811129 + - 7.457432280363526 + - !!python/tuple + - 5.775289601408179 + - 7.688734601400831 + - 7.44139260103579 + - 5.976061041340323 + - 7.78344956804356 + - 7.586782693678117 + - 6.588881296119247 + - 6.593018225206552 + - 6.881249322146564 + - 7.222243352393226 + - 6.498565413261642 + - 6.135650334284433 + - 6.090855034298131 + - !!python/tuple + - 1.7126151593807002 + - 6.906926438807136 + - 6.253107426310718 + - 2.309486435780096 + - 7.202978198024343 + - 6.625004929958201 + - 3.9751982882987247 + - 4.309054200472016 + - 4.810733341360667 + - 5.478290405523462 + - 3.436892163429019 + - 3.5603865547265166 + - 2.817271064625013 + - !!python/tuple + - 0.8449351213779785 + - 6.218576379711634 + - 5.426690275231209 + - 1.497224006216679 + - 6.7094640018845295 + - 5.987298733311448 + - 3.2679739335987366 + - 3.7886187546350962 + - 4.024573727420662 + - 4.811618776276559 + - 2.0299008942598986 + - 3.0556720467483074 + - 2.1391841094498045 + - !!python/tuple + - 1.9754828475355313 + - 5.490827969862711 + - 4.831397456494738 + - 1.3895804757824644 + - 6.324607304164731 + - 5.4153105724764865 + - 2.8390889823898187 + - 3.441733588707373 + - 3.5391698268538856 + - 4.321621025068514 + - 1.1418515360943207 + - 2.707439405201627 + - 1.751581548843519 + - !!python/tuple + - 1.1867238173678865 + - 5.018098309908667 + - 4.366964254447256 + - 1.2499645577047238 + - 5.8819006722744085 + - 4.991977579566592 + - 2.4391516891303695 + - 2.9999051630452325 + - 3.116241547056953 + - 3.824501375652583 + - 1.2539043562167913 + - 2.373284661247213 + - 1.4432897018593103 + - !!python/tuple + - 1.0040636047530378 + - 3.411103385245935 + - 2.598807831510281 + - 1.723431708677447 + - 4.6040437061882615 + - 3.397138236235565 + - 1.7855488386741112 + - 2.386844382461864 + - 1.9762821855811532 + - 2.6346430102771468 + - 0.4013580239866841 + - 1.8964324466790736 + - 1.8372096752697384 + - !!python/tuple + - 1.028293698127744 + - 3.3740822613842902 + - 2.5766489286212493 + - 1.6566077342424748 + - 4.553733666003058 + - 3.362563883269343 + - 1.7712349544261947 + - 2.3108606382914356 + - 1.9809236896610198 + - 2.594817693468433 + - 1.4131104473933784 + - 1.8482220077972527 + - 1.7640681083826808 + - !!python/tuple + - 1.2246628008634937 + - 2.976852539596838 + - 2.363527608962409 + - 1.1564527952039412 + - 4.0503648791993925 + - 3.059928738123497 + - 1.6501332670766833 + - 1.8705608648690495 + - 1.8625377593430785 + - 2.284519734766218 + - 1.1509269484988671 + - 1.635912290793915 + - 1.2984868056301302 + - !!python/tuple + - 0.6904569794224357 + - 2.3748783892696954 + - 1.8262977924442223 + - 1.4479486882142067 + - 3.0162743081503196 + - 2.4599897734228406 + - 1.4660645429660928 + - 1.5687920535483688 + - 1.5827596914865847 + - 1.8222098126018662 + - 1.2550586431160855 + - 1.6187163706884227 + - 1.3845793961529755 + - !!python/tuple + - 1.2922739416473115 + - 2.3048805200491636 + - 1.8442214990768693 + - 1.327338661607501 + - 2.928718232269529 + - 2.41495729672133 + - 1.4629334438142267 + - 1.5260382583509142 + - 1.5947489121490304 + - 1.7967730487161042 + - 1.2460204744537204 + - 1.5439501681791254 + - 1.3289699883095683 + - !!python/tuple + - 1.092965147920136 + - 2.2224882824337375 + - 1.8256634157667864 + - 1.2220256990008453 + - 2.7923515762430293 + - 2.3373880584047777 + - 1.4536334210127126 + - 1.492653980501997 + - 1.6035266317240098 + - 1.7622959173958714 + - 1.2342880419902402 + - 1.4695673290712687 + - 1.2761398881934325 + - !!python/tuple + - 1.0196863490198342 + - 1.8759995312140942 + - 1.758145008507279 + - 1.0937538216470521 + - 2.174385923632137 + - 2.004378981774447 + - 1.4222969911786216 + - 1.4285800656969065 + - 1.6300179341871068 + - 1.5956042031138469 + - 1.223503746874452 + - 1.3087448281843947 + - 1.199262060772619 + - !!python/tuple + - 1.0990273155076895 + - 1.9385438365442242 + - 1.7195485937411654 + - 1.2002700844206062 + - 2.1956627243376277 + - 1.9894495816377433 + - 1.3932482009905358 + - 1.4493655283000433 + - 1.551237489168751 + - 1.6144745953886364 + - 1.2036953822227343 + - 1.3917558685032436 + - 1.244546996706847 + - !!python/tuple + - 1.0713074216789606 + - 1.9567902343646055 + - 1.70991772749937 + - 1.180435882128171 + - 2.2028129944756025 + - 1.9848392052384896 + - 1.4015430313272441 + - 1.4177789041003988 + - 1.5579668160073656 + - 1.623825890747293 + - 1.235325496994059 + - 1.373135449650407 + - 1.2271200357848486 + - !!python/tuple + - 1.0721979477788233 + - 1.9628114162438897 + - 1.7064365055474882 + - 1.1739068637447598 + - 2.2075259395769726 + - 1.9819022935424075 + - 1.4055158625561612 + - 1.4020869886386997 + - 1.561636250489366 + - 1.6291141468470614 + - 1.2466037255033595 + - 1.3643654773947855 + - 1.220656177567169 + - !!python/tuple + - 1.0729194116719367 + - 1.9643293201052177 + - 1.7061355836468919 + - 1.171831391346222 + - 2.2098901372053787 + - 1.9804652748098013 + - 1.4028660048555421 + - 1.408789017439223 + - 1.5547112551723812 + - 1.6293722095388545 + - 1.2390299217299952 + - 1.3696932519416938 + - 1.223788869759607 + - !!python/tuple + - 1.0743280489593015 + - 1.9682891645602467 + - 1.7053707004872587 + - 1.167396252006227 + - 2.2161475968462474 + - 1.9767115859286144 + - 1.4058773402433329 + - 1.4081653627751844 + - 1.5502320292778682 + - 1.630020681268446 + - 1.2446963038863184 + - 1.3632195832104734 + - 1.2212478236502393 + - !!python/tuple + - 1.0744371701555218 + - 1.9695157745777259 + - 1.70515214073891 + - 1.1667738908783745 + - 2.218170295284731 + - 1.9755456981766573 + - 1.4052097492278932 + - 1.4085715812176802 + - 1.5464241686450244 + - 1.6301993982440357 + - 1.2416310667252455 + - 1.3663813399643194 + - 1.224084535260789 + - !!python/tuple + - 1.074540937934967 + - 1.971056251378856 + - 1.7048846276218141 + - 1.1661322404084251 + - 2.22074642790181 + - 1.9740807274531977 + - 1.4062329122749244 + - 1.408315617152076 + - 1.5453372858468832 + - 1.6304157884026387 + - 1.2436602842469786 + - 1.3639438892955609 + - 1.2228257016937174 + - !!python/tuple + - 1.0745632993310121 + - 1.9715473883115302 + - 1.7048022449363105 + - 1.1659766880722564 + - 2.221583233628537 + - 1.9736134624034507 + - 1.4059158854286617 + - 1.4084883835183175 + - 1.543842590892373 + - 1.6304814664216538 + - 1.2423768132592405 + - 1.3653089578817095 + - 1.223957368068763 + - !!python/tuple + - 1.0745721533305663 + - 1.971764775818704 + - 1.7047661863500405 + - 1.1659132135760637 + - 2.2219558928521077 + - 1.9734066248086686 + - 1.4061415899774163 + - 1.4073071131079309 + - 1.5444876508329433 + - 1.630510082263314 + - 1.2432990358519973 + - 1.364942213770521 + - 1.2234006704930744 + - !!python/tuple + - 1.0745781946978195 + - 1.9719204375971986 + - 1.7047404948377438 + - 1.1658693482134685 + - 2.2222234689830422 + - 1.9732585135718603 + - 1.4062379731543373 + - 1.407301430978674 + - 1.5443936650815948 + - 1.630530429629021 + - 1.2434799926213373 + - 1.3647009091948439 + - 1.223280109346807 + - !!python/tuple + - 1.074586260786126 + - 1.9718934588536998 + - 1.7047382351510514 + - 1.1658777488437402 + - 2.2222471349384887 + - 1.9732432955869716 + - 1.4062287727172469 + - 1.407321161579544 + - 1.5443514609462694 + - 1.630532216670032 + - 1.2434226009271137 + - 1.364779567665787 + - 1.223323461181005 + - !!python/tuple + - 1.0745871372202385 + - 1.9719182487296474 + - 1.7047341666118916 + - 1.165870904160268 + - 2.222289766159863 + - 1.9732197504191034 + - 1.4062439546182197 + - 1.4073202114816212 + - 1.5443367078034214 + - 1.6305354338043234 + - 1.2434510612276508 + - 1.3647414421612034 + - 1.2233044944439244 + - !!python/tuple + - 1.074587567668187 + - 1.9719304900906067 + - 1.7047321586959805 + - 1.1658675377629826 + - 2.222310824284506 + - 1.9732081236765886 + - 1.406251437764506 + - 1.4073197431760316 + - 1.5443294308550102 + - 1.6305370211661818 + - 1.243465071229637 + - 1.3647226552231349 + - 1.2232951597440658 + - !!python/tuple + - 1.0745932586109974 + - 1.971911371999558 + - 1.7047305630356686 + - 1.1658734930540982 + - 2.222327566185588 + - 1.973197362611865 + - 1.4062573807973477 + - 1.407328658524869 + - 1.5443236495675443 + - 1.6305382824747452 + - 1.243461601221536 + - 1.3647363595122426 + - 1.223295998715515 + - !!python/tuple + - 1.0745936669198357 + - 1.9719235381055595 + - 1.7047285708971687 + - 1.1658701419061448 + - 2.222348475273055 + - 1.9731858221318141 + - 1.4062647968314759 + - 1.4073281813339773 + - 1.5443164333685337 + - 1.63053985704142 + - 1.24347549954095 + - 1.3647177013239666 + - 1.223286742308516 + - !!python/tuple + - 1.074599297323646 + - 1.971904574730973 + - 1.7047269901721032 + - 1.1658760447598988 + - 2.2223650734669658 + - 1.9731751556126096 + - 1.4062706776702043 + - 1.407337016412893 + - 1.544310709015356 + - 1.630541106289445 + - 1.243472040190137 + - 1.3647313028120391 + - 1.2232875889515171 + - !!python/tuple + - 1.0745996830898 + - 1.9719166368946992 + - 1.7047250184251794 + - 1.1658727169267726 + - 2.22238578468755 + - 1.9731637282514845 + - 1.4062780096343892 + - 1.4073365317649995 + - 1.544303570188425 + - 1.6305426644221572 + - 1.2434857946971898 + - 1.364712817064771 + - 1.2232784321308068 + - !!python/tuple + - 1.0746011452061797 + - 1.9719116999153175 + - 1.7047246074159326 + - 1.1658742526009243 + - 2.2223901037889435 + - 1.973160953223073 + - 1.4062763141737582 + - 1.407340132439768 + - 1.5442958662648882 + - 1.6305429891773544 + - 1.2434752889892156 + - 1.3647272085536288 + - 1.2232863666969758 + - !!python/tuple + - 1.0746012891260843 + - 1.9719162672778414 + - 1.704723861295054 + - 1.1658729937992933 + - 2.2223979451247473 + - 1.9731566276572214 + - 1.4062790882818306 + - 1.4073399472240034 + - 1.5442931682635699 + - 1.630543578704145 + - 1.2434804962321817 + - 1.364720209163428 + - 1.2232828993927907 + - !!python/tuple + - 1.0746013645884671 + - 1.971918664497479 + - 1.7047234697283158 + - 1.165872333594019 + - 2.2224020609560586 + - 1.9731543573458286 + - 1.406280543804483 + - 1.407339850044637 + - 1.5442917524888884 + - 1.6305438880766325 + - 1.2434832277284087 + - 1.3647165368975904 + - 1.2232810806640428 + - !!python/tuple + - 1.0746024702702164 + - 1.9719149280809456 + - 1.7047231588729101 + - 1.165873495924683 + - 2.222405328695505 + - 1.9731522579829772 + - 1.4062816991678293 + - 1.4073415884593716 + - 1.5442906286000608 + - 1.6305441336745232 + - 1.2434825435802803 + - 1.3647192174054257 + - 1.2232812493986192 + - !!python/tuple + - 1.0746025444878553 + - 1.971917309131358 + - 1.7047227700781813 + - 1.165872839965939 + - 2.222409416018136 + - 1.9731500035490928 + - 1.4062831440699854 + - 1.407341491488396 + - 1.544289222984019 + - 1.6305444408445853 + - 1.2434852556812852 + - 1.3647155704144909 + - 1.223279443731761 + - !!python/tuple + - 1.0746028329055524 + - 1.971916333998148 + - 1.7047226889711573 + - 1.165873143269578 + - 2.222410268752938 + - 1.9731494557305178 + - 1.4062828088978991 + - 1.4073422023842743 + - 1.5442877019812309 + - 1.6305445049223513 + - 1.243483180709055 + - 1.3647184127514231 + - 1.2232810108255936 + - !!python/tuple + - 1.0746055419681269 + - 1.9719071737314071 + - 1.704721927071701 + - 1.1658759922333655 + - 2.2224182792764364 + - 1.9731443095982582 + - 1.4062856403224004 + - 1.4073464632552277 + - 1.5442849481539502 + - 1.6305451068503598 + - 1.2434815033920645 + - 1.3647249835499156 + - 1.2232814245764962 + - !!python/tuple + - 1.074605718554131 + - 1.9719129898975027 + - 1.70472097814356 + - 1.1658743874966657 + - 2.2224282578630703 + - 1.9731388064557456 + - 1.4062891659580452 + - 1.407346223180473 + - 1.5442815186858874 + - 1.6305458565052073 + - 1.2434881270653457 + - 1.364716073734156 + - 1.2232770151532806 + - !!python/tuple + - 1.0746058136055905 + - 1.971912668102984 + - 1.7047209513948582 + - 1.1658744875446339 + - 2.2224285392012737 + - 1.9731386257356904 + - 1.4062890552262293 + - 1.4073464577084185 + - 1.5442810168183043 + - 1.630545877635584 + - 1.2434874421808542 + - 1.364717011783388 + - 1.2232775324132632 + - !!python/tuple + - 1.0746058226375381 + - 1.9719129662105654 + - 1.7047209027652486 + - 1.1658744053661885 + - 2.222429050682066 + - 1.9731383436780867 + - 1.406289235856331 + - 1.4073464454007332 + - 1.544280841102979 + - 1.630545916050921 + - 1.2434877814585568 + - 1.364716555306941 + - 1.2232773065605895 + - !!python/tuple + - 1.0746059597784383 + - 1.9719125019017718 + - 1.7047208641713971 + - 1.1658745497219658 + - 2.222429456612204 + - 1.9731380829263703 + - 1.40628937920738 + - 1.4073466612719603 + - 1.5442807016511968 + - 1.6305459465383487 + - 1.2434876962511074 + - 1.364716888442551 + - 1.2232773276885223 + - !!python/tuple + - 1.0746059687306333 + - 1.9719127977503366 + - 1.7047208159123146 + - 1.1658744681630813 + - 2.2224299642055367 + - 1.9731378030148639 + - 1.4062895584563158 + - 1.4073466490506532 + - 1.5442805272768083 + - 1.6305459846607955 + - 1.2434880329428395 + - 1.3647164354330197 + - 1.2232771035595746 + - !!python/tuple + - 1.0746061048174806 + - 1.971912336981641 + - 1.70472077761391 + - 1.1658746114157403 + - 2.2224303670358307 + - 1.9731375442556334 + - 1.4062897007061166 + - 1.4073468632712194 + - 1.5442803888942263 + - 1.6305460149146835 + - 1.2434879483748333 + - 1.3647167660334232 + - 1.2232771245348977 + - !!python/tuple + - 1.0746061136901888 + - 1.9719126305713883 + - 1.7047207297252756 + - 1.1658745304764346 + - 2.22243087074231 + - 1.9731372664898366 + - 1.4062898785742903 + - 1.4073468511364402 + - 1.544280215860442 + - 1.6305460527443065 + - 1.2434882824811646 + - 1.3647163164903244 + - 1.2232769021292447 + - !!python/tuple + - 1.0746062487234171 + - 1.9719121733419795 + - 1.704720691722223 + - 1.165874672626285 + - 2.2224312704735807 + - 1.9731370097225356 + - 1.4062900197232837 + - 1.407347063706832 + - 1.5442800785466795 + - 1.6305460827647331 + - 1.243488198552688 + - 1.3647166445559935 + - 1.2232769229518 + - !!python/tuple + - 1.0746062575169142 + - 1.9719124646735016 + - 1.7047206442038947 + - 1.1658745923064675 + - 2.222431770294483 + - 1.973136734101691 + - 1.406290196211335 + - 1.4073470516587125 + - 1.5442799068529378 + - 1.6305461203016491 + - 1.2434885300746321 + - 1.364716198478244 + - 1.2232767022687148 + - !!python/tuple + - 1.0746062927389108 + - 1.9719123454027483 + - 1.7047206342908972 + - 1.165874629386388 + - 2.2224318745653013 + - 1.973136667123679 + - 1.4062901551616795 + - 1.4073471385799066 + - 1.5442797208459271 + - 1.6305461281323612 + - 1.2434882762203006 + - 1.3647165461621933 + - 1.223276893992806 + - !!python/tuple + - 1.0746062960728222 + - 1.9719124558974614 + - 1.704720616268674 + - 1.1658745989238555 + - 2.222432064134199 + - 1.9731365625884638 + - 1.406290222097903 + - 1.4073471340093673 + - 1.5442796557298049 + - 1.6305461423688985 + - 1.2434884019576993 + - 1.3647163769762864 + - 1.2232768102932248 + - !!python/tuple + - 1.0746062960728222 + - 1.9719124558974614 + - 1.704720616268674 + - 1.1658745989238555 + - 2.222432064134199 + - 1.9731365625884638 + - 1.406290222097903 + - 1.4073471340093673 + - 1.5442796557298049 + - 1.6305461423688985 + - 1.2434884019576993 + - 1.3647163769762864 + - 1.2232768102932248 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.395810598188896 + - 7.8747844897060295 + - 7.6501555131215735 + - 7.28962873424342 + - 7.974536290202884 + - 7.7357192033982605 + - 7.6439008803410635 + - 7.5144612823373915 + - 7.640356888152338 + - 7.757097089700419 + - 7.573510889031433 + - 7.692933540625166 + - 7.645598490276596 + - !!python/tuple + - 5.874178413857097 + - 7.481325621772884 + - 6.768911327633122 + - 5.530609635016489 + - 7.910382121737985 + - 7.059646909382946 + - 6.758145468692931 + - 6.351986977146993 + - 6.742636381327227 + - 7.123230156711054 + - 6.493787733406644 + - 6.923156467985855 + - 6.757243637428315 + - !!python/tuple + - 1.9785751747049045 + - 6.312753639159367 + - 4.563472482923914 + - 1.3138389037823854 + - 7.06289770296141 + - 5.336008949750446 + - 4.734248889667694 + - 3.4262551992391406 + - 4.629474535441166 + - 5.489946690029917 + - 3.7152711585781835 + - 4.943093471743291 + - 4.515096130311335 + - !!python/tuple + - 1.0425269012477676 + - 5.514512153204241 + - 3.6163939335377204 + - 0.9731861735744992 + - 6.588916312073033 + - 4.387401325528659 + - 4.0440630447433685 + - 2.540767612337552 + - 4.0743870122710595 + - 4.854701938358024 + - 2.6957748971108177 + - 4.292959319540668 + - 3.7012820562842297 + - !!python/tuple + - 2.0302921845483985 + - 3.81298469797247 + - 2.1396488371213813 + - 2.3845641495133627 + - 5.502995997964177 + - 2.6740619715687113 + - 2.9059669275952276 + - 1.2338230512900292 + - 3.0990965899791574 + - 3.613415024473672 + - 0.942219998003617 + - 3.099632227109396 + - 2.241672745828528 + - !!python/tuple + - 1.5307856967871936 + - 3.6252501673474513 + - 2.112826184404602 + - 1.779529617488611 + - 5.195811669075522 + - 2.5745453481533054 + - 2.5167776835374585 + - 1.5280693213079786 + - 2.8532901016193017 + - 3.218410389441355 + - 1.5175517442180575 + - 2.8633467062390916 + - 1.9530592304344476 + - !!python/tuple + - 1.0624157782225276 + - 3.288824730076543 + - 2.036382421169295 + - 1.0649677478414086 + - 4.730064118675385 + - 2.3397830392255825 + - 2.121268126227217 + - 1.4384596222021289 + - 2.4721971138352323 + - 2.8155397651114606 + - 1.3556757900548402 + - 2.4898453981783675 + - 1.6557739153585032 + - !!python/tuple + - 1.4419034887029374 + - 2.507277713608164 + - 1.4436193886178776 + - 1.398937980521081 + - 3.5497049962959895 + - 1.75076816345995 + - 1.600573480247025 + - 1.4342922765390391 + - 2.02612714308831 + - 2.1589254913859577 + - 1.2776349001547782 + - 1.773664344714173 + - 1.377952419454706 + - !!python/tuple + - 1.083532113684395 + - 2.357983926743372 + - 1.664848163645848 + - 0.9935158414984404 + - 3.21692808705398 + - 1.7632553652186091 + - 1.5252160726827113 + - 1.3869197876075867 + - 1.820860204230227 + - 1.9608205871467892 + - 1.3452141173773817 + - 1.6785952103935557 + - 1.4202501509567649 + - !!python/tuple + - 1.1913792048733185 + - 2.1391986935171023 + - 1.5030978080730875 + - 1.2325463362398263 + - 2.9351721475263655 + - 1.6557251097917982 + - 1.549776328032592 + - 1.3952365796561887 + - 1.6930574346571612 + - 1.8471926432754475 + - 1.2381553428245087 + - 1.687971184256104 + - 1.519051206089741 + - !!python/tuple + - 1.095228384021037 + - 2.0791440878358225 + - 1.4826661146916023 + - 1.0420480383776756 + - 2.7523292822360927 + - 1.6477155119796787 + - 1.5805494887497336 + - 1.3124751972731008 + - 1.6417485180634392 + - 1.789704752614699 + - 1.3340226732715543 + - 1.6169142461564454 + - 1.4551526512794053 + - !!python/tuple + - 1.159795195833106 + - 1.9660073323630767 + - 1.4621024010363397 + - 1.1854163189926823 + - 2.3557237736771777 + - 1.636803921983872 + - 1.5480623330264476 + - 1.3493551265412242 + - 1.570432990779698 + - 1.677969049416964 + - 1.3564273805782632 + - 1.5373801226398691 + - 1.3919312479506931 + - !!python/tuple + - 1.111515854602269 + - 1.9482984752479189 + - 1.4650717779672484 + - 1.0547344668999281 + - 2.3169177812889035 + - 1.6368845913088108 + - 1.5091549853250055 + - 1.320428451099298 + - 1.5317687247869918 + - 1.6720915855458314 + - 1.317414918502456 + - 1.5545185576595186 + - 1.4322559445345473 + - !!python/tuple + - 1.1137575300989027 + - 1.9389490194968688 + - 1.46606397964566 + - 1.0653252681739176 + - 2.2942021560367585 + - 1.636919208632469 + - 1.4972967243995097 + - 1.306062950129708 + - 1.5340385486263923 + - 1.6630403674514942 + - 1.344373077162537 + - 1.5513538063682915 + - 1.4144448654936754 + - !!python/tuple + - 1.1140787306709043 + - 1.934196031814304 + - 1.4621324923936654 + - 1.0682550522624 + - 2.281886531267271 + - 1.6272033656004439 + - 1.4909037486286572 + - 1.3060786394793695 + - 1.5247728649208607 + - 1.6709742037107607 + - 1.3315873937959881 + - 1.5557833077300214 + - 1.4299074429887482 + - !!python/tuple + - 1.1142516100341129 + - 1.9299578393717454 + - 1.4632713684222631 + - 1.0675523869833312 + - 2.2705020318641482 + - 1.6285671352795588 + - 1.4873159220212622 + - 1.3016024408738596 + - 1.5272667596266307 + - 1.6658894893569443 + - 1.3434812574366808 + - 1.553752072498401 + - 1.4201011046359338 + - !!python/tuple + - 1.1143022894403898 + - 1.9279383635127398 + - 1.4615574461568368 + - 1.0684612950798629 + - 2.264885011438425 + - 1.624244453604561 + - 1.4850177660342816 + - 1.3022417937022606 + - 1.5231626696544578 + - 1.6697171082653564 + - 1.3371157757843815 + - 1.5557962129125549 + - 1.4273153324944088 + - !!python/tuple + - 1.1143895761721172 + - 1.9236366667190228 + - 1.4630052308582897 + - 1.0675292089264716 + - 2.2527098513654367 + - 1.6263053530480884 + - 1.4821107147743544 + - 1.2982659677613282 + - 1.5195362997392174 + - 1.6683224829619667 + - 1.345388440676473 + - 1.553441075952011 + - 1.4224485740772488 + - !!python/tuple + - 1.1144102241438658 + - 1.9217819078912648 + - 1.4635425198758727 + - 1.067339304090687 + - 2.247243769178043 + - 1.6271299914509372 + - 1.480147723257934 + - 1.2994539498854898 + - 1.5158974706681692 + - 1.667756134286987 + - 1.3385586374459117 + - 1.555644955232368 + - 1.4273951122989228 + - !!python/tuple + - 1.114422855930975 + - 1.9203565343500955 + - 1.463929594586585 + - 1.067228222497705 + - 2.2429652356844043 + - 1.6277433724174186 + - 1.4794298596215292 + - 1.2982627706187027 + - 1.5176910395642638 + - 1.6656726098384238 + - 1.343079052798008 + - 1.5547480987332418 + - 1.4232495789854578 + - !!python/tuple + - 1.1144296934216456 + - 1.919434951417604 + - 1.4641673999982225 + - 1.0671701060034722 + - 2.2401581233866024 + - 1.628129858284871 + - 1.4785154547219654 + - 1.2989068802207198 + - 1.51581429978318 + - 1.6654692206706692 + - 1.3395496484924319 + - 1.5558794887561032 + - 1.4258800930061346 + - !!python/tuple + - 1.1144411382150077 + - 1.917705658891036 + - 1.4645989243014244 + - 1.0670748594649488 + - 2.23483935821205 + - 1.6288428847658032 + - 1.4777621279015993 + - 1.297452177162071 + - 1.5147356336402722 + - 1.6650928996620211 + - 1.3433221418806283 + - 1.5546970295171891 + - 1.4236248601460952 + - !!python/tuple + - 1.1144436827679003 + - 1.917217113294264 + - 1.4639891669919824 + - 1.0674156606515774 + - 2.233307909970455 + - 1.6274089642940595 + - 1.477307047338805 + - 1.2978592012715922 + - 1.5137494492331742 + - 1.6663746061239249 + - 1.3412271192638818 + - 1.555345910598429 + - 1.4258799360709258 + - !!python/tuple + - 1.1144457669432968 + - 1.916790941123242 + - 1.4641079126101462 + - 1.067372075870015 + - 2.231964657120612 + - 1.6276118961297228 + - 1.4771431766205203 + - 1.2975203614140594 + - 1.5144168767180042 + - 1.6656924698914577 + - 1.3426646763225627 + - 1.5550477986822582 + - 1.4245161506720545 + - !!python/tuple + - 1.1144458265061494 + - 1.9167780671932348 + - 1.4641114408043912 + - 1.0673708424895947 + - 2.2319238833261448 + - 1.6276179750705262 + - 1.4771309837039523 + - 1.29753130305567 + - 1.5143904112923292 + - 1.6656893038111238 + - 1.3426104251528177 + - 1.5550651196882337 + - 1.424555711205885 + - !!python/tuple + - 1.1144459192232903 + - 1.916757994565125 + - 1.4641169391255906 + - 1.067368923115749 + - 2.23186030080981 + - 1.627627450770849 + - 1.4771233996466449 + - 1.2975157837894837 + - 1.514378655104149 + - 1.6656843683890918 + - 1.3426522537691066 + - 1.5550512146439845 + - 1.424529387000355 + - !!python/tuple + - 1.1144460348614769 + - 1.916732895854033 + - 1.464123808877958 + - 1.0673665302945299 + - 2.2317807794253346 + - 1.627639294469953 + - 1.4771139235719315 + - 1.2974964054265683 + - 1.514363964625696 + - 1.6656781991738672 + - 1.3427044939158101 + - 1.555033837288423 + - 1.4244965007571289 + - !!python/tuple + - 1.1144460826366933 + - 1.9167224933671108 + - 1.4641266533790525 + - 1.0673655422580068 + - 2.23174781134841 + - 1.6276442008251517 + - 1.4771040742481891 + - 1.2975052874117072 + - 1.5143425759543634 + - 1.6656756433051467 + - 1.3426605411798773 + - 1.555047866771416 + - 1.424528539752328 + - !!python/tuple + - 1.1144461860743673 + - 1.9166999412832921 + - 1.4641328176429695 + - 1.067363403555701 + - 2.231676329710863 + - 1.6276548353899967 + - 1.4770955798283922 + - 1.297487879761971 + - 1.5143294126923967 + - 1.6656701032433165 + - 1.3427075156453376 + - 1.555032239786197 + - 1.424498959185737 + - !!python/tuple + - 1.1144462288026746 + - 1.916690598665541 + - 1.4641353690793406 + - 1.0673625205313308 + - 2.231646709520211 + - 1.6276592390020834 + - 1.4770867365898337 + - 1.297495872933328 + - 1.5143102038978689 + - 1.6656678090120187 + - 1.3426679981366172 + - 1.5550448536218229 + - 1.4245277615610938 + - !!python/tuple + - 1.1144463212451199 + - 1.9166703619616632 + - 1.4641408936583074 + - 1.0673606105036573 + - 2.2315825434810246 + - 1.6276687757536263 + - 1.4770791305375548 + - 1.297480256095942 + - 1.5142984216441244 + - 1.665662840316464 + - 1.342710177947423 + - 1.5550308206836292 + - 1.4245011928689024 + - !!python/tuple + - 1.1144463594266405 + - 1.9166619820475994 + - 1.4641431795684947 + - 1.06735982195451 + - 2.2315559665325346 + - 1.6276727233007735 + - 1.4770712006132274 + - 1.2974874386099036 + - 1.5142811927340754 + - 1.6656607834831598 + - 1.342674697886325 + - 1.555042145829941 + - 1.4245270496590559 + - !!python/tuple + - 1.1144464419777593 + - 1.9166438447728176 + - 1.4641481255321094 + - 1.067358117368867 + - 2.2314984385634085 + - 1.6276812658635338 + - 1.477064396717528 + - 1.297473444798582 + - 1.5142706565929391 + - 1.6656563323323725 + - 1.3427125244563094 + - 1.5550295603883677 + - 1.424503217089973 + - !!python/tuple + - 1.1144464760701527 + - 1.9166363370323478 + - 1.4641501714271914 + - 1.067357413680207 + - 2.2314746205223868 + - 1.6276848007079385 + - 1.477057293790288 + - 1.297479890200364 + - 1.5142552212677678 + - 1.665654490368144 + - 1.3426807093088007 + - 1.5550397157458282 + - 1.4245264006890646 + - !!python/tuple + - 1.1144465497370013 + - 1.916620098801201 + - 1.464154595137376 + - 1.0673558933997622 + - 2.231423100899113 + - 1.6276924449699692 + - 1.4770512127816597 + - 1.297467363892773 + - 1.5142458073857947 + - 1.6656505069350185 + - 1.342714593479344 + - 1.555028441356426 + - 1.4245050472540726 + - !!python/tuple + - 1.1144465801574792 + - 1.9166133793947295 + - 1.464156424525344 + - 1.067355265828772 + - 2.23140177804653 + - 1.6276956071662227 + - 1.4770448570081598 + - 1.2974731408749136 + - 1.5142319931415673 + - 1.6656488590202352 + - 1.3426860967012504 + - 1.5550375375307879 + - 1.42452581091768 + - !!python/tuple + - 1.1144466458556304 + - 1.9165988552831499 + - 1.4641603777500098 + - 1.0673539106830736 + - 2.231355684804266 + - 1.6277024414024486 + - 1.4770394263170785 + - 1.2974619386835653 + - 1.5142235882805666 + - 1.66564529741459 + - 1.3427164186143854 + - 1.5550274479091704 + - 1.4245066985616024 + - !!python/tuple + - 1.1144466729832805 + - 1.9165928469711857 + - 1.4641620121939622 + - 1.067353351303631 + - 2.2313366138624984 + - 1.6277052677693797 + - 1.477033744215017 + - 1.2974671109978348 + - 1.5142112362147373 + - 1.6656438244041412 + - 1.3426909197051935 + - 1.5550355871945063 + - 1.42452527640514 + - !!python/tuple + - 1.1144467315426745 + - 1.9165798671325098 + - 1.4641655422838677 + - 1.0673521439523357 + - 2.231295411820047 + - 1.6277113728854347 + - 1.4770288976564907 + - 1.2974571013331235 + - 1.5142037372181305 + - 1.665640642551401 + - 1.3427180293122924 + - 1.5550265660572387 + - 1.4245081857637734 + - !!python/tuple + - 1.1144467557209603 + - 1.9165744990772526 + - 1.4641670014843235 + - 1.0673516455974201 + - 2.231278369418503 + - 1.6277138971242078 + - 1.477023821894091 + - 1.297461727821237 + - 1.5141927016147967 + - 1.6656393269154 + - 1.3426952333432187 + - 1.5550338425866161 + - 1.424524793137932 + - !!python/tuple + - 1.1144467893179963 + - 1.916567034768603 + - 1.4641690300879922 + - 1.067350953187902 + - 2.2312546704180285 + - 1.6277174067197089 + - 1.4770210382374855 + - 1.2974559723141756 + - 1.5141883954516666 + - 1.6656374976770214 + - 1.3427108292492496 + - 1.5550286525984045 + - 1.4245149594832187 + - !!python/tuple + - 1.1144468032017365 + - 1.9165639472580864 + - 1.4641698689497227 + - 1.0673506671014155 + - 2.231244866810542 + - 1.6277188582027668 + - 1.4770181193283278 + - 1.2974586347176553 + - 1.5141820486286988 + - 1.6656367411294677 + - 1.3426977146041197 + - 1.5550328390928294 + - 1.4245245136763673 + - !!python/tuple + - 1.114446833162859 + - 1.9165572817847356 + - 1.4641716797099495 + - 1.067350049768381 + - 2.2312237015419685 + - 1.6277219915467076 + - 1.4770156353527624 + - 1.2974534955500352 + - 1.5141782065398686 + - 1.6656351079388083 + - 1.3427116445093792 + - 1.5550282034058254 + - 1.4245157296771933 + - !!python/tuple + - 1.1144468455436602 + - 1.9165545250760654 + - 1.4641724284112063 + - 1.067349794705887 + - 2.2312149473365204 + - 1.6277232872657 + - 1.4770130294034038 + - 1.2974558741084183 + - 1.514172539780491 + - 1.6656344325568035 + - 1.3426999312256895 + - 1.55503194256089 + - 1.4245242626500374 + - !!python/tuple + - 1.114446872255753 + - 1.916548575271468 + - 1.4641740441604614 + - 1.0673492444312758 + - 2.2311960525388432 + - 1.6277260836640102 + - 1.47701081354376 + - 1.297451287034053 + - 1.514169112786437 + - 1.6656329749453864 + - 1.3427123679423718 + - 1.5550278037004976 + - 1.424516419593062 + - !!python/tuple + - 1.1144468832936307 + - 1.916546114847204 + - 1.46417471216749 + - 1.0673490170784445 + - 2.2311882384368524 + - 1.6277272399235547 + - 1.4770084878524956 + - 1.2974534110741476 + - 1.5141640551184319 + - 1.6656323722375377 + - 1.3427019105720146 + - 1.5550311419444418 + - 1.4245240374028914 + - !!python/tuple + - 1.114446899633811 + - 1.9165424713573889 + - 1.4641757012832965 + - 1.0673486805295533 + - 2.2311766666920576 + - 1.6277289520735125 + - 1.477007131695712 + - 1.2974506022467098 + - 1.5141619579312104 + - 1.6656314797607101 + - 1.3427095278053947 + - 1.5550286069301142 + - 1.424519233341246 + - !!python/tuple + - 1.1144469063881925 + - 1.9165409645831863 + - 1.4641761102767645 + - 1.0673485414247421 + - 2.231171880969137 + - 1.6277296600864302 + - 1.4770057075395389 + - 1.2974519033694791 + - 1.5141588606862493 + - 1.6656311106966875 + - 1.3427031228359299 + - 1.555030651603582 + - 1.4245238990867117 + - !!python/tuple + - 1.114446920958648 + - 1.9165377135665953 + - 1.464176992669645 + - 1.0673482413597613 + - 2.231161555113694 + - 1.627731187649935 + - 1.4770044978885735 + - 1.2974493971964705 + - 1.514156990174175 + - 1.6656303144236164 + - 1.3427099202831905 + - 1.5550283893880665 + - 1.4245196118589938 + - !!python/tuple + - 1.1144469269813992 + - 1.9165363691894601 + - 1.4641773575152728 + - 1.0673481173356623 + - 2.231157284954032 + - 1.6277318192953276 + - 1.477003227277837 + - 1.2974505584223204 + - 1.5141542267563362 + - 1.665629985162165 + - 1.342704204731602 + - 1.5550302139788448 + - 1.4245237753195295 + - !!python/tuple + - 1.1144469269813992 + - 1.9165363691894601 + - 1.4641773575152728 + - 1.0673481173356623 + - 2.231157284954032 + - 1.6277318192953276 + - 1.477003227277837 + - 1.2974505584223204 + - 1.5141542267563362 + - 1.665629985162165 + - 1.342704204731602 + - 1.5550302139788448 + - 1.4245237753195295 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.404819480505221 + - 7.720052628629474 + - 7.805727978706968 + - 7.41745174051314 + - 7.895601845873513 + - 7.706684177022522 + - 7.483946083902382 + - 7.757629359100632 + - 7.635533950501109 + - 7.632326219038091 + - 7.4121470670069876 + - 7.7809845087264495 + - 7.62897916322816 + - !!python/tuple + - 5.918216644668634 + - 6.970106435499 + - 7.31760537227681 + - 6.014753294540697 + - 7.63327920036482 + - 6.8723982245420245 + - 6.21491434728102 + - 7.148674137990476 + - 6.719887930617475 + - 6.719606334777178 + - 5.920084164654113 + - 7.230700776033522 + - 6.752418900220539 + - !!python/tuple + - 2.100667729062194 + - 5.108780477988181 + - 5.748955121383809 + - 2.6563243736438626 + - 6.761774099765168 + - 4.2930158800773075 + - 3.5723722795494126 + - 5.238855406540023 + - 4.867547904686376 + - 4.529773736623022 + - 2.4070341621186424 + - 5.485587639774853 + - 4.3238069606968486 + - !!python/tuple + - 1.0845094395985861 + - 4.395540925540597 + - 5.027182004263631 + - 1.7997464887051566 + - 6.261635800801026 + - 3.308706610709956 + - 2.9088899937851584 + - 4.343626711279705 + - 4.517728298668963 + - 3.9206634580293054 + - 1.5621910086869015 + - 4.740409744810938 + - 3.470413670524886 + - !!python/tuple + - 1.568053712847182 + - 2.891130340693622 + - 3.7015593005119554 + - 0.4892654269726484 + - 5.18153606286193 + - 1.6004420815042866 + - 1.6279739549376542 + - 2.366165520382972 + - 3.565015897385238 + - 2.656918321734993 + - 1.1639850941705734 + - 3.066476944794981 + - 1.5207184312981508 + - !!python/tuple + - 1.4433653818682308 + - 2.7994184560950486 + - 3.586163628365269 + - 1.8150163013184735 + - 5.0518015614424305 + - 1.5547991714433766 + - 1.611141877216577 + - 2.329830194466826 + - 3.445534277234258 + - 2.603999610064769 + - 1.166225650820623 + - 2.9804971962805746 + - 1.560194272155115 + - !!python/tuple + - 1.1773428836505888 + - 2.558612545668414 + - 3.3643763747218385 + - 1.490054520626595 + - 4.747635463239683 + - 1.5193086566010783 + - 1.5592690289170397 + - 2.1593780347247664 + - 3.1356056663788383 + - 2.402453428283949 + - 1.2506724791566852 + - 2.696348352339366 + - 1.5656269012049686 + - !!python/tuple + - 1.0833560537890135 + - 1.2440047835788555 + - 2.069832466150009 + - 0.693621719879714 + - 3.1152173194865735 + - 1.1629857208438217 + - 1.4537040736324722 + - 1.5081569958080085 + - 1.537648317322523 + - 1.4981337461089295 + - 0.9570587547638412 + - 1.4606146477930306 + - 1.6924883980434768 + - !!python/tuple + - 1.1160968582938635 + - 1.427616622378563 + - 1.9871767639543814 + - 1.3576073922958263 + - 2.985733387600215 + - 1.2854216389830828 + - 1.4166341096318957 + - 1.5833602011314605 + - 1.611744878856338 + - 1.5059319631355326 + - 1.1523153512977649 + - 1.5435067501030162 + - 1.6332578389703782 + - !!python/tuple + - 1.1529693149640545 + - 1.609794890013592 + - 1.9175362526948156 + - 1.2486472437385336 + - 2.7689239705539053 + - 1.4906965538952945 + - 1.3478990115160703 + - 1.6903440607776803 + - 1.5934916054973371 + - 1.5411069443771361 + - 1.2019118167821015 + - 1.6626155254514334 + - 1.5163591882872856 + - !!python/tuple + - 1.1543413548485912 + - 1.6222653748858815 + - 1.8016527031139782 + - 1.3006334956086405 + - 2.632746441280264 + - 1.4037418905412908 + - 1.423792355902878 + - 1.6291475833917406 + - 1.7137991522067977 + - 1.5847453786583032 + - 1.2549567702469697 + - 1.6434846127782488 + - 1.4796351083885109 + - !!python/tuple + - 1.1540593811219395 + - 1.6282662994589103 + - 1.796688877040774 + - 1.2731964903881487 + - 2.525205786618326 + - 1.4444174851010745 + - 1.3737998292461773 + - 1.6432990225912116 + - 1.6618010173524727 + - 1.5829510360616086 + - 1.2019456702804854 + - 1.6989330419433344 + - 1.4693967969948953 + - !!python/tuple + - 1.1540810020528138 + - 1.6318912715087968 + - 1.8082919523250258 + - 1.2354853729215616 + - 2.4748776852539214 + - 1.4531022380771017 + - 1.4028450156952836 + - 1.6044635965374996 + - 1.6414980339700318 + - 1.5664216207223394 + - 1.2514458245241162 + - 1.6580831184931688 + - 1.453376990515857 + - !!python/tuple + - 1.154080044027408 + - 1.6335338257123684 + - 1.7954620593171646 + - 1.239614180265934 + - 2.4421198111131313 + - 1.4466435856162148 + - 1.398798347837921 + - 1.6125647777556225 + - 1.6165597756336283 + - 1.559426335817632 + - 1.2160975770712983 + - 1.6816717525926501 + - 1.4558281384653988 + - !!python/tuple + - 1.1540797857802647 + - 1.6349410581691293 + - 1.7834172228517864 + - 1.241435505150899 + - 2.4066293912747407 + - 1.4419965536430457 + - 1.3960882504507246 + - 1.6193863169821405 + - 1.5952496134494085 + - 1.553747291681946 + - 1.2007549774477435 + - 1.7023740100177174 + - 1.457602671680374 + - !!python/tuple + - 1.1540797752173664 + - 1.63536560340641 + - 1.7892515986399473 + - 1.2360905409571068 + - 2.3981442292582487 + - 1.4457901912354754 + - 1.395424813677216 + - 1.6130306546418804 + - 1.59549239473081 + - 1.5510667288639002 + - 1.218112843366464 + - 1.6836254021578838 + - 1.4535541090222677 + - !!python/tuple + - 1.1540797692111624 + - 1.6357124746895884 + - 1.7848031357678469 + - 1.2370710736716126 + - 2.390428912477586 + - 1.4439950101453316 + - 1.392724076190767 + - 1.6158443624393068 + - 1.5894935425723513 + - 1.5449452856599242 + - 1.2112549717281436 + - 1.692121525338743 + - 1.4538161261037799 + - !!python/tuple + - 1.154079766755999 + - 1.635911390595784 + - 1.782159533503162 + - 1.2375184631395375 + - 2.3855356713762457 + - 1.4430376665024702 + - 1.392789895793095 + - 1.6133547503061412 + - 1.5902030020553177 + - 1.5441783155434579 + - 1.219074730837236 + - 1.6860639225479905 + - 1.4534977304803844 + - !!python/tuple + - 1.1540797649054664 + - 1.6360944217639373 + - 1.7796726600740593 + - 1.2378773040555608 + - 2.380734141533073 + - 1.4421960254680808 + - 1.391567645149569 + - 1.6146769918000397 + - 1.5867032304852 + - 1.5434855734747281 + - 1.2142743631733723 + - 1.6894337338311207 + - 1.453680368187351 + - !!python/tuple + - 1.154079764690176 + - 1.6361204823572153 + - 1.7793106955097744 + - 1.2379217774714635 + - 2.3800047252041305 + - 1.4420816258225335 + - 1.3914043409181376 + - 1.6148644853129213 + - 1.5862094828887863 + - 1.5433887929003187 + - 1.2136876613234047 + - 1.6899177728057897 + - 1.4537052774661388 + - !!python/tuple + - 1.1540797645880345 + - 1.6361331819261506 + - 1.7791337454472849 + - 1.2379430445679638 + - 2.3796458447337274 + - 1.4420262443340242 + - 1.3914243997602933 + - 1.6146770633515986 + - 1.5862899234104595 + - 1.5433417596225933 + - 1.2142569953210596 + - 1.689458396104644 + - 1.4536815016920863 + - !!python/tuple + - 1.1540797644669456 + - 1.6361484350432263 + - 1.7789208840526152 + - 1.2379683535775483 + - 2.379212763037593 + - 1.4419599418325237 + - 1.391328734230922 + - 1.6147891496586377 + - 1.5859985693144527 + - 1.5432853449777557 + - 1.213906612329508 + - 1.6897475745457329 + - 1.4536963792915156 + - !!python/tuple + - 1.1540797644085583 + - 1.6361559072097627 + - 1.7788164112682232 + - 1.2379806141404366 + - 2.378999390063332 + - 1.4419275887652416 + - 1.3913412314921165 + - 1.6146774843524805 + - 1.5860475983775393 + - 1.5432577536261944 + - 1.2142445788922418 + - 1.6894737233261883 + - 1.4536822251967585 + - !!python/tuple + - 1.154079764339081 + - 1.6361648678696803 + - 1.7786910108587817 + - 1.2379952367081155 + - 2.378742790957759 + - 1.4418888654984066 + - 1.3912849948693151 + - 1.61474416534081 + - 1.5858755961408408 + - 1.5432246924231072 + - 1.2140362787107744 + - 1.689645693686558 + - 1.4536910711167306 + - !!python/tuple + - 1.154079764305256 + - 1.636169271361098 + - 1.7786293171877103 + - 1.2380023752674096 + - 2.3786162635044126 + - 1.4418698800883198 + - 1.3912926037198732 + - 1.6146778670637059 + - 1.585905090713454 + - 1.5432084610059342 + - 1.214236502319616 + - 1.6894830468003337 + - 1.4536826715522808 + - !!python/tuple + - 1.1540797642649139 + - 1.6361745474912044 + - 1.7785553570750954 + - 1.2380109007179025 + - 2.378464408524706 + - 1.4418471583606274 + - 1.391259476777974 + - 1.6147174238575672 + - 1.585803516673094 + - 1.5431890222638862 + - 1.214112988576584 + - 1.689585041713764 + - 1.4536879174342645 + - !!python/tuple + - 1.1540797642630758 + - 1.6361747892212206 + - 1.7785519662979234 + - 1.2380112897949045 + - 2.3784574371846343 + - 1.4418461187779383 + - 1.391257961875032 + - 1.6147192359645541 + - 1.5857988643417307 + - 1.5431881321719754 + - 1.214107354102931 + - 1.6895897159686384 + - 1.453688157473399 + - !!python/tuple + - 1.154079764262171 + - 1.6361749082402046 + - 1.7785502967532603 + - 1.2380114813279042 + - 2.3784540044366107 + - 1.4418456069578374 + - 1.3912581716386156 + - 1.6147174357334424 + - 1.5857996716652027 + - 1.543187693934885 + - 1.214112784446327 + - 1.6895852986740227 + - 1.4536879294541172 + - !!python/tuple + - 1.1540797642610783 + - 1.6361750519938987 + - 1.7785482802112067 + - 1.2380117126452357 + - 2.3784498581015243 + - 1.4418449887896634 + - 1.391257270734354 + - 1.6147185135885145 + - 1.585796904763406 + - 1.5431871646295117 + - 1.214109433055832 + - 1.6895880789401483 + - 1.453688072229968 + - !!python/tuple + - 1.1540797642605403 + - 1.6361751227765369 + - 1.7785472872716186 + - 1.2380118265310804 + - 2.3784478163827645 + - 1.4418446844222865 + - 1.3912573955478493 + - 1.6147174428311888 + - 1.585797385049935 + - 1.5431869040097967 + - 1.2141126628505061 + - 1.6895854515684303 + - 1.453687936607704 + - !!python/tuple + - 1.1540797642598906 + - 1.6361752082681102 + - 1.7785460879843122 + - 1.238011964075693 + - 2.378445350319585 + - 1.441844316812848 + - 1.3912568597682735 + - 1.6147180839183322 + - 1.5857957394712 + - 1.543186589234605 + - 1.2141106695221688 + - 1.6895871052106282 + - 1.4536880215275458 + - !!python/tuple + - 1.1540797642595706 + - 1.636175250364434 + - 1.7785454974450945 + - 1.2380120317988188 + - 2.378444135982633 + - 1.44184413580482 + - 1.3912569340206458 + - 1.6147174470647758 + - 1.5857960251660854 + - 1.543186434239732 + - 1.214112590464889 + - 1.6895855425256032 + - 1.4536879408639631 + - !!python/tuple + - 1.1540797642591842 + - 1.636175301208122 + - 1.7785447841916044 + - 1.2380121135918587 + - 2.3784426692901994 + - 1.4418439171868058 + - 1.3912566153795376 + - 1.6147178283605297 + - 1.5857950464771704 + - 1.5431862470387063 + - 1.2141114049090282 + - 1.6895865260509206 + - 1.453687991371097 + - !!python/tuple + - 1.1540797642591827 + - 1.6361753014137728 + - 1.7785447813066437 + - 1.2380121139226798 + - 2.3784426633576587 + - 1.4418439163025591 + - 1.3912566157423436 + - 1.6147178252492131 + - 1.585795047873021 + - 1.5431862462815265 + - 1.214111414293583 + - 1.6895865184164855 + - 1.4536879909770202 + - !!python/tuple + - 1.154079764259181 + - 1.6361753016621758 + - 1.7785447778219348 + - 1.2380121143222746 + - 2.3784426561918153 + - 1.4418439152344884 + - 1.3912566141856115 + - 1.6147178271120783 + - 1.58579504309153 + - 1.543186245366938 + - 1.2141114085016427 + - 1.6895865232216323 + - 1.453687991223776 + - !!python/tuple + - 1.15407976425918 + - 1.6361753017844929 + - 1.7785447761060158 + - 1.2380121145190406 + - 2.3784426526632543 + - 1.4418439147085556 + - 1.3912566144014018 + - 1.614717825261527 + - 1.5857950439217554 + - 1.543186244916582 + - 1.214111414083395 + - 1.689586518680817 + - 1.4536879909893865 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019322383 + - 1.7785447740333784 + - 1.2380121147567118 + - 2.3784426484011485 + - 1.441843914073288 + - 1.3912566134754876 + - 1.6147178263695234 + - 1.585795041077817 + - 1.5431862443726028 + - 1.2141114106384605 + - 1.6895865215388257 + - 1.4536879911361522 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019392717 + - 1.7785447739347109 + - 1.238012114768026 + - 2.3784426481982517 + - 1.4418439140430461 + - 1.3912566134314097 + - 1.6147178264222695 + - 1.585795040942432 + - 1.5431862443467068 + - 1.2141114104744652 + - 1.6895865216748807 + - 1.453687991143139 + - !!python/tuple + - 1.154079764259179 + - 1.636175301942735 + - 1.7785447738861258 + - 1.2380121147735974 + - 2.3784426480983427 + - 1.4418439140281547 + - 1.3912566134375197 + - 1.6147178263698723 + - 1.5857950409659394 + - 1.5431862443339552 + - 1.2141114106325093 + - 1.6895865215463102 + - 1.4536879911365024 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019469183 + - 1.7785447738274403 + - 1.238012114780327 + - 2.3784426479776637 + - 1.4418439140101675 + - 1.391256613411303 + - 1.6147178264012445 + - 1.585795040885415 + - 1.543186244318553 + - 1.214111410534968 + - 1.689586521627233 + - 1.453687991140658 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019489782 + - 1.7785447737985427 + - 1.2380121147836407 + - 2.3784426479182397 + - 1.4418439140013104 + - 1.3912566134149371 + - 1.6147178263700797 + - 1.5857950408993966 + - 1.5431862443109685 + - 1.2141114106289694 + - 1.6895865215507617 + - 1.4536879911367107 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019514664 + - 1.7785447737636377 + - 1.2380121147876433 + - 2.378442647846462 + - 1.4418439139906118 + - 1.391256613399344 + - 1.6147178263887392 + - 1.5857950408515022 + - 1.5431862443018074 + - 1.2141114105709538 + - 1.689586521598893 + - 1.4536879911391822 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019517116 + - 1.7785447737601985 + - 1.2380121147880376 + - 2.37844264783939 + - 1.4418439139895578 + - 1.3912566133997766 + - 1.6147178263850301 + - 1.5857950408531662 + - 1.5431862443009048 + - 1.2141114105821411 + - 1.689586521589792 + - 1.4536879911387124 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019520078 + - 1.7785447737560445 + - 1.238012114788514 + - 2.3784426478308474 + - 1.4418439139882846 + - 1.3912566133979207 + - 1.6147178263872508 + - 1.5857950408474664 + - 1.5431862442998145 + - 1.2141114105752366 + - 1.6895865215955201 + - 1.4536879911390066 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019521537 + - 1.778544773753999 + - 1.2380121147887484 + - 2.378442647826641 + - 1.4418439139876575 + - 1.391256613398178 + - 1.6147178263850448 + - 1.585795040848456 + - 1.5431862442992776 + - 1.2141114105818904 + - 1.6895865215901071 + - 1.4536879911387273 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019523297 + - 1.7785447737515283 + - 1.2380121147890317 + - 2.37844264782156 + - 1.4418439139869004 + - 1.3912566133970743 + - 1.6147178263863655 + - 1.5857950408450658 + - 1.5431862442986293 + - 1.214111410577784 + - 1.6895865215935142 + - 1.4536879911389022 + - !!python/tuple + - 1.154079764259179 + - 1.6361753019523297 + - 1.7785447737515283 + - 1.2380121147890317 + - 2.37844264782156 + - 1.4418439139869004 + - 1.3912566133970743 + - 1.6147178263863655 + - 1.5857950408450658 + - 1.5431862442986293 + - 1.214111410577784 + - 1.6895865215935142 + - 1.4536879911389022 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.278433876080714 + - 7.814072349147573 + - 7.803712328127819 + - 7.434473980410486 + - 7.940897684334956 + - 7.601906046208943 + - 7.565122082718654 + - 7.6308235835076434 + - 7.790552427946791 + - 7.707113587536921 + - 7.498508619936243 + - 7.745648212712567 + - 7.570906480834929 + - !!python/tuple + - 5.473596676042201 + - 7.348865263111042 + - 7.31258636891033 + - 6.0197939736505 + - 7.793008499769522 + - 6.605960802031024 + - 6.511014253493248 + - 6.673315070121012 + - 7.283310990432365 + - 6.974330223263632 + - 6.260980224669609 + - 7.0854219815588575 + - 6.487637631318265 + - !!python/tuple + - 0.9579660681973365 + - 6.1777939531118715 + - 6.076365175544851 + - 2.4834264011293463 + - 7.267567227400674 + - 4.103464480452848 + - 3.8631636854057856 + - 4.4127825113581505 + - 5.885366984506251 + - 5.224720855640494 + - 3.057177577429493 + - 5.51232927815182 + - 3.818891777784442 + - !!python/tuple + - 1.2338667016656575 + - 5.242956098466928 + - 5.145383653390033 + - 0.5338992880669908 + - 6.780279537074573 + - 2.4453683205613834 + - 2.323686003467593 + - 2.9734172803652736 + - 4.955924021382249 + - 4.144891998406882 + - 1.064137456145246 + - 4.3105172384115225 + - 2.338529889990114 + - !!python/tuple + - 1.069232918872701 + - 5.104940942134561 + - 5.0081371332906786 + - 1.8861360797214461 + - 6.608818415679786 + - 2.268303440591264 + - 2.209066441512953 + - 2.8059076575026096 + - 4.81605796890311 + - 4.033341349275513 + - 1.1239956311152628 + - 4.122341734208448 + - 2.2076436208606336 + - !!python/tuple + - 0.9143610617946292 + - 4.754371827062921 + - 4.659662258870206 + - 1.3410670495654473 + - 6.202998676605754 + - 1.8485695807832432 + - 1.9399959767477106 + - 2.377063883552448 + - 4.461250354109443 + - 3.752013948642565 + - 1.1740771254553721 + - 3.633107930849703 + - 1.8852284004223585 + - !!python/tuple + - 1.784437420737825 + - 3.412385709737584 + - 3.289708633599341 + - 0.7398619345944316 + - 4.461504719773238 + - 0.9612929768294922 + - 1.1059519682537506 + - 0.9690284961328122 + - 2.930600774870488 + - 2.6684755285470927 + - 1.0151807146943734 + - 1.8067593700938693 + - 1.023706880511218 + - !!python/tuple + - 1.3381031125430187 + - 3.265707400379234 + - 3.0778509871557853 + - 1.5243748134609074 + - 4.233325400729481 + - 1.3164631391396093 + - 1.3024405904600134 + - 1.4454636964767766 + - 2.7613442727218893 + - 2.5569624418397647 + - 1.1128529415027355 + - 1.8388848917237102 + - 1.4173205297419789 + - !!python/tuple + - 0.5413835627892813 + - 2.8785210288980076 + - 2.6155448583163823 + - 1.0184748930131673 + - 3.715614699359231 + - 1.4328272108511222 + - 1.5143984161089867 + - 1.4830168406905986 + - 2.421768790234551 + - 2.281025206068856 + - 1.1651268233715693 + - 1.698896345602553 + - 1.4737688577609465 + - !!python/tuple + - 1.2433151509707834 + - 2.818952516775209 + - 2.5575448465141206 + - 1.0882241821760192 + - 3.63333529501667 + - 1.4078546395216462 + - 1.4987997040969336 + - 1.486714435136998 + - 2.373021432514241 + - 2.2427209916944966 + - 1.1459570684840534 + - 1.7065794727872854 + - 1.47319393718532 + - !!python/tuple + - 1.0354555582550906 + - 2.7118551159815723 + - 2.449419797587971 + - 1.1552164324732808 + - 3.4773179056265517 + - 1.369680078613888 + - 1.4829730472748848 + - 1.4866029016467284 + - 2.283443144172245 + - 2.17924952156488 + - 1.1230611875787926 + - 1.7083581792285187 + - 1.4722916499455316 + - !!python/tuple + - 0.775948631516026 + - 1.9972856565282258 + - 1.89008174926565 + - 1.2456765780611398 + - 2.4493424596394684 + - 1.2617627107208176 + - 1.2563217396276853 + - 1.4861055790118523 + - 1.8317763849932813 + - 1.7418865501672802 + - 1.119964528490856 + - 1.717678938415697 + - 1.2929277038955278 + - !!python/tuple + - 1.087632136100647 + - 1.982142063159657 + - 1.8822541567805509 + - 1.1573800483389527 + - 2.4658220167395197 + - 1.2845346395461803 + - 1.2798023002631007 + - 1.4453996838143108 + - 1.8104536039644867 + - 1.7097618378503763 + - 1.153615281617234 + - 1.670607625952286 + - 1.2938263574507307 + - !!python/tuple + - 0.9886380765473213 + - 1.969134978541095 + - 1.8757029958551006 + - 1.1297696117925526 + - 2.460670803068574 + - 1.2959811041990537 + - 1.2914678887514341 + - 1.4289003666812667 + - 1.7929595198273307 + - 1.6843329667601454 + - 1.1584808669466795 + - 1.6412011040866057 + - 1.3077801507536182 + - !!python/tuple + - 0.9536858324343048 + - 1.9313152945672118 + - 1.857113470443152 + - 1.0989936065447383 + - 2.444617668977088 + - 1.3164777534427896 + - 1.3121613524862454 + - 1.3922968216529787 + - 1.7444962524089078 + - 1.616732860561541 + - 1.1642537902791195 + - 1.5645567093760713 + - 1.3332873340082976 + - !!python/tuple + - 0.9863725705713837 + - 1.923905604776508 + - 1.8538879850454413 + - 1.114339803770279 + - 2.440200926417723 + - 1.3128940643436484 + - 1.2994476001104562 + - 1.3950614677793858 + - 1.7488973236417886 + - 1.5992497501925333 + - 1.1697652239434262 + - 1.5732732141359065 + - 1.3130201802537234 + - !!python/tuple + - 0.9758178612691489 + - 1.9171279078196046 + - 1.8510082093427298 + - 1.116498672891286 + - 2.4357552749517155 + - 1.311009143618156 + - 1.3027497380080961 + - 1.3963771621249719 + - 1.7403096324404232 + - 1.5978570798053833 + - 1.1627565596694864 + - 1.5646404541369423 + - 1.3199310506287452 + - !!python/tuple + - 0.9775905084176145 + - 1.9146139904198132 + - 1.8499673599443316 + - 1.1165650162781813 + - 2.4339179883614923 + - 1.3106438493426291 + - 1.298902608997551 + - 1.396867639268473 + - 1.7429618911406732 + - 1.591836036989754 + - 1.1660541605979529 + - 1.568960242481626 + - 1.31321596096427 + - !!python/tuple + - 0.9782124861573821 + - 1.9124282786100895 + - 1.849071449415298 + - 1.1166014061147052 + - 2.4322459477112703 + - 1.3103876444366547 + - 1.3004625649156218 + - 1.3970642382406733 + - 1.7398861377292867 + - 1.5922530774189363 + - 1.1643344723562041 + - 1.5658633424267476 + - 1.3161428529027879 + - !!python/tuple + - 0.9783928250426375 + - 1.9109858396476849 + - 1.8484856881153695 + - 1.116617057368185 + - 2.431093563977618 + - 1.3102494160805238 + - 1.2982602392650748 + - 1.3972971301320454 + - 1.737913598424023 + - 1.5902474498585073 + - 1.1635356400576689 + - 1.568673950569537 + - 1.3177268941005822 + - !!python/tuple + - 0.9785403220585338 + - 1.9090464294063183 + - 1.84770315406583 + - 1.116632975231624 + - 2.4294958588046436 + - 1.3100872834878554 + - 1.300022124673147 + - 1.3974084422983948 + - 1.7353142996004127 + - 1.5908984120122651 + - 1.162684944662795 + - 1.565549996384441 + - 1.319590880444154 + - !!python/tuple + - 0.9785592915015666 + - 1.9084623695443694 + - 1.8474696707517622 + - 1.1166360605135792 + - 2.428992672031915 + - 1.3100475742497941 + - 1.299029571873181 + - 1.3974937956613915 + - 1.7363356493128232 + - 1.5893039241433513 + - 1.1637423204997561 + - 1.5668796876621685 + - 1.3174826462295335 + - !!python/tuple + - 0.9785744147634279 + - 1.9078964519023 + - 1.8472440807296608 + - 1.1166387204281178 + - 2.428498188211231 + - 1.3100113205185682 + - 1.2995395749389964 + - 1.3975167421789947 + - 1.7355428590404434 + - 1.5895601478757253 + - 1.163440149584253 + - 1.5659461838135529 + - 1.3181111554341067 + - !!python/tuple + - 0.9785774214694383 + - 1.907759845259116 + - 1.8471897784587132 + - 1.1166392920562376 + - 2.428377134557408 + - 1.3100030722602884 + - 1.2993045940501338 + - 1.3975359904917724 + - 1.7353532145670432 + - 1.5893593526908643 + - 1.163374048252276 + - 1.566269796821917 + - 1.3182543771706148 + - !!python/tuple + - 0.9785776622968528 + - 1.9077484135955363 + - 1.8471852373675666 + - 1.1166393386166262 + - 2.428366969529432 + - 1.31000239165989 + - 1.2993147630109965 + - 1.3975364098869876 + - 1.7353373793953664 + - 1.5893646527002636 + - 1.163368642789816 + - 1.5662509080874196 + - 1.3182661996083598 + - !!python/tuple + - 0.9785777490239991 + - 1.9077442819817267 + - 1.8471835962269485 + - 1.1166393554068486 + - 2.428363294641555 + - 1.3100021459659796 + - 1.29931843380534 + - 1.3975365613331412 + - 1.735345056983897 + - 1.5893611563463692 + - 1.1633759870407656 + - 1.5662440844353462 + - 1.3182511501213199 + - !!python/tuple + - 0.9785779281160666 + - 1.9077357390938088 + - 1.847180202930122 + - 1.1166393900957765 + - 2.428355695328154 + - 1.3100016381623756 + - 1.2993260205363255 + - 1.397536874378689 + - 1.7353332188663873 + - 1.5893651187601534 + - 1.1633719408789485 + - 1.566229977557054 + - 1.3182599958629735 + - !!python/tuple + - 0.9785779926625509 + - 1.9077326518723112 + - 1.8471789767155935 + - 1.116639402610709 + - 2.4283529485025612 + - 1.3100014548131897 + - 1.2993287597374379 + - 1.39753698743371 + - 1.7353389601080336 + - 1.5893625044725157 + - 1.1633774298530986 + - 1.566224881348027 + - 1.3182487464561294 + - !!python/tuple + - 0.9785781258117727 + - 1.9077262772390635 + - 1.8471764448118302 + - 1.1166394284365138 + - 2.4283472762919325 + - 1.3100010763452123 + - 1.2993344139095975 + - 1.3975372208202557 + - 1.7353301240969792 + - 1.5893654621503075 + - 1.1633744069314256 + - 1.5662143597524696 + - 1.3182553531149224 + - !!python/tuple + - 0.9785781738288997 + - 1.907723973763912 + - 1.8471755299368902 + - 1.1166394377570465 + - 2.428345226307359 + - 1.3100009396749872 + - 1.2993364556634315 + - 1.397537305113849 + - 1.7353344102733947 + - 1.589363510574366 + - 1.1633785031032085 + - 1.5662105587306476 + - 1.3182469572664206 + - !!python/tuple + - 0.9785782728035114 + - 1.9077192223193995 + - 1.847173642819667 + - 1.1166394569741207 + - 2.4283409974991237 + - 1.3100006578278767 + - 1.2993406662179432 + - 1.3975374789583557 + - 1.7353278228036957 + - 1.589365715664017 + - 1.1633762478542624 + - 1.5662027189682932 + - 1.3182518850140337 + - !!python/tuple + - 0.9785783085124857 + - 1.907717505485231 + - 1.8471729609658398 + - 1.116639463911354 + - 2.42833946932511 + - 1.3100005560379353 + - 1.2993421868453356 + - 1.397537541750802 + - 1.735331018754533 + - 1.5893642605683926 + - 1.1633793012002116 + - 1.5661998867685036 + - 1.318245626110659 + - !!python/tuple + - 0.978578382074481 + - 1.9077139668245238 + - 1.8471715555716854 + - 1.116639478205264 + - 2.4283363193855165 + - 1.3100003462700227 + - 1.2993453205221153 + - 1.3975376711589202 + - 1.7353261119309882 + - 1.5893659031152245 + - 1.163377620449222 + - 1.566194049563572 + - 1.3182492979385492 + - !!python/tuple + - 0.9785784086238235 + - 1.9077126882599753 + - 1.8471710477932908 + - 1.116639483366267 + - 2.428335181169226 + - 1.3100002705056009 + - 1.2993464523351144 + - 1.397537717903242 + - 1.735328492782812 + - 1.5893648191734602 + - 1.1633798945504288 + - 1.5661919408003717 + - 1.318244636084189 + - !!python/tuple + - 0.9785784632930565 + - 1.9077100544375039 + - 1.8471700017846042 + - 1.1166394939951916 + - 2.428332836386148 + - 1.3100001144525522 + - 1.2993487835351178 + - 1.3975378141864714 + - 1.7353248402082917 + - 1.5893660418839297 + - 1.16337864293501 + - 1.5661875970019423 + - 1.318247370056529 + - !!python/tuple + - 0.97857848302877 + - 1.9077091028336146 + - 1.847169623865106 + - 1.116639497833459 + - 2.4283319891562107 + - 1.3100000580855757 + - 1.2993496255654138 + - 1.3975378489668024 + - 1.7353266126363411 + - 1.5893652349668723 + - 1.1633803356065566 + - 1.566186027744974 + - 1.3182438999606592 + - !!python/tuple + - 0.9785785236546839 + - 1.907707143373129 + - 1.8471688456896287 + - 1.1166395057354164 + - 2.428330244571581 + - 1.3099999420308877 + - 1.2993513592261494 + - 1.3975379205782923 + - 1.7353238950264298 + - 1.5893661447063516 + - 1.1633794041030179 + - 1.5661827965884456 + - 1.3182459345010846 + - !!python/tuple + - 0.9785785383234888 + - 1.9077064354341415 + - 1.847168564543169 + - 1.1166395085892422 + - 2.428329614234472 + - 1.3099999001095832 + - 1.299351985454916 + - 1.3975379464471684 + - 1.735325213843754 + - 1.5893655443141723 + - 1.1633806634173463 + - 1.5661816292854354 + - 1.3182433527301396 + - !!python/tuple + - 0.9785785685120097 + - 1.9077049781654147 + - 1.847167985814628 + - 1.1166395144629337 + - 2.428328316683393 + - 1.3099998138222415 + - 1.299353274428928 + - 1.397537999694529 + - 1.73532319260068 + - 1.589366220946075 + - 1.1633799704555607 + - 1.5661792264986212 + - 1.3182448661532 + - !!python/tuple + - 0.9785785692010088 + - 1.9077049448906047 + - 1.8471679726002208 + - 1.1166395145970136 + - 2.428328287054433 + - 1.3099998118522782 + - 1.299353303856393 + - 1.397538000910228 + - 1.7353231464493442 + - 1.5893662363952665 + - 1.1633799546365504 + - 1.56617917163732 + - 1.3182449007052008 + - !!python/tuple + - 0.9785785694499097 + - 1.9077049328699534 + - 1.847167967826467 + - 1.1166395146454502 + - 2.4283282763508502 + - 1.309999811140624 + - 1.2993533144871385 + - 1.3975380013494028 + - 1.735323168845581 + - 1.5893662261995432 + - 1.1633799760203112 + - 1.5661791518184929 + - 1.3182448568644052 + - !!python/tuple + - 0.9785785699623358 + - 1.9077049081222819 + - 1.84716795799844 + - 1.1166395147451693 + - 2.428328254314703 + - 1.3099998096754981 + - 1.2993533363732959 + - 1.3975380022535586 + - 1.7353231345211366 + - 1.5893662376896764 + - 1.163379964255089 + - 1.5661791110162455 + - 1.3182448825620607 + - !!python/tuple + - 0.9785785701474502 + - 1.9077048991820944 + - 1.8471679544480293 + - 1.116639514781193 + - 2.428328246354059 + - 1.3099998091462175 + - 1.29935334427973 + - 1.3975380025801876 + - 1.7353231511780545 + - 1.5893662301067384 + - 1.1633799801589655 + - 1.5661790962762978 + - 1.3182448499560613 + - !!python/tuple + - 0.9785785705285542 + - 1.9077048807764407 + - 1.8471679471386049 + - 1.1166395148553567 + - 2.428328229965041 + - 1.3099998080565594 + - 1.2993533605571237 + - 1.3975380032526363 + - 1.7353231256498203 + - 1.5893662386523348 + - 1.1633799714087536 + - 1.566179065930371 + - 1.3182448690682997 + - !!python/tuple + - 0.9785785706662287 + - 1.907704874127332 + - 1.8471679444980493 + - 1.1166395148821486 + - 2.428328224044446 + - 1.3099998076629171 + - 1.2993533664373793 + - 1.3975380034955605 + - 1.7353231380381333 + - 1.5893662330126486 + - 1.1633799832369902 + - 1.5661790549678034 + - 1.3182448448181365 + - !!python/tuple + - 0.978578570949665 + - 1.907704860438488 + - 1.847167939061809 + - 1.1166395149373063 + - 2.428328211855428 + - 1.3099998068525072 + - 1.2993533785433393 + - 1.39753800399568 + - 1.7353231190519982 + - 1.5893662393682726 + - 1.1633799767291746 + - 1.566179032398638 + - 1.3182448590325169 + - !!python/tuple + - 0.978578571052057 + - 1.9077048554933447 + - 1.8471679370979481 + - 1.1166395149572321 + - 2.4283282074521004 + - 1.3099998065597442 + - 1.299353382916654 + - 1.3975380041763497 + - 1.7353231282655728 + - 1.5893662351738629 + - 1.1633799855261953 + - 1.5661790242454514 + - 1.318244840996926 + - !!python/tuple + - 0.9785785712628555 + - 1.9077048453125596 + - 1.847167933054861 + - 1.1166395149982542 + - 2.428328198386774 + - 1.3099998059570204 + - 1.2993533919201852 + - 1.3975380045483023 + - 1.735323114145034 + - 1.589366239900725 + - 1.163379980686137 + - 1.5661790074601294 + - 1.3182448515685832 + - !!python/tuple + - 0.9785785713390069 + - 1.9077048416347153 + - 1.8471679315942817 + - 1.1166395150130737 + - 2.4283281951118925 + - 1.3099998057392845 + - 1.2993533951727387 + - 1.3975380046826715 + - 1.7353231209974387 + - 1.5893662367812202 + - 1.1633799872287338 + - 1.5661790013963754 + - 1.3182448381549936 + - !!python/tuple + - 0.9785785714957829 + - 1.9077048340629872 + - 1.8471679285873275 + - 1.1166395150435828 + - 2.4283281883697594 + - 1.309999805291023 + - 1.299353401868901 + - 1.3975380049593027 + - 1.7353231104956046 + - 1.5893662402967181 + - 1.163379983629045 + - 1.5661789889126796 + - 1.3182448460174323 + - !!python/tuple + - 0.9785785714995288 + - 1.9077048338820715 + - 1.8471679285154805 + - 1.1166395150443118 + - 2.4283281882086656 + - 1.3099998052803123 + - 1.2993534020288962 + - 1.3975380049659123 + - 1.7353231108326794 + - 1.5893662401432673 + - 1.16337998395088 + - 1.5661789886143993 + - 1.318244845357608 + - !!python/tuple + - 0.9785785715059453 + - 1.9077048335721756 + - 1.8471679283924118 + - 1.1166395150455606 + - 2.428328187932723 + - 1.309999805261966 + - 1.2993534023029567 + - 1.3975380049772343 + - 1.7353231104028601 + - 1.5893662402871498 + - 1.1633799838035521 + - 1.5661789881034662 + - 1.318244845679402 + - !!python/tuple + - 0.9785785715060706 + - 1.9077048335661229 + - 1.8471679283900082 + - 1.116639515045585 + - 2.4283281879273337 + - 1.3099998052616075 + - 1.2993534023083095 + - 1.3975380049774555 + - 1.7353231103944653 + - 1.58936624028996 + - 1.1633799838006746 + - 1.566178988093487 + - 1.318244845685687 + - !!python/tuple + - 0.9785785715061159 + - 1.9077048335639364 + - 1.8471679283891398 + - 1.1166395150455939 + - 2.428328187925387 + - 1.309999805261478 + - 1.2993534023102433 + - 1.3975380049775354 + - 1.7353231103985391 + - 1.5893662402881055 + - 1.1633799838045642 + - 1.5661789880898822 + - 1.3182448456777125 + - !!python/tuple + - 0.9785785715062092 + - 1.9077048335594349 + - 1.847167928387352 + - 1.116639515045612 + - 2.4283281879213785 + - 1.3099998052612116 + - 1.2993534023142241 + - 1.3975380049777 + - 1.7353231103922957 + - 1.5893662402901954 + - 1.1633799838024241 + - 1.5661789880824606 + - 1.3182448456823868 + - !!python/tuple + - 0.9785785715062092 + - 1.9077048335594349 + - 1.847167928387352 + - 1.116639515045612 + - 2.4283281879213785 + - 1.3099998052612116 + - 1.2993534023142241 + - 1.3975380049777 + - 1.7353231103922957 + - 1.5893662402901954 + - 1.1633799838024241 + - 1.5661789880824606 + - 1.3182448456823868 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.34015871257699 + - 7.806612623991885 + - 7.795020141804158 + - 7.442392660147448 + - 7.972954402216084 + - 7.699119946238023 + - 7.490701476050389 + - 7.773549865104796 + - 7.664087336257414 + - 7.654759812128901 + - 7.57349333746546 + - 7.593732143374502 + - 7.52642719599411 + - !!python/tuple + - 5.690746361311605 + - 7.323058836491533 + - 7.2824834658 + - 6.048440440496719 + - 7.905322164819014 + - 6.946834531826614 + - 6.217475598357966 + - 7.207335445764518 + - 6.824228184021516 + - 6.791584583466216 + - 6.507187755378862 + - 6.57801261159819 + - 6.342487111080563 + - !!python/tuple + - 1.5783875295199108 + - 5.677448287963515 + - 5.970843957573546 + - 2.8048287841790827 + - 7.567469136553703 + - 4.747885397768763 + - 3.163337014747445 + - 5.758581123612179 + - 4.677402976658701 + - 4.889458437363586 + - 3.587458137894123 + - 3.983510595187936 + - 3.5834296786511906 + - !!python/tuple + - 0.7765613623671346 + - 4.922930455550793 + - 5.415125754507746 + - 2.053876808637155 + - 7.242896258575686 + - 3.7273965915547436 + - 2.4958698070644387 + - 5.1291348626090585 + - 4.15277442925024 + - 4.197427230989557 + - 2.557386772691515 + - 3.0428431597525534 + - 2.596587557425176 + - !!python/tuple + - 2.0706479871112093 + - 4.295821488987876 + - 4.950904927809253 + - 1.6293563933724808 + - 6.9340035557263295 + - 2.9008921967890933 + - 2.022209029751971 + - 4.6175349250034365 + - 3.7248532853496488 + - 3.6309691231083105 + - 1.745099678119508 + - 2.3419795192076434 + - 1.9130973749518057 + - !!python/tuple + - 0.884451726958658 + - 3.843185378908113 + - 4.428998671128883 + - 1.3762456131848404 + - 6.450296583272769 + - 2.1991288235236355 + - 1.6782532803561938 + - 4.012692074200882 + - 3.2654568791413294 + - 3.03725644653461 + - 1.249763205223338 + - 1.6444571145455933 + - 1.3894695304282803 + - !!python/tuple + - 1.510487587289016 + - 3.434166533951256 + - 3.9249353493054273 + - 1.5044626634910856 + - 5.8626613225321975 + - 1.705938852335655 + - 1.5470495364275656 + - 3.658384140405697 + - 2.937433900832675 + - 2.560581064344626 + - 1.140062894813142 + - 1.5318011244868968 + - 1.4149964338791239 + - !!python/tuple + - 0.9978714906049798 + - 3.2512283775499498 + - 3.6798900356408466 + - 1.3033180508599345 + - 5.479595303265863 + - 1.6718581279294924 + - 1.5403264632870173 + - 3.262120167622615 + - 2.703455835938679 + - 2.334413221595552 + - 1.312182079128943 + - 1.3630588883543506 + - 1.3785899343520476 + - !!python/tuple + - 1.3176695394509503 + - 2.661145743369118 + - 3.017017755892584 + - 1.537228270748565 + - 4.5582516708606216 + - 1.4277580912244596 + - 1.3095007129982124 + - 2.7295290431917336 + - 2.2436295567749664 + - 1.8414821697321335 + - 0.986918018992229 + - 1.5035186323238676 + - 1.4401790686709979 + - !!python/tuple + - 1.0251394750931146 + - 2.563019671822268 + - 2.859242406606922 + - 1.3119173743872206 + - 4.322403372442679 + - 1.5268117113109463 + - 1.377041016907211 + - 2.4808010234451627 + - 2.1031102771417296 + - 1.7663645965340296 + - 1.389420000744322 + - 1.3435329191939789 + - 1.351373067312975 + - !!python/tuple + - 1.1231144345065371 + - 2.2405299659471694 + - 2.3678934102043225 + - 1.2715562192069623 + - 3.566108709515367 + - 1.5883855330386571 + - 1.2695133692936704 + - 2.071322944941984 + - 1.7087465218931324 + - 1.602771801041632 + - 0.9246797124453415 + - 1.4265567001317336 + - 1.3625865676873496 + - !!python/tuple + - 1.0382872237072134 + - 2.134495037999802 + - 2.2674120623201826 + - 1.2587517252466243 + - 3.457965159800493 + - 1.5327278323805023 + - 1.3023563559052977 + - 1.9523000933926347 + - 1.7304951769788688 + - 1.5795091322784798 + - 1.3750256708583275 + - 1.3378458914901263 + - 1.3048781429661125 + - !!python/tuple + - 1.0693703162197057 + - 1.96421815194616 + - 2.092528001927263 + - 1.2347594441276335 + - 3.1356386625723527 + - 1.5208960961830869 + - 1.2572875873247715 + - 1.8216182392294877 + - 1.6408375848483319 + - 1.5433747275399288 + - 1.1209506393065978 + - 1.3650663336923061 + - 1.3183932597413324 + - !!python/tuple + - 1.0267468535668358 + - 1.8965305749974484 + - 2.014734290325935 + - 1.1855384690058421 + - 2.9852523843334855 + - 1.5208527269812118 + - 1.2783263034409669 + - 1.7534477560852557 + - 1.6250650610347295 + - 1.5416648525772012 + - 1.323815762167845 + - 1.3232982902136705 + - 1.2763574552464163 + - !!python/tuple + - 1.0681959050229246 + - 1.8560075335976562 + - 1.9642174136974409 + - 1.2182872271581688 + - 2.8487121361382557 + - 1.5208403070441312 + - 1.2353138088633169 + - 1.7638839536805406 + - 1.5954753998138063 + - 1.5411317770925004 + - 1.2165919826394689 + - 1.3471609041917696 + - 1.3185754928366946 + - !!python/tuple + - 1.0383753177927724 + - 1.7355822979897488 + - 1.9087043058970137 + - 1.180497816063821 + - 2.7347044696683716 + - 1.4953631264146316 + - 1.246045137095191 + - 1.76035953442055 + - 1.5885716242591243 + - 1.5407992314195234 + - 1.27953857990435 + - 1.319342184178004 + - 1.2709675289669828 + - !!python/tuple + - 1.058960661552925 + - 1.754843813751601 + - 1.8864330667914297 + - 1.2048575372480272 + - 2.6240858058742647 + - 1.5129309998473435 + - 1.2405548388108099 + - 1.759320712392908 + - 1.5875993364970142 + - 1.5407724236330522 + - 1.2486156664084611 + - 1.3268886634776436 + - 1.28827098980796 + - !!python/tuple + - 1.0491868128180946 + - 1.6249358584510885 + - 1.8460435188690432 + - 1.178193148797368 + - 2.4663225059702736 + - 1.4764159654738624 + - 1.2440706629909517 + - 1.7576897534250624 + - 1.5864951991416103 + - 1.5407461508203768 + - 1.2633257885190536 + - 1.3264432993939226 + - 1.2820750693619187 + - !!python/tuple + - 1.0652164267191646 + - 1.6417723275402711 + - 1.8461843543047585 + - 1.2055532908515798 + - 2.4325266778567025 + - 1.4889796894105527 + - 1.2410361953926132 + - 1.7578098630135153 + - 1.5867475862595681 + - 1.5407535832644466 + - 1.2512073584646668 + - 1.3267305441370096 + - 1.2866917894612786 + - !!python/tuple + - 1.0478764148607822 + - 1.6503957642261753 + - 1.8462821654376567 + - 1.1940271683290125 + - 2.4011192265655334 + - 1.492905312841013 + - 1.241769506943568 + - 1.7578854609871988 + - 1.5868632469300592 + - 1.5407565469592233 + - 1.253570268238922 + - 1.326730089768693 + - 1.286164036871944 + - !!python/tuple + - 1.0669570055360453 + - 1.653747517648508 + - 1.8463354297039265 + - 1.1993100207260603 + - 2.3774135698740446 + - 1.4937046583189881 + - 1.2415319963692537 + - 1.7579220820474626 + - 1.5869010028509634 + - 1.5407573508597865 + - 1.252881857519174 + - 1.326730134428443 + - 1.2862682166154746 + - !!python/tuple + - 1.04955045103805 + - 1.655159150141828 + - 1.8463650189942267 + - 1.1974518243994587 + - 2.3599112066224257 + - 1.493907216785187 + - 1.2415845061753827 + - 1.7579404543978365 + - 1.5869146078375862 + - 1.5407576007718295 + - 1.2530129613420482 + - 1.3267301335418658 + - 1.286256855880304 + - !!python/tuple + - 1.0643575896641502 + - 1.655949205239101 + - 1.8463857280555305 + - 1.1979269963252115 + - 2.3443485831645594 + - 1.4939842810283586 + - 1.2415780361695112 + - 1.757952264983008 + - 1.5869213163992861 + - 1.540757710897959 + - 1.2530009974338254 + - 1.3267301334618486 + - 1.2862569028570467 + - !!python/tuple + - 1.0518885950033738 + - 1.6563127554651302 + - 1.8463979048070622 + - 1.197788477869084 + - 2.332545010169545 + - 1.4940070045147549 + - 1.2415791212029865 + - 1.7579585909391837 + - 1.5869239872293124 + - 1.5407577494385465 + - 1.2530026516507455 + - 1.3267301334595885 + - 1.28625690011172 + - !!python/tuple + - 1.062211972370739 + - 1.656529197528565 + - 1.8464068563888354 + - 1.1978202759878203 + - 2.3216961375764025 + - 1.494016400493444 + - 1.241579018943128 + - 1.757962877749006 + - 1.5869253940982364 + - 1.5407577677028916 + - 1.2530025491753565 + - 1.3267301334593158 + - 1.2862569000412316 + - !!python/tuple + - 1.0535777702776261 + - 1.6566260307995744 + - 1.8464119829263077 + - 1.1978109308155933 + - 2.313715935588084 + - 1.4940190673670242 + - 1.2415790365524404 + - 1.7579651114635173 + - 1.5869259364983697 + - 1.5407577738774272 + - 1.2530025638491447 + - 1.3267301334593096 + - 1.2862569000457773 + - !!python/tuple + - 1.0606310934805856 + - 1.6566855359840278 + - 1.8464158510914026 + - 1.1978129376571045 + - 2.306258426209194 + - 1.4940202179446096 + - 1.241579035167132 + - 1.75796666788426 + - 1.5869262322085953 + - 1.5407577769158387 + - 1.2530025631708934 + - 1.3267301334593096 + - 1.2862569000459676 + - !!python/tuple + - 1.0547532928338301 + - 1.6567117097778756 + - 1.8464180325944894 + - 1.1978123445247733 + - 2.300874842133181 + - 1.4940205371756108 + - 1.2415790354093932 + - 1.7579674659409694 + - 1.5869263440824193 + - 1.5407577779222683 + - 1.253002563269991 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0595202042161953 + - 1.6567280813217402 + - 1.8464197031754594 + - 1.1978124667914167 + - 2.29579907480409 + - 1.494020678215307 + - 1.2415790353925116 + - 1.7579680308715635 + - 1.586926406269941 + - 1.540757778428127 + - 1.253002563266309 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0555555557738194 + - 1.6567352109118085 + - 1.8464206369807221 + - 1.1978124305296578 + - 2.2921766583267758 + - 1.4940207168294133 + - 1.2415790353954907 + - 1.7579683178526262 + - 1.5869264295395598 + - 1.5407577785937017 + - 1.2530025632668542 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0587583220076162 + - 1.6567397149743088 + - 1.8464213580927977 + - 1.197812437825525 + - 2.2887456430462962 + - 1.4940207341187468 + - 1.2415790353952987 + - 1.7579685228226996 + - 1.5869264426166902 + - 1.5407577786779219 + - 1.2530025632668358 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0560976209988744 + - 1.6567416652468316 + - 1.8464217591378569 + - 1.1978124356575812 + - 2.2863140214755022 + - 1.4940207388164402 + - 1.2415790353953329 + - 1.7579686263950771 + - 1.5869264474794027 + - 1.5407577787053024 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0582425158412514 + - 1.6567429043003932 + - 1.8464220703200704 + - 1.197812436087633 + - 2.2840054515529906 + - 1.4940207409358315 + - 1.2415790353953307 + - 1.7579687007471096 + - 1.5869264502292373 + - 1.540757778719324 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0564618566121458 + - 1.6567434390306082 + - 1.8464222428755515 + - 1.1978124359597062 + - 2.2823763361754192 + - 1.4940207415091586 + - 1.2415790353953307 + - 1.757968738201986 + - 1.5869264512480477 + - 1.5407577787238647 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0578956944839437 + - 1.6567437798804183 + - 1.8464223771413697 + - 1.1978124359848716 + - 2.2808277606107117 + - 1.494020741768965 + - 1.2415790353953307 + - 1.7579687651701623 + - 1.5869264518262787 + - 1.540757778726199 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0567058337577622 + - 1.6567439266840212 + - 1.846422451462472 + - 1.1978124359773812 + - 2.2797379146039507 + - 1.4940207418390603 + - 1.2415790353953307 + - 1.7579687787302547 + - 1.5869264520400448 + - 1.5407577787269535 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0576633450008956 + - 1.656744020446665 + - 1.8464225093897928 + - 1.1978124359788473 + - 2.2787012582622235 + - 1.4940207418709088 + - 1.2415790353953307 + - 1.7579687885113584 + - 1.5869264521616353 + - 1.5407577787273419 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.056868961583963 + - 1.6567440607796886 + - 1.846422541419481 + - 1.19781243597841 + - 2.2779729576441152 + - 1.494020741879488 + - 1.2415790353953307 + - 1.7579687934238113 + - 1.5869264522065245 + - 1.5407577787274676 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0575079922487827 + - 1.6567440865721075 + - 1.8464225664103815 + - 1.1978124359784963 + - 2.2772799389533587 + - 1.4940207418833915 + - 1.2415790353953307 + - 1.757968796971216 + - 1.5869264522320923 + - 1.5407577787275322 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.056977915045821 + - 1.6567440976581296 + - 1.8464225802188656 + - 1.19781243597847 + - 2.2767936140154155 + - 1.494020741884442 + - 1.2415790353953307 + - 1.7579687987515487 + - 1.5869264522415236 + - 1.5407577787275533 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057404236191043 + - 1.6567441047530975 + - 1.8464225910000818 + - 1.1978124359784759 + - 2.2763307437925415 + - 1.4940207418849205 + - 1.2415790353953307 + - 1.7579688000380924 + - 1.5869264522469 + - 1.5407577787275637 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0570506378142994 + - 1.656744107801047 + - 1.846422596954416 + - 1.1978124359784739 + - 2.276006168879382 + - 1.494020741885049 + - 1.2415790353953307 + - 1.757968800683459 + - 1.5869264522488826 + - 1.5407577787275677 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057334985432481 + - 1.6567441097527138 + - 1.8464226016054028 + - 1.1978124359784739 + - 2.275697204106345 + - 1.494020741885108 + - 1.2415790353953307 + - 1.757968801150046 + - 1.5869264522500126 + - 1.5407577787275688 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0570991579707052 + - 1.6567441105908485 + - 1.8464226041733132 + - 1.1978124359784739 + - 2.2754806588992937 + - 1.494020741885124 + - 1.2415790353953307 + - 1.7579688013840251 + - 1.5869264522504296 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.05728878328083 + - 1.6567441111277048 + - 1.8464226061797102 + - 1.1978124359784739 + - 2.2752745095738303 + - 1.4940207418851308 + - 1.2415790353953307 + - 1.7579688015532386 + - 1.5869264522506672 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571315218221744 + - 1.656744111358203 + - 1.8464226072872636 + - 1.1978124359784739 + - 2.2751300728030666 + - 1.4940207418851328 + - 1.2415790353953307 + - 1.7579688016380761 + - 1.5869264522507547 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057257966288873 + - 1.656744111505879 + - 1.8464226081527981 + - 1.1978124359784739 + - 2.274992562000278 + - 1.494020741885134 + - 1.2415790353953307 + - 1.757968801699443 + - 1.5869264522508042 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571531054324206 + - 1.6567441115692738 + - 1.84642260863052 + - 1.1978124359784739 + - 2.274896237475996 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017302066 + - 1.5869264522508233 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0572374146065326 + - 1.656744111609895 + - 1.846422609003899 + - 1.1978124359784739 + - 2.27480452827488 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017524624 + - 1.5869264522508337 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571674980299184 + - 1.656744111627332 + - 1.846422609209963 + - 1.1978124359784739 + - 2.2747402966250148 + - 1.494020741885134 + - 1.2415790353953307 + - 1.757968801763618 + - 1.5869264522508377 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0572237102714697 + - 1.6567441116385062 + - 1.8464226093710316 + - 1.1978124359784739 + - 2.274679140999365 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017716886 + - 1.58692645225084 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057177094730168 + - 1.6567441116433017 + - 1.8464226094599194 + - 1.1978124359784739 + - 2.274636312785828 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017757338 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0572145725536275 + - 1.6567441116463753 + - 1.8464226095294023 + - 1.1978124359784739 + - 2.2745955348881473 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017786608 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.05718349330376 + - 1.656744111647695 + - 1.846422609567745 + - 1.1978124359784739 + - 2.2745669793767798 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017801283 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0572084800328105 + - 1.6567441116485404 + - 1.8464226095977183 + - 1.1978124359784739 + - 2.2745397905888174 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017811894 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571877593943548 + - 1.656744111648903 + - 1.8464226096142582 + - 1.1978124359784739 + - 2.2745207519459507 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017817219 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0572044180074234 + - 1.656744111649136 + - 1.846422609627188 + - 1.1978124359784739 + - 2.274502624389916 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017821071 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571906036420649 + - 1.6567441116492354 + - 1.8464226096343228 + - 1.1978124359784739 + - 2.274489931142621 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017823 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0572017098174697 + - 1.6567441116493 + - 1.8464226096399003 + - 1.1978124359784739 + - 2.2744778452632035 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017824395 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571924999042335 + - 1.6567441116493271 + - 1.846422609642978 + - 1.1978124359784739 + - 2.274469382673189 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017825088 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571999042674605 + - 1.6567441116493444 + - 1.846422609645384 + - 1.1978124359784739 + - 2.274461324987592 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017825597 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571937641313092 + - 1.6567441116493524 + - 1.8464226096467118 + - 1.1978124359784739 + - 2.2744556830311033 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017825847 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571987005186951 + - 1.656744111649357 + - 1.8464226096477498 + - 1.1978124359784739 + - 2.2744503110094936 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826032 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571946069787117 + - 1.656744111649359 + - 1.8464226096483225 + - 1.1978124359784739 + - 2.2744465495757877 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826123 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571978979920267 + - 1.6567441116493602 + - 1.84642260964877 + - 1.1978124359784739 + - 2.2744429680993474 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826192 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571951688940984 + - 1.6567441116493613 + - 1.846422609649017 + - 1.1978124359784739 + - 2.274440460401212 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826223 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571973629581537 + - 1.6567441116493613 + - 1.846422609649211 + - 1.1978124359784739 + - 2.274438072675754 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826245 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571955435146778 + - 1.6567441116493613 + - 1.8464226096493175 + - 1.1978124359784739 + - 2.2744364008312616 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826256 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571970062591658 + - 1.6567441116493613 + - 1.8464226096494005 + - 1.1978124359784739 + - 2.274434808969651 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826267 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057195793268128 + - 1.6567441116493613 + - 1.8464226096494467 + - 1.1978124359784739 + - 2.2744336943782573 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571967684537906 + - 1.6567441116493613 + - 1.8464226096494825 + - 1.1978124359784739 + - 2.274432633109657 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057195959774476 + - 1.6567441116493613 + - 1.8464226096495024 + - 1.1978124359784739 + - 2.2744318900307237 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571966099130365 + - 1.6567441116493613 + - 1.8464226096495187 + - 1.1978124359784739 + - 2.274431182500965 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571960707813124 + - 1.6567441116493613 + - 1.8464226096495266 + - 1.1978124359784739 + - 2.2744306871034206 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057196504216729 + - 1.6567441116493613 + - 1.8464226096495335 + - 1.1978124359784739 + - 2.2744302154057836 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571961447875633 + - 1.6567441116493613 + - 1.8464226096495375 + - 1.1978124359784739 + - 2.274429885133212 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571964337509163 + - 1.6567441116493613 + - 1.8464226096495397 + - 1.1978124359784739 + - 2.2744295706608946 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057196194126174 + - 1.6567441116493613 + - 1.8464226096495417 + - 1.1978124359784739 + - 2.274429350474235 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571963867726526 + - 1.6567441116493613 + - 1.8464226096495429 + - 1.1978124359784739 + - 2.2744291408212916 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571962270193116 + - 1.6567441116493613 + - 1.846422609649544 + - 1.1978124359784739 + - 2.2744289940269233 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571963554531136 + - 1.6567441116493613 + - 1.846422609649544 + - 1.1978124359784739 + - 2.274428854255181 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057196248948555 + - 1.6567441116493613 + - 1.846422609649544 + - 1.1978124359784739 + - 2.274428756390113 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571963345729598 + - 1.6567441116493613 + - 1.846422609649544 + - 1.1978124359784739 + - 2.2744286632068915 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.0571962635683694 + - 1.6567441116493613 + - 1.846422609649544 + - 1.1978124359784739 + - 2.2744285979620784 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057196320652552 + - 1.6567441116493613 + - 1.846422609649544 + - 1.1978124359784739 + - 2.2744285358385676 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 + - !!python/tuple + - 1.057196320652552 + - 1.6567441116493613 + - 1.846422609649544 + - 1.1978124359784739 + - 2.2744285358385676 + - 1.494020741885134 + - 1.2415790353953307 + - 1.7579688017826278 + - 1.586926452250841 + - 1.54075777872757 + - 1.253002563266839 + - 1.3267301334593096 + - 1.2862569000459545 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.265660256469717 + - 7.903251643377621 + - 7.800490081178013 + - 7.371689670340001 + - 8.01101563330589 + - 7.750537799777167 + - 7.449730254847162 + - 7.759044820593661 + - 7.666961194452446 + - 7.791380939654552 + - 7.580363307152609 + - 7.6712165151716585 + - 7.568855914163849 + - !!python/tuple + - 5.430042581269882 + - 7.661318889456599 + - 7.301615621228539 + - 5.801002599886054 + - 8.038563319547919 + - 7.1267750929034905 + - 6.074065382948396 + - 7.156550437386187 + - 6.834260853121445 + - 7.269731711921606 + - 6.5311949030614285 + - 6.849153767856626 + - 6.490924359445427 + - !!python/tuple + - 0.7814738844147335 + - 7.044343481324748 + - 5.9949563581354415 + - 2.0448392575180336 + - 8.108862211808276 + - 5.224399846917883 + - 2.8647840761646703 + - 5.349150559945041 + - 4.845477781286452 + - 5.820868228991278 + - 4.033036778575409 + - 4.796521982924212 + - 3.6930609949618125 + - !!python/tuple + - 1.686871289271286 + - 6.627456492154922 + - 5.687295409587545 + - 1.719694868302583 + - 7.830758217711943 + - 4.6091554184409596 + - 2.5689748571878477 + - 4.991734211919463 + - 4.608154393250289 + - 5.558255135825397 + - 3.33129161920355 + - 4.494475436925948 + - 3.335822494987453 + - !!python/tuple + - 0.41389318125440244 + - 5.9495198516899155 + - 5.031695047966492 + - 1.1931622132231205 + - 7.185578836303359 + - 3.4821657666482224 + - 1.8625174749126832 + - 4.140000863906144 + - 4.0729338246041795 + - 4.99912507001371 + - 1.9629514864964936 + - 3.7765044953029228 + - 2.5470204399308516 + - !!python/tuple + - 1.6000150063695815 + - 5.858154470184807 + - 4.964115328563626 + - 1.2263848298242106 + - 7.122990631717692 + - 3.360200078694756 + - 1.8343708745218035 + - 4.045052509625034 + - 4.034461301785495 + - 4.9408122869298845 + - 1.8700660202780388 + - 3.7080801658536826 + - 2.4741978134544995 + - !!python/tuple + - 1.126943216421727 + - 5.546449374815258 + - 4.68987428499018 + - 1.3201131435955702 + - 6.808142059007853 + - 2.912647773324675 + - 1.728245146133316 + - 3.6777576738431375 + - 3.8788536387969716 + - 4.704191951433368 + - 1.520185851819961 + - 3.4191954367985784 + - 2.1823077532129873 + - !!python/tuple + - 0.7337552820232617 + - 3.9065984987843607 + - 3.2762957351277264 + - 1.2613427727145115 + - 5.095129465427185 + - 0.7789070227945638 + - 1.2507474204779545 + - 1.948657711875319 + - 3.088089253465741 + - 3.3525158851519814 + - 0.54874688951202 + - 2.1190425164147877 + - 0.8578449529387953 + - !!python/tuple + - 1.1384332106642066 + - 3.8111980957271756 + - 3.2048683785125784 + - 1.2059553801769052 + - 4.92364002911865 + - 1.3731970165032061 + - 1.2758447620569604 + - 1.9647240574341984 + - 2.934607816755194 + - 3.217306339292755 + - 1.6930248450032477 + - 2.1199875189039 + - 1.32296706694598 + - !!python/tuple + - 1.011367546018789 + - 3.5960936847653175 + - 3.059594275140248 + - 1.211187077253004 + - 4.606129567558522 + - 1.4440044525121252 + - 1.2837820280380754 + - 2.0678563760216706 + - 2.6856926503653176 + - 2.966162997993085 + - 1.3480424531914812 + - 2.172669727438076 + - 1.5164469259039726 + - !!python/tuple + - 1.0923796411882085 + - 2.5644129816439643 + - 2.184760877839497 + - 1.174602323893234 + - 2.7677635660361224 + - 1.5083192047055085 + - 1.6139316227931304 + - 1.5524180261684701 + - 1.6025432102509685 + - 1.9465633147063233 + - 0.5561051106528013 + - 1.7712888409506253 + - 1.6343482877321398 + - !!python/tuple + - 1.0554336216465474 + - 2.525961450050443 + - 2.1702277876309517 + - 1.151748617264224 + - 2.786472876004527 + - 1.5028646621073307 + - 1.4996620140304222 + - 1.540306122135312 + - 1.656142634533441 + - 1.9138011976793146 + - 1.3999605936514212 + - 1.7162357731272104 + - 1.5210252578105157 + - !!python/tuple + - 0.9976650252546011 + - 2.4139349948763957 + - 2.0971530526599316 + - 1.167783462003064 + - 2.7458675114592053 + - 1.4450351766113843 + - 1.2443921296457494 + - 1.6317590003655187 + - 1.6773336263613854 + - 1.8470713913148806 + - 1.2822806210618332 + - 1.6685930749784785 + - 1.4037545722803042 + - !!python/tuple + - 1.0391570631882676 + - 2.3086510727834013 + - 2.0174512689945376 + - 1.170548219238856 + - 2.658041114533815 + - 1.4316651792227464 + - 1.3535395396411647 + - 1.5494347746073989 + - 1.7020102519136249 + - 1.826238878206732 + - 1.267338187880592 + - 1.6095547135817005 + - 1.3749633748405854 + - !!python/tuple + - 0.978935067505677 + - 2.151169837158834 + - 1.9405712158372097 + - 1.16217305281425 + - 2.519155893667506 + - 1.456585826970633 + - 1.2557183717583067 + - 1.5066977530492223 + - 1.6663455631665585 + - 1.8010935680157996 + - 1.2313379316814292 + - 1.58134464279666 + - 1.4326364631954878 + - !!python/tuple + - 1.01816318295967 + - 2.120171701668348 + - 1.928291507157183 + - 1.1428937730338555 + - 2.536475440147049 + - 1.4557165367225766 + - 1.259210520432269 + - 1.4952643419913008 + - 1.675459260680263 + - 1.7976281451564706 + - 1.2664462166818498 + - 1.5474429070312292 + - 1.3791615206819705 + - !!python/tuple + - 1.019416900593239 + - 2.0955415553664034 + - 1.918031170148848 + - 1.1581220595860677 + - 2.5076408102978265 + - 1.44097876338943 + - 1.2706134542585465 + - 1.513562103636716 + - 1.6712067475256622 + - 1.7954095729282222 + - 1.2489372233134703 + - 1.5557067067384116 + - 1.3951033285942238 + - !!python/tuple + - 1.0197762721324566 + - 2.06356621724342 + - 1.9063727812560265 + - 1.1606721196738796 + - 2.4987646184539427 + - 1.4460745691375276 + - 1.2660932274882624 + - 1.4988535884674965 + - 1.6814071349947586 + - 1.7922299913917779 + - 1.2619569955793681 + - 1.5513730520424278 + - 1.361868055350624 + - !!python/tuple + - 1.0197478334014114 + - 2.0476469164438185 + - 1.9008256642468544 + - 1.1630272149850158 + - 2.489913033742063 + - 1.4478299312594891 + - 1.2709030157523684 + - 1.5000019533886189 + - 1.6592154677496793 + - 1.7910569241270824 + - 1.2564209876348678 + - 1.5558143646137417 + - 1.3772352516577488 + - !!python/tuple + - 1.0197357286743771 + - 2.0296379206833346 + - 1.89469146549669 + - 1.1621551503725758 + - 2.484607303034922 + - 1.4494940893296824 + - 1.251475552756078 + - 1.5011234018851725 + - 1.6579132106592895 + - 1.7894527776775981 + - 1.253758973898054 + - 1.5602649802099509 + - 1.3775652380270773 + - !!python/tuple + - 1.0197349023430737 + - 2.024002123299242 + - 1.8928232594685461 + - 1.162989503186816 + - 2.475459608971719 + - 1.449910788681698 + - 1.2622434011633832 + - 1.4985830059998075 + - 1.6612768689277173 + - 1.7890943854666967 + - 1.255611877561205 + - 1.558841633199284 + - 1.3760277806111723 + - !!python/tuple + - 1.0197344358836802 + - 2.0197427766794784 + - 1.8914231151527925 + - 1.1626728991031787 + - 2.478646598310396 + - 1.4502055601293338 + - 1.2572072305464557 + - 1.4989866586030944 + - 1.6548396855362504 + - 1.7887364865262698 + - 1.2549809048104377 + - 1.5598689407919737 + - 1.3762253338228239 + - !!python/tuple + - 1.0197339857556802 + - 2.0146267731146397 + - 1.8897520803422267 + - 1.16244373839931 + - 2.477069645320056 + - 1.450542091042585 + - 1.2580378225100965 + - 1.4967080374949644 + - 1.6582917741133476 + - 1.788312124844362 + - 1.2571976914699723 + - 1.5585203428549663 + - 1.370346608597903 + - !!python/tuple + - 1.019733270358602 + - 2.0038651605604336 + - 1.8862643863479422 + - 1.1620355329614604 + - 2.4736970999569583 + - 1.4512065978498887 + - 1.2477511130120806 + - 1.4981449563814435 + - 1.6574618666368932 + - 1.787433542878277 + - 1.254997221908123 + - 1.5613410020043965 + - 1.37225260489999 + - !!python/tuple + - 1.0197331969157777 + - 2.001375609886938 + - 1.8854714099444514 + - 1.1624890817830398 + - 2.4689680322309995 + - 1.451339029699611 + - 1.2537496423153223 + - 1.4969390637911233 + - 1.6592576504206802 + - 1.7872992690459542 + - 1.255879404876168 + - 1.560543269192574 + - 1.3717597420519436 + - !!python/tuple + - 1.019733145752147 + - 1.9993797245983673 + - 1.8848381790607809 + - 1.162355104922052 + - 2.4707830908560995 + - 1.4514417565664235 + - 1.2515161674388384 + - 1.4972247667399672 + - 1.6557595429839693 + - 1.7871419238831043 + - 1.2555136295182443 + - 1.5610530058685224 + - 1.3720800664560988 + - !!python/tuple + - 1.0197330885156843 + - 1.996880197984164 + - 1.8840476761583886 + - 1.1621985199724933 + - 2.473073523581851 + - 1.451567013331698 + - 1.2519470071151921 + - 1.4960145306661794 + - 1.6534884725911274 + - 1.7869461656682841 + - 1.2567303031953385 + - 1.560235163039837 + - 1.3689978351832823 + - !!python/tuple + - 1.0197330633731638 + - 1.9956088467531174 + - 1.8836472121696386 + - 1.1624348122979422 + - 2.4705213941262127 + - 1.451628581059762 + - 1.2534029295085785 + - 1.4962267526235984 + - 1.653465778954956 + - 1.7868808453407619 + - 1.2562749708148717 + - 1.560578926631233 + - 1.3706404003017196 + - !!python/tuple + - 1.0197329962839887 + - 1.9919607755091568 + - 1.8825004548622313 + - 1.1622758169462821 + - 2.469302659898844 + - 1.451802198187664 + - 1.2499369336157558 + - 1.4968266842526217 + - 1.6534011940479536 + - 1.7865972743601002 + - 1.2555247258170907 + - 1.5615537086595577 + - 1.3713612313610974 + - !!python/tuple + - 1.0197329698515494 + - 1.9901473447455327 + - 1.8819338238614427 + - 1.1622070279102439 + - 2.4686876362427537 + - 1.4518841044932662 + - 1.2507677167236686 + - 1.4959065794225535 + - 1.6549581489316663 + - 1.7864580720050813 + - 1.256464072933535 + - 1.5609052033073225 + - 1.369014917351087 + - !!python/tuple + - 1.0197329613522819 + - 1.9894960425071548 + - 1.8817309231486319 + - 1.1621672142741395 + - 2.4693399643782397 + - 1.4519127666030371 + - 1.2500360201894636 + - 1.496023319572147 + - 1.6537461180979924 + - 1.78640838901284 + - 1.2563191990947622 + - 1.5610837747531099 + - 1.3691790232030951 + - !!python/tuple + - 1.0197329536587845 + - 1.9888833144961204 + - 1.8815402440791378 + - 1.1621464707456919 + - 2.469127431126109 + - 1.4519394815096296 + - 1.250320755690163 + - 1.495715972570738 + - 1.6542805547259938 + - 1.786361753553395 + - 1.2566261606231246 + - 1.5608651676666034 + - 1.3684055957897154 + - !!python/tuple + - 1.0197329379948545 + - 1.987589522227992 + - 1.8811380268294788 + - 1.1621036495317238 + - 2.468677468561061 + - 1.4519953970532629 + - 1.2491621565737507 + - 1.4959558080301416 + - 1.654239584722999 + - 1.7862634902752108 + - 1.2563275060235446 + - 1.5612249425220817 + - 1.368757326771286 + - !!python/tuple + - 1.0197329364056948 + - 1.987447402477206 + - 1.8810939392481607 + - 1.1621329325719905 + - 2.4683709055140133 + - 1.4520014244848745 + - 1.2495478929836814 + - 1.4958834763131759 + - 1.654364598896092 + - 1.7862567989002762 + - 1.2563784187547868 + - 1.5611729657440905 + - 1.3687389905321652 + - !!python/tuple + - 1.0197329338440535 + - 1.9872163714860318 + - 1.8810222870054214 + - 1.1621192489872327 + - 2.4686084103605164 + - 1.4520112026075955 + - 1.2496089200707456 + - 1.4957661008817251 + - 1.6541369144492426 + - 1.7862393281116018 + - 1.256495845545728 + - 1.5610885897727367 + - 1.3684447316441002 + - !!python/tuple + - 1.019732930360774 + - 1.9868978589093298 + - 1.8809235409757084 + - 1.1621089458821505 + - 2.468496727045591 + - 1.4520246382070405 + - 1.2497651134470147 + - 1.4956047458266586 + - 1.6544185831306208 + - 1.786215261305551 + - 1.2566567131506838 + - 1.5609725286216283 + - 1.3680408380913036 + - !!python/tuple + - 1.0197329285323866 + - 1.9867274448113914 + - 1.8808707367502548 + - 1.1620989907985617 + - 2.468672706462189 + - 1.4520317934391953 + - 1.2495742691720537 + - 1.495637330683587 + - 1.6540933835003302 + - 1.7862023991640312 + - 1.2566164597617215 + - 1.5610204391447011 + - 1.3680897883061165 + - !!python/tuple + - 1.0197329279450824 + - 1.9866721444883342 + - 1.8808536063386927 + - 1.1621104884762865 + - 2.468552464398587 + - 1.4520341096015819 + - 1.2497247138993803 + - 1.4956093440206482 + - 1.6541425482104832 + - 1.7861998178620881 + - 1.2566358414153294 + - 1.5610002691924905 + - 1.3680836475682896 + - !!python/tuple + - 1.0197329274595275 + - 1.9866262737952265 + - 1.8808393982547424 + - 1.1621077999242044 + - 2.4685999202504725 + - 1.452036029274967 + - 1.249673305345517 + - 1.49561812877774 + - 1.6540550338589708 + - 1.7861963575350335 + - 1.2566250187892851 + - 1.5610131680347197 + - 1.3680967952840875 + - !!python/tuple + - 1.0197329269975584 + - 1.9865825116840874 + - 1.8808258443208974 + - 1.1621063998669972 + - 2.4685844929786445 + - 1.4520378594831138 + - 1.249694778029087 + - 1.4955959789043718 + - 1.654094004287206 + - 1.7861930568023747 + - 1.2566470345676486 + - 1.5609971975370736 + - 1.3680414314783673 + - !!python/tuple + - 1.0197329260418335 + - 1.986491739591073 + - 1.880797732573109 + - 1.1621035005780926 + - 2.4685524872273152 + - 1.4520416533140597 + - 1.2496138767578926 + - 1.4956134038099809 + - 1.6540913416849015 + - 1.7861862114175922 + - 1.2566255627030416 + - 1.5610227493359776 + - 1.3680675801856983 + - !!python/tuple + - 1.0197329255649243 + - 1.9864461975159573 + - 1.8807836305073242 + - 1.1621020508714428 + - 2.4685364228251068 + - 1.452043554235129 + - 1.2496363522932894 + - 1.4955903287949974 + - 1.6541319213584889 + - 1.786182778051173 + - 1.256648501784977 + - 1.561006100011326 + - 1.368009930225119 + - !!python/tuple + - 1.0197329253080643 + - 1.986421602029059 + - 1.8807760151121762 + - 1.1621006159272342 + - 2.468561923837778 + - 1.452044580167002 + - 1.2496088108025132 + - 1.4955950592709377 + - 1.6540849021600081 + - 1.7861809241207482 + - 1.256642675064095 + - 1.5610130280899253 + - 1.368017046601053 + - !!python/tuple + - 1.0197329247378768 + - 1.986366923794286 + - 1.8807590860174868 + - 1.1620988816115119 + - 2.468542621628416 + - 1.4520468600992826 + - 1.2495601815100035 + - 1.4956055723500412 + - 1.6540833039315344 + - 1.7861768030027816 + - 1.2566297304538976 + - 1.5610284261522216 + - 1.3680328595287163 + - !!python/tuple + - 1.0197329244835667 + - 1.986342456792336 + - 1.8807515114038014 + - 1.1620981071364356 + - 2.468533982308946 + - 1.4520478794930813 + - 1.249572319635724 + - 1.4955931652797698 + - 1.6541051335367372 + - 1.7861749592697542 + - 1.2566420648415009 + - 1.5610194683743512 + - 1.3680018758740624 + - !!python/tuple + - 1.0197329240021122 + - 1.9862960686074478 + - 1.8807371509082011 + - 1.162096640112146 + - 2.468517600807076 + - 1.4520498115222844 + - 1.249531096307708 + - 1.4956020929363456 + - 1.654103761433469 + - 1.7861714639461443 + - 1.2566310757533892 + - 1.5610325357659578 + - 1.3680153213755988 + - !!python/tuple + - 1.01973292377967 + - 1.9862745767092722 + - 1.880730498126264 + - 1.1620959616090605 + - 2.4685100095915264 + - 1.452050706036386 + - 1.249541789017599 + - 1.4955911889416702 + - 1.6541229422174073 + - 1.7861698448072583 + - 1.2566419164312845 + - 1.5610246603095685 + - 1.3679880979855341 + - !!python/tuple + - 1.0197329237085846 + - 1.9862676997527544 + - 1.8807283694517734 + - 1.1620955617068527 + - 2.4685171520623674 + - 1.4520509921724094 + - 1.2495436270564333 + - 1.4955877008335743 + - 1.6541161175103312 + - 1.78616932675585 + - 1.2566453831647408 + - 1.5610221408656804 + - 1.3679793906802185 + - !!python/tuple + - 1.0197329236823809 + - 1.986265163704049 + - 1.8807275844591131 + - 1.1620960916578604 + - 2.468511616033772 + - 1.4520510976815981 + - 1.2495470455499866 + - 1.495588189554671 + - 1.654116041993711 + - 1.7861692089483134 + - 1.2566443934027622 + - 1.5610228556307206 + - 1.3679830636961468 + - !!python/tuple + - 1.01973292365601 + - 1.9862626110814943 + - 1.8807267943396226 + - 1.1620959431916202 + - 2.4685142674246623 + - 1.4520512038763929 + - 1.2495441909026512 + - 1.4955886814540447 + - 1.6541111545396194 + - 1.7861690166593893 + - 1.2566437880448482 + - 1.5610235750488781 + - 1.3679838054771225 + - !!python/tuple + - 1.0197329236215338 + - 1.9862592733960749 + - 1.880725761222097 + - 1.1620958378959532 + - 2.4685130881964383 + - 1.4520513427263848 + - 1.2495412261468088 + - 1.4955893246171879 + - 1.654111055415972 + - 1.7861687652339722 + - 1.2566429965639343 + - 1.5610245157013527 + - 1.3679847753462147 + - !!python/tuple + - 1.0197329236050303 + - 1.9862576753541141 + - 1.8807252665811176 + - 1.1620957874879918 + - 2.468512523588296 + - 1.4520514092027845 + - 1.2495420208746149 + - 1.4955885140126632 + - 1.654112481915812 + - 1.7861686448560423 + - 1.2566438022023088 + - 1.5610239301628646 + - 1.3679827518369085 + - !!python/tuple + - 1.0197329235721666 + - 1.9862544928427475 + - 1.8807242815028844 + - 1.1620956871061883 + - 2.468511399159312 + - 1.4520515415878978 + - 1.2495391940837124 + - 1.495589127314165 + - 1.654112387327794 + - 1.7861684051239255 + - 1.2566430474820367 + - 1.561024827102611 + - 1.3679836767540179 + - !!python/tuple + - 1.0197329235659454 + - 1.986253890254365 + - 1.8807240949855444 + - 1.1620958130394243 + - 2.468510083602645 + - 1.4520515666530174 + - 1.2495408414714009 + - 1.495588821640997 + - 1.6541129252422657 + - 1.7861683771354622 + - 1.2566432590193528 + - 1.561024606294738 + - 1.3679836113751933 + - !!python/tuple + - 1.0197329235521984 + - 1.9862525586900617 + - 1.8807236828309295 + - 1.1620957356018258 + - 2.468511466844806 + - 1.4520516220399549 + - 1.2495411974815724 + - 1.4955881461875518 + - 1.65411160375519 + - 1.786168276832462 + - 1.2566439303363244 + - 1.5610241183694253 + - 1.3679819252508094 + - !!python/tuple + - 1.0197329235387393 + - 1.9862512549179479 + - 1.880723279279632 + - 1.1620956944798344 + - 2.4685110061872364 + - 1.452051676269812 + - 1.2495400394215506 + - 1.495588397459901 + - 1.654111565022223 + - 1.7861681786234285 + - 1.2566436211308372 + - 1.561024485829527 + - 1.3679823042084671 + - !!python/tuple + - 1.0197329235320056 + - 1.9862506025706785 + - 1.8807230773616643 + - 1.162095673905294 + - 2.4685107756941465 + - 1.4520517034034082 + - 1.24954036389606 + - 1.4955880665461043 + - 1.6541121473814426 + - 1.7861681294843947 + - 1.2566439500154198 + - 1.5610242467854383 + - 1.3679814781625614 + - !!python/tuple + - 1.0197329235308363 + - 1.9862504892836061 + - 1.8807230422964902 + - 1.1620956673175773 + - 2.468510893381114 + - 1.4520517081154023 + - 1.249540237216112 + - 1.4955880883802017 + - 1.6541119304506082 + - 1.7861681209508962 + - 1.2566439231474325 + - 1.5610242787150024 + - 1.3679815110929174 + - !!python/tuple + - 1.0197329235287336 + - 1.9862502855685031 + - 1.8807229792415974 + - 1.162095660892769 + - 2.468510821402294 + - 1.4520517165885911 + - 1.2495400562724497 + - 1.4955881276426612 + - 1.6541119243973659 + - 1.7861681056057925 + - 1.2566438748330255 + - 1.5610243361313254 + - 1.3679815703088198 + - !!python/tuple + - 1.019732923527676 + - 1.9862501830958705 + - 1.8807229475237788 + - 1.162095657660991 + - 2.468510785195524 + - 1.4520517208507562 + - 1.2495401072422596 + - 1.495588075661881 + - 1.6541120158763023 + - 1.7861680978869146 + - 1.2566439264946936 + - 1.5610242985815301 + - 1.36798144055207 + - !!python/tuple + - 1.0197329235263617 + - 1.9862500557738954 + - 1.8807229081144798 + - 1.1620956536455307 + - 2.468510740208687 + - 1.4520517261464772 + - 1.2495399941527368 + - 1.4955881002010307 + - 1.6541120120928379 + - 1.7861680882962325 + - 1.2566438962980786 + - 1.5610243344667962 + - 1.3679814775623826 + - !!python/tuple + - 1.0197329235261101 + - 1.9862500313999163 + - 1.8807229005701322 + - 1.162095658739629 + - 2.4685106869938633 + - 1.4520517271602655 + - 1.2495400607896308 + - 1.4955880878369523 + - 1.6541120338518858 + - 1.786168087164185 + - 1.256643904854101 + - 1.5610243255352427 + - 1.3679814749193124 + - !!python/tuple + - 1.0197329235255275 + - 1.9862499749458984 + - 1.8807228830962224 + - 1.1620956569591856 + - 2.4685106670468913 + - 1.4520517295083604 + - 1.2495400888698738 + - 1.4955880591997859 + - 1.6541120842492982 + - 1.7861680829117195 + - 1.2566439333154489 + - 1.561024304848347 + - 1.3679814034339675 + - !!python/tuple + - 1.0197329235247061 + - 1.986249895369729 + - 1.8807228584654392 + - 1.1620956544495227 + - 2.468510638930132 + - 1.4520517328181732 + - 1.2495400181888972 + - 1.4955880745368006 + - 1.654112081884542 + - 1.7861680769175516 + - 1.2566439144425232 + - 1.561024327276654 + - 1.3679814265655235 + - !!python/tuple + - 1.0197329235246833 + - 1.986249893164495 + - 1.8807228577828652 + - 1.1620956543799745 + - 2.4685106381509536 + - 1.4520517329098954 + - 1.249540019285786 + - 1.495588073418161 + - 1.6541120838531909 + - 1.7861680767514398 + - 1.2566439155542948 + - 1.5610243264685715 + - 1.367981423773128 + - !!python/tuple + - 1.019732923524671 + - 1.9862498919758484 + - 1.88072285741495 + - 1.1620956543108545 + - 2.4685106393857743 + - 1.4520517329593348 + - 1.2495400179566234 + - 1.495588073647253 + - 1.6541120815770647 + - 1.7861680766619037 + - 1.2566439152723863 + - 1.5610243268035877 + - 1.3679814241186488 + - !!python/tuple + - 1.0197329235246593 + - 1.9862498908451254 + - 1.8807228570649634 + - 1.162095654275194 + - 2.4685106389862543 + - 1.452051733006365 + - 1.249540018519048 + - 1.4955880730736761 + - 1.6541120825864797 + - 1.7861680765767307 + - 1.2566439158424416 + - 1.5610243263892474 + - 1.3679814226868616 + - !!python/tuple + - 1.0197329235246348 + - 1.9862498884894266 + - 1.8807228563358167 + - 1.1620956542009004 + - 2.4685106381539117 + - 1.4520517331043454 + - 1.2495400164266788 + - 1.4955880735276985 + - 1.6541120825164757 + - 1.786168076399285 + - 1.2566439152837463 + - 1.5610243270531936 + - 1.3679814233716259 + - !!python/tuple + - 1.0197329235246226 + - 1.986249887304911 + - 1.88072285596918 + - 1.1620956541635434 + - 2.468510637735385 + - 1.452051733153613 + - 1.24954001701586 + - 1.4955880729268343 + - 1.6541120835739125 + - 1.78616807631006 + - 1.2566439158809213 + - 1.5610243266191415 + - 1.3679814218717234 + - !!python/tuple + - 1.019732923524616 + - 1.9862498866654417 + - 1.8807228557712485 + - 1.1620956541263583 + - 2.4685106383996955 + - 1.4520517331802103 + - 1.2495400163007957 + - 1.4955880730500815 + - 1.6541120823493998 + - 1.7861680762618912 + - 1.25664391572926 + - 1.561024326799374 + - 1.367981422057607 + - !!python/tuple + - 1.0197329235245909 + - 1.9862498842369676 + - 1.880722855019576 + - 1.1620956540497696 + - 2.468510637541639 + - 1.4520517332812177 + - 1.2495400141437865 + - 1.4955880735181302 + - 1.654112082277233 + - 1.7861680760789636 + - 1.2566439151533046 + - 1.5610243274838318 + - 1.3679814227635259 + - !!python/tuple + - 1.0197329235245782 + - 1.9862498830194362 + - 1.8807228546427202 + - 1.1620956540113714 + - 2.4685106371114465 + - 1.4520517333318586 + - 1.2495400147493898 + - 1.4955880729005182 + - 1.6541120833641434 + - 1.7861680759872516 + - 1.2566439157671245 + - 1.5610243270376813 + - 1.3679814212218169 + - !!python/tuple + - 1.0197329235245738 + - 1.9862498825974104 + - 1.8807228545120929 + - 1.1620956539868306 + - 2.4685106375498664 + - 1.4520517333494118 + - 1.2495400142774742 + - 1.4955880729818567 + - 1.654112082556011 + - 1.786168075955462 + - 1.2566439156670337 + - 1.561024327156628 + - 1.3679814213444932 + - !!python/tuple + - 1.0197329235245696 + - 1.9862498821950805 + - 1.8807228543875618 + - 1.162095653974142 + - 2.4685106374077104 + - 1.452051733366146 + - 1.2495400144775943 + - 1.4955880727777684 + - 1.6541120829151776 + - 1.786168075925156 + - 1.256643915869869 + - 1.5610243270091988 + - 1.3679814208350396 + - !!python/tuple + - 1.019732923524561 + - 1.9862498813572356 + - 1.8807228541282281 + - 1.1620956539477183 + - 2.4685106371116734 + - 1.4520517334009944 + - 1.2495400137334072 + - 1.4955880729392492 + - 1.6541120828902796 + - 1.7861680758620444 + - 1.2566439156711593 + - 1.5610243272453428 + - 1.367981421078588 + - !!python/tuple + - 1.0197329235245565 + - 1.986249880936124 + - 1.8807228539978837 + - 1.1620956539344374 + - 2.4685106369628813 + - 1.4520517334185097 + - 1.2495400139428692 + - 1.4955880727256339 + - 1.6541120832662128 + - 1.7861680758303238 + - 1.2566439158834632 + - 1.5610243270910313 + - 1.367981420545352 + - !!python/tuple + - 1.019732923524554 + - 1.98624988070844 + - 1.88072285392741 + - 1.1620956539211975 + - 2.46851063719941 + - 1.4520517334279797 + - 1.2495400136882697 + - 1.495588072769516 + - 1.6541120828302236 + - 1.7861680758131733 + - 1.256643915829464 + - 1.5610243271552033 + - 1.3679814206115362 + - !!python/tuple + - 1.0197329235245518 + - 1.986249880491342 + - 1.8807228538602128 + - 1.1620956539143508 + - 2.4685106371227024 + - 1.4520517334370093 + - 1.249540013796255 + - 1.4955880726593895 + - 1.6541120830240308 + - 1.7861680757968201 + - 1.2566439159389142 + - 1.5610243270756503 + - 1.3679814203366338 + - !!python/tuple + - 1.0197329235245507 + - 1.9862498803739468 + - 1.880722853823876 + - 1.1620956539075242 + - 2.468510637244658 + - 1.452051733441892 + - 1.2495400136649817 + - 1.4955880726820157 + - 1.654112082799232 + - 1.7861680757879772 + - 1.2566439159110718 + - 1.5610243271087378 + - 1.3679814203707588 + - !!python/tuple + - 1.0197329235245498 + - 1.9862498802813078 + - 1.880722853795202 + - 1.1620956539046026 + - 2.468510637211926 + - 1.4520517334457452 + - 1.2495400135826984 + - 1.4955880726998703 + - 1.654112082796479 + - 1.786168075780999 + - 1.256643915889101 + - 1.5610243271348478 + - 1.3679814203976874 + - !!python/tuple + - 1.0197329235245494 + - 1.986249880234786 + - 1.8807228537808025 + - 1.1620956539031353 + - 2.4685106371954886 + - 1.4520517334476801 + - 1.2495400136058383 + - 1.4955880726762714 + - 1.6541120828380096 + - 1.7861680757774947 + - 1.2566439159125549 + - 1.5610243271178006 + - 1.3679814203387792 + - !!python/tuple + - 1.0197329235245485 + - 1.986249880137995 + - 1.8807228537508434 + - 1.1620956539000826 + - 2.4685106371612893 + - 1.452051733451706 + - 1.2495400135198669 + - 1.4955880726949262 + - 1.6541120828351332 + - 1.7861680757702039 + - 1.2566439158895992 + - 1.5610243271450808 + - 1.367981420366915 + - !!python/tuple + - 1.019732923524548 + - 1.9862498800893926 + - 1.8807228537357996 + - 1.1620956538985499 + - 2.4685106371441163 + - 1.4520517334537275 + - 1.249540013544042 + - 1.4955880726702717 + - 1.6541120828785216 + - 1.7861680757665428 + - 1.2566439159141023 + - 1.561024327127271 + - 1.3679814203053715 + - !!python/tuple + - 1.019732923524547 + - 1.9862498799882806 + - 1.8807228537045029 + - 1.162095653895361 + - 2.4685106371083902 + - 1.452051733457933 + - 1.2495400134542327 + - 1.4955880726897595 + - 1.654112082875517 + - 1.7861680757589264 + - 1.2566439158901217 + - 1.561024327155769 + - 1.367981420334763 + - !!python/tuple + - 1.0197329235245465 + - 1.986249879937513 + - 1.880722853688789 + - 1.16209565389376 + - 2.4685106370904526 + - 1.4520517334600447 + - 1.2495400134794847 + - 1.4955880726640067 + - 1.654112082920838 + - 1.7861680757551024 + - 1.2566439159157163 + - 1.561024327137166 + - 1.367981420270478 + - !!python/tuple + - 1.0197329235245454 + - 1.9862498798319064 + - 1.8807228536561011 + - 1.1620956538904292 + - 2.4685106370531384 + - 1.4520517334644372 + - 1.2495400133856833 + - 1.4955880726843607 + - 1.6541120829176996 + - 1.7861680757471474 + - 1.25664391589067 + - 1.5610243271669308 + - 1.3679814203011762 + - !!python/tuple + - 1.019732923524545 + - 1.986249879778887 + - 1.8807228536396903 + - 1.162095653888757 + - 2.468510637034405 + - 1.4520517334666423 + - 1.2495400134120553 + - 1.4955880726574657 + - 1.6541120829650309 + - 1.7861680757431537 + - 1.2566439159173997 + - 1.5610243271475024 + - 1.36798142023404 + - !!python/tuple + - 1.0197329235245438 + - 1.9862498796686066 + - 1.8807228536055558 + - 1.162095653885279 + - 2.4685106369954393 + - 1.4520517334712293 + - 1.2495400133141026 + - 1.4955880726787205 + - 1.6541120829617537 + - 1.7861680757348468 + - 1.2566439158912448 + - 1.5610243271785846 + - 1.3679814202660967 + - !!python/tuple + - 1.0197329235245431 + - 1.986249879613246 + - 1.8807228535884204 + - 1.162095653883533 + - 2.4685106369758785 + - 1.452051733473532 + - 1.2495400133416392 + - 1.4955880726506379 + - 1.654112083011175 + - 1.7861680757306768 + - 1.256643915919155 + - 1.5610243271582984 + - 1.367981420195996 + - !!python/tuple + - 1.019732923524543 + - 1.98624987958336 + - 1.88072285357917 + - 1.162095653881795 + - 2.468510637006925 + - 1.452051733474775 + - 1.2495400133082204 + - 1.495588072656398 + - 1.6541120829539468 + - 1.7861680757284257 + - 1.256643915912067 + - 1.5610243271667217 + - 1.3679814202046832 + - !!python/tuple + - 1.0197329235245427 + - 1.9862498795548973 + - 1.8807228535703602 + - 1.1620956538808973 + - 2.4685106369968683 + - 1.4520517334759588 + - 1.249540013322378 + - 1.4955880726419597 + - 1.654112082979356 + - 1.7861680757262817 + - 1.2566439159264167 + - 1.5610243271562918 + - 1.367981420168642 + - !!python/tuple + - 1.0197329235245427 + - 1.9862498795548973 + - 1.8807228535703602 + - 1.1620956538808973 + - 2.4685106369968683 + - 1.4520517334759588 + - 1.249540013322378 + - 1.4955880726419597 + - 1.654112082979356 + - 1.7861680757262817 + - 1.2566439159264167 + - 1.5610243271562918 + - 1.367981420168642 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 83.0 + - 166.0 + - 249.0 + - 415.0 + - 664.0 + - 747.0 + - 830.0 + - 913.0 + - 1328.0 + - 1411.0 + - 1494.0 + - 1577.0 + - 2158.0 + - 2241.0 + - 2324.0 + - 2407.0 + - 2490.0 + - 2573.0 + - 2656.0 + - 2739.0 + - 2822.0 + - 2905.0 + - 2988.0 + - 3071.0 + - 3154.0 + - 3237.0 + - 3320.0 + - 3403.0 + - 3486.0 + - 5146.0 + - 5229.0 + - 5561.0 + - 5644.0 + - 5976.0 + - 6059.0 + - 6142.0 + - 6225.0 + - 7221.0 + - 7304.0 + - 7387.0 + - 7470.0 + - 8051.0 + - 8134.0 + - 8466.0 + - 8549.0 + - 9130.0 + - 9213.0 + - 9545.0 + - 9628.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 52.59873162680112 + - 46.150472699505535 + - 38.20894692022277 + - 33.823821425110516 + - 28.572426171925848 + - 25.307363008091606 + - 24.92971374117208 + - 22.703466216256597 + - 22.170442372918856 + - 20.261532778106083 + - 19.960729627366373 + - 19.19594144414026 + - 18.82557419298326 + - 18.769904150023255 + - 18.54549180271025 + - 18.562824868172996 + - 18.550073382324328 + - 18.524714288994204 + - 18.525155568196865 + - 18.514371164909857 + - 18.51472224201846 + - 18.509951516345794 + - 18.50991377361457 + - 18.508027842409682 + - 18.508060633792855 + - 18.50721356067611 + - 18.507251717459624 + - 18.50687022426704 + - 18.506878851130544 + - 18.50680986454267 + - 18.50681266417502 + - 18.50679110380958 + - 18.506791988826514 + - 18.506785251014534 + - 18.5067856682792 + - 18.506782503756853 + - 18.50678250647192 + - 18.506782485909863 + - 18.506782487185667 + - 18.506782477523746 + - 18.506782477788896 + - 18.506782475780884 + - 18.50678247586374 + - 18.506782475236236 + - 18.506782475239472 + - 18.506782475214962 + - 18.50678247521597 + - 18.506782475208315 + - 18.506782475208315 +- !!python/tuple + - !!python/tuple + - 6.0 + - 12.0 + - 18.0 + - 30.0 + - 48.0 + - 54.0 + - 60.0 + - 66.0 + - 72.0 + - 114.0 + - 121.0 + - 128.0 + - 135.0 + - 142.0 + - 149.0 + - 156.0 + - 163.0 + - 172.0 + - 180.0 + - 188.0 + - 196.0 + - 204.0 + - 212.0 + - 292.0 + - 302.0 + - 311.0 + - 320.0 + - 329.0 + - 338.0 + - 347.0 + - 356.0 + - 428.0 + - 437.0 + - 446.0 + - 455.0 + - 464.0 + - 473.0 + - 482.0 + - 491.0 + - 529.0 + - 539.0 + - 659.0 + - 669.0 + - 679.0 + - 689.0 + - 699.0 + - 709.0 + - 719.0 + - 809.0 + - 819.0 + - 829.0 + - 839.0 + - 891.0 + - 902.0 + - 913.0 + - 924.0 + - 935.0 + - 946.0 + - 957.0 + - 968.0 + - 979.0 + - 990.0 + - 1001.0 + - 1012.0 + - 1023.0 + - 1034.0 + - 1045.0 + - 1056.0 + - 1067.0 + - 1078.0 + - 1089.0 + - 1100.0 + - 1111.0 + - 1122.0 + - 1221.0 + - 1232.0 + - 1276.0 + - 1287.0 + - 1309.0 + - 1320.0 + - 1331.0 + - 1342.0 + - 1375.0 + - 1386.0 + - 1397.0 + - 1408.0 + - 1419.0 + - 1430.0 + - 1441.0 + - 1512.0 + - 1524.0 + - 1548.0 + - 1560.0 + - 1608.0 + - 1620.0 + - 1632.0 + - 1644.0 + - 1656.0 + - 1668.0 + - 1728.0 + - 1740.0 + - 1752.0 + - 1764.0 + - 1824.0 + - 1836.0 + - 1884.0 + - 1896.0 + - 1956.0 + - 1968.0 + - 1980.0 + - 1992.0 + - 2004.0 + - 2016.0 + - 2100.0 + - 2112.0 + - 2124.0 + - 2136.0 + - 2184.0 + - 2196.0 + - 2208.0 + - 2220.0 + - 2244.0 + - 2256.0 + - 2268.0 + - 2280.0 + - 2352.0 + - 2364.0 + - 2376.0 + - 2388.0 + - 2402.0 + - 2415.0 + - 2428.0 + - 2441.0 + - 2454.0 + - 2467.0 + - 2480.0 + - 2493.0 + - 2506.0 + - 2519.0 + - 2532.0 + - 2545.0 + - 2558.0 + - 2571.0 + - 2584.0 + - 2597.0 + - 2610.0 + - 2623.0 + - 2636.0 + - 2649.0 + - 2662.0 + - 2675.0 + - 2688.0 + - 2701.0 + - 2714.0 + - 2727.0 + - 2740.0 + - 2753.0 + - 2766.0 + - 2779.0 + - 2792.0 + - 2805.0 + - 2818.0 + - 2831.0 + - 2844.0 + - 2857.0 + - 2870.0 + - 2883.0 + - 2896.0 + - 2909.0 + - 2922.0 + - 2935.0 + - 2948.0 + - 2961.0 + - 2974.0 + - 2987.0 + - 3000.0 + - 3013.0 + - 3026.0 + - 3039.0 + - 3052.0 + - 3221.0 + - 3234.0 + - 3247.0 + - 3260.0 + - 3273.0 + - 3286.0 + - 3299.0 + - 3312.0 + - 3416.0 + - 3429.0 + - 3442.0 + - 3455.0 + - 3468.0 + - 3481.0 + - 3494.0 + - 3507.0 + - 3520.0 + - 3533.0 + - 3546.0 + - 3559.0 + - 3572.0 + - 3585.0 + - 3598.0 + - 3715.0 + - 3728.0 + - 3741.0 + - 3754.0 + - 3767.0 + - 3780.0 + - 3793.0 + - 3806.0 + - 3819.0 + - 3832.0 + - 3845.0 + - 3858.0 + - 3873.0 + - 3887.0 + - 3901.0 + - 3915.0 + - 3929.0 + - 3943.0 + - 3957.0 + - 3971.0 + - 3985.0 + - 3999.0 + - 4013.0 + - 4027.0 + - 4041.0 + - 4055.0 + - 4069.0 + - 4251.0 + - 4265.0 + - 4335.0 + - 4349.0 + - 4363.0 + - 4405.0 + - 4419.0 + - 4433.0 + - 4475.0 + - 4489.0 + - 4517.0 + - 4531.0 + - 4545.0 + - 4587.0 + - 4601.0 + - 4615.0 + - 4629.0 + - 4643.0 + - 4657.0 + - 4699.0 + - 4713.0 + - 4727.0 + - 4769.0 + - 4783.0 + - 4797.0 + - 4811.0 + - 4825.0 + - 4923.0 + - 4937.0 + - 4951.0 + - 4965.0 + - 4979.0 + - 4993.0 + - 5007.0 + - 5021.0 + - 5147.0 + - 5161.0 + - 5189.0 + - 5203.0 + - 5217.0 + - 5231.0 + - 5301.0 + - 5315.0 + - 5329.0 + - 5343.0 + - 5357.0 + - 5371.0 + - 5385.0 + - 5399.0 + - 5483.0 + - 5497.0 + - 5511.0 + - 5539.0 + - 5553.0 + - 5567.0 + - 5581.0 + - 5595.0 + - 5609.0 + - 5623.0 + - 5637.0 + - 5651.0 + - 5665.0 + - 5679.0 + - 5693.0 + - 5833.0 + - 5847.0 + - 5861.0 + - 5875.0 + - 5889.0 + - 5903.0 + - 5917.0 + - 5931.0 + - 5945.0 + - 5959.0 + - 5973.0 + - 5987.0 + - 6001.0 + - 6171.0 + - 6186.0 + - 6201.0 + - 6216.0 + - 6231.0 + - 6246.0 + - 6261.0 + - 6276.0 + - 6291.0 + - 6306.0 + - 6321.0 + - 6336.0 + - 6351.0 + - 6366.0 + - 6381.0 + - 6396.0 + - 6411.0 + - 6426.0 + - 6441.0 + - 6456.0 + - 6471.0 + - 6486.0 + - 6501.0 + - 6516.0 + - 6531.0 + - 6546.0 + - 6561.0 + - 6576.0 + - 6591.0 + - 6606.0 + - 6621.0 + - 6636.0 + - 6651.0 + - 6666.0 + - 6681.0 + - 6696.0 + - 6951.0 + - 6966.0 + - 7041.0 + - 7056.0 + - 7071.0 + - 7086.0 + - 7101.0 + - 7116.0 + - 7131.0 + - 7296.0 + - 7311.0 + - 7386.0 + - 7401.0 + - 7416.0 + - 7431.0 + - 7446.0 + - 7461.0 + - 7476.0 + - 7491.0 + - 7506.0 + - 7686.0 + - 7701.0 + - 7761.0 + - 7776.0 + - 7851.0 + - 7866.0 + - 7881.0 + - 7896.0 + - 7911.0 + - 7971.0 + - 7986.0 + - 8046.0 + - 8061.0 + - 8091.0 + - 8106.0 + - 8181.0 + - 8196.0 + - 8226.0 + - 8241.0 + - 8271.0 + - 8286.0 + - 8316.0 + - 8331.0 + - 8391.0 + - 8406.0 + - 8481.0 + - 8496.0 + - 8511.0 + - 8526.0 + - 8601.0 + - 8616.0 + - 8646.0 + - 8661.0 + - 8676.0 + - 8691.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 52.40892200204887 + - 45.998253923157016 + - 38.405488854507865 + - 34.74757450273338 + - 32.446879329728624 + - 32.48657086779173 + - 30.19607369735305 + - 29.76216925948806 + - 29.03560093109357 + - 28.228223846559413 + - 27.850203565549805 + - 26.99713217145405 + - 26.352067784415325 + - 25.750552051214886 + - 24.99834135947684 + - 24.348799108122968 + - 23.93420591376357 + - 23.599415804283414 + - 23.56922910735042 + - 22.869522309245816 + - 22.814943992379764 + - 22.536420016726066 + - 22.339207892952178 + - 22.171128995532705 + - 22.01029946350065 + - 21.859681126663293 + - 21.593053735116932 + - 21.513058648056596 + - 21.375649209707195 + - 21.320054637182352 + - 21.05207131113096 + - 20.761918199176925 + - 20.6636846561534 + - 20.272153001196187 + - 20.239559065940114 + - 20.114516044907422 + - 20.04828383182252 + - 19.924086676690273 + - 19.87074167903727 + - 19.81113201847169 + - 19.8032886525805 + - 19.800884549002266 + - 19.796889503213876 + - 19.795662905786553 + - 19.79360414702941 + - 19.791483759485963 + - 19.790222967072943 + - 19.78971555166209 + - 19.7888571167154 + - 19.78796925902098 + - 19.787440406371378 + - 19.786895696756012 + - 19.78643491664649 + - 19.785856061108106 + - 19.78507746586745 + - 19.784498812715476 + - 19.783720425287115 + - 19.783143353678373 + - 19.782367017213982 + - 19.78179286705642 + - 19.781020373115545 + - 19.780450433753973 + - 19.779683507301744 + - 19.77911900749858 + - 19.778359293596676 + - 19.777801392921603 + - 19.777050445262642 + - 19.77340390505142 + - 19.7689261344024 + - 19.760243358311286 + - 19.749172597264305 + - 19.70798988422517 + - 19.669252148112058 + - 19.641396619867383 + - 19.60845105715932 + - 19.599174225144115 + - 19.58766940678714 + - 19.577603987412314 + - 19.564641660886906 + - 19.53754320039234 + - 19.506674205529475 + - 19.491719007952675 + - 19.473304354170317 + - 19.46322275866054 + - 19.450208288311305 + - 19.434626388214443 + - 19.425680347117503 + - 19.414546846656037 + - 19.41029240789675 + - 19.404526379181295 + - 19.396019347860634 + - 19.38883406333271 + - 19.38762851783089 + - 19.385111516612078 + - 19.381463495535826 + - 19.376419643225375 + - 19.366762950287466 + - 19.358782987788665 + - 19.3578004512191 + - 19.3555013041117 + - 19.354877100473633 + - 19.353583041716465 + - 19.353075556707605 + - 19.352795734619598 + - 19.352474641471343 + - 19.352199770528273 + - 19.352181732856973 + - 19.352157024317922 + - 19.35211764317374 + - 19.35209844405778 + - 19.35206783401495 + - 19.352052739825513 + - 19.352046710366267 + - 19.352037103007152 + - 19.35203242324534 + - 19.35202496369719 + - 19.352021527508274 + - 19.352013141850396 + - 19.352001367907977 + - 19.351982636639878 + - 19.35195520390508 + - 19.35192963830276 + - 19.351922704845187 + - 19.351908074278864 + - 19.351905978386633 + - 19.351900856693245 + - 19.351893672660903 + - 19.351882226722616 + - 19.351841816841997 + - 19.351806848753835 + - 19.351697964226034 + - 19.35159123364341 + - 19.351413052971917 + - 19.351145038503304 + - 19.350843394734426 + - 19.35039156457843 + - 19.349886135107806 + - 19.34913399184882 + - 19.34830051273068 + - 19.347993780019706 + - 19.347600326317675 + - 19.343943184087014 + - 19.338762432234702 + - 19.332519131759504 + - 19.324001043547145 + - 19.321589607798742 + - 19.316786725557506 + - 19.310344260738546 + - 19.30222608523073 + - 19.29451891368477 + - 19.285122931941796 + - 19.276022734593596 + - 19.26490324431696 + - 19.251138027828034 + - 19.228827505771562 + - 19.221073670902786 + - 19.207818247242756 + - 19.200591083036212 + - 19.188287869206203 + - 19.182013300721138 + - 19.17012651935337 + - 19.16536526240105 + - 19.152114611602915 + - 19.1291290650967 + - 19.12721492562757 + - 19.111608996250837 + - 19.111493511656672 + - 19.11488699035347 + - 19.060238293562385 + - 19.009499091449516 + - 19.006237350446554 + - 18.979460647934857 + - 18.978520975113575 + - 18.978738708617552 + - 18.957580713560954 + - 18.964292097642378 + - 18.938978922785186 + - 18.940607775730474 + - 18.922913818344362 + - 18.908576664114722 + - 18.908469100753926 + - 18.887791010780894 + - 18.875772530922074 + - 18.87946616242649 + - 18.85957562332658 + - 18.848064835848003 + - 18.84979182037034 + - 18.852223312499042 + - 18.845956346736262 + - 18.846113186974822 + - 18.844036565358866 + - 18.840103851170685 + - 18.840122590092587 + - 18.837835032216052 + - 18.833694955769516 + - 18.833558318299282 + - 18.831205111579443 + - 18.827070344309142 + - 18.830033343595236 + - 18.824028789166707 + - 18.823619494296523 + - 18.821731481345026 + - 18.822716450207896 + - 18.820566120359814 + - 18.821037004530336 + - 18.82004971643885 + - 18.819549909478482 + - 18.820044340431156 + - 18.818919633139895 + - 18.819153309914253 + - 18.81864750230143 + - 18.818390370316816 + - 18.818633011153093 + - 18.81806844490684 + - 18.816678445244627 + - 18.814634331187218 + - 18.81095778810285 + - 18.805765967493976 + - 18.797287394620213 + - 18.785958108773954 + - 18.770120248926972 + - 18.749356925873087 + - 18.612336633585638 + - 18.573381637255338 + - 18.562763361467443 + - 18.53452324958955 + - 18.542416952006683 + - 18.509875924474855 + - 18.52268984713614 + - 18.515910627938432 + - 18.521659646458428 + - 18.519115093524682 + - 18.519901304810144 + - 18.52108266241462 + - 18.5218372854356 + - 18.52124595844225 + - 18.52147892402543 + - 18.52195931815647 + - 18.521664900204314 + - 18.520889400511848 + - 18.52117742981985 + - 18.521790741400057 + - 18.522177675665098 + - 18.521894522745065 + - 18.521990925975157 + - 18.521813008591952 + - 18.5221454921004 + - 18.521677581242933 + - 18.52181312242185 + - 18.521567569297474 + - 18.521815764948595 + - 18.521971436180703 + - 18.521757001839124 + - 18.52183750343654 + - 18.52178981148364 + - 18.52184015818428 + - 18.521824483828436 + - 18.52183978099908 + - 18.521828796284282 + - 18.521849021502568 + - 18.521837049474467 + - 18.52184967963332 + - 18.521842204643068 + - 18.521850090040083 + - 18.521847195382623 + - 18.521848151167237 + - 18.521851071911684 + - 18.521849343690263 + - 18.521851166545165 + - 18.521849853771506 + - 18.52185031016417 + - 18.521850423079094 + - 18.521850200828396 + - 18.521850274208692 + - 18.521850803207172 + - 18.52185049018064 + - 18.521850820359855 + - 18.521850624981127 + - 18.52185034890419 + - 18.521850571758552 + - 18.521850626865934 + - 18.521850905435798 + - 18.521850740597362 + - 18.521850914466896 + - 18.521850789247154 + - 18.52185083057994 + - 18.521850749226893 + - 18.52185089934718 + - 18.52185081051614 + - 18.52185090421403 + - 18.521850848769862 + - 18.521850907251796 + - 18.521850865120026 + - 18.521850918253723 + - 18.521850886812707 + - 18.521850919976362 + - 18.52185090035229 + - 18.52185092105157 + - 18.52185092617222 + - 18.521850916091932 + - 18.521850934698627 + - 18.521850923688415 + - 18.521850935301874 + - 18.521850928429796 + - 18.52185093567839 + - 18.521850930455543 + - 18.521850858904067 + - 18.52185083430005 + - 18.521850491847495 + - 18.521850374090672 + - 18.521848735112364 + - 18.52184817153853 + - 18.521840328163712 + - 18.52183763140537 + - 18.521800114512086 + - 18.521787220690964 + - 18.52160817353675 + - 18.521546762629136 + - 18.520701394597385 + - 18.52041415302945 + - 18.516614333142783 + - 18.515373070525232 + - 18.51437247503386 + - 18.502451860657974 + - 18.499481550810973 + - 18.495143603379276 + - 18.490740275162366 + - 18.487639496376392 + - 18.469169388818713 + - 18.46507750309161 + - 18.457581282346677 + - 18.457423310339564 + - 18.45028957127421 + - 18.452190362421234 + - 18.44623125828891 + - 18.44886497533512 + - 18.44502786443492 + - 18.44732669147727 + - 18.444953990393504 + - 18.44654747166235 + - 18.445329715306947 + - 18.446437043847226 + - 18.44602926969775 + - 18.446438359125114 + - 18.446511396654824 + - 18.44646784158899 + - 18.446512373086094 + - 18.44648587104811 + - 18.446512986310687 + - 18.44649686903286 + - 18.44651336628939 + - 18.446507291952003 + - 18.446513512242692 + - 18.446514605439752 + - 18.446513956373774 + - 18.44651462122079 + - 18.446514226491743 + - 18.446514630822225 + - 18.446514390769902 + - 18.44651463666285 + - 18.446514490677025 + - 18.44651464021535 + - 18.446514594958206 + - 18.44651464131687 + - 18.446514627174015 + - 18.446514641661118 + - 18.446514644206587 + - 18.44651464199677 + - 18.44651464454224 + - 18.44651464233242 + - 18.446514644877894 + - 18.44651464418732 + - 18.446514644982784 + - 18.446514644766985 + - 18.446514645015565 + - 18.446514644907662 + - 18.44651464503195 + - 18.446514645015096 + - 18.44651464503451 + - 18.446514645026085 + - 18.446514645035794 + - 18.44651464503158 + - 18.44651464503643 + - 18.446514645034327 + - 18.44651464503675 + - 18.446514645036096 + - 18.44651464503685 + - 18.446514645036746 + - 18.44651464503687 + - 18.446514645036768 + - 18.446514645036885 + - 18.44651464503687 + - 18.446514645036885 + - 18.44651464503688 + - 18.446514645036885 + - 18.44651464503688 + - 18.446514645036885 + - 18.446514645036885 +- !!python/tuple + - !!python/tuple + - 114.0 + - 228.0 + - 342.0 + - 456.0 + - 570.0 + - 684.0 + - 798.0 + - 1596.0 + - 1710.0 + - 1824.0 + - 1938.0 + - 2052.0 + - 2166.0 + - 2280.0 + - 2394.0 + - 2508.0 + - 4218.0 + - 4332.0 + - 4446.0 + - 5358.0 + - 5928.0 + - 6042.0 + - 6498.0 + - 7296.0 + - 8094.0 + - 8892.0 + - 9006.0 + - 9120.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.52211403526881 + - 44.634978342893604 + - 28.939098039124364 + - 24.01945119984696 + - 21.21733923753959 + - 20.51261988925829 + - 19.23794755781888 + - 18.90027520976452 + - 18.509419800773205 + - 18.21296148724211 + - 18.154052227523877 + - 18.145865139178053 + - 18.144056792353503 + - 18.136436156343592 + - 18.139632285641227 + - 18.142115719231192 + - 18.139580735675146 + - 18.140461504093185 + - 18.140661232580396 + - 18.140623116581256 + - 18.140637308961605 + - 18.140647070743388 + - 18.140647452022975 + - 18.140647466916654 + - 18.140647466206488 + - 18.140647466470597 + - 18.140647466734706 + - 18.140647466734706 +- !!python/tuple + - !!python/tuple + - 59.0 + - 118.0 + - 177.0 + - 236.0 + - 472.0 + - 531.0 + - 590.0 + - 649.0 + - 708.0 + - 767.0 + - 826.0 + - 885.0 + - 944.0 + - 1003.0 + - 1062.0 + - 1121.0 + - 1180.0 + - 1239.0 + - 2065.0 + - 2124.0 + - 2183.0 + - 2242.0 + - 2301.0 + - 2655.0 + - 2714.0 + - 2773.0 + - 3068.0 + - 3186.0 + - 3245.0 + - 3481.0 + - 3540.0 + - 3599.0 + - 3953.0 + - 4012.0 + - 4071.0 + - 4130.0 + - 4189.0 + - 4248.0 + - 4838.0 + - 4897.0 + - 4956.0 + - 5015.0 + - 5074.0 + - 5605.0 + - 5664.0 + - 5723.0 + - 5841.0 + - 5900.0 + - 6136.0 + - 6195.0 + - 6431.0 + - 6490.0 + - 6726.0 + - 6785.0 + - 7080.0 + - 7139.0 + - 7198.0 + - 7257.0 + - 7552.0 + - 7611.0 + - 7670.0 + - 7729.0 + - 8024.0 + - 8083.0 + - 8201.0 + - 8260.0 + - 8319.0 + - 8378.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.831478379365635 + - 44.610858001917975 + - 28.58737736618809 + - 25.189320109496656 + - 23.834933638879008 + - 21.805518039763044 + - 21.150914893303465 + - 20.159807430019246 + - 19.290147442035074 + - 18.80902288428333 + - 18.45341463693065 + - 18.24228188982522 + - 18.042969090189832 + - 17.98154125462571 + - 17.946947205914718 + - 17.957573131832145 + - 17.958627685202966 + - 17.96016670372599 + - 17.968479463073162 + - 17.964944055278075 + - 17.96535985788638 + - 17.966280161437833 + - 17.96678890500794 + - 17.96632872953164 + - 17.966640274161936 + - 17.966795244272276 + - 17.966964171663843 + - 17.966919910573864 + - 17.966943864378035 + - 17.966946906394316 + - 17.966956688667146 + - 17.966961359210263 + - 17.96696195067654 + - 17.96696386121788 + - 17.966966511722944 + - 17.966965811684 + - 17.966966418909497 + - 17.9669664758935 + - 17.966966443136986 + - 17.966966471548755 + - 17.96696645521657 + - 17.966966469382406 + - 17.96696647286043 + - 17.966966469767875 + - 17.9669664732459 + - 17.96696647169962 + - 17.966966473438635 + - 17.96696647295542 + - 17.966966473498864 + - 17.96696647334786 + - 17.966966473517683 + - 17.966966473470492 + - 17.966966473523566 + - 17.96696647351619 + - 17.966966473524487 + - 17.966966473517115 + - 17.966966473525407 + - 17.966966473524252 + - 17.96696647352555 + - 17.966966473524398 + - 17.96696647352569 + - 17.96696647352551 + - 17.966966473525712 + - 17.966966473525623 + - 17.96696647352573 + - 17.966966473525634 + - 17.966966473525737 + - 17.966966473525737 +- !!python/tuple + - !!python/tuple + - 102.0 + - 204.0 + - 306.0 + - 408.0 + - 816.0 + - 918.0 + - 1020.0 + - 1122.0 + - 1224.0 + - 1326.0 + - 2040.0 + - 2142.0 + - 2244.0 + - 2346.0 + - 2448.0 + - 2550.0 + - 3672.0 + - 3774.0 + - 3876.0 + - 3978.0 + - 4590.0 + - 4692.0 + - 4794.0 + - 5508.0 + - 5814.0 + - 5916.0 + - 6324.0 + - 6426.0 + - 6528.0 + - 6630.0 + - 6732.0 + - 6834.0 + - 6936.0 + - 7548.0 + - 7650.0 + - 7752.0 + - 7854.0 + - 7956.0 + - 8058.0 + - 8670.0 + - 8772.0 + - 8874.0 + - 8976.0 + - 9078.0 + - 9180.0 + - 9282.0 + - 9384.0 + - 9486.0 + - 9588.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.92903224923593 + - 44.04579960708142 + - 30.768331554574065 + - 27.3516539729615 + - 25.357701793084043 + - 23.88158658535813 + - 21.410593173610376 + - 20.280728177956483 + - 19.574303933041904 + - 18.778427472693444 + - 18.506718814553185 + - 18.437871564273276 + - 18.215022458467097 + - 18.13342098073323 + - 18.163243875558113 + - 18.17543257417943 + - 18.16933940482751 + - 18.173941131374097 + - 18.171075787314525 + - 18.17271842305726 + - 18.17150706779659 + - 18.172225225850642 + - 18.172375036398215 + - 18.172303711974294 + - 18.172327323116054 + - 18.172338947860275 + - 18.17232216729725 + - 18.17233371461493 + - 18.17231706526839 + - 18.17232850806369 + - 18.172315462387203 + - 18.17231979572689 + - 18.172322068877374 + - 18.1723187888261 + - 18.172321046417146 + - 18.172318470001247 + - 18.17231042961295 + - 18.172315946877152 + - 18.172315096616025 + - 18.17231537923365 + - 18.172314971647882 + - 18.17231525212036 + - 18.17231484763952 + - 18.17231512596713 + - 18.172314724590557 + - 18.17231500077393 + - 18.172314685630234 + - 18.172314790379932 + - 18.172314790379932 +- !!python/tuple + - !!python/tuple + - 95.0 + - 190.0 + - 285.0 + - 380.0 + - 760.0 + - 855.0 + - 950.0 + - 1520.0 + - 1615.0 + - 1710.0 + - 1805.0 + - 1900.0 + - 1995.0 + - 2090.0 + - 3325.0 + - 3420.0 + - 3515.0 + - 3610.0 + - 3705.0 + - 3800.0 + - 3895.0 + - 3990.0 + - 4085.0 + - 4180.0 + - 4275.0 + - 5985.0 + - 6080.0 + - 6270.0 + - 6365.0 + - 6460.0 + - 6555.0 + - 6650.0 + - 6745.0 + - 6840.0 + - 6935.0 + - 7030.0 + - 7125.0 + - 7220.0 + - 7315.0 + - 7410.0 + - 7505.0 + - 8645.0 + - 8740.0 + - 8835.0 + - 8930.0 + - 9025.0 + - 9120.0 + - 9690.0 + - 9785.0 + - 9880.0 + - 9975.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.402039731659336 + - 44.418494358297224 + - 28.83866693212967 + - 25.254067022565604 + - 21.936675926099834 + - 20.358335580526827 + - 19.216119278192494 + - 18.41579632255334 + - 18.098085035080835 + - 18.10454051199116 + - 18.015428834111418 + - 17.995800501693257 + - 17.984227894656886 + - 17.97775034839794 + - 17.984376555209643 + - 17.98088208707136 + - 17.984249112164996 + - 17.982709771560938 + - 17.984614590773912 + - 17.983180725408076 + - 17.984211896740106 + - 17.98360958684306 + - 17.98469643804304 + - 17.984223069197203 + - 17.984239024841408 + - 17.98423213349283 + - 17.98422353335593 + - 17.984236454117426 + - 17.984228720830767 + - 17.984240337227376 + - 17.984233393247862 + - 17.984243822377717 + - 17.984237595039406 + - 17.984246946543045 + - 17.984241368214054 + - 17.98424974406239 + - 17.98424475216504 + - 17.98425224664932 + - 17.984247783575984 + - 17.984254483451288 + - 17.98425191575057 + - 17.98425577042536 + - 17.9842534770086 + - 17.98425691974661 + - 17.984254872163632 + - 17.984257945729695 + - 17.984256691599853 + - 17.98425857414626 + - 17.984257454987652 + - 17.98425913488952 + - 17.98425913488952 +- !!python/tuple + - !!python/tuple + - 75.0 + - 150.0 + - 225.0 + - 300.0 + - 600.0 + - 675.0 + - 750.0 + - 825.0 + - 900.0 + - 975.0 + - 1050.0 + - 1125.0 + - 1200.0 + - 1275.0 + - 1350.0 + - 2325.0 + - 2400.0 + - 2475.0 + - 2550.0 + - 2625.0 + - 3300.0 + - 3375.0 + - 3450.0 + - 3525.0 + - 3600.0 + - 3675.0 + - 3750.0 + - 4725.0 + - 4800.0 + - 4875.0 + - 4950.0 + - 5025.0 + - 5100.0 + - 5175.0 + - 6375.0 + - 6450.0 + - 6525.0 + - 6600.0 + - 7275.0 + - 7350.0 + - 7425.0 + - 7500.0 + - 7575.0 + - 8175.0 + - 8250.0 + - 8325.0 + - 8400.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.27156578550831 + - 42.9764571240219 + - 27.961823394464023 + - 24.25841470131543 + - 20.833797758688625 + - 19.85136145023612 + - 19.267391821330698 + - 18.429932237099642 + - 17.929980469814954 + - 17.817401640165002 + - 17.752363046381266 + - 17.745343188519236 + - 18.335258135246484 + - 17.736972379716374 + - 17.738932925972005 + - 17.736647138264527 + - 17.738063150192083 + - 17.736478352209616 + - 17.736761835028286 + - 17.736802883642145 + - 17.736683149435624 + - 17.73670798146185 + - 17.736636730173153 + - 17.736651606496125 + - 17.736609333204434 + - 17.73661819464701 + - 17.736618600615323 + - 17.736617452748295 + - 17.73661769424841 + - 17.736617011517886 + - 17.73661715516701 + - 17.736616749102684 + - 17.736616834543444 + - 17.736616832559637 + - 17.73661683297707 + - 17.73661683179714 + - 17.736616832045414 + - 17.736616832057237 + - 17.736616832023827 + - 17.736616832030858 + - 17.736616832010984 + - 17.736616832015166 + - 17.736616832012803 + - 17.736616832013304 + - 17.736616832011894 + - 17.736616832012192 + - 17.736616832012192 +- !!python/tuple + - !!python/tuple + - 78.0 + - 156.0 + - 234.0 + - 312.0 + - 390.0 + - 468.0 + - 546.0 + - 1014.0 + - 1092.0 + - 1170.0 + - 1248.0 + - 1326.0 + - 1404.0 + - 1482.0 + - 1560.0 + - 1638.0 + - 1716.0 + - 1794.0 + - 1872.0 + - 1950.0 + - 2028.0 + - 3276.0 + - 3354.0 + - 3432.0 + - 3978.0 + - 4368.0 + - 4446.0 + - 4524.0 + - 4602.0 + - 4680.0 + - 4758.0 + - 4836.0 + - 4914.0 + - 4992.0 + - 5070.0 + - 5148.0 + - 5226.0 + - 5304.0 + - 5382.0 + - 5460.0 + - 7020.0 + - 7098.0 + - 7176.0 + - 7254.0 + - 7332.0 + - 7410.0 + - 7488.0 + - 7566.0 + - 7644.0 + - 7722.0 + - 7800.0 + - 9126.0 + - 9204.0 + - 9828.0 + - 9906.0 + - 9984.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.56621753596579 + - 44.08643251131503 + - 29.637657613456785 + - 25.212055526462397 + - 24.118642130029393 + - 22.99515107327406 + - 21.053224431591556 + - 19.707091704906915 + - 19.51842999474983 + - 18.986959418105187 + - 18.81175971757189 + - 18.30515916693578 + - 18.212636064510065 + - 18.204855478404582 + - 18.19167170789038 + - 18.19456245978692 + - 18.188872438669396 + - 18.192588697296088 + - 18.1898498197532 + - 18.189488696794037 + - 18.187284281136748 + - 18.188475688413327 + - 18.187776642856353 + - 18.187752483745886 + - 18.187738650192674 + - 18.18774292747647 + - 18.187732586640266 + - 18.187735785485906 + - 18.18772806755451 + - 18.18773045586191 + - 18.18772470222902 + - 18.187726483149426 + - 18.187722197583287 + - 18.187723524350574 + - 18.187720334318023 + - 18.18772132206185 + - 18.18771894864285 + - 18.187719683613917 + - 18.187717918391844 + - 18.187717878088048 + - 18.187717890569544 + - 18.18771786059413 + - 18.18771786987709 + - 18.187717847583382 + - 18.18771785448744 + - 18.18771783790692 + - 18.187717843041675 + - 18.187717830710266 + - 18.18771783452914 + - 18.187717825357932 + - 18.187717825545782 + - 18.187717825170424 + - 18.187717825163094 + - 18.18771782516536 + - 18.187717825159908 + - 18.187717825159908 +- !!python/tuple + - !!python/tuple + - 73.0 + - 146.0 + - 219.0 + - 292.0 + - 584.0 + - 657.0 + - 949.0 + - 1022.0 + - 1095.0 + - 1168.0 + - 1241.0 + - 1314.0 + - 1387.0 + - 1460.0 + - 1533.0 + - 1606.0 + - 1679.0 + - 1752.0 + - 1825.0 + - 1898.0 + - 1971.0 + - 2044.0 + - 2117.0 + - 2190.0 + - 2263.0 + - 2336.0 + - 2409.0 + - 2482.0 + - 2555.0 + - 2628.0 + - 2701.0 + - 2774.0 + - 2847.0 + - 2920.0 + - 2993.0 + - 3066.0 + - 3139.0 + - 3212.0 + - 3285.0 + - 3358.0 + - 3431.0 + - 3504.0 + - 3577.0 + - 3650.0 + - 3723.0 + - 3796.0 + - 3869.0 + - 3942.0 + - 4015.0 + - 4088.0 + - 4161.0 + - 4234.0 + - 4307.0 + - 4380.0 + - 4453.0 + - 4526.0 + - 4599.0 + - 4672.0 + - 4745.0 + - 4818.0 + - 4891.0 + - 4964.0 + - 5037.0 + - 5110.0 + - 5183.0 + - 5256.0 + - 5329.0 + - 5402.0 + - 5475.0 + - 5548.0 + - 5621.0 + - 5694.0 + - 5767.0 + - 5840.0 + - 5913.0 + - 5986.0 + - 6059.0 + - 6132.0 + - 6205.0 + - 6278.0 + - 6351.0 + - 6424.0 + - 6497.0 + - 6570.0 + - 6643.0 + - 6716.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 55.681496217019266 + - 48.23331941109421 + - 31.213068977396716 + - 27.282133879365805 + - 25.044859503452226 + - 22.94984866070614 + - 22.08041468900567 + - 21.36590804109186 + - 20.38269187221371 + - 20.000221682601165 + - 19.367405749508386 + - 19.281279168868206 + - 19.05262833350224 + - 19.01900139054402 + - 18.959141525836607 + - 18.92402395368753 + - 18.905793493142422 + - 18.862974540115125 + - 18.86687851317032 + - 18.862133975064538 + - 18.862777403501237 + - 18.86234196546132 + - 18.862355703420555 + - 18.862590120483905 + - 18.862508900958495 + - 18.86271204100058 + - 18.86266191232123 + - 18.86281177452961 + - 18.86278514797998 + - 18.862891845635712 + - 18.862878021622688 + - 18.862952426084345 + - 18.8629451864913 + - 18.862996325374944 + - 18.862992442934775 + - 18.86302724193603 + - 18.863025092132673 + - 18.86304861238357 + - 18.86304737953574 + - 18.86306320441964 + - 18.86306247313775 + - 18.86307308803483 + - 18.863072641236254 + - 18.86307974693499 + - 18.863079467295787 + - 18.86308421744768 + - 18.863084039158192 + - 18.863087211751022 + - 18.86308709651761 + - 18.863089214188427 + - 18.863089138980424 + - 18.8630905519322 + - 18.86309050251157 + - 18.863091445007257 + - 18.863091412379347 + - 18.863092040949105 + - 18.86309201933895 + - 18.8630924384949 + - 18.86309242415107 + - 18.863092703639047 + - 18.863092694104413 + - 18.86309288045361 + - 18.863092874109554 + - 18.863092998353867 + - 18.86309299412996 + - 18.863093076965225 + - 18.863093074151696 + - 18.863093129378143 + - 18.863093127503518 + - 18.863093164322727 + - 18.86309316307344 + - 18.863093187620454 + - 18.86309318678779 + - 18.863093203152975 + - 18.863093202597952 + - 18.863093213508378 + - 18.8630932131384 + - 18.863093220412203 + - 18.86309322016557 + - 18.86309322501489 + - 18.863093224850466 + - 18.86309322808343 + - 18.863093227973813 + - 18.86309323012917 + - 18.863093230056094 + - 18.863093230056094 +- !!python/tuple + - !!python/tuple + - 61.0 + - 122.0 + - 183.0 + - 244.0 + - 305.0 + - 366.0 + - 427.0 + - 488.0 + - 549.0 + - 610.0 + - 671.0 + - 732.0 + - 793.0 + - 854.0 + - 915.0 + - 976.0 + - 1037.0 + - 1098.0 + - 1159.0 + - 1220.0 + - 2074.0 + - 2135.0 + - 2196.0 + - 2257.0 + - 2318.0 + - 2379.0 + - 2440.0 + - 2806.0 + - 2867.0 + - 2928.0 + - 2989.0 + - 3233.0 + - 3294.0 + - 3355.0 + - 3599.0 + - 3660.0 + - 3782.0 + - 3843.0 + - 4087.0 + - 4148.0 + - 4209.0 + - 4270.0 + - 4331.0 + - 4392.0 + - 4697.0 + - 4758.0 + - 4819.0 + - 4880.0 + - 5246.0 + - 5368.0 + - 5429.0 + - 5612.0 + - 5673.0 + - 5734.0 + - 5795.0 + - 5856.0 + - 6161.0 + - 6222.0 + - 6527.0 + - 6588.0 + - 6649.0 + - 6832.0 + - 6893.0 + - 7076.0 + - 7137.0 + - 7564.0 + - 7625.0 + - 7686.0 + - 7747.0 + - 7808.0 + - 7869.0 + - 8113.0 + - 8174.0 + - 8418.0 + - 8479.0 + - 8540.0 + - 8601.0 + - 8662.0 + - 8723.0 + - 8784.0 + - 9272.0 + - 9333.0 + - 9394.0 + - 9455.0 + - 9516.0 + - 9577.0 + - 9638.0 + - 9699.0 + - 9760.0 + - 9821.0 + - 9882.0 + - 9943.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.063777893736635 + - 43.20150477779864 + - 28.92926172520723 + - 27.327085301110287 + - 25.185782064561227 + - 24.092737167444728 + - 22.996099330201037 + - 21.122659372464977 + - 19.616189849353333 + - 19.20475681475291 + - 18.699696931733445 + - 17.88870534211233 + - 17.808845854235102 + - 17.782366380855496 + - 17.76955606105867 + - 17.753385764913524 + - 17.759912365455456 + - 17.757221157140908 + - 17.75883731724715 + - 17.760328364503856 + - 17.76068671885371 + - 17.76056241167869 + - 17.76029286177676 + - 17.761641474490915 + - 17.761826980270236 + - 17.76179183545731 + - 17.76130092011113 + - 17.761661829057868 + - 17.762170556746785 + - 17.762064344487715 + - 17.76206149177836 + - 17.762030450840772 + - 17.762227985977756 + - 17.7622410857109 + - 17.762193083964675 + - 17.762177110159087 + - 17.76217688638507 + - 17.762182232606428 + - 17.76218217761103 + - 17.762180032789693 + - 17.76219417719883 + - 17.76219194174962 + - 17.762191917577752 + - 17.762200452746136 + - 17.76219925152712 + - 17.762206497991038 + - 17.76220544215708 + - 17.762204023709906 + - 17.76220479034059 + - 17.76220478798928 + - 17.762205309781187 + - 17.762205231454196 + - 17.76220572901179 + - 17.76220578743019 + - 17.76220551275736 + - 17.762205716601056 + - 17.76220568462819 + - 17.76220568452463 + - 17.76220571637589 + - 17.762205711353715 + - 17.762205731260813 + - 17.76220573362406 + - 17.762205730857264 + - 17.76220574329921 + - 17.76220574319113 + - 17.762205743190044 + - 17.76220574313463 + - 17.762205743502946 + - 17.7622057434449 + - 17.76220574344431 + - 17.762205743824005 + - 17.76220574376434 + - 17.76220574376395 + - 17.762205743744236 + - 17.76220574387523 + - 17.762205743854594 + - 17.762205743854384 + - 17.76220574384375 + - 17.762205743843637 + - 17.762205743858125 + - 17.762205743855844 + - 17.762205743870975 + - 17.76220574386859 + - 17.762205743884405 + - 17.762205743881914 + - 17.762205743898427 + - 17.76220574389583 + - 17.762205743913068 + - 17.762205743910357 + - 17.762205743910332 + - 17.762205743908936 + - 17.762205743908936 +problem_name: SAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0083 + - 0.0166 + - 0.0249 + - 0.0415 + - 0.0664 + - 0.0747 + - 0.083 + - 0.0913 + - 0.1328 + - 0.1411 + - 0.1494 + - 0.1577 + - 0.2158 + - 0.2241 + - 0.2324 + - 0.2407 + - 0.249 + - 0.2573 + - 0.2656 + - 0.2739 + - 0.2822 + - 0.2905 + - 0.2988 + - 0.3071 + - 0.3154 + - 0.3237 + - 0.332 + - 0.3403 + - 0.3486 + - 0.5146 + - 0.5229 + - 0.5561 + - 0.5644 + - 0.5976 + - 0.6059 + - 0.6142 + - 0.6225 + - 0.7221 + - 0.7304 + - 0.7387 + - 0.747 + - 0.8051 + - 0.8134 + - 0.8466 + - 0.8549 + - 0.913 + - 0.9213 + - 0.9545 + - 0.9628 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9287294621883236 + - 0.7539460139464402 + - 0.5386867826321974 + - 0.4198256507125822 + - 0.2774838215798575 + - 0.18898256799545055 + - 0.17874618607554868 + - 0.1184025765164517 + - 0.10395468501827562 + - 0.05221268688742128 + - 0.044059259346576556 + - 0.023329273571180923 + - 0.01329027451686757 + - 0.011781308735246179 + - 0.005698494081915748 + - 0.00616831593372712 + - 0.005822680206011009 + - 0.005135308649362654 + - 0.005147269754142751 + - 0.004854952833406913 + - 0.004864468963006002 + - 0.004735155935553704 + - 0.004734132898981567 + - 0.004683013742189938 + - 0.004683902569870132 + - 0.004660942207712378 + - 0.004661976467389544 + - 0.00465163589384364 + - 0.004651869729514295 + - 0.004649999811781943 + - 0.00465007569728858 + - 0.004649491292248493 + - 0.004649515281097776 + - 0.00464933264916183 + - 0.004649343959339955 + - 0.00464925818329806 + - 0.004649258256891434 + - 0.004649257699546022 + - 0.00464925773412737 + - 0.004649257472235921 + - 0.004649257479422943 + - 0.004649257424994734 + - 0.0046492574272406 + - 0.004649257410231743 + - 0.004649257410319471 + - 0.00464925740965511 + - 0.004649257409682458 + - 0.004649257409474935 + - 0.004649257409474935 +- !!python/tuple + - !!python/tuple + - 0.0006 + - 0.0012 + - 0.0018 + - 0.003 + - 0.0048 + - 0.0054 + - 0.006 + - 0.0066 + - 0.0072 + - 0.0114 + - 0.0121 + - 0.0128 + - 0.0135 + - 0.0142 + - 0.0149 + - 0.0156 + - 0.0163 + - 0.0172 + - 0.018 + - 0.0188 + - 0.0196 + - 0.0204 + - 0.0212 + - 0.0292 + - 0.0302 + - 0.0311 + - 0.032 + - 0.0329 + - 0.0338 + - 0.0347 + - 0.0356 + - 0.0428 + - 0.0437 + - 0.0446 + - 0.0455 + - 0.0464 + - 0.0473 + - 0.0482 + - 0.0491 + - 0.0529 + - 0.0539 + - 0.0659 + - 0.0669 + - 0.0679 + - 0.0689 + - 0.0699 + - 0.0709 + - 0.0719 + - 0.0809 + - 0.0819 + - 0.0829 + - 0.0839 + - 0.0891 + - 0.0902 + - 0.0913 + - 0.0924 + - 0.0935 + - 0.0946 + - 0.0957 + - 0.0968 + - 0.0979 + - 0.099 + - 0.1001 + - 0.1012 + - 0.1023 + - 0.1034 + - 0.1045 + - 0.1056 + - 0.1067 + - 0.1078 + - 0.1089 + - 0.11 + - 0.1111 + - 0.1122 + - 0.1221 + - 0.1232 + - 0.1276 + - 0.1287 + - 0.1309 + - 0.132 + - 0.1331 + - 0.1342 + - 0.1375 + - 0.1386 + - 0.1397 + - 0.1408 + - 0.1419 + - 0.143 + - 0.1441 + - 0.1512 + - 0.1524 + - 0.1548 + - 0.156 + - 0.1608 + - 0.162 + - 0.1632 + - 0.1644 + - 0.1656 + - 0.1668 + - 0.1728 + - 0.174 + - 0.1752 + - 0.1764 + - 0.1824 + - 0.1836 + - 0.1884 + - 0.1896 + - 0.1956 + - 0.1968 + - 0.198 + - 0.1992 + - 0.2004 + - 0.2016 + - 0.21 + - 0.2112 + - 0.2124 + - 0.2136 + - 0.2184 + - 0.2196 + - 0.2208 + - 0.222 + - 0.2244 + - 0.2256 + - 0.2268 + - 0.228 + - 0.2352 + - 0.2364 + - 0.2376 + - 0.2388 + - 0.2402 + - 0.2415 + - 0.2428 + - 0.2441 + - 0.2454 + - 0.2467 + - 0.248 + - 0.2493 + - 0.2506 + - 0.2519 + - 0.2532 + - 0.2545 + - 0.2558 + - 0.2571 + - 0.2584 + - 0.2597 + - 0.261 + - 0.2623 + - 0.2636 + - 0.2649 + - 0.2662 + - 0.2675 + - 0.2688 + - 0.2701 + - 0.2714 + - 0.2727 + - 0.274 + - 0.2753 + - 0.2766 + - 0.2779 + - 0.2792 + - 0.2805 + - 0.2818 + - 0.2831 + - 0.2844 + - 0.2857 + - 0.287 + - 0.2883 + - 0.2896 + - 0.2909 + - 0.2922 + - 0.2935 + - 0.2948 + - 0.2961 + - 0.2974 + - 0.2987 + - 0.3 + - 0.3013 + - 0.3026 + - 0.3039 + - 0.3052 + - 0.3221 + - 0.3234 + - 0.3247 + - 0.326 + - 0.3273 + - 0.3286 + - 0.3299 + - 0.3312 + - 0.3416 + - 0.3429 + - 0.3442 + - 0.3455 + - 0.3468 + - 0.3481 + - 0.3494 + - 0.3507 + - 0.352 + - 0.3533 + - 0.3546 + - 0.3559 + - 0.3572 + - 0.3585 + - 0.3598 + - 0.3715 + - 0.3728 + - 0.3741 + - 0.3754 + - 0.3767 + - 0.378 + - 0.3793 + - 0.3806 + - 0.3819 + - 0.3832 + - 0.3845 + - 0.3858 + - 0.3873 + - 0.3887 + - 0.3901 + - 0.3915 + - 0.3929 + - 0.3943 + - 0.3957 + - 0.3971 + - 0.3985 + - 0.3999 + - 0.4013 + - 0.4027 + - 0.4041 + - 0.4055 + - 0.4069 + - 0.4251 + - 0.4265 + - 0.4335 + - 0.4349 + - 0.4363 + - 0.4405 + - 0.4419 + - 0.4433 + - 0.4475 + - 0.4489 + - 0.4517 + - 0.4531 + - 0.4545 + - 0.4587 + - 0.4601 + - 0.4615 + - 0.4629 + - 0.4643 + - 0.4657 + - 0.4699 + - 0.4713 + - 0.4727 + - 0.4769 + - 0.4783 + - 0.4797 + - 0.4811 + - 0.4825 + - 0.4923 + - 0.4937 + - 0.4951 + - 0.4965 + - 0.4979 + - 0.4993 + - 0.5007 + - 0.5021 + - 0.5147 + - 0.5161 + - 0.5189 + - 0.5203 + - 0.5217 + - 0.5231 + - 0.5301 + - 0.5315 + - 0.5329 + - 0.5343 + - 0.5357 + - 0.5371 + - 0.5385 + - 0.5399 + - 0.5483 + - 0.5497 + - 0.5511 + - 0.5539 + - 0.5553 + - 0.5567 + - 0.5581 + - 0.5595 + - 0.5609 + - 0.5623 + - 0.5637 + - 0.5651 + - 0.5665 + - 0.5679 + - 0.5693 + - 0.5833 + - 0.5847 + - 0.5861 + - 0.5875 + - 0.5889 + - 0.5903 + - 0.5917 + - 0.5931 + - 0.5945 + - 0.5959 + - 0.5973 + - 0.5987 + - 0.6001 + - 0.6171 + - 0.6186 + - 0.6201 + - 0.6216 + - 0.6231 + - 0.6246 + - 0.6261 + - 0.6276 + - 0.6291 + - 0.6306 + - 0.6321 + - 0.6336 + - 0.6351 + - 0.6366 + - 0.6381 + - 0.6396 + - 0.6411 + - 0.6426 + - 0.6441 + - 0.6456 + - 0.6471 + - 0.6486 + - 0.6501 + - 0.6516 + - 0.6531 + - 0.6546 + - 0.6561 + - 0.6576 + - 0.6591 + - 0.6606 + - 0.6621 + - 0.6636 + - 0.6651 + - 0.6666 + - 0.6681 + - 0.6696 + - 0.6951 + - 0.6966 + - 0.7041 + - 0.7056 + - 0.7071 + - 0.7086 + - 0.7101 + - 0.7116 + - 0.7131 + - 0.7296 + - 0.7311 + - 0.7386 + - 0.7401 + - 0.7416 + - 0.7431 + - 0.7446 + - 0.7461 + - 0.7476 + - 0.7491 + - 0.7506 + - 0.7686 + - 0.7701 + - 0.7761 + - 0.7776 + - 0.7851 + - 0.7866 + - 0.7881 + - 0.7896 + - 0.7911 + - 0.7971 + - 0.7986 + - 0.8046 + - 0.8061 + - 0.8091 + - 0.8106 + - 0.8181 + - 0.8196 + - 0.8226 + - 0.8241 + - 0.8271 + - 0.8286 + - 0.8316 + - 0.8331 + - 0.8391 + - 0.8406 + - 0.8481 + - 0.8496 + - 0.8511 + - 0.8526 + - 0.8601 + - 0.8616 + - 0.8646 + - 0.8661 + - 0.8676 + - 0.8691 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9235845725215543 + - 0.7498200439881414 + - 0.5440141550882047 + - 0.44486446352258385 + - 0.382502911322961 + - 0.38357877132903595 + - 0.321493641350322 + - 0.30973243344713597 + - 0.2900384169301238 + - 0.2681540365946798 + - 0.25790759814281455 + - 0.23478464952401573 + - 0.21729984018619475 + - 0.20099544000532119 + - 0.18060637374902422 + - 0.16300018954481138 + - 0.15176242304926768 + - 0.14268776112393444 + - 0.14186953483363343 + - 0.12290361421693424 + - 0.12142424024503828 + - 0.1138747014576421 + - 0.10852916316320488 + - 0.10397329628519936 + - 0.0996139272671999 + - 0.09553133806324375 + - 0.0883042624424208 + - 0.08613595355215121 + - 0.08241139848597283 + - 0.08090447837017331 + - 0.07364064943174142 + - 0.06577589679118503 + - 0.06311322496360225 + - 0.05250055361760622 + - 0.05161707786701031 + - 0.04822772104354874 + - 0.04643246208788433 + - 0.04306603290434804 + - 0.041620088698109806 + - 0.04000433751012981 + - 0.039791738954187514 + - 0.0397265744627997 + - 0.039618286646405855 + - 0.03958503907828408 + - 0.03952923533982863 + - 0.039471761120720615 + - 0.03943758667953431 + - 0.039423832918061695 + - 0.03940056458752999 + - 0.03937649873795286 + - 0.03936216390885381 + - 0.03934739926836131 + - 0.03933490958124857 + - 0.03931921939756129 + - 0.0392981151642355 + - 0.03928243046633827 + - 0.03926133186587399 + - 0.03924569003653748 + - 0.03922464702852989 + - 0.039209084386663505 + - 0.03918814553227591 + - 0.039172697026248544 + - 0.039151909081567675 + - 0.03913660801763065 + - 0.039116015572918196 + - 0.039100893381817436 + - 0.03908053855072857 + - 0.03898169716122232 + - 0.03886032483370003 + - 0.038624973622989035 + - 0.03832489482462343 + - 0.03720861573687365 + - 0.03615860903409168 + - 0.03540357029664361 + - 0.03451056349910187 + - 0.03425911009025767 + - 0.03394726594030942 + - 0.03367443745650185 + - 0.033323086781398274 + - 0.032588568763327094 + - 0.03175184842893519 + - 0.031346479936279446 + - 0.030847341064445893 + - 0.030574074117996227 + - 0.030221310057134486 + - 0.029798954463198635 + - 0.029556467316099424 + - 0.02925468793292046 + - 0.02913936913368083 + - 0.028983077893997032 + - 0.028752490337682738 + - 0.02855772942306227 + - 0.02852505247844883 + - 0.028456827837159866 + - 0.028357946308028438 + - 0.02822123003946925 + - 0.027959480300612422 + - 0.027743179221808446 + - 0.02771654705154531 + - 0.027654227460477836 + - 0.027637308092707896 + - 0.0276022319497745 + - 0.02758847630181126 + - 0.027580891577006068 + - 0.027572188178415592 + - 0.02756473765699688 + - 0.027564248736433428 + - 0.02756357899849252 + - 0.02756251155187582 + - 0.02756199114974422 + - 0.02756116144844079 + - 0.027560752312500714 + - 0.027560588880837993 + - 0.027560328468318355 + - 0.027560201620914174 + - 0.02755999942593987 + - 0.027559906286232817 + - 0.027559678988567465 + - 0.027559359849668348 + - 0.027558852128799004 + - 0.027558108550100237 + - 0.027557415581008812 + - 0.027557227645996187 + - 0.027556831076804338 + - 0.02755677426654354 + - 0.02755663544035166 + - 0.027556440713378212 + - 0.027556130465203495 + - 0.0275550351341448 + - 0.02755408730573154 + - 0.027551135933362055 + - 0.027548242944809027 + - 0.02754341326403397 + - 0.02753614859096003 + - 0.027527972378022597 + - 0.02751572528410547 + - 0.027502025352586758 + - 0.02748163811413067 + - 0.027459046224451847 + - 0.02745073207306351 + - 0.0274400673036211 + - 0.02734093854080417 + - 0.027200511538191193 + - 0.027031283596545407 + - 0.026800396337368762 + - 0.026735033103653764 + - 0.026604848455504863 + - 0.026430222059615528 + - 0.026210174644539987 + - 0.02600126770792609 + - 0.025746584683070676 + - 0.02549991904973713 + - 0.02519851941998353 + - 0.024825405990318596 + - 0.024220667560755842 + - 0.02401049579024488 + - 0.023651200563218556 + - 0.02345530447789187 + - 0.02312181939890977 + - 0.022951743921418143 + - 0.022629546463254484 + - 0.02250049009044513 + - 0.02214132423434971 + - 0.021518288912198705 + - 0.02146640515557503 + - 0.021043398235375464 + - 0.021040267964737368 + - 0.021132249988854115 + - 0.01965096833208963 + - 0.018275655583901266 + - 0.01818724437923384 + - 0.017461447780444915 + - 0.01743597745461361 + - 0.01744187923570707 + - 0.01686838065638934 + - 0.01705029625026561 + - 0.0163641693379666 + - 0.016408320253379016 + - 0.01592871623625458 + - 0.015540100133445079 + - 0.015537184572001842 + - 0.01497669407227276 + - 0.01465092685727178 + - 0.014751044681037164 + - 0.014211901161760092 + - 0.01389989521563269 + - 0.013946706039031299 + - 0.014012612911478503 + - 0.013842743509771348 + - 0.013846994746892514 + - 0.013790706826258005 + - 0.013684108540657151 + - 0.013684616468986848 + - 0.013622611010114654 + - 0.013510392061485365 + - 0.013506688431020791 + - 0.013442903525737543 + - 0.013330828485121267 + - 0.013411142138496684 + - 0.013248385533960877 + - 0.013237291381327558 + - 0.013186115797699691 + - 0.013212813896551542 + - 0.013154528075534926 + - 0.01316729163853298 + - 0.01314053067577018 + - 0.013126983145347918 + - 0.013140384956255372 + - 0.013109899173837848 + - 0.01311623310565676 + - 0.013102522924395009 + - 0.01309555322677105 + - 0.013102130134200928 + - 0.013086827269289041 + - 0.013049150597685782 + - 0.012993743811515765 + - 0.012894089178359606 + - 0.012753362151280836 + - 0.012523545976131076 + - 0.012216459727167818 + - 0.011787166209640251 + - 0.011224365422445405 + - 0.007510358364860435 + - 0.006454462709672252 + - 0.006166648762137438 + - 0.005401185683125398 + - 0.00561514863706655 + - 0.004733106978151295 + - 0.005080435088498023 + - 0.004896680788132212 + - 0.005052510957525359 + - 0.0049835395125184916 + - 0.005004850182742666 + - 0.005036871501682442 + - 0.005057325955391002 + - 0.005041297726360315 + - 0.0050476123809684815 + - 0.005060633716445977 + - 0.005052653363069639 + - 0.005031633036204976 + - 0.005039440222022888 + - 0.005056064354838245 + - 0.005066552411513597 + - 0.005058877402755228 + - 0.005061490462988561 + - 0.005056667918780996 + - 0.0050656800590727045 + - 0.005052997089288164 + - 0.005056671004200235 + - 0.005050015157670352 + - 0.005056742631276903 + - 0.005060962181863597 + - 0.0050551498263013755 + - 0.005057331864421136 + - 0.005056039148964863 + - 0.005057403822754271 + - 0.005056978961098716 + - 0.005057393598951167 + - 0.005057095852481611 + - 0.005057644067656174 + - 0.005057319559540481 + - 0.005057661906636195 + - 0.005057459293095626 + - 0.005057673030927262 + - 0.0050575945697150255 + - 0.005057620476759472 + - 0.0050576996450732 + - 0.005057652800723035 + - 0.005057702210163467 + - 0.00505766662674329 + - 0.00505767899750634 + - 0.005057682058124755 + - 0.0050576760339027475 + - 0.005057678022914238 + - 0.0050576923616961625 + - 0.005057683876947427 + - 0.005057692826628647 + - 0.0050576875307855014 + - 0.005057680047575023 + - 0.005057686088159631 + - 0.005057687581874185 + - 0.005057695132656802 + - 0.005057690664624328 + - 0.005057695377449452 + - 0.00505769198330251 + - 0.005057693103649407 + - 0.005057690898532299 + - 0.005057694967621573 + - 0.005057692559809525 + - 0.00505769509954015 + - 0.005057693596696818 + - 0.005057695181880383 + - 0.005057694039876606 + - 0.005057695480093384 + - 0.00505769462786814 + - 0.005057695526786442 + - 0.005057694994865674 + - 0.0050576955559305066 + - 0.005057695694728432 + - 0.0050576954214969095 + - 0.0050576959258411556 + - 0.0050576956274035875 + - 0.005057695942192489 + - 0.005057695755921202 + - 0.005057695952398169 + - 0.0050576958108301305 + - 0.005057693871389761 + - 0.005057693204484956 + - 0.005057683922128411 + - 0.005057680730267817 + - 0.005057636304899132 + - 0.0050576210289340565 + - 0.005057408430136171 + - 0.005057335333083507 + - 0.005056318417967473 + - 0.005055968924167346 + - 0.005051115756922675 + - 0.00504945118198643 + - 0.005026537037053848 + - 0.005018751203344587 + - 0.0049157550876522986 + - 0.004882110011839514 + - 0.004854988345006759 + - 0.004531873825371174 + - 0.004451362015399025 + - 0.004333779669691012 + - 0.0042144251434274365 + - 0.004130376904273497 + - 0.0036297349287063734 + - 0.003518822214862425 + - 0.003315633210612674 + - 0.0033113512963098874 + - 0.003117987548551222 + - 0.0031695094918866434 + - 0.003007984841523897 + - 0.0030793731266749737 + - 0.00297536621845599 + - 0.0030376771339920626 + - 0.002973363823725912 + - 0.0030165559712525282 + - 0.0029835480450331516 + - 0.0030135627672688388 + - 0.0030025098345698056 + - 0.0030135984185674794 + - 0.003015578139207987 + - 0.0030143975562505494 + - 0.003015604605890897 + - 0.0030148862542185616 + - 0.0030156212276658753 + - 0.0030151843603771016 + - 0.0030156315271884257 + - 0.0030154668790800692 + - 0.003015635483329381 + - 0.003015665115010414 + - 0.003015647521735853 + - 0.003015665542763716 + - 0.0030156548434254076 + - 0.003015665803015689 + - 0.003015659296271275 + - 0.003015665961328921 + - 0.003015662004306356 + - 0.003015666057621315 + - 0.003015664830902591 + - 0.003015666087478563 + - 0.0030156657041290223 + - 0.003015666096809567 + - 0.0030156661658058592 + - 0.0030156661059076257 + - 0.003015666174903918 + - 0.003015666115005588 + - 0.0030156661840019766 + - 0.003015666165283634 + - 0.003015666186845084 + - 0.0030156661809957403 + - 0.003015666187733627 + - 0.003015666184808859 + - 0.0030156661881777544 + - 0.003015666187720916 + - 0.0030156661882471854 + - 0.003015666188018766 + - 0.003015666188281949 + - 0.0030156661881677394 + - 0.0030156661882991863 + - 0.0030156661882421777 + - 0.003015666188307853 + - 0.003015666188290134 + - 0.0030156661883105496 + - 0.0030156661883077567 + - 0.0030156661883111273 + - 0.0030156661883083344 + - 0.0030156661883115124 + - 0.0030156661883111273 + - 0.0030156661883115124 + - 0.003015666188311416 + - 0.0030156661883115124 + - 0.003015666188311416 + - 0.0030156661883115124 + - 0.0030156661883115124 +- !!python/tuple + - !!python/tuple + - 0.0114 + - 0.0228 + - 0.0342 + - 0.0456 + - 0.057 + - 0.0684 + - 0.0798 + - 0.1596 + - 0.171 + - 0.1824 + - 0.1938 + - 0.2052 + - 0.2166 + - 0.228 + - 0.2394 + - 0.2508 + - 0.4218 + - 0.4332 + - 0.4446 + - 0.5358 + - 0.5928 + - 0.6042 + - 0.6498 + - 0.7296 + - 0.8094 + - 0.8892 + - 0.9006 + - 0.912 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8995471763639531 + - 0.7128677426756492 + - 0.2874226553092166 + - 0.15407304134422337 + - 0.07812032346269747 + - 0.05901853503823079 + - 0.02446787136614713 + - 0.015315084848992222 + - 0.004720743505421982 + - -0.003314914938689188 + - -0.004911681393482902 + - -0.005133596727261887 + - -0.005182612918636303 + - -0.005389174264051613 + - -0.00530254149915087 + - -0.005235226726089184 + - -0.005303938788082646 + - -0.00528006509706882 + - -0.0052746513514205185 + - -0.0052756845056157586 + - -0.005275299813685115 + - -0.005275035215457866 + - -0.005275024880674199 + - -0.005275024476973195 + - -0.005275024496222622 + - -0.005275024489063816 + - -0.0052750244819050095 + - -0.0052750244819050095 +- !!python/tuple + - !!python/tuple + - 0.0059 + - 0.0118 + - 0.0177 + - 0.0236 + - 0.0472 + - 0.0531 + - 0.059 + - 0.0649 + - 0.0708 + - 0.0767 + - 0.0826 + - 0.0885 + - 0.0944 + - 0.1003 + - 0.1062 + - 0.1121 + - 0.118 + - 0.1239 + - 0.2065 + - 0.2124 + - 0.2183 + - 0.2242 + - 0.2301 + - 0.2655 + - 0.2714 + - 0.2773 + - 0.3068 + - 0.3186 + - 0.3245 + - 0.3481 + - 0.354 + - 0.3599 + - 0.3953 + - 0.4012 + - 0.4071 + - 0.413 + - 0.4189 + - 0.4248 + - 0.4838 + - 0.4897 + - 0.4956 + - 0.5015 + - 0.5074 + - 0.5605 + - 0.5664 + - 0.5723 + - 0.5841 + - 0.59 + - 0.6136 + - 0.6195 + - 0.6431 + - 0.649 + - 0.6726 + - 0.6785 + - 0.708 + - 0.7139 + - 0.7198 + - 0.7257 + - 0.7552 + - 0.7611 + - 0.767 + - 0.7729 + - 0.8024 + - 0.8083 + - 0.8201 + - 0.826 + - 0.8319 + - 0.8378 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9079326595515846 + - 0.7122139481528138 + - 0.2778890815605675 + - 0.1857829531708105 + - 0.1490715958485031 + - 0.09406321911786808 + - 0.07631985669117079 + - 0.04945536784786461 + - 0.02588277667066471 + - 0.012841642593102198 + - 0.0032026940960973053 + - -0.002520170012175273 + - -0.007922648230218479 + - -0.009587682007395822 + - -0.010525371884699014 + - -0.01023735057638135 + - -0.010208766352859092 + - -0.010167050446690478 + - -0.009941728734351405 + - -0.010037557821293147 + - -0.010026287272996775 + - -0.01000134196140711 + - -0.009987552199479582 + - -0.01000002549769098 + - -0.009991580916699678 + - -0.009987380370387072 + - -0.009982801504629133 + - -0.009984001224742219 + - -0.00998335194428704 + - -0.009983269488836462 + - -0.00998300433518861 + - -0.009982877737662006 + - -0.009982861705657575 + - -0.00998280991943015 + - -0.009982738076096967 + - -0.009982757051020624 + - -0.009982740591854259 + - -0.009982739047272891 + - -0.009982739935155423 + - -0.009982739165039488 + - -0.00998273960773191 + - -0.009982739223759514 + - -0.009982739129485817 + - -0.009982739213311161 + - -0.009982739119037467 + - -0.009982739160950186 + - -0.009982739113813291 + - -0.009982739126911094 + - -0.009982739112180748 + - -0.009982739116273806 + - -0.009982739111670656 + - -0.009982739112949784 + - -0.009982739111511187 + - -0.009982739111711101 + - -0.009982739111486245 + - -0.009982739111686064 + - -0.009982739111461305 + - -0.0099827391114926 + - -0.009982739111457452 + - -0.009982739111488653 + - -0.0099827391114536 + - -0.009982739111458512 + - -0.009982739111453023 + - -0.009982739111455429 + - -0.00998273911145254 + - -0.009982739111455141 + - -0.009982739111452348 + - -0.009982739111452348 +- !!python/tuple + - !!python/tuple + - 0.0102 + - 0.0204 + - 0.0306 + - 0.0408 + - 0.0816 + - 0.0918 + - 0.102 + - 0.1122 + - 0.1224 + - 0.1326 + - 0.204 + - 0.2142 + - 0.2244 + - 0.2346 + - 0.2448 + - 0.255 + - 0.3672 + - 0.3774 + - 0.3876 + - 0.3978 + - 0.459 + - 0.4692 + - 0.4794 + - 0.5508 + - 0.5814 + - 0.5916 + - 0.6324 + - 0.6426 + - 0.6528 + - 0.663 + - 0.6732 + - 0.6834 + - 0.6936 + - 0.7548 + - 0.765 + - 0.7752 + - 0.7854 + - 0.7956 + - 0.8058 + - 0.867 + - 0.8772 + - 0.8874 + - 0.8976 + - 0.9078 + - 0.918 + - 0.9282 + - 0.9384 + - 0.9486 + - 0.9588 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8563658570289765 + - 0.696897743294865 + - 0.33700499142114637 + - 0.24439414933521278 + - 0.1903470272270799 + - 0.15033614848948781 + - 0.08335857299851981 + - 0.052732988291887634 + - 0.033584987747867424 + - 0.012012337877154217 + - 0.004647531853949584 + - 0.0027813909403214087 + - -0.0032590512301297575 + - -0.005470902184126747 + - -0.004662536941226359 + - -0.00433215585717952 + - -0.004497314415800943 + - -0.004372582198508332 + - -0.004450248855628971 + - -0.004405724350245819 + - -0.0044385587714272255 + - -0.0044190927198177535 + - -0.0044150320261664945 + - -0.004416965312173973 + - -0.004416325319763577 + - -0.004416010224960024 + - -0.004416465070942829 + - -0.004416152074826392 + - -0.004416603364117296 + - -0.00441629320113497 + - -0.004416646811054568 + - -0.004416529353604248 + - -0.004416467738665281 + - -0.004416556646179475 + - -0.004416495452987308 + - -0.0044165652880947225 + - -0.004416783227046589 + - -0.004416633678699802 + - -0.004416656725474661 + - -0.004416649064975396 + - -0.004416660112801863 + - -0.004416652510447915 + - -0.004416663474113728 + - -0.004416655929897491 + - -0.004416666809420561 + - -0.004416659323324988 + - -0.004416667865460596 + - -0.004416665026164944 + - -0.004416665026164944 +- !!python/tuple + - !!python/tuple + - 0.0095 + - 0.019 + - 0.0285 + - 0.038 + - 0.076 + - 0.0855 + - 0.095 + - 0.152 + - 0.1615 + - 0.171 + - 0.1805 + - 0.19 + - 0.1995 + - 0.209 + - 0.3325 + - 0.342 + - 0.3515 + - 0.361 + - 0.3705 + - 0.38 + - 0.3895 + - 0.399 + - 0.4085 + - 0.418 + - 0.4275 + - 0.5985 + - 0.608 + - 0.627 + - 0.6365 + - 0.646 + - 0.6555 + - 0.665 + - 0.6745 + - 0.684 + - 0.6935 + - 0.703 + - 0.7125 + - 0.722 + - 0.7315 + - 0.741 + - 0.7505 + - 0.8645 + - 0.874 + - 0.8835 + - 0.893 + - 0.9025 + - 0.912 + - 0.969 + - 0.9785 + - 0.988 + - 0.9975 + - 1.0 + - !!python/tuple + - 1.0 + - 0.896292499238432 + - 0.7069998304618995 + - 0.2847004173548787 + - 0.18753795228868161 + - 0.09761832258014107 + - 0.05483657773878809 + - 0.023876204371179217 + - 0.002183029907973463 + - -0.006428701568061186 + - -0.0062537224725946 + - -0.008669141349853249 + - -0.009201177619172702 + - -0.00951485921691423 + - -0.009690436513677608 + - -0.009510829694477037 + - -0.00960554909049801 + - -0.009514284105202324 + - -0.009556008741546733 + - -0.009504377615366027 + - -0.00954324328992736 + - -0.009515292848859066 + - -0.009531618775268522 + - -0.009502159102107038 + - -0.009514990013535818 + - -0.009514557527411344 + - -0.009514744321037464 + - -0.00951497743226949 + - -0.009514627208236376 + - -0.009514836823036835 + - -0.009514521954499705 + - -0.009514710174715064 + - -0.009514427487667483 + - -0.009514596282946272 + - -0.009514342805523808 + - -0.009514494009063798 + - -0.00951426697729128 + - -0.009514402285293289 + - -0.00951419914335685 + - -0.009514320117305948 + - -0.00951413851366355 + - -0.009514208112541436 + - -0.009514103629554726 + - -0.009514165793821704 + - -0.009514072476598023 + - -0.009514127977411106 + - -0.009514044666787114 + - -0.009514078660635803 + - -0.009514027633225746 + - -0.009514057968608174 + - -0.00951401243398489 + - -0.00951401243398489 +- !!python/tuple + - !!python/tuple + - 0.0075 + - 0.015 + - 0.0225 + - 0.03 + - 0.06 + - 0.0675 + - 0.075 + - 0.0825 + - 0.09 + - 0.0975 + - 0.105 + - 0.1125 + - 0.12 + - 0.1275 + - 0.135 + - 0.2325 + - 0.24 + - 0.2475 + - 0.255 + - 0.2625 + - 0.33 + - 0.3375 + - 0.345 + - 0.3525 + - 0.36 + - 0.3675 + - 0.375 + - 0.4725 + - 0.48 + - 0.4875 + - 0.495 + - 0.5025 + - 0.51 + - 0.5175 + - 0.6375 + - 0.645 + - 0.6525 + - 0.66 + - 0.7275 + - 0.735 + - 0.7425 + - 0.75 + - 0.7575 + - 0.8175 + - 0.825 + - 0.8325 + - 0.84 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8385448828824085 + - 0.6679126531103632 + - 0.26093311228698346 + - 0.16055027268085814 + - 0.0677242300407048 + - 0.04109477740776396 + - 0.025265973608250544 + - 0.0025661913033691312 + - -0.01098526418653786 + - -0.01403677254982045 + - -0.01579967782681003 + - -0.015989954764682325 + - 0.0 + - -0.01621684993803595 + - -0.01616370830106687 + - -0.01622566577857616 + - -0.016187284030845416 + - -0.01623024081332973 + - -0.016222556862495383 + - -0.01622144421823641 + - -0.01622468967685155 + - -0.01622401659172582 + - -0.016225947895364648 + - -0.01622554466480963 + - -0.016226690504605065 + - -0.016226450310545322 + - -0.016226439306560814 + - -0.016226470420100073 + - -0.016226463874112515 + - -0.016226482379882265 + - -0.016226478486197224 + - -0.016226489492784286 + - -0.01622648717686756 + - -0.01622648723063969 + - -0.016226487219324945 + - -0.01622648725130759 + - -0.016226487244577984 + - -0.016226487244257504 + - -0.016226487245163092 + - -0.01622648724497252 + - -0.01622648724551121 + - -0.016226487245397866 + - -0.016226487245461906 + - -0.016226487245448326 + - -0.016226487245486556 + - -0.01622648724547847 + - -0.01622648724547847 +- !!python/tuple + - !!python/tuple + - 0.0078 + - 0.0156 + - 0.0234 + - 0.0312 + - 0.039 + - 0.0468 + - 0.0546 + - 0.1014 + - 0.1092 + - 0.117 + - 0.1248 + - 0.1326 + - 0.1404 + - 0.1482 + - 0.156 + - 0.1638 + - 0.1716 + - 0.1794 + - 0.1872 + - 0.195 + - 0.2028 + - 0.3276 + - 0.3354 + - 0.3432 + - 0.3978 + - 0.4368 + - 0.4446 + - 0.4524 + - 0.4602 + - 0.468 + - 0.4758 + - 0.4836 + - 0.4914 + - 0.4992 + - 0.507 + - 0.5148 + - 0.5226 + - 0.5304 + - 0.5382 + - 0.546 + - 0.702 + - 0.7098 + - 0.7176 + - 0.7254 + - 0.7332 + - 0.741 + - 0.7488 + - 0.7566 + - 0.7644 + - 0.7722 + - 0.78 + - 0.9126 + - 0.9204 + - 0.9828 + - 0.9906 + - 0.9984 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8736370992106776 + - 0.6979991195258922 + - 0.30635747982244543 + - 0.18639920860026732 + - 0.1567616636540717 + - 0.12630884791223054 + - 0.07367190536805134 + - 0.03718427011425609 + - 0.03207049527607728 + - 0.017664705888210328 + - 0.012915825898213067 + - -0.0008158483598725933 + - -0.003323735692924517 + - -0.0035346325697702343 + - -0.0038919856006089863 + - -0.0038136302507097534 + - -0.003967861264492408 + - -0.003867130120682035 + - -0.003941368836381244 + - -0.003951157264041087 + - -0.004010909109350584 + - -0.003978615388765096 + - -0.003997563386093324 + - -0.003998218231483601 + - -0.003998593197216054 + - -0.003998477259190071 + - -0.0039987575529918575 + - -0.0039986708465990705 + - -0.003998880045187082 + - -0.00399881530885939 + - -0.003998971264103735 + - -0.0039989229913198355 + - -0.0039990391538430505 + - -0.00399900319111824 + - -0.0039990896586276185 + - -0.003999062885311876 + - -0.003999127218081664 + - -0.003999107296304496 + - -0.003999155143576819 + - -0.0039991562360323935 + - -0.003999155897714863 + - -0.003999156710214223 + - -0.003999156458594707 + - -0.003999157062877388 + - -0.003999156875739321 + - -0.003999157325162986 + - -0.003999157185982757 + - -0.003999157520232074 + - -0.003999157416719533 + - -0.003999157665309893 + - -0.003999157660218127 + - -0.003999157670392414 + - -0.003999157670591077 + - -0.003999157670529639 + - -0.003999157670677457 + - -0.003999157670677457 +- !!python/tuple + - !!python/tuple + - 0.0073 + - 0.0146 + - 0.0219 + - 0.0292 + - 0.0584 + - 0.0657 + - 0.0949 + - 0.1022 + - 0.1095 + - 0.1168 + - 0.1241 + - 0.1314 + - 0.1387 + - 0.146 + - 0.1533 + - 0.1606 + - 0.1679 + - 0.1752 + - 0.1825 + - 0.1898 + - 0.1971 + - 0.2044 + - 0.2117 + - 0.219 + - 0.2263 + - 0.2336 + - 0.2409 + - 0.2482 + - 0.2555 + - 0.2628 + - 0.2701 + - 0.2774 + - 0.2847 + - 0.292 + - 0.2993 + - 0.3066 + - 0.3139 + - 0.3212 + - 0.3285 + - 0.3358 + - 0.3431 + - 0.3504 + - 0.3577 + - 0.365 + - 0.3723 + - 0.3796 + - 0.3869 + - 0.3942 + - 0.4015 + - 0.4088 + - 0.4161 + - 0.4234 + - 0.4307 + - 0.438 + - 0.4453 + - 0.4526 + - 0.4599 + - 0.4672 + - 0.4745 + - 0.4818 + - 0.4891 + - 0.4964 + - 0.5037 + - 0.511 + - 0.5183 + - 0.5256 + - 0.5329 + - 0.5402 + - 0.5475 + - 0.5548 + - 0.5621 + - 0.5694 + - 0.5767 + - 0.584 + - 0.5913 + - 0.5986 + - 0.6059 + - 0.6132 + - 0.6205 + - 0.6278 + - 0.6351 + - 0.6424 + - 0.6497 + - 0.657 + - 0.6643 + - 0.6716 + - 1.0 + - !!python/tuple + - 1.0 + - 1.012289417095762 + - 0.8104026690707744 + - 0.349059833076792 + - 0.24250977064977897 + - 0.18186727249727602 + - 0.12508090220291984 + - 0.10151443731591231 + - 0.08214735898946832 + - 0.055496767829697445 + - 0.04512971226571682 + - 0.02797690371143173 + - 0.02564239746419474 + - 0.01944469636390538 + - 0.018533220396463712 + - 0.01691068729368054 + - 0.0159588070383582 + - 0.015464660821055467 + - 0.014304030588212602 + - 0.014409849830293897 + - 0.014281246630609496 + - 0.014298687096653315 + - 0.014286884319660213 + - 0.014287256694267707 + - 0.014293610692008957 + - 0.014291409194073523 + - 0.014296915411710256 + - 0.014295556647502483 + - 0.014299618741447128 + - 0.014298897014821135 + - 0.014301789110873462 + - 0.0143014144037328 + - 0.014303431175782368 + - 0.014303234942806815 + - 0.014304621089133057 + - 0.01430451585355119 + - 0.014305459098774967 + - 0.014305400827224753 + - 0.014306038355990479 + - 0.01430600493900193 + - 0.014306433880799573 + - 0.014306414059019487 + - 0.014306701781385428 + - 0.01430668967067511 + - 0.014306882274374978 + - 0.014306874694607381 + - 0.014307003449971677 + - 0.014306998617341419 + - 0.014307084612137996 + - 0.01430708148867578 + - 0.0143071388892566 + - 0.014307136850704128 + - 0.014307175149504818 + - 0.014307173809932726 + - 0.014307199356773765 + - 0.01430719847237713 + - 0.014307215510090877 + - 0.014307214924336252 + - 0.014307226285778614 + - 0.01430722589698158 + - 0.014307233472650149 + - 0.01430723321420887 + - 0.014307238265301834 + - 0.014307238093342863 + - 0.014307241461050274 + - 0.014307241346559068 + - 0.014307243591852446 + - 0.014307243515590264 + - 0.014307245012532156 + - 0.014307244961719461 + - 0.01430724595972348 + - 0.014307245925860902 + - 0.014307246591220601 + - 0.014307246568650815 + - 0.014307247012237751 + - 0.014307246997193568 + - 0.014307247292926411 + - 0.014307247282897919 + - 0.01430724748005822 + - 0.014307247473373103 + - 0.014307247604816449 + - 0.014307247600359674 + - 0.014307247687990817 + - 0.014307247685019633 + - 0.014307247743441711 + - 0.014307247741460956 + - 0.014307247741460956 +- !!python/tuple + - !!python/tuple + - 0.0061 + - 0.0122 + - 0.0183 + - 0.0244 + - 0.0305 + - 0.0366 + - 0.0427 + - 0.0488 + - 0.0549 + - 0.061 + - 0.0671 + - 0.0732 + - 0.0793 + - 0.0854 + - 0.0915 + - 0.0976 + - 0.1037 + - 0.1098 + - 0.1159 + - 0.122 + - 0.2074 + - 0.2135 + - 0.2196 + - 0.2257 + - 0.2318 + - 0.2379 + - 0.244 + - 0.2806 + - 0.2867 + - 0.2928 + - 0.2989 + - 0.3233 + - 0.3294 + - 0.3355 + - 0.3599 + - 0.366 + - 0.3782 + - 0.3843 + - 0.4087 + - 0.4148 + - 0.4209 + - 0.427 + - 0.4331 + - 0.4392 + - 0.4697 + - 0.4758 + - 0.4819 + - 0.488 + - 0.5246 + - 0.5368 + - 0.5429 + - 0.5612 + - 0.5673 + - 0.5734 + - 0.5795 + - 0.5856 + - 0.6161 + - 0.6222 + - 0.6527 + - 0.6588 + - 0.6649 + - 0.6832 + - 0.6893 + - 0.7076 + - 0.7137 + - 0.7564 + - 0.7625 + - 0.7686 + - 0.7747 + - 0.7808 + - 0.7869 + - 0.8113 + - 0.8174 + - 0.8418 + - 0.8479 + - 0.854 + - 0.8601 + - 0.8662 + - 0.8723 + - 0.8784 + - 0.9272 + - 0.9333 + - 0.9394 + - 0.9455 + - 0.9516 + - 0.9577 + - 0.9638 + - 0.9699 + - 0.976 + - 0.9821 + - 0.9882 + - 0.9943 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8600182085624601 + - 0.6740126880793903 + - 0.2871560368492865 + - 0.24372820256829544 + - 0.18568705260279342 + - 0.15605949602430136 + - 0.12633455091475965 + - 0.07555397594418091 + - 0.034720327530005014 + - 0.02356821882610651 + - 0.009878305173739074 + - -0.012104048222326275 + - -0.014268681625449725 + - -0.014986421672352238 + - -0.01533365212516375 + - -0.015771956503323418 + - -0.015595049564430594 + - -0.015667996180634677 + - -0.015624189311297573 + - -0.01558377369152219 + - -0.01557406030847322 + - -0.015577429719803585 + - -0.015584736011604787 + - -0.015548181154986858 + - -0.015543152923313154 + - -0.01554410554194407 + - -0.01555741206048926 + - -0.015547629433748676 + - -0.015533840102289193 + - -0.015536719041409824 + - -0.015536796365596609 + - -0.015537637746528993 + - -0.01553228345279169 + - -0.015531928377637916 + - -0.015533229490205134 + - -0.015533662468603457 + - -0.01553366853411581 + - -0.015533523621975276 + - -0.015533525112654415 + - -0.015533583249164354 + - -0.015533199857518653 + - -0.015533260450544692 + - -0.015533261105735885 + - -0.015533029755509686 + - -0.015533062315182573 + - -0.015532865895968475 + - -0.015532894514903011 + - -0.01553293296265935 + - -0.015532912182731616 + - -0.015532912246465117 + - -0.015532898103021145 + - -0.015532900226115419 + - -0.015532886739555272 + - -0.015532885156093806 + - -0.015532892601245225 + - -0.015532887075954736 + - -0.015532887942596106 + - -0.0155328879454031 + - -0.015532887082057922 + - -0.015532887218186653 + - -0.015532886678594291 + - -0.01553288661453723 + - -0.015532886689532704 + - -0.015532886352287261 + - -0.01553288635521675 + - -0.015532886355246215 + - -0.015532886356748274 + - -0.01553288634676485 + - -0.015532886348338267 + - -0.015532886348354253 + - -0.015532886338062385 + - -0.015532886339679617 + - -0.01553288633969021 + - -0.015532886340224568 + - -0.015532886336673862 + - -0.015532886337233258 + - -0.015532886337238939 + - -0.01553288633752716 + - -0.01553288633753024 + - -0.015532886337137538 + - -0.01553288633719936 + - -0.015532886336789226 + - -0.015532886336853843 + - -0.01553288633642522 + - -0.015532886336492725 + - -0.01553288633604513 + - -0.015532886336115525 + - -0.015532886335648286 + - -0.015532886335721762 + - -0.015532886335722435 + - -0.01553288633576028 + - -0.01553288633576028 +solver_name: ASTRODF diff --git a/test/expected_results/SAN1_NELDMD.yaml b/test/expected_results/SAN1_NELDMD.yaml new file mode 100644 index 000000000..72742f385 --- /dev/null +++ b/test/expected_results/SAN1_NELDMD.yaml @@ -0,0 +1,8289 @@ +all_est_objectives: +- - 55.228104638490976 + - 20.744722782499416 + - 19.547597011332368 + - 19.93811454120234 + - 20.00448671355426 + - 19.47428882662933 + - 19.6577797767937 + - 19.498496037780196 + - 19.441984261283125 + - 19.555114942565066 + - 19.233665832975372 + - 19.632452054382462 + - 19.386688227480356 + - 19.30410153210836 + - 19.41223638787113 + - 19.501387265988367 + - 19.50097965325524 + - 19.439498876711603 + - 19.221617871796234 + - 19.075062235530176 + - 19.31132938439528 + - 19.43701720042243 + - 19.352854198696544 + - 19.355140120486343 + - 19.104673086263073 + - 19.21565416017552 + - 19.041383350552326 + - 19.212151115172517 + - 19.03029207685854 + - 18.961946729466753 + - 19.041219806116548 + - 19.08123287004995 + - 18.847028209991674 + - 18.982792302025896 + - 19.069026250002974 + - 18.976192436832815 + - 18.836021613175692 + - 19.2242667169592 + - 19.066035150081476 + - 18.99759041250923 + - 19.06754665338677 + - 19.06754665338677 +- - 54.98944203450111 + - 19.954190130242964 + - 20.010501683703744 + - 19.93008833029369 + - 19.722284403676706 + - 19.760511259611768 + - 19.614094512473475 + - 19.597908867506906 + - 19.82429132428944 + - 19.556993067829882 + - 19.613457101914403 + - 19.630057898352955 + - 19.52018932482709 + - 19.257670258208712 + - 19.27754632544588 + - 19.312567098717338 + - 19.012270493008756 + - 19.03884068455424 + - 18.87504715574642 + - 18.91274686370106 + - 18.977275607071395 + - 18.94076161422022 + - 18.746945466144528 + - 18.775636012262986 + - 18.67762907671517 + - 18.71148382191265 + - 18.726251771109663 + - 18.711277493958313 + - 18.69611250619351 + - 18.7045687723359 + - 18.67998602293898 + - 18.705575904833836 + - 18.68476688197874 + - 18.6979390611474 + - 18.665063258307885 + - 18.67189685275425 + - 18.67261925746819 + - 18.67261925746819 +- - 54.30952001078969 + - 19.6905946953616 + - 19.31421186988177 + - 19.063653242509297 + - 18.57283193373903 + - 18.995324914535814 + - 19.020052449480804 + - 18.64142342134025 + - 18.56389358271671 + - 18.745022436629657 + - 18.641469640185804 + - 18.581452056831083 + - 18.481989692454032 + - 18.651031817592642 + - 18.445499734481132 + - 18.61655840348652 + - 18.328166948282522 + - 18.58382841715896 + - 18.5561771205034 + - 18.503051097608722 + - 18.52289606891748 + - 18.45546717193734 + - 18.511861421273988 + - 18.40722352059405 + - 18.611361888744803 + - 18.559722017227088 + - 18.475674291761674 + - 18.4728200038703 + - 18.408498376345815 + - 18.509695705202894 + - 18.494199937371324 + - 18.508104677892042 + - 18.51721204891319 + - 18.497405579071163 + - 18.48847256219499 + - 18.47748097796715 + - 18.443198966345747 + - 18.443198966345747 +- - 54.76055167633331 + - 20.72233663871072 + - 20.97463099192827 + - 20.536557434403406 + - 20.43723747328299 + - 20.22195296051585 + - 20.25676529994495 + - 20.17981383076642 + - 20.023374768826272 + - 20.003014122637033 + - 20.11947245922721 + - 20.0423715564297 + - 20.084338403974144 + - 20.02383067497871 + - 20.04660478111248 + - 19.981850652449488 + - 19.928797910880405 + - 20.023475770620628 + - 20.07743004156233 + - 19.992768909350424 + - 20.053287924655773 + - 20.002141894655495 + - 19.974734865847044 + - 19.990674246877052 + - 20.006468659392354 + - 19.969544286437838 + - 19.968233959147554 + - 19.9637656991747 + - 19.989942230689085 + - 19.97528999240608 + - 19.934631195957774 + - 19.95206800884969 + - 19.95420825406803 + - 19.941352756037585 + - 19.940954666749736 + - 19.958085838714453 + - 19.942952469003604 + - 19.95534770380799 + - 19.938352213014642 + - 19.938352213014642 +- - 52.39186295815599 + - 20.35973956979957 + - 19.6129541322394 + - 19.326457311710335 + - 19.512081679794733 + - 19.347701411549235 + - 19.30936509711014 + - 19.53238017074172 + - 19.167917645431586 + - 19.440148485273724 + - 19.25098804546876 + - 19.34875438204402 + - 19.457722939597463 + - 18.765379343820477 + - 19.251636808877414 + - 19.08175058817981 + - 19.084803453822108 + - 19.10834972663925 + - 19.067707993072602 + - 18.726448226180235 + - 18.664892996037967 + - 19.029187449649463 + - 18.741343172429218 + - 18.600211484436095 + - 18.461766256534183 + - 18.637043145617476 + - 18.54508972208903 + - 18.579819089122783 + - 18.56828541751121 + - 18.48773124449944 + - 18.536255463506443 + - 18.429279116107487 + - 18.5247549486378 + - 18.431619529179127 + - 18.44321773839496 + - 18.492193128250356 + - 18.314254552491576 + - 18.38040415674184 + - 18.317754990043525 + - 18.403260834601166 + - 18.349773024745854 + - 18.349773024745854 +- - 54.25979384648611 + - 19.177097587951472 + - 18.809631685553267 + - 19.071441132193616 + - 19.05475170054475 + - 18.906350775276376 + - 18.857369720795592 + - 18.697748502230287 + - 18.866024890970053 + - 18.630676235575965 + - 18.454517881189055 + - 18.56041152214037 + - 18.46633796561533 + - 18.433587766705166 + - 18.430979902372822 + - 18.395923389582375 + - 18.355746496511745 + - 18.413033992113547 + - 18.333348778810407 + - 18.28153223190744 + - 18.231751468641857 + - 18.335190724143008 + - 18.20255975370942 + - 18.19003699290915 + - 18.220872585885182 + - 18.213198645643317 + - 18.195097123743693 + - 18.223893799769094 + - 18.200536229619562 + - 18.204650270771413 + - 18.222786438434383 + - 18.23248282894685 + - 18.193495550029482 + - 18.191271417376914 + - 18.218717405527237 + - 18.211199856427083 + - 18.213536751806434 + - 18.2157304773511 + - 18.203378395764297 + - 18.203378395764297 +- - 51.823992493809435 + - 21.95845059024165 + - 18.476533911024045 + - 18.450083337268563 + - 18.174806580774224 + - 18.213119072736056 + - 18.14009628696251 + - 18.172640508511556 + - 18.15564768776454 + - 18.097923267666836 + - 18.13009163914247 + - 18.04477486166886 + - 18.004833987279923 + - 17.91448012633016 + - 17.992511458719846 + - 17.953548703539568 + - 17.888949595174893 + - 17.918989586590573 + - 17.89133383740538 + - 17.912436958597837 + - 17.859886160029287 + - 17.896431614970208 + - 17.883265481572696 + - 17.864823484082034 + - 17.86759591321244 + - 17.863545279401468 + - 17.853394714496623 + - 17.840723615250216 + - 17.827983905118245 + - 17.84915702265066 + - 17.830676540242504 + - 17.8184563180353 + - 17.834104826454382 + - 17.819124392409304 + - 17.815445341436842 + - 17.819697750234056 + - 17.819697750234056 +- - 53.19657777800099 + - 19.572075824310236 + - 19.277705922092636 + - 19.37276972429338 + - 19.126276616890618 + - 19.558117264462165 + - 19.114492420837866 + - 19.195798965386516 + - 19.056470304084073 + - 18.96627810599244 + - 19.044816094453516 + - 18.761885132338687 + - 18.83182786940195 + - 18.720594534921485 + - 18.76833687205482 + - 18.54455983122425 + - 18.65311428963737 + - 18.517217927469755 + - 18.598480427855296 + - 18.366257495682405 + - 18.481564010958042 + - 18.42779006952942 + - 18.58528082820029 + - 18.473385908831254 + - 18.60914499013543 + - 18.49932143790611 + - 18.41852160824719 + - 18.564928516295826 + - 18.37971284576154 + - 18.50061347601546 + - 18.518219992074027 + - 18.458578743081894 + - 18.449476242955722 + - 18.44389676753598 + - 18.41405053917271 + - 18.444188365103575 + - 18.447564039832734 + - 18.416251107878267 + - 18.346542898288156 + - 18.435540401044047 + - 18.430919489055526 + - 18.431105816668722 + - 18.349337618053113 + - 18.398426487563 + - 18.39130102926937 + - 18.328025189061176 + - 18.30910697301487 + - 18.380967207262223 + - 18.380967207262223 +- - 58.70283939001095 + - 19.818405447476508 + - 19.505804330152465 + - 19.543851356827652 + - 19.496691992210838 + - 19.475530899564276 + - 19.558092827231814 + - 19.50520301362568 + - 19.536679430577827 + - 19.589353470545326 + - 19.490140705106402 + - 19.499280185377863 + - 19.566510886864698 + - 19.584898564860016 + - 19.62365468387991 + - 19.517425552043576 + - 19.4972587430571 + - 19.5989989473159 + - 19.596598594332423 + - 19.5665336471889 + - 19.57217582730768 + - 19.565459370561097 + - 19.680136841413695 + - 19.53124141013745 + - 19.496390351768873 + - 19.591594618325228 + - 19.4942809166556 + - 19.64335426929724 + - 19.54817140944882 + - 19.541414207520877 + - 19.580931045483513 + - 19.55806390296565 + - 19.46824653004791 + - 19.608816940439183 + - 19.56286552312028 + - 19.514208316944064 + - 19.568775233894755 + - 19.51281288439873 + - 19.558416253984277 + - 19.558416253984277 +- - 52.87627843731777 + - 19.030522301933868 + - 19.136114055931642 + - 18.820136965507885 + - 18.5164839382335 + - 18.369782376851152 + - 18.34519359508836 + - 18.344527817824872 + - 18.17281393082314 + - 18.09784846401566 + - 18.114319442591363 + - 18.00279699347424 + - 18.130526709007537 + - 18.105365017842733 + - 18.074815536654036 + - 18.020049265654666 + - 18.073712820850186 + - 18.0240232093974 + - 18.032819787266565 + - 17.97570165927904 + - 17.93343176416817 + - 17.93337126929559 + - 17.929800700153436 + - 17.9323569903779 + - 17.910136830984392 + - 17.912688292990854 + - 17.9099667845752 + - 17.89215789795101 + - 17.87122285529289 + - 17.875214681335116 + - 17.85527775390269 + - 17.86244399448771 + - 17.87134150277254 + - 17.859843239018844 + - 17.838663805679058 + - 17.83544392816581 + - 17.8439673552851 + - 17.848070865486104 + - 17.859715229394904 + - 17.827404560082115 + - 17.823693121467617 + - 17.861269392832817 + - 17.81933128118725 + - 17.82918753701378 + - 17.82918753701378 +all_intermediate_budgets: +- - 0 + - 1650 + - 1710 + - 2310 + - 2490 + - 2640 + - 2700 + - 2850 + - 3030 + - 3930 + - 4260 + - 4320 + - 4410 + - 4800 + - 4860 + - 5010 + - 5160 + - 5250 + - 5310 + - 5430 + - 5670 + - 5790 + - 5880 + - 5940 + - 6000 + - 6480 + - 6870 + - 7050 + - 7110 + - 7260 + - 7620 + - 7800 + - 7980 + - 8040 + - 8130 + - 8310 + - 8430 + - 8580 + - 8760 + - 8850 + - 9180 + - 10000 +- - 0 + - 2100 + - 2700 + - 2910 + - 3180 + - 3510 + - 3570 + - 3720 + - 3810 + - 3870 + - 3930 + - 4080 + - 4140 + - 4200 + - 4260 + - 4350 + - 4770 + - 4890 + - 5310 + - 5550 + - 5700 + - 5760 + - 5910 + - 6270 + - 6990 + - 7050 + - 7200 + - 7830 + - 8190 + - 8280 + - 8610 + - 8700 + - 9030 + - 9120 + - 9540 + - 9630 + - 9810 + - 10000 +- - 0 + - 2100 + - 2160 + - 2400 + - 2640 + - 2730 + - 2790 + - 3000 + - 3060 + - 3180 + - 3330 + - 3750 + - 3900 + - 3960 + - 4050 + - 4770 + - 4860 + - 5430 + - 5550 + - 5610 + - 5760 + - 5940 + - 6150 + - 6210 + - 6780 + - 6990 + - 7050 + - 7560 + - 7860 + - 8280 + - 9120 + - 9180 + - 9270 + - 9360 + - 9480 + - 9930 + - 9990 + - 10000 +- - 0 + - 2430 + - 2520 + - 2640 + - 2850 + - 3180 + - 3540 + - 3630 + - 3750 + - 3840 + - 4530 + - 5250 + - 5400 + - 5670 + - 5880 + - 6390 + - 6660 + - 6720 + - 6780 + - 6840 + - 6990 + - 7050 + - 7170 + - 7620 + - 7830 + - 8220 + - 8280 + - 8340 + - 8730 + - 8790 + - 8850 + - 8940 + - 9060 + - 9270 + - 9480 + - 9540 + - 9810 + - 9900 + - 9990 + - 10000 +- - 0 + - 2130 + - 2190 + - 2490 + - 2790 + - 2970 + - 3090 + - 3720 + - 3810 + - 3870 + - 4320 + - 4380 + - 4770 + - 4890 + - 5250 + - 5340 + - 5400 + - 5610 + - 5910 + - 6090 + - 6180 + - 6510 + - 6750 + - 6810 + - 6930 + - 6990 + - 7200 + - 7290 + - 7920 + - 8040 + - 8490 + - 8550 + - 8640 + - 8700 + - 8820 + - 8880 + - 8940 + - 9750 + - 9840 + - 9930 + - 9990 + - 10000 +- - 0 + - 1650 + - 2160 + - 2310 + - 2370 + - 2430 + - 2520 + - 2610 + - 2760 + - 3120 + - 3210 + - 3870 + - 3960 + - 4200 + - 4500 + - 4620 + - 4920 + - 4980 + - 5370 + - 5520 + - 5910 + - 6030 + - 6270 + - 6630 + - 6690 + - 7050 + - 7650 + - 7920 + - 8040 + - 8190 + - 8250 + - 8400 + - 8970 + - 9330 + - 9450 + - 9570 + - 9630 + - 9690 + - 9990 + - 10000 +- - 0 + - 870 + - 1860 + - 2400 + - 2460 + - 3120 + - 3330 + - 3480 + - 3690 + - 3750 + - 4050 + - 4200 + - 4500 + - 4800 + - 4860 + - 5220 + - 5370 + - 5610 + - 5940 + - 6060 + - 6510 + - 7260 + - 7350 + - 7410 + - 7710 + - 7770 + - 8010 + - 8160 + - 8580 + - 8730 + - 8820 + - 8910 + - 9120 + - 9600 + - 9660 + - 9870 + - 10000 +- - 0 + - 2550 + - 2640 + - 3000 + - 3090 + - 3180 + - 3240 + - 3420 + - 3480 + - 3630 + - 3900 + - 4080 + - 4140 + - 4230 + - 4320 + - 4530 + - 4650 + - 4740 + - 5160 + - 5220 + - 5340 + - 5430 + - 5520 + - 5610 + - 5700 + - 5760 + - 5940 + - 6090 + - 6360 + - 6690 + - 6990 + - 7230 + - 7290 + - 7380 + - 8070 + - 8280 + - 8580 + - 8760 + - 8910 + - 9060 + - 9150 + - 9210 + - 9330 + - 9390 + - 9450 + - 9510 + - 9930 + - 9990 + - 10000 +- - 0 + - 2130 + - 2310 + - 2790 + - 3600 + - 4200 + - 4440 + - 4530 + - 4830 + - 5250 + - 5370 + - 5490 + - 5610 + - 5670 + - 5880 + - 6090 + - 6180 + - 6240 + - 6420 + - 6510 + - 6630 + - 6840 + - 6930 + - 7500 + - 7560 + - 7950 + - 8250 + - 8520 + - 8580 + - 8760 + - 8820 + - 8880 + - 8940 + - 9000 + - 9090 + - 9150 + - 9330 + - 9630 + - 9780 + - 10000 +- - 0 + - 2070 + - 2460 + - 2550 + - 2790 + - 3000 + - 3120 + - 3300 + - 3360 + - 3480 + - 3570 + - 4350 + - 4470 + - 4530 + - 4680 + - 4740 + - 4860 + - 4980 + - 5100 + - 5160 + - 5220 + - 6330 + - 6510 + - 6570 + - 6690 + - 6750 + - 6870 + - 6930 + - 6990 + - 7200 + - 7290 + - 7560 + - 7980 + - 8400 + - 8490 + - 8760 + - 8820 + - 8880 + - 8940 + - 9000 + - 9630 + - 9690 + - 9840 + - 9990 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.0818328427500634 + - 1.3706856774884693 + - 1.1055777378271334 + - 1.8089300111924493 + - 1.4143060893878543 + - 1.313657399477944 + - 0.9582961820688727 + - 1.1640883825172288 + - 1.436289678899552 + - 0.5539726967321859 + - 3.0384076460891136 + - 1.3942748996383458 + - 1.0978313591594926 + - !!python/tuple + - 1.423461966597714 + - 2.604027069426662 + - 1.127464546912973 + - 1.4816822935393865 + - 1.5528061787286553 + - 1.4760446391851032 + - 1.2170501841465609 + - 1.152576558801305 + - 1.584851978510533 + - 0.8011407899988262 + - 2.1365976184016953 + - 1.8303056882409363 + - 2.105854955081379 + - !!python/tuple + - 0.5902918221207218 + - 2.6847406361153228 + - 1.600802926758687 + - 2.0773773435533696 + - 2.0119988991647735 + - 1.5807507534756544 + - 1.278163743716533 + - 1.6176660501616662 + - 1.522800949160756 + - 1.3206296303898193 + - 2.6771850650841347 + - 1.3449349949782436 + - 2.082557197351071 + - !!python/tuple + - 1.1970986469857219 + - 3.427238955850016 + - 1.5938541571367222 + - 2.168710510693939 + - 2.112306063699958 + - 1.9625799135907203 + - 1.5752121791127731 + - 1.6896338174755485 + - 1.7999110105057006 + - 1.20337430220068 + - 2.651201756442302 + - 1.6488273978704848 + - 2.099253314268883 + - !!python/tuple + - 1.10131142570131 + - 2.551191456448299 + - 1.5258996427667642 + - 1.6669868110652928 + - 1.579164613836047 + - 1.4199008712502401 + - 1.4243334240680943 + - 1.2802261861256563 + - 1.3379104423499193 + - 0.8991208797073036 + - 2.502031625988088 + - 1.380615245666033 + - 2.030078749692864 + - !!python/tuple + - 1.0737157345431911 + - 3.6919821043248 + - 1.356210469254954 + - 1.7188312378529234 + - 1.8468342297984686 + - 1.6583453200923575 + - 1.2929594613133366 + - 1.4338134805379528 + - 1.500989523566165 + - 0.9278764938900776 + - 2.1723846035698857 + - 1.4906054483491884 + - 1.6802329848592144 + - !!python/tuple + - 0.9634140533964684 + - 2.38120283087424 + - 1.3348250839311961 + - 1.8113186087899926 + - 1.8924339741121665 + - 1.6313986045025493 + - 1.4689754708389793 + - 1.2945738065997634 + - 1.6235914986426214 + - 1.0186947050734498 + - 2.446856307127847 + - 1.1293088598112377 + - 1.9741152559135586 + - !!python/tuple + - 0.7800336006453943 + - 3.264076982196087 + - 1.5606798321468864 + - 1.6452391526750834 + - 1.8656567762613538 + - 1.5415117887690672 + - 1.5695889339799602 + - 1.3258726145609099 + - 1.7620652622864243 + - 1.250654532057725 + - 2.049217029983849 + - 1.2541080215935985 + - 2.0210951482101835 + - !!python/tuple + - 1.1675216685003225 + - 3.3769690452846155 + - 1.6341688546069373 + - 1.6906952570418388 + - 1.8785162822019172 + - 2.1708574462238763 + - 2.042881955292697 + - 1.024656908791189 + - 1.8338915760140218 + - 1.3378923330973438 + - 1.4897043485876185 + - 1.3176588689162014 + - 1.3553403302968234 + - !!python/tuple + - 0.972175345633211 + - 2.8600909999318143 + - 1.4106389476453365 + - 1.5826908822143118 + - 1.6460453354564106 + - 1.6430663204297558 + - 1.4592070682869036 + - 1.1055328036768675 + - 1.3982320423555243 + - 1.0312849883639021 + - 1.8566160993060046 + - 1.0918734014531468 + - 1.5061772316045623 + - !!python/tuple + - 1.065802352410738 + - 2.580537269958539 + - 1.331237040598042 + - 1.8021086235401063 + - 1.4879114589494444 + - 2.0437105657107795 + - 1.7989912487713935 + - 0.9415625756182704 + - 2.0039372110597062 + - 1.435294636789998 + - 1.576164440519602 + - 1.0636249557128135 + - 1.3991269499026882 + - !!python/tuple + - 0.9732117436536813 + - 2.9577983674473196 + - 1.53802675150967 + - 1.715284971682692 + - 1.6806384420703493 + - 1.942266811784759 + - 1.7389347296215352 + - 1.0269750824206314 + - 1.8460953628687617 + - 1.31899919133923 + - 1.6782627972254776 + - 1.3071354583264576 + - 1.2686067578333493 + - !!python/tuple + - 1.0633359335271761 + - 3.282187222128807 + - 1.4610766222737546 + - 1.5062449025790121 + - 1.6608181790987175 + - 1.8403954772038706 + - 1.7853353256627251 + - 1.0125309464403462 + - 1.853241507317029 + - 1.3649936947412005 + - 1.3877056474945197 + - 1.3609160178021207 + - 1.3072986254742038 + - !!python/tuple + - 1.0378427314713945 + - 3.1767900452643865 + - 1.5727820467667115 + - 1.6798248350193619 + - 1.8469569285401912 + - 2.005256973646188 + - 1.9594885672044327 + - 1.0869005986714768 + - 2.006530315757363 + - 1.52904522719161 + - 1.4892646581776823 + - 1.3582039576897644 + - 1.486574568922004 + - !!python/tuple + - 0.9496316463892993 + - 2.917808639638441 + - 1.5379268258039271 + - 1.6935109257464847 + - 1.8440361139030972 + - 1.9514832936813606 + - 2.0004218573871544 + - 1.0789392598832248 + - 2.1944296891776833 + - 1.6470532181503148 + - 1.5374915429474258 + - 1.2791398373675058 + - 1.590000698372188 + - !!python/tuple + - 1.1021457022498453 + - 2.7648735808830995 + - 1.4901363212702332 + - 1.6901702783153458 + - 1.635906816356448 + - 2.0277723959588156 + - 1.9399925587533493 + - 0.9730596059555099 + - 1.9880333263560042 + - 1.5588900549951914 + - 1.4163050320085042 + - 1.1669581835809235 + - 1.2651505915267935 + - !!python/tuple + - 0.8328449042184773 + - 2.66894439080409 + - 1.545937396164754 + - 1.6098894157413137 + - 1.7359907562114845 + - 1.9475704780868925 + - 1.8938091259893137 + - 0.9221191419185093 + - 2.0005656156876377 + - 1.6422149802965498 + - 1.3081274115597157 + - 1.160332384493226 + - 1.5812678201461934 + - !!python/tuple + - 0.8753950490676108 + - 2.6802343677819778 + - 1.427031899756571 + - 1.6203403952067612 + - 1.654038729829312 + - 1.6727441948172042 + - 1.634213737819277 + - 1.0926440901799912 + - 1.810034615362721 + - 1.383255638085836 + - 1.7257622140184488 + - 1.1245654455457346 + - 1.5815156558243655 + - !!python/tuple + - 0.8410933549757065 + - 2.9521892734174577 + - 1.6793351126804756 + - 1.3976546759861854 + - 1.9654512180583426 + - 1.6558173940778032 + - 1.8697996175408556 + - 1.07270260881017 + - 1.8328308737055776 + - 1.5041988571395337 + - 1.4964934686024 + - 1.3884827968080151 + - 1.583424668974588 + - !!python/tuple + - 0.9982475080560353 + - 2.6366065523807567 + - 1.4836644375176777 + - 1.5444656148133444 + - 1.7253628386717204 + - 1.8870418486441158 + - 1.9052595156444745 + - 0.938262795307628 + - 2.048031353678004 + - 1.568385552816109 + - 1.3873933925189292 + - 1.250878607929184 + - 1.494935337323862 + - !!python/tuple + - 0.9331053584010185 + - 2.9879850183731893 + - 1.5096713162614177 + - 1.6615903650465411 + - 1.8636900337639735 + - 2.002701947214007 + - 1.876799257559274 + - 1.0465088645708494 + - 2.0696732986255895 + - 1.602335419895753 + - 1.392694426497207 + - 1.1997033945211166 + - 1.4054292176944532 + - !!python/tuple + - 0.9554181603097449 + - 2.5017365889817986 + - 1.533404673722841 + - 1.5936940776564967 + - 1.721992494946302 + - 1.8856262216315622 + - 1.9553671112785427 + - 0.9665826007853342 + - 2.166304696105056 + - 1.7171695828142304 + - 1.4348355714999288 + - 1.3714858376744408 + - 1.4651360523370371 + - !!python/tuple + - 0.8704332845011407 + - 2.7267475368413905 + - 1.5297919477842499 + - 1.5667796826654843 + - 1.649040092742248 + - 1.8020890301161792 + - 1.8525864895381816 + - 0.9654187708666981 + - 1.9675713018475807 + - 1.5394254271358858 + - 1.4740202603276487 + - 1.20128941342508 + - 1.3790596119470675 + - !!python/tuple + - 0.8938116161716108 + - 2.531492109570145 + - 1.481742234041902 + - 1.444324448922004 + - 1.681707526072318 + - 1.7307588447233386 + - 1.7086762249083498 + - 0.9229861226972274 + - 1.7442147617270822 + - 1.4550853084385378 + - 1.3806536547274355 + - 1.1484774907095638 + - 1.410528213493356 + - !!python/tuple + - 0.8230114813796785 + - 2.7463543398084083 + - 1.5269377995454168 + - 1.5034634034014318 + - 1.741470843367827 + - 1.7005820375798044 + - 1.781242993124007 + - 1.03037267082005 + - 1.8902057877703506 + - 1.5641779394272781 + - 1.4589788454513442 + - 1.1934760836220302 + - 1.3935343841345276 + - !!python/tuple + - 0.9766922207757354 + - 2.9283464999793556 + - 1.5774419249351272 + - 1.3517675738168011 + - 1.7848288064149536 + - 1.6285900913518299 + - 1.8498577663571447 + - 1.052289836066163 + - 1.8748503485341497 + - 1.5821391222197385 + - 1.3545735928342046 + - 1.4205056619832956 + - 1.389265407040684 + - !!python/tuple + - 0.9966079293092297 + - 2.5114657635136695 + - 1.4485044334891333 + - 1.4339721369344263 + - 1.4942880099070286 + - 1.6860573049408671 + - 1.745804624584542 + - 0.9425941553755476 + - 1.8488422590985025 + - 1.6160773229001344 + - 1.291850131200785 + - 1.1458453416733552 + - 1.2426547574086713 + - !!python/tuple + - 0.9236452187829909 + - 2.835013397063376 + - 1.5536991618443383 + - 1.347119866022315 + - 1.7038948867474841 + - 1.5972582318862307 + - 1.7300757949218692 + - 1.0175805720906455 + - 1.6954758790289621 + - 1.4905873102146003 + - 1.349766018922761 + - 1.187535411442261 + - 1.358452082031665 + - !!python/tuple + - 0.9118149710885594 + - 2.872088960034252 + - 1.591428396596128 + - 1.3187244800175142 + - 1.8476888291893578 + - 1.6314175175901282 + - 1.697076282751013 + - 1.0629198837850584 + - 1.698929565891265 + - 1.5976037152731084 + - 1.243444506797692 + - 1.2474939237864924 + - 1.30390255505487 + - !!python/tuple + - 1.0079811535746979 + - 2.8483734423346228 + - 1.5785423347977652 + - 1.3233163820081753 + - 1.7193432217779954 + - 1.5937513134718369 + - 1.785694743634442 + - 1.084962753606449 + - 1.7803681765851693 + - 1.6954583417702471 + - 1.2334045956598456 + - 1.2275340799473489 + - 1.2560808818240496 + - !!python/tuple + - 0.9822879644686842 + - 2.682249182739278 + - 1.6979800683180417 + - 1.4026785633792804 + - 1.7657115499447107 + - 1.6099218732647318 + - 1.828923785039223 + - 1.157696610627805 + - 1.9351860826703609 + - 1.8850605661384752 + - 1.3422984273118288 + - 1.357078455497196 + - 1.1688622192772116 + - !!python/tuple + - 0.927255777927904 + - 2.5114583687391905 + - 1.5791706143340254 + - 1.2551433327396604 + - 1.706845898555251 + - 1.4699598326312915 + - 1.6420947751969135 + - 1.05635388755082 + - 1.6284961642230127 + - 1.6580315659444411 + - 1.2864352416134661 + - 1.2406972260955813 + - 1.284402406053566 + - !!python/tuple + - 1.0728174235793695 + - 2.948474664110563 + - 1.6223570097870574 + - 1.2895604370365328 + - 1.6957974246778058 + - 1.506507511755828 + - 1.6554775122143535 + - 1.2072382857288442 + - 1.688594558015817 + - 1.788773113481745 + - 1.2076810905902153 + - 1.2253344843098455 + - 1.1591327437074797 + - !!python/tuple + - 0.8581163829713367 + - 2.6160751633851023 + - 1.5469238658534303 + - 1.4004989492158568 + - 1.7466689316476078 + - 1.5797396714473586 + - 1.6908926029995992 + - 1.1127433738476196 + - 1.8369771357265074 + - 1.7806289525726373 + - 1.3016156018537668 + - 1.1366216064201722 + - 1.3117376003812522 + - !!python/tuple + - 1.0086056897905742 + - 2.5070598929792327 + - 1.5731916719022099 + - 1.3253573378157135 + - 1.6195952529819877 + - 1.4397333954787814 + - 1.6887657962046847 + - 1.157122009493464 + - 1.7960947285980464 + - 1.8148249216596015 + - 1.355536235860626 + - 1.1873680922963266 + - 1.2163610093870165 + - !!python/tuple + - 0.9317739956880402 + - 2.4652214081957 + - 1.61261087762193 + - 1.3402268310129652 + - 1.793779375168644 + - 1.4544048811086163 + - 1.5952853999357948 + - 1.1983476341717638 + - 1.7180374451100127 + - 1.7654635004511978 + - 1.4365608629224393 + - 1.2085580842312191 + - 1.3119279243579745 + - !!python/tuple + - 0.9320466013975791 + - 2.6407054439796562 + - 1.7505385818234895 + - 1.5118395711025021 + - 1.5826798628188037 + - 1.6980418516428972 + - 1.7065838035366794 + - 1.1628459727875404 + - 1.7417568259035343 + - 2.0185834042883366 + - 1.1763189125381333 + - 1.0826415167628791 + - 1.185857814150308 + - !!python/tuple + - 1.0389051637287574 + - 2.726576226301191 + - 1.5892036676393664 + - 1.4439652987644636 + - 1.67800696441065 + - 1.5646249674265162 + - 1.6335573265766414 + - 1.2626900299435047 + - 1.8103591138313258 + - 1.8981669409174746 + - 1.329926934675691 + - 1.1389265990880104 + - 1.1720415741021735 + - !!python/tuple + - 1.013124670610281 + - 2.4555670257561655 + - 1.6008820897637355 + - 1.3714362988602726 + - 1.6551273868625214 + - 1.5066774076854643 + - 1.597650326959368 + - 1.22734984800063 + - 1.7556757975187864 + - 2.002124265366334 + - 1.22713166072946 + - 1.1364777917327828 + - 1.1399077517267604 + - !!python/tuple + - 0.9480309597379635 + - 2.666983383392136 + - 1.7004108050783533 + - 1.5140877249096751 + - 1.7538916884083087 + - 1.718705176502463 + - 1.576015471733389 + - 1.2593886648495167 + - 1.726153176168088 + - 2.0720290789607754 + - 1.144505503515847 + - 1.1414594899282204 + - 1.2947673589539328 + - !!python/tuple + - 0.9480309597379635 + - 2.666983383392136 + - 1.7004108050783533 + - 1.5140877249096751 + - 1.7538916884083087 + - 1.718705176502463 + - 1.576015471733389 + - 1.2593886648495167 + - 1.726153176168088 + - 2.0720290789607754 + - 1.144505503515847 + - 1.1414594899282204 + - 1.2947673589539328 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.0450833384709277 + - 1.2937683006525018 + - 2.0237467357627263 + - 1.7480792588477518 + - 0.9505396570058843 + - 3.880105213568732 + - 2.0046819654751173 + - 1.9995159694845652 + - 1.7677040777306823 + - 1.7336315579923123 + - 1.4668097270162486 + - 1.2925091696336641 + - 1.9923513428087543 + - !!python/tuple + - 0.929288056208194 + - 1.3426475683300088 + - 2.499188583351146 + - 1.5802570971577459 + - 0.9433858394683275 + - 4.000675114744174 + - 2.0097675955537175 + - 1.6765815242139366 + - 1.8652251655911938 + - 1.8952615622465658 + - 1.337727336892951 + - 1.2922168939820984 + - 1.9808562384170634 + - !!python/tuple + - 1.3601004803356487 + - 1.4697109968387987 + - 2.2460091786277294 + - 1.8295065813636917 + - 1.016794170552349 + - 3.850290234388277 + - 2.003887315505621 + - 1.7918394762455994 + - 1.9864880172813248 + - 1.7455451311909898 + - 1.3682249904675623 + - 1.4388624413938151 + - 1.8653870966430315 + - !!python/tuple + - 1.15608718357003 + - 1.693196396567785 + - 1.9285178636855453 + - 1.3835443222873502 + - 0.9420267671820917 + - 3.8825791135999115 + - 2.0156297326175263 + - 1.668316990253135 + - 1.983864169669477 + - 2.1215537590045357 + - 1.4877247966501717 + - 1.3087973318166393 + - 1.952828522553214 + - !!python/tuple + - 1.38956103697094 + - 1.4744704497355117 + - 1.7221624045718964 + - 1.5862512851966364 + - 0.8383631136727235 + - 3.55092925454431 + - 1.8649125981244885 + - 1.7723511739538933 + - 1.983835831727887 + - 1.9710746913881487 + - 1.4517492216480026 + - 1.3963149177827097 + - 1.5418127749559811 + - !!python/tuple + - 0.955799310645363 + - 1.779865481974905 + - 2.662453309986923 + - 1.5805524282121015 + - 1.1027625386046132 + - 3.541031984076712 + - 1.9392159815952834 + - 1.8222708201847202 + - 1.8964535246542842 + - 2.0145397715986104 + - 1.6444952872367333 + - 1.6033901303583373 + - 1.870157221310182 + - !!python/tuple + - 1.1280917170329028 + - 1.5827261068046146 + - 2.0570466350084344 + - 1.1546595749355792 + - 0.7451034653840185 + - 3.496625399009867 + - 1.8649070888542134 + - 1.656931148630897 + - 1.7900981045905886 + - 1.8093498872828886 + - 1.3946089471478145 + - 1.1677342481578343 + - 1.5095220543868582 + - !!python/tuple + - 1.5838152638995528 + - 1.7503613648632297 + - 3.2159008197151264 + - 1.4261232919155558 + - 1.0050102243012824 + - 2.921473496797 + - 1.4186024030754876 + - 1.4993472697516692 + - 1.9071587398037986 + - 2.2592413629804886 + - 1.4184368000419456 + - 1.4645902330795264 + - 1.924285667234832 + - !!python/tuple + - 1.4103210699249273 + - 1.6289277842225474 + - 2.0753701732239356 + - 1.1798053948161098 + - 0.8697911316486344 + - 3.6751195759527233 + - 1.7764166404605488 + - 1.3631108414827682 + - 1.9759839009181874 + - 1.6301350804546244 + - 1.4575501818489314 + - 1.3996993918889518 + - 1.6943339603935477 + - !!python/tuple + - 0.8579009759974745 + - 2.0678568501460997 + - 1.940333262330928 + - 1.1857574630528367 + - 0.8940764073439804 + - 3.0815991770781537 + - 1.9323577419111584 + - 1.4343105508536924 + - 1.8443766326299542 + - 2.515076054075222 + - 1.4925037617945278 + - 1.3951649388072271 + - 2.159571056994177 + - !!python/tuple + - 1.3630100337539068 + - 2.3044769957595643 + - 2.728264424598384 + - 1.0307246789279083 + - 0.9338718089609298 + - 2.844430577211278 + - 1.7840881762378753 + - 1.551327336566249 + - 1.855690085599927 + - 2.6476788425572777 + - 1.6873074744461047 + - 1.5784349713409254 + - 1.8012122924027774 + - !!python/tuple + - 1.308289537683169 + - 2.10497630108752 + - 2.3212136731348765 + - 1.1937813049017834 + - 0.993113917634646 + - 3.3308772914202853 + - 1.8264073659398967 + - 1.5959695598876724 + - 2.154473047030275 + - 2.402357307938675 + - 1.6527072501992102 + - 1.523463192962733 + - 1.8079983996121107 + - !!python/tuple + - 1.168417464014435 + - 2.3018966425664846 + - 2.3288101305878457 + - 1.0947993397276992 + - 1.0291861126281976 + - 2.8007572082145398 + - 1.6488468060004708 + - 1.9087488004648658 + - 1.6422056201905937 + - 2.0259543663824795 + - 1.888132747940783 + - 1.4659304055296545 + - 2.2434037912678786 + - !!python/tuple + - 1.3147593360241079 + - 2.054485332039646 + - 3.0397805343708577 + - 1.1410896109594575 + - 0.8575786105261374 + - 2.2167263392589844 + - 1.3102134146303925 + - 1.587009820028318 + - 1.7007117049802092 + - 1.9628766724552613 + - 1.654434787367933 + - 1.648960971868077 + - 1.5855815366259502 + - !!python/tuple + - 1.0925181512506386 + - 2.0162612436902005 + - 2.4729119853381043 + - 1.0128684325776074 + - 0.8917007782428652 + - 2.918318500731313 + - 1.5996997040712855 + - 1.4958790143711775 + - 1.8067926027897756 + - 2.351410834942211 + - 1.6461547373045538 + - 1.4579822054884235 + - 1.5250729413636464 + - !!python/tuple + - 0.7880464011377732 + - 2.2220629279115176 + - 2.2963200113219275 + - 1.1076995639138134 + - 1.013031124288335 + - 2.5817065192235136 + - 1.2550735500142354 + - 1.5900386064241876 + - 1.7039236804208941 + - 1.4540395229522307 + - 1.7427840573555846 + - 1.4756330350747933 + - 2.170463594963215 + - !!python/tuple + - 1.428037731214565 + - 2.3835773637595663 + - 1.9536039692294005 + - 1.3335826586004513 + - 0.9388609805527453 + - 1.9174056474230268 + - 1.2422652464620902 + - 1.7067323633403815 + - 1.6844480485748934 + - 2.1905106927944726 + - 1.7628835335330852 + - 1.6726915283223598 + - 1.7112593132915277 + - !!python/tuple + - 0.909860848085229 + - 2.087522054164171 + - 1.8619937327078007 + - 1.2004311162464003 + - 0.9284391657569746 + - 2.528378423108752 + - 1.2677903304165212 + - 1.6663009017422452 + - 1.5761641942321878 + - 1.7801138648561579 + - 1.6781335547732612 + - 1.349680424980187 + - 1.8554510815148197 + - !!python/tuple + - 0.9320349176353364 + - 2.2423306788896435 + - 2.4210213197990655 + - 1.2242798048785861 + - 0.9141164966848732 + - 1.7315135584646404 + - 0.9527867493603335 + - 1.6280481927085513 + - 1.5418602291161476 + - 1.811790518832955 + - 1.6736397814981374 + - 1.5391411054361903 + - 1.5657111015552474 + - !!python/tuple + - 0.8076958987801408 + - 2.259249737074725 + - 1.4713743811351696 + - 1.3650722080893611 + - 1.0101585523028724 + - 2.4130743605592073 + - 1.4870918177802268 + - 1.4330954786314563 + - 1.8762634875626591 + - 2.1968323757621304 + - 1.598223491806172 + - 1.5535236142012825 + - 1.767366774804221 + - !!python/tuple + - 1.0927259810942822 + - 2.0902426100888656 + - 2.3217481851369945 + - 1.1381723452740657 + - 0.9168526297440919 + - 2.5150209783225432 + - 1.3581025470352484 + - 1.5200765977771322 + - 1.7283072000233066 + - 1.976408303416692 + - 1.639648347052653 + - 1.5030767202750464 + - 1.5639757057150372 + - !!python/tuple + - 1.2117237937696483 + - 2.360031980759885 + - 1.6471615819809111 + - 1.108154128554148 + - 0.9340959191232198 + - 2.0875305365291768 + - 1.1467219346405295 + - 1.501251214331472 + - 1.7785083796042849 + - 1.9134435493580408 + - 1.7041543835418227 + - 1.4842543493948859 + - 1.648942035198987 + - !!python/tuple + - 1.1675026794603136 + - 2.3693951184197304 + - 1.6754041774331503 + - 1.3480255459533423 + - 1.0305042675697178 + - 2.0253073337310035 + - 1.1559473080261633 + - 1.5681972851748176 + - 1.7825769211235194 + - 2.1692819196208846 + - 1.7431718030176018 + - 1.606718245885043 + - 1.53300067132584 + - !!python/tuple + - 1.0027501513004804 + - 2.3758588341018063 + - 1.504362565320864 + - 1.2806980162541595 + - 1.0286458125531568 + - 2.158362828400436 + - 1.1781801986880733 + - 1.3538105145691222 + - 1.8527048135089155 + - 1.9022025521357033 + - 1.6437473746574358 + - 1.5935435673908143 + - 1.6603786361238253 + - !!python/tuple + - 1.158091428477909 + - 2.4196554989364443 + - 1.7581795144673689 + - 1.2409506974645177 + - 1.0325826549492663 + - 1.8519695585803708 + - 1.0677369902740885 + - 1.4293464645790028 + - 1.8639342196381956 + - 2.072229100604784 + - 1.753324335493595 + - 1.6572955428975094 + - 1.558730495200019 + - !!python/tuple + - 1.0461157791973845 + - 2.3417334943084125 + - 1.5786438959310396 + - 1.3164318374353172 + - 0.9914889330267442 + - 1.8842298434894298 + - 1.0605401167462052 + - 1.4838726907908137 + - 1.8569158223158218 + - 2.0487971662388365 + - 1.6841002610780564 + - 1.5925180854525918 + - 1.459792617120803 + - !!python/tuple + - 1.014912324517253 + - 2.3583109275073744 + - 1.7367952992942373 + - 1.2626348650732653 + - 1.003105486534166 + - 2.008693480468595 + - 1.1889571936721206 + - 1.3548196981354592 + - 1.8691144883397994 + - 2.148906615366437 + - 1.6474603563048502 + - 1.6351098703784488 + - 1.4359243497581065 + - !!python/tuple + - 0.9870223027020948 + - 2.3844707474472284 + - 1.5236444382469099 + - 1.2752270798724443 + - 1.019552478322018 + - 1.9986743496095771 + - 1.12973479389302 + - 1.3653148604260266 + - 1.8626794749279045 + - 2.048606593573937 + - 1.6632522637014073 + - 1.59269321708728 + - 1.5381319266578148 + - !!python/tuple + - 1.0976261772722673 + - 2.215070557599609 + - 1.7779973905176285 + - 1.3880326024008383 + - 1.0367443616119367 + - 2.06148733451163 + - 1.0948140243754925 + - 1.390843425575923 + - 1.9774192414529754 + - 1.9917702130688442 + - 1.62212772102767 + - 1.6330932860434473 + - 1.3848695209692217 + - !!python/tuple + - 1.0640171089035169 + - 2.298843347555343 + - 1.6251743286938884 + - 1.2472554655948653 + - 0.9613979365813405 + - 1.9834038244265821 + - 1.111979086866449 + - 1.3343320001122199 + - 1.8872562723266006 + - 1.9685202078798616 + - 1.5808226456033139 + - 1.5584758858372214 + - 1.3909839766533607 + - !!python/tuple + - 1.0087142379515188 + - 2.276863432914312 + - 1.7070996215089438 + - 1.3334510371927748 + - 0.9834149743360325 + - 1.8722564550546537 + - 1.0839712508195407 + - 1.3923818305796405 + - 1.8808168691369611 + - 2.0407025626774393 + - 1.6060297954584786 + - 1.6084781309033982 + - 1.29465073712897 + - !!python/tuple + - 1.0390193721097005 + - 2.3439059545595335 + - 1.7520291794387095 + - 1.3056834168758757 + - 1.0242740397312922 + - 1.9425069968440467 + - 1.11246702190817 + - 1.3632086250311002 + - 1.8589462461639297 + - 2.0824161228446445 + - 1.6262944809862996 + - 1.6038332493963794 + - 1.5067540126836039 + - !!python/tuple + - 0.9997185699041671 + - 2.22185448063152 + - 1.6445552020553174 + - 1.3301433793536428 + - 0.9870698437715795 + - 1.9548447445953134 + - 1.081946903687778 + - 1.33110076677052 + - 1.9101608483828807 + - 2.0091559997172124 + - 1.5681259423758223 + - 1.5819427756462272 + - 1.3222819871688074 + - !!python/tuple + - 1.027153354061232 + - 2.2056361927097043 + - 1.7656938436664222 + - 1.3492925164861624 + - 1.002120759312355 + - 2.0135487493556097 + - 1.1035003683471052 + - 1.3967444304282832 + - 1.8661595503252517 + - 1.946097261512584 + - 1.5904626415450065 + - 1.575900635611261 + - 1.3668520938075563 + - !!python/tuple + - 0.993637003459181 + - 2.253882497650178 + - 1.8463189582755097 + - 1.3436373193597428 + - 1.0345479305912193 + - 1.9092164788381398 + - 1.0636222581067525 + - 1.2396314229228913 + - 1.980192590283423 + - 1.9431132911880877 + - 1.5361491284573892 + - 1.6328184402203167 + - 1.3338759685142945 + - !!python/tuple + - 1.0002915022409198 + - 2.2805611088071434 + - 1.671898824580496 + - 1.3434477070935713 + - 1.0209504252176511 + - 1.8515596490514752 + - 1.0549584740811677 + - 1.3345564789282436 + - 1.865067688344666 + - 2.0400922500878127 + - 1.5751601013038268 + - 1.5695323774298497 + - 1.3894386373028875 + - !!python/tuple + - 1.0002915022409198 + - 2.2805611088071434 + - 1.671898824580496 + - 1.3434477070935713 + - 1.0209504252176511 + - 1.8515596490514752 + - 1.0549584740811677 + - 1.3345564789282436 + - 1.865067688344666 + - 2.0400922500878127 + - 1.5751601013038268 + - 1.5695323774298497 + - 1.3894386373028875 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.6653610301170092 + - 2.009005191835537 + - 2.597960071275674 + - 1.139066962877897 + - 1.6058094645956102 + - 2.7219902955640367 + - 1.9462468909319943 + - 1.1341370841311162 + - 1.8593661329070323 + - 0.7197243010518217 + - 1.6605365402904222 + - 1.6423622766037118 + - 1.8791645984259708 + - !!python/tuple + - 1.8387258028940923 + - 2.081696913661135 + - 2.8496460538289976 + - 1.15500538991844 + - 1.7546579310020476 + - 2.4387731553467837 + - 1.888582385828756 + - 1.2422906535250642 + - 2.0306178363256278 + - 0.9974986914908326 + - 1.514293176762496 + - 1.8019749202107658 + - 1.6708778057381282 + - !!python/tuple + - 1.4766924801344046 + - 1.933485384031862 + - 2.5579030816034725 + - 1.4099422968931017 + - 2.1532668567864235 + - 2.3886109043350903 + - 1.5736414160832493 + - 1.0786687537743334 + - 1.7355677761403963 + - 0.8788671396520638 + - 1.4663917400333213 + - 1.7340836770118404 + - 1.7800255124173134 + - !!python/tuple + - 1.713764905170394 + - 1.667196534192295 + - 1.5682794302432104 + - 1.2596810826271576 + - 2.1927049083898495 + - 2.0250845827179247 + - 1.4727589823765368 + - 0.9958973088041607 + - 2.2984040294686063 + - 1.2118089999488282 + - 1.160220438941741 + - 1.6234495698709765 + - 1.3678232206440017 + - !!python/tuple + - 1.0718702266365603 + - 1.6648710711338954 + - 2.747927262640254 + - 1.3535560572469874 + - 2.116839706557451 + - 2.2511637576862134 + - 1.661872694189554 + - 1.0079804892313735 + - 2.317194105122458 + - 0.872450479993667 + - 1.3305677153211009 + - 1.61496051635965 + - 1.596631066356018 + - !!python/tuple + - 1.2250063048734545 + - 1.9116879898651349 + - 3.140337143503596 + - 1.320667147019606 + - 2.0948566567570617 + - 2.220083227833773 + - 1.8977723156723496 + - 1.292219155882006 + - 2.1488969589492912 + - 0.9580233668773338 + - 1.311086763234831 + - 1.5772762931377007 + - 1.6065832818080903 + - !!python/tuple + - 0.9024339689073 + - 1.6730354307785928 + - 2.3281582468589077 + - 1.5008020227473444 + - 2.654673068060163 + - 2.0179563353517476 + - 1.6797527853900593 + - 1.1412969202939323 + - 2.3643598990636683 + - 1.0405680803751522 + - 1.3748390893913123 + - 1.4428163625535364 + - 1.5262138755844337 + - !!python/tuple + - 0.8500340578644607 + - 2.1809517776629948 + - 2.2255465318722063 + - 1.4403337979849955 + - 2.5500875714100313 + - 1.9752805547816918 + - 1.652849918836529 + - 1.2476968508610973 + - 2.2904919048696284 + - 1.0187543634730778 + - 1.2442425100794563 + - 1.4196082659543021 + - 1.545648457561995 + - !!python/tuple + - 0.9738738146736252 + - 1.8817765681098342 + - 2.32739583127856 + - 1.374935828978047 + - 1.8601404894908757 + - 2.1626568827589754 + - 1.4415404324435548 + - 1.2112066129265489 + - 2.1747182509856264 + - 0.9484677626163194 + - 1.2908176705474386 + - 1.0852208256482556 + - 1.6126461482586256 + - !!python/tuple + - 1.1930877116012617 + - 1.9263989897470166 + - 2.842423504863477 + - 1.2876194770064429 + - 2.0455734607811413 + - 1.9380151333132938 + - 1.842930857925888 + - 1.2927133393055568 + - 2.4783634573313513 + - 1.2175019998242196 + - 1.2000923109406965 + - 1.4069690361089484 + - 1.404315252067906 + - !!python/tuple + - 1.2865503208692421 + - 2.0355913201180766 + - 2.351504061063516 + - 1.1727174785929626 + - 1.837676481688196 + - 1.8383864221572703 + - 1.5243144425630637 + - 1.3161230397072992 + - 2.553847356485031 + - 1.30232093493517 + - 0.7989132316888772 + - 1.3435540169233795 + - 1.2958526800156693 + - !!python/tuple + - 1.3402456125523594 + - 1.857263289113877 + - 2.450001125526172 + - 1.2148963934532864 + - 1.9613032625785922 + - 1.841936806270494 + - 1.2793656211297764 + - 1.2480969262408637 + - 2.1515497005492596 + - 1.1582488215153472 + - 1.0983235366680106 + - 1.4313027419873183 + - 1.3645061985472613 + - !!python/tuple + - 0.8929600641995292 + - 1.869207386075574 + - 2.7956460921170714 + - 1.2534433340700954 + - 1.965641818780381 + - 1.7760296932012594 + - 1.5469782807986556 + - 1.3245812686618912 + - 2.3741822755456585 + - 1.1582442093315346 + - 1.0576288278133292 + - 1.1843116715940618 + - 1.3741342287139102 + - !!python/tuple + - 1.1354121205081 + - 1.747133547462126 + - 2.295322495721061 + - 1.2955187937383366 + - 1.949411064638082 + - 1.6426542611441044 + - 1.2951982788153535 + - 1.227049751564077 + - 2.376397290151206 + - 1.2807767371740646 + - 0.9434835661981391 + - 1.2146476909414212 + - 1.258596037756445 + - !!python/tuple + - 1.2136903147519877 + - 1.7628590631847945 + - 2.6852678873026714 + - 1.2321243260773462 + - 1.726171196250771 + - 1.664042438116921 + - 1.2488231279491582 + - 1.2259253336673737 + - 2.2677062203403664 + - 1.218484946421809 + - 0.9592825140701136 + - 1.350762923588397 + - 1.2924185261604375 + - !!python/tuple + - 1.1004147512455775 + - 1.8084776405847154 + - 2.092593951264255 + - 1.1495904564383426 + - 1.8980709403875355 + - 1.6401365670288346 + - 1.2528598850811055 + - 1.2332059368960753 + - 2.3664692032775534 + - 1.2474866189144382 + - 1.0227989852284094 + - 1.2100287674263521 + - 1.2892882490605357 + - !!python/tuple + - 1.045432317277193 + - 1.9923743398404452 + - 2.5665220759455334 + - 1.2159840619394457 + - 1.6619573618654733 + - 1.5828144634235235 + - 1.2034866692437678 + - 1.3024792001655383 + - 2.2207682580856103 + - 1.2783913078848412 + - 0.9934901242684697 + - 1.1088715475409194 + - 1.319024734187023 + - !!python/tuple + - 1.0608876875129978 + - 1.9730828490729788 + - 2.7750888689699647 + - 1.2554878868424184 + - 1.7386016556748214 + - 1.6166369971068935 + - 1.2955040625853018 + - 1.47664360183771 + - 2.2032051661436007 + - 1.217784512937149 + - 1.1528957015403765 + - 1.265812270441194 + - 1.431626492656052 + - !!python/tuple + - 1.138287514985222 + - 1.9541178421141359 + - 2.3653229369645583 + - 1.1684560085128646 + - 1.6187370956442466 + - 1.6260533517631428 + - 1.2486803204983767 + - 1.391066860238419 + - 2.374098452845095 + - 1.2804610199336008 + - 0.9557401629996103 + - 1.157612690119102 + - 1.3210299857264347 + - !!python/tuple + - 1.0827976108749529 + - 1.7109953131869786 + - 2.519923713391459 + - 1.1524771249894634 + - 1.6171876648566021 + - 1.5839968201773673 + - 1.2410752896676547 + - 1.3070943288164836 + - 2.344151768909764 + - 1.2748822570913312 + - 1.0669992088992546 + - 1.1606849556880365 + - 1.3201678209453012 + - !!python/tuple + - 1.1476110298776159 + - 1.9591896228262695 + - 2.4825228977592957 + - 1.099510254962746 + - 1.680000762885186 + - 1.6067267552087525 + - 1.1794288599857357 + - 1.3478884665608852 + - 2.2763182849455434 + - 1.307566172393304 + - 1.0710976891302955 + - 1.2719619262741517 + - 1.3584825213285106 + - !!python/tuple + - 1.1760891815575572 + - 1.9726817291178131 + - 2.485883877466891 + - 1.1402907420653259 + - 1.581632771745717 + - 1.479073774626452 + - 1.1376690918141064 + - 1.3837304276396907 + - 2.3242314897783016 + - 1.3984222638893584 + - 1.000822226505194 + - 1.2575609490110793 + - 1.3223939505092264 + - !!python/tuple + - 1.1732716546657203 + - 1.796767823382179 + - 2.4975775586732274 + - 1.1802399644786625 + - 1.828083066443544 + - 1.5727683914278043 + - 1.3097777351117101 + - 1.4050330627856766 + - 2.4607733461009236 + - 1.3628562845476226 + - 1.0415063889037595 + - 1.389012452394343 + - 1.34623754749303 + - !!python/tuple + - 1.0702664247150144 + - 1.8185105835354731 + - 2.7904786800793495 + - 1.2170201879449003 + - 1.6091594235072848 + - 1.5140198682119315 + - 1.238607923210198 + - 1.4418867628194496 + - 2.4215938293058725 + - 1.3682777535770239 + - 1.0902400442140994 + - 1.214781463989735 + - 1.3442550365352943 + - !!python/tuple + - 0.9974953689752042 + - 1.7916205733837762 + - 2.7796142294326005 + - 1.3109331180765003 + - 1.765280713107761 + - 1.4572368132639277 + - 1.294089328662397 + - 1.4580595840090862 + - 2.4431434002951704 + - 1.3895283420588713 + - 1.0850857448803382 + - 1.3002054595238817 + - 1.3888131518518676 + - !!python/tuple + - 1.0867028303008792 + - 1.8240981370605627 + - 2.4979065947898906 + - 1.0869837145097645 + - 1.649598561769241 + - 1.451933171786891 + - 1.1094082070456133 + - 1.3335494062648878 + - 2.475321729791536 + - 1.4811432203340682 + - 1.0673226452994518 + - 1.3327549434333772 + - 1.3512915146861775 + - !!python/tuple + - 1.0713869837191101 + - 1.8507740842596432 + - 2.6735018311066545 + - 1.2065423699972915 + - 1.7711508743911 + - 1.4567527943095677 + - 1.271903464725034 + - 1.4647705736967795 + - 2.546501362040981 + - 1.4572670527399314 + - 1.1189980269732007 + - 1.4052352028245627 + - 1.3843441689050948 + - !!python/tuple + - 1.0445527907018426 + - 1.8060346286062297 + - 2.487982992863974 + - 1.141327929787436 + - 1.8151346112200826 + - 1.4133489848086058 + - 1.2105214839016556 + - 1.3802545170277032 + - 2.5286006521169053 + - 1.44943384446593 + - 1.0595800334016892 + - 1.4330578293419651 + - 1.354446892084133 + - !!python/tuple + - 1.0090922309411887 + - 1.859114928988586 + - 2.7490261826261575 + - 1.177526796696312 + - 1.7574510992950019 + - 1.4290360061400493 + - 1.2190195257770142 + - 1.4338817445669254 + - 2.5194407735567417 + - 1.4795205044415682 + - 1.1271337300208646 + - 1.4441264947741312 + - 1.420043240035171 + - !!python/tuple + - 1.0459158425636925 + - 1.8493604403483772 + - 2.5644770026606913 + - 1.1019614299521039 + - 1.6042859257592974 + - 1.4199127760941797 + - 1.1238940974698202 + - 1.377669912960675 + - 2.4572091721790166 + - 1.4747988481845813 + - 1.111527982394991 + - 1.3506514162998986 + - 1.4004894513300554 + - !!python/tuple + - 1.0512187611230743 + - 1.8401351295466934 + - 2.619611269077799 + - 1.1399190637956402 + - 1.6423331514904291 + - 1.4117477874002935 + - 1.126075498612543 + - 1.398852124248295 + - 2.4795280910817104 + - 1.498457756194871 + - 1.1261067160135507 + - 1.3743039326249875 + - 1.4057522964686302 + - !!python/tuple + - 1.0568695011920228 + - 1.8527055468322842 + - 2.6350021431767905 + - 1.13863883390761 + - 1.6522154429398543 + - 1.379189617439065 + - 1.1424959240547823 + - 1.4160443620162004 + - 2.503396824618787 + - 1.5183185071550556 + - 1.0884469946178732 + - 1.3981824873934066 + - 1.3895194824684718 + - !!python/tuple + - 1.0437464826724525 + - 1.891102198733448 + - 2.42674090498766 + - 1.1058916398784344 + - 1.5873782913616408 + - 1.417705747974596 + - 1.1250306019565348 + - 1.385417995241319 + - 2.588305411705253 + - 1.5335806164831534 + - 1.025541113772083 + - 1.3513751699570522 + - 1.3952785074488039 + - !!python/tuple + - 1.000578003574105 + - 1.913969206517902 + - 2.5818128773026343 + - 1.1699255295464313 + - 1.681874992129781 + - 1.3907289773021385 + - 1.1563433414340882 + - 1.428591475148858 + - 2.516534393084654 + - 1.5162755409053377 + - 1.1209902348132268 + - 1.4460655806580978 + - 1.4644864423709614 + - !!python/tuple + - 1.01629004920665 + - 1.891425794778455 + - 2.5490787692624233 + - 1.142905254653217 + - 1.7121698462485642 + - 1.4065255833482468 + - 1.1754788025127612 + - 1.3903876978986043 + - 2.5886306894820397 + - 1.5450465190243656 + - 1.0628979327525618 + - 1.4761935941300741 + - 1.4361342999647642 + - !!python/tuple + - 0.9781597241908395 + - 1.9008657346568858 + - 2.463202300253437 + - 1.1479433684916678 + - 1.7411592422615614 + - 1.475339121069877 + - 1.174951037068694 + - 1.3458502405454256 + - 2.615113875038032 + - 1.5347874012578164 + - 1.1007170465598883 + - 1.4973838784388565 + - 1.4945481952892146 + - !!python/tuple + - 0.9781597241908395 + - 1.9008657346568858 + - 2.463202300253437 + - 1.1479433684916678 + - 1.7411592422615614 + - 1.475339121069877 + - 1.174951037068694 + - 1.3458502405454256 + - 2.615113875038032 + - 1.5347874012578164 + - 1.1007170465598883 + - 1.4973838784388565 + - 1.4945481952892146 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 2.333139014495381 + - 1.8411427467830128 + - 1.3662299354598373 + - 2.3598667387201706 + - 1.1316374600309187 + - 1.146358682151709 + - 1.2921451496038676 + - 1.480907078021934 + - 1.2485815034949619 + - 1.3968436995146967 + - 1.6831662250133064 + - 1.1347041434904588 + - 2.4358417054773467 + - !!python/tuple + - 2.301265377619315 + - 1.8530081344627296 + - 1.2312772294202738 + - 1.610700093858009 + - 1.0497581815577937 + - 0.9472047803478709 + - 1.2577662956639235 + - 1.481019057537204 + - 0.9218894474150479 + - 1.3185891084469212 + - 2.623004350448423 + - 1.0852392745816613 + - 2.2992855198112774 + - !!python/tuple + - 1.6639455228226177 + - 1.860967912246083 + - 1.3060281134775662 + - 2.166186519850268 + - 1.0391348077632556 + - 1.0215219713783337 + - 1.3078633298739177 + - 1.3275030937154533 + - 1.0000538914976755 + - 1.2586807416672934 + - 2.2748704806436466 + - 1.004319518439514 + - 2.3857630689596445 + - !!python/tuple + - 2.0811461485092106 + - 1.9788402683383763 + - 1.3716664723453684 + - 1.794978821207815 + - 1.0851772886404536 + - 0.9257822006869776 + - 1.4636550806128457 + - 1.3265172144244244 + - 1.079019834958322 + - 1.4205565509809246 + - 1.9681692790872782 + - 1.1895623613123323 + - 2.4115075349092967 + - !!python/tuple + - 1.9445648206570034 + - 1.9200747705708927 + - 1.557263764534967 + - 1.8209439596639332 + - 1.2851811684042929 + - 1.000088076501124 + - 1.4913698337817871 + - 1.339150483166718 + - 0.8331838936685803 + - 1.4307046340517628 + - 1.3730145634919473 + - 1.1721315302527588 + - 2.416032952943901 + - !!python/tuple + - 1.8507289050775775 + - 2.1074075895457356 + - 1.4640536378969125 + - 1.6544996422559715 + - 1.173809751740989 + - 0.8252179255858911 + - 1.4897490713858408 + - 1.1662157278045266 + - 0.9059425828284744 + - 1.4878615135667235 + - 1.3919964982171797 + - 1.234513458957474 + - 2.436448798199982 + - !!python/tuple + - 1.753409478361811 + - 2.078133087459053 + - 1.4907928969871087 + - 1.7029704711121054 + - 1.1830954674981766 + - 0.8405672634794001 + - 1.4499631545192722 + - 1.1897297928245947 + - 0.9460154102166445 + - 1.495281232518971 + - 1.5304918597651254 + - 1.219176060163385 + - 2.531123810511757 + - !!python/tuple + - 1.4692968685891752 + - 1.9878085465786013 + - 1.7507971789626728 + - 1.7744728372288412 + - 1.242775541493552 + - 0.9038789397481237 + - 1.6709648673130357 + - 1.0612279985484903 + - 0.8338839655479988 + - 1.4833610755397666 + - 1.6288876146709363 + - 1.2207247288412262 + - 2.4349556157560626 + - !!python/tuple + - 1.5379318860892641 + - 2.1163797661808026 + - 1.6461461951698824 + - 1.9854860235015745 + - 1.303982827783971 + - 1.092775499329409 + - 1.7449936499708025 + - 0.9807542082881024 + - 0.918623511189015 + - 1.4849439628902135 + - 1.7520730937293543 + - 1.2901702906295838 + - 2.368630778195335 + - !!python/tuple + - 1.742332271255866 + - 2.2650390946651946 + - 1.6003968804268307 + - 1.8532613810742324 + - 1.3490533559869167 + - 1.133796256485528 + - 1.6019022962312714 + - 0.9366110741422298 + - 0.9230697177381793 + - 1.534729724646197 + - 1.9602286751625753 + - 1.349364382349683 + - 2.418059977156724 + - !!python/tuple + - 1.476920460201831 + - 2.172600518423784 + - 1.7537691242486972 + - 1.7726615143850786 + - 1.3508710054443458 + - 1.0400355189604271 + - 1.7452234148148342 + - 0.9078143064152056 + - 0.822945639335672 + - 1.5490525278800216 + - 1.860694376797644 + - 1.3405635765584383 + - 2.399792543852265 + - !!python/tuple + - 1.706343102993504 + - 2.1642597701030653 + - 1.6106310166815097 + - 1.7121889300614286 + - 1.2970506834276998 + - 1.0204605084492313 + - 1.6851212973153344 + - 1.0075100973835802 + - 0.8722754591764317 + - 1.5403874287988568 + - 1.9332572591577437 + - 1.3524005471868583 + - 2.3744396256713407 + - !!python/tuple + - 1.5540352201693008 + - 2.1807419916344593 + - 1.631775220046303 + - 1.8635080818122103 + - 1.3134607919792831 + - 1.0483236678207648 + - 1.6343779244455392 + - 1.036878864101248 + - 0.8659231222305828 + - 1.5679523239211914 + - 1.9521945423283267 + - 1.3663238935476576 + - 2.4134956357813486 + - !!python/tuple + - 1.4968164235030326 + - 2.340292386429279 + - 1.6201371731060412 + - 1.7322895230897855 + - 1.3669285201532495 + - 1.073147784222574 + - 1.7100805504202237 + - 0.9217016671413437 + - 0.8016918793332447 + - 1.48648612717222 + - 1.8683317038870881 + - 1.2872039335516068 + - 2.4068010822372576 + - !!python/tuple + - 1.6051675196850288 + - 2.2975862158320703 + - 1.5175338722347518 + - 1.7652619957509719 + - 1.3350302237693 + - 1.034753716584816 + - 1.6676272632084936 + - 1.074505494007565 + - 0.8718050828088953 + - 1.5384939326862963 + - 1.786116225526367 + - 1.3464831057481712 + - 2.4451581375491642 + - !!python/tuple + - 1.3920604699347097 + - 2.376088184392995 + - 1.6515554523997427 + - 1.84935003113432 + - 1.4275549564299062 + - 1.1174823314003814 + - 1.67135243943619 + - 1.006519212644625 + - 0.836334307507687 + - 1.5562155235637936 + - 1.849650462648614 + - 1.3407351000084529 + - 2.5259724893498072 + - !!python/tuple + - 1.6592974470674402 + - 2.3882036319667934 + - 1.613831714674797 + - 1.5434444851686282 + - 1.421064161892268 + - 1.0777157042526107 + - 1.7813717655582388 + - 0.9407756057962222 + - 0.8422107933864085 + - 1.4983772409289569 + - 1.7881118779198217 + - 1.3069833010854979 + - 2.473816666107129 + - !!python/tuple + - 1.7156632390865614 + - 2.4288144219746135 + - 1.5170809017453348 + - 1.7154782490261573 + - 1.444142849767087 + - 1.1879146977936652 + - 1.571719210066576 + - 0.9835894823732887 + - 0.8404184844221824 + - 1.4922570092482794 + - 1.9796395006812348 + - 1.3032533985416013 + - 2.491540494145754 + - !!python/tuple + - 1.6272479732789886 + - 2.331465506191315 + - 1.6014437718200552 + - 1.6629068875590962 + - 1.4213023868003458 + - 1.0974939139486992 + - 1.6641156094867156 + - 0.9977697993986274 + - 0.8099718136958056 + - 1.5302321154536693 + - 1.799135481312316 + - 1.3315374971453688 + - 2.4738058474039923 + - !!python/tuple + - 1.552661236642838 + - 2.5770735777024196 + - 1.466654042807947 + - 1.5239704195348176 + - 1.4264193520918356 + - 1.0697745416510775 + - 1.6088380077685083 + - 0.9653767965564398 + - 0.7935910849384042 + - 1.4939775598863931 + - 1.9175767329670033 + - 1.2914552242249784 + - 2.5434524496011433 + - !!python/tuple + - 1.6539124455182028 + - 2.4508853661112244 + - 1.477423190775255 + - 1.7117077660940827 + - 1.3844530225481437 + - 1.1081052479708582 + - 1.6343969672589314 + - 1.0293610767327965 + - 0.8942677345867229 + - 1.4934798096913777 + - 1.8662747808579778 + - 1.3024363306063775 + - 2.508652215396028 + - !!python/tuple + - 1.655087007180589 + - 2.425218750027239 + - 1.4677534475347658 + - 1.7167164910421984 + - 1.4243061669536035 + - 1.1404794408265082 + - 1.6134333216360344 + - 1.0771181209182874 + - 0.8789197334989368 + - 1.5006840687261063 + - 1.8731736877584964 + - 1.306475080601942 + - 2.5405188292347063 + - !!python/tuple + - 1.507885089479514 + - 2.455168502262579 + - 1.4685265619527477 + - 1.7978376701890153 + - 1.3745516507071454 + - 1.1094366900647241 + - 1.685849999392964 + - 1.0180312713383652 + - 0.8907951735917008 + - 1.5178640261400704 + - 1.9450659477381331 + - 1.3392889368466339 + - 2.4796237910561123 + - !!python/tuple + - 1.567686461840422 + - 2.5373459535893272 + - 1.4668603430059557 + - 1.606797397912842 + - 1.4204606661513413 + - 1.0873502116346152 + - 1.6328195530813034 + - 0.9976271541047323 + - 0.8286959380490468 + - 1.4993526806891841 + - 1.8712810040186283 + - 1.3014773472122054 + - 2.5336685827939043 + - !!python/tuple + - 1.5683278083637495 + - 2.5651953137989025 + - 1.474813170948455 + - 1.6694871733239363 + - 1.4587817099252596 + - 1.1414767271992106 + - 1.6785494833565888 + - 0.9886295574496405 + - 0.8625931683688541 + - 1.510557229940655 + - 1.8088250733948525 + - 1.3245953142227456 + - 2.5508856727199896 + - !!python/tuple + - 1.5988121746557509 + - 2.525833427394778 + - 1.4469336495123608 + - 1.6854913559298255 + - 1.41296953056976 + - 1.0995115842991958 + - 1.6506866129938171 + - 1.0362410464621405 + - 0.8947209992919626 + - 1.5208941692746565 + - 1.816086861436793 + - 1.32876523778527 + - 2.5499855730467758 + - !!python/tuple + - 1.5685010423903512 + - 2.566469280066273 + - 1.4881087959841706 + - 1.5929849868275936 + - 1.4378260110827343 + - 1.0842231348691915 + - 1.6473784867638215 + - 1.0533800907074764 + - 0.8662183315417306 + - 1.5535826354317839 + - 1.8987465748277548 + - 1.3576445886826938 + - 2.597468126411743 + - !!python/tuple + - 1.5927881674583806 + - 2.583361877841206 + - 1.4120155613759025 + - 1.6102231697192553 + - 1.4300194515586482 + - 1.1124474775616573 + - 1.678500393155176 + - 1.0198421981939125 + - 0.8704039469906999 + - 1.4919524505094828 + - 1.8692222617740035 + - 1.3105458457396135 + - 2.54695722972966 + - !!python/tuple + - 1.5347872378266008 + - 2.5041394133720303 + - 1.4615140550238053 + - 1.7285436429257988 + - 1.4056650776112747 + - 1.112298248654239 + - 1.670786940454697 + - 1.0217935815888843 + - 0.8746309010401776 + - 1.5141696681755121 + - 1.89544780614457 + - 1.3291149119302206 + - 2.515829212831478 + - !!python/tuple + - 1.4585237384546303 + - 2.5402877242681248 + - 1.477327727283921 + - 1.702876151121313 + - 1.4242192672022949 + - 1.0952661779918746 + - 1.6658757498434449 + - 1.0308390393025149 + - 0.8702591908638995 + - 1.5324324496323714 + - 1.855665734649681 + - 1.3352532997239768 + - 2.575299532989444 + - !!python/tuple + - 1.5137186128382416 + - 2.532606907631008 + - 1.4356123897710047 + - 1.6899344153344993 + - 1.407848963121464 + - 1.0869769326956176 + - 1.642657574961658 + - 1.0785895055113919 + - 0.8699644862835207 + - 1.5219104937648311 + - 1.8909865395345675 + - 1.3251738141306295 + - 2.5615851660430997 + - !!python/tuple + - 1.4765331984976315 + - 2.5665586941633896 + - 1.4625846847871133 + - 1.6776095498265318 + - 1.4491806761444939 + - 1.1261391357370543 + - 1.6676322508266062 + - 1.0388873404438723 + - 0.8374717059072173 + - 1.5117863535190381 + - 1.89829029167472 + - 1.3207219855286012 + - 2.5624962769182025 + - !!python/tuple + - 1.4982661953370933 + - 2.537910062007417 + - 1.4873407459737753 + - 1.6330344248762843 + - 1.4218123083394354 + - 1.0814928232151941 + - 1.7258095750826201 + - 1.0339256540119828 + - 0.8724619393782476 + - 1.5246035187847151 + - 1.8675485448008229 + - 1.333635611408901 + - 2.559781440943369 + - !!python/tuple + - 1.4726281481028782 + - 2.6228893117122007 + - 1.4339374540893428 + - 1.5945929282195486 + - 1.4535528521397412 + - 1.0884482404506808 + - 1.668452315929387 + - 1.0638650540430046 + - 0.8539283488381104 + - 1.540834720512073 + - 1.8842709813922167 + - 1.3459984267481768 + - 2.617193097112903 + - !!python/tuple + - 1.4992005386624099 + - 2.549375083499616 + - 1.443945698892541 + - 1.648746632561061 + - 1.407376233722108 + - 1.0791776020529784 + - 1.670696137257183 + - 1.0619592217780118 + - 0.8822149456249311 + - 1.5424502580917228 + - 1.9512731671015886 + - 1.3551929325473608 + - 2.5743227429992404 + - !!python/tuple + - 1.4501374644328933 + - 2.5440279073941316 + - 1.4623534117133965 + - 1.7079754730514414 + - 1.4282488784793763 + - 1.1218990646740017 + - 1.719827303913429 + - 1.0422172267767356 + - 0.8744884923201646 + - 1.5115982535746526 + - 1.9375928171951118 + - 1.3285005198456585 + - 2.5533011070020533 + - !!python/tuple + - 1.5337379979690975 + - 2.558487800760557 + - 1.4282769944064952 + - 1.6072233762319668 + - 1.413320231916134 + - 1.0745926344387486 + - 1.721460675219258 + - 1.0532741206466867 + - 0.897792716572091 + - 1.5386880882174736 + - 1.9030933214552663 + - 1.3582607850865136 + - 2.568349932057706 + - !!python/tuple + - 1.4742728290135199 + - 2.5544769943560155 + - 1.4702115948158287 + - 1.6000496940263425 + - 1.4314934878774177 + - 1.076784207455399 + - 1.7219561276185191 + - 1.0675267444265597 + - 0.8687893074878271 + - 1.5528857137931502 + - 1.941464675665237 + - 1.3665082968302236 + - 2.586909934301155 + - !!python/tuple + - 1.4742728290135199 + - 2.5544769943560155 + - 1.4702115948158287 + - 1.6000496940263425 + - 1.4314934878774177 + - 1.076784207455399 + - 1.7219561276185191 + - 1.0675267444265597 + - 0.8687893074878271 + - 1.5528857137931502 + - 1.941464675665237 + - 1.3665082968302236 + - 2.586909934301155 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 2.8279671396154655 + - 2.9096307854943877 + - 1.6623971695509345 + - 1.7501975428891323 + - 1.7805008436887437 + - 2.4496416707487074 + - 1.5654675922983259 + - 1.2546886937470592 + - 1.3725513728163636 + - 3.1841670868225727 + - 1.0005774549675608 + - 1.1160270030622097 + - 1.3040479986771294 + - !!python/tuple + - 2.4995332651650615 + - 3.048681956241267 + - 1.7787187349645395 + - 1.6453090288241008 + - 1.959561939735139 + - 2.2737633467463167 + - 1.4401859974594282 + - 1.3928361103765947 + - 1.2039554692023744 + - 2.5677139970040113 + - 1.4856910112676924 + - 1.4469793002485896 + - 1.1419986065816816 + - !!python/tuple + - 2.3228478742512664 + - 2.602128376461841 + - 1.4791293619272956 + - 1.1572393405148869 + - 1.7758927703805152 + - 2.1810640036818607 + - 1.2611382708641807 + - 1.7541430822018715 + - 1.1186769043874627 + - 2.5723705711147278 + - 1.050970497754607 + - 1.5163348105940726 + - 1.037738122437384 + - !!python/tuple + - 1.6994476151384004 + - 2.5711787912387196 + - 1.375659909603908 + - 1.105983572936858 + - 1.3911520964565043 + - 2.6178428793452184 + - 1.7542866774203025 + - 1.6752880388961096 + - 1.1091402828223444 + - 2.215292844705205 + - 1.0238389884577874 + - 1.7596235129116649 + - 0.7812133442545632 + - !!python/tuple + - 1.9150008774202658 + - 2.856532748953432 + - 1.471440937319454 + - 1.0528730181335304 + - 1.7200408149002344 + - 2.122395338561952 + - 1.344136965360104 + - 1.527798345950487 + - 0.9349795623461006 + - 2.2704400823156257 + - 1.12679381681162 + - 1.7969093588930778 + - 0.8310817828608958 + - !!python/tuple + - 2.0245424241324113 + - 2.8114748360320956 + - 1.637106559947872 + - 1.0925019072731168 + - 1.7784686223076065 + - 2.471899476706437 + - 1.5799877205302677 + - 1.6698039815544967 + - 1.34495306642961 + - 2.21777975966405 + - 1.4155542059724264 + - 1.2699499004603134 + - 1.1169058271266237 + - !!python/tuple + - 1.7852396411757763 + - 2.783196628644736 + - 1.5445804309092357 + - 0.9120984536293828 + - 1.8359864711047353 + - 2.6712885685785435 + - 1.8910802695060176 + - 1.5849351947148653 + - 1.1798906209176458 + - 2.0736145291380126 + - 1.316419418431268 + - 1.350866528183679 + - 0.9642078431332959 + - !!python/tuple + - 1.9820883442614683 + - 2.9569260084911173 + - 1.5857559826372385 + - 1.0985687201565237 + - 1.9239239396494416 + - 2.3629425563471447 + - 1.6558932709194183 + - 1.7275214076075633 + - 1.3173923354836254 + - 2.1900143500956286 + - 1.1816604947279148 + - 1.3369402243632922 + - 1.1269484198214281 + - !!python/tuple + - 1.652104891497376 + - 2.7671581831342786 + - 1.5174034015957316 + - 0.8343134125571241 + - 1.9103610963229039 + - 2.6423918432972813 + - 1.8682407571778266 + - 1.7321508893367121 + - 1.2450621599728402 + - 1.852822912382289 + - 1.441268155466131 + - 1.3839008750103678 + - 0.9985386255735207 + - !!python/tuple + - 1.7961883998265344 + - 2.952871950171751 + - 1.6721774640685496 + - 0.9246989838869561 + - 1.9025241985690284 + - 2.4794927577231913 + - 1.6658138099208195 + - 1.7854463596825418 + - 1.2929132554216785 + - 2.001562839233727 + - 1.0259503875510447 + - 1.2950658329107805 + - 1.1021610401826751 + - !!python/tuple + - 1.7832664082765823 + - 2.501477506994097 + - 1.5135109310415134 + - 0.8521313610104808 + - 1.7713718152262046 + - 2.556669538411921 + - 1.8530664154956207 + - 1.6249309246180386 + - 1.3402178918864986 + - 2.0587496474962625 + - 1.1752794360075418 + - 1.1212742147184067 + - 1.0972103668787991 + - !!python/tuple + - 1.5005661709893197 + - 2.9247146710331386 + - 1.9400071759930317 + - 0.8722964952010591 + - 1.9928118534884525 + - 2.7077377610106637 + - 2.2912057736319227 + - 1.8315590003760285 + - 1.4589382154146935 + - 1.646879606252516 + - 1.3396178683356714 + - 1.2524577491044089 + - 1.211926754012617 + - !!python/tuple + - 1.556638759815123 + - 2.7266915278747126 + - 1.9217216083683453 + - 0.9085393158856752 + - 1.8623409347870359 + - 2.293182293702736 + - 1.7662226310085105 + - 1.9730118824481875 + - 1.4875658582601128 + - 1.7139930414612636 + - 1.1540315973587978 + - 1.6916126893539203 + - 1.2314080619460244 + - !!python/tuple + - 1.6647014268550349 + - 2.9427267676135624 + - 1.8464436840078169 + - 0.9157517173958101 + - 1.9277699475093661 + - 2.616249016825567 + - 1.953582246896298 + - 1.756588840263813 + - 1.5295652528546213 + - 1.837112670642905 + - 1.2258221832242977 + - 1.2761641188341337 + - 1.2602002619626802 + - !!python/tuple + - 1.7766920893416698 + - 3.0305793760431072 + - 1.8894663137351748 + - 1.0020324445877158 + - 2.088579968551957 + - 2.327983646766077 + - 1.7486823675816907 + - 1.7225068179907406 + - 1.4510466473660464 + - 1.9157893646020285 + - 1.1669605047735723 + - 1.1493213842576833 + - 1.3127334545801101 + - !!python/tuple + - 1.7032367226070573 + - 2.755600333318738 + - 1.8319856922796862 + - 0.9334425990579145 + - 1.9381135516380965 + - 2.441764126837331 + - 1.9706801830344103 + - 1.7171428790206589 + - 1.5119127225403601 + - 1.8939404698380748 + - 1.3852241847607905 + - 1.3432275746785707 + - 1.2821484201539848 + - !!python/tuple + - 1.4298159940139377 + - 2.9290961138659846 + - 2.021102399749684 + - 0.8126507057043626 + - 1.970873319345625 + - 2.443026283739884 + - 2.06538188934485 + - 1.8165427702011028 + - 1.5749281931009005 + - 1.5796405594366782 + - 1.0856082187968834 + - 1.3356098471274764 + - 1.3350813603992928 + - !!python/tuple + - 1.5899675534966167 + - 2.831100936162488 + - 1.838167137500685 + - 0.9242263029944191 + - 1.9026526267841777 + - 2.4723915189616497 + - 1.977413167527628 + - 1.800201200693003 + - 1.5288352651885302 + - 1.837181408055533 + - 1.1033333561439416 + - 1.269014954344567 + - 1.2884162262498149 + - !!python/tuple + - 1.346844637684218 + - 2.5502351710364173 + - 2.0937581110927566 + - 0.8839363669147223 + - 2.0018971247912027 + - 2.2111400884022823 + - 2.174022249566582 + - 1.8860648910708626 + - 1.5108023007974136 + - 1.6108470574750937 + - 1.1256513208628873 + - 1.4820153952057058 + - 1.351308590550876 + - !!python/tuple + - 1.4227289996289738 + - 2.552172540547536 + - 2.067580764467084 + - 0.9292793506755094 + - 1.9834754612091106 + - 2.250027805047176 + - 1.968759962136354 + - 1.8462212611771733 + - 1.6912774215996875 + - 1.7016366626507213 + - 1.162932505412112 + - 1.444927350961716 + - 1.4705463113251003 + - !!python/tuple + - 1.416532325292967 + - 2.6899804437511676 + - 1.9838138052492544 + - 0.9016210540978564 + - 1.9623652914340592 + - 2.445025475074881 + - 2.1925798554805356 + - 1.662799803080429 + - 1.555676289343786 + - 1.6730642710569987 + - 1.1086141358706474 + - 1.238746697878614 + - 1.346467378606187 + - !!python/tuple + - 1.5304903809837096 + - 2.482752153785637 + - 1.827696664111635 + - 0.9711506635970335 + - 1.9086199870682077 + - 2.2930551079057273 + - 1.9740554939013752 + - 1.7027089642302669 + - 1.4494941627403257 + - 1.8455376222497963 + - 1.1115572935424094 + - 1.3734001009612373 + - 1.264296289361412 + - !!python/tuple + - 1.2467989541541054 + - 2.3751823486039507 + - 2.094448057700827 + - 0.8380781465638594 + - 2.015311789194862 + - 2.1179537239168282 + - 2.1035548920541767 + - 1.6559769918465714 + - 1.4606535182044238 + - 1.4653328135404002 + - 1.0909793879283944 + - 1.5495738934323984 + - 1.3166678828594889 + - !!python/tuple + - 1.4150101008985558 + - 2.219669914141629 + - 2.014568582831168 + - 0.9391980992333868 + - 1.8681865333277798 + - 1.9161717856965517 + - 1.9446459070427138 + - 1.625981737403545 + - 1.5947397375861467 + - 1.6843900799925575 + - 0.9726346333942444 + - 1.2602286137117518 + - 1.450844949552458 + - !!python/tuple + - 1.2661099947979726 + - 2.2198996412347767 + - 1.8818817292070515 + - 0.8226426354336797 + - 2.0267656743371303 + - 2.0661313962767336 + - 2.1307070683259384 + - 1.6522014132402083 + - 1.5084037038908678 + - 1.5597234188789326 + - 1.2145432258944648 + - 1.2689870691670668 + - 1.368893440798106 + - !!python/tuple + - 1.4212420307012803 + - 2.1493323251601066 + - 1.8667576436946347 + - 0.9245664047650229 + - 1.924473899364894 + - 2.1014265624888635 + - 1.9801043313206708 + - 1.466608591406961 + - 1.5575453155621486 + - 1.746978385761658 + - 1.156547821500772 + - 1.303337611489315 + - 1.393707390440403 + - !!python/tuple + - 1.2524568106035827 + - 2.0255801047727093 + - 1.9166837848934142 + - 0.8731324667419881 + - 1.9422723389536427 + - 2.0014474160815947 + - 2.2286326400104963 + - 1.4634391114197458 + - 1.3830900442022065 + - 1.5821409064623635 + - 1.0828656232326745 + - 1.3380103948193791 + - 1.2917595373076394 + - !!python/tuple + - 1.285896963419346 + - 2.0224776045193007 + - 1.803962618043958 + - 0.8004721348913354 + - 2.024809164509045 + - 1.9402213917793274 + - 2.007382050811778 + - 1.4733959196831856 + - 1.4304693405997484 + - 1.6769465386499058 + - 1.126038502741395 + - 1.1918921065679853 + - 1.3644817506794358 + - !!python/tuple + - 1.1804472095280183 + - 2.123730453139464 + - 1.997784093816974 + - 0.8735488819370307 + - 1.9960419677638326 + - 1.9252473851965242 + - 2.137030086295317 + - 1.4518312914978957 + - 1.497303578678749 + - 1.4677444379408606 + - 1.172472876995169 + - 1.3538187979029923 + - 1.385812222345669 + - !!python/tuple + - 1.3449741558690764 + - 2.2103166402507193 + - 1.8560420841574055 + - 0.9152360009773418 + - 2.0142189088786244 + - 2.0309189939227688 + - 2.060275349347841 + - 1.516511396024399 + - 1.450341914942274 + - 1.6491374984048335 + - 1.1334613899126893 + - 1.2828780320881723 + - 1.34474540056637 + - !!python/tuple + - 1.3555760191216628 + - 2.302604531280783 + - 1.861310219881548 + - 0.8857947810234892 + - 2.2103227575656748 + - 1.8796742558719644 + - 1.8046408025403378 + - 1.524895029208459 + - 1.5782118043095743 + - 1.6195527121739344 + - 1.318209438837976 + - 1.286297952346327 + - 1.49994277883686 + - !!python/tuple + - 1.3269419754393468 + - 2.107435478917556 + - 1.8197148389646236 + - 0.8703419528304712 + - 2.036423935701594 + - 1.9711717118444407 + - 2.040578914083695 + - 1.4535642603417571 + - 1.4081800614363862 + - 1.6559768771646146 + - 1.2112154896417295 + - 1.298787082304542 + - 1.3270278212489535 + - !!python/tuple + - 1.258575441474445 + - 2.1550590470577227 + - 1.9602264304166281 + - 0.9185645119187326 + - 2.0653525864567026 + - 1.9375010307629132 + - 2.103955163497269 + - 1.4958666932882299 + - 1.4689250529392823 + - 1.5335811597899283 + - 1.2078393686383955 + - 1.414274119465711 + - 1.3777998827000113 + - !!python/tuple + - 1.2328437525746327 + - 1.9805860672311915 + - 1.8776747948327026 + - 0.8850715787800567 + - 2.0953446624325527 + - 1.8657943890768107 + - 2.0405301859489513 + - 1.3666364363473185 + - 1.4702827227137836 + - 1.5383372914495346 + - 1.2450931170023043 + - 1.2889448656750342 + - 1.4029170699003077 + - !!python/tuple + - 1.271261589824585 + - 2.149899242805663 + - 1.7932793617615133 + - 0.8615875832496418 + - 2.052116844622156 + - 1.9645350297461124 + - 2.000902315963584 + - 1.376112750281093 + - 1.4132457087811616 + - 1.5783725856661928 + - 1.1916294868223283 + - 1.3685773669819983 + - 1.3179372752519243 + - !!python/tuple + - 1.288040218220902 + - 2.045578421266925 + - 1.8451272099128073 + - 0.8997132979694769 + - 2.0303962805978397 + - 1.7984199357136386 + - 1.867876769971767 + - 1.3848229577709619 + - 1.4507644781854538 + - 1.6171497660279357 + - 1.1623217932561882 + - 1.336558987278171 + - 1.3790145876784696 + - !!python/tuple + - 1.3402015067636703 + - 2.246751428730338 + - 1.8023249685549545 + - 0.8891544548100989 + - 2.1511733773711192 + - 1.8630887121908895 + - 1.7851980290434095 + - 1.4260027921867504 + - 1.5101560922563109 + - 1.6126684224248047 + - 1.2737136222023684 + - 1.3372828970473503 + - 1.4246406529146094 + - !!python/tuple + - 1.2686755172226905 + - 2.08075935630001 + - 1.810290674196063 + - 0.8704309359833203 + - 2.1444887355871254 + - 1.7688222926719817 + - 1.8487447551834042 + - 1.4128801661960937 + - 1.4709481229086525 + - 1.57561649299101 + - 1.2173677294915513 + - 1.3412466239007075 + - 1.4179153915809488 + - !!python/tuple + - 1.2616852633311206 + - 2.2069691093229586 + - 1.8329935869734595 + - 0.8559980030397141 + - 2.1261817023547005 + - 1.8969389679925548 + - 1.8624228701797394 + - 1.4815449705917954 + - 1.4947597801178136 + - 1.5741050566958892 + - 1.250747329517976 + - 1.349356260963531 + - 1.400908168973095 + - !!python/tuple + - 1.2675806622673922 + - 2.153389945871065 + - 1.7861260400527799 + - 0.8741910878782191 + - 2.081824336115327 + - 1.851073710926689 + - 1.8191111726251918 + - 1.3442283672884923 + - 1.4219995338933167 + - 1.575319217559668 + - 1.1599108956041693 + - 1.3909909225782457 + - 1.3415592819174638 + - !!python/tuple + - 1.2675806622673922 + - 2.153389945871065 + - 1.7861260400527799 + - 0.8741910878782191 + - 2.081824336115327 + - 1.851073710926689 + - 1.8191111726251918 + - 1.3442283672884923 + - 1.4219995338933167 + - 1.575319217559668 + - 1.1599108956041693 + - 1.3909909225782457 + - 1.3415592819174638 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.1839342326811484 + - 1.851332540951338 + - 2.1124632845836633 + - 1.9446987099287993 + - 2.1163313652296685 + - 2.2616612583025706 + - 1.4749336221915714 + - 1.3423821080868275 + - 1.8515141678860383 + - 1.652941105794389 + - 1.6056341440862065 + - 2.325950025897116 + - 2.3252260169420977 + - !!python/tuple + - 1.1321940310449772 + - 1.7971851750098775 + - 2.1134541515838117 + - 1.9823039009942105 + - 1.980272679113321 + - 2.0050753978275964 + - 1.4791789023543507 + - 1.161080242701329 + - 1.7073082929138168 + - 1.640044992409991 + - 1.6170125566465121 + - 2.4985155465812054 + - 1.3181913194956323 + - !!python/tuple + - 1.0812498438327023 + - 1.8669836032478937 + - 1.9348398892456984 + - 1.775180281748315 + - 2.112258039202346 + - 2.1703874535393526 + - 1.417073884117452 + - 1.097187782181743 + - 1.2838040607877703 + - 1.5196840695981768 + - 1.5851346640564978 + - 2.4467859405595984 + - 2.2080342992060977 + - !!python/tuple + - 1.2272425338820667 + - 2.0241329722300003 + - 1.5723260502983116 + - 1.8406338116231755 + - 2.633915429247179 + - 2.0973011333940326 + - 1.4974792654791287 + - 1.181012825573946 + - 1.6874650490538436 + - 1.61827653263084 + - 1.5052781147224694 + - 2.5363073458286842 + - 2.259099736505377 + - !!python/tuple + - 1.007349954839805 + - 1.6964634747899066 + - 1.8918377192857065 + - 1.8760323661928093 + - 2.4732715258139137 + - 2.104252028233929 + - 1.4981643060008256 + - 1.1120695778002516 + - 1.6993433611338429 + - 1.5479032304981493 + - 1.4578493385985793 + - 2.4603913951094385 + - 1.9706874666553569 + - !!python/tuple + - 1.0740121014621424 + - 1.9036208466205164 + - 1.8317093636694741 + - 1.679038150868481 + - 2.8003720611967613 + - 2.087833815485761 + - 1.5492225948886584 + - 1.1607054325636668 + - 1.6671753288515971 + - 1.4155000372405462 + - 1.565900174297283 + - 2.470737461274018 + - 2.125106083428297 + - !!python/tuple + - 1.0880756321999776 + - 1.9078481414843105 + - 1.8179588023866682 + - 1.8290358529418747 + - 2.5051620672423986 + - 1.8140916606951256 + - 1.5605182976907934 + - 1.1250420157943062 + - 1.745309260375241 + - 1.6091276389260427 + - 1.538173536462645 + - 2.49845548464651 + - 1.6800025254413717 + - !!python/tuple + - 1.0651632934088116 + - 1.7978172333074336 + - 1.7693200922507373 + - 1.9851370018764625 + - 2.7632478854410873 + - 1.8607383078034254 + - 1.5480389256856324 + - 1.3605724488175617 + - 1.6083899209430355 + - 1.6031499313811441 + - 1.5114572116293878 + - 2.413680811110188 + - 1.8569007064013952 + - !!python/tuple + - 0.8478768201669531 + - 1.5826183589079759 + - 2.0249780331967644 + - 1.6343657375696805 + - 2.5722065250952335 + - 1.8308189525509495 + - 1.48886348575494 + - 1.0570990521633998 + - 1.502367356443929 + - 1.3729909271399892 + - 1.380887516656939 + - 2.2742041980421406 + - 1.6347039232194076 + - !!python/tuple + - 1.0821628541415835 + - 1.8956091748577606 + - 1.6232827126242997 + - 1.470589840994757 + - 2.858659570195676 + - 1.5413991065101766 + - 1.6409573251179048 + - 1.1082012176402913 + - 1.3655398959654867 + - 1.4152969493645693 + - 1.4237909323894586 + - 2.2330763032403684 + - 1.683378770499234 + - !!python/tuple + - 0.9263064735511692 + - 1.6188268448776073 + - 1.5938325539097327 + - 1.550153002604052 + - 2.7379636837024877 + - 1.5620570429735425 + - 1.5461797738525238 + - 1.1645141446492095 + - 1.391717432307843 + - 1.3848941642410844 + - 1.2790448533766892 + - 2.0005699349223534 + - 1.913212864124027 + - !!python/tuple + - 0.9616092787013653 + - 1.6523269676995493 + - 1.8214359470052524 + - 1.561142529036649 + - 2.6347885457934725 + - 1.4668266316074114 + - 1.5292727112481241 + - 1.244278192332724 + - 1.2746048751863854 + - 1.3473613832882145 + - 1.2441062120082558 + - 2.0493195710029948 + - 1.5860427316817733 + - !!python/tuple + - 1.0666503021142648 + - 1.6606680386893586 + - 1.7323009532213067 + - 1.4753031037383908 + - 2.6118841545327807 + - 1.401135508539203 + - 1.6447267894599282 + - 1.0660505220078804 + - 1.260596688750614 + - 1.5118639253964328 + - 1.2832640002224915 + - 1.9711998143167069 + - 1.7131347253906228 + - !!python/tuple + - 1.04696041279644 + - 1.7603585750924462 + - 1.5906938778215438 + - 1.4171937521875688 + - 2.5640731445777085 + - 1.298518232985924 + - 1.680930608019116 + - 1.1691742935522853 + - 1.151851543428623 + - 1.3890736242208632 + - 1.3025791465231737 + - 1.9503491899939154 + - 1.6344661008286518 + - !!python/tuple + - 1.051900392271913 + - 1.7281520017019594 + - 1.734159064084773 + - 1.498044679826093 + - 2.8942200523846604 + - 1.415388293467975 + - 1.6375718083319328 + - 1.254255893397549 + - 1.5269124482449858 + - 1.4648411538562403 + - 1.3057080880460894 + - 1.972410320534408 + - 1.7383965511561945 + - !!python/tuple + - 1.0530463154828105 + - 1.6567060665418198 + - 1.8029229771900872 + - 1.3524267342384402 + - 2.6066722384113654 + - 1.3325997804820904 + - 1.6712504074914598 + - 1.158748741954419 + - 1.1608285460117844 + - 1.351126103166707 + - 1.2260575495416735 + - 1.869632443037212 + - 1.544116022585883 + - !!python/tuple + - 1.081278571560604 + - 1.7624856590095161 + - 1.6179618799495254 + - 1.3723916277188999 + - 2.7047658820038225 + - 1.3543767798002166 + - 1.5747212647430446 + - 1.2046555888168404 + - 1.2524792613244538 + - 1.3704096068482527 + - 1.239296646456618 + - 1.8513576956026634 + - 1.8224514245566594 + - !!python/tuple + - 1.061062808472061 + - 1.7142250975746123 + - 1.673574370063319 + - 1.4205338030539743 + - 2.4679224588325455 + - 1.2770531097928044 + - 1.5784690714232281 + - 1.195726214335215 + - 1.2080067152225555 + - 1.4675150632767544 + - 1.2800718357885579 + - 1.8236471040999804 + - 1.5945925459082242 + - !!python/tuple + - 1.0626721938783894 + - 1.8226322994070077 + - 1.6909056934761624 + - 1.2701762302534885 + - 2.3905080058417036 + - 1.3977150491846095 + - 1.4015926873935216 + - 1.1939968065404862 + - 1.3741012996611304 + - 1.421460977494492 + - 1.1850815495056226 + - 1.8081262738996742 + - 1.7927069155163573 + - !!python/tuple + - 1.1548484632303295 + - 1.8040584361497465 + - 1.583442934262381 + - 1.234803854304115 + - 2.2609117914380112 + - 1.285716357274387 + - 1.5994514676988627 + - 1.1629284808740237 + - 1.3306593581495743 + - 1.451705440599804 + - 1.3001165669745454 + - 1.7120106174240515 + - 1.658756134078758 + - !!python/tuple + - 1.0712224283908285 + - 1.725106807388273 + - 1.6932640857924048 + - 1.2915055729759513 + - 2.4434894681928965 + - 1.3783159399721852 + - 1.5253068289811846 + - 1.2670725912418899 + - 1.218291576544443 + - 1.3401391997425054 + - 1.2174714029301534 + - 1.6980811301599252 + - 1.803520361450567 + - !!python/tuple + - 1.052390982522613 + - 1.7621672299333544 + - 1.6914324677483648 + - 1.278820076642854 + - 2.281522420285484 + - 1.4011962300233707 + - 1.4707442453471349 + - 1.2080140482147623 + - 1.3393912947916586 + - 1.4053403537936984 + - 1.248901358810973 + - 1.7579423952508784 + - 1.6235465607396609 + - !!python/tuple + - 1.1439478869232875 + - 1.8011403678897524 + - 1.780376409246411 + - 1.2651235302133326 + - 2.2537479398213836 + - 1.3191217533642043 + - 1.502313172641051 + - 1.246325110495584 + - 1.397399689511622 + - 1.4704493909160696 + - 1.2343026026843564 + - 1.7038643944186558 + - 1.6152237671869658 + - !!python/tuple + - 1.1564591822326444 + - 1.7743034474283248 + - 1.677439587703853 + - 1.3297947300245045 + - 2.376483770270565 + - 1.3217734114399047 + - 1.5967231834259685 + - 1.289394283089072 + - 1.360691113598304 + - 1.4463382072096518 + - 1.3131391177217617 + - 1.6868875264991652 + - 1.6290980805800932 + - !!python/tuple + - 1.1553440109870459 + - 1.7663181868572333 + - 1.654800549146054 + - 1.2420488275972659 + - 2.299478705033632 + - 1.3562387624301355 + - 1.5591249370556737 + - 1.269224805895211 + - 1.3836330768325948 + - 1.4638233607855975 + - 1.262074024546938 + - 1.6329430354293972 + - 1.7348997367558807 + - !!python/tuple + - 1.1106006728238178 + - 1.7395925681226174 + - 1.753798860831668 + - 1.2770145514632016 + - 2.26729498657662 + - 1.383953126233749 + - 1.528929651935884 + - 1.3021929360681719 + - 1.3446347633540217 + - 1.4023209667468866 + - 1.247840629118857 + - 1.6621126639982444 + - 1.6201309804751487 + - !!python/tuple + - 1.1505771905249196 + - 1.7674448624614536 + - 1.6715020653595078 + - 1.3183309612752485 + - 2.321345442776275 + - 1.376182389850048 + - 1.5776601064474742 + - 1.3207457701631133 + - 1.3669406226782241 + - 1.4279679890751897 + - 1.2791892720504656 + - 1.6927177891195453 + - 1.6581811307494396 + - !!python/tuple + - 1.1638152379115472 + - 1.7826636464983512 + - 1.6801673532357708 + - 1.2593100148084246 + - 2.360211974793807 + - 1.2993822408162663 + - 1.6012618955660105 + - 1.3416510058410207 + - 1.3581371851822952 + - 1.410119197600857 + - 1.2843425033856457 + - 1.6295237598750674 + - 1.6111997804130678 + - !!python/tuple + - 1.1278525662559407 + - 1.719953697184493 + - 1.6851692552178579 + - 1.2454957680864673 + - 2.235606743453684 + - 1.3718878425816619 + - 1.5854017697980405 + - 1.3134421441540631 + - 1.3355193898420998 + - 1.3956579037116563 + - 1.2475709657451417 + - 1.625800230304066 + - 1.6440263377731972 + - !!python/tuple + - 1.1745477300792864 + - 1.7567383846129163 + - 1.646307496396259 + - 1.2704643435016152 + - 2.3547182452595843 + - 1.355522395413367 + - 1.636871211838376 + - 1.3445297450806803 + - 1.3757184303856143 + - 1.4202214518920924 + - 1.2957562976442878 + - 1.6123812676019393 + - 1.6955316917704888 + - !!python/tuple + - 1.1614797926776936 + - 1.733148998136906 + - 1.6793030628438546 + - 1.2845817115952336 + - 2.348424510153376 + - 1.4006332221481115 + - 1.5972738430603655 + - 1.3431463321833061 + - 1.342357162213725 + - 1.4177674249731118 + - 1.2877955478196932 + - 1.6188893992804978 + - 1.7231036419744128 + - !!python/tuple + - 1.1233025716231628 + - 1.7271170189707377 + - 1.6620093229979744 + - 1.2121009224940293 + - 2.29859142400018 + - 1.3696937565999188 + - 1.581559595247493 + - 1.3103408267834777 + - 1.3388192446015426 + - 1.3854638230739973 + - 1.2642451468954643 + - 1.5872940786265644 + - 1.6754538656984281 + - !!python/tuple + - 1.1426615622975822 + - 1.7526966875218695 + - 1.684914170742206 + - 1.2469922782491671 + - 2.3103577902108894 + - 1.3874090971805506 + - 1.5689792426956053 + - 1.3344991439070477 + - 1.379062475565174 + - 1.4119536866593623 + - 1.2625421058697683 + - 1.621392833102874 + - 1.6730423255754978 + - !!python/tuple + - 1.142393226371401 + - 1.7395554931012343 + - 1.6177792131536664 + - 1.2420890354956233 + - 2.3561402329813177 + - 1.4090339211290188 + - 1.6028993126416955 + - 1.3331937503168199 + - 1.3588790728881768 + - 1.3907943822047102 + - 1.2841401810379116 + - 1.60912699564272 + - 1.7326175764561982 + - !!python/tuple + - 1.1347530092045417 + - 1.726829815590703 + - 1.6497066434495218 + - 1.2625471007383156 + - 2.3556668225254476 + - 1.3891630672984459 + - 1.6095427511927785 + - 1.327857138210667 + - 1.3339275134492374 + - 1.3895616914025148 + - 1.2823408059082166 + - 1.62045037814907 + - 1.6758213767345138 + - !!python/tuple + - 1.128517266998554 + - 1.7166557700617089 + - 1.6501715286342913 + - 1.2746957338759617 + - 2.3566656188505988 + - 1.4115233659860258 + - 1.5897580799292084 + - 1.343329103904698 + - 1.3757313345557292 + - 1.3972370654074293 + - 1.2813467840569022 + - 1.6086594222198836 + - 1.7089530998995741 + - !!python/tuple + - 1.143015597337849 + - 1.7331563509010486 + - 1.6555029862169222 + - 1.2558616975995682 + - 2.3502777277854916 + - 1.4076087892430742 + - 1.6154659495296204 + - 1.3422926391125354 + - 1.3306536557061024 + - 1.3958109114358113 + - 1.302143787531457 + - 1.609977556006721 + - 1.704729174451497 + - !!python/tuple + - 1.1279923408379366 + - 1.7124078583384104 + - 1.6609655711633686 + - 1.2302248982836843 + - 2.3815635407712406 + - 1.4481618812287071 + - 1.603772942210618 + - 1.3395608454137482 + - 1.3442765463332453 + - 1.3820019111274526 + - 1.2936140395048803 + - 1.5962614909228978 + - 1.7194214108440873 + - !!python/tuple + - 1.1279923408379366 + - 1.7124078583384104 + - 1.6609655711633686 + - 1.2302248982836843 + - 2.3815635407712406 + - 1.4481618812287071 + - 1.603772942210618 + - 1.3395608454137482 + - 1.3442765463332453 + - 1.3820019111274526 + - 1.2936140395048803 + - 1.5962614909228978 + - 1.7194214108440873 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 2.627584167570629 + - 1.6900219671187036 + - 3.0190744654287203 + - 1.6869652404462079 + - 2.3466125959529256 + - 1.455204009029981 + - 2.295267210389241 + - 1.6497506304184064 + - 4.163767326128188 + - 2.0359399541122043 + - 3.7811183495612823 + - 3.107550701197007 + - 2.581606043077216 + - !!python/tuple + - 1.3803326739399213 + - 1.3991126123052646 + - 2.1700925989418316 + - 1.1325148406970915 + - 1.7423619578977543 + - 1.1741941738896284 + - 1.424115753313635 + - 1.7438954585262239 + - 1.1864809272919157 + - 1.6101049154941904 + - 1.6331273492881841 + - 1.9420442313670514 + - 2.26753462386036 + - !!python/tuple + - 1.4303128513227703 + - 1.2569446229047019 + - 2.060870879563913 + - 0.9615801413194904 + - 1.7479710060258578 + - 1.014603620133543 + - 1.4016843990871433 + - 1.4101259896982201 + - 1.5027425840449733 + - 1.426011051954879 + - 1.677967414251137 + - 1.8159392586576748 + - 2.143260475469325 + - !!python/tuple + - 1.412059505568247 + - 1.4630864548044893 + - 2.2972096211616626 + - 1.0614201971932673 + - 2.1173409790120457 + - 1.2091437113166799 + - 1.584474917668969 + - 1.6490633404402661 + - 1.2992935537398127 + - 1.6363193764305577 + - 1.3066556985624045 + - 1.5773379356615194 + - 1.9669936023268741 + - !!python/tuple + - 1.2798181973867848 + - 1.3344416994039923 + - 1.7738650113993328 + - 1.107530628330827 + - 1.6561433367009883 + - 1.1029585073915058 + - 1.5741466197249174 + - 1.5754511463955396 + - 1.383473022801254 + - 1.565192767468169 + - 1.6388738722346432 + - 1.4373103837781858 + - 2.1009755211359513 + - !!python/tuple + - 1.1081271099978816 + - 1.32126559184647 + - 1.820699345430068 + - 1.074108241052852 + - 1.4701477782934842 + - 1.0390984679099933 + - 1.524566918698352 + - 1.4718097956213492 + - 1.5995163242673505 + - 1.449841143058221 + - 1.2181682074453288 + - 1.5810814541722418 + - 1.9307209419266789 + - !!python/tuple + - 1.2066169914736444 + - 1.3996755639819871 + - 1.9938237383216426 + - 1.0593844509840604 + - 1.618678166295389 + - 1.153021836049619 + - 1.5360660140520743 + - 1.5885625707230875 + - 1.2014579158950776 + - 1.5386839382916757 + - 1.4831556091394171 + - 1.6020619290426852 + - 1.92599888595907 + - !!python/tuple + - 1.2345595040285362 + - 1.4380853553362176 + - 2.197667087543305 + - 1.1755210002656744 + - 1.8076603893211796 + - 1.1476946472643674 + - 1.6624576082109082 + - 1.7103873305167312 + - 1.6969361419665234 + - 1.6203486158596578 + - 1.7213745184460882 + - 1.617879591678426 + - 1.8607647571463142 + - !!python/tuple + - 1.236396283790839 + - 1.470010797007431 + - 2.045254211031958 + - 1.1454004107759008 + - 1.7538609775305485 + - 1.1171243753746456 + - 1.3462734208030556 + - 1.5989855063748588 + - 1.3390616846273566 + - 1.6185993744321738 + - 1.46888663436271 + - 1.5365987759958473 + - 1.9973465603533986 + - !!python/tuple + - 1.1506392540285513 + - 1.6070289514988667 + - 2.4379574621199556 + - 1.2525704989846949 + - 1.6187193443604748 + - 1.2436328677899318 + - 1.5784290916561532 + - 1.6488201415806087 + - 1.662609354758322 + - 1.6910696616450802 + - 1.33276891954487 + - 1.9463070289906346 + - 1.742185173410669 + - !!python/tuple + - 1.2341034261438302 + - 1.5866350312100703 + - 1.916697558696871 + - 1.179610719061533 + - 1.7750976970920238 + - 1.194675835919178 + - 1.5367099789497987 + - 1.750636479376098 + - 1.5077236419879174 + - 1.8755353196874904 + - 1.4962154499594913 + - 1.7324592196339132 + - 1.9976692036886026 + - !!python/tuple + - 1.0370619236355247 + - 1.585747076187748 + - 2.05914309237862 + - 1.3093217743567898 + - 1.4972589313656894 + - 1.2101841795561308 + - 1.5987248056270595 + - 1.7168022698402976 + - 1.8083619946412721 + - 1.7207583795705088 + - 1.3983125242860193 + - 1.660579937488791 + - 1.6214370555192343 + - !!python/tuple + - 1.0977518482934265 + - 1.5801801261604085 + - 1.9061547496023667 + - 1.1373413991559236 + - 1.8492739010507568 + - 1.1302368298494065 + - 1.4714896187587376 + - 1.7330460971229193 + - 1.5671150156891698 + - 1.8069227848992218 + - 1.3358550100574533 + - 1.470941956978831 + - 1.8268388101035429 + - !!python/tuple + - 1.0701075029443377 + - 1.7852443814920411 + - 2.342201550777784 + - 1.2533755451696844 + - 1.8121646852602982 + - 1.2500544040284955 + - 1.4564230176520914 + - 1.812142282541358 + - 1.6478588825156386 + - 1.989081146990382 + - 1.406815746728666 + - 1.8072977991931811 + - 1.6934405600376787 + - !!python/tuple + - 1.131546801183876 + - 1.6350690905382828 + - 1.9870605932975494 + - 1.2528935121072329 + - 1.6954232372124531 + - 1.155721438073125 + - 1.2869770595997223 + - 1.732892671372634 + - 1.5158444638864297 + - 1.875217310103801 + - 1.4197965776518962 + - 1.6517361393512444 + - 1.7515012229860947 + - !!python/tuple + - 1.184584568094314 + - 1.6311888801324375 + - 2.0008766233062785 + - 1.0981767798006414 + - 1.7662200790003773 + - 1.2479598022780451 + - 1.4474136100800126 + - 1.7538939432319058 + - 1.4794144187308595 + - 1.91205292886745 + - 1.3400263927279672 + - 1.5909021347247165 + - 1.5896778274192473 + - !!python/tuple + - 0.9856505583752762 + - 1.8219008841089546 + - 2.1273311143847295 + - 1.3151420988730405 + - 1.7070943819132354 + - 1.241779607153818 + - 1.4102849000062456 + - 1.8604499288851093 + - 1.9186707859358982 + - 2.0936125850409795 + - 1.3076367313030193 + - 1.7119389162972691 + - 1.3193749023290011 + - !!python/tuple + - 1.0403193229567755 + - 1.6353715839726073 + - 1.8442266043711393 + - 1.224221374065513 + - 1.594486758224108 + - 1.1796339615759144 + - 1.3810519459917936 + - 1.8175183704278877 + - 1.60245984975781 + - 1.9448022138081502 + - 1.3028681252204182 + - 1.6590854277413856 + - 1.495211257367239 + - !!python/tuple + - 1.1018675819949482 + - 1.7948972960272367 + - 1.861951707279765 + - 1.259501963711968 + - 1.7969244861438582 + - 1.2125361790244673 + - 1.2945796839332462 + - 1.9213026231679842 + - 1.7549693969744191 + - 2.1549649104064486 + - 1.5660012155097673 + - 1.78180128608017 + - 1.4823185267557186 + - !!python/tuple + - 1.0530924586203647 + - 1.6916270849391164 + - 1.782641359134379 + - 1.2433626736980115 + - 1.6300414162191 + - 1.1942458015782567 + - 1.2797434455075285 + - 1.8172596076264858 + - 1.6273594957791913 + - 2.0283775709970167 + - 1.3933296362350927 + - 1.562352974989218 + - 1.296119445684465 + - !!python/tuple + - 1.0701985975438455 + - 1.7041914171162518 + - 1.7557796264576893 + - 1.2848396623372786 + - 1.6578655464181855 + - 1.1924589111652881 + - 1.2866409565979144 + - 1.8866802228915822 + - 1.7114864990947898 + - 2.0656008574655598 + - 1.5353540078089654 + - 1.5863571205139384 + - 1.3466222083509256 + - !!python/tuple + - 1.1260513364303386 + - 1.7232896285843957 + - 1.6617926691625202 + - 1.199302727283774 + - 1.752283139100098 + - 1.1640873674552472 + - 1.1430439431231378 + - 1.8729506247058114 + - 1.7151975334944827 + - 2.101020046740423 + - 1.5368031743632116 + - 1.6087432867451192 + - 1.3899430480475308 + - !!python/tuple + - 1.1384919940035156 + - 1.6865755191584175 + - 1.7554100668541293 + - 1.2712500329444483 + - 1.7528400367665904 + - 1.1949835083466254 + - 1.2870334674398123 + - 1.889420171565203 + - 1.79238692018204 + - 2.039978238915297 + - 1.4965299233783773 + - 1.5909157113741808 + - 1.3259030009931103 + - !!python/tuple + - 1.1040449548075288 + - 1.7137621843147406 + - 1.790398416008321 + - 1.2453305361849472 + - 1.7802670088903891 + - 1.1992561436985991 + - 1.2271849330912845 + - 1.9117708949240084 + - 1.565694012735566 + - 2.07171798390613 + - 1.485133803196255 + - 1.561159414576393 + - 1.3694324172838401 + - !!python/tuple + - 1.0574587377053737 + - 1.680281489185189 + - 1.724268606862184 + - 1.2306132046282598 + - 1.7049972570652354 + - 1.1827832604220756 + - 1.2729018188700871 + - 1.887978124748124 + - 1.5912144803458268 + - 2.024689342885864 + - 1.4830330246088488 + - 1.5358078055583477 + - 1.3618759744286804 + - !!python/tuple + - 1.2258205036765961 + - 1.6570304290873896 + - 1.6493773447131557 + - 1.2526266287382095 + - 1.7127431217719584 + - 1.2341993521019803 + - 1.2882979886119783 + - 1.8289625290790892 + - 1.6958634306798486 + - 1.9606627757176396 + - 1.5282128529217507 + - 1.5754104202683799 + - 1.3399133702415693 + - !!python/tuple + - 1.1716164458782012 + - 1.7212053867810269 + - 1.7470547499869826 + - 1.2120829920035856 + - 1.8391701543830155 + - 1.2104155727080574 + - 1.217969424956069 + - 1.8957814040512093 + - 1.6882262350418378 + - 2.0667209603732895 + - 1.4823745909973502 + - 1.6132672977812228 + - 1.3700240390747511 + - !!python/tuple + - 1.1515998758527426 + - 1.6546860711137932 + - 1.7258730049255702 + - 1.2052759466530136 + - 1.7209526562357158 + - 1.2046544034161475 + - 1.2731628146675142 + - 1.8179407835408903 + - 1.6303359207508552 + - 1.954445582564789 + - 1.45130808197731 + - 1.5264459126925574 + - 1.370551608719377 + - !!python/tuple + - 1.155536743707545 + - 1.7394020826983532 + - 1.7428671261509974 + - 1.2188748169734112 + - 1.7734226240694273 + - 1.2198323948910885 + - 1.2579501080444353 + - 1.8624057898133213 + - 1.7138414794957164 + - 2.0726233511942054 + - 1.5205449088257308 + - 1.6471188977169642 + - 1.3785846686955567 + - !!python/tuple + - 1.178767616278455 + - 1.7021674398262343 + - 1.6472046560506008 + - 1.2192055848467598 + - 1.7334609008879367 + - 1.218259062932159 + - 1.2067434233210304 + - 1.8370552458757738 + - 1.68411539986489 + - 2.010396647744257 + - 1.4512014145518537 + - 1.5946630095277747 + - 1.3431731406881466 + - !!python/tuple + - 1.2120253200287745 + - 1.6867441388114353 + - 1.682225567609664 + - 1.2264020227087569 + - 1.7481917022164233 + - 1.2458180921807316 + - 1.2813708821222507 + - 1.8140926186704651 + - 1.6824611542894472 + - 1.9789332845063266 + - 1.4509049321196699 + - 1.56444001795475 + - 1.3123834985109095 + - !!python/tuple + - 1.2080559782919127 + - 1.6819049089463929 + - 1.6520743751441995 + - 1.2291491071310716 + - 1.6799413281377027 + - 1.236481528850551 + - 1.2450846449114015 + - 1.7805846214373124 + - 1.690032648147822 + - 1.9531281253128663 + - 1.4830871431349575 + - 1.5766417359696683 + - 1.3252894685875327 + - !!python/tuple + - 1.1528201921929 + - 1.6982986889226803 + - 1.7133768709136277 + - 1.2323540259359445 + - 1.6883704268326314 + - 1.2454712335013083 + - 1.243440938110024 + - 1.8269348027094479 + - 1.6603595940067253 + - 1.9442098847723095 + - 1.4299538813862966 + - 1.5887905514149243 + - 1.2808425163231045 + - !!python/tuple + - 1.2007054893994424 + - 1.6925159157456124 + - 1.587204536994337 + - 1.2124999737116091 + - 1.7448226560406566 + - 1.2244818657223755 + - 1.2268984282809958 + - 1.8068324901487305 + - 1.707514645766961 + - 1.9804267388834251 + - 1.4429150208258492 + - 1.5386405938624486 + - 1.3005026054556001 + - !!python/tuple + - 1.179548209743853 + - 1.6932622534524917 + - 1.6821728029960328 + - 1.2043454621692684 + - 1.7311498440668096 + - 1.2426660281196569 + - 1.265776317879913 + - 1.8148330375386865 + - 1.640021894692775 + - 1.966675363487313 + - 1.4865569924394897 + - 1.545695033060078 + - 1.294450036703878 + - !!python/tuple + - 1.179548209743853 + - 1.6932622534524917 + - 1.6821728029960328 + - 1.2043454621692684 + - 1.7311498440668096 + - 1.2426660281196569 + - 1.265776317879913 + - 1.8148330375386865 + - 1.640021894692775 + - 1.966675363487313 + - 1.4865569924394897 + - 1.545695033060078 + - 1.294450036703878 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.0291403932435739 + - 2.474910790659557 + - 1.3617942600580744 + - 1.2567128766768723 + - 2.644700705050014 + - 3.982629895962046 + - 2.0615481701494964 + - 1.4533914169167081 + - 1.548188073560655 + - 1.7972239779235386 + - 0.7916364064652228 + - 0.8737480527193746 + - 1.6936318044759997 + - !!python/tuple + - 1.1362020549265393 + - 2.628583224138387 + - 1.5719463699367815 + - 1.4287622908778363 + - 2.7758339296602617 + - 3.7048630613875524 + - 2.0596414200421473 + - 1.5441491569221921 + - 1.741732389341968 + - 1.891235644560694 + - 1.0037844928171236 + - 0.990814804055212 + - 1.7260649915460782 + - !!python/tuple + - 0.8969688803510887 + - 2.17464262365076 + - 1.3058898447478395 + - 1.1683449998933166 + - 2.574250014392288 + - 3.521436839523717 + - 1.7941591874726006 + - 1.2799818407229058 + - 1.573833230706335 + - 1.6480798924789246 + - 0.8018675232478105 + - 0.7660372047110919 + - 1.5832791316919947 + - !!python/tuple + - 1.2028013689784587 + - 2.2172040071418797 + - 1.8189385999390342 + - 1.6258705486939975 + - 2.81153645391747 + - 3.6515999666114167 + - 2.066707956640629 + - 1.4907698739679758 + - 1.991922374614023 + - 1.812963800026249 + - 1.1783120526773079 + - 1.0972144826230912 + - 1.7670193236433342 + - !!python/tuple + - 1.012673317106319 + - 3.1173571107602815 + - 1.523898312927402 + - 1.3085591729968638 + - 2.633301371839828 + - 3.3795108261763076 + - 1.7818877633581152 + - 1.215217526137837 + - 1.5910682881672025 + - 1.4887761645941597 + - 1.0393002380799459 + - 0.7884668187076964 + - 1.6956711526825485 + - !!python/tuple + - 0.8090562824747489 + - 2.2190253446233434 + - 1.5598631585193767 + - 1.2534354325995058 + - 2.294111619991368 + - 3.2498494620053386 + - 1.9480015089303584 + - 1.2012608742700068 + - 1.5238634995478613 + - 1.7955411622161024 + - 0.8544666468673037 + - 0.8419161457923351 + - 1.5741549058977427 + - !!python/tuple + - 1.0367781046613729 + - 2.5451092597120915 + - 1.5452399959619272 + - 1.2532391114459995 + - 2.3815608560144677 + - 2.7589025528559477 + - 1.5453618774753237 + - 1.155252838683754 + - 1.530114346657823 + - 1.360810542338399 + - 0.8642681762417399 + - 0.6850545279521382 + - 1.4277982279805268 + - !!python/tuple + - 1.0004897836853164 + - 2.3373907033814842 + - 1.527375427294723 + - 1.1697839201879148 + - 2.335595524335439 + - 2.7026035297699775 + - 1.5084996674792794 + - 1.0793435989753801 + - 1.5322062358146098 + - 1.544656255323263 + - 1.024356898908725 + - 0.702053722606835 + - 1.2907533427327338 + - !!python/tuple + - 1.1530975018160439 + - 2.5479029015532006 + - 1.7407802011855946 + - 1.2370356529244182 + - 2.1010538972076276 + - 2.2514605976267954 + - 1.4283404484984021 + - 1.0416875808150337 + - 1.5313684872093227 + - 1.411521008790965 + - 1.1103584966565982 + - 0.6890524507471805 + - 1.370695664448595 + - !!python/tuple + - 0.9143875355012592 + - 2.549675650554119 + - 1.8246629020017089 + - 1.2198450319557224 + - 2.539241181230419 + - 1.6830085908903185 + - 1.3298277384038455 + - 0.9537377462002086 + - 1.3987320299541737 + - 1.2108780594752033 + - 1.1717831080884453 + - 0.7035788580535174 + - 1.3677788590593065 + - !!python/tuple + - 1.1681817444341343 + - 2.190831902428714 + - 1.9819438009207757 + - 1.3219029945805776 + - 2.0982624859062864 + - 1.6201491490468456 + - 1.3993907397979104 + - 0.8641905337189459 + - 1.7244825043603702 + - 1.7310643134418986 + - 1.5007596680003283 + - 0.8202424065618611 + - 1.2900437295713512 + - !!python/tuple + - 1.2035923821260537 + - 2.3493240992165463 + - 1.956894362287047 + - 1.331288108105193 + - 2.0952558127467076 + - 1.6356960799760323 + - 1.3288483562307092 + - 0.9415817658688259 + - 1.6589676964110942 + - 1.4237449727739135 + - 1.2592245603255339 + - 0.7458237546688251 + - 1.1956431387303064 + - !!python/tuple + - 1.2756801905901245 + - 2.291781666549053 + - 1.9961079797417616 + - 1.2931226698896727 + - 2.0605162154070644 + - 1.7494847719321331 + - 1.3901563845055347 + - 0.9920548598756458 + - 1.5335404055533841 + - 1.5186983772902258 + - 1.2934134560419759 + - 0.7819967882787235 + - 1.225846364819982 + - !!python/tuple + - 1.1969081291965857 + - 2.4319261560170484 + - 2.1068675834564656 + - 1.4571491428851082 + - 2.162053739189982 + - 1.5352213612006094 + - 1.392198860486927 + - 0.9529840628256494 + - 1.7538045560098359 + - 1.4410346450187685 + - 1.3479843229616766 + - 0.8086316504242 + - 1.382983357141864 + - !!python/tuple + - 0.9839970294460811 + - 2.288587494736153 + - 1.983225986839324 + - 1.2926108714348319 + - 2.0122948443888293 + - 1.9468785554674088 + - 1.653093772754366 + - 0.9762890416385512 + - 1.5373233458702211 + - 1.7503351134121594 + - 1.26355429000842 + - 0.8771830534453205 + - 1.4237413473899156 + - !!python/tuple + - 1.2015545680096222 + - 2.476955669811984 + - 2.149700477680296 + - 1.4024411657918088 + - 2.0137021228591605 + - 1.4328911201240873 + - 1.3815288258391032 + - 1.104875978977945 + - 1.5249546271306014 + - 1.5229026416161986 + - 1.4556707365668682 + - 0.8596277124884426 + - 1.291174399248816 + - !!python/tuple + - 1.1037026536717012 + - 2.0755758038100343 + - 2.0999552248378297 + - 1.40977304534576 + - 2.1806589353000883 + - 1.4940467136574043 + - 1.4777176563637549 + - 0.984568452216614 + - 1.6703600926652857 + - 1.674188835783032 + - 1.395719996861709 + - 0.9059998215219764 + - 1.2944956857010477 + - !!python/tuple + - 1.123250325800328 + - 2.3135927740374678 + - 2.014520329837246 + - 1.348671059950231 + - 2.243244342069976 + - 1.723895156433625 + - 1.4577185458883388 + - 1.1172350808707951 + - 1.5023410027362727 + - 1.3561248184829808 + - 1.1228050572678456 + - 0.8124494589395931 + - 1.3218346254883224 + - !!python/tuple + - 1.0114228665628797 + - 2.0497431258402385 + - 2.094205771766832 + - 1.3472963160116045 + - 2.355899815545578 + - 1.7650279312973172 + - 1.657706490604332 + - 1.1295102705320297 + - 1.4861552462055094 + - 1.7676891013492761 + - 1.3854165434686496 + - 0.9727654514385544 + - 1.555652367457671 + - !!python/tuple + - 0.9860298363709874 + - 2.2087910216461926 + - 2.0597947166654897 + - 1.4230749980073576 + - 2.3760583178399344 + - 1.6937888252090598 + - 1.5932391180742926 + - 1.0713311996942694 + - 1.6631672445157313 + - 1.6183378335895733 + - 1.3307356888614503 + - 0.9207091091430184 + - 1.4915263558737277 + - !!python/tuple + - 1.0485966266025473 + - 2.118116521422619 + - 2.002041024988025 + - 1.2720720162227652 + - 2.346058324068888 + - 1.815245582806225 + - 1.6124155524654031 + - 1.1188261096799677 + - 1.4307971672139985 + - 1.7095202344197526 + - 1.3359391617227543 + - 0.9315047613819695 + - 1.3714949518253423 + - !!python/tuple + - 0.8967759771560297 + - 2.1639897449152596 + - 2.1967292583905182 + - 1.3684487471220426 + - 2.2886520989151853 + - 1.2978315763043655 + - 1.493350440221119 + - 1.013606096414152 + - 1.5156374830033486 + - 1.5895775556119074 + - 1.4206408324008502 + - 0.912541331822441 + - 1.3502264787145246 + - !!python/tuple + - 1.0567857242551386 + - 2.3370900043798173 + - 2.149226988573589 + - 1.4236461739198263 + - 2.5208835386438038 + - 1.7028133734195035 + - 1.6441751015560426 + - 1.2001099111208706 + - 1.5326402194387927 + - 1.6278202417161387 + - 1.3764588444129406 + - 0.9840567030378213 + - 1.500216757372578 + - !!python/tuple + - 1.0149852081098847 + - 2.114142764289976 + - 2.193777416727441 + - 1.3551177805234764 + - 2.4044302804663484 + - 1.1122644388777547 + - 1.4218313954276813 + - 1.0650402489598436 + - 1.529276267877424 + - 1.587823731761082 + - 1.4811277099601001 + - 0.9378415970605349 + - 1.359841416277059 + - !!python/tuple + - 0.9727911232137334 + - 1.9128465736144218 + - 2.1479193504511493 + - 1.3684956674815423 + - 2.7118910260666302 + - 1.521201268920716 + - 1.6623220824455385 + - 1.0508794320497785 + - 1.601267093398715 + - 1.6840175694226973 + - 1.3550388012222656 + - 0.9978376062057968 + - 1.4995314992541067 + - !!python/tuple + - 0.936437225179622 + - 2.1781161054292637 + - 2.1768661481424374 + - 1.3443889552312984 + - 2.551471298457515 + - 1.5661072488026644 + - 1.674598625086429 + - 1.2438955223452945 + - 1.3583631969836891 + - 1.5949567644171163 + - 1.3290406011699378 + - 0.9961238495466092 + - 1.5659335410835153 + - !!python/tuple + - 0.9322210396581618 + - 2.1932953489479847 + - 2.153503918467097 + - 1.370712195649106 + - 2.4649605359363727 + - 1.2648712664438044 + - 1.5029123514410028 + - 1.0969447465246678 + - 1.4838891784443375 + - 1.4884879435511518 + - 1.3287143658933147 + - 0.929193725206197 + - 1.3350326468333182 + - !!python/tuple + - 0.988267377852605 + - 2.0535214555438066 + - 2.11695497546192 + - 1.369202333569291 + - 2.6751950754012146 + - 1.572020857113455 + - 1.664534676714501 + - 1.2694213776666383 + - 1.4075797090724838 + - 1.620909075252838 + - 1.3048224480440909 + - 1.0276462679722855 + - 1.556321226305426 + - !!python/tuple + - 0.9350817182262434 + - 2.022361639209304 + - 2.1012724802025535 + - 1.3296217782885846 + - 2.6582035595633826 + - 1.4390451978798278 + - 1.5323687442430487 + - 1.1957269051390997 + - 1.3955302853603448 + - 1.4124260392662846 + - 1.189731435393993 + - 0.9243474094381838 + - 1.391462630971888 + - !!python/tuple + - 0.9458620483342253 + - 2.1568654843298125 + - 2.184864552616796 + - 1.3468276274691773 + - 2.583947118960513 + - 1.2693830755346043 + - 1.5337129006810923 + - 1.1829589686747926 + - 1.3482662672753696 + - 1.4635491913908547 + - 1.322531860087179 + - 0.9607567197160389 + - 1.451245495333402 + - !!python/tuple + - 0.9252382144094804 + - 2.1479739845176833 + - 2.1570297814006043 + - 1.3416907471232618 + - 2.42870964320132 + - 1.3229528593025237 + - 1.5274136041435729 + - 1.2203064566136255 + - 1.3068326308340283 + - 1.4858620734125185 + - 1.2934172228504135 + - 0.949573557431615 + - 1.4141707266739263 + - !!python/tuple + - 1.0331409287148714 + - 2.107141228861166 + - 2.114120273030901 + - 1.3093065831759134 + - 2.5378831133610493 + - 1.43492670926695 + - 1.5511494813908873 + - 1.217938146411052 + - 1.3091321376476892 + - 1.483003517849649 + - 1.2569346251283045 + - 0.9491191928557214 + - 1.3720517152611076 + - !!python/tuple + - 0.9093484836247681 + - 2.1475934901809035 + - 2.145700785664651 + - 1.3364580319307424 + - 2.5745305797117517 + - 1.4204873814893018 + - 1.632099782725638 + - 1.2321148494578285 + - 1.3059638304388297 + - 1.4811456485168426 + - 1.2007594863169961 + - 0.9817881353217572 + - 1.466308289239459 + - !!python/tuple + - 1.0101571769000153 + - 2.071345421234986 + - 2.1198437236877394 + - 1.3649447001847106 + - 2.65237001411705 + - 1.4689431519195661 + - 1.6249011264072253 + - 1.2271567084518065 + - 1.3890445912349507 + - 1.4963562274534927 + - 1.212271980511277 + - 0.9921669929947835 + - 1.47636945824211 + - !!python/tuple + - 0.9236363872713995 + - 2.1535376585719797 + - 2.0813341620812276 + - 1.3709736618604609 + - 2.5301455609446926 + - 1.3914053143734944 + - 1.576128931203128 + - 1.1972340733094577 + - 1.4204048159504792 + - 1.464602671532311 + - 1.1946517870633933 + - 0.9635474374327375 + - 1.405873644635969 + - !!python/tuple + - 0.9260514665271858 + - 2.027141124121129 + - 2.1496458847524913 + - 1.367287422075907 + - 2.6064353057532212 + - 1.2742941281428104 + - 1.6173224924513443 + - 1.2028679226548111 + - 1.3830034692067168 + - 1.469694183647094 + - 1.1733625034487996 + - 0.9967353655904311 + - 1.450457719907549 + - !!python/tuple + - 1.0334322422796036 + - 1.9822872998477203 + - 2.0543716600101174 + - 1.3949085357829483 + - 2.5725692271670106 + - 1.299589889575711 + - 1.5328210744483526 + - 1.25607005702793 + - 1.4172011004480716 + - 1.417028154270121 + - 1.1285768238684812 + - 0.983854705699819 + - 1.3427832302793443 + - !!python/tuple + - 0.936873524570892 + - 1.9412841396252216 + - 2.0795148426093184 + - 1.3672118801613915 + - 2.6634723021754967 + - 1.4680061249356207 + - 1.7095585636705461 + - 1.2952348803139324 + - 1.380781503542427 + - 1.5826323584350357 + - 1.132867514997183 + - 1.0623771631764458 + - 1.4338771585152417 + - !!python/tuple + - 0.9708686639726918 + - 2.1275430371016304 + - 2.121832201801308 + - 1.3689866343847998 + - 2.491608442514002 + - 1.2529711082825572 + - 1.5772721435044417 + - 1.215513716561392 + - 1.3794161478162343 + - 1.4727270336181877 + - 1.190020691700396 + - 0.9936294992643351 + - 1.3547817889853881 + - !!python/tuple + - 0.9051001173466425 + - 2.0129191169384786 + - 2.0429316535197115 + - 1.3447722653849226 + - 2.504731241645981 + - 1.3033317494427008 + - 1.5727375547947657 + - 1.174935799748058 + - 1.399542215183843 + - 1.4732819158592028 + - 1.120248469027604 + - 0.974716182428359 + - 1.3275796206577652 + - !!python/tuple + - 0.9111390734811722 + - 1.9993924246787342 + - 2.0795901969121533 + - 1.4058589002087658 + - 2.551724019026212 + - 1.2690077300863503 + - 1.6034891931759 + - 1.2078562245712448 + - 1.4648567743032859 + - 1.4673779120294483 + - 1.1166637829005395 + - 1.0061618713448586 + - 1.3426087235982704 + - !!python/tuple + - 0.9489700865398459 + - 1.9753580389895462 + - 2.034783187248877 + - 1.451217818525889 + - 2.581815562525942 + - 1.3159027213236445 + - 1.6443861038251901 + - 1.2878908041930746 + - 1.5164052601106308 + - 1.5164890643813294 + - 1.0976719197998088 + - 1.0533252941732931 + - 1.457767680311048 + - !!python/tuple + - 0.9738788501595561 + - 1.8945609227433517 + - 2.087692416456628 + - 1.3729830964803762 + - 2.609206097970981 + - 1.2362452162760735 + - 1.6361290884458712 + - 1.2897970916070511 + - 1.3527396022221505 + - 1.4840002758517572 + - 1.0815738233906436 + - 1.0486409376520365 + - 1.3686814449340845 + - !!python/tuple + - 1.003328076115317 + - 1.9172045890267264 + - 2.0843350225273456 + - 1.4031505998145932 + - 2.657938659696696 + - 1.3036102453359395 + - 1.6432142509062484 + - 1.2153213897337927 + - 1.4917853784190471 + - 1.5499852258602032 + - 1.1676479381044365 + - 1.0486108814657276 + - 1.4110584507238015 + - !!python/tuple + - 1.0279413246119526 + - 1.9452290401845191 + - 1.9397765329544514 + - 1.3960717988899656 + - 2.5336008859890398 + - 1.382093783695019 + - 1.6031341296933352 + - 1.3313022423682348 + - 1.4330893188497624 + - 1.5191212666966722 + - 1.060893893142966 + - 1.0537957931471957 + - 1.2528620167151452 + - !!python/tuple + - 1.0371616058729742 + - 1.9235579011025594 + - 1.994625797607568 + - 1.4041953981041868 + - 2.5914548447628105 + - 1.350511555199978 + - 1.6786974787357105 + - 1.3098873778425806 + - 1.4681820278977316 + - 1.5882955508538106 + - 1.0839420556245059 + - 1.090834152528633 + - 1.370838002182298 + - !!python/tuple + - 1.0128985188655508 + - 1.939623034809134 + - 2.033254747326027 + - 1.351602261260647 + - 2.56284626776106 + - 1.3089409999436585 + - 1.6430792411495774 + - 1.233236886474521 + - 1.4092145832884022 + - 1.5502315502669266 + - 1.100821631929036 + - 1.0494413232933277 + - 1.2423052488343278 + - !!python/tuple + - 1.0128985188655508 + - 1.939623034809134 + - 2.033254747326027 + - 1.351602261260647 + - 2.56284626776106 + - 1.3089409999436585 + - 1.6430792411495774 + - 1.233236886474521 + - 1.4092145832884022 + - 1.5502315502669266 + - 1.100821631929036 + - 1.0494413232933277 + - 1.2423052488343278 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.1157773985185804 + - 1.4117161414774748 + - 1.5166181110598917 + - 1.1367771252171777 + - 2.80722271377346 + - 2.055897181087418 + - 1.700250527979078 + - 1.2696714410641765 + - 1.1125598667801353 + - 2.5116172058974366 + - 1.79053254681389 + - 1.9793323691032287 + - 1.908867662020409 + - !!python/tuple + - 1.185562505283348 + - 1.086398518971611 + - 1.638401757917159 + - 1.219525226089601 + - 1.794312266153793 + - 1.852211161954329 + - 0.8813969331143383 + - 1.3988502883302558 + - 1.373544840778234 + - 2.2514178462485335 + - 1.4062332703314837 + - 1.2480520042728327 + - 1.5871720687002706 + - !!python/tuple + - 1.0338832869508356 + - 1.1498926498187763 + - 1.729063549474432 + - 1.3040008132911693 + - 2.0917633873173003 + - 2.009180739583715 + - 1.1481028225114678 + - 1.3609361822359818 + - 1.4306299591594445 + - 2.4960552503735327 + - 1.6569959327800912 + - 1.4010315162853009 + - 1.3030990416349533 + - !!python/tuple + - 0.8801943809478399 + - 1.329909528723841 + - 1.8505975015270155 + - 1.3221430271784884 + - 2.2234935713788326 + - 1.9580025893343067 + - 1.1103808611297301 + - 1.3841775887243346 + - 1.3104183607824371 + - 2.4579729501004115 + - 1.67849724629015 + - 1.7141029350706778 + - 1.3430896815230031 + - !!python/tuple + - 1.0614921856718493 + - 1.37119183427 + - 1.6893054469506332 + - 1.2760288392935166 + - 2.311524035803333 + - 1.9428871682864877 + - 1.1193967898067394 + - 1.2700984745974924 + - 1.2788253112886911 + - 2.5065671547354285 + - 1.5791936955000405 + - 1.4662704689679134 + - 1.2975527504636712 + - !!python/tuple + - 0.9245087407431156 + - 1.3207779796900896 + - 1.8254775915662238 + - 1.268046471978873 + - 2.3981303155791855 + - 1.7991227871723443 + - 1.1317984734212132 + - 1.4238216313053549 + - 1.3517807872300134 + - 2.645940209258634 + - 1.6227575083676125 + - 1.3117346544529038 + - 1.2536110552269122 + - !!python/tuple + - 0.958594892989959 + - 1.4266625246316502 + - 1.9456289060566994 + - 1.3483513735730406 + - 2.2619196388633496 + - 1.844748495179767 + - 1.0564209225363883 + - 1.332121656371479 + - 1.262702727778799 + - 2.5349024577699004 + - 1.5276544822133142 + - 1.579787388664541 + - 1.2396014825064252 + - !!python/tuple + - 0.9166008900166914 + - 1.4869456591411048 + - 1.9256025552331757 + - 1.3869628114937997 + - 2.2953768681945745 + - 1.9072809574074796 + - 1.0343292058709648 + - 1.4081206906022654 + - 1.2786992626120948 + - 2.58218343852815 + - 1.4716825121824844 + - 1.587776996223556 + - 1.2298400327912833 + - !!python/tuple + - 0.8462005858785058 + - 1.4292228140593386 + - 1.9903892868152353 + - 1.3495266679239792 + - 2.3557177687048982 + - 1.7359172664630647 + - 1.0991964463269752 + - 1.4287263447622478 + - 1.3456071012172344 + - 2.7046650879195964 + - 1.4655481363819212 + - 1.387570640393941 + - 1.2599996794158228 + - !!python/tuple + - 0.9702084241926535 + - 1.3685164043539264 + - 1.8271917077341129 + - 1.3050560957678219 + - 2.312971448507577 + - 1.8073702549276711 + - 1.0542607746607722 + - 1.3403593974059984 + - 1.3087103271110418 + - 2.58615852370436 + - 1.4254575969126317 + - 1.3613006504604135 + - 1.294824524793495 + - !!python/tuple + - 0.8528212684868477 + - 1.5450365402112403 + - 1.8370748548377873 + - 1.3384611023525215 + - 2.3498473408147067 + - 1.7964616077933004 + - 1.00676897194991 + - 1.3042881840943406 + - 1.2989434011000065 + - 2.5030985915176815 + - 1.4424038229561797 + - 1.4848427805879159 + - 1.4114897415159875 + - !!python/tuple + - 1.0193662328777298 + - 1.5345157820613629 + - 1.9820525056995573 + - 1.409704637598265 + - 2.339991359777313 + - 1.823526232424428 + - 1.1007259584710183 + - 1.4287806259827627 + - 1.3593073847806227 + - 2.66321459110071 + - 1.506725564787346 + - 1.3660406627295858 + - 1.285909355598021 + - !!python/tuple + - 0.9336166774429318 + - 1.4613336330901763 + - 1.8084891446801767 + - 1.3390123699470693 + - 2.3673517015831864 + - 1.8054669006987862 + - 1.1145554462205984 + - 1.3869078094068203 + - 1.4071510244208745 + - 2.6920571495749415 + - 1.4642283947315895 + - 1.2342067204502083 + - 1.3374530827120197 + - !!python/tuple + - 0.9077670691549906 + - 1.5529445489723912 + - 1.9607445178946672 + - 1.4052961522095928 + - 2.359020882053499 + - 1.7773021470726516 + - 1.0720333577103265 + - 1.3674291412846968 + - 1.3691097707896165 + - 2.7086025813008456 + - 1.4314615208485217 + - 1.3325987180085748 + - 1.2045490857239267 + - !!python/tuple + - 0.8581929243928044 + - 1.503197997656133 + - 1.888455163584816 + - 1.3766248070165732 + - 2.285204842441727 + - 1.8302836317789792 + - 1.0913183637636665 + - 1.4143367404172889 + - 1.3752177626880588 + - 2.603224276777336 + - 1.4756858754943374 + - 1.4562880780942524 + - 1.3664372630627055 + - !!python/tuple + - 0.9543993849460085 + - 1.5130464665443057 + - 1.8693278797334754 + - 1.323186053401347 + - 2.1711681282186306 + - 1.669198526493436 + - 0.9218742361155645 + - 1.392669247247898 + - 1.3651547397565038 + - 2.5646783899241705 + - 1.4315305296480876 + - 1.3371415206931319 + - 1.277806121549826 + - !!python/tuple + - 0.8494339346298811 + - 1.7201061435783551 + - 1.923698165037307 + - 1.4361440014633589 + - 2.2673617914180246 + - 1.8204409885650104 + - 1.1095150136497882 + - 1.4458986209868054 + - 1.4238598537415759 + - 2.6656517848491674 + - 1.5625849156880798 + - 1.4655036511640709 + - 1.334212253083035 + - !!python/tuple + - 0.9228482226288939 + - 1.6437491745546813 + - 1.9014242718125969 + - 1.4027919678801237 + - 2.4831272691283526 + - 1.7808552732220913 + - 1.103307997982042 + - 1.4271688020400184 + - 1.4126026179502638 + - 2.7210299534960027 + - 1.4593060936282995 + - 1.3362271517688447 + - 1.3899590122515735 + - !!python/tuple + - 0.8906975173552562 + - 1.6505041809049668 + - 1.916230220577987 + - 1.4116578368035297 + - 2.293675925681147 + - 1.7555975393547965 + - 1.009539793680008 + - 1.4089526158217307 + - 1.390802296304212 + - 2.6072430306541374 + - 1.4427869330895304 + - 1.2999780470096693 + - 1.3383912283000554 + - !!python/tuple + - 0.8996622451115794 + - 1.6551129150075692 + - 1.859751625247866 + - 1.4167885381397618 + - 2.230364846799657 + - 1.763774525962582 + - 1.0045340719045006 + - 1.380193553567966 + - 1.457882977557253 + - 2.6233966198721763 + - 1.427892212324088 + - 1.2884706577649374 + - 1.361684757003248 + - !!python/tuple + - 0.925440128520916 + - 1.7533758213811526 + - 1.8560346724097947 + - 1.3954933777068663 + - 2.266396826647822 + - 1.6910076759155503 + - 0.981752541440061 + - 1.342050036378215 + - 1.4136736985954828 + - 2.619953477323694 + - 1.4265491731113586 + - 1.3144986704590458 + - 1.3659958757576474 + - !!python/tuple + - 0.8631847525002421 + - 1.863294621606612 + - 1.901285870348037 + - 1.4560650158313295 + - 2.1382885107462566 + - 1.6245050672503851 + - 0.9866141729240501 + - 1.4713759910858772 + - 1.547681216031202 + - 2.7156558541450395 + - 1.4012598587538676 + - 1.2238955604424069 + - 1.3773733637931638 + - !!python/tuple + - 0.9468259032370208 + - 1.8118376838559305 + - 1.738767230879307 + - 1.3775432403203727 + - 2.0414258545081645 + - 1.6602883771143913 + - 0.9870544408356188 + - 1.364661881836653 + - 1.5324181497577603 + - 2.6027963108404935 + - 1.4792352911490005 + - 1.3721255316317058 + - 1.4556665210968411 + - !!python/tuple + - 0.9397803688302448 + - 1.838787470000347 + - 1.8238049459160348 + - 1.358225230458818 + - 2.1244467063577233 + - 1.6200529849338525 + - 0.9930321233707375 + - 1.418595774406187 + - 1.41545721160564 + - 2.565735214935567 + - 1.5208731354856342 + - 1.4144452810135006 + - 1.4307675630966692 + - !!python/tuple + - 0.9319444730384869 + - 1.9942795582770634 + - 1.7580802780269797 + - 1.392026533628297 + - 2.087673185922468 + - 1.5666933355972665 + - 0.9661656222949786 + - 1.4384010648204737 + - 1.547993459119451 + - 2.6478993978894403 + - 1.4750955577739853 + - 1.348617219033619 + - 1.4908595559017535 + - !!python/tuple + - 0.9452266566748455 + - 1.7872695074461564 + - 1.6952573497851455 + - 1.3343230838916118 + - 2.081788946339596 + - 1.651780407394389 + - 0.9756762159560999 + - 1.3943516088410062 + - 1.4793772771978517 + - 2.5943865490465847 + - 1.483255453749914 + - 1.3744089881513197 + - 1.4181558965147119 + - !!python/tuple + - 0.9469344597243551 + - 2.1061410192358045 + - 1.8774749467073941 + - 1.439738831264065 + - 2.2311587956180947 + - 1.5769287263863494 + - 1.0138593157501457 + - 1.5452441506656895 + - 1.469431006298773 + - 2.719232155458661 + - 1.4735157644793646 + - 1.3602772787099542 + - 1.436006678928416 + - !!python/tuple + - 0.9020123168449959 + - 1.9008407980773134 + - 1.84429296205994 + - 1.3946340160254596 + - 2.123863409587519 + - 1.6368847439812981 + - 1.051826795807994 + - 1.4814128998529117 + - 1.4627051225742922 + - 2.6754459666855768 + - 1.4993092437733784 + - 1.497396122687944 + - 1.3906567676096995 + - !!python/tuple + - 0.8754758739995862 + - 1.9022168464668188 + - 1.7540282171743389 + - 1.2993959928186287 + - 2.2061342173396916 + - 1.534517772529631 + - 1.053156140385634 + - 1.4011030130383122 + - 1.3962171192010413 + - 2.6953645475300236 + - 1.4868957169853452 + - 1.4393066123308689 + - 1.3866497835892226 + - !!python/tuple + - 0.8881520977495025 + - 2.0127923219577837 + - 1.7781556253332034 + - 1.3634418972953202 + - 2.1264929006398505 + - 1.543334252029946 + - 1.0325355721434564 + - 1.4968813868833801 + - 1.501787529289688 + - 2.6770566582074986 + - 1.5525266928741104 + - 1.4133884103822671 + - 1.4572033796984758 + - !!python/tuple + - 0.928057518751874 + - 1.979137547797118 + - 1.8048451953890146 + - 1.3357777864940292 + - 2.102183199425377 + - 1.4606188129002748 + - 0.9783407825569512 + - 1.4861213301183758 + - 1.4739825135914393 + - 2.664041850372517 + - 1.4946886976829834 + - 1.3949558503262036 + - 1.4464532766122455 + - !!python/tuple + - 0.9116691208131794 + - 1.8987151156914281 + - 1.6502449521988156 + - 1.2624919923743252 + - 2.187956979185923 + - 1.5753554732200552 + - 1.0821564468402733 + - 1.4626661200787354 + - 1.3839305599227196 + - 2.617755578030118 + - 1.5465647512764222 + - 1.4602176021373592 + - 1.46649816410595 + - !!python/tuple + - 0.8956206189293572 + - 2.0636667909700512 + - 1.6956975502128948 + - 1.3584814865888417 + - 2.103344095087502 + - 1.5327894526817802 + - 1.04681858943753 + - 1.4934862227697256 + - 1.5492481879973377 + - 2.7436772420367586 + - 1.4857671087024666 + - 1.421379038912442 + - 1.4752268558277835 + - !!python/tuple + - 0.9810079993066283 + - 1.9872931915220156 + - 1.749463960965047 + - 1.3447892416647491 + - 2.07317530518295 + - 1.5294573121926613 + - 1.0491739047178412 + - 1.51774517050371 + - 1.502079524754981 + - 2.718732974713006 + - 1.5068520012937152 + - 1.3718613914022235 + - 1.4397281152287578 + - !!python/tuple + - 0.9041193087797519 + - 1.9721578577950114 + - 1.7795481317385693 + - 1.3321547686591455 + - 2.094740665008588 + - 1.565201679009469 + - 1.0129469088199499 + - 1.54216161741006 + - 1.3912669879497317 + - 2.630834695620707 + - 1.5218949603859018 + - 1.5054949889605047 + - 1.3902404740763155 + - !!python/tuple + - 0.893679201000678 + - 2.038256031613383 + - 1.7608598844590877 + - 1.289438883877025 + - 2.2135182316923308 + - 1.4527123584765422 + - 1.0740049549131594 + - 1.5048158664019278 + - 1.3927008824703089 + - 2.742436911714893 + - 1.5283472922823675 + - 1.470765259547017 + - 1.3685435565556054 + - !!python/tuple + - 0.9371157174487459 + - 1.9561620714141772 + - 1.7089278576564455 + - 1.2784952411702304 + - 2.1727793759124063 + - 1.5001694428864067 + - 1.0493093925895032 + - 1.5156708573143618 + - 1.3867912371539097 + - 2.7022854936998044 + - 1.4746025200593538 + - 1.4242582633893486 + - 1.393437719119581 + - !!python/tuple + - 0.9196933431986087 + - 2.030231764031015 + - 1.6849225950394344 + - 1.2911244995400812 + - 2.1551506594390277 + - 1.4686851675904833 + - 1.0234327594485475 + - 1.5401447014555902 + - 1.453014962667331 + - 2.709673533843665 + - 1.5000449044984014 + - 1.359089344838335 + - 1.429123257757655 + - !!python/tuple + - 0.9196933431986087 + - 2.030231764031015 + - 1.6849225950394344 + - 1.2911244995400812 + - 2.1551506594390277 + - 1.4686851675904833 + - 1.0234327594485475 + - 1.5401447014555902 + - 1.453014962667331 + - 2.709673533843665 + - 1.5000449044984014 + - 1.359089344838335 + - 1.429123257757655 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 2.4190345869174315 + - 2.215878148402972 + - 1.1775710469910718 + - 1.0710322476270977 + - 1.6292739513763144 + - 1.5663480276430477 + - 0.9744884364906221 + - 1.903542276401782 + - 1.588086316092393 + - 1.826539512247204 + - 1.5047781537778309 + - 0.9197094078526763 + - 1.9611263003898092 + - !!python/tuple + - 2.361225539396453 + - 2.5496569002036136 + - 1.591246790469441 + - 1.080581580707915 + - 2.2131346536189236 + - 1.4212931881212911 + - 1.3219851996050132 + - 2.294109803782633 + - 2.1246424292684747 + - 2.165905335566288 + - 2.048837790328811 + - 1.3583195195990712 + - 2.27122640025978 + - !!python/tuple + - 2.3902904455183767 + - 3.070425968955868 + - 1.6764353104075278 + - 1.1126616730747898 + - 2.05101082820208 + - 2.2165272700693475 + - 1.345997427037396 + - 2.0692575644448956 + - 1.8722827970687428 + - 1.839664550686238 + - 1.7500823050748793 + - 1.2505901742136065 + - 1.9123653294993463 + - !!python/tuple + - 1.851919868511862 + - 2.6305251860053698 + - 1.6645239207631515 + - 1.2502241167637484 + - 2.0698831595174463 + - 1.3056423597673232 + - 1.2839953763961713 + - 2.3735449306371708 + - 1.7947858434329595 + - 1.8110564339847524 + - 1.7683679869441942 + - 1.2928497081914199 + - 2.073227247935771 + - !!python/tuple + - 1.4464124416209851 + - 2.7491536061395516 + - 1.6558275069312112 + - 1.3370203047564537 + - 2.0858500869827283 + - 1.5293616365715614 + - 1.2464282500172912 + - 2.2704965369086447 + - 2.155512736717771 + - 1.6496094648848838 + - 1.9556048345398627 + - 1.6652701465850632 + - 1.9204954825871554 + - !!python/tuple + - 1.3827166001029214 + - 3.4646450366567745 + - 1.55585111710655 + - 1.3892043926290185 + - 1.8721720961742 + - 1.7460949492011133 + - 1.241827936245715 + - 2.0675055479063906 + - 1.331987028624064 + - 1.349419275505092 + - 1.570627146964651 + - 1.143484373970486 + - 1.5982824614262299 + - !!python/tuple + - 1.0970440757313225 + - 3.5079479293567366 + - 1.9062414277361457 + - 1.2535669445130633 + - 2.3984595743285038 + - 1.775041031118617 + - 1.1198506267232908 + - 2.3447724886873442 + - 1.6523722122683837 + - 1.2130524754033876 + - 1.6571984628009546 + - 1.395352495920504 + - 1.7610680177348734 + - !!python/tuple + - 1.0750248428068518 + - 3.150164618132097 + - 1.8704597561982703 + - 1.2686617906824122 + - 2.308398769658975 + - 1.8640378330870666 + - 1.2752035099504158 + - 2.3540011206219003 + - 1.6356539313043381 + - 1.2106295233581814 + - 1.813668830129039 + - 1.4707560836056977 + - 1.49207510917678 + - !!python/tuple + - 1.1383138756193683 + - 3.03946992664018 + - 1.7007633505069435 + - 1.1044948028709987 + - 1.804502984198836 + - 1.7343663801660083 + - 1.1688154468571426 + - 2.19280558673014 + - 1.5405185382533815 + - 1.2956950593626737 + - 1.4423836733523836 + - 1.196198887045375 + - 1.6838586497977377 + - !!python/tuple + - 1.0267166320032732 + - 2.7985564160282816 + - 1.6420868942300162 + - 1.1365789060625127 + - 2.0824905680939607 + - 1.6208005140054824 + - 0.9119931801334433 + - 2.2349815795672168 + - 1.675835357494864 + - 1.158336130751378 + - 1.3904107025508161 + - 1.2427488143577468 + - 1.6029755519478388 + - !!python/tuple + - 1.4218471826281465 + - 2.4592419279112163 + - 1.505855257942493 + - 1.071788016895651 + - 1.7796010107755782 + - 1.7255741140153764 + - 1.1883765516274585 + - 2.123788763636815 + - 1.7063901563893784 + - 1.4353694665060877 + - 1.6669894041703324 + - 1.2969795670142206 + - 1.5574065662719656 + - !!python/tuple + - 1.2426865298253496 + - 2.942021616774994 + - 1.6419727925741885 + - 1.1433615029495172 + - 1.9551502369132767 + - 1.7693987742341748 + - 1.0433345514360406 + - 2.176299857546321 + - 1.5607844752496514 + - 1.3308264633817217 + - 1.7915015752024113 + - 1.3735670783371847 + - 1.5349795267926118 + - !!python/tuple + - 1.1584977703941788 + - 2.9030151402416515 + - 1.81067958065824 + - 1.0643598902951894 + - 2.0627810169509324 + - 1.7490333203991377 + - 1.1609689663902034 + - 2.2966440527956995 + - 1.8799549417740251 + - 1.4360652230953903 + - 1.8209391286750671 + - 1.5218667488183732 + - 1.6710915361581944 + - !!python/tuple + - 1.1854189523288952 + - 2.8902984202520443 + - 1.7603171927769887 + - 1.0040483471627266 + - 2.0116938618452105 + - 1.858974270439917 + - 1.08475967706105 + - 2.2244208617443864 + - 1.5524160545738241 + - 1.2425669627219191 + - 1.5232990763992555 + - 1.2323295035279518 + - 1.5375757297502202 + - !!python/tuple + - 1.0359979921381224 + - 2.7984051161402643 + - 1.754326447649926 + - 1.128157119762844 + - 1.925606128412289 + - 1.7930285551344864 + - 1.0666056356960913 + - 2.2164559017358165 + - 1.6828600206249327 + - 1.1862328521543586 + - 1.5152631716807183 + - 1.3767850244347755 + - 1.5145570130453518 + - !!python/tuple + - 1.0445399624369889 + - 2.8363066693422136 + - 1.7515752445662878 + - 1.0300272311329801 + - 1.9327297233451546 + - 1.930805432091386 + - 1.0528448791229421 + - 2.177151113724574 + - 1.7008721518727432 + - 1.2011676707166803 + - 1.5736298077222517 + - 1.3821783953591797 + - 1.4698610495963085 + - !!python/tuple + - 1.0353246168981758 + - 2.7183979618965544 + - 1.7667324198597072 + - 1.0723673656303632 + - 2.0080331652953674 + - 1.7987398412802098 + - 1.0484323837665759 + - 2.2569121762067397 + - 1.7435165235883696 + - 1.2483867800763186 + - 1.6605940656849736 + - 1.4429855737783877 + - 1.51199993859385 + - !!python/tuple + - 1.1024458868358713 + - 2.7698792225954127 + - 1.6711262855076965 + - 1.1114701311184279 + - 2.022116550489232 + - 1.6882576313158835 + - 0.9897747993945804 + - 2.225540456194839 + - 1.6885099532259127 + - 1.2396029345830604 + - 1.5244680277940197 + - 1.3091504051563105 + - 1.5779102213899292 + - !!python/tuple + - 1.287726496925528 + - 2.6121695667939644 + - 1.609367045347212 + - 1.0806009216974115 + - 1.879999292588258 + - 1.7392091819862345 + - 1.120327956209554 + - 2.173857574866485 + - 1.703099652551498 + - 1.3705901204633757 + - 1.6572757872046886 + - 1.3367338906438588 + - 1.5559143306719145 + - !!python/tuple + - 1.0714543183281895 + - 2.53742632535058 + - 1.7787686041255228 + - 1.0258106760100416 + - 1.9940832281462888 + - 1.731645173026481 + - 1.0730693093431838 + - 2.2711771788490913 + - 1.8607284648394076 + - 1.2869125711644755 + - 1.48297264404526 + - 1.3737427059492973 + - 1.5770854024094694 + - !!python/tuple + - 1.1299016057576303 + - 2.63343182233299 + - 1.6597502583545998 + - 1.1484662688687164 + - 1.8911283971393538 + - 1.8666899590786654 + - 1.0602912830670008 + - 2.094273331733437 + - 1.7707454924099888 + - 1.225816345952677 + - 1.4450960892930405 + - 1.355217122547823 + - 1.4168546844335537 + - !!python/tuple + - 1.1932438212431247 + - 2.4476918924697006 + - 1.6185273142243335 + - 1.0552449597768048 + - 1.8230731813656451 + - 1.771993556310638 + - 1.0076148115290078 + - 2.149721505602769 + - 1.7813590390614298 + - 1.3179086301295482 + - 1.4634521578115867 + - 1.3022919603050713 + - 1.4854518442396336 + - !!python/tuple + - 1.138230524739101 + - 2.3772791114158203 + - 1.6295809528307825 + - 1.0688400704942402 + - 1.9157925008127281 + - 1.6310420075100152 + - 1.0008403588898434 + - 2.2034039915267725 + - 1.8482316317399357 + - 1.3539371054493259 + - 1.5777615458353347 + - 1.3814611366688843 + - 1.5215042838892954 + - !!python/tuple + - 1.1751712212534342 + - 2.44506802993759 + - 1.6631202561012408 + - 1.0238835119128558 + - 1.952077204537898 + - 1.7888501629782634 + - 1.0101829609555133 + - 2.1713235441947383 + - 1.6955304366520525 + - 1.2404030804548256 + - 1.3703008610172418 + - 1.21224090985332 + - 1.420385310023041 + - !!python/tuple + - 1.1958787533120716 + - 2.328916836441495 + - 1.6686968785426068 + - 1.0490099359094707 + - 1.9851680723628191 + - 1.75372243547837 + - 1.0097256729608404 + - 2.200408850336562 + - 1.9026543768725035 + - 1.305516823961391 + - 1.482787757252153 + - 1.3662047637634627 + - 1.4971785356520408 + - !!python/tuple + - 1.2140815426709552 + - 2.4643570773083554 + - 1.6909189811269518 + - 1.0773835977526705 + - 1.9391315062871604 + - 1.7493926778851845 + - 1.097539495156359 + - 2.1909752782566416 + - 1.9163387182369072 + - 1.3764764069263284 + - 1.5166087042994882 + - 1.385656874172293 + - 1.5343691107296649 + - !!python/tuple + - 1.1250203223493118 + - 2.4554494526150616 + - 1.6650773750478036 + - 1.1133583659133826 + - 1.9665838542084702 + - 1.7065589559589356 + - 1.0389672798258542 + - 2.1877689249547596 + - 1.8496364308635163 + - 1.272123082528172 + - 1.3847589075104638 + - 1.312076729453453 + - 1.4999359061496282 + - !!python/tuple + - 1.1052318981772105 + - 2.412011093000287 + - 1.7041865074761655 + - 1.1088879216959577 + - 1.9492541721507748 + - 1.7479361276431984 + - 1.0826075791484908 + - 2.1961850061031476 + - 1.8846117933608797 + - 1.2863798122215142 + - 1.4270911521486558 + - 1.3665530773830228 + - 1.4714805111890932 + - !!python/tuple + - 1.2651206162939577 + - 2.383111322198816 + - 1.6505296534756082 + - 1.0693920613148697 + - 1.949255123431535 + - 1.8016385020089511 + - 1.0960737288030744 + - 2.1279755470101813 + - 1.926039755889375 + - 1.3871662993707663 + - 1.3813845671925893 + - 1.2888074770719722 + - 1.4866383415134254 + - !!python/tuple + - 1.1722821566500452 + - 2.373092980383128 + - 1.7554899950887872 + - 1.1452710985397856 + - 2.1650421277390812 + - 1.6888807221199795 + - 1.1297020524818369 + - 2.227927063350028 + - 1.9871649262125337 + - 1.3277070174363348 + - 1.4194012781209429 + - 1.3794551363835574 + - 1.5026853773974715 + - !!python/tuple + - 1.115384369383176 + - 2.5407984727915665 + - 1.7619807329082904 + - 1.113078495257752 + - 2.052787879376862 + - 1.7769379423895342 + - 1.1259255481493913 + - 2.2015667140825923 + - 1.9043840878382516 + - 1.3037595767417325 + - 1.3723446288120766 + - 1.3315428267646137 + - 1.4808549175439207 + - !!python/tuple + - 1.1952443031537978 + - 2.2596685757265442 + - 1.6203447161203066 + - 1.1322187141440783 + - 2.0993966140977327 + - 1.5639987755469167 + - 1.0717390373862958 + - 2.1775970460529366 + - 1.9683837600441705 + - 1.4213446784055754 + - 1.4868953516030072 + - 1.3451376515246432 + - 1.4718128621023052 + - !!python/tuple + - 1.1472859632546073 + - 2.3366395923682717 + - 1.716865071632673 + - 1.109298283349027 + - 2.1002071308001256 + - 1.7342270034375427 + - 1.0272116211800284 + - 2.1797971838367216 + - 1.9734271174044276 + - 1.3283981390223243 + - 1.3583719496494286 + - 1.3325957795455303 + - 1.4343698415232502 + - !!python/tuple + - 1.150367862508289 + - 2.384317853003589 + - 1.7380283420651508 + - 1.1371324289358995 + - 2.1766107727221145 + - 1.770895355404186 + - 1.1261767762115955 + - 2.162367314559055 + - 2.0140407786321903 + - 1.3198437640810037 + - 1.3520866223488122 + - 1.3517963273003866 + - 1.4134550590259267 + - !!python/tuple + - 1.1146647527372062 + - 2.3677312819512717 + - 1.7151581578640105 + - 1.1396444201159173 + - 2.1371206413039334 + - 1.7198084444278297 + - 1.0801486558211106 + - 2.1684395161204026 + - 1.9501520017280756 + - 1.2948961273022497 + - 1.3078322292737665 + - 1.3046944457499567 + - 1.3999308795398826 + - !!python/tuple + - 1.104925825930394 + - 2.3789506098406097 + - 1.677477805766883 + - 1.1441916825997076 + - 2.039847230695345 + - 1.7159629276281778 + - 1.0637128656141053 + - 2.1427231880362476 + - 1.9291898589113146 + - 1.313449456383097 + - 1.3545059894119953 + - 1.3248444648694981 + - 1.4055084361548302 + - !!python/tuple + - 1.2079970929968147 + - 2.3832180397010347 + - 1.6015770661550135 + - 1.1932526818346088 + - 2.074868221730524 + - 1.6959689026268174 + - 1.0734277329789221 + - 2.0870741579060836 + - 1.9045153887773383 + - 1.3796757503213333 + - 1.4145169538723015 + - 1.3011783533365409 + - 1.3620209295780301 + - !!python/tuple + - 1.1704225166762185 + - 2.438480920214996 + - 1.628001368399019 + - 1.184743229840706 + - 2.031783369703421 + - 1.690120549697048 + - 1.0724594103766198 + - 2.0770685617667266 + - 1.954548532128707 + - 1.4139667296853573 + - 1.4435622856769676 + - 1.3518019403509578 + - 1.3881520212386294 + - !!python/tuple + - 1.0862909133459375 + - 2.38218530273953 + - 1.7142247035575795 + - 1.1498953933708125 + - 2.17273940065798 + - 1.6073213615135526 + - 1.0792645292410608 + - 2.158155314944047 + - 2.0000343416793793 + - 1.4097597571383849 + - 1.3503859267731328 + - 1.3092541724148243 + - 1.432934931866671 + - !!python/tuple + - 1.156964847691679 + - 2.5179819188697654 + - 1.6689365772541649 + - 1.1992877606381642 + - 2.108391571787171 + - 1.6746402039816273 + - 1.1964231077439313 + - 2.061206509197469 + - 1.9986615554534832 + - 1.5038337898232221 + - 1.3922500154068125 + - 1.307706649918251 + - 1.3754765941327476 + - !!python/tuple + - 1.130841710878916 + - 2.425575660183057 + - 1.5652609740523993 + - 1.2128991452271023 + - 2.1225635894447885 + - 1.545653999430763 + - 1.0775283827074966 + - 2.010463152163127 + - 1.9554418463950036 + - 1.5476255412280768 + - 1.5300094782826799 + - 1.3292641775638914 + - 1.2955312613272125 + - !!python/tuple + - 1.1503826471593632 + - 2.376786580105088 + - 1.6785498903209377 + - 1.1346559725617098 + - 2.1029827464038475 + - 1.722034861505324 + - 1.082380922836627 + - 2.022437751430693 + - 2.065881086609438 + - 1.5478510758319468 + - 1.322586389381261 + - 1.2798529888649812 + - 1.3013653306077795 + - !!python/tuple + - 1.0637427592172917 + - 2.525148158813362 + - 1.720806791425711 + - 1.1718549980590147 + - 2.1735308365933985 + - 1.6540609727389302 + - 1.1070509818332388 + - 2.0809761395573707 + - 2.0340302498662246 + - 1.4856436974099068 + - 1.366542119684285 + - 1.3236381990928532 + - 1.3697365012450717 + - !!python/tuple + - 1.0637427592172917 + - 2.525148158813362 + - 1.720806791425711 + - 1.1718549980590147 + - 2.1735308365933985 + - 1.6540609727389302 + - 1.1070509818332388 + - 2.0809761395573707 + - 2.0340302498662246 + - 1.4856436974099068 + - 1.366542119684285 + - 1.3236381990928532 + - 1.3697365012450717 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 1650.0 + - 1710.0 + - 2310.0 + - 2490.0 + - 2640.0 + - 2700.0 + - 2850.0 + - 3030.0 + - 3930.0 + - 4260.0 + - 4320.0 + - 4410.0 + - 4800.0 + - 4860.0 + - 5010.0 + - 5160.0 + - 5250.0 + - 5310.0 + - 5430.0 + - 5670.0 + - 5790.0 + - 5880.0 + - 5940.0 + - 6000.0 + - 6480.0 + - 6870.0 + - 7050.0 + - 7110.0 + - 7260.0 + - 7620.0 + - 7800.0 + - 7980.0 + - 8040.0 + - 8130.0 + - 8310.0 + - 8430.0 + - 8580.0 + - 8760.0 + - 8850.0 + - 9180.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 20.744722782499416 + - 19.547597011332368 + - 19.93811454120234 + - 20.00448671355426 + - 19.47428882662933 + - 19.6577797767937 + - 19.498496037780196 + - 19.441984261283125 + - 19.555114942565066 + - 19.233665832975372 + - 19.632452054382462 + - 19.386688227480356 + - 19.30410153210836 + - 19.41223638787113 + - 19.501387265988367 + - 19.50097965325524 + - 19.439498876711603 + - 19.221617871796234 + - 19.075062235530176 + - 19.31132938439528 + - 19.43701720042243 + - 19.352854198696544 + - 19.355140120486343 + - 19.104673086263073 + - 19.21565416017552 + - 19.041383350552326 + - 19.212151115172517 + - 19.03029207685854 + - 18.961946729466753 + - 19.041219806116548 + - 19.08123287004995 + - 18.847028209991674 + - 18.982792302025896 + - 19.069026250002974 + - 18.976192436832815 + - 18.836021613175692 + - 19.2242667169592 + - 19.066035150081476 + - 18.99759041250923 + - 19.06754665338677 + - 19.06754665338677 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2100.0 + - 2700.0 + - 2910.0 + - 3180.0 + - 3510.0 + - 3570.0 + - 3720.0 + - 3810.0 + - 3870.0 + - 3930.0 + - 4080.0 + - 4140.0 + - 4200.0 + - 4260.0 + - 4350.0 + - 4770.0 + - 4890.0 + - 5310.0 + - 5550.0 + - 5700.0 + - 5760.0 + - 5910.0 + - 6270.0 + - 6990.0 + - 7050.0 + - 7200.0 + - 7830.0 + - 8190.0 + - 8280.0 + - 8610.0 + - 8700.0 + - 9030.0 + - 9120.0 + - 9540.0 + - 9630.0 + - 9810.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 19.954190130242964 + - 20.010501683703744 + - 19.93008833029369 + - 19.722284403676706 + - 19.760511259611768 + - 19.614094512473475 + - 19.597908867506906 + - 19.82429132428944 + - 19.556993067829882 + - 19.613457101914403 + - 19.630057898352955 + - 19.52018932482709 + - 19.257670258208712 + - 19.27754632544588 + - 19.312567098717338 + - 19.012270493008756 + - 19.03884068455424 + - 18.87504715574642 + - 18.91274686370106 + - 18.977275607071395 + - 18.94076161422022 + - 18.746945466144528 + - 18.775636012262986 + - 18.67762907671517 + - 18.71148382191265 + - 18.726251771109663 + - 18.711277493958313 + - 18.69611250619351 + - 18.7045687723359 + - 18.67998602293898 + - 18.705575904833836 + - 18.68476688197874 + - 18.6979390611474 + - 18.665063258307885 + - 18.67189685275425 + - 18.67261925746819 + - 18.67261925746819 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2100.0 + - 2160.0 + - 2400.0 + - 2640.0 + - 2730.0 + - 2790.0 + - 3000.0 + - 3060.0 + - 3180.0 + - 3330.0 + - 3750.0 + - 3900.0 + - 3960.0 + - 4050.0 + - 4770.0 + - 4860.0 + - 5430.0 + - 5550.0 + - 5610.0 + - 5760.0 + - 5940.0 + - 6150.0 + - 6210.0 + - 6780.0 + - 6990.0 + - 7050.0 + - 7560.0 + - 7860.0 + - 8280.0 + - 9120.0 + - 9180.0 + - 9270.0 + - 9360.0 + - 9480.0 + - 9930.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 19.6905946953616 + - 19.31421186988177 + - 19.063653242509297 + - 18.57283193373903 + - 18.995324914535814 + - 19.020052449480804 + - 18.64142342134025 + - 18.56389358271671 + - 18.745022436629657 + - 18.641469640185804 + - 18.581452056831083 + - 18.481989692454032 + - 18.651031817592642 + - 18.445499734481132 + - 18.61655840348652 + - 18.328166948282522 + - 18.58382841715896 + - 18.5561771205034 + - 18.503051097608722 + - 18.52289606891748 + - 18.45546717193734 + - 18.511861421273988 + - 18.40722352059405 + - 18.611361888744803 + - 18.559722017227088 + - 18.475674291761674 + - 18.4728200038703 + - 18.408498376345815 + - 18.509695705202894 + - 18.494199937371324 + - 18.508104677892042 + - 18.51721204891319 + - 18.497405579071163 + - 18.48847256219499 + - 18.47748097796715 + - 18.443198966345747 + - 18.443198966345747 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2430.0 + - 2520.0 + - 2640.0 + - 2850.0 + - 3180.0 + - 3540.0 + - 3630.0 + - 3750.0 + - 3840.0 + - 4530.0 + - 5250.0 + - 5400.0 + - 5670.0 + - 5880.0 + - 6390.0 + - 6660.0 + - 6720.0 + - 6780.0 + - 6840.0 + - 6990.0 + - 7050.0 + - 7170.0 + - 7620.0 + - 7830.0 + - 8220.0 + - 8280.0 + - 8340.0 + - 8730.0 + - 8790.0 + - 8850.0 + - 8940.0 + - 9060.0 + - 9270.0 + - 9480.0 + - 9540.0 + - 9810.0 + - 9900.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 20.72233663871072 + - 20.97463099192827 + - 20.536557434403406 + - 20.43723747328299 + - 20.22195296051585 + - 20.25676529994495 + - 20.17981383076642 + - 20.023374768826272 + - 20.003014122637033 + - 20.11947245922721 + - 20.0423715564297 + - 20.084338403974144 + - 20.02383067497871 + - 20.04660478111248 + - 19.981850652449488 + - 19.928797910880405 + - 20.023475770620628 + - 20.07743004156233 + - 19.992768909350424 + - 20.053287924655773 + - 20.002141894655495 + - 19.974734865847044 + - 19.990674246877052 + - 20.006468659392354 + - 19.969544286437838 + - 19.968233959147554 + - 19.9637656991747 + - 19.989942230689085 + - 19.97528999240608 + - 19.934631195957774 + - 19.95206800884969 + - 19.95420825406803 + - 19.941352756037585 + - 19.940954666749736 + - 19.958085838714453 + - 19.942952469003604 + - 19.95534770380799 + - 19.938352213014642 + - 19.938352213014642 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2130.0 + - 2190.0 + - 2490.0 + - 2790.0 + - 2970.0 + - 3090.0 + - 3720.0 + - 3810.0 + - 3870.0 + - 4320.0 + - 4380.0 + - 4770.0 + - 4890.0 + - 5250.0 + - 5340.0 + - 5400.0 + - 5610.0 + - 5910.0 + - 6090.0 + - 6180.0 + - 6510.0 + - 6750.0 + - 6810.0 + - 6930.0 + - 6990.0 + - 7200.0 + - 7290.0 + - 7920.0 + - 8040.0 + - 8490.0 + - 8550.0 + - 8640.0 + - 8700.0 + - 8820.0 + - 8880.0 + - 8940.0 + - 9750.0 + - 9840.0 + - 9930.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 20.35973956979957 + - 19.6129541322394 + - 19.326457311710335 + - 19.512081679794733 + - 19.347701411549235 + - 19.30936509711014 + - 19.53238017074172 + - 19.167917645431586 + - 19.440148485273724 + - 19.25098804546876 + - 19.34875438204402 + - 19.457722939597463 + - 18.765379343820477 + - 19.251636808877414 + - 19.08175058817981 + - 19.084803453822108 + - 19.10834972663925 + - 19.067707993072602 + - 18.726448226180235 + - 18.664892996037967 + - 19.029187449649463 + - 18.741343172429218 + - 18.600211484436095 + - 18.461766256534183 + - 18.637043145617476 + - 18.54508972208903 + - 18.579819089122783 + - 18.56828541751121 + - 18.48773124449944 + - 18.536255463506443 + - 18.429279116107487 + - 18.5247549486378 + - 18.431619529179127 + - 18.44321773839496 + - 18.492193128250356 + - 18.314254552491576 + - 18.38040415674184 + - 18.317754990043525 + - 18.403260834601166 + - 18.349773024745854 + - 18.349773024745854 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1650.0 + - 2160.0 + - 2310.0 + - 2370.0 + - 2430.0 + - 2520.0 + - 2610.0 + - 2760.0 + - 3120.0 + - 3210.0 + - 3870.0 + - 3960.0 + - 4200.0 + - 4500.0 + - 4620.0 + - 4920.0 + - 4980.0 + - 5370.0 + - 5520.0 + - 5910.0 + - 6030.0 + - 6270.0 + - 6630.0 + - 6690.0 + - 7050.0 + - 7650.0 + - 7920.0 + - 8040.0 + - 8190.0 + - 8250.0 + - 8400.0 + - 8970.0 + - 9330.0 + - 9450.0 + - 9570.0 + - 9630.0 + - 9690.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 19.177097587951472 + - 18.809631685553267 + - 19.071441132193616 + - 19.05475170054475 + - 18.906350775276376 + - 18.857369720795592 + - 18.697748502230287 + - 18.866024890970053 + - 18.630676235575965 + - 18.454517881189055 + - 18.56041152214037 + - 18.46633796561533 + - 18.433587766705166 + - 18.430979902372822 + - 18.395923389582375 + - 18.355746496511745 + - 18.413033992113547 + - 18.333348778810407 + - 18.28153223190744 + - 18.231751468641857 + - 18.335190724143008 + - 18.20255975370942 + - 18.19003699290915 + - 18.220872585885182 + - 18.213198645643317 + - 18.195097123743693 + - 18.223893799769094 + - 18.200536229619562 + - 18.204650270771413 + - 18.222786438434383 + - 18.23248282894685 + - 18.193495550029482 + - 18.191271417376914 + - 18.218717405527237 + - 18.211199856427083 + - 18.213536751806434 + - 18.2157304773511 + - 18.203378395764297 + - 18.203378395764297 +- !!python/tuple + - !!python/tuple + - 0.0 + - 870.0 + - 1860.0 + - 2400.0 + - 2460.0 + - 3120.0 + - 3330.0 + - 3480.0 + - 3690.0 + - 3750.0 + - 4050.0 + - 4200.0 + - 4500.0 + - 4800.0 + - 4860.0 + - 5220.0 + - 5370.0 + - 5610.0 + - 5940.0 + - 6060.0 + - 6510.0 + - 7260.0 + - 7350.0 + - 7410.0 + - 7710.0 + - 7770.0 + - 8010.0 + - 8160.0 + - 8580.0 + - 8730.0 + - 8820.0 + - 8910.0 + - 9120.0 + - 9600.0 + - 9660.0 + - 9870.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 21.95845059024165 + - 18.476533911024045 + - 18.450083337268563 + - 18.174806580774224 + - 18.213119072736056 + - 18.14009628696251 + - 18.172640508511556 + - 18.15564768776454 + - 18.097923267666836 + - 18.13009163914247 + - 18.04477486166886 + - 18.004833987279923 + - 17.91448012633016 + - 17.992511458719846 + - 17.953548703539568 + - 17.888949595174893 + - 17.918989586590573 + - 17.89133383740538 + - 17.912436958597837 + - 17.859886160029287 + - 17.896431614970208 + - 17.883265481572696 + - 17.864823484082034 + - 17.86759591321244 + - 17.863545279401468 + - 17.853394714496623 + - 17.840723615250216 + - 17.827983905118245 + - 17.84915702265066 + - 17.830676540242504 + - 17.8184563180353 + - 17.834104826454382 + - 17.819124392409304 + - 18.63472932220844 + - 17.819697750234056 + - 17.819697750234056 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2550.0 + - 2640.0 + - 3000.0 + - 3090.0 + - 3180.0 + - 3240.0 + - 3420.0 + - 3480.0 + - 3630.0 + - 3900.0 + - 4080.0 + - 4140.0 + - 4230.0 + - 4320.0 + - 4530.0 + - 4650.0 + - 4740.0 + - 5160.0 + - 5220.0 + - 5340.0 + - 5430.0 + - 5520.0 + - 5610.0 + - 5700.0 + - 5760.0 + - 5940.0 + - 6090.0 + - 6360.0 + - 6690.0 + - 6990.0 + - 7230.0 + - 7290.0 + - 7380.0 + - 8070.0 + - 8280.0 + - 8580.0 + - 8760.0 + - 8910.0 + - 9060.0 + - 9150.0 + - 9210.0 + - 9330.0 + - 9390.0 + - 9450.0 + - 9510.0 + - 9930.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 19.572075824310236 + - 19.277705922092636 + - 19.37276972429338 + - 19.126276616890618 + - 19.558117264462165 + - 19.114492420837866 + - 19.195798965386516 + - 19.056470304084073 + - 18.96627810599244 + - 19.044816094453516 + - 18.761885132338687 + - 18.83182786940195 + - 18.720594534921485 + - 18.76833687205482 + - 18.54455983122425 + - 18.65311428963737 + - 18.517217927469755 + - 18.598480427855296 + - 18.366257495682405 + - 18.481564010958042 + - 18.42779006952942 + - 18.58528082820029 + - 18.473385908831254 + - 18.60914499013543 + - 18.49932143790611 + - 18.41852160824719 + - 18.564928516295826 + - 18.37971284576154 + - 18.50061347601546 + - 18.518219992074027 + - 18.458578743081894 + - 18.449476242955722 + - 18.44389676753598 + - 18.41405053917271 + - 18.444188365103575 + - 18.447564039832734 + - 18.416251107878267 + - 18.346542898288156 + - 18.435540401044047 + - 18.430919489055526 + - 18.431105816668722 + - 18.349337618053113 + - 18.398426487563 + - 18.39130102926937 + - 18.328025189061176 + - 18.30910697301487 + - 18.380967207262223 + - 18.380967207262223 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2130.0 + - 2310.0 + - 2790.0 + - 3600.0 + - 4200.0 + - 4440.0 + - 4530.0 + - 4830.0 + - 5250.0 + - 5370.0 + - 5490.0 + - 5610.0 + - 5670.0 + - 5880.0 + - 6090.0 + - 6180.0 + - 6240.0 + - 6420.0 + - 6510.0 + - 6630.0 + - 6840.0 + - 6930.0 + - 7500.0 + - 7560.0 + - 7950.0 + - 8250.0 + - 8520.0 + - 8580.0 + - 8760.0 + - 8820.0 + - 8880.0 + - 8940.0 + - 9000.0 + - 9090.0 + - 9150.0 + - 9330.0 + - 9630.0 + - 9780.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 19.818405447476508 + - 19.505804330152465 + - 19.543851356827652 + - 19.496691992210838 + - 19.475530899564276 + - 19.558092827231814 + - 19.50520301362568 + - 19.536679430577827 + - 19.589353470545326 + - 19.490140705106402 + - 19.499280185377863 + - 19.566510886864698 + - 19.584898564860016 + - 19.62365468387991 + - 19.517425552043576 + - 19.4972587430571 + - 19.5989989473159 + - 19.596598594332423 + - 19.5665336471889 + - 19.57217582730768 + - 19.565459370561097 + - 19.680136841413695 + - 19.53124141013745 + - 19.496390351768873 + - 19.591594618325228 + - 19.4942809166556 + - 19.64335426929724 + - 19.54817140944882 + - 19.541414207520877 + - 19.580931045483513 + - 19.55806390296565 + - 19.46824653004791 + - 19.608816940439183 + - 19.56286552312028 + - 19.514208316944064 + - 19.568775233894755 + - 19.51281288439873 + - 19.558416253984277 + - 19.558416253984277 +- !!python/tuple + - !!python/tuple + - 0.0 + - 2070.0 + - 2460.0 + - 2550.0 + - 2790.0 + - 3000.0 + - 3120.0 + - 3300.0 + - 3360.0 + - 3480.0 + - 3570.0 + - 4350.0 + - 4470.0 + - 4530.0 + - 4680.0 + - 4740.0 + - 4860.0 + - 4980.0 + - 5100.0 + - 5160.0 + - 5220.0 + - 6330.0 + - 6510.0 + - 6570.0 + - 6690.0 + - 6750.0 + - 6870.0 + - 6930.0 + - 6990.0 + - 7200.0 + - 7290.0 + - 7560.0 + - 7980.0 + - 8400.0 + - 8490.0 + - 8760.0 + - 8820.0 + - 8880.0 + - 8940.0 + - 9000.0 + - 9630.0 + - 9690.0 + - 9840.0 + - 9990.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 19.030522301933868 + - 19.136114055931642 + - 18.820136965507885 + - 18.5164839382335 + - 18.369782376851152 + - 18.34519359508836 + - 18.344527817824872 + - 18.17281393082314 + - 18.09784846401566 + - 18.114319442591363 + - 18.00279699347424 + - 18.130526709007537 + - 18.105365017842733 + - 18.074815536654036 + - 18.020049265654666 + - 18.073712820850186 + - 18.0240232093974 + - 18.032819787266565 + - 17.97570165927904 + - 17.93343176416817 + - 17.93337126929559 + - 17.929800700153436 + - 17.9323569903779 + - 17.910136830984392 + - 17.912688292990854 + - 17.9099667845752 + - 17.89215789795101 + - 17.87122285529289 + - 17.875214681335116 + - 17.85527775390269 + - 17.86244399448771 + - 17.87134150277254 + - 17.859843239018844 + - 17.838663805679058 + - 17.83544392816581 + - 17.8439673552851 + - 17.848070865486104 + - 17.859715229394904 + - 17.827404560082115 + - 17.823693121467617 + - 17.861269392832817 + - 17.81933128118725 + - 17.82918753701378 + - 17.82918753701378 +problem_name: SAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.165 + - 0.171 + - 0.231 + - 0.249 + - 0.264 + - 0.27 + - 0.285 + - 0.303 + - 0.393 + - 0.426 + - 0.432 + - 0.441 + - 0.48 + - 0.486 + - 0.501 + - 0.516 + - 0.525 + - 0.531 + - 0.543 + - 0.567 + - 0.579 + - 0.588 + - 0.594 + - 0.6 + - 0.648 + - 0.687 + - 0.705 + - 0.711 + - 0.726 + - 0.762 + - 0.78 + - 0.798 + - 0.804 + - 0.813 + - 0.831 + - 0.843 + - 0.858 + - 0.876 + - 0.885 + - 0.918 + - 1.0 + - !!python/tuple + - 1.0 + - 0.057660531231512734 + - 0.024946255469299107 + - 0.03561806495652634 + - 0.037431840586083794 + - 0.022942936997870245 + - 0.02795725854045622 + - 0.023604455946085307 + - 0.02206013881194201 + - 0.025151700612517498 + - 0.01636734806751841 + - 0.027265118988082992 + - 0.020549044704748123 + - 0.018292169118438114 + - 0.021247208243092324 + - 0.023683465553239094 + - 0.02367232657713743 + - 0.021992219836170036 + - 0.016038109207342045 + - 0.01203313194029976 + - 0.018489687172579032 + - 0.02192440219793027 + - 0.019624450335101202 + - 0.019686918521488524 + - 0.01284231804234599 + - 0.015875136768501222 + - 0.011112777239844905 + - 0.01577940782924031 + - 0.010809682114076303 + - 0.008941984838242436 + - 0.011108308003695867 + - 0.012201759033767879 + - 0.005801566156395798 + - 0.0095116391097867 + - 0.011868184447070948 + - 0.009331282279184507 + - 0.00550078502536184 + - 0.016110495128019535 + - 0.011786445610583585 + - 0.009916032264433708 + - 0.011827750991468263 + - 0.011827750991468263 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.291 + - 0.318 + - 0.351 + - 0.357 + - 0.372 + - 0.381 + - 0.387 + - 0.393 + - 0.408 + - 0.414 + - 0.42 + - 0.426 + - 0.435 + - 0.477 + - 0.489 + - 0.531 + - 0.555 + - 0.57 + - 0.576 + - 0.591 + - 0.627 + - 0.699 + - 0.705 + - 0.72 + - 0.783 + - 0.819 + - 0.828 + - 0.861 + - 0.87 + - 0.903 + - 0.912 + - 0.954 + - 0.963 + - 0.981 + - 1.0 + - !!python/tuple + - 1.0 + - 0.03605736821570047 + - 0.037596213784715914 + - 0.035398729876357386 + - 0.02971999910006525 + - 0.030764637797771062 + - 0.026763456002629485 + - 0.026321145206572166 + - 0.03250757799190213 + - 0.02520302480025869 + - 0.02674603726075167 + - 0.0271996930466711 + - 0.02419727600871673 + - 0.017023325413851337 + - 0.017566485673471414 + - 0.018523510625905248 + - 0.010317199972321951 + - 0.011043292914441508 + - 0.006567249712847553 + - 0.007597482852829746 + - 0.00936088245214527 + - 0.008363051764607521 + - 0.00306656991781123 + - 0.0038506065329220536 + - 0.001172336635687239 + - 0.002097497130035419 + - 0.002501066056634013 + - 0.0020918587336711996 + - 0.0016774397948953028 + - 0.0019085271452503854 + - 0.0012367457316899404 + - 0.0019360494082072978 + - 0.0013673939432429037 + - 0.001727354702664894 + - 0.0008289461094327732 + - 0.0010156901413047267 + - 0.0010354315482587555 + - 0.0010354315482587555 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.216 + - 0.24 + - 0.264 + - 0.273 + - 0.279 + - 0.3 + - 0.306 + - 0.318 + - 0.333 + - 0.375 + - 0.39 + - 0.396 + - 0.405 + - 0.477 + - 0.486 + - 0.543 + - 0.555 + - 0.561 + - 0.576 + - 0.594 + - 0.615 + - 0.621 + - 0.678 + - 0.699 + - 0.705 + - 0.756 + - 0.786 + - 0.828 + - 0.912 + - 0.918 + - 0.927 + - 0.936 + - 0.948 + - 0.993 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.028854003327846732 + - 0.018568457864311556 + - 0.011721354387060427 + - -0.00169149164116233 + - 0.009854122206839025 + - 0.01052986022584563 + - 0.00018293199449221766 + - -0.0019357530940910979 + - 0.0030140186158816007 + - 0.0001841950330929168 + - -0.00145592651448173 + - -0.004173969425729483 + - 0.00044550400839762526 + - -0.0051711433037200175 + - -0.0004965630681746901 + - -0.008377537498966645 + - -0.001390986882448974 + - -0.0021466235630384152 + - -0.003598417021157546 + - -0.0030561065308779907 + - -0.004898759644927748 + - -0.003357654216712298 + - -0.006217130823489721 + - -0.0006385700488590721 + - -0.0020497509271296004 + - -0.004346552595163109 + - -0.004424552721325397 + - -0.006182292393289051 + - -0.0034168374992702773 + - -0.00384029578093022 + - -0.003460316060542644 + - -0.003211435738833271 + - -0.00375269408602964 + - -0.003996809770875997 + - -0.0042971806476490805 + - -0.005234017201399548 + - -0.005234017201399548 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.243 + - 0.252 + - 0.264 + - 0.285 + - 0.318 + - 0.354 + - 0.363 + - 0.375 + - 0.384 + - 0.453 + - 0.525 + - 0.54 + - 0.567 + - 0.588 + - 0.639 + - 0.666 + - 0.672 + - 0.678 + - 0.684 + - 0.699 + - 0.705 + - 0.717 + - 0.762 + - 0.783 + - 0.822 + - 0.828 + - 0.834 + - 0.873 + - 0.879 + - 0.885 + - 0.894 + - 0.906 + - 0.927 + - 0.948 + - 0.954 + - 0.981 + - 0.99 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.05704877722972388 + - 0.06394331349583568 + - 0.051971923763718286 + - 0.04925777235620323 + - 0.0433746169788596 + - 0.04432594598658873 + - 0.04222306620265451 + - 0.03794800109625152 + - 0.0373915985776738 + - 0.040574096381814834 + - 0.0384671329729706 + - 0.03961397573294334 + - 0.03796045980355847 + - 0.03858281578840354 + - 0.03681325700615639 + - 0.03536346613252041 + - 0.03795076120770565 + - 0.03942518849065964 + - 0.03711162404135246 + - 0.03876544839568637 + - 0.037367762897745405 + - 0.03661880141027486 + - 0.03705438246537683 + - 0.037486001915039174 + - 0.0364769566265034 + - 0.03644114885313026 + - 0.03631904314590229 + - 0.03703437840230146 + - 0.03663397154842794 + - 0.03552287435947271 + - 0.03599937626019125 + - 0.036057863491823765 + - 0.03570655678892108 + - 0.035695678063348266 + - 0.0361638276072657 + - 0.035750272706138134 + - 0.036089001634455165 + - 0.03562455989748901 + - 0.03562455989748901 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.213 + - 0.219 + - 0.249 + - 0.279 + - 0.297 + - 0.309 + - 0.372 + - 0.381 + - 0.387 + - 0.432 + - 0.438 + - 0.477 + - 0.489 + - 0.525 + - 0.534 + - 0.54 + - 0.561 + - 0.591 + - 0.609 + - 0.618 + - 0.651 + - 0.675 + - 0.681 + - 0.693 + - 0.699 + - 0.72 + - 0.729 + - 0.792 + - 0.804 + - 0.849 + - 0.855 + - 0.864 + - 0.87 + - 0.882 + - 0.888 + - 0.894 + - 0.975 + - 0.984 + - 0.993 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.04713995997039309 + - 0.026732292432059126 + - 0.018903093347448205 + - 0.023975715549691527 + - 0.01948363831372374 + - 0.018436008405092758 + - 0.024530419530167366 + - 0.014570624289634748 + - 0.022009971917154807 + - 0.01684071824295776 + - 0.019512413207695267 + - 0.02249023519354952 + - 0.003570318957538301 + - 0.0168584472281374 + - 0.012215906898658318 + - 0.012299333628658298 + - 0.012942790883246826 + - 0.011832159977642325 + - 0.002506434653241301 + - 0.0008242932926743613 + - 0.010779495578958133 + - 0.0029134740728150262 + - -0.0009432810576778349 + - -0.004726622351158055 + - 6.323066372088721e-05 + - -0.0024496127876873527 + - -0.0015005511957030167 + - -0.0018157358845131107 + - -0.004017068019510953 + - -0.002691029670011886 + - -0.005614409830337116 + - -0.003005308272880376 + - -0.005550452541581685 + - -0.005233504211027641 + - -0.003895136557535879 + - -0.008757726417608313 + - -0.006950032984616097 + - -0.008662068733076773 + - -0.006325420533270113 + - -0.0077871006705356235 + - -0.0077871006705356235 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.165 + - 0.216 + - 0.231 + - 0.237 + - 0.243 + - 0.252 + - 0.261 + - 0.276 + - 0.312 + - 0.321 + - 0.387 + - 0.396 + - 0.42 + - 0.45 + - 0.462 + - 0.492 + - 0.498 + - 0.537 + - 0.552 + - 0.591 + - 0.603 + - 0.627 + - 0.663 + - 0.669 + - 0.705 + - 0.765 + - 0.792 + - 0.804 + - 0.819 + - 0.825 + - 0.84 + - 0.897 + - 0.933 + - 0.945 + - 0.957 + - 0.963 + - 0.969 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.014821487798139826 + - 0.00477961821868351 + - 0.011934176779556542 + - 0.011478098828161849 + - 0.0074226947014389335 + - 0.006084172248742713 + - 0.0017221472323108167 + - 0.00632069511933479 + - -0.00011076011976055498 + - -0.004924701246107731 + - -0.0020309085845656052 + - -0.00460168965386971 + - -0.005496665824477081 + - -0.00556793184762481 + - -0.006525933466427346 + - -0.007623861512784758 + - -0.006058346030633776 + - -0.008235931798943141 + - -0.009651940747423766 + - -0.011012317122527756 + - -0.00818559631289737 + - -0.011810049353570367 + - -0.012152263229498273 + - -0.011309608166675688 + - -0.011519316622797546 + - -0.012013983259672916 + - -0.01122704639537695 + - -0.011865346905992561 + - -0.011752921060705187 + - -0.01125730764690512 + - -0.010992330982996441 + - -0.012057750026208349 + - -0.01211852967917407 + - -0.011368503536105757 + - -0.011573938236654103 + - -0.011510077077109443 + - -0.011450128369844608 + - -0.011787678035051596 + - -0.011787678035051596 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.087 + - 0.186 + - 0.24 + - 0.246 + - 0.312 + - 0.333 + - 0.348 + - 0.369 + - 0.375 + - 0.405 + - 0.42 + - 0.45 + - 0.48 + - 0.486 + - 0.522 + - 0.537 + - 0.561 + - 0.594 + - 0.606 + - 0.651 + - 0.726 + - 0.735 + - 0.741 + - 0.771 + - 0.777 + - 0.801 + - 0.816 + - 0.858 + - 0.873 + - 0.882 + - 0.891 + - 0.912 + - 0.96 + - 0.966 + - 0.987 + - 1.0 + - !!python/tuple + - 1.0 + - 0.09082849666929448 + - -0.00432306147812508 + - -0.0050458855829491394 + - -0.012568470042979868 + - -0.011521491139539248 + - -0.013517010414336882 + - -0.012627663059309902 + - -0.01309203183098361 + - -0.014669487302056751 + - -0.013790410933790688 + - -0.016121892431089163 + - -0.017213370712163823 + - -0.019682502356042488 + - -0.017550112771445622 + - -0.018614861645894 + - -0.020380184134085762 + - -0.019559270754108102 + - -0.020315029110536283 + - -0.01973833671717111 + - -0.021174410818407874 + - -0.02017572035531032 + - -0.020535515899823904 + - -0.021039486832575106 + - -0.02096372368948039 + - -0.02107441678012761 + - -0.021351804826928736 + - -0.02169807239959426 + - -0.022046214925990345 + - -0.021467609718096456 + - -0.02197263234168415 + - -0.022306578639383755 + - -0.02187894636212508 + - -0.022288321936681954 + - 0.0 + - -0.02227265358633721 + - -0.02227265358633721 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.255 + - 0.264 + - 0.3 + - 0.309 + - 0.318 + - 0.324 + - 0.342 + - 0.348 + - 0.363 + - 0.39 + - 0.408 + - 0.414 + - 0.423 + - 0.432 + - 0.453 + - 0.465 + - 0.474 + - 0.516 + - 0.522 + - 0.534 + - 0.543 + - 0.552 + - 0.561 + - 0.57 + - 0.576 + - 0.594 + - 0.609 + - 0.636 + - 0.669 + - 0.699 + - 0.723 + - 0.729 + - 0.738 + - 0.807 + - 0.828 + - 0.858 + - 0.876 + - 0.891 + - 0.906 + - 0.915 + - 0.921 + - 0.933 + - 0.939 + - 0.945 + - 0.951 + - 0.993 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.025615196575887223 + - 0.017570847027005423 + - 0.020168688887153403 + - 0.01343268529982966 + - 0.02523374611586749 + - 0.013110654441760444 + - 0.015332546897591687 + - 0.011525063709768685 + - 0.009060349883506798 + - 0.011206585036243019 + - 0.003474831415009383 + - 0.0053861811185755264 + - 0.0023464687794142627 + - 0.003651140368757717 + - -0.00246409330117373 + - 0.0005024124522546734 + - -0.003211275093456522 + - -0.0009905862479161333 + - -0.007336623752402973 + - -0.004185602173250339 + - -0.005655101528361656 + - -0.0013512963365843805 + - -0.004409088038003268 + - -0.0006991520145895204 + - -0.0037003387397848814 + - -0.005908384020127448 + - -0.0019074711012393377 + - -0.00696892468220687 + - -0.0036650307612729055 + - -0.003183891322606993 + - -0.004813728649080533 + - -0.005062475862134742 + - -0.005214948143565992 + - -0.006030566492660683 + - -0.005206979554577527 + - -0.005114731307456749 + - -0.005970430779938431 + - -0.00787537146900063 + - -0.00544330550113975 + - -0.005569582783532585 + - -0.00556449094350455 + - -0.00779899918191857 + - -0.006457530430112968 + - -0.006652250327691221 + - -0.00838141140292115 + - -0.008898396127144928 + - -0.006934646305592437 + - -0.006934646305592437 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.213 + - 0.231 + - 0.279 + - 0.36 + - 0.42 + - 0.444 + - 0.453 + - 0.483 + - 0.525 + - 0.537 + - 0.549 + - 0.561 + - 0.567 + - 0.588 + - 0.609 + - 0.618 + - 0.624 + - 0.642 + - 0.651 + - 0.663 + - 0.684 + - 0.693 + - 0.75 + - 0.756 + - 0.795 + - 0.825 + - 0.852 + - 0.858 + - 0.876 + - 0.882 + - 0.888 + - 0.894 + - 0.9 + - 0.909 + - 0.915 + - 0.933 + - 0.963 + - 0.978 + - 1.0 + - !!python/tuple + - 1.0 + - 0.03234673257214896 + - 0.023804172214647635 + - 0.024843896655105516 + - 0.023555156160160524 + - 0.022976879560539336 + - 0.025233078311103923 + - 0.023787739827047807 + - 0.024647906911392705 + - 0.02608734887355741 + - 0.02337612684002232 + - 0.02362588462247521 + - 0.02546312157877534 + - 0.025965608103628256 + - 0.027024710159257677 + - 0.024121749420649197 + - 0.02357064395928707 + - 0.026350934199786676 + - 0.026285338912040507 + - 0.025463743558136534 + - 0.025617929392867927 + - 0.025434386423996293 + - 0.028568217885604357 + - 0.024499300219788703 + - 0.023546913126022306 + - 0.026148593504874723 + - 0.023489267852935574 + - 0.027563047638297665 + - 0.024961952248059947 + - 0.024777295821328617 + - 0.025857186310278776 + - 0.025232287887539152 + - 0.022777817040249632 + - 0.02661923394088534 + - 0.02536350344535882 + - 0.024033830908850123 + - 0.02552500018413725 + - 0.023995697434327144 + - 0.025241916707389237 + - 0.025241916707389237 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.207 + - 0.246 + - 0.255 + - 0.279 + - 0.3 + - 0.312 + - 0.33 + - 0.336 + - 0.348 + - 0.357 + - 0.435 + - 0.447 + - 0.453 + - 0.468 + - 0.474 + - 0.486 + - 0.498 + - 0.51 + - 0.516 + - 0.522 + - 0.633 + - 0.651 + - 0.657 + - 0.669 + - 0.675 + - 0.687 + - 0.693 + - 0.699 + - 0.72 + - 0.729 + - 0.756 + - 0.798 + - 0.84 + - 0.849 + - 0.876 + - 0.882 + - 0.888 + - 0.894 + - 0.9 + - 0.963 + - 0.969 + - 0.984 + - 0.999 + - 1.0 + - !!python/tuple + - 1.0 + - 0.010815973555446157 + - 0.013701516446341792 + - 0.005066699688042897 + - -0.0032313330747143834 + - -0.0072402980885831894 + - -0.007912244350721244 + - -0.007930438279478414 + - -0.012622923886984739 + - -0.014671531487664959 + - -0.01422142328000872 + - -0.017269036356233974 + - -0.013778521627015738 + - -0.014466123985293095 + - -0.015300960370968163 + - -0.01679757746425392 + - -0.015331094672445372 + - -0.01668898010999554 + - -0.016448592941740742 + - -0.018009480055701785 + - -0.01916460430279636 + - -0.019166257467393914 + - -0.01926383166248509 + - -0.0191939750230696 + - -0.019801193111082978 + - -0.019731468414074044 + - -0.019805840028939613 + - -0.020292509719020572 + - -0.02086460897133538 + - -0.02075552294120764 + - -0.02130034634872628 + - -0.021104511979169512 + - -0.02086136665005107 + - -0.021175583735912 + - -0.02175436153808871 + - -0.021842352260054623 + - -0.021609429578131455 + - -0.02149729151583088 + - -0.021179081899796386 + - -0.02206204689096002 + - -0.022163470675522663 + - -0.021136610730507415 + - -0.022282668214494327 + - -0.022013322855085924 + - -0.022013322855085924 +solver_name: NELDMD diff --git a/test/expected_results/SAN1_RNDSRCH.yaml b/test/expected_results/SAN1_RNDSRCH.yaml new file mode 100644 index 000000000..96e824009 --- /dev/null +++ b/test/expected_results/SAN1_RNDSRCH.yaml @@ -0,0 +1,1929 @@ +all_est_objectives: +- - 55.228104638490976 + - 34.16907654394531 + - 32.49814674727327 + - 26.18691592398001 + - 26.242091822837384 + - 22.34589146956033 + - 22.921536173995154 + - 22.921536173995154 +- - 54.98944203450111 + - 30.207293927655346 + - 30.87266366632 + - 29.461320799673267 + - 29.23362968301862 + - 23.24139101387246 + - 23.203373582044797 + - 20.12882499342447 + - 20.12882499342447 +- - 54.30952001078969 + - 38.7426958119958 + - 40.78395669735498 + - 26.214948531520086 + - 20.987249395699855 + - 20.987249395699855 +- - 54.76055167633331 + - 40.67170010978 + - 35.365836346824196 + - 36.70601338779254 + - 23.19887889257823 + - 22.240731074538086 + - 22.240731074538086 +- - 52.39186295815599 + - 32.2897065683888 + - 30.490443287534802 + - 31.76913788046797 + - 26.893386422180843 + - 27.276564914133054 + - 25.008259340809563 + - 22.8049995425414 + - 21.78643710212243 + - 21.78643710212243 +- - 54.25979384648611 + - 35.55377282243274 + - 36.94819975487169 + - 36.09588531260568 + - 26.255845378470458 + - 25.143196532202595 + - 25.822882282719156 + - 23.540482530320126 + - 24.643657489293094 + - 25.082237799779314 + - 22.09945094965493 + - 22.804990390508216 + - 21.406929129892525 + - 21.406929129892525 +- - 51.823992493809435 + - 34.99668432011887 + - 32.77703849675279 + - 31.960330359263864 + - 27.160993722224706 + - 24.769125081044436 + - 24.1909670507419 + - 22.113256791639675 + - 20.516039430734164 + - 20.516039430734164 +- - 53.19657777800099 + - 56.843736599256744 + - 34.99788972713602 + - 28.572253273194043 + - 28.234083713690897 + - 26.91176481048815 + - 30.69666152260831 + - 24.793905875709374 + - 23.140635787267 + - 22.494021012517784 + - 22.766015616083042 + - 22.766015616083042 +- - 58.70283939001095 + - 48.872226153540005 + - 34.249755100197234 + - 27.40299933447763 + - 26.8455257416619 + - 28.4597033452617 + - 26.805308496563967 + - 24.813618944153653 + - 20.88555564875412 + - 20.88555564875412 +- - 52.87627843731777 + - 31.934628573309343 + - 24.836088925815506 + - 22.593260256395133 + - 22.486501737428906 + - 21.628126798361173 + - 21.628126798361173 +all_intermediate_budgets: +- - 0 + - 20 + - 40 + - 150 + - 280 + - 500 + - 2070 + - 10000 +- - 0 + - 20 + - 140 + - 150 + - 220 + - 270 + - 560 + - 660 + - 10000 +- - 0 + - 20 + - 40 + - 50 + - 300 + - 10000 +- - 0 + - 20 + - 30 + - 40 + - 60 + - 1460 + - 10000 +- - 0 + - 20 + - 40 + - 80 + - 100 + - 450 + - 620 + - 730 + - 5290 + - 10000 +- - 0 + - 20 + - 50 + - 60 + - 80 + - 100 + - 440 + - 900 + - 3740 + - 4740 + - 5310 + - 5660 + - 7430 + - 10000 +- - 0 + - 30 + - 50 + - 170 + - 230 + - 490 + - 640 + - 4530 + - 6880 + - 10000 +- - 0 + - 20 + - 30 + - 40 + - 50 + - 100 + - 240 + - 250 + - 700 + - 2620 + - 9670 + - 10000 +- - 0 + - 20 + - 30 + - 50 + - 640 + - 980 + - 1010 + - 4050 + - 7180 + - 10000 +- - 0 + - 20 + - 30 + - 620 + - 3630 + - 3930 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 0.1960868262262367 + - 1.779613569199654 + - 1.282065190484172 + - 0.9056949268349317 + - 0.5562335504646729 + - 1.143675436199959 + - 0.2952986215973615 + - 0.22487410478955872 + - 0.19487491409298027 + - 0.9412745736035046 + - 0.44969712281784596 + - 1.40601584063612 + - 0.5578987395601539 + - !!python/tuple + - 3.3226997394609703 + - 1.9364777802467785 + - 0.4649732684997351 + - 0.7357740288917657 + - 0.5999184021770918 + - 0.6531938866020958 + - 0.4533030247465299 + - 1.2779851104193691 + - 5.412685346242692 + - 1.5955420362650237 + - 3.173189622641204 + - 9.790103973990748 + - 1.1585631268428283 + - !!python/tuple + - 1.891832551567721 + - 0.2597923869447272 + - 0.8319503523528583 + - 2.941523694196808 + - 2.3765492760398743 + - 1.3047095191807443 + - 0.5100204429133709 + - 0.40543767572837586 + - 0.6533535810007305 + - 1.589660081945687 + - 1.6209828815823202 + - 0.9971355126498859 + - 2.392981828984503 + - !!python/tuple + - 0.8891474417413014 + - 0.9853352375975648 + - 1.1588468993180858 + - 0.3898780587485494 + - 2.263150594087709 + - 3.836342465433209 + - 1.3833544581818535 + - 2.4253163431609304 + - 5.195163150026672 + - 3.616905007896433 + - 0.5476505650315782 + - 6.332698095344878 + - 1.1494393764787216 + - !!python/tuple + - 1.088547037194216 + - 0.7628873832417161 + - 0.5615212071905158 + - 1.5805579060742112 + - 0.8568821670538687 + - 1.3350313139313676 + - 0.996618633462476 + - 2.3942902592925117 + - 2.600745939674507 + - 2.5092289477097554 + - 0.76443262109799 + - 1.947353619917127 + - 0.6068126368925622 + - !!python/tuple + - 0.9705074213645866 + - 1.606254802097452 + - 1.1036705986023219 + - 1.113798167160827 + - 1.3245630397696917 + - 2.7563382447707174 + - 0.5457806548187588 + - 1.0357479550973214 + - 3.246578429066263 + - 1.9544359703272822 + - 0.382861746866544 + - 0.5013734093103733 + - 1.4329924509318637 + - !!python/tuple + - 0.9705074213645866 + - 1.606254802097452 + - 1.1036705986023219 + - 1.113798167160827 + - 1.3245630397696917 + - 2.7563382447707174 + - 0.5457806548187588 + - 1.0357479550973214 + - 3.246578429066263 + - 1.9544359703272822 + - 0.382861746866544 + - 0.5013734093103733 + - 1.4329924509318637 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 0.7751772441855151 + - 0.5217046225116457 + - 0.4107329784631801 + - 0.9965720707775172 + - 0.5333369471741017 + - 6.4520030256054985 + - 2.585515569292516 + - 0.2725361650491318 + - 2.200219673772379 + - 1.1305832483582257 + - 0.3333347373565819 + - 0.4734096855810748 + - 0.9520202041701443 + - !!python/tuple + - 0.4332455021748568 + - 4.108542816085183 + - 0.7811953114147323 + - 3.0358031524986364 + - 1.2274106484326013 + - 0.7806172525391532 + - 1.3164075228291978 + - 0.14013875854118027 + - 2.346357236286881 + - 2.0604876534934946 + - 0.2623102864567 + - 2.561588241476667 + - 1.8791167051477928 + - !!python/tuple + - 0.2608108160369606 + - 0.5995655306906056 + - 0.20026705068361716 + - 1.1998980471532668 + - 0.8290306429717449 + - 1.9251606226697628 + - 0.6227797942067801 + - 1.4063817500187927 + - 0.5342769627380624 + - 0.35429577092935943 + - 1.494060540714705 + - 0.5109500094374291 + - 1.2205583963562716 + - !!python/tuple + - 1.6347551356078878 + - 10.473183975219085 + - 4.113486148548108 + - 0.48354843817180765 + - 1.8543999988578015 + - 1.0581598562411845 + - 1.0059689440881627 + - 0.41595604608902825 + - 3.606918101465911 + - 0.3623860409219647 + - 1.6231947554488795 + - 1.1809037790646033 + - 0.7348098800729296 + - !!python/tuple + - 2.6467261336898322 + - 1.6934697755237704 + - 5.029686183658327 + - 1.2175042220916146 + - 1.5987368537505082 + - 0.798540276715608 + - 1.8256154055393075 + - 1.2654698769663544 + - 0.9242448981385025 + - 2.8061006255959757 + - 1.240810177517944 + - 0.4413268565714861 + - 1.3467616934914721 + - !!python/tuple + - 0.7247416623322506 + - 0.7527355029361964 + - 3.324657520224108 + - 1.3307423736429849 + - 1.0114636541022988 + - 1.0804851238887183 + - 2.1158906379371905 + - 1.0969684738022811 + - 3.0414931576677553 + - 2.7208156633221727 + - 1.8439755453153246 + - 3.899177968052339 + - 4.472867813588696 + - !!python/tuple + - 1.7489054906238035 + - 2.7680503607059572 + - 0.9130362187124103 + - 0.5124144711747488 + - 1.0308750094359473 + - 2.248438243392407 + - 1.548310206102962 + - 1.2111762107528863 + - 2.077914657680098 + - 1.12552399234821 + - 0.9142525502642843 + - 2.391160504732829 + - 1.013134783180605 + - !!python/tuple + - 1.7489054906238035 + - 2.7680503607059572 + - 0.9130362187124103 + - 0.5124144711747488 + - 1.0308750094359473 + - 2.248438243392407 + - 1.548310206102962 + - 1.2111762107528863 + - 2.077914657680098 + - 1.12552399234821 + - 0.9142525502642843 + - 2.391160504732829 + - 1.013134783180605 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 0.2936003595553713 + - 0.21302311824978262 + - 0.20043495403197675 + - 0.11180421103285271 + - 3.2804801697178894 + - 2.5158079488849325 + - 0.7954848263033159 + - 0.5631992923544212 + - 5.095633150539401 + - 2.232083516069701 + - 0.43153950847676165 + - 0.993149376419048 + - 1.0132092179402108 + - !!python/tuple + - 1.4495535717259753 + - 3.221139876599047 + - 15.439307300953633 + - 0.40188863162155913 + - 0.9987821371130792 + - 0.2150172532980083 + - 4.7356245268973645 + - 3.9353164689929643 + - 0.3173655524829904 + - 0.9939416857491911 + - 0.6000720150990748 + - 2.6499232687273193 + - 0.5108740548751163 + - !!python/tuple + - 4.2795803774879975 + - 1.3279345298010548 + - 2.313427965675172 + - 1.0566676115615157 + - 0.8704266324829311 + - 3.5382080070951143 + - 2.505105245893458 + - 0.7296117911890162 + - 0.4031329834179283 + - 0.5015844806409561 + - 2.505487875530965 + - 3.1066736060072295 + - 2.3920037688119495 + - !!python/tuple + - 1.1644093438743712 + - 3.7571236167671453 + - 2.52911189645091 + - 1.0251641359822403 + - 1.7932016827814958 + - 0.7245371834794012 + - 0.6914259983893175 + - 1.5176820768448775 + - 1.2563039716794584 + - 0.7966601547750229 + - 0.5049051177816402 + - 1.040946544269545 + - 1.086338372038444 + - !!python/tuple + - 1.1644093438743712 + - 3.7571236167671453 + - 2.52911189645091 + - 1.0251641359822403 + - 1.7932016827814958 + - 0.7245371834794012 + - 0.6914259983893175 + - 1.5176820768448775 + - 1.2563039716794584 + - 0.7966601547750229 + - 0.5049051177816402 + - 1.040946544269545 + - 1.086338372038444 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 0.17508472216749252 + - 8.547621076504065 + - 1.0125980758658424 + - 1.85994704497255 + - 0.297577808502272 + - 0.7908803393131751 + - 1.941915053575107 + - 0.6543353587900118 + - 0.3704952942449984 + - 0.5117489454283719 + - 7.184644691730161 + - 0.3105447016234097 + - 1.2489076651916537 + - !!python/tuple + - 0.918170777367521 + - 1.3097948533313313 + - 1.340992094243764 + - 0.11915370968433643 + - 0.5945747823377834 + - 0.13690593517012903 + - 0.7710338802756362 + - 1.2896768036850625 + - 1.756984634103518 + - 1.0628823584884428 + - 1.2724587214707253 + - 0.5339166373874368 + - 4.511365745871041 + - !!python/tuple + - 2.541899018622927 + - 0.3333870838465203 + - 2.563296069568701 + - 13.176705675677333 + - 1.3407734262783733 + - 5.538925285840035 + - 1.1609697249601687 + - 0.5416162280425767 + - 5.468309722933677 + - 1.5714442044992383 + - 0.6131265129179446 + - 1.6188850111118276 + - 2.4981033842291547 + - !!python/tuple + - 1.9993795064420334 + - 1.3360129157038265 + - 0.6505396792586321 + - 1.9768917174067062 + - 0.6585265915141895 + - 0.9484552893970917 + - 0.5785474194125769 + - 1.0427685020712512 + - 0.7839766846245362 + - 0.7211148959869729 + - 1.4620099942742233 + - 0.6455524522870727 + - 2.2437076333578685 + - !!python/tuple + - 0.6018065938183127 + - 1.1389992546772403 + - 0.6522762615437921 + - 0.7353695883158387 + - 1.2277656049948618 + - 3.339847898864351 + - 2.1730562879240485 + - 1.7072014646949396 + - 3.8025776835743312 + - 0.880036953226712 + - 1.5284212246760485 + - 1.284861281315746 + - 0.8376152346865527 + - !!python/tuple + - 0.6018065938183127 + - 1.1389992546772403 + - 0.6522762615437921 + - 0.7353695883158387 + - 1.2277656049948618 + - 3.339847898864351 + - 2.1730562879240485 + - 1.7072014646949396 + - 3.8025776835743312 + - 0.880036953226712 + - 1.5284212246760485 + - 1.284861281315746 + - 0.8376152346865527 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 3.452822614796283 + - 0.3821621034194237 + - 1.0468045557450762 + - 5.2195317074515755 + - 0.25180847320436694 + - 0.47041076931222675 + - 1.319478262152733 + - 0.9461870795003202 + - 0.41749210598824527 + - 1.078966868693468 + - 0.43113934303827933 + - 0.40728442606166204 + - 1.0458804284695542 + - !!python/tuple + - 2.0791883189048868 + - 0.4926110138993004 + - 2.3328540115212637 + - 0.789079808952555 + - 0.8117928935922794 + - 1.705034880658747 + - 2.039133819694643 + - 2.5831366997274867 + - 3.2931925184389526 + - 0.9511095024712266 + - 0.10030278246411245 + - 0.9665025125765994 + - 2.422466080556441 + - !!python/tuple + - 0.8139568466303583 + - 1.5582433606067658 + - 3.0561239480996005 + - 2.566449834571651 + - 0.6618946362895177 + - 7.984886298104491 + - 8.541954476673583 + - 0.9666066350300742 + - 2.188757831291287 + - 1.963573642751678 + - 3.5779192974766625 + - 1.6383084046250977 + - 0.8169224005183288 + - !!python/tuple + - 3.6814510898559347 + - 1.0059501670228672 + - 0.7306016896620006 + - 2.265866487382744 + - 0.9286705000093991 + - 3.930853492146318 + - 2.4328384560567065 + - 0.8207472857930803 + - 2.128155388902591 + - 5.505473436328707 + - 2.6625839363648023 + - 0.6176372822284746 + - 1.701586125136389 + - !!python/tuple + - 0.8441595656757271 + - 3.437873481281108 + - 0.24077510024046767 + - 0.716701369052779 + - 3.2438421920228184 + - 1.2686227000062547 + - 0.8899520258025329 + - 2.1216819609769066 + - 3.226405466573146 + - 0.2619591069883923 + - 2.311320490281899 + - 0.7340305268345818 + - 1.5066465986068385 + - !!python/tuple + - 1.2595689669472212 + - 0.7280963272797721 + - 1.5278377686849054 + - 0.23526863221568536 + - 0.6592923661982336 + - 2.848813895357088 + - 1.0784109848156005 + - 2.7255621479264898 + - 2.6395005928325457 + - 5.252427622612166 + - 2.0717143704979537 + - 1.9182050085695668 + - 1.3559224547291253 + - !!python/tuple + - 0.8817376818649777 + - 1.6667455178924013 + - 4.082759932592677 + - 1.4110959231587734 + - 2.3854580411072717 + - 2.8966110321468412 + - 2.372276127732376 + - 0.9445220427281892 + - 0.9270727429913929 + - 0.5406129713023505 + - 0.7184757583331692 + - 0.49647951557269454 + - 0.9084819340551599 + - !!python/tuple + - 2.9524336025256623 + - 0.5910179629495939 + - 0.9274083675955731 + - 0.8931140692701992 + - 2.152594319856367 + - 0.9996765234916601 + - 0.8194889298207728 + - 1.8629701752607744 + - 2.0536294900998833 + - 0.6490871185594933 + - 1.3395436030126475 + - 1.4325322764529191 + - 0.6472965717891054 + - !!python/tuple + - 2.9524336025256623 + - 0.5910179629495939 + - 0.9274083675955731 + - 0.8931140692701992 + - 2.152594319856367 + - 0.9996765234916601 + - 0.8194889298207728 + - 1.8629701752607744 + - 2.0536294900998833 + - 0.6490871185594933 + - 1.3395436030126475 + - 1.4325322764529191 + - 0.6472965717891054 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 0.2700783082037484 + - 0.6384147853652827 + - 2.3266083676327756 + - 0.2779469309837801 + - 7.821427263780955 + - 0.47102529285029304 + - 3.9992226917786446 + - 3.0148128881698084 + - 2.135563257591183 + - 0.8619363806552448 + - 0.11741132927665278 + - 1.4482100832632707 + - 2.472433023868224 + - !!python/tuple + - 0.28939396854093524 + - 1.1804026690778417 + - 0.47399562590043687 + - 0.6271857474156067 + - 2.0349995616893732 + - 4.53179876756295 + - 0.24260563614448863 + - 2.283620344053545 + - 1.9353726364314454 + - 0.3144446468694503 + - 0.41518739232236584 + - 0.48709363902329056 + - 9.64528114940956 + - !!python/tuple + - 1.6389349191267708 + - 2.3664517827330607 + - 1.123063647321865 + - 2.791362250305229 + - 0.9509601205204969 + - 0.530851735416353 + - 0.21008842524441934 + - 0.09172247543727279 + - 1.2811035014719998 + - 3.085184994761554 + - 0.45183724544842485 + - 2.3773044104557814 + - 1.3975636920602268 + - !!python/tuple + - 0.5477070932137251 + - 1.0464366742144566 + - 3.4655703576764547 + - 1.2697306277692262 + - 1.2560630849394985 + - 1.1179300066242086 + - 1.7682104995873917 + - 0.16393605826208218 + - 1.067676959322938 + - 1.0583972321793176 + - 2.0057229799487652 + - 1.491222318390817 + - 0.48444554228949727 + - !!python/tuple + - 0.39005729035472964 + - 1.2037056908829395 + - 1.0248722780096902 + - 1.5827775558447446 + - 0.438684605741671 + - 4.424844277026336 + - 0.7968408843238748 + - 1.7964680201888668 + - 1.0062117989010408 + - 0.6585354390605543 + - 1.3059208622875769 + - 2.557094774122923 + - 3.155375278572912 + - !!python/tuple + - 0.8550631728053273 + - 2.01142955130705 + - 0.5740177545938762 + - 2.774362913487718 + - 1.908785910149397 + - 0.4257998771581972 + - 0.6359096766181784 + - 0.23832340535445012 + - 0.5900285506129237 + - 1.4959760442751424 + - 1.1066273135728384 + - 1.4550391168348598 + - 1.7663011880212023 + - !!python/tuple + - 0.5376266078758606 + - 2.7823575547309565 + - 3.6694712437904626 + - 1.0231014445372586 + - 1.914507780044884 + - 3.237970483448804 + - 0.5667078463668666 + - 1.1918120398075096 + - 0.8294029675152975 + - 1.8518283175186778 + - 0.3977761474159041 + - 0.8971169123053802 + - 0.6334957651692111 + - !!python/tuple + - 0.9060761235997769 + - 1.3827500181710461 + - 3.610556340418543 + - 1.2056003114422804 + - 0.3917313276374664 + - 0.8938240252142996 + - 1.1174079617549466 + - 3.7471479884161756 + - 0.6634134768930036 + - 0.6829538324363477 + - 0.52415467191372 + - 0.9904452535667024 + - 1.1263249193129992 + - !!python/tuple + - 1.2523460780885571 + - 0.6283479485902376 + - 1.4084169656990417 + - 2.431572952683806 + - 1.4915619176381967 + - 1.2382151679718514 + - 3.004856223536792 + - 5.93840139607509 + - 1.6992613390411595 + - 3.6023645143179857 + - 1.6256306381821732 + - 0.5854003593327513 + - 1.3693574096745034 + - !!python/tuple + - 2.7695080473966147 + - 1.706250128445908 + - 2.0088855189595747 + - 2.5290018015994686 + - 1.182311369020207 + - 2.7960625886949537 + - 0.5103567083479312 + - 1.3655010719979281 + - 2.37990081902058 + - 2.3887452847365895 + - 0.6041458845212236 + - 0.9878517885101654 + - 1.4257106431539828 + - !!python/tuple + - 1.90070361261154 + - 1.1093520111208748 + - 1.1416847929947944 + - 1.6116743512630005 + - 0.6439338057999712 + - 1.0990832027635589 + - 0.8096208058520002 + - 3.3987129186779756 + - 1.1497061317151946 + - 1.5753739862979763 + - 0.6006167326112011 + - 2.0148436462638553 + - 0.86003127152636 + - !!python/tuple + - 0.9239091519127332 + - 1.7244014279410218 + - 2.487598989359446 + - 1.9338125142229443 + - 0.8602395454007443 + - 1.6005467839978316 + - 1.3292196157828806 + - 0.4968016129000951 + - 1.3425086651992066 + - 1.1862805810792507 + - 1.784625896826902 + - 1.3382675564152509 + - 3.5473418306287474 + - !!python/tuple + - 0.9239091519127332 + - 1.7244014279410218 + - 2.487598989359446 + - 1.9338125142229443 + - 0.8602395454007443 + - 1.6005467839978316 + - 1.3292196157828806 + - 0.4968016129000951 + - 1.3425086651992066 + - 1.1862805810792507 + - 1.784625896826902 + - 1.3382675564152509 + - 3.5473418306287474 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.1930169398852213 + - 0.4086480246863773 + - 1.8569562529843955 + - 0.6970204800051785 + - 0.8618852452955894 + - 1.6025930413081309 + - 6.242370418682753 + - 0.6245262739276292 + - 3.91346196406469 + - 0.39764594765793015 + - 0.12129240391516787 + - 0.5050796220905374 + - 0.5942216231922297 + - !!python/tuple + - 0.46776262864633733 + - 0.3170540107500189 + - 1.459990571870951 + - 3.052980007843861 + - 0.17060341085951214 + - 0.28750390970986467 + - 1.7805196453982266 + - 1.4733429003143022 + - 0.8597477085321562 + - 0.3016485026202389 + - 2.4265434506718795 + - 1.373458631402735 + - 1.392601478358769 + - !!python/tuple + - 1.0994805003598533 + - 3.7016140398598174 + - 0.5302100836184119 + - 0.8447996948332717 + - 0.658550584693966 + - 1.4027981939866991 + - 0.6422071609155717 + - 0.3485571224148962 + - 5.05025260791009 + - 0.38804130609753246 + - 3.0543625444498996 + - 10.81411465446241 + - 0.6252778711619539 + - !!python/tuple + - 2.535017768692632 + - 1.4360515562626737 + - 2.7644145034596876 + - 0.29575766512823143 + - 0.7805352896765877 + - 0.3470329551569332 + - 0.4520224534456865 + - 5.40005505748787 + - 0.9139907865284846 + - 3.8433945551073525 + - 2.296050068899301 + - 1.1970954162612666 + - 0.8280217658102049 + - !!python/tuple + - 1.338862911788443 + - 1.0108243110456516 + - 1.5820151112406677 + - 0.8330271316277849 + - 0.34404145679966774 + - 1.9638422730606853 + - 2.744314072121454 + - 0.2872224640811312 + - 1.3449546996973905 + - 3.317001822454687 + - 1.547169230130252 + - 1.155008980091221 + - 2.7391301404848183 + - !!python/tuple + - 0.8586288574482207 + - 1.313850555746207 + - 0.7789192406544468 + - 2.148822613538061 + - 2.7820756572350476 + - 1.631201525741459 + - 1.0371216325723087 + - 1.2784891216199026 + - 0.5191516779678875 + - 0.5913394310004741 + - 5.333495995928748 + - 3.468925819051839 + - 0.7647916693330996 + - !!python/tuple + - 0.8367420375884408 + - 2.1516540447584935 + - 1.0273048832023044 + - 3.5900430292305088 + - 2.6976670493474213 + - 2.096880504792347 + - 1.1387235950113086 + - 0.7384485303489904 + - 1.6286354890292953 + - 2.959259715611303 + - 2.473409815953169 + - 1.2699115109323806 + - 0.4139069213747203 + - !!python/tuple + - 0.5507877450004839 + - 1.428315948067548 + - 0.7910854556316916 + - 1.2074769491222896 + - 3.9851115714170304 + - 0.7392172301894188 + - 1.8092269075335632 + - 0.7385145814657954 + - 1.331908688697583 + - 1.410065526829309 + - 0.7392416702970157 + - 2.25768658736719 + - 1.8891039498760325 + - !!python/tuple + - 0.5507877450004839 + - 1.428315948067548 + - 0.7910854556316916 + - 1.2074769491222896 + - 3.9851115714170304 + - 0.7392172301894188 + - 1.8092269075335632 + - 0.7385145814657954 + - 1.331908688697583 + - 1.410065526829309 + - 0.7392416702970157 + - 2.25768658736719 + - 1.8891039498760325 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 2.548069258956034 + - 18.23915537882541 + - 1.0631548967019449 + - 0.7894990503250062 + - 4.912905086378934 + - 0.12937352989901288 + - 0.15027333866241407 + - 0.39747745267688517 + - 1.051286717928634 + - 0.17317331663569221 + - 3.6793241663964484 + - 0.37552592590253103 + - 4.099939039198064 + - !!python/tuple + - 0.30395882007677055 + - 4.190945512023582 + - 1.869757123137606 + - 0.4630311828147943 + - 0.16302496384278004 + - 1.0225744413191966 + - 4.69962104737182 + - 1.7237309194231039 + - 0.2936118882934686 + - 6.886863775426381 + - 0.9515856035012531 + - 2.428198209738823 + - 3.290005285720988 + - !!python/tuple + - 0.40601489911606187 + - 1.2196688732218723 + - 1.5558214270776025 + - 3.378676117364625 + - 3.7557988811886793 + - 0.3210631182649374 + - 0.864040894686677 + - 0.45738727089594655 + - 6.091286970665915 + - 0.4856228438732626 + - 1.349672846835693 + - 0.876636693349439 + - 2.207168589336081 + - !!python/tuple + - 1.820923460155582 + - 1.34449057052263 + - 0.6793179293446896 + - 1.5772278706223593 + - 1.84349320949622 + - 0.9035875872797207 + - 0.4045630019844421 + - 0.3237398476812181 + - 6.712373545496623 + - 5.3681890306370805 + - 1.650146329003648 + - 0.8029545947729944 + - 0.5790988694938836 + - !!python/tuple + - 0.3472220433191754 + - 3.279965632077217 + - 0.4075746281272966 + - 1.0221128735773264 + - 3.2572303344281734 + - 7.551513081735918 + - 3.519153864002094 + - 2.43026526105387 + - 1.2627641035807815 + - 2.743099004165317 + - 0.48743355566415936 + - 1.5648607901884715 + - 3.508941544870647 + - !!python/tuple + - 0.9999136740172931 + - 4.034625789403535 + - 0.8602726202429262 + - 0.9862858614282454 + - 3.294364781952306 + - 0.3994899425965398 + - 0.6795241461864332 + - 0.5705725512309128 + - 2.1537867631430427 + - 1.2409557238002913 + - 2.0092561852078945 + - 11.976662783813042 + - 2.78002262491651 + - !!python/tuple + - 0.428010584094227 + - 1.368576321723912 + - 0.4301400585144884 + - 0.8674304092121992 + - 1.355231336735557 + - 1.211066578607376 + - 0.5768225589338198 + - 1.7459063374558619 + - 2.2059612015735164 + - 0.9812749799685884 + - 1.3396325343701583 + - 5.749000224445426 + - 0.8804235296284157 + - !!python/tuple + - 0.9974575064683567 + - 1.1322328692347956 + - 0.7269806242668817 + - 0.6814388089355268 + - 0.4837201235122312 + - 1.1235530619718286 + - 1.9082874530693639 + - 1.7209663705764393 + - 0.8188218312454323 + - 0.9661645044338953 + - 0.3439910164501693 + - 2.2689661263007608 + - 1.4692469223443863 + - !!python/tuple + - 0.8823108503193715 + - 2.0173985703810766 + - 1.013229879417321 + - 0.7060624918002656 + - 2.702723489302356 + - 0.5326745003138751 + - 3.00970652072632 + - 0.9069060883335127 + - 2.2464685428488145 + - 1.0183829424587123 + - 1.3819046225020246 + - 0.5414935758301458 + - 0.7494523423620643 + - !!python/tuple + - 1.3191694153290319 + - 3.158970157859913 + - 1.0043726739781451 + - 0.5655260069170466 + - 0.967673737997059 + - 1.4136639328767453 + - 4.126513097741674 + - 1.9973220531387736 + - 1.7375721829859856 + - 0.6784174292651409 + - 0.7602616762282888 + - 3.3488808386878954 + - 0.9407930614850596 + - !!python/tuple + - 1.3191694153290319 + - 3.158970157859913 + - 1.0043726739781451 + - 0.5655260069170466 + - 0.967673737997059 + - 1.4136639328767453 + - 4.126513097741674 + - 1.9973220531387736 + - 1.7375721829859856 + - 0.6784174292651409 + - 0.7602616762282888 + - 3.3488808386878954 + - 0.9407930614850596 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.4627964070707205 + - 2.969125924886804 + - 1.4888902976159992 + - 0.15371941292610097 + - 14.555002110737568 + - 0.3758084464727329 + - 5.65776427549407 + - 0.5553107975336472 + - 1.3186888944173676 + - 9.194640688930994 + - 3.7815266808361927 + - 0.20856841105219903 + - 0.5584862256178065 + - !!python/tuple + - 1.6734241647214056 + - 0.7484072363361304 + - 0.2687921713816875 + - 2.3768200717495227 + - 1.066678308287756 + - 6.508999599369149 + - 0.5503142250909925 + - 6.72805667048759 + - 1.4055456752672457 + - 0.273217754444007 + - 1.1324196555254926 + - 0.6821536321847486 + - 5.134745095078259 + - !!python/tuple + - 0.4921026997933175 + - 0.9471014775831271 + - 1.1446543830903728 + - 0.7833831473605346 + - 0.21695078343988278 + - 1.7990048200494824 + - 0.9859415366594801 + - 0.5937425096523907 + - 0.7366495288047914 + - 1.4860534272008352 + - 0.4737374868112756 + - 3.4517553977775397 + - 3.0021025379146398 + - !!python/tuple + - 1.2992187416830376 + - 0.6044542264822146 + - 1.5267386473746758 + - 0.8826352963138898 + - 4.2964149375004155 + - 4.848325717803303 + - 3.7523971744943685 + - 0.34220361286177237 + - 1.717255358406573 + - 2.282521207617088 + - 0.40005472483237986 + - 0.8054327499724282 + - 1.5483375344380754 + - !!python/tuple + - 0.40913933714519124 + - 0.29120217517303093 + - 1.0087358179366932 + - 1.8125233418935671 + - 0.30343626429865794 + - 0.8572412900667298 + - 0.8934265261691425 + - 4.594706863090205 + - 2.085895678488764 + - 3.090144834588342 + - 1.8991908890327012 + - 2.1437738214511306 + - 1.8479812054624758 + - !!python/tuple + - 0.2967527661452117 + - 5.997225176183153 + - 1.3997376948093858 + - 0.4878765349931931 + - 1.7188878314023077 + - 2.095798385948823 + - 1.5870016063360208 + - 2.564441503873529 + - 2.338766735029648 + - 4.708262014326727 + - 0.8462185248531371 + - 0.712434913654852 + - 1.9394859553623962 + - !!python/tuple + - 0.8772058606777483 + - 0.6189045108783521 + - 0.9229116776472783 + - 3.8075558471080835 + - 1.5109188975392676 + - 0.897705856402875 + - 1.0685646514399936 + - 0.9302780793714241 + - 0.9931717456964266 + - 0.538173208165805 + - 0.41915633411430236 + - 1.0875456164371615 + - 1.3999794334691995 + - !!python/tuple + - 1.2493670285667695 + - 1.479452093698733 + - 0.9267468033252025 + - 1.8061737254771086 + - 1.00231572562388 + - 2.9305228701768677 + - 1.0867788182753515 + - 0.986743304651486 + - 1.5646814668948497 + - 1.5630675795174587 + - 1.3509156952138555 + - 0.8860870576248263 + - 1.07669329774634 + - !!python/tuple + - 1.2493670285667695 + - 1.479452093698733 + - 0.9267468033252025 + - 1.8061737254771086 + - 1.00231572562388 + - 2.9305228701768677 + - 1.0867788182753515 + - 0.986743304651486 + - 1.5646814668948497 + - 1.5630675795174587 + - 1.3509156952138555 + - 0.8860870576248263 + - 1.07669329774634 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 1.3310682630745383 + - 0.28229305685198064 + - 0.7996460111285008 + - 0.4712767251273452 + - 0.35192355501778627 + - 2.397574920002392 + - 0.21500576004648272 + - 0.3206036266455567 + - 4.9086035559739365 + - 1.2891168201317171 + - 0.704215100180957 + - 2.5986023181440108 + - 1.1552128374905986 + - !!python/tuple + - 4.922583451705806 + - 1.4027611590745326 + - 0.8900817259485452 + - 1.1640115198323826 + - 0.9111061514985421 + - 1.7809901834000417 + - 1.044335972749202 + - 1.3702561668067026 + - 2.221005832174387 + - 2.8513437864827127 + - 0.655447265210883 + - 0.43435768410463554 + - 2.8232694729588417 + - !!python/tuple + - 1.729097075210244 + - 1.8006940587635418 + - 3.7490049218180563 + - 1.4367929012141967 + - 4.735385069887291 + - 1.8233000905655892 + - 2.445115122941896 + - 0.3410991065815714 + - 0.6620081066033399 + - 0.789433758982264 + - 1.5871283322972858 + - 1.3057760203259277 + - 1.7050163279442896 + - !!python/tuple + - 1.3033733628865563 + - 1.633797049135927 + - 0.9667518796385395 + - 1.655182980909616 + - 0.8858413872430319 + - 0.38647243328497116 + - 1.181937214733375 + - 4.355368325753971 + - 2.188299092697157 + - 1.4238339509753148 + - 1.0176721828500341 + - 0.7632929672249932 + - 0.6929128442346624 + - !!python/tuple + - 1.278491828286026 + - 3.2110384325975962 + - 3.9371934345646102 + - 1.4540168808080178 + - 2.181532022759327 + - 2.868057251531485 + - 1.7000641221177037 + - 2.177519303253505 + - 0.493080601978754 + - 3.6580656549625004 + - 1.0823267652579978 + - 1.324587683602705 + - 0.5116986686913415 + - !!python/tuple + - 1.278491828286026 + - 3.2110384325975962 + - 3.9371934345646102 + - 1.4540168808080178 + - 2.181532022759327 + - 2.868057251531485 + - 1.7000641221177037 + - 2.177519303253505 + - 0.493080601978754 + - 3.6580656549625004 + - 1.0823267652579978 + - 1.324587683602705 + - 0.5116986686913415 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 150.0 + - 280.0 + - 500.0 + - 2070.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 34.16907654394531 + - 32.49814674727327 + - 26.18691592398001 + - 26.242091822837384 + - 22.34589146956033 + - 22.921536173995154 + - 22.921536173995154 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 140.0 + - 150.0 + - 220.0 + - 270.0 + - 560.0 + - 660.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 30.207293927655346 + - 30.87266366632 + - 29.461320799673267 + - 29.23362968301862 + - 23.24139101387246 + - 23.203373582044797 + - 20.728108290659872 + - 20.728108290659872 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 50.0 + - 300.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 38.7426958119958 + - 40.78395669735498 + - 26.214948531520086 + - 20.987249395699855 + - 20.987249395699855 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 60.0 + - 1460.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 40.67170010978 + - 35.365836346824196 + - 36.70601338779254 + - 23.19887889257823 + - 22.240731074538086 + - 22.240731074538086 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 80.0 + - 100.0 + - 450.0 + - 620.0 + - 730.0 + - 5290.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 32.2897065683888 + - 30.490443287534802 + - 31.76913788046797 + - 26.893386422180843 + - 27.276564914133054 + - 25.008259340809563 + - 22.8049995425414 + - 21.78643710212243 + - 21.78643710212243 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 60.0 + - 80.0 + - 100.0 + - 440.0 + - 900.0 + - 3740.0 + - 4740.0 + - 5310.0 + - 5660.0 + - 7430.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 35.55377282243274 + - 36.94819975487169 + - 36.09588531260568 + - 26.255845378470458 + - 25.143196532202595 + - 25.822882282719156 + - 23.540482530320126 + - 24.643657489293094 + - 25.082237799779314 + - 22.09945094965493 + - 22.804990390508216 + - 21.406929129892525 + - 21.406929129892525 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 50.0 + - 170.0 + - 230.0 + - 490.0 + - 640.0 + - 4530.0 + - 6880.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 34.99668432011887 + - 32.77703849675279 + - 31.960330359263864 + - 27.160993722224706 + - 24.769125081044436 + - 24.1909670507419 + - 22.113256791639675 + - 20.516039430734164 + - 20.516039430734164 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 50.0 + - 100.0 + - 240.0 + - 250.0 + - 700.0 + - 2620.0 + - 9670.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 56.843736599256744 + - 34.99788972713602 + - 28.572253273194043 + - 28.234083713690897 + - 26.91176481048815 + - 30.69666152260831 + - 24.793905875709374 + - 23.140635787267 + - 22.494021012517784 + - 22.766015616083042 + - 22.766015616083042 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 50.0 + - 640.0 + - 980.0 + - 1010.0 + - 4050.0 + - 7180.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 48.872226153540005 + - 34.249755100197234 + - 27.40299933447763 + - 26.8455257416619 + - 28.4597033452617 + - 26.805308496563967 + - 24.813618944153653 + - 20.88555564875412 + - 20.88555564875412 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 620.0 + - 3630.0 + - 3930.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 31.934628573309343 + - 24.836088925815506 + - 22.593260256395133 + - 22.486501737428906 + - 21.628126798361173 + - 21.628126798361173 +problem_name: SAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.004 + - 0.015 + - 0.028 + - 0.05 + - 0.207 + - 1.0 + - !!python/tuple + - 1.0 + - 0.38959332394626256 + - 0.3411605710895485 + - 0.1582263249620116 + - 0.15982562654746943 + - 0.046892271019100006 + - 0.06357762653714528 + - 0.06357762653714528 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.014 + - 0.015 + - 0.022 + - 0.027 + - 0.056 + - 0.066 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2747590330568658 + - 0.294045114480074 + - 0.253136621261191 + - 0.24653687805081353 + - 0.07284878229764186 + - 0.07174682763525965 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.004 + - 0.005 + - 0.03 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5221620124162258 + - 0.5813290008639654 + - 0.15903886439701476 + - 0.007511337173120448 + - 0.007511337173120448 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.004 + - 0.006 + - 0.146 + - 1.0 + - !!python/tuple + - 1.0 + - 0.5780751863869085 + - 0.424282017556925 + - 0.4631277330015469 + - 0.07161654676736469 + - 0.04384414330447626 + - 0.04384414330447626 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.004 + - 0.008 + - 0.01 + - 0.045 + - 0.062 + - 0.073 + - 0.529 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3351188261344778 + - 0.28296626174827566 + - 0.320029877061196 + - 0.17870373287470107 + - 0.1898103570055845 + - 0.1240623624129389 + - 0.060199752804092524 + - 0.030676200681078986 + - 0.030676200681078986 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.005 + - 0.006 + - 0.008 + - 0.01 + - 0.044 + - 0.09 + - 0.374 + - 0.474 + - 0.531 + - 0.566 + - 0.743 + - 1.0 + - !!python/tuple + - 1.0 + - 0.4297294522092003 + - 0.4701476284426192 + - 0.4454428593848802 + - 0.16022428037613679 + - 0.12797358576590934 + - 0.1476746240983175 + - 0.08151810253269952 + - 0.11349419168501969 + - 0.1262066657984783 + - 0.03974906678740184 + - 0.0601994875277403 + - 0.019675968437467047 + - 0.019675968437467047 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.003 + - 0.005 + - 0.017 + - 0.023 + - 0.049 + - 0.064 + - 0.453 + - 0.688 + - 1.0 + - !!python/tuple + - 1.0 + - 0.413581957679135 + - 0.3492443907707947 + - 0.3255716886274431 + - 0.18646046703043342 + - 0.11713093385989906 + - 0.10037272830899087 + - 0.04014923616265491 + - -0.0061469241268206675 + - -0.0061469241268206675 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.004 + - 0.005 + - 0.01 + - 0.024 + - 0.025 + - 0.07 + - 0.262 + - 0.967 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0468299168636677 + - 0.4136168970166642 + - 0.22736654530188977 + - 0.21756452804676601 + - 0.17923643983855161 + - 0.288943602528095 + - 0.11784921783926812 + - 0.06992834063760117 + - 0.05118588141441729 + - 0.05906978380162311 + - 0.05906978380162311 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.005 + - 0.064 + - 0.098 + - 0.101 + - 0.405 + - 0.718 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8157716186149527 + - 0.39193183307068447 + - 0.1934751232006257 + - 0.1773164666258467 + - 0.22410422820487888 + - 0.1761507492532285 + - 0.11842061118799578 + - 0.004563692022076025 + - 0.004563692022076025 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.002 + - 0.003 + - 0.062 + - 0.363 + - 0.393 + - 1.0 + - !!python/tuple + - 1.0 + - 0.32482670924555007 + - 0.11907191507322838 + - 0.054062381541455366 + - 0.05096793138876893 + - 0.026087495738470766 + - 0.026087495738470766 +solver_name: RNDSRCH diff --git a/test/expected_results/SAN1_SPSA.yaml b/test/expected_results/SAN1_SPSA.yaml new file mode 100644 index 000000000..689ef72d5 --- /dev/null +++ b/test/expected_results/SAN1_SPSA.yaml @@ -0,0 +1,2649 @@ +all_est_objectives: +- - 55.228104638490976 + - 58.189074177234076 + - 57.76145791223912 + - 57.387552765407044 + - 56.968440669533564 + - 56.897008919313976 + - 56.74840576225979 + - 56.74840576225979 +- - 54.98944203450111 + - 55.626852557158465 + - 55.73934316335871 + - 55.51973694292045 + - 55.494495744302114 + - 55.29350084522771 + - 55.028995667820716 + - 54.92667022428957 + - 54.6026654727246 + - 54.43298304568287 + - 54.43298304568287 +- - 54.30952001078969 + - 54.46963990630709 + - 54.46472885899671 + - 54.1234869779048 + - 54.122334226838824 + - 54.065462687923265 + - 53.76179853083766 + - 53.74630463663188 + - 53.72160059992968 + - 53.670591618529095 + - 53.47142752159536 + - 53.185668764453546 + - 52.90833562433423 + - 52.890373648353986 + - 52.49569809834733 + - 52.098089394156226 + - 52.098089394156226 +- - 54.76055167633331 + - 54.8900072304305 + - 54.86423188654596 + - 54.84804564781153 + - 54.807509343323474 + - 54.79930245632565 + - 54.58766709699039 + - 54.57283474989361 + - 54.15790328281131 + - 53.95755344990743 + - 53.93851462102076 + - 53.926213446215186 + - 53.926213446215186 +- - 52.39186295815599 + - 52.380873971246245 + - 52.80051190749908 + - 52.58111182535948 + - 52.58278835941346 + - 52.56366216702324 + - 51.70165023860293 + - 51.552388382962725 + - 51.552388382962725 +- - 54.25979384648611 + - 54.33436200515558 + - 54.51856576815503 + - 54.47792780175242 + - 54.40524036505075 + - 54.391420691742894 + - 54.23675734636208 + - 54.201971704711816 + - 54.13952873335478 + - 54.006252642951495 + - 53.611296735640934 + - 53.570547000226995 + - 52.832689041039956 + - 52.708540277914764 + - 52.60834608358511 + - 52.60834608358511 +- - 51.823992493809435 + - 52.65471324923551 + - 52.637536488503 + - 52.494395387324836 + - 52.46884339331246 + - 52.3144765244993 + - 52.30634105507631 + - 52.28124493884811 + - 52.20813754116244 + - 51.97139066768678 + - 51.65752513213521 + - 51.49358898789244 + - 51.478395808704754 + - 51.478395808704754 +- - 53.19657777800099 + - 53.30446027864117 + - 53.841692963490566 + - 53.670843713319115 + - 53.36416995952375 + - 53.2669091710354 + - 53.2669091710354 +- - 58.70283939001095 + - 58.76879558337705 + - 58.8204477111774 + - 58.81231404139606 + - 58.807848199419794 + - 58.80613866112906 + - 58.78986571297226 + - 58.7970735715451 + - 58.74070454800986 + - 58.69284310252012 + - 58.66608101833162 + - 58.66375000470187 + - 58.66263295787892 + - 58.61433597907072 + - 58.55135822424845 + - 58.4876489071951 + - 58.4755667442318 + - 58.447111086861575 + - 58.44389406464056 + - 58.44389406464056 +- - 52.87627843731777 + - 52.888454339296935 + - 52.91574485553311 + - 52.91907823773831 + - 52.977597011608296 + - 52.9789394828009 + - 52.98762410084739 + - 53.03336691998989 + - 53.051146524873374 + - 53.042806719392786 + - 52.94098498444211 + - 52.90720834075664 + - 52.683302005902235 + - 52.683302005902235 +all_intermediate_budgets: +- - 0 + - 210 + - 1290 + - 2730 + - 5430 + - 5970 + - 7410 + - 10000 +- - 0 + - 210 + - 270 + - 1230 + - 1470 + - 2310 + - 3570 + - 4050 + - 6990 + - 8430 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 1110 + - 1350 + - 1530 + - 1590 + - 2490 + - 3330 + - 5010 + - 5190 + - 7050 + - 8730 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 1470 + - 1590 + - 2130 + - 2190 + - 4290 + - 5610 + - 5790 + - 6330 + - 10000 +- - 0 + - 210 + - 270 + - 510 + - 570 + - 810 + - 3270 + - 5190 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 450 + - 570 + - 750 + - 990 + - 1230 + - 1710 + - 2370 + - 2550 + - 5670 + - 6390 + - 7110 + - 10000 +- - 0 + - 210 + - 330 + - 750 + - 990 + - 1470 + - 1530 + - 1770 + - 2070 + - 3510 + - 6570 + - 9390 + - 9930 + - 10000 +- - 0 + - 210 + - 270 + - 690 + - 2130 + - 2790 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 510 + - 750 + - 990 + - 1290 + - 2130 + - 2670 + - 3030 + - 3990 + - 4050 + - 4950 + - 6570 + - 8970 + - 9090 + - 9450 + - 9510 + - 10000 +- - 0 + - 210 + - 270 + - 330 + - 510 + - 690 + - 870 + - 2130 + - 2970 + - 3030 + - 4350 + - 4830 + - 9090 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 8.690833430754335 + - 8.690833430754335 + - 8.690833430754335 + - 8.690833430754335 + - 8.690833430754335 + - 8.690833430754335 + - 8.690833430754335 + - 8.690833430754335 + - 7.309166569245665 + - 8.690833430754335 + - 7.309166569245665 + - 8.690833430754335 + - 8.690833430754335 + - !!python/tuple + - 8.535584815340533 + - 8.548120377340249 + - 8.522336798555832 + - 8.621529233041548 + - 8.65099583010783 + - 8.629822449870955 + - 8.640846863163928 + - 8.720383961270299 + - 7.261481098891483 + - 8.747471695468326 + - 7.1224129648287615 + - 8.632297095536329 + - 8.69918527504519 + - !!python/tuple + - 8.362053121924912 + - 8.530644095539245 + - 8.524625487569367 + - 8.709027509638812 + - 8.653545652200023 + - 8.641913184034589 + - 8.597101665633325 + - 8.588075520219377 + - 7.097227763141345 + - 8.7305418185617 + - 6.907283786495918 + - 8.65302383488092 + - 8.673714123521005 + - !!python/tuple + - 8.16028506764295 + - 8.579440846876315 + - 8.518517639729106 + - 8.592797418399774 + - 8.614187489788156 + - 8.701027376835247 + - 8.56174436062535 + - 8.545191335447614 + - 6.9429335937513965 + - 8.834947624222105 + - 6.728103328139598 + - 8.54836604237965 + - 8.684486758453454 + - !!python/tuple + - 8.111068845902087 + - 8.56169160621626 + - 8.562314017747918 + - 8.581219588870335 + - 8.563489022680907 + - 8.73625163822456 + - 8.571978971502768 + - 8.525599791911121 + - 6.889139674084576 + - 8.85080042393397 + - 6.67270523910891 + - 8.529332901465603 + - 8.716372166505701 + - !!python/tuple + - 8.029487615319711 + - 8.560375799507524 + - 8.537389763936636 + - 8.56161359178011 + - 8.548199740919069 + - 8.733639645289978 + - 8.55396658865723 + - 8.549893043510854 + - 6.854610668608982 + - 8.82965722898256 + - 6.627588517241528 + - 8.517456948087206 + - 8.730457752434214 + - !!python/tuple + - 8.029487615319711 + - 8.560375799507524 + - 8.537389763936636 + - 8.56161359178011 + - 8.548199740919069 + - 8.733639645289978 + - 8.55396658865723 + - 8.549893043510854 + - 6.854610668608982 + - 8.82965722898256 + - 6.627588517241528 + - 8.517456948087206 + - 8.730457752434214 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 8.235945798647217 + - 7.764054201352782 + - 8.235945798647217 + - 8.235945798647217 + - 8.235945798647217 + - 7.764054201352782 + - 8.235945798647217 + - 7.764054201352782 + - 8.235945798647217 + - 8.235945798647217 + - 8.235945798647217 + - 7.764054201352782 + - 7.764054201352782 + - !!python/tuple + - 8.17315379684797 + - 7.701262199553536 + - 8.17315379684797 + - 8.298737800446464 + - 8.298737800446464 + - 7.826846203152028 + - 8.298737800446464 + - 7.701262199553536 + - 8.17315379684797 + - 8.298737800446464 + - 8.298737800446464 + - 7.826846203152028 + - 7.826846203152028 + - !!python/tuple + - 8.121667378832191 + - 7.810977996366912 + - 8.194105087973577 + - 8.258285585709855 + - 8.297105281133062 + - 7.83300546842392 + - 8.215338981825377 + - 7.565489987348872 + - 8.16051540265372 + - 8.232304127366396 + - 8.35666706877044 + - 7.886002676447317 + - 7.77364422501287 + - !!python/tuple + - 8.062546092860455 + - 7.769888690707062 + - 8.208405695451074 + - 8.290618173499237 + - 8.311405888610558 + - 7.801117626722806 + - 8.274460267797114 + - 7.506813447465404 + - 8.201604708313571 + - 8.264191969067511 + - 8.370967676247936 + - 7.844468624699199 + - 7.73255491935302 + - !!python/tuple + - 8.048001469595967 + - 7.701768419805611 + - 8.168139858463256 + - 8.172137150029094 + - 8.35015834591248 + - 7.837971432144276 + - 8.268018625745977 + - 7.347474562366098 + - 8.168912553150673 + - 8.354137334627765 + - 8.308357198510329 + - 7.8329190775000415 + - 7.7883842789768645 + - !!python/tuple + - 8.04390596612924 + - 7.662732023884998 + - 8.193679788172256 + - 8.086975823177253 + - 8.395339135070687 + - 7.804815984293092 + - 8.242575394737925 + - 7.236678620639938 + - 8.184772239946758 + - 8.312869909637362 + - 8.25237792640773 + - 7.796625126830549 + - 7.715708249209029 + - !!python/tuple + - 8.035656400328296 + - 7.6449042338609114 + - 8.179971682240161 + - 8.048535536671992 + - 8.415731250617739 + - 7.817693136948037 + - 8.21933916994136 + - 7.18017312764138 + - 8.193021805747701 + - 8.336106134433926 + - 8.2160823558002 + - 7.83254141467247 + - 7.6710366325376285 + - !!python/tuple + - 7.946591071066867 + - 7.597220612658789 + - 8.143682655764252 + - 7.9853499811708035 + - 8.38878892340282 + - 7.80237023738107 + - 8.096250160083173 + - 7.046172800091308 + - 8.1789176853204 + - 8.338292568292474 + - 8.216742186692208 + - 7.802571413357767 + - 7.704181462655176 + - !!python/tuple + - 7.906511553044604 + - 7.6034210708067445 + - 8.156495603607247 + - 7.960256437842707 + - 8.352712442750676 + - 7.854516646191859 + - 8.046043840839264 + - 6.971558075543374 + - 8.15630019422478 + - 8.319187647021572 + - 8.173925290774708 + - 7.81731536515885 + - 7.69218771367861 + - !!python/tuple + - 7.906511553044604 + - 7.6034210708067445 + - 8.156495603607247 + - 7.960256437842707 + - 8.352712442750676 + - 7.854516646191859 + - 8.046043840839264 + - 6.971558075543374 + - 8.15630019422478 + - 8.319187647021572 + - 8.173925290774708 + - 7.81731536515885 + - 7.69218771367861 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 8.080313409691614 + - 7.919686590308386 + - 7.919686590308386 + - 8.080313409691614 + - 8.080313409691614 + - 7.919686590308386 + - 8.080313409691614 + - 8.080313409691614 + - 7.919686590308386 + - 8.080313409691614 + - 8.080313409691614 + - 7.919686590308386 + - 7.919686590308386 + - !!python/tuple + - 8.083561587676407 + - 7.922934768293178 + - 7.916438412323593 + - 8.077065231706822 + - 8.077065231706822 + - 7.922934768293178 + - 8.077065231706822 + - 8.083561587676407 + - 7.916438412323593 + - 8.077065231706822 + - 8.077065231706822 + - 7.922934768293178 + - 7.916438412323593 + - !!python/tuple + - 7.901466754796928 + - 8.105029601172657 + - 8.098533245203072 + - 7.894970398827343 + - 8.2591600645863 + - 7.7408399354137 + - 7.894970398827343 + - 7.901466754796928 + - 7.734343579444115 + - 7.894970398827343 + - 8.2591600645863 + - 8.105029601172657 + - 8.098533245203072 + - !!python/tuple + - 7.89970143092414 + - 8.106794925045444 + - 8.096767921330285 + - 7.896735722700131 + - 8.260925388459087 + - 7.739074611540912 + - 7.8932050749545555 + - 7.903232078669716 + - 7.732578255571327 + - 7.8932050749545555 + - 8.260925388459087 + - 8.106794925045444 + - 8.096767921330285 + - !!python/tuple + - 7.877863583563643 + - 8.128632772405942 + - 8.118605768690783 + - 7.874897875339634 + - 8.23908754109859 + - 7.717236764180415 + - 7.9150429223150525 + - 7.881394231309219 + - 7.754416102931824 + - 7.8713672275940585 + - 8.23908754109859 + - 8.084957077684946 + - 8.118605768690783 + - !!python/tuple + - 7.658915435982296 + - 8.024904361247536 + - 8.128788019632529 + - 7.890573977534032 + - 8.316667182827722 + - 7.497263685987074 + - 7.945838974675569 + - 7.962611551183361 + - 7.8732572565673955 + - 7.8769875092690675 + - 8.367870702275965 + - 7.935559911563814 + - 7.899657621109436 + - !!python/tuple + - 7.601225591711011 + - 8.062339663289832 + - 8.186477863903814 + - 7.920944436466031 + - 8.339766842175228 + - 7.466893227055075 + - 7.888149130404284 + - 7.965456668301878 + - 7.815567412296111 + - 7.846823006811264 + - 8.425560546547251 + - 7.905189452631816 + - 7.937092923151733 + - !!python/tuple + - 7.569328487834458 + - 8.03044255941328 + - 8.154580760027262 + - 7.9181196904908795 + - 8.3199654737571 + - 7.451972745621498 + - 7.856252026527731 + - 7.997353772178432 + - 7.7957660438779826 + - 7.866624375229392 + - 8.440481027980825 + - 7.885388084213687 + - 7.968990027028286 + - !!python/tuple + - 7.5493294556404615 + - 8.010443527219284 + - 8.134581727833266 + - 7.898120658296883 + - 8.299966441563104 + - 7.431973713427502 + - 7.8362529943337345 + - 7.977354739984436 + - 7.815765076071979 + - 7.846625343035396 + - 8.46048006017482 + - 7.905387116407684 + - 7.988989059222282 + - !!python/tuple + - 7.423285726253773 + - 8.071269498078497 + - 8.152848519358585 + - 7.883595665773391 + - 8.33978952739885 + - 7.417182822561526 + - 7.7382718677809725 + - 7.999759079756688 + - 7.820370701969268 + - 7.756522379776517 + - 8.444165769705808 + - 7.897288047676846 + - 7.990393008740478 + - !!python/tuple + - 7.274911468597867 + - 8.059644908975237 + - 8.155108144410008 + - 7.893754031456916 + - 8.33384905259005 + - 7.405320972403769 + - 7.630567387298167 + - 8.013556058926433 + - 7.883023076403409 + - 7.649520678753647 + - 8.357737344303299 + - 7.86381917071857 + - 7.965071236595087 + - !!python/tuple + - 7.111904674709838 + - 8.034724857012854 + - 8.142386127727526 + - 7.870106652700968 + - 8.250491416404273 + - 7.327385327129094 + - 7.557214861380278 + - 7.989067565401469 + - 7.903212640727932 + - 7.658526776129341 + - 8.349764441588263 + - 7.849605759254692 + - 7.9400566929875875 + - !!python/tuple + - 7.086376741686916 + - 8.009196923989933 + - 8.14789935828335 + - 7.875619883256791 + - 8.224963483381352 + - 7.301857394106172 + - 7.531686928357356 + - 7.976868184318162 + - 7.908725871283755 + - 7.684054709152264 + - 8.34425121103244 + - 7.855118989810515 + - 7.96558462601051 + - !!python/tuple + - 6.890934830316868 + - 8.06175736907596 + - 8.239057051736545 + - 7.831047177586258 + - 8.2059643126141 + - 7.2669123682060865 + - 7.464072250553971 + - 7.9562567447713795 + - 7.949302161099253 + - 7.579702971511144 + - 8.19576479798615 + - 7.816833302205535 + - 7.932001489330647 + - !!python/tuple + - 6.738390009550899 + - 8.028970370869063 + - 8.274328495234107 + - 7.702995971158402 + - 8.181124329934702 + - 7.19435973848515 + - 7.409088780419556 + - 7.9244545005320015 + - 7.896898826573053 + - 7.572076914828714 + - 8.057407998237677 + - 7.787283738791973 + - 7.9833486169615595 + - !!python/tuple + - 6.738390009550899 + - 8.028970370869063 + - 8.274328495234107 + - 7.702995971158402 + - 8.181124329934702 + - 7.19435973848515 + - 7.409088780419556 + - 7.9244545005320015 + - 7.896898826573053 + - 7.572076914828714 + - 8.057407998237677 + - 7.787283738791973 + - 7.9833486169615595 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 8.063253929681187 + - 8.063253929681187 + - 7.936746070318813 + - 7.936746070318813 + - 7.936746070318813 + - 7.936746070318813 + - 8.063253929681187 + - 7.936746070318813 + - 8.063253929681187 + - 7.936746070318813 + - 8.063253929681187 + - 8.063253929681187 + - 8.063253929681187 + - !!python/tuple + - 7.914016751585324 + - 8.21249110777705 + - 7.7875088922229505 + - 8.085983248414676 + - 7.7875088922229505 + - 8.085983248414676 + - 7.914016751585324 + - 8.085983248414676 + - 7.914016751585324 + - 8.085983248414676 + - 8.21249110777705 + - 8.21249110777705 + - 7.914016751585324 + - !!python/tuple + - 7.981367911552726 + - 8.279842267744453 + - 7.720157732255548 + - 8.018632088447273 + - 7.720157732255548 + - 8.15333440838208 + - 7.8466655916179215 + - 8.018632088447273 + - 7.981367911552726 + - 8.018632088447273 + - 8.145139947809646 + - 8.279842267744453 + - 7.981367911552726 + - !!python/tuple + - 8.007762383589062 + - 8.299418751728034 + - 7.656919525246767 + - 8.013370853429848 + - 7.794998743234348 + - 8.139882249971645 + - 7.861535735771417 + - 8.046575129687255 + - 8.012032484114833 + - 8.073131312773043 + - 8.07888186342981 + - 8.186319197547164 + - 7.912282749374704 + - !!python/tuple + - 8.030804168426613 + - 8.276376966890485 + - 7.612647832544017 + - 8.036412638267397 + - 7.771956958396798 + - 8.095610557268895 + - 7.817264043068667 + - 8.023533344849707 + - 8.056304176817584 + - 8.096173097610592 + - 8.055840078592261 + - 8.209360982384712 + - 7.889240964537153 + - !!python/tuple + - 7.965449220032054 + - 8.262947483316715 + - 7.525570965424852 + - 7.990208622259296 + - 7.7938417112892795 + - 8.076174016752358 + - 7.827420746899622 + - 7.969103746282032 + - 8.039126973807367 + - 8.051191643474976 + - 8.07342605385874 + - 8.174682663073629 + - 7.843520996243337 + - !!python/tuple + - 7.956458889231857 + - 8.253957152516518 + - 7.516580634624654 + - 7.999198953059493 + - 7.802832042089477 + - 8.06718368595216 + - 7.8184304160994245 + - 7.9601134154818345 + - 8.03013664300717 + - 8.060181974275173 + - 8.082416384658936 + - 8.183672993873826 + - 7.83453066544314 + - !!python/tuple + - 7.8518035671196005 + - 8.234788042071091 + - 7.242331614748183 + - 7.978063641678973 + - 7.932711100828824 + - 8.064875043454812 + - 7.909885694188951 + - 7.834878941123006 + - 7.936432871948196 + - 8.049995243496696 + - 8.051460299817347 + - 8.06302371494262 + - 7.622283825680393 + - !!python/tuple + - 7.789983910164885 + - 8.212460990992934 + - 7.079476594035124 + - 8.024699977780374 + - 7.92686030574498 + - 7.968960295589564 + - 7.8420208522591475 + - 7.769264990210049 + - 8.013832087744262 + - 8.06845569525725 + - 8.05573510772232 + - 8.118383681301303 + - 7.465283749807537 + - !!python/tuple + - 7.783367394551385 + - 8.213253032540246 + - 7.080268635582437 + - 8.025492019327686 + - 7.918396895407202 + - 7.968168254042252 + - 7.839381915987557 + - 7.771903926481639 + - 8.011193151472673 + - 8.06581675898566 + - 8.047271697384543 + - 8.111767165687803 + - 7.4644917082602245 + - !!python/tuple + - 7.791628792260276 + - 8.21579917883891 + - 7.062086418812325 + - 8.02705214513758 + - 7.912840260246299 + - 7.9607249272035805 + - 7.830135757009958 + - 7.762544187691407 + - 8.010309544376028 + - 8.0847354847152 + - 8.042598724564737 + - 8.104468710822445 + - 7.447902354427719 + - !!python/tuple + - 7.791628792260276 + - 8.21579917883891 + - 7.062086418812325 + - 8.02705214513758 + - 7.912840260246299 + - 7.9607249272035805 + - 7.830135757009958 + - 7.762544187691407 + - 8.010309544376028 + - 8.0847354847152 + - 8.042598724564737 + - 8.104468710822445 + - 7.447902354427719 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.90387205915312 + - 7.90387205915312 + - 7.90387205915312 + - 7.90387205915312 + - 8.096127940846879 + - 8.096127940846879 + - 7.90387205915312 + - 8.096127940846879 + - 7.90387205915312 + - 8.096127940846879 + - 8.096127940846879 + - 8.096127940846879 + - 8.096127940846879 + - !!python/tuple + - 8.037915958161186 + - 8.037915958161186 + - 7.769828160145056 + - 8.037915958161186 + - 7.962084041838814 + - 7.962084041838814 + - 8.037915958161186 + - 8.230171839854943 + - 7.769828160145056 + - 8.230171839854943 + - 8.230171839854943 + - 7.962084041838814 + - 8.230171839854943 + - !!python/tuple + - 8.129052150564522 + - 7.992150311576019 + - 7.67869196774172 + - 8.083681604746353 + - 8.11922167449314 + - 8.086859505757461 + - 8.083681604746353 + - 8.399040746812126 + - 7.600959253187874 + - 8.027663661382448 + - 8.027663661382448 + - 7.75957586336632 + - 8.06130293289776 + - !!python/tuple + - 8.130220642301124 + - 7.99331880331262 + - 7.679860459478322 + - 8.082513113009751 + - 8.118053182756539 + - 8.088027997494063 + - 8.082513113009751 + - 8.397872255075525 + - 7.599790761451272 + - 8.02883215311905 + - 8.02883215311905 + - 7.760744355102921 + - 8.062471424634362 + - !!python/tuple + - 8.116016876875442 + - 8.01658187585671 + - 7.694064224904005 + - 8.087750017125291 + - 8.119989859644406 + - 8.111291070038154 + - 8.052076459462253 + - 8.367435601528026 + - 7.576527688907183 + - 7.986128411033737 + - 8.052095225663141 + - 7.730307701555422 + - 8.105175166719675 + - !!python/tuple + - 7.977294008171506 + - 7.852333439855406 + - 7.548403651286852 + - 7.755587604031586 + - 8.161764301522117 + - 8.004436333978335 + - 8.00949160630023 + - 8.225530092542803 + - 7.346168156015203 + - 7.921891269408362 + - 8.009480632660816 + - 7.424215961853284 + - 7.943854164846258 + - !!python/tuple + - 7.936247017788616 + - 7.864333439879206 + - 7.52956113933894 + - 7.686116732899761 + - 8.188921542351126 + - 7.995845449756347 + - 7.989081533405091 + - 8.205626136949762 + - 7.337394390866493 + - 7.894866975688147 + - 7.972130502912587 + - 7.403987506519999 + - 7.949380086905022 + - !!python/tuple + - 7.936247017788616 + - 7.864333439879206 + - 7.52956113933894 + - 7.686116732899761 + - 8.188921542351126 + - 7.995845449756347 + - 7.989081533405091 + - 8.205626136949762 + - 7.337394390866493 + - 7.894866975688147 + - 7.972130502912587 + - 7.403987506519999 + - 7.949380086905022 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 8.113465366171269 + - 7.886534633828731 + - 8.113465366171269 + - 8.113465366171269 + - 8.113465366171269 + - 8.113465366171269 + - 7.886534633828731 + - 7.886534633828731 + - 7.886534633828731 + - 7.886534633828731 + - 8.113465366171269 + - 8.113465366171269 + - 7.886534633828731 + - !!python/tuple + - 7.682139581797376 + - 8.317860418202624 + - 7.682139581797376 + - 7.682139581797376 + - 7.682139581797376 + - 8.544791150545162 + - 8.317860418202624 + - 8.317860418202624 + - 8.317860418202624 + - 8.317860418202624 + - 8.544791150545162 + - 8.544791150545162 + - 7.455208849454838 + - !!python/tuple + - 7.783593941281894 + - 8.216406058718107 + - 7.580685222312858 + - 7.580685222312858 + - 7.783593941281894 + - 8.64624551002968 + - 8.216406058718107 + - 8.216406058718107 + - 8.419314777687141 + - 8.419314777687141 + - 8.64624551002968 + - 8.64624551002968 + - 7.35375448997032 + - !!python/tuple + - 7.851227836579573 + - 8.346076866594197 + - 7.648319117610537 + - 7.648319117610537 + - 7.851227836579573 + - 8.71387940532736 + - 8.086735250842016 + - 8.086735250842016 + - 8.351680882389461 + - 8.548985585563232 + - 8.578611614731999 + - 8.71387940532736 + - 7.2240836820942285 + - !!python/tuple + - 7.86508199336803 + - 8.359931023382655 + - 7.634464960822081 + - 7.634464960822081 + - 7.837373679791117 + - 8.713672730934368 + - 8.072881094053558 + - 8.100589407630475 + - 8.337826725601003 + - 8.535131428774774 + - 8.592465771520457 + - 8.714086079720351 + - 7.210229525305772 + - !!python/tuple + - 7.81864690970388 + - 8.357633244554735 + - 7.68090004448623 + - 7.588029877157932 + - 7.883808763455266 + - 8.667237647270218 + - 8.019664576717899 + - 8.047372890294815 + - 8.284610208265343 + - 8.526052216275344 + - 8.638900855184607 + - 8.711788300892431 + - 7.212527304133693 + - !!python/tuple + - 7.831214903386196 + - 8.3639006214634 + - 7.674632667577563 + - 7.584104721223889 + - 7.8735829907475745 + - 8.657011874562524 + - 8.029890349425592 + - 8.04110551338615 + - 8.250846239709354 + - 8.492288247719355 + - 8.623972257219599 + - 8.715713456826474 + - 7.199959310451377 + - !!python/tuple + - 7.824608160984107 + - 8.367027090017425 + - 7.681239409979652 + - 7.5774979788218 + - 7.850432730361238 + - 8.615769336637248 + - 8.010220362887322 + - 8.026139704401233 + - 8.24771977115533 + - 8.493865956718684 + - 8.604302270681329 + - 8.696043470288204 + - 7.2030857790054 + - !!python/tuple + - 7.77907693131054 + - 8.35257864048017 + - 7.70389132016766 + - 7.5711404831716465 + - 7.867821992649013 + - 8.599944721636819 + - 7.950799993270142 + - 7.978702177383756 + - 8.261199616166495 + - 8.52500906919831 + - 8.587137808201534 + - 8.68528823701073 + - 7.177414202910272 + - !!python/tuple + - 7.710760947196636 + - 8.441816057000096 + - 7.649649938911658 + - 7.488426646665131 + - 7.880984397560606 + - 8.543877175222082 + - 7.950000508644386 + - 7.937188866845483 + - 8.13708746130612 + - 8.443725768555176 + - 8.485367445832999 + - 8.701007595630529 + - 7.067932571212262 + - !!python/tuple + - 7.712846489926704 + - 8.433336701660929 + - 7.641170583572491 + - 7.496906002004298 + - 7.864114467372767 + - 8.560747105409922 + - 7.9225656803873115 + - 7.939274409575551 + - 8.12021753111828 + - 8.416290940298099 + - 8.457932617575922 + - 8.717877525818368 + - 7.040497742955187 + - !!python/tuple + - 7.592951325201007 + - 8.236775447195617 + - 7.550468797332353 + - 7.307402593308813 + - 7.861671510722589 + - 8.469921482905628 + - 7.947361980589978 + - 7.940813016827864 + - 8.049377635081294 + - 8.344674494278015 + - 8.35002134318818 + - 8.566775621062485 + - 6.799274275758362 + - !!python/tuple + - 7.54745665316628 + - 8.247534085622455 + - 7.53660305934375 + - 7.2863036812163875 + - 7.823978997469928 + - 8.423156296572426 + - 7.935910191788733 + - 7.906763328144311 + - 8.066547591634528 + - 8.353651479154706 + - 8.341661493077222 + - 8.571193937788806 + - 6.768648246123003 + - !!python/tuple + - 7.538527153269231 + - 8.213685724013681 + - 7.558086023642621 + - 7.263147401853767 + - 7.809810927123697 + - 8.39295046376398 + - 7.908667301629742 + - 7.904583808370879 + - 8.044343660054635 + - 8.36715402073302 + - 8.336876936807714 + - 8.574156024153337 + - 6.714534633699121 + - !!python/tuple + - 7.538527153269231 + - 8.213685724013681 + - 7.558086023642621 + - 7.263147401853767 + - 7.809810927123697 + - 8.39295046376398 + - 7.908667301629742 + - 7.904583808370879 + - 8.044343660054635 + - 8.36715402073302 + - 8.336876936807714 + - 8.574156024153337 + - 6.714534633699121 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.5770200900835185 + - 7.5770200900835185 + - 8.422979909916481 + - 8.422979909916481 + - 8.422979909916481 + - 8.422979909916481 + - 7.5770200900835185 + - 8.422979909916481 + - 8.422979909916481 + - 8.422979909916481 + - 8.422979909916481 + - 8.422979909916481 + - 7.5770200900835185 + - !!python/tuple + - 7.280162447815761 + - 7.326768425191896 + - 8.126122267648723 + - 8.71983755218424 + - 8.673231574808105 + - 8.673231574808105 + - 7.326768425191896 + - 8.673231574808105 + - 8.673231574808105 + - 8.673231574808105 + - 8.673231574808105 + - 8.172728245024858 + - 7.280162447815761 + - !!python/tuple + - 7.176539306474806 + - 7.231570430735951 + - 7.782188722536594 + - 8.831851750447393 + - 8.780619058260298 + - 8.77631991252129 + - 7.238385316755629 + - 8.81214049134442 + - 8.509153333877771 + - 8.971266026631147 + - 8.776854716149062 + - 8.069639907311673 + - 7.011924035197698 + - !!python/tuple + - 7.180731797202201 + - 7.2303964988361695 + - 7.76883585261672 + - 8.804556157914554 + - 8.781792990160081 + - 8.74902431998845 + - 7.265680909288468 + - 8.820126938637117 + - 8.513345824605164 + - 8.99319519653681 + - 8.778028648048846 + - 8.073832398039066 + - 6.984628442664858 + - !!python/tuple + - 7.1459390510427205 + - 7.27802919560683 + - 7.729058750683455 + - 8.778358265978579 + - 8.766382388074344 + - 8.686734640207138 + - 7.243629023698523 + - 8.80359692743242 + - 8.49764899461935 + - 8.920927451464532 + - 8.800141703746728 + - 8.048157502762287 + - 6.961936232249913 + - !!python/tuple + - 7.1401261831231695 + - 7.283842063526381 + - 7.723245882763904 + - 8.78417113389813 + - 8.760569520154792 + - 8.69254750812669 + - 7.2378161557789715 + - 8.797784059512868 + - 8.491836126699798 + - 8.926740319384084 + - 8.794328835827177 + - 8.053970370681839 + - 6.956123364330362 + - !!python/tuple + - 7.130756689618535 + - 7.298140155402153 + - 7.708947790888132 + - 8.769873042022358 + - 8.774867612030565 + - 8.683178014622055 + - 7.24670265331328 + - 8.783002971666768 + - 8.500688014914086 + - 8.936075203568699 + - 8.80866153702297 + - 8.039637669486044 + - 6.947236866796054 + - !!python/tuple + - 7.106789270362992 + - 7.2834592012637955 + - 7.684980371632589 + - 8.745991390434732 + - 8.768930997691463 + - 8.673595097620503 + - 7.256285570314832 + - 8.771968320190862 + - 8.491105097912534 + - 8.939425054346781 + - 8.818244454024523 + - 8.036373586375877 + - 6.910422447428793 + - !!python/tuple + - 7.04870553710169 + - 7.302199977645249 + - 7.688275595395143 + - 8.694593058892544 + - 8.7902251661578 + - 8.646566853033107 + - 7.199016633187857 + - 8.768708021097709 + - 8.46166399847159 + - 8.907996699896682 + - 8.772553629085042 + - 7.984021019229711 + - 6.845318916869137 + - !!python/tuple + - 6.9830271536050885 + - 7.3019265293975275 + - 7.615991505261754 + - 8.62565796720012 + - 8.790686427517958 + - 8.571834016593705 + - 7.132227164616311 + - 8.752789567450236 + - 8.443943789117217 + - 8.879609010696612 + - 8.70074683449307 + - 8.024040908531758 + - 6.763795936688989 + - !!python/tuple + - 6.932702321287791 + - 7.319949982915284 + - 7.586824108231272 + - 8.588727343179757 + - 8.785334572597021 + - 8.554762991457283 + - 7.111327719453473 + - 8.739159938909369 + - 8.449109577417383 + - 8.879605673755995 + - 8.67145418201469 + - 7.9878014918402584 + - 6.723728297935035 + - !!python/tuple + - 6.933337349840568 + - 7.3202818744353335 + - 7.583978450443586 + - 8.581874312423748 + - 8.77755829175821 + - 8.549190681912767 + - 7.108182329315025 + - 8.738944111918924 + - 8.44988480191025 + - 8.88205905375713 + - 8.666784568282369 + - 7.990946881978706 + - 6.71816825082741 + - !!python/tuple + - 6.933337349840568 + - 7.3202818744353335 + - 7.583978450443586 + - 8.581874312423748 + - 8.77755829175821 + - 8.549190681912767 + - 7.108182329315025 + - 8.738944111918924 + - 8.44988480191025 + - 8.88205905375713 + - 8.666784568282369 + - 7.990946881978706 + - 6.71816825082741 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 8.077972306739566 + - 7.922027693260435 + - 7.922027693260435 + - 7.922027693260435 + - 8.077972306739566 + - 7.922027693260435 + - 8.077972306739566 + - 8.077972306739566 + - 7.922027693260435 + - 7.922027693260435 + - 8.077972306739566 + - 8.077972306739566 + - 8.077972306739566 + - !!python/tuple + - 8.19854554414528 + - 7.801454455854721 + - 8.042600930666149 + - 8.042600930666149 + - 7.957399069333853 + - 8.042600930666149 + - 8.19854554414528 + - 8.19854554414528 + - 7.801454455854721 + - 8.042600930666149 + - 8.19854554414528 + - 8.19854554414528 + - 8.19854554414528 + - !!python/tuple + - 8.148029324357386 + - 7.701631470295345 + - 8.007478910987519 + - 8.012028364327119 + - 7.960892089820165 + - 8.098655588490516 + - 8.212057719361253 + - 8.238889588040385 + - 7.762404993732645 + - 8.066256192678964 + - 8.129056976005193 + - 8.142559622967328 + - 8.154946628683602 + - !!python/tuple + - 8.077320184468974 + - 7.583072878873899 + - 8.055057248791092 + - 7.884573088451114 + - 7.913970008027287 + - 8.04068165930322 + - 8.222069714681343 + - 8.2250671292831 + - 7.6609375746865895 + - 8.072043702789776 + - 8.120539862743563 + - 8.05185552202066 + - 8.15004641588132 + - !!python/tuple + - 8.056097049695873 + - 7.587455084411778 + - 8.054175855857046 + - 7.849398333307355 + - 7.919503537292548 + - 8.018013607904383 + - 8.21498158193556 + - 8.196790230900787 + - 7.638199074388736 + - 8.061663932037636 + - 8.117793354719636 + - 8.036676327884068 + - 8.145848447969607 + - !!python/tuple + - 8.056097049695873 + - 7.587455084411778 + - 8.054175855857046 + - 7.849398333307355 + - 7.919503537292548 + - 8.018013607904383 + - 8.21498158193556 + - 8.196790230900787 + - 7.638199074388736 + - 8.061663932037636 + - 8.117793354719636 + - 8.036676327884068 + - 8.145848447969607 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 8.06139743455774 + - 8.06139743455774 + - 8.06139743455774 + - 7.93860256544226 + - 8.06139743455774 + - 8.06139743455774 + - 8.06139743455774 + - 7.93860256544226 + - 8.06139743455774 + - 7.93860256544226 + - 8.06139743455774 + - 7.93860256544226 + - 7.93860256544226 + - !!python/tuple + - 8.077427627271689 + - 8.077427627271689 + - 8.077427627271689 + - 7.922572372728312 + - 8.045367241843792 + - 8.045367241843792 + - 8.077427627271689 + - 7.922572372728312 + - 8.077427627271689 + - 7.954632758156207 + - 8.077427627271689 + - 7.954632758156207 + - 7.954632758156207 + - !!python/tuple + - 8.073109727154046 + - 8.073109727154046 + - 8.073109727154046 + - 7.926890272845954 + - 8.049685141961435 + - 8.041049341726149 + - 8.081745527389332 + - 7.926890272845954 + - 8.073109727154046 + - 7.950314858038565 + - 8.073109727154046 + - 7.958950658273849 + - 7.950314858038565 + - !!python/tuple + - 8.047162563900136 + - 8.071730297258634 + - 8.099056890407956 + - 7.928269702741366 + - 8.065042486899886 + - 8.06699650498006 + - 8.055798364135422 + - 7.900943109592044 + - 8.088467072092497 + - 7.965672202977016 + - 8.061140478943175 + - 7.9709199064847205 + - 7.9762620212924755 + - !!python/tuple + - 8.044799222887757 + - 8.070187604768929 + - 8.101420231420335 + - 7.9267270102516605 + - 8.047992709386662 + - 8.053852760968919 + - 8.053435023123043 + - 7.891852856832365 + - 8.075470785830735 + - 7.982721980490238 + - 8.070230731702853 + - 7.969229756245635 + - 7.981858205033642 + - !!python/tuple + - 8.033505182090432 + - 8.061975162216045 + - 8.108221859407328 + - 7.916936099378232 + - 8.042769549720214 + - 8.065146801766245 + - 8.048136525059947 + - 7.886629697165915 + - 8.071750756088184 + - 7.992512891363667 + - 8.06201828914997 + - 7.978945328722418 + - 7.993152245830968 + - !!python/tuple + - 8.034090329465673 + - 8.061827209708028 + - 8.104224958808391 + - 7.907312163902175 + - 8.042917502228232 + - 8.070495577128952 + - 8.0611722137597 + - 7.867364180712178 + - 8.087604519318226 + - 8.007633554710448 + - 8.048249500566957 + - 7.974948428123481 + - 8.009006009061011 + - !!python/tuple + - 8.004887434985205 + - 8.079958225423011 + - 8.094737975136363 + - 7.898476682937838 + - 8.037999897244193 + - 8.058744169100796 + - 8.061499955835037 + - 7.835685580140698 + - 8.072933733127131 + - 8.011417315604172 + - 8.05827621877438 + - 7.955100313207248 + - 8.005623688554708 + - !!python/tuple + - 7.987587939625014 + - 8.076850875564231 + - 8.095336383203039 + - 7.884874322420243 + - 8.045142059410972 + - 8.049254794652347 + - 8.057141539000325 + - 7.824961839869669 + - 8.075120748901726 + - 8.00409934221584 + - 8.059762959936181 + - 7.946318157945246 + - 8.003406350300258 + - !!python/tuple + - 7.980378546453172 + - 8.07247902543228 + - 8.08617174978918 + - 7.877162903272155 + - 8.053960910781004 + - 8.038052993380202 + - 8.064350932172168 + - 7.812354257170223 + - 8.08233014207357 + - 7.995782516822055 + - 8.066972353108024 + - 7.937655550507636 + - 7.993155737317637 + - !!python/tuple + - 7.981509239634852 + - 8.061873087973732 + - 8.084524237414863 + - 7.871958042336158 + - 8.060699591803006 + - 8.04076760763388 + - 8.066069704597629 + - 7.794382276369828 + - 8.08434231288509 + - 8.001623708786497 + - 8.071200118089548 + - 7.941223566653147 + - 7.99492455485198 + - !!python/tuple + - 7.982156251791052 + - 8.061226075817531 + - 8.083877225258663 + - 7.872605054492357 + - 8.060052579646806 + - 8.04012059547768 + - 8.065422692441429 + - 7.793735264213629 + - 8.08369530072889 + - 8.002270720942697 + - 8.070553105933348 + - 7.940576554496948 + - 7.99427754269578 + - !!python/tuple + - 7.968030994850547 + - 8.057911171318827 + - 8.08381412289542 + - 7.854387545064057 + - 8.069232034417967 + - 8.030238608982147 + - 8.06669219265286 + - 7.772943878515546 + - 8.0783722614273 + - 7.998425709957098 + - 8.080294386530879 + - 7.931830827578084 + - 7.986320992262396 + - !!python/tuple + - 7.957161631962961 + - 8.054138998745 + - 8.08029199898776 + - 7.840876392878075 + - 8.076220236068881 + - 8.021180205655728 + - 8.054344695043785 + - 7.7510917068768475 + - 8.086678040427184 + - 7.985533488279073 + - 8.070483467210337 + - 7.9286976573055945 + - 7.977997427223098 + - !!python/tuple + - 7.934038398015894 + - 8.070270648643742 + - 8.092308390709572 + - 7.813639138516007 + - 8.089130685374634 + - 8.014050526211296 + - 8.042483993766126 + - 7.712111590917698 + - 8.093105463614407 + - 8.000917807684722 + - 8.05723633599774 + - 7.930576884756753 + - 7.97819210946196 + - !!python/tuple + - 7.931622457934448 + - 8.067854708562296 + - 8.09243656871937 + - 7.81122319843456 + - 8.086714745293188 + - 8.01163458612985 + - 8.042612171775923 + - 7.7096956508362515 + - 8.09297728560461 + - 7.9985018676032755 + - 8.054820395916293 + - 7.930448706746955 + - 7.975776169380514 + - !!python/tuple + - 7.924005882205356 + - 8.063829906989614 + - 8.096265348984268 + - 7.805174761535285 + - 8.092763182192463 + - 8.013578205130408 + - 8.03864491744877 + - 7.702217549169414 + - 8.092570248016798 + - 7.999605421599752 + - 8.047342294249454 + - 7.924913313589985 + - 7.970379250285798 + - !!python/tuple + - 7.923011978451743 + - 8.062836003236002 + - 8.095271445230656 + - 7.806168665288897 + - 8.091769278438852 + - 8.012584301376796 + - 8.039638821202383 + - 7.701223645415801 + - 8.091576344263187 + - 7.99861151784614 + - 8.046348390495842 + - 7.9239194098363726 + - 7.969385346532185 + - !!python/tuple + - 7.923011978451743 + - 8.062836003236002 + - 8.095271445230656 + - 7.806168665288897 + - 8.091769278438852 + - 8.012584301376796 + - 8.039638821202383 + - 7.701223645415801 + - 8.091576344263187 + - 7.99861151784614 + - 8.046348390495842 + - 7.9239194098363726 + - 7.969385346532185 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.95570515490756 + - 8.04429484509244 + - 8.04429484509244 + - 8.04429484509244 + - 8.04429484509244 + - 8.04429484509244 + - 8.04429484509244 + - 7.95570515490756 + - 8.04429484509244 + - 7.95570515490756 + - 7.95570515490756 + - 7.95570515490756 + - 8.04429484509244 + - !!python/tuple + - 7.968306518546054 + - 8.056896208730935 + - 8.056896208730935 + - 8.056896208730935 + - 8.031693481453944 + - 8.031693481453944 + - 8.031693481453944 + - 7.968306518546054 + - 8.056896208730935 + - 7.943103791269065 + - 7.943103791269065 + - 7.968306518546054 + - 8.056896208730935 + - !!python/tuple + - 7.9646636111907885 + - 8.053253301375669 + - 8.0605391160862 + - 8.053253301375669 + - 8.028050574098678 + - 8.028050574098678 + - 8.03533638880921 + - 7.97194942590132 + - 8.0605391160862 + - 7.946746698624331 + - 7.9394608839137994 + - 7.97194942590132 + - 8.0605391160862 + - !!python/tuple + - 7.981171632459009 + - 8.062719450462852 + - 8.082241047564482 + - 8.062719450462852 + - 8.023778335221555 + - 8.037516723185862 + - 8.05184441007743 + - 7.976221664778443 + - 8.082241047564482 + - 7.968448630102614 + - 7.917758952435516 + - 7.993651357379603 + - 8.04403109481798 + - !!python/tuple + - 7.976982177359173 + - 8.066908905562688 + - 8.078051592464647 + - 8.07590683556461 + - 8.013594634013806 + - 8.03870249439169 + - 8.06202811128518 + - 7.9750358935726124 + - 8.095428432666239 + - 7.955261245000858 + - 7.90457156733376 + - 7.980463972277847 + - 8.048220549917815 + - !!python/tuple + - 7.99086584422524 + - 8.073402909167777 + - 8.060826115968913 + - 8.06941283195952 + - 8.020088637618896 + - 8.052586161257755 + - 8.044802634789447 + - 7.984871706807368 + - 8.105264245900996 + - 7.972486721496592 + - 7.887346090838026 + - 7.994347639143914 + - 8.041726546312725 + - !!python/tuple + - 8.018020587662162 + - 8.062049316089166 + - 8.085453543723485 + - 8.057503230476744 + - 8.040852342332517 + - 8.08954773657555 + - 8.06493724793555 + - 8.039138039933173 + - 8.10614318396808 + - 7.99369851422456 + - 7.758881726810105 + - 8.03128508386057 + - 8.060488132269569 + - !!python/tuple + - 8.008511666546958 + - 8.06826894121827 + - 8.093511534716741 + - 8.055971258867798 + - 8.073793758818768 + - 8.093199298442466 + - 8.09007133290448 + - 8.042142622060343 + - 8.131971164407032 + - 8.011163012040651 + - 7.704057350679535 + - 8.037182675611232 + - 8.06985091099279 + - !!python/tuple + - 8.00558559479403 + - 8.065342869465342 + - 8.096437606469669 + - 8.058897330620725 + - 8.07086768706584 + - 8.090273226689538 + - 8.087145261151553 + - 8.039216550307415 + - 8.129045092654104 + - 8.008236940287723 + - 7.701131278926607 + - 8.04010874736416 + - 8.066924839239862 + - !!python/tuple + - 7.9539297692340325 + - 8.049503428031064 + - 8.098774529975083 + - 8.044500493002884 + - 8.08662258023733 + - 8.100126735143393 + - 8.092512979858041 + - 8.025059328814066 + - 8.11064933925971 + - 8.030435210065303 + - 7.628916882300243 + - 8.035291609653777 + - 8.062105074044167 + - !!python/tuple + - 7.928634759134083 + - 8.039766152644013 + - 8.114060820816963 + - 8.051720880008894 + - 8.08404808067283 + - 8.086262860178898 + - 8.09885899792561 + - 8.045703589164956 + - 8.107865869315201 + - 8.034814515943344 + - 7.599088264736905 + - 8.041423795033786 + - 8.037634425989836 + - !!python/tuple + - 7.813560625753937 + - 8.046879461251349 + - 8.087798709035345 + - 8.040495199327234 + - 8.070899677611502 + - 8.064188018350395 + - 8.101127430127482 + - 8.01855235522589 + - 8.106710936244388 + - 8.046790366808874 + - 7.475214543278308 + - 7.974826851250845 + - 8.057402809245987 + - !!python/tuple + - 7.813560625753937 + - 8.046879461251349 + - 8.087798709035345 + - 8.040495199327234 + - 8.070899677611502 + - 8.064188018350395 + - 8.101127430127482 + - 8.01855235522589 + - 8.106710936244388 + - 8.046790366808874 + - 7.475214543278308 + - 7.974826851250845 + - 8.057402809245987 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 1290.0 + - 2730.0 + - 5430.0 + - 5970.0 + - 7410.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 58.189074177234076 + - 57.76145791223912 + - 57.387552765407044 + - 56.968440669533564 + - 56.897008919313976 + - 56.74840576225979 + - 56.74840576225979 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 1230.0 + - 1470.0 + - 2310.0 + - 3570.0 + - 4050.0 + - 6990.0 + - 8430.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 55.626852557158465 + - 55.73934316335871 + - 55.51973694292045 + - 55.494495744302114 + - 55.29350084522771 + - 55.028995667820716 + - 54.92667022428957 + - 54.6026654727246 + - 54.43298304568287 + - 54.43298304568287 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 1110.0 + - 1350.0 + - 1530.0 + - 1590.0 + - 2490.0 + - 3330.0 + - 5010.0 + - 5190.0 + - 7050.0 + - 8730.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 54.46963990630709 + - 54.46472885899671 + - 54.1234869779048 + - 54.122334226838824 + - 54.065462687923265 + - 53.76179853083766 + - 53.74630463663188 + - 53.72160059992968 + - 53.670591618529095 + - 53.47142752159536 + - 53.185668764453546 + - 52.90833562433423 + - 52.890373648353986 + - 52.49569809834733 + - 52.098089394156226 + - 52.098089394156226 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 1470.0 + - 1590.0 + - 2130.0 + - 2190.0 + - 4290.0 + - 5610.0 + - 5790.0 + - 6330.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 54.8900072304305 + - 54.86423188654596 + - 54.84804564781153 + - 54.807509343323474 + - 54.79930245632565 + - 54.58766709699039 + - 54.57283474989361 + - 54.15790328281131 + - 53.95755344990743 + - 53.93851462102076 + - 53.926213446215186 + - 53.926213446215186 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 510.0 + - 570.0 + - 810.0 + - 3270.0 + - 5190.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 52.380873971246245 + - 52.80051190749908 + - 52.58111182535948 + - 52.58278835941346 + - 52.56366216702324 + - 51.70165023860293 + - 51.552388382962725 + - 51.552388382962725 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 450.0 + - 570.0 + - 750.0 + - 990.0 + - 1230.0 + - 1710.0 + - 2370.0 + - 2550.0 + - 5670.0 + - 6390.0 + - 7110.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 54.33436200515558 + - 54.51856576815503 + - 54.47792780175242 + - 54.40524036505075 + - 54.391420691742894 + - 54.23675734636208 + - 54.201971704711816 + - 54.13952873335478 + - 54.006252642951495 + - 53.611296735640934 + - 53.570547000226995 + - 52.832689041039956 + - 52.708540277914764 + - 52.60834608358511 + - 52.60834608358511 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 330.0 + - 750.0 + - 990.0 + - 1470.0 + - 1530.0 + - 1770.0 + - 2070.0 + - 3510.0 + - 6570.0 + - 9390.0 + - 9930.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 52.65471324923551 + - 52.637536488503 + - 52.494395387324836 + - 52.46884339331246 + - 52.3144765244993 + - 52.30634105507631 + - 52.28124493884811 + - 52.20813754116244 + - 51.97139066768678 + - 51.65752513213521 + - 51.49358898789244 + - 55.17268954097163 + - 55.17268954097163 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 690.0 + - 2130.0 + - 2790.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 53.30446027864117 + - 53.841692963490566 + - 53.670843713319115 + - 53.36416995952375 + - 53.2669091710354 + - 53.2669091710354 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 510.0 + - 750.0 + - 990.0 + - 1290.0 + - 2130.0 + - 2670.0 + - 3030.0 + - 3990.0 + - 4050.0 + - 4950.0 + - 6570.0 + - 8970.0 + - 9090.0 + - 9450.0 + - 9510.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 58.76879558337705 + - 58.8204477111774 + - 58.81231404139606 + - 58.807848199419794 + - 58.80613866112906 + - 58.78986571297226 + - 58.7970735715451 + - 58.74070454800986 + - 58.69284310252012 + - 58.66608101833162 + - 58.66375000470187 + - 58.66263295787892 + - 58.61433597907072 + - 58.55135822424845 + - 58.4876489071951 + - 58.4755667442318 + - 58.447111086861575 + - 58.44389406464056 + - 58.44389406464056 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 510.0 + - 690.0 + - 870.0 + - 2130.0 + - 2970.0 + - 3030.0 + - 4350.0 + - 4830.0 + - 9090.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 52.888454339296935 + - 52.91574485553311 + - 52.91907823773831 + - 52.977597011608296 + - 52.9789394828009 + - 52.98762410084739 + - 53.03336691998989 + - 53.051146524873374 + - 53.042806719392786 + - 52.94098498444211 + - 52.90720834075664 + - 52.683302005902235 + - 52.683302005902235 +problem_name: SAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.129 + - 0.273 + - 0.543 + - 0.597 + - 0.741 + - 1.0 + - !!python/tuple + - 1.0 + - 54.432542236518074 + - 46.71594000829525 + - 39.96858840972483 + - 32.40544921778926 + - 31.116418729398372 + - 28.434782068878018 + - 28.434782068878018 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.123 + - 0.147 + - 0.231 + - 0.357 + - 0.405 + - 0.699 + - 0.843 + - 1.0 + - !!python/tuple + - 1.0 + - 8.195654912062517 + - 10.225618067157203 + - 6.262686839586942 + - 5.807193666277483 + - 2.1801153415620744 + - -2.593045570311534 + - -4.4395720245043515 + - -10.28643986502147 + - -13.348465100698522 + - -13.348465100698522 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.039 + - 0.045 + - 0.111 + - 0.135 + - 0.153 + - 0.159 + - 0.249 + - 0.333 + - 0.501 + - 0.519 + - 0.705 + - 0.873 + - 1.0 + - !!python/tuple + - 1.0 + - -12.686969185953918 + - -12.775592097944015 + - -18.933514692464286 + - -18.954316804480253 + - -19.980599197932804 + - -25.460408323588613 + - -25.740005308875283 + - -26.185805060352404 + - -27.106293946666817 + - -30.700334304787873 + - -35.857029319933595 + - -40.8616788204151 + - -41.185813880792324 + - -48.30798036022302 + - -55.48307743647222 + - -55.48307743647222 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.147 + - 0.159 + - 0.213 + - 0.219 + - 0.429 + - 0.561 + - 0.579 + - 0.633 + - 1.0 + - !!python/tuple + - 1.0 + - -5.101178617297531 + - -5.566310775109623 + - -5.858401549266919 + - -6.589904448344329 + - -6.738002843280133 + - -10.557094910408336 + - -10.824753865471992 + - -18.312451003196195 + - -21.927888706503424 + - -22.271456249266034 + - -22.49343862151175 + - -22.49343862151175 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.051 + - 0.057 + - 0.081 + - 0.327 + - 0.519 + - 1.0 + - !!python/tuple + - 1.0 + - -50.3800533555111 + - -42.80742504593625 + - -46.7666363793281 + - -46.73638227658291 + - -47.081526348260276 + - -62.63706927804411 + - -65.33059256541362 + - -65.33059256541362 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.045 + - 0.057 + - 0.075 + - 0.099 + - 0.123 + - 0.171 + - 0.237 + - 0.255 + - 0.567 + - 0.639 + - 0.711 + - 1.0 + - !!python/tuple + - 1.0 + - -15.128143292058894 + - -11.804071491316412 + - -12.537408943053652 + - -13.849099077250342 + - -14.098483702135884 + - -16.88948024106326 + - -17.51720884224679 + - -18.644031209296482 + - -21.04908139181692 + - -28.176307093669983 + - -28.911661486932847 + - -42.22676860064812 + - -44.46711046924909 + - -46.27517720223063 + - -46.27517720223063 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.033 + - 0.075 + - 0.099 + - 0.147 + - 0.153 + - 0.177 + - 0.207 + - 0.351 + - 0.657 + - 0.939 + - 0.993 + - 1.0 + - !!python/tuple + - 1.0 + - -45.43845277646892 + - -45.748418137921455 + - -48.33148859319224 + - -48.79259026324625 + - -51.57823669758263 + - -51.725046317833666 + - -52.17792138891764 + - -53.497189981021954 + - -57.76943498416439 + - -63.433334347365964 + - -66.3916643256819 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.069 + - 0.213 + - 0.279 + - 1.0 + - !!python/tuple + - 1.0 + - -33.7133623500043 + - -24.01866345207561 + - -27.101744738936326 + - -32.63586391446093 + - -34.39099550931913 + - -34.39099550931913 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.051 + - 0.075 + - 0.099 + - 0.129 + - 0.213 + - 0.267 + - 0.303 + - 0.399 + - 0.405 + - 0.495 + - 0.657 + - 0.897 + - 0.909 + - 0.945 + - 0.951 + - 1.0 + - !!python/tuple + - 1.0 + - 64.89397661260321 + - 65.82607147686511 + - 65.67929433227009 + - 65.59870542823172 + - 65.56785574344798 + - 65.27420024367873 + - 65.40427054753997 + - 64.38705635757012 + - 63.52336672004796 + - 63.04042821796984 + - 62.998363623047204 + - 62.97820581636721 + - 62.10665670844866 + - 60.97018384019683 + - 59.8205094751718 + - 59.602479308228844 + - 59.088979221717395 + - 59.03092604911597 + - 59.03092604911597 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.021 + - 0.027 + - 0.033 + - 0.051 + - 0.069 + - 0.087 + - 0.213 + - 0.297 + - 0.303 + - 0.435 + - 0.483 + - 0.909 + - 1.0 + - !!python/tuple + - 1.0 + - -41.22044900989917 + - -40.72797462191038 + - -40.667821660814624 + - -39.61181388514379 + - -39.58758815510457 + - -39.430868805409965 + - -38.60541110182063 + - -38.28456704163865 + - -38.43506403350404 + - -40.27250075217322 + - -40.882021355717775 + - -44.92255083013125 + - -44.92255083013125 +solver_name: SPSA diff --git a/test/expected_results/SAN1_STRONG.yaml b/test/expected_results/SAN1_STRONG.yaml new file mode 100644 index 000000000..f13b63ebe --- /dev/null +++ b/test/expected_results/SAN1_STRONG.yaml @@ -0,0 +1,1849 @@ +all_est_objectives: +- - 55.228104638490976 + - 51.73806332172355 + - 48.30537274657317 + - 44.94667151261732 + - 41.637418608834295 + - 38.493698704466595 + - 35.59342271980632 + - 35.59342271980632 +- - 54.98944203450111 + - 51.13517983904042 + - 47.34465885233133 + - 43.69596080977635 + - 40.15155048047032 + - 36.76818416498971 + - 36.76818416498971 +- - 54.30952001078969 + - 50.653208526830525 + - 47.11152686600205 + - 43.65460654927291 + - 40.37432384330744 + - 37.21345720567094 + - 34.29773702735223 + - 34.29773702735223 +- - 54.76055167633331 + - 51.19439324479615 + - 47.54313645411606 + - 43.76523545590212 + - 40.100037449833145 + - 36.49840042853828 + - 33.11337995510562 + - 29.925931142655518 + - 27.894395446561557 + - 25.36471575295229 + - 25.36471575295229 +- - 52.39186295815599 + - 49.19001566010058 + - 46.23479783586531 + - 43.36152292952557 + - 40.50442595195895 + - 37.606928213791214 + - 34.6389368033125 + - 31.889208326244106 + - 31.889208326244106 +- - 54.25979384648611 + - 50.89571857685169 + - 47.74475431087356 + - 44.61379525245542 + - 41.33898909813086 + - 38.10437156716907 + - 34.726344288488356 + - 31.464068878050483 + - 28.549261248855345 + - 28.549261248855345 +- - 51.823992493809435 + - 48.6423475582648 + - 45.40630383942084 + - 42.06113015329236 + - 38.72895513669779 + - 35.57348383793662 + - 32.5401939352943 + - 29.69497124401232 + - 27.279314587464 + - 27.279314587464 +- - 53.19657777800099 + - 49.763505327787215 + - 46.34806091687874 + - 42.99586058610319 + - 39.75814423102677 + - 36.59771873130756 + - 33.84220349422237 + - 33.84220349422237 +- - 58.70283939001095 + - 55.43929279423539 + - 52.021603416445004 + - 48.63004678667651 + - 45.21679468824769 + - 41.873631937597175 + - 38.47351327472907 + - 38.47351327472907 +- - 52.87627843731777 + - 49.32669138871955 + - 45.70462498657198 + - 42.036751155604996 + - 38.50669619142839 + - 35.14484496422466 + - 31.97371023475929 + - 29.821280342886052 + - 27.286158547683954 + - 27.286158547683954 +all_intermediate_budgets: +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 3412 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 10000 +- - 10 + - 280 + - 577 + - 901 + - 1252 + - 1630 + - 2035 + - 2467 + - 2926 + - 10000 +all_recommended_xs: +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.128665227434485 + - 7.971340780393593 + - 7.713176791391592 + - 7.16996893619858 + - 7.4805945111712315 + - 7.996398836769234 + - 7.118727619128116 + - 7.696391497205114 + - 7.534865727404901 + - 7.871847395568139 + - 7.068239432830016 + - 7.841302144572145 + - 7.548352642536873 + - !!python/tuple + - 6.302381185126457 + - 7.927326634963882 + - 7.481909171049248 + - 6.232782466279839 + - 7.027709847142611 + - 7.994774289448442 + - 6.135473948815439 + - 7.398917761654488 + - 7.123610366417887 + - 7.695519526844283 + - 6.215257241753445 + - 7.686404055857344 + - 7.134427337911771 + - !!python/tuple + - 5.333113100870107 + - 7.874930763634076 + - 7.288135913106908 + - 5.372757632318375 + - 6.586246781958727 + - 7.994736302588063 + - 5.255776796087142 + - 6.817426175352807 + - 6.75108337108889 + - 7.516920549748357 + - 5.480506713339055 + - 7.393911485856123 + - 6.71298946730282 + - !!python/tuple + - 4.38672906907565 + - 7.815213155229761 + - 6.691967840716736 + - 4.5663127183291685 + - 6.1244402659206845 + - 7.8575192005924555 + - 4.457354679382059 + - 6.257514125793531 + - 6.417394437787565 + - 7.345210613208981 + - 4.7560014884408455 + - 7.106342956500705 + - 6.308623241884416 + - !!python/tuple + - 3.153794158218184 + - 7.712370390658817 + - 6.212673442747915 + - 3.832543893939656 + - 5.723026101135838 + - 7.718868446866049 + - 3.7525523538208154 + - 5.7157217987074205 + - 6.075699635826974 + - 7.198753595960809 + - 4.105294051590515 + - 6.861881354725399 + - 5.978281270457372 + - !!python/tuple + - 1.9639490280037748 + - 7.537455901053643 + - 5.747656008490041 + - 3.148318941970876 + - 5.139187601721782 + - 7.5579999229314945 + - 3.1276416135692564 + - 5.137799621694805 + - 5.775423429971676 + - 6.995185389432632 + - 3.4498946696456017 + - 6.600642512411231 + - 5.592775057906008 + - !!python/tuple + - 1.9639490280037748 + - 7.537455901053643 + - 5.747656008490041 + - 3.148318941970876 + - 5.139187601721782 + - 7.5579999229314945 + - 3.1276416135692564 + - 5.137799621694805 + - 5.775423429971676 + - 6.995185389432632 + - 3.4498946696456017 + - 6.600642512411231 + - 5.592775057906008 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.843347963299613 + - 8.013582907683947 + - 7.835124914613994 + - 7.233767058468627 + - 8.013582907683947 + - 7.629033618098127 + - 7.323411645743938 + - 7.2817117591294975 + - 7.979479033940051 + - 7.490040761750327 + - 7.841044047823915 + - 7.623124928828922 + - 7.286990071983623 + - !!python/tuple + - 5.604495779573163 + - 8.028404321270727 + - 7.632491887193015 + - 6.492764738118461 + - 7.700746553494098 + - 7.222134849412121 + - 6.69199749668765 + - 6.663815639073112 + - 7.960482819133847 + - 7.01971583842638 + - 7.581436120600415 + - 7.268699679547782 + - 6.641708387866325 + - !!python/tuple + - 4.364371874807647 + - 8.044188259850484 + - 7.408503087415746 + - 5.811912885738231 + - 7.1064755559093005 + - 6.797023374280309 + - 6.095484018921636 + - 6.130709648369459 + - 7.93933299004594 + - 6.578481001691653 + - 7.210392074859535 + - 6.93819596052894 + - 6.065372252548429 + - !!python/tuple + - 3.156232510399092 + - 7.809471140218113 + - 7.186892810912233 + - 5.1605490383773205 + - 6.49498461365311 + - 6.235983258709103 + - 5.520421632993845 + - 5.631237372361483 + - 7.885589336299155 + - 6.148866227724253 + - 6.747580646428947 + - 6.620713032113227 + - 5.574844347923581 + - !!python/tuple + - 1.9689542857844329 + - 7.581284587221652 + - 6.981473700351841 + - 4.51798506374179 + - 5.928960718133411 + - 5.7091903610987025 + - 4.738460956496251 + - 5.183157623804765 + - 7.748558919606313 + - 5.75870948893668 + - 6.2598949088451485 + - 6.336976659900421 + - 5.146194431910718 + - !!python/tuple + - 1.9689542857844329 + - 7.581284587221652 + - 6.981473700351841 + - 4.51798506374179 + - 5.928960718133411 + - 5.7091903610987025 + - 4.738460956496251 + - 5.183157623804765 + - 7.748558919606313 + - 5.75870948893668 + - 6.2598949088451485 + - 6.336976659900421 + - 5.146194431910718 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.975887607138999 + - 8.01284128211752 + - 8.01284128211752 + - 6.856346282825165 + - 7.8485993403139345 + - 8.01284128211752 + - 7.363873558415742 + - 7.517735863213212 + - 7.754437698959848 + - 7.7858782398995325 + - 7.198634705988399 + - 7.755908380830113 + - 7.582050775214541 + - !!python/tuple + - 5.978268439202275 + - 7.871579548471647 + - 8.014005761344434 + - 5.779797187596888 + - 7.640668647487127 + - 7.909447266105238 + - 6.804500076095172 + - 7.055185362579678 + - 7.5288470253011415 + - 7.571285777929111 + - 6.234533679695837 + - 7.520218866869656 + - 7.178215113921549 + - !!python/tuple + - 4.935604143145498 + - 7.7401612687735035 + - 7.813015652034405 + - 4.812022637505357 + - 7.40288774627268 + - 7.762081157764592 + - 6.336556917779321 + - 6.6297145569490015 + - 7.321309998851759 + - 7.292141457396385 + - 5.164816343523643 + - 7.301829854426138 + - 6.821338446402768 + - !!python/tuple + - 3.8669188400472327 + - 7.613033018939332 + - 7.631585048365653 + - 3.8928644931704417 + - 6.980018894777474 + - 7.597094785756416 + - 5.924069865348857 + - 6.220779832001058 + - 7.120133858904802 + - 7.004482848149167 + - 4.0983748920737835 + - 7.090375642945475 + - 6.4817209278538215 + - !!python/tuple + - 2.792536730119191 + - 7.289149017142871 + - 7.45897523957179 + - 3.0374354280218174 + - 6.549965709882865 + - 7.3243026049691125 + - 5.486342860756696 + - 5.8017165400704265 + - 6.911828336042077 + - 6.679861829838227 + - 3.0878390877256106 + - 6.871658467087767 + - 6.114462022644979 + - !!python/tuple + - 1.7232446011540183 + - 6.9379567895530085 + - 7.228307942546379 + - 2.32255962428285 + - 5.992364811923894 + - 7.032916796266091 + - 5.011521516910021 + - 5.360327295276684 + - 6.704073118312148 + - 6.312330068228066 + - 2.1200919327248924 + - 6.639300432915842 + - 5.685331876567438 + - !!python/tuple + - 1.7232446011540183 + - 6.9379567895530085 + - 7.228307942546379 + - 2.32255962428285 + - 5.992364811923894 + - 7.032916796266091 + - 5.011521516910021 + - 5.360327295276684 + - 6.704073118312148 + - 6.312330068228066 + - 2.1200919327248924 + - 6.639300432915842 + - 5.685331876567438 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.3301401901343475 + - 7.7354357398574916 + - 8.013580167247996 + - 7.24377771019046 + - 8.001685670992119 + - 7.791702628459007 + - 7.600199162754619 + - 7.257961841923434 + - 7.602128908790243 + - 7.762895405908857 + - 7.781639677837153 + - 7.137389081664428 + - 6.928045607142257 + - !!python/tuple + - 6.38163749119872 + - 7.44346010186794 + - 8.027160569520058 + - 6.450997301711311 + - 7.98648280381506 + - 7.577274384662744 + - 7.186576507509185 + - 6.585334161177906 + - 7.264146175249096 + - 7.420977546090043 + - 7.5844769293130465 + - 6.355371783040468 + - 6.014196056611578 + - !!python/tuple + - 5.491381521929953 + - 7.1288613770743385 + - 8.040330106737436 + - 5.641771972278481 + - 7.959240430700212 + - 7.3680083635733 + - 6.305132370874995 + - 6.004652669566161 + - 6.881519933486718 + - 7.133802449114569 + - 7.202241479155815 + - 5.685477708784354 + - 5.32786572902713 + - !!python/tuple + - 4.6654951759928 + - 6.7960837122518525 + - 8.008688884081023 + - 4.7529811943855655 + - 7.919240184526238 + - 7.130886368949676 + - 5.481798321360706 + - 5.425505599833211 + - 6.544546718864425 + - 6.871507520511216 + - 6.78682226265585 + - 5.053278995858294 + - 4.559422175442139 + - !!python/tuple + - 3.7949164579249857 + - 6.429848467590604 + - 7.930784315967021 + - 3.845317476774617 + - 7.863848622626258 + - 6.836779835698781 + - 4.6855612729168294 + - 4.876881431417397 + - 6.136218261176843 + - 6.619166269033187 + - 6.323231327284342 + - 4.455744515495894 + - 3.887766866102437 + - !!python/tuple + - 2.9422601946657987 + - 6.043216036337688 + - 7.801483044901219 + - 3.0301925959599982 + - 7.791898149661408 + - 6.5097923877496555 + - 3.9191186235223254 + - 4.350697666935668 + - 5.71459110051002 + - 6.37094214388543 + - 5.551636404441238 + - 3.905433547682349 + - 3.314741252238265 + - !!python/tuple + - 2.202031397733696 + - 5.629265298067888 + - 7.581200683520321 + - 2.317121284340704 + - 7.701271615544067 + - 5.765118633629525 + - 3.1791724270543464 + - 3.8582728269838764 + - 5.350446515346005 + - 6.108776689842941 + - 4.744677477715834 + - 3.3991339394284483 + - 2.802781949245907 + - !!python/tuple + - 2.5690100335848327 + - 5.149015572819663 + - 7.180395765696412 + - 2.2037224676590643 + - 7.556949628142765 + - 4.801303484562188 + - 2.405064689959735 + - 3.32084577271462 + - 4.917432163140631 + - 5.780835343759064 + - 3.8091067284837816 + - 2.8773882411433553 + - 2.3775928767651777 + - !!python/tuple + - 1.7264432229354019 + - 4.717230034432873 + - 6.724502335019277 + - 2.6407234830327093 + - 7.34342210938904 + - 3.860319348355292 + - 2.186708645778166 + - 2.8311162546654747 + - 4.352987887353826 + - 5.3553895598728145 + - 2.8906166137928033 + - 2.5003770812943853 + - 2.407779648564969 + - !!python/tuple + - 1.7264432229354019 + - 4.717230034432873 + - 6.724502335019277 + - 2.6407234830327093 + - 7.34342210938904 + - 3.860319348355292 + - 2.186708645778166 + - 2.8311162546654747 + - 4.352987887353826 + - 5.3553895598728145 + - 2.8906166137928033 + - 2.5003770812943853 + - 2.407779648564969 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.246984692827794 + - 8.014370556133535 + - 7.9191178722024675 + - 6.847987402190961 + - 8.014370556133535 + - 8.011695193788865 + - 7.397975150000029 + - 7.710253268229086 + - 7.905367531150976 + - 7.595254878399859 + - 7.379862345718304 + - 7.516377557380301 + - 7.072034043588239 + - !!python/tuple + - 6.384493502208851 + - 8.024792877813699 + - 7.808540140159936 + - 5.703001790160595 + - 8.02780478349215 + - 8.022856591935458 + - 6.891172736278908 + - 7.215438009102495 + - 7.822381344765437 + - 7.2536476538210914 + - 6.847405280217483 + - 6.856354867620069 + - 6.305181859899223 + - !!python/tuple + - 5.374763876275274 + - 8.00744344604815 + - 7.611603747148699 + - 4.469502635639227 + - 7.989964754148407 + - 8.009312938920864 + - 6.449762798370627 + - 6.743222335008938 + - 7.643798959216686 + - 6.957951003708972 + - 6.2963004749304226 + - 6.367295696801079 + - 5.7236565020323065 + - !!python/tuple + - 4.3566515555330625 + - 7.917280068830311 + - 7.32059032677555 + - 3.288222944125712 + - 7.905786409452054 + - 7.937101030070607 + - 6.035399357642479 + - 6.26505651631697 + - 7.438657710543877 + - 6.671235839736651 + - 5.675712593392251 + - 5.825220386776563 + - 5.214437781775415 + - !!python/tuple + - 3.362495695833496 + - 7.678567446443601 + - 6.963379305667986 + - 2.2045199870021044 + - 7.776765295337614 + - 7.741911655545487 + - 5.676025627455436 + - 5.841002841407464 + - 7.228351347397806 + - 6.39986125696504 + - 4.821595537985763 + - 5.359346419877175 + - 4.740607819904644 + - !!python/tuple + - 2.266318001338462 + - 7.221135518272131 + - 6.499365259363899 + - 2.3002774492366687 + - 7.571963356217932 + - 7.4504363571916254 + - 5.2178446992329155 + - 5.3665791243972905 + - 6.915533648142989 + - 6.104303033279067 + - 3.7434133866621497 + - 4.830538519357953 + - 4.321753987722479 + - !!python/tuple + - 2.2471559141638195 + - 6.633660566188992 + - 6.019430824223502 + - 1.7941069673793415 + - 7.320921363164691 + - 7.122255027387693 + - 4.606867452704608 + - 4.772342455566525 + - 6.590598026719922 + - 5.441324898066295 + - 2.7553094141645746 + - 4.216953236784848 + - 3.711126958193988 + - !!python/tuple + - 2.2471559141638195 + - 6.633660566188992 + - 6.019430824223502 + - 1.7941069673793415 + - 7.320921363164691 + - 7.122255027387693 + - 4.606867452704608 + - 4.772342455566525 + - 6.590598026719922 + - 5.441324898066295 + - 2.7553094141645746 + - 4.216953236784848 + - 3.711126958193988 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.955290102021192 + - 7.770238927944729 + - 7.639200476327144 + - 7.487238279000251 + - 8.016895311306566 + - 7.233323685054911 + - 7.254813915874231 + - 7.790756678823289 + - 7.245384485000925 + - 7.79707292572153 + - 7.327671548822557 + - 7.862624832202966 + - 7.559539271657743 + - !!python/tuple + - 6.0607243141957685 + - 7.567056682673521 + - 7.32071615217045 + - 7.033668134736668 + - 8.032404407009686 + - 6.576754793594293 + - 6.631266051243892 + - 7.617679273236673 + - 6.397967654576736 + - 7.591745868837174 + - 6.293537943362151 + - 7.7494712922432685 + - 7.161155794914452 + - !!python/tuple + - 5.177449410877264 + - 7.364789047981307 + - 6.988582831171938 + - 6.534156634864189 + - 8.049000207154254 + - 5.948985230066583 + - 5.965100024708752 + - 7.4495577892512115 + - 5.57055776464073 + - 7.254362849280184 + - 5.31346824999952 + - 7.640015966567109 + - 6.7348631560805785 + - !!python/tuple + - 4.2799449239293486 + - 7.157864162958879 + - 6.659922362117445 + - 6.028774543522884 + - 8.063920645851388 + - 5.379938342414187 + - 5.339237090424968 + - 7.024730780750882 + - 4.8268507603064466 + - 6.858670098732834 + - 4.360310925275031 + - 7.4627017420596 + - 6.24252428377869 + - !!python/tuple + - 3.377130015390111 + - 6.880293001074548 + - 6.365083107399648 + - 5.4553830253296125 + - 8.053877195335238 + - 4.870509634194401 + - 4.7551553184957465 + - 6.6080706008007635 + - 4.045624636305858 + - 6.439874018232025 + - 3.447192475750099 + - 7.239857197766864 + - 5.74387975849994 + - !!python/tuple + - 2.253727316428296 + - 6.522605820168021 + - 6.1348589978287364 + - 4.830955310722962 + - 8.020699416909157 + - 4.403440263773607 + - 4.270868195001665 + - 6.110571881106262 + - 3.4814420563343043 + - 5.939367394309214 + - 2.803365994952419 + - 6.923115342028596 + - 5.1256785091881785 + - !!python/tuple + - 2.2348384343238816 + - 5.93114376746879 + - 5.870848790347191 + - 4.006566357046456 + - 7.964490740057614 + - 3.7959796553311094 + - 3.849725192919907 + - 5.339613099575407 + - 3.0322511932807044 + - 5.418819692013395 + - 2.314078201041562 + - 6.234973643009895 + - 4.3700947934082075 + - !!python/tuple + - 2.124046377482419 + - 5.4222825234845615 + - 5.454705352233763 + - 3.2527196656218202 + - 7.7921244820542475 + - 3.027668479297682 + - 3.4857668838292715 + - 4.549540436063562 + - 2.7913592692368527 + - 4.8411610625894586 + - 2.7472425056882788 + - 5.534607310866955 + - 3.6347242884807676 + - !!python/tuple + - 2.124046377482419 + - 5.4222825234845615 + - 5.454705352233763 + - 3.2527196656218202 + - 7.7921244820542475 + - 3.027668479297682 + - 3.4857668838292715 + - 4.549540436063562 + - 2.7913592692368527 + - 4.8411610625894586 + - 2.7472425056882788 + - 5.534607310866955 + - 3.6347242884807676 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 7.229689614536666 + - 7.953483262829214 + - 7.481206476817891 + - 7.242397298339199 + - 8.017799862544472 + - 7.4409756810824375 + - 7.216396683858958 + - 7.667914979093885 + - 6.932601088360686 + - 7.953848490302911 + - 7.762833689532948 + - 7.77756143889241 + - 7.473680024299587 + - !!python/tuple + - 6.460924999348439 + - 7.870056792211918 + - 6.842613671081866 + - 6.564891341860114 + - 8.036446672739547 + - 6.6307414377007134 + - 6.5377666179314335 + - 7.353634152983496 + - 6.004201587281261 + - 7.923165013123139 + - 7.405502520537866 + - 7.533533352876928 + - 6.9550423081276715 + - !!python/tuple + - 5.755152094852614 + - 7.786591222387227 + - 6.358654417327796 + - 5.652170833323596 + - 8.054785902410348 + - 5.98706272618232 + - 5.823627099823014 + - 6.9916694260249335 + - 5.227694999711112 + - 7.860437605945752 + - 6.983840157067022 + - 7.103562572212364 + - 6.320692826454791 + - !!python/tuple + - 5.0521504908414165 + - 7.656690305138088 + - 5.777845781897646 + - 4.801052769286332 + - 8.073916882224339 + - 5.183646827127563 + - 5.257231205190037 + - 6.566096770578212 + - 4.590288596162966 + - 7.785751553605305 + - 6.55767783566443 + - 6.622412337792277 + - 5.646578912633884 + - !!python/tuple + - 4.321390242137375 + - 7.498603877692259 + - 5.331086568375626 + - 3.8670145770469486 + - 8.091829301968248 + - 4.540740103638882 + - 4.501293556702365 + - 6.16338018430879 + - 4.095520125561063 + - 7.6620109996723125 + - 6.171411389641913 + - 6.166932728985367 + - 4.868804068449502 + - !!python/tuple + - 3.488535149960931 + - 7.297529190711305 + - 4.8026358266547255 + - 3.080014378817299 + - 8.090960418969624 + - 3.6736645107448362 + - 3.884233725667369 + - 5.753764993421545 + - 3.6770578602979267 + - 7.547159741556281 + - 5.713382295244429 + - 5.736173653884583 + - 4.173622021944135 + - !!python/tuple + - 2.780300680400861 + - 7.057754427953537 + - 4.348452097622445 + - 2.2867713840201853 + - 8.058619017810203 + - 2.8729424071353633 + - 3.298427055145344 + - 5.353224190144067 + - 3.3157426891531605 + - 7.080374584537245 + - 5.249718232724614 + - 5.296127867094186 + - 3.335452138241528 + - !!python/tuple + - 2.0665029337368033 + - 6.6994727561277845 + - 3.9083867107248524 + - 2.3662726093927473 + - 7.984839660599903 + - 2.0630653393129883 + - 2.590521777335603 + - 4.902605685262446 + - 2.974300833794189 + - 6.447476363834634 + - 4.6716781046635685 + - 4.799783685972701 + - 2.4993975832387294 + - !!python/tuple + - 2.0665029337368033 + - 6.6994727561277845 + - 3.9083867107248524 + - 2.3662726093927473 + - 7.984839660599903 + - 2.0630653393129883 + - 2.590521777335603 + - 4.902605685262446 + - 2.974300833794189 + - 6.447476363834634 + - 4.6716781046635685 + - 4.799783685972701 + - 2.4993975832387294 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.935437491220769 + - 8.012840677763819 + - 7.823836553655573 + - 7.153193669163444 + - 7.867699656347041 + - 7.366672687199731 + - 7.823612073903383 + - 7.077268666178649 + - 7.425765605042366 + - 8.012840677763819 + - 7.352441564320984 + - 7.848415207674447 + - 7.787739125309694 + - !!python/tuple + - 5.788176033629267 + - 8.025800221713453 + - 7.663467346220699 + - 6.3141153349029455 + - 7.726765042660216 + - 6.787299334481358 + - 7.662729689600653 + - 6.232863130162577 + - 6.900530884392158 + - 7.692771499703039 + - 6.7600312700112815 + - 7.710583147112708 + - 7.454348750261966 + - !!python/tuple + - 4.720972756706299 + - 8.038788923092255 + - 7.512223695705155 + - 5.296316596356801 + - 7.585890854839043 + - 6.257518373033845 + - 7.516179651839877 + - 5.395250936987708 + - 6.420242131992397 + - 7.399972953492472 + - 6.218336914901951 + - 7.526439081203858 + - 7.087218043274577 + - !!python/tuple + - 3.649527163263671 + - 8.052659237712689 + - 7.341165181062425 + - 4.298656183384702 + - 7.448316470145716 + - 5.738959824336737 + - 7.257805604756356 + - 4.627335068630045 + - 5.953819504384384 + - 7.053897525913615 + - 5.688168185453455 + - 7.346270132111439 + - 6.605466001485339 + - !!python/tuple + - 2.5551877654363193 + - 8.067348268626574 + - 7.072227268622459 + - 3.352208192662254 + - 7.279364780478084 + - 5.227340016279953 + - 7.0003265673773125 + - 3.929137175463065 + - 5.462942098090668 + - 6.71107665121215 + - 5.072516311384109 + - 7.170565947778234 + - 6.134665735857252 + - !!python/tuple + - 1.6737664290263017 + - 8.056425733602785 + - 6.795965244586768 + - 2.4928299125258855 + - 7.0677842201587175 + - 4.750277610390752 + - 6.749415490441201 + - 2.826336538858611 + - 5.024489619361975 + - 6.408007049786611 + - 4.4928631007747 + - 6.949940690192153 + - 5.701214702697997 + - !!python/tuple + - 1.6737664290263017 + - 8.056425733602785 + - 6.795965244586768 + - 2.4928299125258855 + - 7.0677842201587175 + - 4.750277610390752 + - 6.749415490441201 + - 2.826336538858611 + - 5.024489619361975 + - 6.408007049786611 + - 4.4928631007747 + - 6.949940690192153 + - 5.701214702697997 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.9540461805656975 + - 8.013449968710818 + - 7.3410884993217085 + - 7.722225422183227 + - 7.911163724956371 + - 6.868717258254943 + - 7.640153435474852 + - 7.732012692201308 + - 7.612570669288216 + - 8.013449968710818 + - 7.411288582881172 + - 7.446731982382459 + - 7.679830776696326 + - !!python/tuple + - 5.771197275739372 + - 8.02702244145269 + - 6.7475060351688985 + - 7.442786850209816 + - 7.786248771949349 + - 5.878423873109656 + - 7.100936140136144 + - 7.487554139049203 + - 7.258643834935593 + - 7.888430717013216 + - 6.8729480616331955 + - 6.94085867998254 + - 7.309903950335676 + - !!python/tuple + - 4.540210490745744 + - 8.041255246766742 + - 6.179761556571942 + - 7.108082162839536 + - 7.645168362357784 + - 4.964078889222542 + - 6.572796298910946 + - 7.254101953298421 + - 6.8217986049351795 + - 7.769497690845487 + - 6.328497333327378 + - 6.456969670934106 + - 6.956079266446052 + - !!python/tuple + - 3.3896105025487504 + - 8.055802664765192 + - 5.648274372741334 + - 6.79245639524769 + - 7.509766113019852 + - 4.1142389991170525 + - 5.882008826220269 + - 7.020665378770829 + - 6.414609887684598 + - 7.636322319165785 + - 5.818513606749334 + - 6.003674340966156 + - 6.345776206704981 + - !!python/tuple + - 2.2992243556250456 + - 8.071406416780077 + - 5.133637796628692 + - 6.458448779445414 + - 7.367720623555461 + - 3.3538482441410746 + - 5.154052708406618 + - 6.764857011310897 + - 5.79316014942801 + - 7.495720230120304 + - 5.298672022090906 + - 5.556694581068903 + - 5.74188985526376 + - !!python/tuple + - 1.7601874781576483 + - 8.057330976091302 + - 4.658190584742505 + - 6.058842961276592 + - 7.190182039927653 + - 2.7473051122028087 + - 4.275285623408491 + - 6.425091054077253 + - 5.142734726991915 + - 6.854537024184646 + - 4.708162845004996 + - 5.015499169667052 + - 4.993119826966922 + - !!python/tuple + - 1.7601874781576483 + - 8.057330976091302 + - 4.658190584742505 + - 6.058842961276592 + - 7.190182039927653 + - 2.7473051122028087 + - 4.275285623408491 + - 6.425091054077253 + - 5.142734726991915 + - 6.854537024184646 + - 4.708162845004996 + - 5.015499169667052 + - 4.993119826966922 +- - !!python/tuple + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - 8.0 + - !!python/tuple + - 6.839331564936397 + - 8.016972028768533 + - 7.474640403485695 + - 7.449708393073218 + - 8.016972028768533 + - 7.3369552943798 + - 7.347046244447208 + - 7.486290038232997 + - 7.61381792697021 + - 7.9496184415778695 + - 7.469791858531191 + - 7.309260403654772 + - 7.81654004670093 + - !!python/tuple + - 5.7376053360264905 + - 8.03450507991719 + - 6.983379584713113 + - 6.7872565988005205 + - 8.03450507991719 + - 6.716636591071277 + - 6.54241987268138 + - 7.005951218139811 + - 7.255472131349322 + - 7.784909369445266 + - 6.974852922163332 + - 6.692127528648856 + - 7.569351189268636 + - !!python/tuple + - 4.793580061101436 + - 8.039174861157985 + - 6.568308538383022 + - 6.006694660079066 + - 8.050768579301238 + - 6.192559374681595 + - 5.570118913569855 + - 6.600114628456313 + - 6.936511460911313 + - 7.641971734068939 + - 6.560808825794631 + - 6.191309834680295 + - 6.938620118387717 + - !!python/tuple + - 3.829374507728192 + - 7.991423065861007 + - 6.183678920409293 + - 5.300869133608451 + - 8.066949226066807 + - 5.698696528496909 + - 4.599611734762099 + - 6.006099025967561 + - 6.623385672916562 + - 7.488819369997781 + - 6.167486898992211 + - 5.72213886884817 + - 6.3167923152542595 + - !!python/tuple + - 2.9440439321413696 + - 7.699667773605444 + - 5.757269477307433 + - 4.644577212946577 + - 8.084678018676483 + - 5.113193984101318 + - 3.7043128362375 + - 5.387674477190877 + - 6.353798371216585 + - 7.34987113166722 + - 5.614109085929773 + - 5.2650372661468 + - 5.696925282807459 + - !!python/tuple + - 2.2183421859126713 + - 7.371168939431519 + - 5.310235589091821 + - 3.8925666895309905 + - 8.098017208874287 + - 4.50641863415942 + - 2.887651881200005 + - 4.699373082943752 + - 6.0709639610582755 + - 7.218059015139269 + - 5.034990225272787 + - 4.819153491610921 + - 5.019077622907153 + - !!python/tuple + - 2.702077613338665 + - 6.922391008657525 + - 4.85250139054639 + - 2.8482247187901124 + - 8.073160478526956 + - 3.8975822153815036 + - 2.327048495420396 + - 4.09498208430968 + - 5.765187080916695 + - 7.097769394330568 + - 4.291613021174676 + - 4.441268057401882 + - 4.378619023761661 + - !!python/tuple + - 2.1280705627060157 + - 6.46040398638751 + - 4.376042780491736 + - 1.8500933652762583 + - 8.012705165024633 + - 3.3156046815929594 + - 2.203682905296039 + - 3.5466630737836407 + - 5.440729207262975 + - 6.9045033843462535 + - 3.505768178062132 + - 4.110730251986428 + - 3.538293271703186 + - !!python/tuple + - 2.1280705627060157 + - 6.46040398638751 + - 4.376042780491736 + - 1.8500933652762583 + - 8.012705165024633 + - 3.3156046815929594 + - 2.203682905296039 + - 3.5466630737836407 + - 5.440729207262975 + - 6.9045033843462535 + - 3.505768178062132 + - 4.110730251986428 + - 3.538293271703186 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.73806332172355 + - 48.30537274657317 + - 44.94667151261732 + - 41.637418608834295 + - 38.493698704466595 + - 35.59342271980632 + - 35.59342271980632 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.13517983904042 + - 47.34465885233133 + - 43.69596080977635 + - 40.15155048047032 + - 36.76818416498971 + - 36.76818416498971 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.653208526830525 + - 47.11152686600205 + - 43.65460654927291 + - 40.37432384330744 + - 37.21345720567094 + - 34.29773702735223 + - 34.29773702735223 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 3412.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 51.19439324479615 + - 47.54313645411606 + - 43.76523545590212 + - 40.100037449833145 + - 36.49840042853828 + - 33.11337995510562 + - 29.925931142655518 + - 27.894395446561557 + - 27.317004077128537 + - 27.317004077128537 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.19001566010058 + - 46.23479783586531 + - 43.36152292952557 + - 40.50442595195895 + - 37.606928213791214 + - 34.6389368033125 + - 31.889208326244106 + - 31.889208326244106 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 50.89571857685169 + - 47.74475431087356 + - 44.61379525245542 + - 41.33898909813086 + - 38.10437156716907 + - 34.726344288488356 + - 31.464068878050483 + - 28.549261248855345 + - 28.549261248855345 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 48.6423475582648 + - 45.40630383942084 + - 42.06113015329236 + - 38.72895513669779 + - 35.57348383793662 + - 32.5401939352943 + - 29.69497124401232 + - 27.279314587464 + - 27.279314587464 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.763505327787215 + - 46.34806091687874 + - 42.99586058610319 + - 39.75814423102677 + - 36.59771873130756 + - 33.84220349422237 + - 33.84220349422237 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 55.43929279423539 + - 52.021603416445004 + - 48.63004678667651 + - 45.21679468824769 + - 41.873631937597175 + - 38.47351327472907 + - 38.47351327472907 +- !!python/tuple + - !!python/tuple + - 10.0 + - 280.0 + - 577.0 + - 901.0 + - 1252.0 + - 1630.0 + - 2035.0 + - 2467.0 + - 2926.0 + - 10000.0 + - !!python/tuple + - 55.228104638490976 + - 49.32669138871955 + - 45.70462498657198 + - 42.036751155604996 + - 38.50669619142839 + - 35.14484496422466 + - 31.97371023475929 + - 29.821280342886052 + - 27.286158547683954 + - 27.286158547683954 +problem_name: SAN-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8749586635218993 + - 0.7519720916522726 + - 0.631636412786018 + - 0.5130723706226628 + - 0.40043905122143575 + - 0.29652785007463645 + - 0.29652785007463645 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8533585305798932 + - 0.717551596762445 + - 0.5868259009220631 + - 0.45983662934125746 + - 0.33861724897170553 + - 0.33861724897170553 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8360904435995793 + - 0.70919893485946 + - 0.585344258863108 + - 0.46781816207757326 + - 0.35457050884772867 + - 0.25010597252790434 + - 0.25010597252790434 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 0.3412 + - 1.0 + - !!python/tuple + - 1.0 + - 0.855480030791809 + - 0.7246626600237585 + - 0.5893078756465449 + - 0.45799101846955703 + - 0.32895142673519745 + - 0.20767278112999435 + - 0.09347274070369477 + - 0.02068680051378222 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7836671124767838 + - 0.6777874529578681 + - 0.5748436474987156 + - 0.47247946550290704 + - 0.36866780347984923 + - 0.2623304914145797 + - 0.16381311224412654 + - 0.16381311224412654 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8447791031344483 + - 0.7318862324627686 + - 0.6197101091481491 + - 0.5023802264684994 + - 0.3864902233548458 + - 0.26546213020408904 + - 0.14858119950535956 + - 0.04414935803114232 + - 0.04414935803114232 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7640452383542736 + - 0.6481041377255281 + - 0.5282531243706755 + - 0.4088678278550904 + - 0.29581347903699634 + - 0.18713665004655045 + - 0.08519790044308108 + - -0.0013503405063399988 + - -0.0013503405063399988 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8042141226681527 + - 0.6818454470439279 + - 0.5617426827904817 + - 0.44574165488553336 + - 0.3325098067622023 + - 0.23378509932806865 + - 0.23378509932806865 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0075664574845453 + - 0.8851173490992771 + - 0.7636045258298337 + - 0.6413143964626739 + - 0.5215354309825925 + - 0.39971584685716693 + - 0.39971584685716693 +- !!python/tuple + - !!python/tuple + - 0.001 + - 0.028 + - 0.0577 + - 0.0901 + - 0.1252 + - 0.163 + - 0.2035 + - 0.2467 + - 0.2926 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7885639358148135 + - 0.6587923994261112 + - 0.5273796726902673 + - 0.4009047256914632 + - 0.2804561887442112 + - 0.16684064991966208 + - 0.08972330776609377 + - -0.0011051348325290776 + - -0.0011051348325290776 +solver_name: STRONG diff --git a/test/expected_results/SSCONT1_ADAM.yaml b/test/expected_results/SSCONT1_ADAM.yaml new file mode 100644 index 000000000..4dc636579 --- /dev/null +++ b/test/expected_results/SSCONT1_ADAM.yaml @@ -0,0 +1,753 @@ +all_est_objectives: +- - 617.4446810196645 + - 617.2231745820999 + - 617.2141699156723 + - 616.9578702355143 + - 616.6059420560628 + - 616.1230598925825 + - 616.1796604132157 + - 616.1796604132157 +- - 619.9748557704096 + - 619.2089279736241 + - 618.7499457463738 + - 618.3661891702187 + - 618.0474696764476 + - 617.5040078685055 + - 617.0969972586286 + - 617.0969972586286 +- - 620.1266657075832 + - 620.249029904221 + - 619.5547960833508 + - 619.382403007186 + - 619.3136879891651 + - 619.3136879891651 +- - 619.487755405019 + - 619.3996418346168 + - 619.5934914838558 + - 618.5168586887602 + - 618.1228205128441 + - 617.8179198013993 + - 617.5820642732305 + - 617.5820642732305 +- - 619.1948680580867 + - 619.0486718937447 + - 619.2785998850413 + - 619.3179377694094 + - 619.2991303988875 + - 619.1786251908671 + - 619.0745772864465 + - 619.0745772864465 +- - 616.3835575737073 + - 616.740831550961 + - 616.3257418557364 + - 615.9739459578509 + - 616.0317223706706 + - 615.7115174827296 + - 615.7115174827296 +- - 620.9802638572587 + - 620.6775140283952 + - 620.1658069273749 + - 620.2806823659739 + - 619.8740844743951 + - 620.3497356207132 + - 620.0965492723011 + - 620.0965492723011 +- - 620.2623512259908 + - 620.3284274310171 + - 620.170272163106 + - 620.2580883330983 + - 619.9509188697716 + - 619.6611903090476 + - 619.6611903090476 +- - 625.9806452481811 + - 626.403763221915 + - 625.9231539342788 + - 625.7226582353519 + - 624.697629003503 + - 624.1799769580731 + - 623.7553041833362 + - 623.7553041833362 +- - 615.9747313513403 + - 616.3849206034566 + - 615.6137405128155 + - 615.7771499317867 + - 615.2620450857162 + - 614.6857518753121 + - 614.7830830747962 + - 614.7830830747962 +all_intermediate_budgets: +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000110613 + - 599.5000000081036 + - !!python/tuple + - 599.0000848587781 + - 599.0036855781585 + - !!python/tuple + - 598.500233148688 + - 598.5283960523875 + - !!python/tuple + - 598.0004142824321 + - 598.1962889559259 + - !!python/tuple + - 597.5005732251103 + - 597.8765810889955 + - !!python/tuple + - 597.0009056240992 + - 597.5277050755286 + - !!python/tuple + - 597.0009056240992 + - 597.5277050755286 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000106548 + - 599.5000000069507 + - !!python/tuple + - 598.9999793245573 + - 599.0073258918422 + - !!python/tuple + - 598.4999507534643 + - 598.5869982260905 + - !!python/tuple + - 597.9999369081033 + - 598.1837008487943 + - !!python/tuple + - 597.4999946200007 + - 597.7854826371067 + - !!python/tuple + - 597.0001798175526 + - 597.356950021613 + - !!python/tuple + - 597.0001798175526 + - 597.356950021613 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000106439 + - 600.4999999973123 + - !!python/tuple + - 598.0001122516425 + - 601.4439703205642 + - !!python/tuple + - 597.5002662928774 + - 601.5451399240679 + - !!python/tuple + - 597.000541764238 + - 601.6034739070757 + - !!python/tuple + - 597.000541764238 + - 601.6034739070757 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.500000010782 + - 599.5000000048257 + - !!python/tuple + - 599.0000794382208 + - 598.9994997723954 + - !!python/tuple + - 598.5001772433972 + - 598.5143649336619 + - !!python/tuple + - 598.0003482521668 + - 598.0588411071055 + - !!python/tuple + - 597.5006141233453 + - 597.8652770976229 + - !!python/tuple + - 597.000958092979 + - 597.8274615873223 + - !!python/tuple + - 597.000958092979 + - 597.8274615873223 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000108216 + - 600.4999999946197 + - !!python/tuple + - 599.0001384485261 + - 600.9713236765305 + - !!python/tuple + - 598.500317967374 + - 601.2182769831927 + - !!python/tuple + - 598.0005232924763 + - 601.3940818069408 + - !!python/tuple + - 597.5007521919945 + - 601.5582746713178 + - !!python/tuple + - 597.0010282598391 + - 601.8000046600029 + - !!python/tuple + - 597.0010282598391 + - 601.8000046600029 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000110132 + - 599.5000000060979 + - !!python/tuple + - 598.9999825055289 + - 599.0203657389802 + - !!python/tuple + - 598.4999610281761 + - 598.5362534599152 + - !!python/tuple + - 598.0000645677142 + - 598.0477005399413 + - !!python/tuple + - 597.0006560599502 + - 597.0778790205105 + - !!python/tuple + - 597.0006560599502 + - 597.0778790205105 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000113104 + - 599.5000000324784 + - !!python/tuple + - 599.0000219944855 + - 599.0285304279078 + - !!python/tuple + - 598.500095037853 + - 598.6241906499826 + - !!python/tuple + - 598.0000981418592 + - 598.1880238534483 + - !!python/tuple + - 597.5003232253913 + - 597.8077081611476 + - !!python/tuple + - 597.0009277934951 + - 597.4286114173113 + - !!python/tuple + - 597.0009277934951 + - 597.4286114173113 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000108464 + - 599.5000000070715 + - !!python/tuple + - 599.0000496244954 + - 599.007577540642 + - !!python/tuple + - 598.4999905786697 + - 598.5577909296176 + - !!python/tuple + - 597.9999672369455 + - 598.088792655785 + - !!python/tuple + - 597.4999378361583 + - 597.7335799885267 + - !!python/tuple + - 597.4999378361583 + - 597.7335799885267 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000116346 + - 599.5000000022575 + - !!python/tuple + - 598.9997940694826 + - 599.0579904833044 + - !!python/tuple + - 598.4992443011204 + - 598.6169396732552 + - !!python/tuple + - 597.998643610039 + - 598.1550342095941 + - !!python/tuple + - 597.4981017223334 + - 597.7249841407158 + - !!python/tuple + - 596.997713328104 + - 597.3196267624867 + - !!python/tuple + - 596.997713328104 + - 597.3196267624867 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5000000108854 + - 600.4999999113443 + - !!python/tuple + - 598.9999355896637 + - 600.1564754116206 + - !!python/tuple + - 598.4999561931775 + - 599.8369245005092 + - !!python/tuple + - 598.0001133522595 + - 599.4965467140914 + - !!python/tuple + - 597.5004350266794 + - 599.1401685856582 + - !!python/tuple + - 597.0008392492098 + - 598.7431310510749 + - !!python/tuple + - 597.0008392492098 + - 598.7431310510749 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 617.2231745820999 + - 617.2141699156723 + - 616.9578702355143 + - 616.6059420560628 + - 616.1230598925825 + - 616.1796604132157 + - 616.1796604132157 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.2089279736241 + - 618.7499457463738 + - 618.3661891702187 + - 618.0474696764476 + - 617.5040078685055 + - 617.0969972586286 + - 617.0969972586286 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.249029904221 + - 619.5547960833508 + - 619.382403007186 + - 619.3136879891651 + - 619.3136879891651 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.3996418346168 + - 619.5934914838558 + - 618.5168586887602 + - 618.1228205128441 + - 617.8179198013993 + - 617.5820642732305 + - 617.5820642732305 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.0486718937447 + - 619.2785998850413 + - 619.3179377694094 + - 619.2991303988875 + - 619.1786251908671 + - 619.0745772864465 + - 619.0745772864465 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 616.740831550961 + - 616.3257418557364 + - 615.9739459578509 + - 616.0317223706706 + - 615.7115174827296 + - 615.7115174827296 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.6775140283952 + - 620.1658069273749 + - 620.2806823659739 + - 619.8740844743951 + - 620.3497356207132 + - 620.0965492723011 + - 620.0965492723011 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.3284274310171 + - 620.170272163106 + - 620.2580883330983 + - 619.9509188697716 + - 619.6611903090476 + - 619.6611903090476 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 626.403763221915 + - 625.9231539342788 + - 625.7226582353519 + - 624.697629003503 + - 624.1799769580731 + - 623.7553041833362 + - 623.7553041833362 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 616.3849206034566 + - 615.6137405128155 + - 615.7771499317867 + - 615.2620450857162 + - 616.3447706970799 + - 614.7830830747962 + - 614.7830830747962 +problem_name: SSCONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7986140933343711 + - 0.7904273655233014 + - 0.5574086594566586 + - 0.23744786608528526 + - -0.20157170993389423 + - -0.1501124959679822 + - -0.1501124959679822 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 2.6039916325304975 + - 2.186701042719698 + - 1.8378029841458852 + - 1.5480343664442133 + - 1.0539378962292145 + - 0.6838980834192818 + - 0.6838980834192818 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 3.54961593411245 + - 2.918442822436538 + - 2.7617090663975135 + - 2.6992357750664797 + - 2.6992357750664797 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 2.777382005433379 + - 2.9536233273472665 + - 1.9747864412948413 + - 1.6165407117792239 + - 1.339335647707864 + - 1.1249040496712115 + - 1.1249040496712115 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 2.4582924090675604 + - 2.6673348978737246 + - 2.703099526644174 + - 2.686000523083939 + - 2.576441402175576 + - 2.48184468616679 + - 2.48184468616679 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.36008467758580925 + - -0.01730035708616267 + - -0.337140884683752 + - -0.2846125906643053 + - -0.575731676799076 + - -0.575731676799076 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 3.9391787151648003 + - 3.4739525139797074 + - 3.578393245410512 + - 3.208728661643911 + - 3.6411740497373812 + - 3.4109858760168597 + - 3.4109858760168597 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 3.621801388840757 + - 3.4780121501513412 + - 3.557851540862679 + - 3.27858380692155 + - 3.015172731695694 + - 3.015172731695694 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 9.145284227534304 + - 8.708331070747091 + - 8.526047392877961 + - 7.594126661885807 + - 7.123495525145909 + - 6.7373978897141455 + - 6.7373978897141455 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.0365028907833351 + - -0.6646270784572167 + - -0.5160609493684898 + - -0.9843762615296313 + - 0.0 + - -1.4198317719338842 + - -1.4198317719338842 +solver_name: ADAM diff --git a/test/expected_results/SSCONT1_ALOE.yaml b/test/expected_results/SSCONT1_ALOE.yaml new file mode 100644 index 000000000..ad5a278dc --- /dev/null +++ b/test/expected_results/SSCONT1_ALOE.yaml @@ -0,0 +1,771 @@ +all_est_objectives: +- - 617.4446810196645 + - 617.0078494177988 + - 616.7887804228927 + - 616.7592157378537 + - 616.3528619236422 + - 616.4879791181116 + - 615.9450030389337 + - 615.9450030389337 +- - 619.9748557704096 + - 619.7678881568795 + - 619.4358326707788 + - 618.4934308532243 + - 617.7947757209155 + - 617.1740165563033 + - 615.8041058873505 + - 615.8041058873505 +- - 620.1266657075832 + - 619.9373171261498 + - 619.6725201568258 + - 619.3615042652219 + - 619.2429695609063 + - 618.8562186450912 + - 618.2380448546619 + - 618.2380448546619 +- - 619.487755405019 + - 618.6566886006225 + - 618.4811576556797 + - 618.130520007273 + - 616.2854955053102 + - 615.4455319728355 + - 615.4455319728355 +- - 619.1948680580867 + - 619.3271027696292 + - 619.5107677112884 + - 619.6241720601066 + - 619.1905819602725 + - 618.6821766942423 + - 618.0719973257849 + - 618.0719973257849 +- - 616.3835575737073 + - 616.0639065845859 + - 616.3110246660183 + - 616.3192735197345 + - 615.8902974151131 + - 614.6306501010099 + - 613.7168869420761 + - 613.7168869420761 +- - 620.9802638572587 + - 620.7509863028193 + - 620.4063013686404 + - 620.0521776950313 + - 619.7533597159438 + - 619.1657784188911 + - 618.8459664665426 + - 618.8459664665426 +- - 620.2623512259908 + - 619.9923733180726 + - 620.4682148533436 + - 621.036420758671 + - 620.0049219819031 + - 617.5030619000535 + - 617.5030619000535 +- - 625.9806452481811 + - 625.6238249240989 + - 624.8366695369815 + - 625.3413340835708 + - 624.6606348469278 + - 623.316327266881 + - 622.4325375755661 + - 622.4325375755661 +- - 615.9747313513403 + - 615.932118036814 + - 615.2061809663727 + - 615.4799411908366 + - 614.8269836417836 + - 614.5526452860082 + - 613.4829627523372 + - 613.4829627523372 +all_intermediate_budgets: +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +- - 0 + - 180 + - 330 + - 480 + - 630 + - 780 + - 930 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5478845471162 + - 597.6234948266642 + - !!python/tuple + - 598.9854931466449 + - 597.7286013820235 + - !!python/tuple + - 598.2840709663379 + - 597.5139554739117 + - !!python/tuple + - 597.4119524198284 + - 597.4969254527642 + - !!python/tuple + - 596.3275423764767 + - 597.1705808410154 + - !!python/tuple + - 594.9803976786563 + - 596.752406551361 + - !!python/tuple + - 594.9803976786563 + - 596.752406551361 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.531122964027 + - 599.8394100357305 + - !!python/tuple + - 598.9408094549597 + - 599.6802392753375 + - !!python/tuple + - 598.2055754970447 + - 599.3567076404456 + - !!python/tuple + - 597.2884980466815 + - 598.5707240416498 + - !!python/tuple + - 596.1486891857114 + - 598.267916128724 + - !!python/tuple + - 594.7305408946756 + - 597.0258174722408 + - !!python/tuple + - 594.7305408946756 + - 597.0258174722408 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.530473384621 + - 600.0406952841536 + - !!python/tuple + - 598.9450014406689 + - 600.024709781736 + - !!python/tuple + - 598.2157850030945 + - 600.0462266858259 + - !!python/tuple + - 597.3077727087261 + - 600.405601676468 + - !!python/tuple + - 596.1757185511774 + - 600.6281605255713 + - !!python/tuple + - 594.7675020013165 + - 600.6200590428384 + - !!python/tuple + - 594.7675020013165 + - 600.6200590428384 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5364840109689 + - 597.7313724173246 + - !!python/tuple + - 598.961641223153 + - 597.9097128292208 + - !!python/tuple + - 598.2440936270516 + - 597.8325866327862 + - !!python/tuple + - 596.2327582189785 + - 596.2600433171292 + - !!python/tuple + - 594.8477444327691 + - 595.5850078833496 + - !!python/tuple + - 594.8477444327691 + - 595.5850078833496 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5384149694582 + - 600.6518052743464 + - !!python/tuple + - 598.9667974757788 + - 601.0970571205571 + - !!python/tuple + - 598.2518848163102 + - 601.7187171569631 + - !!python/tuple + - 597.3591929524074 + - 601.8150508842651 + - !!python/tuple + - 596.2450595209934 + - 601.8458886552901 + - !!python/tuple + - 594.8552344292754 + - 602.8368380047193 + - !!python/tuple + - 594.8552344292754 + - 602.8368380047193 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5459986101321 + - 599.6019366179091 + - !!python/tuple + - 598.9778900877559 + - 599.009296395333 + - !!python/tuple + - 598.2684624768128 + - 598.1128362511924 + - !!python/tuple + - 597.3874136647935 + - 597.0994084320916 + - !!python/tuple + - 596.293950047366 + - 595.9809368384784 + - !!python/tuple + - 594.9238067718225 + - 592.6876740708265 + - !!python/tuple + - 594.9238067718225 + - 592.6876740708265 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.557802471425 + - 599.6644445718039 + - !!python/tuple + - 599.0058115189177 + - 598.8271434616644 + - !!python/tuple + - 598.3113834033124 + - 597.9532148655614 + - !!python/tuple + - 597.4563611622085 + - 598.0828747862188 + - !!python/tuple + - 596.3935455764572 + - 598.0216610726661 + - !!python/tuple + - 595.0734532081892 + - 597.3116744487442 + - !!python/tuple + - 595.0734532081892 + - 597.3116744487442 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5388270369399 + - 599.5305308550694 + - !!python/tuple + - 598.9644526495206 + - 598.2649849386937 + - !!python/tuple + - 597.3277323381792 + - 595.472665863474 + - !!python/tuple + - 596.1950491111664 + - 593.777355332347 + - !!python/tuple + - 594.7997571144942 + - 589.8942858072044 + - !!python/tuple + - 594.7997571144942 + - 589.8942858072044 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5701319575629 + - 598.5320268617802 + - !!python/tuple + - 599.0163418710342 + - 597.6799022987589 + - !!python/tuple + - 598.327491604753 + - 596.3512375416697 + - !!python/tuple + - 597.4705971433025 + - 595.6055070851947 + - !!python/tuple + - 596.4088439531095 + - 594.7677070335094 + - !!python/tuple + - 595.0797881503254 + - 593.4464465618212 + - !!python/tuple + - 595.0797881503254 + - 593.4464465618212 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.5403430208623 + - 599.5359596729973 + - !!python/tuple + - 598.9684497424305 + - 599.227521342894 + - !!python/tuple + - 598.2552552267211 + - 598.8684196619993 + - !!python/tuple + - 597.3658999962784 + - 598.594840156999 + - !!python/tuple + - 596.2594228747996 + - 598.4662060388578 + - !!python/tuple + - 594.8843077799438 + - 598.2793029697884 + - !!python/tuple + - 594.8843077799438 + - 598.2793029697884 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 617.0078494177988 + - 616.7887804228927 + - 616.7592157378537 + - 616.3528619236422 + - 616.4879791181116 + - 615.9450030389337 + - 615.9450030389337 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.7678881568795 + - 619.4358326707788 + - 618.4934308532243 + - 617.7947757209155 + - 617.1740165563033 + - 615.8041058873505 + - 615.8041058873505 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.9373171261498 + - 619.6725201568258 + - 619.3615042652219 + - 619.2429695609063 + - 618.8562186450912 + - 618.2380448546619 + - 618.2380448546619 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 618.6566886006225 + - 618.4811576556797 + - 618.130520007273 + - 616.2854955053102 + - 615.4455319728355 + - 615.4455319728355 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.3271027696292 + - 619.5107677112884 + - 619.6241720601066 + - 619.1905819602725 + - 618.6821766942423 + - 618.0719973257849 + - 618.0719973257849 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 616.0639065845859 + - 616.3110246660183 + - 616.3192735197345 + - 615.8902974151131 + - 614.6306501010099 + - 613.7168869420761 + - 613.7168869420761 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.7509863028193 + - 620.4063013686404 + - 620.0521776950313 + - 619.7533597159438 + - 619.1657784188911 + - 618.8459664665426 + - 618.8459664665426 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.9923733180726 + - 620.4682148533436 + - 621.036420758671 + - 620.0049219819031 + - 617.5030619000535 + - 617.5030619000535 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 625.6238249240989 + - 624.8366695369815 + - 625.3413340835708 + - 624.6606348469278 + - 623.316327266881 + - 622.4325375755661 + - 622.4325375755661 +- !!python/tuple + - !!python/tuple + - 0.0 + - 180.0 + - 330.0 + - 480.0 + - 630.0 + - 780.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 615.932118036814 + - 615.2061809663727 + - 615.4799411908366 + - 614.8269836417836 + - 614.5526452860082 + - 615.2222407969999 + - 615.2222407969999 +problem_name: SSCONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8034450612390419 + - 0.7048736834031168 + - 0.69157088014318 + - 0.5087296005139499 + - 0.5695263738496342 + - 0.32521110559600347 + - 0.32521110559600347 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 2.0453406636195948 + - 1.8959303520555966 + - 1.4718911324878772 + - 1.1575271621169956 + - 0.878212938822409 + - 0.26181360669082343 + - 0.26181360669082343 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 2.1215762210678504 + - 2.002429273211385 + - 1.862485850467249 + - 1.809150465737084 + - 1.635129625099381 + - 1.3569787060667198 + - 1.3569787060667198 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 1.5453499124961418 + - 1.4663687353410786 + - 1.3085972709701525 + - 0.47841768586942274 + - 0.10047117288395456 + - 0.10047117288395456 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 1.847006695958645 + - 1.9296478125953076 + - 1.9806747638094364 + - 1.7855783578803563 + - 1.5568184295612701 + - 1.282264647536076 + - 1.282264647536076 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3787124526466932 + - 0.48990468131151077 + - 0.49361630137311957 + - 0.3005959896245055 + - -0.2661896999329623 + - -0.6773427872534508 + - -0.6773427872534508 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 2.48769143459384 + - 2.3325984288680286 + - 2.1732584070318257 + - 2.038803506494949 + - 1.7744178591058766 + - 1.6305165972914455 + - 1.6305165972914455 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 2.1463490772110183 + - 2.3604567640762704 + - 2.6161243404334846 + - 2.1519954220271673 + - 1.0262688191986558 + - 1.0262688191986558 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 4.680253723372704 + - 4.32606854480638 + - 4.553145314495265 + - 4.246860704587101 + - 3.6419816323234278 + - 3.2443152823798243 + - 3.2443152823798243 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.18 + - 0.33 + - 0.48 + - 0.63 + - 0.78 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.319413423395928 + - -0.007226214889133502 + - 0.11595380213543265 + - -0.1778482728963701 + - -0.3012884234919559 + - 0.0 + - 0.0 +solver_name: ALOE diff --git a/test/expected_results/SSCONT1_ASTRODF.yaml b/test/expected_results/SSCONT1_ASTRODF.yaml new file mode 100644 index 000000000..45bcd7ab4 --- /dev/null +++ b/test/expected_results/SSCONT1_ASTRODF.yaml @@ -0,0 +1,1122 @@ +all_est_objectives: +- - 617.4446810196645 + - 602.7134603203141 + - 566.3009304159908 + - 530.2045595950837 + - 526.9340665541213 + - 527.4957732549686 + - 527.4165246486782 + - 527.4165246486782 +- - 619.9748557704096 + - 602.9471022109817 + - 565.763572855946 + - 523.8242422274955 + - 520.6078102764021 + - 522.8144677197492 + - 522.4207433697178 + - 522.3884972021259 + - 522.0682921708536 + - 522.0682921708536 +- - 620.1266657075832 + - 606.5526559464214 + - 606.9594268766615 + - 602.1033007872282 + - 586.359834808591 + - 555.7874078709881 + - 536.8891707326391 + - 532.0726336266063 + - 530.8026908991283 + - 528.2470526070765 + - 530.0244757353444 + - 531.2261895704528 + - 530.9533288830123 + - 530.7989638464906 + - 530.7989638464906 +- - 619.487755405019 + - 604.249361130459 + - 567.5342298021178 + - 536.2935320573315 + - 537.5260580320383 + - 536.0666486228072 + - 535.7890491011307 + - 536.4673956942862 + - 536.437196019277 + - 536.40738283969 + - 536.40738283969 +- - 619.1948680580867 + - 602.7848539379115 + - 569.7476932130684 + - 531.2410824912951 + - 527.3088861232262 + - 520.3124770003175 + - 520.0661637710836 + - 520.1997497651461 + - 519.5373373155846 + - 519.4786783406803 + - 519.628994701746 + - 519.628994701746 +- - 616.3835575737073 + - 602.4289900744632 + - 587.1097178431154 + - 555.2815049672807 + - 528.9414794615831 + - 528.007026964456 + - 527.5364928043651 + - 527.2045832596316 + - 527.1426059972102 + - 527.4061490651989 + - 526.9963180094655 + - 526.9963180094655 +- - 620.9802638572587 + - 606.5286426093463 + - 569.1391547064795 + - 543.9719547527582 + - 532.9248716012473 + - 533.3579251118776 + - 532.8835006477934 + - 532.8628926921177 + - 533.0017796421628 + - 532.9373628622484 + - 532.8548448096051 + - 532.8548448096051 +- - 620.2623512259908 + - 608.3029870734229 + - 575.9971616033666 + - 537.9144106870513 + - 534.8328702826401 + - 536.1435493624735 + - 536.4113104738997 + - 536.5285926868288 + - 536.4785730874542 + - 536.404758926354 + - 535.3155291605883 + - 535.1815935439156 + - 535.8970688811089 + - 535.8970688811089 +- - 625.9806452481811 + - 612.8474812181802 + - 581.445748487525 + - 542.6360904484326 + - 543.5058672174227 + - 535.0244546789705 + - 535.0979687318755 + - 535.0979687318755 +- - 615.9747313513403 + - 595.8203463962959 + - 567.7325720804164 + - 559.1898345576608 + - 543.4901792090951 + - 540.4373430665194 + - 540.842333560851 + - 543.5740292736558 + - 534.598610270871 + - 534.0112622369531 + - 528.3828426971695 + - 525.9603541496892 + - 524.7492724472424 + - 524.5112973303721 + - 524.5112973303721 +all_intermediate_budgets: +- - 5 + - 30 + - 50 + - 70 + - 241 + - 405 + - 464 + - 1000 +- - 5 + - 30 + - 50 + - 70 + - 180 + - 230 + - 495 + - 583 + - 640 + - 1000 +- - 5 + - 30 + - 70 + - 90 + - 110 + - 136 + - 161 + - 275 + - 299 + - 401 + - 516 + - 628 + - 771 + - 808 + - 1000 +- - 5 + - 30 + - 50 + - 85 + - 231 + - 279 + - 386 + - 415 + - 763 + - 934 + - 1000 +- - 5 + - 30 + - 50 + - 70 + - 215 + - 250 + - 488 + - 566 + - 668 + - 831 + - 938 + - 1000 +- - 5 + - 30 + - 50 + - 70 + - 90 + - 229 + - 373 + - 709 + - 754 + - 875 + - 908 + - 1000 +- - 5 + - 30 + - 50 + - 70 + - 90 + - 271 + - 367 + - 426 + - 524 + - 791 + - 958 + - 1000 +- - 5 + - 30 + - 50 + - 70 + - 181 + - 277 + - 524 + - 571 + - 694 + - 729 + - 914 + - 955 + - 988 + - 1000 +- - 5 + - 30 + - 50 + - 70 + - 155 + - 190 + - 607 + - 1000 +- - 5 + - 30 + - 50 + - 70 + - 90 + - 110 + - 359 + - 383 + - 407 + - 449 + - 523 + - 675 + - 865 + - 977 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 576.8037869043233 + - 578.5073105912742 + - !!python/tuple + - 505.3566357893854 + - 544.6649614180973 + - !!python/tuple + - 368.550478434622 + - 402.0235392791418 + - !!python/tuple + - 375.496596229205 + - 384.73130511270136 + - !!python/tuple + - 375.73774593186573 + - 386.1670676879515 + - !!python/tuple + - 376.16928680571345 + - 384.39913203837426 + - !!python/tuple + - 376.16928680571345 + - 384.39913203837426 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 577.2707675247957 + - 578.0140501436003 + - !!python/tuple + - 508.2800033168048 + - 539.4099771201821 + - !!python/tuple + - 341.2656197731328 + - 433.72792713283934 + - !!python/tuple + - 458.69415336272175 + - 289.0298587721247 + - !!python/tuple + - 589.7354836728205 + - 258.11260871392653 + - !!python/tuple + - 586.9974085366133 + - 258.31315586529587 + - !!python/tuple + - 586.9165459520469 + - 258.025022521329 + - !!python/tuple + - 584.7721877790717 + - 258.07101558686344 + - !!python/tuple + - 584.7721877790717 + - 258.07101558686344 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 568.8229755919676 + - 594.7091447703654 + - !!python/tuple + - 561.2676212239471 + - 608.5985875372165 + - !!python/tuple + - 545.7790713485261 + - 611.777395923483 + - !!python/tuple + - 506.4538925102638 + - 607.7736090487005 + - !!python/tuple + - 422.90619311435137 + - 554.9966545548093 + - !!python/tuple + - 315.38389462215855 + - 332.56888745511515 + - !!python/tuple + - 385.34011622503084 + - 361.91121120419376 + - !!python/tuple + - 416.7508336940851 + - 292.85897205132363 + - !!python/tuple + - 447.38041865262005 + - 342.38811789293345 + - !!python/tuple + - 446.1016238423379 + - 349.554279182128 + - !!python/tuple + - 445.59686433597415 + - 351.77237359404654 + - !!python/tuple + - 445.5241687910024 + - 351.065224674783 + - !!python/tuple + - 443.86408689653933 + - 350.4307724855754 + - !!python/tuple + - 443.86408689653933 + - 350.4307724855754 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 573.2532684648546 + - 583.1295420279454 + - !!python/tuple + - 504.55459696552623 + - 544.0080321615386 + - !!python/tuple + - 422.9160949314316 + - 397.18224683883346 + - !!python/tuple + - 444.7542911473291 + - 399.11708204071135 + - !!python/tuple + - 446.4116152350035 + - 388.28122133774775 + - !!python/tuple + - 446.0194357474403 + - 386.9683101148123 + - !!python/tuple + - 449.1510984830082 + - 388.2077771208007 + - !!python/tuple + - 448.6158509101411 + - 388.2077771208007 + - !!python/tuple + - 448.08060333727394 + - 388.2077771208007 + - !!python/tuple + - 448.08060333727394 + - 388.2077771208007 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 569.3836685275934 + - 592.0854408100183 + - !!python/tuple + - 500.4598490765181 + - 553.3619710239109 + - !!python/tuple + - 341.8405660720517 + - 435.453434186458 + - !!python/tuple + - 356.3427160705005 + - 383.58706067221726 + - !!python/tuple + - 435.8097468046159 + - 301.2325887521219 + - !!python/tuple + - 442.2931561140244 + - 303.08954196317984 + - !!python/tuple + - 438.07837090225695 + - 303.04124808267466 + - !!python/tuple + - 438.24818720844394 + - 302.0012557319012 + - !!python/tuple + - 438.89837279445305 + - 301.8962930355813 + - !!python/tuple + - 439.54817764691074 + - 302.21352611463493 + - !!python/tuple + - 439.54817764691074 + - 302.21352611463493 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 578.6219337044738 + - 576.6981056249907 + - !!python/tuple + - 554.524924257188 + - 556.2204559625559 + - !!python/tuple + - 499.8708442454918 + - 499.09838021179985 + - !!python/tuple + - 347.40279975621775 + - 373.33671908402715 + - !!python/tuple + - 346.4275328801084 + - 347.5625280120165 + - !!python/tuple + - 346.6173440574119 + - 345.9617020161916 + - !!python/tuple + - 346.647053765917 + - 345.45881643222816 + - !!python/tuple + - 347.88295937006853 + - 345.2166575051009 + - !!python/tuple + - 347.9374754645407 + - 346.00189614236945 + - !!python/tuple + - 349.549637612291 + - 344.8735094746175 + - !!python/tuple + - 349.549637612291 + - 344.8735094746175 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 568.6643813421224 + - 595.7480588752813 + - !!python/tuple + - 512.218844224611 + - 540.3955400571134 + - !!python/tuple + - 476.0244644649729 + - 470.1106421499876 + - !!python/tuple + - 476.3426568540807 + - 391.054340986807 + - !!python/tuple + - 478.6566835332435 + - 401.76918493498187 + - !!python/tuple + - 480.5894542592454 + - 398.940929950578 + - !!python/tuple + - 480.41866736259226 + - 397.23667378733387 + - !!python/tuple + - 481.2333394739885 + - 396.9726214072668 + - !!python/tuple + - 481.01423647691655 + - 397.2713850020231 + - !!python/tuple + - 480.34542638252077 + - 397.2531195485445 + - !!python/tuple + - 480.34542638252077 + - 397.2531195485445 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 577.1607427427413 + - 578.1283670491489 + - !!python/tuple + - 511.27703742308984 + - 534.4324018652405 + - !!python/tuple + - 355.61519832263656 + - 412.64614710771633 + - !!python/tuple + - 354.5387407830779 + - 391.67425536968335 + - !!python/tuple + - 352.36802052979573 + - 385.48132961264326 + - !!python/tuple + - 352.36802052979573 + - 384.6610366404926 + - !!python/tuple + - 350.7788548735232 + - 385.8888523206762 + - !!python/tuple + - 351.37909367717 + - 387.02132226891945 + - !!python/tuple + - 351.9604978217628 + - 383.8921639563707 + - !!python/tuple + - 351.4915612564137 + - 383.0074218093057 + - !!python/tuple + - 353.99425182272637 + - 382.9506020393665 + - !!python/tuple + - 359.5692515716908 + - 385.7942231955836 + - !!python/tuple + - 359.5692515716908 + - 385.7942231955836 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 568.3773578601334 + - 599.9077823556328 + - !!python/tuple + - 491.7735829379131 + - 580.3665012393445 + - !!python/tuple + - 336.6685150754229 + - 457.87193840746903 + - !!python/tuple + - 298.50565283680737 + - 362.01914981947425 + - !!python/tuple + - 386.14170195642305 + - 358.8052247637551 + - !!python/tuple + - 386.27261027487106 + - 359.2281386178263 + - !!python/tuple + - 386.27261027487106 + - 359.2281386178263 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 571.1560986735842 + - 587.037386209873 + - !!python/tuple + - 497.0269212356571 + - 559.5625786149814 + - !!python/tuple + - 429.3231270159713 + - 600.3816458294393 + - !!python/tuple + - 350.6548094412385 + - 592.5524817641648 + - !!python/tuple + - 199.09636220818945 + - 465.69611782326086 + - !!python/tuple + - 201.81814094893252 + - 456.78492266171 + - !!python/tuple + - 215.66716794346263 + - 438.0549014842039 + - !!python/tuple + - 273.38204941072036 + - 445.8202230971159 + - !!python/tuple + - 282.2918449801774 + - 397.12899800121653 + - !!python/tuple + - 370.9587083672725 + - 408.6235765899355 + - !!python/tuple + - 369.3641509861015 + - 350.30541515213287 + - !!python/tuple + - 385.5040365438705 + - 349.186949480473 + - !!python/tuple + - 385.46543651390743 + - 348.72570770180255 + - !!python/tuple + - 385.46543651390743 + - 348.72570770180255 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 241.0 + - 405.0 + - 464.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 602.7134603203141 + - 566.3009304159908 + - 530.2045595950837 + - 526.9340665541213 + - 527.4957732549686 + - 527.4165246486782 + - 527.4165246486782 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 180.0 + - 230.0 + - 495.0 + - 583.0 + - 640.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 602.9471022109817 + - 565.763572855946 + - 523.8242422274955 + - 520.6078102764021 + - 522.8144677197492 + - 522.4207433697178 + - 522.3884972021259 + - 522.0682921708536 + - 522.0682921708536 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 70.0 + - 90.0 + - 110.0 + - 136.0 + - 161.0 + - 275.0 + - 299.0 + - 401.0 + - 516.0 + - 628.0 + - 771.0 + - 808.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 606.5526559464214 + - 606.9594268766615 + - 602.1033007872282 + - 586.359834808591 + - 555.7874078709881 + - 536.8891707326391 + - 532.0726336266063 + - 530.8026908991283 + - 528.2470526070765 + - 530.0244757353444 + - 531.2261895704528 + - 530.9533288830123 + - 530.7989638464906 + - 530.7989638464906 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 85.0 + - 231.0 + - 279.0 + - 386.0 + - 415.0 + - 763.0 + - 934.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 604.249361130459 + - 567.5342298021178 + - 536.2935320573315 + - 537.5260580320383 + - 536.0666486228072 + - 535.7890491011307 + - 536.4673956942862 + - 536.437196019277 + - 536.40738283969 + - 536.40738283969 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 215.0 + - 250.0 + - 488.0 + - 566.0 + - 668.0 + - 831.0 + - 938.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 602.7848539379115 + - 569.7476932130684 + - 531.2410824912951 + - 527.3088861232262 + - 520.3124770003175 + - 520.0661637710836 + - 520.1997497651461 + - 519.5373373155846 + - 523.838762066248 + - 519.628994701746 + - 519.628994701746 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 90.0 + - 229.0 + - 373.0 + - 709.0 + - 754.0 + - 875.0 + - 908.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 602.4289900744632 + - 587.1097178431154 + - 555.2815049672807 + - 528.9414794615831 + - 528.007026964456 + - 527.5364928043651 + - 527.2045832596316 + - 527.1426059972102 + - 527.4061490651989 + - 526.9963180094655 + - 526.9963180094655 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 90.0 + - 271.0 + - 367.0 + - 426.0 + - 524.0 + - 791.0 + - 958.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 606.5286426093463 + - 569.1391547064795 + - 543.9719547527582 + - 532.9248716012473 + - 533.3579251118776 + - 532.8835006477934 + - 532.8628926921177 + - 533.0017796421628 + - 532.9373628622484 + - 532.8548448096051 + - 532.8548448096051 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 181.0 + - 277.0 + - 524.0 + - 571.0 + - 694.0 + - 729.0 + - 914.0 + - 955.0 + - 988.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 608.3029870734229 + - 575.9971616033666 + - 537.9144106870513 + - 534.8328702826401 + - 536.1435493624735 + - 536.4113104738997 + - 536.5285926868288 + - 536.4785730874542 + - 536.404758926354 + - 535.3155291605883 + - 535.1815935439156 + - 535.8970688811089 + - 535.8970688811089 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 155.0 + - 190.0 + - 607.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 612.8474812181802 + - 581.445748487525 + - 542.6360904484326 + - 543.5058672174227 + - 535.0244546789705 + - 535.0979687318755 + - 535.0979687318755 +- !!python/tuple + - !!python/tuple + - 5.0 + - 30.0 + - 50.0 + - 70.0 + - 90.0 + - 110.0 + - 359.0 + - 383.0 + - 407.0 + - 449.0 + - 523.0 + - 675.0 + - 865.0 + - 977.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 595.8203463962959 + - 567.7325720804164 + - 559.1898345576608 + - 543.4901792090951 + - 540.4373430665194 + - 540.842333560851 + - 543.5740292736558 + - 534.598610270871 + - 534.0112622369531 + - 528.3828426971695 + - 525.9603541496892 + - 524.7492724472424 + - 524.5112973303721 + - 524.5112973303721 +problem_name: SSCONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.241 + - 0.405 + - 0.464 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8426251153339837 + - 0.45362695889855376 + - 0.0680063568630057 + - 0.03306740131907307 + - 0.039068161817208916 + - 0.038221542210495014 + - 0.038221542210495014 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.18 + - 0.23 + - 0.495 + - 0.583 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8451211315397954 + - 0.44788632234423237 + - -0.0001551166733354581 + - -0.0345165329924682 + - -0.010942623692509486 + - -0.015148814438068934 + - -0.015493302991276135 + - -0.018914080596500356 + - -0.018914080596500356 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.07 + - 0.09 + - 0.11 + - 0.136 + - 0.161 + - 0.275 + - 0.299 + - 0.401 + - 0.516 + - 0.628 + - 0.771 + - 0.808 + - 1.0 + - !!python/tuple + - 1.0 + - 0.883639569003499 + - 0.8879851374759643 + - 0.8361067291046953 + - 0.667917941956822 + - 0.3413101026297226 + - 0.1394186266456681 + - 0.08796315075391627 + - 0.07439624449759297 + - 0.04709414308535661 + - 0.06608250566050959 + - 0.07892051685194355 + - 0.07600552290186802 + - 0.07435642807701418 + - 0.07435642807701418 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.085 + - 0.231 + - 0.279 + - 0.386 + - 0.415 + - 0.763 + - 0.934 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8590332744260303 + - 0.4668024012201098 + - 0.13305536797605366 + - 0.14622254787757483 + - 0.13063155293250672 + - 0.12766593361291376 + - 0.13491276800907112 + - 0.1345901423103246 + - 0.13427164557507065 + - 0.13427164557507065 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.215 + - 0.25 + - 0.488 + - 0.566 + - 0.668 + - 0.831 + - 0.938 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8433878194278664 + - 0.4904490192513062 + - 0.07907961919300047 + - 0.03707163068080258 + - -0.0376716035199166 + - -0.04030298871422786 + - -0.03887587816869714 + - -0.045952486752509916 + - 0.0 + - -0.044973303094188045 + - -0.044973303094188045 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.09 + - 0.229 + - 0.373 + - 0.709 + - 0.754 + - 0.875 + - 0.908 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8395860954831932 + - 0.6759290062453693 + - 0.33590549884650334 + - 0.054512764282293374 + - 0.044529928714041794 + - 0.03950317222949666 + - 0.03595735431066692 + - 0.03529524594065888 + - 0.03811069896900611 + - 0.03373243891541617 + - 0.03373243891541617 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.09 + - 0.271 + - 0.367 + - 0.426 + - 0.524 + - 0.791 + - 0.958 + - 1.0 + - !!python/tuple + - 1.0 + - 0.883383032479489 + - 0.4839479505860684 + - 0.2150846112255951 + - 0.09706768158027557 + - 0.10169402909624652 + - 0.09662571216299443 + - 0.09640555561834306 + - 0.09788929672785737 + - 0.09720112678481735 + - 0.09631957940441745 + - 0.09631957940441745 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.181 + - 0.277 + - 0.524 + - 0.571 + - 0.694 + - 0.729 + - 0.914 + - 0.955 + - 0.988 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9023385054230274 + - 0.5572126220252756 + - 0.1503713523480077 + - 0.11745099390417141 + - 0.1314530900802232 + - 0.134313604825657 + - 0.1355665406895471 + - 0.13503217705171408 + - 0.13424361408555308 + - 0.12260727978165324 + - 0.12117643418801756 + - 0.1288199181171628 + - 0.1288199181171628 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.155 + - 0.19 + - 0.607 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9508877232029299 + - 0.6154203394973922 + - 0.2008134591525047 + - 0.21010535841181344 + - 0.1194977063180068 + - 0.12028306320277384 + - 0.12028306320277384 +- !!python/tuple + - !!python/tuple + - 0.005 + - 0.03 + - 0.05 + - 0.07 + - 0.09 + - 0.11 + - 0.359 + - 0.383 + - 0.407 + - 0.449 + - 0.523 + - 0.675 + - 0.865 + - 0.977 + - 1.0 + - !!python/tuple + - 1.0 + - 0.7689853925355935 + - 0.468921308662248 + - 0.3776585165410901 + - 0.2099377620834719 + - 0.17732405371215598 + - 0.18165060163625865 + - 0.21083353946056727 + - 0.11494837425801706 + - 0.1086736852160762 + - 0.04854480017639562 + - 0.02266514881924334 + - 0.009727059903632216 + - 0.007184751473449161 + - 0.007184751473449161 +solver_name: ASTRODF diff --git a/test/expected_results/SSCONT1_NELDMD.yaml b/test/expected_results/SSCONT1_NELDMD.yaml new file mode 100644 index 000000000..3c994651d --- /dev/null +++ b/test/expected_results/SSCONT1_NELDMD.yaml @@ -0,0 +1,762 @@ +all_est_objectives: +- - 617.4446810196645 + - 529.8405856415059 + - 528.5205032591866 + - 528.8722110783488 + - 528.8722110783488 +- - 619.9748557704096 + - 543.4123197892859 + - 534.9869886048248 + - 521.9015879616749 + - 522.3678003074281 + - 519.6826974001373 + - 519.6826974001373 +- - 620.1266657075832 + - 533.8055501691885 + - 533.1951112157884 + - 519.452991912376 + - 520.4073265469697 + - 520.4073265469697 +- - 619.487755405019 + - 542.3792038033297 + - 513.4345471226 + - 522.0725427715622 + - 522.6425711467167 + - 522.6425711467167 +- - 619.1948680580867 + - 535.1488752667138 + - 530.4456782002984 + - 529.9691662545405 + - 528.4265977830561 + - 529.694094435509 + - 529.6129188946484 + - 529.6129188946484 +- - 616.3835575737073 + - 528.5809647039243 + - 530.744918143904 + - 530.6894944320736 + - 528.1390547155236 + - 525.6511649919341 + - 523.3152287332757 + - 523.3152287332757 +- - 620.9802638572587 + - 547.9625840470694 + - 538.6896120890926 + - 536.9264250697214 + - 534.7943921717688 + - 532.7625248792779 + - 529.1352485695752 + - 531.9789106916264 + - 530.7693080404217 + - 531.3028177750219 + - 533.3165426738869 + - 533.3165426738869 +- - 620.2623512259908 + - 539.5183710933342 + - 548.315346564255 + - 530.8985434802074 + - 534.2282557279794 + - 540.1631809919603 + - 540.1631809919603 +- - 625.9806452481811 + - 522.7216941946272 + - 526.638896730013 + - 528.3286307355335 + - 522.2351213441806 + - 522.3876210608463 + - 527.414657139267 + - 523.7404067766621 + - 523.7404067766621 +- - 615.9747313513403 + - 530.7729245605191 + - 521.2053563582544 + - 520.6658622709895 + - 518.4689575405641 + - 518.1126479602385 + - 517.151943377956 + - 517.7598425565049 + - 517.7598425565049 +all_intermediate_budgets: +- - 0 + - 510 + - 630 + - 750 + - 1000 +- - 0 + - 150 + - 270 + - 390 + - 510 + - 570 + - 1000 +- - 0 + - 270 + - 330 + - 540 + - 600 + - 1000 +- - 0 + - 150 + - 270 + - 450 + - 690 + - 1000 +- - 0 + - 210 + - 390 + - 510 + - 630 + - 780 + - 960 + - 1000 +- - 0 + - 150 + - 270 + - 330 + - 510 + - 630 + - 780 + - 1000 +- - 0 + - 150 + - 210 + - 270 + - 390 + - 450 + - 510 + - 690 + - 750 + - 870 + - 930 + - 1000 +- - 0 + - 240 + - 300 + - 360 + - 420 + - 540 + - 1000 +- - 0 + - 210 + - 390 + - 450 + - 570 + - 630 + - 690 + - 750 + - 1000 +- - 0 + - 150 + - 420 + - 600 + - 660 + - 720 + - 840 + - 960 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 386.50898996914805 + - 420.1320551157649 + - !!python/tuple + - 378.6017084362248 + - 415.67079758302384 + - !!python/tuple + - 384.72863772603625 + - 415.3550700801035 + - !!python/tuple + - 384.72863772603625 + - 415.3550700801035 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 97.68228084475709 + - 746.8016557398339 + - !!python/tuple + - 192.60441917479966 + - 497.7546679304721 + - !!python/tuple + - 404.7040984405264 + - 380.4423000756939 + - !!python/tuple + - 463.3489817843795 + - 135.08147325196404 + - !!python/tuple + - 602.8941510777272 + - 25.14142736844974 + - !!python/tuple + - 602.8941510777272 + - 25.14142736844974 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 397.50753683570093 + - 261.5403268770166 + - !!python/tuple + - 641.516908702544 + - 0.0 + - !!python/tuple + - 609.6900641937873 + - 81.53934371392694 + - !!python/tuple + - 638.8655626517414 + - 97.69360570859973 + - !!python/tuple + - 638.8655626517414 + - 97.69360570859973 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 403.2199058568233 + - 165.71476201389407 + - !!python/tuple + - 634.6937675396182 + - 104.83279038197128 + - !!python/tuple + - 535.8854112122351 + - 167.27440056284132 + - !!python/tuple + - 539.2395043970275 + - 158.0383625323855 + - !!python/tuple + - 539.2395043970275 + - 158.0383625323855 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 379.3932928263026 + - 480.7935987577482 + - !!python/tuple + - 351.91642412280794 + - 403.0532414570139 + - !!python/tuple + - 338.6952203778805 + - 408.62149229505576 + - !!python/tuple + - 335.13130413823876 + - 387.7943402603617 + - !!python/tuple + - 331.0643317938014 + - 395.0892223333009 + - !!python/tuple + - 335.64144749404636 + - 395.9525379507495 + - !!python/tuple + - 335.64144749404636 + - 395.9525379507495 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 373.36516544516064 + - 405.7402513642893 + - !!python/tuple + - 339.442132732995 + - 438.03790108331475 + - !!python/tuple + - 329.73435016980113 + - 365.27341915119587 + - !!python/tuple + - 346.69586652588396 + - 349.1245942916831 + - !!python/tuple + - 377.8987490657163 + - 350.1694346195193 + - !!python/tuple + - 436.85751218995745 + - 346.5714285597352 + - !!python/tuple + - 436.85751218995745 + - 346.5714285597352 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 410.5130965152081 + - 560.9679254242766 + - !!python/tuple + - 131.84419720317976 + - 612.57542465047 + - !!python/tuple + - 168.07645281200163 + - 556.4496670513751 + - !!python/tuple + - 386.1361911982283 + - 503.7126032319561 + - !!python/tuple + - 252.8959678714591 + - 543.830183393133 + - !!python/tuple + - 379.95868927732135 + - 453.896587461982 + - !!python/tuple + - 460.91726563621205 + - 410.14209394750617 + - !!python/tuple + - 463.72969406997515 + - 397.99116611778754 + - !!python/tuple + - 462.3234798530936 + - 404.06663003264686 + - !!python/tuple + - 504.20898224942044 + - 376.1139193605496 + - !!python/tuple + - 504.20898224942044 + - 376.1139193605496 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 325.1173485120577 + - 320.0626123028588 + - !!python/tuple + - 505.6377521001699 + - 427.65031195988803 + - !!python/tuple + - 411.27550420033987 + - 255.30062391977617 + - !!python/tuple + - 391.7869883311563 + - 330.7690401213455 + - !!python/tuple + - 434.09598331377543 + - 435.81098819179374 + - !!python/tuple + - 434.09598331377543 + - 435.81098819179374 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 617.0189059187588 + - 71.65654768451122 + - !!python/tuple + - 580.8391424867718 + - 175.82935290011267 + - !!python/tuple + - 590.4159241547297 + - 133.27541871135327 + - !!python/tuple + - 585.6275333207508 + - 154.55238580573297 + - !!python/tuple + - 607.4421242508008 + - 114.2104818732706 + - !!python/tuple + - 608.7726380478678 + - 136.59346409579877 + - !!python/tuple + - 596.8674572350426 + - 139.97717939513382 + - !!python/tuple + - 596.8674572350426 + - 139.97717939513382 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 752.6553518700596 + - 1.0000002248489182e-07 + - !!python/tuple + - 676.4634009641036 + - 116.08518829901602 + - !!python/tuple + - 685.987394827348 + - 101.57453977413903 + - !!python/tuple + - 680.1462105255633 + - 106.29891928370029 + - !!python/tuple + - 679.7651018202796 + - 110.01095891396784 + - !!python/tuple + - 679.2493274292785 + - 108.5134840606375 + - !!python/tuple + - 679.5072146247791 + - 109.26222148730267 + - !!python/tuple + - 679.5072146247791 + - 109.26222148730267 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 510.0 + - 630.0 + - 750.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 529.8405856415059 + - 528.5205032591866 + - 528.8722110783488 + - 528.8722110783488 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 390.0 + - 510.0 + - 570.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 543.4123197892859 + - 534.9869886048248 + - 521.9015879616749 + - 522.3678003074281 + - 519.6826974001373 + - 519.6826974001373 +- !!python/tuple + - !!python/tuple + - 0.0 + - 270.0 + - 330.0 + - 540.0 + - 600.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 533.8055501691885 + - 533.1951112157884 + - 519.452991912376 + - 520.4073265469697 + - 520.4073265469697 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 450.0 + - 690.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 542.3792038033297 + - 512.326117225845 + - 522.0725427715622 + - 522.6425711467167 + - 522.6425711467167 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 390.0 + - 510.0 + - 630.0 + - 780.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 535.1488752667138 + - 530.4456782002984 + - 529.9691662545405 + - 528.4265977830561 + - 529.694094435509 + - 529.6129188946484 + - 529.6129188946484 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 270.0 + - 330.0 + - 510.0 + - 630.0 + - 780.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 528.5809647039243 + - 530.744918143904 + - 530.6894944320736 + - 528.1390547155236 + - 525.6511649919341 + - 523.3152287332757 + - 523.3152287332757 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 210.0 + - 270.0 + - 390.0 + - 450.0 + - 510.0 + - 690.0 + - 750.0 + - 870.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 547.9625840470694 + - 538.6896120890926 + - 536.9264250697214 + - 534.7943921717688 + - 532.7625248792779 + - 529.1352485695752 + - 531.9789106916264 + - 530.7693080404217 + - 531.3028177750219 + - 533.3165426738869 + - 533.3165426738869 +- !!python/tuple + - !!python/tuple + - 0.0 + - 240.0 + - 300.0 + - 360.0 + - 420.0 + - 540.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 539.5183710933342 + - 548.315346564255 + - 530.8985434802074 + - 534.2282557279794 + - 540.1631809919603 + - 540.1631809919603 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 390.0 + - 450.0 + - 570.0 + - 630.0 + - 690.0 + - 750.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 522.7216941946272 + - 526.638896730013 + - 528.3286307355335 + - 522.2351213441806 + - 522.3876210608463 + - 527.414657139267 + - 523.7404067766621 + - 523.7404067766621 +- !!python/tuple + - !!python/tuple + - 0.0 + - 150.0 + - 420.0 + - 600.0 + - 660.0 + - 720.0 + - 840.0 + - 960.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 530.7729245605191 + - 521.2053563582544 + - 520.6658622709895 + - 518.4689575405641 + - 518.1126479602385 + - 517.151943377956 + - 517.7598425565049 + - 517.7598425565049 +problem_name: SSCONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.51 + - 0.63 + - 0.75 + - 1.0 + - !!python/tuple + - 1.0 + - 0.16661632145216437 + - 0.1540582885541078 + - 0.15740410880191838 + - 0.15740410880191838 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.39 + - 0.51 + - 0.57 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2957251454121241 + - 0.215574400573309 + - 0.0910921001033774 + - 0.09552720964946709 + - 0.06998364426593137 + - 0.06998364426593137 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.27 + - 0.33 + - 0.54 + - 0.6 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2043352969079126 + - 0.19852814989820503 + - 0.06779844044016527 + - 0.07687709030134043 + - 0.07687709030134043 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.45 + - 0.69 + - 1.0 + - !!python/tuple + - 1.0 + - 0.28589704323235515 + - 0.0 + - 0.09271840476087502 + - 0.09814112320927916 + - 0.09814112320927916 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.39 + - 0.51 + - 0.63 + - 0.78 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.21711443932618427 + - 0.1723726078487267 + - 0.16783951751187093 + - 0.15316495941469213 + - 0.1652227407114285 + - 0.1644505123063693 + - 0.1644505123063693 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.27 + - 0.33 + - 0.51 + - 0.63 + - 0.78 + - 1.0 + - !!python/tuple + - 1.0 + - 0.15463346236314404 + - 0.17521929765122932 + - 0.17469204813572908 + - 0.1504295427846048 + - 0.1267620797428798 + - 0.10454016028020384 + - 0.10454016028020384 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.21 + - 0.27 + - 0.39 + - 0.45 + - 0.51 + - 0.69 + - 0.75 + - 0.87 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3390121167477337 + - 0.2507977079572476 + - 0.23402439070731293 + - 0.21374221769233134 + - 0.19441292685007594 + - 0.15990640222881836 + - 0.1869583521358663 + - 0.17545132038477398 + - 0.18052663453810133 + - 0.19968333556395199 + - 0.19968333556395199 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.24 + - 0.3 + - 0.36 + - 0.42 + - 0.54 + - 1.0 + - !!python/tuple + - 1.0 + - 0.25868174836201446 + - 0.3423679704091054 + - 0.17668074585560886 + - 0.20835652344997319 + - 0.26481586849602684 + - 0.26481586849602684 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.39 + - 0.45 + - 0.57 + - 0.63 + - 0.69 + - 0.75 + - 1.0 + - !!python/tuple + - 1.0 + - 0.09889382611022109 + - 0.13615843850607814 + - 0.15223299227219225 + - 0.09426502570726898 + - 0.09571576581597928 + - 0.1435382996957301 + - 0.10858490773528066 + - 0.10858490773528066 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.15 + - 0.42 + - 0.6 + - 0.66 + - 0.72 + - 0.84 + - 0.96 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1754857245848204 + - 0.0844688018172059 + - 0.0793365581126291 + - 0.0584372549720881 + - 0.05504765785939844 + - 0.04590841025545563 + - 0.05169139621539744 + - 0.05169139621539744 +solver_name: NELDMD diff --git a/test/expected_results/SSCONT1_RNDSRCH.yaml b/test/expected_results/SSCONT1_RNDSRCH.yaml new file mode 100644 index 000000000..3c00d03cf --- /dev/null +++ b/test/expected_results/SSCONT1_RNDSRCH.yaml @@ -0,0 +1,627 @@ +all_est_objectives: +- - 617.4446810196645 + - 529.9825661412312 + - 523.1502096428786 + - 523.1502096428786 +- - 619.9748557704096 + - 609.5348856112506 + - 529.1264035074649 + - 526.145062400702 + - 524.0393703767301 + - 523.9056865767747 + - 517.6465852260235 + - 517.6465852260235 +- - 620.1266657075832 + - 559.6939616651046 + - 537.9529262270219 + - 543.9580865306737 + - 533.0699360642558 + - 533.0699360642558 +- - 619.487755405019 + - 547.5339019417506 + - 526.90867940035 + - 523.5950878876251 + - 519.4626421161497 + - 519.4626421161497 +- - 619.1948680580867 + - 542.4590278446644 + - 554.2249507265783 + - 516.0726915229949 + - 532.66592335514 + - 520.2760091688718 + - 520.2760091688718 +- - 616.3835575737073 + - 543.7965123793496 + - 522.2922199815409 + - 522.2922199815409 +- - 620.9802638572587 + - 584.9820465897413 + - 536.5464502328342 + - 529.2490508374976 + - 544.4741558192982 + - 526.9381491794753 + - 515.5545345463748 + - 515.5545345463748 +- - 620.2623512259908 + - 548.6368726951722 + - 541.0480514331942 + - 537.6620788910957 + - 533.6154056456485 + - 533.6154056456485 +- - 625.9806452481811 + - 534.8876255662286 + - 547.3002978056076 + - 528.8953524397592 + - 528.5436252384147 + - 528.5436252384147 +- - 615.9747313513403 + - 541.7399208510988 + - 527.118562107535 + - 527.1421604269337 + - 523.5964767200048 + - 528.9574612704808 + - 528.9574612704808 +all_intermediate_budgets: +- - 0 + - 30 + - 80 + - 1000 +- - 0 + - 30 + - 40 + - 250 + - 300 + - 560 + - 900 + - 1000 +- - 0 + - 20 + - 30 + - 80 + - 100 + - 1000 +- - 0 + - 20 + - 40 + - 560 + - 740 + - 1000 +- - 0 + - 20 + - 120 + - 130 + - 800 + - 940 + - 1000 +- - 0 + - 30 + - 260 + - 1000 +- - 0 + - 30 + - 40 + - 60 + - 80 + - 110 + - 300 + - 1000 +- - 0 + - 20 + - 40 + - 140 + - 680 + - 1000 +- - 0 + - 30 + - 90 + - 130 + - 270 + - 1000 +- - 0 + - 30 + - 90 + - 110 + - 170 + - 470 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 359.64365512847405 + - 465.33501295716064 + - !!python/tuple + - 448.4333218676209 + - 310.8963458265232 + - !!python/tuple + - 448.4333218676209 + - 310.8963458265232 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 379.4984318811467 + - 885.7474017443201 + - !!python/tuple + - 325.34753297971815 + - 484.396706029854 + - !!python/tuple + - 349.5306522240082 + - 410.27378677181 + - !!python/tuple + - 370.70555006408216 + - 436.0331898637314 + - !!python/tuple + - 589.5536241931459 + - 238.46041135411085 + - !!python/tuple + - 455.5779816688248 + - 273.4468864216472 + - !!python/tuple + - 455.5779816688248 + - 273.4468864216472 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 201.9742725596509 + - 780.8933400714283 + - !!python/tuple + - 392.20484473409556 + - 456.927538294216 + - !!python/tuple + - 236.91888662053393 + - 425.03253740381695 + - !!python/tuple + - 362.6919082172776 + - 354.3557218892089 + - !!python/tuple + - 362.6919082172776 + - 354.3557218892089 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 270.5155082821011 + - 330.22973611572723 + - !!python/tuple + - 563.1986444042213 + - 251.7030137502581 + - !!python/tuple + - 626.4364857411043 + - 175.81234105838976 + - !!python/tuple + - 592.2418396925617 + - 148.6990089807615 + - !!python/tuple + - 592.2418396925617 + - 148.6990089807615 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 290.4813924950597 + - 261.4662596466684 + - !!python/tuple + - 483.61266152187284 + - 508.8728086787097 + - !!python/tuple + - 460.58375448622513 + - 226.7074912071731 + - !!python/tuple + - 326.54107511059124 + - 455.5743039431546 + - !!python/tuple + - 450.52768085160676 + - 312.245325959649 + - !!python/tuple + - 450.52768085160676 + - 312.245325959649 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 409.74224692763124 + - 535.1203903690143 + - !!python/tuple + - 481.3923763982421 + - 312.5808672336022 + - !!python/tuple + - 481.3923763982421 + - 312.5808672336022 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 477.3830349535785 + - 647.41569100937 + - !!python/tuple + - 370.95683999105216 + - 181.27446475403576 + - !!python/tuple + - 360.07380838009834 + - 284.12291586494314 + - !!python/tuple + - 617.7140354330088 + - 305.547888556553 + - !!python/tuple + - 561.5913293809684 + - 280.0377568572764 + - !!python/tuple + - 530.1524959071461 + - 206.53998668477863 + - !!python/tuple + - 530.1524959071461 + - 206.53998668477863 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 238.95919282377542 + - 384.82460068594133 + - !!python/tuple + - 288.4513939553728 + - 390.67891574809835 + - !!python/tuple + - 481.2727419601838 + - 388.8134007448537 + - !!python/tuple + - 383.97289195347247 + - 391.48484260076674 + - !!python/tuple + - 383.97289195347247 + - 391.48484260076674 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 476.5545786705003 + - 356.2619054680448 + - !!python/tuple + - 339.7929445338787 + - 241.71203036349 + - !!python/tuple + - 615.6162331057836 + - 193.5195467569682 + - !!python/tuple + - 511.5095718637328 + - 212.24733099847668 + - !!python/tuple + - 511.5095718637328 + - 212.24733099847668 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 503.25052162181316 + - 446.79327484259204 + - !!python/tuple + - 419.1449837747667 + - 403.8396019725111 + - !!python/tuple + - 357.967441575124 + - 324.1947641853851 + - !!python/tuple + - 388.4854466145964 + - 330.62760034162926 + - !!python/tuple + - 467.74485172048503 + - 276.0076074487546 + - !!python/tuple + - 467.74485172048503 + - 276.0076074487546 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 80.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 529.9825661412312 + - 523.1502096428786 + - 523.1502096428786 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 40.0 + - 250.0 + - 300.0 + - 560.0 + - 900.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 609.5348856112506 + - 529.1264035074649 + - 526.145062400702 + - 524.0393703767301 + - 523.9056865767747 + - 517.6465852260235 + - 517.6465852260235 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 80.0 + - 100.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 559.6939616651046 + - 537.9529262270219 + - 543.9580865306737 + - 533.0699360642558 + - 533.0699360642558 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 560.0 + - 740.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 547.5339019417506 + - 526.90867940035 + - 523.5950878876251 + - 519.4626421161497 + - 519.4626421161497 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 120.0 + - 130.0 + - 800.0 + - 940.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 542.4590278446644 + - 554.2249507265783 + - 516.0726915229949 + - 532.66592335514 + - 520.2760091688718 + - 520.2760091688718 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 260.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 543.7965123793496 + - 522.2922199815409 + - 522.2922199815409 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 40.0 + - 60.0 + - 80.0 + - 110.0 + - 300.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 584.9820465897413 + - 536.5464502328342 + - 529.2490508374976 + - 544.4741558192982 + - 526.9381491794753 + - 516.2283218944248 + - 516.2283218944248 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 140.0 + - 680.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 548.6368726951722 + - 541.0480514331942 + - 537.6620788910957 + - 533.6154056456485 + - 533.6154056456485 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 90.0 + - 130.0 + - 270.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 534.8876255662286 + - 547.3002978056076 + - 528.8953524397592 + - 528.5436252384147 + - 528.5436252384147 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 90.0 + - 110.0 + - 170.0 + - 470.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 541.7399208510988 + - 527.118562107535 + - 527.1421604269337 + - 523.5964767200048 + - 528.9574612704808 + - 528.9574612704808 +problem_name: SSCONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.08 + - 1.0 + - !!python/tuple + - 1.0 + - 0.13588953767629317 + - 0.06838704541712552 + - 0.06838704541712552 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.04 + - 0.25 + - 0.3 + - 0.56 + - 0.9 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9218525989595545 + - 0.12743079996664156 + - 0.09797566907150686 + - 0.07717179860856606 + - 0.07585102594779496 + - 0.014012194707022014 + - 0.014012194707022014 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.08 + - 0.1 + - 1.0 + - !!python/tuple + - 1.0 + - 0.42943295082268007 + - 0.21463530718108753 + - 0.27396524510368486 + - 0.16639221480978295 + - 0.16639221480978295 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.04 + - 0.56 + - 0.74 + - 1.0 + - !!python/tuple + - 1.0 + - 0.30929367858994034 + - 0.10552007203410622 + - 0.07278236499383595 + - 0.031954520491326584 + - 0.031954520491326584 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.12 + - 0.13 + - 0.8 + - 0.94 + - 1.0 + - !!python/tuple + - 1.0 + - 0.25915480636665855 + - 0.37540007525007435 + - -0.0015376009646554322 + - 0.16240063960783446 + - 0.03999044531367384 + - 0.03999044531367384 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.26 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2723689206288619 + - 0.05991025699326953 + - 0.05991025699326953 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.04 + - 0.06 + - 0.08 + - 0.11 + - 0.3 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6792748256262053 + - 0.20073956931476747 + - 0.12864253422672234 + - 0.27906391979505535 + - 0.1058112283193153 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.04 + - 0.14 + - 0.68 + - 1.0 + - !!python/tuple + - 1.0 + - 0.3201908375369127 + - 0.24521460516139368 + - 0.21176178615701774 + - 0.17178135927325608 + - 0.17178135927325608 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.09 + - 0.13 + - 0.27 + - 1.0 + - !!python/tuple + - 1.0 + - 0.1843506705147913 + - 0.30698571041007305 + - 0.12514805565828493 + - 0.1216730521669098 + - 0.1216730521669098 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 0.09 + - 0.11 + - 0.17 + - 0.47 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2520501545121506 + - 0.10759367662726581 + - 0.10782682391296822 + - 0.0727960864158639 + - 0.12576168008874658 + - 0.12576168008874658 +solver_name: RNDSRCH diff --git a/test/expected_results/SSCONT1_SPSA.yaml b/test/expected_results/SSCONT1_SPSA.yaml new file mode 100644 index 000000000..f83a7b55c --- /dev/null +++ b/test/expected_results/SSCONT1_SPSA.yaml @@ -0,0 +1,564 @@ +all_est_objectives: +- - 617.4446810196645 + - 617.2783061634985 + - 617.0617818831009 + - 616.9312152012917 + - 616.4729114738197 + - 616.2061373538772 + - 616.0347888382443 + - 616.0347888382443 + - 616.0347888382443 +- - 619.9748557704096 + - 618.7862510700837 + - 618.6430468113386 + - 618.5761485044333 + - 618.2432617430519 + - 618.2432617430519 +- - 620.1266657075832 + - 619.6037103298655 + - 619.6968283088894 + - 619.7854937284512 + - 619.7854937284512 +- - 619.487755405019 + - 619.487755405019 +- - 619.1948680580867 + - 619.1835932654853 + - 618.8986269941673 + - 618.3314535610584 + - 618.2194396623837 + - 618.2194396623837 +- - 616.3835575737073 + - 616.1496235342482 + - 616.1174612070655 + - 616.0047381902368 + - 615.3751945096774 + - 614.4409062601765 + - 614.2469227082893 + - 613.8548545761166 + - 613.2648551436587 + - 613.2648551436587 +- - 620.9802638572587 + - 620.9802638572587 + - 620.9802638572587 +- - 620.2623512259908 + - 620.1986054415077 + - 619.7206322795994 + - 619.696226696432 + - 619.6749836819699 + - 619.6749836819699 + - 619.6749836819699 +- - 625.9806452481811 + - 626.2649827033416 + - 626.2649827033416 +- - 615.9747313513403 + - 616.394021631418 + - 616.3543363712809 + - 616.3543363712809 +all_intermediate_budgets: +- - 0 + - 210 + - 330 + - 450 + - 630 + - 810 + - 930 + - 990 + - 1000 +- - 0 + - 330 + - 570 + - 690 + - 930 + - 1000 +- - 0 + - 210 + - 270 + - 390 + - 1000 +- - 0 + - 1000 +- - 0 + - 210 + - 270 + - 630 + - 930 + - 1000 +- - 0 + - 210 + - 270 + - 330 + - 390 + - 450 + - 510 + - 810 + - 930 + - 1000 +- - 0 + - 210 + - 1000 +- - 0 + - 210 + - 570 + - 690 + - 810 + - 870 + - 1000 +- - 0 + - 330 + - 1000 +- - 0 + - 210 + - 450 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.2872982749515 + - 599.2872982749515 + - !!python/tuple + - 598.7845545608287 + - 598.8881253296626 + - !!python/tuple + - 598.4127241074534 + - 598.5579971331124 + - !!python/tuple + - 597.8471457340399 + - 598.0221481731817 + - !!python/tuple + - 597.6158505168473 + - 597.8286983148453 + - !!python/tuple + - 597.4079067970073 + - 597.6441746009053 + - !!python/tuple + - 597.402583500057 + - 597.6494978978557 + - !!python/tuple + - 597.402583500057 + - 597.6494978978557 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.0426358459758 + - 599.0426358459758 + - !!python/tuple + - 598.7822142856272 + - 598.9953442839411 + - !!python/tuple + - 598.6262024702149 + - 598.8791661765002 + - !!python/tuple + - 598.2712656902249 + - 598.5521358017697 + - !!python/tuple + - 598.2712656902249 + - 598.5521358017697 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.4392346690771 + - 599.4392346690771 + - !!python/tuple + - 599.0214634818176 + - 599.0214634818176 + - !!python/tuple + - 598.366993350482 + - 598.366993350482 + - !!python/tuple + - 598.366993350482 + - 598.366993350482 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 600.0 + - 600.0 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.492399063192 + - 599.492399063192 + - !!python/tuple + - 599.1314948928496 + - 599.1314948928496 + - !!python/tuple + - 598.3581971271973 + - 598.6335017585271 + - !!python/tuple + - 598.1262783865739 + - 598.6258333918236 + - !!python/tuple + - 598.1262783865739 + - 598.6258333918236 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 598.725453268858 + - 598.725453268858 + - !!python/tuple + - 597.7426423939183 + - 597.7426423939183 + - !!python/tuple + - 596.9407092249074 + - 596.9407092249074 + - !!python/tuple + - 596.2432541374055 + - 596.2432541374055 + - !!python/tuple + - 595.639376182849 + - 595.639376182849 + - !!python/tuple + - 595.0991611466106 + - 595.0991611466106 + - !!python/tuple + - 594.0409370142889 + - 593.7796640514526 + - !!python/tuple + - 593.7542061300894 + - 593.4000081014599 + - !!python/tuple + - 593.7542061300894 + - 593.4000081014599 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.9672777198275 + - 600.0327222801725 + - !!python/tuple + - 599.9672777198275 + - 600.0327222801725 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.9 + - 599.9 + - !!python/tuple + - 599.68054058265 + - 599.6810261434726 + - !!python/tuple + - 599.6495132230045 + - 599.6562054867165 + - !!python/tuple + - 599.6220719009358 + - 599.6350357917096 + - !!python/tuple + - 599.6193597647665 + - 599.6377479278789 + - !!python/tuple + - 599.6193597647665 + - 599.6377479278789 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.7736378818547 + - 599.7736378818547 + - !!python/tuple + - 599.7736378818547 + - 599.7736378818547 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.9 + - 599.9 + - !!python/tuple + - 599.8071867387588 + - 599.9035526671404 + - !!python/tuple + - 599.8071867387588 + - 599.9035526671404 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 330.0 + - 450.0 + - 630.0 + - 810.0 + - 930.0 + - 990.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 617.2783061634985 + - 617.0617818831009 + - 616.9312152012917 + - 616.4729114738197 + - 616.2061373538772 + - 616.0347888382443 + - 616.0347888382443 + - 616.0347888382443 +- !!python/tuple + - !!python/tuple + - 0.0 + - 330.0 + - 570.0 + - 690.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 618.7862510700837 + - 618.6430468113386 + - 618.5761485044333 + - 618.2432617430519 + - 618.2432617430519 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 390.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.6037103298655 + - 619.6968283088894 + - 619.7854937284512 + - 619.7854937284512 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 617.4446810196645 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 630.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 619.1835932654853 + - 618.8986269941673 + - 618.3314535610584 + - 618.2194396623837 + - 618.2194396623837 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 270.0 + - 330.0 + - 390.0 + - 450.0 + - 510.0 + - 810.0 + - 930.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 616.1496235342482 + - 616.1174612070655 + - 616.0047381902368 + - 615.3751945096774 + - 614.4409062601765 + - 614.2469227082893 + - 613.8548545761166 + - 614.1231123845911 + - 614.1231123845911 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.9802638572587 + - 620.9802638572587 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 570.0 + - 690.0 + - 810.0 + - 870.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.1986054415077 + - 619.7206322795994 + - 619.696226696432 + - 619.6749836819699 + - 619.6749836819699 + - 619.6749836819699 +- !!python/tuple + - !!python/tuple + - 0.0 + - 330.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 626.2649827033416 + - 626.2649827033416 +- !!python/tuple + - !!python/tuple + - 0.0 + - 210.0 + - 450.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 616.394021631418 + - 616.3543363712809 + - 616.3543363712809 +problem_name: SSCONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.33 + - 0.45 + - 0.63 + - 0.81 + - 0.93 + - 0.99 + - 1.0 + - !!python/tuple + - 1.0 + - 0.9499107577037154 + - 0.8847234007088108 + - 0.8454146595223313 + - 0.7074365600687788 + - 0.6271208570826755 + - 0.5755342320695214 + - 0.5755342320695214 + - 0.5755342320695214 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.33 + - 0.57 + - 0.69 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 1.4038965313717229 + - 1.360783088755202 + - 1.3406425123423023 + - 1.24042276741025 + - 1.24042276741025 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.39 + - 1.0 + - !!python/tuple + - 1.0 + - 1.6500029195252035 + - 1.6780372578919058 + - 1.7047310972500909 + - 1.7047310972500909 +- !!python/tuple + - !!python/tuple + - 0.0 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.63 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 1.523521395120125 + - 1.4377287162307073 + - 1.2669740230655686 + - 1.2332508305077117 + - 1.2332508305077117 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.27 + - 0.33 + - 0.39 + - 0.45 + - 0.51 + - 0.81 + - 0.93 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6101066611295171 + - 0.600423788151033 + - 0.5664871066571127 + - 0.3769550663096982 + - 0.09567584189882576 + - 0.03727465462879367 + - -0.08076238607320903 + - 0.0 + - 0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 1.0 + - !!python/tuple + - 1.0 + - 2.0644316664906475 + - 2.0644316664906475 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.57 + - 0.69 + - 0.81 + - 0.87 + - 1.0 + - !!python/tuple + - 1.0 + - 1.8291035725601774 + - 1.6852037425638282 + - 1.6778561348974592 + - 1.6714606583031464 + - 1.6714606583031464 + - 1.6714606583031464 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.33 + - 1.0 + - !!python/tuple + - 1.0 + - 3.6554627203969425 + - 3.6554627203969425 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.21 + - 0.45 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6836857811239405 + - 0.6717380345929449 + - 0.6717380345929449 +solver_name: SPSA diff --git a/test/expected_results/SSCONT1_STRONG.yaml b/test/expected_results/SSCONT1_STRONG.yaml new file mode 100644 index 000000000..c440d159e --- /dev/null +++ b/test/expected_results/SSCONT1_STRONG.yaml @@ -0,0 +1,690 @@ +all_est_objectives: +- - 617.4446810196645 + - 616.6414342439866 + - 616.5252127608179 + - 616.5252127608179 +- - 619.9748557704096 + - 618.5785219304116 + - 617.0074318391565 + - 615.1999665513019 + - 614.1174164156048 + - 614.1174164156048 +- - 620.1266657075832 + - 620.2475564665488 + - 620.9785525075871 + - 619.3232228689952 + - 619.9614922931491 + - 619.9614922931491 +- - 619.487755405019 + - 618.8591206585189 + - 617.6647663194445 + - 617.1835698432467 + - 617.1835698432467 +- - 619.1948680580867 + - 618.1070660321731 + - 618.0612626986263 + - 617.2778980375017 + - 616.5716885396627 + - 615.6805031116808 + - 614.9815565759468 + - 614.1105094054724 + - 613.1356039561224 + - 613.1356039561224 +- - 616.3835575737073 + - 616.3835575737073 +- - 620.9802638572587 + - 620.4337267318692 + - 620.3244541465922 + - 619.7326240269025 + - 619.2373597112907 + - 618.3406011503396 + - 618.4754332868172 + - 618.4754332868172 +- - 620.2623512259908 + - 620.0655004825693 + - 618.4962388183314 + - 618.7856169717339 + - 617.5565552752229 + - 618.8087188163986 + - 618.8087188163986 +- - 625.9806452481811 + - 625.7265524476347 + - 623.7782699070654 + - 623.8079755239736 + - 622.2404141988205 + - 621.3383411934182 + - 620.5068343508931 + - 619.7426196535015 + - 618.625243730344 + - 618.625243730344 +- - 615.9747313513403 + - 614.8541772233851 + - 614.1090675621498 + - 613.235248314081 + - 612.024538802368 + - 610.1344296750241 + - 609.445594682739 + - 608.6172432425568 + - 607.7479142058032 + - 606.6304445618683 + - 606.6304445618683 +all_intermediate_budgets: +- - 10 + - 60 + - 948 + - 1000 +- - 10 + - 60 + - 115 + - 550 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 175 + - 550 + - 1000 +- - 10 + - 60 + - 115 + - 240 + - 1000 +- - 10 + - 60 + - 115 + - 175 + - 240 + - 310 + - 385 + - 465 + - 550 + - 1000 +- - 10 + - 1000 +- - 10 + - 60 + - 115 + - 175 + - 240 + - 385 + - 465 + - 1000 +- - 10 + - 60 + - 175 + - 385 + - 465 + - 940 + - 1000 +- - 10 + - 60 + - 115 + - 175 + - 240 + - 310 + - 385 + - 465 + - 640 + - 1000 +- - 10 + - 60 + - 115 + - 175 + - 240 + - 310 + - 385 + - 550 + - 735 + - 835 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 598.2436994615027 + - 599.0432302165755 + - !!python/tuple + - 597.237348414239 + - 597.314861746118 + - !!python/tuple + - 597.237348414239 + - 597.314861746118 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 598.7521421680162 + - 598.4370378023904 + - !!python/tuple + - 597.3640786416004 + - 596.9971490404945 + - !!python/tuple + - 596.3130441598864 + - 595.2955831386711 + - !!python/tuple + - 594.9489777351405 + - 593.8329407391486 + - !!python/tuple + - 594.9489777351405 + - 593.8329407391486 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.4398801887686 + - 601.9199650510012 + - !!python/tuple + - 598.1010356719029 + - 603.4057292852116 + - !!python/tuple + - 597.0268165347238 + - 601.7187043164223 + - !!python/tuple + - 595.6746228097004 + - 603.1923298217687 + - !!python/tuple + - 595.6746228097004 + - 603.1923298217687 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.7016800054165 + - 598.0223738521066 + - !!python/tuple + - 598.1679561437434 + - 596.7387496406901 + - !!python/tuple + - 596.4272388477053 + - 597.7235863252597 + - !!python/tuple + - 596.4272388477053 + - 597.7235863252597 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.3882031580599 + - 598.095871689147 + - !!python/tuple + - 598.912029045398 + - 596.1533840535543 + - !!python/tuple + - 597.23135269916 + - 595.0692590519072 + - !!python/tuple + - 595.4788759256611 + - 596.0330148084903 + - !!python/tuple + - 593.7606803687875 + - 595.0093918171797 + - !!python/tuple + - 592.6305304420773 + - 596.6594709495721 + - !!python/tuple + - 590.6316846382801 + - 596.727408072283 + - !!python/tuple + - 588.6329786538965 + - 596.7993412912363 + - !!python/tuple + - 588.6329786538965 + - 596.7993412912363 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 600.0 + - 600.0 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 599.1794741231304 + - 598.1760654382936 + - !!python/tuple + - 598.6704496934138 + - 600.1102045568556 + - !!python/tuple + - 597.5309568154792 + - 598.4665634825526 + - !!python/tuple + - 595.9056493842735 + - 597.3010697013304 + - !!python/tuple + - 595.082781048302 + - 599.1239486610136 + - !!python/tuple + - 593.6474750822119 + - 597.7311468862781 + - !!python/tuple + - 593.6474750822119 + - 597.7311468862781 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 598.4099763663844 + - 598.786812114904 + - !!python/tuple + - 596.6414246688616 + - 599.720741926608 + - !!python/tuple + - 595.057147443685 + - 598.5000594642999 + - !!python/tuple + - 593.2954279746003 + - 597.5533047377481 + - !!python/tuple + - 592.6083943708317 + - 595.6750116756057 + - !!python/tuple + - 592.6083943708317 + - 595.6750116756057 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 598.4089358359454 + - 598.7881770649715 + - !!python/tuple + - 596.9708599037268 + - 597.3982354787264 + - !!python/tuple + - 595.3674289609226 + - 596.202823745616 + - !!python/tuple + - 593.7066741059848 + - 595.0884210752133 + - !!python/tuple + - 592.0305556930242 + - 593.9972624864946 + - !!python/tuple + - 590.0317379066275 + - 594.066018990074 + - !!python/tuple + - 588.0383463704655 + - 594.2284695473451 + - !!python/tuple + - 586.0768256423029 + - 593.8380384612517 + - !!python/tuple + - 586.0768256423029 + - 593.8380384612517 +- - !!python/tuple + - 600.0 + - 600.0 + - !!python/tuple + - 598.1416415794555 + - 599.2607409244445 + - !!python/tuple + - 596.667213812626 + - 597.9094220278097 + - !!python/tuple + - 594.6754744772924 + - 597.7278334266115 + - !!python/tuple + - 592.8082759325749 + - 597.0111957255345 + - !!python/tuple + - 590.8640326926377 + - 596.5422413312081 + - !!python/tuple + - 588.9454118491695 + - 595.9775342752847 + - !!python/tuple + - 586.9465454802103 + - 596.0448636079986 + - !!python/tuple + - 584.9499578851768 + - 595.9280818655967 + - !!python/tuple + - 582.9800360340884 + - 595.5825273827661 + - !!python/tuple + - 582.9800360340884 + - 595.5825273827661 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 948.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 616.6414342439866 + - 616.5252127608179 + - 616.5252127608179 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 550.0 + - 640.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 618.5785219304116 + - 617.0074318391565 + - 615.1999665513019 + - 614.1174164156048 + - 614.1174164156048 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 175.0 + - 550.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.2475564665488 + - 620.9785525075871 + - 619.3232228689952 + - 619.9614922931491 + - 619.9614922931491 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 240.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 618.8591206585189 + - 617.6647663194445 + - 617.1835698432467 + - 617.1835698432467 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 175.0 + - 240.0 + - 310.0 + - 385.0 + - 465.0 + - 550.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 618.1070660321731 + - 618.0612626986263 + - 617.2778980375017 + - 616.5716885396627 + - 615.6805031116808 + - 614.9815565759468 + - 614.1105094054724 + - 613.1356039561224 + - 613.1356039561224 +- !!python/tuple + - !!python/tuple + - 10.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 617.4446810196645 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 175.0 + - 240.0 + - 385.0 + - 465.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.4337267318692 + - 620.3244541465922 + - 619.7326240269025 + - 619.2373597112907 + - 618.3406011503396 + - 618.4754332868172 + - 618.4754332868172 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 175.0 + - 385.0 + - 465.0 + - 940.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 620.0655004825693 + - 618.4962388183314 + - 618.7856169717339 + - 617.5565552752229 + - 618.8087188163986 + - 618.8087188163986 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 175.0 + - 240.0 + - 310.0 + - 385.0 + - 465.0 + - 640.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 625.7265524476347 + - 623.7782699070654 + - 623.8079755239736 + - 622.2404141988205 + - 621.3383411934182 + - 620.5068343508931 + - 619.7426196535015 + - 618.625243730344 + - 618.625243730344 +- !!python/tuple + - !!python/tuple + - 10.0 + - 60.0 + - 115.0 + - 175.0 + - 240.0 + - 310.0 + - 385.0 + - 550.0 + - 735.0 + - 835.0 + - 1000.0 + - !!python/tuple + - 617.4446810196645 + - 614.8541772233851 + - 614.1090675621498 + - 613.235248314081 + - 612.024538802368 + - 610.1344296750241 + - 609.445594682739 + - 608.6172432425568 + - 607.7479142058032 + - 610.5874984208099 + - 610.5874984208099 +problem_name: SSCONT-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.948 + - 1.0 + - !!python/tuple + - 1.0 + - 0.8828605241149592 + - 0.8659116560495049 + - 0.8659116560495049 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.55 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 1.165350841165663 + - 0.9362348640707088 + - 0.6726477039217997 + - 0.5147767241001492 + - 0.5147767241001492 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.175 + - 0.55 + - 1.0 + - !!python/tuple + - 1.0 + - 1.408750300356953 + - 1.5153532718397953 + - 1.2739524319571927 + - 1.3670328501832631 + - 1.3670328501832631 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.24 + - 1.0 + - !!python/tuple + - 1.0 + - 1.206271251853598 + - 1.032095586869282 + - 0.9619215074626422 + - 0.9619215074626422 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.175 + - 0.24 + - 0.31 + - 0.385 + - 0.465 + - 0.55 + - 1.0 + - !!python/tuple + - 1.0 + - 1.096597254478718 + - 1.0899176403826218 + - 0.9756776227323112 + - 0.8726893345165353 + - 0.7427255461625899 + - 0.6407964337818408 + - 0.5137694576269533 + - 0.37159657025002446 + - 0.37159657025002446 +- !!python/tuple + - !!python/tuple + - 0.01 + - 1.0 + - !!python/tuple + - 1.0 + - 1.0 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.175 + - 0.24 + - 0.385 + - 0.465 + - 1.0 + - !!python/tuple + - 1.0 + - 1.4358999733657434 + - 1.4199644803696414 + - 1.3336564214609365 + - 1.261430794029843 + - 1.130654261828285 + - 1.1503171677716268 + - 1.1503171677716268 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.175 + - 0.385 + - 0.465 + - 0.94 + - 1.0 + - !!python/tuple + - 1.0 + - 1.3822006232330162 + - 1.1533512901993637 + - 1.1955520263225081 + - 1.0163149010465453 + - 1.1989210258105085 + - 1.1989210258105085 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.175 + - 0.24 + - 0.31 + - 0.385 + - 0.465 + - 0.64 + - 1.0 + - !!python/tuple + - 1.0 + - 2.2077659167707804 + - 1.9236430262858724 + - 1.9279750703112433 + - 1.699373701957 + - 1.5678221510980437 + - 1.446561439349757 + - 1.3351141085583549 + - 1.1721643975000329 + - 1.1721643975000329 +- !!python/tuple + - !!python/tuple + - 0.01 + - 0.06 + - 0.115 + - 0.175 + - 0.24 + - 0.31 + - 0.385 + - 0.55 + - 0.735 + - 0.835 + - 1.0 + - !!python/tuple + - 1.0 + - 0.6222203858605067 + - 0.5135591900277156 + - 0.38612795489993007 + - 0.20956717439582498 + - -0.06607214249500647 + - -0.16652666333569185 + - -0.2873272149092509 + - -0.4141036313486781 + - 0.0 + - 0.0 +solver_name: STRONG diff --git a/test/expected_results/TABLEALLOCATION1_RNDSRCH.yaml b/test/expected_results/TABLEALLOCATION1_RNDSRCH.yaml new file mode 100644 index 000000000..6a8edc269 --- /dev/null +++ b/test/expected_results/TABLEALLOCATION1_RNDSRCH.yaml @@ -0,0 +1,498 @@ +all_est_objectives: +- - 5016.6 + - 5214.6 + - 5203.95 + - 5203.95 +- - 5090.55 + - 5235.6 + - 5239.5 + - 5239.5 +- - 5016.45 + - 5192.25 + - 5258.55 + - 5247.15 + - 5247.15 +- - 5057.25 + - 5164.65 + - 5182.65 + - 5182.65 +- - 5088.75 + - 5250.9 + - 5250.9 +- - 5058.45 + - 5236.5 + - 5236.5 +- - 5146.35 + - 5317.05 + - 5317.05 +- - 5133.9 + - 5325.0 + - 5347.05 + - 5351.55 + - 5356.2 + - 5356.2 +- - 5157.3 + - 5335.65 + - 5335.65 +- - 5093.85 + - 5258.7 + - 5317.8 + - 5317.8 +all_intermediate_budgets: +- - 0 + - 20 + - 40 + - 1000 +- - 0 + - 20 + - 50 + - 1000 +- - 0 + - 20 + - 30 + - 40 + - 1000 +- - 0 + - 20 + - 50 + - 1000 +- - 0 + - 30 + - 1000 +- - 0 + - 20 + - 1000 +- - 0 + - 20 + - 1000 +- - 0 + - 20 + - 30 + - 130 + - 280 + - 1000 +- - 0 + - 20 + - 1000 +- - 0 + - 20 + - 30 + - 1000 +all_recommended_xs: +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 5.0 + - 2.0 + - 5.0 + - 4.0 + - !!python/tuple + - 7.0 + - 2.0 + - 3.0 + - 5.0 + - !!python/tuple + - 7.0 + - 2.0 + - 3.0 + - 5.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 3.0 + - 3.0 + - 5.0 + - 4.0 + - !!python/tuple + - 4.0 + - 5.0 + - 2.0 + - 5.0 + - !!python/tuple + - 4.0 + - 5.0 + - 2.0 + - 5.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 2.0 + - 7.0 + - 4.0 + - 3.0 + - !!python/tuple + - 7.0 + - 2.0 + - 3.0 + - 5.0 + - !!python/tuple + - 5.0 + - 5.0 + - 3.0 + - 4.0 + - !!python/tuple + - 5.0 + - 5.0 + - 3.0 + - 4.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 4.0 + - 6.0 + - 4.0 + - 3.0 + - !!python/tuple + - 2.0 + - 5.0 + - 4.0 + - 4.0 + - !!python/tuple + - 2.0 + - 5.0 + - 4.0 + - 4.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 6.0 + - 3.0 + - 4.0 + - 4.0 + - !!python/tuple + - 6.0 + - 3.0 + - 4.0 + - 4.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 6.0 + - 4.0 + - 2.0 + - 5.0 + - !!python/tuple + - 6.0 + - 4.0 + - 2.0 + - 5.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 5.0 + - 2.0 + - 1.0 + - 7.0 + - !!python/tuple + - 5.0 + - 2.0 + - 1.0 + - 7.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 4.0 + - 3.0 + - 6.0 + - 3.0 + - !!python/tuple + - 7.0 + - 2.0 + - 3.0 + - 5.0 + - !!python/tuple + - 5.0 + - 4.0 + - 1.0 + - 6.0 + - !!python/tuple + - 4.0 + - 3.0 + - 2.0 + - 6.0 + - !!python/tuple + - 4.0 + - 3.0 + - 2.0 + - 6.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 5.0 + - 3.0 + - 3.0 + - 5.0 + - !!python/tuple + - 5.0 + - 3.0 + - 3.0 + - 5.0 +- - !!python/tuple + - 10.0 + - 5.0 + - 4.0 + - 2.0 + - !!python/tuple + - 6.0 + - 5.0 + - 4.0 + - 3.0 + - !!python/tuple + - 4.0 + - 2.0 + - 4.0 + - 5.0 + - !!python/tuple + - 4.0 + - 2.0 + - 4.0 + - 5.0 +num_macroreps: 10 +num_postreps: 100 +objective_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5214.6 + - 5203.95 + - 5203.95 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5235.6 + - 5239.5 + - 5239.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 40.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5192.25 + - 5258.55 + - 5247.15 + - 5247.15 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 50.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5164.65 + - 5182.65 + - 5182.65 +- !!python/tuple + - !!python/tuple + - 0.0 + - 30.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5250.9 + - 5250.9 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5236.5 + - 5236.5 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5317.05 + - 5317.05 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 130.0 + - 280.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5325.0 + - 5347.05 + - 5351.55 + - 5216.1 + - 5216.1 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5335.65 + - 5335.65 +- !!python/tuple + - !!python/tuple + - 0.0 + - 20.0 + - 30.0 + - 1000.0 + - !!python/tuple + - 5016.6 + - 5258.7 + - 5317.8 + - 5317.8 +problem_name: TABLEALLOCATION-1 +progress_curves: +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.007518796992481203 + - 0.060902255639100476 + - 0.060902255639100476 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.05 + - 1.0 + - !!python/tuple + - 1.0 + - -0.09774436090225563 + - -0.11729323308270494 + - -0.11729323308270494 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.04 + - 1.0 + - !!python/tuple + - 1.0 + - 0.11954887218045294 + - -0.21278195488721713 + - -0.15563909774435725 + - -0.15563909774435725 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.05 + - 1.0 + - !!python/tuple + - 1.0 + - 0.2578947368421089 + - 0.16766917293233446 + - 0.16766917293233446 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.03 + - 1.0 + - !!python/tuple + - 1.0 + - -0.17443609022556025 + - -0.17443609022556025 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 1.0 + - !!python/tuple + - 1.0 + - -0.10225563909774253 + - -0.10225563909774253 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 1.0 + - !!python/tuple + - 1.0 + - -0.506015037593984 + - -0.506015037593984 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 0.13 + - 0.28 + - 1.0 + - !!python/tuple + - 1.0 + - -0.5458646616541335 + - -0.6563909774436081 + - -0.6789473684210517 + - -0.0 + - -0.0 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 1.0 + - !!python/tuple + - 1.0 + - -0.5992481203007483 + - -0.5992481203007483 +- !!python/tuple + - !!python/tuple + - 0.0 + - 0.02 + - 0.03 + - 1.0 + - !!python/tuple + - 1.0 + - -0.21353383458646344 + - -0.5097744360902247 + - -0.5097744360902247 +solver_name: RNDSRCH diff --git a/test/experiment_test_core.py b/test/experiment_test_core.py new file mode 100644 index 000000000..39855f496 --- /dev/null +++ b/test/experiment_test_core.py @@ -0,0 +1,355 @@ +"""Experiment test module. + +This file is split up into two sections: +1. The ExperimentTest class acts as a base class for each test case. + It inherits from unittest.TestCase and sets up the experiment. +2. The ExperimentTestMixin class contains the test methods that check + the results of the experiment against the expected results. + +The reason these are separate is to prevent the test cases from being +executed without first being setup. When the test cases were in the same +class as the setup, they would be executed whenever they were discovered +by unittest, even if the setup had not been run. This caused problems as +the setup was not run and the test cases would fail. +""" + +import math +import unittest +from abc import abstractmethod +from pathlib import Path +from typing import Any + +import yaml + +from simopt.experiment_base import ProblemSolver, post_normalize + + +class ExperimentTest(unittest.TestCase): + """Base class for experiment tests. + + This class sets up the experiment and checks that the solver and + problem names match the expected values. It also loads the expected + results from a YAML file in the test/expected_results directory + (specified by the file attribute in the test class). + """ + + @property + @abstractmethod + def filepath(self) -> Path: + """Return the name of the experiment file.""" + error_msg = "The file name must be set in the test class." + raise NotImplementedError(error_msg) + + def setUp(self) -> None: + """Set up the experiment and load expected results.""" + # Set the name of the experiment file + with self.filepath.open("rb") as f: + expected_results = yaml.load(f, Loader=yaml.Loader) + + self.num_macroreps = expected_results["num_macroreps"] + self.num_postreps = expected_results["num_postreps"] + self.expected_problem_name = expected_results["problem_name"] + self.expected_solver_name = expected_results["solver_name"] + self.expected_all_recommended_xs = expected_results["all_recommended_xs"] + self.expected_all_intermediate_budgets = expected_results[ + "all_intermediate_budgets" + ] + self.expected_all_est_objectives = expected_results["all_est_objectives"] + self.expected_objective_curves = expected_results["objective_curves"] + self.expected_progress_curves = expected_results["progress_curves"] + + # Get rid of it to save memory + del expected_results + + # Setup the solver and experiment + self.myexperiment = ProblemSolver( + self.expected_solver_name, self.expected_problem_name + ) + self.assertEqual( + self.myexperiment.solver.name, + self.expected_solver_name, + ) + self.assertEqual( + self.myexperiment.problem.name, + self.expected_problem_name, + ) + + +class ExperimentTestMixin: + """Mixin class for experiment tests. + + This class contains the test methods that check the results of the + experiment against the expected results. It expects that any classes + that inherit from it will have already set up the experiment in the + setUp method of the ExperimentTest class. + """ + + def test_run(self: Any) -> None: + """Test the run method of the experiment.""" + ps_names = f"{self.expected_problem_name} | {self.expected_solver_name}" + # Check actual run results against expected + self.myexperiment.run(n_macroreps=self.num_macroreps) + self.assertEqual( + self.myexperiment.n_macroreps, + self.num_macroreps, + f"[{ps_names}] Number of macro-replications does not match", + ) + # For each macroreplication + for mrep in range(self.num_macroreps): + rec_xs = self.myexperiment.all_recommended_xs[mrep] + expected_rec_xs = self.expected_all_recommended_xs[mrep] + # Check to make sure the list lengths are the same + self.assertEqual( + len(rec_xs), + len(expected_rec_xs), + f"[{ps_names} | {mrep}] Length of recommended solutions do not match", + ) + # For each list of recommended solutions + for sol_list_idx in range(len(rec_xs)): + rec_xs_list = rec_xs[sol_list_idx] + expected_rec_xs_list = expected_rec_xs[sol_list_idx] + # Check to make sure the tuples are the same length + self.assertEqual( + len(rec_xs_list), + len(expected_rec_xs_list), + f"[{ps_names} | {mrep} | {sol_list_idx}] " + f"Length of recommended solutions do not match", + ) + # For each tuple of recommended solutions + for sol_idx in range(len(rec_xs_list)): + rec_xs_tup = rec_xs_list[sol_idx] + expected_rec_xs_tup = expected_rec_xs_list[sol_idx] + self.assertAlmostEqual( + rec_xs_tup, + expected_rec_xs_tup, + 5, + f"[{ps_names} | {mrep} | {sol_list_idx} | {sol_idx}] " + f"Recommended solutions do not match", + ) + # Check to make sure the list lengths are the same + int_budg = self.myexperiment.all_intermediate_budgets[mrep] + expected_int_budg = self.expected_all_intermediate_budgets[mrep] + self.assertEqual( + len(int_budg), + len(expected_int_budg), + f"[{ps_names} | {mrep}] Length of intermediate budgets do not match", + ) + # For each list of intermediate budgets + for sol_list_idx in range(len(int_budg)): + int_budg_list = int_budg[sol_list_idx] + expected_int_budg_list = expected_int_budg[sol_list_idx] + # Check the values in the list + self.assertAlmostEqual( + int_budg_list, + expected_int_budg_list, + 5, + f"[{ps_names} | {mrep} | {sol_list_idx}] " + f"Intermediate budgets do not match", + ) + + def test_post_replicate(self: Any) -> None: + """Test the post_replicate method of the experiment.""" + ps_names = f"{self.expected_problem_name} | {self.expected_solver_name}" + # Simulate results from the run method + self.myexperiment = ProblemSolver( + self.expected_solver_name, self.expected_problem_name + ) + self.myexperiment.n_macroreps = self.num_macroreps + self.myexperiment.all_recommended_xs = self.expected_all_recommended_xs + self.myexperiment.all_intermediate_budgets = ( + self.expected_all_intermediate_budgets + ) + + # Check actual post-replication results against expected + self.myexperiment.post_replicate(n_postreps=self.num_postreps) + self.assertEqual( + self.myexperiment.n_postreps, + self.num_postreps, + f"[{ps_names}] Number of post-replications does not match", + ) + # For each macroreplication + for mrep in range(self.num_macroreps): + est_obj = self.myexperiment.all_est_objectives[mrep] + expected_est_obj = self.expected_all_est_objectives[mrep] + # Check to make sure the list lengths are the same + self.assertEqual( + len(est_obj), + len(expected_est_obj), + f"[{ps_names} | {mrep}] Length of estimated objectives do not match", + ) + # For each list in the estimated objectives + for objective_idx in range(len(est_obj)): + est_obj_list = est_obj[objective_idx] + expected_est_obj_list = expected_est_obj[objective_idx] + # Check the values in the list + self.assertAlmostEqual( + est_obj_list, + expected_est_obj_list, + 5, + f"[{ps_names} | {mrep} | {objective_idx}] " + f"Estimated objectives do not match", + ) + + def test_post_normalize(self: Any) -> None: + """Test the post_normalize method of the experiment.""" + ps_names = f"{self.expected_problem_name} | {self.expected_solver_name}" + # Simulate results from the post_replicate method + self.myexperiment = ProblemSolver( + self.expected_solver_name, self.expected_problem_name + ) + self.myexperiment.n_macroreps = self.num_macroreps + self.myexperiment.n_postreps = self.num_postreps + self.myexperiment.all_recommended_xs = self.expected_all_recommended_xs + self.myexperiment.all_intermediate_budgets = ( + self.expected_all_intermediate_budgets + ) + self.myexperiment.all_est_objectives = self.expected_all_est_objectives + self.myexperiment.has_run = True + self.myexperiment.has_postreplicated = True + # Check actual post-normalization results against expected + post_normalize([self.myexperiment], n_postreps_init_opt=self.num_postreps) + + objective_curves = [ + [curve.x_vals, curve.y_vals] for curve in self.myexperiment.objective_curves + ] + + progress_curves = [ + [curve.x_vals, curve.y_vals] for curve in self.myexperiment.progress_curves + ] + + for mrep in range(self.num_macroreps): + obj_curves = objective_curves[mrep] + expected_obj_curves = self.expected_objective_curves[mrep] + # Check to make sure the same number of objective curves are present + # This should probably always be 2 (x and y) + self.assertEqual( + len(obj_curves), + len(expected_obj_curves), + f"[{ps_names} | {mrep}] Number of objective curves do not match", + ) + # Make sure that curves are only checked if they exist + # TODO: check if this is necessary + if len(obj_curves) > 0: + obj_curve_x = obj_curves[0] + expected_obj_curve_x = expected_obj_curves[0] + # Make sure the lengths of the X and Y values are the same + self.assertEqual( + len(obj_curve_x), + len(expected_obj_curve_x), + f"[{ps_names} | {mrep}] Length of X values do not match", + ) + obj_curve_y = obj_curves[1] + expected_obj_curve_y = expected_obj_curves[1] + self.assertEqual( + len(obj_curve_y), + len(expected_obj_curve_y), + f"[{ps_names} | {mrep}] Length of Y values do not match", + ) + # Check X (0) and Y (1) values + for x_index in range(len(obj_curve_x)): + obj_curve_x_val = obj_curve_x[x_index] + expected_obj_curve_x_val = expected_obj_curve_x[x_index] + # If the value is NaN, make sure we're expecting NaN + if math.isnan(obj_curve_x_val): + self.assertTrue( + math.isnan(expected_obj_curve_x_val), + f"[{ps_names} | {mrep} | {x_index}] " + f"Unexpected NaN value in X values", + ) + # Otherwise, check the value normally + else: + self.assertAlmostEqual( + obj_curve_x_val, + expected_obj_curve_x_val, + 5, + f"[{ps_names} | {mrep} | {x_index}] X values do not match", + ) + for y_index in range(len(obj_curve_y)): + obj_curve_y_val = obj_curve_y[y_index] + expected_obj_curve_y_val = expected_obj_curve_y[y_index] + # If the value is NaN, make sure we're expecting NaN + if math.isnan(obj_curve_y_val): + self.assertTrue( + math.isnan(expected_obj_curve_y_val), + f"[{ps_names} | {mrep} | {y_index}] " + f"Unexpected NaN value in Y values", + ) + # Otherwise, check the value normally + else: + self.assertAlmostEqual( + obj_curve_y_val, + expected_obj_curve_y_val, + 5, + f"[{ps_names} | {mrep} | {y_index}] Y values do not match", + ) + + # Check to make sure the same number of progress curves are present + # This should probably always be 2 (x and y) + prog_curves = progress_curves[mrep] + expected_prog_curves = self.expected_progress_curves[mrep] + self.assertEqual( + len(prog_curves), + len(expected_prog_curves), + f"[{ps_names} | {mrep}] Number of progress curves do not match", + ) + # Make sure that curves are only checked if they exist + # TODO: check if this is necessary + if len(prog_curves) > 0: + prog_curve_x = prog_curves[0] + expected_prog_curve_x = expected_prog_curves[0] + # Make sure the lengths of the X and Y values are the same + self.assertEqual( + len(prog_curve_x), + len(expected_prog_curve_x), + f"[{ps_names} | {mrep}] Length of X values do not match", + ) + prog_curve_y = prog_curves[1] + expected_prog_curve_y = expected_prog_curves[1] + self.assertEqual( + len(prog_curve_y), + len(expected_prog_curve_y), + f"[{ps_names} | {mrep}] Length of Y values do not match", + ) + # Check X (0) and Y (1) values + for x_index in range(len(prog_curve_x)): + prog_curve_x_val = prog_curve_x[x_index] + expected_prog_curve_x_val = expected_prog_curve_x[x_index] + # If the value is NaN, make sure we're expecting NaN + if math.isnan(prog_curve_x_val): + self.assertTrue( + math.isnan(expected_prog_curve_x_val), + f"[{ps_names} | {mrep} | {x_index}] " + f"Unexpected NaN value in X values", + ) + # Otherwise, check the value normally + else: + self.assertTrue( + math.isclose( + prog_curve_x_val, + expected_prog_curve_x_val, + rel_tol=1e-8, + abs_tol=1e-8, + ), + f"[{ps_names} | {mrep} | {x_index}] X values do not match", + ) + for y_index in range(len(prog_curve_y)): + prog_curve_y_val = prog_curve_y[y_index] + expected_prog_curve_y_val = expected_prog_curve_y[y_index] + # If the value is NaN, make sure we're expecting NaN + if math.isnan(prog_curve_y_val): + self.assertTrue( + math.isnan(expected_prog_curve_y_val), + f"[{ps_names} | {mrep} | {y_index}] " + f"Unexpected NaN value in Y values", + ) + # Otherwise, check the value normally + else: + self.assertTrue( + math.isclose( + prog_curve_y_val, + expected_prog_curve_y_val, + rel_tol=1e-8, + abs_tol=1e-8, + ), + f"[{ps_names} | {mrep} | {y_index}] Y values do not match", + ) diff --git a/test/make_tests.py b/test/make_tests.py deleted file mode 100644 index 317e8e796..000000000 --- a/test/make_tests.py +++ /dev/null @@ -1,136 +0,0 @@ -"""Create test cases for all compatible problem-solver pairs.""" -# TO RUN FROM TOP DIRECTORY: -# python -m test.make_tests - -import os - -from simopt.directory import problem_directory, solver_directory -from simopt.experiment_base import ProblemSolver, post_normalize - - -# Check compatibility of a solver with a problem -# Based off the similar function in simopt/experiment_base.py -def is_compatible(problem_name: str, solver_name: str) -> bool: - """Check if a solver is compatible with a problem. - - Parameters - ---------- - problem_name : str - Name of the problem. - solver_name : str - Name of the solver. - - Returns - ------- - bool - True if the solver is compatible with the problem, False otherwise. - - """ - # Create a ProblemSolver object - myexperiment = ProblemSolver(solver_name, problem_name) - # Check if the solver is compatible with the problem - output = myexperiment.check_compatibility() - return len(output) == 0 - - -# Create a test case for a problem and solver -def create_test(problem_name: str, solver_name: str) -> None: - """Create a test case for a problem and solver. - - Parameters - ---------- - problem_name : str - Name of the problem. - solver_name : str - Name of the solver. - - """ - # Run the experiment to get the expected results - myexperiment = ProblemSolver(solver_name, problem_name) - myexperiment.run(n_macroreps=24) - myexperiment.post_replicate(n_postreps=200) - post_normalize([myexperiment], n_postreps_init_opt=200) - - # Loop through each curve object and convert it into a tuple - # This is done to avoid pickling issues - for i in range(len(myexperiment.objective_curves)): - myexperiment.objective_curves[i] = ( # type: ignore - myexperiment.objective_curves[i].x_vals, - myexperiment.objective_curves[i].y_vals, - ) - for i in range(len(myexperiment.progress_curves)): - myexperiment.progress_curves[i] = ( # type: ignore - myexperiment.progress_curves[i].x_vals, - myexperiment.progress_curves[i].y_vals, - ) - - # Strip any non-alphanumeric characters from the problem and solver names - file_problem_name = "".join(e for e in problem_name if e.isalnum()) - file_solver_name = "".join(e for e in solver_name if e.isalnum()) - filename = "test_" + file_problem_name + "_" + file_solver_name + ".py" - - # Open the file template and read it - cwd = os.getcwd() # Get the current working directory - filepath = cwd + "/test/" + filename - with open(cwd + "/test/template.py", "rb") as f: - template = f.read() - - # Loop through the template and replace the placeholders with the actual values - template = template.replace(b"{{PROBLEM_NAME}}", problem_name.encode()) - template = template.replace(b"{{SOLVER_NAME}}", solver_name.encode()) - template = template.replace( - b"{{ALL_RECOMMENDED_XS}}", str(myexperiment.all_recommended_xs).encode() - ) - template = template.replace( - b"{{ALL_INTERMEDIATE_BUDGETS}}", - str(myexperiment.all_intermediate_budgets).encode(), - ) - template = template.replace( - b"{{ALL_EST_OBJECTIVES}}", str(myexperiment.all_est_objectives).encode() - ) - template = template.replace( - b"{{OBJECTIVE_CURVES}}", str(myexperiment.objective_curves).encode() - ) - template = template.replace( - b"{{PROGRESS_CURVES}}", str(myexperiment.progress_curves).encode() - ) - problem_name_title = problem_name.title() - solver_name_title = solver_name.title() - template = template.replace( - b"TestProblemSolver", - ("Test" + problem_name_title + solver_name_title).encode(), - ) # Replace the class name - - # Write the new test into the new file - with open(filepath, "xb") as f: - f.write(template) - - -def main() -> None: - """Create test cases for all compatible problem-solver pairs.""" - # Delete all files beginning with "test_" in the test directory - cwd = os.getcwd() # Get the current working directory - test_directory = cwd + "/test" - for filename in os.listdir(test_directory): - if filename.startswith("test_"): - os.remove(test_directory + "/" + filename) - - # Loop through all the problems and solvers - for problem_name in problem_directory: - for solver_name in solver_directory: - # Check if the solver is compatible with the problem - if is_compatible(problem_name, solver_name): - # Create the test case - create_test(problem_name, solver_name) - print("Created test for", problem_name, solver_name) - else: - print( - "Skipping", - problem_name, - solver_name, - "as it is not compatible", - ) - - -if __name__ == "__main__": - main() diff --git a/test/template.py b/test/template.py deleted file mode 100644 index 78ddafcf0..000000000 --- a/test/template.py +++ /dev/null @@ -1,479 +0,0 @@ -import unittest -import math - -from simopt.experiment_base import ProblemSolver, post_normalize - -# Note: Tests have inherent randomness and may vary **slightly** between -# runs/systems. To make sure these tsts still work, assertAlmostEqual -# is used instead of assertEqual. -# Some attributes, such as the lengths of lists, are still checked -# with assertEqual as these should not change between runs. - - -class TestProblemSolver(unittest.TestCase): - def setUp(self) -> None: - # Expected values - self.expected_problem_name = "{{PROBLEM_NAME}}" - self.expected_solver_name = "{{SOLVER_NAME}}" - self.expected_all_recommended_xs = "{{ALL_RECOMMENDED_XS}}" - self.expected_all_intermediate_budgets = "{{ALL_INTERMEDIATE_BUDGETS}}" - self.expected_all_est_objectives = "{{ALL_EST_OBJECTIVES}}" - self.expected_objective_curves = "{{OBJECTIVE_CURVES}}" - self.expected_progress_curves = "{{PROGRESS_CURVES}}" - - # Convert the expected values from string to their actual types - self.expected_all_recommended_xs = eval( - self.expected_all_recommended_xs, - {"nan": float("nan"), "inf": float("inf")}, - ) - self.expected_all_intermediate_budgets = eval( - self.expected_all_intermediate_budgets, - {"nan": float("nan"), "inf": float("inf")}, - ) - self.expected_all_est_objectives = eval( - self.expected_all_est_objectives, - {"nan": float("nan"), "inf": float("inf")}, - ) - self.expected_objective_curves = eval( - self.expected_objective_curves, - {"nan": float("nan"), "inf": float("inf")}, - ) - self.expected_progress_curves = eval( - self.expected_progress_curves, - {"nan": float("nan"), "inf": float("inf")}, - ) - - # Number of macro-replications and post-replications - self.num_macroreps = 24 - self.num_postreps = 200 - - # Setup the solver and experiment - self.myexperiment = ProblemSolver( - self.expected_solver_name, self.expected_problem_name - ) - self.assertEqual( - self.myexperiment.solver.name, - self.expected_solver_name, - "Solver name does not match (expected: " - + self.expected_solver_name - + ", actual: " - + self.myexperiment.solver.name - + ")", - ) - self.assertEqual( - self.myexperiment.problem.name, - self.expected_problem_name, - "Problem name does not match (expected: " - + self.expected_problem_name - + ", actual: " - + self.myexperiment.problem.name - + ")", - ) - - def test_run(self) -> None: - # Check actual run results against expected - self.myexperiment.run(n_macroreps=self.num_macroreps) - self.assertEqual( - self.myexperiment.n_macroreps, - self.num_macroreps, - "Number of macro-replications for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " does not match.", - ) - # For each macroreplication - for mrep in range(self.num_macroreps): - # Check to make sure the list lengths are the same - self.assertEqual( - len(self.myexperiment.all_recommended_xs[mrep]), - len(self.expected_all_recommended_xs[mrep]), - "Length of recommended solutions for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match.", - ) - # For each list of recommended solutions - for sol_list_idx in range( - len(self.myexperiment.all_recommended_xs[mrep]) - ): - # Check to make sure the tuples are the same length - self.assertEqual( - len( - self.myexperiment.all_recommended_xs[mrep][sol_list_idx] - ), - len(self.expected_all_recommended_xs[mrep][sol_list_idx]), - "Recommended solutions for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(sol_list_idx) - + ".", - ) - # For each tuple of recommended solutions - for sol_idx in range( - len( - self.myexperiment.all_recommended_xs[mrep][sol_list_idx] - ) - ): - self.assertAlmostEqual( - self.myexperiment.all_recommended_xs[mrep][ - sol_list_idx - ][sol_idx], - self.expected_all_recommended_xs[mrep][sol_list_idx][ - sol_idx - ], - 5, - "Recommended solutions for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(sol_list_idx) - + " and tuple " - + str(sol_idx) - + ".", - ) - # Check to make sure the list lengths are the same - self.assertEqual( - len(self.myexperiment.all_intermediate_budgets[mrep]), - len(self.expected_all_intermediate_budgets[mrep]), - "Length of intermediate budgets for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match.", - ) - # For each list of intermediate budgets - for sol_list_idx in range( - len(self.myexperiment.all_intermediate_budgets[mrep]) - ): - # Check the values in the list - self.assertAlmostEqual( - self.myexperiment.all_intermediate_budgets[mrep][ - sol_list_idx - ], - self.expected_all_intermediate_budgets[mrep][sol_list_idx], - 5, - "Intermediate budgets for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(sol_list_idx) - + ".", - ) - - def test_post_replicate(self) -> None: - # Simulate results from the run method - self.myexperiment = ProblemSolver( - self.expected_solver_name, self.expected_problem_name - ) - self.myexperiment.n_macroreps = self.num_macroreps - self.myexperiment.all_recommended_xs = self.expected_all_recommended_xs - self.myexperiment.all_intermediate_budgets = ( - self.expected_all_intermediate_budgets - ) - - # Check actual post-replication results against expected - self.myexperiment.post_replicate(n_postreps=self.num_postreps) - self.assertEqual( - self.myexperiment.n_postreps, - self.num_postreps, - "Number of post-replications for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " does not match.", - ) - # For each macroreplication - for mrep in range(self.num_macroreps): - # Check to make sure the list lengths are the same - self.assertEqual( - len(self.myexperiment.all_est_objectives[mrep]), - len(self.expected_all_est_objectives[mrep]), - "Estimated objectives for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match.", - ) - # For each list in the estimated objectives - for objective_idx in range( - len(self.myexperiment.all_est_objectives[mrep]) - ): - # Check the values in the list - self.assertAlmostEqual( - self.myexperiment.all_est_objectives[mrep][objective_idx], - self.expected_all_est_objectives[mrep][objective_idx], - 5, - "Estimated objectives for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(objective_idx) - + ".", - ) - - def test_post_normalize(self) -> None: - # Simulate results from the post_replicate method - self.myexperiment = ProblemSolver( - self.expected_solver_name, self.expected_problem_name - ) - self.myexperiment.n_macroreps = self.num_macroreps - self.myexperiment.n_postreps = self.num_postreps - self.myexperiment.all_recommended_xs = self.expected_all_recommended_xs - self.myexperiment.all_intermediate_budgets = ( - self.expected_all_intermediate_budgets - ) - self.myexperiment.all_est_objectives = self.expected_all_est_objectives - self.myexperiment.has_run = True - self.myexperiment.has_postreplicated = True - # Check actual post-normalization results against expected - post_normalize( - [self.myexperiment], n_postreps_init_opt=self.num_postreps - ) - - # Loop through each curve object and convert it into a tuple - for i in range(len(self.myexperiment.objective_curves)): - self.myexperiment.objective_curves[i] = ( - self.myexperiment.objective_curves[i].x_vals, - self.myexperiment.objective_curves[i].y_vals, - ) - for i in range(len(self.myexperiment.progress_curves)): - self.myexperiment.progress_curves[i] = ( - self.myexperiment.progress_curves[i].x_vals, - self.myexperiment.progress_curves[i].y_vals, - ) - - for mrep in range(self.num_macroreps): - # Check to make sure the same number of objective curves are present - # This should probably always be 2 (x and y) - self.assertEqual( - len(self.myexperiment.objective_curves[mrep]), - len(self.expected_objective_curves[mrep]), - "Number of objective curves for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " does not match.", - ) - # Make sure that curves are only checked if they exist - if len(self.myexperiment.objective_curves[mrep]) > 0: - # Make sure the lengths of the X and Y values are the same - self.assertEqual( - len(self.myexperiment.objective_curves[mrep][0]), - len(self.expected_objective_curves[mrep][0]), - "Length of X values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match.", - ) - self.assertEqual( - len(self.myexperiment.objective_curves[mrep][1]), - len(self.expected_objective_curves[mrep][1]), - "Length of Y values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match.", - ) - # Check X (0) and Y (1) values - for x_index in range( - len(self.myexperiment.objective_curves[mrep][0]) - ): - # If the value is NaN, make sure we're expecting NaN - if math.isnan( - self.myexperiment.objective_curves[mrep][0][x_index] - ): - self.assertTrue( - math.isnan( - self.expected_objective_curves[mrep][0][x_index] - ), - "X values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(x_index) - + ".", - ) - # Otherwise, check the value normally - else: - self.assertAlmostEqual( - self.myexperiment.objective_curves[mrep][0][ - x_index - ], - self.expected_objective_curves[mrep][0][x_index], - 5, - "X values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(x_index) - + ".", - ) - for y_index in range( - len(self.myexperiment.objective_curves[mrep][1]) - ): - # If the value is NaN, make sure we're expecting NaN - if math.isnan( - self.myexperiment.objective_curves[mrep][1][y_index] - ): - self.assertTrue( - math.isnan( - self.expected_objective_curves[mrep][1][y_index] - ), - "Y values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(y_index) - + ".", - ) - # Otherwise, check the value normally - else: - self.assertAlmostEqual( - self.myexperiment.objective_curves[mrep][1][ - y_index - ], - self.expected_objective_curves[mrep][1][y_index], - 5, - "Y values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(y_index) - + ".", - ) - - # Check to make sure the same number of progress curves are present - # This should probably always be 2 (x and y) - self.assertEqual( - len(self.myexperiment.progress_curves[mrep]), - len(self.expected_progress_curves[mrep]), - "Number of progress curves for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " does not match.", - ) - # Make sure that curves are only checked if they exist - if len(self.myexperiment.progress_curves[mrep]) > 0: - # Make sure the lengths of the X and Y values are the same - self.assertEqual( - len(self.myexperiment.progress_curves[mrep][0]), - len(self.expected_progress_curves[mrep][0]), - "Length of X values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match.", - ) - self.assertEqual( - len(self.myexperiment.progress_curves[mrep][1]), - len(self.expected_progress_curves[mrep][1]), - "Length of Y values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match.", - ) - # Check X (0) and Y (1) values - for x_index in range( - len(self.myexperiment.progress_curves[mrep][0]) - ): - # If the value is NaN, make sure we're expecting NaN - if math.isnan( - self.myexperiment.progress_curves[mrep][0][x_index] - ): - self.assertTrue( - math.isnan( - self.expected_progress_curves[mrep][0][x_index] - ), - "X values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(x_index) - + ".", - ) - # Otherwise, check the value normally - else: - self.assertAlmostEqual( - self.myexperiment.progress_curves[mrep][0][x_index], - self.expected_progress_curves[mrep][0][x_index], - 5, - "X values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(x_index) - + ".", - ) - for y_index in range( - len(self.myexperiment.progress_curves[mrep][1]) - ): - # If the value is NaN, make sure we're expecting NaN - if math.isnan( - self.myexperiment.progress_curves[mrep][1][y_index] - ): - self.assertTrue( - math.isnan( - self.expected_progress_curves[mrep][1][y_index] - ), - "Y values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(y_index) - + ".", - ) - # Otherwise, check the value normally - else: - self.assertAlmostEqual( - self.myexperiment.progress_curves[mrep][1][y_index], - self.expected_progress_curves[mrep][1][y_index], - 5, - "Y values for problem " - + self.expected_problem_name - + " and solver " - + self.expected_solver_name - + " do not match at mrep " - + str(mrep) - + " and index " - + str(y_index) - + ".", - ) diff --git a/test/test_experiments.py b/test/test_experiments.py new file mode 100644 index 000000000..6049315f1 --- /dev/null +++ b/test/test_experiments.py @@ -0,0 +1,44 @@ +"""Dynamically generate test classes for each YAML in the expected results directory. + +This script automatically creates test classes for each YAML file in the +`expected_results` directory. This allows for easy addition of new test cases +and, by utilizing the experiment test core, ensures that any changes to test +methodology are automatically applied to all tests. It also essentially +eliminates DRY violations in the experiment testing process. +""" + +from pathlib import Path + +# these imports aren't used outside of the exec +from experiment_test_core import ( # noqa: F401 + ExperimentTest, + ExperimentTestMixin, +) + +EXPECTED_RESULTS_DIR = Path(__file__).parent / "expected_results" + +# Build a mapping of class names to file paths +_FILE_CLASS_MAP = {} + + +def _filename_to_classname(file: str) -> str: + name = file.replace(".yaml", "") + parts = name.replace("-", "_").split("_") + return "Test" + "".join(part.title() for part in parts) + + +for yaml_path in EXPECTED_RESULTS_DIR.glob("*.yaml"): + class_name = _filename_to_classname(yaml_path.name) + _FILE_CLASS_MAP[class_name] = yaml_path.resolve() # store full path + +# Explicitly define each class so that unittest and vs code can find them +# NOTE: exec is usually not recommended due to security concerns, but in this +# case it should be fine as long as nobody tries injecting malicious filenames +# into the expected results directory. +for class_name, full_path in _FILE_CLASS_MAP.items(): + exec(f""" +class {class_name}(ExperimentTest, ExperimentTestMixin): + @property + def filepath(self): + return Path(r'{full_path!s}') +""") diff --git a/test/time_tests.py b/test/time_tests.py deleted file mode 100644 index 205feb0a6..000000000 --- a/test/time_tests.py +++ /dev/null @@ -1,38 +0,0 @@ -import os -import subprocess - -file_names = [] - -cwd = os.getcwd() -test_folder = os.path.join(cwd, "test") -for entry in os.listdir(test_folder): - if entry.startswith("test_") and entry.endswith(".py"): - file_names.append(entry) - -runtime_dict = {} -for file_name in file_names: - filepath = os.path.join(test_folder, file_name) - class_name = file_name.split(".")[0] - for method_name in [ - "test_run", - "test_post_replicate", - "test_post_normalize", - ]: - test_name = f"{class_name}::{method_name}" - print(f"Running test: {test_name}") - command = f"pytest {filepath}::{test_name}" - process = subprocess.run(command, shell=True, capture_output=True) - # Look for the line with "1 passed in " - output_lines = process.stdout.decode().split("\n") - for line in output_lines: - if "1 passed in" in line: - runtime = line.split("1 passed in")[1] - # Strip and remove anything that isn't a number or period - runtime = "".join( - [c for c in runtime if c.isdigit() or c == "."] - ) - runtime_dict[test_name] = runtime - print(f"Finished test in {runtime} seconds") - -for key, value in runtime_dict.items(): - print(key, value) diff --git a/workshop/README.md b/workshop/README.md index ab81b3d5a..83e4cab45 100644 --- a/workshop/README.md +++ b/workshop/README.md @@ -65,7 +65,7 @@ print(msg) 11. In your browser, navigate to [https://github.com/simopt-admin/simopt](https://github.com/simopt-admin/simopt). Click on "Download ZIP" as shown. ![zip-1](./figs/instruction-2.png) - + Unzip the folder **simopt-master** and open it in VS Code using `File > Open Folder`. Open the file `workshop/workshop.ipynb` in the VS Code editor and follow along. diff --git a/workshop/workshop.ipynb b/workshop/workshop.ipynb index 9ead4f3b1..2c0527ebd 100644 --- a/workshop/workshop.ipynb +++ b/workshop/workshop.ipynb @@ -37,11 +37,12 @@ "\n", "# Import experiment_base module, which contains functions for experimentation.\n", "import simopt.experiment_base as expbase\n", + "from simopt.experiment_base import PlotType\n", "\n", "# Import Example problem and Random Search and ADAM solvers.\n", "from simopt.models.example import ExampleProblem\n", - "from simopt.solvers.randomsearch import RandomSearch\n", - "from simopt.solvers.adam import ADAM" + "from simopt.solvers.adam import ADAM\n", + "from simopt.solvers.randomsearch import RandomSearch" ] }, { @@ -80,9 +81,7 @@ ")\n", "\n", "# Pair the problem and solver for experimentation.\n", - "myexperiment = expbase.ProblemSolver(\n", - " problem=my_problem, solver=my_rand_search_solver\n", - ")" + "myexperiment = expbase.ProblemSolver(problem=my_problem, solver=my_rand_search_solver)" ] }, { @@ -112,15 +111,15 @@ "\n", "# Record a summary of the results in a human-readable way.\n", "myexperiment.log_experiment_results()\n", - "# [Go check out the file called experiments/logs/RNDSRCH_on_EXAMPLE-1_experiment_results.txt.]\n", + "# [Go check out the file called experiments/logs/RNDSRCH_on_EXAMPLE-1_experiment_results.txt] # noqa: E501\n", "\n", "# Plot the (unnormalized) progress curves from the 10 macroreplications.\n", "expbase.plot_progress_curves(\n", - " experiments=[myexperiment], plot_type=\"all\", normalize=False\n", + " experiments=[myexperiment], plot_type=PlotType.ALL, normalize=False\n", ")\n", "# Plot the (unnormalized) mean progress curve with bootstrapped CIs.\n", "expbase.plot_progress_curves(\n", - " experiments=[myexperiment], plot_type=\"mean\", normalize=False\n", + " experiments=[myexperiment], plot_type=PlotType.MEAN, normalize=False\n", ")\n", "# [The plots should be displayed in the output produced below.]" ] @@ -183,9 +182,10 @@ "\n", "sys.path.append(\"venv\\\\lib\\\\site-packages\")\n", "import simopt.experiment_base as expbase\n", + "from simopt.experiment_base import PlotType\n", "from simopt.models.example import ExampleProblem\n", - "from simopt.solvers.randomsearch import RandomSearch\n", "from simopt.solvers.adam import ADAM\n", + "from simopt.solvers.randomsearch import RandomSearch\n", "\n", "my_problem = ExampleProblem(\n", " fixed_factors={\"initial_solution\": (2.0, 2.0), \"budget\": 200}\n", @@ -193,19 +193,17 @@ "my_rand_search_solver = RandomSearch(\n", " fixed_factors={\"crn_across_solns\": True, \"sample_size\": 10}\n", ")\n", - "myexperiment = expbase.ProblemSolver(\n", - " problem=my_problem, solver=my_rand_search_solver\n", - ")\n", + "myexperiment = expbase.ProblemSolver(problem=my_problem, solver=my_rand_search_solver)\n", "\n", "myexperiment.run(n_macroreps=10)\n", "myexperiment.post_replicate(n_postreps=200)\n", "expbase.post_normalize(experiments=[myexperiment], n_postreps_init_opt=200)\n", "myexperiment.log_experiment_results()\n", "expbase.plot_progress_curves(\n", - " experiments=[myexperiment], plot_type=\"all\", normalize=False\n", + " experiments=[myexperiment], plot_type=PlotType.ALL, normalize=False\n", ")\n", "expbase.plot_progress_curves(\n", - " experiments=[myexperiment], plot_type=\"mean\", normalize=False\n", + " experiments=[myexperiment], plot_type=PlotType.MEAN, normalize=False\n", ")" ] }, @@ -237,7 +235,8 @@ "\n", "# Record a summary of the results in a human-readable way.\n", "mygroupexperiment.log_group_experiment_results()\n", - "# [Go check out the file called experiments/logs/group_RNDSRCH_ADAM_on_EXAMPLE-1_group_experiment_results.txt.]\n", + "# [Go check out the file called\n", + "# experiments/logs/group_RNDSRCH_ADAM_on_EXAMPLE-1_group_experiment_results.txt]\n", "\n", "# Plot the mean progress curve for each solver from the 10 macroreplications.\n", "expbase.plot_progress_curves(\n", @@ -245,7 +244,7 @@ " mygroupexperiment.experiments[0][0],\n", " mygroupexperiment.experiments[1][0],\n", " ],\n", - " plot_type=\"mean\",\n", + " plot_type=PlotType.MEAN,\n", " normalize=False,\n", ")\n", "# [The plot should be displayed in the output produced below.]" @@ -305,9 +304,10 @@ "\n", "sys.path.append(\"venv\\\\lib\\\\site-packages\")\n", "import simopt.experiment_base as expbase\n", + "from simopt.experiment_base import PlotType\n", "from simopt.models.example import ExampleProblem\n", - "from simopt.solvers.randomsearch import RandomSearch\n", "from simopt.solvers.adam import ADAM\n", + "from simopt.solvers.randomsearch import RandomSearch\n", "\n", "my_problem = ExampleProblem(\n", " fixed_factors={\"initial_solution\": (2.0, 2.0), \"budget\": 200}\n", @@ -329,7 +329,7 @@ " mygroupexperiment.experiments[0][0],\n", " mygroupexperiment.experiments[1][0],\n", " ],\n", - " plot_type=\"mean\",\n", + " plot_type=PlotType.MEAN,\n", " normalize=False,\n", ")" ]