eqc-models 0.9.9__py3-none-any.whl → 0.10.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.10.0.data/platlib/compile_extensions.py +67 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/polyeval.c +127 -123
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
- eqc_models-0.10.0.data/platlib/eqc_models/base.py +115 -0
- eqc_models-0.10.0.data/platlib/eqc_models/combinatorics/setcover.py +93 -0
- eqc_models-0.10.0.data/platlib/eqc_models/communitydetection.py +25 -0
- eqc_models-0.10.0.data/platlib/eqc_models/eqcdirectsolver.py +61 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/graph/base.py +28 -17
- eqc_models-0.10.0.data/platlib/eqc_models/graph/partition.py +148 -0
- eqc_models-0.10.0.data/platlib/eqc_models/graphs.py +28 -0
- eqc_models-0.10.0.data/platlib/eqc_models/maxcut.py +113 -0
- eqc_models-0.10.0.data/platlib/eqc_models/maxkcut.py +185 -0
- eqc_models-0.10.0.data/platlib/eqc_models/ml/classifierqboost.py +628 -0
- eqc_models-0.10.0.data/platlib/eqc_models/ml/cvqboost_hamiltonian.pyx +83 -0
- eqc_models-0.10.0.data/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.c +68 -0
- eqc_models-0.10.0.data/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.h +14 -0
- eqc_models-0.10.0.data/platlib/eqc_models/quadraticmodel.py +131 -0
- eqc_models-0.10.0.data/platlib/eqc_models/solvers/eqcdirect.py +160 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/utilities/polynomial.py +11 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.0.dist-info}/METADATA +2 -1
- eqc_models-0.10.0.dist-info/RECORD +65 -0
- eqc_models-0.9.9.data/platlib/compile_extensions.py +0 -23
- 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.0.data}/platlib/eqc_models/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/algorithms/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/algorithms/base.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/algorithms/penaltymultiplier.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/allocation/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/allocation/allocation.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/allocation/portbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/allocation/portmomentum.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/assignment/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/assignment/qap.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/assignment/setpartition.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/base.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/constraints.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/operators.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/polyeval.pyx +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/polynomial.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/base/quadratic.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/decoding.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/graph/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/graph/hypergraph.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/graph/maxcut.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/graph/maxkcut.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/classifierbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/classifierqsvm.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/clustering.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/clusteringbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/decomposition.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/forecast.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/forecastbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/regressor.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/regressorbase.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/ml/reservoir.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/sequence/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/sequence/tsp.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/solvers/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/solvers/qciclient.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/utilities/__init__.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/utilities/fileio.py +0 -0
- {eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/utilities/qplib.py +0 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.0.dist-info}/LICENSE.txt +0 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.0.dist-info}/WHEEL +0 -0
- {eqc_models-0.9.9.dist-info → eqc_models-0.10.0.dist-info}/top_level.txt +0 -0
|
@@ -1,423 +0,0 @@
|
|
|
1
|
-
# (C) Quantum Computing Inc., 2024.
|
|
2
|
-
# Import libs
|
|
3
|
-
import os
|
|
4
|
-
import sys
|
|
5
|
-
import time
|
|
6
|
-
import datetime
|
|
7
|
-
import json
|
|
8
|
-
import warnings
|
|
9
|
-
from functools import wraps
|
|
10
|
-
import numpy as np
|
|
11
|
-
from sklearn.tree import DecisionTreeClassifier
|
|
12
|
-
from sklearn.naive_bayes import GaussianNB
|
|
13
|
-
from sklearn.linear_model import LogisticRegression
|
|
14
|
-
from sklearn.gaussian_process import GaussianProcessClassifier
|
|
15
|
-
from sklearn.gaussian_process.kernels import RBF
|
|
16
|
-
|
|
17
|
-
from eqc_models.ml.classifierbase import ClassifierBase
|
|
18
|
-
|
|
19
|
-
def timer(func):
|
|
20
|
-
@wraps(func)
|
|
21
|
-
def wrapper(*args, **kwargs):
|
|
22
|
-
beg_time = time.time()
|
|
23
|
-
val = func(*args, **kwargs)
|
|
24
|
-
end_time = time.time()
|
|
25
|
-
tot_time = end_time - beg_time
|
|
26
|
-
|
|
27
|
-
print(
|
|
28
|
-
"Runtime of %s: %0.2f seconds!"
|
|
29
|
-
% (
|
|
30
|
-
func.__name__,
|
|
31
|
-
tot_time,
|
|
32
|
-
)
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
return val
|
|
36
|
-
|
|
37
|
-
return wrapper
|
|
38
|
-
|
|
39
|
-
class WeakClassifierDct:
|
|
40
|
-
def __init__(
|
|
41
|
-
self,
|
|
42
|
-
fea_ind_list,
|
|
43
|
-
X_train,
|
|
44
|
-
y_train,
|
|
45
|
-
max_depth=10,
|
|
46
|
-
min_samples_split=100,
|
|
47
|
-
):
|
|
48
|
-
assert X_train.shape[0] == len(y_train)
|
|
49
|
-
|
|
50
|
-
self.fea_ind_list = fea_ind_list
|
|
51
|
-
self.X_train = X_train
|
|
52
|
-
self.y_train = y_train
|
|
53
|
-
self.clf = DecisionTreeClassifier(
|
|
54
|
-
max_depth=max_depth,
|
|
55
|
-
min_samples_split=min_samples_split,
|
|
56
|
-
random_state=0,
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
def train(self):
|
|
60
|
-
X_tmp = self.X_train.transpose()[self.fea_ind_list].transpose()
|
|
61
|
-
|
|
62
|
-
self.clf.fit(X_tmp, self.y_train)
|
|
63
|
-
|
|
64
|
-
def predict(self, X):
|
|
65
|
-
X_tmp = X.transpose()[self.fea_ind_list].transpose()
|
|
66
|
-
|
|
67
|
-
return self.clf.predict(X_tmp)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class WeakClassifierNB:
|
|
71
|
-
def __init__(self, fea_ind_list, X_train, y_train):
|
|
72
|
-
assert X_train.shape[0] == len(y_train)
|
|
73
|
-
|
|
74
|
-
self.fea_ind_list = fea_ind_list
|
|
75
|
-
self.X_train = X_train
|
|
76
|
-
self.y_train = y_train
|
|
77
|
-
self.clf = GaussianNB()
|
|
78
|
-
|
|
79
|
-
def train(self):
|
|
80
|
-
X_tmp = self.X_train.transpose()[self.fea_ind_list].transpose()
|
|
81
|
-
|
|
82
|
-
self.clf.fit(X_tmp, self.y_train)
|
|
83
|
-
|
|
84
|
-
def predict(self, X):
|
|
85
|
-
X_tmp = X.transpose()[self.fea_ind_list].transpose()
|
|
86
|
-
|
|
87
|
-
return self.clf.predict(X_tmp)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
class WeakClassifierLG:
|
|
91
|
-
def __init__(self, fea_ind_list, X_train, y_train):
|
|
92
|
-
assert X_train.shape[0] == len(y_train)
|
|
93
|
-
|
|
94
|
-
self.fea_ind_list = fea_ind_list
|
|
95
|
-
self.X_train = X_train
|
|
96
|
-
self.y_train = y_train
|
|
97
|
-
self.clf = LogisticRegression(random_state=0)
|
|
98
|
-
|
|
99
|
-
def train(self):
|
|
100
|
-
X_tmp = self.X_train.transpose()[self.fea_ind_list].transpose()
|
|
101
|
-
|
|
102
|
-
self.clf.fit(X_tmp, self.y_train)
|
|
103
|
-
|
|
104
|
-
def predict(self, X):
|
|
105
|
-
X_tmp = X.transpose()[self.fea_ind_list].transpose()
|
|
106
|
-
|
|
107
|
-
return self.clf.predict(X_tmp)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
class WeakClassifierGP:
|
|
111
|
-
def __init__(self, fea_ind_list, X_train, y_train):
|
|
112
|
-
assert X_train.shape[0] == len(y_train)
|
|
113
|
-
|
|
114
|
-
self.fea_ind_list = fea_ind_list
|
|
115
|
-
self.X_train = X_train
|
|
116
|
-
self.y_train = y_train
|
|
117
|
-
self.clf = GaussianProcessClassifier(
|
|
118
|
-
kernel=1.0 * RBF(1.0),
|
|
119
|
-
random_state=0,
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
def train(self):
|
|
123
|
-
X_tmp = self.X_train.transpose()[self.fea_ind_list].transpose()
|
|
124
|
-
|
|
125
|
-
self.clf.fit(X_tmp, self.y_train)
|
|
126
|
-
|
|
127
|
-
def predict(self, X):
|
|
128
|
-
X_tmp = X.transpose()[self.fea_ind_list].transpose()
|
|
129
|
-
|
|
130
|
-
return self.clf.predict(X_tmp)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
class QBoostClassifier(ClassifierBase):
|
|
134
|
-
"""An implementation of QBoost classifier that uses QCi's Dirac-3.
|
|
135
|
-
|
|
136
|
-
Parameters
|
|
137
|
-
----------
|
|
138
|
-
relaxation_schedule: Relaxation schedule used by Dirac-3;
|
|
139
|
-
default: 2.
|
|
140
|
-
|
|
141
|
-
num_samples: Number of samples used by Dirac-3; default: 1.
|
|
142
|
-
|
|
143
|
-
lambda_coef: A penalty multiplier; default: 0.
|
|
144
|
-
|
|
145
|
-
weak_cls_schedule: Weak classifier schedule. Is either 1, 2,
|
|
146
|
-
or 3; default: 2.
|
|
147
|
-
|
|
148
|
-
weak_cls_type: Type of weak classifier
|
|
149
|
-
- dct: Decison tree classifier
|
|
150
|
-
- nb: Naive Baysian classifier
|
|
151
|
-
- lg: Logistic regression
|
|
152
|
-
- gp: Gaussian process classifier
|
|
153
|
-
|
|
154
|
-
default: dct.
|
|
155
|
-
|
|
156
|
-
weak_max_depth: Max depth of the tree. Applied only when
|
|
157
|
-
weak_cls_type="dct". Default: 10.
|
|
158
|
-
|
|
159
|
-
weak_min_samples_split: The minimum number of samples required
|
|
160
|
-
to split an internal node. Applied only when
|
|
161
|
-
weak_cls_type="dct". Default: 100.
|
|
162
|
-
|
|
163
|
-
Examples
|
|
164
|
-
-----------
|
|
165
|
-
|
|
166
|
-
>>> from sklearn import datasets
|
|
167
|
-
>>> from sklearn.preprocessing import MinMaxScaler
|
|
168
|
-
>>> from sklearn.model_selection import train_test_split
|
|
169
|
-
>>> iris = datasets.load_iris()
|
|
170
|
-
>>> X = iris.data
|
|
171
|
-
>>> y = iris.target
|
|
172
|
-
>>> scaler = MinMaxScaler()
|
|
173
|
-
>>> X = scaler.fit_transform(X)
|
|
174
|
-
>>> for i in range(len(y)):
|
|
175
|
-
... if y[i] == 0:
|
|
176
|
-
... y[i] = -1
|
|
177
|
-
... elif y[i] == 2:
|
|
178
|
-
... y[i] = 1
|
|
179
|
-
>>> X_train, X_test, y_train, y_test = train_test_split(
|
|
180
|
-
... X,
|
|
181
|
-
... y,
|
|
182
|
-
... test_size=0.2,
|
|
183
|
-
... random_state=42,
|
|
184
|
-
... )
|
|
185
|
-
>>> from eqc_models.ml.classifierqboost import QBoostClassifier
|
|
186
|
-
>>> obj = QBoostClassifier(
|
|
187
|
-
... relaxation_schedule=2,
|
|
188
|
-
... num_samples=1,
|
|
189
|
-
... lambda_coef=0.0,
|
|
190
|
-
... )
|
|
191
|
-
>>> from contextlib import redirect_stdout
|
|
192
|
-
>>> import io
|
|
193
|
-
>>> f = io.StringIO()
|
|
194
|
-
>>> with redirect_stdout(f):
|
|
195
|
-
... obj = obj.fit(X_train, y_train)
|
|
196
|
-
... y_train_prd = obj.predict(X_train)
|
|
197
|
-
... y_test_prd = obj.predict(X_test)
|
|
198
|
-
"""
|
|
199
|
-
def __init__(
|
|
200
|
-
self,
|
|
201
|
-
relaxation_schedule=2,
|
|
202
|
-
num_samples=1,
|
|
203
|
-
lambda_coef=0,
|
|
204
|
-
weak_cls_schedule=2,
|
|
205
|
-
weak_cls_type="lg",
|
|
206
|
-
weak_max_depth=10,
|
|
207
|
-
weak_min_samples_split=100,
|
|
208
|
-
):
|
|
209
|
-
super(QBoostClassifier).__init__()
|
|
210
|
-
|
|
211
|
-
assert weak_cls_schedule in [1, 2, 3]
|
|
212
|
-
assert weak_cls_type in ["dct", "nb", "lg", "gp"]
|
|
213
|
-
|
|
214
|
-
self.relaxation_schedule = relaxation_schedule
|
|
215
|
-
self.num_samples = num_samples
|
|
216
|
-
self.lambda_coef = lambda_coef
|
|
217
|
-
self.weak_cls_schedule = weak_cls_schedule
|
|
218
|
-
self.weak_cls_type = weak_cls_type
|
|
219
|
-
self.weak_max_depth = weak_max_depth
|
|
220
|
-
self.weak_min_samples_split = weak_min_samples_split
|
|
221
|
-
self.h_list = []
|
|
222
|
-
self.classes_ = None
|
|
223
|
-
|
|
224
|
-
@timer
|
|
225
|
-
def _build_weak_classifiers(self, X, y):
|
|
226
|
-
n_records = X.shape[0]
|
|
227
|
-
n_dims = X.shape[1]
|
|
228
|
-
|
|
229
|
-
assert len(y) == n_records
|
|
230
|
-
|
|
231
|
-
self.h_list = []
|
|
232
|
-
|
|
233
|
-
for l in range(n_dims):
|
|
234
|
-
if self.weak_cls_type == "dct":
|
|
235
|
-
weak_classifier = WeakClassifierDct(
|
|
236
|
-
[l],
|
|
237
|
-
X,
|
|
238
|
-
y,
|
|
239
|
-
self.weak_max_depth,
|
|
240
|
-
self.weak_min_samples_split,
|
|
241
|
-
)
|
|
242
|
-
elif self.weak_cls_type == "nb":
|
|
243
|
-
weak_classifier = WeakClassifierNB([l], X, y)
|
|
244
|
-
elif self.weak_cls_type == "lg":
|
|
245
|
-
weak_classifier = WeakClassifierLG([l], X, y)
|
|
246
|
-
elif self.weak_cls_type == "gp":
|
|
247
|
-
weak_classifier = WeakClassifierGP([l], X, y)
|
|
248
|
-
|
|
249
|
-
weak_classifier.train()
|
|
250
|
-
|
|
251
|
-
self.h_list.append(weak_classifier)
|
|
252
|
-
|
|
253
|
-
if self.weak_cls_schedule >= 2:
|
|
254
|
-
for i in range(n_dims):
|
|
255
|
-
for j in range(i + 1, n_dims):
|
|
256
|
-
if self.weak_cls_type == "dct":
|
|
257
|
-
weak_classifier = WeakClassifierDct(
|
|
258
|
-
[i, j],
|
|
259
|
-
X,
|
|
260
|
-
y,
|
|
261
|
-
self.weak_max_depth,
|
|
262
|
-
self.weak_min_samples_split,
|
|
263
|
-
)
|
|
264
|
-
elif self.weak_cls_type == "nb":
|
|
265
|
-
weak_classifier = WeakClassifierNB([i, j], X, y)
|
|
266
|
-
elif self.weak_cls_type == "lg":
|
|
267
|
-
weak_classifier = WeakClassifierLG([i, j], X, y)
|
|
268
|
-
elif self.weak_cls_type == "gp":
|
|
269
|
-
weak_classifier = WeakClassifierGP([i, j], X, y)
|
|
270
|
-
|
|
271
|
-
weak_classifier.train()
|
|
272
|
-
self.h_list.append(weak_classifier)
|
|
273
|
-
|
|
274
|
-
if self.weak_cls_schedule >= 3:
|
|
275
|
-
for i in range(n_dims):
|
|
276
|
-
for j in range(i + 1, n_dims):
|
|
277
|
-
for k in range(j + 1, n_dims):
|
|
278
|
-
if self.weak_cls_type == "dct":
|
|
279
|
-
weak_classifier = WeakClassifierDct(
|
|
280
|
-
[i, j, k],
|
|
281
|
-
X,
|
|
282
|
-
y,
|
|
283
|
-
self.weak_max_depth,
|
|
284
|
-
self.weak_min_samples_split,
|
|
285
|
-
)
|
|
286
|
-
elif self.weak_cls_type == "nb":
|
|
287
|
-
weak_classifier = WeakClassifierNB(
|
|
288
|
-
[i, j, k], X, y
|
|
289
|
-
)
|
|
290
|
-
elif self.weak_cls_type == "lg":
|
|
291
|
-
weak_classifier = WeakClassifierLG(
|
|
292
|
-
[i, j, k], X, y
|
|
293
|
-
)
|
|
294
|
-
elif self.weak_cls_type == "gp":
|
|
295
|
-
weak_classifier = WeakClassifierGP(
|
|
296
|
-
[i, j, k], X, y
|
|
297
|
-
)
|
|
298
|
-
weak_classifier.train()
|
|
299
|
-
self.h_list.append(weak_classifier)
|
|
300
|
-
|
|
301
|
-
return
|
|
302
|
-
|
|
303
|
-
def fit(self, X, y):
|
|
304
|
-
"""
|
|
305
|
-
Build a QBoost classifier from the training set (X, y).
|
|
306
|
-
|
|
307
|
-
Parameters
|
|
308
|
-
----------
|
|
309
|
-
X : {array-like, sparse matrix} of shape (n_samples, n_features)
|
|
310
|
-
The training input samples.
|
|
311
|
-
|
|
312
|
-
y : array-like of shape (n_samples,)
|
|
313
|
-
The target values.
|
|
314
|
-
|
|
315
|
-
Returns
|
|
316
|
-
-------
|
|
317
|
-
Response of Dirac-3 in JSON format.
|
|
318
|
-
"""
|
|
319
|
-
|
|
320
|
-
assert X.shape[0] == y.shape[0], "Inconsistent sizes!"
|
|
321
|
-
|
|
322
|
-
assert set(y) == {-1, 1}, "Target values should be in {-1, 1}"
|
|
323
|
-
|
|
324
|
-
self.classes_ = set(y)
|
|
325
|
-
|
|
326
|
-
J, C, sum_constraint = self.get_hamiltonian(X, y)
|
|
327
|
-
|
|
328
|
-
assert J.shape[0] == J.shape[1], "Inconsistent hamiltonian size!"
|
|
329
|
-
assert J.shape[0] == C.shape[0], "Inconsistent hamiltonian size!"
|
|
330
|
-
|
|
331
|
-
self.set_model(J, C, sum_constraint)
|
|
332
|
-
|
|
333
|
-
sol, response = self.solve()
|
|
334
|
-
|
|
335
|
-
assert len(sol) == C.shape[0], "Inconsistent solution size!"
|
|
336
|
-
|
|
337
|
-
self.params = self.convert_sol_to_params(sol)
|
|
338
|
-
|
|
339
|
-
assert len(self.params) == len(self.h_list), "Inconsistent size!"
|
|
340
|
-
|
|
341
|
-
return response
|
|
342
|
-
|
|
343
|
-
def predict_raw(self, X: np.array):
|
|
344
|
-
"""
|
|
345
|
-
Predict raw output of the classifier for input X.
|
|
346
|
-
|
|
347
|
-
Parameters
|
|
348
|
-
----------
|
|
349
|
-
X : {array-like, sparse matrix} of shape (n_samples, n_features)
|
|
350
|
-
|
|
351
|
-
Returns
|
|
352
|
-
-------
|
|
353
|
-
y : ndarray of shape (n_samples,)
|
|
354
|
-
The predicted raw output of the classifier.
|
|
355
|
-
"""
|
|
356
|
-
|
|
357
|
-
n_records = X.shape[0]
|
|
358
|
-
n_classifiers = len(self.h_list)
|
|
359
|
-
|
|
360
|
-
y = np.zeros(shape=(n_records), dtype=np.float32)
|
|
361
|
-
h_vals = np.array(
|
|
362
|
-
[self.h_list[i].predict(X) for i in range(n_classifiers)]
|
|
363
|
-
)
|
|
364
|
-
|
|
365
|
-
y = np.tensordot(self.params, h_vals, axes=(0, 0))
|
|
366
|
-
|
|
367
|
-
return y
|
|
368
|
-
|
|
369
|
-
def predict(self, X: np.array):
|
|
370
|
-
"""
|
|
371
|
-
Predict classes for X.
|
|
372
|
-
|
|
373
|
-
Parameters
|
|
374
|
-
----------
|
|
375
|
-
X : {array-like, sparse matrix} of shape (n_samples, n_features)
|
|
376
|
-
|
|
377
|
-
Returns
|
|
378
|
-
-------
|
|
379
|
-
y : ndarray of shape (n_samples,)
|
|
380
|
-
The predicted classes.
|
|
381
|
-
"""
|
|
382
|
-
|
|
383
|
-
y = self.predict_raw(X)
|
|
384
|
-
y = np.sign(y)
|
|
385
|
-
|
|
386
|
-
return y
|
|
387
|
-
|
|
388
|
-
@timer
|
|
389
|
-
def get_hamiltonian(
|
|
390
|
-
self,
|
|
391
|
-
X: np.array,
|
|
392
|
-
y: np.array,
|
|
393
|
-
):
|
|
394
|
-
self._build_weak_classifiers(X, y)
|
|
395
|
-
|
|
396
|
-
print("Built %d weak classifiers!" % len(self.h_list))
|
|
397
|
-
|
|
398
|
-
n_classifiers = len(self.h_list)
|
|
399
|
-
n_records = X.shape[0]
|
|
400
|
-
|
|
401
|
-
J = np.zeros(
|
|
402
|
-
shape=(n_classifiers, n_classifiers), dtype=np.float32
|
|
403
|
-
)
|
|
404
|
-
C = np.zeros(shape=(n_classifiers,), dtype=np.float32)
|
|
405
|
-
|
|
406
|
-
h_vals = np.array(
|
|
407
|
-
[self.h_list[i].predict(X) for i in range(n_classifiers)]
|
|
408
|
-
)
|
|
409
|
-
|
|
410
|
-
for i in range(n_classifiers):
|
|
411
|
-
for j in range(n_classifiers):
|
|
412
|
-
J[i][j] = sum(h_vals[i] * h_vals[j])
|
|
413
|
-
if i == j:
|
|
414
|
-
J[i][i] += self.lambda_coef
|
|
415
|
-
|
|
416
|
-
C[i] = -2.0 * sum(y * h_vals[i])
|
|
417
|
-
|
|
418
|
-
C = C.reshape((n_classifiers, 1))
|
|
419
|
-
|
|
420
|
-
return J, C, 1.0
|
|
421
|
-
|
|
422
|
-
def convert_sol_to_params(self, sol):
|
|
423
|
-
return np.array(sol)
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
eqc_models-0.9.9.data/platlib/compile_extensions.py,sha256=GNbNr9Pao2NwFUr29qEGrYSHvIlagnPcUqo3pgB5Trk,660
|
|
2
|
-
eqc_models-0.9.9.data/platlib/eqc_models/__init__.py,sha256=njh-tvfgnAIVBGw9FXFv6XQOAgwrnBG23dU9dipa1Jg,585
|
|
3
|
-
eqc_models-0.9.9.data/platlib/eqc_models/decoding.py,sha256=G3JgbIFzvZ3DIKW0kZ1JeTMIZmrc8hy9kzdbX2Xv5Og,637
|
|
4
|
-
eqc_models-0.9.9.data/platlib/eqc_models/algorithms/__init__.py,sha256=lzQoMMSs2QTqp5suEYNvcQaSEN16d0LwIsZ1mRstumU,135
|
|
5
|
-
eqc_models-0.9.9.data/platlib/eqc_models/algorithms/base.py,sha256=qfQQTwuVyewn7Qpg1_SVoD_7TsdA8vdwSKGqOeZSmNI,204
|
|
6
|
-
eqc_models-0.9.9.data/platlib/eqc_models/algorithms/penaltymultiplier.py,sha256=gV48irx3q9yvMsCRqv2fa8DGQEOUkgVNGbZdNzI-3Tc,7057
|
|
7
|
-
eqc_models-0.9.9.data/platlib/eqc_models/allocation/__init__.py,sha256=op_udrapTlWrakTuQId3M0ggo-Y1w4nGJLPcYKOQ-8I,239
|
|
8
|
-
eqc_models-0.9.9.data/platlib/eqc_models/allocation/allocation.py,sha256=PAQn4M75Zegeoy0i6r3hycWs4TKeRglHk05TvwZOoLk,15506
|
|
9
|
-
eqc_models-0.9.9.data/platlib/eqc_models/allocation/portbase.py,sha256=BTnYYduHydPbrE2yQr_Sgv3XJACH_GpIJstuMrfGqCU,3269
|
|
10
|
-
eqc_models-0.9.9.data/platlib/eqc_models/allocation/portmomentum.py,sha256=oMod63rNDC-01dLZjmhUb24SN3_GVgfc6CItgQL_obI,3756
|
|
11
|
-
eqc_models-0.9.9.data/platlib/eqc_models/assignment/__init__.py,sha256=CX_QYl8P1meajV8gcVs6hm07VhoLVe8uu436t7-1XQo,86
|
|
12
|
-
eqc_models-0.9.9.data/platlib/eqc_models/assignment/qap.py,sha256=WMiQQmTORsgi2w7kbmMA1xo-93dESLECWqYTF-zkmTs,2963
|
|
13
|
-
eqc_models-0.9.9.data/platlib/eqc_models/assignment/setpartition.py,sha256=-DJjPgsSMslEjfo3iDdXbKHQ9Lfc3cHlNc-9DtkJnW0,6202
|
|
14
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/__init__.py,sha256=RwZguuucmsuOSVqfPLBqj-wzinBOzcgO-2ifFU-DCqg,2885
|
|
15
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/base.py,sha256=kpnOb1dw0aaQyassIYKNlS6rIH1fNvZMI-NKPosAEMk,4856
|
|
16
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/constraints.py,sha256=KMPyCdt_8GMWLnVEdpzw1T1WqXm2f7Lh629ClUH7XDY,8271
|
|
17
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/operators.py,sha256=9nCeN6fRP-_YBfs-Gm57D-O_376qcOQiqGDuVlSlf00,7392
|
|
18
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/polyeval.c,sha256=pgQX0_7JsrLKEhFrjBN8wJb0hTGRh3BUL90NygNHgFk,438291
|
|
19
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/polyeval.cpython-310-darwin.so,sha256=QT8AOraG_it1u1LzIqeU4xuYtdmc7XyUcqIb4OqnutM,101136
|
|
20
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/polyeval.pyx,sha256=76Bf99Jt1_rLh5byrZxAjavE2F4_yCysirViqOBFIXw,2547
|
|
21
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/polynomial.py,sha256=dlWqL-PgSzV1UX-1S-MDwEL4sp3vs3h0vdRkv4JYfLo,12981
|
|
22
|
-
eqc_models-0.9.9.data/platlib/eqc_models/base/quadratic.py,sha256=BHZKniUvSq30pZgzguVasdO39BCEYue_wi5AIklPGS8,8062
|
|
23
|
-
eqc_models-0.9.9.data/platlib/eqc_models/graph/__init__.py,sha256=Cpo4jb630U57J0lS_iZddE_W3v9N4ijUb7xZRIYuguo,95
|
|
24
|
-
eqc_models-0.9.9.data/platlib/eqc_models/graph/base.py,sha256=nYZCSCzshnuJKuc25M2YXcOqOhIa1-0R9rRbtIXDr84,1888
|
|
25
|
-
eqc_models-0.9.9.data/platlib/eqc_models/graph/hypergraph.py,sha256=ABvutT0NOdIEpUF4TjUzboE4Y_J5iUZyj6-AzKr4R28,13268
|
|
26
|
-
eqc_models-0.9.9.data/platlib/eqc_models/graph/maxcut.py,sha256=o8xVsAwTa9jcpmsIoCQ5z7HSstVdraT8TENomdT519o,4132
|
|
27
|
-
eqc_models-0.9.9.data/platlib/eqc_models/graph/maxkcut.py,sha256=OFZwmC3wWpIJWVHOb9wkUeka0g0bOHrwf-mx0VZvt58,5807
|
|
28
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/__init__.py,sha256=CLfraacr0FrD5ynxlNB6cyNy0lpbavcQT45TvkDrNvY,369
|
|
29
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/classifierbase.py,sha256=1yXufiUGpaiBjI2evMiwfYn-Zr-SnWwCnvtREqprtJw,2184
|
|
30
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/classifierqboost.py,sha256=REfAVIWDTDbshObBGoH-9QdOHVnt-OCGjh-lRNwI2HU,12350
|
|
31
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/classifierqsvm.py,sha256=b6TdwlghR84UoQpfUThwMwNF_wmkABbCqOn6T1uY2dA,6636
|
|
32
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/clustering.py,sha256=yhh6jlgwZiQVn9h2pnYBlzVTCocK7rzsEurSQxCn5FQ,9486
|
|
33
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/clusteringbase.py,sha256=AvQbt6jeocBAGCuAmXHKyr3wLWqYUtBDq9PbsEOSlSc,2632
|
|
34
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/decomposition.py,sha256=Nsnq0GmINpbGOszndgCHXqKdECNpiNiampBrHPU_Gjg,8943
|
|
35
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/forecast.py,sha256=fFcBxQK9ZryfEuyvlr9HXicHoZRzLFybimYYttzhI9E,7403
|
|
36
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/forecastbase.py,sha256=s-6nUMvtYqG07r7MmmkFVj8_QqgeGkD-HVoEEDTE2bk,3654
|
|
37
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/regressor.py,sha256=LA1woXCnefG0wfoOxilX1kszgCUmfNcbQgs_WZ4Ai0o,5683
|
|
38
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/regressorbase.py,sha256=H5E8-8pUji1oH5JRdS37LJQoHuKt2JU8eXCZp-ZaEM4,2109
|
|
39
|
-
eqc_models-0.9.9.data/platlib/eqc_models/ml/reservoir.py,sha256=cPRvpCaWLYTBkui35jCssHcOPQgSQZallrG6Ac9djVI,2827
|
|
40
|
-
eqc_models-0.9.9.data/platlib/eqc_models/sequence/__init__.py,sha256=VXlYufO3GYFsM00oii9Cite2WsQEF8XTwRcjLPH_Zlg,92
|
|
41
|
-
eqc_models-0.9.9.data/platlib/eqc_models/sequence/tsp.py,sha256=YM641FTyK5NkgRGxHrU1QmMkEU0gf77nEmIElTqa6Qw,7680
|
|
42
|
-
eqc_models-0.9.9.data/platlib/eqc_models/solvers/__init__.py,sha256=hTjJI4F0FNDgQlK_oRHJxLIkg6of3I1-nEqU_3RL4Gk,542
|
|
43
|
-
eqc_models-0.9.9.data/platlib/eqc_models/solvers/qciclient.py,sha256=Vnfqa1N6JSzigb-mbqXj6g0r-1wOkeYzmEmctId1VCo,26975
|
|
44
|
-
eqc_models-0.9.9.data/platlib/eqc_models/utilities/__init__.py,sha256=SI2U7JKmPWSiq-F1WcSyfd7l9V6nbOZv_p8quMAZaT0,340
|
|
45
|
-
eqc_models-0.9.9.data/platlib/eqc_models/utilities/fileio.py,sha256=alWPTfjGFx6Iio9HZAAWtYcLmZsBBifg6S6_YbFMQhk,1088
|
|
46
|
-
eqc_models-0.9.9.data/platlib/eqc_models/utilities/polynomial.py,sha256=WoEBUAyiYBjwPvFWEjsynfmiBsbNqveKDZjXqiNQ6dk,4283
|
|
47
|
-
eqc_models-0.9.9.data/platlib/eqc_models/utilities/qplib.py,sha256=Do-MjmCFdI5HyDOAjfoz4_5lugySLMBlMAWDLUWx2OA,15796
|
|
48
|
-
eqc_models-0.9.9.dist-info/LICENSE.txt,sha256=8eh0oqsNNVR1Jk-13gkqRRSo2axtUU5kp2KzH4f9u3U,11354
|
|
49
|
-
eqc_models-0.9.9.dist-info/METADATA,sha256=5wKP-BI_1v8byksYXgQhrgD8KeB6we9P4SC6ereXb_8,7071
|
|
50
|
-
eqc_models-0.9.9.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
51
|
-
eqc_models-0.9.9.dist-info/top_level.txt,sha256=9ZfFeKNEvkRlKWoUnfcZ9TzmTdgdsuPEnTPy11Hqf4Q,30
|
|
52
|
-
eqc_models-0.9.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/algorithms/penaltymultiplier.py
RENAMED
|
File without changes
|
|
File without changes
|
{eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/allocation/allocation.py
RENAMED
|
File without changes
|
|
File without changes
|
{eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/allocation/portmomentum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eqc_models-0.9.9.data → eqc_models-0.10.0.data}/platlib/eqc_models/assignment/setpartition.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|