pyfemtet 0.4.11__tar.gz → 0.4.12__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 (139) hide show
  1. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/PKG-INFO +1 -1
  2. pyfemtet-0.4.12/pyfemtet/__init__.py +1 -0
  3. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/_test_util.py +26 -0
  4. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/__init__.py +1 -1
  5. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/_femopt.py +32 -2
  6. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/_base.py +6 -1
  7. pyfemtet-0.4.12/pyfemtet/opt/opt/__init__.py +10 -0
  8. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/opt/_base.py +79 -7
  9. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/opt/_optuna.py +13 -2
  10. pyfemtet-0.4.12/pyfemtet/opt/opt/_scipy.py +144 -0
  11. pyfemtet-0.4.12/pyfemtet/opt/opt/_scipy_scalar.py +104 -0
  12. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyproject.toml +1 -1
  13. pyfemtet-0.4.11/pyfemtet/__init__.py +0 -1
  14. pyfemtet-0.4.11/pyfemtet/opt/opt/__init__.py +0 -8
  15. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/LICENSE +0 -0
  16. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/README.md +0 -0
  17. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.femprj +0 -0
  18. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.prt +0 -0
  19. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.py +0 -0
  20. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.SLDPRT +0 -0
  21. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.femprj +0 -0
  22. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.py +0 -0
  23. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/_her_ex40_parametric.py +0 -0
  24. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/gau_ex08_parametric.femprj +0 -0
  25. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/gau_ex08_parametric.py +0 -0
  26. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/her_ex40_parametric.femprj +0 -0
  27. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/her_ex40_parametric.py +0 -0
  28. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/wat_ex14_parallel_parametric.py +0 -0
  29. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/wat_ex14_parametric.femprj +0 -0
  30. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/FemtetPJTSample/wat_ex14_parametric.py +0 -0
  31. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/core.py +0 -0
  32. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/dispatch_extensions.py +0 -0
  33. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/logger.py +0 -0
  34. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/_femopt_core.py +0 -0
  35. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_NX.femprj +0 -0
  36. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_NX.prt +0 -0
  37. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_NX.py +0 -0
  38. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_NX_test_result.reccsv +0 -0
  39. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_SW.SLDPRT +0 -0
  40. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_SW.femprj +0 -0
  41. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_SW.py +0 -0
  42. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/cad_ex01_SW_test_result.reccsv +0 -0
  43. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/gal_ex58_parametric.femprj +0 -0
  44. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/gal_ex58_parametric.py +0 -0
  45. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/gal_ex58_parametric_test_result.reccsv +0 -0
  46. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/gau_ex08_parametric.femprj +0 -0
  47. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/gau_ex08_parametric.py +0 -0
  48. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/gau_ex08_parametric_test_result.reccsv +0 -0
  49. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/her_ex40_parametric.femprj +0 -0
  50. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/her_ex40_parametric.py +0 -0
  51. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/her_ex40_parametric_test_result.reccsv +0 -0
  52. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric.femprj +0 -0
  53. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric.py +0 -0
  54. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric_parallel.py +0 -0
  55. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric_test_result.reccsv +0 -0
  56. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/wat_ex14_parametric.femprj +0 -0
  57. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/wat_ex14_parametric.py +0 -0
  58. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/wat_ex14_parametric_parallel.py +0 -0
  59. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample/wat_ex14_parametric_test_result.reccsv +0 -0
  60. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/cad_ex01_NX_jp.femprj +0 -0
  61. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/cad_ex01_NX_jp.py +0 -0
  62. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/cad_ex01_SW_jp.femprj +0 -0
  63. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/cad_ex01_SW_jp.py +0 -0
  64. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/gal_ex58_parametric_jp.femprj +0 -0
  65. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/gal_ex58_parametric_jp.py +0 -0
  66. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/gau_ex08_parametric_jp.femprj +0 -0
  67. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/gau_ex08_parametric_jp.py +0 -0
  68. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/her_ex40_parametric_jp.femprj +0 -0
  69. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/her_ex40_parametric_jp.py +0 -0
  70. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_jp.femprj +0 -0
  71. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_jp.py +0 -0
  72. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_parallel_jp.py +0 -0
  73. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_jp.femprj +0 -0
  74. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_jp.py +0 -0
  75. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_parallel_jp.py +0 -0
  76. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/__init__.py +0 -0
  77. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/_femtet.py +0 -0
  78. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/_femtet_parametric.py +0 -0
  79. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/_femtet_with_nx/__init__.py +0 -0
  80. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/_femtet_with_nx/_interface.py +0 -0
  81. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/_femtet_with_nx/update_model.py +0 -0
  82. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/interface/_femtet_with_sldworks.py +0 -0
  83. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/__init__.py +0 -0
  84. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/_create_wrapped_components.py +0 -0
  85. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/base.py +0 -0
  86. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/complex_components/__init__.py +0 -0
  87. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/complex_components/alert_region.py +0 -0
  88. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/complex_components/control_femtet.py +0 -0
  89. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/complex_components/main_figure_creator.py +0 -0
  90. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/complex_components/main_graph.py +0 -0
  91. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/process_monitor/__init__.py +0 -0
  92. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/process_monitor/application.py +0 -0
  93. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/process_monitor/pages.py +0 -0
  94. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/.gitignore +0 -0
  95. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/__init__.py +0 -0
  96. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/application.py +0 -0
  97. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/pages.py +0 -0
  98. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/tutorial.csv +0 -0
  99. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14.jpg +0 -0
  100. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14.log +0 -0
  101. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14.pdt +0 -0
  102. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_heatflow.csv +0 -0
  103. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_heatflow_el.csv +0 -0
  104. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial1.jpg +0 -0
  105. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial1.pdt +0 -0
  106. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial10.jpg +0 -0
  107. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial10.pdt +0 -0
  108. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial11.jpg +0 -0
  109. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial11.pdt +0 -0
  110. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial12.jpg +0 -0
  111. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial12.pdt +0 -0
  112. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial13.jpg +0 -0
  113. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial13.pdt +0 -0
  114. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial14.jpg +0 -0
  115. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial14.pdt +0 -0
  116. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial15.jpg +0 -0
  117. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial15.pdt +0 -0
  118. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial2.jpg +0 -0
  119. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial2.pdt +0 -0
  120. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial3.jpg +0 -0
  121. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial3.pdt +0 -0
  122. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial4.jpg +0 -0
  123. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial4.pdt +0 -0
  124. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial5.jpg +0 -0
  125. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial5.pdt +0 -0
  126. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial6.jpg +0 -0
  127. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial6.pdt +0 -0
  128. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial7.jpg +0 -0
  129. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial7.pdt +0 -0
  130. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial8.jpg +0 -0
  131. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial8.pdt +0 -0
  132. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial9.jpg +0 -0
  133. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.Results/Ex14_trial9.pdt +0 -0
  134. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/result_viewer/tutorial/wat_ex14_parametric.femprj +0 -0
  135. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/wrapped_components/__init__.py +0 -0
  136. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/wrapped_components/dbc.py +0 -0
  137. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/wrapped_components/dcc.py +0 -0
  138. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/pyfemtet/opt/visualization/wrapped_components/html.py +0 -0
  139. {pyfemtet-0.4.11 → pyfemtet-0.4.12}/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.12
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.12"
@@ -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
@@ -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:
@@ -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
@@ -0,0 +1,104 @@
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_scalar, 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 ScipyScalarMethodChecker(OptimizationMethodChecker):
21
+ def check_incomplete_bounds(self, raise_error=True): return True
22
+
23
+
24
+ class ScipyOptimizer(AbstractOptimizer):
25
+
26
+ def __init__(
27
+ self,
28
+ **minimize_kwargs,
29
+ ):
30
+ """
31
+ Args:
32
+ **minimize_kwargs: Kwargs of `scipy.optimize.minimize_scalar` __except ``fun``.__.
33
+ """
34
+ super().__init__()
35
+
36
+ # define members
37
+ self.minimize_kwargs: dict = dict()
38
+ self.minimize_kwargs.update(minimize_kwargs)
39
+ self.res: OptimizeResult = None
40
+ self.method_checker: OptimizationMethodChecker = ScipyScalarMethodChecker(self)
41
+
42
+ def _objective(self, x: float): # x: candidate parameter
43
+ # update parameter
44
+ self.parameters['value'] = x
45
+ self.fem.update_parameter(self.parameters)
46
+
47
+ # strict constraints
48
+ ...
49
+
50
+ # fem
51
+ try:
52
+ _, obj_values, cns_values = self.f(x)
53
+ except (ModelError, MeshError, SolveError) as e:
54
+ logger.info(e)
55
+ logger.info('以下の変数で FEM 解析に失敗しました。')
56
+ print(self.get_parameter('dict'))
57
+
58
+ # 現状、エラーが起きたらスキップできない
59
+ raise StopIteration
60
+
61
+ # constraints
62
+ ...
63
+
64
+ # check interruption command
65
+ if self.entire_status.get() == OptimizationStatus.INTERRUPTING:
66
+ self.worker_status.set(OptimizationStatus.INTERRUPTING)
67
+ raise StopIteration
68
+
69
+ # objectives to objective
70
+
71
+ return obj_values[0]
72
+
73
+ def _setup_before_parallel(self):
74
+ pass
75
+
76
+ def run(self):
77
+
78
+ # create init
79
+ assert len(self.parameters) == 1
80
+
81
+ # create bounds
82
+ if 'bounds' not in self.minimize_kwargs.keys():
83
+ bounds = []
84
+ for i, row in self.parameters.iterrows():
85
+ lb, ub = row['lb'], row['ub']
86
+ if lb is None: lb = -np.inf
87
+ if ub is None: ub = np.inf
88
+ bounds.append([lb, ub])
89
+ self.minimize_kwargs.update(
90
+ {'bounds': bounds}
91
+ )
92
+
93
+ # run optimize
94
+ try:
95
+ res = minimize_scalar(
96
+ fun=self._objective,
97
+ **self.minimize_kwargs,
98
+ )
99
+ except StopIteration:
100
+ res = None
101
+ logger.warn('Optimization has been interrupted. '
102
+ 'Note that you cannot acquire the OptimizationResult.')
103
+
104
+ self.res = res
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pyfemtet"
3
- version = "0.4.11" # ignored by versioning plugin
3
+ version = "0.4.12" # ignored by versioning plugin
4
4
  description = "Design parameter optimization using Femtet."
5
5
  authors = ["kazuma.naito <kazuma.naito@murata.com>"]
6
6
  readme = "README.md"
@@ -1 +0,0 @@
1
- __version__ = "0.4.11"
@@ -1,8 +0,0 @@
1
- from pyfemtet.opt.opt._base import AbstractOptimizer, logger
2
- from pyfemtet.opt.opt._optuna import OptunaOptimizer
3
-
4
- __all__ = [
5
- 'OptunaOptimizer',
6
- 'AbstractOptimizer',
7
- 'logger',
8
- ]
File without changes
File without changes
File without changes
File without changes