classiq 0.38.0__py3-none-any.whl → 0.65.4__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 +47 -32
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
- classiq/_internals/api_wrapper.py +235 -97
- classiq/_internals/async_utils.py +1 -3
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +10 -5
- classiq/_internals/authentication/password_manager.py +18 -6
- classiq/_internals/authentication/token_manager.py +10 -5
- classiq/_internals/client.py +94 -33
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +60 -57
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +24 -19
- classiq/analyzer/analyzer_utilities.py +10 -10
- classiq/analyzer/rb.py +15 -15
- classiq/analyzer/show_interactive_hack.py +27 -4
- 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 +165 -158
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
- classiq/applications/combinatorial_optimization/__init__.py +20 -6
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
- 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 +48 -42
- classiq/applications/grover/__init__.py +9 -0
- classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +6 -6
- 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 +1 -1
- 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 +5 -5
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +3 -6
- classiq/applications/qsvm/qsvm_data_generation.py +3 -3
- 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 +20 -115
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +43 -13
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +28 -32
- classiq/interface/applications/qsvm.py +20 -29
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -121
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +25 -22
- classiq/interface/backend/quantum_backend_providers.py +69 -16
- classiq/interface/chemistry/fermionic_operator.py +30 -21
- classiq/interface/chemistry/ground_state_problem.py +28 -25
- classiq/interface/chemistry/molecule.py +14 -10
- classiq/interface/chemistry/operator.py +64 -231
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
- 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/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -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/debug_info.py +86 -0
- classiq/{exceptions.py → interface/exceptions.py} +37 -9
- 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/execution_preferences.py +26 -114
- classiq/interface/executor/execution_request.py +24 -46
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +17 -14
- classiq/interface/executor/quantum_code.py +28 -24
- classiq/interface/executor/quantum_instruction_set.py +2 -2
- classiq/interface/executor/register_initialization.py +11 -14
- classiq/interface/executor/result.py +83 -56
- classiq/interface/executor/vqe_result.py +10 -10
- classiq/interface/finance/function_input.py +35 -25
- classiq/interface/finance/gaussian_model_input.py +5 -5
- classiq/interface/finance/log_normal_model_input.py +4 -4
- classiq/interface/finance/model_input.py +4 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +22 -12
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
- 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 +46 -5
- classiq/interface/generator/arith/arithmetic.py +35 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
- classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
- classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
- classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
- classiq/interface/generator/arith/arithmetic_operations.py +14 -6
- 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 +3 -2
- classiq/interface/generator/arith/binary_ops.py +218 -130
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -25
- classiq/interface/generator/arith/logical_ops.py +14 -12
- classiq/interface/generator/arith/number_utils.py +12 -6
- classiq/interface/generator/arith/register_user_input.py +60 -37
- classiq/interface/generator/arith/unary_ops.py +49 -29
- 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 +3 -3
- 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 +7 -7
- classiq/interface/generator/compiler_keywords.py +5 -1
- classiq/interface/generator/complex_type.py +13 -18
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +34 -29
- 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 +21 -5
- 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 +5 -5
- classiq/interface/generator/expressions/expression.py +26 -14
- 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 +34 -8
- 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 +19 -11
- classiq/interface/generator/finance.py +2 -2
- 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 +36 -64
- classiq/interface/generator/functions/__init__.py +0 -22
- 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 +153 -20
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -25
- 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 +9 -9
- classiq/interface/generator/hardware/hardware_data.py +72 -34
- classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
- classiq/interface/generator/hartree_fock.py +13 -5
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +32 -20
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +17 -15
- classiq/interface/generator/mcx.py +24 -17
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +26 -8
- classiq/interface/generator/model/model.py +27 -190
- classiq/interface/generator/model/preferences/preferences.py +115 -41
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +15 -13
- classiq/interface/generator/oracles/oracle_abc.py +7 -7
- 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 +41 -30
- classiq/interface/generator/qsvm.py +9 -10
- classiq/interface/generator/quantum_function_call.py +88 -73
- classiq/interface/generator/quantum_program.py +41 -24
- classiq/interface/generator/range_types.py +11 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +5 -5
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -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 +4 -7
- classiq/interface/generator/state_preparation/state_preparation.py +25 -20
- 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 +7 -11
- classiq/interface/generator/ucc.py +5 -4
- classiq/interface/generator/unitary_gate.py +5 -5
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +7 -7
- classiq/interface/generator/validations/validator_functions.py +4 -4
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +29 -8
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +2 -2
- 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 -5
- classiq/interface/helpers/validation_helpers.py +3 -20
- classiq/interface/helpers/versioned_model.py +1 -4
- 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 +29 -69
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +32 -9
- 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 +29 -24
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +69 -61
- classiq/interface/model/native_function_definition.py +17 -20
- 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 +30 -18
- 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 +141 -343
- classiq/interface/model/quantum_function_declaration.py +190 -157
- classiq/interface/model/quantum_lambda_function.py +33 -32
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +177 -40
- classiq/interface/model/quantum_variable_declaration.py +3 -25
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +40 -14
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +7 -5
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +17 -21
- classiq/interface/source_reference.py +59 -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 +10 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +36 -14
- classiq/qmod/builtins/classical_functions.py +39 -43
- 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 +373 -40
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +2 -2
- classiq/qmod/classical_function.py +4 -8
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +143 -101
- classiq/qmod/expression_query.py +20 -4
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +18 -6
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +16 -11
- classiq/qmod/native/pretty_printer.py +187 -97
- 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 +60 -8
- classiq/qmod/qmod_constant.py +93 -26
- classiq/qmod/qmod_parameter.py +68 -59
- classiq/qmod/qmod_variable.py +468 -155
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +269 -96
- classiq/qmod/quantum_function.py +196 -41
- 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 +147 -123
- classiq/qmod/symbolic_expr.py +27 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +98 -4
- classiq/qmod/write_qmod.py +17 -3
- classiq/synthesis.py +210 -22
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
- classiq-0.65.4.dist-info/RECORD +521 -0
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -25
- classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
- classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
- classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
- 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/executor/aws_execution_cost.py +0 -73
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
- 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/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 -1229
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
- classiq/interface/generator/functions/foreign_function_definition.py +0 -114
- classiq/interface/generator/functions/function_implementation.py +0 -107
- classiq/interface/generator/functions/native_function_definition.py +0 -155
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -44
- classiq/interface/generator/functions/register_mapping_data.py +0 -106
- 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 -74
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/call_synthesis_data.py +0 -68
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -94
- 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 -156
- 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 -462
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -229
- classiq/qmod/builtins/functions.py +0 -913
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -205
- 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.38.0.dist-info/RECORD +0 -454
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
- /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
- /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
- /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
classiq/interface/model/model.py
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
from collections import Counter
|
2
|
-
from
|
2
|
+
from collections.abc import Mapping
|
3
|
+
from typing import Any, Literal, NewType
|
3
4
|
|
4
5
|
import pydantic
|
5
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
|
6
10
|
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
7
11
|
from classiq.interface.generator.constant import Constant
|
8
12
|
from classiq.interface.generator.functions.port_declaration import (
|
@@ -11,20 +15,20 @@ from classiq.interface.generator.functions.port_declaration import (
|
|
11
15
|
from classiq.interface.generator.model.constraints import Constraints
|
12
16
|
from classiq.interface.generator.model.preferences.preferences import Preferences
|
13
17
|
from classiq.interface.generator.quantum_function_call import SUFFIX_RANDOMIZER
|
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
|
14
21
|
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
15
22
|
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
16
23
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
17
|
-
from classiq.interface.model.native_function_definition import
|
18
|
-
|
19
|
-
QuantumFunctionDeclaration,
|
24
|
+
from classiq.interface.model.native_function_definition import (
|
25
|
+
NativeFunctionDefinition,
|
20
26
|
)
|
21
|
-
from classiq.interface.model.
|
22
|
-
|
27
|
+
from classiq.interface.model.quantum_function_declaration import (
|
28
|
+
NamedParamsQuantumFunctionDeclaration,
|
23
29
|
)
|
24
30
|
from classiq.interface.model.statement_block import StatementBlock
|
25
31
|
|
26
|
-
from classiq.exceptions import ClassiqValueError
|
27
|
-
|
28
32
|
USER_MODEL_MARKER = "user"
|
29
33
|
|
30
34
|
MAIN_FUNCTION_NAME = "main"
|
@@ -51,29 +55,37 @@ class VersionedSerializedModel(VersionedModel):
|
|
51
55
|
model: SerializedModel
|
52
56
|
|
53
57
|
|
54
|
-
class Model(VersionedModel):
|
55
|
-
"""
|
56
|
-
All the relevant data for generating quantum circuit in one place.
|
57
|
-
"""
|
58
|
+
class Model(VersionedModel, ASTNode):
|
58
59
|
|
59
60
|
kind: Literal["user"] = pydantic.Field(default=USER_MODEL_MARKER)
|
60
61
|
|
61
62
|
# Must be validated before logic_flow
|
62
|
-
functions:
|
63
|
+
functions: list[NativeFunctionDefinition] = pydantic.Field(
|
63
64
|
default_factory=list,
|
64
65
|
description="The user-defined custom type library.",
|
66
|
+
validate_default=True,
|
67
|
+
)
|
68
|
+
|
69
|
+
enums: list[EnumDeclaration] = pydantic.Field(
|
70
|
+
default_factory=list,
|
71
|
+
description="user-defined enums",
|
65
72
|
)
|
66
73
|
|
67
|
-
types:
|
74
|
+
types: list[StructDeclaration] = pydantic.Field(
|
68
75
|
default_factory=list,
|
69
|
-
description="
|
76
|
+
description="user-defined structs",
|
77
|
+
)
|
78
|
+
|
79
|
+
qstructs: list[QStructDeclaration] = pydantic.Field(
|
80
|
+
default_factory=list,
|
81
|
+
description="user-defined quantum structs",
|
70
82
|
)
|
71
83
|
|
72
84
|
classical_execution_code: str = pydantic.Field(
|
73
85
|
description="The classical execution code of the model", default=""
|
74
86
|
)
|
75
87
|
|
76
|
-
constants:
|
88
|
+
constants: list[Constant] = pydantic.Field(
|
77
89
|
default_factory=list,
|
78
90
|
)
|
79
91
|
|
@@ -84,6 +96,13 @@ class Model(VersionedModel):
|
|
84
96
|
)
|
85
97
|
preferences: Preferences = pydantic.Field(default_factory=Preferences)
|
86
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
|
+
|
87
106
|
@property
|
88
107
|
def main_func(self) -> NativeFunctionDefinition:
|
89
108
|
return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
|
@@ -92,9 +111,17 @@ class Model(VersionedModel):
|
|
92
111
|
def body(self) -> StatementBlock:
|
93
112
|
return self.main_func.body
|
94
113
|
|
95
|
-
@pydantic.
|
96
|
-
|
97
|
-
|
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
|
+
)
|
98
125
|
return preferences
|
99
126
|
|
100
127
|
def _get_qualified_direction(
|
@@ -105,69 +132,41 @@ class Model(VersionedModel):
|
|
105
132
|
return direction
|
106
133
|
|
107
134
|
@property
|
108
|
-
def function_dict(self) ->
|
135
|
+
def function_dict(self) -> Mapping[str, NamedParamsQuantumFunctionDeclaration]:
|
109
136
|
return nameables_to_dict(self.functions)
|
110
137
|
|
111
|
-
@pydantic.
|
138
|
+
@pydantic.field_validator("functions")
|
139
|
+
@classmethod
|
112
140
|
def _add_empty_main(
|
113
|
-
cls, functions:
|
114
|
-
) ->
|
141
|
+
cls, functions: list[NativeFunctionDefinition]
|
142
|
+
) -> list[NativeFunctionDefinition]:
|
115
143
|
function_dict = nameables_to_dict(functions)
|
116
144
|
if MAIN_FUNCTION_NAME not in function_dict:
|
117
145
|
functions.append(_create_empty_main_function())
|
118
146
|
return functions
|
119
147
|
|
120
|
-
@pydantic.root_validator()
|
121
|
-
def validate_static_correctness(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
122
|
-
functions: Optional[List[QuantumFunctionDeclaration]] = values.get("functions")
|
123
|
-
if functions is None:
|
124
|
-
return values
|
125
|
-
|
126
|
-
resolve_function_calls(
|
127
|
-
values,
|
128
|
-
nameables_to_dict(functions),
|
129
|
-
)
|
130
|
-
for func_def in functions:
|
131
|
-
if isinstance(func_def, NativeFunctionDefinition):
|
132
|
-
func_def.validate_body()
|
133
|
-
return values
|
134
|
-
|
135
|
-
@pydantic.validator("types")
|
136
|
-
def types_validator(cls, types: List[StructDeclaration]) -> List[StructDeclaration]:
|
137
|
-
user_defined_types: Set[str] = set()
|
138
|
-
for ctype in types:
|
139
|
-
if ctype.name in StructDeclaration.BUILTIN_STRUCT_DECLARATIONS:
|
140
|
-
raise ClassiqValueError(
|
141
|
-
TYPE_NAME_CONFLICT_BUILTIN.format(name=ctype.name)
|
142
|
-
)
|
143
|
-
if ctype.name in user_defined_types:
|
144
|
-
raise ClassiqValueError(TYPE_NAME_CONFLICT_USER.format(name=ctype.name))
|
145
|
-
user_defined_types.add(ctype.name)
|
146
|
-
|
147
|
-
return types
|
148
|
-
|
149
148
|
def get_model(self) -> SerializedModel:
|
150
|
-
return SerializedModel(
|
151
|
-
self.json(exclude_defaults=True, exclude_unset=True, indent=2)
|
152
|
-
)
|
149
|
+
return SerializedModel(self.model_dump_json(indent=2))
|
153
150
|
|
154
|
-
@pydantic.
|
151
|
+
@pydantic.field_validator("functions")
|
152
|
+
@classmethod
|
155
153
|
def _validate_entry_point(
|
156
|
-
cls, functions:
|
157
|
-
) ->
|
154
|
+
cls, functions: list[NativeFunctionDefinition]
|
155
|
+
) -> list[NativeFunctionDefinition]:
|
158
156
|
function_dict = nameables_to_dict(functions)
|
159
157
|
if MAIN_FUNCTION_NAME not in function_dict:
|
160
158
|
raise ClassiqValueError("The model must contain a `main` function")
|
161
159
|
if any(
|
162
160
|
pd.direction != PortDeclarationDirection.Output
|
163
|
-
for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations
|
161
|
+
for pd in function_dict[MAIN_FUNCTION_NAME].port_declarations
|
164
162
|
):
|
165
163
|
raise ClassiqValueError("Function 'main' cannot declare quantum inputs")
|
166
164
|
|
167
165
|
return functions
|
168
166
|
|
169
|
-
@pydantic.
|
170
|
-
|
167
|
+
@pydantic.field_validator("constants")
|
168
|
+
@classmethod
|
169
|
+
def _validate_constants(cls, constants: list[Constant]) -> list[Constant]:
|
171
170
|
constant_definition_counts = Counter(
|
172
171
|
[constant.name for constant in constants]
|
173
172
|
).items()
|
@@ -180,3 +179,12 @@ class Model(VersionedModel):
|
|
180
179
|
f"{multiply_defined_constants}"
|
181
180
|
)
|
182
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,18 +1,23 @@
|
|
1
|
+
from typing import TYPE_CHECKING
|
2
|
+
|
1
3
|
import pydantic
|
2
4
|
|
3
5
|
from classiq.interface.model.quantum_function_declaration import (
|
4
|
-
|
5
|
-
)
|
6
|
-
from classiq.interface.model.statement_block import StatementBlock
|
7
|
-
from classiq.interface.model.validations.handles_validator import HandleValidator
|
8
|
-
from classiq.interface.model.variable_declaration_statement import (
|
9
|
-
VariableDeclarationStatement,
|
6
|
+
NamedParamsQuantumFunctionDeclaration,
|
10
7
|
)
|
11
8
|
|
12
|
-
|
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
|
+
)
|
13
18
|
|
14
19
|
|
15
|
-
class NativeFunctionDefinition(
|
20
|
+
class NativeFunctionDefinition(NamedParamsQuantumFunctionDeclaration):
|
16
21
|
"""
|
17
22
|
Facilitates the creation of a user-defined composite function
|
18
23
|
|
@@ -20,17 +25,9 @@ class NativeFunctionDefinition(QuantumFunctionDeclaration):
|
|
20
25
|
objects from other classes.
|
21
26
|
"""
|
22
27
|
|
23
|
-
body: StatementBlock = pydantic.Field(
|
28
|
+
body: "StatementBlock" = pydantic.Field(
|
24
29
|
default_factory=list, description="List of function calls to perform."
|
25
30
|
)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
for statement in self.body:
|
31
|
-
if isinstance(statement, VariableDeclarationStatement):
|
32
|
-
handle_validator.handle_variable_declaration(statement)
|
33
|
-
else:
|
34
|
-
handle_validator.handle_operation(statement)
|
35
|
-
|
36
|
-
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,63 +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
|
-
str, Union[SlicedHandleBinding, SubscriptHandleBinding, HandleBinding]
|
38
|
-
]:
|
36
|
+
) -> Mapping[str, ConcreteHandleBinding]:
|
39
37
|
inouts = {self.result_name(): self.result_var}
|
40
38
|
if len(self.var_handles) == 1:
|
41
39
|
inouts[AMPLITUDE_IO_NAME] = self.var_handles[0]
|
42
40
|
return inouts
|
43
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
|
+
|
44
59
|
@property
|
45
60
|
def wiring_outputs(self) -> Mapping[str, HandleBinding]:
|
46
61
|
return {}
|
47
62
|
|
48
63
|
def initialize_var_types(
|
49
64
|
self,
|
50
|
-
var_types:
|
65
|
+
var_types: dict[str, QuantumType],
|
51
66
|
machine_precision: int,
|
52
67
|
) -> None:
|
53
68
|
if len(var_types) != 1:
|
54
69
|
raise ClassiqValueError(MULTI_VARS_UNSUPPORTED_ERROR)
|
55
|
-
var_type = var_types
|
56
|
-
if not (
|
57
|
-
|
58
|
-
and var_type.fraction_digits_value == var_type.size_in_bits
|
59
|
-
):
|
60
|
-
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)
|
61
73
|
super().initialize_var_types(var_types, machine_precision)
|
62
74
|
|
63
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
|
@@ -1,77 +1,54 @@
|
|
1
1
|
import abc
|
2
|
-
import
|
3
|
-
from typing import
|
2
|
+
from collections.abc import Mapping
|
3
|
+
from typing import Optional
|
4
4
|
|
5
5
|
import pydantic
|
6
6
|
|
7
|
-
from classiq.interface.generator.arith.arithmetic_expression_validator import (
|
8
|
-
DEFAULT_SUPPORTED_FUNC_NAMES,
|
9
|
-
)
|
10
7
|
from classiq.interface.generator.expressions.expression import Expression
|
11
|
-
from classiq.interface.generator.expressions.sympy_supported_expressions import (
|
12
|
-
SYMPY_SUPPORTED_EXPRESSIONS,
|
13
|
-
)
|
14
8
|
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
15
9
|
from classiq.interface.model.handle_binding import (
|
10
|
+
ConcreteHandleBinding,
|
16
11
|
HandleBinding,
|
17
|
-
SlicedHandleBinding,
|
18
|
-
SubscriptHandleBinding,
|
19
12
|
)
|
20
13
|
from classiq.interface.model.quantum_statement import QuantumOperation
|
21
14
|
from classiq.interface.model.quantum_type import QuantumType
|
22
15
|
|
23
16
|
|
24
|
-
class VarRefCollector(ast.NodeVisitor):
|
25
|
-
def __init__(self) -> None:
|
26
|
-
self.var_names: Set[str] = set()
|
27
|
-
|
28
|
-
def generic_visit(self, node: ast.AST) -> None:
|
29
|
-
if isinstance(node, ast.Name) and node.id not in set(
|
30
|
-
SYMPY_SUPPORTED_EXPRESSIONS
|
31
|
-
) | set(DEFAULT_SUPPORTED_FUNC_NAMES):
|
32
|
-
self.var_names.add(node.id)
|
33
|
-
super().generic_visit(node)
|
34
|
-
|
35
|
-
|
36
17
|
class QuantumExpressionOperation(QuantumOperation):
|
37
18
|
expression: Expression = pydantic.Field()
|
38
|
-
_var_handles:
|
19
|
+
_var_handles: list[HandleBinding] = pydantic.PrivateAttr(
|
39
20
|
default_factory=list,
|
40
21
|
)
|
41
|
-
_var_types:
|
22
|
+
_var_types: dict[str, QuantumType] = pydantic.PrivateAttr(
|
42
23
|
default_factory=dict,
|
43
24
|
)
|
44
25
|
|
45
26
|
@property
|
46
|
-
def var_handles(self) ->
|
27
|
+
def var_handles(self) -> list[HandleBinding]:
|
47
28
|
return self._var_handles
|
48
29
|
|
49
|
-
def set_var_handles(self, var_handles:
|
30
|
+
def set_var_handles(self, var_handles: list[HandleBinding]) -> None:
|
50
31
|
self._var_handles = var_handles
|
51
32
|
|
52
33
|
@property
|
53
|
-
def var_types(self) ->
|
34
|
+
def var_types(self) -> dict[str, QuantumType]:
|
54
35
|
return self._var_types
|
55
36
|
|
56
37
|
def initialize_var_types(
|
57
38
|
self,
|
58
|
-
var_types:
|
39
|
+
var_types: dict[str, QuantumType],
|
59
40
|
machine_precision: int,
|
60
41
|
) -> None:
|
61
|
-
assert len(var_types) == len(self.var_handles)
|
42
|
+
assert len(var_types) == len(self.var_handles) or len(self.var_handles) == 0
|
62
43
|
self._var_types = var_types
|
63
44
|
|
64
45
|
@property
|
65
|
-
def wiring_inouts(
|
66
|
-
self,
|
67
|
-
) -> Mapping[
|
68
|
-
str, Union[SlicedHandleBinding, SubscriptHandleBinding, HandleBinding]
|
69
|
-
]:
|
46
|
+
def wiring_inouts(self) -> Mapping[str, ConcreteHandleBinding]:
|
70
47
|
return nameables_to_dict(self.var_handles)
|
71
48
|
|
72
49
|
|
73
50
|
class QuantumAssignmentOperation(QuantumExpressionOperation):
|
74
|
-
result_var:
|
51
|
+
result_var: ConcreteHandleBinding = pydantic.Field(
|
75
52
|
description="The variable storing the expression result"
|
76
53
|
)
|
77
54
|
_result_type: Optional[QuantumType] = pydantic.PrivateAttr(
|