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.

@@ -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
- import ctypes
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
- logger.setLevel(logging.ERROR)
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
- history: History = None,
20
- override_objective: bool = True,
19
+ train_history: History = None,
21
20
  ):
22
21
 
23
- self.history: History
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 が与えられた場合、history をコンストラクトする
29
+ # history_path が与えられた場合、train_history をコンストラクトする
32
30
  if history_path is not None:
33
- history = History(history_path=history_path)
31
+ train_history = History(history_path=history_path)
34
32
 
35
- # history が与えられるかコンストラクトされている場合
36
- if history is not None:
33
+ # train_history が与えられるかコンストラクトされている場合
34
+ if train_history is not None:
37
35
  # 学習データを準備する
38
- df_prm = history.get_df()[history.prm_names]
39
- df_obj = history.get_df()[history.obj_names]
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 history.obj_names:
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 history.prm_names:
44
+ for prm_name in train_history.prm_names:
47
45
  self.prm[prm_name] = np.nan
48
46
 
49
- self.history = history
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
- history=history, # コンストラクト済み history を渡せば並列計算時も何もしなくてよい
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
- if self.override_objective:
77
- opt: AbstractOptimizer = kwargs['opt']
78
- obj: Objective
79
- for obj_name, obj in opt.objectives.items():
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.history)
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.history.prm_names])
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.history.obj_names, dist_mean)}
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.history)
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.history)
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
- # history.prm_name 順に並べ替え
58
- x = np.array([self.prm[k] for k in self.history.prm_names])
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 は history.obj_names 順)
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.history.obj_names, mean)}
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 = os.path.basename(self.history.path)
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,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyfemtet
3
- Version: 0.8.6
3
+ Version: 0.8.8
4
4
  Summary: Design parameter optimization using Femtet.
5
5
  License: BSD-3-Clause
6
6
  Author: kazuma.naito
@@ -1,4 +1,4 @@
1
- pyfemtet/__init__.py,sha256=B72_7DUBCOMnhKCvBwcwiuuCre398QDqqytHa0lXG-Q,21
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=piTwHbUIWD_68JMMRvzRHD0IuIUdq0dJNYFy88ZjbQQ,18768
10
- pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po,sha256=O5YDF47uPsLh4wXNgXz95p0U8895AbqLNJcLhRKIljE,25185
11
- pyfemtet/_message/locales/messages.pot,sha256=hHrjOC2W_ZOBaDedImBnLQpOeFYBF8K3G7165jYXTGo,14872
12
- pyfemtet/_message/messages.py,sha256=gvF6xwJHE2hlD3b4828Oqzv3jMO_OsZUYtQzRO6cXmk,13678
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=teALmp66aJ_rrmtEOjCGDG1jGLTZr2AmvMFmuuXRQkw,34634
46
- pyfemtet/opt/interface/_femtet_parametric.py,sha256=0pAEhHflp0wIxWBVMXI8nCC02oAyRKLinH3Y6O8bq3M,2224
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=bQMoztVq1b-3BW5Z1V-dSROplMHutrblDI289j0cC-E,3001
53
- pyfemtet/opt/interface/_surrogate/_chaospy.py,sha256=gL72bCgs1AY_EZdJtcifSC-apwsZzp4zsWYxcpVKvtw,1969
54
- pyfemtet/opt/interface/_surrogate/_singletaskgp.py,sha256=ojZHsxGxSc8ZJqJQ_uMHvpK98TPUsHzXP0q4tmM0YPQ,2471
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=5Bjn8LrWpIFWH3lRq6Ke5XYzKQNwoGWNHz59HNMEALA,17093
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.6.dist-info/LICENSE,sha256=sVQBhyoglGJUu65-BP3iR6ujORI6YgEU2Qm-V4fGlOA,1485
141
- pyfemtet-0.8.6.dist-info/METADATA,sha256=Nygc04MFehj-ZvJ5e3KuWq3CL2C94_tbTezHQdp5ubg,3509
142
- pyfemtet-0.8.6.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
143
- pyfemtet-0.8.6.dist-info/entry_points.txt,sha256=ZfYqRaoiPtuWqFi2_msccyrVF0LurMn-IHlYamAegZo,104
144
- pyfemtet-0.8.6.dist-info/RECORD,,
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,,