classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,6 +1,4 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
from classiq._internals.enum_utils import StrEnum
|
1
|
+
from classiq.interface.enum_utils import StrEnum
|
4
2
|
|
5
3
|
|
6
4
|
class RegisterRole(StrEnum):
|
@@ -10,9 +8,10 @@ class RegisterRole(StrEnum):
|
|
10
8
|
ZERO_INPUT = "zero_input"
|
11
9
|
ZERO_OUTPUT = "zero_output"
|
12
10
|
GARBAGE_OUTPUT = "garbage_output"
|
11
|
+
EXPLICIT_ZERO_INPUT = "explicit_zero_input"
|
13
12
|
|
14
13
|
@staticmethod
|
15
|
-
def output_roles(include_garbage: bool = False) ->
|
14
|
+
def output_roles(include_garbage: bool = False) -> set["RegisterRole"]:
|
16
15
|
roles = {
|
17
16
|
RegisterRole.OUTPUT,
|
18
17
|
RegisterRole.ZERO_OUTPUT,
|
@@ -23,5 +22,18 @@ class RegisterRole(StrEnum):
|
|
23
22
|
return roles
|
24
23
|
|
25
24
|
@staticmethod
|
26
|
-
def input_roles() ->
|
27
|
-
return {
|
25
|
+
def input_roles() -> set["RegisterRole"]:
|
26
|
+
return {
|
27
|
+
RegisterRole.INPUT,
|
28
|
+
RegisterRole.ZERO_INPUT,
|
29
|
+
RegisterRole.AUXILIARY,
|
30
|
+
RegisterRole.EXPLICIT_ZERO_INPUT,
|
31
|
+
}
|
32
|
+
|
33
|
+
@staticmethod
|
34
|
+
def clean_output_roles() -> set["RegisterRole"]:
|
35
|
+
return {RegisterRole.ZERO_OUTPUT, RegisterRole.AUXILIARY}
|
36
|
+
|
37
|
+
@staticmethod
|
38
|
+
def dirty_output_roles() -> set["RegisterRole"]:
|
39
|
+
return {RegisterRole.OUTPUT, RegisterRole.GARBAGE_OUTPUT}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
import re
|
2
|
-
from
|
2
|
+
from re import Match
|
3
|
+
from typing import Optional
|
3
4
|
|
5
|
+
from classiq.interface.exceptions import ClassiqValueError
|
4
6
|
from classiq.interface.generator.function_params import NAME_REGEX
|
5
7
|
|
6
8
|
NAME = "name"
|
@@ -10,12 +12,12 @@ SLICING_CHARS = rf"[0-9\-{SEPARATOR}]+"
|
|
10
12
|
IO_REGEX = rf"(?P<{NAME}>{NAME_REGEX})(\[(?P<{SLICING}>{SLICING_CHARS})\])?"
|
11
13
|
|
12
14
|
|
13
|
-
def parse_io_slicing(io_str: str) ->
|
15
|
+
def parse_io_slicing(io_str: str) -> tuple[str, slice]:
|
14
16
|
name, slicing = separate_name_and_slice(io_str)
|
15
17
|
return name, get_slice(slicing)
|
16
18
|
|
17
19
|
|
18
|
-
def separate_name_and_slice(io_str: str) ->
|
20
|
+
def separate_name_and_slice(io_str: str) -> tuple[str, Optional[str]]:
|
19
21
|
match: Optional[Match] = re.fullmatch(IO_REGEX, io_str)
|
20
22
|
if match is None:
|
21
23
|
raise AssertionError("Input/output name validation error")
|
@@ -33,9 +35,12 @@ def get_slice(slicing: Optional[str]) -> slice:
|
|
33
35
|
|
34
36
|
if len(split) == 1:
|
35
37
|
index_block = split[0]
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
try:
|
39
|
+
index = int(index_block)
|
40
|
+
except ValueError:
|
41
|
+
raise ClassiqValueError(
|
42
|
+
f"Index {index_block!r} is not an integer"
|
43
|
+
) from None
|
39
44
|
stop = index + 1 if index != -1 else None
|
40
45
|
return slice(index, stop, None)
|
41
46
|
|
@@ -1,7 +1,9 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Literal, Optional, Union
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic_core.core_schema import ValidationInfo
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
8
|
from classiq.interface.generator.control_state import ControlState
|
7
9
|
from classiq.interface.generator.standard_gates.standard_gates import (
|
@@ -24,46 +26,29 @@ class ControlledGate(_StandardGate): # type: ignore[misc]
|
|
24
26
|
num_ctrl_qubits: pydantic.PositiveInt = pydantic.Field(
|
25
27
|
default=DEFAULT_NUM_CTRL_QUBITS
|
26
28
|
)
|
27
|
-
|
28
|
-
def _create_ios(self) -> None:
|
29
|
-
_StandardGate._create_ios(self)
|
30
|
-
control = RegisterUserInput(
|
31
|
-
name=CONTROLLED_GATE_CONTROL, size=self.num_ctrl_qubits
|
32
|
-
)
|
33
|
-
self._inputs[CONTROLLED_GATE_CONTROL] = control
|
34
|
-
self._outputs[CONTROLLED_GATE_CONTROL] = control
|
35
|
-
|
36
|
-
def to_control_state(self) -> ControlState:
|
37
|
-
return ControlState(
|
38
|
-
name=CONTROLLED_GATE_CONTROL, num_ctrl_qubits=self.num_ctrl_qubits
|
39
|
-
)
|
40
|
-
|
41
|
-
|
42
|
-
class ControlledGateWithState(ControlledGate): # type: ignore[misc]
|
43
|
-
"""
|
44
|
-
Base model for controlled Gates with control over the controlled_state
|
45
|
-
"""
|
46
|
-
|
47
29
|
ctrl_state: CtrlState = pydantic.Field(
|
48
30
|
description="The control state in decimal or as a bit string (e.g. '1011'). If not specified, the control "
|
49
31
|
"state is 2**num_ctrl_qubits - 1.\n"
|
50
|
-
"The gate will be performed if the state of the control qubits matches the control state"
|
32
|
+
"The gate will be performed if the state of the control qubits matches the control state",
|
33
|
+
default=None,
|
34
|
+
validate_default=True,
|
51
35
|
)
|
52
36
|
|
53
|
-
@pydantic.
|
37
|
+
@pydantic.field_validator("ctrl_state")
|
38
|
+
@classmethod
|
54
39
|
def _validate_ctrl_state(
|
55
|
-
cls, ctrl_state: CtrlState,
|
40
|
+
cls, ctrl_state: CtrlState, info: ValidationInfo
|
56
41
|
) -> CtrlState:
|
57
|
-
num_ctrl_qubits: int =
|
42
|
+
num_ctrl_qubits: int = info.data.get("num_ctrl_qubits", DEFAULT_NUM_CTRL_QUBITS)
|
58
43
|
ctrl_state = ctrl_state if ctrl_state is not None else "1" * num_ctrl_qubits
|
59
44
|
|
60
45
|
if isinstance(ctrl_state, str) and len(ctrl_state) != num_ctrl_qubits:
|
61
|
-
raise
|
46
|
+
raise ClassiqValueError(
|
62
47
|
f"Invalid control state: {ctrl_state!r}. "
|
63
48
|
f"Expected {num_ctrl_qubits} qubits"
|
64
49
|
)
|
65
50
|
elif isinstance(ctrl_state, int) and ctrl_state >= 2**num_ctrl_qubits:
|
66
|
-
raise
|
51
|
+
raise ClassiqValueError(
|
67
52
|
f"Invalid control state: {ctrl_state}. "
|
68
53
|
f"Expected value between 0 and {2**num_ctrl_qubits-1}"
|
69
54
|
)
|
@@ -77,12 +62,20 @@ class ControlledGateWithState(ControlledGate): # type: ignore[misc]
|
|
77
62
|
)
|
78
63
|
return ControlState(name=CONTROLLED_GATE_CONTROL, ctrl_state=ctrl_state_str)
|
79
64
|
|
65
|
+
def _create_ios(self) -> None:
|
66
|
+
_StandardGate._create_ios(self)
|
67
|
+
control = RegisterUserInput(
|
68
|
+
name=CONTROLLED_GATE_CONTROL, size=self.num_ctrl_qubits
|
69
|
+
)
|
70
|
+
self._inputs[CONTROLLED_GATE_CONTROL] = control
|
71
|
+
self._outputs[CONTROLLED_GATE_CONTROL] = control
|
72
|
+
|
80
73
|
|
81
74
|
def _num_to_control_string(ctrl_state_int: int, num_ctrl_qubits: int) -> str:
|
82
75
|
return format(ctrl_state_int, f"0{num_ctrl_qubits}b")
|
83
76
|
|
84
77
|
|
85
|
-
class CXGate(
|
78
|
+
class CXGate(ControlledGate): # type: ignore[misc]
|
86
79
|
"""
|
87
80
|
The Controlled-X Gate
|
88
81
|
"""
|
@@ -93,7 +86,7 @@ class CXGate(ControlledGateWithState): # type: ignore[misc]
|
|
93
86
|
return 2
|
94
87
|
|
95
88
|
|
96
|
-
class CCXGate(
|
89
|
+
class CCXGate(ControlledGate): # type: ignore[misc]
|
97
90
|
"""
|
98
91
|
The Double Controlled-X Gate
|
99
92
|
"""
|
@@ -104,7 +97,7 @@ class CCXGate(ControlledGateWithState): # type: ignore[misc]
|
|
104
97
|
return 2
|
105
98
|
|
106
99
|
|
107
|
-
class C3XGate(
|
100
|
+
class C3XGate(ControlledGate): # type: ignore[misc]
|
108
101
|
"""
|
109
102
|
The X Gate controlled on 3 qubits
|
110
103
|
"""
|
@@ -116,7 +109,7 @@ class C3XGate(ControlledGateWithState): # type: ignore[misc]
|
|
116
109
|
return 2
|
117
110
|
|
118
111
|
|
119
|
-
class C4XGate(
|
112
|
+
class C4XGate(ControlledGate): # type: ignore[misc]
|
120
113
|
"""
|
121
114
|
The X Gate controlled on 4 qubits
|
122
115
|
"""
|
@@ -128,7 +121,7 @@ class C4XGate(ControlledGateWithState): # type: ignore[misc]
|
|
128
121
|
return 2
|
129
122
|
|
130
123
|
|
131
|
-
class CYGate(
|
124
|
+
class CYGate(ControlledGate): # type: ignore[misc]
|
132
125
|
"""
|
133
126
|
The Controlled-Y Gate
|
134
127
|
"""
|
@@ -137,7 +130,7 @@ class CYGate(ControlledGateWithState): # type: ignore[misc]
|
|
137
130
|
return 2
|
138
131
|
|
139
132
|
|
140
|
-
class CZGate(
|
133
|
+
class CZGate(ControlledGate): # type: ignore[misc]
|
141
134
|
"""
|
142
135
|
The Controlled-Z Gate
|
143
136
|
"""
|
@@ -146,7 +139,7 @@ class CZGate(ControlledGateWithState): # type: ignore[misc]
|
|
146
139
|
return 2
|
147
140
|
|
148
141
|
|
149
|
-
class CHGate(
|
142
|
+
class CHGate(ControlledGate): # type: ignore[misc]
|
150
143
|
"""
|
151
144
|
The Controlled-H Gate
|
152
145
|
"""
|
@@ -155,7 +148,7 @@ class CHGate(ControlledGateWithState): # type: ignore[misc]
|
|
155
148
|
return 2
|
156
149
|
|
157
150
|
|
158
|
-
class CSXGate(
|
151
|
+
class CSXGate(ControlledGate): # type: ignore[misc]
|
159
152
|
"""
|
160
153
|
The Controlled-SX Gate
|
161
154
|
"""
|
@@ -164,25 +157,25 @@ class CSXGate(ControlledGateWithState): # type: ignore[misc]
|
|
164
157
|
return 4
|
165
158
|
|
166
159
|
|
167
|
-
class CRXGate(
|
160
|
+
class CRXGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
168
161
|
"""
|
169
162
|
The Controlled-RX Gate
|
170
163
|
"""
|
171
164
|
|
172
165
|
|
173
|
-
class CRYGate(
|
166
|
+
class CRYGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
174
167
|
"""
|
175
168
|
The Controlled-RY Gate
|
176
169
|
"""
|
177
170
|
|
178
171
|
|
179
|
-
class CRZGate(
|
172
|
+
class CRZGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
180
173
|
"""
|
181
174
|
The Controlled-RZ Gate
|
182
175
|
"""
|
183
176
|
|
184
177
|
|
185
|
-
class CPhaseGate(
|
178
|
+
class CPhaseGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
186
179
|
"""
|
187
180
|
The Controlled-Phase Gate
|
188
181
|
"""
|
@@ -2,7 +2,7 @@ from typing import Any
|
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
|
5
|
-
from classiq.interface.generator.
|
5
|
+
from classiq.interface.generator.function_params import FunctionParamsNumericParameter
|
6
6
|
|
7
7
|
PydanticMetaClass: Any = type(pydantic.BaseModel)
|
8
8
|
|
@@ -16,14 +16,10 @@ class MyMetaAngledClass(type):
|
|
16
16
|
@staticmethod
|
17
17
|
def _create_new_namespace(namespace: dict, **kwargs: Any) -> dict:
|
18
18
|
angles = kwargs.get("angles", [])
|
19
|
-
annotations = {angle:
|
20
|
-
fields = {
|
21
|
-
angle: pydantic.fields.FieldInfo(is_exec_param=True) for angle in angles
|
22
|
-
}
|
19
|
+
annotations = {angle: FunctionParamsNumericParameter for angle in angles}
|
23
20
|
original_annotations = namespace.get("__annotations__", {})
|
24
21
|
return {
|
25
22
|
**namespace,
|
26
|
-
**fields,
|
27
23
|
**{"__annotations__": {**original_annotations, **annotations}},
|
28
24
|
}
|
29
25
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Literal, Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
|
@@ -13,7 +13,7 @@ To add new standard gates, refer to the following guide
|
|
13
13
|
https://docs.google.com/document/d/1Nt9frxnPkSn8swNpOQ983E95eaEiDWaiuWAKglGtUAA/edit#heading=h.e9g9309bzkxt
|
14
14
|
"""
|
15
15
|
|
16
|
-
_POSSIBLE_PARAMETERS:
|
16
|
+
_POSSIBLE_PARAMETERS: list[str] = ["theta", "phi", "lam"]
|
17
17
|
DEFAULT_STANDARD_GATE_ARG_NAME: str = "TARGET"
|
18
18
|
|
19
19
|
|
@@ -39,7 +39,7 @@ class _StandardGate(FunctionParams, metaclass=MyMetaAngledClassModel): # type:
|
|
39
39
|
return self._num_target_qubits
|
40
40
|
|
41
41
|
def __init_subclass__(
|
42
|
-
cls, angles: Optional[
|
42
|
+
cls, angles: Optional[list[str]] = None, **kwargs: Any
|
43
43
|
) -> None:
|
44
44
|
super().__init_subclass__(**kwargs)
|
45
45
|
|
@@ -2,7 +2,7 @@ import pydantic
|
|
2
2
|
|
3
3
|
from classiq.interface.generator import function_params
|
4
4
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
5
|
-
from classiq.interface.generator.
|
5
|
+
from classiq.interface.generator.function_params import FunctionParamsNumericParameter
|
6
6
|
from classiq.interface.generator.standard_gates.standard_gates import (
|
7
7
|
DEFAULT_STANDARD_GATE_ARG_NAME,
|
8
8
|
)
|
@@ -18,24 +18,20 @@ class UGate(function_params.FunctionParams):
|
|
18
18
|
e^(i*phi)*sin(theta/2) & e^(i*(phi+lam))*cos(theta/2) \\
|
19
19
|
"""
|
20
20
|
|
21
|
-
theta:
|
21
|
+
theta: FunctionParamsNumericParameter = pydantic.Field(
|
22
22
|
description="Angle to rotate by the Y-axis.",
|
23
|
-
is_exec_param=True,
|
24
23
|
)
|
25
24
|
|
26
|
-
phi:
|
25
|
+
phi: FunctionParamsNumericParameter = pydantic.Field(
|
27
26
|
description="First angle to rotate by the Z-axis.",
|
28
|
-
is_exec_param=True,
|
29
27
|
)
|
30
28
|
|
31
|
-
lam:
|
29
|
+
lam: FunctionParamsNumericParameter = pydantic.Field(
|
32
30
|
description="Second angle to rotate by the Z-axis.",
|
33
|
-
is_exec_param=True,
|
34
31
|
)
|
35
32
|
|
36
|
-
gam:
|
33
|
+
gam: FunctionParamsNumericParameter = pydantic.Field(
|
37
34
|
description="Angle to apply phase gate by.",
|
38
|
-
is_exec_param=True,
|
39
35
|
)
|
40
36
|
|
41
37
|
_inputs = pydantic.PrivateAttr(
|
@@ -56,5 +52,6 @@ class UGate(function_params.FunctionParams):
|
|
56
52
|
@property
|
57
53
|
def is_parametric(self) -> bool:
|
58
54
|
return not all(
|
59
|
-
isinstance(getattr(self, angle), (float, int))
|
55
|
+
isinstance(getattr(self, angle), (float, int))
|
56
|
+
for angle in ["theta", "phi", "lam", "gam"]
|
60
57
|
)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Literal
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
|
@@ -7,8 +7,8 @@ from classiq.interface.generator.state_preparation.state_preparation_abc import
|
|
7
7
|
)
|
8
8
|
|
9
9
|
BellStateName = Literal["psi+", "psi-", "phi+", "phi-"]
|
10
|
-
_ALIGNED_STATES:
|
11
|
-
_SIGNED_STATES:
|
10
|
+
_ALIGNED_STATES: frozenset[BellStateName] = frozenset({"phi+", "phi-"})
|
11
|
+
_SIGNED_STATES: frozenset[BellStateName] = frozenset({"psi-", "phi-"})
|
12
12
|
|
13
13
|
|
14
14
|
class BellStatePreparation(StatePreparationABC):
|
@@ -12,7 +12,8 @@ class ComputationalBasisStatePreparation(StatePreparationABC):
|
|
12
12
|
description="binary computational state to create"
|
13
13
|
)
|
14
14
|
|
15
|
-
@pydantic.
|
15
|
+
@pydantic.field_validator("computational_state")
|
16
|
+
@classmethod
|
16
17
|
def _validate_computational_state(
|
17
18
|
cls, computational_state: PydanticNonEmptyString
|
18
19
|
) -> PydanticNonEmptyString:
|
@@ -1,7 +1,9 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Collection, Sequence
|
2
|
+
from typing import Union
|
2
3
|
|
3
4
|
import pydantic
|
4
5
|
from numpy.typing import ArrayLike
|
6
|
+
from pydantic import ConfigDict
|
5
7
|
|
6
8
|
from classiq.interface.generator.validations.validator_functions import (
|
7
9
|
validate_probabilities,
|
@@ -10,36 +12,35 @@ from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityF
|
|
10
12
|
|
11
13
|
|
12
14
|
class PMF(pydantic.BaseModel):
|
13
|
-
pmf:
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
pmf: tuple[PydanticProbabilityFloat, ...]
|
16
|
+
|
17
|
+
@pydantic.field_validator("pmf")
|
18
|
+
@classmethod
|
19
|
+
def _validate_pmf(
|
20
|
+
cls, pmf: tuple[PydanticProbabilityFloat, ...]
|
21
|
+
) -> Sequence[PydanticProbabilityFloat]:
|
22
|
+
return validate_probabilities(cls, pmf)
|
17
23
|
|
18
|
-
|
19
|
-
frozen = True
|
24
|
+
model_config = ConfigDict(frozen=True)
|
20
25
|
|
21
26
|
|
22
27
|
class GaussianMoments(pydantic.BaseModel):
|
23
28
|
mu: float
|
24
29
|
sigma: pydantic.PositiveFloat
|
25
|
-
|
26
|
-
class Config:
|
27
|
-
frozen = True
|
30
|
+
model_config = ConfigDict(frozen=True)
|
28
31
|
|
29
32
|
|
30
33
|
class GaussianMixture(pydantic.BaseModel):
|
31
|
-
gaussian_moment_list:
|
34
|
+
gaussian_moment_list: tuple[GaussianMoments, ...]
|
32
35
|
num_qubits: pydantic.PositiveInt = pydantic.Field(
|
33
36
|
description="Number of qubits for the provided state."
|
34
37
|
)
|
35
|
-
|
36
|
-
class Config:
|
37
|
-
frozen = True
|
38
|
+
model_config = ConfigDict(frozen=True)
|
38
39
|
|
39
40
|
|
40
41
|
Probabilities = Union[PMF, GaussianMixture]
|
41
42
|
FlexibleProbabilities = Union[Probabilities, ArrayLike, dict, Collection[float]]
|
42
|
-
Amplitudes =
|
43
|
+
Amplitudes = tuple[float, ...]
|
43
44
|
FlexibleAmplitudes = Union[ArrayLike, Collection[float]]
|
44
45
|
Distribution = Union[Amplitudes, Probabilities]
|
45
46
|
|
@@ -1,16 +1,14 @@
|
|
1
|
-
from
|
2
|
-
|
1
|
+
from classiq.interface.enum_utils import StrEnum
|
2
|
+
from classiq.interface.exceptions import ClassiqValueError
|
3
3
|
from classiq.interface.generator.preferences.optimization import (
|
4
4
|
StatePrepOptimizationMethod,
|
5
5
|
)
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
_AMPLITUDE_SUPPORTING_METRICS: FrozenSet = frozenset(
|
7
|
+
_AMPLITUDE_SUPPORTING_METRICS: frozenset = frozenset(
|
10
8
|
{"L2", "L1", "MAX_PROBABILITY", "TOTAL_VARIATION"}
|
11
9
|
)
|
12
10
|
|
13
|
-
_ZERO_DIVERGENT_METRICS:
|
11
|
+
_ZERO_DIVERGENT_METRICS: frozenset = frozenset({"KL", "BHATTACHARYYA"})
|
14
12
|
|
15
13
|
|
16
14
|
class Metrics(StrEnum):
|
@@ -30,7 +28,7 @@ class Metrics(StrEnum):
|
|
30
28
|
try:
|
31
29
|
return Metrics(sp_opt_method.value)
|
32
30
|
except ValueError:
|
33
|
-
raise
|
31
|
+
raise ClassiqValueError(
|
34
32
|
f"Failed to convert {sp_opt_method} to an error metric"
|
35
33
|
) from None
|
36
34
|
|
@@ -1,8 +1,11 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Optional, Union
|
2
2
|
|
3
3
|
import numpy as np
|
4
4
|
import pydantic
|
5
|
+
from pydantic_core.core_schema import ValidationInfo
|
6
|
+
from typing_extensions import Self
|
5
7
|
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
6
9
|
from classiq.interface.generator.range_types import NonNegativeFloatRange
|
7
10
|
from classiq.interface.generator.state_preparation.distributions import (
|
8
11
|
PMF,
|
@@ -24,19 +27,24 @@ from classiq.interface.generator.validations.validator_functions import (
|
|
24
27
|
|
25
28
|
class StatePreparation(StatePreparationABC):
|
26
29
|
amplitudes: Optional[Amplitudes] = pydantic.Field(
|
27
|
-
description="vector of probabilities",
|
30
|
+
description="vector of probabilities",
|
31
|
+
default=None,
|
32
|
+
validate_default=True,
|
28
33
|
)
|
29
34
|
probabilities: Optional[Probabilities] = pydantic.Field(
|
30
|
-
description="vector of amplitudes",
|
35
|
+
description="vector of amplitudes",
|
36
|
+
default=None,
|
37
|
+
validate_default=True,
|
31
38
|
)
|
32
|
-
error_metric:
|
39
|
+
error_metric: dict[Metrics, NonNegativeFloatRange] = pydantic.Field(
|
33
40
|
default_factory=lambda: {
|
34
41
|
Metrics.L2: NonNegativeFloatRange(lower_bound=0, upper_bound=1e-4)
|
35
42
|
}
|
36
43
|
)
|
37
44
|
# The order of validations is important: amplitudes, probabilities, error_metric
|
38
45
|
|
39
|
-
@pydantic.
|
46
|
+
@pydantic.field_validator("amplitudes", mode="before")
|
47
|
+
@classmethod
|
40
48
|
def _initialize_amplitudes(
|
41
49
|
cls, amplitudes: Optional[FlexibleAmplitudes]
|
42
50
|
) -> Optional[Amplitudes]:
|
@@ -46,11 +54,12 @@ class StatePreparation(StatePreparationABC):
|
|
46
54
|
if amplitudes.ndim == 1:
|
47
55
|
return validate_amplitudes(tuple(amplitudes))
|
48
56
|
|
49
|
-
raise
|
57
|
+
raise ClassiqValueError(
|
50
58
|
"Invalid amplitudes were given, please ensure the amplitude is a vector of float in the form of either tuple or list or numpy array"
|
51
59
|
)
|
52
60
|
|
53
|
-
@pydantic.
|
61
|
+
@pydantic.field_validator("probabilities", mode="before")
|
62
|
+
@classmethod
|
54
63
|
def _initialize_probabilities(
|
55
64
|
cls, probabilities: Optional[FlexibleProbabilities]
|
56
65
|
) -> Optional[Union[PMF, GaussianMixture, dict]]:
|
@@ -64,15 +73,16 @@ class StatePreparation(StatePreparationABC):
|
|
64
73
|
if probabilities.ndim == 1:
|
65
74
|
return PMF(pmf=probabilities.tolist())
|
66
75
|
|
67
|
-
raise
|
76
|
+
raise ClassiqValueError(
|
68
77
|
"Invalid probabilities were given, please ensure the probabilities is a vector of float in the form of either tuple or list or numpy array"
|
69
78
|
)
|
70
79
|
|
71
|
-
@pydantic.
|
80
|
+
@pydantic.field_validator("error_metric", mode="before")
|
81
|
+
@classmethod
|
72
82
|
def _validate_error_metric(
|
73
|
-
cls, error_metric:
|
74
|
-
) ->
|
75
|
-
if not
|
83
|
+
cls, error_metric: dict[Metrics, NonNegativeFloatRange], info: ValidationInfo
|
84
|
+
) -> dict[Metrics, NonNegativeFloatRange]:
|
85
|
+
if not info.data.get("amplitudes"):
|
76
86
|
return error_metric
|
77
87
|
unsupported_metrics = {
|
78
88
|
Metrics(metric).value
|
@@ -80,27 +90,24 @@ class StatePreparation(StatePreparationABC):
|
|
80
90
|
if not Metrics(metric).supports_amplitudes
|
81
91
|
}
|
82
92
|
if unsupported_metrics:
|
83
|
-
raise
|
93
|
+
raise ClassiqValueError(
|
84
94
|
f"{unsupported_metrics} are not supported for amplitude preparation"
|
85
95
|
)
|
86
96
|
return error_metric
|
87
97
|
|
88
|
-
@pydantic.
|
89
|
-
def _validate_either_probabilities_or_amplitudes(
|
90
|
-
|
91
|
-
|
92
|
-
) -> Optional[Union[PMF, GaussianMixture, dict]]:
|
93
|
-
amplitudes = values.get("amplitudes")
|
94
|
-
probabilities = values.get("probabilities")
|
98
|
+
@pydantic.model_validator(mode="after")
|
99
|
+
def _validate_either_probabilities_or_amplitudes(self) -> Self:
|
100
|
+
amplitudes = self.amplitudes
|
101
|
+
probabilities = self.probabilities
|
95
102
|
if amplitudes is not None and probabilities is not None:
|
96
|
-
raise
|
103
|
+
raise ClassiqValueError(
|
97
104
|
"StatePreparation can't get both probabilities and amplitudes"
|
98
105
|
)
|
99
|
-
return
|
106
|
+
return self
|
100
107
|
|
101
108
|
@property
|
102
109
|
def num_state_qubits(self) -> int:
|
103
110
|
distribution = self.probabilities or self.amplitudes
|
104
111
|
if distribution is None:
|
105
|
-
raise
|
112
|
+
raise ClassiqValueError("Must have either probabilities or amplitudes")
|
106
113
|
return num_of_qubits(distribution)
|
@@ -1,10 +1,7 @@
|
|
1
|
-
from typing import Optional
|
2
|
-
|
3
1
|
import pydantic
|
4
2
|
|
5
3
|
|
6
4
|
class SynthesisStepDurations(pydantic.BaseModel):
|
7
|
-
model_preprocessing: Optional[float] = None
|
8
5
|
preprocessing: float
|
9
6
|
solving: float
|
10
7
|
conversion_to_circuit: float
|
@@ -14,7 +11,6 @@ class SynthesisStepDurations(pydantic.BaseModel):
|
|
14
11
|
return sum(
|
15
12
|
time if time is not None else 0
|
16
13
|
for time in (
|
17
|
-
self.model_preprocessing,
|
18
14
|
self.preprocessing,
|
19
15
|
self.solving,
|
20
16
|
self.conversion_to_circuit,
|
@@ -1,25 +1,39 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
import sympy
|
4
5
|
|
5
6
|
from classiq.interface.backend.pydantic_backend import PydanticExecutionParameter
|
7
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
|
+
from classiq.interface.generator.parameters import ParameterType
|
6
9
|
|
7
10
|
|
8
11
|
class FunctionExecutionData(pydantic.BaseModel):
|
9
|
-
power_parameter: Optional[
|
12
|
+
power_parameter: Optional[ParameterType] = pydantic.Field(default=None)
|
13
|
+
|
14
|
+
@property
|
15
|
+
def power_var(self) -> Optional[str]:
|
16
|
+
if self.power_parameter is None:
|
17
|
+
return None
|
18
|
+
power_vars = sympy.sympify(self.power_parameter).free_symbols
|
19
|
+
if len(power_vars) != 1:
|
20
|
+
raise ClassiqValueError(
|
21
|
+
f"Power parameter expression: {self.power_parameter} must contain exactly one variable"
|
22
|
+
)
|
23
|
+
return str(list(power_vars)[0])
|
10
24
|
|
11
25
|
|
12
26
|
class ExecutionData(pydantic.BaseModel):
|
13
|
-
function_execution:
|
27
|
+
function_execution: dict[str, FunctionExecutionData] = pydantic.Field(
|
14
28
|
default_factory=dict
|
15
29
|
)
|
16
30
|
|
17
31
|
@property
|
18
32
|
def execution_parameters(
|
19
33
|
self,
|
20
|
-
) ->
|
34
|
+
) -> set[PydanticExecutionParameter]:
|
21
35
|
return {
|
22
|
-
function_execution_data.
|
36
|
+
function_execution_data.power_var
|
23
37
|
for function_execution_data in self.function_execution.values()
|
24
|
-
if function_execution_data.
|
38
|
+
if function_execution_data.power_var is not None
|
25
39
|
}
|