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.
Files changed (152) hide show
  1. {extrap-4.2.2/extrap.egg-info → extrap-4.2.4}/PKG-INFO +53 -20
  2. {extrap-4.2.2 → extrap-4.2.4}/README.md +38 -18
  3. {extrap-4.2.2 → extrap-4.2.4}/extrap/__init__.py +3 -3
  4. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/functions.py +32 -3
  5. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/measurement.py +4 -2
  6. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/named_entity.py +3 -3
  7. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/cube_file_reader2.py +8 -4
  8. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/GraphWidget.py +31 -36
  9. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/SelectorWidget.py +4 -6
  10. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/TreeModel.py +12 -12
  11. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/ExpanderWidget.py +2 -3
  12. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/BaseGraphWidget.py +10 -12
  13. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/model_generator.py +25 -9
  14. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/multi_parameter/multi_parameter_modeler.py +4 -6
  15. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/abstract_base.py +11 -10
  16. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/adaptive/__init__.py +3 -2
  17. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/serialization_schema.py +7 -2
  18. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/string_formats.py +3 -3
  19. {extrap-4.2.2 → extrap-4.2.4/extrap.egg-info}/PKG-INFO +53 -20
  20. {extrap-4.2.2 → extrap-4.2.4}/setup.py +3 -1
  21. {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_cube_files.py +71 -1
  22. {extrap-4.2.2 → extrap-4.2.4}/AUTHORS.md +0 -0
  23. {extrap-4.2.2 → extrap-4.2.4}/LICENSE +0 -0
  24. {extrap-4.2.2 → extrap-4.2.4}/MANIFEST.in +0 -0
  25. {extrap-4.2.2 → extrap-4.2.4}/extrap/__main__.py +0 -0
  26. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/__init__.py +0 -0
  27. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/annotations/__init__.py +0 -0
  28. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/annotations/comment_annotation/__init__.py +0 -0
  29. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/annotations/comment_annotation/comment_base.svg +0 -0
  30. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/callpath.py +0 -0
  31. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/calltree.py +0 -0
  32. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/coordinate.py +0 -0
  33. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/experiment.py +0 -0
  34. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/fraction.py +0 -0
  35. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/hypotheses.py +0 -0
  36. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/metric.py +0 -0
  37. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/model.py +0 -0
  38. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/parameter.py +0 -0
  39. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/scaling_type.py +0 -0
  40. {extrap-4.2.2 → extrap-4.2.4}/extrap/entities/terms.py +0 -0
  41. {extrap-4.2.2 → extrap-4.2.4}/extrap/extrap/__init__.py +0 -0
  42. {extrap-4.2.2 → extrap-4.2.4}/extrap/extrap/extrapcmd.py +0 -0
  43. {extrap-4.2.2 → extrap-4.2.4}/extrap/extrap/extrapgui.py +0 -0
  44. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/__init__.py +0 -0
  45. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/experiment_io.py +0 -0
  46. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/__init__.py +0 -0
  47. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/abstract_directory_reader.py +0 -0
  48. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/extrap3_experiment_reader.py +0 -0
  49. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/file_reader_mixin.py +0 -0
  50. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/json_file_reader.py +0 -0
  51. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/jsonlines_file_reader.py +0 -0
  52. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/talpas_file_reader.py +0 -0
  53. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/file_reader/text_file_reader.py +0 -0
  54. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/io_helper.py +0 -0
  55. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/output.py +0 -0
  56. {extrap-4.2.2 → extrap-4.2.4}/extrap/fileio/values_io.py +0 -0
  57. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/AdvancedPlotWidget.py +0 -0
  58. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ColorWidget.py +0 -0
  59. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/DataDisplay.py +0 -0
  60. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ImportOptionsDialog.py +0 -0
  61. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/LogWidget.py +0 -0
  62. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/MainWidget.py +0 -0
  63. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/MeasurementWizardWidget.py +0 -0
  64. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ModelerOptionsWidget.py +0 -0
  65. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/ModelerWidget.py +0 -0
  66. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/PlotTypeSelector.py +0 -0
  67. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/StrongScalingConversionDialog.py +0 -0
  68. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/TreeView.py +0 -0
  69. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/Utils.py +0 -0
  70. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/__init__.py +0 -0
  71. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/ParameterValueSlider.py +0 -0
  72. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/ProgressWindow.py +0 -0
  73. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/__init__.py +0 -0
  74. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/annotation_delegate.py +0 -0
  75. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/dynamic_options.py +0 -0
  76. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/file_dialog.py +0 -0
  77. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/model_color_map.py +0 -0
  78. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/plot_formatting_options.py +0 -0
  79. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/switch_widget.py +0 -0
  80. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/components/worker.py +0 -0
  81. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/AbstractPlotWidget.py +0 -0
  82. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/AllFunctionsAsDifferentSurfacePlotWidget.py +0 -0
  83. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/AllFunctionsAsOneSurfacePlotWidget.py +0 -0
  84. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/DominatingFunctionsAsHeatMapWidget.py +0 -0
  85. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/DominatingFunctionsAsSingleScatterPlotWidget.py +0 -0
  86. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/HeatMapGraphWidget.py +0 -0
  87. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/InterpolatedContourDisplayWidget.py +0 -0
  88. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/IsolinesDisplayWidget.py +0 -0
  89. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/MaxZAsSingleSurfacePlotWidget.py +0 -0
  90. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/MeasurementPointsPlotWidget.py +0 -0
  91. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/plots/__init__.py +0 -0
  92. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/resources/__init__.py +0 -0
  93. {extrap-4.2.2 → extrap-4.2.4}/extrap/gui/resources/menu.svg +0 -0
  94. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/__init__.py +0 -0
  95. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/abstract_modeler.py +0 -0
  96. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/loader.py +0 -0
  97. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/modeler_options.py +0 -0
  98. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/multi_parameter/__init__.py +0 -0
  99. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/__init__.py +0 -0
  100. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/basic.py +0 -0
  101. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/refining.py +0 -0
  102. {extrap-4.2.2 → extrap-4.2.4}/extrap/modelers/single_parameter/segmented.py +0 -0
  103. {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/__init__.py +0 -0
  104. {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/add_selection_strategy.py +0 -0
  105. {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/base_selection_strategy.py +0 -0
  106. {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/gpr_selection_strategy.py +0 -0
  107. {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/measurement_point_advisor.py +0 -0
  108. {extrap-4.2.2 → extrap-4.2.4}/extrap/mpa/util.py +0 -0
  109. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/__init__.py +0 -0
  110. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/caching.py +0 -0
  111. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/classproperty.py +0 -0
  112. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/deprecation.py +0 -0
  113. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/dynamic_options.py +0 -0
  114. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/exceptions.py +0 -0
  115. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/extension_loader.py +0 -0
  116. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/formatting_helper.py +0 -0
  117. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/latex_formatting.py +0 -0
  118. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/options_parser.py +0 -0
  119. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/progress_bar.py +0 -0
  120. {extrap-4.2.2 → extrap-4.2.4}/extrap/util/unique_list.py +0 -0
  121. {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/SOURCES.txt +0 -0
  122. {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/dependency_links.txt +0 -0
  123. {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/entry_points.txt +0 -0
  124. {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/requires.txt +0 -0
  125. {extrap-4.2.2 → extrap-4.2.4}/extrap.egg-info/top_level.txt +0 -0
  126. {extrap-4.2.2 → extrap-4.2.4}/setup.cfg +0 -0
  127. {extrap-4.2.2 → extrap-4.2.4}/tests/test_basic_modeler.py +0 -0
  128. {extrap-4.2.2 → extrap-4.2.4}/tests/test_compat.py +0 -0
  129. {extrap-4.2.2 → extrap-4.2.4}/tests/test_console.py +0 -0
  130. {extrap-4.2.2 → extrap-4.2.4}/tests/test_fraction.py +0 -0
  131. {extrap-4.2.2 → extrap-4.2.4}/tests/test_gui.py +0 -0
  132. {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_extrap3_experiment.py +0 -0
  133. {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_json_file.py +0 -0
  134. {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_jsonlines_file.py +0 -0
  135. {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_save_experiment.py +0 -0
  136. {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_talpas_file.py +0 -0
  137. {extrap-4.2.2 → extrap-4.2.4}/tests/test_load_text_file.py +0 -0
  138. {extrap-4.2.2 → extrap-4.2.4}/tests/test_measurement.py +0 -0
  139. {extrap-4.2.2 → extrap-4.2.4}/tests/test_modeler_adaptive.py +0 -0
  140. {extrap-4.2.2 → extrap-4.2.4}/tests/test_modeling.py +0 -0
  141. {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa.py +0 -0
  142. {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa_base_strategy.py +0 -0
  143. {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa_gpr_strategy.py +0 -0
  144. {extrap-4.2.2 → extrap-4.2.4}/tests/test_mpa_utils.py +0 -0
  145. {extrap-4.2.2 → extrap-4.2.4}/tests/test_multi_param_modeler.py +0 -0
  146. {extrap-4.2.2 → extrap-4.2.4}/tests/test_output.py +0 -0
  147. {extrap-4.2.2 → extrap-4.2.4}/tests/test_refining_modeler.py +0 -0
  148. {extrap-4.2.2 → extrap-4.2.4}/tests/test_scaling_detection.py +0 -0
  149. {extrap-4.2.2 → extrap-4.2.4}/tests/test_segmented_modeler.py +0 -0
  150. {extrap-4.2.2 → extrap-4.2.4}/tests/test_serialization.py +0 -0
  151. {extrap-4.2.2 → extrap-4.2.4}/tests/test_serializing_segments.py +0 -0
  152. {extrap-4.2.2 → extrap-4.2.4}/tests/test_serializing_values.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: extrap
3
- Version: 4.2.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
- @inproceedings{calotoiu_ea:2013:modeling,
158
- author = {Calotoiu, Alexandru and Hoefler, Torsten and Poke, Marius and Wolf, Felix},
159
- month = {November},
160
- title = {Using Automated Performance Modeling to Find Scalability Bugs in Complex Codes},
161
- booktitle = {Proc. of the ACM/IEEE Conference on Supercomputing (SC13), Denver, CO, USA},
162
- year = {2013},
163
- pages = {1--12},
164
- publisher = {ACM},
165
- isbn = {978-1-4503-2378-9},
166
- doi = {10.1145/2503210.2503277}
167
- }
168
-
169
- ### Publications
170
-
171
- 1. Alexandru Calotoiu, David Beckingsale, Christopher W. Earl, Torsten Hoefler, Ian Karlin, Martin Schulz, Felix Wolf:
172
- Fast Multi-Parameter Performance Modeling. In Proc. of the 2016 IEEE International Conference on Cluster Computing (
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
- 2. Marcus Ritter, Alexandru Calotoiu, Sebastian Rinke, Thorsten Reimann, Torsten Hoefler, Felix Wolf: *Learning
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
- 3. Marcus Ritter, Alexander Geiß, Johannes Wehrstein, Alexandru Calotoiu, Thorsten Reimann, Torsten Hoefler, Felix Wolf:
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
- @inproceedings{calotoiu_ea:2013:modeling,
119
- author = {Calotoiu, Alexandru and Hoefler, Torsten and Poke, Marius and Wolf, Felix},
120
- month = {November},
121
- title = {Using Automated Performance Modeling to Find Scalability Bugs in Complex Codes},
122
- booktitle = {Proc. of the ACM/IEEE Conference on Supercomputing (SC13), Denver, CO, USA},
123
- year = {2013},
124
- pages = {1--12},
125
- publisher = {ACM},
126
- isbn = {978-1-4503-2378-9},
127
- doi = {10.1145/2503210.2503277}
128
- }
129
-
130
- ### Publications
131
-
132
- 1. Alexandru Calotoiu, David Beckingsale, Christopher W. Earl, Torsten Hoefler, Ian Karlin, Martin Schulz, Felix Wolf:
133
- Fast Multi-Parameter Performance Modeling. In Proc. of the 2016 IEEE International Conference on Cluster Computing (
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
- 2. Marcus Ritter, Alexandru Calotoiu, Sebastian Rinke, Thorsten Reimann, Torsten Hoefler, Felix Wolf: *Learning
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
- 3. Marcus Ritter, Alexander Geiß, Johannes Wehrstein, Alexandru Calotoiu, Thorsten Reimann, Torsten Hoefler, Felix Wolf:
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-2024, Technical University of Darmstadt, Germany
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.2"
9
+ __version__ = "4.2.4"
10
10
  __description__ = "Extra-P, automated performance modeling for HPC applications"
11
- __copyright__ = "Copyright (c) 2020-2024 Technical University of Darmstadt, Darmstadt, Germany"
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-2024, Technical University of Darmstadt, Germany
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
- return self.__dict__ == other.__dict__
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-2024, Technical University of Darmstadt, Germany
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-2022, Technical University of Darmstadt, Germany
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, Mapping, Any
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: Mapping[str, Any] = tags or {}
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
- non_zero_value_mask = values != 0
224
- masked_array = ma.array(values, mask=non_zero_value_mask)
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
- non_zero_value_mask = values != 0
245
- aggregated_values[(callpath, metric)].append(ma.array(values, mask=non_zero_value_mask))
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-2024, Technical University of Darmstadt, Germany
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
- previous = numpy.seterr(invalid='ignore', divide='ignore')
573
- y_list = function.evaluate(x_list).reshape(-1)
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
- previous = numpy.seterr(invalid='ignore', divide='ignore')
589
- for function in functions:
590
- y_list += function.evaluate(x_list).reshape(-1)
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
- previous = numpy.seterr(invalid='ignore', divide='ignore')
745
-
746
- if self.combine_all_callpath:
747
- y_agg = 0
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
- y_agg = y_agg + function.evaluate(pv_list)
751
- y_max = max(y_agg, y_max)
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
- y_agg += y
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-2024, Technical University of Darmstadt, Germany
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
- previous = numpy.seterr(divide='ignore', invalid='ignore')
350
- value_list = self.iterate_children(model_set.models, param_value_list, nodes, selected_metric)
351
- numpy.seterr(**previous)
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-2024, Technical University of Darmstadt, Germany
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
- previous = numpy.seterr(divide='ignore', invalid='ignore')
152
- if role == Qt.ToolTipRole and isinstance(model, SegmentedModel):
153
- res = _format_number_segmented_model(model, lambda m: m.hypothesis.function.evaluate(parameters))
154
- else:
155
- res = formatNumber(str(formula.evaluate(parameters)))
156
- numpy.seterr(**previous)
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
- previous = numpy.seterr(divide='ignore', invalid='ignore')
184
- value = formula.evaluate(parameters)
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-2024, Technical University of Darmstadt, Germany
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:2px -1px -1px 0px; margin-left:-1px; '
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-2024, Technical University of Darmstadt, Germany
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
- previous = np.seterr(invalid='ignore', divide='ignore')
109
- for model in model_list:
110
- function = model.hypothesis.function
111
- zs = self.calculate_z_optimized(X, Y, function)
112
- Z = zs.reshape(X.shape)
113
- z_List.append(zs)
114
- Z_List.append(Z)
115
- max_z = max(max_z, np.max(zs[np.logical_not(np.isinf(zs))]))
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