epyt-flow 0.8.0__py3-none-any.whl → 0.9.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.
Files changed (46) hide show
  1. epyt_flow/VERSION +1 -1
  2. epyt_flow/__init__.py +1 -0
  3. epyt_flow/data/benchmarks/batadal.py +1 -1
  4. epyt_flow/data/benchmarks/battledim.py +4 -3
  5. epyt_flow/data/benchmarks/gecco_water_quality.py +4 -4
  6. epyt_flow/data/benchmarks/leakdb.py +9 -9
  7. epyt_flow/data/benchmarks/water_usage.py +2 -2
  8. epyt_flow/data/networks.py +15 -27
  9. epyt_flow/gym/control_gyms.py +2 -2
  10. epyt_flow/gym/scenario_control_env.py +1 -1
  11. epyt_flow/metrics.py +28 -28
  12. epyt_flow/models/sensor_interpolation_detector.py +3 -3
  13. epyt_flow/rest_api/base_handler.py +4 -4
  14. epyt_flow/rest_api/scada_data/data_handlers.py +11 -11
  15. epyt_flow/rest_api/scada_data/export_handlers.py +2 -2
  16. epyt_flow/rest_api/scada_data/handlers.py +9 -9
  17. epyt_flow/rest_api/scenario/event_handlers.py +6 -6
  18. epyt_flow/rest_api/scenario/handlers.py +15 -15
  19. epyt_flow/rest_api/scenario/simulation_handlers.py +7 -7
  20. epyt_flow/rest_api/scenario/uncertainty_handlers.py +6 -6
  21. epyt_flow/serialization.py +4 -2
  22. epyt_flow/simulation/events/actuator_events.py +1 -1
  23. epyt_flow/simulation/events/leakages.py +1 -1
  24. epyt_flow/simulation/events/quality_events.py +16 -5
  25. epyt_flow/simulation/events/sensor_reading_attack.py +1 -1
  26. epyt_flow/simulation/events/sensor_reading_event.py +3 -3
  27. epyt_flow/simulation/events/system_event.py +1 -1
  28. epyt_flow/simulation/parallel_simulation.py +1 -1
  29. epyt_flow/simulation/scada/advanced_control.py +2 -2
  30. epyt_flow/simulation/scada/scada_data.py +117 -131
  31. epyt_flow/simulation/scada/scada_data_export.py +1 -1
  32. epyt_flow/simulation/scenario_config.py +1 -1
  33. epyt_flow/simulation/scenario_simulator.py +120 -26
  34. epyt_flow/simulation/scenario_visualizer.py +9 -9
  35. epyt_flow/simulation/sensor_config.py +22 -28
  36. epyt_flow/topology.py +2 -2
  37. epyt_flow/uncertainty/model_uncertainty.py +624 -147
  38. epyt_flow/uncertainty/sensor_noise.py +94 -19
  39. epyt_flow/uncertainty/uncertainties.py +4 -4
  40. epyt_flow/uncertainty/utils.py +7 -7
  41. epyt_flow/utils.py +9 -8
  42. {epyt_flow-0.8.0.dist-info → epyt_flow-0.9.0.dist-info}/METADATA +1 -1
  43. {epyt_flow-0.8.0.dist-info → epyt_flow-0.9.0.dist-info}/RECORD +46 -46
  44. {epyt_flow-0.8.0.dist-info → epyt_flow-0.9.0.dist-info}/LICENSE +0 -0
  45. {epyt_flow-0.8.0.dist-info → epyt_flow-0.9.0.dist-info}/WHEEL +0 -0
  46. {epyt_flow-0.8.0.dist-info → epyt_flow-0.9.0.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,8 @@
2
2
  Module provides a class for implementing sensor noise (e.g. uncertainty in sensor readings).
3
3
  """
4
4
  from copy import deepcopy
5
+ import warnings
6
+ from typing import Callable
5
7
  import numpy
6
8
 
7
9
  from .uncertainties import Uncertainty
@@ -15,46 +17,115 @@ class SensorNoise(JsonSerializable):
15
17
 
16
18
  Parameters
17
19
  ----------
18
- uncertainty : :class:`~epyt_flow.uncertainty.uncertainties.Uncertainty`
19
- Sensor uncertainty.
20
+ global_uncertainty : :class:`~epyt_flow.uncertainty.uncertainties.Uncertainty`, optional
21
+ Global sensor uncertainty. If None, no global sensor uncertainties are applied.
22
+
23
+ The default is None.
24
+ local_uncertainties : dict[tuple[int, str], :class:`~epyt_flow.uncertainty.uncertainties.Uncertainty`], optional
25
+ Local (i.e. sensor specific) uncertainties.
26
+ If None, no local sensor uncertainties are applied.
27
+
28
+ The default is None.
20
29
  """
21
- def __init__(self, uncertainty: Uncertainty, **kwds):
22
- if not isinstance(uncertainty, Uncertainty):
30
+ def __init__(self, uncertainty: Uncertainty = None,
31
+ global_uncertainty: Uncertainty = None,
32
+ local_uncertainties: dict[int, str, Uncertainty] = None,
33
+ **kwds):
34
+ if uncertainty is not None:
35
+ global_uncertainty = uncertainty
36
+ warnings.warn("'uncertainty' is deprecated and will be removed in future releases. " +
37
+ "Use 'global_uncertainty' instead")
38
+
39
+ if not isinstance(global_uncertainty, Uncertainty):
23
40
  raise TypeError("'uncertainty' must be an instance of " +
24
- f"'epyt_flow.uncertainty.Uncertainty' not of {type(uncertainty)}")
25
-
26
- self.__uncertainty = uncertainty
41
+ "'epyt_flow.uncertainty.Uncertainty' but not of " +
42
+ f"'{type(global_uncertainty)}'")
43
+ if local_uncertainties is not None:
44
+ if not isinstance(local_uncertainties, dict):
45
+ raise TypeError("'local_uncertainties' must be an instance of " +
46
+ "'dict[tuple[int, str], epyt_flow.uncertainty.Uncertainty]' "+
47
+ f"but not of '{type(local_uncertainties)}'")
48
+ if any(not isinstance(key[0], int) or not isinstance(key[1], str) or
49
+ not isinstance(local_uncertainties[key], Uncertainty)
50
+ for key in local_uncertainties.keys()):
51
+ raise TypeError("'local_uncertainties' must be an instance of " +
52
+ "'dict[tuple[int, str], epyt_flow.uncertainty.Uncertainty]'")
53
+
54
+ self.__global_uncertainty = global_uncertainty
55
+ self.__local_uncertainties = local_uncertainties
27
56
 
28
57
  super().__init__(**kwds)
29
58
 
30
59
  @property
31
- def uncertainty(self) -> Uncertainty:
60
+ def global_uncertainty(self) -> Uncertainty:
32
61
  """
33
- Gets the Sensor readings uncertainty.
62
+ Returns the global sensor readings uncertainty.
34
63
 
35
64
  Returns
36
65
  -------
37
66
  :class:`~epyt_flow.uncertainty.uncertainties.Uncertainty`
38
- Sensor readings uncertainty.
67
+ Global sensor readings uncertainty.
68
+ """
69
+ return deepcopy(self.__global_uncertainty)
70
+
71
+ @property
72
+ def local_uncertainties(self) -> dict[int, str, Uncertainty]:
73
+ """
74
+ Returns the local (i.e. sensor specific) uncertainties.
75
+
76
+ Returns
77
+ -------
78
+ dict[tuple[int, str], :class:`~epyt_flow.uncertainty.uncertainties.Uncertainty`]
79
+ Local (i.e. sensor specific) uncertainties.
39
80
  """
40
- return deepcopy(self.__uncertainty)
81
+ return deepcopy(self.__local_uncertainties)
41
82
 
42
83
  def get_attributes(self) -> dict:
43
- return super().get_attributes() | {"uncertainty": self.__uncertainty}
84
+ return super().get_attributes() | {"global_uncertainty": self.__global_uncertainty,
85
+ "local_uncertainties": self.__local_uncertainties}
44
86
 
45
87
  def __eq__(self, other) -> bool:
46
88
  if not isinstance(other, SensorNoise):
47
89
  raise TypeError("Can not compare 'SensorNoise' instance " +
48
90
  f"with '{type(other)}' instance")
49
91
 
50
- return self.__uncertainty == other.uncertainty
92
+ return super().__eq__(other) and self.__global_uncertainty == other.global_uncertainty and \
93
+ self.__local_uncertainties == other.local_uncertainties
51
94
 
52
95
  def __str__(self) -> str:
53
- return f"uncertainty: {self.__uncertainty}"
96
+ return f"global_uncertainty: {self.__global_uncertainty} " + \
97
+ f"local_uncertainties: {self.__local_uncertainties}"
54
98
 
55
- def apply(self, sensor_readings: numpy.ndarray) -> numpy.ndarray:
99
+ def apply_local_uncertainty(self, map_sensor_to_idx: Callable[[int, str], int],
100
+ sensor_readings: numpy.ndarray) -> numpy.ndarray:
101
+ """
102
+ Applies the local (i.e. sensor specific) sensor uncertainties -- i.e. sensor readings
103
+ are perturbed according to the specified uncertainties.
104
+
105
+ Parameters
106
+ ----------
107
+ map_sensor_to_idx : `Callable[[int, str], int]`
108
+ Function mapping sensor type (int) and sensor id (e.g. node id, link id, etc.) to indices
109
+ in the final sensor readings.
110
+ sensor_readings : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
111
+ All (global) sensor readings (no matter if ther).
112
+
113
+ Returns
114
+ -------
115
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
116
+ Perturbed sensor readings.
117
+ """
118
+ if self.__local_uncertainties is None:
119
+ return sensor_readings
120
+ else:
121
+ for (sensor_type, sensor_id), uncertainty in map_sensor_to_idx.items():
122
+ idx = map_sensor_to_idx(sensor_type, sensor_id)
123
+ sensor_readings[:, idx] = uncertainty.apply_batch(sensor_readings[:, idx])
124
+ return sensor_readings
125
+
126
+ def apply_global_uncertainty(self, sensor_readings: numpy.ndarray) -> numpy.ndarray:
56
127
  """
57
- Applies the sensor uncertainty to given sensor readings -- i.e. sensor readings
128
+ Applies the global sensor uncertainty to given sensor readings -- i.e. sensor readings
58
129
  are perturbed according to the specified uncertainty.
59
130
 
60
131
  .. note::
@@ -63,11 +134,15 @@ class SensorNoise(JsonSerializable):
63
134
 
64
135
  Parameters
65
136
  ----------
66
- sensor_readings : `numpy.ndarray`
137
+ sensor_readings : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
138
+ All (global) senor readings.
67
139
 
68
140
  Returns
69
141
  -------
70
- `numpy.ndarray`
142
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
71
143
  Perturbed sensor readings.
72
144
  """
73
- return self.__uncertainty.apply_batch(sensor_readings)
145
+ if self.__global_uncertainty is None:
146
+ return sensor_readings
147
+ else:
148
+ return self.__global_uncertainty.apply_batch(sensor_readings)
@@ -86,12 +86,12 @@ class Uncertainty(ABC):
86
86
 
87
87
  Parameters
88
88
  ----------
89
- data : `numpy.ndarray`
89
+ data : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
90
90
  Array to be clipped.
91
91
 
92
92
  Returns
93
93
  -------
94
- `numpy.ndarray`
94
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
95
95
  Clipped data.
96
96
  """
97
97
  if self.__min_value is not None:
@@ -124,12 +124,12 @@ class Uncertainty(ABC):
124
124
 
125
125
  Parameters
126
126
  ----------
127
- data : `numpy.ndarray`
127
+ data : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
128
128
  Array of values to which the uncertainty is applied.
129
129
 
130
130
  Returns
131
131
  -------
132
- `numpy.ndarray`
132
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
133
133
  Uncertainty applied to `data`.
134
134
  """
135
135
  for t in range(data.shape[0]):
@@ -11,7 +11,7 @@ def smoothing(pattern: np.ndarray, sigma: float = 10.) -> np.ndarray:
11
11
 
12
12
  Parameters
13
13
  ----------
14
- pattern : `numpy.ndarray`
14
+ pattern : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
15
15
  The original pattern
16
16
  sigma : `float`, optional
17
17
  Standard deviation for the Gaussian filter.
@@ -32,7 +32,7 @@ def scale_to_range(pattern: np.ndarray, min_value: float, max_value: float) -> n
32
32
 
33
33
  Parameters
34
34
  ----------
35
- pattern : `numpy.ndarray`
35
+ pattern : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
36
36
  The pattern to be scaled.
37
37
  min_value : `float`
38
38
  Lower bound of the pattern.
@@ -41,7 +41,7 @@ def scale_to_range(pattern: np.ndarray, min_value: float, max_value: float) -> n
41
41
 
42
42
  Returns
43
43
  -------
44
- `numpy.ndarray`
44
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
45
45
  The scaled pattern.
46
46
  """
47
47
  if min_value is None or max_value is None:
@@ -65,7 +65,7 @@ def generate_random_gaussian_noise(n_samples: int):
65
65
 
66
66
  Returns
67
67
  -------
68
- `numpy.ndarray`
68
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
69
69
  Gaussian noise.
70
70
  """
71
71
  return np.random.normal(np.random.rand(), np.random.rand(), size=n_samples)
@@ -87,7 +87,7 @@ def generate_deep_random_gaussian_noise(n_samples: int, mean: float = None):
87
87
 
88
88
  Returns
89
89
  -------
90
- `numpy.ndarray`
90
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
91
91
  Random Gaussian noise.
92
92
  """
93
93
  noise = []
@@ -127,7 +127,7 @@ def create_deep_random_pattern(n_samples: int, min_value: float = 0., max_value:
127
127
 
128
128
  Returns
129
129
  -------
130
- `numpy.ndarray`
130
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
131
131
  Random pattern.
132
132
  """
133
133
  pattern = []
@@ -179,7 +179,7 @@ def _create_deep_random_pattern(start_value: float = None, min_length: int = 2,
179
179
 
180
180
  Returns
181
181
  -------
182
- `numpy.ndarray`
182
+ `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
183
183
  Random pattern.
184
184
  """
185
185
  pattern = []
epyt_flow/utils.py CHANGED
@@ -76,7 +76,7 @@ def plot_timeseries_data(data: np.ndarray, labels: list[str] = None, x_axis_labe
76
76
 
77
77
  Parameters
78
78
  ----------
79
- data : `numpy.ndarray`
79
+ data : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
80
80
  Time series data -- each row in `data` corresponds to a complete time series.
81
81
  labels : `list[str]`, optional
82
82
  Labels for each time series in `data`.
@@ -108,14 +108,14 @@ def plot_timeseries_data(data: np.ndarray, labels: list[str] = None, x_axis_labe
108
108
  i.e. a plot can not be shown and saved to a file at the same time!
109
109
 
110
110
  The default is None.
111
- ax : `matplotlib.axes.Axes`, optional
111
+ ax : `matplotlib.axes.Axes <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.html>`_, optional
112
112
  If not None, 'ax' is used for plotting.
113
113
 
114
114
  The default is None.
115
115
 
116
116
  Returns
117
117
  -------
118
- `matplotlib.axes.Axes`
118
+ `matplotlib.axes.Axes <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.html>`_
119
119
  Plot.
120
120
  """
121
121
  if not isinstance(data, np.ndarray):
@@ -198,11 +198,11 @@ def plot_timeseries_prediction(y: np.ndarray, y_pred: np.ndarray,
198
198
 
199
199
  Parameters
200
200
  ----------
201
- y : `numpy.ndarray`
201
+ y : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
202
202
  Ground truth values.
203
- y_pred : `numpy.ndarray`
203
+ y_pred : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_
204
204
  Predicted values.
205
- confidence_interval : `numpy.ndarray`, optional
205
+ confidence_interval : `numpy.ndarray <https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html>`_, optional
206
206
  Confidence interval (upper and lower value) for each prediction in `y_pred`.
207
207
  If not None, the confidence interval is plotted as well.
208
208
 
@@ -232,14 +232,14 @@ def plot_timeseries_prediction(y: np.ndarray, y_pred: np.ndarray,
232
232
  i.e. a plot can not be shown and saved to a file at the same time!
233
233
 
234
234
  The default is None.
235
- ax : `matplotlib.axes.Axes`, optional
235
+ ax : `matplotlib.axes.Axes <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.html>`_, optional
236
236
  If not None, 'axes' is used for plotting.
237
237
 
238
238
  The default is None.
239
239
 
240
240
  Returns
241
241
  -------
242
- `matplotlib.axes.Axes`
242
+ `matplotlib.axes.Axes <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.html>`_
243
243
  Plot.
244
244
  """
245
245
  if not isinstance(y_pred, np.ndarray):
@@ -342,6 +342,7 @@ def download_if_necessary(download_path: str, url: str, verbose: bool = True) ->
342
342
  content_length = int(response.headers.get('content-length', 0))
343
343
  with open(download_path, "wb") as file, tqdm(desc=download_path,
344
344
  total=content_length,
345
+ ascii=True,
345
346
  unit='B',
346
347
  unit_scale=True,
347
348
  unit_divisor=1024) as progress_bar:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: epyt-flow
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: EPyT-Flow -- EPANET Python Toolkit - Flow
5
5
  Author-email: André Artelt <aartelt@techfak.uni-bielefeld.de>, "Marios S. Kyriakou" <kiriakou.marios@ucy.ac.cy>, "Stelios G. Vrachimis" <vrachimis.stelios@ucy.ac.cy>
6
6
  License: MIT License
@@ -1,9 +1,9 @@
1
- epyt_flow/VERSION,sha256=pmeA2iMQO-rxJDK0GFCJZrMaKjp4f5RopbbNqoZnwe8,6
2
- epyt_flow/__init__.py,sha256=KNDiPWiHdB9a5ZF1ipjA1uoq61TwU2ThjaStpvSLBtY,1742
3
- epyt_flow/metrics.py,sha256=W-dolnrmWfoanyvg-knoe2QMUtFwV1xODp4D4EwsQ00,14261
4
- epyt_flow/serialization.py,sha256=aT4R0vXQgmHaOJ8cyWc8TjcnyFQzwjcHuNbtc1ggM6Y,14191
5
- epyt_flow/topology.py,sha256=8gqgJrKxw0zY69sIKo4NxrQAoXHP1Ni00U2DV09vR6g,25275
6
- epyt_flow/utils.py,sha256=GJDktl7ciUPJxqMg9f2nCnQf6DosNd2mxeKOy7omkik,15196
1
+ epyt_flow/VERSION,sha256=nYyU8a0-qWseKsSRT9pMuTx2tKPg2Mxt2JdtbAsifRU,6
2
+ epyt_flow/__init__.py,sha256=n-zI5G3DUofs_pNC5YNWopNPCPUtpL-jYi8RPH6eakw,1768
3
+ epyt_flow/metrics.py,sha256=R-Xz7zYLj7Yqi0u7VvmqYBD8sbhwbEp6plYAX7fg9nk,16249
4
+ epyt_flow/serialization.py,sha256=ly7tTgVEHVkgsX0dcrjCF-hrtPeimAo5d8xgsb2x648,14349
5
+ epyt_flow/topology.py,sha256=6ssDcUyHYNT8PGHyVysfs7TuAM5LmfkETrONC7uC30Q,25441
6
+ epyt_flow/utils.py,sha256=FWbmnfBoZOQG5cFkls4aQ4Y67H-PvtrK-wmOXtyc-Cg,15833
7
7
  epyt_flow/EPANET/compile_linux.sh,sha256=wcrDyiB8NkivmaC-X9FI2WxhY3IJqDLiyIbVTv2XEPY,489
8
8
  epyt_flow/EPANET/compile_macos.sh,sha256=1K33-bPdgr01EIf87YUvmOFHXyOkBWI6mKXQ8x1Hzmo,504
9
9
  epyt_flow/EPANET/EPANET/SRC_engines/AUTHORS,sha256=yie5yAsEEPY0984PmkSRUdqEU9rVvRSGGWmjxdwCYMU,925
@@ -80,61 +80,61 @@ epyt_flow/EPANET/EPANET-MSX/Src/smatrix.h,sha256=heHTNgQNNDTs_Jx0YBts7_B7dPg8VUF
80
80
  epyt_flow/EPANET/EPANET-MSX/Src/include/epanetmsx.h,sha256=L9y0VKHk5Fg1JZxID9uBzcvLZWOb1xuQP-MkmHH_LD4,3429
81
81
  epyt_flow/EPANET/EPANET-MSX/Src/include/epanetmsx_export.h,sha256=h5UMaf6pH_0asRJOmhWUGAZhyA180ui2Cz8_y5h1FKw,1054
82
82
  epyt_flow/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- epyt_flow/data/networks.py,sha256=ieL_rIQ21Wqm4_Ois2IyI54Qkv0R2FbbQfqA4MtsmQA,38393
83
+ epyt_flow/data/networks.py,sha256=Cr3ygIwSE182mOi0CnLmwTbtiOjo5XAVgn7zuW7yUhs,37899
84
84
  epyt_flow/data/benchmarks/__init__.py,sha256=nJ6hqPaPNp8YMizniev3fwOWpzvvNUBMoRF16wACUkE,754
85
- epyt_flow/data/benchmarks/batadal.py,sha256=sa_OZwO5XIbJONgGMwgok-KCGyHq07WpIQagVq-a-gw,11175
85
+ epyt_flow/data/benchmarks/batadal.py,sha256=E9kl0gI5HyL6LZ9ZoLZwdQBNHXKblWW1QV4E8ucr99s,11247
86
86
  epyt_flow/data/benchmarks/batadal_data.py,sha256=oIzcysGivMPAgrfzrk5l8i-j6Ii96DPcFa6sL4TSaw8,880
87
- epyt_flow/data/benchmarks/battledim.py,sha256=yLwiQB0x7yq197XSM77tjHm7E7ucTbrybFaNxZx2TtM,20448
87
+ epyt_flow/data/benchmarks/battledim.py,sha256=JS8nYZVTAhNhhUber_m3_rK-_J94Jqx9B-0DHBc_NfA,20756
88
88
  epyt_flow/data/benchmarks/battledim_data.py,sha256=0vHm-2eAiLv6U-n5dqUUWS1o_szFRy9mVJ3eqDRp4PE,3373
89
- epyt_flow/data/benchmarks/gecco_water_quality.py,sha256=1buZRJiNf4jsqWYg4Ud90GhqaiLVo4yij3RAZJkzsqE,10985
90
- epyt_flow/data/benchmarks/leakdb.py,sha256=bhqdJkFMBNdgvQyYWYIpFHFA5ly9Tt51z6nGkyo56-g,25117
89
+ epyt_flow/data/benchmarks/gecco_water_quality.py,sha256=Aes0Cua8w7Lz6CBD8JeK4etTvHY-oDX3GSq0JbseY2c,11409
90
+ epyt_flow/data/benchmarks/leakdb.py,sha256=IwOl0vLL5Fn5sJjWrB4eIq52nMx7kmdUpiB2HDGl_rs,25483
91
91
  epyt_flow/data/benchmarks/leakdb_data.py,sha256=FNssgMkC1wqWVlaOrrihr4Od9trEZY7KeK5KuBeRMvM,507058
92
- epyt_flow/data/benchmarks/water_usage.py,sha256=FLqjff3pha33oEU9ZM3UGPXn9eJJumsJH8Gdj7YFX3A,4778
92
+ epyt_flow/data/benchmarks/water_usage.py,sha256=COgsLRSzcG0JT5xh2qdDm7IjuMCx6n_zrdxOPupHiJY,4920
93
93
  epyt_flow/gym/__init__.py,sha256=KNTDtPTEtHwZ4ehHfj9qGw81Z9acFqPIgMzYUzH5_uM,115
94
- epyt_flow/gym/control_gyms.py,sha256=xbq1gjUC2i-TR_0jXBxXFM24lo_ykHLqMEEpmXPaGq0,1281
95
- epyt_flow/gym/scenario_control_env.py,sha256=SYev3RjPs4-m74V7gCmYrxtAEVEvE-H8I12eQ2NYRj8,12349
94
+ epyt_flow/gym/control_gyms.py,sha256=1Yi_ioLS8qNvHNOXuve6NWTd1_LH7QBsaJojObNKglw,1283
95
+ epyt_flow/gym/scenario_control_env.py,sha256=_xGzKpxk6jdQf21OZ757Uvv8-ktyI9mYUyJT6w4hodQ,12359
96
96
  epyt_flow/models/__init__.py,sha256=be5s08y1Tg66SuNYKGz5GnNMHThnQJo8SWJdT9493Kc,75
97
97
  epyt_flow/models/event_detector.py,sha256=idR7byBgloo07XEJEyMIwi49VW4wxJErLQtI-tJXWPs,789
98
- epyt_flow/models/sensor_interpolation_detector.py,sha256=5MBK9WlliGPonrNApf0j9lp-NjwF0iTwPDXx4yv7Fa0,3624
98
+ epyt_flow/models/sensor_interpolation_detector.py,sha256=WNuaiS_sUBvMAkHifpCIvx1gz2NEMQeT7kgLsVmXYCQ,3859
99
99
  epyt_flow/rest_api/__init__.py,sha256=4HilmXhdh6H56UHJBB2WUSULlEBUDnI1FPTP11ft3HE,126
100
- epyt_flow/rest_api/base_handler.py,sha256=I5ZcSiCJOH9sY5Ai_CdvSZ8PMVblyxCd82beE_2Sjlo,2262
100
+ epyt_flow/rest_api/base_handler.py,sha256=HDLXrMXqgWvxWAsB-3G4plyTyCv27_eBbq4eRl_FeBo,2609
101
101
  epyt_flow/rest_api/res_manager.py,sha256=j6-3FUBZNLKM9bCsIDZzSytfDYJbDLRwjn1mIPstTqI,2342
102
102
  epyt_flow/rest_api/server.py,sha256=kZlprvRw7op39s7KhtEt1TgAsqs94KTQEdzIW9NMMJc,7778
103
103
  epyt_flow/rest_api/scada_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
- epyt_flow/rest_api/scada_data/data_handlers.py,sha256=VpOQq_jb2d7CuZbPQ1lKfb5dd5UAkBp7H0mEtlDJMzo,10938
105
- epyt_flow/rest_api/scada_data/export_handlers.py,sha256=m5gM1u7z-KFZ5SCSS0f2Fs6PpAT8FX3FvCS2mp7DmTA,4450
106
- epyt_flow/rest_api/scada_data/handlers.py,sha256=tFVY11C3tolTkNVbXXBb0_KnHv38UE4fOUtnqkvec8Y,6893
104
+ epyt_flow/rest_api/scada_data/data_handlers.py,sha256=VGw3uakxhFgqLMYRC5OaAuCbp0SnGxdPXWruUVEBiJc,11895
105
+ epyt_flow/rest_api/scada_data/export_handlers.py,sha256=W-T2WgPuG8cNVzA8h3e0lwi-nSKFi11PPyuNQWTMwzg,4624
106
+ epyt_flow/rest_api/scada_data/handlers.py,sha256=jcGw91TjjhRQm_hJvjbWvSTBLpvMJDOA4bQw5iOpSUw,7673
107
107
  epyt_flow/rest_api/scenario/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
- epyt_flow/rest_api/scenario/event_handlers.py,sha256=oIqbXWQVqJp0MzE9V4UhGF4fXPF03oWbKEyLhC6g_Ko,3842
109
- epyt_flow/rest_api/scenario/handlers.py,sha256=bDqMa-jM4hOMVqs0XvQJtHbQDZx9FP40GiEGwW38fGk,12353
110
- epyt_flow/rest_api/scenario/simulation_handlers.py,sha256=oY1Ch6ZQgYT_5WeE1I7tvGqpDKlT664GHLdmcVKP7ek,5905
111
- epyt_flow/rest_api/scenario/uncertainty_handlers.py,sha256=uuu6AP11ZZUp2P3Dnukjg5ZTjyYKljlubg1xLN1GnXY,4048
108
+ epyt_flow/rest_api/scenario/event_handlers.py,sha256=rld6gbneARp079ege4IU5J5jefkZtOvgNnlFMi-fm18,4362
109
+ epyt_flow/rest_api/scenario/handlers.py,sha256=r355-4wjQGOH0vpDTOOIP9qC8bo_Sm7znir2BgNuweg,13656
110
+ epyt_flow/rest_api/scenario/simulation_handlers.py,sha256=A59Iv-6k7SlGF_RDQgoFlvHWM1mScvfCobXBW4Rhh6E,6511
111
+ epyt_flow/rest_api/scenario/uncertainty_handlers.py,sha256=Pdo2YmiawOqKXWcLs2P-lv5qN-OKHS3sDgkAFQeRzK8,4568
112
112
  epyt_flow/simulation/__init__.py,sha256=VGGJqJRUoXZjKJ0-m6KPp3JQqD_1TFW0pofLgkwZJ8M,164
113
- epyt_flow/simulation/parallel_simulation.py,sha256=VmC7xemjxRB_N0fx1AAQ7ux82tnyTi7jk7jfFpeg7gM,6523
114
- epyt_flow/simulation/scenario_config.py,sha256=fpG9vs9a7Wedf03cpIQGfB0SNpJlnYyoO6KFLrB2sJU,27188
115
- epyt_flow/simulation/scenario_simulator.py,sha256=NYivKsSegRuaMkpgodPx9qX4HJqrWYC-zFy4ix7V92g,114708
116
- epyt_flow/simulation/scenario_visualizer.py,sha256=U7bT4MGEb0IG2Y_HskqdDNBD_d8drcfoMC7hbL3idM4,59259
117
- epyt_flow/simulation/sensor_config.py,sha256=ZiTFQpyftLSVXd0p5egBxxHe47vD9af_1Tv7ppJR8Y0,92637
113
+ epyt_flow/simulation/parallel_simulation.py,sha256=ph4KXw9jCt-hiJFJbmC6fNvEsrbQoWV-tFKE5-qSfoQ,6523
114
+ epyt_flow/simulation/scenario_config.py,sha256=jtfqYEQ7Roa--kcCdZarS9lfPzNCeFQE5KTYzL3ENtI,27188
115
+ epyt_flow/simulation/scenario_simulator.py,sha256=iqYvM_p8BZLjjEGOrXT5hbLQL5gcPLcbkg0Ha_lV0Xk,118902
116
+ epyt_flow/simulation/scenario_visualizer.py,sha256=CITY1hjhZKfFINaecxsPfQmB7b_zEAzNrHu5rx8BvY4,59339
117
+ epyt_flow/simulation/sensor_config.py,sha256=rgLhnsOf1Ka9b7vnbd8OaAuoqAAgB4w6l42oMv16hw8,93444
118
118
  epyt_flow/simulation/events/__init__.py,sha256=gv8ZcvwjJN0Z5MwRXEOVFRNq4X5NPyyqXIQnhBxszQ0,215
119
- epyt_flow/simulation/events/actuator_events.py,sha256=2_MPYbYO9As6fMkm5Oy9pjSB9kCvFuKpGu8ykYDAydg,7903
119
+ epyt_flow/simulation/events/actuator_events.py,sha256=rEGWYxic5mH0guBw-yUnj9yTmhqzVeBwD2udx_IbAco,7913
120
120
  epyt_flow/simulation/events/event.py,sha256=kARPV20XCAl6zxnJwI9U7ICtZUPACO_rgAmtHm1mGCs,2603
121
- epyt_flow/simulation/events/leakages.py,sha256=EBH8i-9yu9F6MRG-rNFGhesk0sJspQ92Q7tQCghk-aY,17767
122
- epyt_flow/simulation/events/quality_events.py,sha256=Rp8t7aXZU4jGekdIRB85F9I5qtI4QQk3jX2Trfac5hM,7199
121
+ epyt_flow/simulation/events/leakages.py,sha256=pFSbOiKeGeHPZhLAgo2DFFI1QYImd7m167lMW6B-n-U,17838
122
+ epyt_flow/simulation/events/quality_events.py,sha256=y9i1U4xjwsoDZ55vtjl4KeJt5AbYJsfVt7X0Xw0Mq6Y,7965
123
123
  epyt_flow/simulation/events/sensor_faults.py,sha256=XX6k-GJh9RWZ4x54eGj9um-Ir9Eq41tY_9pRSCeYeqc,8447
124
- epyt_flow/simulation/events/sensor_reading_attack.py,sha256=bo5VavArN0wD5AHbIXJC9NFGZ7KR1uyWE6tBtwj0k9I,7538
125
- epyt_flow/simulation/events/sensor_reading_event.py,sha256=rQ-CmdpSUyZzDFYwNUGH2jGoj0oyU-aAb-7E8Oshhqw,6785
126
- epyt_flow/simulation/events/system_event.py,sha256=X6YGGjm0FTynL19wGST_BLXimGiotdpWdoEphT3496s,2515
124
+ epyt_flow/simulation/events/sensor_reading_attack.py,sha256=3de7J96zo8UnKsOEVpf-xvFbXDc8M5KS2r_diXmUBzU,7609
125
+ epyt_flow/simulation/events/sensor_reading_event.py,sha256=QdsdsfWd5SCsrkBt7UUJdwhI4q9nVqB4cl33GJFJ1js,6998
126
+ epyt_flow/simulation/events/system_event.py,sha256=IGypfTL-miosmwKd4DGTYvByyBcl8__0Asiifw-SzUQ,2606
127
127
  epyt_flow/simulation/scada/__init__.py,sha256=ZFAxJVqwEVsgiyFilFetnb13gPhZg1JEOPWYvKIJT4c,90
128
- epyt_flow/simulation/scada/advanced_control.py,sha256=5h7dmSMcNlTE7TMZa8gQVnOCGMf7uZy60r9aOfKDxMc,4487
129
- epyt_flow/simulation/scada/scada_data.py,sha256=qu5KVP0Gnu4r3M_FbLXJekGjlje77h7Ppcrj_ey4UjU,164106
130
- epyt_flow/simulation/scada/scada_data_export.py,sha256=iSz2SlpjVpK4jcx3iq6Zu7LbEAp_77fRyba_pkc5Pac,11572
128
+ epyt_flow/simulation/scada/advanced_control.py,sha256=LH6CS6vKUp6fUiq8uJZeNb-3VGBn-88MZ2VdF7CArCc,4669
129
+ epyt_flow/simulation/scada/scada_data.py,sha256=WBR32HPmRW6zArIDhkHP6J997m3wJu9b9iFIMkR7Piw,168430
130
+ epyt_flow/simulation/scada/scada_data_export.py,sha256=WNAFn_WNfzYAEFbl2Al-cOIx-A0ozY4AI60-i_qEHdc,11643
131
131
  epyt_flow/uncertainty/__init__.py,sha256=ZRjuJL9rDpWVSdPwObPxFpEmMTcgAl3VmPOsS6cIyGg,89
132
- epyt_flow/uncertainty/model_uncertainty.py,sha256=SD2sYGqj7K0Ys0Lvak4HsbP18A0SmwsK5Mnys_pZilg,14191
133
- epyt_flow/uncertainty/sensor_noise.py,sha256=zJVULxnxVPSSqc6UW0iwZ9O-HGf9dn4CwScPqf4yCY0,2324
134
- epyt_flow/uncertainty/uncertainties.py,sha256=jzaAwv5--HGc-H4-SwB0s-pAnzhhFuc06IXck7rC5l8,17902
135
- epyt_flow/uncertainty/utils.py,sha256=gq66c9-QMOxOqI6wgWLyFxjVV0fbG0_8Yzd6mQjNYNo,5315
136
- epyt_flow-0.8.0.dist-info/LICENSE,sha256=-4hYIY2BLmCkdOv2_PehEwlnMKTCes8_oyIUXjKtkug,1076
137
- epyt_flow-0.8.0.dist-info/METADATA,sha256=rUMgwUMNclREWRm4XLMi5W74guRZltV-Q2vahIDzLXc,9218
138
- epyt_flow-0.8.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
139
- epyt_flow-0.8.0.dist-info/top_level.txt,sha256=Wh_kd7TRL8ownCw3Y3dxx-9C0iTSk6wNauv_NX9JcrY,10
140
- epyt_flow-0.8.0.dist-info/RECORD,,
132
+ epyt_flow/uncertainty/model_uncertainty.py,sha256=TY6oYFwRUCsPh_j5SeFbiuzco0459kCnbNbn8XcX1e4,41611
133
+ epyt_flow/uncertainty/sensor_noise.py,sha256=-MhzYp6jj7B-NNK8dzJb1bqT_tJygc-YrDeJdDm0m4o,6356
134
+ epyt_flow/uncertainty/uncertainties.py,sha256=sZRMp2GLl2ITxIwW8X3wun82PhLz6r1DEm5slJ_Hkvk,18186
135
+ epyt_flow/uncertainty/utils.py,sha256=SllRi9Drsy46tXJ2AUKauJUAFyIpxgfDNfBhfwrh0cY,5812
136
+ epyt_flow-0.9.0.dist-info/LICENSE,sha256=-4hYIY2BLmCkdOv2_PehEwlnMKTCes8_oyIUXjKtkug,1076
137
+ epyt_flow-0.9.0.dist-info/METADATA,sha256=Svuhcg_MmA8Hc3Qzs5XyF8rFH_Fe7zWIKbsvhW8GIpI,9218
138
+ epyt_flow-0.9.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
139
+ epyt_flow-0.9.0.dist-info/top_level.txt,sha256=Wh_kd7TRL8ownCw3Y3dxx-9C0iTSk6wNauv_NX9JcrY,10
140
+ epyt_flow-0.9.0.dist-info/RECORD,,