forked from qcware/platform_client_library_python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparam_utils.py
More file actions
94 lines (78 loc) · 2.69 KB
/
param_utils.py
File metadata and controls
94 lines (78 loc) · 2.69 KB
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
import params_pb2
from google.protobuf import descriptor
import numpy as np
def convert(params):
param_dict = params_pb2.params()
valid_keys = [f.name for f in param_dict.DESCRIPTOR.fields]
for k, v in params.items():
if k in valid_keys:
python_to_proto(param_dict, k, v)
return param_dict
def isInt(a):
return isinstance(a, (int, np.integer))
def python_to_proto(param_dict, k, v):
if k == "Q":
getattr(param_dict, k).CopyFrom(dict_to_protodict(v, isTensor=True))
elif k == "constraints_linear_A":
getattr(param_dict, k).CopyFrom(dict_to_protodict(mat_to_dict(v)))
elif k == "constraints_linear_b":
getattr(param_dict, k).CopyFrom(vec_to_protovec(v))
elif k == "constraints_equality_R" or k == "constraints_inequality_S":
getattr(param_dict, k).extend(mat_array_to_protodict_array(v))
elif k == "constraints_equality_c" or k == "constraints_inequality_d":
getattr(param_dict, k).extend(vec_array_to_protovec_array(v))
else:
# Must be a 'primitive' of some type
setattr(param_dict, k, v)
def mat_to_dict(mat, symmetrize=False):
the_dict = {}
for i in range(len(mat)):
for j in range(len(mat[i])):
the_dict[(i, j)] = mat[i][j]
if symmetrize:
new_dict = {}
for it in the_dict.keys():
val = the_dict[it]
if (it[1], it[0]) in the_dict.keys() and it[1] != it[0] and it[1] > it[0]:
val += the_dict[(it[1], it[0])]
new_dict[it] = val
elif it[1] == it[0]:
new_dict[it] = the_dict[it]
return new_dict
else:
return the_dict
def dict_to_protodict(pydict, isTensor=False):
pb_obj = params_pb2.params.Tensor() if isTensor else params_pb2.params.Matrix()
for k, v in pydict.items():
entry = pb_obj.entries.add()
if isTensor:
entry.indices.extend(k)
else:
entry.i = k[0]
entry.j = k[1]
if isInt(v):
entry.int_val = v
else:
entry.float_val = v
return pb_obj
def mat_array_to_protodict_array(mat_array):
pb_matrices = []
for mat in mat_array:
pbmat = dict_to_protodict(mat_to_dict(mat))
pb_matrices.append(pbmat)
return pb_matrices
def vec_to_protovec(vec):
pb_vec = params_pb2.params.Vector()
for el in vec:
entry = pb_vec.entries.add()
if isInt(el):
entry.int_val = el
else:
entry.float_val = el
return pb_vec
def vec_array_to_protovec_array(vec_array):
pb_vecs = []
for vec in vec_array:
pb_vec = vec_to_protovec(vec)
pb_vecs.append(pb_vec)
return pb_vecs