classiq 0.37.1__py3-none-any.whl → 0.65.3__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 +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -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 +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- 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 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- 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 +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- 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/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- 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/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- 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_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- 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/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- 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-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
classiq/interface/model/model.py
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
-
from
|
1
|
+
from collections import Counter
|
2
|
+
from collections.abc import Mapping
|
3
|
+
from typing import Any, Literal, NewType
|
2
4
|
|
3
5
|
import pydantic
|
4
6
|
|
7
|
+
from classiq.interface.ast_node import ASTNode
|
8
|
+
from classiq.interface.debug_info.debug_info import DebugInfoCollection
|
9
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
10
|
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
6
11
|
from classiq.interface.generator.constant import Constant
|
7
12
|
from classiq.interface.generator.functions.port_declaration import (
|
@@ -10,25 +15,19 @@ from classiq.interface.generator.functions.port_declaration import (
|
|
10
15
|
from classiq.interface.generator.model.constraints import Constraints
|
11
16
|
from classiq.interface.generator.model.preferences.preferences import Preferences
|
12
17
|
from classiq.interface.generator.quantum_function_call import SUFFIX_RANDOMIZER
|
13
|
-
from classiq.interface.generator.types.
|
14
|
-
|
15
|
-
|
18
|
+
from classiq.interface.generator.types.compilation_metadata import CompilationMetadata
|
19
|
+
from classiq.interface.generator.types.enum_declaration import EnumDeclaration
|
20
|
+
from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
|
16
21
|
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
17
|
-
from classiq.interface.helpers.pydantic_model_helpers import
|
18
|
-
get_discriminator_field,
|
19
|
-
nameables_to_dict,
|
20
|
-
)
|
22
|
+
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
21
23
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
22
|
-
from classiq.interface.model.native_function_definition import
|
23
|
-
|
24
|
-
from classiq.interface.model.quantum_function_declaration import (
|
25
|
-
QuantumFunctionDeclaration,
|
24
|
+
from classiq.interface.model.native_function_definition import (
|
25
|
+
NativeFunctionDefinition,
|
26
26
|
)
|
27
|
-
from classiq.interface.model.
|
28
|
-
|
27
|
+
from classiq.interface.model.quantum_function_declaration import (
|
28
|
+
NamedParamsQuantumFunctionDeclaration,
|
29
29
|
)
|
30
|
-
|
31
|
-
from classiq.exceptions import ClassiqValueError
|
30
|
+
from classiq.interface.model.statement_block import StatementBlock
|
32
31
|
|
33
32
|
USER_MODEL_MARKER = "user"
|
34
33
|
|
@@ -39,10 +38,6 @@ DEFAULT_PORT_SIZE = 1
|
|
39
38
|
|
40
39
|
SerializedModel = NewType("SerializedModel", str)
|
41
40
|
|
42
|
-
ConcreteStructDeclaration = Union[
|
43
|
-
CombinatorialOptimizationStructDeclaration, StructDeclaration
|
44
|
-
]
|
45
|
-
|
46
41
|
TYPE_NAME_CONFLICT_BUILTIN = (
|
47
42
|
"Type '{name}' conflicts with a builtin type with the same name"
|
48
43
|
)
|
@@ -60,29 +55,37 @@ class VersionedSerializedModel(VersionedModel):
|
|
60
55
|
model: SerializedModel
|
61
56
|
|
62
57
|
|
63
|
-
class Model(VersionedModel):
|
64
|
-
"""
|
65
|
-
All the relevant data for generating quantum circuit in one place.
|
66
|
-
"""
|
58
|
+
class Model(VersionedModel, ASTNode):
|
67
59
|
|
68
|
-
kind: Literal["user"] =
|
60
|
+
kind: Literal["user"] = pydantic.Field(default=USER_MODEL_MARKER)
|
69
61
|
|
70
62
|
# Must be validated before logic_flow
|
71
|
-
functions:
|
63
|
+
functions: list[NativeFunctionDefinition] = pydantic.Field(
|
72
64
|
default_factory=list,
|
73
65
|
description="The user-defined custom type library.",
|
66
|
+
validate_default=True,
|
74
67
|
)
|
75
68
|
|
76
|
-
|
69
|
+
enums: list[EnumDeclaration] = pydantic.Field(
|
77
70
|
default_factory=list,
|
78
|
-
description="
|
71
|
+
description="user-defined enums",
|
72
|
+
)
|
73
|
+
|
74
|
+
types: list[StructDeclaration] = pydantic.Field(
|
75
|
+
default_factory=list,
|
76
|
+
description="user-defined structs",
|
77
|
+
)
|
78
|
+
|
79
|
+
qstructs: list[QStructDeclaration] = pydantic.Field(
|
80
|
+
default_factory=list,
|
81
|
+
description="user-defined quantum structs",
|
79
82
|
)
|
80
83
|
|
81
84
|
classical_execution_code: str = pydantic.Field(
|
82
85
|
description="The classical execution code of the model", default=""
|
83
86
|
)
|
84
87
|
|
85
|
-
constants:
|
88
|
+
constants: list[Constant] = pydantic.Field(
|
86
89
|
default_factory=list,
|
87
90
|
)
|
88
91
|
|
@@ -93,17 +96,32 @@ class Model(VersionedModel):
|
|
93
96
|
)
|
94
97
|
preferences: Preferences = pydantic.Field(default_factory=Preferences)
|
95
98
|
|
99
|
+
debug_info: DebugInfoCollection = pydantic.Field(
|
100
|
+
default_factory=DebugInfoCollection
|
101
|
+
)
|
102
|
+
functions_compilation_metadata: dict[str, CompilationMetadata] = pydantic.Field(
|
103
|
+
default_factory=dict
|
104
|
+
)
|
105
|
+
|
96
106
|
@property
|
97
107
|
def main_func(self) -> NativeFunctionDefinition:
|
98
108
|
return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
|
99
109
|
|
100
110
|
@property
|
101
|
-
def body(self) ->
|
111
|
+
def body(self) -> StatementBlock:
|
102
112
|
return self.main_func.body
|
103
113
|
|
104
|
-
@pydantic.
|
105
|
-
|
106
|
-
|
114
|
+
@pydantic.field_validator("preferences", mode="before")
|
115
|
+
@classmethod
|
116
|
+
def _seed_suffix_randomizer(cls, preferences: Any) -> Any:
|
117
|
+
if isinstance(preferences, dict):
|
118
|
+
SUFFIX_RANDOMIZER.seed(preferences.get("random_seed"))
|
119
|
+
elif isinstance(preferences, Preferences):
|
120
|
+
SUFFIX_RANDOMIZER.seed(preferences.random_seed)
|
121
|
+
else:
|
122
|
+
raise ClassiqValueError(
|
123
|
+
f"preferences must be either a dict or a Preferences object, not {type(preferences)}"
|
124
|
+
)
|
107
125
|
return preferences
|
108
126
|
|
109
127
|
def _get_qualified_direction(
|
@@ -114,63 +132,59 @@ class Model(VersionedModel):
|
|
114
132
|
return direction
|
115
133
|
|
116
134
|
@property
|
117
|
-
def function_dict(self) ->
|
135
|
+
def function_dict(self) -> Mapping[str, NamedParamsQuantumFunctionDeclaration]:
|
118
136
|
return nameables_to_dict(self.functions)
|
119
137
|
|
120
|
-
@pydantic.
|
138
|
+
@pydantic.field_validator("functions")
|
139
|
+
@classmethod
|
121
140
|
def _add_empty_main(
|
122
|
-
cls, functions:
|
123
|
-
) ->
|
141
|
+
cls, functions: list[NativeFunctionDefinition]
|
142
|
+
) -> list[NativeFunctionDefinition]:
|
124
143
|
function_dict = nameables_to_dict(functions)
|
125
144
|
if MAIN_FUNCTION_NAME not in function_dict:
|
126
145
|
functions.append(_create_empty_main_function())
|
127
146
|
return functions
|
128
147
|
|
129
|
-
@pydantic.root_validator()
|
130
|
-
def validate_static_correctness(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
131
|
-
functions: Optional[List[QuantumFunctionDeclaration]] = values.get("functions")
|
132
|
-
if functions is None:
|
133
|
-
return values
|
134
|
-
|
135
|
-
resolve_function_calls(
|
136
|
-
values,
|
137
|
-
nameables_to_dict(functions),
|
138
|
-
)
|
139
|
-
for func_def in functions:
|
140
|
-
if isinstance(func_def, NativeFunctionDefinition):
|
141
|
-
func_def.validate_body()
|
142
|
-
return values
|
143
|
-
|
144
|
-
@pydantic.validator("types")
|
145
|
-
def types_validator(
|
146
|
-
cls, types: List[ConcreteStructDeclaration]
|
147
|
-
) -> List[ConcreteStructDeclaration]:
|
148
|
-
user_defined_types: Set[str] = set()
|
149
|
-
for ctype in types:
|
150
|
-
if ctype.name in StructDeclaration.BUILTIN_STRUCT_DECLARATIONS:
|
151
|
-
raise ValueError(TYPE_NAME_CONFLICT_BUILTIN.format(name=ctype.name))
|
152
|
-
if ctype.name in user_defined_types:
|
153
|
-
raise ValueError(TYPE_NAME_CONFLICT_USER.format(name=ctype.name))
|
154
|
-
user_defined_types.add(ctype.name)
|
155
|
-
|
156
|
-
return types
|
157
|
-
|
158
148
|
def get_model(self) -> SerializedModel:
|
159
|
-
return SerializedModel(
|
160
|
-
self.json(exclude_defaults=True, exclude_unset=True, indent=2)
|
161
|
-
)
|
149
|
+
return SerializedModel(self.model_dump_json(indent=2))
|
162
150
|
|
163
|
-
@pydantic.
|
151
|
+
@pydantic.field_validator("functions")
|
152
|
+
@classmethod
|
164
153
|
def _validate_entry_point(
|
165
|
-
cls, functions:
|
166
|
-
) ->
|
154
|
+
cls, functions: list[NativeFunctionDefinition]
|
155
|
+
) -> list[NativeFunctionDefinition]:
|
167
156
|
function_dict = nameables_to_dict(functions)
|
168
157
|
if MAIN_FUNCTION_NAME not in function_dict:
|
169
158
|
raise ClassiqValueError("The model must contain a `main` function")
|
170
159
|
if any(
|
171
160
|
pd.direction != PortDeclarationDirection.Output
|
172
|
-
for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations
|
161
|
+
for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations
|
173
162
|
):
|
174
163
|
raise ClassiqValueError("Function 'main' cannot declare quantum inputs")
|
175
164
|
|
176
165
|
return functions
|
166
|
+
|
167
|
+
@pydantic.field_validator("constants")
|
168
|
+
@classmethod
|
169
|
+
def _validate_constants(cls, constants: list[Constant]) -> list[Constant]:
|
170
|
+
constant_definition_counts = Counter(
|
171
|
+
[constant.name for constant in constants]
|
172
|
+
).items()
|
173
|
+
multiply_defined_constants = {
|
174
|
+
constant for constant, count in constant_definition_counts if count > 1
|
175
|
+
}
|
176
|
+
if len(multiply_defined_constants) > 0:
|
177
|
+
raise ClassiqValueError(
|
178
|
+
f"The following constants were defined more than once: "
|
179
|
+
f"{multiply_defined_constants}"
|
180
|
+
)
|
181
|
+
return constants
|
182
|
+
|
183
|
+
def dump_no_preferences_and_constraints(self) -> dict[str, Any]:
|
184
|
+
return self.model_dump(
|
185
|
+
exclude={
|
186
|
+
"constraints",
|
187
|
+
"execution_preferences",
|
188
|
+
"preferences",
|
189
|
+
},
|
190
|
+
)
|
@@ -1,20 +1,23 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import TYPE_CHECKING
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
|
5
|
-
from classiq.interface.model.quantum_function_call import ConcreteQuantumStatement
|
6
5
|
from classiq.interface.model.quantum_function_declaration import (
|
7
|
-
|
8
|
-
)
|
9
|
-
from classiq.interface.model.validations.handles_validator import HandleValidator
|
10
|
-
from classiq.interface.model.variable_declaration_statement import (
|
11
|
-
VariableDeclarationStatement,
|
6
|
+
NamedParamsQuantumFunctionDeclaration,
|
12
7
|
)
|
13
8
|
|
14
|
-
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
from classiq.interface.model.statement_block import StatementBlock
|
11
|
+
|
12
|
+
|
13
|
+
class FunctionSynthesisData(pydantic.BaseModel):
|
14
|
+
should_synthesize_separately: bool = pydantic.Field(
|
15
|
+
default=False,
|
16
|
+
description="Whether the function should be synthesized separately.",
|
17
|
+
)
|
15
18
|
|
16
19
|
|
17
|
-
class NativeFunctionDefinition(
|
20
|
+
class NativeFunctionDefinition(NamedParamsQuantumFunctionDeclaration):
|
18
21
|
"""
|
19
22
|
Facilitates the creation of a user-defined composite function
|
20
23
|
|
@@ -22,17 +25,9 @@ class NativeFunctionDefinition(QuantumFunctionDeclaration):
|
|
22
25
|
objects from other classes.
|
23
26
|
"""
|
24
27
|
|
25
|
-
body:
|
28
|
+
body: "StatementBlock" = pydantic.Field(
|
26
29
|
default_factory=list, description="List of function calls to perform."
|
27
30
|
)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
for statement in self.body:
|
33
|
-
if isinstance(statement, VariableDeclarationStatement):
|
34
|
-
handle_validator.handle_variable_declaration(statement)
|
35
|
-
else:
|
36
|
-
handle_validator.handle_call(statement)
|
37
|
-
|
38
|
-
handle_validator.report_errored_handles(ClassiqValueError)
|
31
|
+
synthesis_data: FunctionSynthesisData = pydantic.Field(
|
32
|
+
default_factory=FunctionSynthesisData, deprecated=True, exclude=True
|
33
|
+
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from classiq.interface.ast_node import ASTNode
|
4
|
+
from classiq.interface.exceptions import ClassiqError
|
5
|
+
|
6
|
+
|
7
|
+
class Parameter(ASTNode):
|
8
|
+
name: Optional[str]
|
9
|
+
|
10
|
+
def get_name(self) -> str:
|
11
|
+
if self.name is None:
|
12
|
+
raise ClassiqError("Cannot resolve parameter name")
|
13
|
+
return self.name
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from typing import Literal
|
2
|
+
|
3
|
+
from classiq.interface.generator.expressions.expression import Expression
|
4
|
+
from classiq.interface.model.quantum_expressions.quantum_expression import (
|
5
|
+
QuantumExpressionOperation,
|
6
|
+
)
|
7
|
+
|
8
|
+
|
9
|
+
class PhaseOperation(QuantumExpressionOperation):
|
10
|
+
kind: Literal["PhaseOperation"]
|
11
|
+
theta: Expression
|
@@ -1,27 +1,45 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Literal
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic_core.core_schema import ValidationInfo
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqInternalError, ClassiqValueError
|
7
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
|
5
8
|
from classiq.interface.generator.functions.port_declaration import (
|
6
9
|
PortDeclarationDirection,
|
7
10
|
)
|
8
|
-
from classiq.interface.
|
9
|
-
|
10
|
-
)
|
11
|
-
|
12
|
-
from classiq.exceptions import ClassiqValueError
|
11
|
+
from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
|
12
|
+
from classiq.interface.model.parameter import Parameter
|
13
13
|
|
14
14
|
|
15
|
-
class
|
15
|
+
class AnonPortDeclaration(Parameter):
|
16
|
+
quantum_type: ConcreteQuantumType
|
16
17
|
direction: PortDeclarationDirection
|
18
|
+
kind: Literal["PortDeclaration"]
|
19
|
+
|
20
|
+
@pydantic.model_validator(mode="before")
|
21
|
+
@classmethod
|
22
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
23
|
+
return values_with_discriminator(values, "kind", "PortDeclaration")
|
17
24
|
|
18
|
-
@pydantic.
|
25
|
+
@pydantic.field_validator("direction", mode="before")
|
26
|
+
@classmethod
|
19
27
|
def _direction_validator(
|
20
|
-
cls, direction: PortDeclarationDirection,
|
28
|
+
cls, direction: PortDeclarationDirection, info: ValidationInfo
|
21
29
|
) -> PortDeclarationDirection:
|
30
|
+
values = info.data
|
22
31
|
if direction is PortDeclarationDirection.Output:
|
23
32
|
quantum_type = values.get("quantum_type")
|
24
33
|
if quantum_type is None:
|
25
34
|
raise ClassiqValueError("Port declaration is missing a type")
|
26
35
|
|
27
36
|
return direction
|
37
|
+
|
38
|
+
def rename(self, new_name: str) -> "PortDeclaration":
|
39
|
+
if type(self) not in (AnonPortDeclaration, PortDeclaration):
|
40
|
+
raise ClassiqInternalError
|
41
|
+
return PortDeclaration(**{**self.__dict__, "name": new_name})
|
42
|
+
|
43
|
+
|
44
|
+
class PortDeclaration(AnonPortDeclaration):
|
45
|
+
name: str
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from typing import TYPE_CHECKING, Literal
|
2
|
+
|
3
|
+
from classiq.interface.generator.expressions.expression import Expression
|
4
|
+
from classiq.interface.model.quantum_statement import QuantumOperation
|
5
|
+
|
6
|
+
if TYPE_CHECKING:
|
7
|
+
from classiq.interface.model.statement_block import StatementBlock
|
8
|
+
|
9
|
+
|
10
|
+
class Power(QuantumOperation):
|
11
|
+
kind: Literal["Power"]
|
12
|
+
|
13
|
+
power: Expression
|
14
|
+
body: "StatementBlock"
|
@@ -1,58 +1,75 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Mapping, Sequence
|
2
|
+
from typing import Literal
|
2
3
|
|
3
4
|
import pydantic
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.amplitude_loading import (
|
6
8
|
AMPLITUDE_IO_NAME,
|
7
9
|
TARGET_OUTPUT_NAME,
|
8
10
|
)
|
9
11
|
from classiq.interface.model.handle_binding import (
|
12
|
+
ConcreteHandleBinding,
|
10
13
|
HandleBinding,
|
11
|
-
SlicedHandleBinding,
|
12
|
-
SubscriptHandleBinding,
|
13
14
|
)
|
14
15
|
from classiq.interface.model.quantum_expressions.quantum_expression import (
|
15
16
|
QuantumAssignmentOperation,
|
16
17
|
)
|
18
|
+
from classiq.interface.model.quantum_statement import HandleMetadata
|
17
19
|
from classiq.interface.model.quantum_type import QuantumBit, QuantumNumeric, QuantumType
|
18
20
|
|
19
|
-
from classiq.exceptions import ClassiqValueError
|
20
|
-
|
21
21
|
MULTI_VARS_UNSUPPORTED_ERROR = (
|
22
22
|
"Amplitude Loading with more than one input variable is unsupported."
|
23
23
|
)
|
24
24
|
|
25
|
-
|
26
|
-
"Amplitude Loading input variable should be a fixed-point number between 0 and 1"
|
27
|
-
)
|
25
|
+
VAR_TYPE_ILLEGAL = "Amplitude Loading input variable should be a quantum numeric"
|
28
26
|
|
29
27
|
|
30
28
|
class AmplitudeLoadingOperation(QuantumAssignmentOperation):
|
29
|
+
kind: Literal["AmplitudeLoadingOperation"]
|
30
|
+
|
31
31
|
_result_type: QuantumType = pydantic.PrivateAttr(default_factory=QuantumBit)
|
32
32
|
|
33
33
|
@property
|
34
34
|
def wiring_inouts(
|
35
35
|
self,
|
36
|
-
) -> Mapping[
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
) -> Mapping[str, ConcreteHandleBinding]:
|
37
|
+
inouts = {self.result_name(): self.result_var}
|
38
|
+
if len(self.var_handles) == 1:
|
39
|
+
inouts[AMPLITUDE_IO_NAME] = self.var_handles[0]
|
40
|
+
return inouts
|
41
|
+
|
42
|
+
@property
|
43
|
+
def readable_inouts(self) -> Sequence[HandleMetadata]:
|
44
|
+
inouts = [
|
45
|
+
HandleMetadata(
|
46
|
+
handle=self.result_var,
|
47
|
+
readable_location="on the left-hand side of an in-place assignment",
|
48
|
+
)
|
49
|
+
]
|
50
|
+
if len(self.var_handles) == 1:
|
51
|
+
inouts.append(
|
52
|
+
HandleMetadata(
|
53
|
+
handle=self.var_handles[0],
|
54
|
+
readable_location="in an expression",
|
55
|
+
)
|
56
|
+
)
|
57
|
+
return inouts
|
58
|
+
|
59
|
+
@property
|
60
|
+
def wiring_outputs(self) -> Mapping[str, HandleBinding]:
|
61
|
+
return {}
|
42
62
|
|
43
63
|
def initialize_var_types(
|
44
64
|
self,
|
45
|
-
var_types:
|
65
|
+
var_types: dict[str, QuantumType],
|
46
66
|
machine_precision: int,
|
47
67
|
) -> None:
|
48
68
|
if len(var_types) != 1:
|
49
69
|
raise ClassiqValueError(MULTI_VARS_UNSUPPORTED_ERROR)
|
50
|
-
var_type = var_types
|
51
|
-
if not (
|
52
|
-
|
53
|
-
and var_type.fraction_digits == var_type.size_in_bits
|
54
|
-
):
|
55
|
-
raise ClassiqValueError(VAR_DOMAIN_ILLEGAL)
|
70
|
+
var_type = list(var_types.values())[0]
|
71
|
+
if not isinstance(var_type, QuantumNumeric):
|
72
|
+
raise ClassiqValueError(VAR_TYPE_ILLEGAL)
|
56
73
|
super().initialize_var_types(var_types, machine_precision)
|
57
74
|
|
58
75
|
@classmethod
|
@@ -1,30 +1,43 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
import pydantic
|
1
|
+
from collections.abc import Mapping, Sequence
|
2
|
+
from typing import Literal
|
4
3
|
|
4
|
+
from classiq.interface.enum_utils import StrEnum
|
5
5
|
from classiq.interface.generator.arith.arithmetic import (
|
6
6
|
ARITHMETIC_EXPRESSION_RESULT_NAME,
|
7
7
|
compute_arithmetic_result_type,
|
8
8
|
)
|
9
9
|
from classiq.interface.model.handle_binding import (
|
10
|
+
ConcreteHandleBinding,
|
10
11
|
HandleBinding,
|
11
|
-
SlicedHandleBinding,
|
12
|
-
SubscriptHandleBinding,
|
13
12
|
)
|
14
13
|
from classiq.interface.model.quantum_expressions.quantum_expression import (
|
15
14
|
QuantumAssignmentOperation,
|
16
15
|
)
|
16
|
+
from classiq.interface.model.quantum_statement import HandleMetadata
|
17
17
|
from classiq.interface.model.quantum_type import QuantumType
|
18
18
|
|
19
19
|
|
20
|
+
class ArithmeticOperationKind(StrEnum):
|
21
|
+
InplaceAdd = "inplace_add"
|
22
|
+
Assignment = "assignment"
|
23
|
+
InplaceXor = "inplace_xor"
|
24
|
+
|
25
|
+
|
20
26
|
class ArithmeticOperation(QuantumAssignmentOperation):
|
21
|
-
|
22
|
-
|
23
|
-
|
27
|
+
kind: Literal["ArithmeticOperation"]
|
28
|
+
|
29
|
+
operation_kind: ArithmeticOperationKind
|
30
|
+
|
31
|
+
@property
|
32
|
+
def is_inplace(self) -> bool:
|
33
|
+
return self.operation_kind in (
|
34
|
+
ArithmeticOperationKind.InplaceXor,
|
35
|
+
ArithmeticOperationKind.InplaceAdd,
|
36
|
+
)
|
24
37
|
|
25
38
|
def initialize_var_types(
|
26
39
|
self,
|
27
|
-
var_types:
|
40
|
+
var_types: dict[str, QuantumType],
|
28
41
|
machine_precision: int,
|
29
42
|
) -> None:
|
30
43
|
super().initialize_var_types(var_types, machine_precision)
|
@@ -35,20 +48,44 @@ class ArithmeticOperation(QuantumAssignmentOperation):
|
|
35
48
|
@property
|
36
49
|
def wiring_inouts(
|
37
50
|
self,
|
38
|
-
) -> Mapping[
|
39
|
-
str, Union[SlicedHandleBinding, SubscriptHandleBinding, HandleBinding]
|
40
|
-
]:
|
51
|
+
) -> Mapping[str, ConcreteHandleBinding]:
|
41
52
|
inouts = dict(super().wiring_inouts)
|
42
|
-
if self.
|
53
|
+
if self.is_inplace:
|
43
54
|
inouts[self.result_name()] = self.result_var
|
44
55
|
return inouts
|
45
56
|
|
57
|
+
@property
|
58
|
+
def readable_inouts(self) -> Sequence[HandleMetadata]:
|
59
|
+
inouts = [
|
60
|
+
HandleMetadata(handle=handle, readable_location="in an expression")
|
61
|
+
for handle in self.var_handles
|
62
|
+
]
|
63
|
+
if self.is_inplace:
|
64
|
+
inouts.append(
|
65
|
+
HandleMetadata(
|
66
|
+
handle=self.result_var,
|
67
|
+
readable_location="on the left-hand side of an in-place assignment",
|
68
|
+
)
|
69
|
+
)
|
70
|
+
return inouts
|
71
|
+
|
46
72
|
@property
|
47
73
|
def wiring_outputs(self) -> Mapping[str, HandleBinding]:
|
48
|
-
if self.
|
74
|
+
if self.is_inplace:
|
49
75
|
return {}
|
50
76
|
return super().wiring_outputs
|
51
77
|
|
78
|
+
@property
|
79
|
+
def readable_outputs(self) -> Sequence[HandleMetadata]:
|
80
|
+
if self.is_inplace:
|
81
|
+
return []
|
82
|
+
return [
|
83
|
+
HandleMetadata(
|
84
|
+
handle=self.result_var,
|
85
|
+
readable_location="on the left-hand side of an assignment",
|
86
|
+
)
|
87
|
+
]
|
88
|
+
|
52
89
|
@classmethod
|
53
90
|
def result_name(cls) -> str:
|
54
91
|
return ARITHMETIC_EXPRESSION_RESULT_NAME
|