pyfemtet 1.2.2__py3-none-any.whl → 1.3.0__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/_util/dask_util.py +2 -3
- pyfemtet/opt/history/_history.py +48 -46
- pyfemtet/opt/history/_hypervolume.py +64 -6
- pyfemtet/opt/interface/_femtet_interface/femtet_interface.py +3 -2
- {pyfemtet-1.2.2.dist-info → pyfemtet-1.3.0.dist-info}/METADATA +2 -2
- {pyfemtet-1.2.2.dist-info → pyfemtet-1.3.0.dist-info}/RECORD +10 -10
- {pyfemtet-1.2.2.dist-info → pyfemtet-1.3.0.dist-info}/WHEEL +0 -0
- {pyfemtet-1.2.2.dist-info → pyfemtet-1.3.0.dist-info}/entry_points.txt +0 -0
- {pyfemtet-1.2.2.dist-info → pyfemtet-1.3.0.dist-info}/licenses/LICENSE +0 -0
- {pyfemtet-1.2.2.dist-info → pyfemtet-1.3.0.dist-info}/licenses/LICENSE_THIRD_PARTY.txt +0 -0
pyfemtet/_util/dask_util.py
CHANGED
|
@@ -23,6 +23,7 @@ remove_all_output(get_dask_logger())
|
|
|
23
23
|
warnings.filterwarnings('ignore', category=RuntimeWarning, message="Couldn't detect a suitable IP address")
|
|
24
24
|
|
|
25
25
|
cfg.set({'distributed.scheduler.worker-ttl': None})
|
|
26
|
+
cfg.set({"distributed.scheduler.locks.lease-timeout": "inf"})
|
|
26
27
|
|
|
27
28
|
logger = get_module_logger('opt.dask', False)
|
|
28
29
|
|
|
@@ -62,9 +63,7 @@ def Lock(name, client=None):
|
|
|
62
63
|
|
|
63
64
|
if client is not None:
|
|
64
65
|
# import inspect
|
|
65
|
-
|
|
66
|
-
with cfg.set({"distributed.scheduler.locks.lease-timeout": "inf"}):
|
|
67
|
-
_lock = _DaskLock(name)
|
|
66
|
+
_lock = _DaskLock(name)
|
|
68
67
|
|
|
69
68
|
else:
|
|
70
69
|
if name in _lock_pool:
|
pyfemtet/opt/history/_history.py
CHANGED
|
@@ -9,8 +9,7 @@ import math
|
|
|
9
9
|
import json
|
|
10
10
|
import datetime
|
|
11
11
|
import dataclasses
|
|
12
|
-
from time import sleep
|
|
13
|
-
from contextlib import nullcontext
|
|
12
|
+
from time import sleep, time
|
|
14
13
|
|
|
15
14
|
import numpy as np
|
|
16
15
|
import pandas as pd
|
|
@@ -51,6 +50,16 @@ MAIN_FILTER: dict = {
|
|
|
51
50
|
|
|
52
51
|
|
|
53
52
|
logger = get_module_logger('opt.history', False)
|
|
53
|
+
logger_dask = get_module_logger('opt.dask', False)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _assert_locked_with_timeout(lock, assertion_message=None, timeout=10.):
|
|
57
|
+
start = time()
|
|
58
|
+
while not lock.locked():
|
|
59
|
+
sleep(0.5)
|
|
60
|
+
if time() - start > timeout:
|
|
61
|
+
assert False, assertion_message or "Lock is not acquired."
|
|
62
|
+
logger_dask.debug("Lock is not acquired. Retry to check locked.")
|
|
54
63
|
|
|
55
64
|
|
|
56
65
|
class MetaColumnNames(StrEnum):
|
|
@@ -153,13 +162,6 @@ class DataFrameWrapper:
|
|
|
153
162
|
def lock(self):
|
|
154
163
|
return Lock(self._lock_name)
|
|
155
164
|
|
|
156
|
-
@property
|
|
157
|
-
def lock_if_not_locked(self):
|
|
158
|
-
if self.lock.locked():
|
|
159
|
-
return nullcontext()
|
|
160
|
-
else:
|
|
161
|
-
return self.lock
|
|
162
|
-
|
|
163
165
|
def get_df(self, equality_filters: dict = None) -> pd.DataFrame:
|
|
164
166
|
"""
|
|
165
167
|
|
|
@@ -235,7 +237,7 @@ class DataFrameWrapper:
|
|
|
235
237
|
# partial_df を get_df した時点のものから
|
|
236
238
|
# 変わっていたらエラーになる
|
|
237
239
|
if equality_filters is not None:
|
|
238
|
-
|
|
240
|
+
_assert_locked_with_timeout(self.lock, 'set_df() with equality_filters must be called with locking.')
|
|
239
241
|
partial_df = df
|
|
240
242
|
df = self.get_df()
|
|
241
243
|
apply_partial_df(df, partial_df, equality_filters)
|
|
@@ -796,7 +798,7 @@ class EntireDependentValuesCalculator:
|
|
|
796
798
|
self.entire_df: pd.DataFrame = entire_df
|
|
797
799
|
self.partial_df: pd.DataFrame = get_partial_df(entire_df, equality_filters)
|
|
798
800
|
|
|
799
|
-
|
|
801
|
+
_assert_locked_with_timeout(self.records.df_wrapper.lock)
|
|
800
802
|
|
|
801
803
|
# get column names
|
|
802
804
|
obj_names = self.records.column_manager.get_obj_names()
|
|
@@ -826,7 +828,7 @@ class EntireDependentValuesCalculator:
|
|
|
826
828
|
|
|
827
829
|
def update_optimality(self):
|
|
828
830
|
|
|
829
|
-
|
|
831
|
+
_assert_locked_with_timeout(self.records.df_wrapper.lock)
|
|
830
832
|
|
|
831
833
|
# calc optimality
|
|
832
834
|
optimality = calc_optimality(
|
|
@@ -839,13 +841,13 @@ class EntireDependentValuesCalculator:
|
|
|
839
841
|
|
|
840
842
|
def update_hypervolume(self):
|
|
841
843
|
|
|
842
|
-
|
|
844
|
+
_assert_locked_with_timeout(self.records.df_wrapper.lock)
|
|
843
845
|
|
|
844
846
|
# calc hypervolume
|
|
845
847
|
hv_values = calc_hypervolume(
|
|
846
848
|
self.partial_y_internal,
|
|
847
849
|
self.partial_feasibility,
|
|
848
|
-
ref_point='nadir
|
|
850
|
+
ref_point='optuna-nadir',
|
|
849
851
|
)
|
|
850
852
|
|
|
851
853
|
# update
|
|
@@ -853,7 +855,7 @@ class EntireDependentValuesCalculator:
|
|
|
853
855
|
|
|
854
856
|
def update_trial_number(self):
|
|
855
857
|
|
|
856
|
-
|
|
858
|
+
_assert_locked_with_timeout(self.records.df_wrapper.lock)
|
|
857
859
|
|
|
858
860
|
# calc trial
|
|
859
861
|
trial_number = 1 + np.arange(len(self.partial_df)).astype(int)
|
|
@@ -1139,45 +1141,45 @@ class Records:
|
|
|
1139
1141
|
|
|
1140
1142
|
def update_entire_dependent_values(self, processing_df: pd.DataFrame):
|
|
1141
1143
|
|
|
1142
|
-
|
|
1144
|
+
_assert_locked_with_timeout(self.df_wrapper.lock)
|
|
1143
1145
|
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1146
|
+
# check trial_id is filled
|
|
1147
|
+
trial_processed = False
|
|
1148
|
+
if processing_df['trial_id'].notna().all():
|
|
1149
|
+
id_to_n: dict = {tid: i + 1 for i, tid
|
|
1150
|
+
in enumerate(processing_df['trial_id'].unique())}
|
|
1151
|
+
processing_df['trial'] = processing_df['trial_id'].map(id_to_n)
|
|
1152
|
+
trial_processed = True
|
|
1151
1153
|
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
+
# update main fidelity
|
|
1155
|
+
equality_filters = MAIN_FILTER
|
|
1156
|
+
mgr = EntireDependentValuesCalculator(
|
|
1157
|
+
self,
|
|
1158
|
+
equality_filters,
|
|
1159
|
+
processing_df,
|
|
1160
|
+
)
|
|
1161
|
+
mgr.update_optimality()
|
|
1162
|
+
mgr.update_hypervolume()
|
|
1163
|
+
if not trial_processed:
|
|
1164
|
+
mgr.update_trial_number() # per_fidelity
|
|
1165
|
+
pdf = mgr.partial_df
|
|
1166
|
+
apply_partial_df(df=processing_df, partial_df=pdf, equality_filters=equality_filters)
|
|
1167
|
+
|
|
1168
|
+
# update sub fidelity
|
|
1169
|
+
sub_fidelity_names: list = np.unique(processing_df['sub_fidelity_name']).tolist()
|
|
1170
|
+
if MAIN_FIDELITY_NAME in sub_fidelity_names:
|
|
1171
|
+
sub_fidelity_names.remove(MAIN_FIDELITY_NAME)
|
|
1172
|
+
for sub_fidelity_name in sub_fidelity_names:
|
|
1173
|
+
equality_filters = {'sub_fidelity_name': sub_fidelity_name}
|
|
1154
1174
|
mgr = EntireDependentValuesCalculator(
|
|
1155
1175
|
self,
|
|
1156
1176
|
equality_filters,
|
|
1157
|
-
processing_df
|
|
1177
|
+
processing_df
|
|
1158
1178
|
)
|
|
1159
|
-
mgr.update_optimality()
|
|
1160
|
-
mgr.update_hypervolume()
|
|
1161
1179
|
if not trial_processed:
|
|
1162
1180
|
mgr.update_trial_number() # per_fidelity
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
# update sub fidelity
|
|
1167
|
-
sub_fidelity_names: list = np.unique(processing_df['sub_fidelity_name']).tolist()
|
|
1168
|
-
if MAIN_FIDELITY_NAME in sub_fidelity_names:
|
|
1169
|
-
sub_fidelity_names.remove(MAIN_FIDELITY_NAME)
|
|
1170
|
-
for sub_fidelity_name in sub_fidelity_names:
|
|
1171
|
-
equality_filters = {'sub_fidelity_name': sub_fidelity_name}
|
|
1172
|
-
mgr = EntireDependentValuesCalculator(
|
|
1173
|
-
self,
|
|
1174
|
-
equality_filters,
|
|
1175
|
-
processing_df
|
|
1176
|
-
)
|
|
1177
|
-
if not trial_processed:
|
|
1178
|
-
mgr.update_trial_number() # per_fidelity
|
|
1179
|
-
pdf = mgr.partial_df
|
|
1180
|
-
apply_partial_df(df=processing_df, partial_df=pdf, equality_filters=equality_filters)
|
|
1181
|
+
pdf = mgr.partial_df
|
|
1182
|
+
apply_partial_df(df=processing_df, partial_df=pdf, equality_filters=equality_filters)
|
|
1181
1183
|
|
|
1182
1184
|
|
|
1183
1185
|
class History:
|
|
@@ -12,7 +12,13 @@ else:
|
|
|
12
12
|
from optuna._hypervolume import wfg
|
|
13
13
|
compute_hypervolume = wfg.compute_hypervolume
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
import datetime
|
|
16
|
+
from optuna.visualization._hypervolume_history import _get_hypervolume_history_info, _get_hypervolume_history_plot
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
from ._optimality import *
|
|
20
|
+
except ImportError:
|
|
21
|
+
from _optimality import *
|
|
16
22
|
|
|
17
23
|
|
|
18
24
|
__all__ = [
|
|
@@ -23,7 +29,7 @@ __all__ = [
|
|
|
23
29
|
def calc_hypervolume(
|
|
24
30
|
y_internal: np.ndarray,
|
|
25
31
|
feasibility: np.ndarray,
|
|
26
|
-
ref_point: str | np.ndarray = 'nadir
|
|
32
|
+
ref_point: str | np.ndarray = 'optuna-nadir'
|
|
27
33
|
) -> np.ndarray:
|
|
28
34
|
"""
|
|
29
35
|
|
|
@@ -57,6 +63,8 @@ def calc_hypervolume(
|
|
|
57
63
|
elif ref_point.lower() == 'worst':
|
|
58
64
|
hv = calc_hypervolume_worst(y_internal, feasibility)
|
|
59
65
|
hv_values = hv * np.ones(len(y_internal)).astype(float)
|
|
66
|
+
elif ref_point.lower() == 'optuna-nadir':
|
|
67
|
+
hv_values = calc_hypervolume_by_optuna(y_internal, feasibility)
|
|
60
68
|
else:
|
|
61
69
|
raise NotImplementedError
|
|
62
70
|
|
|
@@ -80,12 +88,13 @@ def get_pareto_set(
|
|
|
80
88
|
return non_dominated_solutions
|
|
81
89
|
|
|
82
90
|
|
|
83
|
-
def calc_hypervolume_nadir(y, feasibility) -> float:
|
|
91
|
+
def calc_hypervolume_nadir(y, feasibility, ref_point=None) -> float:
|
|
84
92
|
"""Use Nadir point as the ref_point.
|
|
85
93
|
|
|
86
94
|
Args:
|
|
87
95
|
y: (n, m) shaped 2d-array. float.
|
|
88
96
|
feasibility (np.ndarray): n shaped 1d-array. bool.
|
|
97
|
+
ref_point: (m) shaped array. float.
|
|
89
98
|
|
|
90
99
|
Returns: float.
|
|
91
100
|
|
|
@@ -95,8 +104,10 @@ def calc_hypervolume_nadir(y, feasibility) -> float:
|
|
|
95
104
|
if len(pareto_set) == 0:
|
|
96
105
|
return 0.
|
|
97
106
|
|
|
98
|
-
|
|
99
|
-
|
|
107
|
+
if ref_point is None:
|
|
108
|
+
nadir_point = pareto_set.max(axis=0)
|
|
109
|
+
ref_point = nadir_point + 1e-8
|
|
110
|
+
|
|
100
111
|
hv = compute_hypervolume(pareto_set, ref_point)
|
|
101
112
|
|
|
102
113
|
return hv
|
|
@@ -116,10 +127,26 @@ def calc_hypervolume_nadir_up_to_the_point(y, feasibility) -> np.ndarray:
|
|
|
116
127
|
out = []
|
|
117
128
|
|
|
118
129
|
assert len(y) == len(feasibility)
|
|
130
|
+
|
|
131
|
+
nadir_points = []
|
|
119
132
|
for n in range(len(y)):
|
|
120
133
|
y_up = y[:n]
|
|
121
134
|
f_up = feasibility[:n]
|
|
122
|
-
|
|
135
|
+
pareto_set = get_pareto_set(y_up, f_up)
|
|
136
|
+
if len(pareto_set) == 0:
|
|
137
|
+
continue
|
|
138
|
+
nadir_points.append(pareto_set.max(axis=0))
|
|
139
|
+
|
|
140
|
+
if len(nadir_points) == 0:
|
|
141
|
+
return np.zeros(len(y))
|
|
142
|
+
|
|
143
|
+
nadir_point = np.array(nadir_points).max(axis=0)
|
|
144
|
+
ref_point = nadir_point + 1e-8
|
|
145
|
+
|
|
146
|
+
for n in range(len(y)):
|
|
147
|
+
y_up = y[:n]
|
|
148
|
+
f_up = feasibility[:n]
|
|
149
|
+
out.append(calc_hypervolume_nadir(y_up, f_up, ref_point=ref_point))
|
|
123
150
|
|
|
124
151
|
return np.array(out).astype(float)
|
|
125
152
|
|
|
@@ -167,3 +194,34 @@ def calc_hypervolume_fixed_point(y, feasibility, ref_point) -> float:
|
|
|
167
194
|
hv = compute_hypervolume(feasible_solutions, ref_point)
|
|
168
195
|
|
|
169
196
|
return hv
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def calc_hypervolume_by_optuna(y, f):
|
|
200
|
+
study = optuna.create_study(
|
|
201
|
+
directions=['minimize'] * y.shape[-1]
|
|
202
|
+
)
|
|
203
|
+
number = 0
|
|
204
|
+
for y_ in y:
|
|
205
|
+
system_attrs = {}
|
|
206
|
+
if np.isnan(y_).any():
|
|
207
|
+
system_attrs.update({"constraints": [1.]})
|
|
208
|
+
y_ = y[0]
|
|
209
|
+
trial = optuna.trial.FrozenTrial(
|
|
210
|
+
number=number,
|
|
211
|
+
value=None,
|
|
212
|
+
values=y_,
|
|
213
|
+
state=optuna.trial.TrialState.COMPLETE,
|
|
214
|
+
datetime_start=datetime.datetime.now(),
|
|
215
|
+
datetime_complete=datetime.datetime.now(),
|
|
216
|
+
params={},
|
|
217
|
+
distributions={},
|
|
218
|
+
user_attrs={},
|
|
219
|
+
system_attrs=system_attrs,
|
|
220
|
+
intermediate_values={},
|
|
221
|
+
trial_id=number,
|
|
222
|
+
)
|
|
223
|
+
study.add_trial(trial)
|
|
224
|
+
number += 1
|
|
225
|
+
ref_point = get_pareto_set(y, f).max(axis=0) + 1e-8
|
|
226
|
+
info = _get_hypervolume_history_info(study, reference_point=ref_point)
|
|
227
|
+
return np.array(info.values)
|
|
@@ -354,7 +354,7 @@ class FemtetInterface(COMInterface):
|
|
|
354
354
|
|
|
355
355
|
"""
|
|
356
356
|
# noinspection PyGlobalUndefined
|
|
357
|
-
global constants
|
|
357
|
+
global constants, Dispatch
|
|
358
358
|
|
|
359
359
|
if connect_method == "new":
|
|
360
360
|
self._connect_new_femtet()
|
|
@@ -379,8 +379,9 @@ class FemtetInterface(COMInterface):
|
|
|
379
379
|
|
|
380
380
|
import win32com.client
|
|
381
381
|
importlib.reload(win32com.client)
|
|
382
|
-
|
|
382
|
+
Dispatch = win32com.client.Dispatch
|
|
383
383
|
Dispatch('FemtetMacro.Femtet')
|
|
384
|
+
constants = win32com.client.constants
|
|
384
385
|
|
|
385
386
|
if not hasattr(constants, "STATIC_C"):
|
|
386
387
|
message = _(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyfemtet
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Design parameter optimization using Femtet.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -25,7 +25,7 @@ Requires-Dist: fire (>=0.7)
|
|
|
25
25
|
Requires-Dist: frozendict (>=2.4.6)
|
|
26
26
|
Requires-Dist: numpy (>=2.0.0,<3)
|
|
27
27
|
Requires-Dist: openpyxl (>=3.1.2,<4)
|
|
28
|
-
Requires-Dist: optuna (>=
|
|
28
|
+
Requires-Dist: optuna (>=4.5.0,<4.6.0)
|
|
29
29
|
Requires-Dist: optuna-integration (>=3.6.0,<5.0.0)
|
|
30
30
|
Requires-Dist: pandas (>=2.2.3,<3)
|
|
31
31
|
Requires-Dist: plotly (>=5.22.0,<6)
|
|
@@ -10,7 +10,7 @@ pyfemtet/_i18n/locales/messages.pot,sha256=krqoEumXnY45pG5dm-dQPmynb-eNx1BbIfbHB
|
|
|
10
10
|
pyfemtet/_i18n/messages.py,sha256=AvGLbs_ELTIBm4nCeDyaXWsEiTPuGkYVAjlp_TCfxmo,16994
|
|
11
11
|
pyfemtet/_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
pyfemtet/_util/closing.py,sha256=JPcgHDbW249YF20bMOX6UX-LquWoCWA14KhX-qFouR4,502
|
|
13
|
-
pyfemtet/_util/dask_util.py,sha256=
|
|
13
|
+
pyfemtet/_util/dask_util.py,sha256=00P8-PB0pzmI9NkiOXUWZONGlzJhz1YMafFtadh3w24,2093
|
|
14
14
|
pyfemtet/_util/df_util.py,sha256=UVJZcTqVe_98aGAqF9Sp4b6BC5c_c3ADRsZ2RUJcN0Y,1889
|
|
15
15
|
pyfemtet/_util/excel_macro_util.py,sha256=pUCpENpM1q6AbC7wH7rMXwnQ7nIFnabQ4xlbsli9VzM,8028
|
|
16
16
|
pyfemtet/_util/excel_parse_util.py,sha256=k8Y5EI9r0txwkieKUzlZqQ93b-9SMXldNIfq5ksWg28,5525
|
|
@@ -33,8 +33,8 @@ pyfemtet/opt/__init__.py,sha256=1LcwTddtoi8plemxkzmX0YEKiNpAZvKn9OoNQysyDLE,339
|
|
|
33
33
|
pyfemtet/opt/exceptions.py,sha256=M_O7jm20Y4e_QxsKF6tnEl-OrAtErUOj6hNT7eEXCO4,1327
|
|
34
34
|
pyfemtet/opt/femopt.py,sha256=d-w9enC_XG-4ScIE26PvnoQNqVBXWyveade0wrEcDTM,23827
|
|
35
35
|
pyfemtet/opt/history/__init__.py,sha256=pUp3SO4R7RGzmpNDLBg_pQH0X2yzBd-oqsHXWmB33os,201
|
|
36
|
-
pyfemtet/opt/history/_history.py,sha256=
|
|
37
|
-
pyfemtet/opt/history/_hypervolume.py,sha256=
|
|
36
|
+
pyfemtet/opt/history/_history.py,sha256=tQM_RuuIPmN1fYsNcz6kYGLpR9Zxub6zF9-8nloMrqk,54705
|
|
37
|
+
pyfemtet/opt/history/_hypervolume.py,sha256=umOTktWvmHmn81MCr6KGTsZfNv_B9x9rsb9HbyzOlEE,6259
|
|
38
38
|
pyfemtet/opt/history/_optimality.py,sha256=6vLySZmrrklr04Qir0hGethTykf8NYFod88NDGrBrG0,2407
|
|
39
39
|
pyfemtet/opt/interface/__init__.py,sha256=b2lfkBL-UPbzJppIqSgtUqHSHitPLQa6DRuH91nDZK8,1905
|
|
40
40
|
pyfemtet/opt/interface/_base_interface.py,sha256=iWJmJ8kxRH-Cztfhy3QKfRhSKRMytBtjGqgVjVavoPw,6689
|
|
@@ -44,7 +44,7 @@ pyfemtet/opt/interface/_excel_interface/debug-excel-interface.xlsm,sha256=TM1CEO
|
|
|
44
44
|
pyfemtet/opt/interface/_excel_interface/excel_interface.py,sha256=Sghavj7bcslQ5ue9xJzV6DdBfhv6XKn-XxKD-T39KEo,39854
|
|
45
45
|
pyfemtet/opt/interface/_femtet_interface/__init__.py,sha256=snQruC8Rl_5rFeVmiqw9lmzdJ5mL42HpIlHIn5ytd8s,77
|
|
46
46
|
pyfemtet/opt/interface/_femtet_interface/_femtet_parametric.py,sha256=Om2S1hd90nQSuOXf1ylUJiILcxVhLiCOL4dc34lJzdM,10946
|
|
47
|
-
pyfemtet/opt/interface/_femtet_interface/femtet_interface.py,sha256=
|
|
47
|
+
pyfemtet/opt/interface/_femtet_interface/femtet_interface.py,sha256=183BGGdXGTnI8yYypMX5dgsEtlRBSPAbuI0Nyzol_i8,45765
|
|
48
48
|
pyfemtet/opt/interface/_femtet_with_nx_interface/__init__.py,sha256=ppeoWVSmVsTmDNKpuFRVTnhjcoefQVEog3-FRiKpEe4,104
|
|
49
49
|
pyfemtet/opt/interface/_femtet_with_nx_interface/femtet_with_nx_interface.py,sha256=IPIoNMtcJmtiv7eM3yDMWDOynTf0mXd-438LoDVqZCU,8628
|
|
50
50
|
pyfemtet/opt/interface/_femtet_with_nx_interface/model1.prt,sha256=cYVw2izr4_9PCPHOpi46XmDVOuNZ5ksuwKqzBtCZfNA,104833
|
|
@@ -174,9 +174,9 @@ pyfemtet/opt/visualization/plotter/parallel_plot_creator.py,sha256=VRhT0CUG1mCHD
|
|
|
174
174
|
pyfemtet/opt/visualization/plotter/pm_graph_creator.py,sha256=7EwmoJlnHwDrpw65NchiA63FIjgGTLq6vTcpTzrSnJo,11841
|
|
175
175
|
pyfemtet/opt/wat_ex14_parametric_jp.femprj,sha256=dMwQMt6yok_PbZLyxPYdmg5wJQwgQDZ4RhS76zdGLGk,177944
|
|
176
176
|
pyfemtet/opt/worker_status.py,sha256=simvPa1AkO1idmPXrF5WjYVEBx3tO7hLhbM3J1rFjdo,3824
|
|
177
|
-
pyfemtet-1.
|
|
178
|
-
pyfemtet-1.
|
|
179
|
-
pyfemtet-1.
|
|
180
|
-
pyfemtet-1.
|
|
181
|
-
pyfemtet-1.
|
|
182
|
-
pyfemtet-1.
|
|
177
|
+
pyfemtet-1.3.0.dist-info/METADATA,sha256=DTNj7im47LO6Ew3lwd1VhWSc-my4GN_mHTzrXuPMTMY,3410
|
|
178
|
+
pyfemtet-1.3.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
179
|
+
pyfemtet-1.3.0.dist-info/entry_points.txt,sha256=Tsb_l_8Z6pyyq2tRfuKiwfJUV3nq_cHoLS61foALtsg,134
|
|
180
|
+
pyfemtet-1.3.0.dist-info/licenses/LICENSE,sha256=LWUL5LlMGjSRTvsalS8_fFuwS4VMw18fJSNWFwDK8pc,1060
|
|
181
|
+
pyfemtet-1.3.0.dist-info/licenses/LICENSE_THIRD_PARTY.txt,sha256=8_9-cgzTpmeuCqItPZb9-lyAZcH2Qp9sZTU_hYuOZIQ,191
|
|
182
|
+
pyfemtet-1.3.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|