eqc-models 0.10.1__py3-none-any.whl → 0.10.3__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.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/__init__.py +2 -1
- eqc_models-0.10.3.data/platlib/eqc_models/assignment/setpartition.py +4 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/base.py +44 -4
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/polyeval.c +163 -163
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/polynomial.py +7 -3
- eqc_models-0.10.3.data/platlib/eqc_models/combinatorics/__init__.py +6 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/combinatorics/setcover.py +34 -17
- {eqc_models-0.10.1.data/platlib/eqc_models/assignment → eqc_models-0.10.3.data/platlib/eqc_models/combinatorics}/setpartition.py +2 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/graph/maxkcut.py +26 -68
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/solvers/qciclient.py +11 -2
- {eqc_models-0.10.1.dist-info → eqc_models-0.10.3.dist-info}/METADATA +3 -2
- eqc_models-0.10.3.dist-info/RECORD +59 -0
- {eqc_models-0.10.1.dist-info → eqc_models-0.10.3.dist-info}/WHEEL +1 -1
- eqc_models-0.10.1.data/platlib/eqc_models/base.py +0 -115
- eqc_models-0.10.1.data/platlib/eqc_models/combinatorics/__init__.py +0 -5
- eqc_models-0.10.1.data/platlib/eqc_models/communitydetection.py +0 -25
- eqc_models-0.10.1.data/platlib/eqc_models/eqcdirectsolver.py +0 -61
- eqc_models-0.10.1.data/platlib/eqc_models/graphs.py +0 -28
- eqc_models-0.10.1.data/platlib/eqc_models/maxcut.py +0 -113
- eqc_models-0.10.1.data/platlib/eqc_models/maxkcut.py +0 -185
- eqc_models-0.10.1.data/platlib/eqc_models/quadraticmodel.py +0 -131
- eqc_models-0.10.1.data/platlib/eqc_models/solvers/eqcdirect.py +0 -160
- eqc_models-0.10.1.dist-info/RECORD +0 -66
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/compile_extensions.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/algorithms/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/algorithms/base.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/algorithms/penaltymultiplier.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/allocation/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/allocation/allocation.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/allocation/portbase.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/allocation/portmomentum.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/assignment/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/assignment/qap.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/constraints.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/operators.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/polyeval.pyx +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/base/quadratic.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/decoding.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/graph/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/graph/base.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/graph/hypergraph.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/graph/maxcut.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/graph/partition.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/classifierbase.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/classifierqboost.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/classifierqsvm.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/clustering.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/clusteringbase.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/cvqboost_hamiltonian.pyx +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.c +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.h +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/decomposition.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/forecast.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/forecastbase.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/regressor.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/regressorbase.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/ml/reservoir.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/sequence/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/sequence/tsp.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/solvers/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/utilities/__init__.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/utilities/fileio.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/utilities/polynomial.py +0 -0
- {eqc_models-0.10.1.data → eqc_models-0.10.3.data}/platlib/eqc_models/utilities/qplib.py +0 -0
- {eqc_models-0.10.1.dist-info → eqc_models-0.10.3.dist-info/licenses}/LICENSE.txt +0 -0
- {eqc_models-0.10.1.dist-info → eqc_models-0.10.3.dist-info}/top_level.txt +0 -0
|
@@ -8,8 +8,9 @@ from .base import QuadraticModel, PolynomialModel
|
|
|
8
8
|
from .solvers import (Dirac1CloudSolver, Dirac3CloudSolver, Dirac3DirectSolver)
|
|
9
9
|
from .allocation import AllocationModel, AllocationModelX, ResourceRuleEnum
|
|
10
10
|
from .assignment import QAPModel
|
|
11
|
+
from .combinatorics import SetCoverModel, SetPartitionModel
|
|
11
12
|
|
|
12
13
|
__all__ = ["QuadraticModel", "PolynomialModel", "Dirac1CloudSolver",
|
|
13
14
|
"Dirac3CloudSolver", "AllocationModel", "AllocationModelX",
|
|
14
15
|
"Dirac3DirectSolver", "ResourceRuleEnum",
|
|
15
|
-
"QAPModel"]
|
|
16
|
+
"QAPModel", "SetPartitionModel", "SetCoverModel"]
|
|
@@ -42,12 +42,50 @@ class EqcModel:
|
|
|
42
42
|
_H = None
|
|
43
43
|
_machine_slacks = 0
|
|
44
44
|
|
|
45
|
-
def decode(self, solution : np.ndarray) -> np.ndarray:
|
|
46
|
-
"""
|
|
45
|
+
def decode(self, solution : np.ndarray, from_encoding : str=None) -> np.ndarray:
|
|
46
|
+
"""
|
|
47
|
+
Manipulate the solution to match the variable count. Optionally,
|
|
48
|
+
a log-encoded solution vector can be translated into a vector
|
|
49
|
+
with integral values.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
-----------
|
|
53
|
+
|
|
54
|
+
solution : np.ndarray
|
|
55
|
+
1d solution vector
|
|
56
|
+
|
|
57
|
+
from_encoding : str
|
|
58
|
+
string indicating if the vector is an encoding of particular type. The
|
|
59
|
+
text 'qubo' is the only option that does anything for now.
|
|
60
|
+
|
|
61
|
+
>>> model = EqcModel()
|
|
62
|
+
>>> ub = np.array([1, 2, 5])
|
|
63
|
+
>>> model.upper_bound = ub
|
|
64
|
+
>>> model.machine_slacks = 1
|
|
65
|
+
>>> solution = np.array([1, 1, 1, 1, 0, 1, 0]) # this solution has a 3, which violates the upper bound, but decode doesn't care
|
|
66
|
+
>>> model.decode(solution, "qubo")
|
|
67
|
+
array([1, 3, 5])
|
|
68
|
+
|
|
69
|
+
"""
|
|
47
70
|
|
|
71
|
+
solution = np.array(solution)
|
|
48
72
|
# ignore any slacks that may have been added during encoding
|
|
49
|
-
|
|
50
|
-
|
|
73
|
+
if self.machine_slacks > 0:
|
|
74
|
+
solution = solution[:-self.machine_slacks]
|
|
75
|
+
if from_encoding == "qubo":
|
|
76
|
+
ub = self.upper_bound
|
|
77
|
+
en = solution.shape[0]
|
|
78
|
+
assert en > 0
|
|
79
|
+
n = ub.shape[0]
|
|
80
|
+
linear_operator = np.zeros((n,en))
|
|
81
|
+
j = 0
|
|
82
|
+
for i in range(self.n):
|
|
83
|
+
m = int(np.floor(np.log2(ub[i]))+1)
|
|
84
|
+
bits = 2**np.arange(m)
|
|
85
|
+
assert j+m <= linear_operator.shape[1]+2, f"Invalid slice for i={i} {j}:{j+m}"
|
|
86
|
+
linear_operator[i,j:j+m] = bits
|
|
87
|
+
j += m
|
|
88
|
+
solution = (linear_operator@solution).astype(np.int64)
|
|
51
89
|
return solution
|
|
52
90
|
|
|
53
91
|
@property
|
|
@@ -64,6 +102,8 @@ class EqcModel:
|
|
|
64
102
|
value = np.array(value)
|
|
65
103
|
if (value != value.astype(np.int64)).any():
|
|
66
104
|
raise ValueError("Upper bound values must be integer")
|
|
105
|
+
if (value==0).any():
|
|
106
|
+
raise ValueError("Zero values are not allowed as an upper_bound.")
|
|
67
107
|
self._upper_bound = value.astype(np.int64)
|
|
68
108
|
|
|
69
109
|
@property
|