classiq 0.81.0__py3-none-any.whl → 0.82.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.
- classiq/analyzer/show_interactive_hack.py +10 -4
- classiq/analyzer/url_utils.py +4 -3
- classiq/applications/qnn/qlayer.py +1 -1
- classiq/interface/_version.py +1 -1
- classiq/interface/backend/backend_preferences.py +0 -3
- classiq/interface/executor/execution_preferences.py +2 -1
- classiq/interface/generator/compiler_keywords.py +1 -1
- classiq/interface/generator/quantum_program.py +13 -0
- classiq/interface/generator/types/compilation_metadata.py +11 -2
- classiq/model_expansions/interpreters/base_interpreter.py +2 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +3 -3
- classiq/model_expansions/transformers/type_qualifier_inference.py +158 -41
- classiq/qmod/native/pretty_printer.py +4 -1
- classiq/qmod/semantics/error_manager.py +8 -2
- classiq/synthesis.py +6 -3
- {classiq-0.81.0.dist-info → classiq-0.82.0.dist-info}/METADATA +1 -1
- {classiq-0.81.0.dist-info → classiq-0.82.0.dist-info}/RECORD +18 -18
- {classiq-0.81.0.dist-info → classiq-0.82.0.dist-info}/WHEEL +0 -0
@@ -27,10 +27,16 @@ def is_classiq_studio() -> bool:
|
|
27
27
|
return bool(os.environ.get("OPENVSCODE"))
|
28
28
|
|
29
29
|
|
30
|
-
def get_app_url(
|
30
|
+
def get_app_url(
|
31
|
+
data_id: DataID, circuit: QuantumProgram, include_query: bool = True
|
32
|
+
) -> str:
|
31
33
|
return urljoin(
|
32
34
|
client_ide_base_url(),
|
33
|
-
circuit_page_uri(
|
35
|
+
circuit_page_uri(
|
36
|
+
circuit_id=data_id.id,
|
37
|
+
circuit_version=circuit.version,
|
38
|
+
include_query=include_query,
|
39
|
+
),
|
34
40
|
)
|
35
41
|
|
36
42
|
|
@@ -95,7 +101,7 @@ async def handle_remote_app(circuit: QuantumProgram, display_url: bool = True) -
|
|
95
101
|
|
96
102
|
renderer = get_visualization_renderer()
|
97
103
|
if display_url:
|
98
|
-
app_url = get_app_url(circuit_dataid, circuit)
|
104
|
+
app_url = get_app_url(circuit_dataid, circuit, include_query=False)
|
99
105
|
print(f"Quantum program link: {app_url}") # noqa: T201
|
100
106
|
await renderer(circuit_dataid, circuit)
|
101
107
|
|
@@ -111,7 +117,7 @@ async def _show_interactive(self: QuantumProgram, display_url: bool = True) -> N
|
|
111
117
|
Whether to print the url
|
112
118
|
|
113
119
|
Links:
|
114
|
-
[Visualization tool](https://docs.classiq.io/latest/
|
120
|
+
[Visualization tool](https://docs.classiq.io/latest/user-guide/analysis/quantum-program-visualization-tool/)
|
115
121
|
"""
|
116
122
|
await handle_remote_app(self, display_url)
|
117
123
|
|
classiq/analyzer/url_utils.py
CHANGED
@@ -24,8 +24,9 @@ def circuit_page_search_params(circuit_version: str) -> str:
|
|
24
24
|
)
|
25
25
|
|
26
26
|
|
27
|
-
def circuit_page_uri(circuit_id: str, circuit_version: str) -> str:
|
27
|
+
def circuit_page_uri(circuit_id: str, circuit_version: str, include_query: bool) -> str:
|
28
28
|
url = urljoin(f"{routes.ANALYZER_CIRCUIT_PAGE}/", circuit_id)
|
29
|
-
|
30
|
-
|
29
|
+
if include_query:
|
30
|
+
query_string = circuit_page_search_params(circuit_version)
|
31
|
+
url += QUERY_START_MARK + query_string
|
31
32
|
return url
|
classiq/interface/_version.py
CHANGED
@@ -30,9 +30,6 @@ class BackendPreferences(BaseModel):
|
|
30
30
|
"""
|
31
31
|
Preferences for the execution of the quantum program.
|
32
32
|
|
33
|
-
For more details, refer to:
|
34
|
-
[BackendPreferences](https://docs.classiq.io/latest/reference-manual/python-sdk/?h=backend#classiq.Preferences.backend_preferences)
|
35
|
-
|
36
33
|
Attributes:
|
37
34
|
backend_service_provider (str): Provider company or cloud for the requested backend.
|
38
35
|
backend_name (str): Name of the requested backend or target.
|
@@ -29,7 +29,8 @@ class ExecutionPreferences(pydantic.BaseModel):
|
|
29
29
|
Execution preferences for running a quantum program.
|
30
30
|
|
31
31
|
For more details, refer to:
|
32
|
-
|
32
|
+
ExecutionPreferences example: [ExecutionPreferences](https://docs.classiq.io/latest/user-guide/execution/#execution-preferences)..
|
33
|
+
|
33
34
|
|
34
35
|
Attributes:
|
35
36
|
noise_properties (Optional[NoiseProperties]): Properties defining the noise in the quantum circuit. Defaults to `None`.
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import uuid
|
2
|
+
import warnings
|
2
3
|
from datetime import datetime, timezone
|
3
4
|
from pathlib import Path
|
4
5
|
from typing import Optional, Union
|
@@ -8,6 +9,7 @@ from typing_extensions import TypeAlias
|
|
8
9
|
|
9
10
|
from classiq.interface.compression_utils import decompress
|
10
11
|
from classiq.interface.exceptions import (
|
12
|
+
ClassiqDeprecationWarning,
|
11
13
|
ClassiqMissingOutputFormatError,
|
12
14
|
ClassiqStateInitializationError,
|
13
15
|
)
|
@@ -72,6 +74,8 @@ class QuantumProgram(VersionedModel, CircuitCodeInterface):
|
|
72
74
|
compressed_debug_info: Optional[bytes] = pydantic.Field(default=None)
|
73
75
|
program_id: str = pydantic.Field(default_factory=get_uuid_as_str)
|
74
76
|
execution_primitives_input: Optional[PrimitivesInput] = pydantic.Field(default=None)
|
77
|
+
synthesis_warnings: Optional[list[str]] = pydantic.Field(default=None)
|
78
|
+
should_warn: bool = pydantic.Field(default=False)
|
75
79
|
|
76
80
|
def __str__(self) -> str:
|
77
81
|
return self.model_dump_json(indent=2)
|
@@ -198,3 +202,12 @@ class QuantumProgram(VersionedModel, CircuitCodeInterface):
|
|
198
202
|
FunctionDebugInfoInterface.model_validate(debug_info_dict)
|
199
203
|
for debug_info_dict in decompressed_debug_info_dict_list
|
200
204
|
]
|
205
|
+
|
206
|
+
def raise_warnings(self) -> None:
|
207
|
+
"""
|
208
|
+
Raises all warnings that were collected during synthesis.
|
209
|
+
"""
|
210
|
+
if self.synthesis_warnings is None:
|
211
|
+
return
|
212
|
+
for warning in self.synthesis_warnings:
|
213
|
+
warnings.warn(warning, ClassiqDeprecationWarning, stacklevel=2)
|
@@ -1,10 +1,19 @@
|
|
1
|
-
from pydantic import BaseModel, Field, NonNegativeInt
|
1
|
+
from pydantic import BaseModel, Field, NonNegativeInt, PrivateAttr
|
2
2
|
|
3
3
|
|
4
4
|
class CompilationMetadata(BaseModel):
|
5
5
|
should_synthesize_separately: bool = Field(default=False)
|
6
6
|
occurrences_number: NonNegativeInt = Field(default=1)
|
7
|
+
_occupation_number: NonNegativeInt = PrivateAttr(default=0)
|
7
8
|
unchecked: list[str] = Field(default_factory=list)
|
8
9
|
atomic_qualifiers: list[str] = Field(
|
9
10
|
default_factory=list, exclude=True
|
10
|
-
) # TODO remove after deprecation https://classiq.atlassian.net/browse/CLS-2671
|
11
|
+
) # TODO remove after deprecation https://classiq.atlassian.net/browse/CLS-2671 atomic_qualifiers: list[str] = Field(default_factory=list)
|
12
|
+
|
13
|
+
@property
|
14
|
+
def occupation_number(self) -> NonNegativeInt:
|
15
|
+
return self._occupation_number
|
16
|
+
|
17
|
+
@occupation_number.setter
|
18
|
+
def occupation_number(self, value: NonNegativeInt) -> None:
|
19
|
+
self._occupation_number = value
|
@@ -424,9 +424,9 @@ class CallEmitter(Generic[QuantumStatementT], Emitter[QuantumStatementT], VarSpl
|
|
424
424
|
unchecked = self._functions_compilation_metadata.get(
|
425
425
|
func_context.name, CompilationMetadata()
|
426
426
|
).unchecked
|
427
|
-
TypeQualifierValidation(
|
428
|
-
|
429
|
-
)
|
427
|
+
TypeQualifierValidation(
|
428
|
+
skip_validation=self._interpreter.skip_type_modifier_validation
|
429
|
+
).run(func_def.port_declarations, func_def.body, unchecked)
|
430
430
|
|
431
431
|
@staticmethod
|
432
432
|
def _should_override_type_qualifiers(func_context: FunctionContext) -> bool:
|
@@ -1,13 +1,17 @@
|
|
1
1
|
import ast
|
2
2
|
import functools
|
3
3
|
import itertools
|
4
|
+
import warnings
|
4
5
|
from collections.abc import Collection, Iterator, Sequence
|
5
6
|
from contextlib import contextmanager
|
6
7
|
|
7
8
|
from classiq.interface.exceptions import (
|
8
|
-
|
9
|
+
ClassiqDeprecationWarning,
|
9
10
|
ClassiqInternalExpansionError,
|
10
11
|
)
|
12
|
+
from classiq.interface.generator.functions.port_declaration import (
|
13
|
+
PortDeclarationDirection,
|
14
|
+
)
|
11
15
|
from classiq.interface.generator.functions.type_qualifier import TypeQualifier
|
12
16
|
from classiq.interface.model.allocate import Allocate
|
13
17
|
from classiq.interface.model.bind_operation import BindOperation
|
@@ -40,7 +44,21 @@ def _inconsistent_type_qualifier_error(
|
|
40
44
|
f"The type modifier of variable '{port_name}' does not conform to the function signature: "
|
41
45
|
f"expected '{expected.name}', but found '{actual.name}'.\n"
|
42
46
|
f"Tip: If the final role of the variable in the function matches '{expected.name}', "
|
43
|
-
f"you may use the `unchecked` flag to instruct the compiler to disregard individual operations
|
47
|
+
f"you may use the `unchecked` flag to instruct the compiler to disregard individual operations.\n"
|
48
|
+
# TODO add earliest date of enforcement. See https://classiq.atlassian.net/browse/CLS-2709.
|
49
|
+
)
|
50
|
+
|
51
|
+
|
52
|
+
def _inconsistent_type_qualifier_in_binding_error(
|
53
|
+
expected: TypeQualifier, known_qualifiers: dict[str, TypeQualifier]
|
54
|
+
) -> str:
|
55
|
+
actual = ", ".join(
|
56
|
+
f"{name}: {qualifier.name}" for name, qualifier in known_qualifiers.items()
|
57
|
+
)
|
58
|
+
return (
|
59
|
+
f"The variable binding has inconsistent type modifiers: "
|
60
|
+
f"Expected modifier: {expected.name}, Actual modifiers: {actual}"
|
61
|
+
# TODO add earliest date of enforcement. See https://classiq.atlassian.net/browse/CLS-2709.
|
44
62
|
)
|
45
63
|
|
46
64
|
|
@@ -52,14 +70,21 @@ class TypeQualifierValidation(ModelVisitor):
|
|
52
70
|
The function definition ports are modified inplace.
|
53
71
|
"""
|
54
72
|
|
55
|
-
def __init__(
|
73
|
+
def __init__(
|
74
|
+
self, *, skip_validation: bool = False, support_unused_ports: bool = True
|
75
|
+
) -> None:
|
56
76
|
self._signature_ports: dict[str, PortDeclaration] = dict()
|
57
77
|
self._inferred_ports: dict[str, PortDeclaration] = dict()
|
58
78
|
self._unchecked: set[str] = set()
|
79
|
+
|
80
|
+
self._initialized_vars: dict[str, TypeQualifier] = dict()
|
81
|
+
self._bound_vars: list[set[str]] = []
|
82
|
+
|
59
83
|
self._conjugation_context: bool = False
|
60
84
|
self._support_unused_ports = (
|
61
85
|
support_unused_ports # could be turned off for debugging
|
62
86
|
)
|
87
|
+
self._skip_validation = skip_validation
|
63
88
|
|
64
89
|
@contextmanager
|
65
90
|
def validate_ports(
|
@@ -72,9 +97,12 @@ class TypeQualifierValidation(ModelVisitor):
|
|
72
97
|
self._signature_ports[port.name] = port
|
73
98
|
self._unchecked.update(unchecked)
|
74
99
|
|
75
|
-
yield len(self._inferred_ports) > 0 or
|
76
|
-
|
77
|
-
|
100
|
+
yield len(self._inferred_ports) > 0 or (
|
101
|
+
any(
|
102
|
+
port.type_qualifier is not TypeQualifier.Quantum
|
103
|
+
for port in self._signature_ports.values()
|
104
|
+
)
|
105
|
+
and not self._skip_validation
|
78
106
|
)
|
79
107
|
|
80
108
|
self._set_unused_as_const()
|
@@ -115,19 +143,39 @@ class TypeQualifierValidation(ModelVisitor):
|
|
115
143
|
)
|
116
144
|
return
|
117
145
|
|
118
|
-
if
|
146
|
+
if self._skip_validation or candidate in self._unchecked:
|
119
147
|
return
|
120
148
|
|
149
|
+
if candidate in self._signature_ports:
|
150
|
+
self._validate_signature_qualifier(candidate, qualifier)
|
151
|
+
|
152
|
+
elif candidate in self._initialized_vars:
|
153
|
+
self._initialized_vars[candidate] = TypeQualifier.and_(
|
154
|
+
self._initialized_vars[candidate], qualifier
|
155
|
+
)
|
156
|
+
|
157
|
+
def _validate_signature_qualifier(
|
158
|
+
self, candidate: str, qualifier: TypeQualifier
|
159
|
+
) -> None:
|
121
160
|
signature_qualifier = self._signature_ports[candidate].type_qualifier
|
122
161
|
if signature_qualifier is not TypeQualifier.and_(
|
123
162
|
signature_qualifier, qualifier
|
124
163
|
):
|
125
|
-
|
164
|
+
warnings.warn(
|
126
165
|
_inconsistent_type_qualifier_error(
|
127
166
|
candidate, signature_qualifier, qualifier
|
128
|
-
)
|
167
|
+
),
|
168
|
+
ClassiqDeprecationWarning,
|
169
|
+
stacklevel=1,
|
129
170
|
)
|
130
171
|
|
172
|
+
def _add_initialized_qualifier(self, var: str, qualifier: TypeQualifier) -> None:
|
173
|
+
if var in self._inferred_ports or var in self._signature_ports:
|
174
|
+
return
|
175
|
+
if self._conjugation_context and qualifier is TypeQualifier.QFree:
|
176
|
+
qualifier = TypeQualifier.Const
|
177
|
+
self._initialized_vars[var] = qualifier
|
178
|
+
|
131
179
|
def run(
|
132
180
|
self,
|
133
181
|
ports: Collection[PortDeclaration],
|
@@ -137,59 +185,92 @@ class TypeQualifierValidation(ModelVisitor):
|
|
137
185
|
with self.validate_ports(ports, unchecked) as should_validate:
|
138
186
|
if should_validate:
|
139
187
|
self.visit(body)
|
188
|
+
self._update_bound_vars()
|
189
|
+
|
190
|
+
def _update_bound_vars(self) -> None:
|
191
|
+
merged_bound_vars = _merge_overlapping(self._bound_vars)
|
192
|
+
for bound_vars in merged_bound_vars:
|
193
|
+
reduced_qualifier = self._get_reduced_qualifier(bound_vars)
|
194
|
+
for var in bound_vars:
|
195
|
+
self._validate_qualifier(var, reduced_qualifier)
|
140
196
|
|
141
197
|
def visit_QuantumFunctionCall(self, call: QuantumFunctionCall) -> None:
|
142
198
|
for handle, port in call.handles_with_params:
|
143
199
|
self._validate_qualifier(handle.name, port.type_qualifier)
|
200
|
+
if port.direction is PortDeclarationDirection.Output:
|
201
|
+
self._add_initialized_qualifier(handle.name, port.type_qualifier)
|
202
|
+
|
203
|
+
if self._has_inputs(call):
|
204
|
+
bound_vars = {
|
205
|
+
handle.name
|
206
|
+
for handle, port in call.handles_with_params
|
207
|
+
if port.direction is not PortDeclarationDirection.Inout
|
208
|
+
}
|
209
|
+
self._bound_vars.append(bound_vars)
|
210
|
+
|
211
|
+
@staticmethod
|
212
|
+
def _has_inputs(call: QuantumFunctionCall) -> bool:
|
213
|
+
return any(
|
214
|
+
port.direction is PortDeclarationDirection.Input
|
215
|
+
for _, port in call.handles_with_params
|
216
|
+
)
|
144
217
|
|
145
218
|
def visit_Allocate(self, alloc: Allocate) -> None:
|
146
219
|
self._validate_qualifier(alloc.target.name, TypeQualifier.QFree)
|
220
|
+
self._add_initialized_qualifier(alloc.target.name, TypeQualifier.QFree)
|
147
221
|
|
148
222
|
def visit_BindOperation(self, bind_op: BindOperation) -> None:
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
223
|
+
var_names = {
|
224
|
+
handle.name
|
225
|
+
for handle in itertools.chain(bind_op.in_handles, bind_op.out_handles)
|
226
|
+
}
|
227
|
+
self._bound_vars.append(var_names)
|
228
|
+
for handle in bind_op.out_handles:
|
229
|
+
self._add_initialized_qualifier(handle.name, TypeQualifier.Inferred)
|
230
|
+
|
231
|
+
def _get_reduced_qualifier(self, bound_vars: set[str]) -> TypeQualifier:
|
232
|
+
signature_qualifier = {
|
233
|
+
name: self._signature_ports[name].type_qualifier
|
234
|
+
for name in bound_vars.intersection(self._signature_ports)
|
160
235
|
}
|
161
|
-
|
162
|
-
name: self._inferred_ports[name]
|
163
|
-
for name in
|
236
|
+
known_inferred_qualifiers = {
|
237
|
+
name: self._inferred_ports[name].type_qualifier
|
238
|
+
for name in bound_vars.intersection(self._inferred_ports)
|
164
239
|
if self._inferred_ports[name].type_qualifier is not TypeQualifier.Inferred
|
165
240
|
}
|
166
|
-
|
241
|
+
known_initialized_qualifiers = {
|
242
|
+
name: self._initialized_vars[name]
|
243
|
+
for name in bound_vars.intersection(self._initialized_vars)
|
244
|
+
if self._initialized_vars[name] is not TypeQualifier.Inferred
|
245
|
+
}
|
246
|
+
known_qualifiers = (
|
247
|
+
signature_qualifier
|
248
|
+
| known_inferred_qualifiers
|
249
|
+
| known_initialized_qualifiers
|
250
|
+
)
|
251
|
+
min_qualifier = self._get_min_qualifier(list(known_qualifiers.values()))
|
167
252
|
if not all(
|
168
|
-
|
253
|
+
type_qualifier is min_qualifier
|
254
|
+
for type_qualifier in signature_qualifier.values()
|
169
255
|
):
|
170
|
-
|
171
|
-
|
172
|
-
|
256
|
+
warnings.warn(
|
257
|
+
_inconsistent_type_qualifier_in_binding_error(
|
258
|
+
min_qualifier, known_qualifiers
|
259
|
+
),
|
260
|
+
ClassiqDeprecationWarning,
|
261
|
+
stacklevel=1,
|
173
262
|
)
|
174
263
|
|
175
264
|
return min_qualifier
|
176
265
|
|
177
266
|
@staticmethod
|
178
|
-
def _get_min_qualifier(
|
179
|
-
|
180
|
-
signature_ports: dict[str, PortDeclaration],
|
181
|
-
) -> TypeQualifier:
|
182
|
-
known_ports = tuple(
|
183
|
-
itertools.chain(signature_ports.values(), known_inferred_ports.values())
|
184
|
-
)
|
185
|
-
if len(known_ports) == 0:
|
267
|
+
def _get_min_qualifier(qualifiers: list[TypeQualifier]) -> TypeQualifier:
|
268
|
+
if len(qualifiers) == 0:
|
186
269
|
return TypeQualifier.Const
|
187
|
-
elif len(
|
188
|
-
return
|
270
|
+
elif len(qualifiers) == 1:
|
271
|
+
return qualifiers[0]
|
189
272
|
else:
|
190
|
-
return functools.reduce(
|
191
|
-
TypeQualifier.and_, (port.type_qualifier for port in known_ports)
|
192
|
-
)
|
273
|
+
return functools.reduce(TypeQualifier.and_, qualifiers)
|
193
274
|
|
194
275
|
@staticmethod
|
195
276
|
def _extract_expr_vars(expr_op: QuantumExpressionOperation) -> list[str]:
|
@@ -204,6 +285,8 @@ class TypeQualifierValidation(ModelVisitor):
|
|
204
285
|
self._validate_qualifier(result_var, TypeQualifier.QFree)
|
205
286
|
for expr_var in self._extract_expr_vars(arith):
|
206
287
|
self._validate_qualifier(expr_var, TypeQualifier.Const)
|
288
|
+
if not arith.is_inplace:
|
289
|
+
self._add_initialized_qualifier(result_var, TypeQualifier.QFree)
|
207
290
|
|
208
291
|
def visit_AmplitudeLoadingOperation(
|
209
292
|
self, amp_load: AmplitudeLoadingOperation
|
@@ -234,3 +317,37 @@ class TypeQualifierValidation(ModelVisitor):
|
|
234
317
|
with self.conjugation_context():
|
235
318
|
self.visit(within_apply.compute)
|
236
319
|
self.visit(within_apply.action)
|
320
|
+
|
321
|
+
|
322
|
+
def _merge_overlapping(bound_vars: Sequence[Collection[str]]) -> list[set[str]]:
|
323
|
+
"""
|
324
|
+
Merges overlapping sets of bound variables.
|
325
|
+
Two sets overlap if they share at least one variable.
|
326
|
+
"""
|
327
|
+
all_bound_vars = bound_vars
|
328
|
+
merged_bound_vars: list[set[str]] = []
|
329
|
+
loop_guard: int = 10
|
330
|
+
idx: int = 0
|
331
|
+
|
332
|
+
for _ in range(loop_guard):
|
333
|
+
idx += 1
|
334
|
+
|
335
|
+
merged_bound_vars = []
|
336
|
+
modified: bool = False
|
337
|
+
for current_bound_vars in all_bound_vars:
|
338
|
+
for existing in merged_bound_vars:
|
339
|
+
if existing.intersection(current_bound_vars):
|
340
|
+
existing.update(current_bound_vars)
|
341
|
+
modified = True
|
342
|
+
break
|
343
|
+
else:
|
344
|
+
merged_bound_vars.append(set(current_bound_vars))
|
345
|
+
|
346
|
+
if not modified:
|
347
|
+
break
|
348
|
+
all_bound_vars = merged_bound_vars
|
349
|
+
|
350
|
+
if idx == loop_guard - 1:
|
351
|
+
raise ClassiqInternalExpansionError
|
352
|
+
|
353
|
+
return merged_bound_vars
|
@@ -97,11 +97,14 @@ class DSLPrettyPrinter(ModelVisitor):
|
|
97
97
|
self,
|
98
98
|
decimal_precision: Optional[int] = DEFAULT_DECIMAL_PRECISION,
|
99
99
|
emit_open_lib_functions: bool = False,
|
100
|
+
compilation_metadata: Optional[dict[str, CompilationMetadata]] = None,
|
100
101
|
) -> None:
|
101
102
|
self._level = 0
|
102
103
|
self._decimal_precision = decimal_precision
|
103
104
|
self._emit_open_lib_functions = emit_open_lib_functions
|
104
|
-
self._compilation_metadata: dict[str, CompilationMetadata] =
|
105
|
+
self._compilation_metadata: dict[str, CompilationMetadata] = (
|
106
|
+
compilation_metadata or {}
|
107
|
+
)
|
105
108
|
|
106
109
|
def visit(self, node: NodeType) -> str:
|
107
110
|
res = super().visit(node)
|
@@ -73,9 +73,15 @@ class ErrorManager:
|
|
73
73
|
def has_errors(self) -> bool:
|
74
74
|
return len(self._errors) > 0
|
75
75
|
|
76
|
-
def report_errors(
|
76
|
+
def report_errors(
|
77
|
+
self, error_type: type[Exception], mask: Optional[list[int]] = None
|
78
|
+
) -> None:
|
77
79
|
if self.has_errors():
|
78
|
-
errors =
|
80
|
+
errors = (
|
81
|
+
self.annotated_errors
|
82
|
+
if mask is None
|
83
|
+
else [self.annotated_errors[idx] for idx in mask]
|
84
|
+
)
|
79
85
|
self.clear()
|
80
86
|
raise error_type("\n\t" + "\n\t".join(errors))
|
81
87
|
|
classiq/synthesis.py
CHANGED
@@ -27,7 +27,7 @@ def show(quantum_program: QuantumProgram, display_url: bool = True) -> None:
|
|
27
27
|
Whether to print the url
|
28
28
|
|
29
29
|
Links:
|
30
|
-
[Visualization tool](https://docs.classiq.io/latest/
|
30
|
+
[Visualization tool](https://docs.classiq.io/latest/user-guide/analysis/quantum-program-visualization-tool/)
|
31
31
|
"""
|
32
32
|
QuantumProgram.model_validate(quantum_program)
|
33
33
|
quantum_program.show() # type: ignore[attr-defined]
|
@@ -54,7 +54,10 @@ async def synthesize_async(
|
|
54
54
|
serialized_model: SerializedModel,
|
55
55
|
) -> QuantumProgram:
|
56
56
|
model = Model.model_validate_json(serialized_model)
|
57
|
-
|
57
|
+
quantum_program = await ApiWrapper.call_generation_task(model)
|
58
|
+
if quantum_program.should_warn:
|
59
|
+
quantum_program.raise_warnings()
|
60
|
+
return quantum_program
|
58
61
|
|
59
62
|
|
60
63
|
def synthesize(
|
@@ -202,7 +205,7 @@ def set_execution_preferences(
|
|
202
205
|
Returns:
|
203
206
|
SerializedModel: The model with the attached execution preferences.
|
204
207
|
|
205
|
-
For more examples please see: [set_execution_preferences](https://docs.classiq.io/latest/
|
208
|
+
For more examples please see: [set_execution_preferences](https://docs.classiq.io/latest/user-guide/execution/#execution-preferences)
|
206
209
|
"""
|
207
210
|
if execution_preferences is None:
|
208
211
|
if kwargs:
|
@@ -22,8 +22,8 @@ classiq/analyzer/__init__.py,sha256=1ASEd3a5BLznMq_uD4ogR6buanALXfJIONZYmCweAgA,
|
|
22
22
|
classiq/analyzer/analyzer.py,sha256=GOCuI9YpNCOGuA139j9gCMheu8qBDuj0wixNg-cyXpU,6648
|
23
23
|
classiq/analyzer/analyzer_utilities.py,sha256=PT_WsLygmAx4Hf7-VGBzKi6xHclIy5FYelCkdtChe1k,3658
|
24
24
|
classiq/analyzer/rb.py,sha256=gUQPYEcy99rLcV-MQG87HSbiQP4IP_Qz3KKqqeq2T2E,4934
|
25
|
-
classiq/analyzer/show_interactive_hack.py,sha256=
|
26
|
-
classiq/analyzer/url_utils.py,sha256=
|
25
|
+
classiq/analyzer/show_interactive_hack.py,sha256=iSHMUHXcK90_HpOc9hAUEbNyKpwotyVEkSiM_JZc9Oo,4726
|
26
|
+
classiq/analyzer/url_utils.py,sha256=VkZCzidnFRIAGShn0u1PO3BFJvN5776_szco8Y7Vejs,829
|
27
27
|
classiq/applications/__init__.py,sha256=gb2dQI2ZuiU3c77hUAAY0D-BIW4YLD-9W5dKzOmMR1U,306
|
28
28
|
classiq/applications/chemistry/__init__.py,sha256=_OGx8E8znq8jpjnHCSj89NpjxkcFZZ7endS5JLCybBM,1094
|
29
29
|
classiq/applications/chemistry/ansatz_parameters.py,sha256=2YXfTOGrsCc6xMpLiGhnIQfI6iBXvlWOS9DY862fgJc,673
|
@@ -77,7 +77,7 @@ classiq/applications/qnn/datasets/datasets_utils.py,sha256=LgerS3HPe82gVTMg6YLWF
|
|
77
77
|
classiq/applications/qnn/gradients/__init__.py,sha256=md5sLINVaPeZUHJUe1ZtIcqLN_V_I2RKfBe3mO3zZs4,102
|
78
78
|
classiq/applications/qnn/gradients/quantum_gradient.py,sha256=FtyrLbpN4lqOlrj86LFtUGvTUZs_Jajblzrau5a0-CE,1169
|
79
79
|
classiq/applications/qnn/gradients/simple_quantum_gradient.py,sha256=QT1wh9SpSFtRH0-OxRsWxCKHlDjLumNwyVAcmR9r78w,5020
|
80
|
-
classiq/applications/qnn/qlayer.py,sha256=
|
80
|
+
classiq/applications/qnn/qlayer.py,sha256=AfLgvNfWQpF-srLbGC4DIZYCm7PLPQ7sHI0B_J_pgtc,9066
|
81
81
|
classiq/applications/qnn/torch_utils.py,sha256=vCUsTyvDCSwY9Z9rcK9QslEzAVag3caTHFXXH8iblUg,4430
|
82
82
|
classiq/applications/qnn/types.py,sha256=mDElTam102OolLt1KWrVHZPW_9jNTUyhohJLEN-SOs0,835
|
83
83
|
classiq/applications/qsvm/__init__.py,sha256=ctM9hllKY9zuc3Ps8YgLBrDXgPInJNwJ3nVpTurs8MY,191
|
@@ -92,7 +92,7 @@ classiq/execution/qnn.py,sha256=BjwJw0LXr_I_eeZuXrFTpNVcs6pFBCvzsys8ZraRZZg,2373
|
|
92
92
|
classiq/execution/user_budgets.py,sha256=FY21S7fh6KwBFw5YcZhzWzIktIMifMOLc-fO772EmxE,1184
|
93
93
|
classiq/executor.py,sha256=uLr1640-DZtdPP0T6fCsmUf1Jj7QPumyoE09mJ8lVo0,2308
|
94
94
|
classiq/interface/__init__.py,sha256=cg7hD_XVu1_jJ1fgwmT0rMIoZHopNVeB8xtlmMx-E_A,83
|
95
|
-
classiq/interface/_version.py,sha256=
|
95
|
+
classiq/interface/_version.py,sha256=Ix5e6xFImhy-iSvj9753jWO9sgM59o-d24vgjYUfS2A,197
|
96
96
|
classiq/interface/analyzer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
97
97
|
classiq/interface/analyzer/analysis_params.py,sha256=dM5rwSks798cxk4FWe4_X5ToRYtgZQh34F1u0XrFkK8,3881
|
98
98
|
classiq/interface/analyzer/cytoscape_graph.py,sha256=MpeRBIYS1TfwYwiFpgTO51IE0KoxhY510pmEM3S0rbw,2361
|
@@ -104,7 +104,7 @@ classiq/interface/applications/iqae/iqae_result.py,sha256=S13A_mQKRTBaqO2NKJEJlg
|
|
104
104
|
classiq/interface/applications/qsvm.py,sha256=4dHVSZH--sv58SvxmpDHPh9JDr4qQUZbbGCeaEv6b1I,3408
|
105
105
|
classiq/interface/ast_node.py,sha256=-X3lke3c2Wm0fGDupj0g4cGfuRmLv4hA4EjLsJ1dHqE,941
|
106
106
|
classiq/interface/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
107
|
-
classiq/interface/backend/backend_preferences.py,sha256=
|
107
|
+
classiq/interface/backend/backend_preferences.py,sha256=VMuUG0k6q4S3-ao_tN-01zHz86maOTFiSCvXCM8W0YQ,21370
|
108
108
|
classiq/interface/backend/ionq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
109
109
|
classiq/interface/backend/ionq/ionq_quantum_program.py,sha256=f8w1XvgIggaM_w9TF0_wkQHB3wamXg5kHMNsgtCsH3k,1235
|
110
110
|
classiq/interface/backend/pydantic_backend.py,sha256=XfG1u_8ZEq382P5LTHYEhjkDH7UZYY_1sl1O-RImSmk,1610
|
@@ -152,7 +152,7 @@ classiq/interface/execution/primitives.py,sha256=HU0-ZjlFfL6DVtOHPqSwDxSwEJhGoce
|
|
152
152
|
classiq/interface/executor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
153
153
|
classiq/interface/executor/constants.py,sha256=DtSx-1HArWE0hHjOZHY9WJBevt3hP7M8SrYO3eM3dgo,31
|
154
154
|
classiq/interface/executor/estimation.py,sha256=lJEmN3Uj9bW0EY7JEZvzItwEybbBHSn7zYFz89L8fqo,389
|
155
|
-
classiq/interface/executor/execution_preferences.py,sha256=
|
155
|
+
classiq/interface/executor/execution_preferences.py,sha256=lGnJVPUJv04W5H7ZqWeEy1eCpXmMh34lim9Mz8IX_PY,2909
|
156
156
|
classiq/interface/executor/execution_request.py,sha256=bf5qEF4eeb2UQ2DIriW-DBTRmPcDYiWs9QsfmzyhYEg,2441
|
157
157
|
classiq/interface/executor/execution_result.py,sha256=z_D0KpnxKelnkxg6b1WkTWRbLZI7Dm7Q5juNWWdIZx0,2876
|
158
158
|
classiq/interface/executor/optimizer_preferences.py,sha256=koqBO5YDzO3iBH71a8oe4hK-ib8M1yUPWJbC_m-Nzn4,4427
|
@@ -208,7 +208,7 @@ classiq/interface/generator/circuit_code/circuit_code.py,sha256=B9k2du6_fo_-bItN
|
|
208
208
|
classiq/interface/generator/circuit_code/types_and_constants.py,sha256=BVodYSj6CSXATNDaVkwpBls0NuXtPWzj9UfKp8Sx-hM,1414
|
209
209
|
classiq/interface/generator/circuit_outline.py,sha256=w67uw-cQw5DlZBmzh2XC_Vi5yAvFWB2qxVLVrR2JHII,213
|
210
210
|
classiq/interface/generator/commuting_pauli_exponentiation.py,sha256=prx80q_d3d8M3_Qsvy-o70VLa4wcxVsjyVoM1YMULiQ,1728
|
211
|
-
classiq/interface/generator/compiler_keywords.py,sha256=
|
211
|
+
classiq/interface/generator/compiler_keywords.py,sha256=27QflHm-lInYlq6GH65hNLQM5WsSjKPUMFDwmcK16X0,266
|
212
212
|
classiq/interface/generator/complex_type.py,sha256=tQ-2vUkXhpWz7dOMmcRTfd3tMJfXDvFkdy-KkQwe2FA,480
|
213
213
|
classiq/interface/generator/constant.py,sha256=cLhRil6sof0UyYRU4lKdm_aBRcmmz7dtvX5bbNpb7N8,309
|
214
214
|
classiq/interface/generator/control_state.py,sha256=eioObKxQt-g69NF3_-2QhLwO2mA5BIkFJnvqolwGFxk,2745
|
@@ -301,7 +301,7 @@ classiq/interface/generator/qft.py,sha256=SDLcPWYxshDfPl-tAfhpRFb30NpPRRFpje5Jrr
|
|
301
301
|
classiq/interface/generator/qpe.py,sha256=C6CddpuD196TUVpUEvvlA9uaRLmFlTkwrHheaWbGojY,6526
|
302
302
|
classiq/interface/generator/qsvm.py,sha256=Ry2iTC2NIoh0u9BsuwVaO-ICUBbRIF7Of9scJG4sGFs,3056
|
303
303
|
classiq/interface/generator/quantum_function_call.py,sha256=BlqclMwh_Qj6_yXUTIBM23eLdQ_X3x_KTQ4WWwBN4JY,24123
|
304
|
-
classiq/interface/generator/quantum_program.py,sha256=
|
304
|
+
classiq/interface/generator/quantum_program.py,sha256=FqGksHqL6Xvu5eO3Z0ERoEzU9KLsZ-1xREAhepo6kgE,8166
|
305
305
|
classiq/interface/generator/randomized_benchmarking.py,sha256=D6KI_1fMF5oBydaal2WLmTSit6xSMtz0yDAIZMMO89Q,635
|
306
306
|
classiq/interface/generator/range_types.py,sha256=X6CtSyimlpISz9QNbCdqqQkRg1pOGHEQCXy4aEeSwA4,2044
|
307
307
|
classiq/interface/generator/register_role.py,sha256=moerPIO9gQUuG5pe43TemmScSVjTK7_gi-qbrhIgLOA,1147
|
@@ -332,7 +332,7 @@ classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py,sha25
|
|
332
332
|
classiq/interface/generator/transpiler_basis_gates.py,sha256=ffnVjysrQVFq1MSjmlFia4akK9w3cIlLvAa-8_MOY9o,2450
|
333
333
|
classiq/interface/generator/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
334
334
|
classiq/interface/generator/types/builtin_enum_declarations.py,sha256=1LB7uwf53QOu-f5TfQyGYlkYmhTi8zAhtHMvZPOr-vM,2330
|
335
|
-
classiq/interface/generator/types/compilation_metadata.py,sha256=
|
335
|
+
classiq/interface/generator/types/compilation_metadata.py,sha256=Xt3VhOu5xjheHWgffhC2TD2RU9hIUMGtIuUm4P781K0,997
|
336
336
|
classiq/interface/generator/types/enum_declaration.py,sha256=Bz52SsXHAai205Utv-3NOolUP0HYT8KnMuUF16Iq_y0,3385
|
337
337
|
classiq/interface/generator/types/qstruct_declaration.py,sha256=Qw6cHW_elZmrs4UO0z7lgS7TWb0hEUEJ5Ur-Ko0bCR4,485
|
338
338
|
classiq/interface/generator/types/struct_declaration.py,sha256=2qKVV-pdqeUGiwKh2-5W2Ci4z0aQG4TG91MuQ82fa_A,959
|
@@ -426,7 +426,7 @@ classiq/model_expansions/expression_evaluator.py,sha256=zMGmVvBvItaz_rX3XqFLrkDZ
|
|
426
426
|
classiq/model_expansions/function_builder.py,sha256=5CKygDYo6dpGVS_88UxTBL9z7gP8VaNLPh3xcUlP-8o,8185
|
427
427
|
classiq/model_expansions/generative_functions.py,sha256=pdesJ83Ze_G4yZPPuwneuwMJJEyOXIF_rfdYRScr3lE,8078
|
428
428
|
classiq/model_expansions/interpreters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
429
|
-
classiq/model_expansions/interpreters/base_interpreter.py,sha256=
|
429
|
+
classiq/model_expansions/interpreters/base_interpreter.py,sha256=12Eny-z7BdHKDROhKJxfUn5QmxwumlpthNp3R9U8FpI,12035
|
430
430
|
classiq/model_expansions/interpreters/frontend_generative_interpreter.py,sha256=8Q1na4j4u6bFy8TG3xIyoEjCOIql0UiqukS1zko-0BY,4284
|
431
431
|
classiq/model_expansions/interpreters/generative_interpreter.py,sha256=pdZHvhKLWvhMe7di7qKwGk29irappWrdW28YWXVoowQ,13054
|
432
432
|
classiq/model_expansions/model_tables.py,sha256=dlrOGRS2x4Fd_dzClIcV7V8edmbbQzePv9eqxtJQrpo,620
|
@@ -438,7 +438,7 @@ classiq/model_expansions/quantum_operations/assignment_result_processor.py,sha25
|
|
438
438
|
classiq/model_expansions/quantum_operations/bind.py,sha256=FK6ZoYoG3Y5uUyCU0q1ZqB9BcyoTdpY0imkRkhJlx3k,5753
|
439
439
|
classiq/model_expansions/quantum_operations/block_evaluator.py,sha256=06EYOb5CVDUvqYXKk-s-rcoY3rQ2Dr2XWUkqNzT0N0w,4734
|
440
440
|
classiq/model_expansions/quantum_operations/bounds.py,sha256=hvy7mJaM5ReHewvoLg3yIdJrxrFWQ6BUwWvJnbTnn0g,1171
|
441
|
-
classiq/model_expansions/quantum_operations/call_emitter.py,sha256=
|
441
|
+
classiq/model_expansions/quantum_operations/call_emitter.py,sha256=JqBdTsYP3I-KjITXdia53WAe9ho65PgTd4POlj-cZ9U,18779
|
442
442
|
classiq/model_expansions/quantum_operations/composite_emitter.py,sha256=AQp3cYaUUA7eEKNwmZwIq1KEdDlTKRaXiop9pXxSVZg,815
|
443
443
|
classiq/model_expansions/quantum_operations/declarative_call_emitter.py,sha256=IHCS_jqmKcFNSyVCj5MYAe86LZKaf1vEAFTYaLAjVIs,3641
|
444
444
|
classiq/model_expansions/quantum_operations/emitter.py,sha256=320bpN7oyMrIlo4guEEUFbM0YLABTxDh9xGj96nVdu8,11155
|
@@ -457,7 +457,7 @@ classiq/model_expansions/sympy_conversion/sympy_to_python.py,sha256=03fkNV_GvsUU
|
|
457
457
|
classiq/model_expansions/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
458
458
|
classiq/model_expansions/transformers/ast_renamer.py,sha256=Ve3ix6u_xbbxqU2SF0Z4F0-4oIhN8lyUPID1O387C-U,806
|
459
459
|
classiq/model_expansions/transformers/model_renamer.py,sha256=eQ1XLcUp4MNtIvKxJgKxg8Qe-ayl7TXRqB9vEX05YUg,5600
|
460
|
-
classiq/model_expansions/transformers/type_qualifier_inference.py,sha256=
|
460
|
+
classiq/model_expansions/transformers/type_qualifier_inference.py,sha256=GV18wM-CYGYzX0oJQyh5GdX48cPQEJtv2_e2oNt8yX4,13867
|
461
461
|
classiq/model_expansions/transformers/var_splitter.py,sha256=lojo3zHj4B78g2oJlYfjrnpRdlNbKMtZ5dx9q5HlubM,7871
|
462
462
|
classiq/model_expansions/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
463
463
|
classiq/model_expansions/utils/counted_name_allocator.py,sha256=9LPLBm-4ZrpC_0r1rbogyF11FnLaGCUyzwWpcBJoSmA,297
|
@@ -516,7 +516,7 @@ classiq/qmod/global_declarative_switch.py,sha256=30QOkNsDdsVdk14TNx-AetFbBskoXGp
|
|
516
516
|
classiq/qmod/model_state_container.py,sha256=ZLP-yGf9syJy3uH6Bm5NhesoVfihADidvNP4tYYZwgs,2147
|
517
517
|
classiq/qmod/native/__init__.py,sha256=gm0L3ew0KAy0eSqaMQrvpnKWx85HoA1p9ADaAlyejdA,126
|
518
518
|
classiq/qmod/native/expression_to_qmod.py,sha256=5UakdOGiJFJkPthFD7FrO2Z4mQsqZMNOg9xHTAmPVC4,7389
|
519
|
-
classiq/qmod/native/pretty_printer.py,sha256=
|
519
|
+
classiq/qmod/native/pretty_printer.py,sha256=nB6i-AbUP4doKTubGxl7bCb3IrrKontckgmoX5ng9Xg,18428
|
520
520
|
classiq/qmod/pretty_print/__init__.py,sha256=jhR0cpXumOJnyb-zWnvMLpEuUOYPnnJ7DJmV-Zxpy1I,132
|
521
521
|
classiq/qmod/pretty_print/expression_to_python.py,sha256=Ej_xAJApE6mvesmgVNCXKu4G3owwdTysw1m6xn3Vpww,7797
|
522
522
|
classiq/qmod/pretty_print/pretty_printer.py,sha256=Glz9EbTGbxwNatLukz4YrX1yaHfkLlzbamhcA-a2KWk,25499
|
@@ -533,7 +533,7 @@ classiq/qmod/semantics/annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
|
|
533
533
|
classiq/qmod/semantics/annotation/call_annotation.py,sha256=I94YDffDP-PDx3-r8XRFtg7D8B07OyuwnWOGwJVOOOA,3804
|
534
534
|
classiq/qmod/semantics/annotation/model_annotation.py,sha256=gzsX3RrcaTPYBxxplbXaE3pBlQQvVkLGrK-xewzdVMA,329
|
535
535
|
classiq/qmod/semantics/annotation/qstruct_annotator.py,sha256=_TplU5rqUqEyXF7K_HLC9OyJ6YRA6Pu0Z6dYaLhEuk4,1911
|
536
|
-
classiq/qmod/semantics/error_manager.py,sha256=
|
536
|
+
classiq/qmod/semantics/error_manager.py,sha256=iSx2IjmTqiWv292OdH-wZT6C54js-xzc8HEqMNhTKO0,3215
|
537
537
|
classiq/qmod/semantics/lambdas.py,sha256=vtJ37ZRHHI_ieGU2A0JvMst6mwkC2FdOgfT_UkerDN0,1266
|
538
538
|
classiq/qmod/semantics/static_semantics_visitor.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
539
539
|
classiq/qmod/semantics/validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -551,8 +551,8 @@ classiq/qmod/type_attribute_remover.py,sha256=NZmTXAsngWqthXjE8n-n6yE72fiWTFM12-
|
|
551
551
|
classiq/qmod/utilities.py,sha256=oWpvPWu_wnuA_GrGBrheO0OIrdxTlKGbFwAy54FAsdg,5573
|
552
552
|
classiq/qmod/write_qmod.py,sha256=QddTcpXsjLahq3ZATGTIKZW3aj99RtG6MPUHZTKaw38,3508
|
553
553
|
classiq/quantum_program.py,sha256=q4vTnRqNr4VWjrZPJVreX3L_C3s60Nnb1GOp3Wv3SJ0,2088
|
554
|
-
classiq/synthesis.py,sha256=
|
554
|
+
classiq/synthesis.py,sha256=KbOaQOseDmmaMPHQyt03ESE7HlXikHHmNvqfWjOIDiQ,8742
|
555
555
|
classiq/visualization.py,sha256=q-GepvUJf2-tDqof0isaNwWAlf3W3_1dxvlsak1U0ng,983
|
556
|
-
classiq-0.
|
557
|
-
classiq-0.
|
558
|
-
classiq-0.
|
556
|
+
classiq-0.82.0.dist-info/METADATA,sha256=XyFtdBiBb4g5dvvnZ1-1afXvaiQ8iKSK5ztHhF19a5k,3382
|
557
|
+
classiq-0.82.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
558
|
+
classiq-0.82.0.dist-info/RECORD,,
|
File without changes
|