classiq 0.89.0__py3-none-any.whl → 0.90.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.
Potentially problematic release.
This version of classiq might be problematic. Click here for more details.
- classiq/__init__.py +1 -0
- classiq/_internals/api_wrapper.py +16 -32
- classiq/analyzer/show_interactive_hack.py +26 -1
- classiq/applications/chemistry/chemistry_model_constructor.py +14 -2
- classiq/applications/combinatorial_helpers/pyomo_utils.py +9 -6
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +16 -8
- classiq/evaluators/classical_expression.py +63 -41
- classiq/evaluators/control.py +31 -52
- classiq/evaluators/expression_evaluator.py +8 -4
- classiq/evaluators/parameter_types.py +200 -104
- classiq/evaluators/qmod_annotated_expression.py +3 -1
- classiq/evaluators/qmod_node_evaluators/classical_function_evaluation.py +12 -37
- classiq/evaluators/qmod_node_evaluators/constant_evaluation.py +8 -17
- classiq/evaluators/qmod_node_evaluators/measurement_evaluation.py +1 -1
- classiq/evaluators/qmod_node_evaluators/min_max_evaluation.py +7 -1
- classiq/evaluators/qmod_node_evaluators/name_evaluation.py +0 -1
- classiq/evaluators/qmod_node_evaluators/numeric_attrs_utils.py +9 -1
- classiq/evaluators/qmod_node_evaluators/utils.py +33 -0
- classiq/evaluators/qmod_type_inference/classical_type_inference.py +4 -7
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +1 -25
- classiq/interface/analyzer/result.py +4 -0
- classiq/interface/chemistry/ground_state_problem.py +16 -2
- classiq/interface/executor/optimizer_preferences.py +0 -112
- classiq/interface/generator/application_apis/chemistry_declarations.py +3 -1
- classiq/interface/generator/arith/arithmetic_expression_validator.py +2 -7
- classiq/interface/generator/expressions/evaluated_expression.py +3 -13
- classiq/interface/generator/expressions/expression_types.py +8 -22
- classiq/interface/generator/expressions/proxies/classical/classical_proxy.py +2 -2
- classiq/interface/generator/expressions/proxies/classical/classical_struct_proxy.py +1 -2
- classiq/interface/generator/functions/concrete_types.py +1 -1
- classiq/interface/generator/generated_circuit_data.py +4 -0
- classiq/interface/generator/preferences/qasm_to_qmod_params.py +14 -0
- classiq/interface/helpers/model_normalizer.py +0 -6
- classiq/interface/ide/visual_model.py +1 -0
- classiq/interface/model/handle_binding.py +1 -1
- classiq/interface/model/port_declaration.py +2 -1
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +16 -12
- classiq/interface/model/quantum_type.py +1 -1
- classiq/interface/server/routes.py +2 -3
- classiq/model_expansions/atomic_expression_functions_defs.py +4 -22
- classiq/model_expansions/capturing/captured_vars.py +7 -3
- classiq/model_expansions/closure.py +8 -0
- classiq/model_expansions/interpreters/base_interpreter.py +84 -22
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +1 -1
- classiq/model_expansions/interpreters/generative_interpreter.py +7 -5
- classiq/model_expansions/quantum_operations/allocate.py +92 -21
- classiq/model_expansions/quantum_operations/assignment_result_processor.py +28 -27
- classiq/model_expansions/quantum_operations/call_emitter.py +32 -26
- classiq/model_expansions/quantum_operations/classical_var_emitter.py +6 -2
- classiq/model_expansions/quantum_operations/emitter.py +39 -69
- classiq/model_expansions/quantum_operations/expression_evaluator.py +13 -2
- classiq/model_expansions/quantum_operations/quantum_function_call.py +4 -5
- classiq/model_expansions/quantum_operations/variable_decleration.py +16 -11
- classiq/model_expansions/scope.py +36 -29
- classiq/model_expansions/scope_initialization.py +3 -6
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +6 -2
- classiq/model_expansions/transformers/model_renamer.py +35 -64
- classiq/model_expansions/transformers/type_modifier_inference.py +6 -6
- classiq/model_expansions/visitors/boolean_expression_transformers.py +7 -31
- classiq/model_expansions/visitors/symbolic_param_inference.py +9 -3
- classiq/open_library/functions/state_preparation.py +3 -3
- classiq/qmod/builtins/functions/allocation.py +8 -8
- classiq/qmod/builtins/functions/arithmetic.py +1 -1
- classiq/qmod/builtins/functions/chemistry.py +64 -0
- classiq/qmod/builtins/functions/exponentiation.py +7 -13
- classiq/qmod/builtins/functions/qsvm.py +1 -1
- classiq/qmod/builtins/operations.py +38 -10
- classiq/qmod/generative.py +2 -4
- classiq/qmod/native/pretty_printer.py +1 -1
- classiq/qmod/pretty_print/pretty_printer.py +1 -1
- classiq/qmod/qmod_constant.py +1 -1
- classiq/qmod/qmod_parameter.py +2 -2
- classiq/qmod/qmod_variable.py +15 -15
- classiq/qmod/quantum_expandable.py +1 -1
- classiq/synthesis.py +37 -1
- classiq/visualization.py +1 -1
- {classiq-0.89.0.dist-info → classiq-0.90.0.dist-info}/METADATA +1 -1
- {classiq-0.89.0.dist-info → classiq-0.90.0.dist-info}/RECORD +81 -85
- classiq/evaluators/arg_type_match.py +0 -168
- classiq/evaluators/classical_type_inference.py +0 -121
- classiq/interface/combinatorial_optimization/optimization_problem.py +0 -17
- classiq/interface/combinatorial_optimization/result.py +0 -9
- classiq/model_expansions/transformers/ast_renamer.py +0 -26
- {classiq-0.89.0.dist-info → classiq-0.90.0.dist-info}/WHEEL +0 -0
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING, Any, Union
|
|
2
|
-
|
|
3
|
-
from classiq.interface.exceptions import ClassiqExpansionError
|
|
4
|
-
from classiq.interface.generator.expressions.expression import Expression
|
|
5
|
-
from classiq.interface.generator.expressions.proxies.classical.any_classical_value import (
|
|
6
|
-
AnyClassicalValue,
|
|
7
|
-
)
|
|
8
|
-
from classiq.interface.generator.expressions.proxies.classical.classical_array_proxy import (
|
|
9
|
-
ClassicalSequenceProxy,
|
|
10
|
-
_is_int,
|
|
11
|
-
)
|
|
12
|
-
from classiq.interface.generator.expressions.proxies.classical.classical_struct_proxy import (
|
|
13
|
-
ClassicalStructProxy,
|
|
14
|
-
)
|
|
15
|
-
from classiq.interface.generator.expressions.proxies.classical.qmod_struct_instance import (
|
|
16
|
-
QmodStructInstance,
|
|
17
|
-
)
|
|
18
|
-
from classiq.interface.generator.functions.classical_type import (
|
|
19
|
-
ClassicalArray,
|
|
20
|
-
ClassicalTuple,
|
|
21
|
-
ClassicalType,
|
|
22
|
-
)
|
|
23
|
-
from classiq.interface.generator.functions.type_name import TypeName
|
|
24
|
-
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
|
25
|
-
from classiq.interface.helpers.backward_compatibility import zip_strict
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def infer_classical_type(val: Any, classical_type: ClassicalType) -> ClassicalType:
|
|
29
|
-
if isinstance(classical_type, TypeName):
|
|
30
|
-
return _infer_classical_struct_type(val, classical_type)
|
|
31
|
-
if isinstance(classical_type, (ClassicalArray, ClassicalTuple)):
|
|
32
|
-
return _infer_classical_array_type(val, classical_type)
|
|
33
|
-
return classical_type
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def _infer_classical_struct_type(val: Any, classical_type: TypeName) -> ClassicalType:
|
|
37
|
-
if not isinstance(val, (QmodStructInstance, ClassicalStructProxy)):
|
|
38
|
-
return classical_type
|
|
39
|
-
if classical_type.is_enum:
|
|
40
|
-
raise ClassiqExpansionError(
|
|
41
|
-
f"{classical_type.type_name!r} expected, got {str(val)!r}"
|
|
42
|
-
)
|
|
43
|
-
decl = classical_type.classical_struct_decl
|
|
44
|
-
new_fields = {
|
|
45
|
-
field_name: infer_classical_type(field_val, field_type)
|
|
46
|
-
for (field_name, field_val), field_type in zip_strict(
|
|
47
|
-
val.fields.items(),
|
|
48
|
-
decl.variables.values(),
|
|
49
|
-
strict=True,
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
new_classical_type = TypeName(name=decl.name)
|
|
53
|
-
new_classical_type.set_classical_struct_decl(
|
|
54
|
-
StructDeclaration(name=decl.name, variables=new_fields)
|
|
55
|
-
)
|
|
56
|
-
return new_classical_type
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def _infer_classical_array_type(
|
|
60
|
-
val: Any, classical_type: Union[ClassicalArray, ClassicalTuple]
|
|
61
|
-
) -> ClassicalType:
|
|
62
|
-
if isinstance(val, ClassicalSequenceProxy):
|
|
63
|
-
val_length = val.length
|
|
64
|
-
elif isinstance(val, list):
|
|
65
|
-
val_length = len(val)
|
|
66
|
-
elif isinstance(val, AnyClassicalValue):
|
|
67
|
-
return classical_type
|
|
68
|
-
else:
|
|
69
|
-
raise ClassiqExpansionError(f"Array expected, got {str(val)!r}")
|
|
70
|
-
if isinstance(val_length, int) and (
|
|
71
|
-
(
|
|
72
|
-
isinstance(classical_type, ClassicalArray)
|
|
73
|
-
and classical_type.length is not None
|
|
74
|
-
and classical_type.length.is_evaluated()
|
|
75
|
-
and _is_int(classical_type.length.value.value)
|
|
76
|
-
and val_length != (type_length := int(classical_type.length.value.value))
|
|
77
|
-
)
|
|
78
|
-
or (
|
|
79
|
-
isinstance(classical_type, ClassicalTuple)
|
|
80
|
-
and val_length != (type_length := classical_type.length)
|
|
81
|
-
)
|
|
82
|
-
):
|
|
83
|
-
raise ClassiqExpansionError(
|
|
84
|
-
f"Type mismatch: Argument has {val_length} items but "
|
|
85
|
-
f"{type_length} expected"
|
|
86
|
-
)
|
|
87
|
-
new_classical_type = _infer_inner_array_types(classical_type, val, val_length)
|
|
88
|
-
if classical_type.is_generative:
|
|
89
|
-
new_classical_type.set_generative()
|
|
90
|
-
return new_classical_type
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def _infer_inner_array_types(
|
|
94
|
-
classical_type: ClassicalType, val: Any, val_length: Any
|
|
95
|
-
) -> ClassicalType:
|
|
96
|
-
if isinstance(classical_type, ClassicalTuple):
|
|
97
|
-
return ClassicalTuple(
|
|
98
|
-
element_types=(
|
|
99
|
-
infer_classical_type(val[idx], element_type)
|
|
100
|
-
for idx, element_type in enumerate(classical_type.element_types)
|
|
101
|
-
),
|
|
102
|
-
)
|
|
103
|
-
if TYPE_CHECKING:
|
|
104
|
-
assert isinstance(classical_type, ClassicalArray)
|
|
105
|
-
if _is_int(val_length) and val_length != 0:
|
|
106
|
-
return ClassicalTuple(
|
|
107
|
-
element_types=(
|
|
108
|
-
infer_classical_type(val[i], classical_type.element_type)
|
|
109
|
-
for i in range(int(val_length))
|
|
110
|
-
),
|
|
111
|
-
)
|
|
112
|
-
element_type: ClassicalType
|
|
113
|
-
if val_length == 0:
|
|
114
|
-
element_type = classical_type.element_type
|
|
115
|
-
else:
|
|
116
|
-
element_type = infer_classical_type(val[0], classical_type.element_type)
|
|
117
|
-
if _is_int(val_length):
|
|
118
|
-
length = Expression(expr=str(int(val_length)))
|
|
119
|
-
else:
|
|
120
|
-
length = None
|
|
121
|
-
return ClassicalArray(element_type=element_type, length=length)
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
import pydantic
|
|
4
|
-
from pydantic import BaseModel
|
|
5
|
-
|
|
6
|
-
from classiq.interface.executor.optimizer_preferences import CombinatorialOptimizer
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class MaxCutProblem(BaseModel):
|
|
10
|
-
qaoa_reps: pydantic.PositiveInt = pydantic.Field(
|
|
11
|
-
default=1, description="Number of layers in qaoa ansatz."
|
|
12
|
-
)
|
|
13
|
-
optimizer_preferences: CombinatorialOptimizer = pydantic.Field(
|
|
14
|
-
default_factory=CombinatorialOptimizer,
|
|
15
|
-
description="preferences for the VQE execution",
|
|
16
|
-
)
|
|
17
|
-
serialized_graph: dict[str, Any]
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import ast
|
|
2
|
-
|
|
3
|
-
_POSSIBLE_HANDLE_AST_TYPES = (ast.Subscript, ast.Attribute, ast.Name)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class _ASTRenamer(ast.NodeTransformer):
|
|
7
|
-
def __init__(self, sub: dict[str, str]) -> None:
|
|
8
|
-
self._sub = sub
|
|
9
|
-
|
|
10
|
-
def visit(self, node: ast.AST) -> ast.AST:
|
|
11
|
-
if isinstance(node, _POSSIBLE_HANDLE_AST_TYPES):
|
|
12
|
-
node_expr = ast.unparse(node)
|
|
13
|
-
if node_expr in self._sub:
|
|
14
|
-
return ast.Name(id=self._sub[node_expr])
|
|
15
|
-
return super().visit(node)
|
|
16
|
-
|
|
17
|
-
def visit_Call(self, node: ast.Call) -> ast.Call:
|
|
18
|
-
return ast.Call(
|
|
19
|
-
func=node.func,
|
|
20
|
-
args=[self.visit(arg) for arg in node.args],
|
|
21
|
-
keywords=[],
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def rename_variables(expr: str, sub: dict[str, str]) -> str:
|
|
26
|
-
return ast.unparse(_ASTRenamer(sub).visit(ast.parse(expr)))
|
|
File without changes
|