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,16 +1,18 @@
|
|
1
1
|
import math
|
2
|
-
from
|
2
|
+
from collections.abc import Sequence
|
3
|
+
from typing import Any, Generic, TypeVar
|
3
4
|
|
4
5
|
import pydantic
|
6
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
7
|
+
from pydantic_core.core_schema import ValidationInfo
|
5
8
|
|
9
|
+
from classiq.interface.exceptions import ClassiqError
|
6
10
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
7
11
|
from classiq.interface.generator.function_params import FunctionParams
|
8
12
|
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
9
13
|
HashablePydanticBaseModel,
|
10
14
|
)
|
11
15
|
|
12
|
-
from classiq.exceptions import ClassiqError
|
13
|
-
|
14
16
|
STATE_NAME: str = "state"
|
15
17
|
TARGET_NAME: str = "target"
|
16
18
|
_REL_TOLERANCE: float = 0.01
|
@@ -19,25 +21,24 @@ Breakpoint = TypeVar("Breakpoint")
|
|
19
21
|
|
20
22
|
|
21
23
|
class AffineMap(HashablePydanticBaseModel):
|
22
|
-
slope: float =
|
23
|
-
offset: float =
|
24
|
+
slope: float = Field(default=1.0)
|
25
|
+
offset: float = Field(default=0.0)
|
24
26
|
|
25
27
|
def evaluate(self, x: float) -> float:
|
26
28
|
return self.offset + self.slope * x
|
27
29
|
|
28
|
-
def image_bounds(self, domain_bounds:
|
30
|
+
def image_bounds(self, domain_bounds: tuple[float, float]) -> tuple[float, float]:
|
29
31
|
return self.evaluate(domain_bounds[0]), self.evaluate(domain_bounds[1])
|
30
32
|
|
31
|
-
|
32
|
-
frozen = True
|
33
|
+
model_config = ConfigDict(frozen=True)
|
33
34
|
|
34
35
|
|
35
36
|
class PiecewiseLinearAmplitudeLoadingABC(
|
36
|
-
FunctionParams,
|
37
|
+
FunctionParams, BaseModel, Generic[Breakpoint]
|
37
38
|
):
|
38
|
-
num_qubits:
|
39
|
-
breakpoints: Sequence[
|
40
|
-
affine_maps: Sequence[AffineMap] =
|
39
|
+
num_qubits: int = Field()
|
40
|
+
breakpoints: Sequence[int] = Field()
|
41
|
+
affine_maps: Sequence[AffineMap] = Field()
|
41
42
|
|
42
43
|
def _create_ios(self) -> None:
|
43
44
|
self._inputs = {
|
@@ -50,8 +51,8 @@ class PiecewiseLinearAmplitudeLoadingABC(
|
|
50
51
|
def _max_index(self) -> int:
|
51
52
|
return 2**self.num_qubits - 1
|
52
53
|
|
53
|
-
def _get_image_bounds(self) ->
|
54
|
-
piece_bounds: Sequence[
|
54
|
+
def _get_image_bounds(self) -> tuple[float, float]:
|
55
|
+
piece_bounds: Sequence[tuple[float, float]] = [
|
55
56
|
affine_map.image_bounds((self.breakpoints[idx], self.breakpoints[idx + 1]))
|
56
57
|
for idx, affine_map in enumerate(self.affine_maps)
|
57
58
|
]
|
@@ -59,19 +60,35 @@ class PiecewiseLinearAmplitudeLoadingABC(
|
|
59
60
|
top = max(max(piece) for piece in piece_bounds)
|
60
61
|
return bottom, top
|
61
62
|
|
62
|
-
@
|
63
|
+
@field_validator("breakpoints", mode="before")
|
64
|
+
@classmethod
|
63
65
|
def _validate_breakpoints(cls, breakpoints: Sequence[int]) -> Sequence[int]:
|
66
|
+
return cls.validate_breakpoints(breakpoints)
|
67
|
+
|
68
|
+
@classmethod
|
69
|
+
def validate_breakpoints(cls, breakpoints: Sequence[int]) -> Sequence[int]:
|
64
70
|
assert len(breakpoints) == len(
|
65
71
|
set(breakpoints)
|
66
72
|
), "Repeated breakpoints encountered"
|
67
73
|
assert list(breakpoints) == sorted(breakpoints), "Breakpoints not sorted"
|
68
|
-
return breakpoints
|
74
|
+
return list(map(int, breakpoints))
|
69
75
|
|
70
|
-
@pydantic.
|
71
|
-
|
76
|
+
@pydantic.model_validator(mode="before")
|
77
|
+
@classmethod
|
78
|
+
def _validate_lengths(cls, values: Any) -> dict[str, Any]:
|
72
79
|
breakpoints = values.get("breakpoints", list())
|
73
80
|
affine_maps = values.get("affine_maps", list())
|
74
81
|
num_qubits = values.get("num_qubits", int)
|
82
|
+
if isinstance(values, dict):
|
83
|
+
breakpoints = values.get("breakpoints", list())
|
84
|
+
affine_maps = values.get("affine_maps", list())
|
85
|
+
num_qubits = values.get("num_qubits", int)
|
86
|
+
elif isinstance(values, PiecewiseLinearAmplitudeLoadingABC):
|
87
|
+
breakpoints = values.breakpoints
|
88
|
+
affine_maps = values.affine_maps
|
89
|
+
num_qubits = values.num_qubits
|
90
|
+
values = values.__dict__
|
91
|
+
|
75
92
|
assert len(breakpoints) - 1 == len(
|
76
93
|
affine_maps
|
77
94
|
), "Size mismatch between the number of slopes and breakpoints. The number of breakpoints should be the number of slopes + 1"
|
@@ -81,28 +98,27 @@ class PiecewiseLinearAmplitudeLoadingABC(
|
|
81
98
|
return values
|
82
99
|
|
83
100
|
|
84
|
-
class PiecewiseLinearRotationAmplitudeLoading(
|
85
|
-
PiecewiseLinearAmplitudeLoadingABC[pydantic.NonNegativeInt]
|
86
|
-
):
|
101
|
+
class PiecewiseLinearRotationAmplitudeLoading(PiecewiseLinearAmplitudeLoadingABC[int]):
|
87
102
|
pass
|
88
103
|
|
89
|
-
@
|
90
|
-
|
91
|
-
|
104
|
+
@field_validator("breakpoints")
|
105
|
+
@classmethod
|
106
|
+
def _validate_breakpoints_field(
|
107
|
+
cls, breakpoints: Sequence[int], info: ValidationInfo
|
92
108
|
) -> Sequence[int]:
|
93
|
-
num_qubits =
|
109
|
+
num_qubits = info.data.get("num_qubits")
|
94
110
|
assert isinstance(num_qubits, int), "Must have an integer number of qubits"
|
95
111
|
assert min(breakpoints) == 0, "First breakpoint must be 0"
|
96
112
|
assert (
|
97
113
|
max(breakpoints) == 2**num_qubits - 1
|
98
114
|
), f"Last breakpoint must be {2**num_qubits - 1}"
|
99
|
-
return PiecewiseLinearAmplitudeLoadingABC.
|
115
|
+
return PiecewiseLinearAmplitudeLoadingABC.validate_breakpoints(
|
100
116
|
breakpoints=breakpoints
|
101
117
|
)
|
102
118
|
|
103
119
|
|
104
120
|
class PiecewiseLinearAmplitudeLoading(PiecewiseLinearAmplitudeLoadingABC[float]):
|
105
|
-
rescaling_factor: float =
|
121
|
+
rescaling_factor: float = Field(default=0.25 * math.pi)
|
106
122
|
|
107
123
|
def rescaled(self) -> PiecewiseLinearRotationAmplitudeLoading:
|
108
124
|
c, d = self._get_image_bounds()
|
@@ -111,11 +127,11 @@ class PiecewiseLinearAmplitudeLoading(PiecewiseLinearAmplitudeLoadingABC[float])
|
|
111
127
|
|
112
128
|
a, b = self.breakpoints[0], self.breakpoints[-1]
|
113
129
|
|
114
|
-
normalized_breakpoints:
|
130
|
+
normalized_breakpoints: list[int] = [
|
115
131
|
round(self._max_index * (point - a) / (b - a)) for point in self.breakpoints
|
116
132
|
]
|
117
133
|
|
118
|
-
normalized_affine_maps:
|
134
|
+
normalized_affine_maps: list[AffineMap] = list()
|
119
135
|
for affine_map in self.affine_maps:
|
120
136
|
normalized_slope = (
|
121
137
|
2 * affine_map.slope * self.rescaling_factor * (b - a)
|
@@ -1,11 +1,10 @@
|
|
1
1
|
from pydantic import BaseModel
|
2
2
|
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
3
4
|
from classiq.interface.helpers.custom_pydantic_types import (
|
4
5
|
PydanticNonOneProbabilityFloat,
|
5
6
|
)
|
6
7
|
|
7
|
-
from classiq._internals.enum_utils import StrEnum
|
8
|
-
|
9
8
|
|
10
9
|
# it seems to be ambiguous in this class. it is Identical to the Metrics, up to the
|
11
10
|
# attribute RANDOM, However RANDOM isn't really used or treated in any part of the code.
|
@@ -1,7 +1,11 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic import ConfigDict
|
5
|
+
from pydantic_core.core_schema import ValidationInfo
|
6
|
+
from typing_extensions import Self
|
4
7
|
|
8
|
+
from classiq.interface.exceptions import ClassiqMismatchIOsError, ClassiqValueError
|
5
9
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
6
10
|
from classiq.interface.generator.function_param_list_without_self_reference import (
|
7
11
|
function_param_library_without_self_reference,
|
@@ -17,8 +21,6 @@ from classiq.interface.generator.hamiltonian_evolution.exponentiation import (
|
|
17
21
|
)
|
18
22
|
from classiq.interface.generator.user_defined_function_params import CustomFunction
|
19
23
|
|
20
|
-
from classiq.exceptions import ClassiqMismatchIOsError, ClassiqValueError
|
21
|
-
|
22
24
|
PHASE_ESTIMATION_DEFAULT_OUTPUT_NAME = "PHASE_ESTIMATION"
|
23
25
|
CUSTOM_FUNCTIONS_IO_MISMATCH_ERROR = (
|
24
26
|
"Custom function provided to the QPE has different input and output names."
|
@@ -37,9 +39,7 @@ class ExponentiationScaling(pydantic.BaseModel):
|
|
37
39
|
default=2.0,
|
38
40
|
description="The scaling factor of the exponentiation max_depth; defaults to 2.",
|
39
41
|
)
|
40
|
-
|
41
|
-
class Config:
|
42
|
-
frozen = True
|
42
|
+
model_config = ConfigDict(frozen=True)
|
43
43
|
|
44
44
|
|
45
45
|
class ExponentiationSpecification(pydantic.BaseModel):
|
@@ -52,21 +52,17 @@ class ExponentiationSpecification(pydantic.BaseModel):
|
|
52
52
|
default=None,
|
53
53
|
description="The scaling of the exponentiation functions.",
|
54
54
|
)
|
55
|
-
max_depths: Optional[
|
55
|
+
max_depths: Optional[tuple[pydantic.NonNegativeInt, ...]] = pydantic.Field(
|
56
56
|
default=None,
|
57
57
|
description="The max_depth of each exponentiation function; overrides scaling.",
|
58
58
|
)
|
59
|
+
model_config = ConfigDict(frozen=True)
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
cls, values: Dict[str, Any]
|
66
|
-
) -> Dict[str, Any]:
|
67
|
-
if values.get("scaling") is None and values.get("max_depths") is None:
|
68
|
-
raise ValueError("At least one specification must be provided.")
|
69
|
-
return values
|
61
|
+
@pydantic.model_validator(mode="after")
|
62
|
+
def _validate_exponentiation_specification(self) -> Self:
|
63
|
+
if self.scaling is None and self.max_depths is None:
|
64
|
+
raise ClassiqValueError("At least one specification must be provided.")
|
65
|
+
return self
|
70
66
|
|
71
67
|
|
72
68
|
class PhaseEstimation(FunctionParams):
|
@@ -105,52 +101,69 @@ class PhaseEstimation(FunctionParams):
|
|
105
101
|
self._outputs[self._output_name] = RegisterArithmeticInfo(size=self.size)
|
106
102
|
self._create_zero_input_registers({DEFAULT_ZERO_NAME: self.size})
|
107
103
|
|
108
|
-
@pydantic.
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
104
|
+
@pydantic.model_validator(mode="before")
|
105
|
+
@classmethod
|
106
|
+
def _validate_composite_name(cls, values: Any) -> dict[str, Any]:
|
107
|
+
if not isinstance(values, dict):
|
108
|
+
return values
|
109
|
+
unitary_params = values.get("unitary_params")
|
110
|
+
unitary = values.get("unitary")
|
111
|
+
|
112
|
+
if isinstance(unitary_params, CustomFunction) and not unitary:
|
113
113
|
raise ClassiqValueError(
|
114
114
|
"`PhaseEstimation` of a user define function (`CustomFunction`) must receive the function name from the `unitary` field"
|
115
115
|
)
|
116
116
|
return values
|
117
117
|
|
118
|
-
@pydantic.
|
119
|
-
|
118
|
+
@pydantic.model_validator(mode="before")
|
119
|
+
@classmethod
|
120
|
+
def _parse_function_params(
|
121
|
+
cls, values: Any, info: ValidationInfo
|
122
|
+
) -> dict[str, Any]:
|
123
|
+
vals = info.data.copy() if info.data else {}
|
124
|
+
if isinstance(values, dict):
|
125
|
+
vals = values
|
126
|
+
elif isinstance(values, PhaseEstimation):
|
127
|
+
vals = values.model_dump()
|
128
|
+
|
120
129
|
parse_function_params_values(
|
121
|
-
values=
|
130
|
+
values=vals,
|
122
131
|
params_key="unitary_params",
|
123
132
|
discriminator_key="unitary",
|
124
133
|
param_classes=function_param_library_without_self_reference.param_list,
|
125
134
|
default_parser_class=CustomFunction,
|
126
135
|
)
|
127
|
-
return
|
136
|
+
return vals
|
128
137
|
|
129
|
-
@pydantic.
|
138
|
+
@pydantic.field_validator("unitary_params")
|
139
|
+
@classmethod
|
130
140
|
def _validate_unitary_params(cls, unitary_params: FunctionParams) -> FunctionParams:
|
131
141
|
if not unitary_params.is_powerable():
|
132
142
|
if isinstance(unitary_params, CustomFunction):
|
133
143
|
raise ClassiqMismatchIOsError(CUSTOM_FUNCTIONS_IO_MISMATCH_ERROR)
|
134
|
-
raise
|
144
|
+
raise ClassiqValueError(
|
135
145
|
f"Phase estimation of {unitary_params.discriminator()} is currently not supported."
|
136
146
|
)
|
137
147
|
return unitary_params
|
138
148
|
|
139
|
-
@pydantic.
|
149
|
+
@pydantic.field_validator("exponentiation_specification")
|
150
|
+
@classmethod
|
140
151
|
def _validate_exponentiation_specification(
|
141
152
|
cls,
|
142
153
|
exponentiation_specification: Optional[ExponentiationSpecification],
|
143
|
-
|
154
|
+
validation_info: ValidationInfo,
|
144
155
|
) -> Optional[ExponentiationSpecification]:
|
145
156
|
if exponentiation_specification is None:
|
146
157
|
return exponentiation_specification
|
147
|
-
unitary_params =
|
158
|
+
unitary_params = validation_info.data.get("unitary_params")
|
148
159
|
if not isinstance(unitary_params, Exponentiation):
|
149
|
-
raise
|
160
|
+
raise ClassiqValueError(
|
150
161
|
"exponentiation_specification is only valid for Exponentiation unitary_params."
|
151
162
|
)
|
152
163
|
if exponentiation_specification.max_depths is not None and len(
|
153
164
|
exponentiation_specification.max_depths
|
154
|
-
) !=
|
155
|
-
raise
|
165
|
+
) != validation_info.data.get("size"):
|
166
|
+
raise ClassiqValueError(
|
167
|
+
"Length of max_depths must match the provided size."
|
168
|
+
)
|
156
169
|
return exponentiation_specification
|
@@ -1,8 +1,11 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Literal, Optional, Union
|
2
2
|
|
3
3
|
import numpy as np
|
4
4
|
import pydantic
|
5
|
+
from pydantic import ConfigDict
|
5
6
|
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
8
|
+
from classiq.interface.exceptions import ClassiqQSVMError, ClassiqValueError
|
6
9
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
7
10
|
from classiq.interface.generator.function_params import (
|
8
11
|
DEFAULT_INPUT_NAME,
|
@@ -12,10 +15,6 @@ from classiq.interface.generator.function_params import (
|
|
12
15
|
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
13
16
|
HashablePydanticBaseModel,
|
14
17
|
)
|
15
|
-
from classiq.interface.helpers.pydantic_model_helpers import get_discriminator_field
|
16
|
-
|
17
|
-
from classiq._internals.enum_utils import StrEnum
|
18
|
-
from classiq.exceptions import ClassiqQSVMError
|
19
18
|
|
20
19
|
VALID_PAULI_LETTERS = ("I", "X", "Y", "Z")
|
21
20
|
|
@@ -30,36 +29,33 @@ class QSVMFeatureMapEntanglement(StrEnum):
|
|
30
29
|
|
31
30
|
class QSVMFeatureMapDimensional(HashablePydanticBaseModel):
|
32
31
|
feature_dimension: Optional[int] = None
|
33
|
-
|
34
|
-
class Config:
|
35
|
-
frozen = True
|
32
|
+
model_config = ConfigDict(frozen=True)
|
36
33
|
|
37
34
|
|
38
35
|
class QSVMFeatureMapPauli(QSVMFeatureMapDimensional):
|
39
|
-
map_type: Literal["pauli_feature_map"] =
|
40
|
-
"pauli_feature_map"
|
41
|
-
)
|
36
|
+
map_type: Literal["pauli_feature_map"] = pydantic.Field(default="pauli_feature_map")
|
42
37
|
reps: int = 2
|
43
38
|
entanglement: QSVMFeatureMapEntanglement = QSVMFeatureMapEntanglement.LINEAR
|
44
39
|
alpha: float = 2.0
|
45
|
-
paulis:
|
40
|
+
paulis: list[str] = ["Z", "ZZ"]
|
46
41
|
parameter_prefix: str = "x"
|
47
42
|
name: str = "PauliFeatureMap"
|
48
43
|
|
49
|
-
@pydantic.
|
50
|
-
|
44
|
+
@pydantic.field_validator("paulis", mode="before")
|
45
|
+
@classmethod
|
46
|
+
def set_paulis(cls, paulis: list[str]) -> list[str]:
|
51
47
|
# iterate every letter in every string in the list of paulis
|
52
48
|
for s in paulis:
|
53
49
|
if not all(map(VALID_PAULI_LETTERS.__contains__, s.upper())):
|
54
|
-
raise
|
50
|
+
raise ClassiqValueError(
|
55
51
|
f"Invalid pauli string given: {s!r}. Expecting a combination of {VALID_PAULI_LETTERS}"
|
56
52
|
)
|
57
53
|
return list(map(str.upper, paulis))
|
58
54
|
|
59
55
|
|
60
56
|
class QSVMFeatureMapBlochSphere(QSVMFeatureMapDimensional):
|
61
|
-
map_type: Literal["bloch_sphere_feature_map"] =
|
62
|
-
"bloch_sphere_feature_map"
|
57
|
+
map_type: Literal["bloch_sphere_feature_map"] = pydantic.Field(
|
58
|
+
default="bloch_sphere_feature_map"
|
63
59
|
)
|
64
60
|
|
65
61
|
|