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.
Files changed (70) hide show
  1. eqc_models-0.10.1.data/platlib/compile_extensions.py +67 -0
  2. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/algorithms/penaltymultiplier.py +20 -7
  3. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polyeval.c +127 -123
  4. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
  5. eqc_models-0.10.1.data/platlib/eqc_models/base.py +115 -0
  6. eqc_models-0.10.1.data/platlib/eqc_models/combinatorics/__init__.py +5 -0
  7. eqc_models-0.10.1.data/platlib/eqc_models/combinatorics/setcover.py +94 -0
  8. eqc_models-0.10.1.data/platlib/eqc_models/communitydetection.py +25 -0
  9. eqc_models-0.10.1.data/platlib/eqc_models/eqcdirectsolver.py +61 -0
  10. eqc_models-0.10.1.data/platlib/eqc_models/graph/__init__.py +6 -0
  11. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/base.py +28 -17
  12. eqc_models-0.10.1.data/platlib/eqc_models/graph/partition.py +148 -0
  13. eqc_models-0.10.1.data/platlib/eqc_models/graphs.py +28 -0
  14. eqc_models-0.10.1.data/platlib/eqc_models/maxcut.py +113 -0
  15. eqc_models-0.10.1.data/platlib/eqc_models/maxkcut.py +185 -0
  16. eqc_models-0.10.1.data/platlib/eqc_models/ml/classifierqboost.py +628 -0
  17. eqc_models-0.10.1.data/platlib/eqc_models/ml/cvqboost_hamiltonian.pyx +83 -0
  18. eqc_models-0.10.1.data/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.c +68 -0
  19. eqc_models-0.10.1.data/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.h +14 -0
  20. eqc_models-0.10.1.data/platlib/eqc_models/quadraticmodel.py +131 -0
  21. eqc_models-0.10.1.data/platlib/eqc_models/solvers/eqcdirect.py +160 -0
  22. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/polynomial.py +11 -0
  23. {eqc_models-0.9.9.dist-info → eqc_models-0.10.1.dist-info}/METADATA +2 -1
  24. eqc_models-0.10.1.dist-info/RECORD +66 -0
  25. eqc_models-0.9.9.data/platlib/compile_extensions.py +0 -23
  26. eqc_models-0.9.9.data/platlib/eqc_models/graph/__init__.py +0 -5
  27. eqc_models-0.9.9.data/platlib/eqc_models/ml/classifierqboost.py +0 -423
  28. eqc_models-0.9.9.dist-info/RECORD +0 -52
  29. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/__init__.py +0 -0
  30. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/algorithms/__init__.py +0 -0
  31. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/algorithms/base.py +0 -0
  32. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/__init__.py +0 -0
  33. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/allocation.py +0 -0
  34. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/portbase.py +0 -0
  35. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/allocation/portmomentum.py +0 -0
  36. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/assignment/__init__.py +0 -0
  37. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/assignment/qap.py +0 -0
  38. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/assignment/setpartition.py +0 -0
  39. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/__init__.py +0 -0
  40. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/base.py +0 -0
  41. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/constraints.py +0 -0
  42. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/operators.py +0 -0
  43. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polyeval.pyx +0 -0
  44. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/polynomial.py +0 -0
  45. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/base/quadratic.py +0 -0
  46. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/decoding.py +0 -0
  47. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/hypergraph.py +0 -0
  48. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/maxcut.py +0 -0
  49. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/graph/maxkcut.py +0 -0
  50. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/__init__.py +0 -0
  51. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/classifierbase.py +0 -0
  52. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/classifierqsvm.py +0 -0
  53. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/clustering.py +0 -0
  54. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/clusteringbase.py +0 -0
  55. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/decomposition.py +0 -0
  56. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/forecast.py +0 -0
  57. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/forecastbase.py +0 -0
  58. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/regressor.py +0 -0
  59. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/regressorbase.py +0 -0
  60. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/ml/reservoir.py +0 -0
  61. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/sequence/__init__.py +0 -0
  62. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/sequence/tsp.py +0 -0
  63. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/solvers/__init__.py +0 -0
  64. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/solvers/qciclient.py +0 -0
  65. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/__init__.py +0 -0
  66. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/fileio.py +0 -0
  67. {eqc_models-0.9.9.data → eqc_models-0.10.1.data}/platlib/eqc_models/utilities/qplib.py +0 -0
  68. {eqc_models-0.9.9.dist-info → eqc_models-0.10.1.dist-info}/LICENSE.txt +0 -0
  69. {eqc_models-0.9.9.dist-info → eqc_models-0.10.1.dist-info}/WHEEL +0 -0
  70. {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)
@@ -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 Dirac3CloudSolver
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 = Dirac3CloudSolver() # must be configured with environment variables
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, mean_photon_number=0.15, normalized_loss_rate=4, num_samples=5) # doctest: +ELLIPSIS
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 > 1e-6:
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 obj_val < ub:
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) < 1e-4:
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