eqc-models 0.10.2__tar.gz → 0.10.3__tar.gz
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.2/eqc_models.egg-info → eqc_models-0.10.3}/PKG-INFO +3 -2
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/combinatorics/setcover.py +34 -17
- {eqc_models-0.10.2 → eqc_models-0.10.3/eqc_models.egg-info}/PKG-INFO +3 -2
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testsetcovermodel.py +3 -3
- {eqc_models-0.10.2 → eqc_models-0.10.3}/.gitlab-ci.yml +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/LICENSE.txt +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/MANIFEST.in +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/README.md +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/compile_extensions.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/Makefile +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/basic.css +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/css/badge_only.css +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/css/theme.css +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/custom.css +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/file.png +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/minus.png +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/plus.png +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/pygments.css +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/build/html/_static/white_logo.png +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/make.bat +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/_static/custom.css +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/_static/white_logo.png +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/conf.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/dependencies.rst +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/eqc_models.rst +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/index.rst +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/modules.rst +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/docs/source/usage.rst +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/algorithms/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/algorithms/base.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/algorithms/penaltymultiplier.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/allocation/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/allocation/allocation.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/allocation/portbase.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/allocation/portmomentum.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/assignment/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/assignment/qap.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/assignment/setpartition.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/base.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/constraints.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/operators.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/polyeval.c +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/polyeval.pyx +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/polynomial.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/base/quadratic.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/combinatorics/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/combinatorics/setpartition.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/decoding.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/graph/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/graph/base.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/graph/hypergraph.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/graph/maxcut.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/graph/maxkcut.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/graph/partition.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/classifierbase.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/classifierqboost.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/classifierqsvm.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/clustering.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/clusteringbase.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/cvqboost_hamiltonian.pyx +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/cvqboost_hamiltonian_c_func.c +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/cvqboost_hamiltonian_c_func.h +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/decomposition.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/forecast.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/forecastbase.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/regressor.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/regressorbase.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/ml/reservoir.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/sequence/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/sequence/tsp.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/solvers/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/solvers/qciclient.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/utilities/__init__.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/utilities/fileio.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/utilities/polynomial.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models/utilities/qplib.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models.egg-info/SOURCES.txt +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models.egg-info/dependency_links.txt +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models.egg-info/requires.txt +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/eqc_models.egg-info/top_level.txt +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/pyproject.toml +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/binary_job_example.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/c6h6_graph_clustering.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/clustering.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/continuous_job_example.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/duality_example.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/graph_clustering.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/graph_partitioning.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/hamiltonian_to_polynomial.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/hypergraph.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/integer_job_example.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/karate_graph_clustering.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/lin_reg_dirac3.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/mackey_glass_cell_production_series.csv +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/pca_iris_dirac3.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/port_opt_dirac3.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/qboost_iris_dirac3.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/qplib_benchmark_config.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/qplib_reader.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/qplib_runner.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/qsvm_iris_dirac3.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/reservoir_forecast.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/rundoctests.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/scripts/utils.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/setup.cfg +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/doctest_base.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testallocationmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testconstraint.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testcvqboost.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testeqcdirectsolver.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testgraphpartitionmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testhypergraphmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testmaxcutmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testpolynomialmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testqapmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testqciclientsolver.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testquadraticmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testsetpartitionmodel.py +0 -0
- {eqc_models-0.10.2 → eqc_models-0.10.3}/test/testtsp.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: eqc-models
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.3
|
|
4
4
|
Summary: Optimization and ML modeling package targeting EQC devices
|
|
5
5
|
Author: Quantum Computing Inc.
|
|
6
6
|
Author-email: support@quantumcomputinginc.com
|
|
@@ -22,6 +22,7 @@ Provides-Extra: dev
|
|
|
22
22
|
Requires-Dist: pytest<8,>=7.1.0; extra == "dev"
|
|
23
23
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
24
24
|
Requires-Dist: sphinx_rtd_theme<2,>=1.3.0; extra == "dev"
|
|
25
|
+
Dynamic: license-file
|
|
25
26
|
|
|
26
27
|
# EQC Models
|
|
27
28
|
|
|
@@ -41,41 +41,57 @@ class SetCoverModel(ConstrainedQuadraticModel):
|
|
|
41
41
|
>>> X = [set(['A', 'B']), set(['B', 'C']), set(['C'])]
|
|
42
42
|
>>> weights = [2, 2, 1]
|
|
43
43
|
>>> model = SetCoverModel(X, weights)
|
|
44
|
-
>>> model.penalty_multiplier =
|
|
44
|
+
>>> model.penalty_multiplier = 8
|
|
45
|
+
>>> lhs, rhs = model.constraints
|
|
46
|
+
>>> lhs
|
|
47
|
+
array([[ 1, 0, 0, 0, 0],
|
|
48
|
+
[ 1, 1, 0, -1, 0],
|
|
49
|
+
[ 0, 1, 1, 0, -1]])
|
|
45
50
|
>>> from eqc_models.solvers import Dirac3IntegerCloudSolver
|
|
46
51
|
>>> solver = Dirac3IntegerCloudSolver()
|
|
47
52
|
>>> response = solver.solve(model, relaxation_schedule=1, num_samples=5) #doctest: +ELLIPSIS
|
|
48
53
|
20...
|
|
49
54
|
>>> solutions = response["results"]["solutions"]
|
|
50
55
|
>>> solutions[0]
|
|
51
|
-
[1, 0, 1, 0, 0
|
|
52
|
-
>>> model.decode(solutions[0])
|
|
53
|
-
|
|
56
|
+
[1, 0, 1, 0, 0]
|
|
57
|
+
>>> selections = model.decode(solutions[0])
|
|
58
|
+
>>> assert {'B', 'A'} in selections
|
|
59
|
+
>>> assert {'C'} in selections
|
|
60
|
+
>>> assert len(selections) == 2
|
|
54
61
|
|
|
55
62
|
"""
|
|
56
63
|
|
|
57
64
|
def __init__(self, subsets, weights):
|
|
58
65
|
# ensure that X is ordered
|
|
59
|
-
self.
|
|
60
|
-
self.
|
|
66
|
+
self.S = S = list(subsets)
|
|
67
|
+
self.universal_set = U = set()
|
|
61
68
|
|
|
62
69
|
for x in subsets:
|
|
63
|
-
|
|
70
|
+
U.update(x)
|
|
64
71
|
# elements is sorted to maintain consistent output
|
|
65
|
-
elements = [a for a in
|
|
72
|
+
elements = [a for a in U]
|
|
66
73
|
elements.sort()
|
|
67
74
|
# constraints
|
|
68
75
|
A = []
|
|
69
76
|
b = []
|
|
70
|
-
variables = [f'x_{i}' for i in range(len(
|
|
77
|
+
variables = [f'x_{i}' for i in range(len(S))]
|
|
71
78
|
pos = 0
|
|
79
|
+
num_slacks = 0
|
|
80
|
+
slack_ub = []
|
|
72
81
|
for a in elements:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
82
|
+
num_sets = sum([1 if a in S[i] else 0 for i in range(len(S))])
|
|
83
|
+
assert num_sets >= 1, "Invalid subsets, check the universal set"
|
|
84
|
+
if num_sets > 1:
|
|
85
|
+
num_slacks += 1
|
|
86
|
+
slack_ub.append(num_sets-1)
|
|
87
|
+
for i, a in enumerate(elements):
|
|
88
|
+
constraint = [1 if a in S[j] else 0 for j in range(len(S))]
|
|
89
|
+
slacks = [0 for i in range(num_slacks)]
|
|
90
|
+
if slack_ub[i] > 0:
|
|
91
|
+
variables.append(f"s_{pos}")
|
|
92
|
+
slacks[pos] = -1
|
|
93
|
+
pos += 1
|
|
77
94
|
A.append(constraint + slacks)
|
|
78
|
-
pos += 1
|
|
79
95
|
b.append(1)
|
|
80
96
|
n = len(variables)
|
|
81
97
|
J = np.zeros((n, n))
|
|
@@ -84,11 +100,12 @@ class SetCoverModel(ConstrainedQuadraticModel):
|
|
|
84
100
|
# call the superclass constructor with the objective and constraints
|
|
85
101
|
super(SetCoverModel, self).__init__(h, J, np.array(A), np.array(b))
|
|
86
102
|
# set upper bound on the variables to be 1 for x_i and the length of X minus 1 for the slacks
|
|
87
|
-
|
|
103
|
+
slack_ub = [val for val in slack_ub if val > 0]
|
|
104
|
+
self.upper_bound = np.array([1 for i in range(len(weights))] + slack_ub)
|
|
88
105
|
|
|
89
106
|
def decode(self, solution) -> List:
|
|
90
107
|
xbar = []
|
|
91
|
-
for i in range(len(self.
|
|
108
|
+
for i in range(len(self.S)):
|
|
92
109
|
if solution[i] > 0.5:
|
|
93
|
-
xbar.append(self.
|
|
110
|
+
xbar.append(self.S[i])
|
|
94
111
|
return xbar
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: eqc-models
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.3
|
|
4
4
|
Summary: Optimization and ML modeling package targeting EQC devices
|
|
5
5
|
Author: Quantum Computing Inc.
|
|
6
6
|
Author-email: support@quantumcomputinginc.com
|
|
@@ -22,6 +22,7 @@ Provides-Extra: dev
|
|
|
22
22
|
Requires-Dist: pytest<8,>=7.1.0; extra == "dev"
|
|
23
23
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
24
24
|
Requires-Dist: sphinx_rtd_theme<2,>=1.3.0; extra == "dev"
|
|
25
|
+
Dynamic: license-file
|
|
25
26
|
|
|
26
27
|
# EQC Models
|
|
27
28
|
|
|
@@ -15,11 +15,11 @@ class SetCoverTestCase(TestCase):
|
|
|
15
15
|
|
|
16
16
|
def testConstraints(self):
|
|
17
17
|
lhs, rhs = self.model.constraints
|
|
18
|
-
assert lhs.shape == (3,
|
|
18
|
+
assert lhs.shape == (3, 5)
|
|
19
19
|
assert rhs.shape == (3,)
|
|
20
|
-
assert (lhs == [[1, 0, 0,
|
|
20
|
+
assert (lhs == [[1, 0, 0, 0, 0],[1, 1, 0, -1, 0],[0, 1, 1, 0, -1]]).all()
|
|
21
21
|
assert (rhs == [1, 1, 1]).all()
|
|
22
22
|
|
|
23
23
|
def testObjective(self):
|
|
24
24
|
objective = self.model.linear_objective
|
|
25
|
-
assert (objective == [2, 2, 1, 0, 0
|
|
25
|
+
assert (objective == [2, 2, 1, 0, 0]).all()
|
|
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
|
|
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
|
|
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
|
|
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
|