eqc-models 0.9.9__py3-none-any.whl → 0.10.1__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/platlib/compile_extensions.py +67 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/algorithms/penaltymultiplier.py +20 -7
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polyeval.c +127 -123
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
- eqc_models-0.10.1.data/platlib/eqc_models/base.py +115 -0
- eqc_models-0.10.1.data/platlib/eqc_models/combinatorics/__init__.py +5 -0
- eqc_models-0.10.1.data/platlib/eqc_models/combinatorics/setcover.py +94 -0
- eqc_models-0.10.1.data/platlib/eqc_models/communitydetection.py +25 -0
- eqc_models-0.10.1.data/platlib/eqc_models/eqcdirectsolver.py +61 -0
- eqc_models-0.10.1.data/platlib/eqc_models/graph/__init__.py +6 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/base.py +28 -17
- eqc_models-0.10.1.data/platlib/eqc_models/graph/partition.py +148 -0
- eqc_models-0.10.1.data/platlib/eqc_models/graphs.py +28 -0
- eqc_models-0.10.1.data/platlib/eqc_models/maxcut.py +113 -0
- eqc_models-0.10.1.data/platlib/eqc_models/maxkcut.py +185 -0
- eqc_models-0.10.1.data/platlib/eqc_models/ml/classifierqboost.py +628 -0
- eqc_models-0.10.1.data/platlib/eqc_models/ml/cvqboost_hamiltonian.pyx +83 -0
- eqc_models-0.10.1.data/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.c +68 -0
- eqc_models-0.10.1.data/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.h +14 -0
- eqc_models-0.10.1.data/platlib/eqc_models/quadraticmodel.py +131 -0
- eqc_models-0.10.1.data/platlib/eqc_models/solvers/eqcdirect.py +160 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/polynomial.py +11 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.1.dist-info}/METADATA +2 -1
- eqc_models-0.10.1.dist-info/RECORD +66 -0
- eqc_models-0.9.9.data/platlib/compile_extensions.py +0 -23
- eqc_models-0.9.9.data/platlib/eqc_models/graph/__init__.py +0 -5
- eqc_models-0.9.9.data/platlib/eqc_models/ml/classifierqboost.py +0 -423
- eqc_models-0.9.9.dist-info/RECORD +0 -52
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/algorithms/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/algorithms/base.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/allocation.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/portbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/portmomentum.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/assignment/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/assignment/qap.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/assignment/setpartition.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/base.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/constraints.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/operators.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polyeval.pyx +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polynomial.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/quadratic.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/decoding.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/hypergraph.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/maxcut.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/maxkcut.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/classifierbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/classifierqsvm.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/clustering.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/clusteringbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/decomposition.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/forecast.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/forecastbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/regressor.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/regressorbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/reservoir.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/sequence/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/sequence/tsp.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/solvers/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/solvers/qciclient.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/fileio.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/qplib.py +0 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.1.dist-info}/LICENSE.txt +0 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.1.dist-info}/WHEEL +0 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
from setuptools import Extension
|
|
4
|
+
from setuptools.command.build_py import build_py as _build_py
|
|
5
|
+
import numpy
|
|
6
|
+
|
|
7
|
+
# # Set cvqboost compile args
|
|
8
|
+
# if sys.platform == "darwin":
|
|
9
|
+
# openmp_prefix = os.environ.get(
|
|
10
|
+
# "LIBOMP_PREFIX", "/opt/homebrew/opt/libomp"
|
|
11
|
+
# )
|
|
12
|
+
# openmp_include = os.path.join(openmp_prefix, "include")
|
|
13
|
+
# openmp_lib = os.path.join(openmp_prefix, "lib", "libomp.a")
|
|
14
|
+
# extra_compile_args_cvq = [
|
|
15
|
+
# "-Xpreprocessor",
|
|
16
|
+
# "-fopenmp",
|
|
17
|
+
# "-O3",
|
|
18
|
+
# "-ffast-math",
|
|
19
|
+
# "-march=native",
|
|
20
|
+
# ]
|
|
21
|
+
# extra_link_args_cvq = [openmp_lib, "-O3", "-march=native"]
|
|
22
|
+
# elif sys.platform.startswith("linux"):
|
|
23
|
+
# extra_compile_args_cvq = [
|
|
24
|
+
# "-static-libgcc",
|
|
25
|
+
# "-fopenmp",
|
|
26
|
+
# "-O3",
|
|
27
|
+
# "-ffast-math",
|
|
28
|
+
# ]
|
|
29
|
+
# extra_link_args_cvq = [
|
|
30
|
+
# "-static-libgcc",
|
|
31
|
+
# "-static-libstdc++",
|
|
32
|
+
# "-fopenmp",
|
|
33
|
+
# "-O3",
|
|
34
|
+
# ]
|
|
35
|
+
# elif sys.platform == "win32":
|
|
36
|
+
# extra_compile_args_cvq = ["/openmp"]
|
|
37
|
+
# extra_link_args_cvq = []
|
|
38
|
+
|
|
39
|
+
# Modules to be compiled and include_dirs when necessary
|
|
40
|
+
extensions = [
|
|
41
|
+
Extension(
|
|
42
|
+
"eqc_models.base.polyeval",
|
|
43
|
+
["eqc_models/base/polyeval.pyx"],
|
|
44
|
+
include_dirs=[numpy.get_include()],
|
|
45
|
+
extra_compile_args=["-O3", "-ffast-math"],
|
|
46
|
+
),
|
|
47
|
+
# Extension(
|
|
48
|
+
# "eqc_models.ml.cvqboost_hamiltonian",
|
|
49
|
+
# ["eqc_models/ml/cvqboost_hamiltonian.pyx"],
|
|
50
|
+
# include_dirs=[numpy.get_include()],
|
|
51
|
+
# extra_compile_args=extra_compile_args_cvq,
|
|
52
|
+
# extra_link_args=extra_link_args_cvq,
|
|
53
|
+
# ),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class build_py(_build_py):
|
|
58
|
+
def run(self):
|
|
59
|
+
self.run_command("build_ext")
|
|
60
|
+
return super().run()
|
|
61
|
+
|
|
62
|
+
def initialize_options(self):
|
|
63
|
+
super().initialize_options()
|
|
64
|
+
if self.distribution.ext_modules == None:
|
|
65
|
+
self.distribution.ext_modules = []
|
|
66
|
+
|
|
67
|
+
self.distribution.ext_modules.extend(extensions)
|
{eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/algorithms/penaltymultiplier.py
RENAMED
|
@@ -33,6 +33,14 @@ class PenaltyMultiplierAlgorithm(Algorithm):
|
|
|
33
33
|
penalties : List
|
|
34
34
|
The values for penalties found at each algorithm iteration. A penalty of 0
|
|
35
35
|
indicates algorithm termination.
|
|
36
|
+
penalty_threshold : float
|
|
37
|
+
This value is the cutoff for penalty values that are threated as 0. Default
|
|
38
|
+
is 1e-6.
|
|
39
|
+
progress_threshold : float
|
|
40
|
+
This value is the cutoff for checking for progress on reducing the penalty
|
|
41
|
+
value. The current penalty is compared to the average of the previous two
|
|
42
|
+
and if the absolute difference is less than this value, then the algorithm
|
|
43
|
+
stops, reporting progress has not been made. The default value is 1e-4.
|
|
36
44
|
dynamic_range : List
|
|
37
45
|
The values for the dynamic range of the unconstrained problem formulation,
|
|
38
46
|
which is useful for identifying difficulty in representation of the problem
|
|
@@ -50,7 +58,7 @@ class PenaltyMultiplierAlgorithm(Algorithm):
|
|
|
50
58
|
This example uses the quadratic assignment problem and the known multiplier to test
|
|
51
59
|
the implementation of the algorithm.
|
|
52
60
|
|
|
53
|
-
>>> from eqc_models.solvers.qciclient import
|
|
61
|
+
>>> from eqc_models.solvers.qciclient import Dirac3IntegerCloudSolver
|
|
54
62
|
>>> from eqc_models.assignment.qap import QAPModel
|
|
55
63
|
>>> A = np.array([[0, 5, 8, 0, 1],
|
|
56
64
|
... [0, 0, 0, 10, 15],
|
|
@@ -68,10 +76,10 @@ class PenaltyMultiplierAlgorithm(Algorithm):
|
|
|
68
76
|
... [7, 5, 8, 5, 7],
|
|
69
77
|
... [1, 9, 2, 9, 2.]])
|
|
70
78
|
>>> model = QAPModel(A, B, C)
|
|
71
|
-
>>> solver =
|
|
79
|
+
>>> solver = Dirac3IntegerCloudSolver() # must be configured with environment variables
|
|
72
80
|
>>> algo = PenaltyMultiplierAlgorithm(model, solver)
|
|
73
81
|
>>> algo.upper_bound = 330.64
|
|
74
|
-
>>> algo.run(relaxation_schedule=2,
|
|
82
|
+
>>> algo.run(relaxation_schedule=2, num_samples=5) # doctest: +ELLIPSIS
|
|
75
83
|
2... RUNNING... COMPLETED...
|
|
76
84
|
>>> algo.alphas[-1] # doctest: +SKIP
|
|
77
85
|
106.25
|
|
@@ -80,7 +88,8 @@ class PenaltyMultiplierAlgorithm(Algorithm):
|
|
|
80
88
|
|
|
81
89
|
"""
|
|
82
90
|
|
|
83
|
-
def __init__(self, model : ConstraintModel, solver : ModelSolver
|
|
91
|
+
def __init__(self, model : ConstraintModel, solver : ModelSolver, penalty_threshold:float=1e-6,
|
|
92
|
+
progress_threshold : float = 1e-4):
|
|
84
93
|
self.model = model
|
|
85
94
|
self.solver = solver
|
|
86
95
|
# ub = np.max(model.quad_objective)
|
|
@@ -95,6 +104,8 @@ class PenaltyMultiplierAlgorithm(Algorithm):
|
|
|
95
104
|
self.alphas = None
|
|
96
105
|
self.dynamic_range = None
|
|
97
106
|
self.responses = None
|
|
107
|
+
self.penalty_threshold = penalty_threshold
|
|
108
|
+
self.progress_threshold = progress_threshold
|
|
98
109
|
|
|
99
110
|
@property
|
|
100
111
|
def upper_bound(self) -> float:
|
|
@@ -141,7 +152,7 @@ class PenaltyMultiplierAlgorithm(Algorithm):
|
|
|
141
152
|
else:
|
|
142
153
|
penalty = None
|
|
143
154
|
|
|
144
|
-
while penalty is None or penalty >
|
|
155
|
+
while penalty is None or penalty > self.penalty_threshold:
|
|
145
156
|
log.info("NEW RUN")
|
|
146
157
|
log.info("SETTING MULTIPLIER %f", alpha)
|
|
147
158
|
model.penalty_multiplier = float(alpha)
|
|
@@ -162,8 +173,10 @@ class PenaltyMultiplierAlgorithm(Algorithm):
|
|
|
162
173
|
energies.append(results["energies"][0])
|
|
163
174
|
log.info("NEW SOLUTION OBJECTIVE %f LESS OFFSET %f ENERGY %f PENALTY %f",
|
|
164
175
|
obj_val, less_offset, energies[-1], penalty)
|
|
165
|
-
if
|
|
176
|
+
if penalty < self.penalty_threshold:
|
|
177
|
+
pass
|
|
178
|
+
elif obj_val < ub:
|
|
166
179
|
alpha += (ub - obj_val) / penalty
|
|
167
|
-
if abs(sum(penalties[-2:])/2-penalty) <
|
|
180
|
+
if penalty > self.penalty_threshold and abs(sum(penalties[-2:])/2-penalty) < self.progress_threshold:
|
|
168
181
|
log.warn("SUFFICIENT PROGRESS NOT MADE FOR THREE ITERATIONS, QUITTING")
|
|
169
182
|
break
|