classiq 0.37.1__py3-none-any.whl → 0.39.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/__init__.py +23 -24
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +1 -1
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +37 -17
- classiq/_internals/async_utils.py +1 -74
- classiq/_internals/authentication/device.py +9 -4
- classiq/_internals/authentication/password_manager.py +25 -10
- classiq/_internals/authentication/token_manager.py +2 -2
- classiq/_internals/client.py +24 -6
- classiq/_internals/jobs.py +10 -7
- classiq/analyzer/analyzer.py +29 -29
- classiq/analyzer/analyzer_utilities.py +5 -5
- classiq/analyzer/rb.py +4 -5
- classiq/analyzer/show_interactive_hack.py +6 -6
- classiq/applications/__init__.py +1 -8
- classiq/applications/chemistry/__init__.py +6 -0
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +9 -16
- classiq/applications/combinatorial_helpers/allowed_constraints.py +20 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +150 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +122 -0
- classiq/applications/combinatorial_helpers/memory.py +77 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +162 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +75 -0
- classiq/applications/combinatorial_helpers/py.typed +0 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +245 -0
- classiq/applications/combinatorial_helpers/solvers/__init__.py +0 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/__init__.py +0 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +187 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +142 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +122 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +32 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +75 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +88 -0
- classiq/applications/combinatorial_optimization/__init__.py +13 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +134 -0
- classiq/applications/finance/__init__.py +3 -2
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +27 -30
- classiq/applications/grover/__init__.py +11 -0
- classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +20 -91
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +35 -0
- classiq/applications/qnn/circuit_utils.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/types.py +2 -2
- classiq/applications/qsvm/__init__.py +5 -1
- classiq/applications/qsvm/qsvm.py +4 -7
- classiq/applications/qsvm/qsvm_data_generation.py +2 -5
- classiq/exceptions.py +43 -1
- classiq/execution/all_hardware_devices.py +13 -0
- classiq/executor.py +12 -10
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +6 -3
- classiq/interface/analyzer/result.py +12 -8
- classiq/interface/applications/qsvm.py +17 -3
- classiq/interface/ast_node.py +23 -0
- classiq/interface/backend/backend_preferences.py +4 -2
- classiq/interface/backend/pydantic_backend.py +3 -1
- classiq/interface/backend/quantum_backend_providers.py +1 -0
- classiq/interface/chemistry/fermionic_operator.py +15 -13
- classiq/interface/chemistry/ground_state_problem.py +18 -3
- classiq/interface/chemistry/molecule.py +8 -6
- classiq/interface/chemistry/operator.py +20 -14
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -1
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -2
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +8 -3
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/set_cover.py +2 -1
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +9 -3
- classiq/interface/executor/aws_execution_cost.py +4 -3
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +5 -34
- classiq/interface/executor/execution_request.py +15 -48
- classiq/interface/executor/optimizer_preferences.py +22 -13
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +21 -15
- classiq/interface/executor/quantum_instruction_set.py +2 -1
- classiq/interface/executor/register_initialization.py +1 -3
- classiq/interface/executor/result.py +41 -10
- classiq/interface/executor/vqe_result.py +2 -2
- classiq/interface/finance/function_input.py +17 -4
- classiq/interface/finance/gaussian_model_input.py +3 -1
- classiq/interface/finance/log_normal_model_input.py +3 -1
- classiq/interface/finance/model_input.py +2 -0
- classiq/interface/generator/amplitude_loading.py +6 -3
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +14 -0
- classiq/interface/generator/arith/argument_utils.py +14 -4
- classiq/interface/generator/arith/arithmetic.py +3 -1
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +12 -13
- classiq/interface/generator/arith/arithmetic_expression_abc.py +4 -1
- classiq/interface/generator/arith/arithmetic_expression_parser.py +8 -2
- classiq/interface/generator/arith/arithmetic_expression_validator.py +16 -2
- classiq/interface/generator/arith/arithmetic_operations.py +5 -10
- classiq/interface/generator/arith/ast_node_rewrite.py +1 -1
- classiq/interface/generator/arith/binary_ops.py +202 -54
- classiq/interface/generator/arith/extremum_operations.py +5 -3
- classiq/interface/generator/arith/logical_ops.py +4 -2
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +34 -44
- classiq/interface/generator/arith/register_user_input.py +21 -1
- classiq/interface/generator/arith/unary_ops.py +16 -25
- classiq/interface/generator/builtin_api_builder.py +0 -5
- classiq/interface/generator/chemistry_function_params.py +4 -4
- classiq/interface/generator/commuting_pauli_exponentiation.py +3 -1
- classiq/interface/generator/compiler_keywords.py +4 -0
- classiq/interface/generator/complex_type.py +3 -10
- classiq/interface/generator/constant.py +2 -3
- classiq/interface/generator/control_state.py +5 -3
- classiq/interface/generator/credit_risk_example/linear_gci.py +10 -3
- classiq/interface/generator/credit_risk_example/weighted_adder.py +14 -4
- classiq/interface/generator/expressions/atomic_expression_functions.py +5 -3
- classiq/interface/generator/expressions/evaluated_expression.py +18 -4
- classiq/interface/generator/expressions/expression.py +3 -5
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +33 -0
- classiq/interface/generator/expressions/sympy_supported_expressions.py +2 -1
- classiq/interface/generator/finance.py +1 -1
- classiq/interface/generator/function_params.py +7 -6
- classiq/interface/generator/functions/__init__.py +2 -2
- classiq/interface/generator/functions/builtins/__init__.py +15 -0
- classiq/interface/generator/functions/builtins/core_library/__init__.py +14 -0
- classiq/interface/generator/functions/builtins/core_library/chemistry_functions.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +62 -0
- classiq/interface/generator/functions/{core_lib_declarations/quantum_functions/std_lib_functions.py → builtins/open_lib_functions.py} +612 -219
- classiq/interface/generator/functions/builtins/quantum_operators.py +37 -0
- classiq/interface/generator/functions/classical_type.py +2 -4
- classiq/interface/generator/functions/foreign_function_definition.py +12 -4
- classiq/interface/generator/functions/function_declaration.py +2 -2
- classiq/interface/generator/functions/function_implementation.py +8 -4
- classiq/interface/generator/functions/native_function_definition.py +4 -2
- classiq/interface/generator/functions/register.py +4 -2
- classiq/interface/generator/functions/register_mapping_data.py +14 -10
- classiq/interface/generator/generated_circuit_data.py +2 -2
- classiq/interface/generator/grover_operator.py +5 -3
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +5 -1
- classiq/interface/generator/hardware/hardware_data.py +6 -4
- classiq/interface/generator/hardware_efficient_ansatz.py +25 -8
- classiq/interface/generator/hartree_fock.py +13 -3
- classiq/interface/generator/linear_pauli_rotations.py +3 -1
- classiq/interface/generator/mcu.py +5 -3
- classiq/interface/generator/mcx.py +7 -5
- classiq/interface/generator/model/classical_main_validator.py +1 -1
- classiq/interface/generator/model/constraints.py +2 -1
- classiq/interface/generator/model/model.py +12 -20
- classiq/interface/generator/model/preferences/preferences.py +4 -3
- classiq/interface/generator/oracles/custom_oracle.py +4 -2
- classiq/interface/generator/oracles/oracle_abc.py +2 -2
- classiq/interface/generator/qpe.py +6 -4
- classiq/interface/generator/qsvm.py +5 -8
- classiq/interface/generator/quantum_function_call.py +21 -16
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +10 -14
- classiq/interface/generator/range_types.py +3 -1
- classiq/interface/generator/slice_parsing_utils.py +8 -3
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +4 -2
- classiq/interface/generator/state_preparation/metrics.py +2 -1
- classiq/interface/generator/state_preparation/state_preparation.py +7 -5
- classiq/interface/generator/state_propagator.py +16 -5
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
- classiq/interface/generator/types/struct_declaration.py +10 -7
- classiq/interface/generator/ucc.py +6 -4
- classiq/interface/generator/unitary_gate.py +7 -3
- classiq/interface/generator/validations/flow_graph.py +6 -4
- classiq/interface/generator/validations/validator_functions.py +6 -4
- classiq/interface/hardware.py +2 -2
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/pydantic_model_helpers.py +0 -6
- classiq/interface/helpers/validation_helpers.py +1 -1
- classiq/interface/helpers/versioned_model.py +4 -1
- classiq/interface/ide/show.py +2 -2
- classiq/interface/jobs.py +72 -3
- classiq/interface/model/bind_operation.py +18 -11
- classiq/interface/model/call_synthesis_data.py +68 -0
- classiq/interface/model/classical_if.py +13 -0
- classiq/interface/model/classical_parameter_declaration.py +2 -3
- classiq/interface/model/control.py +16 -0
- classiq/interface/model/handle_binding.py +3 -2
- classiq/interface/model/inplace_binary_operation.py +2 -2
- classiq/interface/model/invert.py +10 -0
- classiq/interface/model/model.py +29 -22
- classiq/interface/model/native_function_definition.py +3 -5
- classiq/interface/model/power.py +12 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +9 -4
- classiq/interface/model/quantum_expressions/control_state.py +2 -2
- classiq/interface/model/quantum_function_call.py +33 -142
- classiq/interface/model/quantum_function_declaration.py +8 -0
- classiq/interface/model/quantum_if_operation.py +4 -5
- classiq/interface/model/quantum_lambda_function.py +58 -0
- classiq/{quantum_register.py → interface/model/quantum_register.py} +17 -9
- classiq/interface/model/quantum_statement.py +3 -2
- classiq/interface/model/quantum_type.py +58 -59
- classiq/interface/model/quantum_variable_declaration.py +3 -3
- classiq/interface/model/repeat.py +13 -0
- classiq/interface/model/resolvers/function_call_resolver.py +26 -0
- classiq/interface/model/statement_block.py +49 -0
- classiq/interface/model/validations/handles_validator.py +16 -18
- classiq/interface/model/within_apply_operation.py +11 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/routes.py +5 -4
- classiq/qmod/__init__.py +13 -6
- classiq/qmod/builtins/classical_execution_primitives.py +27 -36
- classiq/qmod/builtins/classical_functions.py +22 -12
- classiq/qmod/builtins/functions.py +272 -328
- classiq/qmod/builtins/operations.py +171 -35
- classiq/qmod/builtins/structs.py +15 -15
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +6 -14
- classiq/qmod/declaration_inferrer.py +12 -21
- classiq/qmod/expression_query.py +23 -0
- classiq/qmod/model_state_container.py +2 -0
- classiq/qmod/native/__init__.py +0 -0
- classiq/qmod/native/expression_to_qmod.py +189 -0
- classiq/qmod/native/pretty_printer.py +340 -0
- classiq/qmod/qfunc.py +27 -0
- classiq/qmod/qmod_constant.py +100 -0
- classiq/qmod/qmod_parameter.py +36 -13
- classiq/qmod/qmod_struct.py +3 -3
- classiq/qmod/qmod_variable.py +148 -31
- classiq/qmod/quantum_callable.py +1 -0
- classiq/qmod/quantum_expandable.py +18 -19
- classiq/qmod/quantum_function.py +41 -8
- classiq/qmod/symbolic.py +48 -5
- classiq/qmod/symbolic_expr.py +9 -0
- classiq/qmod/utilities.py +13 -0
- classiq/qmod/write_qmod.py +39 -0
- {classiq-0.37.1.dist-info → classiq-0.39.0.dist-info}/METADATA +2 -1
- {classiq-0.37.1.dist-info → classiq-0.39.0.dist-info}/RECORD +244 -225
- {classiq-0.37.1.dist-info → classiq-0.39.0.dist-info}/WHEEL +1 -1
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/pauli_helpers/__init__.py} +0 -0
- /classiq/{applications_model_constructors → applications}/libraries/ampltitude_estimation_library.py +0 -0
- /classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +0 -0
- /classiq/interface/generator/functions/{core_lib_declarations/quantum_functions → builtins/core_library}/atomic_quantum_functions.py +0 -0
- /classiq/interface/generator/functions/{core_lib_declarations/quantum_functions → builtins/core_library}/exponentiation_functions.py +0 -0
@@ -1,67 +0,0 @@
|
|
1
|
-
from copy import deepcopy
|
2
|
-
|
3
|
-
from classiq.interface.generator.generated_circuit import GeneratedCircuit
|
4
|
-
from classiq.interface.generator.model.preferences.preferences import (
|
5
|
-
Preferences,
|
6
|
-
QuantumFormat,
|
7
|
-
TranspilationOption,
|
8
|
-
)
|
9
|
-
|
10
|
-
from classiq._internals.async_utils import Asyncify
|
11
|
-
from classiq.model.model import Model
|
12
|
-
from classiq.quantum_functions.decorators import quantum_function as qfunc
|
13
|
-
from classiq.quantum_functions.function_library import QASM_INTRO, FunctionLibrary
|
14
|
-
from classiq.quantum_register import QReg, ZeroQReg
|
15
|
-
from classiq.synthesis import synthesize_async
|
16
|
-
|
17
|
-
_MB_NAME: str = "mirror_benchmarking"
|
18
|
-
_MB_FUNCTION_LIBRARY_NAME: str = f"{_MB_NAME}_function_library"
|
19
|
-
|
20
|
-
|
21
|
-
class MirrorBenchmarking(metaclass=Asyncify):
|
22
|
-
def __init__(self, model: Model) -> None:
|
23
|
-
self.functional_model: Model = model
|
24
|
-
self.functional_model._model.preferences = self.get_functional_preferences(
|
25
|
-
model.preferences
|
26
|
-
)
|
27
|
-
|
28
|
-
async def mirror_benchmarking_model_async(self) -> Model:
|
29
|
-
functional_circuit: GeneratedCircuit = GeneratedCircuit.parse_raw(
|
30
|
-
await synthesize_async(self.functional_model.get_model())
|
31
|
-
)
|
32
|
-
|
33
|
-
num_qubits: int = functional_circuit.data.width
|
34
|
-
circuit_qasm_list = functional_circuit.qasm.split(QASM_INTRO) # type: ignore[union-attr]
|
35
|
-
if not circuit_qasm_list:
|
36
|
-
raise AssertionError(
|
37
|
-
"Functional model synthesis did not result in a legal QASM"
|
38
|
-
)
|
39
|
-
circuit_qasm: str = circuit_qasm_list[-1]
|
40
|
-
|
41
|
-
@qfunc
|
42
|
-
def functional_model_function(reg: ZeroQReg[num_qubits]) -> QReg[num_qubits]: # type: ignore[type-arg, valid-type]
|
43
|
-
return QASM_INTRO + circuit_qasm # type: ignore[return-value]
|
44
|
-
|
45
|
-
model_function_library = FunctionLibrary(functional_model_function)
|
46
|
-
|
47
|
-
mb_model = Model(
|
48
|
-
preferences=self.get_mirror_benchmarking_preferences(
|
49
|
-
self.functional_model.preferences
|
50
|
-
)
|
51
|
-
)
|
52
|
-
mb_model.include_library(model_function_library)
|
53
|
-
inner_wires = mb_model.functional_model_function()
|
54
|
-
mb_model.functional_model_function(in_wires=inner_wires, is_inverse=True)
|
55
|
-
return mb_model
|
56
|
-
|
57
|
-
@staticmethod
|
58
|
-
def get_functional_preferences(preferences: Preferences) -> Preferences:
|
59
|
-
functional_preferences = deepcopy(preferences)
|
60
|
-
functional_preferences.output_format = [QuantumFormat.QASM]
|
61
|
-
return functional_preferences
|
62
|
-
|
63
|
-
@staticmethod
|
64
|
-
def get_mirror_benchmarking_preferences(preferences: Preferences) -> Preferences:
|
65
|
-
mb_preferences = deepcopy(preferences)
|
66
|
-
mb_preferences.transpilation_option = TranspilationOption.DECOMPOSE
|
67
|
-
return mb_preferences
|
@@ -1,37 +0,0 @@
|
|
1
|
-
from typing import Any, TypeVar, cast
|
2
|
-
|
3
|
-
import numpy as np
|
4
|
-
|
5
|
-
|
6
|
-
# numpy utils
|
7
|
-
def _is_empty_ndarray(obj: np.ndarray) -> bool:
|
8
|
-
return 0 in obj.shape
|
9
|
-
|
10
|
-
|
11
|
-
def bool_datum(
|
12
|
-
obj: Any,
|
13
|
-
) -> Any: # returning `Any` since any object in python is convertable to `bool`
|
14
|
-
if isinstance(obj, np.ndarray):
|
15
|
-
# check that it's non-empty
|
16
|
-
return not _is_empty_ndarray(obj)
|
17
|
-
else:
|
18
|
-
return obj
|
19
|
-
|
20
|
-
|
21
|
-
def bool_data(*objects: Any) -> bool:
|
22
|
-
return all(map(bool_datum, objects))
|
23
|
-
|
24
|
-
|
25
|
-
T = TypeVar("T")
|
26
|
-
|
27
|
-
|
28
|
-
def choose_first(*objects: T) -> T:
|
29
|
-
for obj in objects:
|
30
|
-
if isinstance(obj, np.ndarray):
|
31
|
-
if not _is_empty_ndarray(obj):
|
32
|
-
return cast(T, obj)
|
33
|
-
else:
|
34
|
-
if obj:
|
35
|
-
return obj
|
36
|
-
# if everything failed, return the last
|
37
|
-
return objects[-1]
|
@@ -1,17 +0,0 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
|
-
from .chemistry_model_constructor import construct_chemistry_model
|
4
|
-
from .combinatorial_optimization_model_constructor import (
|
5
|
-
construct_combinatorial_optimization_model,
|
6
|
-
)
|
7
|
-
from .finance_model_constructor import construct_finance_model
|
8
|
-
from .grover_model_constructor import construct_grover_model
|
9
|
-
from .qsvm_model_constructor import construct_qsvm_model
|
10
|
-
|
11
|
-
__all__: List[str] = [
|
12
|
-
"construct_qsvm_model",
|
13
|
-
"construct_combinatorial_optimization_model",
|
14
|
-
"construct_chemistry_model",
|
15
|
-
"construct_finance_model",
|
16
|
-
"construct_grover_model",
|
17
|
-
]
|
@@ -1,178 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
from typing import List, Optional
|
3
|
-
|
4
|
-
import sympy
|
5
|
-
from pyomo import environ as pyo
|
6
|
-
from pyomo.core import ConcreteModel, Constraint, Objective, Var, maximize
|
7
|
-
from pyomo.core.base.objective import ScalarObjective
|
8
|
-
from pyomo.core.expr.sympy_tools import Pyomo2SympyVisitor, PyomoSympyBimap
|
9
|
-
|
10
|
-
from classiq.interface.generator.expressions.expression import Expression
|
11
|
-
from classiq.interface.generator.functions.classical_type import ClassicalArray, Real
|
12
|
-
from classiq.interface.generator.functions.port_declaration import (
|
13
|
-
PortDeclarationDirection,
|
14
|
-
)
|
15
|
-
from classiq.interface.generator.types.combinatorial_problem import (
|
16
|
-
CombinatorialOptimizationStructDeclaration,
|
17
|
-
)
|
18
|
-
from classiq.interface.model.handle_binding import HandleBinding
|
19
|
-
from classiq.interface.model.model import Model, SerializedModel
|
20
|
-
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
21
|
-
from classiq.interface.model.port_declaration import PortDeclaration
|
22
|
-
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
23
|
-
|
24
|
-
from classiq.applications.combinatorial_optimization.combinatorial_optimization_config import (
|
25
|
-
OptimizerConfig,
|
26
|
-
QAOAConfig,
|
27
|
-
)
|
28
|
-
|
29
|
-
_OUTPUT_VARIABLE_NAME = "solution"
|
30
|
-
|
31
|
-
|
32
|
-
def pyomo2qmod(struct_name: str, pyo_model: ConcreteModel) -> str:
|
33
|
-
symbols_map = PyomoSympyBimap()
|
34
|
-
|
35
|
-
variables: List[sympy.Symbol] = []
|
36
|
-
|
37
|
-
bounds_set = False
|
38
|
-
lower_bound = None
|
39
|
-
upper_bound = None
|
40
|
-
|
41
|
-
for var_dict in pyo_model.component_objects(Var):
|
42
|
-
for key in var_dict:
|
43
|
-
var = Pyomo2SympyVisitor(symbols_map).walk_expression(var_dict[key])
|
44
|
-
var.name = var.name.replace(",", "_")
|
45
|
-
variables.append(var)
|
46
|
-
if bounds_set:
|
47
|
-
if lower_bound != var_dict[key].lb:
|
48
|
-
raise ValueError("All problem variables must agree on lower bound")
|
49
|
-
if upper_bound != var_dict[key].ub:
|
50
|
-
raise ValueError("All problem variables must agree on upper bound")
|
51
|
-
else:
|
52
|
-
lower_bound = var_dict[key].lb
|
53
|
-
upper_bound = var_dict[key].ub
|
54
|
-
bounds_set = True
|
55
|
-
|
56
|
-
constraint_exprs: List[sympy.Expr] = []
|
57
|
-
|
58
|
-
for constraint_dict in pyo_model.component_objects(Constraint):
|
59
|
-
for key in constraint_dict:
|
60
|
-
constraint_exprs.append(
|
61
|
-
Pyomo2SympyVisitor(symbols_map).walk_expression(
|
62
|
-
constraint_dict[key].expr
|
63
|
-
)
|
64
|
-
)
|
65
|
-
|
66
|
-
pyo_objective: ScalarObjective = next(pyo_model.component_objects(Objective))
|
67
|
-
objective_type_str = "Max" if pyo_objective.sense == maximize else "Min"
|
68
|
-
objective_expr: sympy.Expr = Pyomo2SympyVisitor(symbols_map).walk_expression(
|
69
|
-
pyo_objective
|
70
|
-
)
|
71
|
-
|
72
|
-
combi_struct_decl = {
|
73
|
-
"name": struct_name,
|
74
|
-
"variables": {str(variable): {"kind": "int"} for variable in variables},
|
75
|
-
"variable_lower_bound": lower_bound,
|
76
|
-
"variable_upper_bound": upper_bound,
|
77
|
-
"constraints": [
|
78
|
-
{"expr": str(constraint_expr)} for constraint_expr in constraint_exprs
|
79
|
-
],
|
80
|
-
"objective_type": objective_type_str,
|
81
|
-
"objective_function": {"expr": str(objective_expr)},
|
82
|
-
}
|
83
|
-
return json.dumps(combi_struct_decl, indent=2)
|
84
|
-
|
85
|
-
|
86
|
-
def construct_combi_opt_py_model(
|
87
|
-
pyo_model: pyo.ConcreteModel,
|
88
|
-
qaoa_config: Optional[QAOAConfig] = None,
|
89
|
-
optimizer_config: Optional[OptimizerConfig] = None,
|
90
|
-
) -> Model:
|
91
|
-
if qaoa_config is None:
|
92
|
-
qaoa_config = QAOAConfig()
|
93
|
-
|
94
|
-
if optimizer_config is None:
|
95
|
-
optimizer_config = OptimizerConfig()
|
96
|
-
|
97
|
-
max_iteration = 0
|
98
|
-
if optimizer_config.max_iteration is not None:
|
99
|
-
max_iteration = optimizer_config.max_iteration
|
100
|
-
|
101
|
-
initial_point_expression = (
|
102
|
-
f"{optimizer_config.initial_point}"
|
103
|
-
if optimizer_config.initial_point is not None
|
104
|
-
else f"compute_qaoa_initial_point(optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy}),{qaoa_config.num_layers})"
|
105
|
-
)
|
106
|
-
|
107
|
-
return Model(
|
108
|
-
types=[
|
109
|
-
CombinatorialOptimizationStructDeclaration.parse_raw(
|
110
|
-
pyomo2qmod("MyCombiProblem", pyo_model)
|
111
|
-
)
|
112
|
-
],
|
113
|
-
functions=[
|
114
|
-
NativeFunctionDefinition(
|
115
|
-
name="main",
|
116
|
-
param_decls={
|
117
|
-
"params_list": ClassicalArray(
|
118
|
-
element_type=Real(), size=qaoa_config.num_layers * 2
|
119
|
-
)
|
120
|
-
},
|
121
|
-
port_declarations={
|
122
|
-
"target": PortDeclaration(
|
123
|
-
name="target",
|
124
|
-
size=Expression(
|
125
|
-
expr=f"len(get_field(optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy})[0], 'pauli'))"
|
126
|
-
),
|
127
|
-
direction=PortDeclarationDirection.Output,
|
128
|
-
),
|
129
|
-
},
|
130
|
-
body=[
|
131
|
-
QuantumFunctionCall(
|
132
|
-
function="allocate",
|
133
|
-
positional_args=[
|
134
|
-
Expression(expr="len(target)"),
|
135
|
-
HandleBinding(name="target"),
|
136
|
-
],
|
137
|
-
),
|
138
|
-
QuantumFunctionCall(
|
139
|
-
function="qaoa_penalty",
|
140
|
-
params={
|
141
|
-
"hamiltonian": Expression(
|
142
|
-
expr=f"optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy})"
|
143
|
-
),
|
144
|
-
"params_list": Expression(expr="params_list"),
|
145
|
-
"num_qubits": Expression(expr="len(target)"),
|
146
|
-
"is_st": Expression(expr="True"),
|
147
|
-
},
|
148
|
-
inouts={"target": HandleBinding(name="target")},
|
149
|
-
),
|
150
|
-
],
|
151
|
-
),
|
152
|
-
],
|
153
|
-
classical_execution_code=f"""
|
154
|
-
vqe_result = vqe(
|
155
|
-
hamiltonian=optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy}),
|
156
|
-
maximize={next(pyo_model.component_objects(Objective)).sense==maximize},
|
157
|
-
initial_point={initial_point_expression},
|
158
|
-
optimizer=Optimizer.{optimizer_config.opt_type},
|
159
|
-
max_iteration={max_iteration},
|
160
|
-
tolerance={optimizer_config.tolerance},
|
161
|
-
step_size={optimizer_config.step_size},
|
162
|
-
skip_compute_variance={optimizer_config.skip_compute_variance},
|
163
|
-
alpha_cvar={optimizer_config.alpha_cvar}
|
164
|
-
)
|
165
|
-
{_OUTPUT_VARIABLE_NAME} = get_optimization_solution(get_type(MyCombiProblem), vqe_result, {qaoa_config.penalty_energy})
|
166
|
-
hamiltonian = optimization_problem_to_hamiltonian(get_type(MyCombiProblem), {qaoa_config.penalty_energy})
|
167
|
-
save({{{_OUTPUT_VARIABLE_NAME!r}: {_OUTPUT_VARIABLE_NAME}, "vqe_result": vqe_result, "hamiltonian": hamiltonian}})
|
168
|
-
""",
|
169
|
-
)
|
170
|
-
|
171
|
-
|
172
|
-
def construct_combinatorial_optimization_model(
|
173
|
-
pyo_model: pyo.ConcreteModel,
|
174
|
-
qaoa_config: Optional[QAOAConfig] = None,
|
175
|
-
optimizer_config: Optional[OptimizerConfig] = None,
|
176
|
-
) -> SerializedModel:
|
177
|
-
model = construct_combi_opt_py_model(pyo_model, qaoa_config, optimizer_config)
|
178
|
-
return model.get_model()
|
@@ -1,109 +0,0 @@
|
|
1
|
-
from classiq.interface.generator.expressions.expression import Expression
|
2
|
-
from classiq.interface.generator.functions.port_declaration import (
|
3
|
-
PortDeclarationDirection,
|
4
|
-
)
|
5
|
-
from classiq.interface.model.handle_binding import HandleBinding, SlicedHandleBinding
|
6
|
-
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
7
|
-
from classiq.interface.model.port_declaration import PortDeclaration
|
8
|
-
from classiq.interface.model.quantum_function_call import (
|
9
|
-
QuantumFunctionCall,
|
10
|
-
QuantumLambdaFunction,
|
11
|
-
)
|
12
|
-
from classiq.interface.model.quantum_function_declaration import (
|
13
|
-
QuantumOperandDeclaration,
|
14
|
-
)
|
15
|
-
|
16
|
-
from classiq import Integer
|
17
|
-
|
18
|
-
QMCI_LIBRARY = [
|
19
|
-
NativeFunctionDefinition(
|
20
|
-
name="qmci",
|
21
|
-
param_decls={
|
22
|
-
"num_phase_qubits": Integer(),
|
23
|
-
"num_unitary_qubits": Integer(),
|
24
|
-
},
|
25
|
-
port_declarations={
|
26
|
-
"phase_port": PortDeclaration(
|
27
|
-
name="phase_port",
|
28
|
-
size=Expression(expr="num_phase_qubits"),
|
29
|
-
direction=PortDeclarationDirection.Output,
|
30
|
-
),
|
31
|
-
"unitary_port": PortDeclaration(
|
32
|
-
name="unitary_port",
|
33
|
-
size=Expression(expr="num_unitary_qubits"),
|
34
|
-
direction=PortDeclarationDirection.Output,
|
35
|
-
),
|
36
|
-
},
|
37
|
-
operand_declarations={
|
38
|
-
"sp_op": QuantumOperandDeclaration(
|
39
|
-
name="sp_op",
|
40
|
-
param_decls={"num_unitary_qubits": Integer()},
|
41
|
-
port_declarations={
|
42
|
-
"reg": PortDeclaration(
|
43
|
-
name="reg",
|
44
|
-
direction=PortDeclarationDirection.Inout,
|
45
|
-
size=Expression(expr="num_unitary_qubits-1"),
|
46
|
-
),
|
47
|
-
"ind": PortDeclaration(
|
48
|
-
name="ind",
|
49
|
-
direction=PortDeclarationDirection.Inout,
|
50
|
-
size=Expression(expr="1"),
|
51
|
-
),
|
52
|
-
},
|
53
|
-
),
|
54
|
-
},
|
55
|
-
body=[
|
56
|
-
QuantumFunctionCall(
|
57
|
-
function="amplitude_estimation",
|
58
|
-
params={
|
59
|
-
"num_unitary_qubits": Expression(expr="num_unitary_qubits"),
|
60
|
-
"num_phase_qubits": Expression(expr="num_phase_qubits"),
|
61
|
-
},
|
62
|
-
outputs={
|
63
|
-
"phase_port": HandleBinding(name="phase_port"),
|
64
|
-
"unitary_port": HandleBinding(name="unitary_port"),
|
65
|
-
},
|
66
|
-
operands={
|
67
|
-
"oracle_op": QuantumLambdaFunction(
|
68
|
-
body=[
|
69
|
-
QuantumFunctionCall(
|
70
|
-
function="Z",
|
71
|
-
inouts={
|
72
|
-
"target": SlicedHandleBinding(
|
73
|
-
name="oq",
|
74
|
-
start=Expression(expr="num_unitary_qubits-1"),
|
75
|
-
end=Expression(expr="num_unitary_qubits"),
|
76
|
-
),
|
77
|
-
},
|
78
|
-
),
|
79
|
-
]
|
80
|
-
),
|
81
|
-
"sp_op": QuantumLambdaFunction(
|
82
|
-
body=[
|
83
|
-
QuantumFunctionCall(
|
84
|
-
function="sp_op",
|
85
|
-
params={
|
86
|
-
"num_unitary_qubits": Expression(
|
87
|
-
expr="num_unitary_qubits"
|
88
|
-
)
|
89
|
-
},
|
90
|
-
inouts={
|
91
|
-
"reg": SlicedHandleBinding(
|
92
|
-
name="spq",
|
93
|
-
start=Expression(expr="0"),
|
94
|
-
end=Expression(expr="num_unitary_qubits-1"),
|
95
|
-
),
|
96
|
-
"ind": SlicedHandleBinding(
|
97
|
-
name="spq",
|
98
|
-
start=Expression(expr="num_unitary_qubits-1"),
|
99
|
-
end=Expression(expr="num_unitary_qubits"),
|
100
|
-
),
|
101
|
-
},
|
102
|
-
)
|
103
|
-
],
|
104
|
-
),
|
105
|
-
},
|
106
|
-
),
|
107
|
-
],
|
108
|
-
),
|
109
|
-
]
|
@@ -1,43 +0,0 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
|
-
from classiq.interface.generator.function_param_list import * # noqa: F403
|
4
|
-
from classiq.interface.generator.function_param_list_without_self_reference import * # noqa: F403
|
5
|
-
from classiq.interface.generator.oracles.oracle_function_param_list import * # noqa: F403
|
6
|
-
|
7
|
-
from ..builtin_functions import (
|
8
|
-
amplitude_loading,
|
9
|
-
binary_ops,
|
10
|
-
exponentiation,
|
11
|
-
qpe,
|
12
|
-
qsvm,
|
13
|
-
range_types,
|
14
|
-
state_preparation,
|
15
|
-
suzuki_trotter,
|
16
|
-
)
|
17
|
-
from .standard_gates import * # noqa: F403
|
18
|
-
|
19
|
-
__all__ = (
|
20
|
-
[function.__name__ for function in function_param_library.param_list] # noqa: F405
|
21
|
-
+ [
|
22
|
-
function.__name__
|
23
|
-
for function in standard_gate_function_param_library.param_list # noqa: F405
|
24
|
-
]
|
25
|
-
+ [
|
26
|
-
function.__name__
|
27
|
-
for function in oracle_function_param_library.param_list # noqa: F405
|
28
|
-
]
|
29
|
-
+ [
|
30
|
-
"exponentiation",
|
31
|
-
"state_preparation",
|
32
|
-
"suzuki_trotter",
|
33
|
-
"range_types",
|
34
|
-
"binary_ops",
|
35
|
-
"qpe",
|
36
|
-
"amplitude_loading",
|
37
|
-
"qsvm",
|
38
|
-
]
|
39
|
-
)
|
40
|
-
|
41
|
-
|
42
|
-
def __dir__() -> List[str]:
|
43
|
-
return __all__
|
@@ -1 +0,0 @@
|
|
1
|
-
from classiq.interface.generator.arith.binary_ops import ArgToInplace # noqa: F401
|
classiq/builtin_functions/qpe.py
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
from classiq.interface.generator.standard_gates.standard_gates_param_list import * # noqa: F401, F403
|
@@ -1,22 +0,0 @@
|
|
1
|
-
from sympy import Symbol
|
2
|
-
|
3
|
-
from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
|
4
|
-
from classiq.interface.model.quantum_type import QuantumNumeric
|
5
|
-
|
6
|
-
|
7
|
-
class QmodQNumProxy(Symbol, QmodSizedProxy):
|
8
|
-
def __new__(cls, name, **assumptions):
|
9
|
-
return super().__new__(cls, name, **assumptions)
|
10
|
-
|
11
|
-
def __init__(self, name: str, quantum_type: QuantumNumeric) -> None:
|
12
|
-
super().__init__(quantum_type.size_in_bits)
|
13
|
-
self._fraction_digits = quantum_type.fraction_digits
|
14
|
-
self._is_signed = quantum_type.is_signed
|
15
|
-
|
16
|
-
@property
|
17
|
-
def fraction_digits(self) -> int:
|
18
|
-
return self._fraction_digits
|
19
|
-
|
20
|
-
@property
|
21
|
-
def is_signed(self) -> bool:
|
22
|
-
return self._is_signed
|
@@ -1,18 +0,0 @@
|
|
1
|
-
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
2
|
-
from classiq.interface.model.quantum_function_declaration import (
|
3
|
-
QuantumFunctionDeclaration,
|
4
|
-
)
|
5
|
-
|
6
|
-
from .atomic_quantum_functions import * # noqa: F403
|
7
|
-
from .exponentiation_functions import * # noqa: F403
|
8
|
-
from .std_lib_functions import * # noqa: F403
|
9
|
-
|
10
|
-
QuantumFunctionDeclaration.BUILTIN_FUNCTION_DECLARATIONS.update(
|
11
|
-
nameables_to_dict(
|
12
|
-
[
|
13
|
-
func
|
14
|
-
for func in vars().values()
|
15
|
-
if isinstance(func, QuantumFunctionDeclaration)
|
16
|
-
]
|
17
|
-
)
|
18
|
-
)
|