PyFemtet 0.4.3__tar.gz → 0.4.7__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.
Files changed (82) hide show
  1. pyfemtet-0.4.7/PKG-INFO +98 -0
  2. pyfemtet-0.4.7/README.md +61 -0
  3. pyfemtet-0.4.7/pyfemtet/__init__.py +1 -0
  4. pyfemtet-0.4.7/pyfemtet/_test_util.py +95 -0
  5. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/_femopt.py +54 -16
  6. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/_femopt_core.py +14 -7
  7. pyfemtet-0.4.7/pyfemtet/opt/femprj_sample/cad_ex01_NX_test_result.reccsv +13 -0
  8. pyfemtet-0.4.7/pyfemtet/opt/femprj_sample/cad_ex01_SW_test_result.reccsv +13 -0
  9. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/gal_ex58_parametric.femprj +0 -0
  10. pyfemtet-0.4.7/pyfemtet/opt/femprj_sample/gal_ex58_parametric_test_result.reccsv +13 -0
  11. pyfemtet-0.4.7/pyfemtet/opt/femprj_sample/gau_ex08_parametric_test_result.reccsv +23 -0
  12. pyfemtet-0.4.7/pyfemtet/opt/femprj_sample/her_ex40_parametric_test_result.reccsv +18 -0
  13. pyfemtet-0.4.7/pyfemtet/opt/femprj_sample/paswat_ex1_parametric_test_result.reccsv +18 -0
  14. pyfemtet-0.4.7/pyfemtet/opt/femprj_sample/wat_ex14_parametric_test_result.reccsv +18 -0
  15. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/gal_ex58_parametric_jp.femprj +0 -0
  16. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/interface/_femtet.py +78 -25
  17. pyfemtet-0.4.7/pyfemtet/opt/interface/_femtet_parametric.py +88 -0
  18. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/opt/_base.py +12 -3
  19. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/visualization/_graphs.py +6 -0
  20. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/visualization/_monitor.py +2 -2
  21. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyproject.toml +6 -3
  22. pyfemtet-0.4.3/PKG-INFO +0 -48
  23. pyfemtet-0.4.3/README.md +0 -13
  24. pyfemtet-0.4.3/pyfemtet/__init__.py +0 -1
  25. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/LICENSE +0 -0
  26. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.femprj +0 -0
  27. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.prt +0 -0
  28. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.py +0 -0
  29. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.SLDPRT +0 -0
  30. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.femprj +0 -0
  31. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.py +0 -0
  32. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/_her_ex40_parametric.py +0 -0
  33. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/gau_ex08_parametric.femprj +0 -0
  34. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/gau_ex08_parametric.py +0 -0
  35. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/her_ex40_parametric.femprj +0 -0
  36. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/her_ex40_parametric.py +0 -0
  37. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/wat_ex14_parallel_parametric.py +0 -0
  38. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/wat_ex14_parametric.femprj +0 -0
  39. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/FemtetPJTSample/wat_ex14_parametric.py +0 -0
  40. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/core.py +0 -0
  41. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/dispatch_extensions.py +0 -0
  42. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/logger.py +0 -0
  43. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/__init__.py +0 -0
  44. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/cad_ex01_NX.femprj +0 -0
  45. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/cad_ex01_NX.prt +0 -0
  46. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/cad_ex01_NX.py +0 -0
  47. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/cad_ex01_SW.SLDPRT +0 -0
  48. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/cad_ex01_SW.femprj +0 -0
  49. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/cad_ex01_SW.py +0 -0
  50. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/gal_ex58_parametric.py +0 -0
  51. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/gau_ex08_parametric.femprj +0 -0
  52. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/gau_ex08_parametric.py +0 -0
  53. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/her_ex40_parametric.femprj +0 -0
  54. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/her_ex40_parametric.py +0 -0
  55. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric.femprj +0 -0
  56. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric.py +0 -0
  57. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/paswat_ex1_parametric_parallel.py +0 -0
  58. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/wat_ex14_parametric.femprj +0 -0
  59. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample/wat_ex14_parametric.py +0 -0
  60. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/cad_ex01_NX_jp.femprj +0 -0
  61. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/cad_ex01_NX_jp.py +0 -0
  62. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/cad_ex01_SW_jp.femprj +0 -0
  63. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/cad_ex01_SW_jp.py +0 -0
  64. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/gal_ex58_parametric_jp.py +0 -0
  65. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/gau_ex08_parametric_jp.femprj +0 -0
  66. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/gau_ex08_parametric_jp.py +0 -0
  67. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/her_ex40_parametric_jp.femprj +0 -0
  68. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/her_ex40_parametric_jp.py +0 -0
  69. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_jp.femprj +0 -0
  70. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_jp.py +0 -0
  71. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/paswat_ex1_parametric_parallel_jp.py +0 -0
  72. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_jp.femprj +0 -0
  73. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/femprj_sample_jp/wat_ex14_parametric_jp.py +0 -0
  74. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/interface/__init__.py +0 -0
  75. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/interface/_base.py +0 -0
  76. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/interface/_femtet_with_nx/__init__.py +0 -0
  77. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/interface/_femtet_with_nx/_interface.py +0 -0
  78. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/interface/_femtet_with_nx/update_model.py +0 -0
  79. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/interface/_femtet_with_sldworks.py +0 -0
  80. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/opt/__init__.py +0 -0
  81. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/opt/_optuna.py +0 -0
  82. {pyfemtet-0.4.3 → pyfemtet-0.4.7}/pyfemtet/opt/visualization/__init__.py +0 -0
@@ -0,0 +1,98 @@
1
+ Metadata-Version: 2.1
2
+ Name: pyfemtet
3
+ Version: 0.4.7
4
+ Summary: Design parameter optimization using Femtet.
5
+ Home-page: https://github.com/pyfemtet/pyfemtet
6
+ License: BSD-3-Clause
7
+ Author: kazuma.naito
8
+ Author-email: kazuma.naito@murata.com
9
+ Requires-Python: >=3.9.3,<3.13
10
+ Classifier: License :: OSI Approved :: BSD License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Requires-Dist: botorch (>=0.9.5) ; python_version >= "3.12" and python_version < "3.13"
16
+ Requires-Dist: botorch (>=0.9.5,<0.10.0) ; python_version < "3.12"
17
+ Requires-Dist: colorlog (>=6.8.0,<7.0.0)
18
+ Requires-Dist: dash (>=2.14.2,<3.0.0)
19
+ Requires-Dist: dash-bootstrap-components (>=1.5.0,<2.0.0)
20
+ Requires-Dist: dask (>=2023.12.1,<2024.0.0)
21
+ Requires-Dist: distributed (>=2023.12.1,<2024.0.0)
22
+ Requires-Dist: femtetutils (>=1.0.0,<2.0.0)
23
+ Requires-Dist: numpy (>=1.26.2,<2.0.0)
24
+ Requires-Dist: openpyxl (>=3.1.2,<4.0.0)
25
+ Requires-Dist: optuna (>=3.4.0,<4.0.0)
26
+ Requires-Dist: optuna-integration (>=3.6.0,<4.0.0)
27
+ Requires-Dist: pandas (>=2.1.3,<3.0.0)
28
+ Requires-Dist: plotly (>=5.18.0,<6.0.0)
29
+ Requires-Dist: psutil (>=5.9.6,<6.0.0)
30
+ Requires-Dist: pytest-dashboard (>=0.1.2,<0.2.0)
31
+ Requires-Dist: pywin32 (>=306,<307)
32
+ Requires-Dist: scipy (>=1.11.4,<2.0.0)
33
+ Requires-Dist: tqdm (>=4.66.1,<5.0.0)
34
+ Project-URL: Repository, https://github.com/pyfemtet/pyfemtet
35
+ Description-Content-Type: text/markdown
36
+
37
+ # Welcome! PyFemtet is the extension package for Femtet.
38
+
39
+ ## Main Features
40
+
41
+ <img src="img/pyfemtet_conceptual_diagram.png" width="450">
42
+
43
+ > [!NOTE]
44
+ > For details, see the documentation of "Related Pages" section.
45
+
46
+ ### Design Parameter Optimization
47
+ - Single or multiple objective optimization
48
+ - Progress monitor GUI
49
+ - Parallel computation with controling multiple Femtet processes
50
+ - Result output in easy-to-analyze csv format for Excel and other tools
51
+
52
+ ### Dispatch Extensions
53
+ - Create `CFemtet` object with process ID specification
54
+
55
+ ## Related Pages
56
+
57
+ - Femtet Website: https://www.muratasoftware.com/
58
+ - Documentation (English): https://pyfemtet.readthedocs.io/en/stable/
59
+ - ドキュメント(日本語): https://pyfemtet.readthedocs.io/jp/stable/
60
+ - Source code: https://github.com/pyfemtet/pyfemtet
61
+ - Bug reports: https://github.com/pyfemtet/pyfemtet/issues
62
+
63
+
64
+ ## Getting Started
65
+
66
+ > [!NOTE]
67
+ > Currently Femtet and `pyfemtet` supports **Windows only**.
68
+
69
+ ### 1. Install Femtet
70
+
71
+ - Access [Murata Software Website](https://www.muratasoftware.com/) and get **Femtet trial version** or purchase a lisence.
72
+ - Get installer and launch it.
73
+ - **Run 'EnableMacros'** from the start menu.
74
+ > [!NOTE]
75
+ > This procedure requires administrator privileges.
76
+
77
+
78
+ ### 2. Install PyFemtet
79
+
80
+ > [!NOTE]
81
+ > The commands on this section are for `CMD` or `PowerShell` on with `py launcher`.
82
+ > For a virtual environment, replace `py` to `python`.
83
+ > If you do not have Python, please install it first.
84
+
85
+ - Get `pyfemtet` via following command:
86
+
87
+ ```py -m pip install pyfemtet```
88
+
89
+
90
+ ### 3. Setting `win32com` Constants
91
+
92
+ - Run following command to enable COM constants:
93
+
94
+ ```py -m win32com.client.makepy FemtetMacro```
95
+
96
+ That's all! Now you can use Femtet's extention features via `pyfemtet`.
97
+ For more information including sample code and FEM projects, see the documentation of "Related Pages" section.
98
+
@@ -0,0 +1,61 @@
1
+ # Welcome! PyFemtet is the extension package for Femtet.
2
+
3
+ ## Main Features
4
+
5
+ <img src="img/pyfemtet_conceptual_diagram.png" width="450">
6
+
7
+ > [!NOTE]
8
+ > For details, see the documentation of "Related Pages" section.
9
+
10
+ ### Design Parameter Optimization
11
+ - Single or multiple objective optimization
12
+ - Progress monitor GUI
13
+ - Parallel computation with controling multiple Femtet processes
14
+ - Result output in easy-to-analyze csv format for Excel and other tools
15
+
16
+ ### Dispatch Extensions
17
+ - Create `CFemtet` object with process ID specification
18
+
19
+ ## Related Pages
20
+
21
+ - Femtet Website: https://www.muratasoftware.com/
22
+ - Documentation (English): https://pyfemtet.readthedocs.io/en/stable/
23
+ - ドキュメント(日本語): https://pyfemtet.readthedocs.io/jp/stable/
24
+ - Source code: https://github.com/pyfemtet/pyfemtet
25
+ - Bug reports: https://github.com/pyfemtet/pyfemtet/issues
26
+
27
+
28
+ ## Getting Started
29
+
30
+ > [!NOTE]
31
+ > Currently Femtet and `pyfemtet` supports **Windows only**.
32
+
33
+ ### 1. Install Femtet
34
+
35
+ - Access [Murata Software Website](https://www.muratasoftware.com/) and get **Femtet trial version** or purchase a lisence.
36
+ - Get installer and launch it.
37
+ - **Run 'EnableMacros'** from the start menu.
38
+ > [!NOTE]
39
+ > This procedure requires administrator privileges.
40
+
41
+
42
+ ### 2. Install PyFemtet
43
+
44
+ > [!NOTE]
45
+ > The commands on this section are for `CMD` or `PowerShell` on with `py launcher`.
46
+ > For a virtual environment, replace `py` to `python`.
47
+ > If you do not have Python, please install it first.
48
+
49
+ - Get `pyfemtet` via following command:
50
+
51
+ ```py -m pip install pyfemtet```
52
+
53
+
54
+ ### 3. Setting `win32com` Constants
55
+
56
+ - Run following command to enable COM constants:
57
+
58
+ ```py -m win32com.client.makepy FemtetMacro```
59
+
60
+ That's all! Now you can use Femtet's extention features via `pyfemtet`.
61
+ For more information including sample code and FEM projects, see the documentation of "Related Pages" section.
@@ -0,0 +1 @@
1
+ __version__ = "0.4.7"
@@ -0,0 +1,95 @@
1
+ import os
2
+ import csv
3
+ from shutil import copy
4
+ from time import sleep
5
+ from subprocess import run
6
+ from multiprocessing import Process
7
+ from glob import glob
8
+
9
+ import numpy as np
10
+ import pandas as pd
11
+ from tqdm import tqdm
12
+ from win32com.client import Dispatch
13
+ from femtetutils import util
14
+
15
+ from pyfemtet.opt import FEMOpt
16
+
17
+
18
+ def _open_femprj(femprj_path):
19
+ Femtet = Dispatch('FemtetMacro.Femtet')
20
+ for _ in tqdm(range(5), 'wait for dispatch Femtet'):
21
+ sleep(1)
22
+ Femtet.LoadProject(femprj_path, True)
23
+
24
+
25
+ def launch_femtet(femprj_path):
26
+ # launch Femtet externally
27
+ print('Launching Femtet...')
28
+ util.execute_femtet()
29
+ pid = util.get_last_executed_femtet_process_id()
30
+ for _ in tqdm(range(8), 'Wait for launch Femtet.'):
31
+ sleep(1)
32
+
33
+ # open femprj in a different process
34
+ # to release Femtet for sample program
35
+ print('Opening femprj...')
36
+ p = Process(
37
+ target=_open_femprj,
38
+ args=(femprj_path,),
39
+ )
40
+ p.start()
41
+ p.join()
42
+
43
+
44
+ def taskkill_femtet():
45
+ for _ in tqdm(range(3), 'wait before taskkill Femtet'):
46
+ sleep(1)
47
+ run(['taskkill', '/f', '/im', 'Femtet.exe'])
48
+ for _ in tqdm(range(3), 'wait after taskkill Femtet'):
49
+ sleep(1)
50
+
51
+
52
+ def find_latest_csv(dir_path=None):
53
+ if dir_path is None: dir_path = '.'
54
+ target = os.path.join(dir_path, '*.csv')
55
+ files = [(f, os.path.getmtime(f)) for f in glob(target)]
56
+ out = sorted(files, key=lambda files: files[1])[-1]
57
+ return os.path.abspath(out[0])
58
+
59
+
60
+ def py_to_reccsv(py_path, suffix=''):
61
+ dst_csv_path = py_path + suffix
62
+ dst_csv_path = dst_csv_path.replace(f'.py{suffix}', f'{suffix}.reccsv')
63
+ return dst_csv_path
64
+
65
+
66
+ def record_result(src: FEMOpt or str, py_path, suffix=''):
67
+ """Record the result csv for `is_equal_result`."""
68
+
69
+ if isinstance(src, FEMOpt): # get df directory
70
+ src_csv_path = src.history_path
71
+ else:
72
+ src_csv_path = os.path.abspath(src)
73
+
74
+ dst_csv_path = py_to_reccsv(py_path, suffix)
75
+ copy(src_csv_path, dst_csv_path)
76
+
77
+
78
+ def _get_obj_from_csv(csv_path):
79
+ df = pd.read_csv(csv_path, encoding='cp932', header=2)
80
+ columns = df.columns
81
+ with open(csv_path, mode='r', encoding='cp932', newline='\n') as f:
82
+ reader = csv.reader(f, delimiter=',')
83
+ meta = reader.__next__()
84
+ obj_indices = np.where(np.array(meta) == 'obj')[0]
85
+ out = df.iloc[:, obj_indices]
86
+ return out, columns
87
+
88
+
89
+ def is_equal_result(csv1, csv2):
90
+ """Check the equality of two result csv files."""
91
+ df1, columns1 = _get_obj_from_csv(csv1)
92
+ df2, columns2 = _get_obj_from_csv(csv2)
93
+ assert len(columns1) == len(columns2), '結果 csv の column 数が異なります。'
94
+ assert len(df1) == len(df2), '結果 csv の row 数が異なります。'
95
+ assert (np.abs(df1.values - df2.values) / np.abs(df2.values)).max() <= 0.01, '前回の結果と 1% を超える相違があります。'
@@ -81,6 +81,7 @@ class FEMOpt:
81
81
  self.monitor_process_future = None
82
82
  self.monitor_server_kwargs = dict()
83
83
  self.monitor_process_worker_name = None
84
+ self._is_error_exit = False
84
85
 
85
86
  # multiprocess 時に pickle できないオブジェクト参照の削除
86
87
  def __getstate__(self):
@@ -328,12 +329,27 @@ class FEMOpt:
328
329
  subprocess_indices = list(range(n_parallel))
329
330
  worker_addresses = list(self.client.nthreads().keys())
330
331
 
332
+ # worker が足りない場合はエラー
333
+ if n_parallel > len(worker_addresses):
334
+ raise RuntimeError(f'n_parallel({n_parallel}) > n_workers({len(worker_addresses)}). Worker 数が不足しています。')
335
+
336
+ # worker が多い場合は閉じる
337
+ if n_parallel < len(worker_addresses):
338
+ used_worker_addresses = worker_addresses[:n_parallel] # 前から順番に選ぶ:CPU の早い / メモリの多い順に並べることが望ましい
339
+ unused_worker_addresses = worker_addresses[n_parallel:]
340
+ self.client.retire_workers(unused_worker_addresses, close_workers=True)
341
+ worker_addresses = used_worker_addresses
342
+
331
343
  # monitor worker の設定
332
344
  logger.info('Launching monitor server. This may take a few seconds.')
333
- self.monitor_process_worker_name = datetime.datetime.now().strftime("Monitor-%Y%m%d-%H%M%S")
345
+ self.monitor_process_worker_name = datetime.datetime.now().strftime("Monitor%Y%m%d%H%M%S")
334
346
  current_n_workers = len(self.client.nthreads().keys())
335
- from dask.distributed import Worker
336
- Worker(scheduler_ip=self.client.scheduler.address, nthreads=1, name=self.monitor_process_worker_name)
347
+ from subprocess import Popen
348
+ import sys
349
+ Popen(
350
+ f'{sys.executable} -m dask worker {self.client.scheduler.address} --nthreads 1 --nworkers 1 --name {self.monitor_process_worker_name} --no-nanny',
351
+ shell=True
352
+ )
337
353
 
338
354
  # monitor 用 worker が増えるまで待つ
339
355
  self.client.wait_for_workers(n_workers=current_n_workers + 1)
@@ -357,12 +373,23 @@ class FEMOpt:
357
373
  # Femtet 特有の処理
358
374
  metadata = None
359
375
  if isinstance(self.fem, FemtetInterface):
376
+ # 結果 csv に記載する femprj に関する情報
360
377
  metadata = json.dumps(
361
378
  dict(
362
379
  femprj_path=self.fem.original_femprj_path,
363
380
  model_name=self.fem.model_name
364
381
  )
365
382
  )
383
+ # Femtet の parametric 設定を目的関数に用いるかどうか
384
+ if self.fem.parametric_output_indexes_use_as_objective is not None:
385
+ from pyfemtet.opt.interface._femtet_parametric import add_parametric_results_as_objectives
386
+ indexes = list(self.fem.parametric_output_indexes_use_as_objective.keys())
387
+ directions = list(self.fem.parametric_output_indexes_use_as_objective.values())
388
+ add_parametric_results_as_objectives(
389
+ self,
390
+ indexes,
391
+ directions,
392
+ )
366
393
 
367
394
  # actor の設定
368
395
  self.status = OptimizationStatus(self.client)
@@ -389,7 +416,7 @@ class FEMOpt:
389
416
  # kwargs
390
417
  **self.monitor_server_kwargs,
391
418
  # kwargs of submit
392
- workers=self.monitor_process_worker_name, # if invalid arg,
419
+ workers=self.monitor_process_worker_name,
393
420
  allow_other_workers=False
394
421
  )
395
422
 
@@ -452,10 +479,13 @@ class FEMOpt:
452
479
  t_save_history.start()
453
480
 
454
481
  # 終了を待つ
455
- self.client.gather(calc_futures)
482
+ local_opt_crashed = False
483
+ opt_crashed_list = self.client.gather(calc_futures)
456
484
  if not self.opt.is_cluster: # 既存の fem を使っているならそれも待つ
457
485
  if t_main is not None:
458
486
  t_main.join()
487
+ local_opt_crashed = self.opt._is_error_exit
488
+ opt_crashed_list.append(local_opt_crashed)
459
489
  self.status.set(OptimizationStatus.TERMINATED)
460
490
  end = time()
461
491
 
@@ -465,6 +495,13 @@ class FEMOpt:
465
495
  logger.info(f'計算が終了しました. 実行時間は {int(end - start)} 秒でした。ウィンドウを閉じると終了します.')
466
496
  logger.info(f'結果は{self.history.path}を確認してください.')
467
497
 
498
+ # ひとつでも crashed ならばフラグを立てる
499
+ if any(opt_crashed_list):
500
+ self._is_error_exit = True
501
+
502
+ return self.history.local_data
503
+
504
+
468
505
  def terminate_all(self):
469
506
  """Try to terminate all launched processes.
470
507
 
@@ -476,7 +513,10 @@ class FEMOpt:
476
513
  sleep(1)
477
514
 
478
515
  # terminate monitor process
479
- self.status.set(OptimizationStatus.TERMINATE_ALL)
516
+ if self._is_error_exit:
517
+ self.status.set(OptimizationStatus.CRASHED)
518
+ else:
519
+ self.status.set(OptimizationStatus.TERMINATE_ALL)
480
520
  logger.info(self.monitor_process_future.result())
481
521
  sleep(1)
482
522
 
@@ -514,22 +554,20 @@ class FEMOpt:
514
554
  else:
515
555
  logger.warn('Monitor process worker not found.')
516
556
 
517
- # close scheduler, other workers(, cluster)
518
- self.client.close()
519
- while self.client.scheduler is not None:
520
- sleep(1)
521
- logger.info('Terminate client.')
522
-
523
557
  # close FEM (if specified to quit when deconstruct)
524
558
  del self.fem
525
559
  logger.info('Terminate FEM.')
560
+ sleep(1)
526
561
 
527
- # terminate dask relative processes.
528
- if not self.opt.is_cluster:
529
- self.client.shutdown()
530
- logger.info('Terminate all relative processes.')
562
+ # close scheduler, other workers(, cluster)
563
+ self.client.shutdown()
564
+ logger.info('Terminate all relative processes.')
531
565
  sleep(3)
532
566
 
567
+ # if optimization was crashed, raise Exception
568
+ if self._is_error_exit:
569
+ raise RuntimeError('At least 1 of optimization processes have been crashed. See console log.')
570
+
533
571
 
534
572
  def _start_monitor_server(
535
573
  history,
@@ -7,6 +7,7 @@ import datetime
7
7
  import inspect
8
8
  import ast
9
9
  import csv
10
+ import ctypes
10
11
 
11
12
  # 3rd-party
12
13
  import numpy as np
@@ -197,9 +198,12 @@ class Function:
197
198
 
198
199
  # serializable でない COM 定数を parallelize するため
199
200
  # COM 定数を一度 _Scapegoat 型のオブジェクトにする
200
- for varname in fun.__globals__:
201
- if isinstance(fun.__globals__[varname], Constants):
202
- fun.__globals__[varname] = _Scapegoat()
201
+ # ParametricIF で使う dll 関数は _FuncPtr 型であって __globals__ を持たないが、
202
+ # これは絶対に constants を持たないので単に無視すればよい。
203
+ if not isinstance(fun, ctypes._CFuncPtr):
204
+ for varname in fun.__globals__:
205
+ if isinstance(fun.__globals__[varname], Constants):
206
+ fun.__globals__[varname] = _Scapegoat()
203
207
 
204
208
  self.fun = fun
205
209
  self.name = name
@@ -224,10 +228,11 @@ class Function:
224
228
  def _restore_constants(self):
225
229
  """Helper function for parallelize Femtet."""
226
230
  fun = self.fun
227
- for varname in fun.__globals__:
228
- if isinstance(fun.__globals__[varname], _Scapegoat):
229
- if not fun.__globals__[varname]._ignore_when_restore_constants:
230
- fun.__globals__[varname] = constants
231
+ if not isinstance(fun, ctypes._CFuncPtr):
232
+ for varname in fun.__globals__:
233
+ if isinstance(fun.__globals__[varname], _Scapegoat):
234
+ if not fun.__globals__[varname]._ignore_when_restore_constants:
235
+ fun.__globals__[varname] = constants
231
236
 
232
237
 
233
238
  class Objective(Function):
@@ -691,6 +696,7 @@ class OptimizationStatus:
691
696
  RUNNING = 30
692
697
  INTERRUPTING = 40
693
698
  TERMINATED = 50
699
+ CRASHED = 55
694
700
  TERMINATE_ALL = 60
695
701
 
696
702
  def __init__(self, client, name='entire'):
@@ -712,6 +718,7 @@ class OptimizationStatus:
712
718
  if status_const == cls.INTERRUPTING: return 'Interrupting'
713
719
  if status_const == cls.TERMINATED: return 'Terminated'
714
720
  if status_const == cls.TERMINATE_ALL: return 'Terminate_all'
721
+ if status_const == cls.CRASHED: return 'Crashed'
715
722
 
716
723
  def set(self, status_const):
717
724
  """Set optimization status."""
@@ -0,0 +1,13 @@
1
+ "{""femprj_path"": null, ""model_name"": ""ex58_UnLoad""}",prm,obj,obj_direction,,,,,
2
+ ,,,,,,,,
3
+ trial,rot,final angle (degree),final angle (degree)_direction,non_domi,feasible,hypervolume,message,time
4
+ 1,90.0,81.62540665669353,90,False,True,-1.0,initial,2024-06-11 12:19:15.494862
5
+ 2,87.49080237694724,79.02571752958842,90,False,True,-1.0,,2024-06-11 12:19:19.728891
6
+ 3,99.01428612819832,90.96145916607887,90,False,True,-1.0,,2024-06-11 12:19:23.959099
7
+ 4,99.99999999999999,91.89033160850725,90,False,True,-1.0,,2024-06-11 12:19:29.210094
8
+ 5,96.7613593526426,88.77003517126444,90,False,True,-1.0,,2024-06-11 12:19:33.556167
9
+ 6,80.0,71.5309188581146,90,False,True,-1.0,,2024-06-11 12:19:37.894866
10
+ 7,97.45535890878755,89.47178515828678,90,False,True,-1.0,,2024-06-11 12:19:42.314653
11
+ 8,96.18747750627301,88.19831186499154,90,False,True,-1.0,,2024-06-11 12:19:46.867626
12
+ 9,98.14241558949382,90.13165212114446,90,False,True,-1.0,,2024-06-11 12:19:51.352111
13
+ 10,98.08002450883177,90.07026771243692,90,True,True,-1.0,,2024-06-11 12:19:55.861780
@@ -0,0 +1,13 @@
1
+ "{""femprj_path"": null, ""model_name"": ""ex58_UnLoad""}",prm,obj,obj_direction,,,,,
2
+ ,,,,,,,,
3
+ trial,rot,final angle (degree),final angle (degree)_direction,non_domi,feasible,hypervolume,message,time
4
+ 1,90.0,81.62540665669353,90,False,True,-1.0,initial,2024-06-11 12:19:15.494862
5
+ 2,87.49080237694724,79.02571752958842,90,False,True,-1.0,,2024-06-11 12:19:19.728891
6
+ 3,99.01428612819832,90.96145916607887,90,False,True,-1.0,,2024-06-11 12:19:23.959099
7
+ 4,99.99999999999999,91.89033160850725,90,False,True,-1.0,,2024-06-11 12:19:29.210094
8
+ 5,96.7613593526426,88.77003517126444,90,False,True,-1.0,,2024-06-11 12:19:33.556167
9
+ 6,80.0,71.5309188581146,90,False,True,-1.0,,2024-06-11 12:19:37.894866
10
+ 7,97.45535890878755,89.47178515828678,90,False,True,-1.0,,2024-06-11 12:19:42.314653
11
+ 8,96.18747750627301,88.19831186499154,90,False,True,-1.0,,2024-06-11 12:19:46.867626
12
+ 9,98.14241558949382,90.13165212114446,90,False,True,-1.0,,2024-06-11 12:19:51.352111
13
+ 10,98.08002450883177,90.07026771243692,90,True,True,-1.0,,2024-06-11 12:19:55.861780
@@ -0,0 +1,13 @@
1
+ "{""femprj_path"": null, ""model_name"": ""ex58_UnLoad""}",prm,obj,obj_direction,,,,,
2
+ ,,,,,,,,
3
+ trial,rot,final angle (degree),final angle (degree)_direction,non_domi,feasible,hypervolume,message,time
4
+ 1,90.0,81.62540665669353,90,False,True,-1.0,initial,2024-06-11 12:19:15.494862
5
+ 2,87.49080237694724,79.02571752958842,90,False,True,-1.0,,2024-06-11 12:19:19.728891
6
+ 3,99.01428612819832,90.96145916607887,90,False,True,-1.0,,2024-06-11 12:19:23.959099
7
+ 4,99.99999999999999,91.89033160850725,90,False,True,-1.0,,2024-06-11 12:19:29.210094
8
+ 5,96.7613593526426,88.77003517126444,90,False,True,-1.0,,2024-06-11 12:19:33.556167
9
+ 6,80.0,71.5309188581146,90,False,True,-1.0,,2024-06-11 12:19:37.894866
10
+ 7,97.45535890878755,89.47178515828678,90,False,True,-1.0,,2024-06-11 12:19:42.314653
11
+ 8,96.18747750627301,88.19831186499154,90,False,True,-1.0,,2024-06-11 12:19:46.867626
12
+ 9,98.14241558949382,90.13165212114446,90,False,True,-1.0,,2024-06-11 12:19:51.352111
13
+ 10,98.08002450883177,90.07026771243692,90,True,True,-1.0,,2024-06-11 12:19:55.861780
@@ -0,0 +1,23 @@
1
+ "{""femprj_path"": null, ""model_name"": ""ex8""}",prm,prm,prm,obj,obj_direction,,,,,
2
+ ,,,,,,,,,,
3
+ trial,helical_pitch,coil_radius,n_turns,self-inductance (F),self-inductance (F)_direction,non_domi,feasible,hypervolume,message,time
4
+ 1,6.0,10.0,5.0,2.2519131001598675e-07,1e-07,False,True,-1.0,initial,2024-06-11 12:02:57.767918
5
+ 2,5.623252451619978,9.556428757689245,3.9279757672456204,1.5669600588107823e-07,1e-07,False,True,-1.0,,2024-06-11 12:03:01.879689
6
+ 3,4.420717726239158,8.795585311974417,3.404460046972835,1.2486865567061983e-07,1e-07,False,True,-1.0,,2024-06-11 12:03:06.695218
7
+ 4,6.890675795624973,1.185260448662222,4.879639408647977,1.1068853339253005e-08,1e-07,False,True,-1.0,,2024-06-11 12:03:09.810784
8
+ 5,7.363282035041603,2.9110519961044856,1.7272998688284025,5.928345320407693e-09,1e-07,False,True,-1.0,,2024-06-11 12:03:12.620381
9
+ 6,4.506659276939239,8.848248131255941,3.3689827006547204,1.223080407315596e-07,1e-07,False,True,-1.0,,2024-06-11 12:03:21.984837
10
+ 7,4.766513095940718,9.009910692888063,3.2031623183171014,1.1395898205496435e-07,1e-07,False,True,-1.0,,2024-06-11 12:03:25.935771
11
+ 8,4.952240014062343,9.147228346475954,2.923015991988623,1.0163581024783297e-07,1e-07,False,True,-1.0,,2024-06-11 12:03:29.971566
12
+ 9,5.066580537443571,9.328659775516126,2.415616268398396,7.9346679307476e-08,1e-07,False,True,-1.0,,2024-06-11 12:03:33.843674
13
+ 10,5.01255047733164,9.185738480635885,2.8492684510814064,9.909738207022439e-08,1e-07,False,True,-1.0,,2024-06-11 12:03:38.301538
14
+ 11,5.00852993138919,9.181676469148485,2.8487833409683856,9.932809365733774e-08,1e-07,False,True,-1.0,,2024-06-11 12:03:42.927279
15
+ 12,5.015372908010907,9.156507516160001,2.84363953399497,9.865521830979344e-08,1e-07,False,True,-1.0,,2024-06-11 12:03:47.695209
16
+ 13,4.936583250613616,9.643690440100311,2.8584657253663925,1.101940126271035e-07,1e-07,False,True,-1.0,,2024-06-11 12:03:52.718947
17
+ 14,5.102945083594629,8.690025958818417,2.845587386493274,8.937388292289982e-08,1e-07,False,True,-1.0,,2024-06-11 12:03:58.135407
18
+ 15,4.991284994799307,9.188650804778193,2.8530392301069725,9.970815493825604e-08,1e-07,False,True,-1.0,,2024-06-11 12:04:05.138794
19
+ 16,4.798136039813497,9.176815614734876,2.8229449492498473,9.890481643260465e-08,1e-07,False,True,-1.0,,2024-06-11 12:04:14.148550
20
+ 17,4.930367618092964,9.199092260972836,2.8443627311061546,9.98421974076081e-08,1e-07,True,True,-1.0,,2024-06-11 12:04:28.793111
21
+ 18,4.917692804276215,9.210004097072988,2.8402049456555583,1.0026551790777177e-07,1e-07,False,True,-1.0,,2024-06-11 12:04:53.890898
22
+ 19,4.916044853968383,9.214647159558751,2.839933299380106,9.881932615643327e-08,1e-07,False,True,-1.0,,2024-06-11 12:05:39.178010
23
+ 20,4.924334850336223,9.19023089875423,2.8409787839543563,9.883080340842676e-08,1e-07,False,True,-1.0,,2024-06-11 12:07:03.669665
@@ -0,0 +1,18 @@
1
+ "{""femprj_path"": null, ""model_name"": ""Harm""}",prm,prm,prm,obj,obj_direction,,cns,cns_lb,cns_ub,cns,cns_lb,cns_ub,,,,
2
+ ,,,,,,,,,,,,,,,,
3
+ trial,antenna_radius,substrate_w,port_x,first resonant frequency(Hz),first resonant frequency(Hz)_direction,non_domi,antenna and substrate clearance,antenna and substrate clearance_lower_bound,antenna and substrate clearance_upper_bound,antenna and port clearance,antenna and port clearance_lower_bound,antenna and port clearance_upper_bound,feasible,hypervolume,message,time
4
+ 1,10.0,50.0,5.0,4289000000.0,3000000000.0,False,15.0,1,,5.0,1,,True,-1.0,initial,2024-06-11 12:08:26.664402
5
+ 2,13.979877262955549,43.12037280884873,3.96389588638785,3050000000.0,3000000000.0,False,7.580309099999999,1,,10.01598141,1,,True,-1.0,,2024-06-11 12:08:45.888336
6
+ 3,17.48663961200633,44.246782213565524,4.4546743769349115,2460000000.0,3000000000.0,False,4.636751499999999,1,,13.03196522,1,,True,-1.0,,2024-06-11 12:09:08.898036
7
+ 4,11.841049763255539,55.70351922786027,4.793801861008835,3581000000.0,3000000000.0,False,16.0107098,1,,7.04724794,1,,True,-1.0,,2024-06-11 12:09:30.818053
8
+ 5,12.713516576204174,51.84829137724085,1.8825578416799567,2932000000.0,3000000000.0,False,13.2106291,1,,10.83095876,1,,True,-1.0,,2024-06-11 12:09:46.800326
9
+ 6,14.113172778521575,43.41048247374583,2.235980266720311,2991000000.0,3000000000.0,True,7.592068450000001,1,,11.877192529999999,1,,True,-1.0,,2024-06-11 12:10:06.872645
10
+ 7,19.233283058799998,59.31264066149119,16.35954961421276,2283000000.0,3000000000.0,False,10.42303725,1,,2.8737335,1,,True,-1.0,,2024-06-11 12:10:40.123116
11
+ 8,11.60228740609402,42.44076469689558,10.408361292114133,3758000000.0,3000000000.0,False,9.618094950000001,1,,1.1939261000000005,1,,True,-1.0,,2024-06-11 12:11:03.207759
12
+ 9,14.93783426530973,46.23422152178822,10.881292402378406,2932000000.0,3000000000.0,False,8.179276449999998,1,,4.056541900000001,1,,True,-1.0,,2024-06-11 12:11:30.548731
13
+ 10,13.968499682166277,58.437484700462335,2.6813575389864703,2991000000.0,3000000000.0,True,15.250242649999999,1,,11.28714216,1,,True,-1.0,,2024-06-11 12:11:50.050599
14
+ 11,14.54315734982604,52.537550133941885,1.0,2932000000.0,3000000000.0,False,11.725617749999998,1,,13.5431573,1,,True,-1.0,,2024-06-11 12:12:12.701262
15
+ 12,14.586861208706766,59.99999999999999,5.909396621050475,2932000000.0,3000000000.0,False,15.4131388,1,,8.677464579999999,1,,True,-1.0,,2024-06-11 12:12:34.168326
16
+ 13,14.706782700305354,40.0,1.0,2814000000.0,3000000000.0,False,5.2932173,1,,13.7067827,1,,True,-1.0,,2024-06-11 12:13:37.839853
17
+ 14,14.43570684403354,51.141218169528905,5.404811972123167,2932000000.0,3000000000.0,False,11.134902299999998,1,,9.030894830000001,1,,True,-1.0,,2024-06-11 12:14:39.583756
18
+ 15,14.458054466363947,59.99999999999999,1.0,2932000000.0,3000000000.0,False,15.5419455,1,,13.4580545,1,,True,-1.0,,2024-06-11 12:14:58.872749
@@ -0,0 +1,18 @@
1
+ "{""femprj_path"": null, ""model_name"": ""Ex1""}",prm,prm,prm,obj,obj_direction,obj,obj_direction,obj,obj_direction,,,,,
2
+ ,,,,,,,,,,,,,,
3
+ trial,substrate_w,substrate_d,rot,max temp. of<br>MAINCHIP (degree),max temp. of<br>MAINCHIP (degree)_direction,max temp. of<br>SUBCHIP (degree),max temp. of<br>SUBCHIP (degree)_direction,substrate size (mm2),substrate size (mm2)_direction,non_domi,feasible,hypervolume,message,time
4
+ 1,40.0,60.0,0.0,33.67695768582703,minimize,33.95371403110336,minimize,2400.0,minimize,True,True,0.0,initial,2024-06-11 12:17:25.110141
5
+ 2,36.232524516199774,58.71857196665782,131.75890952605292,36.750613396557995,minimize,35.98760273557258,minimize,2127.522098595014,minimize,False,True,0.0,,2024-06-11 12:17:29.371084
6
+ 3,44.74902239948739,38.05648465150335,28.079013660516477,37.661215802334205,minimize,37.688375728423864,minimize,1702.9904863055572,minimize,False,True,0.0,,2024-06-11 12:17:33.564289
7
+ 4,24.20717726239158,56.52057979014832,108.20070211377758,38.03360975542378,minimize,37.132207739036424,minimize,1368.2036963173987,minimize,False,True,0.0,,2024-06-11 12:17:37.853520
8
+ 5,48.90675795624973,34.53519685169086,174.58377338915898,35.8008561699603,minimize,35.41803365231452,minimize,1689.0045172706505,minimize,True,True,1.8564481859818923e-05,,2024-06-11 12:17:41.999764
9
+ 6,53.632820350416026,39.520816877635184,32.72849409727811,36.27586854489045,minimize,36.24746978400414,minimize,2119.612874858985,minimize,False,True,1.8564481859818923e-05,,2024-06-11 12:17:46.239353
10
+ 7,28.969371374430487,41.91029831694798,94.45615769380281,37.30507756114715,minimize,37.03664336271842,minimize,1214.1149969374887,minimize,True,True,0.0004588839992990786,,2024-06-11 12:17:50.385009
11
+ 8,38.413910708400394,41.57195764514909,110.1335210500283,37.576825749490744,minimize,37.23183262975933,minimize,1596.9414668705863,minimize,False,True,0.0004588839992990786,,2024-06-11 12:17:54.833608
12
+ 9,27.30076670477759,41.59576086191567,65.9451317928645,40.3319296385719,minimize,40.398458177958574,minimize,1135.596164039882,minimize,True,True,0.000640516961074097,,2024-06-11 12:17:59.016440
13
+ 10,39.33065940024737,54.41457499621835,35.941280788504756,36.33478914713188,minimize,36.42436238628697,minimize,2140.161115720755,minimize,False,True,0.000640516961074097,,2024-06-11 12:18:03.281085
14
+ 11,29.88951598161767,48.530123354694155,153.62497867846213,39.42958363258689,minimize,38.57020860420411,minimize,1450.5418998462744,minimize,False,True,0.000640516961074097,,2024-06-11 12:18:07.538199
15
+ 12,31.485762571965203,47.06581165954471,80.23637941165202,36.63056881181441,minimize,36.53774341292369,minimize,1481.9029737625024,minimize,True,True,0.0006405332168774407,,2024-06-11 12:18:11.814563
16
+ 13,22.592602387021333,51.59088187331228,6.2020220936995525,40.387965035487035,minimize,40.85943258832127,minimize,1165.5722822320565,minimize,False,True,0.0006405332168774407,,2024-06-11 12:18:16.222971
17
+ 14,58.76493724495243,44.20401050976337,64.09642020029887,34.858239533999296,minimize,34.725797147945734,minimize,2597.645901020641,minimize,False,True,0.0006405332168774407,,2024-06-11 12:18:20.540597
18
+ 15,32.86246372091377,44.383694428619314,102.63175919113127,37.1577717589319,minimize,36.7308460274431,minimize,1458.5575460918933,minimize,True,True,0.0006704802815873576,,2024-06-11 12:18:24.780506
@@ -0,0 +1,18 @@
1
+ "{""femprj_path"": null, ""model_name"": ""Ex14""}",prm,prm,obj,obj_direction,obj,obj_direction,obj,obj_direction,,,,,
2
+ ,,,,,,,,,,,,,
3
+ trial,substrate_w,substrate_d,max temp. of<br>MAINCHIP (degree),max temp. of<br>MAINCHIP (degree)_direction,max temp. of<br>SUBCHIP (degree),max temp. of<br>SUBCHIP (degree)_direction,substrate size,substrate size_direction,non_domi,feasible,hypervolume,message,time
4
+ 1,40.0,60.0,37.52037094703595,minimize,37.219570759517936,minimize,2400.0,minimize,True,True,0.0,initial,2024-06-11 12:15:44.138912
5
+ 2,28.741722139252524,58.66928627306774,39.9508830973249,minimize,39.599423416818745,minimize,1686.2563226399373,minimize,True,True,2.970229880317643e-05,,2024-06-11 12:15:48.376064
6
+ 3,35.17589095260529,49.163779073319986,39.86737960935721,minimize,39.626434415381006,minimize,1729.3797347696782,minimize,True,True,0.000549159406835399,,2024-06-11 12:15:52.656210
7
+ 4,24.808335527963855,37.21185204907747,45.61866728905813,minimize,45.454085110378436,minimize,923.164108992346,minimize,True,True,0.0005566073404974778,,2024-06-11 12:15:56.376449
8
+ 5,23.04550501902759,56.38675593592325,42.04691673232563,minimize,41.64255082527148,minimize,1299.4612650272293,minimize,True,True,0.0005567909231334245,,2024-06-11 12:16:00.326849
9
+ 6,32.82007021137776,52.11795960049323,39.9187861643026,minimize,39.65372077487905,minimize,1710.515092752764,minimize,True,True,0.0007091441422963771,,2024-06-11 12:16:04.696885
10
+ 7,22.370520897324443,59.18756600837385,41.85766092262706,minimize,41.41235961737965,minimize,1324.0566822231292,minimize,True,True,0.0007092394191664859,,2024-06-11 12:16:08.614814
11
+ 8,36.98396753440759,38.733155988313456,41.459966487020225,minimize,41.32468375000158,minimize,1432.50578267643,minimize,True,True,0.000726093206891994,,2024-06-11 12:16:12.849722
12
+ 9,25.27284940972781,37.951921766042716,45.203996793500714,minimize,45.02945742624087,minimize,959.1532040919769,minimize,True,True,0.000740299173075068,,2024-06-11 12:16:16.595183
13
+ 10,27.476360373271678,47.16842365407042,42.20017927506254,minimize,41.94996082930303,minimize,1296.0166090811015,minimize,True,True,0.0007432067663207338,,2024-06-11 12:16:20.601673
14
+ 11,30.35761516871566,42.82064718778404,42.23879430266078,minimize,42.04418338920198,minimize,1299.9327303125576,minimize,False,True,0.0007432067663207338,,2024-06-11 12:16:24.664582
15
+ 12,39.45166799418159,54.41754192649335,38.28305390496612,minimize,38.021101163274,minimize,2146.862796414889,minimize,True,True,0.0007445437960082572,,2024-06-11 12:16:29.231158
16
+ 13,33.521593044416015,57.50694947262799,38.98990028232446,minimize,38.68463558069958,minimize,1927.7245558105535,minimize,True,True,0.0008565127001001895,,2024-06-11 12:16:33.869770
17
+ 14,39.51381652632001,59.67156845010898,37.636491167600745,minimize,37.3320157660186,minimize,2357.85140797618,minimize,True,True,0.0009138674403261316,,2024-06-11 12:16:38.728862
18
+ 15,27.034698907527144,51.95067544919728,41.46094657033741,minimize,41.16337804204099,minimize,1404.470867090637,minimize,True,True,0.0009230159948292316,,2024-06-11 12:16:42.930323