pyfemtet 0.8.4__py3-none-any.whl → 0.8.7__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,14 +1,14 @@
1
1
  # Translations template for PROJECT.
2
- # Copyright (C) 2024 ORGANIZATION
2
+ # Copyright (C) 2025 ORGANIZATION
3
3
  # This file is distributed under the same license as the PROJECT project.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2025.
5
5
  #
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: PROJECT VERSION\n"
10
10
  "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11
- "POT-Creation-Date: 2024-12-27 09:45+0900\n"
11
+ "POT-Creation-Date: 2025-01-29 15:47+0900\n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -189,351 +189,355 @@ msgstr ""
189
189
  msgid "Restore Femtet setting of autosave."
190
190
  msgstr ""
191
191
 
192
- #: pyfemtet/_message/messages.py:90
192
+ #: pyfemtet/_message/messages.py:88
193
+ msgid "Failed to make output from Femtet. Please check output settings of Parametric Analysis."
194
+ msgstr ""
195
+
196
+ #: pyfemtet/_message/messages.py:92
193
197
  msgid "The following features are not supported by the specified optimization method. "
194
198
  msgstr ""
195
199
 
196
- #: pyfemtet/_message/messages.py:91
200
+ #: pyfemtet/_message/messages.py:93
197
201
  msgid "The parameter set does not match the one added with add_init_parameter."
198
202
  msgstr ""
199
203
 
200
- #: pyfemtet/_message/messages.py:92
204
+ #: pyfemtet/_message/messages.py:94
201
205
  msgid "An exception has occurred during FEM update. Current parameters are: "
202
206
  msgstr ""
203
207
 
204
- #: pyfemtet/_message/messages.py:93
208
+ #: pyfemtet/_message/messages.py:95
205
209
  msgid "The constraints were not satisfied for the following sets of variables:"
206
210
  msgstr ""
207
211
 
208
- #: pyfemtet/_message/messages.py:94
212
+ #: pyfemtet/_message/messages.py:96
209
213
  msgid "Current parameter set cannot update FEM and this optimization method cannot skip current parameter set. The optimization process will be terminated."
210
214
  msgstr ""
211
215
 
212
- #: pyfemtet/_message/messages.py:95
216
+ #: pyfemtet/_message/messages.py:97
213
217
  msgid "Optimization has been interrupted. Note that you cannot acquire the OptimizationResult in case of `trust-constr`, `TNC`, `SLSQP` or `COBYLA`."
214
218
  msgstr ""
215
219
 
216
- #: pyfemtet/_message/messages.py:96
220
+ #: pyfemtet/_message/messages.py:98
217
221
  msgid "You can use parameter constraint only with BoTorchSampler."
218
222
  msgstr ""
219
223
 
220
- #: pyfemtet/_message/messages.py:97
224
+ #: pyfemtet/_message/messages.py:99
221
225
  msgid "Scipy is deterministic, so whether you set a seed or not will not change the results."
222
226
  msgstr ""
223
227
 
224
- #: pyfemtet/_message/messages.py:98
228
+ #: pyfemtet/_message/messages.py:100
225
229
  msgid "Start to candidate new parameter set with constraints. This process may take a long time."
226
230
  msgstr ""
227
231
 
228
- #: pyfemtet/_message/messages.py:99
232
+ #: pyfemtet/_message/messages.py:101
229
233
  msgid "Updating FEM parameter during evaluating constraints take a long time. Please consider not to use FEM variables in constraint functions and set `update_fem` to False."
230
234
  msgstr ""
231
235
 
232
- #: pyfemtet/_message/messages.py:103
236
+ #: pyfemtet/_message/messages.py:105
233
237
  msgid "Connect to Femtet"
234
238
  msgstr ""
235
239
 
236
- #: pyfemtet/_message/messages.py:104
240
+ #: pyfemtet/_message/messages.py:106
237
241
  msgid "Analysis model name described in csv does not exist in project."
238
242
  msgstr ""
239
243
 
240
- #: pyfemtet/_message/messages.py:105
244
+ #: pyfemtet/_message/messages.py:107
241
245
  msgid "History csv is not read yet. Open your project manually."
242
246
  msgstr ""
243
247
 
244
- #: pyfemtet/_message/messages.py:106
248
+ #: pyfemtet/_message/messages.py:108
245
249
  msgid "Cannot read project data from csv. Open your project manually."
246
250
  msgstr ""
247
251
 
248
- #: pyfemtet/_message/messages.py:107
252
+ #: pyfemtet/_message/messages.py:109
249
253
  msgid ".femprj file described in csv is not found. Open your project manually."
250
254
  msgstr ""
251
255
 
252
- #: pyfemtet/_message/messages.py:108
256
+ #: pyfemtet/_message/messages.py:110
253
257
  msgid "Analysis model name is not specified. Open your model in the project manually."
254
258
  msgstr ""
255
259
 
256
- #: pyfemtet/_message/messages.py:110
260
+ #: pyfemtet/_message/messages.py:112
257
261
  msgid "Constraint"
258
262
  msgstr ""
259
263
 
260
- #: pyfemtet/_message/messages.py:111
264
+ #: pyfemtet/_message/messages.py:113
261
265
  msgid "feasible"
262
266
  msgstr ""
263
267
 
264
- #: pyfemtet/_message/messages.py:112
268
+ #: pyfemtet/_message/messages.py:114
265
269
  msgid "infeasible"
266
270
  msgstr ""
267
271
 
268
- #: pyfemtet/_message/messages.py:113
272
+ #: pyfemtet/_message/messages.py:115
269
273
  msgid "Optimality"
270
274
  msgstr ""
271
275
 
272
- #: pyfemtet/_message/messages.py:114
276
+ #: pyfemtet/_message/messages.py:116
273
277
  msgid "non dominated"
274
278
  msgstr ""
275
279
 
276
- #: pyfemtet/_message/messages.py:115
280
+ #: pyfemtet/_message/messages.py:117
277
281
  msgid "dominated"
278
282
  msgstr ""
279
283
 
280
- #: pyfemtet/_message/messages.py:116
284
+ #: pyfemtet/_message/messages.py:118
281
285
  msgid "Hypervolume Plot"
282
286
  msgstr ""
283
287
 
284
- #: pyfemtet/_message/messages.py:117
288
+ #: pyfemtet/_message/messages.py:119
285
289
  msgid "Objective Plot"
286
290
  msgstr ""
287
291
 
288
- #: pyfemtet/_message/messages.py:118
292
+ #: pyfemtet/_message/messages.py:120
289
293
  msgid "Multi Objective Pair Plot"
290
294
  msgstr ""
291
295
 
292
- #: pyfemtet/_message/messages.py:119
296
+ #: pyfemtet/_message/messages.py:121
293
297
  msgid "Succeeded trial number"
294
298
  msgstr ""
295
299
 
296
- #: pyfemtet/_message/messages.py:120
300
+ #: pyfemtet/_message/messages.py:122
297
301
  msgid "All solutions"
298
302
  msgstr ""
299
303
 
300
- #: pyfemtet/_message/messages.py:121
304
+ #: pyfemtet/_message/messages.py:123
301
305
  msgid "Transition of<br>optimal solutions"
302
306
  msgstr ""
303
307
 
304
- #: pyfemtet/_message/messages.py:122
308
+ #: pyfemtet/_message/messages.py:124
305
309
  msgid "Target value"
306
310
  msgstr ""
307
311
 
308
- #: pyfemtet/_message/messages.py:124
312
+ #: pyfemtet/_message/messages.py:126
309
313
  msgid "Objectives"
310
314
  msgstr ""
311
315
 
312
- #: pyfemtet/_message/messages.py:125
316
+ #: pyfemtet/_message/messages.py:127
313
317
  msgid "Objectives (all)"
314
318
  msgstr ""
315
319
 
316
- #: pyfemtet/_message/messages.py:127
320
+ #: pyfemtet/_message/messages.py:129
317
321
  msgid "Prediction Model"
318
322
  msgstr ""
319
323
 
320
- #: pyfemtet/_message/messages.py:128
324
+ #: pyfemtet/_message/messages.py:130
321
325
  msgid " Recalculate Model"
322
326
  msgstr ""
323
327
 
324
- #: pyfemtet/_message/messages.py:129
328
+ #: pyfemtet/_message/messages.py:131
325
329
  msgid " Redraw graph"
326
330
  msgstr ""
327
331
 
328
- #: pyfemtet/_message/messages.py:130
332
+ #: pyfemtet/_message/messages.py:132
329
333
  msgid "Parameter"
330
334
  msgstr ""
331
335
 
332
- #: pyfemtet/_message/messages.py:131
336
+ #: pyfemtet/_message/messages.py:133
333
337
  msgid "Parameter2"
334
338
  msgstr ""
335
339
 
336
- #: pyfemtet/_message/messages.py:132
340
+ #: pyfemtet/_message/messages.py:134
337
341
  msgid "Objective"
338
342
  msgstr ""
339
343
 
340
- #: pyfemtet/_message/messages.py:133
344
+ #: pyfemtet/_message/messages.py:135
341
345
  msgid "No history selected."
342
346
  msgstr ""
343
347
 
344
- #: pyfemtet/_message/messages.py:134
348
+ #: pyfemtet/_message/messages.py:136
345
349
  msgid "No FEM result (yet)."
346
350
  msgstr ""
347
351
 
348
- #: pyfemtet/_message/messages.py:135
352
+ #: pyfemtet/_message/messages.py:137
349
353
  msgid "Prediction model is not calculated yet."
350
354
  msgstr ""
351
355
 
352
- #: pyfemtet/_message/messages.py:136
356
+ #: pyfemtet/_message/messages.py:138
353
357
  msgid "Cannot select same parameter"
354
358
  msgstr ""
355
359
 
356
- #: pyfemtet/_message/messages.py:137
360
+ #: pyfemtet/_message/messages.py:139
357
361
  msgid "3D graph (two or more parameters required)"
358
362
  msgstr ""
359
363
 
360
- #: pyfemtet/_message/messages.py:139
364
+ #: pyfemtet/_message/messages.py:141
361
365
  msgid "Prediction Model of Objective"
362
366
  msgstr ""
363
367
 
364
- #: pyfemtet/_message/messages.py:140
368
+ #: pyfemtet/_message/messages.py:142
365
369
  msgid "prediction model"
366
370
  msgstr ""
367
371
 
368
- #: pyfemtet/_message/messages.py:141
372
+ #: pyfemtet/_message/messages.py:143
369
373
  msgid "std. dev. of model"
370
374
  msgstr ""
371
375
 
372
- #: pyfemtet/_message/messages.py:143
376
+ #: pyfemtet/_message/messages.py:145
373
377
  msgid "Progress"
374
378
  msgstr ""
375
379
 
376
- #: pyfemtet/_message/messages.py:144
380
+ #: pyfemtet/_message/messages.py:146
377
381
  msgid "Prediction"
378
382
  msgstr ""
379
383
 
380
- #: pyfemtet/_message/messages.py:145
384
+ #: pyfemtet/_message/messages.py:147
381
385
  msgid "Workers"
382
386
  msgstr ""
383
387
 
384
- #: pyfemtet/_message/messages.py:146
388
+ #: pyfemtet/_message/messages.py:148
385
389
  msgid "Details"
386
390
  msgstr ""
387
391
 
388
- #: pyfemtet/_message/messages.py:148
392
+ #: pyfemtet/_message/messages.py:150
389
393
  msgid "Optimization status will be shown here."
390
394
  msgstr ""
391
395
 
392
- #: pyfemtet/_message/messages.py:149
396
+ #: pyfemtet/_message/messages.py:151
393
397
  msgid "Auto-update graph"
394
398
  msgstr ""
395
399
 
396
- #: pyfemtet/_message/messages.py:150
400
+ #: pyfemtet/_message/messages.py:152
397
401
  msgid "Interrupt Optimization"
398
402
  msgstr ""
399
403
 
400
- #: pyfemtet/_message/messages.py:152
404
+ #: pyfemtet/_message/messages.py:154
401
405
  msgid "Result"
402
406
  msgstr ""
403
407
 
404
- #: pyfemtet/_message/messages.py:154
408
+ #: pyfemtet/_message/messages.py:156
405
409
  msgid "Open Result in Femtet"
406
410
  msgstr ""
407
411
 
408
- #: pyfemtet/_message/messages.py:155
412
+ #: pyfemtet/_message/messages.py:157
409
413
  msgid "Reconstruct Model"
410
414
  msgstr ""
411
415
 
412
- #: pyfemtet/_message/messages.py:156
416
+ #: pyfemtet/_message/messages.py:158
413
417
  msgid "Drag and drop or select csv file"
414
418
  msgstr ""
415
419
 
416
- #: pyfemtet/_message/messages.py:157
420
+ #: pyfemtet/_message/messages.py:159
417
421
  msgid "Connection to Femtet is not established. Launch Femtet and Open a project."
418
422
  msgstr ""
419
423
 
420
- #: pyfemtet/_message/messages.py:158
424
+ #: pyfemtet/_message/messages.py:160
421
425
  msgid "No result plot is selected."
422
426
  msgstr ""
423
427
 
424
- #: pyfemtet/_message/messages.py:159
428
+ #: pyfemtet/_message/messages.py:161
425
429
  msgid "The femprj file path in the history csv is not found or valid."
426
430
  msgstr ""
427
431
 
428
- #: pyfemtet/_message/messages.py:160
432
+ #: pyfemtet/_message/messages.py:162
429
433
  msgid "The model name in the history csv is not found."
430
434
  msgstr ""
431
435
 
432
- #: pyfemtet/_message/messages.py:161
436
+ #: pyfemtet/_message/messages.py:163
433
437
  msgid ".pdt file is not found. Please check the .Results folder. Note that .pdt file save mode depends on the `save_pdt` argument of FemtetInterface in optimization script(default to `all`)."
434
438
  msgstr ""
435
439
 
436
- #: pyfemtet/_message/messages.py:166
440
+ #: pyfemtet/_message/messages.py:168
437
441
  msgid "Failed to open "
438
442
  msgstr ""
439
443
 
440
- #: pyfemtet/_message/messages.py:167
444
+ #: pyfemtet/_message/messages.py:169
441
445
  msgid "Specified model is not in current project. Please check opened project. For example, not \"analysis model only\" but your .femprj file."
442
446
  msgstr ""
443
447
 
444
- #: pyfemtet/_message/messages.py:170
448
+ #: pyfemtet/_message/messages.py:172
445
449
  msgid ".femprj file path of the history csv is invalid. Please certify matching between csv and opening .femprj file."
446
450
  msgstr ""
447
451
 
448
- #: pyfemtet/_message/messages.py:171
452
+ #: pyfemtet/_message/messages.py:173
449
453
  msgid "Analysis model name of the history csv is invalid. Please certify matching between csv and opening analysis model."
450
454
  msgstr ""
451
455
 
452
- #: pyfemtet/_message/messages.py:172
456
+ #: pyfemtet/_message/messages.py:174
453
457
  msgid "Analysis model name of the history csv and opened in Femtet is inconsistent. Please certify matching between csv and opening analysis model."
454
458
  msgstr ""
455
459
 
456
- #: pyfemtet/_message/messages.py:173
460
+ #: pyfemtet/_message/messages.py:175
457
461
  msgid "tutorial mode"
458
462
  msgstr ""
459
463
 
460
- #: pyfemtet/_message/messages.py:174
464
+ #: pyfemtet/_message/messages.py:176
461
465
  msgid "Load Sample CSV"
462
466
  msgstr ""
463
467
 
464
- #: pyfemtet/_message/messages.py:175
468
+ #: pyfemtet/_message/messages.py:177
465
469
  msgid "Load CSV"
466
470
  msgstr ""
467
471
 
468
- #: pyfemtet/_message/messages.py:176
472
+ #: pyfemtet/_message/messages.py:178
469
473
  msgid "Open your optimization result. Then connecting to femtet will start automatically. Note that in tutorial mode, this button loads the ready-made sample csv and open sample femprj."
470
474
  msgstr ""
471
475
 
472
- #: pyfemtet/_message/messages.py:178
476
+ #: pyfemtet/_message/messages.py:180
473
477
  msgid "Main Graph"
474
478
  msgstr ""
475
479
 
476
- #: pyfemtet/_message/messages.py:179
480
+ #: pyfemtet/_message/messages.py:181
477
481
  msgid "Here the optimization history is shown. Each plot represents single FEM result. You can pick a result to open the corresponding result in Femtet. "
478
482
  msgstr ""
479
483
 
480
- #: pyfemtet/_message/messages.py:182
484
+ #: pyfemtet/_message/messages.py:184
481
485
  msgid "Open Result"
482
486
  msgstr ""
483
487
 
484
- #: pyfemtet/_message/messages.py:183
488
+ #: pyfemtet/_message/messages.py:185
485
489
  msgid "After pick a point in the main graph, This button shows the corresponding FEM result in Femtet."
486
490
  msgstr ""
487
491
 
488
- #: pyfemtet/_message/messages.py:185
492
+ #: pyfemtet/_message/messages.py:187
489
493
  msgid "Re-connect to Femtet."
490
494
  msgstr ""
491
495
 
492
- #: pyfemtet/_message/messages.py:186
496
+ #: pyfemtet/_message/messages.py:188
493
497
  msgid "Sample csv is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
494
498
  msgstr ""
495
499
 
496
- #: pyfemtet/_message/messages.py:187
500
+ #: pyfemtet/_message/messages.py:189
497
501
  msgid "Sample femprj file is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
498
502
  msgstr ""
499
503
 
500
- #: pyfemtet/_message/messages.py:188
504
+ #: pyfemtet/_message/messages.py:190
501
505
  msgid "Sample femprj result folder is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
502
506
  msgstr ""
503
507
 
504
- #: pyfemtet/_message/messages.py:190
508
+ #: pyfemtet/_message/messages.py:192
505
509
  msgid "Loading data..."
506
510
  msgstr ""
507
511
 
508
- #: pyfemtet/_message/messages.py:191
512
+ #: pyfemtet/_message/messages.py:193
509
513
  msgid "Plots of objectives versus trials"
510
514
  msgstr ""
511
515
 
512
- #: pyfemtet/_message/messages.py:192
516
+ #: pyfemtet/_message/messages.py:194
513
517
  msgid "The vertical axis is the objective, and the horizontal axis is the number of trials."
514
518
  msgstr ""
515
519
 
516
- #: pyfemtet/_message/messages.py:193
520
+ #: pyfemtet/_message/messages.py:195
517
521
  msgid "Parallel coordinate plots"
518
522
  msgstr ""
519
523
 
520
- #: pyfemtet/_message/messages.py:194
524
+ #: pyfemtet/_message/messages.py:196
521
525
  msgid "The vertical axis is an objective or parameters, and one polyline indicates one result."
522
526
  msgstr ""
523
527
 
524
- #: pyfemtet/_message/messages.py:195
528
+ #: pyfemtet/_message/messages.py:197
525
529
  msgid "The heatmap of objectives"
526
530
  msgstr ""
527
531
 
528
- #: pyfemtet/_message/messages.py:196
532
+ #: pyfemtet/_message/messages.py:198
529
533
  msgid "The axes are parameters, and the color shows objective value."
530
534
  msgstr ""
531
535
 
532
- #: pyfemtet/_message/messages.py:197
536
+ #: pyfemtet/_message/messages.py:199
533
537
  msgid "The response of an objective versus one parameter"
534
538
  msgstr ""
535
539
 
536
- #: pyfemtet/_message/messages.py:198
540
+ #: pyfemtet/_message/messages.py:200
537
541
  msgid "The vertical axis is objective, and the horizontal axis is parameter."
538
542
  msgstr ""
539
543
 
@@ -85,6 +85,8 @@ class Message:
85
85
  INFO_TERMINATING_EXCEL = _('Terminating Excel process...')
86
86
  INFO_TERMINATED_EXCEL = _('Excel process is terminated.')
87
87
  INFO_RESTORING_FEMTET_AUTOSAVE = _('Restore Femtet setting of autosave.')
88
+ ERR_PARAMETRIC_CSV_CONTAINS_ERROR = _('Failed to make output from Femtet. '
89
+ 'Please check output settings of Parametric Analysis.')
88
90
 
89
91
  # ===== pyfemtet.opt.optimizer =====
90
92
  ERR_NOT_IMPLEMENTED = _('The following features are not supported by the specified optimization method. ')
pyfemtet/opt/_femopt.py CHANGED
@@ -27,6 +27,7 @@ from pyfemtet.opt._femopt_core import (
27
27
  History,
28
28
  OptimizationStatus,
29
29
  logger,
30
+ MonitorHostRecord,
30
31
  )
31
32
  from pyfemtet._message import Msg, encoding
32
33
  from pyfemtet.opt.optimizer.parameter import Parameter, Expression
@@ -135,6 +136,7 @@ class FEMOpt:
135
136
  self.monitor_process_future = None
136
137
  self.monitor_server_kwargs = dict()
137
138
  self.monitor_process_worker_name = None
139
+ self.monitor_host_record = None
138
140
  self._hv_reference = None
139
141
  self._extra_space_dir = None
140
142
 
@@ -403,7 +405,7 @@ class FEMOpt:
403
405
 
404
406
  if names is not None:
405
407
  if isinstance(names, str):
406
- names = [f'name_{i}' for i in range(n_return)]
408
+ names = [f'{names}_{i}' for i in range(n_return)]
407
409
  else:
408
410
  # names = names
409
411
  pass
@@ -679,11 +681,11 @@ class FEMOpt:
679
681
  # ===== fem の設定 ==--=
680
682
 
681
683
  # Femtet 特有の処理
682
- metadata = None
684
+ extra_data = dict()
683
685
  if isinstance(self.fem, FemtetInterface):
684
686
 
685
687
  # 結果 csv に記載する femprj に関する情報の作成
686
- metadata = json.dumps(
688
+ extra_data.update(
687
689
  dict(
688
690
  femprj_path=self.fem.original_femprj_path,
689
691
  model_name=self.fem.model_name
@@ -774,23 +776,25 @@ class FEMOpt:
774
776
 
775
777
  with self.client.cluster as _cluster, self.client as _client:
776
778
 
777
- # actor の設定
779
+ # ===== status actor の設定 =====
778
780
  self.status = OptimizationStatus(_client, worker_address=self.monitor_process_worker_name)
779
781
  self.worker_status_list = [OptimizationStatus(_client, worker_address=self.monitor_process_worker_name, name=name) for name in worker_addresses] # tqdm 検討
780
782
  self.status.set(OptimizationStatus.SETTING_UP)
783
+ self.monitor_host_record = MonitorHostRecord(_client, self.monitor_process_worker_name)
784
+ logger.info('Status Actor initialized successfully.')
785
+
786
+ # ===== initialize history =====
781
787
  self.history = History(
782
788
  self.history_path,
783
789
  self.opt.variables.get_parameter_names(),
784
790
  list(self.opt.objectives.keys()),
785
791
  list(self.opt.constraints.keys()),
786
792
  _client,
787
- metadata,
788
793
  self._hv_reference
789
794
  )
790
- logger.info('Status Actor initialized successfully.')
791
795
 
796
+ # ===== launch monitor =====
792
797
  # launch monitor
793
- # noinspection PyTypeChecker
794
798
  self.monitor_process_future = _client.submit(
795
799
  # func
796
800
  _start_monitor_server,
@@ -799,6 +803,7 @@ class FEMOpt:
799
803
  self.status,
800
804
  worker_addresses,
801
805
  self.worker_status_list,
806
+ self.monitor_host_record,
802
807
  # kwargs
803
808
  **self.monitor_server_kwargs,
804
809
  # kwargs of submit
@@ -807,6 +812,16 @@ class FEMOpt:
807
812
  )
808
813
  logger.info('Process monitor initialized successfully.')
809
814
 
815
+ # update extra_data of history to notify
816
+ # how to emit interruption signal by
817
+ # external processes
818
+ start = time()
819
+ while len(self.monitor_host_record.get()) == 0:
820
+ sleep(0.1)
821
+ extra_data.update(self.monitor_host_record.get())
822
+ self.history.extra_data.update(extra_data)
823
+
824
+ # ===== setup fem and opt before parallelization =====
810
825
  # fem
811
826
  self.fem._setup_before_parallel(_client)
812
827
 
@@ -817,6 +832,11 @@ class FEMOpt:
817
832
  self.opt.history = self.history
818
833
  self.opt._setup_before_parallel()
819
834
 
835
+ # ===== 最適化ループ開始 =====
836
+ # opt から non-serializable な com を
837
+ # 有している可能性のある fem を削除
838
+ # ただし main process の sub thread では
839
+ # これをそのまま使うので buff に退避
820
840
  buff = self.opt.fem
821
841
  del self.opt.fem
822
842
 
@@ -832,8 +852,12 @@ class FEMOpt:
832
852
  allow_other_workers=False,
833
853
  )
834
854
 
855
+ # 退避した fem を戻す
835
856
  self.opt.fem = buff
836
857
 
858
+ # リモートクラスタではない場合
859
+ # main process の sub thread で
860
+ # 計算開始
837
861
  t_main = None
838
862
  if not self.opt.is_cluster:
839
863
  # ローカルプロセスでの計算(opt._run 相当の処理)
@@ -857,7 +881,7 @@ class FEMOpt:
857
881
  )
858
882
  t_main.start()
859
883
 
860
- # save history
884
+ # ===== save history during optimization =====
861
885
  def save_history():
862
886
  while True:
863
887
  sleep(2)
@@ -872,7 +896,6 @@ class FEMOpt:
872
896
  t_save_history.start()
873
897
 
874
898
  # ===== 終了 =====
875
-
876
899
  # クラスターの Unexpected Exception のリストを取得
877
900
  opt_exceptions: list[Exception or None] = _client.gather(calc_futures) # gather() で終了待ちも兼ねる
878
901
 
@@ -884,7 +907,7 @@ class FEMOpt:
884
907
  local_opt_exception = self.opt._exception # Exception を取得
885
908
  opt_exceptions.append(local_opt_exception)
886
909
 
887
- # 終了
910
+ # 終了シグナルを送る
888
911
  self.status.set(OptimizationStatus.TERMINATED)
889
912
  end = time()
890
913
 
@@ -910,6 +933,8 @@ class FEMOpt:
910
933
  print()
911
934
 
912
935
  # monitor worker を残してユーザーが結果を確認できるようにする
936
+ # with 文を抜けると monitor worker が終了して
937
+ # daemon thread である run_forever が終了する
913
938
  if confirm_before_exit:
914
939
  print()
915
940
  print('='*len(Msg.CONFIRM_BEFORE_EXIT))
@@ -945,6 +970,7 @@ def _start_monitor_server(
945
970
  status,
946
971
  worker_addresses,
947
972
  worker_status_list,
973
+ host_record,
948
974
  host=None,
949
975
  port=None,
950
976
  ):
@@ -955,5 +981,6 @@ def _start_monitor_server(
955
981
  worker_status_list,
956
982
  host,
957
983
  port,
984
+ host_record,
958
985
  )
959
986
  return 'Exit monitor server process gracefully'