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,18 +1,26 @@
|
|
1
|
+
from collections.abc import Collection
|
1
2
|
from functools import reduce
|
2
|
-
from typing import
|
3
|
+
from typing import (
|
4
|
+
Any,
|
5
|
+
Optional,
|
6
|
+
Union,
|
7
|
+
cast,
|
8
|
+
)
|
3
9
|
|
4
10
|
import numpy as np
|
5
11
|
import pydantic
|
6
12
|
import sympy
|
7
13
|
from more_itertools import all_equal
|
14
|
+
from pydantic import ConfigDict
|
8
15
|
|
9
|
-
from classiq.interface.
|
16
|
+
from classiq.interface.exceptions import ClassiqValueError
|
10
17
|
from classiq.interface.generator.function_params import validate_expression_str
|
11
18
|
from classiq.interface.generator.parameters import (
|
12
19
|
ParameterComplexType,
|
13
20
|
ParameterType,
|
14
21
|
PydanticParameterComplexType,
|
15
22
|
)
|
23
|
+
from classiq.interface.generator.types.builtin_enum_declarations import Pauli
|
16
24
|
from classiq.interface.helpers.custom_pydantic_types import (
|
17
25
|
PydanticPauliList,
|
18
26
|
PydanticPauliMonomial,
|
@@ -23,8 +31,6 @@ from classiq.interface.helpers.hashable_pydantic_base_model import (
|
|
23
31
|
)
|
24
32
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
25
33
|
|
26
|
-
from classiq.exceptions import ClassiqValueError
|
27
|
-
|
28
34
|
|
29
35
|
class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
30
36
|
"""
|
@@ -34,8 +40,8 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
34
40
|
pauli_list: PydanticPauliList = pydantic.Field(
|
35
41
|
description="A list of tuples each containing a pauli string comprised of I,X,Y,Z characters and a complex coefficient; for example [('IZ', 0.1), ('XY', 0.2)].",
|
36
42
|
)
|
37
|
-
is_hermitian: bool = pydantic.Field(default=False)
|
38
43
|
has_complex_coefficients: bool = pydantic.Field(default=True)
|
44
|
+
is_hermitian: bool = pydantic.Field(default=False)
|
39
45
|
|
40
46
|
def show(self) -> str:
|
41
47
|
if self.is_hermitian:
|
@@ -47,16 +53,19 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
47
53
|
f"+({summand[1]:+.3f}) * {summand[0]}" for summand in self.pauli_list
|
48
54
|
)
|
49
55
|
|
50
|
-
@pydantic.
|
56
|
+
@pydantic.field_validator("pauli_list", mode="before")
|
57
|
+
@classmethod
|
51
58
|
def _validate_pauli_monomials(
|
52
|
-
cls,
|
53
|
-
) ->
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
59
|
+
cls, pauli_list: PydanticPauliList
|
60
|
+
) -> PydanticPauliList:
|
61
|
+
validated_pauli_list = []
|
62
|
+
for monomial in pauli_list:
|
63
|
+
# Validate the length
|
64
|
+
_PauliMonomialLengthValidator(monomial=monomial) # type: ignore[call-arg]
|
65
|
+
coeff = cls._validate_monomial_coefficient(monomial[1])
|
66
|
+
parsed_monomial = _PauliMonomialParser(string=monomial[0], coeff=coeff)
|
67
|
+
validated_pauli_list.append((parsed_monomial.string, parsed_monomial.coeff))
|
68
|
+
return validated_pauli_list
|
60
69
|
|
61
70
|
@staticmethod
|
62
71
|
def _validate_monomial_coefficient(
|
@@ -68,16 +77,38 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
68
77
|
coeff = str(coeff)
|
69
78
|
return coeff
|
70
79
|
|
71
|
-
@pydantic.
|
80
|
+
@pydantic.field_validator("pauli_list", mode="after")
|
81
|
+
@classmethod
|
72
82
|
def _validate_pauli_list(cls, pauli_list: PydanticPauliList) -> PydanticPauliList:
|
73
83
|
if not all_equal(len(summand[0]) for summand in pauli_list):
|
74
84
|
raise ClassiqValueError("Pauli strings have incompatible lengths.")
|
75
85
|
return pauli_list
|
76
86
|
|
77
|
-
@
|
78
|
-
def
|
87
|
+
@staticmethod
|
88
|
+
def check_if_hermitian(pauli_list: PydanticPauliList) -> bool:
|
89
|
+
if all(isinstance(summand[1], (float, int, complex)) for summand in pauli_list):
|
90
|
+
if all(np.isclose(summand[1].imag, 0) for summand in pauli_list): # type: ignore[union-attr]
|
91
|
+
return True
|
92
|
+
|
93
|
+
for pauli_string, coeff in pauli_list:
|
94
|
+
reverse_string = pauli_string[::-1]
|
95
|
+
reverse_found = False
|
96
|
+
for other_string, other_coeff in pauli_list:
|
97
|
+
if other_string == reverse_string and np.isclose(
|
98
|
+
coeff, other_coeff.conjugate() # type: ignore[union-attr]
|
99
|
+
):
|
100
|
+
reverse_found = True
|
101
|
+
break
|
102
|
+
if not reverse_found:
|
103
|
+
return False
|
104
|
+
return True
|
105
|
+
return False
|
106
|
+
|
107
|
+
@pydantic.model_validator(mode="before")
|
108
|
+
@classmethod
|
109
|
+
def _validate_hermitianity(cls, values: dict[str, Any]) -> dict[str, Any]:
|
79
110
|
pauli_list = values.get("pauli_list", [])
|
80
|
-
if
|
111
|
+
if PauliOperator.check_if_hermitian(pauli_list):
|
81
112
|
values["is_hermitian"] = all(
|
82
113
|
np.isclose(complex(summand[1]).real, summand[1])
|
83
114
|
for summand in pauli_list
|
@@ -85,7 +116,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
85
116
|
if values.get("is_hermitian", False):
|
86
117
|
values["has_complex_coefficients"] = False
|
87
118
|
values["pauli_list"] = [
|
88
|
-
(summand[0], complex(summand[1].real)
|
119
|
+
(summand[0], complex(summand[1]).real) for summand in pauli_list
|
89
120
|
]
|
90
121
|
else:
|
91
122
|
values["has_complex_coefficients"] = not all(
|
@@ -120,7 +151,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
120
151
|
)
|
121
152
|
|
122
153
|
@staticmethod
|
123
|
-
def _is_sub_pauli_commutative(qubit_pauli_string: Union[
|
154
|
+
def _is_sub_pauli_commutative(qubit_pauli_string: Union[list[str], str]) -> bool:
|
124
155
|
unique_paulis = set(qubit_pauli_string) - {"I"}
|
125
156
|
return len(unique_paulis) <= 1
|
126
157
|
|
@@ -128,8 +159,12 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
128
159
|
def num_qubits(self) -> int:
|
129
160
|
return len(self.pauli_list[0][0])
|
130
161
|
|
162
|
+
@property
|
163
|
+
def all_coefficients_numeric(self) -> bool:
|
164
|
+
return all(isinstance(summand[1], complex) for summand in self.pauli_list)
|
165
|
+
|
131
166
|
def to_matrix(self) -> np.ndarray:
|
132
|
-
if not
|
167
|
+
if not self.all_coefficients_numeric:
|
133
168
|
raise ClassiqValueError(
|
134
169
|
"Supporting only Hamiltonian with numeric coefficients."
|
135
170
|
)
|
@@ -149,7 +184,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
149
184
|
(self._extend_pauli_string(pauli_string, num_extra_qubits), coeff)
|
150
185
|
for (pauli_string, coeff) in self.pauli_list
|
151
186
|
]
|
152
|
-
return self.
|
187
|
+
return self.model_copy(update={"pauli_list": new_pauli_list}, deep=True)
|
153
188
|
|
154
189
|
@staticmethod
|
155
190
|
def _reorder_pauli_string(
|
@@ -199,13 +234,13 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
199
234
|
(cls._reorder_pauli_string(pauli_string, order, new_num_qubits), coeff)
|
200
235
|
for pauli_string, coeff in operator.pauli_list
|
201
236
|
]
|
202
|
-
return cls(pauli_list=new_pauli_list)
|
237
|
+
return cls(pauli_list=new_pauli_list, is_hermitian=operator.is_hermitian)
|
203
238
|
|
204
239
|
@classmethod
|
205
240
|
def from_unzipped_lists(
|
206
241
|
cls,
|
207
|
-
operators:
|
208
|
-
coefficients: Optional[
|
242
|
+
operators: list[list["Pauli"]],
|
243
|
+
coefficients: Optional[list[complex]] = None,
|
209
244
|
) -> "PauliOperator":
|
210
245
|
if coefficients is None:
|
211
246
|
coefficients = [1] * len(operators)
|
@@ -222,208 +257,7 @@ class PauliOperator(HashablePydanticBaseModel, VersionedModel):
|
|
222
257
|
]
|
223
258
|
)
|
224
259
|
|
225
|
-
|
226
|
-
frozen = True
|
227
|
-
|
228
|
-
|
229
|
-
class PauliOperatorV1(HashablePydanticBaseModel):
|
230
|
-
"""
|
231
|
-
Specification of a Pauli sum operator.
|
232
|
-
"""
|
233
|
-
|
234
|
-
pauli_list: PydanticPauliList = pydantic.Field(
|
235
|
-
description="A list of tuples each containing a pauli string comprised of I,X,Y,Z characters and a complex coefficient; for example [('IZ', 0.1), ('XY', 0.2)].",
|
236
|
-
)
|
237
|
-
is_hermitian: bool = pydantic.Field(default=False)
|
238
|
-
has_complex_coefficients: bool = pydantic.Field(default=True)
|
239
|
-
|
240
|
-
def show(self) -> str:
|
241
|
-
if self.is_hermitian:
|
242
|
-
# If the operator is hermitian then the coefficients must be numeric
|
243
|
-
return "\n".join(
|
244
|
-
f"{summand[1].real:+.3f} * {summand[0]}" for summand in self.pauli_list # type: ignore[union-attr]
|
245
|
-
)
|
246
|
-
return "\n".join(
|
247
|
-
f"+({summand[1]:+.3f}) * {summand[0]}" for summand in self.pauli_list
|
248
|
-
)
|
249
|
-
|
250
|
-
@pydantic.validator("pauli_list", each_item=True, pre=True)
|
251
|
-
def _validate_pauli_monomials(
|
252
|
-
cls, monomial: Tuple[PydanticPauliMonomialStr, ParameterComplexType]
|
253
|
-
) -> Tuple[PydanticPauliMonomialStr, ParameterComplexType]:
|
254
|
-
_PauliMonomialLengthValidator( # type: ignore[call-arg]
|
255
|
-
monomial=monomial
|
256
|
-
) # Validate the length of the monomial.
|
257
|
-
coeff = cls._validate_monomial_coefficient(monomial[1])
|
258
|
-
parsed_monomial = _PauliMonomialParser(string=monomial[0], coeff=coeff) # type: ignore[call-arg]
|
259
|
-
return (parsed_monomial.string, parsed_monomial.coeff)
|
260
|
-
|
261
|
-
@staticmethod
|
262
|
-
def _validate_monomial_coefficient(
|
263
|
-
coeff: Union[sympy.Expr, ParameterComplexType]
|
264
|
-
) -> ParameterComplexType:
|
265
|
-
if isinstance(coeff, str):
|
266
|
-
validate_expression_str(coeff)
|
267
|
-
elif isinstance(coeff, sympy.Expr):
|
268
|
-
coeff = str(coeff)
|
269
|
-
return coeff
|
270
|
-
|
271
|
-
@pydantic.validator("pauli_list")
|
272
|
-
def _validate_pauli_list(cls, pauli_list: PydanticPauliList) -> PydanticPauliList:
|
273
|
-
if not all_equal(len(summand[0]) for summand in pauli_list):
|
274
|
-
raise ClassiqValueError("Pauli strings have incompatible lengths.")
|
275
|
-
return pauli_list
|
276
|
-
|
277
|
-
@pydantic.root_validator
|
278
|
-
def _validate_hermitianity(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
279
|
-
pauli_list = values.get("pauli_list", [])
|
280
|
-
if all(isinstance(summand[1], complex) for summand in pauli_list):
|
281
|
-
values["is_hermitian"] = all(
|
282
|
-
np.isclose(complex(summand[1]).real, summand[1])
|
283
|
-
for summand in pauli_list
|
284
|
-
)
|
285
|
-
if values.get("is_hermitian", False):
|
286
|
-
values["has_complex_coefficients"] = False
|
287
|
-
values["pauli_list"] = [
|
288
|
-
(summand[0], complex(summand[1].real)) for summand in pauli_list
|
289
|
-
]
|
290
|
-
else:
|
291
|
-
values["has_complex_coefficients"] = not all(
|
292
|
-
np.isclose(complex(summand[1]).real, summand[1])
|
293
|
-
for summand in pauli_list
|
294
|
-
if isinstance(summand[1], complex)
|
295
|
-
)
|
296
|
-
return values
|
297
|
-
|
298
|
-
def __mul__(self, coefficient: complex) -> "PauliOperatorV1":
|
299
|
-
multiplied_ising = [
|
300
|
-
(monomial[0], self._multiply_monomial_coefficient(monomial[1], coefficient))
|
301
|
-
for monomial in self.pauli_list
|
302
|
-
]
|
303
|
-
return self.__class__(pauli_list=multiplied_ising)
|
304
|
-
|
305
|
-
@staticmethod
|
306
|
-
def _multiply_monomial_coefficient(
|
307
|
-
monomial_coefficient: ParameterComplexType, coefficient: complex
|
308
|
-
) -> ParameterComplexType:
|
309
|
-
if isinstance(monomial_coefficient, ParameterType):
|
310
|
-
return str(sympy.sympify(monomial_coefficient) * coefficient)
|
311
|
-
return monomial_coefficient * coefficient
|
312
|
-
|
313
|
-
@property
|
314
|
-
def is_commutative(self) -> bool:
|
315
|
-
return all(
|
316
|
-
self._is_sub_pauli_commutative(
|
317
|
-
[summand[0][qubit_num] for summand in self.pauli_list]
|
318
|
-
)
|
319
|
-
for qubit_num in range(self.num_qubits)
|
320
|
-
)
|
321
|
-
|
322
|
-
@staticmethod
|
323
|
-
def _is_sub_pauli_commutative(qubit_pauli_string: Union[List[str], str]) -> bool:
|
324
|
-
unique_paulis = set(qubit_pauli_string) - {"I"}
|
325
|
-
return len(unique_paulis) <= 1
|
326
|
-
|
327
|
-
@property
|
328
|
-
def num_qubits(self) -> int:
|
329
|
-
return len(self.pauli_list[0][0])
|
330
|
-
|
331
|
-
def to_matrix(self) -> np.ndarray:
|
332
|
-
if not all(isinstance(summand[1], complex) for summand in self.pauli_list):
|
333
|
-
raise ClassiqValueError(
|
334
|
-
"Supporting only Hamiltonian with numeric coefficients."
|
335
|
-
)
|
336
|
-
return sum(
|
337
|
-
cast(complex, summand[1]) * to_pauli_matrix(summand[0])
|
338
|
-
for summand in self.pauli_list
|
339
|
-
) # type: ignore[return-value]
|
340
|
-
|
341
|
-
@staticmethod
|
342
|
-
def _extend_pauli_string(
|
343
|
-
pauli_string: PydanticPauliMonomialStr, num_extra_qubits: int
|
344
|
-
) -> PydanticPauliMonomialStr:
|
345
|
-
return "I" * num_extra_qubits + pauli_string
|
346
|
-
|
347
|
-
def extend(self, num_extra_qubits: int) -> "PauliOperatorV1":
|
348
|
-
new_pauli_list = [
|
349
|
-
(self._extend_pauli_string(pauli_string, num_extra_qubits), coeff)
|
350
|
-
for (pauli_string, coeff) in self.pauli_list
|
351
|
-
]
|
352
|
-
return self.copy(update={"pauli_list": new_pauli_list}, deep=True)
|
353
|
-
|
354
|
-
@staticmethod
|
355
|
-
def _reorder_pauli_string(
|
356
|
-
pauli_string: PydanticPauliMonomialStr,
|
357
|
-
order: Collection[int],
|
358
|
-
new_num_qubits: int,
|
359
|
-
) -> PydanticPauliMonomialStr:
|
360
|
-
reversed_pauli_string = pauli_string[::-1]
|
361
|
-
reversed_new_pauli_string = ["I"] * new_num_qubits
|
362
|
-
|
363
|
-
for logical_pos, actual_pos in enumerate(order):
|
364
|
-
reversed_new_pauli_string[actual_pos] = reversed_pauli_string[logical_pos]
|
365
|
-
|
366
|
-
return "".join(reversed(reversed_new_pauli_string))
|
367
|
-
|
368
|
-
@staticmethod
|
369
|
-
def _validate_reorder(
|
370
|
-
order: Collection[int],
|
371
|
-
num_qubits: int,
|
372
|
-
num_extra_qubits: int,
|
373
|
-
) -> None:
|
374
|
-
if num_extra_qubits < 0:
|
375
|
-
raise ClassiqValueError("Number of extra qubits cannot be negative")
|
376
|
-
|
377
|
-
if len(order) != num_qubits:
|
378
|
-
raise ClassiqValueError("The qubits order doesn't match the Pauli operator")
|
379
|
-
|
380
|
-
if len(order) != len(set(order)):
|
381
|
-
raise ClassiqValueError("The qubits order is not one-to-one")
|
382
|
-
|
383
|
-
if not all(pos < num_qubits + num_extra_qubits for pos in order):
|
384
|
-
raise ClassiqValueError(
|
385
|
-
"The qubits order contains qubits which do no exist"
|
386
|
-
)
|
387
|
-
|
388
|
-
@classmethod
|
389
|
-
def reorder(
|
390
|
-
cls,
|
391
|
-
operator: "PauliOperatorV1",
|
392
|
-
order: Collection[int],
|
393
|
-
num_extra_qubits: int = 0,
|
394
|
-
) -> "PauliOperatorV1":
|
395
|
-
cls._validate_reorder(order, operator.num_qubits, num_extra_qubits)
|
396
|
-
|
397
|
-
new_num_qubits = operator.num_qubits + num_extra_qubits
|
398
|
-
new_pauli_list = [
|
399
|
-
(cls._reorder_pauli_string(pauli_string, order, new_num_qubits), coeff)
|
400
|
-
for pauli_string, coeff in operator.pauli_list
|
401
|
-
]
|
402
|
-
return cls(pauli_list=new_pauli_list)
|
403
|
-
|
404
|
-
@classmethod
|
405
|
-
def from_unzipped_lists(
|
406
|
-
cls,
|
407
|
-
operators: List[List[Pauli]],
|
408
|
-
coefficients: Optional[List[complex]] = None,
|
409
|
-
) -> "PauliOperatorV1":
|
410
|
-
if coefficients is None:
|
411
|
-
coefficients = [1] * len(operators)
|
412
|
-
|
413
|
-
if len(operators) != len(coefficients):
|
414
|
-
raise ClassiqValueError(
|
415
|
-
f"The number of coefficients ({len(coefficients)}) must be equal to the number of pauli operators ({len(operators)})"
|
416
|
-
)
|
417
|
-
|
418
|
-
return cls(
|
419
|
-
pauli_list=[
|
420
|
-
(pauli_integers_to_str(op), coeff)
|
421
|
-
for op, coeff in zip(operators, coefficients)
|
422
|
-
]
|
423
|
-
)
|
424
|
-
|
425
|
-
class Config:
|
426
|
-
frozen = True
|
260
|
+
model_config = ConfigDict(frozen=True)
|
427
261
|
|
428
262
|
|
429
263
|
# This class validates the length of a monomial.
|
@@ -432,8 +266,7 @@ class _PauliMonomialLengthValidator:
|
|
432
266
|
monomial: PydanticPauliMonomial
|
433
267
|
|
434
268
|
|
435
|
-
|
436
|
-
class _PauliMonomialParser:
|
269
|
+
class _PauliMonomialParser(pydantic.BaseModel):
|
437
270
|
string: PydanticPauliMonomialStr
|
438
271
|
coeff: PydanticParameterComplexType
|
439
272
|
|
@@ -466,9 +299,9 @@ def validate_operator_has_no_complex_coefficients(
|
|
466
299
|
return pauli_operator
|
467
300
|
|
468
301
|
|
469
|
-
def pauli_integers_to_str(paulis:
|
302
|
+
def pauli_integers_to_str(paulis: list[Pauli]) -> str:
|
470
303
|
return "".join([Pauli(pauli).name for pauli in paulis])
|
471
304
|
|
472
305
|
|
473
306
|
class PauliOperators(VersionedModel):
|
474
|
-
operators:
|
307
|
+
operators: list[PauliOperator]
|
@@ -1,10 +1,8 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
import numpy as np
|
4
2
|
import pyomo.core as pyo
|
5
3
|
|
6
4
|
|
7
|
-
def ascending_sequence(coeffs:
|
5
|
+
def ascending_sequence(coeffs: list[int], bound: int) -> pyo.ConcreteModel:
|
8
6
|
model = pyo.ConcreteModel()
|
9
7
|
model.x = pyo.Var(
|
10
8
|
range(len(coeffs)), domain=pyo.NonNegativeIntegers, bounds=(0, bound)
|
@@ -1,16 +1,14 @@
|
|
1
|
-
from typing import List, Tuple
|
2
|
-
|
3
1
|
import numpy as np
|
4
2
|
import pyomo.core as pyo
|
5
3
|
|
6
4
|
|
7
5
|
def integer_portfolio_optimization(
|
8
|
-
covariances: np.ndarray, returns: np.ndarray, upper_bounds:
|
6
|
+
covariances: np.ndarray, returns: np.ndarray, upper_bounds: list[int]
|
9
7
|
) -> pyo.ConcreteModel:
|
10
8
|
model = pyo.ConcreteModel()
|
11
9
|
num_assets = len(returns)
|
12
10
|
|
13
|
-
def bounds(model: pyo.ConcreteModel, i: int) ->
|
11
|
+
def bounds(model: pyo.ConcreteModel, i: int) -> tuple[int, int]:
|
14
12
|
return 0, upper_bounds[i]
|
15
13
|
|
16
14
|
model.x = pyo.Var(range(num_assets), domain=pyo.NonNegativeIntegers, bounds=bounds)
|
@@ -1,13 +1,13 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Optional
|
2
2
|
|
3
3
|
import numpy as np
|
4
4
|
import pyomo.core as pyo
|
5
5
|
|
6
6
|
|
7
7
|
def knapsack(
|
8
|
-
values:
|
8
|
+
values: list[int],
|
9
9
|
upper_bound: int,
|
10
|
-
weights: Optional[
|
10
|
+
weights: Optional[list[int]] = None,
|
11
11
|
max_weight: Optional[int] = None,
|
12
12
|
) -> pyo.ConcreteModel:
|
13
13
|
model = pyo.ConcreteModel()
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import math
|
2
|
-
from typing import Dict, Tuple
|
3
2
|
|
4
3
|
import networkx as nx
|
5
4
|
import pyomo.core as pyo
|
5
|
+
import pyomo.core.expr.numeric_expr as pyo_expr
|
6
6
|
|
7
7
|
Node = int
|
8
|
-
Edge =
|
9
|
-
Pubo =
|
8
|
+
Edge = tuple[Node, Node]
|
9
|
+
Pubo = dict[tuple[Edge, ...], float]
|
10
10
|
|
11
11
|
|
12
12
|
def build_mht_pyomo_model(
|
@@ -22,7 +22,9 @@ def build_mht_pyomo_model(
|
|
22
22
|
if has_constraints:
|
23
23
|
|
24
24
|
@model.Constraint(model.Nodes)
|
25
|
-
def out_edges_rule(
|
25
|
+
def out_edges_rule(
|
26
|
+
model: pyo.ConcreteModel, idx: int
|
27
|
+
) -> pyo_expr.ExpressionBase:
|
26
28
|
out_nodes = [
|
27
29
|
node_id for node_id in model.Nodes if [idx, node_id] in model.Arcs
|
28
30
|
]
|
@@ -32,7 +34,9 @@ def build_mht_pyomo_model(
|
|
32
34
|
return pyo.Constraint.Feasible
|
33
35
|
|
34
36
|
@model.Constraint(model.Nodes)
|
35
|
-
def in_edges_rule(
|
37
|
+
def in_edges_rule(
|
38
|
+
model: pyo.ConcreteModel, idx: int
|
39
|
+
) -> pyo_expr.ExpressionBase:
|
36
40
|
in_nodes = [
|
37
41
|
node_id for node_id in model.Nodes if [node_id, idx] in model.Arcs
|
38
42
|
]
|
@@ -41,7 +45,7 @@ def build_mht_pyomo_model(
|
|
41
45
|
else:
|
42
46
|
return pyo.Constraint.Feasible
|
43
47
|
|
44
|
-
def obj_expression(model: pyo.ConcreteModel) ->
|
48
|
+
def obj_expression(model: pyo.ConcreteModel) -> pyo_expr.ExpressionBase:
|
45
49
|
return sum(
|
46
50
|
round(pubo_energy, _decimals)
|
47
51
|
* math.prod(model.x[edge] for edge in pubo_edges)
|
@@ -1,11 +1,10 @@
|
|
1
1
|
import itertools
|
2
|
-
from typing import List
|
3
2
|
|
4
3
|
import pyomo.core as pyo
|
5
4
|
import pyomo.core.expr.numeric_expr as pyo_expr
|
6
5
|
|
7
6
|
|
8
|
-
def set_cover(sub_sets:
|
7
|
+
def set_cover(sub_sets: list[list[int]]) -> pyo.ConcreteModel:
|
9
8
|
entire_set = set(itertools.chain(*sub_sets))
|
10
9
|
n = max(entire_set)
|
11
10
|
num_sets = len(sub_sets)
|
@@ -1,11 +1,9 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
import more_itertools
|
4
2
|
import numpy as np
|
5
3
|
import pydantic
|
6
4
|
from pydantic import BaseModel
|
7
5
|
|
8
|
-
from classiq.exceptions import ClassiqValueError
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
9
7
|
|
10
8
|
_TOLERANCE_DECIMALS = 6
|
11
9
|
|
@@ -24,7 +22,7 @@ class MhtQaoaInput(BaseModel):
|
|
24
22
|
reps: pydantic.PositiveInt = pydantic.Field(
|
25
23
|
default=3, description="Number of QAOA layers."
|
26
24
|
)
|
27
|
-
plot_list:
|
25
|
+
plot_list: list[PlotData] = pydantic.Field(
|
28
26
|
description="The list of (x,y,t) plots of the MHT problem."
|
29
27
|
)
|
30
28
|
misdetection_maximum_time_steps: pydantic.NonNegativeInt = pydantic.Field(
|
@@ -53,10 +51,11 @@ class MhtQaoaInput(BaseModel):
|
|
53
51
|
def is_valid_cost(self, cost: float) -> bool:
|
54
52
|
return True
|
55
53
|
|
56
|
-
@pydantic.
|
54
|
+
@pydantic.field_validator("plot_list")
|
55
|
+
@classmethod
|
57
56
|
def round_plot_list_times_and_validate(
|
58
|
-
cls, plot_list:
|
59
|
-
) ->
|
57
|
+
cls, plot_list: list[PlotData]
|
58
|
+
) -> list[PlotData]:
|
60
59
|
MhtQaoaInput._check_all_ids_are_distinct(plot_list)
|
61
60
|
MhtQaoaInput._round_to_tolerance_decimals(plot_list)
|
62
61
|
|
@@ -74,11 +73,11 @@ class MhtQaoaInput(BaseModel):
|
|
74
73
|
return plot_list
|
75
74
|
|
76
75
|
@staticmethod
|
77
|
-
def _round_to_tolerance_decimals(plot_list:
|
76
|
+
def _round_to_tolerance_decimals(plot_list: list[PlotData]) -> None:
|
78
77
|
for plot in plot_list:
|
79
78
|
plot.t = np.round(plot.t, decimals=_TOLERANCE_DECIMALS)
|
80
79
|
|
81
80
|
@staticmethod
|
82
|
-
def _check_all_ids_are_distinct(plot_list:
|
81
|
+
def _check_all_ids_are_distinct(plot_list: list[PlotData]) -> None:
|
83
82
|
if not more_itertools.all_unique(plot.plot_id for plot in plot_list):
|
84
83
|
raise ClassiqValueError("Plot IDs should be unique.")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Any
|
1
|
+
from typing import Any
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
from pydantic import BaseModel
|
@@ -14,4 +14,4 @@ class MaxCutProblem(BaseModel):
|
|
14
14
|
default_factory=CombinatorialOptimizer,
|
15
15
|
description="preferences for the VQE execution",
|
16
16
|
)
|
17
|
-
serialized_graph:
|
17
|
+
serialized_graph: dict[str, Any]
|