extrap 4.2.2__tar.gz → 4.2.4__tar.gz
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.
- {extrap-4.2.2/extrap.egg-info → extrap-4.2.4}/PKG-INFO +53 -20
- {extrap-4.2.2 → extrap-4.2.4}/README.md +38 -18
- {extrap-4.2.2 → extrap-4.2.4}/extrap/__init__.py +3 -3
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/functions.py +32 -3
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/measurement.py +4 -2
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/named_entity.py +3 -3
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/cube_file_reader2.py +8 -4
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/GraphWidget.py +31 -36
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/SelectorWidget.py +4 -6
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/TreeModel.py +12 -12
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/ExpanderWidget.py +2 -3
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/BaseGraphWidget.py +10 -12
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/model_generator.py +25 -9
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/multi_parameter/multi_parameter_modeler.py +4 -6
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/abstract_base.py +11 -10
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/adaptive/__init__.py +3 -2
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/serialization_schema.py +7 -2
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/string_formats.py +3 -3
- {extrap-4.2.2 → extrap-4.2.4/extrap.egg-info}/PKG-INFO +53 -20
- {extrap-4.2.2 → extrap-4.2.4}/setup.py +3 -1
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_cube_files.py +71 -1
- {extrap-4.2.2 → extrap-4.2.4}/AUTHORS.md +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/LICENSE +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/MANIFEST.in +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/__main__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/annotations/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/annotations/comment_annotation/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/annotations/comment_annotation/comment_base.svg +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/callpath.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/calltree.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/coordinate.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/experiment.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/fraction.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/hypotheses.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/metric.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/model.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/parameter.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/scaling_type.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/terms.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/extrap/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/extrap/extrapcmd.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/extrap/extrapgui.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/experiment_io.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/abstract_directory_reader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/extrap3_experiment_reader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/file_reader_mixin.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/json_file_reader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/jsonlines_file_reader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/talpas_file_reader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/text_file_reader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/io_helper.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/output.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/values_io.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/AdvancedPlotWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ColorWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/DataDisplay.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ImportOptionsDialog.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/LogWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/MainWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/MeasurementWizardWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ModelerOptionsWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ModelerWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/PlotTypeSelector.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/StrongScalingConversionDialog.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/TreeView.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/Utils.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/ParameterValueSlider.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/ProgressWindow.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/annotation_delegate.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/dynamic_options.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/file_dialog.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/model_color_map.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/plot_formatting_options.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/switch_widget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/worker.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/AbstractPlotWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/AllFunctionsAsDifferentSurfacePlotWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/AllFunctionsAsOneSurfacePlotWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/DominatingFunctionsAsHeatMapWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/DominatingFunctionsAsSingleScatterPlotWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/HeatMapGraphWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/InterpolatedContourDisplayWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/IsolinesDisplayWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/MaxZAsSingleSurfacePlotWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/MeasurementPointsPlotWidget.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/resources/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/resources/menu.svg +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/abstract_modeler.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/loader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/modeler_options.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/multi_parameter/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/basic.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/refining.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/segmented.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/add_selection_strategy.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/base_selection_strategy.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/gpr_selection_strategy.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/measurement_point_advisor.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/util.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/__init__.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/caching.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/classproperty.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/deprecation.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/dynamic_options.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/exceptions.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/extension_loader.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/formatting_helper.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/latex_formatting.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/options_parser.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/progress_bar.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap/util/unique_list.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/SOURCES.txt +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/dependency_links.txt +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/entry_points.txt +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/requires.txt +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/top_level.txt +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/setup.cfg +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_basic_modeler.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_compat.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_console.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_fraction.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_gui.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_extrap3_experiment.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_json_file.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_jsonlines_file.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_save_experiment.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_talpas_file.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_text_file.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_measurement.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_modeler_adaptive.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_modeling.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa_base_strategy.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa_gpr_strategy.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa_utils.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_multi_param_modeler.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_output.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_refining_modeler.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_scaling_detection.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_segmented_modeler.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_serialization.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_serializing_segments.py +0 -0
- {extrap-4.2.2 → extrap-4.2.4}/tests/test_serializing_values.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: extrap
|
|
3
|
-
Version: 4.2.
|
|
3
|
+
Version: 4.2.4
|
|
4
4
|
Summary: Extra-P, automated performance modeling for HPC applications
|
|
5
5
|
Home-page: https://github.com/extra-p/extrap
|
|
6
6
|
Author: Extra-P project
|
|
@@ -15,6 +15,8 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
20
|
Classifier: Operating System :: OS Independent
|
|
19
21
|
Classifier: Intended Audience :: Developers
|
|
20
22
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -36,6 +38,17 @@ Requires-Dist: pyobjc-framework-Cocoa~=9.0; sys_platform == "darwin"
|
|
|
36
38
|
Requires-Dist: scikit-learn>=1.2.2
|
|
37
39
|
Provides-Extra: adaptive-modeling
|
|
38
40
|
Requires-Dist: extrap-adaptive-modeler<3,>=1.0.2; extra == "adaptive-modeling"
|
|
41
|
+
Dynamic: author
|
|
42
|
+
Dynamic: author-email
|
|
43
|
+
Dynamic: classifier
|
|
44
|
+
Dynamic: description
|
|
45
|
+
Dynamic: description-content-type
|
|
46
|
+
Dynamic: home-page
|
|
47
|
+
Dynamic: license-file
|
|
48
|
+
Dynamic: provides-extra
|
|
49
|
+
Dynamic: requires-dist
|
|
50
|
+
Dynamic: requires-python
|
|
51
|
+
Dynamic: summary
|
|
39
52
|
|
|
40
53
|
# Extra-P
|
|
41
54
|
|
|
@@ -154,31 +167,51 @@ You can find an overview about all command line options under [docs/command-line
|
|
|
154
167
|
|
|
155
168
|
Please cite Extra-P in your publications if it helps your research:
|
|
156
169
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
170
|
+
Alexandru Calotoiu, Marcin Copik, Fabian Czappa, Alexander Geiß, Gustavo Morais, Marcus Ritter, Sergei Shudler, Torsten Hoefler, Felix Wolf:
|
|
171
|
+
Extra-P – Empirical Performance Modeling Made Easy. *Frontiers in High Performance Computing*, 3–2025, 2026. [10.3389/fhpcp.2025.1714042](https://doi.org/10.3389/fhpcp.2025.1714042)
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
@Article{calotoiu_extra-p_2026,
|
|
175
|
+
author = {Calotoiu, Alexandru and Copik, Marcin and Czappa, Fabian and Geiß, Alexander and Morais, Gustavo and Ritter, Marcus and Shudler, Sergei and Hoefler, Torsten and Wolf, Felix},
|
|
176
|
+
title = {Extra-{P} – {Empirical} {Performance} {Modeling} {Made} {Easy}},
|
|
177
|
+
journal = {Frontiers in High Performance Computing},
|
|
178
|
+
year = {2026},
|
|
179
|
+
volume = {3–2025},
|
|
180
|
+
issn = {2813–7337},
|
|
181
|
+
doi = {10.3389/fhpcp.2025.1714042}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Selected Publications
|
|
186
|
+
|
|
187
|
+
1. Alexandru Calotoiu, Torsten Hoefler, Marius Poke, Felix Wolf:
|
|
188
|
+
*Using automated performance modeling to find scalability bugs in complex codes*. In Proc. of the International
|
|
189
|
+
Conference on High Performance Computing, Networking, Storage and Analysis (SC '13), ACM, 2013.
|
|
190
|
+
[DOI](https://doi.org/10.1145/2503210.2503277)
|
|
191
|
+
|
|
192
|
+
2. Alexandru Calotoiu, David Beckingsale, Christopher W. Earl, Torsten Hoefler, Ian Karlin, Martin Schulz, Felix Wolf:
|
|
193
|
+
*Fast Multi-Parameter Performance Modeling*. In Proc. of the 2016 IEEE International Conference on Cluster Computing (
|
|
173
194
|
CLUSTER), Taipei, Taiwan, pages 172–181, IEEE, September
|
|
174
195
|
2016. [PDF](https://apps.fz-juelich.de/jsc-pubsystem/aigaion/attachments/fastmultiparam.pdf-f839eba376c6d61a8c4cab9860b6b3bf.pdf)
|
|
175
196
|
|
|
176
|
-
|
|
197
|
+
3. Marcus Ritter, Alexandru Calotoiu, Sebastian Rinke, Thorsten Reimann, Torsten Hoefler, Felix Wolf: *Learning
|
|
177
198
|
Cost-Effective Sampling Strategies for Empirical Performance Modeling.* In Proc. of the 34th IEEE International
|
|
178
199
|
Parallel and Distributed Processing Symposium (IPDPS), New Orleans, LA, USA, pages 884–895, IEEE, May
|
|
179
200
|
2020. [PDF](https://apps.fz-juelich.de/jsc-pubsystem/aigaion/attachments/ritter_ea_2020_ipdps.pdf-01cbe96f7a170aba7c7ef941f966d292.pdf)
|
|
180
201
|
|
|
181
|
-
|
|
202
|
+
4. Marcus Ritter, Alexander Geiß, Johannes Wehrstein, Alexandru Calotoiu, Thorsten Reimann, Torsten Hoefler, Felix Wolf:
|
|
182
203
|
*Noise-Resilient Empirical Performance Modeling with Deep Neural Networks.* In Proc. of the 35th IEEE International
|
|
183
204
|
Parallel and Distributed Processing Symposium (IPDPS), Portland, Oregon, USA, pages 23–34, IEEE, May
|
|
184
205
|
2021. [PDF](http://htor.inf.ethz.ch/publications/img/noiseresilientmodeling.pdf)
|
|
206
|
+
|
|
207
|
+
5. Alexander Geiß, Téodora Hovi, Alexandru Calotoiu, Felix Wolf:
|
|
208
|
+
*Validating the Performance of GPU Ports Using Differential Performance Models*. Future Generation Computer Systems, 174: 1–17, January 2026.
|
|
209
|
+
[DOI](https://doi.org/10.1016/j.future.2025.108018)
|
|
210
|
+
|
|
211
|
+
7. Marcus Ritter, Benedict Naumann, Alexandru Calotoiu, Sebastian Rinke, Thorsten Reimann, Torsten Hoefler, Felix Wolf:
|
|
212
|
+
*Cost-Effective Empirical Performance Modeling*. Transactions on Parallel and Distributed Systems, 37: 575–592, February 2026.
|
|
213
|
+
[PDF](https://www.parallel.informatik.tu-darmstadt.de/zotero-lists/attachments/GH3LJG4Z_Ritter%20et%20al.%20-%202026%20-%20Cost-Effective%20Empirical%20Performance%20Modeling.pdf)
|
|
214
|
+
|
|
215
|
+
9. Alexandru Calotoiu, Marcin Copik, Fabian Czappa, Alexander Geiß, Gustavo Morais, Marcus Ritter, Sergei Shudler, Torsten Hoefler, Felix Wolf:
|
|
216
|
+
*Extra-P – Empirical Performance Modeling Made Easy*. Frontiers in High Performance Computing, 3–2025, March 2026.
|
|
217
|
+
[DOI](https://doi.org/10.3389/fhpcp.2025.1714042)
|
|
@@ -115,31 +115,51 @@ You can find an overview about all command line options under [docs/command-line
|
|
|
115
115
|
|
|
116
116
|
Please cite Extra-P in your publications if it helps your research:
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
118
|
+
Alexandru Calotoiu, Marcin Copik, Fabian Czappa, Alexander Geiß, Gustavo Morais, Marcus Ritter, Sergei Shudler, Torsten Hoefler, Felix Wolf:
|
|
119
|
+
Extra-P – Empirical Performance Modeling Made Easy. *Frontiers in High Performance Computing*, 3–2025, 2026. [10.3389/fhpcp.2025.1714042](https://doi.org/10.3389/fhpcp.2025.1714042)
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
@Article{calotoiu_extra-p_2026,
|
|
123
|
+
author = {Calotoiu, Alexandru and Copik, Marcin and Czappa, Fabian and Geiß, Alexander and Morais, Gustavo and Ritter, Marcus and Shudler, Sergei and Hoefler, Torsten and Wolf, Felix},
|
|
124
|
+
title = {Extra-{P} – {Empirical} {Performance} {Modeling} {Made} {Easy}},
|
|
125
|
+
journal = {Frontiers in High Performance Computing},
|
|
126
|
+
year = {2026},
|
|
127
|
+
volume = {3–2025},
|
|
128
|
+
issn = {2813–7337},
|
|
129
|
+
doi = {10.3389/fhpcp.2025.1714042}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Selected Publications
|
|
134
|
+
|
|
135
|
+
1. Alexandru Calotoiu, Torsten Hoefler, Marius Poke, Felix Wolf:
|
|
136
|
+
*Using automated performance modeling to find scalability bugs in complex codes*. In Proc. of the International
|
|
137
|
+
Conference on High Performance Computing, Networking, Storage and Analysis (SC '13), ACM, 2013.
|
|
138
|
+
[DOI](https://doi.org/10.1145/2503210.2503277)
|
|
139
|
+
|
|
140
|
+
2. Alexandru Calotoiu, David Beckingsale, Christopher W. Earl, Torsten Hoefler, Ian Karlin, Martin Schulz, Felix Wolf:
|
|
141
|
+
*Fast Multi-Parameter Performance Modeling*. In Proc. of the 2016 IEEE International Conference on Cluster Computing (
|
|
134
142
|
CLUSTER), Taipei, Taiwan, pages 172–181, IEEE, September
|
|
135
143
|
2016. [PDF](https://apps.fz-juelich.de/jsc-pubsystem/aigaion/attachments/fastmultiparam.pdf-f839eba376c6d61a8c4cab9860b6b3bf.pdf)
|
|
136
144
|
|
|
137
|
-
|
|
145
|
+
3. Marcus Ritter, Alexandru Calotoiu, Sebastian Rinke, Thorsten Reimann, Torsten Hoefler, Felix Wolf: *Learning
|
|
138
146
|
Cost-Effective Sampling Strategies for Empirical Performance Modeling.* In Proc. of the 34th IEEE International
|
|
139
147
|
Parallel and Distributed Processing Symposium (IPDPS), New Orleans, LA, USA, pages 884–895, IEEE, May
|
|
140
148
|
2020. [PDF](https://apps.fz-juelich.de/jsc-pubsystem/aigaion/attachments/ritter_ea_2020_ipdps.pdf-01cbe96f7a170aba7c7ef941f966d292.pdf)
|
|
141
149
|
|
|
142
|
-
|
|
150
|
+
4. Marcus Ritter, Alexander Geiß, Johannes Wehrstein, Alexandru Calotoiu, Thorsten Reimann, Torsten Hoefler, Felix Wolf:
|
|
143
151
|
*Noise-Resilient Empirical Performance Modeling with Deep Neural Networks.* In Proc. of the 35th IEEE International
|
|
144
152
|
Parallel and Distributed Processing Symposium (IPDPS), Portland, Oregon, USA, pages 23–34, IEEE, May
|
|
145
153
|
2021. [PDF](http://htor.inf.ethz.ch/publications/img/noiseresilientmodeling.pdf)
|
|
154
|
+
|
|
155
|
+
5. Alexander Geiß, Téodora Hovi, Alexandru Calotoiu, Felix Wolf:
|
|
156
|
+
*Validating the Performance of GPU Ports Using Differential Performance Models*. Future Generation Computer Systems, 174: 1–17, January 2026.
|
|
157
|
+
[DOI](https://doi.org/10.1016/j.future.2025.108018)
|
|
158
|
+
|
|
159
|
+
7. Marcus Ritter, Benedict Naumann, Alexandru Calotoiu, Sebastian Rinke, Thorsten Reimann, Torsten Hoefler, Felix Wolf:
|
|
160
|
+
*Cost-Effective Empirical Performance Modeling*. Transactions on Parallel and Distributed Systems, 37: 575–592, February 2026.
|
|
161
|
+
[PDF](https://www.parallel.informatik.tu-darmstadt.de/zotero-lists/attachments/GH3LJG4Z_Ritter%20et%20al.%20-%202026%20-%20Cost-Effective%20Empirical%20Performance%20Modeling.pdf)
|
|
162
|
+
|
|
163
|
+
9. Alexandru Calotoiu, Marcin Copik, Fabian Czappa, Alexander Geiß, Gustavo Morais, Marcus Ritter, Sergei Shudler, Torsten Hoefler, Felix Wolf:
|
|
164
|
+
*Extra-P – Empirical Performance Modeling Made Easy*. Frontiers in High Performance Computing, 3–2025, March 2026.
|
|
165
|
+
[DOI](https://doi.org/10.3389/fhpcp.2025.1714042)
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2026, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
7
7
|
|
|
8
8
|
__title__ = "Extra-P"
|
|
9
|
-
__version__ = "4.2.
|
|
9
|
+
__version__ = "4.2.4"
|
|
10
10
|
__description__ = "Extra-P, automated performance modeling for HPC applications"
|
|
11
|
-
__copyright__ = "Copyright (c) 2020-
|
|
11
|
+
__copyright__ = "Copyright (c) 2020-2026 Technical University of Darmstadt, Darmstadt, Germany"
|
|
12
12
|
__documentation_link__ = f"https://github.com/extra-p/extrap/tree/v{__version__}/docs"
|
|
13
13
|
__current_version_api__ = "https://pypi.org/pypi/extrap/json"
|
|
14
14
|
__developed_by_html__ = 'Extra-P is developed by <a href="https://www.parallel.informatik.tu-darmstadt.de/">' \
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2026, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -14,7 +14,7 @@ from typing import List, Mapping, Union, Sequence
|
|
|
14
14
|
|
|
15
15
|
import numpy
|
|
16
16
|
import numpy as np
|
|
17
|
-
from marshmallow import fields
|
|
17
|
+
from marshmallow import fields, pre_load
|
|
18
18
|
|
|
19
19
|
from extrap.entities.parameter import Parameter
|
|
20
20
|
from extrap.entities.terms import CompoundTerm, MultiParameterTerm, CompoundTermSchema, MultiParameterTermSchema, \
|
|
@@ -138,7 +138,19 @@ class Function:
|
|
|
138
138
|
elif self is other:
|
|
139
139
|
return True
|
|
140
140
|
else:
|
|
141
|
-
|
|
141
|
+
# Compare constant_coefficient
|
|
142
|
+
if self.constant_coefficient != other.constant_coefficient:
|
|
143
|
+
return False
|
|
144
|
+
|
|
145
|
+
# Compare compound_terms by content, not just reference
|
|
146
|
+
if len(self.compound_terms) != len(other.compound_terms):
|
|
147
|
+
return False
|
|
148
|
+
|
|
149
|
+
for t1, t2 in zip(self.compound_terms, other.compound_terms):
|
|
150
|
+
if t1 != t2:
|
|
151
|
+
return False
|
|
152
|
+
|
|
153
|
+
return True
|
|
142
154
|
|
|
143
155
|
|
|
144
156
|
class ConstantFunction(Function):
|
|
@@ -267,6 +279,23 @@ class SegmentedFunction(SingleParameterFunction):
|
|
|
267
279
|
function_string += f" for ${parameters[0]}>={self.intervals[1][0]}$"
|
|
268
280
|
return function_string
|
|
269
281
|
|
|
282
|
+
def __eq__(self, other):
|
|
283
|
+
if not isinstance(other, SegmentedFunction):
|
|
284
|
+
return NotImplemented
|
|
285
|
+
elif self is other:
|
|
286
|
+
return True
|
|
287
|
+
else:
|
|
288
|
+
# Compare segments and intervals
|
|
289
|
+
if len(self.segments) != len(other.segments):
|
|
290
|
+
return False
|
|
291
|
+
if not np.array_equal(self.intervals, other.intervals):
|
|
292
|
+
return False
|
|
293
|
+
# Compare each segment
|
|
294
|
+
for s1, s2 in zip(self.segments, other.segments):
|
|
295
|
+
if s1 != s2:
|
|
296
|
+
return False
|
|
297
|
+
return True
|
|
298
|
+
|
|
270
299
|
|
|
271
300
|
class MultiParameterFunction(Function):
|
|
272
301
|
compound_terms: List[MultiParameterTerm]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2025, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -88,6 +88,8 @@ class Measurement:
|
|
|
88
88
|
return values
|
|
89
89
|
if isinstance(values, np.ndarray):
|
|
90
90
|
return values
|
|
91
|
+
if all(isinstance(v, np.ndarray) for v in values):
|
|
92
|
+
return np.ma.array(values)
|
|
91
93
|
|
|
92
94
|
dim_max_len = [(len(values), len(values))]
|
|
93
95
|
|
|
@@ -250,7 +252,7 @@ class MeasurementSchema(Schema):
|
|
|
250
252
|
minimum = NumberField()
|
|
251
253
|
maximum = NumberField()
|
|
252
254
|
std = NumberField()
|
|
253
|
-
repetitions = fields.Int()
|
|
255
|
+
repetitions = fields.Int(allow_none=True)
|
|
254
256
|
values = fields.Method('_store_values', '_load_values', allow_none=True, load_default=None)
|
|
255
257
|
|
|
256
258
|
def _load_values(self, value):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2025, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import copy
|
|
9
9
|
import json
|
|
10
10
|
from abc import abstractmethod, ABC
|
|
11
|
-
from typing import Iterator,
|
|
11
|
+
from typing import Iterator, Any, MutableMapping
|
|
12
12
|
|
|
13
13
|
from marshmallow import fields
|
|
14
14
|
|
|
@@ -65,7 +65,7 @@ class NamedEntityWithTags(NamedEntity, ABC):
|
|
|
65
65
|
|
|
66
66
|
def __init__(self, name, **tags):
|
|
67
67
|
super(NamedEntityWithTags, self).__init__(name)
|
|
68
|
-
self.tags:
|
|
68
|
+
self.tags: MutableMapping[str, Any] = tags or {}
|
|
69
69
|
|
|
70
70
|
def lookup_tag(self, tag: str, default=None, prefix=1):
|
|
71
71
|
if tag in self.tags:
|
|
@@ -220,8 +220,9 @@ class CubeFileReader2(AbstractDirectoryReader, AbstractScalingConversionReader,
|
|
|
220
220
|
total_values[callpaths[r_cnode.id]].append(cnode_values.astype(float))
|
|
221
221
|
elif self.scaling_type == ScalingType.WEAK_THREADED:
|
|
222
222
|
values = cnode_values.astype(float)
|
|
223
|
-
|
|
224
|
-
|
|
223
|
+
if values.any():
|
|
224
|
+
zero_value_mask = values == 0
|
|
225
|
+
masked_array = ma.array(values, mask=zero_value_mask)
|
|
225
226
|
total_values[callpaths[r_cnode.id]].append(masked_array)
|
|
226
227
|
elif self.scaling_type == ScalingType.STRONG:
|
|
227
228
|
total_values[callpaths[r_cnode.id]].append(cnode_values.sum().astype(float))
|
|
@@ -241,8 +242,11 @@ class CubeFileReader2(AbstractDirectoryReader, AbstractScalingConversionReader,
|
|
|
241
242
|
aggregated_values[(callpath, metric)].append(cnode_values.astype(float))
|
|
242
243
|
elif self.scaling_type == ScalingType.WEAK_THREADED:
|
|
243
244
|
values = cnode_values.astype(float)
|
|
244
|
-
|
|
245
|
-
|
|
245
|
+
if not values.any():
|
|
246
|
+
aggregated_values[(callpath, metric)].append(ma.array(values))
|
|
247
|
+
else:
|
|
248
|
+
zero_value_mask = (values == 0)
|
|
249
|
+
aggregated_values[(callpath, metric)].append(ma.array(values, mask=zero_value_mask))
|
|
246
250
|
# in case of strong scaling calculate the sum over all mpi process values
|
|
247
251
|
elif self.scaling_type == ScalingType.STRONG:
|
|
248
252
|
aggregated_values[(callpath, metric)].append(cnode_values.sum().astype(float))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2025, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -16,7 +16,6 @@ import numpy
|
|
|
16
16
|
from PySide6.QtCore import * # @UnusedWildImport
|
|
17
17
|
from PySide6.QtGui import * # @UnusedWildImport
|
|
18
18
|
from PySide6.QtWidgets import * # @UnusedWildImport
|
|
19
|
-
|
|
20
19
|
from extrap.gui.Utils import formatFormula
|
|
21
20
|
from extrap.gui.Utils import formatNumber
|
|
22
21
|
from extrap.gui.plots.AbstractPlotWidget import AbstractPlotWidget
|
|
@@ -569,9 +568,8 @@ class GraphWidget(QWidget):
|
|
|
569
568
|
number_of_x_points, x_list, x_values = self._calculate_evaluation_points(length_x_axis, x_min, x_max)
|
|
570
569
|
else:
|
|
571
570
|
number_of_x_points, x_list, x_values = self._calculate_evaluation_points(length_x_axis)
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
numpy.seterr(**previous)
|
|
571
|
+
with numpy.errstate(invalid='ignore', divide='ignore'):
|
|
572
|
+
y_list = function.evaluate(x_list).reshape(-1)
|
|
575
573
|
cord_list = self._create_drawing_iterator(x_values, y_list)
|
|
576
574
|
|
|
577
575
|
return cord_list
|
|
@@ -585,10 +583,9 @@ class GraphWidget(QWidget):
|
|
|
585
583
|
|
|
586
584
|
y_list = numpy.zeros(number_of_x_points)
|
|
587
585
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
numpy.seterr(**previous)
|
|
586
|
+
with numpy.errstate(invalid='ignore', divide='ignore'):
|
|
587
|
+
for function in functions:
|
|
588
|
+
y_list += function.evaluate(x_list).reshape(-1)
|
|
592
589
|
|
|
593
590
|
cord_list = self._create_drawing_iterator(x_values, y_list)
|
|
594
591
|
|
|
@@ -741,43 +738,41 @@ class GraphWidget(QWidget):
|
|
|
741
738
|
y = max(model.predictions)
|
|
742
739
|
y_max = max(y, y_max)
|
|
743
740
|
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
741
|
+
with numpy.errstate(invalid='ignore', divide='ignore'):
|
|
742
|
+
if self.combine_all_callpath:
|
|
743
|
+
y_agg = 0
|
|
744
|
+
for model in modelList:
|
|
745
|
+
function = model.hypothesis.function
|
|
746
|
+
y_agg = y_agg + function.evaluate(pv_list)
|
|
747
|
+
y_max = max(y_agg, y_max)
|
|
748
|
+
|
|
749
|
+
pv_list[param] = 1
|
|
750
|
+
y_agg = 0
|
|
751
|
+
for model in modelList:
|
|
752
|
+
function = model.hypothesis.function
|
|
753
|
+
y = function.evaluate(pv_list)
|
|
754
|
+
if math.isinf(y):
|
|
755
|
+
y = max(model.predictions)
|
|
756
|
+
y_agg += y
|
|
757
|
+
y_max = max(y_agg, y_max)
|
|
758
|
+
|
|
759
|
+
# Check the value at the end of the displayed interval
|
|
748
760
|
for model in modelList:
|
|
749
761
|
function = model.hypothesis.function
|
|
750
|
-
|
|
751
|
-
|
|
762
|
+
y = function.evaluate(pv_list)
|
|
763
|
+
if math.isinf(y):
|
|
764
|
+
y = max(model.predictions)
|
|
765
|
+
y_max = max(y, y_max)
|
|
752
766
|
|
|
767
|
+
# Check the value at the beginning of the displayed interval
|
|
753
768
|
pv_list[param] = 1
|
|
754
|
-
y_agg = 0
|
|
755
769
|
for model in modelList:
|
|
756
770
|
function = model.hypothesis.function
|
|
757
771
|
y = function.evaluate(pv_list)
|
|
758
772
|
if math.isinf(y):
|
|
759
773
|
y = max(model.predictions)
|
|
760
|
-
|
|
761
|
-
y_max = max(y_agg, y_max)
|
|
762
|
-
|
|
763
|
-
# Check the value at the end of the displayed interval
|
|
764
|
-
for model in modelList:
|
|
765
|
-
function = model.hypothesis.function
|
|
766
|
-
y = function.evaluate(pv_list)
|
|
767
|
-
if math.isinf(y):
|
|
768
|
-
y = max(model.predictions)
|
|
769
|
-
y_max = max(y, y_max)
|
|
770
|
-
|
|
771
|
-
# Check the value at the beginning of the displayed interval
|
|
772
|
-
pv_list[param] = 1
|
|
773
|
-
for model in modelList:
|
|
774
|
-
function = model.hypothesis.function
|
|
775
|
-
y = function.evaluate(pv_list)
|
|
776
|
-
if math.isinf(y):
|
|
777
|
-
y = max(model.predictions)
|
|
778
|
-
y_max = max(y, y_max)
|
|
774
|
+
y_max = max(y, y_max)
|
|
779
775
|
|
|
780
|
-
numpy.seterr(**previous)
|
|
781
776
|
# Ensure that the maximum value is never too small
|
|
782
777
|
if y_max < 0.000001:
|
|
783
778
|
y_max = 1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2025, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -11,9 +11,7 @@ import math
|
|
|
11
11
|
from typing import Optional, Sequence, TYPE_CHECKING, Tuple
|
|
12
12
|
|
|
13
13
|
import numpy
|
|
14
|
-
from PySide6.QtCore import Slot
|
|
15
14
|
from PySide6.QtWidgets import * # @UnusedWildImport
|
|
16
|
-
|
|
17
15
|
from extrap.entities.calltree import Node
|
|
18
16
|
from extrap.entities.metric import Metric
|
|
19
17
|
from extrap.entities.model import Model
|
|
@@ -346,9 +344,9 @@ class SelectorWidget(QWidget):
|
|
|
346
344
|
param_value_list = self.getParameterValues()
|
|
347
345
|
call_tree = experiment.call_tree
|
|
348
346
|
nodes = call_tree.get_nodes()
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
347
|
+
with numpy.errstate(divide='ignore', invalid='ignore'):
|
|
348
|
+
value_list = self.iterate_children(model_set.models, param_value_list, nodes, selected_metric)
|
|
349
|
+
|
|
352
350
|
if len(value_list) > 0:
|
|
353
351
|
min_max_value = max(0.0, min(value_list)), max(0.0, max(value_list))
|
|
354
352
|
self.min_value, self.max_value = min_max_value
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2025, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
10
|
import copy
|
|
11
|
-
import numpy
|
|
12
|
-
from PySide6.QtCore import * # @UnusedWildImport
|
|
13
11
|
from enum import Enum, auto
|
|
14
12
|
from typing import Optional, TYPE_CHECKING, List, Callable, Any
|
|
15
13
|
|
|
14
|
+
import numpy
|
|
15
|
+
from PySide6.QtCore import * # @UnusedWildImport
|
|
16
16
|
from extrap.entities import calltree
|
|
17
17
|
from extrap.entities.calltree import CallTree, Node
|
|
18
18
|
from extrap.entities.experiment import Experiment
|
|
@@ -148,12 +148,13 @@ class TreeModel(QAbstractItemModel):
|
|
|
148
148
|
return formatFormula(formula.to_string(*parameters))
|
|
149
149
|
else:
|
|
150
150
|
parameters = self.selector_widget.getParameterValues()
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
151
|
+
with numpy.errstate(divide='ignore', invalid='ignore'):
|
|
152
|
+
if role == Qt.ToolTipRole and isinstance(model, SegmentedModel):
|
|
153
|
+
res = _format_number_segmented_model(model,
|
|
154
|
+
lambda m: m.hypothesis.function.evaluate(parameters))
|
|
155
|
+
else:
|
|
156
|
+
res = formatNumber(str(formula.evaluate(parameters)))
|
|
157
|
+
|
|
157
158
|
return res
|
|
158
159
|
elif index.column() == 4:
|
|
159
160
|
if role == Qt.ToolTipRole and isinstance(model, SegmentedModel):
|
|
@@ -180,9 +181,8 @@ class TreeModel(QAbstractItemModel):
|
|
|
180
181
|
def get_comparison_value(self, model):
|
|
181
182
|
parameters = self.selector_widget.getParameterValues()
|
|
182
183
|
formula = model.hypothesis.function
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
numpy.seterr(**previous)
|
|
184
|
+
with numpy.errstate(divide='ignore', invalid='ignore'):
|
|
185
|
+
value = formula.evaluate(parameters)
|
|
186
186
|
return value
|
|
187
187
|
|
|
188
188
|
def getSelectedModel(self, callpath) -> tuple[Optional[Model], Experiment]:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2025, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -44,7 +44,7 @@ class ExpanderWidget(QGroupBox):
|
|
|
44
44
|
|
|
45
45
|
def initUI(self):
|
|
46
46
|
self.setStyleSheet('ExpanderWidget{ '
|
|
47
|
-
' padding:
|
|
47
|
+
' padding:0px -1px -1px 0px; margin-left:-1px; '
|
|
48
48
|
f'{" margin-top: -19px; padding-top:19px; " if sys.platform.startswith("darwin") else ""}'
|
|
49
49
|
'}'
|
|
50
50
|
'ExpanderWidget::title{ '
|
|
@@ -97,7 +97,6 @@ class ExpanderWidget(QGroupBox):
|
|
|
97
97
|
self._content.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
|
98
98
|
self._content.setMinimumHeight(0)
|
|
99
99
|
self._content.setMaximumHeight(0)
|
|
100
|
-
self._content
|
|
101
100
|
|
|
102
101
|
layout.addWidget(self._toggle)
|
|
103
102
|
layout.addWidget(self._content)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This file is part of the Extra-P software (http://www.scalasca.org/software/extra-p)
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2020-
|
|
3
|
+
# Copyright (c) 2020-2025, Technical University of Darmstadt, Germany
|
|
4
4
|
#
|
|
5
5
|
# This software may be modified and distributed under the terms of a BSD-style license.
|
|
6
6
|
# See the LICENSE file in the base directory for details.
|
|
@@ -13,13 +13,12 @@ from typing import TYPE_CHECKING
|
|
|
13
13
|
import matplotlib
|
|
14
14
|
import numpy as np
|
|
15
15
|
from PySide6.QtWidgets import QSizePolicy
|
|
16
|
+
from extrap.util.formatting_helper import replace_method_parameters
|
|
16
17
|
from matplotlib import patches as mpatches
|
|
17
18
|
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
|
|
18
19
|
from matplotlib.figure import Figure
|
|
19
20
|
from mpl_toolkits.mplot3d import Axes3D
|
|
20
21
|
|
|
21
|
-
from extrap.util.formatting_helper import replace_method_parameters
|
|
22
|
-
|
|
23
22
|
if TYPE_CHECKING:
|
|
24
23
|
from extrap.gui.MainWidget import MainWidget
|
|
25
24
|
|
|
@@ -105,15 +104,14 @@ class GraphDisplayWindow(FigureCanvas):
|
|
|
105
104
|
# Get the z value for the x and y value
|
|
106
105
|
z_List = list()
|
|
107
106
|
Z_List = list()
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
np.seterr(**previous)
|
|
107
|
+
with np.errstate(invalid='ignore', divide='ignore'):
|
|
108
|
+
for model in model_list:
|
|
109
|
+
function = model.hypothesis.function
|
|
110
|
+
zs = self.calculate_z_optimized(X, Y, function)
|
|
111
|
+
Z = zs.reshape(X.shape)
|
|
112
|
+
z_List.append(zs)
|
|
113
|
+
Z_List.append(Z)
|
|
114
|
+
max_z = max(max_z, np.max(zs[np.logical_not(np.isinf(zs))]))
|
|
117
115
|
for z, Z in zip(z_List, Z_List):
|
|
118
116
|
z[np.isinf(z)] = max_z
|
|
119
117
|
Z[np.isinf(Z)] = max_z
|