classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -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,21 +58,30 @@ 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
|
-
if
|
82
|
+
if isinstance(key, int):
|
65
83
|
return self.registers[key]
|
66
|
-
if
|
84
|
+
if isinstance(key, str):
|
67
85
|
for register in self.registers:
|
68
86
|
if key == register.name:
|
69
87
|
return register
|
@@ -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,
|
@@ -25,44 +27,53 @@ _DEFAULT_ORACLE_DISCRIMINATOR: FunctionParamsDiscriminator = (
|
|
25
27
|
|
26
28
|
class GroverOperator(FunctionParams):
|
27
29
|
oracle: str = pydantic.Field(
|
28
|
-
default=_DEFAULT_ORACLE_DISCRIMINATOR,
|
30
|
+
default=_DEFAULT_ORACLE_DISCRIMINATOR,
|
31
|
+
description="Oracle function",
|
32
|
+
validate_default=True,
|
29
33
|
)
|
30
34
|
oracle_params: OracleABC = pydantic.Field(description="Oracle function parameters")
|
31
35
|
state_preparation: str = pydantic.Field(
|
32
|
-
default="",
|
36
|
+
default="",
|
37
|
+
description="State preparation function",
|
38
|
+
validate_default=True,
|
33
39
|
)
|
34
40
|
state_preparation_params: GroverStatePreparation = pydantic.Field(
|
35
|
-
default=None,
|
41
|
+
default=None,
|
42
|
+
description="State preparation function parameters",
|
43
|
+
validate_default=True,
|
36
44
|
)
|
37
45
|
|
38
46
|
def _create_ios(self) -> None:
|
39
47
|
self._inputs = {**self.oracle_params.inputs}
|
40
48
|
self._outputs = {**self.oracle_params.outputs}
|
41
49
|
|
42
|
-
@pydantic.
|
43
|
-
|
44
|
-
|
45
|
-
if isinstance(
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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")
|
57
67
|
return values
|
58
68
|
|
59
|
-
@pydantic.
|
69
|
+
@pydantic.field_validator("state_preparation_params", mode="before")
|
70
|
+
@classmethod
|
60
71
|
def _validate_state_preparation(
|
61
72
|
cls,
|
62
73
|
state_preparation_params: Optional[GroverStatePreparation],
|
63
|
-
|
74
|
+
info: ValidationInfo,
|
64
75
|
) -> GroverStatePreparation:
|
65
|
-
oracle =
|
76
|
+
oracle = info.data.get("oracle_params")
|
66
77
|
assert oracle is not None, "Must receive an oracle"
|
67
78
|
state_preparation_params = (
|
68
79
|
state_preparation_params
|
@@ -72,7 +83,7 @@ class GroverOperator(FunctionParams):
|
|
72
83
|
)
|
73
84
|
assert GroverDiffuser(
|
74
85
|
state_preparation_params=state_preparation_params,
|
75
|
-
state_preparation=
|
86
|
+
state_preparation=info.data.get("state_preparation", ""),
|
76
87
|
variables=oracle.variables(),
|
77
88
|
), "Cannot construct a GroverDiffuser"
|
78
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)
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import pydantic
|
2
|
+
from pydantic import ConfigDict
|
2
3
|
|
3
4
|
from classiq.interface.chemistry import operator
|
4
5
|
from classiq.interface.chemistry.operator import PauliOperator
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
7
|
+
from classiq.interface.generator.function_params import FunctionParamsNumericParameter
|
5
8
|
from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
|
6
9
|
HamiltonianEvolution,
|
7
10
|
)
|
8
|
-
from classiq.interface.generator.parameters import ParameterFloatType
|
9
11
|
|
10
12
|
|
11
13
|
class SuzukiParameters(pydantic.BaseModel):
|
@@ -17,14 +19,16 @@ class SuzukiParameters(pydantic.BaseModel):
|
|
17
19
|
default=1, description="The number of repetitions in the Suzuki-Trotter"
|
18
20
|
)
|
19
21
|
|
20
|
-
@pydantic.
|
22
|
+
@pydantic.field_validator("order")
|
23
|
+
@classmethod
|
21
24
|
def _validate_order(cls, order: int) -> int:
|
22
25
|
if order != 1 and order % 2:
|
23
|
-
raise
|
26
|
+
raise ClassiqValueError(
|
27
|
+
f"Odd order greater than 1 is not supported. Got {order}"
|
28
|
+
)
|
24
29
|
return order
|
25
30
|
|
26
|
-
|
27
|
-
frozen = True
|
31
|
+
model_config = ConfigDict(frozen=True)
|
28
32
|
|
29
33
|
|
30
34
|
class SuzukiTrotter(HamiltonianEvolution):
|
@@ -32,10 +36,9 @@ class SuzukiTrotter(HamiltonianEvolution):
|
|
32
36
|
Suzuki trotterization of a Hermitian operator
|
33
37
|
"""
|
34
38
|
|
35
|
-
evolution_coefficient:
|
39
|
+
evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
|
36
40
|
default=1.0,
|
37
41
|
description="A global coefficient multiplying the operator.",
|
38
|
-
is_exec_param=True,
|
39
42
|
)
|
40
43
|
suzuki_parameters: SuzukiParameters = pydantic.Field(
|
41
44
|
default_factory=SuzukiParameters, description="The Suziki parameters."
|
@@ -44,7 +47,8 @@ class SuzukiTrotter(HamiltonianEvolution):
|
|
44
47
|
default=False, description="Whether to disable the reordering of Pauli terms."
|
45
48
|
)
|
46
49
|
|
47
|
-
@pydantic.
|
50
|
+
@pydantic.field_validator("pauli_operator")
|
51
|
+
@classmethod
|
48
52
|
def _validate_no_complex_coefficients(
|
49
53
|
cls, pauli_operator: PauliOperator
|
50
54
|
) -> PauliOperator:
|