-
Notifications
You must be signed in to change notification settings - Fork 38
/
pickling.py
205 lines (180 loc) · 9.43 KB
/
pickling.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# pickling.py: Pickle and Unpickle entire NRPy+ environment.
# This is a key element to NRPy+ parallel codegen.
# Author: Zachariah B. Etienne
# zachetie **at** gmail **dot* com
# from outputC import outC.outC_function_dict, outC.outC_function_prototype_dict, outC.outC_function_outdir_dict, outC.outC_function_master_list, outC_function_element # NRPy+: Core C code output module
import outputC as outC
import NRPy_param_funcs as par # NRPy+: Parameter interface
import grid as gri # NRPy+: Functions having to do with numerical grids
def pickle_NRPy_env():
# Store all NRPy+ environment variables to an output string so NRPy+ environment from within this subprocess can be easily restored
import pickle
# https://www.pythonforthelab.com/blog/storing-binary-data-and-serializing/
outstr = []
outstr.append(pickle.dumps(len(gri.glb_gridfcs_list)))
for lst in gri.glb_gridfcs_list:
outstr.append(pickle.dumps(lst.gftype))
outstr.append(pickle.dumps(lst.name))
outstr.append(pickle.dumps(lst.rank))
outstr.append(pickle.dumps(lst.DIM))
outstr.append(pickle.dumps(lst.f_infinity))
outstr.append(pickle.dumps(lst.wavespeed))
outstr.append(pickle.dumps(len(par.glb_params_list)))
for lst in par.glb_params_list:
outstr.append(pickle.dumps(lst.type))
outstr.append(pickle.dumps(lst.module))
outstr.append(pickle.dumps(lst.parname))
outstr.append(pickle.dumps(lst.defaultval))
outstr.append(pickle.dumps(len(par.glb_Cparams_list)))
for lst in par.glb_Cparams_list:
outstr.append(pickle.dumps(lst.type))
outstr.append(pickle.dumps(lst.module))
outstr.append(pickle.dumps(lst.parname))
outstr.append(pickle.dumps(lst.defaultval))
outstr.append(pickle.dumps(len(outC.outC_function_dict)))
for Cfuncname, Cfunc in outC.outC_function_dict.items():
outstr.append(pickle.dumps(Cfuncname))
outstr.append(pickle.dumps(Cfunc))
outstr.append(pickle.dumps(len(outC.outC_function_prototype_dict)))
for Cfuncname, Cfuncprototype in outC.outC_function_prototype_dict.items():
outstr.append(pickle.dumps(Cfuncname))
outstr.append(pickle.dumps(Cfuncprototype))
outstr.append(pickle.dumps(len(outC.outC_function_outdir_dict)))
for Cfuncname, Cfuncoutdir in outC.outC_function_outdir_dict.items():
outstr.append(pickle.dumps(Cfuncname))
outstr.append(pickle.dumps(Cfuncoutdir))
outstr.append(pickle.dumps(len(outC.outC_function_master_list)))
for Cfunc in outC.outC_function_master_list:
outstr.append(pickle.dumps(Cfunc.includes))
outstr.append(pickle.dumps(Cfunc.prefunc))
outstr.append(pickle.dumps(Cfunc.desc))
outstr.append(pickle.dumps(Cfunc.c_type))
outstr.append(pickle.dumps(Cfunc.name))
outstr.append(pickle.dumps(Cfunc.params))
outstr.append(pickle.dumps(Cfunc.preloop))
outstr.append(pickle.dumps(Cfunc.body))
outstr.append(pickle.dumps(Cfunc.loopopts))
outstr.append(pickle.dumps(Cfunc.postloop))
outstr.append(pickle.dumps(Cfunc.enableCparameters))
outstr.append(pickle.dumps(Cfunc.rel_path_to_Cparams))
return outstr
def unpickle_NRPy_env(NRPyEnvVars):
import pickle
# https://www.pythonforthelab.com/blog/storing-binary-data-and-serializing/
grfcs_list = []
param_list = []
Cparm_list = []
outCfunc_dict = {}
outCfuncproto_dict = {}
outCfuncoutdir_dict = {}
outCfunc_master_list = []
for WhichParamSet in NRPyEnvVars[0]:
# gridfunctions
i=0
num_elements = pickle.loads(WhichParamSet[i]); i+=1
for lst in range(num_elements):
grfcs_list.append(gri.glb_gridfc(gftype =pickle.loads(WhichParamSet[i+0]),
name =pickle.loads(WhichParamSet[i+1]),
rank =pickle.loads(WhichParamSet[i+2]),
DIM =pickle.loads(WhichParamSet[i+3]),
f_infinity=pickle.loads(WhichParamSet[i+4]),
wavespeed =pickle.loads(WhichParamSet[i+5]))) ; i+=6
# parameters
num_elements = pickle.loads(WhichParamSet[i]); i+=1
for lst in range(num_elements):
param_list.append(par.glb_param(type =pickle.loads(WhichParamSet[i+0]),
module =pickle.loads(WhichParamSet[i+1]),
parname =pickle.loads(WhichParamSet[i+2]),
defaultval=pickle.loads(WhichParamSet[i+3]))); i+=4
# Cparameters
num_elements = pickle.loads(WhichParamSet[i]); i+=1
for lst in range(num_elements):
Cparm_list.append(par.glb_Cparam(type =pickle.loads(WhichParamSet[i+0]),
module =pickle.loads(WhichParamSet[i+1]),
parname =pickle.loads(WhichParamSet[i+2]),
defaultval=pickle.loads(WhichParamSet[i+3]))); i+=4
# outC_func_dict
num_elements = pickle.loads(WhichParamSet[i]); i+=1
for lst in range(num_elements):
funcname = pickle.loads(WhichParamSet[i+0])
funcbody = pickle.loads(WhichParamSet[i+1]); i+=2
outCfunc_dict[funcname] = funcbody
# outC.outC_function_prototype_dict
num_elements = pickle.loads(WhichParamSet[i]); i+=1
for lst in range(num_elements):
funcname = pickle.loads(WhichParamSet[i+0])
funcproto = pickle.loads(WhichParamSet[i+1]); i+=2
outCfuncproto_dict[funcname] = funcproto
# outC.outC_function_outdir_dict
num_elements = pickle.loads(WhichParamSet[i]); i+=1
for lst in range(num_elements):
funcname = pickle.loads(WhichParamSet[i+0])
funcoutdir = pickle.loads(WhichParamSet[i+1]); i+=2
outCfuncoutdir_dict[funcname] = funcoutdir
# outC.outC_function_master_list
num_elements = pickle.loads(WhichParamSet[i]); i+=1
for lst in range(num_elements):
includes = pickle.loads(WhichParamSet[i+0]) ; i+=1
prefunc = pickle.loads(WhichParamSet[i+0]) ; i+=1
desc = pickle.loads(WhichParamSet[i+0]) ; i+=1
c_type = pickle.loads(WhichParamSet[i+0]) ; i+=1
name = pickle.loads(WhichParamSet[i+0]) ; i+=1
params = pickle.loads(WhichParamSet[i+0]) ; i+=1
preloop = pickle.loads(WhichParamSet[i+0]) ; i+=1
body = pickle.loads(WhichParamSet[i+0]) ; i+=1
loopopts = pickle.loads(WhichParamSet[i+0]) ; i+=1
postloop = pickle.loads(WhichParamSet[i+0]) ; i+=1
enableCparameters = pickle.loads(WhichParamSet[i+0]) ; i+=1
rel_path_to_Cparams = pickle.loads(WhichParamSet[i+0]) ; i+=1
# 'includes prefunc desc c_type name params preloop body loopopts postloop enableCparameters rel_path_to_Cparams append_coordsuffix'
outCfunc_master_list += [outC.outC_function_element(includes=includes,prefunc=prefunc,desc=desc,c_type=c_type,name=name,
params=params,preloop=preloop,body=body,
loopopts=loopopts,postloop=postloop,
enableCparameters=enableCparameters,
rel_path_to_Cparams=rel_path_to_Cparams)]
grfcs_list_uniq = []
for gf_ntuple_stored in grfcs_list:
found_gf = False
for gf_ntuple_new in grfcs_list_uniq:
if gf_ntuple_new == gf_ntuple_stored:
found_gf = True
if found_gf == False:
grfcs_list_uniq.append(gf_ntuple_stored)
param_list_uniq = []
for pr_ntuple_stored in param_list:
found_pr = False
for pr_ntuple_new in param_list_uniq:
if pr_ntuple_new == pr_ntuple_stored:
found_pr = True
if found_pr == False:
param_list_uniq.append(pr_ntuple_stored)
# Set glb_paramsvals_list:
# Step 1: Reset all paramsvals to their defaults
# BAD IDEA: OVERWRITTEN DEFAULTS SHOULD BE KEPT.
# par.glb_paramsvals_list = []
# for parm in param_list_uniq:
# par.glb_paramsvals_list.append(parm.defaultval)
Cparm_list_uniq = []
for Cp_ntuple_stored in Cparm_list:
found_Cp = False
for Cp_ntuple_new in Cparm_list_uniq:
if Cp_ntuple_new == Cp_ntuple_stored:
found_Cp = True
if found_Cp == False:
Cparm_list_uniq.append(Cp_ntuple_stored)
gri.glb_gridfcs_list = []
par.glb_params_list = []
par.glb_Cparams_list = []
gri.glb_gridfcs_list = grfcs_list_uniq
par.glb_params_list = param_list_uniq
par.glb_Cparams_list = Cparm_list_uniq
for key, item in outCfunc_dict.items():
outC.outC_function_dict[key] = item
for key, item in outCfuncproto_dict.items():
outC.outC_function_prototype_dict[key] = item
for key, item in outCfuncoutdir_dict.items():
outC.outC_function_outdir_dict[key] = item
return outCfunc_master_list
# outC.outC_function_master_list = []
# for el in outCfunc_master_list:
# outC.outC_function_master_list += [el]