-
Notifications
You must be signed in to change notification settings - Fork 61
/
pandapipes_net.py
95 lines (81 loc) · 3.21 KB
/
pandapipes_net.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# Copyright (c) 2020 by Fraunhofer Institute for Energy Economics
# and Energy System Technology (IEE), Kassel. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
import json
import copy
import pandas as pd
from numpy import dtype
from pandapipes import __version__
from pandapower.auxiliary import ADict
try:
import pplog as logging
except ImportError:
import logging
logger = logging.getLogger(__name__)
class pandapipesNet(ADict):
def __init__(self, *args, **kwargs):
super(pandapipesNet, self).__init__(*args, **kwargs)
def __repr__(self): # pragma: no cover
r = "This pandapipes network includes the following parameter tables:"
par = []
res = []
for tb in list(self.keys()):
if isinstance(self[tb], pd.DataFrame) and len(self[tb]) > 0:
if 'res_' in tb:
res.append(tb)
else:
par.append(tb)
elif tb == 'std_type':
par.append(tb)
for tb in par:
r += "\n - %s (%s elements)" % (tb, len(self[tb]))
if res:
r += "\n and the following results tables:"
for tb in res:
r += "\n - %s (%s elements)" % (tb, len(self[tb]))
return r
def __str__(self):
return self.__class__.__name__
def __deepcopy__(self, memo):
"""
overloads the deepcopy function of pandapipes if at least one DataFrame with column "object" is in net
reason: some of these objects contain a reference to net which breaks the default deepcopy function.
This fix was introduced in analogy to pandapower 2.2.1 and is rather a quick and dirty solution to the problem
"""
save_to_json = False
for el in self:
if isinstance(self[el], pd.DataFrame) and "object" in self[el] and len(self[el]):
save_to_json = True
break
if save_to_json:
# deepcopy by dumping to json and loading from it
from pandapipes.io.file_io import PPJSONEncoder, from_json_string
from pandapipes.io.io_utils import with_signature
json_string = json.dumps(with_signature(self, dict(self)), cls=PPJSONEncoder)
return from_json_string(json_string)
# deepcopy of every element in self (== the pandapower net)
cls = self.__class__
result = cls.__new__(cls)
memo[id(self)] = result
for k, v in self.items():
setattr(result, k, copy.deepcopy(v, memo))
return result
def get_default_pandapipes_structure():
"""
:return:
:rtype:
"""
default_pandapipes_structure = {
# structure data
# f8, u4 etc. are probably referencing numba or numpy data types
"fluid": None,
"converged": False,
"name": "",
"version": __version__,
"controller": [('controller', dtype(object)),
('in_service', "bool"),
('order', "float64"),
('level', dtype(object)),
("recycle", "bool")],
"component_list": []}
return default_pandapipes_structure