pyfemtet 0.8.6__py3-none-any.whl → 0.8.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyfemtet might be problematic. Click here for more details.
- pyfemtet/__init__.py +1 -1
- pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo +0 -0
- pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po +92 -88
- pyfemtet/_message/locales/messages.pot +94 -90
- pyfemtet/_message/messages.py +2 -0
- pyfemtet/opt/interface/_femtet.py +17 -0
- pyfemtet/opt/interface/_femtet_parametric.py +203 -4
- pyfemtet/opt/interface/_surrogate/_base.py +20 -19
- pyfemtet/opt/interface/_surrogate/_chaospy.py +3 -3
- pyfemtet/opt/interface/_surrogate/_singletaskgp.py +6 -6
- pyfemtet/opt/optimizer/_optuna/_optuna.py +12 -1
- {pyfemtet-0.8.6.dist-info → pyfemtet-0.8.8.dist-info}/METADATA +1 -1
- {pyfemtet-0.8.6.dist-info → pyfemtet-0.8.8.dist-info}/RECORD +16 -16
- {pyfemtet-0.8.6.dist-info → pyfemtet-0.8.8.dist-info}/LICENSE +0 -0
- {pyfemtet-0.8.6.dist-info → pyfemtet-0.8.8.dist-info}/WHEEL +0 -0
- {pyfemtet-0.8.6.dist-info → pyfemtet-0.8.8.dist-info}/entry_points.txt +0 -0
|
@@ -1,12 +1,147 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import ctypes
|
|
3
|
+
# from ctypes import wintypes
|
|
1
4
|
import logging
|
|
5
|
+
import warnings
|
|
6
|
+
from time import sleep, time
|
|
7
|
+
from packaging.version import Version
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
import pandas as pd
|
|
11
|
+
from femtetutils import util
|
|
12
|
+
from femtetutils import logger as util_logger
|
|
2
13
|
|
|
3
|
-
from femtetutils import util, logger
|
|
4
14
|
from pyfemtet.dispatch_extensions import _get_pid
|
|
15
|
+
from pyfemtet.core import SolveError
|
|
16
|
+
from pyfemtet._message.messages import encoding, Message
|
|
17
|
+
from pyfemtet.logger import get_module_logger
|
|
5
18
|
|
|
6
|
-
|
|
19
|
+
logger = get_module_logger('opt.fem.ParametricIF', __name__)
|
|
20
|
+
|
|
21
|
+
util_logger.setLevel(logging.ERROR)
|
|
22
|
+
|
|
23
|
+
# singleton pattern
|
|
24
|
+
_P_CSV: 'ParametricResultCSVProcessor' = None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_csv_processor(Femtet):
|
|
28
|
+
global _P_CSV
|
|
29
|
+
if _P_CSV is None:
|
|
30
|
+
_P_CSV = ParametricResultCSVProcessor(Femtet)
|
|
31
|
+
return _P_CSV
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ParametricResultCSVProcessor:
|
|
35
|
+
|
|
36
|
+
def __init__(self, Femtet):
|
|
37
|
+
self.Femtet = Femtet
|
|
38
|
+
|
|
39
|
+
def refresh_csv(self):
|
|
40
|
+
# 存在するならば削除する
|
|
41
|
+
csv_paths = self.get_csv_paths()
|
|
42
|
+
for path in csv_paths:
|
|
43
|
+
if os.path.exists(path):
|
|
44
|
+
os.remove(path)
|
|
45
|
+
|
|
46
|
+
def get_csv_paths(self):
|
|
47
|
+
# 結果フォルダを取得
|
|
48
|
+
path: str = self.Femtet.Project
|
|
49
|
+
res_dir_path = path.removesuffix('.femprj') + '.Results'
|
|
50
|
+
|
|
51
|
+
# csv を取得
|
|
52
|
+
model_name = self.Femtet.AnalysisModelName
|
|
53
|
+
csv_path = os.path.join(res_dir_path, f'{model_name}.csv')
|
|
54
|
+
table_csv_path = os.path.join(res_dir_path, f'{model_name}_table.csv')
|
|
55
|
+
|
|
56
|
+
return csv_path, table_csv_path
|
|
57
|
+
|
|
58
|
+
def check_csv_after_succeeded_PrmCalcExecute(self):
|
|
59
|
+
"""Parametric Solve の後に呼ぶこと。"""
|
|
60
|
+
|
|
61
|
+
csv_path, table_csv_path = self.get_csv_paths()
|
|
62
|
+
|
|
63
|
+
# csv が生成されているか
|
|
64
|
+
start = time()
|
|
65
|
+
while not os.path.exists(csv_path):
|
|
66
|
+
# solve が succeeded であるにもかかわらず
|
|
67
|
+
# 数秒経過しても csv が存在しないのはおかしい
|
|
68
|
+
if time() - start > 3.:
|
|
69
|
+
return False
|
|
70
|
+
sleep(0.25)
|
|
71
|
+
|
|
72
|
+
# csv は存在するが、Femtet が古いと
|
|
73
|
+
# table は生成されない
|
|
74
|
+
if not os.path.exists(table_csv_path):
|
|
75
|
+
warnings.warn('テーブル形式 csv が生成されていないため、'
|
|
76
|
+
'結果出力エラーチェックが行われません。'
|
|
77
|
+
'そのため、結果出力にエラーがある場合は'
|
|
78
|
+
'目的関数が 0 と記録される場合があります。'
|
|
79
|
+
'結果出力エラーチェック機能を利用するためには、'
|
|
80
|
+
'Femtet を最新バージョンにアップデートして'
|
|
81
|
+
'ください。')
|
|
82
|
+
|
|
83
|
+
return True
|
|
84
|
+
|
|
85
|
+
def is_succeeded(self, parametric_output_index):
|
|
86
|
+
|
|
87
|
+
# まず csv 保存が成功しているかどうか。通常あるはず。
|
|
88
|
+
if not self.check_csv_after_succeeded_PrmCalcExecute():
|
|
89
|
+
return False, 'Reason: output csv not found.'
|
|
90
|
+
|
|
91
|
+
# 成功しているならば table があるかどうか
|
|
92
|
+
csv_path, table_csv_path = self.get_csv_paths()
|
|
93
|
+
|
|
94
|
+
# なければエラーチェックできないので
|
|
95
|
+
# エラーなしとみなす (warning の記載通り)
|
|
96
|
+
if not os.path.exists(table_csv_path):
|
|
97
|
+
return True, None
|
|
98
|
+
|
|
99
|
+
# table があれば読み込む
|
|
100
|
+
df = pd.read_csv(table_csv_path, encoding=encoding)
|
|
7
101
|
|
|
102
|
+
# 結果出力用に行番号を付記する
|
|
103
|
+
df['row_num'] = range(2, len(df) + 2) # row=0 は header, excel は 1 始まり
|
|
8
104
|
|
|
9
|
-
|
|
105
|
+
# 「結果出力設定番号」カラムが存在するか
|
|
106
|
+
if '結果出力設定番号' in df.columns: # TODO: 英語版対応
|
|
107
|
+
|
|
108
|
+
# 与えられた output_number に関連する行だけ抜き出し
|
|
109
|
+
# エラーがあるかどうかチェックする
|
|
110
|
+
pdf = df['結果出力設定番号'] == parametric_output_index + 1
|
|
111
|
+
|
|
112
|
+
# 結果出力設定番号 カラムが存在しない
|
|
113
|
+
else:
|
|
114
|
+
# output_number に関係なくエラーがあればエラーにする
|
|
115
|
+
pdf = df
|
|
116
|
+
|
|
117
|
+
# エラーの有無を確認
|
|
118
|
+
if 'エラー' in pdf.columns: # TODO: 英語版対応
|
|
119
|
+
is_no_error = np.all(pdf['エラー'].isna().values)
|
|
120
|
+
|
|
121
|
+
if not is_no_error:
|
|
122
|
+
error_message_row_numbers = pdf['row_num'][~pdf['エラー'].isna()].values.astype(str)
|
|
123
|
+
error_messages = pdf['エラー'][~pdf['エラー'].isna()].values.astype(str)
|
|
124
|
+
|
|
125
|
+
def add_st_or_nd_or_th(n_: int):
|
|
126
|
+
if n_ == 1:
|
|
127
|
+
return f'{n_}st'
|
|
128
|
+
elif n_ == 2:
|
|
129
|
+
return f'{n_}nd'
|
|
130
|
+
elif n_ == 3:
|
|
131
|
+
return f'{n_}rd'
|
|
132
|
+
else:
|
|
133
|
+
return f'{n_}th'
|
|
134
|
+
|
|
135
|
+
error_msg = f'Error message(s) from {os.path.basename(table_csv_path)}: ' + ', '.join(
|
|
136
|
+
[f'({add_st_or_nd_or_th(row)} row) {message}' for row, message in zip(error_message_row_numbers, error_messages)])
|
|
137
|
+
else:
|
|
138
|
+
error_msg = None
|
|
139
|
+
|
|
140
|
+
else:
|
|
141
|
+
raise RuntimeError('Internal Error! Parametric Analysis '
|
|
142
|
+
'output csv has no error column.')
|
|
143
|
+
|
|
144
|
+
return is_no_error, error_msg
|
|
10
145
|
|
|
11
146
|
|
|
12
147
|
def _get_dll():
|
|
@@ -46,7 +181,6 @@ def add_parametric_results_as_objectives(femopt, indexes, directions) -> bool:
|
|
|
46
181
|
|
|
47
182
|
# get objective names
|
|
48
183
|
dll.GetPrmnResult.restype = ctypes.c_int
|
|
49
|
-
n = dll.GetPrmnResult()
|
|
50
184
|
for i, direction in zip(indexes, directions):
|
|
51
185
|
# objective name
|
|
52
186
|
dll.GetPrmResultName.restype = ctypes.c_char_p
|
|
@@ -58,6 +192,15 @@ def add_parametric_results_as_objectives(femopt, indexes, directions) -> bool:
|
|
|
58
192
|
|
|
59
193
|
|
|
60
194
|
def _parametric_objective(Femtet, parametric_result_index):
|
|
195
|
+
# csv から結果取得エラーの有無を確認する
|
|
196
|
+
# (解析自体は成功していないと objective は呼ばれないはず)
|
|
197
|
+
csv_processor = get_csv_processor(Femtet)
|
|
198
|
+
succeeded, error_msg = csv_processor.is_succeeded(parametric_result_index)
|
|
199
|
+
if not succeeded:
|
|
200
|
+
logger.error(Message.ERR_PARAMETRIC_CSV_CONTAINS_ERROR)
|
|
201
|
+
logger.error(error_msg)
|
|
202
|
+
raise SolveError
|
|
203
|
+
|
|
61
204
|
# load dll and set target femtet
|
|
62
205
|
dll = _get_dll_with_set_femtet(Femtet)
|
|
63
206
|
dll.GetPrmResult.restype = ctypes.c_double # 複素数の場合は実部しか取らない
|
|
@@ -65,9 +208,65 @@ def _parametric_objective(Femtet, parametric_result_index):
|
|
|
65
208
|
|
|
66
209
|
|
|
67
210
|
def solve_via_parametric_dll(Femtet) -> bool:
|
|
211
|
+
csv_processor = get_csv_processor(Femtet)
|
|
212
|
+
|
|
213
|
+
# remove previous csv if exists
|
|
214
|
+
# 消さなくても解析はできるが
|
|
215
|
+
# エラーハンドリングのため
|
|
216
|
+
csv_processor.refresh_csv()
|
|
217
|
+
|
|
68
218
|
# load dll and set target femtet
|
|
69
219
|
dll = _get_dll_with_set_femtet(Femtet)
|
|
220
|
+
|
|
221
|
+
# reset existing sweep table
|
|
222
|
+
dll.ClearPrmSweepTable.restype = ctypes.c_bool
|
|
223
|
+
succeed = dll.ClearPrmSweepTable()
|
|
224
|
+
if not succeed:
|
|
225
|
+
logger.error('Failed to remove existing sweep table!') # 通常ありえないので error
|
|
226
|
+
return False
|
|
227
|
+
|
|
70
228
|
# solve
|
|
71
229
|
dll.PrmCalcExecute.restype = ctypes.c_bool
|
|
72
230
|
succeed = dll.PrmCalcExecute()
|
|
231
|
+
if not succeed:
|
|
232
|
+
logger.warning('Failed to solve!') # 通常起こりえるので warn
|
|
233
|
+
return False
|
|
234
|
+
|
|
235
|
+
# Check post-processing error
|
|
236
|
+
# 現時点では table csv に index の情報がないので、
|
|
237
|
+
# エラーがどの番号のものかわからない。
|
|
238
|
+
# ただし、エラーがそのまま出力されるよりマシなので
|
|
239
|
+
# 安全目に引っ掛けることにする
|
|
240
|
+
succeed = csv_processor.check_csv_after_succeeded_PrmCalcExecute()
|
|
241
|
+
if not succeed:
|
|
242
|
+
logger.error('Failed to save parametric result csv!')
|
|
243
|
+
return False # 通常ありえないので error
|
|
244
|
+
|
|
73
245
|
return succeed # 成功した場合はTRUE、失敗した場合はFALSEを返す
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
if __name__ == '__main__':
|
|
249
|
+
from win32com.client import Dispatch
|
|
250
|
+
|
|
251
|
+
g_Femtet = Dispatch('FemtetMacro.Femtet')
|
|
252
|
+
g_dll = _get_dll_with_set_femtet(g_Femtet)
|
|
253
|
+
|
|
254
|
+
# solve
|
|
255
|
+
g_succeeded = solve_via_parametric_dll(g_Femtet)
|
|
256
|
+
if not g_succeeded:
|
|
257
|
+
g_dll.GetLastErrorMsg.restype = ctypes.c_char_p # or wintypes.LPCSTR
|
|
258
|
+
g_error_msg: bytes = g_dll.GetLastErrorMsg()
|
|
259
|
+
g_error_msg: str = g_error_msg.decode(encoding='932')
|
|
260
|
+
|
|
261
|
+
# 結果取得:内部的にはエラーになっているはず
|
|
262
|
+
g_parametric_result_index = 1
|
|
263
|
+
g_dll = _get_dll_with_set_femtet(g_Femtet)
|
|
264
|
+
g_dll.GetPrmResult.restype = ctypes.c_double # 複素数やベクトルの場合は実部や第一成分しか取らない PIF の仕様
|
|
265
|
+
g_output = g_dll.GetPrmResult(g_parametric_result_index)
|
|
266
|
+
|
|
267
|
+
# ... だが、下記のコードでそれは出てこない。
|
|
268
|
+
# 値が実際に 0 である場合と切り分けられないので、
|
|
269
|
+
# csv を見てエラーがあるかどうか判断せざるを得ない。
|
|
270
|
+
g_dll.GetLastErrorMsg.restype = ctypes.c_char_p # or wintypes.LPCSTR
|
|
271
|
+
g_error_msg: bytes = g_dll.GetLastErrorMsg()
|
|
272
|
+
g_error_msg: str = g_error_msg.decode(encoding='932')
|
|
@@ -16,37 +16,35 @@ class SurrogateModelInterfaceBase(FEMInterface, ABC):
|
|
|
16
16
|
def __init__(
|
|
17
17
|
self,
|
|
18
18
|
history_path: str = None,
|
|
19
|
-
|
|
20
|
-
override_objective: bool = True,
|
|
19
|
+
train_history: History = None,
|
|
21
20
|
):
|
|
22
21
|
|
|
23
|
-
self.
|
|
22
|
+
self.train_history: History
|
|
24
23
|
self.model: Any
|
|
25
24
|
self.prm: dict[str, float] = dict()
|
|
26
25
|
self.obj: dict[str, float] = dict()
|
|
27
26
|
self.df_prm: pd.DataFrame
|
|
28
27
|
self.df_obj: pd.DataFrame
|
|
29
|
-
self.override_objective: bool = override_objective
|
|
30
28
|
|
|
31
|
-
# history_path が与えられた場合、
|
|
29
|
+
# history_path が与えられた場合、train_history をコンストラクトする
|
|
32
30
|
if history_path is not None:
|
|
33
|
-
|
|
31
|
+
train_history = History(history_path=history_path)
|
|
34
32
|
|
|
35
|
-
#
|
|
36
|
-
if
|
|
33
|
+
# train_history が与えられるかコンストラクトされている場合
|
|
34
|
+
if train_history is not None:
|
|
37
35
|
# 学習データを準備する
|
|
38
|
-
df_prm =
|
|
39
|
-
df_obj =
|
|
36
|
+
df_prm = train_history.get_df()[train_history.prm_names]
|
|
37
|
+
df_obj = train_history.get_df()[train_history.obj_names]
|
|
40
38
|
|
|
41
39
|
# obj の名前を作る
|
|
42
|
-
for obj_name in
|
|
40
|
+
for obj_name in train_history.obj_names:
|
|
43
41
|
self.obj[obj_name] = np.nan
|
|
44
42
|
|
|
45
43
|
# prm の名前を作る
|
|
46
|
-
for prm_name in
|
|
44
|
+
for prm_name in train_history.prm_names:
|
|
47
45
|
self.prm[prm_name] = np.nan
|
|
48
46
|
|
|
49
|
-
self.
|
|
47
|
+
self.train_history = train_history
|
|
50
48
|
|
|
51
49
|
# history から作らない場合、引数チェック
|
|
52
50
|
else:
|
|
@@ -58,8 +56,7 @@ class SurrogateModelInterfaceBase(FEMInterface, ABC):
|
|
|
58
56
|
|
|
59
57
|
FEMInterface.__init__(
|
|
60
58
|
self,
|
|
61
|
-
|
|
62
|
-
override_objective=self.override_objective
|
|
59
|
+
train_history=train_history, # コンストラクト済み train_history を渡せば並列計算時も何もしなくてよい
|
|
63
60
|
)
|
|
64
61
|
|
|
65
62
|
def filter_feasible(self, x: np.ndarray, y: np.ndarray, return_feasibility=False):
|
|
@@ -73,10 +70,14 @@ class SurrogateModelInterfaceBase(FEMInterface, ABC):
|
|
|
73
70
|
return x[feasible_idx], y[feasible_idx]
|
|
74
71
|
|
|
75
72
|
def _setup_after_parallel(self, *args, **kwargs):
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
opt: AbstractOptimizer = kwargs['opt']
|
|
74
|
+
obj: Objective
|
|
75
|
+
|
|
76
|
+
# add_objective された目的のうち、
|
|
77
|
+
# training data に含まれる名前で
|
|
78
|
+
# あるものは fun を上書き
|
|
79
|
+
for obj_name, obj in opt.objectives.items():
|
|
80
|
+
if obj_name in self.train_history.obj_names:
|
|
80
81
|
obj.fun = lambda obj_name_=obj_name: self.obj[obj_name_]
|
|
81
82
|
|
|
82
83
|
def update_parameter(self, parameters: pd.DataFrame, with_warning=False) -> Optional[List[str]]:
|
|
@@ -27,7 +27,7 @@ class PolynomialChaosInterface(SurrogateModelInterfaceBase):
|
|
|
27
27
|
|
|
28
28
|
# train model
|
|
29
29
|
self.model = PolynomialExpansionModel()
|
|
30
|
-
self.model.set_bounds_from_history(self.
|
|
30
|
+
self.model.set_bounds_from_history(self.train_history)
|
|
31
31
|
self.train()
|
|
32
32
|
|
|
33
33
|
def update(self, parameters: pd.DataFrame) -> None:
|
|
@@ -37,13 +37,13 @@ class PolynomialChaosInterface(SurrogateModelInterfaceBase):
|
|
|
37
37
|
)
|
|
38
38
|
|
|
39
39
|
# history.prm_name 順に並べ替え
|
|
40
|
-
x = np.array([self.prm[k] for k in self.
|
|
40
|
+
x = np.array([self.prm[k] for k in self.train_history.prm_names])
|
|
41
41
|
|
|
42
42
|
# prediction
|
|
43
43
|
dist_mean, _ = self.model.predict(x)
|
|
44
44
|
|
|
45
45
|
# 目的関数の更新
|
|
46
|
-
self.obj = {obj_name: value for obj_name, value in zip(self.
|
|
46
|
+
self.obj = {obj_name: value for obj_name, value in zip(self.train_history.obj_names, dist_mean)}
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
if __name__ == '__main__':
|
|
@@ -40,12 +40,12 @@ class PoFBoTorchInterface(SurrogateModelInterfaceBase):
|
|
|
40
40
|
|
|
41
41
|
# model training
|
|
42
42
|
self.model = SingleTaskGPModel()
|
|
43
|
-
self.model.set_bounds_from_history(self.
|
|
43
|
+
self.model.set_bounds_from_history(self.train_history)
|
|
44
44
|
self.train()
|
|
45
45
|
|
|
46
46
|
# model_f training
|
|
47
47
|
self.model_f = SingleTaskGPModel(is_noise_free=False)
|
|
48
|
-
self.model_f.set_bounds_from_history(self.
|
|
48
|
+
self.model_f.set_bounds_from_history(self.train_history)
|
|
49
49
|
self.train_f()
|
|
50
50
|
|
|
51
51
|
def update(self, parameters: pd.DataFrame) -> None:
|
|
@@ -54,8 +54,8 @@ class PoFBoTorchInterface(SurrogateModelInterfaceBase):
|
|
|
54
54
|
self, parameters
|
|
55
55
|
)
|
|
56
56
|
|
|
57
|
-
#
|
|
58
|
-
x = np.array([self.prm[k] for k in self.
|
|
57
|
+
# train_history.prm_name 順に並べ替え
|
|
58
|
+
x = np.array([self.prm[k] for k in self.train_history.prm_names])
|
|
59
59
|
|
|
60
60
|
# feasibility の計算
|
|
61
61
|
mean_f, std_f = self.model_f.predict(np.array([x]))
|
|
@@ -63,9 +63,9 @@ class PoFBoTorchInterface(SurrogateModelInterfaceBase):
|
|
|
63
63
|
if pof < self.threshold:
|
|
64
64
|
raise SolveError(Msg.INFO_POF_IS_LESS_THAN_THRESHOLD)
|
|
65
65
|
|
|
66
|
-
# 実際の計算(mean は
|
|
66
|
+
# 実際の計算(現時点で mean は train_history.obj_names 順)
|
|
67
67
|
_mean, _std = self.model.predict(np.array([x]))
|
|
68
68
|
mean = _mean[0]
|
|
69
69
|
|
|
70
70
|
# 目的関数の更新
|
|
71
|
-
self.obj = {obj_name: value for obj_name, value in zip(self.
|
|
71
|
+
self.obj = {obj_name: value for obj_name, value in zip(self.train_history.obj_names, mean)}
|
|
@@ -206,7 +206,7 @@ class OptunaOptimizer(AbstractOptimizer):
|
|
|
206
206
|
"""Create storage, study and set initial parameter."""
|
|
207
207
|
|
|
208
208
|
# create storage
|
|
209
|
-
self.study_name =
|
|
209
|
+
self.study_name = 'pyfemtet-study'
|
|
210
210
|
storage_path = self.history.path.replace('.csv', '.db') # history と同じところに保存
|
|
211
211
|
if self.is_cluster: # remote cluster なら scheduler の working dir に保存
|
|
212
212
|
storage_path = os.path.basename(self.history.path).replace('.csv', '.db')
|
|
@@ -374,6 +374,17 @@ class OptunaOptimizer(AbstractOptimizer):
|
|
|
374
374
|
sampler._pyfemtet_optimizer = self
|
|
375
375
|
|
|
376
376
|
# load study
|
|
377
|
+
self.storage: optuna.storages.BaseStorage
|
|
378
|
+
studies = self.storage.get_all_studies()
|
|
379
|
+
if self.study_name in [s.study_name for s in studies]:
|
|
380
|
+
pass
|
|
381
|
+
|
|
382
|
+
elif len(studies) >= 1:
|
|
383
|
+
self.study_name = studies[-1].study_name
|
|
384
|
+
|
|
385
|
+
else:
|
|
386
|
+
raise ValueError('An empty db is passed.')
|
|
387
|
+
|
|
377
388
|
study = optuna.load_study(
|
|
378
389
|
study_name=self.study_name,
|
|
379
390
|
storage=self.storage,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
pyfemtet/__init__.py,sha256=
|
|
1
|
+
pyfemtet/__init__.py,sha256=c6aqZCQlw_39oSCH27ZXK8D1ktjy9L8kQ5LAj1IEYHs,21
|
|
2
2
|
pyfemtet/_femtet_config_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
pyfemtet/_femtet_config_util/autosave.py,sha256=dNirA9XGuFehas8_Jkj2BW9GOzMbPyhnt1WHcH_ObSU,2070
|
|
4
4
|
pyfemtet/_femtet_config_util/exit.py,sha256=0BWID-tjOkmZwmgPFkcJMkWW39voccz5ARIBWvZbHaw,1877
|
|
@@ -6,10 +6,10 @@ pyfemtet/_message/1. make_pot.bat,sha256=wrTA0YaL7nUfNB0cS8zljOmwq2qgyG6RMwHQbrw
|
|
|
6
6
|
pyfemtet/_message/2. make_mo.bat,sha256=6shJ3Yn4BXjDc0hhv_kiGUtVTq4oSRz8-iS4vW29rNE,155
|
|
7
7
|
pyfemtet/_message/__init__.py,sha256=gE1-XX_PzHj9BbhqPaK5VcIHuv6_Tec5qlPMC3IRiBg,100
|
|
8
8
|
pyfemtet/_message/babel.cfg,sha256=AQIFCQ7NlAA84PhV0gowHhbIXH41zA55mzhgyROniJk,73
|
|
9
|
-
pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo,sha256=
|
|
10
|
-
pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po,sha256=
|
|
11
|
-
pyfemtet/_message/locales/messages.pot,sha256=
|
|
12
|
-
pyfemtet/_message/messages.py,sha256=
|
|
9
|
+
pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo,sha256=Af0m1bHsrMAjqyfLlDjW_OK09IXnuDvByaESf7BvuQU,18984
|
|
10
|
+
pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po,sha256=CPVryK95GFl_GSSTz1uSvkKwXaYRvTboIr_aTgdfwbo,25441
|
|
11
|
+
pyfemtet/_message/locales/messages.pot,sha256=AxtocHuEX5VPgXgULpHBxU8swNLUzm9KEBbSP1Y6qP8,15017
|
|
12
|
+
pyfemtet/_message/messages.py,sha256=OsSXVLn9_YKwuHczW1A4CEnhZ0wrtHmOhxPA9OPOzHc,13856
|
|
13
13
|
pyfemtet/_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
pyfemtet/_util/dask_util.py,sha256=ufgr4m8slvyWP97lWBwolysQpJ1PmAO_-OI8IlEyvU8,233
|
|
15
15
|
pyfemtet/_util/excel_macro_util.py,sha256=cF1Z3yl9FMM0J7dpMRTsle8uYxYcfHhQC0QffnVovdY,7944
|
|
@@ -42,22 +42,22 @@ pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_parametric.femprj,sha256=
|
|
|
42
42
|
pyfemtet/opt/interface/__init__.py,sha256=na6-elI9-karOqoSxT9LfLQpjBPm1lrUWjow0NYYRP4,1349
|
|
43
43
|
pyfemtet/opt/interface/_base.py,sha256=y0uQ5jdsWbgt5odyqPin7NXcK_IbUwPDcrrkV_JhpRw,2722
|
|
44
44
|
pyfemtet/opt/interface/_excel_interface.py,sha256=s103vePTPXXYiPwGdAEUFgtpvGXtu1nSljDtP4HsmcY,40355
|
|
45
|
-
pyfemtet/opt/interface/_femtet.py,sha256=
|
|
46
|
-
pyfemtet/opt/interface/_femtet_parametric.py,sha256=
|
|
45
|
+
pyfemtet/opt/interface/_femtet.py,sha256=Tn0qgVMJDv-6hBPDOWYBtlfvhsb4UH3MknX0PaXb8ro,35313
|
|
46
|
+
pyfemtet/opt/interface/_femtet_parametric.py,sha256=rhvnpHdbjNJAKxiCkgnExnZdV5qOB6pBv6AaLeTkeF8,10155
|
|
47
47
|
pyfemtet/opt/interface/_femtet_with_nx/__init__.py,sha256=-6W2g2FDEcKzGHmI5KAKQe-4U5jDpMj0CXuma-GZca0,83
|
|
48
48
|
pyfemtet/opt/interface/_femtet_with_nx/_interface.py,sha256=LkaODUSpBLq05uz5Jf-JKuH6Evq8ElZoItXxFZopWeM,5994
|
|
49
49
|
pyfemtet/opt/interface/_femtet_with_nx/update_model.py,sha256=P7VH0i_o-X9OUe6AGaLF1fACPeHNrMjcrOBCA3MMrI4,3092
|
|
50
50
|
pyfemtet/opt/interface/_femtet_with_sldworks.py,sha256=rjEgebuP1w1eAFVWw4eRJUq3lsyBcmXlkMjZKIpD0kw,11019
|
|
51
51
|
pyfemtet/opt/interface/_surrogate/__init__.py,sha256=2UT5NuBylyWQJNjg1zsBRCV-MzNCUswTUt6ZuSrYFUM,120
|
|
52
|
-
pyfemtet/opt/interface/_surrogate/_base.py,sha256=
|
|
53
|
-
pyfemtet/opt/interface/_surrogate/_chaospy.py,sha256=
|
|
54
|
-
pyfemtet/opt/interface/_surrogate/_singletaskgp.py,sha256=
|
|
52
|
+
pyfemtet/opt/interface/_surrogate/_base.py,sha256=_mVjoxrGEWL-PydjzEYXIgsOJ9zPmntoRHY3dXR2HGo,3098
|
|
53
|
+
pyfemtet/opt/interface/_surrogate/_chaospy.py,sha256=Bqej89Mo0zgdJq1OK7YKRqHOcuyN0wL4ZQUQXdJtYJ8,1987
|
|
54
|
+
pyfemtet/opt/interface/_surrogate/_singletaskgp.py,sha256=bHzY5QIjA9zhLxweexz259XQMZLgkHWfrIDW7f3q-2k,2520
|
|
55
55
|
pyfemtet/opt/optimizer/__init__.py,sha256=Ia6viowECkG0IFXtFef0tJ4jDKsoDzJLqMJ9xLFH2LQ,543
|
|
56
56
|
pyfemtet/opt/optimizer/_base.py,sha256=j8aQc3fGehZTJT9ETf9cr3VWYs2FYk1F8fO3f7QyKAU,13099
|
|
57
57
|
pyfemtet/opt/optimizer/_optuna/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
58
58
|
pyfemtet/opt/optimizer/_optuna/_botorch_patch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
59
|
pyfemtet/opt/optimizer/_optuna/_botorch_patch/enable_nonlinear_constraint.py,sha256=b2-PP2HM46kJS4cJkBWnxnW9AS9JfeVkEjmkoKK_ziE,8949
|
|
60
|
-
pyfemtet/opt/optimizer/_optuna/_optuna.py,sha256=
|
|
60
|
+
pyfemtet/opt/optimizer/_optuna/_optuna.py,sha256=7CpgfetCSNAdO8ppe7uKr0gyXNu0Nn6BILYTv25LEeo,17410
|
|
61
61
|
pyfemtet/opt/optimizer/_optuna/_pof_botorch.py,sha256=FLx9p6IH8xcZl_SZYvs8grMqLEidj5YaBD8urDD88Pk,73768
|
|
62
62
|
pyfemtet/opt/optimizer/_scipy.py,sha256=_2whhMNq6hC1lr5PlYhpZ8Zlh6-DkAjz8SVB5qHIpYg,4766
|
|
63
63
|
pyfemtet/opt/optimizer/_scipy_scalar.py,sha256=rGvrLjrgfYzxK9GA0-r2Hhoaqt6A0TQsT_1M3moyklc,3615
|
|
@@ -137,8 +137,8 @@ pyfemtet/opt/visualization/result_viewer/.gitignore,sha256=ryvb4aqbbsHireHWlPQfx
|
|
|
137
137
|
pyfemtet/opt/visualization/result_viewer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
138
|
pyfemtet/opt/visualization/result_viewer/application.py,sha256=WcHBx_J5eNLKSaprpk9BGifwhO04oN8FiNGYTWorrXA,1691
|
|
139
139
|
pyfemtet/opt/visualization/result_viewer/pages.py,sha256=MZAjzbuq0toZrR-iJhElM3A12_jHVCTt65gz1kdNPbw,32193
|
|
140
|
-
pyfemtet-0.8.
|
|
141
|
-
pyfemtet-0.8.
|
|
142
|
-
pyfemtet-0.8.
|
|
143
|
-
pyfemtet-0.8.
|
|
144
|
-
pyfemtet-0.8.
|
|
140
|
+
pyfemtet-0.8.8.dist-info/LICENSE,sha256=sVQBhyoglGJUu65-BP3iR6ujORI6YgEU2Qm-V4fGlOA,1485
|
|
141
|
+
pyfemtet-0.8.8.dist-info/METADATA,sha256=AVeQJlDibc-xh4Lsz20Y3KiNqrmN7TWR7cgIg0Kp3a4,3509
|
|
142
|
+
pyfemtet-0.8.8.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
|
143
|
+
pyfemtet-0.8.8.dist-info/entry_points.txt,sha256=ZfYqRaoiPtuWqFi2_msccyrVF0LurMn-IHlYamAegZo,104
|
|
144
|
+
pyfemtet-0.8.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|