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