qplotter 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qplot/__init__.py +46 -0
- qplot/__main__.py +232 -0
- qplot/_auxiliary_paths.py +67 -0
- qplot/_build_info.json +1 -0
- qplot/_metadata.py +75 -0
- qplot/_repair.py +14 -0
- qplot/_shutdown_supervisor.py +4049 -0
- qplot/_version.py +12 -0
- qplot/_windows_shutdown_job.py +1166 -0
- qplot/configuration/__init__.py +3 -0
- qplot/configuration/config.py +578 -0
- qplot/configuration/config_schema.json +357 -0
- qplot/configuration/fonts.py +3 -0
- qplot/configuration/scripts.py +255 -0
- qplot/configuration/themes/__init__.py +13 -0
- qplot/configuration/themes/_base.py +592 -0
- qplot/configuration/themes/blank.py +17 -0
- qplot/configuration/themes/dark.py +54 -0
- qplot/configuration/themes/light.py +54 -0
- qplot/datahandling/LoadFromDB.py +224 -0
- qplot/datahandling/__init__.py +47 -0
- qplot/datahandling/_trusted_live_helper.py +812 -0
- qplot/datahandling/_trusted_live_protocol.py +1745 -0
- qplot/datahandling/database.py +2340 -0
- qplot/datahandling/dimensions.py +43 -0
- qplot/datahandling/file_identity.py +461 -0
- qplot/datahandling/parameter_data.py +149 -0
- qplot/datahandling/plot_progress.py +17 -0
- qplot/datahandling/qcodes_cache.py +277 -0
- qplot/datahandling/qcodes_compat.py +14 -0
- qplot/datahandling/readSQL.py +2442 -0
- qplot/datahandling/readonly.py +2566 -0
- qplot/datahandling/source_activity.py +21 -0
- qplot/datahandling/trusted_array_preview.py +148 -0
- qplot/datahandling/trusted_derived_cache.py +1605 -0
- qplot/datahandling/trusted_derived_rendering.py +876 -0
- qplot/datahandling/trusted_heatmap.py +246 -0
- qplot/datahandling/trusted_live.py +2808 -0
- qplot/datahandling/trusted_live_queries.py +5907 -0
- qplot/datahandling/trusted_live_service.py +1919 -0
- qplot/datahandling/trusted_live_supervisor.py +2161 -0
- qplot/datahandling/trusted_plot.py +283 -0
- qplot/datahandling/trusted_presentation.py +1065 -0
- qplot/datahandling/trusted_snapshot.py +1132 -0
- qplot/datahandling/trusted_work_coordinator.py +2157 -0
- qplot/datahandling/trusted_work_scheduler.py +1204 -0
- qplot/diagnostics.py +241 -0
- qplot/resources/testdata/qplot_test_db_01_10mb.csv +11 -0
- qplot/resources/testdata/qplot_test_db_02_25mb.csv +14 -0
- qplot/resources/testdata/qplot_test_db_03_50mb.csv +17 -0
- qplot/resources/testdata/qplot_test_db_04_100mb.csv +20 -0
- qplot/resources/testdata/qplot_test_db_05_250mb.csv +23 -0
- qplot/resources/testdata/qplot_test_db_06_500mb.csv +26 -0
- qplot/resources/testdata/qplot_test_db_07_1gb.csv +29 -0
- qplot/resources/testdata/qplot_test_db_08_5gb.csv +32 -0
- qplot/resources/testdata/qplot_test_db_09_10gb.csv +35 -0
- qplot/resources/testdata/qplot_test_db_10_30gb.csv +38 -0
- qplot/testdata.py +1804 -0
- qplot/tools/__init__.py +13 -0
- qplot/tools/finite_means.py +123 -0
- qplot/tools/general.py +139 -0
- qplot/tools/heatmap_geometry.py +391 -0
- qplot/tools/operation_registry.py +179 -0
- qplot/tools/plot_tools.py +650 -0
- qplot/tools/sample_statistics.py +111 -0
- qplot/tools/worker.py +2838 -0
- qplot/windows/__init__.py +9 -0
- qplot/windows/_colorbar.py +422 -0
- qplot/windows/_commands.py +523 -0
- qplot/windows/_config_persistence.py +123 -0
- qplot/windows/_database_actions.py +4933 -0
- qplot/windows/_dataset_handle.py +221 -0
- qplot/windows/_display_precision.py +48 -0
- qplot/windows/_dragdrop.py +70 -0
- qplot/windows/_export_paths.py +1167 -0
- qplot/windows/_help.py +210 -0
- qplot/windows/_mixed_appearance.py +303 -0
- qplot/windows/_mixed_plots.py +461 -0
- qplot/windows/_native_averaging.py +323 -0
- qplot/windows/_native_transforms.py +551 -0
- qplot/windows/_plot1d_snap.py +612 -0
- qplot/windows/_plot1d_traces.py +2236 -0
- qplot/windows/_plot2d_colorbar.py +1127 -0
- qplot/windows/_plot2d_colorbar_dialog.py +786 -0
- qplot/windows/_plot2d_layers.py +2291 -0
- qplot/windows/_plot2d_sweeps.py +712 -0
- qplot/windows/_plotWin.py +2082 -0
- qplot/windows/_plot_actions.py +2703 -0
- qplot/windows/_plot_annotation.py +186 -0
- qplot/windows/_plot_appearance.py +283 -0
- qplot/windows/_plot_axis_scaling.py +1521 -0
- qplot/windows/_plot_data_viewbox.py +94 -0
- qplot/windows/_plot_drop_axes.py +224 -0
- qplot/windows/_plot_export.py +1445 -0
- qplot/windows/_plot_feedback.py +112 -0
- qplot/windows/_plot_marquee.py +659 -0
- qplot/windows/_plot_refresh.py +950 -0
- qplot/windows/_plot_source_promotion.py +178 -0
- qplot/windows/_plot_state.py +237 -0
- qplot/windows/_plot_status.py +115 -0
- qplot/windows/_plot_tiling.py +35 -0
- qplot/windows/_plot_transform_labels.py +60 -0
- qplot/windows/_preferences.py +724 -0
- qplot/windows/_refresh_interval.py +172 -0
- qplot/windows/_run_controls.py +789 -0
- qplot/windows/_shortcuts.py +47 -0
- qplot/windows/_subplots/__init__.py +8 -0
- qplot/windows/_subplots/subplot1d.py +532 -0
- qplot/windows/_subplots/subplot2d.py +919 -0
- qplot/windows/_svg_export.py +209 -0
- qplot/windows/_trusted_derived_qt.py +1759 -0
- qplot/windows/_widgets/__init__.py +23 -0
- qplot/windows/_widgets/_run_formatting.py +387 -0
- qplot/windows/_widgets/details_tables.py +1119 -0
- qplot/windows/_widgets/dropbox.py +290 -0
- qplot/windows/_widgets/operations.py +460 -0
- qplot/windows/_widgets/preview.py +2997 -0
- qplot/windows/_widgets/run_list_items.py +488 -0
- qplot/windows/_widgets/toolbar.py +111 -0
- qplot/windows/_widgets/treeWidgets.py +2572 -0
- qplot/windows/_window_controls.py +414 -0
- qplot/windows/main.py +1632 -0
- qplot/windows/plot1d.py +313 -0
- qplot/windows/plot2d.py +1935 -0
- qplotter-1.6.0.dist-info/METADATA +322 -0
- qplotter-1.6.0.dist-info/RECORD +130 -0
- qplotter-1.6.0.dist-info/WHEEL +5 -0
- qplotter-1.6.0.dist-info/entry_points.txt +4 -0
- qplotter-1.6.0.dist-info/licenses/LICENSE +21 -0
- qplotter-1.6.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""Finite sample summaries without offset loss or intermediate overflow."""
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
from fractions import Fraction
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _scalar(value):
|
|
10
|
+
return value.item() if isinstance(value, np.generic) else value
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def sample_fraction(value):
|
|
14
|
+
"""Retain a recorded scalar exactly, including NumPy extended floats."""
|
|
15
|
+
if isinstance(value, np.floating):
|
|
16
|
+
# longdouble.item() can remain a NumPy scalar, which Fraction does
|
|
17
|
+
# not accept. Its integer ratio also preserves wider mantissas.
|
|
18
|
+
return Fraction(*value.as_integer_ratio())
|
|
19
|
+
return Fraction(_scalar(value))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _binary_total(values, check_cancelled):
|
|
23
|
+
"""Accumulate recorded integers/binary floats without per-cell Fractions."""
|
|
24
|
+
total, denominator = 0, 1
|
|
25
|
+
if values.dtype.kind in "iu":
|
|
26
|
+
flat = values.ravel()
|
|
27
|
+
for start in range(0, values.size, 65536):
|
|
28
|
+
check_cancelled()
|
|
29
|
+
total += np.sum(flat[start:start + 65536], dtype=object)
|
|
30
|
+
return int(total), denominator
|
|
31
|
+
for index, value in enumerate(values.flat):
|
|
32
|
+
if index % 1024 == 0:
|
|
33
|
+
check_cancelled()
|
|
34
|
+
if isinstance(value, (int, np.integer)):
|
|
35
|
+
total += int(value) * denominator
|
|
36
|
+
elif isinstance(value, (float, np.floating)):
|
|
37
|
+
numerator, divisor = value.as_integer_ratio()
|
|
38
|
+
# Binary denominators are powers of two, so their maximum is
|
|
39
|
+
# their common denominator. Neither source nor total is rounded.
|
|
40
|
+
if divisor > denominator:
|
|
41
|
+
total *= divisor // denominator
|
|
42
|
+
denominator = divisor
|
|
43
|
+
total += numerator * (denominator // divisor)
|
|
44
|
+
else:
|
|
45
|
+
return None
|
|
46
|
+
return total, denominator
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def finite_mean(values, *, check_cancelled=lambda: None):
|
|
50
|
+
"""Mean finite recorded samples, retaining integer and decimal precision."""
|
|
51
|
+
values = np.asarray(values)
|
|
52
|
+
|
|
53
|
+
def samples():
|
|
54
|
+
for index, value in enumerate(values.flat):
|
|
55
|
+
if index % 1024 == 0:
|
|
56
|
+
check_cancelled()
|
|
57
|
+
yield value
|
|
58
|
+
|
|
59
|
+
if values.dtype.kind in "iuO":
|
|
60
|
+
exact = _binary_total(values, check_cancelled)
|
|
61
|
+
if exact is not None:
|
|
62
|
+
total, denominator = exact
|
|
63
|
+
check_cancelled()
|
|
64
|
+
return float(Fraction(total, denominator * values.size))
|
|
65
|
+
return float(sum((sample_fraction(v) for v in samples()), Fraction()) / values.size)
|
|
66
|
+
try:
|
|
67
|
+
return math.fsum(samples()) / values.size
|
|
68
|
+
except OverflowError:
|
|
69
|
+
# The sum can exceed float's range even though its mean cannot.
|
|
70
|
+
return float(sum((Fraction(float(v)) for v in samples()), Fraction()) / values.size)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def finite_standard_deviation(values):
|
|
74
|
+
"""Population deviation with subtraction before conversion and scaling."""
|
|
75
|
+
values = np.asarray(values).ravel()
|
|
76
|
+
if values.dtype.kind in "iuO":
|
|
77
|
+
anchor = sample_fraction(values[0])
|
|
78
|
+
try:
|
|
79
|
+
if values.dtype.kind in "iu":
|
|
80
|
+
# Python-integer subtraction cannot wrap at signed/unsigned
|
|
81
|
+
# endpoints and converts only the already-centered values.
|
|
82
|
+
shifted = (values.astype(object) - anchor.numerator).astype(float)
|
|
83
|
+
else:
|
|
84
|
+
def difference(value):
|
|
85
|
+
if isinstance(value, (int, np.integer)):
|
|
86
|
+
numerator, denominator = int(value), 1
|
|
87
|
+
elif isinstance(value, (float, np.floating)):
|
|
88
|
+
numerator, denominator = value.as_integer_ratio()
|
|
89
|
+
else:
|
|
90
|
+
return float(sample_fraction(value) - anchor)
|
|
91
|
+
return (numerator * anchor.denominator - anchor.numerator * denominator) / (
|
|
92
|
+
denominator * anchor.denominator)
|
|
93
|
+
shifted = np.fromiter((difference(v) for v in values), dtype=float, count=values.size)
|
|
94
|
+
except OverflowError:
|
|
95
|
+
shifted = np.full(values.shape, np.inf)
|
|
96
|
+
else:
|
|
97
|
+
values = values.astype(np.float64, copy=False)
|
|
98
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
99
|
+
shifted = values - values[0]
|
|
100
|
+
if not np.all(np.isfinite(shifted)):
|
|
101
|
+
# Opposite finite extremes can have unrepresentable differences.
|
|
102
|
+
scale = float(np.max(np.abs(values.astype(float))))
|
|
103
|
+
normalized = values.astype(float) / scale
|
|
104
|
+
else:
|
|
105
|
+
scale = float(np.max(np.abs(shifted)))
|
|
106
|
+
if scale == 0:
|
|
107
|
+
return 0.
|
|
108
|
+
normalized = shifted / scale
|
|
109
|
+
centered = normalized - finite_mean(normalized)
|
|
110
|
+
variance = math.fsum(float(v) * float(v) for v in centered) / values.size
|
|
111
|
+
return math.sqrt(variance) * scale
|