eqc-models 0.12.0__py3-none-any.whl → 0.13.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.
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/base.py +11 -0
- eqc_models-0.13.0.data/platlib/eqc_models/base/binaries.py +33 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/constraints.py +39 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/polyeval.c +443 -267
- eqc_models-0.13.0.data/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/polynomial.py +21 -2
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/results.py +81 -1
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/graph/__init__.py +2 -0
- eqc_models-0.13.0.data/platlib/eqc_models/graph/rcshortestpath.py +81 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/graph/shortestpath.py +52 -19
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/classifierbase.py +0 -1
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/clusteringbase.py +0 -1
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/decomposition.py +0 -1
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/regressorbase.py +0 -1
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/solvers/__init__.py +9 -1
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/solvers/eqcdirect.py +9 -4
- eqc_models-0.13.0.data/platlib/eqc_models/solvers/mip.py +115 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/solvers/qciclient.py +11 -22
- eqc_models-0.13.0.data/platlib/eqc_models/solvers/responselog.py +47 -0
- {eqc_models-0.12.0.dist-info → eqc_models-0.13.0.dist-info}/METADATA +7 -8
- eqc_models-0.13.0.dist-info/RECORD +69 -0
- eqc_models-0.12.0.data/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
- eqc_models-0.12.0.dist-info/RECORD +0 -65
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/compile_extensions.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/algorithms/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/algorithms/base.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/algorithms/penaltymultiplier.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/allocation/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/allocation/allocation.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/allocation/portbase.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/allocation/portmomentum.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/assignment/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/assignment/qap.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/assignment/resource.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/assignment/setpartition.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/operators.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/polyeval.pyx +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/base/quadratic.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/combinatorics/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/combinatorics/setcover.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/combinatorics/setpartition.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/decoding.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/graph/base.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/graph/hypergraph.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/graph/maxcut.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/graph/maxkcut.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/graph/partition.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/classifierqboost.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/classifierqsvm.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/clustering.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/cvqboost_hamiltonian.pyx +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.c +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.h +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/forecast.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/forecastbase.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/regressor.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/ml/reservoir.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/process/base.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/process/mpc.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/sequence/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/sequence/tsp.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/utilities/__init__.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/utilities/fileio.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/utilities/polynomial.py +0 -0
- {eqc_models-0.12.0.data → eqc_models-0.13.0.data}/platlib/eqc_models/utilities/qplib.py +0 -0
- {eqc_models-0.12.0.dist-info → eqc_models-0.13.0.dist-info}/WHEEL +0 -0
- {eqc_models-0.12.0.dist-info → eqc_models-0.13.0.dist-info}/licenses/LICENSE.txt +0 -0
- {eqc_models-0.12.0.dist-info → eqc_models-0.13.0.dist-info}/top_level.txt +0 -0
|
@@ -41,6 +41,7 @@ class EqcModel:
|
|
|
41
41
|
_upper_bound = None
|
|
42
42
|
_H = None
|
|
43
43
|
_machine_slacks = 0
|
|
44
|
+
_is_discrete = None
|
|
44
45
|
|
|
45
46
|
def decode(self, solution : np.ndarray, from_encoding : str=None) -> np.ndarray:
|
|
46
47
|
"""
|
|
@@ -117,6 +118,16 @@ class EqcModel:
|
|
|
117
118
|
warn("The domains property is deprecated in favor of naming it upper_bound", DeprecationWarning)
|
|
118
119
|
self._upper_bound = value
|
|
119
120
|
|
|
121
|
+
@property
|
|
122
|
+
def is_discrete(self) -> List:
|
|
123
|
+
""" An array of boolean values indicating if variable should be restricted to a discrete domain """
|
|
124
|
+
|
|
125
|
+
return self._is_discrete
|
|
126
|
+
|
|
127
|
+
@is_discrete.setter
|
|
128
|
+
def is_discrete(self, value : List):
|
|
129
|
+
self._is_discrete = value
|
|
130
|
+
|
|
120
131
|
@property
|
|
121
132
|
def n(self) -> int:
|
|
122
133
|
""" Return the number of variables """
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
def make_binary_penalty(var_idx, slack_idx, max_degree=2, penalty_multiplier=None):
|
|
3
|
+
"""
|
|
4
|
+
Make a penalty expression enforcing binary values
|
|
5
|
+
|
|
6
|
+
The expression is formed from the conditions
|
|
7
|
+
|
|
8
|
+
$$
|
|
9
|
+
x + w = 1
|
|
10
|
+
$$
|
|
11
|
+
|
|
12
|
+
$$
|
|
13
|
+
xw = 0
|
|
14
|
+
$$
|
|
15
|
+
|
|
16
|
+
$$
|
|
17
|
+
w^2 + 2xw + x^2 - 2w - 2x + 1 + xw = 0
|
|
18
|
+
$$
|
|
19
|
+
|
|
20
|
+
$$
|
|
21
|
+
3xw + w^2 + x^2 - 2w - 2x + 1 = 0
|
|
22
|
+
$$
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
indices = [(0, var_idx), (0, slack_idx), (var_idx, slack_idx), (var_idx, var_idx), (slack_idx, slack_idx)]
|
|
27
|
+
coefficients = [-2, -2, 3, 1, 1]
|
|
28
|
+
offset = 1
|
|
29
|
+
if penalty_multiplier is not None:
|
|
30
|
+
coefficients = [penalty_multiplier * c for c in coefficients]
|
|
31
|
+
offset *- penalty_multiplier
|
|
32
|
+
return coefficients, indices, offset
|
|
33
|
+
|
|
@@ -82,6 +82,45 @@ class ConstraintsMixIn:
|
|
|
82
82
|
def constraints(self, value: Tuple[np.ndarray, np.ndarray]):
|
|
83
83
|
self.lhs, self.rhs = value
|
|
84
84
|
|
|
85
|
+
@staticmethod
|
|
86
|
+
def _stackLHS(*args):
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
>>> m1 = np.array([1, 1, 1])
|
|
90
|
+
>>> m2 = np.array([[2.0, 2.0]])
|
|
91
|
+
>>> m3 = np.array([[0, 3, 3, 1], [1, 0, 1, 0]])
|
|
92
|
+
>>> ConstraintsMixIn._stackLHS(m1, m2, m3)
|
|
93
|
+
array([[1., 1., 1., 0.],
|
|
94
|
+
[2., 2., 0., 0.],
|
|
95
|
+
[0., 3., 3., 1.],
|
|
96
|
+
[1., 0., 1., 0.]])
|
|
97
|
+
|
|
98
|
+
"""
|
|
99
|
+
n = 0
|
|
100
|
+
m = 0
|
|
101
|
+
dtype = np.int32
|
|
102
|
+
def update_dtype(matrix):
|
|
103
|
+
type_rank = ["int8", "int16", "int32", "int64", "float8", "float16", "float32", "float64"]
|
|
104
|
+
try:
|
|
105
|
+
idx = type_rank.index(str(matrix.dtype))
|
|
106
|
+
except ValueError:
|
|
107
|
+
raise TypeError(f"matrix type {matrix.dtype} not supported")
|
|
108
|
+
new_args = []
|
|
109
|
+
for mat in args:
|
|
110
|
+
if len(mat.shape) == 1:
|
|
111
|
+
mat = mat.reshape((1, mat.size))
|
|
112
|
+
if mat.shape[1] > n:
|
|
113
|
+
n = mat.shape[1]
|
|
114
|
+
m += mat.shape[0]
|
|
115
|
+
dtype = update_dtype(mat)
|
|
116
|
+
new_args.append(mat)
|
|
117
|
+
new_lhs = np.zeros((m, n), dtype=dtype)
|
|
118
|
+
idx = 0
|
|
119
|
+
for mat in new_args:
|
|
120
|
+
new_lhs[idx:idx+mat.shape[0],:mat.shape[1]] = mat
|
|
121
|
+
idx += mat.shape[0]
|
|
122
|
+
return new_lhs
|
|
123
|
+
|
|
85
124
|
@property
|
|
86
125
|
def offset(self) -> float:
|
|
87
126
|
""" Calculate the offset due to the conversion of constraints to penalties """
|