eqc-models 0.10.1__py3-none-any.whl → 0.11.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.
Files changed (72) hide show
  1. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/__init__.py +2 -1
  2. eqc_models-0.11.0.data/platlib/eqc_models/assignment/setpartition.py +4 -0
  3. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/__init__.py +3 -1
  4. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/base.py +44 -4
  5. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/polyeval.c +163 -163
  6. eqc_models-0.11.0.data/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
  7. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/polynomial.py +7 -3
  8. eqc_models-0.11.0.data/platlib/eqc_models/base/results.py +94 -0
  9. eqc_models-0.11.0.data/platlib/eqc_models/combinatorics/__init__.py +6 -0
  10. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/combinatorics/setcover.py +34 -17
  11. {eqc_models-0.10.1.data/platlib/eqc_models/assignment → eqc_models-0.11.0.data/platlib/eqc_models/combinatorics}/setpartition.py +2 -0
  12. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/graph/maxkcut.py +26 -68
  13. eqc_models-0.11.0.data/platlib/eqc_models/sequence/scheduling.py +29 -0
  14. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/solvers/qciclient.py +11 -2
  15. {eqc_models-0.10.1.dist-info → eqc_models-0.11.0.dist-info}/METADATA +3 -2
  16. eqc_models-0.11.0.dist-info/RECORD +61 -0
  17. {eqc_models-0.10.1.dist-info → eqc_models-0.11.0.dist-info}/WHEEL +1 -1
  18. eqc_models-0.10.1.data/platlib/eqc_models/base/polyeval.cpython-310-darwin.so +0 -0
  19. eqc_models-0.10.1.data/platlib/eqc_models/base.py +0 -115
  20. eqc_models-0.10.1.data/platlib/eqc_models/combinatorics/__init__.py +0 -5
  21. eqc_models-0.10.1.data/platlib/eqc_models/communitydetection.py +0 -25
  22. eqc_models-0.10.1.data/platlib/eqc_models/eqcdirectsolver.py +0 -61
  23. eqc_models-0.10.1.data/platlib/eqc_models/graphs.py +0 -28
  24. eqc_models-0.10.1.data/platlib/eqc_models/maxcut.py +0 -113
  25. eqc_models-0.10.1.data/platlib/eqc_models/maxkcut.py +0 -185
  26. eqc_models-0.10.1.data/platlib/eqc_models/quadraticmodel.py +0 -131
  27. eqc_models-0.10.1.data/platlib/eqc_models/solvers/eqcdirect.py +0 -160
  28. eqc_models-0.10.1.dist-info/RECORD +0 -66
  29. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/compile_extensions.py +0 -0
  30. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/algorithms/__init__.py +0 -0
  31. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/algorithms/base.py +0 -0
  32. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/algorithms/penaltymultiplier.py +0 -0
  33. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/allocation/__init__.py +0 -0
  34. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/allocation/allocation.py +0 -0
  35. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/allocation/portbase.py +0 -0
  36. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/allocation/portmomentum.py +0 -0
  37. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/assignment/__init__.py +0 -0
  38. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/assignment/qap.py +0 -0
  39. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/constraints.py +0 -0
  40. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/operators.py +0 -0
  41. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/polyeval.pyx +0 -0
  42. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/base/quadratic.py +0 -0
  43. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/decoding.py +0 -0
  44. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/graph/__init__.py +0 -0
  45. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/graph/base.py +0 -0
  46. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/graph/hypergraph.py +0 -0
  47. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/graph/maxcut.py +0 -0
  48. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/graph/partition.py +0 -0
  49. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/__init__.py +0 -0
  50. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/classifierbase.py +0 -0
  51. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/classifierqboost.py +0 -0
  52. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/classifierqsvm.py +0 -0
  53. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/clustering.py +0 -0
  54. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/clusteringbase.py +0 -0
  55. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/cvqboost_hamiltonian.pyx +0 -0
  56. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.c +0 -0
  57. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/cvqboost_hamiltonian_c_func.h +0 -0
  58. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/decomposition.py +0 -0
  59. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/forecast.py +0 -0
  60. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/forecastbase.py +0 -0
  61. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/regressor.py +0 -0
  62. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/regressorbase.py +0 -0
  63. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/ml/reservoir.py +0 -0
  64. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/sequence/__init__.py +0 -0
  65. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/sequence/tsp.py +0 -0
  66. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/solvers/__init__.py +0 -0
  67. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/utilities/__init__.py +0 -0
  68. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/utilities/fileio.py +0 -0
  69. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/utilities/polynomial.py +0 -0
  70. {eqc_models-0.10.1.data → eqc_models-0.11.0.data}/platlib/eqc_models/utilities/qplib.py +0 -0
  71. {eqc_models-0.10.1.dist-info → eqc_models-0.11.0.dist-info/licenses}/LICENSE.txt +0 -0
  72. {eqc_models-0.10.1.dist-info → eqc_models-0.11.0.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"]
@@ -0,0 +1,4 @@
1
+ from ..combinatorics import SetPartitionModel
2
+ import warnings
3
+
4
+ warnings.warn("import of SetPartitionModel through assignment is deprecated", DeprecationWarning)
@@ -65,8 +65,10 @@ from .quadratic import (ConstrainedQuadraticModel, QuadraticModel)
65
65
  from .polynomial import (PolynomialModel, ConstrainedPolynomialModel)
66
66
  from .base import (ModelSolver, EqcModel)
67
67
  from .operators import (QUBO, Polynomial)
68
+ from .results import SolutionResults
68
69
 
69
70
  __all__ = ["ConstraintsMixIn", "ConstraintModel", "ConstrainedQuadraticModel",
70
71
  "QuadraticModel", "PolynomialModel", "ConstrainedPolynomialModel",
71
72
  "InequalitiesMixin", "InequalityConstraintModel",
72
- "EqcModel", "ModelSolver", "QUBO", "Polynomial"]
73
+ "EqcModel", "ModelSolver", "QUBO", "Polynomial",
74
+ "SolutionResults"]
@@ -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
- """ Manipulate the solution to match the variable count """
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
- solution = solution[:-self.machine_slacks]
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