classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,9 +1,8 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from typing import TYPE_CHECKING,
|
3
|
+
from typing import TYPE_CHECKING, Annotated, Optional
|
4
4
|
|
5
|
-
import
|
6
|
-
from pydantic import BaseModel
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field
|
7
6
|
|
8
7
|
# This file is based on autogenerated code from: https://static.ionq.co/schemas/circuit-v0.json using
|
9
8
|
# https://pydantic-docs.helpmanual.io/datamodel_code_generator/
|
@@ -12,35 +11,28 @@ from pydantic import BaseModel
|
|
12
11
|
if TYPE_CHECKING:
|
13
12
|
PydanticGateName = str
|
14
13
|
else:
|
15
|
-
PydanticGateName =
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
PydanticGateName = Annotated[
|
15
|
+
str,
|
16
|
+
Field(
|
17
|
+
pattern=r"^\w+$",
|
18
|
+
min_length=1,
|
19
|
+
),
|
20
|
+
]
|
19
21
|
|
20
22
|
|
21
23
|
class Gate(BaseModel):
|
22
24
|
gate: PydanticGateName
|
23
25
|
target: Optional[int] = None
|
24
26
|
control: Optional[int] = None
|
25
|
-
targets: Optional[
|
26
|
-
controls: Optional[
|
27
|
-
|
28
|
-
# Ionq changes format sometimes.
|
29
|
-
# One example is that `IonqQauntumCircuit` got a field name "gateset" with the value "qis"
|
30
|
-
# Another is that `Gate` got a field named "rotation"
|
31
|
-
class Config:
|
32
|
-
extra = pydantic.Extra.allow
|
27
|
+
targets: Optional[list[int]] = None
|
28
|
+
controls: Optional[list[int]] = None
|
29
|
+
model_config = ConfigDict(extra="allow")
|
33
30
|
|
34
31
|
|
35
32
|
class IonqQuantumCircuit(BaseModel):
|
36
33
|
qubits: int
|
37
|
-
circuit:
|
38
|
-
|
39
|
-
# Ionq changes format sometimes.
|
40
|
-
# One example is that `IonqQauntumCircuit` got a field name "gateset" with the value "qis"
|
41
|
-
# Another is that `Gate` got a field named "rotation"
|
42
|
-
class Config:
|
43
|
-
extra = pydantic.Extra.allow
|
34
|
+
circuit: list[Gate]
|
35
|
+
model_config = ConfigDict(extra="allow")
|
44
36
|
|
45
37
|
@classmethod
|
46
38
|
def from_string(cls, code: str) -> IonqQuantumCircuit:
|
@@ -48,4 +40,4 @@ class IonqQuantumCircuit(BaseModel):
|
|
48
40
|
commentless_code = "\n".join(
|
49
41
|
line for line in code_lines if not line.startswith("//")
|
50
42
|
)
|
51
|
-
return cls.
|
43
|
+
return cls.model_validate_json(commentless_code)
|
@@ -1,20 +1,18 @@
|
|
1
|
-
from
|
2
|
-
from typing import TYPE_CHECKING
|
1
|
+
from typing import TYPE_CHECKING, Annotated
|
3
2
|
|
4
|
-
import
|
3
|
+
from pydantic import Field, StrictStr, constr
|
5
4
|
|
6
5
|
AZURE_QUANTUM_RESOURCE_ID_REGEX = r"^/subscriptions/([a-fA-F0-9-]*)/resourceGroups/([^\s/]*)/providers/Microsoft\.Quantum/Workspaces/([^\s/]*)$"
|
7
6
|
|
8
7
|
_IONQ_API_KEY_LENGTH: int = 32
|
9
8
|
_ALICE_BOB_API_KEY_LENGTH: int = 72
|
10
9
|
INVALID_API_KEY: str = _IONQ_API_KEY_LENGTH * "a"
|
11
|
-
INVALID_API_KEY_ALICE_BOB: str = _ALICE_BOB_API_KEY_LENGTH * "a"
|
12
10
|
INVALID_EMAIL_OQC: str = "aa@aa.aa"
|
13
|
-
INVALID_PASSWORD_OQC: str = "Aa1!Aa1!"
|
14
|
-
|
11
|
+
INVALID_PASSWORD_OQC: str = "Aa1!Aa1!" # noqa: S105
|
12
|
+
|
13
|
+
EXECUTION_PARAMETER_PATTERN = "[_a-z][_a-z0-9]*"
|
15
14
|
|
16
15
|
if TYPE_CHECKING:
|
17
|
-
PydanticExecutionTimeout = int
|
18
16
|
PydanticAwsRoleArn = str
|
19
17
|
PydanticS3BucketKey = str
|
20
18
|
PydanticS3BucketName = str
|
@@ -26,24 +24,31 @@ if TYPE_CHECKING:
|
|
26
24
|
else:
|
27
25
|
# TODO Simplify regular expressions in this file
|
28
26
|
|
29
|
-
PydanticAwsRoleArn =
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
PydanticAwsRoleArn = Annotated[
|
28
|
+
StrictStr,
|
29
|
+
constr(
|
30
|
+
strip_whitespace=True,
|
31
|
+
),
|
32
|
+
]
|
34
33
|
|
35
|
-
|
34
|
+
PydanticS3BucketKey = Annotated[
|
35
|
+
StrictStr, constr(strip_whitespace=True, min_length=1)
|
36
|
+
]
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
PydanticAzureResourceIDType = Annotated[
|
39
|
+
str, Field(pattern=AZURE_QUANTUM_RESOURCE_ID_REGEX)
|
40
|
+
]
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
PydanticIonQApiKeyType = Annotated[
|
43
|
+
str, Field(pattern=f"[A-Za-z0-9]{{{_IONQ_API_KEY_LENGTH}}}")
|
44
|
+
]
|
44
45
|
|
45
|
-
|
46
|
+
PydanticAliceBobApiKeyType = Annotated[
|
47
|
+
StrictStr, constr(min_length=1, strip_whitespace=True)
|
48
|
+
]
|
46
49
|
|
47
|
-
PydanticArgumentNameType =
|
50
|
+
PydanticArgumentNameType = Annotated[str, Field(pattern="[_a-zA-Z][_a-zA-Z0-9]*")]
|
48
51
|
|
49
|
-
PydanticExecutionParameter =
|
52
|
+
PydanticExecutionParameter = Annotated[
|
53
|
+
str, Field(pattern=EXECUTION_PARAMETER_PATTERN)
|
54
|
+
]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from typing import Literal, Union
|
2
2
|
|
3
|
-
from classiq.
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
4
4
|
|
5
5
|
|
6
6
|
class AnalyzerProviderVendor(StrEnum):
|
@@ -18,6 +18,9 @@ class ProviderVendor(StrEnum):
|
|
18
18
|
GOOGLE = "Google"
|
19
19
|
ALICE_AND_BOB = "Alice & Bob"
|
20
20
|
OQC = "OQC"
|
21
|
+
INTEL = "Intel"
|
22
|
+
AQT = "AQT"
|
23
|
+
IQCC = "IQCC"
|
21
24
|
|
22
25
|
|
23
26
|
class ProviderTypeVendor:
|
@@ -29,23 +32,41 @@ class ProviderTypeVendor:
|
|
29
32
|
GOOGLE = Literal[ProviderVendor.GOOGLE]
|
30
33
|
ALICE_BOB = Literal[ProviderVendor.ALICE_AND_BOB]
|
31
34
|
OQC = Literal[ProviderVendor.OQC]
|
35
|
+
INTEL = Literal[ProviderVendor.INTEL]
|
36
|
+
AQT = Literal[ProviderVendor.AQT]
|
37
|
+
IQCC = Literal[ProviderVendor.IQCC]
|
32
38
|
|
33
39
|
|
34
|
-
class
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
40
|
+
class ClassiqSimulatorBackendNames(StrEnum):
|
41
|
+
"""
|
42
|
+
|
43
|
+
The simulator backends available in the Classiq provider.
|
44
|
+
|
45
|
+
"""
|
46
|
+
|
47
|
+
SIMULATOR = "simulator"
|
48
|
+
SIMULATOR_STATEVECTOR = "simulator_statevector"
|
49
|
+
SIMULATOR_DENSITY_MATRIX = "simulator_density_matrix"
|
50
|
+
SIMULATOR_MATRIX_PRODUCT_STATE = "simulator_matrix_product_state"
|
39
51
|
|
40
52
|
|
41
53
|
class IonqBackendNames(StrEnum):
|
54
|
+
"""
|
55
|
+
IonQ backend names which Classiq Supports running on.
|
56
|
+
"""
|
57
|
+
|
42
58
|
SIMULATOR = "simulator"
|
43
59
|
HARMONY = "qpu.harmony"
|
44
|
-
|
45
|
-
|
60
|
+
ARIA_1 = "qpu.aria-1"
|
61
|
+
ARIA_2 = "qpu.aria-2"
|
62
|
+
FORTE_1 = "qpu.forte-1"
|
46
63
|
|
47
64
|
|
48
65
|
class AzureQuantumBackendNames(StrEnum):
|
66
|
+
"""
|
67
|
+
AzureQuantum backend names which Classiq Supports running on.
|
68
|
+
"""
|
69
|
+
|
49
70
|
IONQ_ARIA_1 = "ionq.qpu.aria-1"
|
50
71
|
IONQ_ARIA_2 = "ionq.qpu.aria-2"
|
51
72
|
IONQ_QPU = "ionq.qpu"
|
@@ -53,9 +74,9 @@ class AzureQuantumBackendNames(StrEnum):
|
|
53
74
|
IONQ_SIMULATOR = "ionq.simulator"
|
54
75
|
MICROSOFT_ESTIMATOR = "microsoft.estimator"
|
55
76
|
MICROSOFT_FULLSTATE_SIMULATOR = "microsoft.simulator.fullstate"
|
56
|
-
RIGETTI_ASPEN3 = "rigetti.qpu.aspen-m-3"
|
57
77
|
RIGETTI_SIMULATOR = "rigetti.sim.qvm"
|
58
78
|
RIGETTI_ANKAA2 = "rigetti.qpu.ankaa-2"
|
79
|
+
RIGETTI_ANKAA9 = "rigetti.qpu.ankaa-9q-1"
|
59
80
|
QCI_MACHINE1 = "qci.machine1"
|
60
81
|
QCI_NOISY_SIMULATOR = "qci.simulator.noisy"
|
61
82
|
QCI_SIMULATOR = "qci.simulator"
|
@@ -71,6 +92,10 @@ class AzureQuantumBackendNames(StrEnum):
|
|
71
92
|
|
72
93
|
|
73
94
|
class AmazonBraketBackendNames(StrEnum):
|
95
|
+
"""
|
96
|
+
Amazon Braket backend names which Classiq Supports running on.
|
97
|
+
"""
|
98
|
+
|
74
99
|
AMAZON_BRAKET_SV1 = "SV1"
|
75
100
|
AMAZON_BRAKET_TN1 = "TN1"
|
76
101
|
AMAZON_BRAKET_DM1 = "dm1"
|
@@ -87,6 +112,10 @@ class AmazonBraketBackendNames(StrEnum):
|
|
87
112
|
# # Using _normalize_backend_name from `ibm_hardware_graphs.py`
|
88
113
|
# the_devices = [_normalize_backend_name(str(backend)) for backend in backends_list]
|
89
114
|
class IBMQHardwareNames(StrEnum):
|
115
|
+
"""
|
116
|
+
IBM backend names which Classiq Supports running on.
|
117
|
+
"""
|
118
|
+
|
90
119
|
ALMADEN = "Almaden"
|
91
120
|
ARMONK = "Armonk"
|
92
121
|
ATHENS = "Athens"
|
@@ -137,24 +166,46 @@ class IBMQHardwareNames(StrEnum):
|
|
137
166
|
|
138
167
|
|
139
168
|
class ClassiqNvidiaBackendNames(StrEnum):
|
140
|
-
|
169
|
+
"""
|
170
|
+
Classiq's Nvidia simulator backend names.
|
171
|
+
"""
|
172
|
+
|
173
|
+
SIMULATOR = "nvidia_simulator"
|
174
|
+
SIMULATOR_STATEVECTOR = "nvidia_simulator_statevector"
|
175
|
+
|
176
|
+
|
177
|
+
class IntelBackendNames(StrEnum):
|
178
|
+
SIMULATOR = "intel_qsdk_simulator"
|
141
179
|
|
142
180
|
|
143
|
-
AllClassiqBackendNames = Union[
|
181
|
+
AllClassiqBackendNames = Union[ClassiqSimulatorBackendNames, ClassiqNvidiaBackendNames]
|
144
182
|
|
145
183
|
|
146
184
|
class GoogleNvidiaBackendNames(StrEnum):
|
185
|
+
"""
|
186
|
+
Google backend names which Classiq Supports running on.
|
187
|
+
"""
|
188
|
+
|
147
189
|
CUQUANTUM = "cuquantum"
|
190
|
+
CUQUANTUM_STATEVECTOR = "cuquantum_statevector"
|
148
191
|
|
149
192
|
|
150
193
|
class AliceBobBackendNames(StrEnum):
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
194
|
+
"""
|
195
|
+
Alice & Bob backend names which Classiq Supports running on.
|
196
|
+
"""
|
197
|
+
|
198
|
+
PERFECT_QUBITS = "PERFECT_QUBITS"
|
199
|
+
LOGICAL_TARGET = "LOGICAL_TARGET"
|
200
|
+
LOGICAL_EARLY = "LOGICAL_EARLY"
|
201
|
+
TRANSMONS = "TRANSMONS"
|
155
202
|
|
156
203
|
|
157
204
|
class OQCBackendNames(StrEnum):
|
205
|
+
"""
|
206
|
+
OQC backend names which Classiq Supports running on.
|
207
|
+
"""
|
208
|
+
|
158
209
|
LUCY = "Lucy"
|
159
210
|
|
160
211
|
|
@@ -165,7 +216,8 @@ EXACT_SIMULATORS = {
|
|
165
216
|
AmazonBraketBackendNames.AMAZON_BRAKET_SV1,
|
166
217
|
AmazonBraketBackendNames.AMAZON_BRAKET_TN1,
|
167
218
|
AmazonBraketBackendNames.AMAZON_BRAKET_DM1,
|
168
|
-
*
|
219
|
+
*ClassiqSimulatorBackendNames,
|
220
|
+
*IntelBackendNames,
|
169
221
|
*ClassiqNvidiaBackendNames,
|
170
222
|
}
|
171
223
|
|
@@ -176,6 +228,7 @@ AllBackendsNameByVendor = Union[
|
|
176
228
|
AzureQuantumBackendNames,
|
177
229
|
AmazonBraketBackendNames,
|
178
230
|
IonqBackendNames,
|
231
|
+
IntelBackendNames,
|
179
232
|
ClassiqNvidiaBackendNames,
|
180
233
|
AliceBobBackendNames,
|
181
234
|
OQCBackendNames,
|
@@ -187,6 +240,7 @@ AllBackendsNameEnums = [
|
|
187
240
|
AmazonBraketBackendNames,
|
188
241
|
IonqBackendNames,
|
189
242
|
AliceBobBackendNames,
|
243
|
+
IntelBackendNames,
|
190
244
|
ClassiqNvidiaBackendNames,
|
191
245
|
OQCBackendNames,
|
192
246
|
]
|
@@ -1,17 +1,19 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import itertools
|
4
|
-
from typing import
|
4
|
+
from typing import Union
|
5
5
|
|
6
6
|
import numpy as np
|
7
7
|
import pydantic
|
8
|
+
from pydantic import ConfigDict
|
8
9
|
|
10
|
+
from classiq.interface.exceptions import ClassiqValueError
|
9
11
|
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
10
12
|
HashablePydanticBaseModel,
|
11
13
|
)
|
12
14
|
|
13
|
-
LadderOperator =
|
14
|
-
FermionicOperatorTuple =
|
15
|
+
LadderOperator = tuple[str, int]
|
16
|
+
FermionicOperatorTuple = tuple["FermionicOperator", float]
|
15
17
|
|
16
18
|
_SUBSCRIPT_UNICODE_CHARS = {
|
17
19
|
"0": "\u2080",
|
@@ -37,7 +39,10 @@ class FermionicOperator(HashablePydanticBaseModel):
|
|
37
39
|
"""
|
38
40
|
|
39
41
|
op_list: list = pydantic.Field(
|
40
|
-
description=
|
42
|
+
description=(
|
43
|
+
"A list of tuples each containing an index and a character; for "
|
44
|
+
"example [('+', 0), ('-', 1)]."
|
45
|
+
),
|
41
46
|
)
|
42
47
|
|
43
48
|
@staticmethod
|
@@ -46,32 +51,40 @@ class FermionicOperator(HashablePydanticBaseModel):
|
|
46
51
|
try: # type: ignore[unreachable] # it is reachable...
|
47
52
|
op = tuple(op)
|
48
53
|
except Exception as exc:
|
49
|
-
raise
|
54
|
+
raise ClassiqValueError("Ladder operator should be a tuple.") from exc
|
50
55
|
if len(op) != 2:
|
51
|
-
raise
|
52
|
-
"Ladder operator tuple should be of length two; for example (
|
56
|
+
raise ClassiqValueError(
|
57
|
+
"Ladder operator tuple should be of length two; for example ('+', 1)."
|
53
58
|
)
|
54
59
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
60
|
+
op_symbol = op[0]
|
61
|
+
if op_symbol == "LadderOperator.PLUS":
|
62
|
+
op_symbol = "+"
|
63
|
+
elif op_symbol == "LadderOperator.MINUS":
|
64
|
+
op_symbol = "-"
|
65
|
+
if op_symbol not in ("+", "-"):
|
66
|
+
raise ClassiqValueError(
|
67
|
+
f"The first term in a ladder operator tuple indicates if its a raising "
|
68
|
+
f"(LadderOperator.PLUS / '+') or lowering (LadderOperator.MINUS / '-') "
|
69
|
+
f"operator. Received {op_symbol}"
|
59
70
|
)
|
60
|
-
|
61
|
-
|
71
|
+
op_index = op[1]
|
72
|
+
if not isinstance(op_index, int):
|
73
|
+
raise ClassiqValueError(
|
62
74
|
"The second term in a ladder operator tuple indicates its index and should be of type int"
|
63
75
|
)
|
64
76
|
|
65
|
-
return
|
77
|
+
return (op_symbol, op_index)
|
66
78
|
|
67
|
-
@pydantic.
|
79
|
+
@pydantic.field_validator("op_list")
|
80
|
+
@classmethod
|
68
81
|
def _validate_op_list(cls, op_list: list) -> list:
|
69
82
|
return list(map(cls._validate_single_op, op_list))
|
70
83
|
|
71
84
|
def __mul__(self, coeff: Union[float, int]) -> SummedFermionicOperator:
|
72
85
|
if isinstance(coeff, (float, int)):
|
73
86
|
return SummedFermionicOperator(op_list=[(self, float(coeff))])
|
74
|
-
raise
|
87
|
+
raise ClassiqValueError(
|
75
88
|
"The coefficient multiplying Fermionic Operator should be of type float"
|
76
89
|
)
|
77
90
|
|
@@ -84,12 +97,11 @@ class FermionicOperator(HashablePydanticBaseModel):
|
|
84
97
|
return SummedFermionicOperator(op_list=[(self, 1.0)] + other.op_list)
|
85
98
|
elif isinstance(other, FermionicOperator):
|
86
99
|
return SummedFermionicOperator(op_list=[(self, 1.0)] + [(other, 1.0)])
|
87
|
-
raise
|
100
|
+
raise ClassiqValueError(
|
88
101
|
"FermionicOperator can be summed together only with type FermionicOperator or SummedFermionicOperator"
|
89
102
|
)
|
90
103
|
|
91
|
-
|
92
|
-
frozen = True
|
104
|
+
model_config = ConfigDict(frozen=True)
|
93
105
|
|
94
106
|
@staticmethod
|
95
107
|
def _to_ladder_op(char: str) -> str:
|
@@ -106,7 +118,7 @@ class FermionicOperator(HashablePydanticBaseModel):
|
|
106
118
|
)
|
107
119
|
|
108
120
|
@property
|
109
|
-
def all_indices(self) ->
|
121
|
+
def all_indices(self) -> set[int]:
|
110
122
|
return {op[1] for op in self.op_list}
|
111
123
|
|
112
124
|
|
@@ -124,9 +136,7 @@ class SummedFermionicOperator(HashablePydanticBaseModel):
|
|
124
136
|
op_list: list = pydantic.Field(
|
125
137
|
description="A list of tuples each containing a FermionicOperator and a coefficient.",
|
126
138
|
)
|
127
|
-
|
128
|
-
class Config:
|
129
|
-
frozen = True
|
139
|
+
model_config = ConfigDict(frozen=True)
|
130
140
|
|
131
141
|
@staticmethod
|
132
142
|
def _validate_single_op(op: tuple) -> FermionicOperatorTuple:
|
@@ -135,27 +145,28 @@ class SummedFermionicOperator(HashablePydanticBaseModel):
|
|
135
145
|
try: # type: ignore[unreachable] # it is reachable...
|
136
146
|
op = tuple(op)
|
137
147
|
except Exception as exc:
|
138
|
-
raise
|
148
|
+
raise ClassiqValueError("Operator should be a tuple.") from exc
|
139
149
|
if len(op) != 2:
|
140
|
-
raise
|
150
|
+
raise ClassiqValueError("Operator tuple should be of length two.")
|
141
151
|
|
142
152
|
# is it FermionicOperator - if not, convert to FermionicOperator
|
143
|
-
if
|
153
|
+
if not isinstance(op[0], FermionicOperator):
|
144
154
|
try:
|
145
155
|
op = (FermionicOperator(**op[0]), op[1])
|
146
156
|
except Exception as exc:
|
147
|
-
raise
|
157
|
+
raise ClassiqValueError(
|
148
158
|
"The first term in the operator tuple should be an instance of the FermionicOperator class"
|
149
159
|
) from exc
|
150
160
|
|
151
|
-
if
|
152
|
-
raise
|
161
|
+
if not isinstance(op[1], float):
|
162
|
+
raise ClassiqValueError(
|
153
163
|
"The second term in the operator tuple indicates its coefficient and should be of type float"
|
154
164
|
)
|
155
165
|
|
156
166
|
return op # type: ignore[return-value] # mypy thinks that it is `Tuple[Any, ...]`, though the asserts here tell otherwise..
|
157
167
|
|
158
|
-
@pydantic.
|
168
|
+
@pydantic.field_validator("op_list")
|
169
|
+
@classmethod
|
159
170
|
def _validate_op_list(cls, op_list: list) -> list:
|
160
171
|
return list(map(cls._validate_single_op, op_list))
|
161
172
|
|
@@ -166,7 +177,7 @@ class SummedFermionicOperator(HashablePydanticBaseModel):
|
|
166
177
|
return SummedFermionicOperator(op_list=self.op_list + other.op_list)
|
167
178
|
elif isinstance(other, FermionicOperator):
|
168
179
|
return SummedFermionicOperator(op_list=self.op_list + [(other, 1.0)])
|
169
|
-
raise
|
180
|
+
raise ClassiqValueError(
|
170
181
|
"FermionicOperator can be summed together only with type FermionicOperator or SummedFermionicOperator"
|
171
182
|
)
|
172
183
|
|
@@ -184,7 +195,7 @@ class SummedFermionicOperator(HashablePydanticBaseModel):
|
|
184
195
|
return True
|
185
196
|
|
186
197
|
@property
|
187
|
-
def _all_indices(self) ->
|
198
|
+
def _all_indices(self) -> set[int]:
|
188
199
|
return set(
|
189
200
|
itertools.chain.from_iterable(op.all_indices for op, _ in self.op_list)
|
190
201
|
)
|
@@ -1,15 +1,17 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Annotated, Literal, Optional, Union, cast
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic import ConfigDict, Field
|
5
|
+
from pydantic_core.core_schema import ValidationInfo
|
4
6
|
|
5
7
|
from classiq.interface.chemistry.fermionic_operator import SummedFermionicOperator
|
6
8
|
from classiq.interface.chemistry.molecule import Molecule
|
9
|
+
from classiq.interface.enum_utils import StrEnum
|
10
|
+
from classiq.interface.exceptions import ClassiqValueError
|
7
11
|
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
8
12
|
HashablePydanticBaseModel,
|
9
13
|
)
|
10
14
|
|
11
|
-
from classiq._internals.enum_utils import StrEnum
|
12
|
-
|
13
15
|
"""
|
14
16
|
The correct type hint is:
|
15
17
|
NumSpinUpParticles = pydantic.NonNegativeInt
|
@@ -26,7 +28,7 @@ And use a list, and manually check its length
|
|
26
28
|
"""
|
27
29
|
NumSpinUpParticles = pydantic.NonNegativeInt
|
28
30
|
NumSpinDownParticles = pydantic.NonNegativeInt
|
29
|
-
NumParticles =
|
31
|
+
NumParticles = tuple[NumSpinUpParticles, NumSpinDownParticles]
|
30
32
|
|
31
33
|
|
32
34
|
class FermionMapping(StrEnum):
|
@@ -37,6 +39,8 @@ class FermionMapping(StrEnum):
|
|
37
39
|
|
38
40
|
|
39
41
|
class GroundStateProblem(HashablePydanticBaseModel):
|
42
|
+
kind: str
|
43
|
+
|
40
44
|
mapping: FermionMapping = pydantic.Field(
|
41
45
|
default=FermionMapping.JORDAN_WIGNER,
|
42
46
|
description="Fermionic mapping type",
|
@@ -48,53 +52,67 @@ class GroundStateProblem(HashablePydanticBaseModel):
|
|
48
52
|
)
|
49
53
|
num_qubits: Optional[int] = pydantic.Field(default=None)
|
50
54
|
|
51
|
-
@pydantic.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
55
|
+
@pydantic.field_validator("z2_symmetries")
|
56
|
+
@classmethod
|
57
|
+
def _validate_z2_symmetries(cls, z2_symmetries: bool, info: ValidationInfo) -> bool:
|
58
|
+
if (
|
59
|
+
z2_symmetries
|
60
|
+
and info.data.get("mapping") == FermionMapping.FAST_BRAVYI_KITAEV
|
61
|
+
):
|
62
|
+
raise ClassiqValueError(
|
57
63
|
"z2 symmetries reduction can not be used for fast_bravyi_kitaev mapping"
|
58
64
|
)
|
59
65
|
return z2_symmetries
|
60
66
|
|
61
|
-
|
62
|
-
frozen = True
|
67
|
+
model_config = ConfigDict(frozen=True)
|
63
68
|
|
64
69
|
|
65
70
|
class MoleculeProblem(GroundStateProblem):
|
71
|
+
kind: Literal["molecule"] = pydantic.Field(default="molecule")
|
72
|
+
|
66
73
|
molecule: Molecule
|
67
74
|
basis: str = pydantic.Field(default="sto3g", description="Molecular basis set")
|
68
75
|
freeze_core: bool = pydantic.Field(default=False)
|
69
|
-
remove_orbitals:
|
76
|
+
remove_orbitals: list[int] = pydantic.Field(
|
70
77
|
default_factory=list, description="list of orbitals to remove"
|
71
78
|
)
|
72
79
|
|
73
80
|
|
74
81
|
class HamiltonianProblem(GroundStateProblem):
|
82
|
+
kind: Literal["hamiltonian"] = pydantic.Field(default="hamiltonian")
|
83
|
+
|
75
84
|
hamiltonian: SummedFermionicOperator = pydantic.Field(
|
76
85
|
description="Hamiltonian as a fermionic operator"
|
77
86
|
)
|
78
|
-
num_particles:
|
87
|
+
num_particles: list[pydantic.PositiveInt] = pydantic.Field(
|
79
88
|
description="Tuple containing the numbers of alpha particles and beta particles"
|
80
89
|
)
|
81
90
|
|
82
|
-
@pydantic.
|
83
|
-
|
84
|
-
|
91
|
+
@pydantic.field_validator("num_particles", mode="before")
|
92
|
+
@classmethod
|
93
|
+
def _validate_num_particles(
|
94
|
+
cls,
|
95
|
+
num_particles: Union[
|
96
|
+
list[Union[int, float]], tuple[Union[int, float], Union[int, float]]
|
97
|
+
],
|
98
|
+
) -> list[int]:
|
99
|
+
assert isinstance(num_particles, (list, tuple))
|
85
100
|
assert len(num_particles) == 2
|
86
101
|
|
87
|
-
|
88
|
-
# floats to ints
|
89
|
-
assert isinstance(num_particles[0], int)
|
90
|
-
assert num_particles[0] >= 1
|
102
|
+
num_particles = [int(x) for x in num_particles]
|
91
103
|
|
92
|
-
assert
|
104
|
+
assert num_particles[0] >= 1
|
93
105
|
assert num_particles[1] >= 1
|
94
106
|
|
95
|
-
return num_particles
|
107
|
+
return cast(list[int], num_particles)
|
96
108
|
|
97
109
|
|
98
110
|
CHEMISTRY_PROBLEMS = (MoleculeProblem, HamiltonianProblem)
|
99
|
-
CHEMISTRY_PROBLEMS_TYPE =
|
111
|
+
CHEMISTRY_PROBLEMS_TYPE = Annotated[
|
112
|
+
Union[MoleculeProblem, HamiltonianProblem],
|
113
|
+
Field(
|
114
|
+
discriminator="kind",
|
115
|
+
description="Ground state problem object describing the system.",
|
116
|
+
),
|
117
|
+
]
|
100
118
|
CHEMISTRY_ANSATZ_NAMES = ["hw_efficient", "ucc", "hva"]
|