pyfemtet 1.0.10__tar.gz → 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyfemtet might be problematic. Click here for more details.
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/PKG-INFO +2 -1
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/femopt.py +6 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/_history.py +2 -2
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/_base_optimizer.py +80 -0
- pyfemtet-1.1.0/pyfemtet/opt/optimizer/_trial_queue.py +101 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_optuna_optimizer.py +144 -26
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/scipy_optimizer/_scipy_optimizer.py +6 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/main_figure_creator.py +99 -57
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyproject.toml +2 -1
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/LICENSE +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/LICENSE_THIRD_PARTY.txt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/README.md +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/1. make_pot_and_update_po.bat +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/2. build_mo.bat +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/babel.cfg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/i18n.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.po +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/locales/messages.pot +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/messages.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/closing.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/dask_util.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/df_util.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/excel_macro_util.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/excel_parse_util.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_access_inspection.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_autosave.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_exit.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_version.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/helper.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/process_util.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/sample.xlsx +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/str_enum.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/core.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/dispatch_extensions/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/dispatch_extensions/_impl.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/logger/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/logger/_impl.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/exceptions.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/_hypervolume.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/_optimality.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_base_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_dummy_classes.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_excel_interface/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_excel_interface/debug-excel-interface.xlsm +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_excel_interface/excel_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_interface/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_interface/_femtet_parametric.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_interface/femtet_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/femtet_with_nx_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/model1.prt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/model1.x_t +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/update_model.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_solidworks/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_solidworks/femtet_with_solidworks_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_solidworks_interface/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_solidworks_interface/solidworks_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/base_surrogate_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/botorch_interface.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/debug-pof-botorch.reccsv +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_with_excel_settings/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_with_excel_settings/with_excel_settings.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/YAML_Generator.xlsm +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/__main__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/sample/sample.bas +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/sample/sample.femprj +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_optuna_attribute.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/debug-pof-botorch.reccsv +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/enable_nonlinear_constraint.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/pof_botorch_sampler.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/wat_ex14_parametric_jp.femprj +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/scipy_optimizer/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_botorch_utils.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_gpytorch_modules_extension.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_helper.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_model.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/problem.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/variable_manager/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/variable_manager/_string_as_expression.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/variable_manager/_variable_manager.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/_create_wrapped_components.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/__main__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_base_application.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_common_pages.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/alert_region.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/control_femtet.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/detail_graphs.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/main_graph.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/pm_graph.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_detail_page.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_helper.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_process_monitor/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_process_monitor/_application.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_process_monitor/_pages.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/dbc.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/dcc.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/html.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/str_enum.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/.gitignore +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/__main__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/_application.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/_pages.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.csv +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.db +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.log +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_1.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_1.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_10.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_10.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_11.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_11.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_12.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_12.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_13.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_13.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_14.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_14.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_15.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_15.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_16.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_16.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_17.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_17.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_18.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_18.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_19.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_19.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_2.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_2.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_20.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_20.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_3.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_3.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.bgr +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.bnd +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.btr +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.mtl +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.prm +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_5.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_5.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_6.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_6.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_7.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_7.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_8.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_8.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_9.jpg +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_9.pdt +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.femprj +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/__init__.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/contour_creator.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/parallel_plot_creator.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/pm_graph_creator.py +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/wat_ex14_parametric_jp.femprj +0 -0
- {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/worker_status.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pyfemtet
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: Design parameter optimization using Femtet.
|
|
5
5
|
License: MIT
|
|
6
6
|
Author: pyfemtet
|
|
@@ -21,6 +21,7 @@ Requires-Dist: dask (>=2024.12.1,<2024.13.0)
|
|
|
21
21
|
Requires-Dist: distributed (>=2024.12.1,<2024.13.0)
|
|
22
22
|
Requires-Dist: femtetutils (>=1.0.0,<2) ; sys_platform == "win32"
|
|
23
23
|
Requires-Dist: fire (>=0.7)
|
|
24
|
+
Requires-Dist: frozendict (>=2.4.6)
|
|
24
25
|
Requires-Dist: numpy (>=2.0.0,<3)
|
|
25
26
|
Requires-Dist: openpyxl (>=3.1.2,<4)
|
|
26
27
|
Requires-Dist: optuna (>=3.4.0,<5.0.0)
|
|
@@ -168,6 +168,12 @@ class FEMOpt:
|
|
|
168
168
|
):
|
|
169
169
|
self.opt.add_other_output(name, fun, args, kwargs)
|
|
170
170
|
|
|
171
|
+
def add_trial(
|
|
172
|
+
self,
|
|
173
|
+
parameters: dict[str, SupportedVariableTypes],
|
|
174
|
+
):
|
|
175
|
+
self.opt.add_trial(parameters)
|
|
176
|
+
|
|
171
177
|
def add_sub_fidelity_model(
|
|
172
178
|
self,
|
|
173
179
|
name: str,
|
|
@@ -116,9 +116,9 @@ class TrialState(StrEnum):
|
|
|
116
116
|
elif state == TrialState.unknown_error:
|
|
117
117
|
e = Exception()
|
|
118
118
|
elif state == TrialState.hard_constraint_violation:
|
|
119
|
-
e = HardConstraintViolation
|
|
119
|
+
e = HardConstraintViolation()
|
|
120
120
|
elif state == TrialState.skipped:
|
|
121
|
-
e = SkipSolve
|
|
121
|
+
e = SkipSolve()
|
|
122
122
|
else:
|
|
123
123
|
e = None
|
|
124
124
|
return e
|
|
@@ -14,6 +14,7 @@ from pyfemtet.opt.exceptions import *
|
|
|
14
14
|
from pyfemtet.opt.worker_status import *
|
|
15
15
|
from pyfemtet.opt.problem.problem import *
|
|
16
16
|
from pyfemtet.opt.problem.variable_manager import *
|
|
17
|
+
from pyfemtet.opt.optimizer._trial_queue import *
|
|
17
18
|
from pyfemtet.logger import get_module_logger
|
|
18
19
|
|
|
19
20
|
__all__ = [
|
|
@@ -68,6 +69,7 @@ class AbstractOptimizer:
|
|
|
68
69
|
n_trials: int | None
|
|
69
70
|
timeout: float | None
|
|
70
71
|
seed: int | None
|
|
72
|
+
include_queued_in_n_trials: bool
|
|
71
73
|
|
|
72
74
|
# problem
|
|
73
75
|
variable_manager: VariableManager
|
|
@@ -94,6 +96,7 @@ class AbstractOptimizer:
|
|
|
94
96
|
self.seed = None
|
|
95
97
|
self.n_trials = None
|
|
96
98
|
self.timeout = None
|
|
99
|
+
self.include_queued_in_n_trials = False
|
|
97
100
|
|
|
98
101
|
# Problem
|
|
99
102
|
self.variable_manager = VariableManager()
|
|
@@ -113,6 +116,7 @@ class AbstractOptimizer:
|
|
|
113
116
|
self.entire_status: WorkerStatus = WorkerStatus(ENTIRE_PROCESS_STATUS_KEY)
|
|
114
117
|
self.worker_status: WorkerStatus = WorkerStatus('worker-status')
|
|
115
118
|
self.worker_status_list: list[WorkerStatus] = [self.worker_status]
|
|
119
|
+
self.trial_queue: TrialQueue = TrialQueue()
|
|
116
120
|
self._done_setup_before_parallel = False
|
|
117
121
|
self._done_load_problem_from_fem = False
|
|
118
122
|
self._worker_index: int | str | None = None
|
|
@@ -368,6 +372,12 @@ class AbstractOptimizer:
|
|
|
368
372
|
_duplicated_name_check(name, self.sub_fidelity_models.keys())
|
|
369
373
|
self.sub_fidelity_models._update(name, sub_fidelity_model, fidelity)
|
|
370
374
|
|
|
375
|
+
def add_trial(
|
|
376
|
+
self,
|
|
377
|
+
parameters: dict[str, SupportedVariableTypes],
|
|
378
|
+
):
|
|
379
|
+
self.trial_queue.enqueue(parameters)
|
|
380
|
+
|
|
371
381
|
def get_variables(self, format: Literal['dict', 'values', 'raw'] = 'dict'):
|
|
372
382
|
return self.variable_manager.get_variables(
|
|
373
383
|
format=format,
|
|
@@ -383,6 +393,21 @@ class AbstractOptimizer:
|
|
|
383
393
|
|
|
384
394
|
# ===== private =====
|
|
385
395
|
|
|
396
|
+
def _setup_enqueued_trials(self):
|
|
397
|
+
# Insert initial trial
|
|
398
|
+
params: dict = self.variable_manager.get_variables(format='dict', filter='parameter')
|
|
399
|
+
self.trial_queue.enqueue_first(params, flags={_IS_INITIAL_TRIAL_FLAG_KEY: True})
|
|
400
|
+
|
|
401
|
+
# Remove trials included in history
|
|
402
|
+
tried: list[dict] = get_tried_list_from_history(
|
|
403
|
+
self.history,
|
|
404
|
+
equality_filters=MAIN_FILTER,
|
|
405
|
+
)
|
|
406
|
+
self.trial_queue.remove_tried(tried)
|
|
407
|
+
|
|
408
|
+
# Remove duplicated
|
|
409
|
+
self.trial_queue.remove_duplicated()
|
|
410
|
+
|
|
386
411
|
def _should_solve(self, history):
|
|
387
412
|
return self.solve_condition(history)
|
|
388
413
|
|
|
@@ -921,6 +946,61 @@ class AbstractOptimizer:
|
|
|
921
946
|
# resolve evaluation order
|
|
922
947
|
self.variable_manager.resolve()
|
|
923
948
|
|
|
949
|
+
# check the enqueued trials is
|
|
950
|
+
# compatible with current optimization
|
|
951
|
+
# problem setup
|
|
952
|
+
history_set = set(self.history.prm_names)
|
|
953
|
+
for t in self.trial_queue.queue:
|
|
954
|
+
params: dict = t.d
|
|
955
|
+
enqueued_set: set = set(params.keys())
|
|
956
|
+
|
|
957
|
+
# Warning if over
|
|
958
|
+
if len(enqueued_set - history_set) > 0:
|
|
959
|
+
logger.warning(
|
|
960
|
+
_(
|
|
961
|
+
en_message='Enqueued parameter set contains '
|
|
962
|
+
'more parameters than the optimization '
|
|
963
|
+
'problem setup. The extra parameters '
|
|
964
|
+
'will be ignored.\n'
|
|
965
|
+
'Enqueued set: {enqueued_set}\n'
|
|
966
|
+
'Setup set: {history_set}\n'
|
|
967
|
+
'Parameters ignored: {over_set}',
|
|
968
|
+
jp_message='予約された入力変数セットは'
|
|
969
|
+
'最適化のセットアップで指定されたよりも'
|
|
970
|
+
'多くの変数を含んでいます。'
|
|
971
|
+
'そのような変数は無視されます。\n'
|
|
972
|
+
'予約された入力変数: {enqueued_set}\n'
|
|
973
|
+
'最適化する変数: {history_set}\n'
|
|
974
|
+
'無視される変数: {over_set}',
|
|
975
|
+
enqueued_set=enqueued_set,
|
|
976
|
+
history_set=history_set,
|
|
977
|
+
over_set=enqueued_set - history_set,
|
|
978
|
+
)
|
|
979
|
+
)
|
|
980
|
+
|
|
981
|
+
# Error if not enough
|
|
982
|
+
if len(history_set - enqueued_set) > 0:
|
|
983
|
+
raise ValueError(
|
|
984
|
+
_(
|
|
985
|
+
en_message='The enqueued parameter set lacks '
|
|
986
|
+
'some parameters to be optimized.\n'
|
|
987
|
+
'Enqueued set: {enqueued_set}\n'
|
|
988
|
+
'Parameters to optimize: {history_set}\n'
|
|
989
|
+
'Lacked set: {lacked_set}',
|
|
990
|
+
jp_message='予約された入力変数セットに'
|
|
991
|
+
'変数が不足しています。\n'
|
|
992
|
+
'予約された変数: {enqueued_set}\n'
|
|
993
|
+
'最適化する変数: {history_set}\n'
|
|
994
|
+
'足りない変数: {lacked_set}',
|
|
995
|
+
enqueued_set=enqueued_set,
|
|
996
|
+
history_set=history_set,
|
|
997
|
+
lacked_set=history_set - enqueued_set,
|
|
998
|
+
)
|
|
999
|
+
)
|
|
1000
|
+
|
|
1001
|
+
# remove duplicated enqueued trials
|
|
1002
|
+
self._setup_enqueued_trials()
|
|
1003
|
+
|
|
924
1004
|
self._done_setup_before_parallel = True
|
|
925
1005
|
|
|
926
1006
|
def _setup_after_parallel(self):
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from typing import Sequence
|
|
2
|
+
from frozendict import frozendict
|
|
3
|
+
|
|
4
|
+
from pyfemtet.opt.history import History, TrialState
|
|
5
|
+
from pyfemtet.opt.problem.variable_manager import SupportedVariableTypes
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
'TrialQueue',
|
|
10
|
+
'get_tried_list_from_history',
|
|
11
|
+
'_IS_INITIAL_TRIAL_FLAG_KEY',
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
_IS_INITIAL_TRIAL_FLAG_KEY = 'is_initial_trial'
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class EnqueuedTrial:
|
|
19
|
+
|
|
20
|
+
def __init__(self, d: dict[str, SupportedVariableTypes], flags: dict = None):
|
|
21
|
+
self.d = d
|
|
22
|
+
self.flags = flags or {}
|
|
23
|
+
|
|
24
|
+
@staticmethod
|
|
25
|
+
def d_type_verified(d) -> dict:
|
|
26
|
+
out = {}
|
|
27
|
+
for k, v in d.items():
|
|
28
|
+
if isinstance(v, str):
|
|
29
|
+
out.update({k: v})
|
|
30
|
+
else:
|
|
31
|
+
out.update({k: float(v)})
|
|
32
|
+
return out
|
|
33
|
+
|
|
34
|
+
def get_hashed_id(self):
|
|
35
|
+
return hash(frozendict(self.d_type_verified(self.d)))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TrialQueue:
|
|
39
|
+
|
|
40
|
+
def __init__(self):
|
|
41
|
+
self.queue: list[EnqueuedTrial] = []
|
|
42
|
+
|
|
43
|
+
def __len__(self):
|
|
44
|
+
return len(self.queue)
|
|
45
|
+
|
|
46
|
+
def enqueue_first(self, d: dict[str, SupportedVariableTypes], flags: dict = None):
|
|
47
|
+
self.queue.insert(0, EnqueuedTrial(d, flags=flags))
|
|
48
|
+
|
|
49
|
+
def enqueue(self, d: dict[str, SupportedVariableTypes], flags: dict = None):
|
|
50
|
+
self.queue.append(EnqueuedTrial(d, flags=flags))
|
|
51
|
+
|
|
52
|
+
def dequeue(self) -> dict[str, SupportedVariableTypes] | None:
|
|
53
|
+
if len(self.queue) == 0:
|
|
54
|
+
return None
|
|
55
|
+
return self.queue.pop(0).d
|
|
56
|
+
|
|
57
|
+
def remove_duplicated(self):
|
|
58
|
+
indices_to_remove = []
|
|
59
|
+
all_ids = [t.get_hashed_id() for t in self.queue]
|
|
60
|
+
|
|
61
|
+
# 先に queue に入れられたものから
|
|
62
|
+
# 順に見ていく
|
|
63
|
+
# indices は sorted となるはず
|
|
64
|
+
seen_ids = set()
|
|
65
|
+
for i, id in enumerate(all_ids):
|
|
66
|
+
if id in seen_ids:
|
|
67
|
+
indices_to_remove.append(i)
|
|
68
|
+
else:
|
|
69
|
+
seen_ids.add(id)
|
|
70
|
+
|
|
71
|
+
# 削除
|
|
72
|
+
for i in indices_to_remove[::-1]:
|
|
73
|
+
self.queue.pop(i)
|
|
74
|
+
|
|
75
|
+
def remove_tried(self, tried_list: Sequence[dict[str, SupportedVariableTypes]]):
|
|
76
|
+
indices_to_remove = []
|
|
77
|
+
tried_id = [EnqueuedTrial(tried).get_hashed_id() for tried in tried_list]
|
|
78
|
+
for i, t in enumerate(self.queue):
|
|
79
|
+
if t.get_hashed_id() in tried_id:
|
|
80
|
+
indices_to_remove.append(i)
|
|
81
|
+
for i in indices_to_remove[::-1]:
|
|
82
|
+
self.queue.pop(i)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def get_tried_list_from_history(
|
|
86
|
+
history: History,
|
|
87
|
+
equality_filters=None,
|
|
88
|
+
) -> list[dict[str, SupportedVariableTypes]]:
|
|
89
|
+
out = []
|
|
90
|
+
df = history.get_df(equality_filters=equality_filters)
|
|
91
|
+
for _, row in df.iterrows():
|
|
92
|
+
# Want to retry if unknown error
|
|
93
|
+
# so don't count it as tried.
|
|
94
|
+
if row['state'] in (
|
|
95
|
+
TrialState.unknown_error,
|
|
96
|
+
TrialState.undefined,
|
|
97
|
+
):
|
|
98
|
+
continue
|
|
99
|
+
d = row[history.prm_names].to_dict()
|
|
100
|
+
out.append(d)
|
|
101
|
+
return out
|
{pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_optuna_optimizer.py
RENAMED
|
@@ -12,7 +12,8 @@ import numpy as np
|
|
|
12
12
|
|
|
13
13
|
import optuna
|
|
14
14
|
from optuna.samplers import TPESampler
|
|
15
|
-
from optuna.study import MaxTrialsCallback
|
|
15
|
+
from optuna.study import Study, MaxTrialsCallback
|
|
16
|
+
from optuna.trial import FrozenTrial, TrialState as OptunaTrialState
|
|
16
17
|
from optuna_integration.dask import DaskStorage
|
|
17
18
|
|
|
18
19
|
from pyfemtet._i18n import _
|
|
@@ -28,8 +29,9 @@ from pyfemtet.opt.optimizer._base_optimizer import *
|
|
|
28
29
|
from pyfemtet.opt.optimizer.optuna_optimizer._optuna_attribute import OptunaAttribute
|
|
29
30
|
from pyfemtet.opt.optimizer.optuna_optimizer._pof_botorch.pof_botorch_sampler import PoFBoTorchSampler
|
|
30
31
|
from pyfemtet.opt.worker_status import WorkerStatus
|
|
32
|
+
from pyfemtet.opt.optimizer._trial_queue import _IS_INITIAL_TRIAL_FLAG_KEY
|
|
31
33
|
|
|
32
|
-
logger = get_module_logger('opt.optimizer',
|
|
34
|
+
logger = get_module_logger('opt.optimizer', True)
|
|
33
35
|
|
|
34
36
|
remove_all_output(get_optuna_logger())
|
|
35
37
|
|
|
@@ -38,6 +40,69 @@ warnings.filterwarnings('ignore', 'Argument ``constraints_func`` is an experimen
|
|
|
38
40
|
optuna.exceptions.ExperimentalWarning)
|
|
39
41
|
|
|
40
42
|
|
|
43
|
+
_MESSAGE_ENQUEUED = 'Enqueued trial.'
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class MaxTrialsCallbackExcludingEnqueued(MaxTrialsCallback):
|
|
47
|
+
def __call__(self, study: Study, trial: FrozenTrial) -> None:
|
|
48
|
+
"""
|
|
49
|
+
queue を考慮して終了条件を決定する
|
|
50
|
+
|
|
51
|
+
if n_trials <= 0:
|
|
52
|
+
-q_wait >= n_trials
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
q_comp q_wait
|
|
56
|
+
| |
|
|
57
|
+
v v
|
|
58
|
+
f=====....0.............
|
|
59
|
+
------|----+------------->
|
|
60
|
+
n_trials=-4 (<=0)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
else:
|
|
64
|
+
(s_comp := comp - q_comp) >= n_trials
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
q_comp s_comp
|
|
68
|
+
| |
|
|
69
|
+
v v
|
|
70
|
+
f========0===..........
|
|
71
|
+
-----------+--|---------->
|
|
72
|
+
n_trials=4 (>0)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
# 与えられた state (=COMPLETE) の trials を取得
|
|
78
|
+
trials = study.get_trials(deepcopy=False, states=self._states)
|
|
79
|
+
|
|
80
|
+
# n_trials が負か 0 なら残り WAITING 数と比較
|
|
81
|
+
if self._n_trials <= 0:
|
|
82
|
+
waiting_trials = study.get_trials(deepcopy=False, states=(OptunaTrialState.WAITING,))
|
|
83
|
+
enqueued_trials = [trial for trial in waiting_trials if trial.user_attrs.get('enqueued')]
|
|
84
|
+
|
|
85
|
+
if -len(enqueued_trials) >= self._n_trials:
|
|
86
|
+
study.stop()
|
|
87
|
+
|
|
88
|
+
# 正なら (初回を除く enqueued trial) を除く
|
|
89
|
+
# COMPLETE 数 (=初回 + sampled_complete) と比較
|
|
90
|
+
else:
|
|
91
|
+
|
|
92
|
+
n_complete = len(trials)
|
|
93
|
+
n_enqueued_complete = len([
|
|
94
|
+
trial for trial in trials
|
|
95
|
+
if (
|
|
96
|
+
trial.user_attrs.get('enqueued', False)
|
|
97
|
+
and not trial.user_attrs.get(_IS_INITIAL_TRIAL_FLAG_KEY, False)
|
|
98
|
+
)
|
|
99
|
+
])
|
|
100
|
+
n_sampled_complete = n_complete - n_enqueued_complete
|
|
101
|
+
|
|
102
|
+
if n_sampled_complete >= self._n_trials:
|
|
103
|
+
study.stop()
|
|
104
|
+
|
|
105
|
+
|
|
41
106
|
class OptunaOptimizer(AbstractOptimizer):
|
|
42
107
|
"""
|
|
43
108
|
An optimizer class utilizing Optuna for hyperparameter optimization.
|
|
@@ -274,13 +339,40 @@ class OptunaOptimizer(AbstractOptimizer):
|
|
|
274
339
|
|
|
275
340
|
def _get_callback(self, n_trials: int):
|
|
276
341
|
|
|
342
|
+
states = (optuna.trial.TrialState.COMPLETE,)
|
|
343
|
+
|
|
277
344
|
# restart である場合、追加 N 回と見做す
|
|
278
345
|
if self.history.is_restart:
|
|
279
|
-
df = self.history.get_df(equality_filters=MAIN_FILTER)
|
|
280
|
-
n_existing_succeeded_trials = len(df[df['state'] == TrialState.succeeded])
|
|
281
|
-
n_trials = n_trials + n_existing_succeeded_trials
|
|
282
346
|
|
|
283
|
-
|
|
347
|
+
study = optuna.load_study(
|
|
348
|
+
study_name=self.study_name,
|
|
349
|
+
storage=self.storage,
|
|
350
|
+
)
|
|
351
|
+
trials = study.get_trials(deepcopy=False, states=states)
|
|
352
|
+
n_complete = len(trials)
|
|
353
|
+
|
|
354
|
+
if self.include_queued_in_n_trials:
|
|
355
|
+
# 追加 n_trials 回と見做す
|
|
356
|
+
n_trials = n_trials + n_complete
|
|
357
|
+
|
|
358
|
+
else:
|
|
359
|
+
if n_trials > 0:
|
|
360
|
+
# 追加 n_trials 回と見做すが、
|
|
361
|
+
# Callback で n_enqueued_complete を足しているので
|
|
362
|
+
# そのぶんを引かなければならない
|
|
363
|
+
n_enqueued_complete = len([trial for trial in trials if trial.user_attrs.get('enqueued')])
|
|
364
|
+
n_trials = n_trials + n_complete - n_enqueued_complete
|
|
365
|
+
|
|
366
|
+
else:
|
|
367
|
+
# queue_wait と比較するので
|
|
368
|
+
# 何も補正しなくていい
|
|
369
|
+
pass
|
|
370
|
+
|
|
371
|
+
if self.include_queued_in_n_trials:
|
|
372
|
+
Class = MaxTrialsCallback
|
|
373
|
+
else:
|
|
374
|
+
Class = MaxTrialsCallbackExcludingEnqueued
|
|
375
|
+
return Class(n_trials, states=states)
|
|
284
376
|
|
|
285
377
|
def _setup_before_parallel(self):
|
|
286
378
|
|
|
@@ -321,30 +413,44 @@ class OptunaOptimizer(AbstractOptimizer):
|
|
|
321
413
|
# if TPESampler and re-starting,
|
|
322
414
|
# create temporary study to avoid error
|
|
323
415
|
# with many pruned trials.
|
|
324
|
-
if
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
416
|
+
if (
|
|
417
|
+
issubclass(self.sampler_class, optuna.samplers.TPESampler)
|
|
418
|
+
and self.history.is_restart
|
|
419
|
+
):
|
|
420
|
+
|
|
421
|
+
# If there is a WAITING trial in queue,
|
|
422
|
+
# do nothing (because the callback cannot
|
|
423
|
+
# update the WAITING trial in the existing
|
|
424
|
+
# study.)
|
|
330
425
|
|
|
331
426
|
# load existing study
|
|
332
427
|
existing_study = optuna.load_study(
|
|
333
|
-
study_name=self.study_name,
|
|
334
|
-
storage=f'sqlite:///{self._existing_storage_path}',
|
|
335
|
-
)
|
|
336
|
-
|
|
337
|
-
# create new study
|
|
338
|
-
tmp_study = optuna.create_study(
|
|
339
428
|
study_name=self.study_name,
|
|
340
429
|
storage=f'sqlite:///{self.storage_path}',
|
|
341
|
-
load_if_exists=True,
|
|
342
|
-
directions=['minimize'] * len(self.objectives),
|
|
343
430
|
)
|
|
344
431
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
432
|
+
if len(existing_study.get_trials(deepcopy=False, states=(OptunaTrialState.WAITING,))) == 0:
|
|
433
|
+
|
|
434
|
+
# get unique tmp file
|
|
435
|
+
tmp_storage_path = tempfile.mktemp(suffix='.db')
|
|
436
|
+
self._existing_storage_path = self.storage_path
|
|
437
|
+
self.storage_path = tmp_storage_path
|
|
438
|
+
|
|
439
|
+
# create new study
|
|
440
|
+
tmp_study = optuna.create_study(
|
|
441
|
+
study_name=self.study_name,
|
|
442
|
+
storage=f'sqlite:///{self.storage_path}',
|
|
443
|
+
load_if_exists=True,
|
|
444
|
+
directions=['minimize'] * len(self.objectives),
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
# Copy COMPLETE trials to temporary study.
|
|
448
|
+
existing_trials = existing_study.get_trials(
|
|
449
|
+
states=(
|
|
450
|
+
optuna.trial.TrialState.COMPLETE,
|
|
451
|
+
)
|
|
452
|
+
)
|
|
453
|
+
tmp_study.add_trials(existing_trials)
|
|
348
454
|
|
|
349
455
|
# setup storage
|
|
350
456
|
client = get_client()
|
|
@@ -368,9 +474,18 @@ class OptunaOptimizer(AbstractOptimizer):
|
|
|
368
474
|
# set objective names
|
|
369
475
|
study.set_metric_names(list(self.objectives.keys()))
|
|
370
476
|
|
|
371
|
-
#
|
|
372
|
-
|
|
373
|
-
|
|
477
|
+
# Add enqueued trials
|
|
478
|
+
for t in self.trial_queue.queue:
|
|
479
|
+
is_initial_step = t.flags.get(_IS_INITIAL_TRIAL_FLAG_KEY, False)
|
|
480
|
+
params: dict[str, SupportedVariableTypes] = t.d
|
|
481
|
+
study.enqueue_trial(
|
|
482
|
+
params,
|
|
483
|
+
user_attrs={
|
|
484
|
+
'message': _MESSAGE_ENQUEUED,
|
|
485
|
+
'enqueued': True,
|
|
486
|
+
_IS_INITIAL_TRIAL_FLAG_KEY: is_initial_step,
|
|
487
|
+
},
|
|
488
|
+
)
|
|
374
489
|
|
|
375
490
|
def _setup_after_parallel(self):
|
|
376
491
|
# reseed
|
|
@@ -539,6 +654,9 @@ class OptunaOptimizer(AbstractOptimizer):
|
|
|
539
654
|
# and add callback to copy-back
|
|
540
655
|
# from processing study to existing one.
|
|
541
656
|
def copy_back(_, trial):
|
|
657
|
+
# ここで existing_study 内の WAITING を
|
|
658
|
+
# 更新したり削除したりできないので
|
|
659
|
+
# tpe_addressing は WAITING がない状態でしか使わない
|
|
542
660
|
existing_study.add_trial(trial)
|
|
543
661
|
|
|
544
662
|
self.callbacks.append(copy_back)
|
{pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/scipy_optimizer/_scipy_optimizer.py
RENAMED
|
@@ -92,6 +92,12 @@ class ScipyOptimizer(AbstractOptimizer):
|
|
|
92
92
|
jp_message='`ScipyOptimizer` では n_trials は指定できません。'
|
|
93
93
|
))
|
|
94
94
|
|
|
95
|
+
def add_trial(self, parameters: dict[str, SupportedVariableTypes]):
|
|
96
|
+
raise NotImplementedError(_(
|
|
97
|
+
en_message='You cannot use `add_trial()` in `ScipyOptimizer`.',
|
|
98
|
+
jp_message='`ScipyOptimizer` では `add_trial()` は使えません。',
|
|
99
|
+
))
|
|
100
|
+
|
|
95
101
|
def _get_x0(self) -> np.ndarray:
|
|
96
102
|
|
|
97
103
|
# params を取得
|