pythonfmu3 0.3.2__py3-none-any.whl → 0.3.4__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.
pythonfmu3/variables.py CHANGED
@@ -50,6 +50,11 @@ class ModelVariable(ABC):
50
50
  self.setter = setter
51
51
  self._type = None
52
52
  self.local_name = name.split(".")[-1]
53
+
54
+ # demanagle names
55
+ self.local_name = self.local_name.lstrip('_')
56
+
57
+
53
58
  self.__attrs = {
54
59
  "name": name,
55
60
  "valueReference": None,
@@ -151,7 +156,6 @@ class Start(object):
151
156
  attrib["value"] = self.value
152
157
  return Element("Start", attrib)
153
158
 
154
-
155
159
  class Dimension(object):
156
160
  def __init__(self, start: str = "", valueReference: str = ""):
157
161
  if start and valueReference and any((start, valueReference)):
@@ -177,15 +181,38 @@ class Dimension(object):
177
181
  ele = Element("Dimension", attrib)
178
182
  return ele
179
183
 
180
- class Float64(ModelVariable):
184
+ class Arrayable(object):
185
+ def __init__(self, dimensions : List[Dimension] = [], **kwargs):
186
+ if dimensions:
187
+ check_numpy()
188
+ self._dimensions = dimensions
189
+
190
+ @property
191
+ def dimensions(self) -> List[Dimension]:
192
+ return self._dimensions
193
+
194
+ def get_start_str(self, value, formatter):
195
+ if len(self.dimensions) > 0:
196
+ output = " ".join([formatter(val) for val in flatten(value)])
197
+ if len(output) > MAX_LENGTH:
198
+ output = output[0]
199
+ return output
200
+ else:
201
+ return formatter(value)
202
+
203
+ def dimensions_xml(self) -> List[Element]:
204
+ return [dim.to_xml() for dim in self._dimensions]
205
+
206
+ def size(self, vars):
207
+ return reduce(lambda x, dim: x * int(dim.size(vars)), self._dimensions, 1)
208
+
209
+ class Float64(ModelVariable, Arrayable):
181
210
  def __init__(self, name: str, start: Optional[Any] = None, derivative: Optional[Any] = None, dimensions: List[Dimension] = [], unit: Optional[str] = None, **kwargs):
182
- super().__init__(name, **kwargs)
211
+ ModelVariable.__init__(self, name, **kwargs)
212
+ Arrayable.__init__(self, dimensions)
183
213
  self.__attrs = {"start": start, "derivative": derivative}
184
214
  self._type = "Float64"
185
215
  self._unit = unit
186
- if dimensions:
187
- check_numpy()
188
- self.__dimensions = dimensions
189
216
 
190
217
  @property
191
218
  def start(self) -> Optional[Any]:
@@ -206,11 +233,6 @@ class Float64(ModelVariable):
206
233
  @property
207
234
  def derivative(self):
208
235
  return self.__attrs["derivative"]
209
-
210
- @property
211
- def dimensions(self) -> List[Dimension]:
212
- return self.__dimensions
213
-
214
236
 
215
237
  def to_xml(self) -> Element:
216
238
  attrib = dict()
@@ -218,13 +240,7 @@ class Float64(ModelVariable):
218
240
  if value is not None:
219
241
  # In order to not loose precision, a number of this type should be
220
242
  # stored on an XML file with at least 16 significant digits
221
- output = ""
222
- if len(self.dimensions) > 0:
223
- output = " ".join([f"{val:.16g}" for val in flatten(value)])
224
- if len(output) > MAX_LENGTH:
225
- output = output[0]
226
- else:
227
- output = f"{value:.16g}"
243
+ output = self.get_start_str(value, lambda v: f"{v:.16g}")
228
244
  attrib[key] = output
229
245
 
230
246
  if self.unit:
@@ -233,18 +249,15 @@ class Float64(ModelVariable):
233
249
  self._extras = attrib
234
250
  parent = super().to_xml()
235
251
 
236
- for dimension in self.__dimensions:
237
- parent.append(dimension.to_xml())
252
+ parent.extend(self.dimensions_xml())
238
253
 
239
254
  return parent
240
255
 
241
- def size(self, vars):
242
- return reduce(lambda x, dim: x * int(dim.size(vars)), self.__dimensions, 1)
243
-
244
256
 
245
- class Int32(ModelVariable):
246
- def __init__(self, name: str, start: Optional[Any] = None, **kwargs):
247
- super().__init__(name, **kwargs)
257
+ class Int32(ModelVariable, Arrayable):
258
+ def __init__(self, name: str, start: Optional[Any] = None, dimensions: List[Dimension] = [], **kwargs):
259
+ ModelVariable.__init__(self, name, **kwargs)
260
+ Arrayable.__init__(self, dimensions, **kwargs)
248
261
  self.__attrs = {"start": start}
249
262
  self._type = "Int32";
250
263
 
@@ -260,15 +273,18 @@ class Int32(ModelVariable):
260
273
  attrib = dict()
261
274
  for key, value in self.__attrs.items():
262
275
  if value is not None:
263
- attrib[key] = str(value)
276
+ attrib[key] = self.get_start_str(value, lambda v: str(v))
264
277
  self._extras = attrib
265
278
  parent = super().to_xml()
279
+
280
+ parent.extend(self.dimensions_xml())
266
281
 
267
282
  return parent
268
283
 
269
- class Int64(ModelVariable):
270
- def __init__(self, name: str, start: Optional[Any] = None, **kwargs):
271
- super().__init__(name, **kwargs)
284
+ class Int64(ModelVariable, Arrayable):
285
+ def __init__(self, name: str, start: Optional[Any] = None, dimensions: List[Dimension] = [], **kwargs):
286
+ ModelVariable.__init__(self, name, **kwargs)
287
+ Arrayable.__init__(self, dimensions, **kwargs)
272
288
  self.__attrs = {"start": start}
273
289
  self._type = "Int64";
274
290
 
@@ -284,15 +300,18 @@ class Int64(ModelVariable):
284
300
  attrib = dict()
285
301
  for key, value in self.__attrs.items():
286
302
  if value is not None:
287
- attrib[key] = str(value)
303
+ attrib[key] = self.get_start_str(value, lambda v: str(v))
288
304
  self._extras = attrib
289
305
  parent = super().to_xml()
290
306
 
307
+ parent.extend(self.dimensions_xml())
308
+
291
309
  return parent
292
310
 
293
- class UInt64(ModelVariable):
294
- def __init__(self, name: str, start: Optional[Any] = None, **kwargs):
295
- super().__init__(name, **kwargs)
311
+ class UInt64(ModelVariable, Arrayable):
312
+ def __init__(self, name: str, start: Optional[Any] = None, dimensions: List[Dimension] = [], **kwargs):
313
+ ModelVariable.__init__(self, name, **kwargs)
314
+ Arrayable.__init__(self, dimensions, **kwargs)
296
315
  self.__attrs = {"start": start}
297
316
  self._type = "UInt64";
298
317
 
@@ -308,15 +327,18 @@ class UInt64(ModelVariable):
308
327
  attrib = dict()
309
328
  for key, value in self.__attrs.items():
310
329
  if value is not None:
311
- attrib[key] = str(value)
330
+ attrib[key] = self.get_start_str(value, lambda v: str(v))
312
331
  self._extras = attrib
313
332
  parent = super().to_xml()
314
333
 
315
- return parent
334
+ parent.extend(self.dimensions_xml())
316
335
 
317
- class Boolean(ModelVariable):
318
- def __init__(self, name: str, start: Optional[Any] = None, **kwargs):
319
- super().__init__(name, **kwargs)
336
+ return parent
337
+
338
+ class Boolean(ModelVariable, Arrayable):
339
+ def __init__(self, name: str, start: Optional[Any] = None, dimensions: List[Dimension] = [], **kwargs):
340
+ ModelVariable.__init__(self, name, **kwargs)
341
+ Arrayable.__init__(self, dimensions, **kwargs)
320
342
  self.__attrs = {"start": start}
321
343
  self._type = "Boolean"
322
344
 
@@ -332,16 +354,18 @@ class Boolean(ModelVariable):
332
354
  attrib = dict()
333
355
  for key, value in self.__attrs.items():
334
356
  if value is not None:
335
- attrib[key] = str(value).lower()
357
+ attrib[key] = self.get_start_str(value, lambda v: str(v).lower())
336
358
  self._extras = attrib
337
359
  parent = super().to_xml()
360
+
361
+ parent.extend(self.dimensions_xml())
338
362
 
339
363
  return parent
340
364
 
341
365
 
342
366
  class String(ModelVariable):
343
- def __init__(self, name: str, start: Optional[Any] = None, **kwargs):
344
- super().__init__(name, **kwargs)
367
+ def __init__(self, name: str, start: Optional[Any] = None, dimensions: List[Dimension] = [], **kwargs):
368
+ ModelVariable.__init__(self, name, **kwargs)
345
369
  self.__attrs = dict()
346
370
  self._type = "String"
347
371
  self._start = Start(start)
@@ -358,13 +382,13 @@ class String(ModelVariable):
358
382
  attrib = dict()
359
383
  for key, value in self.__attrs.items():
360
384
  if value is not None:
361
- attrib[key] = str(value)
385
+ attrib[key] = str(value, lambda v: str(v))
362
386
  self._extras = attrib
363
387
  parent = super().to_xml()
364
388
 
365
389
  if self.start is not None:
366
390
  parent.append(self._start.to_xml())
367
-
391
+
368
392
  return parent
369
393
 
370
394
  class Enumeration(ModelVariable):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonfmu3
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: A lightweight framework that enables the packaging of Python3.x code as co-simulation FMUs.
5
5
  Home-page: https://github.com/stephensmith25/PythonFMU3
6
6
  Author: Stephen Smith
@@ -173,6 +173,7 @@ To create a model exchange FMU you must inherit from `Fmi3SlaveBase` and one of
173
173
  ```python
174
174
 
175
175
  from pythonfmu3 import Fmi3Causality, Fmi3SlaveBase, Float64, ModelExchange
176
+ from typing import List
176
177
 
177
178
 
178
179
  class PythonSlaveMX(Fmi3SlaveBase, ModelExchange):
@@ -1,42 +1,43 @@
1
1
  pythonfmu3/__init__.py,sha256=VJ4QqOZTU8sBI8xhiRVD540Hsp381ma24xGWHABZ724,551
2
2
  pythonfmu3/__main__.py,sha256=gC1T8x2d02hhqshyNQGSS70SyCk-3I3t8zPqoRo2Xd8,1543
3
- pythonfmu3/_version.py,sha256=vNiWJ14r_cw5t_7UDqDQIVZvladKFGyHH2avsLpN7Vg,22
4
- pythonfmu3/builder.py,sha256=w7c9ZFv1Udz99cb7rj2NpD0CgrcHRu1SR_axm0ew__Y,10103
3
+ pythonfmu3/_version.py,sha256=oYLGMpySamd16KLiaBTfRyrAS7_oyp-TOEHmzmeumwg,22
4
+ pythonfmu3/builder.py,sha256=DLpy6Hd9ZmbeQLVMw_FcxnS5LB_-yRXzkPjlupyiYsg,11060
5
5
  pythonfmu3/cosimulation.py,sha256=EZ5pa_5hy1AwoaZRzZqNz_IX8kjxoFM9sPgeqrUiRuw,179
6
6
  pythonfmu3/default_experiment.py,sha256=FJ0l0FpU7pT4Pox2RiA2y-Cb_e7DE2XlbWKySRYQaVk,293
7
7
  pythonfmu3/deploy.py,sha256=eqFWVxZUkJCLvmq1-GuMNjn2j0VCGoaXPhRWrCk2Vxg,3741
8
8
  pythonfmu3/enums.py,sha256=ZmC6vGeBTGt7HarPQ4uYV10ezPsvIxAHH1ypjNq7G3E,729
9
- pythonfmu3/fmi3slave.py,sha256=dq0rru4QsLm75irlpM8nquKVbn22FgFG33PVnNUumGc,19458
9
+ pythonfmu3/fmi3slave.py,sha256=JpN_zeaXpEIk2Hnnd7LvV2cs5IOD6x1GEAYdNy9TMWU,20844
10
10
  pythonfmu3/logmsg.py,sha256=0wn11GLwq0LLWqyC2ktLRjQFWlpj07wWliZ8rUHx1gg,359
11
11
  pythonfmu3/modelexchange.py,sha256=pdC3gvr-vCXA8qvJ_urWplJZWEi1YKjMcNczme7GOOo,1884
12
12
  pythonfmu3/osutil.py,sha256=1qN6qudN4zCupZwc15pzp52WObkqi6jGy9a-MehNt9Q,656
13
13
  pythonfmu3/unit.py,sha256=SjOaywb5lVQbAO_iLjc_7Ly3nYrmAvIW2_hAGt12UFU,1475
14
14
  pythonfmu3/variable_types.py,sha256=Q0D4wlGi3i3zE5UsmGJEpNh7SV_W8mn_8p_WIkwrLQA,2881
15
- pythonfmu3/variables.py,sha256=GDAbR_BSRsiBlcqpMKE_uvehNiRczgL7xC4BMEj-BJo,12254
15
+ pythonfmu3/variables.py,sha256=U4ESws0jx6QNlzvT9d7If2HEgp6ujpFi225GO9FgHaM,13500
16
16
  pythonfmu3/pythonfmu-export/.clang-format,sha256=ApbsHWYwilCXJ1iBux4nqOjLkaqgbGLsVrc_U3hX7WI,944
17
17
  pythonfmu3/pythonfmu-export/CMakeLists.txt,sha256=WLFfomT1rj9eWJMSXLtSbh5HLIu0DR5VCiYdCl8Cxrw,1854
18
18
  pythonfmu3/pythonfmu-export/build_unix.sh,sha256=I5RrF2O6y0hRG_SN4ExKN_CCFYaa2l-ngKzqmBXnHmA,73
19
19
  pythonfmu3/pythonfmu-export/build_win.sh,sha256=UzmAcWqFmwBu6mvYne2Dx3UK8iPwTtP4HpjICsjUaJA,97
20
20
  pythonfmu3/pythonfmu-export/src/CMakeLists.txt,sha256=fOVlV7hy9c0wx_Qp4K51tQaQ5xy9lL4qtyGl15ZXfGs,1208
21
21
  pythonfmu3/pythonfmu-export/src/cppfmu/cppfmu_common.hpp,sha256=cgrlZa5L-bbjZeVi0pmy4JKE5UJ2GszzuyOqTdRcBRQ,4353
22
- pythonfmu3/pythonfmu-export/src/cppfmu/cppfmu_cs.cpp,sha256=EsUIevwmCzX9hsui3i8x1crSnSOG8dEK15Zm1ZIavYQ,3843
23
- pythonfmu3/pythonfmu-export/src/cppfmu/cppfmu_cs.hpp,sha256=tEz_LIZT1CuXi21S4e_ggM9RJh-ZKukjD-5QHxfZXAk,7444
24
- pythonfmu3/pythonfmu-export/src/cppfmu/fmi_functions.cpp,sha256=nAb0bPGMf44z6aXzH7dGZDrX8N92l8gx-SkQrq3jIik,30015
22
+ pythonfmu3/pythonfmu-export/src/cppfmu/cppfmu_cs.cpp,sha256=explSkxXPayKgSMHxadQ8_Gd8IMYwSnOw5SBItTimuE,4093
23
+ pythonfmu3/pythonfmu-export/src/cppfmu/cppfmu_cs.hpp,sha256=FO2ugz1-YFE8St2AO7k_cXtT7qM5ktrejv_SEKjDRf4,7734
24
+ pythonfmu3/pythonfmu-export/src/cppfmu/fmi_functions.cpp,sha256=oetqW88dlZd75suBoScD0AcA4yktCBSaRfx0vHD_Lyw,30105
25
25
  pythonfmu3/pythonfmu-export/src/fmi/fmi3FunctionTypes.h,sha256=Tk1WY0nAYBGiOAQ8zVbmqRAfdQttITWsLba7udhBwG4,30050
26
26
  pythonfmu3/pythonfmu-export/src/fmi/fmi3Functions.h,sha256=NsHuclp20wcuUInYf-91UXZbljTeu2cPXENqNEORdgU,16262
27
27
  pythonfmu3/pythonfmu-export/src/fmi/fmi3PlatformTypes.h,sha256=ZCQLJgSbRGrMsBiQ4auaYCY4J3Hck6g3t1iZp5NEguw,4251
28
28
  pythonfmu3/pythonfmu-export/src/pythonfmu/IPyState.hpp,sha256=GLiOjhKLDVEICersnqVwezwEshbxfdh_cyMxBJGFbu8,456
29
- pythonfmu3/pythonfmu-export/src/pythonfmu/PySlaveInstance.cpp,sha256=Dmnvn7CprYxECYYXZCI2t81VNw3qscsKOIb6kMm3mNA,33301
30
- pythonfmu3/pythonfmu-export/src/pythonfmu/PySlaveInstance.hpp,sha256=kdLzY-vrRyRnJfqZ0ZQiz7g7i3gP1MLzmvUD7u0ylPM,5392
29
+ pythonfmu3/pythonfmu-export/src/pythonfmu/PySlaveInstance.cpp,sha256=3VTCxq4uXBJW8Ut6oMHHSUGO8OMtSSPoK2VsPGtuT3U,33908
30
+ pythonfmu3/pythonfmu-export/src/pythonfmu/PySlaveInstance.hpp,sha256=59icfvAVdq5rFaeAE1PgEqpknyZHgSQMEBXnZz3efAw,5602
31
31
  pythonfmu3/pythonfmu-export/src/pythonfmu/PyState.hpp,sha256=CjFEIrZu8b1jxQAIgfI_o36hyItW_SdQ5VSkImf7JNs,2977
32
- pythonfmu3/resources/binaries/x86_64-linux/libpythonfmu-export.so,sha256=MYOFAGHaNBGS-o7DFQPmdYrfSgG1QXkhznwlh7fsRfY,367904
33
- pythonfmu3/resources/binaries/x86_64-windows/pythonfmu-export.dll,sha256=j3ye1lnsJbgczHEDAqR15Li_rhUuesX7gc6Jei2rSXc,427008
32
+ pythonfmu3/resources/binaries/x86_64-linux/libpythonfmu-export.so,sha256=U_1xuoNMGN6i3xXX5ns6QkQeemB3V8tayCX_mLUFtYA,367944
33
+ pythonfmu3/resources/binaries/x86_64-windows/pythonfmu-export.dll,sha256=SFtJHFYRgW8kp6faJ78HKCYOYaPQVXhtG6SUR3Zv5Iw,427008
34
34
  pythonfmu3/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  pythonfmu3/tests/conftest.py,sha256=B6XxTnBdeF_tEJ3w2DlfPKUfvlk-oULgIhQtXkgOJIc,171
36
36
  pythonfmu3/tests/test_builder.py,sha256=GrD4ziin3RLOe_36rBQCMnKrSkhc3IqnxE1a6kCFPok,6842
37
37
  pythonfmu3/tests/test_deploy.py,sha256=JCDo-O93-izxrP9Q4K0njBcfZ-gAXYx9aZ4plgctz7k,1783
38
+ pythonfmu3/tests/test_docs.py,sha256=VZZFUj2j35mBKvWATIUzJnWNDfiETsLdHZnRZGutOVM,3134
38
39
  pythonfmu3/tests/test_fmi3slave.py,sha256=VSd3o3ejOcTG6TlnqxVK7YQc4QCKFTCQnpIgleaxJl4,4801
39
- pythonfmu3/tests/test_integration.py,sha256=34rus-OU9S5FlAVAfpZyoHrXoziG14d4_yw4Wdt5uVU,12513
40
+ pythonfmu3/tests/test_integration.py,sha256=0WdI02SmzGB2G5oBnPYgmUnvkKNQ_CpIyfdsUVWfDis,16194
40
41
  pythonfmu3/tests/test_logger.py,sha256=OcHQhxUtNBPH-0zdmheC4I9OWz1yu48W8MYDshNVkf8,5765
41
42
  pythonfmu3/tests/test_multiple_fmus.py,sha256=-sthCm2YUZiRkdfvpLQNgquPBForUKQ7HGqfFBdrRas,3942
42
43
  pythonfmu3/tests/test_variables.py,sha256=FL7eUCXH4RmH0rK0k6qXDnyDzthW_wAWJBHEmC-u8SI,10384
@@ -48,11 +49,12 @@ pythonfmu3/tests/slaves/localmodule.py,sha256=-q5Lmh2I88MG7nLTscms0n5xhHLkUDed1I
48
49
  pythonfmu3/tests/slaves/pythonslave.py,sha256=uzrTQmfk0QBalxNTviGMZNph_YgVmcbxPqKgX5rSvXg,2172
49
50
  pythonfmu3/tests/slaves/pythonslaveMX.py,sha256=rmtiKWj-7DNCEGKAzCoS-6ybkWKabYMhatpn14r7UpA,1167
50
51
  pythonfmu3/tests/slaves/pythonslaveMXCS.py,sha256=P1aKY92obd-y9VGwDRin9fwmnAlSmdHguFW8E5-LU4I,1417
52
+ pythonfmu3/tests/slaves/pythonslave_arraytypes.py,sha256=l5DB0HI0CH_saLwoe1BvZUXgEzxGGYUHiaG3npt2vDk,2429
51
53
  pythonfmu3/tests/slaves/pythonslave_read_file.py,sha256=t2sDaZSr2veD91gdqCO9W9CN-AN3TyXABXXfV9Rt0Xs,791
52
54
  pythonfmu3/tests/slaves/slavewithdep.py,sha256=hHDFB0dw8wkHiGzxeAVbz9O5LR6ghsFeONgRFdiK_t0,812
53
- pythonfmu3-0.3.2.dist-info/licenses/LICENSE,sha256=RL2018BU2DKcTi8Eb4ODF-XF3wnr7SDKvMP5S49x4rQ,1188
54
- pythonfmu3-0.3.2.dist-info/METADATA,sha256=uDfgPNTvIe_vJrgWUk5LGwqdzQDLemg01w4ckpv7B4c,9351
55
- pythonfmu3-0.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
56
- pythonfmu3-0.3.2.dist-info/entry_points.txt,sha256=GgkWYs0DKGHLcijMEYZGkhkHOK2RVUpjGwvl1fwyDwQ,60
57
- pythonfmu3-0.3.2.dist-info/top_level.txt,sha256=6ne7bh_cME1hepxCx1BG8N5QVhVAufrp7LLok6vq7nE,11
58
- pythonfmu3-0.3.2.dist-info/RECORD,,
55
+ pythonfmu3-0.3.4.dist-info/licenses/LICENSE,sha256=RL2018BU2DKcTi8Eb4ODF-XF3wnr7SDKvMP5S49x4rQ,1188
56
+ pythonfmu3-0.3.4.dist-info/METADATA,sha256=ydejh5qlluJ22V1R33dKaQQ_TR7-K2BBmHuDcq9lo0E,9375
57
+ pythonfmu3-0.3.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
58
+ pythonfmu3-0.3.4.dist-info/entry_points.txt,sha256=GgkWYs0DKGHLcijMEYZGkhkHOK2RVUpjGwvl1fwyDwQ,60
59
+ pythonfmu3-0.3.4.dist-info/top_level.txt,sha256=6ne7bh_cME1hepxCx1BG8N5QVhVAufrp7LLok6vq7nE,11
60
+ pythonfmu3-0.3.4.dist-info/RECORD,,