pyfemtet 0.9.5__py3-none-any.whl → 1.0.0b0__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 +6 -1
- pyfemtet/_i18n/1. make_pot_and_update_po.bat +8 -0
- pyfemtet/_i18n/2. build_mo.bat +5 -0
- pyfemtet/_i18n/__init__.py +4 -0
- pyfemtet/_i18n/babel.cfg +2 -0
- pyfemtet/_i18n/i18n.py +37 -0
- pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- pyfemtet/_i18n/locales/ja/LC_MESSAGES/messages.po +1020 -0
- pyfemtet/_i18n/locales/messages.pot +987 -0
- pyfemtet/{_message → _i18n}/messages.py +128 -41
- pyfemtet/_util/closing.py +19 -0
- pyfemtet/_util/dask_util.py +89 -7
- pyfemtet/_util/df_util.py +29 -0
- pyfemtet/_util/excel_macro_util.py +8 -3
- pyfemtet/_util/excel_parse_util.py +43 -23
- pyfemtet/_util/femtet_access_inspection.py +120 -0
- pyfemtet/{_femtet_config_util/autosave.py → _util/femtet_autosave.py} +7 -0
- pyfemtet/_util/femtet_exit.py +105 -0
- pyfemtet/_util/femtet_version.py +20 -0
- pyfemtet/_util/helper.py +94 -0
- pyfemtet/_util/process_util.py +107 -0
- pyfemtet/_util/str_enum.py +44 -0
- pyfemtet/core.py +15 -47
- pyfemtet/dispatch_extensions/__init__.py +8 -11
- pyfemtet/dispatch_extensions/_impl.py +42 -198
- pyfemtet/logger/__init__.py +8 -1
- pyfemtet/logger/_impl.py +5 -6
- pyfemtet/opt/__init__.py +3 -17
- pyfemtet/opt/exceptions.py +45 -0
- pyfemtet/opt/femopt.py +608 -0
- pyfemtet/opt/history/__init__.py +11 -0
- pyfemtet/opt/history/_history.py +1404 -0
- pyfemtet/opt/history/_hypervolume.py +169 -0
- pyfemtet/opt/history/_optimality.py +79 -0
- pyfemtet/opt/interface/__init__.py +17 -24
- pyfemtet/opt/interface/_base_interface.py +222 -0
- pyfemtet/opt/interface/_excel_interface/__init__.py +3 -0
- pyfemtet/opt/interface/_excel_interface/debug-excel-interface.xlsm +0 -0
- pyfemtet/opt/interface/_excel_interface/excel_interface.py +999 -0
- pyfemtet/opt/interface/_femtet_interface/__init__.py +3 -0
- pyfemtet/opt/interface/{_femtet_parametric.py → _femtet_interface/_femtet_parametric.py} +20 -12
- pyfemtet/opt/interface/{_femtet.py → _femtet_interface/femtet_interface.py} +505 -349
- pyfemtet/opt/interface/_femtet_with_nx_interface/__init__.py +5 -0
- pyfemtet/opt/interface/_femtet_with_nx_interface/femtet_with_nx_interface.py +230 -0
- pyfemtet/opt/interface/_femtet_with_nx_interface/model1.prt +0 -0
- pyfemtet/opt/interface/_femtet_with_nx_interface/model1.x_t +98 -0
- pyfemtet/opt/interface/{_femtet_with_nx → _femtet_with_nx_interface}/update_model.py +1 -3
- pyfemtet/opt/interface/_femtet_with_solidworks/__init__.py +5 -0
- pyfemtet/opt/interface/_femtet_with_solidworks/femtet_with_solidworks_interface.py +122 -0
- pyfemtet/opt/interface/_solidworks_interface/__init__.py +5 -0
- pyfemtet/opt/interface/_solidworks_interface/solidworks_interface.py +206 -0
- pyfemtet/opt/interface/_surrogate_model_interface/__init__.py +8 -0
- pyfemtet/opt/interface/_surrogate_model_interface/base_surrogate_interface.py +150 -0
- pyfemtet/opt/interface/_surrogate_model_interface/botorch_interface.py +298 -0
- pyfemtet/opt/interface/_surrogate_model_interface/debug-pof-botorch.reccsv +18 -0
- pyfemtet/opt/interface/_with_excel_settings/__init__.py +61 -0
- pyfemtet/opt/interface/_with_excel_settings/with_excel_settings.py +134 -0
- pyfemtet/opt/meta_script/YAML_Generator.xlsm +0 -0
- pyfemtet/opt/meta_script/__main__.py +58 -36
- pyfemtet/opt/optimizer/__init__.py +7 -9
- pyfemtet/opt/optimizer/_base_optimizer.py +885 -0
- pyfemtet/opt/optimizer/optuna_optimizer/__init__.py +9 -0
- pyfemtet/opt/optimizer/optuna_optimizer/_optuna_attribute.py +73 -0
- pyfemtet/opt/optimizer/optuna_optimizer/_optuna_optimizer.py +678 -0
- pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/__init__.py +7 -0
- pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/debug-pof-botorch.reccsv +18 -0
- pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/enable_nonlinear_constraint.py +244 -0
- pyfemtet/opt/optimizer/optuna_optimizer/_pof_botorch/pof_botorch_sampler.py +1249 -0
- pyfemtet/opt/optimizer/optuna_optimizer/wat_ex14_parametric_jp.femprj +0 -0
- pyfemtet/opt/optimizer/scipy_optimizer/__init__.py +1 -0
- pyfemtet/opt/optimizer/scipy_optimizer/_scipy_optimizer.py +364 -0
- pyfemtet/opt/prediction/__init__.py +7 -0
- pyfemtet/opt/prediction/_botorch_utils.py +133 -0
- pyfemtet/opt/prediction/_gpytorch_modules_extension.py +142 -0
- pyfemtet/opt/prediction/_helper.py +155 -0
- pyfemtet/opt/prediction/_model.py +118 -0
- pyfemtet/opt/problem/problem.py +304 -0
- pyfemtet/opt/problem/variable_manager/__init__.py +20 -0
- pyfemtet/opt/problem/variable_manager/_string_as_expression.py +115 -0
- pyfemtet/opt/problem/variable_manager/_variable_manager.py +295 -0
- pyfemtet/opt/visualization/history_viewer/__main__.py +5 -0
- pyfemtet/opt/visualization/{_base.py → history_viewer/_base_application.py} +18 -13
- pyfemtet/opt/visualization/history_viewer/_common_pages.py +150 -0
- pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/alert_region.py +10 -5
- pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/control_femtet.py +16 -13
- pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/main_graph.py +117 -47
- pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/pm_graph.py +159 -138
- pyfemtet/opt/visualization/history_viewer/_process_monitor/_application.py +173 -0
- pyfemtet/opt/visualization/history_viewer/_process_monitor/_pages.py +291 -0
- pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/dbc.py +1 -1
- pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/dcc.py +1 -1
- pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/html.py +1 -1
- pyfemtet/opt/visualization/history_viewer/result_viewer/__main__.py +5 -0
- pyfemtet/opt/visualization/{result_viewer/application.py → history_viewer/result_viewer/_application.py} +6 -6
- pyfemtet/opt/visualization/{result_viewer/pages.py → history_viewer/result_viewer/_pages.py} +106 -82
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.csv +18 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08.db +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.log +45 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_1.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_1.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_10.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_10.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_11.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_11.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_12.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_12.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_13.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_13.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_14.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_14.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_15.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_15.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_16.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_16.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_17.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_17.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_18.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_18.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_19.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_19.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_2.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_2.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_20.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_20.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_3.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_3.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.bgr +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.bnd +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.btr +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.mtl +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_4.prm +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_5.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_5.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_6.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_6.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_7.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_7.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_8.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_8.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_9.jpg +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.Results/ex8_trial_9.pdt +0 -0
- pyfemtet/opt/visualization/history_viewer/result_viewer/tutorial_files/tutorial_gau_ex08_parametric.femprj +0 -0
- pyfemtet/opt/visualization/plotter/main_figure_creator.py +536 -0
- pyfemtet/opt/visualization/plotter/pm_graph_creator.py +359 -0
- pyfemtet/opt/worker_status.py +120 -0
- {pyfemtet-0.9.5.dist-info → pyfemtet-1.0.0b0.dist-info}/METADATA +23 -24
- pyfemtet-1.0.0b0.dist-info/RECORD +172 -0
- pyfemtet-1.0.0b0.dist-info/entry_points.txt +3 -0
- pyfemtet/_femtet_config_util/exit.py +0 -59
- pyfemtet/_message/1. make_pot.bat +0 -11
- pyfemtet/_message/2. make_mo.bat +0 -6
- pyfemtet/_message/__init__.py +0 -5
- pyfemtet/_message/babel.cfg +0 -2
- pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo +0 -0
- pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po +0 -570
- pyfemtet/_message/locales/messages.pot +0 -551
- pyfemtet/_warning.py +0 -87
- pyfemtet/brep/_impl.py +0 -18
- pyfemtet/opt/_femopt.py +0 -1007
- pyfemtet/opt/_femopt_core.py +0 -1169
- pyfemtet/opt/_test_utils/control_femtet.py +0 -39
- pyfemtet/opt/_test_utils/hyper_sphere.py +0 -24
- pyfemtet/opt/_test_utils/record_history.py +0 -130
- pyfemtet/opt/advanced_samples/excel_ui/(ref) original_project.femprj +0 -0
- pyfemtet/opt/advanced_samples/excel_ui/femtet-macro.xlsm +0 -0
- pyfemtet/opt/advanced_samples/excel_ui/pyfemtet-core.py +0 -291
- pyfemtet/opt/advanced_samples/excel_ui/test-pyfemtet-core.cmd +0 -22
- pyfemtet/opt/advanced_samples/restart/gal_ex13_parametric.femprj +0 -0
- pyfemtet/opt/advanced_samples/restart/gal_ex13_parametric_restart.py +0 -99
- pyfemtet/opt/advanced_samples/restart/gal_ex13_parametric_restart_jp.py +0 -102
- pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_create_training_data.py +0 -60
- pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_create_training_data_jp.py +0 -57
- pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate.py +0 -100
- pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate_jp.py +0 -90
- pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_parametric.femprj +0 -0
- pyfemtet/opt/interface/_base.py +0 -101
- pyfemtet/opt/interface/_excel_interface.py +0 -984
- pyfemtet/opt/interface/_femtet_excel.py +0 -141
- pyfemtet/opt/interface/_femtet_with_nx/__init__.py +0 -3
- pyfemtet/opt/interface/_femtet_with_nx/_interface.py +0 -178
- pyfemtet/opt/interface/_femtet_with_sldworks.py +0 -298
- pyfemtet/opt/interface/_surrogate/__init__.py +0 -5
- pyfemtet/opt/interface/_surrogate/_base.py +0 -129
- pyfemtet/opt/interface/_surrogate/_chaospy.py +0 -71
- pyfemtet/opt/interface/_surrogate/_singletaskgp.py +0 -71
- pyfemtet/opt/interface/_surrogate_excel.py +0 -102
- pyfemtet/opt/optimizer/_base.py +0 -376
- pyfemtet/opt/optimizer/_optuna/_botorch_patch/enable_nonlinear_constraint.py +0 -220
- pyfemtet/opt/optimizer/_optuna/_optuna.py +0 -434
- pyfemtet/opt/optimizer/_optuna/_pof_botorch.py +0 -1914
- pyfemtet/opt/optimizer/_scipy.py +0 -159
- pyfemtet/opt/optimizer/_scipy_scalar.py +0 -127
- pyfemtet/opt/optimizer/parameter.py +0 -113
- pyfemtet/opt/prediction/_base.py +0 -61
- pyfemtet/opt/prediction/single_task_gp.py +0 -119
- pyfemtet/opt/samples/femprj_sample/ParametricIF.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/ParametricIF.py +0 -29
- pyfemtet/opt/samples/femprj_sample/ParametricIF_test_result.reccsv +0 -13
- pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.prt +0 -0
- pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.py +0 -135
- pyfemtet/opt/samples/femprj_sample/cad_ex01_NX_test_result.reccsv +0 -23
- pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.SLDPRT +0 -0
- pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.py +0 -131
- pyfemtet/opt/samples/femprj_sample/cad_ex01_SW_test_result.reccsv +0 -23
- pyfemtet/opt/samples/femprj_sample/constrained_pipe.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/constrained_pipe.py +0 -96
- pyfemtet/opt/samples/femprj_sample/constrained_pipe_test_result.reccsv +0 -13
- pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric.py +0 -74
- pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric_test_result.reccsv +0 -13
- pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric.py +0 -58
- pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric_test_result.reccsv +0 -23
- pyfemtet/opt/samples/femprj_sample/gau_ex12_parametric.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/gau_ex12_parametric.py +0 -52
- pyfemtet/opt/samples/femprj_sample/her_ex40_parametric.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/her_ex40_parametric.py +0 -138
- pyfemtet/opt/samples/femprj_sample/her_ex40_parametric_test_result.reccsv +0 -18
- pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric.py +0 -60
- pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric_parallel.py +0 -61
- pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric_test_result.reccsv +0 -18
- pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric.py +0 -58
- pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric_parallel.py +0 -58
- pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric_test_result.reccsv +0 -18
- pyfemtet/opt/samples/femprj_sample_jp/ParametricIF_jp.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample_jp/ParametricIF_jp.py +0 -29
- pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_NX_jp.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_NX_jp.py +0 -129
- pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_SW_jp.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_SW_jp.py +0 -125
- pyfemtet/opt/samples/femprj_sample_jp/constrained_pipe_jp.py +0 -93
- pyfemtet/opt/samples/femprj_sample_jp/gal_ex58_parametric_jp.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample_jp/gal_ex58_parametric_jp.py +0 -70
- pyfemtet/opt/samples/femprj_sample_jp/gau_ex08_parametric_jp.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample_jp/gau_ex08_parametric_jp.py +0 -57
- pyfemtet/opt/samples/femprj_sample_jp/gau_ex12_parametric_jp.py +0 -52
- pyfemtet/opt/samples/femprj_sample_jp/her_ex40_parametric_jp.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample_jp/her_ex40_parametric_jp.py +0 -138
- pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_jp.femprj +0 -0
- pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_jp.py +0 -58
- pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_parallel_jp.py +0 -59
- pyfemtet/opt/samples/femprj_sample_jp/wat_ex14_parametric_jp.py +0 -56
- pyfemtet/opt/samples/femprj_sample_jp/wat_ex14_parametric_parallel_jp.py +0 -56
- pyfemtet/opt/visualization/_complex_components/main_figure_creator.py +0 -332
- pyfemtet/opt/visualization/_complex_components/pm_graph_creator.py +0 -201
- pyfemtet/opt/visualization/_process_monitor/application.py +0 -226
- pyfemtet/opt/visualization/_process_monitor/pages.py +0 -406
- pyfemtet/opt/visualization/_wrapped_components/__init__.py +0 -0
- pyfemtet/opt/visualization/result_viewer/__init__.py +0 -0
- pyfemtet-0.9.5.dist-info/RECORD +0 -158
- pyfemtet-0.9.5.dist-info/entry_points.txt +0 -3
- /pyfemtet/{_femtet_config_util → opt/problem}/__init__.py +0 -0
- /pyfemtet/{brep → opt/visualization/history_viewer}/__init__.py +0 -0
- /pyfemtet/opt/{_test_utils → visualization/history_viewer/_complex_components}/__init__.py +0 -0
- /pyfemtet/opt/{optimizer/_optuna → visualization/history_viewer/_process_monitor}/__init__.py +0 -0
- /pyfemtet/opt/{optimizer/_optuna/_botorch_patch → visualization/history_viewer/_wrapped_components}/__init__.py +0 -0
- /pyfemtet/opt/visualization/{_wrapped_components → history_viewer/_wrapped_components}/str_enum.py +0 -0
- /pyfemtet/opt/visualization/{result_viewer → history_viewer/result_viewer}/.gitignore +0 -0
- /pyfemtet/opt/visualization/{_complex_components → history_viewer/result_viewer}/__init__.py +0 -0
- /pyfemtet/opt/visualization/{_process_monitor → plotter}/__init__.py +0 -0
- /pyfemtet/opt/{samples/femprj_sample_jp/wat_ex14_parametric_jp.femprj → wat_ex14_parametric_jp.femprj} +0 -0
- {pyfemtet-0.9.5.dist-info → pyfemtet-1.0.0b0.dist-info}/LICENSE +0 -0
- {pyfemtet-0.9.5.dist-info → pyfemtet-1.0.0b0.dist-info}/LICENSE_THIRD_PARTY.txt +0 -0
- {pyfemtet-0.9.5.dist-info → pyfemtet-1.0.0b0.dist-info}/WHEEL +0 -0
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
# type hint
|
|
2
|
-
from dash.development.base_component import Component
|
|
3
|
-
|
|
4
1
|
# callback
|
|
5
|
-
from dash import Output, Input,
|
|
2
|
+
from dash import Output, Input, no_update, callback_context
|
|
6
3
|
from dash.exceptions import PreventUpdate
|
|
7
4
|
|
|
8
5
|
# components
|
|
9
|
-
from pyfemtet.opt.visualization._wrapped_components import html
|
|
6
|
+
from pyfemtet.opt.visualization.history_viewer._wrapped_components import html
|
|
7
|
+
from pyfemtet.opt.visualization.history_viewer._wrapped_components import dbc
|
|
10
8
|
|
|
11
9
|
# the others
|
|
12
|
-
import logging
|
|
13
10
|
import os
|
|
14
11
|
from enum import Enum
|
|
15
12
|
import json
|
|
16
13
|
# noinspection PyUnresolvedReferences
|
|
17
14
|
from pythoncom import com_error
|
|
18
15
|
|
|
19
|
-
from pyfemtet.opt.visualization.
|
|
20
|
-
from pyfemtet.opt.interface
|
|
21
|
-
from pyfemtet.
|
|
16
|
+
from pyfemtet.opt.visualization.history_viewer._base_application import AbstractPage
|
|
17
|
+
from pyfemtet.opt.interface import FemtetInterface
|
|
18
|
+
from pyfemtet._i18n import Msg
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
'FemtetState',
|
|
23
|
+
'FemtetControl',
|
|
24
|
+
]
|
|
22
25
|
|
|
23
26
|
|
|
24
27
|
class FemtetState(Enum):
|
|
@@ -32,7 +35,7 @@ class FemtetControl(AbstractPage):
|
|
|
32
35
|
|
|
33
36
|
def __init__(self):
|
|
34
37
|
super().__init__()
|
|
35
|
-
self.fem: FemtetInterface = None
|
|
38
|
+
self.fem: FemtetInterface | None = None
|
|
36
39
|
|
|
37
40
|
def setup_component(self):
|
|
38
41
|
|
|
@@ -141,15 +144,15 @@ class FemtetControl(AbstractPage):
|
|
|
141
144
|
return kwargs, Msg.WARN_HISTORY_CSV_NOT_READ
|
|
142
145
|
|
|
143
146
|
# get extra_data
|
|
144
|
-
extra_data = self.application.history.
|
|
147
|
+
extra_data = self.application.history.additional_data
|
|
145
148
|
|
|
146
149
|
# check extra_data exists
|
|
147
|
-
if extra_data
|
|
150
|
+
if not extra_data:
|
|
148
151
|
return kwargs, Msg.WARN_INVALID_METADATA
|
|
149
152
|
|
|
150
153
|
# check the extra_data is valid json
|
|
151
154
|
try:
|
|
152
|
-
d =
|
|
155
|
+
d = extra_data
|
|
153
156
|
femprj_path = os.path.abspath(d['femprj_path'])
|
|
154
157
|
except (TypeError, json.decoder.JSONDecodeError, KeyError):
|
|
155
158
|
return kwargs, Msg.WARN_INVALID_METADATA
|
pyfemtet/opt/visualization/{_complex_components → history_viewer/_complex_components}/main_graph.py
RENAMED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import base64
|
|
3
|
+
from time import time
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
1
7
|
# type hint
|
|
2
8
|
from dash.development.base_component import Component
|
|
3
9
|
|
|
@@ -7,22 +13,23 @@ from dash.exceptions import PreventUpdate
|
|
|
7
13
|
|
|
8
14
|
# components
|
|
9
15
|
from dash import dash_table
|
|
10
|
-
from pyfemtet.opt.visualization._wrapped_components import html
|
|
16
|
+
from pyfemtet.opt.visualization.history_viewer._wrapped_components import html
|
|
17
|
+
from pyfemtet.opt.visualization.history_viewer._wrapped_components import dcc, dbc
|
|
11
18
|
|
|
12
19
|
# graph
|
|
13
20
|
import pandas as pd
|
|
14
21
|
# import plotly.express as px
|
|
15
22
|
import plotly.graph_objs as go
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
|
|
21
|
-
import numpy as np
|
|
24
|
+
from pyfemtet.opt.visualization.plotter import main_figure_creator
|
|
25
|
+
from pyfemtet.opt.visualization.history_viewer._base_application import AbstractPage, logger
|
|
26
|
+
from pyfemtet._i18n import Msg
|
|
27
|
+
|
|
22
28
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
__all__ = [
|
|
30
|
+
'FLEXBOX_STYLE_ALLOW_VERTICAL_FILL',
|
|
31
|
+
'MainGraph',
|
|
32
|
+
]
|
|
26
33
|
|
|
27
34
|
|
|
28
35
|
FLEXBOX_STYLE_ALLOW_VERTICAL_FILL = {
|
|
@@ -82,13 +89,19 @@ class MainGraph(AbstractPage):
|
|
|
82
89
|
]
|
|
83
90
|
|
|
84
91
|
def setup_component(self):
|
|
85
|
-
self.
|
|
92
|
+
self.callback_chain_arg_keep_range = 'data-keep-range' # must be starts with "data-"
|
|
93
|
+
self.callback_chain_key = html.Data(
|
|
94
|
+
id='main-graph-callback-key',
|
|
95
|
+
**{self.callback_chain_arg_keep_range: False}
|
|
96
|
+
)
|
|
97
|
+
|
|
86
98
|
self.location = dcc.Location(id='main-graph-location', refresh=True)
|
|
87
99
|
|
|
88
100
|
# setup header
|
|
89
101
|
tab_list = []
|
|
90
102
|
for d in self.figure_creators:
|
|
91
|
-
|
|
103
|
+
# Objective plot tab is only shown in obj_names > 3. Set this via callback.
|
|
104
|
+
is_objective_plot = d['tab_id'] == self.TAB_ID_OBJECTIVE_PLOT
|
|
92
105
|
is_hypervolume_plot = d['tab_id'] == self.TAB_ID_HYPERVOLUME_PLOT # same above
|
|
93
106
|
|
|
94
107
|
if is_objective_plot or is_hypervolume_plot:
|
|
@@ -184,7 +197,7 @@ class MainGraph(AbstractPage):
|
|
|
184
197
|
# setup component
|
|
185
198
|
self.graph_card = dbc.Card(
|
|
186
199
|
[
|
|
187
|
-
self.
|
|
200
|
+
self.callback_chain_key,
|
|
188
201
|
self.location,
|
|
189
202
|
self.data_length,
|
|
190
203
|
self.card_header,
|
|
@@ -204,8 +217,11 @@ class MainGraph(AbstractPage):
|
|
|
204
217
|
app = self.application.app
|
|
205
218
|
|
|
206
219
|
# ===== Change visibility of plot tab =====
|
|
220
|
+
# noinspection PyUnresolvedReferences
|
|
207
221
|
objective_plot_tab = [t for t in self.tab_list if t.tab_id == self.TAB_ID_OBJECTIVE_PLOT][0]
|
|
222
|
+
# noinspection PyUnresolvedReferences
|
|
208
223
|
hypervolume_plot_tab = [t for t in self.tab_list if t.tab_id == self.TAB_ID_HYPERVOLUME_PLOT][0]
|
|
224
|
+
|
|
209
225
|
@app.callback(
|
|
210
226
|
output=(
|
|
211
227
|
Output(objective_plot_tab, 'tab_style'),
|
|
@@ -414,26 +430,84 @@ class MainGraph(AbstractPage):
|
|
|
414
430
|
Output(self.data_length.id, self.data_length_prop), # To determine whether Process Monitor should update the graph, the main graph remembers the current amount of data.
|
|
415
431
|
inputs=dict(
|
|
416
432
|
active_tab_id=Input(self.tabs.id, 'active_tab'),
|
|
417
|
-
|
|
433
|
+
keep_range=Input(self.callback_chain_key, self.callback_chain_arg_keep_range), # entry point of callback chain from MonitorApplication.HomePage
|
|
418
434
|
is_3d=Input(self.switch_3d, 'value'),
|
|
419
|
-
|
|
435
|
+
selected_obj_names=(
|
|
420
436
|
Input(self.axis1_dropdown, 'label'),
|
|
421
437
|
Input(self.axis2_dropdown, 'label'),
|
|
422
438
|
Input(self.axis3_dropdown, 'label'),
|
|
423
439
|
),
|
|
424
440
|
),
|
|
441
|
+
state=dict(
|
|
442
|
+
current_figure=State(self.graph.id, 'figure'),
|
|
443
|
+
),
|
|
425
444
|
prevent_initial_call=False,
|
|
426
445
|
)
|
|
427
|
-
def redraw_main_graph(
|
|
446
|
+
def redraw_main_graph(
|
|
447
|
+
active_tab_id: str,
|
|
448
|
+
keep_range,
|
|
449
|
+
is_3d: bool,
|
|
450
|
+
selected_obj_names: tuple[str | None, str | None, str | None],
|
|
451
|
+
current_figure: dict,
|
|
452
|
+
):
|
|
428
453
|
kwargs = {}
|
|
429
454
|
if active_tab_id == self.TAB_ID_OBJECTIVE_PLOT:
|
|
430
455
|
if not is_3d:
|
|
431
|
-
|
|
456
|
+
selected_obj_names = selected_obj_names[:-1]
|
|
432
457
|
kwargs = dict(
|
|
433
|
-
obj_names=
|
|
458
|
+
obj_names=selected_obj_names
|
|
434
459
|
)
|
|
435
|
-
|
|
436
|
-
|
|
460
|
+
new_figure: go.Figure
|
|
461
|
+
new_figure, new_length = self.get_fig_by_tab_id(active_tab_id, with_length=True, kwargs=kwargs)
|
|
462
|
+
|
|
463
|
+
# ===== UI の状態をグラフの更新前後で保持 =====
|
|
464
|
+
|
|
465
|
+
# https://community.plotly.com/t/preserving-ui-state-like-zoom-in-dcc-graph-with-uirevision-with-dash/15793
|
|
466
|
+
|
|
467
|
+
# 一括で維持する設定
|
|
468
|
+
new_figure.layout.uirevision = 'dont change' # bool(str | Real) must be True
|
|
469
|
+
|
|
470
|
+
# 軸範囲は更新したいので別管理(こちらが優先される)
|
|
471
|
+
change_x_range = (not keep_range) or (len(self.application.history.obj_names) == 1)
|
|
472
|
+
change_y_range = not keep_range
|
|
473
|
+
|
|
474
|
+
# Splom, Scatter 共通の API で処理可能
|
|
475
|
+
def update_axis_uirevision(key_base, should_change):
|
|
476
|
+
# 各 dimension について処理を開始
|
|
477
|
+
# Splom, Scatter 共通で処理可能
|
|
478
|
+
for i in range(len(self.application.history.obj_names)):
|
|
479
|
+
|
|
480
|
+
# Splom の layout 中の axis 命名規則に対応した key を作成
|
|
481
|
+
# dim0: 'xaxis', dim1: 'xaxis2', dim2: 'xaxis3'...
|
|
482
|
+
if i == 0:
|
|
483
|
+
key_suffix = ''
|
|
484
|
+
else:
|
|
485
|
+
key_suffix = str(i + 1)
|
|
486
|
+
key = f'{key_base}{key_suffix}'
|
|
487
|
+
|
|
488
|
+
# main_figure_creator で Splom に細工をしているので
|
|
489
|
+
# 存在しない key がある
|
|
490
|
+
if key in current_figure['layout']:
|
|
491
|
+
|
|
492
|
+
# uirevision を決める
|
|
493
|
+
if should_change:
|
|
494
|
+
uirevision = time()
|
|
495
|
+
else:
|
|
496
|
+
new_figure.update_layout(
|
|
497
|
+
**{key: dict(autorange=False)}
|
|
498
|
+
)
|
|
499
|
+
uirevision = current_figure['layout'][key].get('uirevision', f'dont change {key}')
|
|
500
|
+
|
|
501
|
+
# set revision
|
|
502
|
+
if uirevision is not None:
|
|
503
|
+
new_figure.update_layout(
|
|
504
|
+
**{key: dict(uirevision=uirevision)}
|
|
505
|
+
)
|
|
506
|
+
|
|
507
|
+
update_axis_uirevision('xaxis', change_x_range)
|
|
508
|
+
update_axis_uirevision('yaxis', change_y_range)
|
|
509
|
+
|
|
510
|
+
return new_figure, new_length
|
|
437
511
|
|
|
438
512
|
# ===== Save Selection =====
|
|
439
513
|
@app.callback(
|
|
@@ -443,6 +517,7 @@ class MainGraph(AbstractPage):
|
|
|
443
517
|
return data
|
|
444
518
|
|
|
445
519
|
# ===== Show Image and Parameter on Hover =====
|
|
520
|
+
# noinspection PyPep8Naming
|
|
446
521
|
@app.callback(
|
|
447
522
|
Output(self.tooltip.id, "show"),
|
|
448
523
|
Output(self.tooltip.id, "bbox"),
|
|
@@ -458,10 +533,6 @@ class MainGraph(AbstractPage):
|
|
|
458
533
|
if self.application.history is None:
|
|
459
534
|
raise PreventUpdate
|
|
460
535
|
|
|
461
|
-
# pt = {'curveNumber': 1, 'pointNumber': 0, 'pointIndex': 0, 'x': 1, 'y': 2369132.929996869, 'bbox': {'x0': 341.5, 'x1': 350.5, 'y0': 235, 'y1': 244}, 'customdata': [1]}
|
|
462
|
-
# bbox = {'x0': 341.5, 'x1': 350.5, 'y0': 235, 'y1': 244} # point の大きさ?
|
|
463
|
-
# figure = {'data': [{'customdata': [[1], [2], [3], [4], [5]], 'marker': {'color': '#6c757d', 'size': 6}, 'mode': 'markers', 'name': 'すべての解', 'x': [1, 2, 3, 4, 5], 'y': [2369132.929996866, 5797829.746579617, 1977631.590419346, 2083867.2403273676, 1539203.6452652698], 'type': 'scatter', 'hoverinfo': 'none'}, {'customdata': [[1], [3], [5]], 'legendgroup': 'optimal', 'line': {'color': '#6c757d', 'width': 1}, 'marker': {'color': '#007bff', 'size': 9}, 'mode': 'markers+lines', 'name': '最適解の推移', 'x': [1, 3, 5], 'y': [2369132.929996866, 1977631.590419346, 1539203.6452652698], 'type': 'scatter', 'hoverinfo': 'none'}, {'legendgroup': 'optimal', 'line': {'color': '#6c757d', 'dash': 'dash', 'width': 0.5}, 'mode': 'lines', 'showlegend': False, 'x': [5, 5], 'y': [1539203.6452652698, 1539203.6452652698], 'type': 'scatter', 'hoverinfo': 'none'}], 'layout': {'template': {'data': {'histogram2dcontour': [{'type': 'histogram2dcontour', 'colorbar': {'outlinewidth': 0, 'ticks': ''}, 'colorscale': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']]}], 'choropleth': [{'type': 'choropleth', 'colorbar': {'outlinewidth': 0, 'ticks': ''}}], 'histogram2d': [{'type': 'histogram2d', 'colorbar': {'outlinewidth': 0, 'ticks': ''}, 'colorscale': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']]}], 'heatmap': [{'type': 'heatmap', 'colorbar': {'outlinewidth': 0, 'ticks': ''}, 'colorscale': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']]}], 'heatmapgl': [{'type': 'heatmapgl', 'colorbar': {'outlinewidth': 0, 'ticks': ''}, 'colorscale': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']]}], 'contourcarpet': [{'type': 'contourcarpet', 'colorbar': {'outlinewidth': 0, 'ticks': ''}}], 'contour': [{'type': 'contour', 'colorbar': {'outlinewidth': 0, 'ticks': ''}, 'colorscale': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']]}], 'surface': [{'type': 'surface', 'colorbar': {'outlinewidth': 0, 'ticks': ''}, 'colorscale': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']]}], 'mesh3d': [{'type': 'mesh3d', 'colorbar': {'outlinewidth': 0, 'ticks': ''}}], 'scatter': [{'fillpattern': {'fillmode': 'overlay', 'size': 10, 'solidity': 0.2}, 'type': 'scatter'}], 'parcoords': [{'type': 'parcoords', 'line': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'scatterpolargl': [{'type': 'scatterpolargl', 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'bar': [{'error_x': {'color': '#2a3f5f'}, 'error_y': {'color': '#2a3f5f'}, 'marker': {'line': {'color': '#E5ECF6', 'width': 0.5}, 'pattern': {'fillmode': 'overlay', 'size': 10, 'solidity': 0.2}}, 'type': 'bar'}], 'scattergeo': [{'type': 'scattergeo', 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'scatterpolar': [{'type': 'scatterpolar', 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'histogram': [{'marker': {'pattern': {'fillmode': 'overlay', 'size': 10, 'solidity': 0.2}}, 'type': 'histogram'}], 'scattergl': [{'type': 'scattergl', 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'scatter3d': [{'type': 'scatter3d', 'line': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}, 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'scattermapbox': [{'type': 'scattermapbox', 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'scatterternary': [{'type': 'scatterternary', 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'scattercarpet': [{'type': 'scattercarpet', 'marker': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}}], 'carpet': [{'aaxis': {'endlinecolor': '#2a3f5f', 'gridcolor': 'white', 'linecolor': 'white', 'minorgridcolor': 'white', 'startlinecolor': '#2a3f5f'}, 'baxis': {'endlinecolor': '#2a3f5f', 'gridcolor': 'white', 'linecolor': 'white', 'minorgridcolor': 'white', 'startlinecolor': '#2a3f5f'}, 'type': 'carpet'}], 'table': [{'cells': {'fill': {'color': '#EBF0F8'}, 'line': {'color': 'white'}}, 'header': {'fill': {'color': '#C8D4E3'}, 'line': {'color': 'white'}}, 'type': 'table'}], 'barpolar': [{'marker': {'line': {'color': '#E5ECF6', 'width': 0.5}, 'pattern': {'fillmode': 'overlay', 'size': 10, 'solidity': 0.2}}, 'type': 'barpolar'}], 'pie': [{'automargin': True, 'type': 'pie'}]}, 'layout': {'autotypenumbers': 'strict', 'colorway': ['#636efa', '#EF553B', '#00cc96', '#ab63fa', '#FFA15A', '#19d3f3', '#FF6692', '#B6E880', '#FF97FF', '#FECB52'], 'font': {'color': '#2a3f5f'}, 'hovermode': 'closest', 'hoverlabel': {'align': 'left'}, 'paper_bgcolor': 'white', 'plot_bgcolor': '#E5ECF6', 'polar': {'bgcolor': '#E5ECF6', 'angularaxis': {'gridcolor': 'white', 'linecolor': 'white', 'ticks': ''}, 'radialaxis': {'gridcolor': 'white', 'linecolor': 'white', 'ticks': ''}}, 'ternary': {'bgcolor': '#E5ECF6', 'aaxis': {'gridcolor': 'white', 'linecolor': 'white', 'ticks': ''}, 'baxis': {'gridcolor': 'white', 'linecolor': 'white', 'ticks': ''}, 'caxis': {'gridcolor': 'white', 'linecolor': 'white', 'ticks': ''}}, 'coloraxis': {'colorbar': {'outlinewidth': 0, 'ticks': ''}}, 'colorscale': {'sequential': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']], 'sequentialminus': [[0, '#0d0887'], [0.1111111111111111, '#46039f'], [0.2222222222222222, '#7201a8'], [0.3333333333333333, '#9c179e'], [0.4444444444444444, '#bd3786'], [0.5555555555555556, '#d8576b'], [0.6666666666666666, '#ed7953'], [0.7777777777777778, '#fb9f3a'], [0.8888888888888888, '#fdca26'], [1, '#f0f921']], 'diverging': [[0, '#8e0152'], [0.1, '#c51b7d'], [0.2, '#de77ae'], [0.3, '#f1b6da'], [0.4, '#fde0ef'], [0.5, '#f7f7f7'], [0.6, '#e6f5d0'], [0.7, '#b8e186'], [0.8, '#7fbc41'], [0.9, '#4d9221'], [1, '#276419']]}, 'xaxis': {'gridcolor': 'white', 'linecolor': 'white', 'ticks': '', 'title': {'standoff': 15}, 'zerolinecolor': 'white', 'automargin': True, 'zerolinewidth': 2}, 'yaxis': {'gridcolor': 'white', 'linecolor': 'white', 'ticks': '', 'title': {'standoff': 15}, 'zerolinecolor': 'white', 'automargin': True, 'zerolinewidth': 2}, 'scene': {'xaxis': {'backgroundcolor': '#E5ECF6', 'gridcolor': 'white', 'linecolor': 'white', 'showbackground': True, 'ticks': '', 'zerolinecolor': 'white', 'gridwidth': 2}, 'yaxis': {'backgroundcolor': '#E5ECF6', 'gridcolor': 'white', 'linecolor': 'white', 'showbackground': True, 'ticks': '', 'zerolinecolor': 'white', 'gridwidth': 2}, 'zaxis': {'backgroundcolor': '#E5ECF6', 'gridcolor': 'white', 'linecolor': 'white', 'showbackground': True, 'ticks': '', 'zerolinecolor': 'white', 'gridwidth': 2}}, 'shapedefaults': {'line': {'color': '#2a3f5f'}}, 'annotationdefaults': {'arrowcolor': '#2a3f5f', 'arrowhead': 0, 'arrowwidth': 1}, 'geo': {'bgcolor': 'white', 'landcolor': '#E5ECF6', 'subunitcolor': 'white', 'showland': True, 'showlakes': True, 'lakecolor': 'white'}, 'title': {'x': 0.05}, 'mapbox': {'style': 'light'}}}, 'title': {'text': '目的関数プロット'}, 'xaxis': {'title': {'text': '成功した解析数'}, 'type': 'linear', 'range': [0.7173255954539959, 5.282674404546004], 'autorange': False}, 'yaxis': {'title': {'text': 'Mises Stress'}, 'type': 'linear', 'range': [1194338.1744483153, 6109662.126322151], 'autorange': False}, 'transition': {'duration': 1000}, 'clickmode': 'event+select'}}
|
|
464
|
-
|
|
465
536
|
# get point location
|
|
466
537
|
pt = hoverData["points"][0]
|
|
467
538
|
|
|
@@ -469,10 +540,14 @@ class MainGraph(AbstractPage):
|
|
|
469
540
|
bbox = pt['bbox']
|
|
470
541
|
|
|
471
542
|
# get relative location of point
|
|
543
|
+
if 'xaxis' not in figure['layout']:
|
|
544
|
+
raise PreventUpdate
|
|
472
545
|
xrange = figure['layout']['xaxis']['range']
|
|
473
546
|
# yrange = figure['layout']['yaxis']['range']
|
|
474
547
|
|
|
475
|
-
|
|
548
|
+
# trial の x は plotly 上 categorical 扱い
|
|
549
|
+
# にしているので float に直す
|
|
550
|
+
is_left = float(pt['x']) < np.mean(xrange)
|
|
476
551
|
|
|
477
552
|
# デフォルトでは Hover が Point に重なり、
|
|
478
553
|
# Hover した瞬間に Un-hover する場合があるので
|
|
@@ -491,7 +566,6 @@ class MainGraph(AbstractPage):
|
|
|
491
566
|
bbox['y0'] = bbox['y0'] + 80
|
|
492
567
|
bbox['y1'] = bbox['y1'] + 80
|
|
493
568
|
|
|
494
|
-
|
|
495
569
|
# get row of the history from customdata defined in main_figure
|
|
496
570
|
if 'customdata' not in pt.keys():
|
|
497
571
|
raise PreventUpdate
|
|
@@ -501,7 +575,7 @@ class MainGraph(AbstractPage):
|
|
|
501
575
|
|
|
502
576
|
trial = pt['customdata'][0]
|
|
503
577
|
|
|
504
|
-
df = self.
|
|
578
|
+
df = self.application.get_df()
|
|
505
579
|
row = df[df['trial'] == trial]
|
|
506
580
|
|
|
507
581
|
# create component
|
|
@@ -526,13 +600,12 @@ class MainGraph(AbstractPage):
|
|
|
526
600
|
return True, bbox, tooltip_layout, direction
|
|
527
601
|
|
|
528
602
|
def create_formatted_parameter(self, row) -> Component:
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
values = [f'{value:.3e}' for value in parameters.values.ravel()]
|
|
603
|
+
|
|
604
|
+
prm_names = self.application.history.prm_names
|
|
605
|
+
prm_values = row[prm_names].values.ravel()
|
|
606
|
+
|
|
534
607
|
data = pd.DataFrame(dict(
|
|
535
|
-
parameter=
|
|
608
|
+
parameter=prm_names, value=prm_values
|
|
536
609
|
))
|
|
537
610
|
table = dash_table.DataTable(
|
|
538
611
|
columns=[{'name': col, 'id': col} for col in data.columns],
|
|
@@ -541,7 +614,7 @@ class MainGraph(AbstractPage):
|
|
|
541
614
|
return table
|
|
542
615
|
|
|
543
616
|
def create_formatted_objective(self, row) -> Component:
|
|
544
|
-
meta_columns = self.application.history.meta_columns
|
|
617
|
+
meta_columns = self.application.history._records.column_manager.meta_columns
|
|
545
618
|
pd.options.display.float_format = '{:.4e}'.format
|
|
546
619
|
objectives = row.iloc[:, np.where(np.array(meta_columns) == 'obj')[0]]
|
|
547
620
|
names = objectives.columns
|
|
@@ -557,15 +630,14 @@ class MainGraph(AbstractPage):
|
|
|
557
630
|
|
|
558
631
|
def create_image_content_if_femtet(self, trial) -> Component:
|
|
559
632
|
img_url = None
|
|
560
|
-
|
|
561
|
-
if
|
|
562
|
-
extra_data = json.loads(meta_columns[0])
|
|
633
|
+
extra_data = self.application.history.additional_data
|
|
634
|
+
if extra_data:
|
|
563
635
|
if 'femprj_path' in extra_data.keys():
|
|
564
636
|
# get img path
|
|
565
637
|
femprj_path = extra_data['femprj_path']
|
|
566
638
|
model_name = extra_data['model_name']
|
|
567
639
|
femprj_result_dir = femprj_path.replace('.femprj', '.Results')
|
|
568
|
-
img_path = os.path.join(femprj_result_dir, f'{model_name}
|
|
640
|
+
img_path = os.path.join(femprj_result_dir, f'{model_name}_trial_{trial}.jpg') # FIXME: FemtetInterface のメソッドを使う
|
|
569
641
|
if os.path.exists(img_path):
|
|
570
642
|
# create encoded image
|
|
571
643
|
with open(img_path, 'rb') as f:
|
|
@@ -574,7 +646,9 @@ class MainGraph(AbstractPage):
|
|
|
574
646
|
img_url = 'data:image/jpeg;base64, ' + encoded_image
|
|
575
647
|
return html.Img(src=img_url, style={"width": "200px"}) if img_url is not None else html.Div()
|
|
576
648
|
|
|
577
|
-
def get_fig_by_tab_id(self, tab_id, with_length=False, kwargs: dict = None)
|
|
649
|
+
def get_fig_by_tab_id(self, tab_id, with_length=False, kwargs: dict = None) -> (
|
|
650
|
+
go.Figure | tuple[go.Figure, int]
|
|
651
|
+
):
|
|
578
652
|
# If the history is not loaded, do nothing
|
|
579
653
|
if self.application.history is None:
|
|
580
654
|
raise PreventUpdate
|
|
@@ -589,18 +663,14 @@ class MainGraph(AbstractPage):
|
|
|
589
663
|
creator = creators[0]
|
|
590
664
|
|
|
591
665
|
# create figure
|
|
592
|
-
df = self.
|
|
666
|
+
df = self.application.get_df()
|
|
667
|
+
if len(df.columns) == 0:
|
|
668
|
+
raise PreventUpdate
|
|
669
|
+
if len(df) == 0:
|
|
670
|
+
raise PreventUpdate
|
|
593
671
|
kwargs = kwargs or {}
|
|
594
672
|
fig = creator(self.application.history, df, **kwargs)
|
|
595
673
|
if with_length:
|
|
596
674
|
return fig, len(df)
|
|
597
675
|
else:
|
|
598
676
|
return fig
|
|
599
|
-
|
|
600
|
-
def data_accessor(self) -> pd.DataFrame:
|
|
601
|
-
from pyfemtet.opt.visualization._process_monitor.application import ProcessMonitorApplication
|
|
602
|
-
if isinstance(self.application, ProcessMonitorApplication):
|
|
603
|
-
df = self.application.local_data
|
|
604
|
-
else:
|
|
605
|
-
df = self.application.history.get_df(valid_only=True)
|
|
606
|
-
return df
|