pyfemtet 0.4.11__tar.gz → 0.4.13__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 (145) hide show
  1. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/PKG-INFO +1 -1
  2. pyfemtet-0.4.13/pyfemtet/__init__.py +1 -0
  3. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/_test_util.py +26 -0
  4. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/__init__.py +1 -1
  5. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/_femopt.py +32 -2
  6. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/_femopt_core.py +6 -3
  7. pyfemtet-0.4.13/pyfemtet/opt/femprj_sample/ParametricIF - True.femprj +0 -0
  8. pyfemtet-0.4.13/pyfemtet/opt/femprj_sample/ParametricIF.femprj +0 -0
  9. pyfemtet-0.4.13/pyfemtet/opt/femprj_sample/ParametricIF.py +31 -0
  10. pyfemtet-0.4.13/pyfemtet/opt/femprj_sample/ParametricIF_test_result.reccsv +13 -0
  11. pyfemtet-0.4.13/pyfemtet/opt/femprj_sample_jp/ParametricIF_jp.femprj +0 -0
  12. pyfemtet-0.4.13/pyfemtet/opt/femprj_sample_jp/ParametricIF_jp.py +31 -0
  13. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/_base.py +6 -1
  14. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/_femtet.py +4 -2
  15. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/_femtet_parametric.py +7 -2
  16. pyfemtet-0.4.13/pyfemtet/opt/opt/__init__.py +10 -0
  17. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/opt/_base.py +79 -7
  18. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/opt/_optuna.py +13 -2
  19. pyfemtet-0.4.13/pyfemtet/opt/opt/_scipy.py +144 -0
  20. pyfemtet-0.4.13/pyfemtet/opt/opt/_scipy_scalar.py +104 -0
  21. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyproject.toml +1 -1
  22. pyfemtet-0.4.11/pyfemtet/__init__.py +0 -1
  23. pyfemtet-0.4.11/pyfemtet/opt/opt/__init__.py +0 -8
  24. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/LICENSE +0 -0
  25. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/README.md +0 -0
  26. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.femprj +0 -0
  27. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.prt +0 -0
  28. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.py +0 -0
  29. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.SLDPRT +0 -0
  30. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.femprj +0 -0
  31. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.py +0 -0
  32. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/_her_ex40_parametric.py +0 -0
  33. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/gau_ex08_parametric.femprj +0 -0
  34. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/gau_ex08_parametric.py +0 -0
  35. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/her_ex40_parametric.femprj +0 -0
  36. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/her_ex40_parametric.py +0 -0
  37. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/wat_ex14_parallel_parametric.py +0 -0
  38. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/wat_ex14_parametric.femprj +0 -0
  39. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/FemtetPJTSample/wat_ex14_parametric.py +0 -0
  40. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/core.py +0 -0
  41. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/dispatch_extensions.py +0 -0
  42. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/logger.py +0 -0
  43. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_NX.femprj +0 -0
  44. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_NX.prt +0 -0
  45. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_NX.py +0 -0
  46. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_NX_test_result.reccsv +0 -0
  47. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_SW.SLDPRT +0 -0
  48. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_SW.femprj +0 -0
  49. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_SW.py +0 -0
  50. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/cad_ex01_SW_test_result.reccsv +0 -0
  51. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/gal_ex58_parametric.femprj +0 -0
  52. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/gal_ex58_parametric.py +0 -0
  53. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/gal_ex58_parametric_test_result.reccsv +0 -0
  54. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/gau_ex08_parametric.femprj +0 -0
  55. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/gau_ex08_parametric.py +0 -0
  56. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/gau_ex08_parametric_test_result.reccsv +0 -0
  57. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/her_ex40_parametric.femprj +0 -0
  58. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/her_ex40_parametric.py +0 -0
  59. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/her_ex40_parametric_test_result.reccsv +0 -0
  60. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric.femprj +0 -0
  61. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric.py +0 -0
  62. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric_parallel.py +0 -0
  63. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric_test_result.reccsv +0 -0
  64. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/wat_ex14_parametric.femprj +0 -0
  65. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/wat_ex14_parametric.py +0 -0
  66. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/wat_ex14_parametric_parallel.py +0 -0
  67. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample/wat_ex14_parametric_test_result.reccsv +0 -0
  68. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/cad_ex01_NX_jp.femprj +0 -0
  69. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/cad_ex01_NX_jp.py +0 -0
  70. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/cad_ex01_SW_jp.femprj +0 -0
  71. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/cad_ex01_SW_jp.py +0 -0
  72. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/gal_ex58_parametric_jp.femprj +0 -0
  73. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/gal_ex58_parametric_jp.py +0 -0
  74. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/gau_ex08_parametric_jp.femprj +0 -0
  75. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/gau_ex08_parametric_jp.py +0 -0
  76. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/her_ex40_parametric_jp.femprj +0 -0
  77. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/her_ex40_parametric_jp.py +0 -0
  78. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_jp.femprj +0 -0
  79. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_jp.py +0 -0
  80. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_parallel_jp.py +0 -0
  81. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_jp.femprj +0 -0
  82. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_jp.py +0 -0
  83. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_parallel_jp.py +0 -0
  84. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/__init__.py +0 -0
  85. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/_femtet_with_nx/__init__.py +0 -0
  86. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/_femtet_with_nx/_interface.py +0 -0
  87. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/_femtet_with_nx/update_model.py +0 -0
  88. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/interface/_femtet_with_sldworks.py +0 -0
  89. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/__init__.py +0 -0
  90. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/_create_wrapped_components.py +0 -0
  91. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/base.py +0 -0
  92. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/complex_components/__init__.py +0 -0
  93. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/complex_components/alert_region.py +0 -0
  94. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/complex_components/control_femtet.py +0 -0
  95. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/complex_components/main_figure_creator.py +0 -0
  96. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/complex_components/main_graph.py +0 -0
  97. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/process_monitor/__init__.py +0 -0
  98. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/process_monitor/application.py +0 -0
  99. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/process_monitor/pages.py +0 -0
  100. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/.gitignore +0 -0
  101. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/__init__.py +0 -0
  102. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/application.py +0 -0
  103. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/pages.py +0 -0
  104. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/tutorial.csv +0 -0
  105. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14.jpg +0 -0
  106. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14.log +0 -0
  107. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14.pdt +0 -0
  108. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_heatflow.csv +0 -0
  109. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_heatflow_el.csv +0 -0
  110. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial1.jpg +0 -0
  111. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial1.pdt +0 -0
  112. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial10.jpg +0 -0
  113. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial10.pdt +0 -0
  114. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial11.jpg +0 -0
  115. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial11.pdt +0 -0
  116. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial12.jpg +0 -0
  117. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial12.pdt +0 -0
  118. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial13.jpg +0 -0
  119. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial13.pdt +0 -0
  120. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial14.jpg +0 -0
  121. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial14.pdt +0 -0
  122. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial15.jpg +0 -0
  123. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial15.pdt +0 -0
  124. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial2.jpg +0 -0
  125. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial2.pdt +0 -0
  126. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial3.jpg +0 -0
  127. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial3.pdt +0 -0
  128. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial4.jpg +0 -0
  129. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial4.pdt +0 -0
  130. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial5.jpg +0 -0
  131. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial5.pdt +0 -0
  132. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial6.jpg +0 -0
  133. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial6.pdt +0 -0
  134. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial7.jpg +0 -0
  135. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial7.pdt +0 -0
  136. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial8.jpg +0 -0
  137. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial8.pdt +0 -0
  138. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial9.jpg +0 -0
  139. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial9.pdt +0 -0
  140. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.femprj +0 -0
  141. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/wrapped_components/__init__.py +0 -0
  142. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/wrapped_components/dbc.py +0 -0
  143. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/wrapped_components/dcc.py +0 -0
  144. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/wrapped_components/html.py +0 -0
  145. {pyfemtet-0.4.11 → pyfemtet-0.4.13}/pyfemtet/opt/visualization/wrapped_components/str_enum.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyfemtet
3
- Version: 0.4.11
3
+ Version: 0.4.13
4
4
  Summary: Design parameter optimization using Femtet.
5
5
  Home-page: https://github.com/pyfemtet/pyfemtet
6
6
  License: BSD-3-Clause
@@ -0,0 +1 @@
1
+ __version__ = "0.4.13"
@@ -15,6 +15,32 @@ from femtetutils import util
15
15
  from pyfemtet.opt import FEMOpt
16
16
 
17
17
 
18
+ class SuperSphere:
19
+ def __init__(self, n):
20
+ self.n = n
21
+
22
+ def x(self, radius, *angles):
23
+ assert len(angles) == self.n - 1, 'invalid angles length'
24
+
25
+ out = []
26
+
27
+ for i in range(self.n):
28
+ if i == 0:
29
+ out.append(radius * np.cos(angles[0]))
30
+ elif i < self.n - 1:
31
+ product = radius
32
+ for j in range(i):
33
+ product *= np.sin(angles[j])
34
+ product *= np.cos(angles[i])
35
+ out.append(product)
36
+ else:
37
+ product = radius
38
+ for j in range(i):
39
+ product *= np.sin(angles[j])
40
+ out.append(product)
41
+ return out
42
+
43
+
18
44
  def _open_femprj(femprj_path):
19
45
  Femtet = Dispatch('FemtetMacro.Femtet')
20
46
  for _ in tqdm(range(5), 'wait for dispatch Femtet'):
@@ -4,7 +4,7 @@ from pyfemtet.opt.interface import FemtetInterface
4
4
  from pyfemtet.opt.interface import FemtetWithNXInterface
5
5
  from pyfemtet.opt.interface import FemtetWithSolidworksInterface
6
6
 
7
- from pyfemtet.opt.opt import OptunaOptimizer
7
+ from pyfemtet.opt.opt import OptunaOptimizer, ScipyOptimizer
8
8
  from pyfemtet.opt.opt import AbstractOptimizer
9
9
 
10
10
  from pyfemtet.opt._femopt import FEMOpt
@@ -107,6 +107,7 @@ class FEMOpt:
107
107
  initial_value: float or None = None,
108
108
  lower_bound: float or None = None,
109
109
  upper_bound: float or None = None,
110
+ step: float or None = None,
110
111
  memo: str = ''
111
112
  ):
112
113
  """Adds a parameter to the optimization problem.
@@ -133,8 +134,9 @@ class FEMOpt:
133
134
  d = {
134
135
  'name': name,
135
136
  'value': float(initial_value),
136
- 'lb': float(lower_bound),
137
- 'ub': float(upper_bound),
137
+ 'lb': float(lower_bound) if lower_bound is not None else None,
138
+ 'ub': float(upper_bound) if upper_bound is not None else None,
139
+ 'step': float(step) if step is not None else None,
138
140
  'memo': memo,
139
141
  }
140
142
  pdf = pd.DataFrame(d, index=[0], dtype=object)
@@ -314,6 +316,34 @@ class FEMOpt:
314
316
 
315
317
  """
316
318
 
319
+ # method checker
320
+ if n_parallel > 1:
321
+ self.opt.method_checker.check_parallel()
322
+
323
+ if timeout is not None:
324
+ self.opt.method_checker.check_timeout()
325
+
326
+ if len(self.opt.objectives) > 1:
327
+ self.opt.method_checker.check_multi_objective()
328
+
329
+ if len(self.opt.constraints) > 0:
330
+ self.opt.method_checker.check_constraint()
331
+
332
+ for key, value in self.opt.constraints.items():
333
+ if value.strict:
334
+ self.opt.method_checker.check_strict_constraint()
335
+ break
336
+
337
+ if self.opt.seed is not None:
338
+ self.opt.method_checker.check_seed()
339
+
340
+ is_incomplete_bounds = False
341
+ for _, row in self.opt.parameters.iterrows():
342
+ lb, ub = row['lb'], row['ub']
343
+ is_incomplete_bounds = is_incomplete_bounds + (lb is None) + (ub is None)
344
+ if is_incomplete_bounds:
345
+ self.opt.method_checker.check_incomplete_bounds()
346
+
317
347
  # 共通引数
318
348
  self.opt.n_trials = n_trials
319
349
  self.opt.timeout = timeout
@@ -240,7 +240,7 @@ class Objective(Function):
240
240
 
241
241
  default_name = 'obj'
242
242
 
243
- def __init__(self, fun, name, direction, args, kwargs):
243
+ def __init__(self, fun, name, direction, args, kwargs, with_symlog=False):
244
244
  """Initializes an Objective instance.
245
245
 
246
246
  Args:
@@ -261,6 +261,7 @@ class Objective(Function):
261
261
  """
262
262
  self._check_direction(direction)
263
263
  self.direction = direction
264
+ self.with_symlog = with_symlog
264
265
  super().__init__(fun, name, args, kwargs)
265
266
 
266
267
  def convert(self, value: float):
@@ -290,11 +291,13 @@ class Objective(Function):
290
291
  elif self.direction == 'maximize':
291
292
  ret = -value
292
293
 
293
- ret = symlog(ret)
294
+ if self.with_symlog:
295
+ ret = symlog(ret)
294
296
 
295
297
  return float(ret)
296
298
 
297
- def _check_direction(self, direction):
299
+ @staticmethod
300
+ def _check_direction(direction):
298
301
  message = '評価関数の direction は "minimize", "maximize", 又は数値でなければなりません.'
299
302
  message += f'与えられた値は {direction} です.'
300
303
  if isinstance(direction, float) or isinstance(direction, int):
@@ -0,0 +1,31 @@
1
+ from pyfemtet.opt import FemtetInterface, FEMOpt, AbstractOptimizer
2
+
3
+
4
+ def ex_in(_, opt: AbstractOptimizer):
5
+ ex_r, in_r = opt.get_parameter('values')
6
+ return ex_r - in_r
7
+
8
+
9
+
10
+ if __name__ == '__main__':
11
+
12
+ fem = FemtetInterface(
13
+ parametric_output_indexes_use_as_objective={
14
+ 0: "minimize",
15
+ 1: "minimize",
16
+ 2: "minimize",
17
+ },
18
+ )
19
+
20
+ femopt = FEMOpt(fem=fem)
21
+
22
+ femopt.add_parameter("external_radius", 10, 1, 10)
23
+ femopt.add_parameter("internal_radius", 5, 1, 10)
24
+ femopt.add_constraint(ex_in, lower_bound=1, strict=True, args=(femopt.opt,))
25
+ femopt.set_random_seed(42)
26
+ femopt.optimize(
27
+ n_trials=10,
28
+ n_parallel=1,
29
+ )
30
+ input() # required to tests script
31
+ femopt.terminate_all()
@@ -0,0 +1,13 @@
1
+ "{""femprj_path"": null, ""model_name"": ""test_5""}",prm,prm,obj,obj_direction,obj,obj_direction,obj,obj_direction,,cns,cns_lb,cns_ub,,,,
2
+ ,,,,,,,,,,,,,,,,
3
+ trial,external_radius,internal_radius,����[Kg] / Cylinder,����[Kg] / Cylinder_direction,����[Pa] / �~�[�[�X�̑������� / �ő�l / Cylinder,����[Pa] / �~�[�[�X�̑������� / �ő�l / Cylinder_direction,�ψ�[m] / �傫�� / �ő�l / Cylinder,�ψ�[m] / �傫�� / �ő�l / Cylinder_direction,non_domi,cns_0,cns_0_lower_bound,cns_0_upper_bound,feasible,hypervolume,message,time
4
+ 1,10.0,5.0,0.08025126265847096,minimize,699391.2725838805,minimize,3.5987514289319256e-07,minimize,True,5.0,1,,True,0.0,initial,2024-07-22 10:24:17.069700
5
+ 2,7.587945476302646,6.387926357773329,0.018829523087730202,minimize,2819410.535505582,minimize,1.963363626126861e-06,minimize,True,1.2000191185293163,1,,True,0.007260964524591699,,2024-07-22 10:24:27.705655
6
+ 3,8.491983767203795,2.9110519961044856,0.06578893373109447,minimize,1058372.3464237931,minimize,6.396966638619928e-07,minimize,True,5.580931771099309,1,,True,0.13523811540217548,,2024-07-22 10:24:39.393305
7
+ 4,9.488999089406718,1.053974646602355,0.09344346108490897,minimize,738819.436439415,minimize,3.9190983806914676e-07,minimize,False,8.435024442804362,1,,True,0.13523811540217548,,2024-07-22 10:24:50.756940
8
+ 5,9.838880436025262,4.121658022659597,0.08482642054771264,minimize,701388.4079328978,minimize,3.6449256002795423e-07,minimize,False,5.717222413365665,1,,True,0.13523811540217548,,2024-07-22 10:25:01.226665
9
+ 6,8.455917394686129,4.306340483879064,0.055191055245607905,minimize,1170551.8035054468,minimize,7.014254816528714e-07,minimize,True,4.149576910807064,1,,True,0.23270317407275296,,2024-07-22 10:25:11.971368
10
+ 7,7.5733020568630876,4.532076028923693,0.038663363226300325,minimize,1680507.6211177334,minimize,1.1514101726343067e-06,minimize,True,3.041226027939395,1,,True,0.298888903032948,,2024-07-22 10:25:22.041491
11
+ 8,6.64195280415911,4.3268559224164935,0.02513863374590192,minimize,2992920.1148875966,minimize,2.210659795360814e-06,minimize,False,2.3150968817426163,1,,True,0.298888903032948,,2024-07-22 10:25:32.810507
12
+ 9,5.457560349207987,3.6301461895178777,0.016440094818037845,minimize,5824575.229249716,minimize,4.8047762082829075e-06,minimize,False,1.8274141596901092,1,,True,0.298888903032948,,2024-07-22 10:25:44.827040
13
+ 10,7.075956010136126,6.0727177168143935,0.013058674177275532,minimize,4421271.285800073,minimize,3.2060909568366592e-06,minimize,True,1.0032382933217328,1,,True,0.3600967952288273,,2024-07-22 10:25:55.442006
@@ -0,0 +1,31 @@
1
+ from pyfemtet.opt import FemtetInterface, FEMOpt, AbstractOptimizer
2
+
3
+
4
+ def ex_in(_, opt: AbstractOptimizer):
5
+ ex_r, in_r = opt.get_parameter('values')
6
+ return ex_r - in_r
7
+
8
+
9
+
10
+ if __name__ == '__main__':
11
+
12
+ fem = FemtetInterface(
13
+ parametric_output_indexes_use_as_objective={
14
+ 0: "minimize",
15
+ 1: "minimize",
16
+ 2: "minimize",
17
+ },
18
+ )
19
+
20
+ femopt = FEMOpt(fem=fem)
21
+
22
+ femopt.add_parameter("external_radius", 10, 1, 10)
23
+ femopt.add_parameter("internal_radius", 5, 1, 10)
24
+ femopt.add_constraint(ex_in, lower_bound=1, strict=True, args=(femopt.opt,))
25
+ femopt.set_random_seed(42)
26
+ femopt.optimize(
27
+ n_trials=10,
28
+ n_parallel=1,
29
+ )
30
+ input('enter to quit') # required to tests script
31
+ femopt.terminate_all()
@@ -43,7 +43,12 @@ class FEMInterface(ABC):
43
43
  pass
44
44
 
45
45
  def update_parameter(self, parameters: pd.DataFrame, with_warning=False) -> Optional[List[str]]:
46
- """Updates only FEM variables (if implemented in concrete class)."""
46
+ """Updates only FEM variables (if implemented in concrete class).
47
+
48
+ If this method is implemented,
49
+ it is able to get parameter via FEMInterface.
50
+
51
+ """
47
52
  pass
48
53
 
49
54
  def _setup_before_parallel(self, client) -> None:
@@ -292,9 +292,11 @@ class FemtetInterface(FEMInterface):
292
292
  try:
293
293
  # 解析結果を開いた状態で Gaudi.Activate して ReExecute する場合、ReExecute の前後にアクティブ化イベントが必要
294
294
  if fun.__name__ == 'ReExecute':
295
- post_activate_message(self.Femtet.hWnd) # can raise pywintypes.error
295
+ if self.open_result_with_gui or self.parametric_output_indexes_use_as_objective:
296
+ post_activate_message(self.Femtet.hWnd) # can raise pywintypes.error
296
297
  returns = fun(*args, **kwargs)
297
- post_activate_message(self.Femtet.hWnd)
298
+ if self.open_result_with_gui or self.parametric_output_indexes_use_as_objective:
299
+ post_activate_message(self.Femtet.hWnd)
298
300
  else:
299
301
  returns = fun(*args, **kwargs)
300
302
  except (com_error, error):
@@ -1,9 +1,14 @@
1
- from femtetutils import util
1
+ import logging
2
+
3
+ from femtetutils import util, logger
2
4
  from pyfemtet.dispatch_extensions import _get_pid
3
5
 
4
6
  import ctypes
5
7
 
6
8
 
9
+ logger.setLevel(logging.ERROR)
10
+
11
+
7
12
  def _get_dll():
8
13
  femtet_exe_path = util.get_femtet_exe_path()
9
14
  dll_path = femtet_exe_path.replace('Femtet.exe', 'ParametricIF.dll')
@@ -11,7 +16,7 @@ def _get_dll():
11
16
 
12
17
 
13
18
  def _get_dll_with_set_femtet(Femtet):
14
- dll = _get_dll(Femtet)
19
+ dll = _get_dll()
15
20
  pid = _get_pid(Femtet.hWnd)
16
21
  dll.SetCurrentFemtet.restype = ctypes.c_bool
17
22
  dll.SetCurrentFemtet(pid)
@@ -0,0 +1,10 @@
1
+ from pyfemtet.opt.opt._base import AbstractOptimizer, logger, OptimizationMethodChecker
2
+ from pyfemtet.opt.opt._optuna import OptunaOptimizer
3
+ from pyfemtet.opt.opt._scipy import ScipyOptimizer
4
+
5
+ __all__ = [
6
+ 'ScipyOptimizer',
7
+ 'OptunaOptimizer',
8
+ 'AbstractOptimizer',
9
+ 'logger',
10
+ ]
@@ -20,6 +20,77 @@ logger = get_logger('opt')
20
20
  logger.setLevel(logging.INFO)
21
21
 
22
22
 
23
+ class OptimizationMethodChecker:
24
+ """Check implementation of PyFemtet functions."""
25
+
26
+ def __init__(self, opt):
27
+ self.opt = opt
28
+
29
+ def check_parallel(self, raise_error=True):
30
+ function = 'parallel computing'
31
+ message = f'{type(self.opt)} is not implement {function}'
32
+ if raise_error:
33
+ raise NotImplementedError(message)
34
+ else:
35
+ logger.warning(message)
36
+
37
+ def check_timeout(self, raise_error=True):
38
+ function = 'timeout'
39
+ message = f'{type(self.opt)} is not implement {function}'
40
+ if raise_error:
41
+ raise NotImplementedError(message)
42
+ else:
43
+ logger.warning(message)
44
+
45
+ def check_multi_objective(self, raise_error=True):
46
+ function = 'multi-objective'
47
+ message = f'{type(self.opt)} is not implement {function}'
48
+ if raise_error:
49
+ raise NotImplementedError(message)
50
+ else:
51
+ logger.warning(message)
52
+
53
+ def check_strict_constraint(self, raise_error=True):
54
+ function = 'strict_constraint'
55
+ message = f'{type(self.opt)} is not implement {function}'
56
+ if raise_error:
57
+ raise NotImplementedError(message)
58
+ else:
59
+ logger.warning(message)
60
+
61
+ def check_constraint(self, raise_error=True):
62
+ function = 'strict_constraint'
63
+ message = f'{type(self.opt)} is not implement {function}'
64
+ if raise_error:
65
+ raise NotImplementedError(message)
66
+ else:
67
+ logger.warning(message)
68
+
69
+ def check_skip(self, raise_error=True):
70
+ function = 'skip'
71
+ message = f'{type(self.opt)} is not implement {function}'
72
+ if raise_error:
73
+ raise NotImplementedError(message)
74
+ else:
75
+ logger.warning(message)
76
+
77
+ def check_seed(self, raise_error=True):
78
+ function = 'random seed setting'
79
+ message = f'{type(self.opt)} is not implement {function}'
80
+ if raise_error:
81
+ raise NotImplementedError(message)
82
+ else:
83
+ logger.warning(message)
84
+
85
+ def check_incomplete_bounds(self, raise_error=True):
86
+ function = 'optimize with no or incomplete bounds'
87
+ message = f'{type(self.opt)} is not implement "{function}"'
88
+ if raise_error:
89
+ raise NotImplementedError(message)
90
+ else:
91
+ logger.warning(message)
92
+
93
+
23
94
  class AbstractOptimizer(ABC):
24
95
  """Abstract base class for an interface of optimization library.
25
96
 
@@ -45,9 +116,9 @@ class AbstractOptimizer(ABC):
45
116
  self.fem = None
46
117
  self.fem_class = None
47
118
  self.fem_kwargs = dict()
48
- self.parameters = pd.DataFrame()
49
- self.objectives = dict()
50
- self.constraints = dict()
119
+ self.parameters: pd.DataFrame = pd.DataFrame()
120
+ self.objectives: dict = dict()
121
+ self.constraints: dict = dict()
51
122
  self.entire_status = None # actor
52
123
  self.history = None # actor
53
124
  self.worker_status = None # actor
@@ -58,6 +129,7 @@ class AbstractOptimizer(ABC):
58
129
  self.is_cluster = False
59
130
  self.subprocess_idx = None
60
131
  self._is_error_exit = False
132
+ self.method_checker: OptimizationMethodChecker = OptimizationMethodChecker(self)
61
133
 
62
134
  def f(self, x):
63
135
  """Get x, update fem analysis, return objectives (and constraints)."""
@@ -199,10 +271,10 @@ class AbstractOptimizer(ABC):
199
271
  try:
200
272
  self.run()
201
273
  except Exception as e:
202
- logger.error("================================")
203
- logger.error("An unexpected error has occured!")
204
- logger.error("================================")
205
- logger.error(e)
274
+ logger.error("=================================")
275
+ logger.error("An unexpected error has occurred!")
276
+ logger.error("=================================")
277
+ logger.error(f'{type(e)}: {e}')
206
278
  self._is_error_exit = True
207
279
  self.worker_status.set(OptimizationStatus.CRASHED)
208
280
  finally:
@@ -12,7 +12,7 @@ from optuna.study import MaxTrialsCallback
12
12
 
13
13
  # pyfemtet relative
14
14
  from pyfemtet.opt._femopt_core import OptimizationStatus, generate_lhs
15
- from pyfemtet.opt.opt import AbstractOptimizer, logger
15
+ from pyfemtet.opt.opt import AbstractOptimizer, logger, OptimizationMethodChecker
16
16
  from pyfemtet.core import MeshError, ModelError, SolveError
17
17
 
18
18
  # filter warnings
@@ -25,6 +25,16 @@ optuna.logging.set_verbosity(optuna.logging.ERROR)
25
25
  warnings.filterwarnings('ignore', category=ExperimentalWarning)
26
26
 
27
27
 
28
+ class OptunaMethodChecker(OptimizationMethodChecker):
29
+ def check_multi_objective(self, raise_error=True): return True
30
+ def check_timeout(self, raise_error=True): return True
31
+ def check_parallel(self, raise_error=True): return True
32
+ def check_constraint(self, raise_error=True): return True
33
+ def check_strict_constraint(self, raise_error=True): return True
34
+ def check_skip(self, raise_error=True): return True
35
+ def check_seed(self, raise_error=True): return True
36
+
37
+
28
38
  class OptunaOptimizer(AbstractOptimizer):
29
39
 
30
40
  def __init__(
@@ -42,6 +52,7 @@ class OptunaOptimizer(AbstractOptimizer):
42
52
  self.sampler_kwargs = dict() if sampler_kwargs is None else sampler_kwargs
43
53
  self.additional_initial_parameter = []
44
54
  self.additional_initial_methods = add_init_method if hasattr(add_init_method, '__iter__') else [add_init_method]
55
+ self.method_checker = OptunaMethodChecker(self)
45
56
 
46
57
  def _objective(self, trial):
47
58
 
@@ -54,7 +65,7 @@ class OptunaOptimizer(AbstractOptimizer):
54
65
  # candidate x
55
66
  x = []
56
67
  for i, row in self.parameters.iterrows():
57
- v = trial.suggest_float(row['name'], row['lb'], row['ub'])
68
+ v = trial.suggest_float(row['name'], row['lb'], row['ub'], step=row['step'])
58
69
  x.append(v)
59
70
  x = np.array(x).astype(float)
60
71
 
@@ -0,0 +1,144 @@
1
+ # typing
2
+ import logging
3
+ from typing import Iterable
4
+
5
+ # built-in
6
+ import os
7
+
8
+ # 3rd-party
9
+ import numpy as np
10
+ import pandas as pd
11
+ import scipy.optimize
12
+ from scipy.optimize import minimize, OptimizeResult
13
+
14
+ # pyfemtet relative
15
+ from pyfemtet.opt._femopt_core import OptimizationStatus, generate_lhs
16
+ from pyfemtet.opt.opt import AbstractOptimizer, logger, OptimizationMethodChecker
17
+ from pyfemtet.core import MeshError, ModelError, SolveError
18
+
19
+
20
+ class StopIteration2(Exception):
21
+ pass
22
+
23
+
24
+ class StopIterationCallback:
25
+ def __init__(self, opt):
26
+ self.opt: ScipyOptimizer = opt
27
+ self.res: OptimizeResult = None
28
+
29
+ def stop_iteration(self):
30
+ # stop iteration gimmick
31
+ # https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
32
+ if self.opt.minimize_kwargs['method'] == "trust-constr":
33
+ raise StopIteration2 # supports nothing
34
+ elif (
35
+ self.opt.minimize_kwargs['method'] == 'TNC'
36
+ or self.opt.minimize_kwargs['method'] == 'SLSQP'
37
+ or self.opt.minimize_kwargs['method'] == 'COBYLA'
38
+ ):
39
+ raise StopIteration2 # supports xk
40
+ else:
41
+ raise StopIteration # supports xk , intermediate_result and StopIteration
42
+
43
+
44
+ def __call__(self, xk=None, intermediate_result=None):
45
+ self.res = intermediate_result
46
+ if self.opt.entire_status.get() == OptimizationStatus.INTERRUPTING:
47
+ self.opt.worker_status.set(OptimizationStatus.INTERRUPTING)
48
+ self.stop_iteration()
49
+
50
+
51
+ class ScipyMethodChecker(OptimizationMethodChecker):
52
+ def check_incomplete_bounds(self, raise_error=True): return True
53
+
54
+
55
+ class ScipyOptimizer(AbstractOptimizer):
56
+
57
+ def __init__(
58
+ self,
59
+ **minimize_kwargs,
60
+ ):
61
+ """
62
+ Args:
63
+ **minimize_kwargs: Kwargs of `scipy.optimize.minimize`.
64
+ """
65
+ super().__init__()
66
+
67
+ # define members
68
+ self.minimize_kwargs: dict = dict(
69
+ method='L-BFGS-B',
70
+ )
71
+ self.minimize_kwargs.update(minimize_kwargs)
72
+ self.res: OptimizeResult = None
73
+ self.method_checker: OptimizationMethodChecker = ScipyMethodChecker(self)
74
+ self.stop_iteration_callback = StopIterationCallback(self)
75
+
76
+ def _objective(self, x: np.ndarray): # x: candidate parameter
77
+ # update parameter
78
+ self.parameters['value'] = x
79
+ self.fem.update_parameter(self.parameters)
80
+
81
+ # strict constraints
82
+ ...
83
+
84
+ # fem
85
+ try:
86
+ _, obj_values, cns_values = self.f(x)
87
+ except (ModelError, MeshError, SolveError) as e:
88
+ logger.info(e)
89
+ logger.info('以下の変数で FEM 解析に失敗しました。')
90
+ print(self.get_parameter('dict'))
91
+
92
+ # 現状、エラーが起きたらスキップできない
93
+ raise StopIteration2
94
+
95
+ # constraints
96
+ ...
97
+
98
+ # # check interruption command
99
+ # if self.entire_status.get() == OptimizationStatus.INTERRUPTING:
100
+ # self.worker_status.set(OptimizationStatus.INTERRUPTING)
101
+ # raise StopOptimize
102
+
103
+ # objectives to objective
104
+
105
+ return obj_values[0]
106
+
107
+ def _setup_before_parallel(self):
108
+ pass
109
+
110
+ def run(self):
111
+
112
+ # create init
113
+ x0 = self.parameters['value'].values
114
+
115
+ # create bounds
116
+ if 'bounds' not in self.minimize_kwargs.keys():
117
+ bounds = []
118
+ for i, row in self.parameters.iterrows():
119
+ lb, ub = row['lb'], row['ub']
120
+ if lb is None: lb = -np.inf
121
+ if ub is None: ub = np.inf
122
+ bounds.append([lb, ub])
123
+ self.minimize_kwargs.update(
124
+ {'bounds': bounds}
125
+ )
126
+
127
+ # run optimize
128
+ try:
129
+ res = minimize(
130
+ fun=self._objective,
131
+ x0=x0,
132
+ **self.minimize_kwargs,
133
+ callback=self.stop_iteration_callback,
134
+ )
135
+ except StopIteration2:
136
+ res = None
137
+ logger.warn('Optimization has been interrupted. '
138
+ 'Note that you cannot acquire the OptimizationResult '
139
+ 'in case of `trust-constr`, `TNC`, `SLSQP` or `COBYLA`.')
140
+
141
+ if res is None:
142
+ self.res = self.stop_iteration_callback.res
143
+ else:
144
+ self.res = res