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
@@ -1,26 +1,25 @@
|
|
1
1
|
import abc
|
2
|
-
from
|
2
|
+
from collections.abc import Sequence
|
3
3
|
|
4
|
-
import
|
5
|
-
from pydantic.main import BaseModel
|
4
|
+
from pydantic import ConfigDict
|
6
5
|
|
7
|
-
from classiq.interface.
|
6
|
+
from classiq.interface.model.classical_parameter_declaration import (
|
7
|
+
AnonClassicalParameterDeclaration,
|
8
|
+
)
|
9
|
+
from classiq.interface.model.parameter import Parameter
|
8
10
|
|
9
11
|
|
10
|
-
class FunctionDeclaration(
|
12
|
+
class FunctionDeclaration(Parameter, abc.ABC):
|
11
13
|
"""
|
12
14
|
Facilitates the creation of a common function interface object.
|
13
15
|
"""
|
14
16
|
|
15
|
-
|
17
|
+
@property
|
18
|
+
@abc.abstractmethod
|
19
|
+
def param_decls(self) -> Sequence["AnonClassicalParameterDeclaration"]:
|
20
|
+
pass
|
16
21
|
|
17
|
-
|
18
|
-
description="The expected interface of the functions parameters",
|
19
|
-
default_factory=dict,
|
20
|
-
)
|
22
|
+
model_config = ConfigDict(extra="forbid")
|
21
23
|
|
22
|
-
class Config:
|
23
|
-
extra = pydantic.Extra.forbid
|
24
24
|
|
25
|
-
|
26
|
-
FunctionDeclaration.update_forward_refs()
|
25
|
+
FunctionDeclaration.model_rebuild()
|
@@ -1,12 +1,8 @@
|
|
1
1
|
from typing import Any
|
2
2
|
|
3
|
-
import
|
4
|
-
from pydantic import BaseModel
|
5
|
-
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
6
4
|
from classiq.interface.generator.function_params import PortDirection
|
7
5
|
|
8
|
-
from classiq._internals.enum_utils import StrEnum
|
9
|
-
|
10
6
|
|
11
7
|
class PortDeclarationDirection(StrEnum):
|
12
8
|
Input = "input"
|
@@ -39,11 +35,3 @@ class PortDeclarationDirection(StrEnum):
|
|
39
35
|
cls, port_direction: PortDirection
|
40
36
|
) -> "PortDeclarationDirection":
|
41
37
|
return cls(port_direction.value)
|
42
|
-
|
43
|
-
|
44
|
-
class SynthesisPortDeclaration(BaseModel):
|
45
|
-
name: str
|
46
|
-
size: int
|
47
|
-
direction: PortDeclarationDirection
|
48
|
-
is_signed: bool = pydantic.Field(default=False)
|
49
|
-
fraction_places: int = pydantic.Field(default=0)
|
@@ -0,0 +1,90 @@
|
|
1
|
+
from collections.abc import Mapping
|
2
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional
|
3
|
+
|
4
|
+
import pydantic
|
5
|
+
|
6
|
+
from classiq.interface.exceptions import ClassiqInternalError
|
7
|
+
from classiq.interface.generator.expressions.qmod_qstruct_proxy import QmodQStructProxy
|
8
|
+
from classiq.interface.generator.functions.classical_type import (
|
9
|
+
ClassicalType,
|
10
|
+
)
|
11
|
+
from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
|
12
|
+
from classiq.interface.model.handle_binding import HandleBinding
|
13
|
+
from classiq.interface.model.quantum_type import (
|
14
|
+
QuantumType,
|
15
|
+
)
|
16
|
+
|
17
|
+
if TYPE_CHECKING:
|
18
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
|
19
|
+
|
20
|
+
|
21
|
+
class TypeName(ClassicalType, QuantumType):
|
22
|
+
kind: Literal["struct_instance"]
|
23
|
+
name: str = pydantic.Field(description="The type name of the instance")
|
24
|
+
_assigned_fields: Optional[Mapping[str, "ConcreteQuantumType"]] = (
|
25
|
+
pydantic.PrivateAttr(default=None)
|
26
|
+
)
|
27
|
+
|
28
|
+
@pydantic.model_validator(mode="before")
|
29
|
+
@classmethod
|
30
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
31
|
+
return values_with_discriminator(values, "kind", "struct_instance")
|
32
|
+
|
33
|
+
def _update_size_in_bits_from_declaration(self) -> None:
|
34
|
+
fields_types = list(self.fields.values())
|
35
|
+
for field_type in fields_types:
|
36
|
+
field_type._update_size_in_bits_from_declaration()
|
37
|
+
if all(field_type.has_size_in_bits for field_type in fields_types):
|
38
|
+
self._size_in_bits = sum(
|
39
|
+
field_type.size_in_bits for field_type in fields_types
|
40
|
+
)
|
41
|
+
|
42
|
+
def get_proxy(self, handle: "HandleBinding") -> "QmodQStructProxy":
|
43
|
+
from classiq.interface.generator.expressions.qmod_qstruct_proxy import (
|
44
|
+
QmodQStructProxy,
|
45
|
+
)
|
46
|
+
|
47
|
+
return QmodQStructProxy(
|
48
|
+
handle=handle, struct_name=self.name, fields=self.fields
|
49
|
+
)
|
50
|
+
|
51
|
+
@property
|
52
|
+
def qmod_type_name(self) -> str:
|
53
|
+
return self.name
|
54
|
+
|
55
|
+
@property
|
56
|
+
def type_name(self) -> str:
|
57
|
+
return self.name
|
58
|
+
|
59
|
+
@property
|
60
|
+
def fields(self) -> Mapping[str, "ConcreteQuantumType"]:
|
61
|
+
if self._assigned_fields is None:
|
62
|
+
raise ClassiqInternalError("Fields not set")
|
63
|
+
return self._assigned_fields
|
64
|
+
|
65
|
+
@property
|
66
|
+
def has_fields(self) -> bool:
|
67
|
+
return self._assigned_fields is not None
|
68
|
+
|
69
|
+
def set_fields(self, fields: Mapping[str, "ConcreteQuantumType"]) -> None:
|
70
|
+
self._assigned_fields = fields
|
71
|
+
|
72
|
+
@property
|
73
|
+
def is_instantiated(self) -> bool:
|
74
|
+
return self.has_fields and all(
|
75
|
+
field_type.is_instantiated for field_type in self.fields.values()
|
76
|
+
)
|
77
|
+
|
78
|
+
@property
|
79
|
+
def is_evaluated(self) -> bool:
|
80
|
+
return self.has_fields and all(
|
81
|
+
field_type.is_evaluated for field_type in self.fields.values()
|
82
|
+
)
|
83
|
+
|
84
|
+
|
85
|
+
class Enum(TypeName):
|
86
|
+
pass
|
87
|
+
|
88
|
+
|
89
|
+
class Struct(TypeName):
|
90
|
+
pass
|
@@ -1,17 +1,26 @@
|
|
1
|
-
|
1
|
+
import logging
|
2
|
+
from typing import Literal, Optional, Union
|
2
3
|
|
3
4
|
import pydantic
|
5
|
+
from pydantic import ConfigDict
|
4
6
|
from typing_extensions import TypeAlias
|
5
7
|
|
8
|
+
from classiq.interface.enum_utils import StrEnum
|
6
9
|
from classiq.interface.generator.control_state import ControlState
|
7
10
|
from classiq.interface.generator.register_role import RegisterRole
|
8
11
|
from classiq.interface.generator.synthesis_metadata.synthesis_execution_data import (
|
9
12
|
ExecutionData,
|
10
13
|
)
|
11
14
|
|
12
|
-
|
13
|
-
|
15
|
+
from classiq.model_expansions.capturing.mangling_utils import (
|
16
|
+
demangle_capture_name,
|
17
|
+
demangle_name,
|
18
|
+
is_captured_var_name,
|
19
|
+
)
|
14
20
|
|
21
|
+
_logger = logging.getLogger(__name__)
|
22
|
+
ParameterName = str
|
23
|
+
IOQubitMapping: TypeAlias = dict[str, tuple[int, ...]]
|
15
24
|
|
16
25
|
CLASSIQ_HIERARCHY_SEPARATOR: Literal["."] = "."
|
17
26
|
|
@@ -21,7 +30,7 @@ VISUALIZATION_HIDE_LIST = [
|
|
21
30
|
"control",
|
22
31
|
"mcx",
|
23
32
|
"iteration",
|
24
|
-
"
|
33
|
+
"stmt_block",
|
25
34
|
]
|
26
35
|
|
27
36
|
|
@@ -39,8 +48,8 @@ class QubitMapping(pydantic.BaseModel):
|
|
39
48
|
class GeneratedRegister(pydantic.BaseModel):
|
40
49
|
name: str
|
41
50
|
role: RegisterRole
|
42
|
-
qubit_indexes_relative:
|
43
|
-
qubit_indexes_absolute:
|
51
|
+
qubit_indexes_relative: list[int]
|
52
|
+
qubit_indexes_absolute: list[int]
|
44
53
|
|
45
54
|
def __len__(self) -> int:
|
46
55
|
return self.qubit_indexes_relative.__len__()
|
@@ -49,16 +58,25 @@ class GeneratedRegister(pydantic.BaseModel):
|
|
49
58
|
def width(self) -> int:
|
50
59
|
return len(self)
|
51
60
|
|
61
|
+
@property
|
62
|
+
def is_captured(self) -> bool:
|
63
|
+
return is_captured_var_name(self.name)
|
64
|
+
|
65
|
+
@staticmethod
|
66
|
+
def demangle_name(name: str) -> str:
|
67
|
+
if is_captured_var_name(name):
|
68
|
+
return demangle_capture_name(name)
|
69
|
+
return demangle_name(name)
|
70
|
+
|
52
71
|
|
53
72
|
class GeneratedFunction(pydantic.BaseModel):
|
54
73
|
name: str
|
55
|
-
control_states:
|
56
|
-
registers:
|
57
|
-
depth: Optional[int]
|
58
|
-
width: Optional[int]
|
59
|
-
|
60
|
-
|
61
|
-
dangling_outputs: Dict[str, GeneratedRegister] = dict()
|
74
|
+
control_states: list[ControlState]
|
75
|
+
registers: list[GeneratedRegister] = list()
|
76
|
+
depth: Optional[int] = pydantic.Field(default=None)
|
77
|
+
width: Optional[int] = pydantic.Field(default=None)
|
78
|
+
dangling_inputs: dict[str, GeneratedRegister] = dict()
|
79
|
+
dangling_outputs: dict[str, GeneratedRegister] = dict()
|
62
80
|
|
63
81
|
def __getitem__(self, key: Union[int, str]) -> GeneratedRegister:
|
64
82
|
if isinstance(key, int):
|
@@ -85,7 +103,7 @@ class GeneratedFunction(pydantic.BaseModel):
|
|
85
103
|
|
86
104
|
class GeneratedCircuitData(pydantic.BaseModel):
|
87
105
|
width: int
|
88
|
-
circuit_parameters:
|
106
|
+
circuit_parameters: list[ParameterName] = pydantic.Field(default_factory=list)
|
89
107
|
qubit_mapping: QubitMapping = pydantic.Field(default_factory=QubitMapping)
|
90
108
|
execution_data: Optional[ExecutionData] = pydantic.Field(default=None)
|
91
109
|
|
@@ -94,13 +112,42 @@ class GeneratedCircuitData(pydantic.BaseModel):
|
|
94
112
|
return cls(width=0)
|
95
113
|
|
96
114
|
|
97
|
-
class
|
98
|
-
|
99
|
-
|
100
|
-
|
115
|
+
class OperationLevel(StrEnum):
|
116
|
+
QMOD_FUNCTION_CALL = "QMOD_CALL"
|
117
|
+
QMOD_STATEMENT = "QMOD_STATEMENT"
|
118
|
+
ENGINE_FUNCTION_CALL = "ENGINE_CALL"
|
119
|
+
UNKNOWN = "UNKNOWN"
|
120
|
+
|
121
|
+
|
122
|
+
class OperationParameter(pydantic.BaseModel):
|
123
|
+
label: str
|
124
|
+
value: Optional[str] = None
|
125
|
+
|
126
|
+
|
127
|
+
class FunctionDebugInfoInterface(pydantic.BaseModel):
|
128
|
+
generated_function: Optional[GeneratedFunction] = pydantic.Field(default=None)
|
129
|
+
children: list["FunctionDebugInfoInterface"]
|
130
|
+
relative_qubits: tuple[int, ...]
|
131
|
+
absolute_qubits: Optional[tuple[int, ...]] = pydantic.Field(default=None)
|
132
|
+
is_basis_gate: Optional[bool] = pydantic.Field(default=None)
|
133
|
+
is_inverse: bool = pydantic.Field(default=False)
|
134
|
+
is_allocate_or_free: bool = pydantic.Field(default=False)
|
135
|
+
level: OperationLevel = pydantic.Field(default=OperationLevel.UNKNOWN)
|
136
|
+
parameters: list[OperationParameter] = list()
|
137
|
+
port_to_passed_variable_map: dict[str, str] = pydantic.Field(default={})
|
138
|
+
|
139
|
+
model_config = ConfigDict(extra="allow")
|
140
|
+
# Temporary field to store the override debug info for parallel old/new visualization
|
141
|
+
override_debug_info: Optional["FunctionDebugInfoInterface"] = None
|
101
142
|
|
102
143
|
@property
|
103
|
-
def
|
144
|
+
def name(self) -> str:
|
145
|
+
if self.generated_function is None:
|
146
|
+
return ""
|
147
|
+
return self.generated_function.name
|
148
|
+
|
149
|
+
@property
|
150
|
+
def registers(self) -> list[GeneratedRegister]:
|
104
151
|
if self.generated_function is None:
|
105
152
|
return list()
|
106
153
|
return self.generated_function.registers
|
@@ -112,7 +159,93 @@ class FunctionDebugInfo(pydantic.BaseModel):
|
|
112
159
|
return len(self.generated_function.control_states) > 0
|
113
160
|
|
114
161
|
@property
|
115
|
-
def control_states(self) ->
|
162
|
+
def control_states(self) -> list[ControlState]:
|
116
163
|
if self.generated_function is None:
|
117
164
|
return list()
|
118
165
|
return self.generated_function.control_states
|
166
|
+
|
167
|
+
@staticmethod
|
168
|
+
def create_parameters_from_dict(
|
169
|
+
parameters: dict[str, str]
|
170
|
+
) -> list[OperationParameter]:
|
171
|
+
return [
|
172
|
+
OperationParameter(label=key, value=value)
|
173
|
+
for key, value in parameters.items()
|
174
|
+
]
|
175
|
+
|
176
|
+
def propagate_absolute_qubits(self) -> "FunctionDebugInfoInterface":
|
177
|
+
if self.absolute_qubits is None:
|
178
|
+
return self
|
179
|
+
|
180
|
+
updated_registers = [
|
181
|
+
register.model_copy(
|
182
|
+
update=dict(
|
183
|
+
qubit_indexes_absolute=list(
|
184
|
+
_get_absolute_from_relative(
|
185
|
+
self.absolute_qubits, tuple(register.qubit_indexes_relative)
|
186
|
+
)
|
187
|
+
)
|
188
|
+
)
|
189
|
+
)
|
190
|
+
for register in self.registers
|
191
|
+
]
|
192
|
+
updated_generated_function = (
|
193
|
+
self.generated_function.model_copy(update=dict(registers=updated_registers))
|
194
|
+
if self.generated_function
|
195
|
+
else None
|
196
|
+
)
|
197
|
+
|
198
|
+
updated_children: list[FunctionDebugInfoInterface] = []
|
199
|
+
for child in self.children:
|
200
|
+
updated_child = child.white_new_absolute_qubits(self.absolute_qubits)
|
201
|
+
if updated_child.override_debug_info is None:
|
202
|
+
updated_child = updated_child.propagate_absolute_qubits()
|
203
|
+
else:
|
204
|
+
updated_child.override_debug_info = (
|
205
|
+
updated_child.override_debug_info.white_new_absolute_qubits(
|
206
|
+
absolute_qubits=self.absolute_qubits
|
207
|
+
).propagate_absolute_qubits()
|
208
|
+
)
|
209
|
+
updated_children.append(updated_child)
|
210
|
+
|
211
|
+
return self.model_copy(
|
212
|
+
update=dict(
|
213
|
+
generated_function=updated_generated_function,
|
214
|
+
children=updated_children,
|
215
|
+
)
|
216
|
+
)
|
217
|
+
|
218
|
+
def white_new_absolute_qubits(
|
219
|
+
self, absolute_qubits: tuple[int, ...]
|
220
|
+
) -> "FunctionDebugInfoInterface":
|
221
|
+
return self.model_copy(
|
222
|
+
update=dict(
|
223
|
+
absolute_qubits=_get_absolute_from_relative(
|
224
|
+
absolute_qubits, self.relative_qubits
|
225
|
+
)
|
226
|
+
)
|
227
|
+
)
|
228
|
+
|
229
|
+
def inverse(self) -> "FunctionDebugInfoInterface":
|
230
|
+
inverted_children = [child.inverse() for child in self.children[::-1]]
|
231
|
+
return self.model_copy(
|
232
|
+
update=dict(
|
233
|
+
is_inverse=not self.is_inverse,
|
234
|
+
children=inverted_children,
|
235
|
+
)
|
236
|
+
)
|
237
|
+
|
238
|
+
|
239
|
+
def _get_absolute_from_relative(
|
240
|
+
absolute_qubits: tuple[int, ...], relative_qubits: tuple[int, ...]
|
241
|
+
) -> tuple[int, ...]:
|
242
|
+
if len(relative_qubits) == 0:
|
243
|
+
return tuple()
|
244
|
+
if max(relative_qubits) >= len(absolute_qubits):
|
245
|
+
_logger.warning(
|
246
|
+
"Invalid qubit computation (relative qubits: %s, absolute qubits: %s)",
|
247
|
+
relative_qubits,
|
248
|
+
absolute_qubits,
|
249
|
+
)
|
250
|
+
return tuple()
|
251
|
+
return tuple(absolute_qubits[relative_qubit] for relative_qubit in relative_qubits)
|
@@ -1,7 +1,9 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Union
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic_core.core_schema import ValidationInfo
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
8
|
from classiq.interface.generator.function_params import (
|
7
9
|
ArithmeticIODict,
|
@@ -11,13 +13,11 @@ from classiq.interface.generator.function_params import (
|
|
11
13
|
from classiq.interface.generator.state_preparation import StatePreparation
|
12
14
|
from classiq.interface.generator.user_defined_function_params import CustomFunction
|
13
15
|
|
14
|
-
from classiq.exceptions import ClassiqValueError
|
15
|
-
|
16
16
|
GroverStatePreparation = Union[StatePreparation, CustomFunction]
|
17
17
|
|
18
18
|
|
19
19
|
class GroverDiffuser(FunctionParams):
|
20
|
-
variables:
|
20
|
+
variables: list[RegisterUserInput]
|
21
21
|
state_preparation: str = pydantic.Field(
|
22
22
|
default="", description="State preparation function"
|
23
23
|
)
|
@@ -30,40 +30,47 @@ class GroverDiffuser(FunctionParams):
|
|
30
30
|
self._inputs = {reg.name: reg for reg in self.variables}
|
31
31
|
self._outputs = {reg.name: reg for reg in self.variables}
|
32
32
|
|
33
|
-
@pydantic.
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
@pydantic.model_validator(mode="before")
|
34
|
+
@classmethod
|
35
|
+
def _validate_state_preparation_name(cls, values: Any) -> dict[str, Any]:
|
36
|
+
if (
|
37
|
+
isinstance(values, dict)
|
38
|
+
and isinstance(values.get("state_preparation_params"), CustomFunction)
|
39
|
+
and not values.get("state_preparation")
|
40
|
+
):
|
38
41
|
raise ClassiqValueError(
|
39
42
|
"Must receive the function name from the `state_preparation` field for user defined functions"
|
40
43
|
)
|
41
44
|
return values
|
42
45
|
|
43
|
-
@pydantic.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
@pydantic.model_validator(mode="before")
|
47
|
+
@classmethod
|
48
|
+
def _parse_state_preparation(cls, values: Any) -> dict[str, Any]:
|
49
|
+
if isinstance(values, dict):
|
50
|
+
parse_function_params_values(
|
51
|
+
values=values,
|
52
|
+
params_key="state_preparation_params",
|
53
|
+
discriminator_key="state_preparation",
|
54
|
+
param_classes={StatePreparation, CustomFunction},
|
55
|
+
default_parser_class=CustomFunction,
|
56
|
+
)
|
52
57
|
return values
|
53
58
|
|
54
|
-
@pydantic.
|
59
|
+
@pydantic.field_validator("variables")
|
60
|
+
@classmethod
|
55
61
|
def _validate_variables(
|
56
|
-
cls, variables:
|
57
|
-
) ->
|
62
|
+
cls, variables: list[RegisterUserInput]
|
63
|
+
) -> list[RegisterUserInput]:
|
58
64
|
names = {reg.name for reg in variables}
|
59
65
|
assert len(variables) == len(names), "Repeating names not allowed"
|
60
66
|
return variables
|
61
67
|
|
62
|
-
@pydantic.
|
68
|
+
@pydantic.field_validator("state_preparation_params")
|
69
|
+
@classmethod
|
63
70
|
def _validate_state_preparation(
|
64
|
-
cls, state_preparation_params: GroverStatePreparation,
|
71
|
+
cls, state_preparation_params: GroverStatePreparation, info: ValidationInfo
|
65
72
|
) -> GroverStatePreparation:
|
66
|
-
variables =
|
73
|
+
variables = info.data.get("variables", list())
|
67
74
|
sp_inputs = state_preparation_params.inputs_full(strict_zero_ios=False)
|
68
75
|
sp_outputs = state_preparation_params.outputs
|
69
76
|
if len(sp_inputs) == 1 and len(sp_outputs) == 1:
|
@@ -82,5 +89,5 @@ class GroverDiffuser(FunctionParams):
|
|
82
89
|
return state_preparation_params
|
83
90
|
|
84
91
|
@staticmethod
|
85
|
-
def _names_and_sizes(transputs: ArithmeticIODict) ->
|
92
|
+
def _names_and_sizes(transputs: ArithmeticIODict) -> set[tuple[str, int]]:
|
86
93
|
return {(name, reg.size) for name, reg in transputs.items()}
|
@@ -1,7 +1,9 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic_core.core_schema import ValidationInfo
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.function_params import (
|
6
8
|
FunctionParams,
|
7
9
|
FunctionParamsDiscriminator,
|
@@ -18,8 +20,6 @@ from classiq.interface.generator.oracles.oracle_function_param_list import (
|
|
18
20
|
from classiq.interface.generator.range_types import NonNegativeFloatRange
|
19
21
|
from classiq.interface.generator.state_preparation import Metrics, StatePreparation
|
20
22
|
|
21
|
-
from classiq.exceptions import ClassiqValueError
|
22
|
-
|
23
23
|
_DEFAULT_ORACLE_DISCRIMINATOR: FunctionParamsDiscriminator = (
|
24
24
|
ArithmeticOracle.discriminator()
|
25
25
|
)
|
@@ -27,44 +27,53 @@ _DEFAULT_ORACLE_DISCRIMINATOR: FunctionParamsDiscriminator = (
|
|
27
27
|
|
28
28
|
class GroverOperator(FunctionParams):
|
29
29
|
oracle: str = pydantic.Field(
|
30
|
-
default=_DEFAULT_ORACLE_DISCRIMINATOR,
|
30
|
+
default=_DEFAULT_ORACLE_DISCRIMINATOR,
|
31
|
+
description="Oracle function",
|
32
|
+
validate_default=True,
|
31
33
|
)
|
32
34
|
oracle_params: OracleABC = pydantic.Field(description="Oracle function parameters")
|
33
35
|
state_preparation: str = pydantic.Field(
|
34
|
-
default="",
|
36
|
+
default="",
|
37
|
+
description="State preparation function",
|
38
|
+
validate_default=True,
|
35
39
|
)
|
36
40
|
state_preparation_params: GroverStatePreparation = pydantic.Field(
|
37
|
-
default=None,
|
41
|
+
default=None,
|
42
|
+
description="State preparation function parameters",
|
43
|
+
validate_default=True,
|
38
44
|
)
|
39
45
|
|
40
46
|
def _create_ios(self) -> None:
|
41
47
|
self._inputs = {**self.oracle_params.inputs}
|
42
48
|
self._outputs = {**self.oracle_params.outputs}
|
43
49
|
|
44
|
-
@pydantic.
|
45
|
-
|
46
|
-
|
47
|
-
if isinstance(
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
50
|
+
@pydantic.model_validator(mode="before")
|
51
|
+
@classmethod
|
52
|
+
def _parse_oracle(cls, values: Any) -> dict[str, Any]:
|
53
|
+
if isinstance(values, dict):
|
54
|
+
oracle_params = values.get("oracle_params")
|
55
|
+
if isinstance(oracle_params, dict):
|
56
|
+
values["oracle_params"] = parse_function_params(
|
57
|
+
params=oracle_params,
|
58
|
+
discriminator=values.get("oracle", _DEFAULT_ORACLE_DISCRIMINATOR),
|
59
|
+
param_classes=oracle_function_param_library.param_list,
|
60
|
+
no_discriminator_error=ClassiqValueError("Invalid oracle name"),
|
61
|
+
bad_function_error=ClassiqValueError("Invalid oracle params"),
|
62
|
+
)
|
63
|
+
elif isinstance(oracle_params, FunctionParams):
|
64
|
+
values["oracle"] = oracle_params.discriminator()
|
65
|
+
else:
|
66
|
+
raise ClassiqValueError("Invalid oracle params")
|
59
67
|
return values
|
60
68
|
|
61
|
-
@pydantic.
|
69
|
+
@pydantic.field_validator("state_preparation_params", mode="before")
|
70
|
+
@classmethod
|
62
71
|
def _validate_state_preparation(
|
63
72
|
cls,
|
64
73
|
state_preparation_params: Optional[GroverStatePreparation],
|
65
|
-
|
74
|
+
info: ValidationInfo,
|
66
75
|
) -> GroverStatePreparation:
|
67
|
-
oracle =
|
76
|
+
oracle = info.data.get("oracle_params")
|
68
77
|
assert oracle is not None, "Must receive an oracle"
|
69
78
|
state_preparation_params = (
|
70
79
|
state_preparation_params
|
@@ -74,7 +83,7 @@ class GroverOperator(FunctionParams):
|
|
74
83
|
)
|
75
84
|
assert GroverDiffuser(
|
76
85
|
state_preparation_params=state_preparation_params,
|
77
|
-
state_preparation=
|
86
|
+
state_preparation=info.data.get("state_preparation", ""),
|
78
87
|
variables=oracle.variables(),
|
79
88
|
), "Cannot construct a GroverDiffuser"
|
80
89
|
return state_preparation_params
|
@@ -4,12 +4,11 @@ import pydantic
|
|
4
4
|
|
5
5
|
from classiq.interface.chemistry import operator
|
6
6
|
from classiq.interface.chemistry.operator import PauliOperator
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
7
8
|
from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
|
8
9
|
HamiltonianEvolution,
|
9
10
|
)
|
10
11
|
|
11
|
-
from classiq._internals.enum_utils import StrEnum
|
12
|
-
|
13
12
|
|
14
13
|
class ExponentiationOptimization(StrEnum):
|
15
14
|
MINIMIZE_DEPTH = "MINIMIZE_DEPTH"
|
@@ -24,9 +23,7 @@ class ExponentiationConstraints(pydantic.BaseModel):
|
|
24
23
|
default=None,
|
25
24
|
description="Maximum approximation error of the exponentiation circuit.",
|
26
25
|
)
|
27
|
-
|
28
|
-
class Config:
|
29
|
-
frozen = True
|
26
|
+
model_config = pydantic.ConfigDict(frozen=True)
|
30
27
|
|
31
28
|
|
32
29
|
class Exponentiation(HamiltonianEvolution):
|
@@ -46,6 +43,7 @@ class Exponentiation(HamiltonianEvolution):
|
|
46
43
|
description="What attribute to optimize.",
|
47
44
|
)
|
48
45
|
|
49
|
-
@pydantic.
|
46
|
+
@pydantic.field_validator("pauli_operator")
|
47
|
+
@classmethod
|
50
48
|
def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
|
51
49
|
return operator.validate_operator_is_hermitian(pauli_operator)
|
@@ -2,10 +2,10 @@ import pydantic
|
|
2
2
|
|
3
3
|
from classiq.interface.chemistry import operator
|
4
4
|
from classiq.interface.chemistry.operator import PauliOperator
|
5
|
+
from classiq.interface.generator.function_params import FunctionParamsNumericParameter
|
5
6
|
from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
|
6
7
|
HamiltonianEvolution,
|
7
8
|
)
|
8
|
-
from classiq.interface.generator.parameters import ParameterFloatType
|
9
9
|
|
10
10
|
|
11
11
|
class QDrift(HamiltonianEvolution):
|
@@ -13,15 +13,15 @@ class QDrift(HamiltonianEvolution):
|
|
13
13
|
qDrift trotterization of a Hermitian operator; see https://arxiv.org/abs/1811.08017
|
14
14
|
"""
|
15
15
|
|
16
|
-
evolution_coefficient:
|
16
|
+
evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
|
17
17
|
default=1.0,
|
18
18
|
description="A global coefficient multiplying the operator.",
|
19
|
-
is_exec_param=True,
|
20
19
|
)
|
21
20
|
num_qdrift: pydantic.PositiveInt = pydantic.Field(
|
22
21
|
description="The number of elements in the qDrift product.",
|
23
22
|
)
|
24
23
|
|
25
|
-
@pydantic.
|
24
|
+
@pydantic.field_validator("pauli_operator")
|
25
|
+
@classmethod
|
26
26
|
def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
|
27
27
|
return operator.validate_operator_is_hermitian(pauli_operator)
|