classiq 0.38.0__py3-none-any.whl → 0.65.4__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.4.dist-info}/METADATA +16 -9
- classiq-0.65.4.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.4.dist-info}/WHEEL +0 -0
@@ -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 (
|
@@ -9,8 +11,6 @@ from classiq.interface.generator.standard_gates.standard_gates import (
|
|
9
11
|
_StandardGate,
|
10
12
|
)
|
11
13
|
|
12
|
-
from classiq.exceptions import ClassiqValueError
|
13
|
-
|
14
14
|
CONTROLLED_GATE_CONTROL: str = "CTRL"
|
15
15
|
CONTROLLED_GATE_TARGET: str = DEFAULT_STANDARD_GATE_ARG_NAME
|
16
16
|
DEFAULT_NUM_CTRL_QUBITS: int = 1
|
@@ -26,37 +26,20 @@ class ControlledGate(_StandardGate): # type: ignore[misc]
|
|
26
26
|
num_ctrl_qubits: pydantic.PositiveInt = pydantic.Field(
|
27
27
|
default=DEFAULT_NUM_CTRL_QUBITS
|
28
28
|
)
|
29
|
-
|
30
|
-
def _create_ios(self) -> None:
|
31
|
-
_StandardGate._create_ios(self)
|
32
|
-
control = RegisterUserInput(
|
33
|
-
name=CONTROLLED_GATE_CONTROL, size=self.num_ctrl_qubits
|
34
|
-
)
|
35
|
-
self._inputs[CONTROLLED_GATE_CONTROL] = control
|
36
|
-
self._outputs[CONTROLLED_GATE_CONTROL] = control
|
37
|
-
|
38
|
-
def to_control_state(self) -> ControlState:
|
39
|
-
return ControlState(
|
40
|
-
name=CONTROLLED_GATE_CONTROL, num_ctrl_qubits=self.num_ctrl_qubits
|
41
|
-
)
|
42
|
-
|
43
|
-
|
44
|
-
class ControlledGateWithState(ControlledGate): # type: ignore[misc]
|
45
|
-
"""
|
46
|
-
Base model for controlled Gates with control over the controlled_state
|
47
|
-
"""
|
48
|
-
|
49
29
|
ctrl_state: CtrlState = pydantic.Field(
|
50
30
|
description="The control state in decimal or as a bit string (e.g. '1011'). If not specified, the control "
|
51
31
|
"state is 2**num_ctrl_qubits - 1.\n"
|
52
|
-
"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,
|
53
35
|
)
|
54
36
|
|
55
|
-
@pydantic.
|
37
|
+
@pydantic.field_validator("ctrl_state")
|
38
|
+
@classmethod
|
56
39
|
def _validate_ctrl_state(
|
57
|
-
cls, ctrl_state: CtrlState,
|
40
|
+
cls, ctrl_state: CtrlState, info: ValidationInfo
|
58
41
|
) -> CtrlState:
|
59
|
-
num_ctrl_qubits: int =
|
42
|
+
num_ctrl_qubits: int = info.data.get("num_ctrl_qubits", DEFAULT_NUM_CTRL_QUBITS)
|
60
43
|
ctrl_state = ctrl_state if ctrl_state is not None else "1" * num_ctrl_qubits
|
61
44
|
|
62
45
|
if isinstance(ctrl_state, str) and len(ctrl_state) != num_ctrl_qubits:
|
@@ -79,12 +62,20 @@ class ControlledGateWithState(ControlledGate): # type: ignore[misc]
|
|
79
62
|
)
|
80
63
|
return ControlState(name=CONTROLLED_GATE_CONTROL, ctrl_state=ctrl_state_str)
|
81
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
|
+
|
82
73
|
|
83
74
|
def _num_to_control_string(ctrl_state_int: int, num_ctrl_qubits: int) -> str:
|
84
75
|
return format(ctrl_state_int, f"0{num_ctrl_qubits}b")
|
85
76
|
|
86
77
|
|
87
|
-
class CXGate(
|
78
|
+
class CXGate(ControlledGate): # type: ignore[misc]
|
88
79
|
"""
|
89
80
|
The Controlled-X Gate
|
90
81
|
"""
|
@@ -95,7 +86,7 @@ class CXGate(ControlledGateWithState): # type: ignore[misc]
|
|
95
86
|
return 2
|
96
87
|
|
97
88
|
|
98
|
-
class CCXGate(
|
89
|
+
class CCXGate(ControlledGate): # type: ignore[misc]
|
99
90
|
"""
|
100
91
|
The Double Controlled-X Gate
|
101
92
|
"""
|
@@ -106,7 +97,7 @@ class CCXGate(ControlledGateWithState): # type: ignore[misc]
|
|
106
97
|
return 2
|
107
98
|
|
108
99
|
|
109
|
-
class C3XGate(
|
100
|
+
class C3XGate(ControlledGate): # type: ignore[misc]
|
110
101
|
"""
|
111
102
|
The X Gate controlled on 3 qubits
|
112
103
|
"""
|
@@ -118,7 +109,7 @@ class C3XGate(ControlledGateWithState): # type: ignore[misc]
|
|
118
109
|
return 2
|
119
110
|
|
120
111
|
|
121
|
-
class C4XGate(
|
112
|
+
class C4XGate(ControlledGate): # type: ignore[misc]
|
122
113
|
"""
|
123
114
|
The X Gate controlled on 4 qubits
|
124
115
|
"""
|
@@ -130,7 +121,7 @@ class C4XGate(ControlledGateWithState): # type: ignore[misc]
|
|
130
121
|
return 2
|
131
122
|
|
132
123
|
|
133
|
-
class CYGate(
|
124
|
+
class CYGate(ControlledGate): # type: ignore[misc]
|
134
125
|
"""
|
135
126
|
The Controlled-Y Gate
|
136
127
|
"""
|
@@ -139,7 +130,7 @@ class CYGate(ControlledGateWithState): # type: ignore[misc]
|
|
139
130
|
return 2
|
140
131
|
|
141
132
|
|
142
|
-
class CZGate(
|
133
|
+
class CZGate(ControlledGate): # type: ignore[misc]
|
143
134
|
"""
|
144
135
|
The Controlled-Z Gate
|
145
136
|
"""
|
@@ -148,7 +139,7 @@ class CZGate(ControlledGateWithState): # type: ignore[misc]
|
|
148
139
|
return 2
|
149
140
|
|
150
141
|
|
151
|
-
class CHGate(
|
142
|
+
class CHGate(ControlledGate): # type: ignore[misc]
|
152
143
|
"""
|
153
144
|
The Controlled-H Gate
|
154
145
|
"""
|
@@ -157,7 +148,7 @@ class CHGate(ControlledGateWithState): # type: ignore[misc]
|
|
157
148
|
return 2
|
158
149
|
|
159
150
|
|
160
|
-
class CSXGate(
|
151
|
+
class CSXGate(ControlledGate): # type: ignore[misc]
|
161
152
|
"""
|
162
153
|
The Controlled-SX Gate
|
163
154
|
"""
|
@@ -166,25 +157,25 @@ class CSXGate(ControlledGateWithState): # type: ignore[misc]
|
|
166
157
|
return 4
|
167
158
|
|
168
159
|
|
169
|
-
class CRXGate(
|
160
|
+
class CRXGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
170
161
|
"""
|
171
162
|
The Controlled-RX Gate
|
172
163
|
"""
|
173
164
|
|
174
165
|
|
175
|
-
class CRYGate(
|
166
|
+
class CRYGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
176
167
|
"""
|
177
168
|
The Controlled-RY Gate
|
178
169
|
"""
|
179
170
|
|
180
171
|
|
181
|
-
class CRZGate(
|
172
|
+
class CRZGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
182
173
|
"""
|
183
174
|
The Controlled-RZ Gate
|
184
175
|
"""
|
185
176
|
|
186
177
|
|
187
|
-
class CPhaseGate(
|
178
|
+
class CPhaseGate(ControlledGate, angles=["theta"]): # type: ignore[misc]
|
188
179
|
"""
|
189
180
|
The Controlled-Phase Gate
|
190
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,17 +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
|
-
from classiq.exceptions import ClassiqValueError
|
9
|
-
|
10
|
-
_AMPLITUDE_SUPPORTING_METRICS: FrozenSet = frozenset(
|
7
|
+
_AMPLITUDE_SUPPORTING_METRICS: frozenset = frozenset(
|
11
8
|
{"L2", "L1", "MAX_PROBABILITY", "TOTAL_VARIATION"}
|
12
9
|
)
|
13
10
|
|
14
|
-
_ZERO_DIVERGENT_METRICS:
|
11
|
+
_ZERO_DIVERGENT_METRICS: frozenset = frozenset({"KL", "BHATTACHARYYA"})
|
15
12
|
|
16
13
|
|
17
14
|
class Metrics(StrEnum):
|
@@ -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,
|
@@ -21,24 +24,27 @@ from classiq.interface.generator.validations.validator_functions import (
|
|
21
24
|
validate_amplitudes,
|
22
25
|
)
|
23
26
|
|
24
|
-
from classiq.exceptions import ClassiqValueError
|
25
|
-
|
26
27
|
|
27
28
|
class StatePreparation(StatePreparationABC):
|
28
29
|
amplitudes: Optional[Amplitudes] = pydantic.Field(
|
29
|
-
description="vector of probabilities",
|
30
|
+
description="vector of probabilities",
|
31
|
+
default=None,
|
32
|
+
validate_default=True,
|
30
33
|
)
|
31
34
|
probabilities: Optional[Probabilities] = pydantic.Field(
|
32
|
-
description="vector of amplitudes",
|
35
|
+
description="vector of amplitudes",
|
36
|
+
default=None,
|
37
|
+
validate_default=True,
|
33
38
|
)
|
34
|
-
error_metric:
|
39
|
+
error_metric: dict[Metrics, NonNegativeFloatRange] = pydantic.Field(
|
35
40
|
default_factory=lambda: {
|
36
41
|
Metrics.L2: NonNegativeFloatRange(lower_bound=0, upper_bound=1e-4)
|
37
42
|
}
|
38
43
|
)
|
39
44
|
# The order of validations is important: amplitudes, probabilities, error_metric
|
40
45
|
|
41
|
-
@pydantic.
|
46
|
+
@pydantic.field_validator("amplitudes", mode="before")
|
47
|
+
@classmethod
|
42
48
|
def _initialize_amplitudes(
|
43
49
|
cls, amplitudes: Optional[FlexibleAmplitudes]
|
44
50
|
) -> Optional[Amplitudes]:
|
@@ -52,7 +58,8 @@ class StatePreparation(StatePreparationABC):
|
|
52
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"
|
53
59
|
)
|
54
60
|
|
55
|
-
@pydantic.
|
61
|
+
@pydantic.field_validator("probabilities", mode="before")
|
62
|
+
@classmethod
|
56
63
|
def _initialize_probabilities(
|
57
64
|
cls, probabilities: Optional[FlexibleProbabilities]
|
58
65
|
) -> Optional[Union[PMF, GaussianMixture, dict]]:
|
@@ -70,11 +77,12 @@ class StatePreparation(StatePreparationABC):
|
|
70
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"
|
71
78
|
)
|
72
79
|
|
73
|
-
@pydantic.
|
80
|
+
@pydantic.field_validator("error_metric", mode="before")
|
81
|
+
@classmethod
|
74
82
|
def _validate_error_metric(
|
75
|
-
cls, error_metric:
|
76
|
-
) ->
|
77
|
-
if not
|
83
|
+
cls, error_metric: dict[Metrics, NonNegativeFloatRange], info: ValidationInfo
|
84
|
+
) -> dict[Metrics, NonNegativeFloatRange]:
|
85
|
+
if not info.data.get("amplitudes"):
|
78
86
|
return error_metric
|
79
87
|
unsupported_metrics = {
|
80
88
|
Metrics(metric).value
|
@@ -87,18 +95,15 @@ class StatePreparation(StatePreparationABC):
|
|
87
95
|
)
|
88
96
|
return error_metric
|
89
97
|
|
90
|
-
@pydantic.
|
91
|
-
def _validate_either_probabilities_or_amplitudes(
|
92
|
-
|
93
|
-
|
94
|
-
) -> Optional[Union[PMF, GaussianMixture, dict]]:
|
95
|
-
amplitudes = values.get("amplitudes")
|
96
|
-
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
|
97
102
|
if amplitudes is not None and probabilities is not None:
|
98
103
|
raise ClassiqValueError(
|
99
104
|
"StatePreparation can't get both probabilities and amplitudes"
|
100
105
|
)
|
101
|
-
return
|
106
|
+
return self
|
102
107
|
|
103
108
|
@property
|
104
109
|
def num_state_qubits(self) -> int:
|
@@ -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
|
}
|
@@ -1,10 +1,10 @@
|
|
1
|
-
from typing import TYPE_CHECKING,
|
1
|
+
from typing import TYPE_CHECKING, Optional
|
2
2
|
|
3
3
|
from typing_extensions import TypeAlias
|
4
4
|
|
5
|
-
from classiq.
|
5
|
+
from classiq.interface.enum_utils import StrEnum
|
6
6
|
|
7
|
-
BasisGates: TypeAlias =
|
7
|
+
BasisGates: TypeAlias = frozenset[str]
|
8
8
|
|
9
9
|
SINGLE_QUBIT_GATES: BasisGates = frozenset(
|
10
10
|
(
|
@@ -86,6 +86,10 @@ class LowerValsEnum(StrEnum):
|
|
86
86
|
if TYPE_CHECKING:
|
87
87
|
# A subset of the gates for better type checking
|
88
88
|
class TranspilerBasisGates(StrEnum):
|
89
|
+
"""
|
90
|
+
A subset of the gates used in the transpiler.
|
91
|
+
"""
|
92
|
+
|
89
93
|
X = "x"
|
90
94
|
CX = "cx"
|
91
95
|
CZ = "cz"
|