classiq 0.38.0__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 +47 -32
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
- classiq/_internals/api_wrapper.py +235 -97
- classiq/_internals/async_utils.py +1 -3
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +10 -5
- classiq/_internals/authentication/password_manager.py +18 -6
- classiq/_internals/authentication/token_manager.py +10 -5
- classiq/_internals/client.py +94 -33
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +60 -57
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +24 -19
- classiq/analyzer/analyzer_utilities.py +10 -10
- classiq/analyzer/rb.py +15 -15
- classiq/analyzer/show_interactive_hack.py +27 -4
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
- classiq/applications/combinatorial_optimization/__init__.py +20 -6
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
- classiq/applications/grover/__init__.py +9 -0
- classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +6 -6
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +5 -5
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +3 -6
- classiq/applications/qsvm/qsvm_data_generation.py +3 -3
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +20 -115
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +43 -13
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +28 -32
- classiq/interface/applications/qsvm.py +20 -29
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -121
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +25 -22
- classiq/interface/backend/quantum_backend_providers.py +69 -16
- classiq/interface/chemistry/fermionic_operator.py +30 -21
- classiq/interface/chemistry/ground_state_problem.py +28 -25
- classiq/interface/chemistry/molecule.py +14 -10
- classiq/interface/chemistry/operator.py +64 -231
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/{exceptions.py → interface/exceptions.py} +37 -9
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/execution_preferences.py +26 -114
- classiq/interface/executor/execution_request.py +24 -46
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +17 -14
- classiq/interface/executor/quantum_code.py +28 -24
- classiq/interface/executor/quantum_instruction_set.py +2 -2
- classiq/interface/executor/register_initialization.py +11 -14
- classiq/interface/executor/result.py +83 -56
- classiq/interface/executor/vqe_result.py +10 -10
- classiq/interface/finance/function_input.py +35 -25
- classiq/interface/finance/gaussian_model_input.py +5 -5
- classiq/interface/finance/log_normal_model_input.py +4 -4
- classiq/interface/finance/model_input.py +4 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +22 -12
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +46 -5
- classiq/interface/generator/arith/arithmetic.py +35 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
- classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
- classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
- classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
- classiq/interface/generator/arith/arithmetic_operations.py +14 -6
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
- classiq/interface/generator/arith/binary_ops.py +218 -130
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -25
- classiq/interface/generator/arith/logical_ops.py +14 -12
- classiq/interface/generator/arith/number_utils.py +12 -6
- classiq/interface/generator/arith/register_user_input.py +60 -37
- classiq/interface/generator/arith/unary_ops.py +49 -29
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +3 -3
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
- classiq/interface/generator/compiler_keywords.py +5 -1
- classiq/interface/generator/complex_type.py +13 -18
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +34 -29
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +5 -5
- classiq/interface/generator/expressions/expression.py +26 -14
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
- classiq/interface/generator/finance.py +2 -2
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +36 -64
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +153 -20
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -25
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
- classiq/interface/generator/hardware/hardware_data.py +72 -34
- classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
- classiq/interface/generator/hartree_fock.py +13 -5
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +32 -20
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +17 -15
- classiq/interface/generator/mcx.py +24 -17
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +26 -8
- classiq/interface/generator/model/model.py +27 -190
- classiq/interface/generator/model/preferences/preferences.py +115 -41
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +15 -13
- classiq/interface/generator/oracles/oracle_abc.py +7 -7
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +41 -30
- classiq/interface/generator/qsvm.py +9 -10
- classiq/interface/generator/quantum_function_call.py +88 -73
- classiq/interface/generator/quantum_program.py +41 -24
- classiq/interface/generator/range_types.py +11 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +5 -5
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +4 -7
- classiq/interface/generator/state_preparation/state_preparation.py +25 -20
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +7 -11
- classiq/interface/generator/ucc.py +5 -4
- classiq/interface/generator/unitary_gate.py +5 -5
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +7 -7
- classiq/interface/generator/validations/validator_functions.py +4 -4
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +29 -8
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +2 -2
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -5
- classiq/interface/helpers/validation_helpers.py +3 -20
- classiq/interface/helpers/versioned_model.py +1 -4
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +29 -69
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +32 -9
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +29 -24
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +69 -61
- classiq/interface/model/native_function_definition.py +17 -20
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +141 -343
- classiq/interface/model/quantum_function_declaration.py +190 -157
- classiq/interface/model/quantum_lambda_function.py +33 -32
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +177 -40
- classiq/interface/model/quantum_variable_declaration.py +3 -25
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +40 -14
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +7 -5
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +17 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +10 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +36 -14
- classiq/qmod/builtins/classical_functions.py +39 -43
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +373 -40
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +2 -2
- classiq/qmod/classical_function.py +4 -8
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +143 -101
- classiq/qmod/expression_query.py +20 -4
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +18 -6
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +16 -11
- classiq/qmod/native/pretty_printer.py +187 -97
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +60 -8
- classiq/qmod/qmod_constant.py +93 -26
- classiq/qmod/qmod_parameter.py +68 -59
- classiq/qmod/qmod_variable.py +468 -155
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +269 -96
- classiq/qmod/quantum_function.py +196 -41
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +147 -123
- classiq/qmod/symbolic_expr.py +27 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +98 -4
- classiq/qmod/write_qmod.py +17 -3
- classiq/synthesis.py +210 -22
- {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -9
- classiq-0.65.3.dist-info/RECORD +521 -0
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -25
- classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
- classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
- classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/interface/executor/aws_execution_cost.py +0 -73
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
- classiq/interface/generator/functions/foreign_function_definition.py +0 -114
- classiq/interface/generator/functions/function_implementation.py +0 -107
- classiq/interface/generator/functions/native_function_definition.py +0 -155
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -44
- classiq/interface/generator/functions/register_mapping_data.py +0 -106
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -74
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/call_synthesis_data.py +0 -68
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -94
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -156
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -462
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -229
- classiq/qmod/builtins/functions.py +0 -913
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -205
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.38.0.dist-info/RECORD +0 -454
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
- /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
- /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
- /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
- {classiq-0.38.0.dist-info → classiq-0.65.3.dist-info}/WHEEL +0 -0
@@ -1,16 +1,15 @@
|
|
1
1
|
import itertools
|
2
2
|
import sys
|
3
|
+
from collections.abc import Iterator
|
4
|
+
from types import GenericAlias as TypesGenericAlias
|
3
5
|
from typing import ( # type: ignore[attr-defined]
|
4
6
|
Any,
|
5
|
-
Dict,
|
6
|
-
Iterator,
|
7
|
-
List,
|
8
7
|
Optional,
|
9
|
-
Type,
|
10
8
|
Union,
|
11
9
|
_GenericAlias,
|
12
10
|
)
|
13
11
|
|
12
|
+
from classiq.interface.exceptions import ClassiqQRegError
|
14
13
|
from classiq.interface.generator.arith.register_user_input import (
|
15
14
|
RegisterArithmeticInfo,
|
16
15
|
RegisterUserInput,
|
@@ -18,11 +17,6 @@ from classiq.interface.generator.arith.register_user_input import (
|
|
18
17
|
from classiq.interface.generator.function_params import ArithmeticIODict, IOName
|
19
18
|
from classiq.interface.generator.register_role import RegisterRole
|
20
19
|
|
21
|
-
from classiq.exceptions import ClassiqQRegError
|
22
|
-
|
23
|
-
if sys.version_info >= (3, 9):
|
24
|
-
from types import GenericAlias as TypesGenericAlias
|
25
|
-
|
26
20
|
|
27
21
|
# This class is used for QReg, to support type-hint initialization
|
28
22
|
# Due to the `size` property of QReg
|
@@ -81,14 +75,17 @@ class QReg:
|
|
81
75
|
"""Initializes a new QReg with the specified number of qubits.
|
82
76
|
|
83
77
|
Args:
|
84
|
-
size
|
78
|
+
size: The number of qubits in the QReg.
|
85
79
|
"""
|
86
80
|
if size <= 0:
|
87
81
|
raise ClassiqQRegError(f"Cannot create {size} new qubits")
|
88
82
|
self._qubits = [Qubit() for _ in range(size)]
|
89
83
|
|
84
|
+
def __hash__(self) -> int:
|
85
|
+
return super.__hash__(self)
|
86
|
+
|
90
87
|
@classmethod
|
91
|
-
def _from_qubits(cls, qubits:
|
88
|
+
def _from_qubits(cls, qubits: list[Qubit]) -> "QReg":
|
92
89
|
if (
|
93
90
|
not isinstance(qubits, list)
|
94
91
|
or not all(isinstance(qubit, Qubit) for qubit in qubits)
|
@@ -139,7 +136,7 @@ class QReg:
|
|
139
136
|
return len(self._qubits)
|
140
137
|
|
141
138
|
@property
|
142
|
-
def qubits(self) ->
|
139
|
+
def qubits(self) -> list[Qubit]:
|
143
140
|
return self._qubits
|
144
141
|
|
145
142
|
def __class_getitem__(cls, params: Any) -> QRegGenericAlias:
|
@@ -229,7 +226,7 @@ _PROP_TO_QREG_TYPE = {
|
|
229
226
|
}
|
230
227
|
|
231
228
|
|
232
|
-
def _get_qreg_type_from_arithmetic_info(info: RegisterArithmeticInfo) ->
|
229
|
+
def _get_qreg_type_from_arithmetic_info(info: RegisterArithmeticInfo) -> type["QReg"]:
|
233
230
|
return _PROP_TO_QREG_TYPE[(info.is_signed, info.is_frac)]
|
234
231
|
|
235
232
|
|
@@ -245,7 +242,7 @@ def _get_qreg_generic_alias_from_arithmetic_info(
|
|
245
242
|
|
246
243
|
def get_type_and_size_dict(
|
247
244
|
arithmetic_info_dict: ArithmeticIODict,
|
248
|
-
) ->
|
245
|
+
) -> dict[IOName, QRegGenericAlias]:
|
249
246
|
return {
|
250
247
|
io_name: _get_qreg_generic_alias_from_arithmetic_info(info)
|
251
248
|
for io_name, info in arithmetic_info_dict.items()
|
@@ -253,11 +250,11 @@ def get_type_and_size_dict(
|
|
253
250
|
|
254
251
|
|
255
252
|
__all__ = [
|
253
|
+
"AuxQReg",
|
256
254
|
"QReg",
|
257
|
-
"QSInt",
|
258
|
-
"QUInt",
|
259
255
|
"QSFixed",
|
256
|
+
"QSInt",
|
260
257
|
"QUFixed",
|
258
|
+
"QUInt",
|
261
259
|
"ZeroQReg",
|
262
|
-
"AuxQReg",
|
263
260
|
]
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import ast
|
2
2
|
import re
|
3
|
-
from typing import Dict
|
4
3
|
|
5
4
|
import numexpr # type: ignore[import]
|
6
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqArithmeticError, ClassiqValueError
|
7
7
|
from classiq.interface.generator.arith import number_utils
|
8
8
|
from classiq.interface.generator.arith.arithmetic import Arithmetic
|
9
9
|
from classiq.interface.generator.arith.arithmetic_expression_abc import (
|
@@ -17,8 +17,6 @@ from classiq.interface.generator.oracles.oracle_abc import (
|
|
17
17
|
VariableTypedResultMap,
|
18
18
|
)
|
19
19
|
|
20
|
-
from classiq.exceptions import ClassiqArithmeticError, ClassiqValueError
|
21
|
-
|
22
20
|
|
23
21
|
class ArithmeticOracle(OracleABC[float], ArithmeticExpressionABC):
|
24
22
|
@staticmethod
|
@@ -62,7 +60,7 @@ class ArithmeticOracle(OracleABC[float], ArithmeticExpressionABC):
|
|
62
60
|
|
63
61
|
@staticmethod
|
64
62
|
def _simplify_negations_of_boolean_variables(
|
65
|
-
expression: str, input_definitions:
|
63
|
+
expression: str, input_definitions: dict[str, RegisterArithmeticInfo]
|
66
64
|
) -> str:
|
67
65
|
for var_name in input_definitions:
|
68
66
|
if getattr(input_definitions[var_name], "size", 0) == 1:
|
@@ -1,7 +1,8 @@
|
|
1
|
-
from typing import Any
|
1
|
+
from typing import Any
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
|
5
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
6
|
from classiq.interface.generator.function_params import parse_function_params_values
|
6
7
|
from classiq.interface.generator.oracles.oracle_abc import (
|
7
8
|
ArithmeticIODict,
|
@@ -11,8 +12,6 @@ from classiq.interface.generator.oracles.oracle_abc import (
|
|
11
12
|
)
|
12
13
|
from classiq.interface.generator.user_defined_function_params import CustomFunction
|
13
14
|
|
14
|
-
from classiq.exceptions import ClassiqValueError
|
15
|
-
|
16
15
|
QubitState = str
|
17
16
|
|
18
17
|
|
@@ -23,18 +22,21 @@ class CustomOracle(OracleABC[QubitState]):
|
|
23
22
|
default_factory=CustomFunction,
|
24
23
|
)
|
25
24
|
|
26
|
-
@pydantic.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
25
|
+
@pydantic.model_validator(mode="before")
|
26
|
+
@classmethod
|
27
|
+
def _parse_oracle(cls, values: Any) -> dict[str, Any]:
|
28
|
+
if isinstance(values, dict):
|
29
|
+
parse_function_params_values(
|
30
|
+
values=values,
|
31
|
+
params_key="custom_oracle_params",
|
32
|
+
discriminator_key="custom_oracle",
|
33
|
+
param_classes={CustomFunction},
|
34
|
+
default_parser_class=CustomFunction,
|
35
|
+
)
|
35
36
|
return values
|
36
37
|
|
37
|
-
@pydantic.
|
38
|
+
@pydantic.field_validator("custom_oracle_params")
|
39
|
+
@classmethod
|
38
40
|
def _validate_names_match_oracle(
|
39
41
|
cls, custom_oracle_params: CustomFunction
|
40
42
|
) -> CustomFunction:
|
@@ -1,19 +1,19 @@
|
|
1
1
|
import abc
|
2
|
-
from
|
2
|
+
from collections.abc import Sequence
|
3
|
+
from typing import Generic, Optional, TypeVar
|
3
4
|
|
4
5
|
import numpy as np
|
5
6
|
|
7
|
+
from classiq.interface.exceptions import ClassiqOracleError
|
6
8
|
from classiq.interface.executor.result import State
|
7
9
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
8
10
|
from classiq.interface.generator.function_params import ArithmeticIODict, FunctionParams
|
9
11
|
from classiq.interface.generator.generated_circuit_data import IOQubitMapping
|
10
12
|
|
11
|
-
from classiq.exceptions import ClassiqOracleError
|
12
|
-
|
13
13
|
ProblemResultType = TypeVar("ProblemResultType")
|
14
14
|
|
15
|
-
VariableBinResultMap =
|
16
|
-
VariableTypedResultMap =
|
15
|
+
VariableBinResultMap = dict[str, State]
|
16
|
+
VariableTypedResultMap = dict[str, ProblemResultType]
|
17
17
|
|
18
18
|
|
19
19
|
class OracleABC(abc.ABC, FunctionParams, Generic[ProblemResultType]):
|
@@ -59,7 +59,7 @@ class OracleABC(abc.ABC, FunctionParams, Generic[ProblemResultType]):
|
|
59
59
|
) -> bool:
|
60
60
|
pass
|
61
61
|
|
62
|
-
def variables(self) ->
|
62
|
+
def variables(self) -> list[RegisterUserInput]:
|
63
63
|
return [
|
64
64
|
RegisterUserInput.from_arithmetic_info(info=info, name=name)
|
65
65
|
for name, info in self._inputs.items()
|
@@ -72,5 +72,5 @@ class OracleABC(abc.ABC, FunctionParams, Generic[ProblemResultType]):
|
|
72
72
|
)
|
73
73
|
|
74
74
|
|
75
|
-
def _reverse_endianness(indices: Sequence[int], state_length: int) ->
|
75
|
+
def _reverse_endianness(indices: Sequence[int], state_length: int) -> list[int]:
|
76
76
|
return [state_length - 1 - index for index in indices]
|
@@ -1,11 +1,11 @@
|
|
1
1
|
import itertools
|
2
|
+
from collections.abc import Iterator
|
2
3
|
from dataclasses import dataclass
|
3
|
-
from typing import
|
4
|
+
from typing import Optional
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.slice_parsing_utils import parse_io_slicing
|
6
8
|
|
7
|
-
from classiq.exceptions import ClassiqValueError
|
8
|
-
|
9
9
|
|
10
10
|
@dataclass(frozen=True)
|
11
11
|
class PartitionedRegister:
|
@@ -13,7 +13,7 @@ class PartitionedRegister:
|
|
13
13
|
|
14
14
|
# There are up to num_qubits qubits within the partitions, with unique values from 0 to num_qubits-1
|
15
15
|
num_qubits: int
|
16
|
-
partitions:
|
16
|
+
partitions: tuple[tuple[int, ...], ...]
|
17
17
|
|
18
18
|
def __post_init__(self) -> None:
|
19
19
|
if not self.partitions:
|
@@ -48,7 +48,7 @@ class PartitionedRegister:
|
|
48
48
|
return RegisterPartition(self, _index=None)
|
49
49
|
|
50
50
|
@property
|
51
|
-
def _leftover_qubits(self) ->
|
51
|
+
def _leftover_qubits(self) -> tuple[int, ...]:
|
52
52
|
total_qubits = set(itertools.chain.from_iterable(self.partitions))
|
53
53
|
return tuple(
|
54
54
|
qubit for qubit in range(self.num_qubits) if qubit not in total_qubits
|
@@ -60,7 +60,7 @@ class PartitionedRegister:
|
|
60
60
|
|
61
61
|
def all_register_partitions(
|
62
62
|
self, include_leftover_partition: bool = False
|
63
|
-
) ->
|
63
|
+
) -> list["RegisterPartition"]:
|
64
64
|
all_partitions = [self.get_partition(i) for i in range(len(self.partitions))]
|
65
65
|
if include_leftover_partition:
|
66
66
|
all_partitions.append(self.leftover_partition)
|
@@ -83,7 +83,7 @@ class RegisterPartition:
|
|
83
83
|
raise ClassiqValueError(message)
|
84
84
|
|
85
85
|
@property
|
86
|
-
def qubits(self) ->
|
86
|
+
def qubits(self) -> tuple[int, ...]:
|
87
87
|
if self._index is None:
|
88
88
|
return self.partitioned_register._leftover_qubits
|
89
89
|
return self.partitioned_register.partitions[self._index]
|
@@ -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
|
-
@pydantic.root_validator
|
64
|
-
def _validate_exponentiation_specification(
|
65
|
-
cls, values: Dict[str, Any]
|
66
|
-
) -> Dict[str, Any]:
|
67
|
-
if values.get("scaling") is None and values.get("max_depths") is None:
|
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:
|
68
64
|
raise ClassiqValueError("At least one specification must be provided.")
|
69
|
-
return
|
65
|
+
return self
|
70
66
|
|
71
67
|
|
72
68
|
class PhaseEstimation(FunctionParams):
|
@@ -105,28 +101,42 @@ 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):
|
@@ -136,22 +146,23 @@ class PhaseEstimation(FunctionParams):
|
|
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
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
|
-
) !=
|
165
|
+
) != validation_info.data.get("size"):
|
155
166
|
raise ClassiqValueError(
|
156
167
|
"Length of max_depths must match the provided size."
|
157
168
|
)
|
@@ -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,
|
@@ -13,9 +16,6 @@ from classiq.interface.helpers.hashable_pydantic_base_model import (
|
|
13
16
|
HashablePydanticBaseModel,
|
14
17
|
)
|
15
18
|
|
16
|
-
from classiq._internals.enum_utils import StrEnum
|
17
|
-
from classiq.exceptions import ClassiqQSVMError, ClassiqValueError
|
18
|
-
|
19
19
|
VALID_PAULI_LETTERS = ("I", "X", "Y", "Z")
|
20
20
|
|
21
21
|
|
@@ -29,9 +29,7 @@ class QSVMFeatureMapEntanglement(StrEnum):
|
|
29
29
|
|
30
30
|
class QSVMFeatureMapDimensional(HashablePydanticBaseModel):
|
31
31
|
feature_dimension: Optional[int] = None
|
32
|
-
|
33
|
-
class Config:
|
34
|
-
frozen = True
|
32
|
+
model_config = ConfigDict(frozen=True)
|
35
33
|
|
36
34
|
|
37
35
|
class QSVMFeatureMapPauli(QSVMFeatureMapDimensional):
|
@@ -39,12 +37,13 @@ class QSVMFeatureMapPauli(QSVMFeatureMapDimensional):
|
|
39
37
|
reps: int = 2
|
40
38
|
entanglement: QSVMFeatureMapEntanglement = QSVMFeatureMapEntanglement.LINEAR
|
41
39
|
alpha: float = 2.0
|
42
|
-
paulis:
|
40
|
+
paulis: list[str] = ["Z", "ZZ"]
|
43
41
|
parameter_prefix: str = "x"
|
44
42
|
name: str = "PauliFeatureMap"
|
45
43
|
|
46
|
-
@pydantic.
|
47
|
-
|
44
|
+
@pydantic.field_validator("paulis", mode="before")
|
45
|
+
@classmethod
|
46
|
+
def set_paulis(cls, paulis: list[str]) -> list[str]:
|
48
47
|
# iterate every letter in every string in the list of paulis
|
49
48
|
for s in paulis:
|
50
49
|
if not all(map(VALID_PAULI_LETTERS.__contains__, s.upper())):
|