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.

Files changed (178) hide show
  1. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/PKG-INFO +2 -1
  2. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/femopt.py +6 -0
  3. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/_history.py +2 -2
  4. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/_base_optimizer.py +80 -0
  5. pyfemtet-1.1.0/pyfemtet/opt/optimizer/_trial_queue.py +101 -0
  6. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_optuna_optimizer.py +144 -26
  7. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/scipy_optimizer/_scipy_optimizer.py +6 -0
  8. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/main_figure_creator.py +99 -57
  9. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyproject.toml +2 -1
  10. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/LICENSE +0 -0
  11. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/LICENSE_THIRD_PARTY.txt +0 -0
  12. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/README.md +0 -0
  13. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/__init__.py +0 -0
  14. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/1. make_pot_and_update_po.bat +0 -0
  15. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/2. build_mo.bat +0 -0
  16. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/__init__.py +0 -0
  17. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/babel.cfg +0 -0
  18. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/i18n.py +0 -0
  19. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  20. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.po +0 -0
  21. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/locales/messages.pot +0 -0
  22. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_i18n/messages.py +0 -0
  23. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/__init__.py +0 -0
  24. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/closing.py +0 -0
  25. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/dask_util.py +0 -0
  26. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/df_util.py +0 -0
  27. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/excel_macro_util.py +0 -0
  28. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/excel_parse_util.py +0 -0
  29. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_access_inspection.py +0 -0
  30. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_autosave.py +0 -0
  31. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_exit.py +0 -0
  32. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/femtet_version.py +0 -0
  33. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/helper.py +0 -0
  34. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/process_util.py +0 -0
  35. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/sample.xlsx +0 -0
  36. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/_util/str_enum.py +0 -0
  37. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/core.py +0 -0
  38. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/dispatch_extensions/__init__.py +0 -0
  39. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/dispatch_extensions/_impl.py +0 -0
  40. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/logger/__init__.py +0 -0
  41. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/logger/_impl.py +0 -0
  42. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/__init__.py +0 -0
  43. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/exceptions.py +0 -0
  44. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/__init__.py +0 -0
  45. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/_hypervolume.py +0 -0
  46. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/history/_optimality.py +0 -0
  47. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/__init__.py +0 -0
  48. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_base_interface.py +0 -0
  49. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_dummy_classes.py +0 -0
  50. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_excel_interface/__init__.py +0 -0
  51. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_excel_interface/debug-excel-interface.xlsm +0 -0
  52. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_excel_interface/excel_interface.py +0 -0
  53. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_interface/__init__.py +0 -0
  54. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_interface/_femtet_parametric.py +0 -0
  55. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_interface/femtet_interface.py +0 -0
  56. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/__init__.py +0 -0
  57. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/femtet_with_nx_interface.py +0 -0
  58. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/model1.prt +0 -0
  59. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/model1.x_t +0 -0
  60. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_nx_interface/update_model.py +0 -0
  61. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_solidworks/__init__.py +0 -0
  62. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_femtet_with_solidworks/femtet_with_solidworks_interface.py +0 -0
  63. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_solidworks_interface/__init__.py +0 -0
  64. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_solidworks_interface/solidworks_interface.py +0 -0
  65. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/__init__.py +0 -0
  66. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/base_surrogate_interface.py +0 -0
  67. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/botorch_interface.py +0 -0
  68. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_surrogate_model_interface/debug-pof-botorch.reccsv +0 -0
  69. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_with_excel_settings/__init__.py +0 -0
  70. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/interface/_with_excel_settings/with_excel_settings.py +0 -0
  71. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/YAML_Generator.xlsm +0 -0
  72. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/__init__.py +0 -0
  73. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/__main__.py +0 -0
  74. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/sample/sample.bas +0 -0
  75. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/meta_script/sample/sample.femprj +0 -0
  76. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/__init__.py +0 -0
  77. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/__init__.py +0 -0
  78. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_optuna_attribute.py +0 -0
  79. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/__init__.py +0 -0
  80. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/debug-pof-botorch.reccsv +0 -0
  81. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/enable_nonlinear_constraint.py +0 -0
  82. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/pof_botorch_sampler.py +0 -0
  83. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/optuna_optimizer/wat_ex14_parametric_jp.femprj +0 -0
  84. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/optimizer/scipy_optimizer/__init__.py +0 -0
  85. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/__init__.py +0 -0
  86. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_botorch_utils.py +0 -0
  87. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_gpytorch_modules_extension.py +0 -0
  88. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_helper.py +0 -0
  89. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/prediction/_model.py +0 -0
  90. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/__init__.py +0 -0
  91. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/problem.py +0 -0
  92. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/variable_manager/__init__.py +0 -0
  93. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/variable_manager/_string_as_expression.py +0 -0
  94. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/problem/variable_manager/_variable_manager.py +0 -0
  95. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/__init__.py +0 -0
  96. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/_create_wrapped_components.py +0 -0
  97. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/__init__.py +0 -0
  98. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/__main__.py +0 -0
  99. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_base_application.py +0 -0
  100. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_common_pages.py +0 -0
  101. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/__init__.py +0 -0
  102. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/alert_region.py +0 -0
  103. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/control_femtet.py +0 -0
  104. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/detail_graphs.py +0 -0
  105. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/main_graph.py +0 -0
  106. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_complex_components/pm_graph.py +0 -0
  107. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_detail_page.py +0 -0
  108. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_helper.py +0 -0
  109. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_process_monitor/__init__.py +0 -0
  110. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_process_monitor/_application.py +0 -0
  111. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_process_monitor/_pages.py +0 -0
  112. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/__init__.py +0 -0
  113. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/dbc.py +0 -0
  114. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/dcc.py +0 -0
  115. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/html.py +0 -0
  116. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/_wrapped_components/str_enum.py +0 -0
  117. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/.gitignore +0 -0
  118. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/__init__.py +0 -0
  119. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/__main__.py +0 -0
  120. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/_application.py +0 -0
  121. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/_pages.py +0 -0
  122. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.csv +0 -0
  123. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.db +0 -0
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {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
  149. {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
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {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
  157. {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
  158. {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
  159. {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
  160. {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
  161. {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
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {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
  171. {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
  172. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.femprj +0 -0
  173. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/__init__.py +0 -0
  174. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/contour_creator.py +0 -0
  175. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/parallel_plot_creator.py +0 -0
  176. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/visualization/plotter/pm_graph_creator.py +0 -0
  177. {pyfemtet-1.0.10 → pyfemtet-1.1.0}/pyfemtet/opt/wat_ex14_parametric_jp.femprj +0 -0
  178. {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.10
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
@@ -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', False)
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
- return MaxTrialsCallback(n_trials, states=(optuna.trial.TrialState.COMPLETE,))
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 issubclass(self.sampler_class, optuna.samplers.TPESampler) \
325
- and self.history.is_restart:
326
- # get unique tmp file
327
- tmp_storage_path = tempfile.mktemp(suffix='.db')
328
- self._existing_storage_path = self.storage_path
329
- self.storage_path = tmp_storage_path
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
- # Copy COMPLETE trials to temporary study.
346
- existing_trials = existing_study.get_trials(states=(optuna.trial.TrialState.COMPLETE,))
347
- tmp_study.add_trials(existing_trials)
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
- # initial trial
372
- params = self.variable_manager.get_variables(format='dict', filter='parameter')
373
- study.enqueue_trial(params, user_attrs={"message": "Initial values"})
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)
@@ -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 を取得