pyfemtet 0.9.6__py3-none-any.whl → 1.0.0__py3-none-any.whl

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 (272) hide show
  1. pyfemtet/__init__.py +6 -1
  2. pyfemtet/_i18n/1. make_pot_and_update_po.bat +8 -0
  3. pyfemtet/_i18n/2. build_mo.bat +5 -0
  4. pyfemtet/_i18n/__init__.py +4 -0
  5. pyfemtet/_i18n/babel.cfg +2 -0
  6. pyfemtet/_i18n/i18n.py +37 -0
  7. pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  8. pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.po +1020 -0
  9. pyfemtet/_i18n/locales/messages.pot +987 -0
  10. pyfemtet/{_message → _i18n}/messages.py +128 -41
  11. pyfemtet/_util/closing.py +19 -0
  12. pyfemtet/_util/dask_util.py +89 -7
  13. pyfemtet/_util/df_util.py +46 -0
  14. pyfemtet/_util/excel_macro_util.py +8 -3
  15. pyfemtet/_util/excel_parse_util.py +43 -23
  16. pyfemtet/_util/femtet_access_inspection.py +120 -0
  17. pyfemtet/{_femtet_config_util/autosave.py → _util/femtet_autosave.py} +7 -0
  18. pyfemtet/_util/femtet_exit.py +105 -0
  19. pyfemtet/_util/femtet_version.py +20 -0
  20. pyfemtet/_util/helper.py +103 -0
  21. pyfemtet/_util/process_util.py +107 -0
  22. pyfemtet/_util/str_enum.py +44 -0
  23. pyfemtet/core.py +15 -47
  24. pyfemtet/dispatch_extensions/__init__.py +8 -11
  25. pyfemtet/dispatch_extensions/_impl.py +42 -198
  26. pyfemtet/logger/__init__.py +8 -1
  27. pyfemtet/logger/_impl.py +5 -6
  28. pyfemtet/opt/__init__.py +3 -17
  29. pyfemtet/opt/exceptions.py +45 -0
  30. pyfemtet/opt/femopt.py +621 -0
  31. pyfemtet/opt/history/__init__.py +11 -0
  32. pyfemtet/opt/history/_history.py +1416 -0
  33. pyfemtet/opt/history/_hypervolume.py +169 -0
  34. pyfemtet/opt/history/_optimality.py +79 -0
  35. pyfemtet/opt/interface/__init__.py +17 -24
  36. pyfemtet/opt/interface/_base_interface.py +222 -0
  37. pyfemtet/opt/interface/_excel_interface/__init__.py +3 -0
  38. pyfemtet/opt/interface/_excel_interface/debug-excel-interface.xlsm +0 -0
  39. pyfemtet/opt/interface/_excel_interface/excel_interface.py +997 -0
  40. pyfemtet/opt/interface/_femtet_interface/__init__.py +3 -0
  41. pyfemtet/opt/interface/{_femtet_parametric.py → _femtet_interface/_femtet_parametric.py} +20 -12
  42. pyfemtet/opt/interface/{_femtet.py → _femtet_interface/femtet_interface.py} +508 -353
  43. pyfemtet/opt/interface/_femtet_with_nx_interface/__init__.py +5 -0
  44. pyfemtet/opt/interface/_femtet_with_nx_interface/femtet_with_nx_interface.py +230 -0
  45. pyfemtet/opt/interface/_femtet_with_nx_interface/model1.prt +0 -0
  46. pyfemtet/opt/interface/_femtet_with_nx_interface/model1.x_t +98 -0
  47. pyfemtet/opt/interface/{_femtet_with_nx → _femtet_with_nx_interface}/update_model.py +1 -3
  48. pyfemtet/opt/interface/_femtet_with_solidworks/__init__.py +5 -0
  49. pyfemtet/opt/interface/_femtet_with_solidworks/femtet_with_solidworks_interface.py +142 -0
  50. pyfemtet/opt/interface/_solidworks_interface/__init__.py +5 -0
  51. pyfemtet/opt/interface/_solidworks_interface/solidworks_interface.py +227 -0
  52. pyfemtet/opt/interface/_surrogate_model_interface/__init__.py +8 -0
  53. pyfemtet/opt/interface/_surrogate_model_interface/base_surrogate_interface.py +150 -0
  54. pyfemtet/opt/interface/_surrogate_model_interface/botorch_interface.py +298 -0
  55. pyfemtet/opt/interface/_surrogate_model_interface/debug-pof-botorch.reccsv +18 -0
  56. pyfemtet/opt/interface/_with_excel_settings/__init__.py +61 -0
  57. pyfemtet/opt/interface/_with_excel_settings/with_excel_settings.py +134 -0
  58. pyfemtet/opt/meta_script/YAML_Generator.xlsm +0 -0
  59. pyfemtet/opt/meta_script/__main__.py +58 -36
  60. pyfemtet/opt/optimizer/__init__.py +7 -9
  61. pyfemtet/opt/optimizer/_base_optimizer.py +911 -0
  62. pyfemtet/opt/optimizer/optuna_optimizer/__init__.py +9 -0
  63. pyfemtet/opt/optimizer/optuna_optimizer/_optuna_attribute.py +63 -0
  64. pyfemtet/opt/optimizer/optuna_optimizer/_optuna_optimizer.py +796 -0
  65. pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/__init__.py +7 -0
  66. pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/debug-pof-botorch.reccsv +18 -0
  67. pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/enable_nonlinear_constraint.py +244 -0
  68. pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/pof_botorch_sampler.py +1249 -0
  69. pyfemtet/opt/optimizer/optuna_optimizer/wat_ex14_parametric_jp.femprj +0 -0
  70. pyfemtet/opt/optimizer/scipy_optimizer/__init__.py +1 -0
  71. pyfemtet/opt/optimizer/scipy_optimizer/_scipy_optimizer.py +383 -0
  72. pyfemtet/opt/prediction/__init__.py +7 -0
  73. pyfemtet/opt/prediction/_botorch_utils.py +133 -0
  74. pyfemtet/opt/prediction/_gpytorch_modules_extension.py +142 -0
  75. pyfemtet/opt/prediction/_helper.py +155 -0
  76. pyfemtet/opt/prediction/_model.py +118 -0
  77. pyfemtet/opt/problem/problem.py +304 -0
  78. pyfemtet/opt/problem/variable_manager/__init__.py +20 -0
  79. pyfemtet/opt/problem/variable_manager/_string_as_expression.py +115 -0
  80. pyfemtet/opt/problem/variable_manager/_variable_manager.py +295 -0
  81. pyfemtet/opt/visualization/history_viewer/__main__.py +5 -0
  82. pyfemtet/opt/visualization/{_base.py → history_viewer/_base_application.py} +18 -13
  83. pyfemtet/opt/visualization/history_viewer/_common_pages.py +150 -0
  84. pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/alert_region.py +10 -5
  85. pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/control_femtet.py +16 -13
  86. pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/main_graph.py +117 -47
  87. pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/pm_graph.py +159 -138
  88. pyfemtet/opt/visualization/history_viewer/_process_monitor/_application.py +173 -0
  89. pyfemtet/opt/visualization/history_viewer/_process_monitor/_pages.py +291 -0
  90. pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/dbc.py +1 -1
  91. pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/dcc.py +1 -1
  92. pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/html.py +1 -1
  93. pyfemtet/opt/visualization/history_viewer/result_viewer/__main__.py +5 -0
  94. pyfemtet/opt/visualization/{result_viewer/application.py → history_viewer/result_viewer/_application.py} +6 -6
  95. pyfemtet/opt/visualization/{result_viewer/pages.py → history_viewer/result_viewer/_pages.py} +106 -82
  96. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.csv +18 -0
  97. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.db +0 -0
  98. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.jpg +0 -0
  99. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.log +45 -0
  100. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.pdt +0 -0
  101. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_1.jpg +0 -0
  102. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_1.pdt +0 -0
  103. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_10.jpg +0 -0
  104. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_10.pdt +0 -0
  105. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_11.jpg +0 -0
  106. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_11.pdt +0 -0
  107. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_12.jpg +0 -0
  108. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_12.pdt +0 -0
  109. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_13.jpg +0 -0
  110. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_13.pdt +0 -0
  111. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_14.jpg +0 -0
  112. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_14.pdt +0 -0
  113. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_15.jpg +0 -0
  114. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_15.pdt +0 -0
  115. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_16.jpg +0 -0
  116. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_16.pdt +0 -0
  117. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_17.jpg +0 -0
  118. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_17.pdt +0 -0
  119. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_18.jpg +0 -0
  120. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_18.pdt +0 -0
  121. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_19.jpg +0 -0
  122. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_19.pdt +0 -0
  123. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_2.jpg +0 -0
  124. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_2.pdt +0 -0
  125. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_20.jpg +0 -0
  126. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_20.pdt +0 -0
  127. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_3.jpg +0 -0
  128. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_3.pdt +0 -0
  129. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.bgr +0 -0
  130. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.bnd +0 -0
  131. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.btr +0 -0
  132. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.jpg +0 -0
  133. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.mtl +0 -0
  134. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.pdt +0 -0
  135. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.prm +0 -0
  136. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_5.jpg +0 -0
  137. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_5.pdt +0 -0
  138. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_6.jpg +0 -0
  139. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_6.pdt +0 -0
  140. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_7.jpg +0 -0
  141. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_7.pdt +0 -0
  142. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_8.jpg +0 -0
  143. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_8.pdt +0 -0
  144. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_9.jpg +0 -0
  145. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_9.pdt +0 -0
  146. pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.femprj +0 -0
  147. pyfemtet/opt/visualization/plotter/main_figure_creator.py +536 -0
  148. pyfemtet/opt/visualization/plotter/pm_graph_creator.py +359 -0
  149. pyfemtet/opt/worker_status.py +120 -0
  150. {pyfemtet-0.9.6.dist-info → pyfemtet-1.0.0.dist-info}/METADATA +23 -24
  151. pyfemtet-1.0.0.dist-info/RECORD +172 -0
  152. pyfemtet-1.0.0.dist-info/entry_points.txt +3 -0
  153. pyfemtet/_femtet_config_util/exit.py +0 -59
  154. pyfemtet/_message/1. make_pot.bat +0 -11
  155. pyfemtet/_message/2. make_mo.bat +0 -6
  156. pyfemtet/_message/__init__.py +0 -5
  157. pyfemtet/_message/babel.cfg +0 -2
  158. pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo +0 -0
  159. pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po +0 -570
  160. pyfemtet/_message/locales/messages.pot +0 -551
  161. pyfemtet/_warning.py +0 -87
  162. pyfemtet/brep/_impl.py +0 -18
  163. pyfemtet/opt/_femopt.py +0 -1007
  164. pyfemtet/opt/_femopt_core.py +0 -1169
  165. pyfemtet/opt/_test_utils/control_femtet.py +0 -39
  166. pyfemtet/opt/_test_utils/hyper_sphere.py +0 -24
  167. pyfemtet/opt/_test_utils/record_history.py +0 -130
  168. pyfemtet/opt/advanced_samples/excel_ui/(ref) original_project.femprj +0 -0
  169. pyfemtet/opt/advanced_samples/excel_ui/femtet-macro.xlsm +0 -0
  170. pyfemtet/opt/advanced_samples/excel_ui/pyfemtet-core.py +0 -291
  171. pyfemtet/opt/advanced_samples/excel_ui/test-pyfemtet-core.cmd +0 -22
  172. pyfemtet/opt/advanced_samples/restart/gal_ex13_parametric.femprj +0 -0
  173. pyfemtet/opt/advanced_samples/restart/gal_ex13_parametric_restart.py +0 -99
  174. pyfemtet/opt/advanced_samples/restart/gal_ex13_parametric_restart_jp.py +0 -102
  175. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_create_training_data.py +0 -60
  176. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_create_training_data_jp.py +0 -57
  177. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate.py +0 -100
  178. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate_jp.py +0 -90
  179. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_parametric.femprj +0 -0
  180. pyfemtet/opt/interface/_base.py +0 -101
  181. pyfemtet/opt/interface/_excel_interface.py +0 -984
  182. pyfemtet/opt/interface/_femtet_excel.py +0 -141
  183. pyfemtet/opt/interface/_femtet_with_nx/__init__.py +0 -3
  184. pyfemtet/opt/interface/_femtet_with_nx/_interface.py +0 -178
  185. pyfemtet/opt/interface/_femtet_with_sldworks.py +0 -298
  186. pyfemtet/opt/interface/_surrogate/__init__.py +0 -5
  187. pyfemtet/opt/interface/_surrogate/_base.py +0 -129
  188. pyfemtet/opt/interface/_surrogate/_chaospy.py +0 -71
  189. pyfemtet/opt/interface/_surrogate/_singletaskgp.py +0 -71
  190. pyfemtet/opt/interface/_surrogate_excel.py +0 -102
  191. pyfemtet/opt/optimizer/_base.py +0 -376
  192. pyfemtet/opt/optimizer/_optuna/_botorch_patch/enable_nonlinear_constraint.py +0 -220
  193. pyfemtet/opt/optimizer/_optuna/_optuna.py +0 -434
  194. pyfemtet/opt/optimizer/_optuna/_pof_botorch.py +0 -1914
  195. pyfemtet/opt/optimizer/_scipy.py +0 -159
  196. pyfemtet/opt/optimizer/_scipy_scalar.py +0 -127
  197. pyfemtet/opt/optimizer/parameter.py +0 -113
  198. pyfemtet/opt/prediction/_base.py +0 -61
  199. pyfemtet/opt/prediction/single_task_gp.py +0 -119
  200. pyfemtet/opt/samples/femprj_sample/ParametricIF.femprj +0 -0
  201. pyfemtet/opt/samples/femprj_sample/ParametricIF.py +0 -29
  202. pyfemtet/opt/samples/femprj_sample/ParametricIF_test_result.reccsv +0 -13
  203. pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.femprj +0 -0
  204. pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.prt +0 -0
  205. pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.py +0 -135
  206. pyfemtet/opt/samples/femprj_sample/cad_ex01_NX_test_result.reccsv +0 -23
  207. pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.SLDPRT +0 -0
  208. pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.femprj +0 -0
  209. pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.py +0 -131
  210. pyfemtet/opt/samples/femprj_sample/cad_ex01_SW_test_result.reccsv +0 -23
  211. pyfemtet/opt/samples/femprj_sample/constrained_pipe.femprj +0 -0
  212. pyfemtet/opt/samples/femprj_sample/constrained_pipe.py +0 -96
  213. pyfemtet/opt/samples/femprj_sample/constrained_pipe_test_result.reccsv +0 -13
  214. pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric.femprj +0 -0
  215. pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric.py +0 -74
  216. pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric_test_result.reccsv +0 -13
  217. pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric.femprj +0 -0
  218. pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric.py +0 -58
  219. pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric_test_result.reccsv +0 -23
  220. pyfemtet/opt/samples/femprj_sample/gau_ex12_parametric.femprj +0 -0
  221. pyfemtet/opt/samples/femprj_sample/gau_ex12_parametric.py +0 -52
  222. pyfemtet/opt/samples/femprj_sample/her_ex40_parametric.femprj +0 -0
  223. pyfemtet/opt/samples/femprj_sample/her_ex40_parametric.py +0 -138
  224. pyfemtet/opt/samples/femprj_sample/her_ex40_parametric_test_result.reccsv +0 -18
  225. pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric.femprj +0 -0
  226. pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric.py +0 -60
  227. pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric_parallel.py +0 -61
  228. pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric_test_result.reccsv +0 -18
  229. pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric.femprj +0 -0
  230. pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric.py +0 -58
  231. pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric_parallel.py +0 -58
  232. pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric_test_result.reccsv +0 -18
  233. pyfemtet/opt/samples/femprj_sample_jp/ParametricIF_jp.femprj +0 -0
  234. pyfemtet/opt/samples/femprj_sample_jp/ParametricIF_jp.py +0 -29
  235. pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_NX_jp.femprj +0 -0
  236. pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_NX_jp.py +0 -129
  237. pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_SW_jp.femprj +0 -0
  238. pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_SW_jp.py +0 -125
  239. pyfemtet/opt/samples/femprj_sample_jp/constrained_pipe_jp.py +0 -93
  240. pyfemtet/opt/samples/femprj_sample_jp/gal_ex58_parametric_jp.femprj +0 -0
  241. pyfemtet/opt/samples/femprj_sample_jp/gal_ex58_parametric_jp.py +0 -70
  242. pyfemtet/opt/samples/femprj_sample_jp/gau_ex08_parametric_jp.femprj +0 -0
  243. pyfemtet/opt/samples/femprj_sample_jp/gau_ex08_parametric_jp.py +0 -57
  244. pyfemtet/opt/samples/femprj_sample_jp/gau_ex12_parametric_jp.py +0 -52
  245. pyfemtet/opt/samples/femprj_sample_jp/her_ex40_parametric_jp.femprj +0 -0
  246. pyfemtet/opt/samples/femprj_sample_jp/her_ex40_parametric_jp.py +0 -138
  247. pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_jp.femprj +0 -0
  248. pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_jp.py +0 -58
  249. pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_parallel_jp.py +0 -59
  250. pyfemtet/opt/samples/femprj_sample_jp/wat_ex14_parametric_jp.py +0 -56
  251. pyfemtet/opt/samples/femprj_sample_jp/wat_ex14_parametric_parallel_jp.py +0 -56
  252. pyfemtet/opt/visualization/_complex_components/main_figure_creator.py +0 -332
  253. pyfemtet/opt/visualization/_complex_components/pm_graph_creator.py +0 -201
  254. pyfemtet/opt/visualization/_process_monitor/application.py +0 -226
  255. pyfemtet/opt/visualization/_process_monitor/pages.py +0 -406
  256. pyfemtet/opt/visualization/_wrapped_components/__init__.py +0 -0
  257. pyfemtet/opt/visualization/result_viewer/__init__.py +0 -0
  258. pyfemtet-0.9.6.dist-info/RECORD +0 -158
  259. pyfemtet-0.9.6.dist-info/entry_points.txt +0 -3
  260. /pyfemtet/{_femtet_config_util → opt/problem}/__init__.py +0 -0
  261. /pyfemtet/{brep → opt/visualization/history_viewer}/__init__.py +0 -0
  262. /pyfemtet/opt/{_test_utils → visualization/history_viewer/_complex_components}/__init__.py +0 -0
  263. /pyfemtet/opt/{optimizer/_optuna → visualization/history_viewer/_process_monitor}/__init__.py +0 -0
  264. /pyfemtet/opt/{optimizer/_optuna/_botorch_patch → visualization/history_viewer/_wrapped_components}/__init__.py +0 -0
  265. /pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/str_enum.py +0 -0
  266. /pyfemtet/opt/visualization/{result_viewer → history_viewer/result_viewer}/.gitignore +0 -0
  267. /pyfemtet/opt/visualization/{_complex_components → history_viewer/result_viewer}/__init__.py +0 -0
  268. /pyfemtet/opt/visualization/{_process_monitor → plotter}/__init__.py +0 -0
  269. /pyfemtet/opt/{samples/femprj_sample_jp/wat_ex14_parametric_jp.femprj → wat_ex14_parametric_jp.femprj} +0 -0
  270. {pyfemtet-0.9.6.dist-info → pyfemtet-1.0.0.dist-info}/LICENSE +0 -0
  271. {pyfemtet-0.9.6.dist-info → pyfemtet-1.0.0.dist-info}/LICENSE_THIRD_PARTY.txt +0 -0
  272. {pyfemtet-0.9.6.dist-info → pyfemtet-1.0.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,227 @@
1
+ from __future__ import annotations
2
+
3
+ from time import sleep
4
+ from typing import TYPE_CHECKING
5
+
6
+ import os
7
+ import re
8
+
9
+ from win32com.client import DispatchEx, CDispatch
10
+ # noinspection PyUnresolvedReferences
11
+ from pythoncom import CoInitialize, CoUninitialize, com_error
12
+
13
+ from pyfemtet._util.dask_util import *
14
+ from pyfemtet.opt.exceptions import *
15
+ from pyfemtet.opt.interface._base_interface import COMInterface
16
+ from pyfemtet._i18n import _
17
+ from pyfemtet.opt.problem.variable_manager import SupportedVariableTypes
18
+ from pyfemtet.logger import get_module_logger
19
+
20
+ if TYPE_CHECKING:
21
+ from pyfemtet.opt.optimizer import AbstractOptimizer
22
+
23
+
24
+ logger = get_module_logger('opt.interface', False)
25
+
26
+
27
+ # 定数の宣言
28
+ swThisConfiguration = 1 # https://help.solidworks.com/2023/english/api/swconst/SOLIDWORKS.Interop.swconst~SOLIDWORKS.Interop.swconst.swInConfigurationOpts_e.html
29
+ swAllConfiguration = 2
30
+ swSpecifyConfiguration = 3 # use with ConfigName argument
31
+ swSaveAsCurrentVersion = 0
32
+ swSaveAsOptions_Copy = 2 #
33
+ swSaveAsOptions_Silent = 1 # https://help.solidworks.com/2021/english/api/swconst/solidworks.interop.swconst~solidworks.interop.swconst.swsaveasoptions_e.html
34
+ swSaveWithReferencesOptions_None = 0 # https://help-solidworks-com.translate.goog/2023/english/api/swconst/SolidWorks.Interop.swconst~SolidWorks.Interop.swconst.swSaveWithReferencesOptions_e.html?_x_tr_sl=auto&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=wapp
35
+ swDocPART = 1 # https://help.solidworks.com/2023/english/api/swconst/SOLIDWORKS.Interop.swconst~SOLIDWORKS.Interop.swconst.swDocumentTypes_e.html
36
+
37
+
38
+ class FileNotOpenedError(Exception):
39
+ pass
40
+
41
+
42
+ # noinspection PyPep8Naming
43
+ class SolidworksInterface(COMInterface):
44
+ """
45
+ Interface class for interacting with SolidWorks through COM automation.
46
+
47
+ This class manages the connection and interaction with SolidWorks using its COM interface.
48
+ It handles initialization, visibility, and clean termination of the SolidWorks application.
49
+
50
+ Attributes:
51
+ swApp (CDispatch): The COM dispatch object for SolidWorks application.
52
+ com_members (dict): Mapping of COM member names to their interface strings.
53
+ sldprt_path (str): Absolute path to the SolidWorks part file (.sldprt).
54
+ quit_solidworks_on_terminate (bool): Whether to close SolidWorks upon object destruction.
55
+ solidworks_visible (bool): Whether the SolidWorks application window is visible.
56
+
57
+ Args:
58
+ sldprt_path (str): Path to the SolidWorks part file (.sldprt).
59
+ close_solidworks_on_terminate (bool, optional): If True, SolidWorks will close when this object is destroyed. Defaults to False.
60
+ visible (bool, optional): If True, SolidWorks will be started in visible mode. Defaults to True.
61
+
62
+ Raises:
63
+ AssertionError: If the specified part file does not exist.
64
+ """
65
+
66
+ swApp: CDispatch
67
+ com_members = {'swApp': 'SLDWORKS.Application'}
68
+ _access_sw_lock_name = 'access_sw'
69
+
70
+ def __init__(
71
+ self,
72
+ sldprt_path,
73
+ close_solidworks_on_terminate=False,
74
+ visible=True,
75
+ ):
76
+ self.sldprt_path = os.path.abspath(sldprt_path)
77
+ self.quit_solidworks_on_terminate = close_solidworks_on_terminate
78
+ self.solidworks_visible = visible
79
+
80
+ assert os.path.isfile(self.sldprt_path)
81
+ self._original_sldprt_path = self.sldprt_path
82
+
83
+ def connect_sw(self):
84
+ logger.info(_(
85
+ en_message='Connecting to Solidworks...',
86
+ jp_message='Solidworks に接続しています...'
87
+ ))
88
+ try:
89
+ self.swApp = DispatchEx('SLDWORKS.Application')
90
+ except com_error:
91
+ raise Exception(_(
92
+ en_message='Failed to instantiate Solidworks. '
93
+ 'Please check installation and enabling macro.',
94
+ jp_message='Solidworks のインスタンス化に失敗しました。'
95
+ 'Solidworks がインストールされており、'
96
+ 'Solidworks マクロが有効であることを確認してください。'))
97
+ self.swApp.Visible = self.solidworks_visible
98
+
99
+ def _setup_before_parallel(self):
100
+ self._distribute_files([self.sldprt_path])
101
+
102
+ def _setup_after_parallel(self, opt: AbstractOptimizer = None):
103
+
104
+ # get suffix
105
+ suffix = self._get_worker_index_from_optimizer(opt)
106
+
107
+ # rename and get worker path
108
+ self.sldprt_path = self._rename_and_get_path_on_worker_space(
109
+ self._original_sldprt_path,
110
+ suffix,
111
+ )
112
+
113
+ # connect solidworks
114
+ CoInitialize()
115
+ with Lock(self._access_sw_lock_name):
116
+ self.connect_sw()
117
+
118
+ # open it
119
+ self.swApp.OpenDoc(self.sldprt_path, swDocPART)
120
+
121
+ @property
122
+ def swModel(self) -> CDispatch:
123
+ return _get_model_by_basename(self.swApp, os.path.basename(self.sldprt_path))
124
+
125
+ def update(self) -> None:
126
+ raise NotImplementedError
127
+
128
+ def update_parameter(self, x: dict[str, SupportedVariableTypes]) -> None:
129
+
130
+ COMInterface.update_parameter(self, x)
131
+
132
+ # sw はプロセスが一つなので Lock
133
+ with Lock(self._access_sw_lock_name):
134
+
135
+ sleep(0.2)
136
+
137
+ # ===== model を取得 =====
138
+ swModel = self.swModel
139
+
140
+ # ===== equation manager を取得 =====
141
+ swEqnMgr = swModel.GetEquationMgr
142
+ nEquation = swEqnMgr.GetCount
143
+
144
+ # プロパティを退避
145
+ buffer_aso = swEqnMgr.AutomaticSolveOrder
146
+ buffer_ar = swEqnMgr.AutomaticRebuild
147
+ swEqnMgr.AutomaticSolveOrder = False
148
+ swEqnMgr.AutomaticRebuild = False
149
+
150
+ # 値を更新
151
+ for i in range(nEquation):
152
+ # name, equation の取得
153
+ eq = swEqnMgr.Equation(i)
154
+ prm_name = _get_name_from_equation(eq)
155
+ # 対象なら処理
156
+ if prm_name in self.current_prm_values:
157
+ new_equation = f'"{prm_name}" = {self.current_prm_values[prm_name]}'
158
+ swEqnMgr.Equation(i, new_equation)
159
+
160
+ # 式の計算
161
+ # noinspection PyStatementEffect
162
+ swEqnMgr.EvaluateAll # always returns -1
163
+
164
+ # プロパティをもとに戻す
165
+ swEqnMgr.AutomaticSolveOrder = buffer_aso
166
+ swEqnMgr.AutomaticRebuild = buffer_ar
167
+
168
+ def update_model(self):
169
+ """Update .sldprt"""
170
+
171
+ # sw はプロセスが一つなので Lock
172
+ with Lock(self._access_sw_lock_name):
173
+
174
+ sleep(0.2)
175
+
176
+ # ===== model を取得 =====
177
+ swModel = self.swModel
178
+
179
+ # モデル再構築
180
+ result = swModel.EditRebuild3 # モデル再構築
181
+ if not result:
182
+ raise ModelError(_(
183
+ en_message='Failed to update the model on Solidworks.',
184
+ jp_message='Solidworks モデルの更新に失敗しました。'
185
+ ))
186
+
187
+ def close(self):
188
+ if not hasattr(self, 'swApp'):
189
+ return
190
+
191
+ if self.swApp is None:
192
+ return
193
+
194
+ with Lock(self._access_sw_lock_name):
195
+ model_name = os.path.basename(self.sldprt_path)
196
+ logger.info(_(
197
+ en_message='Closing {model_name} ...',
198
+ jp_message='モデル {model_name} を閉じています...',
199
+ model_name=model_name,
200
+ ))
201
+
202
+ # 最後の Doc ならばプロセスを落とす仕様?
203
+ self.swApp.QuitDoc(os.path.basename(self.sldprt_path))
204
+ # logger.info(Msg.F_SW_MODEL_CLOSED(model_name))
205
+ logger.info(_(
206
+ en_message='Successfully closed {model_name}.',
207
+ jp_message='モデル {model_name} を閉じました。',
208
+ model_name=model_name,
209
+ ))
210
+ sleep(3)
211
+
212
+
213
+ # noinspection PyPep8Naming
214
+ def _get_model_by_basename(swApp, basename):
215
+ swModel = swApp.ActivateDoc(basename)
216
+ if swModel is None:
217
+ raise FileNotOpenedError(f'Model {basename} is not opened.')
218
+ return swModel
219
+
220
+
221
+ def _get_name_from_equation(equation: str):
222
+ pattern = r'^\s*"(.+?)"\s*$'
223
+ matched = re.match(pattern, equation.split('=')[0])
224
+ if matched:
225
+ return matched.group(1)
226
+ else:
227
+ return None
@@ -0,0 +1,8 @@
1
+ from .base_surrogate_interface import AbstractSurrogateModelInterfaceBase
2
+ from .botorch_interface import BoTorchInterface, PoFBoTorchInterface
3
+
4
+ __all__ = [
5
+ 'AbstractSurrogateModelInterfaceBase',
6
+ 'BoTorchInterface',
7
+ 'PoFBoTorchInterface',
8
+ ]
@@ -0,0 +1,150 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Sequence
4
+
5
+ from pyfemtet.opt.history import *
6
+
7
+ from pyfemtet.opt.interface import AbstractFEMInterface
8
+ from pyfemtet._i18n import _
9
+
10
+ if TYPE_CHECKING:
11
+ from pyfemtet.opt.optimizer import AbstractOptimizer
12
+
13
+
14
+ __all__ = [
15
+ 'AbstractSurrogateModelInterfaceBase',
16
+ ]
17
+
18
+
19
+ class AbstractSurrogateModelInterfaceBase(AbstractFEMInterface):
20
+ _load_problem_from_fem = True
21
+ current_obj_values: dict[str, float]
22
+ train_history: History
23
+
24
+ def __init__(
25
+ self,
26
+ history_path: str = None,
27
+ train_history: History = None,
28
+ _output_directions: (
29
+ Sequence[str | float]
30
+ | dict[str, str | float]
31
+ | dict[int, str | float]
32
+ ) = None
33
+ ):
34
+
35
+ self._output_directions = _output_directions
36
+
37
+ # history_path が与えられた場合、train_history をコンストラクトする
38
+ if history_path is not None:
39
+ train_history = History()
40
+ train_history.load_csv(history_path, with_finalize=True)
41
+
42
+ assert train_history is not None
43
+
44
+ self.train_history = train_history
45
+
46
+ self.current_obj_values = {}
47
+
48
+ def load_objectives(self, opt: AbstractOptimizer):
49
+
50
+ # output directions が与えられない場合、
51
+ # opt.add_objective との整合をチェックする
52
+ if self._output_directions is None:
53
+
54
+ # add_objective された目的のうち、
55
+ # training data に含まれる名前ならば
56
+ # fun を「その時点の current_obj_values を返す関数」で
57
+ # 上書き
58
+ obj_name: str
59
+ for obj_name, obj in opt.objectives.items():
60
+ # あれば上書き、なければ surrogate 最適化の際に
61
+ # 新しく追加した model を使わない目的関数と見做して何もしない
62
+ if obj_name in self.train_history.obj_names:
63
+ obj.fun = lambda _, obj_name_=obj_name: self.current_obj_values[obj_name_]
64
+
65
+ # dict で与えられた場合
66
+ elif isinstance(self._output_directions, dict):
67
+
68
+ # index 入力か str 入力かで統一されているか確認
69
+ keys = tuple(self._output_directions.keys())
70
+ assert all([isinstance(key, type(keys[0])) for key in keys]), _(
71
+ en_message='The keys of _output_directions must be '
72
+ 'all-int or all-str.',
73
+ jp_message='_output_directions のキーは int または str で'
74
+ '統一されていなければなりません。',
75
+ )
76
+
77
+ # index がキーである場合
78
+ if isinstance(keys[0], int):
79
+
80
+ for index, direction in self._output_directions.items():
81
+ obj_name = self.train_history.obj_names[index]
82
+
83
+ opt.add_objective(
84
+ name=obj_name,
85
+ fun=lambda _, obj_name_=obj_name: self.current_obj_values[obj_name_],
86
+ direction=direction,
87
+ args=(),
88
+ kwargs={},
89
+ )
90
+
91
+ # obj_name がキーである場合
92
+ if isinstance(keys[0], str):
93
+
94
+ for obj_name, direction in self._output_directions.items():
95
+ assert obj_name in self.train_history.obj_names, _(
96
+ en_message='The objective name passed as a key of '
97
+ '_output_direction must be one of the history\'s '
98
+ 'objective names. Passed name: {obj_name} / '
99
+ 'History\'s names: {obj_names}',
100
+ jp_message='_output_directions に目的関数名を与える場合は'
101
+ 'history に含まれる名前を指定しなければなりません。'
102
+ '与えられた目的名: {obj_name} / history に含まれる'
103
+ '目的名: {obj_names}',
104
+ obj_name=obj_name,
105
+ obj_names=', '.join(self.train_history.obj_names)
106
+ )
107
+
108
+ opt.add_objective(
109
+ name=obj_name,
110
+ fun=lambda obj_name_=obj_name: self.current_obj_values[obj_name_],
111
+ direction=direction,
112
+ args=(),
113
+ kwargs={},
114
+ )
115
+
116
+ # tuple で与えられた場合
117
+ elif isinstance(self._output_directions, list) \
118
+ or isinstance(self._output_directions, tuple):
119
+
120
+ obj_names = self.train_history.obj_names
121
+ assert len(self._output_directions) == len(obj_names), _(
122
+ en_message='The length of _output_directions passed as a list '
123
+ 'must be same with that of the history\'s objective '
124
+ 'names.',
125
+ jp_message='_output_directions をリストで渡す場合は'
126
+ 'その長さが history の目的関数数と一致して'
127
+ 'いなければなりません。'
128
+ )
129
+
130
+ for obj_name, direction in zip(obj_names, self._output_directions):
131
+ opt.add_objective(
132
+ name=obj_name,
133
+ fun=lambda _, obj_name_=obj_name: self.current_obj_values[obj_name_],
134
+ direction=direction,
135
+ args=(),
136
+ kwargs={},
137
+ )
138
+
139
+ def load_variables(self, opt: AbstractOptimizer):
140
+ # opt の変数が充分であるかのチェックのみ
141
+ parameters = opt.variable_manager.get_variables()
142
+ assert len(set(self.train_history.prm_names) - set(parameters.keys())) == 0
143
+
144
+ def _check_using_fem(self, fun: callable) -> bool:
145
+ return False
146
+
147
+ def _check_param_and_raise(self, prm_name) -> None:
148
+ if prm_name not in self.train_history.prm_names:
149
+ raise KeyError(f'Parameter name {prm_name} is not in '
150
+ f'training input {self.train_history.prm_names}.')
@@ -0,0 +1,298 @@
1
+ from typing import Sequence
2
+
3
+ import numpy as np
4
+ from scipy.stats.distributions import norm
5
+
6
+ # from gpytorch.priors.torch_priors import GammaPrior
7
+
8
+ from pyfemtet._i18n import _
9
+ from pyfemtet.opt.history import *
10
+ from pyfemtet.opt.exceptions import *
11
+
12
+ from pyfemtet.opt.prediction._model import PyFemtetModel, SingleTaskGPModel
13
+
14
+ from pyfemtet.opt.interface._surrogate_model_interface.base_surrogate_interface import AbstractSurrogateModelInterfaceBase
15
+
16
+ from pyfemtet.logger import get_module_logger
17
+
18
+ logger = get_module_logger('opt.interface', False)
19
+
20
+
21
+ __all__ = [
22
+ 'BoTorchInterface',
23
+ 'PoFBoTorchInterface',
24
+ ]
25
+
26
+
27
+ class BoTorchInterface(AbstractSurrogateModelInterfaceBase):
28
+
29
+ def __init__(
30
+ self,
31
+ history_path: str = None,
32
+ train_history: History = None,
33
+ _output_directions: (
34
+ Sequence[str | float]
35
+ | dict[str, str | float]
36
+ | dict[int, str | float]
37
+ ) = None
38
+ ):
39
+ AbstractSurrogateModelInterfaceBase.__init__(
40
+ self,
41
+ history_path,
42
+ train_history,
43
+ _output_directions
44
+ )
45
+
46
+ self.model = SingleTaskGPModel()
47
+ self.pyfemtet_model = PyFemtetModel()
48
+
49
+ # get main only
50
+ df = self.train_history.get_df(MAIN_FILTER)
51
+
52
+ # filter succeeded only
53
+ df = df[df['state'] == TrialState.succeeded]
54
+
55
+ # training
56
+ self.pyfemtet_model.update_model(self.model)
57
+ self.pyfemtet_model.fit(
58
+ history=self.train_history,
59
+ df=df,
60
+ observation_noise='no',
61
+ )
62
+
63
+ def update(self) -> None:
64
+ # update current objective values
65
+ x = np.array([self.current_prm_values.values()])
66
+
67
+ y, _ = self.pyfemtet_model.predict(x)
68
+ y = y[0]
69
+
70
+ for obj_name, obj_value in zip(self.train_history.obj_names, y):
71
+ self.current_obj_values.update({obj_name: obj_value})
72
+
73
+
74
+ class PoFBoTorchInterface(BoTorchInterface, AbstractSurrogateModelInterfaceBase):
75
+
76
+ _debug: bool = False
77
+
78
+ def __init__(
79
+ self,
80
+ history_path: str,
81
+ train_history: History = None,
82
+ observation_noise: float | str | None = None,
83
+ feasibility_noise: float | str | None = None,
84
+ feasibility_cdf_threshold: float | str = 0.5, # or 'sample_mean'
85
+ _output_directions: (
86
+ Sequence[str | float]
87
+ | dict[str, str | float]
88
+ | dict[int, str | float]
89
+ ) = None
90
+ ):
91
+ AbstractSurrogateModelInterfaceBase.__init__(
92
+ self,
93
+ history_path,
94
+ train_history,
95
+ _output_directions
96
+ )
97
+
98
+ self.model = SingleTaskGPModel()
99
+ self.pyfemtet_model = PyFemtetModel()
100
+ self.model_c = SingleTaskGPModel()
101
+ self.pyfemtet_model_c = PyFemtetModel()
102
+ self.train_history_c = History()
103
+ self.train_history_c.load_csv(history_path, with_finalize=True)
104
+ self.pof_threshold = 0.5
105
+ self.feasibility_cdf_threshold = feasibility_cdf_threshold
106
+
107
+ # use feasibility as a single objective
108
+ self.train_history_c.obj_names = ['feasibility']
109
+
110
+ # get main only
111
+ df = self.train_history.get_df(MAIN_FILTER)
112
+ df_c = self.train_history_c.get_df(MAIN_FILTER)
113
+
114
+ # filter succeeded only for main
115
+ df = df[df['state'] == TrialState.succeeded]
116
+
117
+ # convert type bool to float
118
+ df_c = df_c.astype({'feasibility': float})
119
+
120
+ # training main
121
+ self.pyfemtet_model.update_model(self.model)
122
+ self.pyfemtet_model.fit(
123
+ history=self.train_history,
124
+ df=df,
125
+ observation_noise=observation_noise,
126
+ )
127
+
128
+ # training model_c
129
+ self.pyfemtet_model_c.update_model(self.model_c)
130
+ self.pyfemtet_model_c.fit(
131
+ history=self.train_history_c,
132
+ df=df_c,
133
+ # observation_noise=None,
134
+ # observation_noise='no',
135
+ # observation_noise=0.001,
136
+ observation_noise=feasibility_noise,
137
+ # covar_module_settings=dict(
138
+ # name='matern_kernel_with_gamma_prior',
139
+ # nu=2.5,
140
+ # lengthscale_prior=GammaPrior(1.0, 9.0), # default: 3, 6
141
+ # outputscale_prior=GammaPrior(1.0, 0.15), # default: 2, 0.15
142
+ # )
143
+ covar_module_settings=dict(
144
+ name='get_covar_module_with_dim_scaled_prior_extension',
145
+ loc_coef=0.01,
146
+ scale_coef=0.01,
147
+ )
148
+ )
149
+
150
+ # set auto feasibility_cdf_threshold
151
+ if self.feasibility_cdf_threshold == 'sample_mean':
152
+ self.feasibility_cdf_threshold = df_c['feasibility'].mean()
153
+
154
+ if self._debug:
155
+ self._debug_df_c = df_c
156
+
157
+ def calc_pof(self):
158
+
159
+ if self._debug:
160
+ import plotly.graph_objects as go
161
+
162
+ df = self._debug_df_c
163
+
164
+ x_list = []
165
+ prm_names = self.train_history_c.prm_names
166
+ for prm_name in prm_names:
167
+ x_list.append(np.linspace(
168
+ df[prm_name + '_lower_bound'].values[0],
169
+ df[prm_name + '_upper_bound'].values[0],
170
+ 20
171
+ ))
172
+
173
+ for i in range(len(x_list)):
174
+ for j in range(i, len(x_list)):
175
+ if i == j:
176
+ continue
177
+
178
+ # i=0
179
+ # j=1
180
+
181
+ xx = np.meshgrid(x_list[i], x_list[j])
182
+
183
+ x_plot = np.array([[x[0]] * 400 for x in x_list]).T
184
+ x_plot[:, i] = xx[0].ravel()
185
+ x_plot[:, j] = xx[1].ravel()
186
+
187
+ y_mean, y_std = self.pyfemtet_model_c.predict(x_plot)
188
+ # feasibility_cdf_threshold = self.feasibility_cdf_threshold
189
+ # feasibility_cdf_threshold = 0.5
190
+ cdf_threshold = 0.25 # 不明なところは pof が 1 近くにすればあとは ACQF がうまいことやってくれる
191
+ # feasibility_cdf_threshold = self.feasibility_cdf_threshold * 0.5
192
+ pof = 1 - norm.cdf(cdf_threshold, y_mean, y_std)
193
+
194
+ x1 = x_list[i]
195
+ x2 = x_list[j]
196
+ xx1 = xx[0]
197
+ xx2 = xx[1]
198
+
199
+ fig = go.Figure()
200
+ fig.add_trace(
201
+ go.Contour(
202
+ x0=x1[0],
203
+ y0=x2[0],
204
+ dx=np.diff(x1)[0],
205
+ dy=np.diff(x2)[0],
206
+ z=pof.reshape(xx1.shape),
207
+ )
208
+ )
209
+ fig.add_trace(
210
+ go.Scatter(
211
+ x=self._debug_df_c[prm_names[i]],
212
+ y=self._debug_df_c[prm_names[j]],
213
+ mode='markers',
214
+ marker=dict(
215
+ color=self._debug_df_c['feasibility'],
216
+ colorscale='greens',
217
+ ),
218
+ )
219
+ )
220
+ fig.show()
221
+
222
+ fig = go.Figure()
223
+ fig.add_trace(
224
+ go.Surface(
225
+ x=xx1,
226
+ y=xx2,
227
+ z=y_mean.reshape(xx1.shape),
228
+ )
229
+ )
230
+ fig.add_trace(
231
+ go.Surface(
232
+ x=xx1,
233
+ y=xx2,
234
+ z=(y_mean + y_std).reshape(xx1.shape),
235
+ opacity=0.3,
236
+ )
237
+ )
238
+ fig.add_trace(
239
+ go.Surface(
240
+ x=xx1,
241
+ y=xx2,
242
+ z=(y_mean - y_std).reshape(xx1.shape),
243
+ opacity=0.3,
244
+ )
245
+ )
246
+ fig.add_trace(
247
+ go.Scatter3d(
248
+ x=self._debug_df_c[prm_names[i]],
249
+ y=self._debug_df_c[prm_names[j]],
250
+ z=self._debug_df_c['feasibility'],
251
+ mode='markers',
252
+ )
253
+ )
254
+ fig.show()
255
+
256
+ return
257
+
258
+ x = np.array([self.current_prm_values.values()])
259
+
260
+ f_mean, f_std = self.pyfemtet_model_c.predict(x)
261
+ f_mean, f_std = f_mean[0][0], f_std[0][0]
262
+
263
+ if isinstance(self.feasibility_cdf_threshold, float):
264
+ cdf_threshold = self.feasibility_cdf_threshold
265
+ else:
266
+ raise NotImplementedError(
267
+ f'self.cdf_threshold must be float, '
268
+ f'passed {self.feasibility_cdf_threshold}'
269
+ )
270
+
271
+ pof = 1 - norm.cdf(cdf_threshold, f_mean, f_std)
272
+
273
+ return pof
274
+
275
+ def update(self) -> None:
276
+
277
+ # BoTorchInterface.update() の前に PoF を計算する
278
+ pof = self.calc_pof()
279
+ if pof < self.pof_threshold:
280
+ logger.info(
281
+ _(
282
+ en_message='The surrogate model estimated '
283
+ 'that the probability of '
284
+ 'feasibility (PoF) is {pof}. '
285
+ 'This is under {thresh}. '
286
+ 'So this trial is processed as '
287
+ 'a constraint violation.',
288
+ jp_message='サロゲートモデルは解の実行可能確率(PoF)が'
289
+ '{pof} であると予測しました。'
290
+ 'これは閾値 {thresh} を下回っているので、'
291
+ '最適化試行においては拘束違反であると扱います。',
292
+ pof=pof,
293
+ thresh=self.pof_threshold,
294
+ )
295
+ )
296
+ raise _HiddenConstraintViolation(f'PoF < {self.pof_threshold}')
297
+
298
+ BoTorchInterface.update(self)