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,13 +1,13 @@
|
|
1
1
|
import pydantic
|
2
|
+
from pydantic import ConfigDict
|
2
3
|
|
3
4
|
from classiq.interface.chemistry import operator
|
4
5
|
from classiq.interface.chemistry.operator import PauliOperator
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
7
|
+
from classiq.interface.generator.function_params import FunctionParamsNumericParameter
|
5
8
|
from classiq.interface.generator.hamiltonian_evolution.hamiltonian_evolution import (
|
6
9
|
HamiltonianEvolution,
|
7
10
|
)
|
8
|
-
from classiq.interface.generator.parameters import ParameterFloatType
|
9
|
-
|
10
|
-
from classiq.exceptions import ClassiqValueError
|
11
11
|
|
12
12
|
|
13
13
|
class SuzukiParameters(pydantic.BaseModel):
|
@@ -19,7 +19,8 @@ class SuzukiParameters(pydantic.BaseModel):
|
|
19
19
|
default=1, description="The number of repetitions in the Suzuki-Trotter"
|
20
20
|
)
|
21
21
|
|
22
|
-
@pydantic.
|
22
|
+
@pydantic.field_validator("order")
|
23
|
+
@classmethod
|
23
24
|
def _validate_order(cls, order: int) -> int:
|
24
25
|
if order != 1 and order % 2:
|
25
26
|
raise ClassiqValueError(
|
@@ -27,8 +28,7 @@ class SuzukiParameters(pydantic.BaseModel):
|
|
27
28
|
)
|
28
29
|
return order
|
29
30
|
|
30
|
-
|
31
|
-
frozen = True
|
31
|
+
model_config = ConfigDict(frozen=True)
|
32
32
|
|
33
33
|
|
34
34
|
class SuzukiTrotter(HamiltonianEvolution):
|
@@ -36,10 +36,9 @@ class SuzukiTrotter(HamiltonianEvolution):
|
|
36
36
|
Suzuki trotterization of a Hermitian operator
|
37
37
|
"""
|
38
38
|
|
39
|
-
evolution_coefficient:
|
39
|
+
evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
|
40
40
|
default=1.0,
|
41
41
|
description="A global coefficient multiplying the operator.",
|
42
|
-
is_exec_param=True,
|
43
42
|
)
|
44
43
|
suzuki_parameters: SuzukiParameters = pydantic.Field(
|
45
44
|
default_factory=SuzukiParameters, description="The Suziki parameters."
|
@@ -48,7 +47,8 @@ class SuzukiTrotter(HamiltonianEvolution):
|
|
48
47
|
default=False, description="Whether to disable the reordering of Pauli terms."
|
49
48
|
)
|
50
49
|
|
51
|
-
@pydantic.
|
50
|
+
@pydantic.field_validator("pauli_operator")
|
51
|
+
@classmethod
|
52
52
|
def _validate_no_complex_coefficients(
|
53
53
|
cls, pauli_operator: PauliOperator
|
54
54
|
) -> PauliOperator:
|
@@ -1,10 +1,13 @@
|
|
1
1
|
import itertools
|
2
2
|
from collections import defaultdict
|
3
|
-
from
|
3
|
+
from collections.abc import MutableSet
|
4
|
+
from typing import Any, Optional
|
4
5
|
|
5
6
|
import pydantic
|
7
|
+
from typing_extensions import Self
|
6
8
|
|
7
9
|
from classiq.interface.backend.backend_preferences import BackendPreferences
|
10
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
11
|
from classiq.interface.generator.transpiler_basis_gates import (
|
9
12
|
DEFAULT_BASIS_GATES,
|
10
13
|
DEFAULT_ROUTING_BASIS_GATES,
|
@@ -14,16 +17,32 @@ from classiq.interface.generator.transpiler_basis_gates import (
|
|
14
17
|
)
|
15
18
|
from classiq.interface.helpers.custom_pydantic_types import PydanticNonNegIntTuple
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
ConnectivityMap = List[PydanticNonNegIntTuple]
|
20
|
+
ConnectivityMap = list[PydanticNonNegIntTuple]
|
20
21
|
BACKEND_VALIDATION_ERROR_MESSAGE = (
|
21
22
|
"Backend service provider and backend name should be specified together."
|
22
23
|
)
|
23
24
|
|
24
25
|
|
25
26
|
class HardwareData(pydantic.BaseModel):
|
26
|
-
|
27
|
+
"""
|
28
|
+
Hardware-specific settings used in quantum circuit synthesis,
|
29
|
+
including basis gates, connectivity map, and connectivity symmetry.
|
30
|
+
|
31
|
+
Attributes:
|
32
|
+
basis_gates (List[str]):
|
33
|
+
The basis gates of the hardware, used during model optimization.
|
34
|
+
If not provided, default values are used based on the connectivity map's symmetry.
|
35
|
+
|
36
|
+
connectivity_map(Optional[ConnectivityMap]):
|
37
|
+
The qubit connectivity map, defined as a list of qubit pairs [[q0, q1], [q1, q2],...].
|
38
|
+
If not provided, the hardware is assumed to be fully connected.
|
39
|
+
|
40
|
+
is_symmetric_connectivity(bool):
|
41
|
+
Indicates whether the coupling map forms an undirected graph, meaning
|
42
|
+
that both qubits in each pair can act as control and target. Defaults to True.
|
43
|
+
"""
|
44
|
+
|
45
|
+
basis_gates: list[str] = pydantic.Field(
|
27
46
|
default=list(),
|
28
47
|
description="The basis gates of the hardware. "
|
29
48
|
"This set will be used during the model optimization. "
|
@@ -43,7 +62,8 @@ class HardwareData(pydantic.BaseModel):
|
|
43
62
|
"If false, the first / second qubit denotes the control / target, respectively",
|
44
63
|
)
|
45
64
|
|
46
|
-
@pydantic.
|
65
|
+
@pydantic.field_validator("connectivity_map")
|
66
|
+
@classmethod
|
47
67
|
def _validate_connectivity_map(
|
48
68
|
cls, connectivity_map: Optional[ConnectivityMap]
|
49
69
|
) -> Optional[ConnectivityMap]:
|
@@ -54,39 +74,37 @@ class HardwareData(pydantic.BaseModel):
|
|
54
74
|
connectivity_map = _reindex_qubits(connectivity_map)
|
55
75
|
return connectivity_map
|
56
76
|
|
57
|
-
@pydantic.
|
58
|
-
def _symmetrize_connectivity_map(
|
59
|
-
connectivity_map =
|
77
|
+
@pydantic.model_validator(mode="after")
|
78
|
+
def _symmetrize_connectivity_map(self) -> Self:
|
79
|
+
connectivity_map = self.connectivity_map
|
60
80
|
if connectivity_map is None:
|
61
|
-
return
|
81
|
+
return self
|
62
82
|
|
63
|
-
is_symmetric =
|
83
|
+
is_symmetric = self.is_symmetric_connectivity
|
64
84
|
if is_symmetric:
|
65
85
|
connectivity_map = _symmetrize_connectivity_map(connectivity_map)
|
66
|
-
|
86
|
+
self.connectivity_map = connectivity_map
|
67
87
|
|
68
88
|
if not _is_connected_map(connectivity_map):
|
69
89
|
raise ClassiqValueError(
|
70
90
|
f"Connectivity map must be connected: {connectivity_map} is not connected."
|
71
91
|
)
|
72
|
-
return
|
92
|
+
return self
|
73
93
|
|
74
|
-
@pydantic.
|
75
|
-
def _validate_basis_gates(
|
76
|
-
connectivity_map =
|
77
|
-
specified_basis_gates =
|
94
|
+
@pydantic.model_validator(mode="after")
|
95
|
+
def _validate_basis_gates(self) -> Self:
|
96
|
+
connectivity_map = self.connectivity_map
|
97
|
+
specified_basis_gates = self.basis_gates
|
78
98
|
if connectivity_map is None:
|
79
|
-
|
80
|
-
return
|
99
|
+
self.basis_gates = specified_basis_gates or list(DEFAULT_BASIS_GATES)
|
100
|
+
return self
|
81
101
|
|
82
|
-
is_symmetric_connectivity =
|
102
|
+
is_symmetric_connectivity = self.is_symmetric_connectivity
|
83
103
|
if is_symmetric_connectivity or _check_symmetry(connectivity_map):
|
84
|
-
|
85
|
-
return
|
104
|
+
self.basis_gates = specified_basis_gates or list(DEFAULT_BASIS_GATES)
|
105
|
+
return self
|
86
106
|
|
87
|
-
|
88
|
-
DEFAULT_ROUTING_BASIS_GATES
|
89
|
-
)
|
107
|
+
self.basis_gates = specified_basis_gates or list(DEFAULT_ROUTING_BASIS_GATES)
|
90
108
|
invalid_gates = [
|
91
109
|
gate
|
92
110
|
for gate in specified_basis_gates
|
@@ -98,14 +116,21 @@ class HardwareData(pydantic.BaseModel):
|
|
98
116
|
"is currently supported for the following two-qubit gates only: cx, ecr, rzx."
|
99
117
|
)
|
100
118
|
|
101
|
-
return
|
119
|
+
return self
|
102
120
|
|
103
121
|
|
104
122
|
class CustomHardwareSettings(HardwareData):
|
123
|
+
"""
|
124
|
+
Custom hardware settings for quantum circuit synthesis.
|
125
|
+
This class inherits from HardwareData (please see class for more details)
|
126
|
+
|
127
|
+
"""
|
128
|
+
|
105
129
|
_width: Optional[int] = pydantic.PrivateAttr(default=None)
|
106
130
|
|
107
|
-
@pydantic.
|
108
|
-
|
131
|
+
@pydantic.field_validator("basis_gates", mode="after")
|
132
|
+
@classmethod
|
133
|
+
def validate_basis_gates(cls, basis_gates: list[str]) -> list[TranspilerBasisGates]:
|
109
134
|
valid_gates = list(TranspilerBasisGates)
|
110
135
|
invalid_gates = [gate for gate in basis_gates if gate not in valid_gates]
|
111
136
|
if invalid_gates:
|
@@ -130,7 +155,7 @@ class CustomHardwareSettings(HardwareData):
|
|
130
155
|
|
131
156
|
def _is_connected_map(connectivity_map: ConnectivityMap) -> bool:
|
132
157
|
nodes: MutableSet[int] = set()
|
133
|
-
node_to_neighbors:
|
158
|
+
node_to_neighbors: dict[int, MutableSet[int]] = defaultdict(set)
|
134
159
|
for edge in connectivity_map:
|
135
160
|
nodes.add(edge[0])
|
136
161
|
nodes.add(edge[1])
|
@@ -143,7 +168,7 @@ def _is_connected_map(connectivity_map: ConnectivityMap) -> bool:
|
|
143
168
|
|
144
169
|
|
145
170
|
def _node_dfs(
|
146
|
-
node: int, node_to_neighbors:
|
171
|
+
node: int, node_to_neighbors: dict[int, MutableSet[int]], visited: MutableSet[int]
|
147
172
|
) -> None:
|
148
173
|
visited.add(node)
|
149
174
|
neighbors = node_to_neighbors[node]
|
@@ -156,7 +181,7 @@ def _node_dfs(
|
|
156
181
|
|
157
182
|
def _reindex_qubits(connectivity_map: ConnectivityMap) -> ConnectivityMap:
|
158
183
|
qubits = sorted({q for pair in connectivity_map for q in pair})
|
159
|
-
return [
|
184
|
+
return [[qubits.index(pair[0]), qubits.index(pair[1])] for pair in connectivity_map]
|
160
185
|
|
161
186
|
|
162
187
|
def _check_symmetry(connectivity_map: ConnectivityMap) -> bool:
|
@@ -168,17 +193,30 @@ def _symmetrize_connectivity_map(connectivity_map: ConnectivityMap) -> Connectiv
|
|
168
193
|
# A more complicated implementation than using set to maintain the order
|
169
194
|
connectivity_map_no_duplicates = []
|
170
195
|
for edge in connectivity_map:
|
171
|
-
reversed_edge =
|
196
|
+
reversed_edge = [edge[1], edge[0]]
|
172
197
|
if (
|
173
198
|
edge not in connectivity_map_no_duplicates
|
174
199
|
and reversed_edge not in connectivity_map_no_duplicates
|
175
200
|
):
|
176
201
|
connectivity_map_no_duplicates.append(edge)
|
177
202
|
reversed_connectivity_map = [
|
178
|
-
|
203
|
+
[edge[1], edge[0]] for edge in connectivity_map_no_duplicates
|
179
204
|
]
|
180
205
|
return connectivity_map_no_duplicates + reversed_connectivity_map
|
181
206
|
|
182
207
|
|
183
208
|
class SynthesisHardwareData(HardwareData):
|
184
|
-
|
209
|
+
"""
|
210
|
+
Represents the synthesis-specific hardware data for a quantum circuit.
|
211
|
+
|
212
|
+
This class extends `HardwareData` and includes additional attributes that
|
213
|
+
pertain specifically to the hardware used during the synthesis of a quantum circuit.
|
214
|
+
|
215
|
+
Attributes:
|
216
|
+
backend_data (Optional[BackendPreferences]):
|
217
|
+
Preferences for the backend used during the synthesis process.
|
218
|
+
This can include specific backend configurations or settings.
|
219
|
+
Defaults to `None`.
|
220
|
+
"""
|
221
|
+
|
222
|
+
backend_data: Optional[BackendPreferences] = pydantic.Field(default=None)
|
@@ -1,8 +1,11 @@
|
|
1
1
|
import itertools
|
2
|
-
from typing import TYPE_CHECKING,
|
2
|
+
from typing import TYPE_CHECKING, Optional, Union
|
3
3
|
|
4
4
|
import pydantic
|
5
|
+
from pydantic_core.core_schema import ValidationInfo
|
5
6
|
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
6
9
|
from classiq.interface.generator import function_params
|
7
10
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
8
11
|
from classiq.interface.generator.function_params import (
|
@@ -15,10 +18,7 @@ from classiq.interface.generator.transpiler_basis_gates import (
|
|
15
18
|
)
|
16
19
|
from classiq.interface.helpers.custom_pydantic_types import PydanticNonNegIntTuple
|
17
20
|
|
18
|
-
|
19
|
-
from classiq.exceptions import ClassiqValueError
|
20
|
-
|
21
|
-
ConnectivityMap = List[PydanticNonNegIntTuple]
|
21
|
+
ConnectivityMap = list[PydanticNonNegIntTuple]
|
22
22
|
|
23
23
|
|
24
24
|
class SupportedConnectivityMaps(StrEnum):
|
@@ -45,16 +45,17 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
|
|
45
45
|
num_qubits: pydantic.PositiveInt = pydantic.Field(
|
46
46
|
default=None,
|
47
47
|
description="Number of qubits in the ansatz.",
|
48
|
+
validate_default=True,
|
48
49
|
)
|
49
50
|
reps: pydantic.PositiveInt = pydantic.Field(
|
50
51
|
default=1, description="Number of layers in the Ansatz"
|
51
52
|
)
|
52
53
|
|
53
|
-
one_qubit_gates: Union[str,
|
54
|
+
one_qubit_gates: Union[str, list[str]] = pydantic.Field(
|
54
55
|
default=["x", "ry"],
|
55
56
|
description='List of gates for the one qubit gates layer, e.g. ["x", "ry"]',
|
56
57
|
)
|
57
|
-
two_qubit_gates: Union[str,
|
58
|
+
two_qubit_gates: Union[str, list[str]] = pydantic.Field(
|
58
59
|
default=["cx"],
|
59
60
|
description='List of gates for the two qubit gates entangling layer, e.g. ["cx", "cry"]',
|
60
61
|
)
|
@@ -63,11 +64,12 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
|
|
63
64
|
description="Prefix for the generated parameters",
|
64
65
|
)
|
65
66
|
|
66
|
-
@pydantic.
|
67
|
+
@pydantic.field_validator("num_qubits", mode="before")
|
68
|
+
@classmethod
|
67
69
|
def validate_num_qubits(
|
68
|
-
cls, num_qubits: Optional[pydantic.PositiveInt],
|
70
|
+
cls, num_qubits: Optional[pydantic.PositiveInt], info: ValidationInfo
|
69
71
|
) -> pydantic.PositiveInt:
|
70
|
-
connectivity_map =
|
72
|
+
connectivity_map = info.data.get("connectivity_map")
|
71
73
|
conn_map_is_not_list = (
|
72
74
|
isinstance(connectivity_map, SupportedConnectivityMaps)
|
73
75
|
or connectivity_map is None
|
@@ -102,10 +104,11 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
|
|
102
104
|
)
|
103
105
|
return num_qubits
|
104
106
|
|
105
|
-
@pydantic.
|
107
|
+
@pydantic.field_validator("one_qubit_gates")
|
108
|
+
@classmethod
|
106
109
|
def validate_one_qubit_gates(
|
107
|
-
cls, one_qubit_gates: Union[str,
|
108
|
-
) -> Union[str,
|
110
|
+
cls, one_qubit_gates: Union[str, list[str]]
|
111
|
+
) -> Union[str, list[str]]:
|
109
112
|
one_qubit_gates_list = (
|
110
113
|
[one_qubit_gates] if isinstance(one_qubit_gates, str) else one_qubit_gates
|
111
114
|
)
|
@@ -114,10 +117,11 @@ class HardwareEfficientAnsatz(function_params.FunctionParams):
|
|
114
117
|
raise ClassiqValueError(f"Invalid one qubit gate: {one_qubit_gate}")
|
115
118
|
return one_qubit_gates
|
116
119
|
|
117
|
-
@pydantic.
|
120
|
+
@pydantic.field_validator("two_qubit_gates")
|
121
|
+
@classmethod
|
118
122
|
def validate_two_qubit_gates(
|
119
|
-
cls, two_qubit_gates: Union[str,
|
120
|
-
) -> Union[str,
|
123
|
+
cls, two_qubit_gates: Union[str, list[str]]
|
124
|
+
) -> Union[str, list[str]]:
|
121
125
|
two_qubit_gates_list = (
|
122
126
|
[two_qubit_gates] if isinstance(two_qubit_gates, str) else two_qubit_gates
|
123
127
|
)
|
@@ -1,16 +1,24 @@
|
|
1
|
+
from typing import Any, Union
|
2
|
+
|
1
3
|
import pydantic
|
2
4
|
|
3
|
-
from classiq.interface.chemistry.ground_state_problem import
|
5
|
+
from classiq.interface.chemistry.ground_state_problem import (
|
6
|
+
CHEMISTRY_PROBLEMS,
|
7
|
+
HamiltonianProblem,
|
8
|
+
MoleculeProblem,
|
9
|
+
)
|
10
|
+
from classiq.interface.exceptions import ClassiqValueError
|
4
11
|
from classiq.interface.generator.chemistry_function_params import (
|
5
12
|
ChemistryFunctionParams,
|
6
13
|
)
|
7
14
|
|
8
|
-
from classiq.exceptions import ClassiqValueError
|
9
|
-
|
10
15
|
|
11
16
|
class HartreeFock(ChemistryFunctionParams):
|
12
|
-
@pydantic.
|
13
|
-
|
17
|
+
@pydantic.field_validator("gs_problem")
|
18
|
+
@classmethod
|
19
|
+
def validate_gs_problem(
|
20
|
+
cls, gs_problem: Any
|
21
|
+
) -> Union[MoleculeProblem, HamiltonianProblem]:
|
14
22
|
if not isinstance(gs_problem, CHEMISTRY_PROBLEMS):
|
15
23
|
raise ClassiqValueError(
|
16
24
|
f"ground state problem must be of type {CHEMISTRY_PROBLEMS}"
|
@@ -1,14 +1,17 @@
|
|
1
|
-
from typing import TYPE_CHECKING,
|
1
|
+
from typing import TYPE_CHECKING, Annotated
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic import Field
|
4
5
|
|
5
6
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
7
|
from classiq.interface.generator.function_params import FunctionParams
|
7
8
|
|
8
9
|
if TYPE_CHECKING:
|
9
|
-
NonEmptyRegisterUserInputList =
|
10
|
+
NonEmptyRegisterUserInputList = list[RegisterUserInput]
|
10
11
|
else:
|
11
|
-
NonEmptyRegisterUserInputList =
|
12
|
+
NonEmptyRegisterUserInputList = Annotated[
|
13
|
+
list[RegisterUserInput], Field(min_length=1)
|
14
|
+
]
|
12
15
|
|
13
16
|
|
14
17
|
class Identity(FunctionParams):
|
@@ -16,10 +19,11 @@ class Identity(FunctionParams):
|
|
16
19
|
description="registers describing the state (ordered)"
|
17
20
|
)
|
18
21
|
|
19
|
-
@pydantic.
|
22
|
+
@pydantic.field_validator("arguments")
|
23
|
+
@classmethod
|
20
24
|
def _validate_argument_names(
|
21
|
-
cls, arguments:
|
22
|
-
) ->
|
25
|
+
cls, arguments: list[RegisterUserInput]
|
26
|
+
) -> list[RegisterUserInput]:
|
23
27
|
return [
|
24
28
|
arg if arg.name else arg.revalued(name=cls._get_default_arg_name(index))
|
25
29
|
for index, arg in enumerate(arguments)
|
@@ -1,24 +1,28 @@
|
|
1
|
-
from typing import TYPE_CHECKING,
|
1
|
+
from typing import TYPE_CHECKING, Annotated, Any
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic import StringConstraints
|
5
|
+
from typing_extensions import Self
|
4
6
|
|
7
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
8
|
from classiq.interface.generator import function_params
|
6
9
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
7
10
|
|
8
|
-
from classiq.exceptions import ClassiqValueError
|
9
|
-
|
10
11
|
STATE = "state"
|
11
12
|
TARGET = "target"
|
12
13
|
|
13
|
-
LENGTH_ERROR_MESSAGE = "
|
14
|
+
LENGTH_ERROR_MESSAGE = "Field required"
|
14
15
|
|
15
16
|
if TYPE_CHECKING:
|
16
17
|
PydanticPauliBasisStr = str
|
17
18
|
else:
|
18
|
-
PydanticPauliBasisStr =
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
PydanticPauliBasisStr = Annotated[
|
20
|
+
str,
|
21
|
+
StringConstraints(
|
22
|
+
to_lower=True,
|
23
|
+
pattern=r"[xyz]",
|
24
|
+
),
|
25
|
+
]
|
22
26
|
|
23
27
|
|
24
28
|
class LinearPauliRotations(function_params.FunctionParams):
|
@@ -47,29 +51,37 @@ class LinearPauliRotations(function_params.FunctionParams):
|
|
47
51
|
num_state_qubits: pydantic.PositiveInt = pydantic.Field(
|
48
52
|
description="The number of input qubits"
|
49
53
|
)
|
50
|
-
bases:
|
54
|
+
bases: list[PydanticPauliBasisStr] = pydantic.Field(
|
51
55
|
description="The types of Pauli rotations ('X', 'Y', 'Z')."
|
52
56
|
)
|
53
|
-
slopes:
|
57
|
+
slopes: list[float] = pydantic.Field(
|
54
58
|
description="The slopes of the controlled rotations."
|
55
59
|
)
|
56
|
-
offsets:
|
60
|
+
offsets: list[float] = pydantic.Field(
|
57
61
|
description="The offsets of the controlled rotations."
|
58
62
|
)
|
59
63
|
|
60
|
-
@pydantic.
|
61
|
-
|
64
|
+
@pydantic.field_validator("bases", "slopes", "offsets", mode="before")
|
65
|
+
@classmethod
|
66
|
+
def as_list(cls, v: Any) -> list[Any]:
|
62
67
|
if not isinstance(v, list):
|
63
68
|
v = [v]
|
64
|
-
|
69
|
+
res = []
|
70
|
+
for x in v:
|
71
|
+
element = x
|
72
|
+
if isinstance(x, str):
|
73
|
+
res.append(element.lower())
|
74
|
+
else:
|
75
|
+
res.append(element)
|
76
|
+
return res
|
65
77
|
|
66
|
-
@pydantic.
|
67
|
-
def validate_lists(
|
68
|
-
offsets =
|
69
|
-
bases =
|
70
|
-
slopes =
|
78
|
+
@pydantic.model_validator(mode="after")
|
79
|
+
def validate_lists(self) -> Self:
|
80
|
+
offsets = self.offsets or list()
|
81
|
+
bases = self.bases or list()
|
82
|
+
slopes = self.slopes or list()
|
71
83
|
if len(slopes) == len(offsets) and len(offsets) == len(bases):
|
72
|
-
return
|
84
|
+
return self
|
73
85
|
raise ClassiqValueError(LENGTH_ERROR_MESSAGE)
|
74
86
|
|
75
87
|
def _create_ios(self) -> None:
|
@@ -1,13 +1,14 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Optional, cast
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
|
5
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
6
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
7
|
from classiq.interface.generator.control_state import ControlState
|
7
|
-
from classiq.interface.generator.function_params import
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
from classiq.interface.generator.function_params import (
|
9
|
+
FunctionParams,
|
10
|
+
FunctionParamsNumericParameter,
|
11
|
+
)
|
11
12
|
|
12
13
|
CTRL = "CTRL"
|
13
14
|
TARGET = "TARGET"
|
@@ -30,17 +31,17 @@ class Mcu(FunctionParams):
|
|
30
31
|
e^(i*phi)*sin(theta/2) & e^(i*(phi+lam))*cos(theta/2) \\
|
31
32
|
"""
|
32
33
|
|
33
|
-
theta:
|
34
|
-
default=0, description="Theta radian angle."
|
34
|
+
theta: FunctionParamsNumericParameter = pydantic.Field(
|
35
|
+
default=0, description="Theta radian angle."
|
35
36
|
)
|
36
|
-
phi:
|
37
|
-
default=0, description="Phi radian angle."
|
37
|
+
phi: FunctionParamsNumericParameter = pydantic.Field(
|
38
|
+
default=0, description="Phi radian angle."
|
38
39
|
)
|
39
|
-
lam:
|
40
|
-
default=0, description="Lambda radian angle."
|
40
|
+
lam: FunctionParamsNumericParameter = pydantic.Field(
|
41
|
+
default=0, description="Lambda radian angle."
|
41
42
|
)
|
42
|
-
gam:
|
43
|
-
default=0, description="gam radian angle."
|
43
|
+
gam: FunctionParamsNumericParameter = pydantic.Field(
|
44
|
+
default=0, description="gam radian angle."
|
44
45
|
)
|
45
46
|
|
46
47
|
num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
|
@@ -50,8 +51,9 @@ class Mcu(FunctionParams):
|
|
50
51
|
default=None, description="string of the control state"
|
51
52
|
)
|
52
53
|
|
53
|
-
@pydantic.
|
54
|
-
|
54
|
+
@pydantic.model_validator(mode="before")
|
55
|
+
@classmethod
|
56
|
+
def _validate_control(cls, values: Any) -> dict[str, Any]:
|
55
57
|
num_ctrl_qubits = values.get("num_ctrl_qubits")
|
56
58
|
ctrl_state = values.get("ctrl_state")
|
57
59
|
|
@@ -1,13 +1,13 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic_core.core_schema import ValidationInfo
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
8
|
from classiq.interface.generator.control_state import ControlState
|
7
9
|
from classiq.interface.generator.function_params import FunctionParams
|
8
10
|
|
9
|
-
from classiq.exceptions import ClassiqValueError
|
10
|
-
|
11
11
|
CTRL = "CTRL_IN"
|
12
12
|
TARGET_QUBIT = "TARGET_QUBIT"
|
13
13
|
|
@@ -17,29 +17,34 @@ class Mcx(FunctionParams):
|
|
17
17
|
multi-controlled x-gate
|
18
18
|
"""
|
19
19
|
|
20
|
-
arguments:
|
20
|
+
arguments: list[RegisterUserInput] = pydantic.Field(
|
21
21
|
default_factory=list, description="registers describing the state (ordered)"
|
22
22
|
)
|
23
23
|
num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
|
24
|
-
description="number of control qubits"
|
24
|
+
description="number of control qubits",
|
25
|
+
default=None,
|
26
|
+
)
|
27
|
+
ctrl_state: str = pydantic.Field(
|
28
|
+
default="", description="control state string", validate_default=True
|
25
29
|
)
|
26
|
-
ctrl_state: str = pydantic.Field(default="", description="control state string")
|
27
30
|
|
28
|
-
@pydantic.
|
31
|
+
@pydantic.field_validator("arguments")
|
32
|
+
@classmethod
|
29
33
|
def _validate_argument_names(
|
30
|
-
cls, arguments:
|
31
|
-
) ->
|
32
|
-
register_name_list:
|
34
|
+
cls, arguments: list[RegisterUserInput]
|
35
|
+
) -> list[RegisterUserInput]:
|
36
|
+
register_name_list: list[Optional[str]] = [arg.name for arg in arguments]
|
33
37
|
if None in register_name_list:
|
34
38
|
raise ClassiqValueError("All registers must be named")
|
35
39
|
if len(set(register_name_list)) != len(register_name_list):
|
36
40
|
raise ClassiqValueError("Registers must have distinct names")
|
37
41
|
return arguments
|
38
42
|
|
39
|
-
@pydantic.
|
40
|
-
|
43
|
+
@pydantic.model_validator(mode="before")
|
44
|
+
@classmethod
|
45
|
+
def _validate_sizes(cls, values: dict[str, Any]) -> dict[str, Any]:
|
41
46
|
arguments_size = sum(arg.size for arg in values.get("arguments", list()))
|
42
|
-
|
47
|
+
num_ctrl_qubits = values.get("num_ctrl_qubits")
|
43
48
|
if not num_ctrl_qubits:
|
44
49
|
num_ctrl_qubits = arguments_size - 1
|
45
50
|
|
@@ -52,11 +57,13 @@ class Mcx(FunctionParams):
|
|
52
57
|
values["arguments"] = [ctrl_register, target_register]
|
53
58
|
elif num_ctrl_qubits != arguments_size - 1:
|
54
59
|
raise ClassiqValueError("Given sizes do not match")
|
55
|
-
|
60
|
+
values["num_ctrl_qubits"] = num_ctrl_qubits
|
61
|
+
return values
|
56
62
|
|
57
|
-
@pydantic.
|
58
|
-
|
59
|
-
|
63
|
+
@pydantic.field_validator("ctrl_state")
|
64
|
+
@classmethod
|
65
|
+
def _validate_ctrl_state(cls, ctrl_state: str, info: ValidationInfo) -> str:
|
66
|
+
num_ctrl_qubits = info.data.get("num_ctrl_qubits", -1)
|
60
67
|
if not ctrl_state:
|
61
68
|
return "1" * num_ctrl_qubits
|
62
69
|
if len(ctrl_state) != num_ctrl_qubits:
|