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
@@ -0,0 +1,86 @@
|
|
1
|
+
import json
|
2
|
+
from collections.abc import Mapping
|
3
|
+
from typing import Any, Optional, Union
|
4
|
+
from uuid import UUID
|
5
|
+
|
6
|
+
from pydantic import BaseModel, Field
|
7
|
+
|
8
|
+
from classiq.interface.enum_utils import StrEnum
|
9
|
+
from classiq.interface.generator.generated_circuit_data import (
|
10
|
+
FunctionDebugInfoInterface,
|
11
|
+
OperationLevel,
|
12
|
+
)
|
13
|
+
|
14
|
+
ParameterValue = Union[float, int, str, None]
|
15
|
+
|
16
|
+
|
17
|
+
class StatementType(StrEnum):
|
18
|
+
CONTROL = "control"
|
19
|
+
POWER = "power"
|
20
|
+
INVERT = "invert"
|
21
|
+
WITHIN_APPLY = "within_apply"
|
22
|
+
ASSIGNMENT = "assignment"
|
23
|
+
REPEAT = "repeat"
|
24
|
+
|
25
|
+
|
26
|
+
class FunctionDebugInfo(BaseModel):
|
27
|
+
name: str
|
28
|
+
# Parameters describe classical parameters passed to function
|
29
|
+
parameters: dict[str, str]
|
30
|
+
level: OperationLevel
|
31
|
+
statement_type: Union[StatementType, None] = None
|
32
|
+
is_allocate_or_free: bool = Field(default=False)
|
33
|
+
is_inverse: bool = Field(default=False)
|
34
|
+
port_to_passed_variable_map: dict[str, str] = Field(default_factory=dict)
|
35
|
+
|
36
|
+
@staticmethod
|
37
|
+
def param_controller(value: Any) -> str:
|
38
|
+
try:
|
39
|
+
return json.dumps(value)
|
40
|
+
except TypeError:
|
41
|
+
return repr(value)
|
42
|
+
|
43
|
+
def update_map_from_port_mapping(self, port_mapping: Mapping[str, str]) -> None:
|
44
|
+
new_port_to_passed_variable_map = self.port_to_passed_variable_map.copy()
|
45
|
+
for old_key, new_key in port_mapping.items():
|
46
|
+
if old_key in new_port_to_passed_variable_map:
|
47
|
+
new_port_to_passed_variable_map[new_key] = (
|
48
|
+
new_port_to_passed_variable_map.pop(old_key)
|
49
|
+
)
|
50
|
+
self.port_to_passed_variable_map = new_port_to_passed_variable_map
|
51
|
+
|
52
|
+
def update_map_from_inout_port_mapping(
|
53
|
+
self, port_mapping: Mapping[str, tuple[str, str]]
|
54
|
+
) -> None:
|
55
|
+
new_port_to_passed_variable_map = self.port_to_passed_variable_map.copy()
|
56
|
+
for old_key, (new_key1, new_key2) in port_mapping.items():
|
57
|
+
if old_key in new_port_to_passed_variable_map:
|
58
|
+
value = new_port_to_passed_variable_map.pop(old_key)
|
59
|
+
new_port_to_passed_variable_map[new_key1] = value
|
60
|
+
new_port_to_passed_variable_map[new_key2] = value
|
61
|
+
self.port_to_passed_variable_map = new_port_to_passed_variable_map
|
62
|
+
|
63
|
+
|
64
|
+
class DebugInfoCollection(BaseModel):
|
65
|
+
# Pydantic only started supporting UUID as keys in Pydantic V2
|
66
|
+
# See https://github.com/pydantic/pydantic/issues/2096#issuecomment-814860206
|
67
|
+
# For now, we use strings as keys in the raw data and use UUID in the wrapper logic
|
68
|
+
data: dict[str, FunctionDebugInfo] = Field(default={})
|
69
|
+
blackbox_data: dict[str, FunctionDebugInfoInterface] = Field(default={})
|
70
|
+
|
71
|
+
def __setitem__(self, key: UUID, value: FunctionDebugInfo) -> None:
|
72
|
+
self.data[str(key)] = value
|
73
|
+
|
74
|
+
def get(self, key: UUID) -> Optional[FunctionDebugInfo]:
|
75
|
+
return self.data.get(str(key))
|
76
|
+
|
77
|
+
def __getitem__(self, key: UUID) -> FunctionDebugInfo:
|
78
|
+
return self.data[str(key)]
|
79
|
+
|
80
|
+
def __contains__(self, key: UUID) -> bool:
|
81
|
+
return str(key) in self.data
|
82
|
+
|
83
|
+
def get_blackbox_data(self, key: UUID) -> Optional[FunctionDebugInfoInterface]:
|
84
|
+
if (debug_info := self.get(key)) is None:
|
85
|
+
return None
|
86
|
+
return self.blackbox_data.get(debug_info.name)
|
@@ -1,19 +1,21 @@
|
|
1
1
|
import logging
|
2
|
-
from
|
2
|
+
from collections.abc import Iterable
|
3
|
+
from typing import Optional
|
3
4
|
|
4
5
|
_logger = logging.getLogger(__name__)
|
5
6
|
|
6
7
|
CLASSIQ_SLACK_COMMUNITY_LINK = (
|
7
|
-
"\nIf you need further assistance, please reach out on our Community Slack channel
|
8
|
-
"
|
8
|
+
"\nIf you need further assistance, please reach out on our Community Slack channel "
|
9
|
+
"at: https://short.classiq.io/join-slack"
|
9
10
|
)
|
10
11
|
|
11
12
|
|
12
13
|
class ClassiqError(Exception):
|
13
14
|
def __init__(self, message: str) -> None:
|
14
|
-
message_with_link = message + CLASSIQ_SLACK_COMMUNITY_LINK
|
15
|
-
super().__init__(message_with_link)
|
16
15
|
self._raw_message = message
|
16
|
+
if CLASSIQ_SLACK_COMMUNITY_LINK not in message:
|
17
|
+
message = message + CLASSIQ_SLACK_COMMUNITY_LINK
|
18
|
+
super().__init__(message)
|
17
19
|
|
18
20
|
@property
|
19
21
|
def raw_message(self) -> str:
|
@@ -25,7 +27,7 @@ class ClassiqExecutionError(ClassiqError):
|
|
25
27
|
|
26
28
|
|
27
29
|
class ClassiqMissingOutputFormatError(ClassiqError):
|
28
|
-
def __init__(self, missing_formats:
|
30
|
+
def __init__(self, missing_formats: list[str]) -> None:
|
29
31
|
msg = (
|
30
32
|
f"Cannot create program because output format is missing. "
|
31
33
|
f"Expected one of the following formats: {missing_formats}"
|
@@ -45,12 +47,14 @@ class ClassiqAnalyzerError(ClassiqError):
|
|
45
47
|
pass
|
46
48
|
|
47
49
|
|
48
|
-
class
|
50
|
+
class ClassiqAnalyzerVisualizationError(ClassiqError):
|
49
51
|
pass
|
50
52
|
|
51
53
|
|
52
54
|
class ClassiqAPIError(ClassiqError):
|
53
|
-
|
55
|
+
def __init__(self, message: str, status_code: Optional[int] = None) -> None:
|
56
|
+
self.status_code = status_code
|
57
|
+
super().__init__(message)
|
54
58
|
|
55
59
|
|
56
60
|
class ClassiqVersionError(ClassiqError):
|
@@ -143,7 +147,7 @@ class ClassiqCombOptNoSolutionError(ClassiqError):
|
|
143
147
|
|
144
148
|
class ClassiqCombOptTrivialProblemError(ClassiqError):
|
145
149
|
|
146
|
-
def __init__(self, solution:
|
150
|
+
def __init__(self, solution: list[int]) -> None:
|
147
151
|
super().__init__(
|
148
152
|
message=f"The problem doesn't have free decision variables. "
|
149
153
|
f"The trivial solution is {solution}."
|
@@ -171,3 +175,27 @@ class ClassiqExecutorInvalidHamiltonianError(ClassiqCombOptError):
|
|
171
175
|
|
172
176
|
def __init__(self) -> None:
|
173
177
|
super().__init__("Invalid hamiltonian")
|
178
|
+
|
179
|
+
|
180
|
+
class ClassiqSemanticError(ClassiqError):
|
181
|
+
pass
|
182
|
+
|
183
|
+
|
184
|
+
class ClassiqDeprecationWarning(FutureWarning):
|
185
|
+
pass
|
186
|
+
|
187
|
+
|
188
|
+
class ClassiqExpansionError(ClassiqError):
|
189
|
+
pass
|
190
|
+
|
191
|
+
|
192
|
+
class ClassiqInternalError(ClassiqError):
|
193
|
+
def __init__(self, message: Optional[str] = None) -> None:
|
194
|
+
final_message = "Internal error occurred. Please contact Classiq support."
|
195
|
+
if message is not None:
|
196
|
+
final_message += f"\nError: {message}"
|
197
|
+
super().__init__(final_message)
|
198
|
+
|
199
|
+
|
200
|
+
class ClassiqInternalExpansionError(ClassiqInternalError):
|
201
|
+
pass
|
@@ -0,0 +1,19 @@
|
|
1
|
+
from classiq.interface.helpers.versioned_model import VersionedModel
|
2
|
+
|
3
|
+
|
4
|
+
class IQCCInitAuthData(VersionedModel):
|
5
|
+
auth_scope_id: str
|
6
|
+
auth_method_id: str
|
7
|
+
|
8
|
+
|
9
|
+
class IQCCInitAuthResponse(VersionedModel):
|
10
|
+
auth_url: str
|
11
|
+
token_id: str
|
12
|
+
|
13
|
+
|
14
|
+
class IQCCProbeAuthData(IQCCInitAuthData):
|
15
|
+
token_id: str
|
16
|
+
|
17
|
+
|
18
|
+
class IQCCProbeAuthResponse(VersionedModel):
|
19
|
+
auth_token: str
|
@@ -1,28 +1,31 @@
|
|
1
1
|
from datetime import datetime
|
2
|
-
from typing import
|
2
|
+
from typing import Optional
|
3
3
|
|
4
|
-
from pydantic import BaseModel,
|
4
|
+
from pydantic import BaseModel, Field
|
5
5
|
|
6
|
+
from classiq.interface.executor.execution_request import JobCost
|
6
7
|
from classiq.interface.jobs import JobStatus
|
7
8
|
|
8
9
|
|
9
|
-
class ExecutionJobDetailsV1(BaseModel, extra=
|
10
|
+
class ExecutionJobDetailsV1(BaseModel, extra="ignore"):
|
10
11
|
id: str
|
11
12
|
|
12
|
-
name: Optional[str]
|
13
|
+
name: Optional[str] = None
|
13
14
|
start_time: datetime
|
14
|
-
end_time: Optional[datetime]
|
15
|
+
end_time: Optional[datetime] = None
|
15
16
|
|
16
|
-
provider: Optional[str]
|
17
|
-
backend_name: Optional[str]
|
17
|
+
provider: Optional[str] = None
|
18
|
+
backend_name: Optional[str] = None
|
18
19
|
|
19
20
|
status: JobStatus
|
20
21
|
|
21
|
-
num_shots: Optional[int]
|
22
|
-
program_id: Optional[str]
|
22
|
+
num_shots: Optional[int] = None
|
23
|
+
program_id: Optional[str] = None
|
23
24
|
|
24
|
-
error: Optional[str]
|
25
|
+
error: Optional[str] = None
|
25
26
|
|
27
|
+
cost: Optional[JobCost] = Field(default=None)
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
+
|
30
|
+
class ExecutionJobsQueryResultsV1(BaseModel, extra="ignore"):
|
31
|
+
results: list[ExecutionJobDetailsV1]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from pydantic import BaseModel, Field
|
4
|
+
|
5
|
+
from classiq.interface.chemistry.operator import PauliOperator
|
6
|
+
from classiq.interface.executor.quantum_code import Arguments
|
7
|
+
from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
|
8
|
+
|
9
|
+
|
10
|
+
class EstimateInput(BaseModel, json_encoders=CUSTOM_ENCODERS):
|
11
|
+
hamiltonian: PauliOperator
|
12
|
+
parameters: list[Arguments]
|
13
|
+
|
14
|
+
|
15
|
+
class PrimitivesInput(BaseModel, json_encoders=CUSTOM_ENCODERS):
|
16
|
+
sample: Optional[list[Arguments]] = Field(default=None)
|
17
|
+
estimate: Optional[EstimateInput] = Field(default=None)
|
18
|
+
random_seed: Optional[int] = Field(default=None)
|
@@ -0,0 +1 @@
|
|
1
|
+
DEFAULT_RESULT_NAME = "result"
|
@@ -1,40 +1,22 @@
|
|
1
|
-
from
|
2
|
-
from typing import Any, Dict, Optional, TypeVar
|
1
|
+
from typing import Optional
|
3
2
|
|
4
3
|
import pydantic
|
5
4
|
|
6
5
|
from classiq.interface.backend.backend_preferences import (
|
7
|
-
AWS_DEFAULT_JOB_TIMEOUT_SECONDS,
|
8
|
-
AwsBackendPreferences,
|
9
6
|
BackendPreferencesTypes,
|
10
7
|
backend_preferences_field,
|
11
8
|
)
|
12
|
-
from classiq.interface.backend.
|
13
|
-
|
14
|
-
from classiq.interface.executor.error_mitigation import ErrorMitigationMethod
|
15
|
-
from classiq.interface.executor.optimizer_preferences import (
|
16
|
-
OptimizerPreferences,
|
17
|
-
OptimizerType,
|
9
|
+
from classiq.interface.backend.quantum_backend_providers import (
|
10
|
+
ClassiqSimulatorBackendNames,
|
18
11
|
)
|
12
|
+
from classiq.interface.enum_utils import ReprEnum
|
13
|
+
from classiq.interface.executor.optimizer_preferences import OptimizerType
|
19
14
|
from classiq.interface.generator.model.preferences.preferences import (
|
20
15
|
TranspilationOption,
|
21
16
|
)
|
22
17
|
from classiq.interface.generator.model.preferences.randomness import create_random_seed
|
23
18
|
from classiq.interface.generator.noise_properties import NoiseProperties
|
24
19
|
|
25
|
-
from classiq._internals.enum_utils import ReprEnum
|
26
|
-
from classiq.exceptions import ClassiqValueError
|
27
|
-
|
28
|
-
DIFFERENT_TIMEOUT_MSG = (
|
29
|
-
"Timeout is defined differently in the execution preferences and the "
|
30
|
-
"AWS Backend Preferences."
|
31
|
-
)
|
32
|
-
|
33
|
-
TIMEOUT_LARGE_FOR_AWS_MSG = (
|
34
|
-
"Timeout is larger than the current allowed limit of "
|
35
|
-
f"{timedelta(MAX_EXECUTION_TIMEOUT_SECONDS)}"
|
36
|
-
)
|
37
|
-
|
38
20
|
|
39
21
|
class QaeWithQpeEstimationMethod(int, ReprEnum):
|
40
22
|
MAXIMUM_LIKELIHOOD = 0
|
@@ -42,29 +24,33 @@ class QaeWithQpeEstimationMethod(int, ReprEnum):
|
|
42
24
|
|
43
25
|
|
44
26
|
class ExecutionPreferences(pydantic.BaseModel):
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
27
|
+
"""
|
28
|
+
Represents the execution settings for running a quantum program.
|
29
|
+
Execution preferences for running a quantum program.
|
30
|
+
|
31
|
+
For more details, refer to:
|
32
|
+
`ExecutionPreferences example: [ExecutionPreferences](https://docs.classiq.io/latest/reference-manual/executor/?h=execution+pref#execution-preferences)..
|
33
|
+
|
34
|
+
Attributes:
|
35
|
+
noise_properties (Optional[NoiseProperties]): Properties defining the noise in the quantum circuit. Defaults to `None`.
|
36
|
+
random_seed (int): The random seed used for the execution. Defaults to a randomly generated seed.
|
37
|
+
backend_preferences (BackendPreferencesTypes): Preferences for the backend used to execute the circuit.
|
38
|
+
Defaults to the Classiq Simulator.
|
39
|
+
num_shots (Optional[pydantic.PositiveInt]): The number of shots (executions) to be performed.
|
40
|
+
transpile_to_hardware (TranspilationOption): Option to transpile the circuit to the hardware's basis gates
|
41
|
+
before execution. Defaults to `TranspilationOption.DECOMPOSE`.
|
42
|
+
job_name (Optional[str]): The name of the job, with a minimum length of 1 character.
|
43
|
+
"""
|
44
|
+
|
59
45
|
noise_properties: Optional[NoiseProperties] = pydantic.Field(
|
60
46
|
default=None, description="Properties of the noise in the circuit"
|
61
47
|
)
|
62
48
|
random_seed: int = pydantic.Field(
|
63
|
-
|
49
|
+
default_factory=create_random_seed,
|
64
50
|
description="The random seed used for the execution",
|
65
51
|
)
|
66
52
|
backend_preferences: BackendPreferencesTypes = backend_preferences_field(
|
67
|
-
backend_name=
|
53
|
+
backend_name=ClassiqSimulatorBackendNames.SIMULATOR
|
68
54
|
)
|
69
55
|
num_shots: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
|
70
56
|
transpile_to_hardware: TranspilationOption = pydantic.Field(
|
@@ -73,87 +59,13 @@ class ExecutionPreferences(pydantic.BaseModel):
|
|
73
59
|
title="Transpilation Option",
|
74
60
|
)
|
75
61
|
job_name: Optional[str] = pydantic.Field(
|
76
|
-
min_length=1,
|
77
|
-
description="The job name",
|
62
|
+
min_length=1, description="The job name", default=None
|
78
63
|
)
|
79
64
|
|
80
|
-
def __init__(self, **kwargs: Any) -> None:
|
81
|
-
super().__init__(**kwargs)
|
82
|
-
|
83
|
-
@pydantic.validator("num_shots", always=True)
|
84
|
-
def validate_num_shots(
|
85
|
-
cls, original_num_shots: Optional[pydantic.PositiveInt], values: Dict[str, Any]
|
86
|
-
) -> Optional[pydantic.PositiveInt]:
|
87
|
-
return _choose_original_or_optimizer_attribute(
|
88
|
-
original_num_shots, "num_shots", None, values
|
89
|
-
)
|
90
|
-
|
91
|
-
@pydantic.validator("backend_preferences", always=True)
|
92
|
-
def validate_timeout_for_aws(
|
93
|
-
cls, backend_preferences: BackendPreferencesTypes, values: Dict[str, Any]
|
94
|
-
) -> BackendPreferencesTypes:
|
95
|
-
timeout = values.get("timeout_sec", None)
|
96
|
-
if (
|
97
|
-
not isinstance(backend_preferences, AwsBackendPreferences)
|
98
|
-
or timeout is None
|
99
|
-
):
|
100
|
-
return backend_preferences
|
101
|
-
if (
|
102
|
-
timeout != backend_preferences.job_timeout
|
103
|
-
and backend_preferences.job_timeout != AWS_DEFAULT_JOB_TIMEOUT_SECONDS
|
104
|
-
):
|
105
|
-
raise ClassiqValueError(DIFFERENT_TIMEOUT_MSG)
|
106
|
-
if timeout > MAX_EXECUTION_TIMEOUT_SECONDS:
|
107
|
-
raise ClassiqValueError(TIMEOUT_LARGE_FOR_AWS_MSG)
|
108
|
-
|
109
|
-
backend_preferences.job_timeout = timeout
|
110
|
-
return backend_preferences
|
111
|
-
|
112
|
-
@pydantic.validator("random_seed", always=True)
|
113
|
-
def validate_random_seed(
|
114
|
-
cls, original_random_seed: Optional[int], values: Dict[str, Any]
|
115
|
-
) -> int:
|
116
|
-
return _choose_original_or_optimizer_attribute(
|
117
|
-
original_random_seed, "random_seed", create_random_seed(), values
|
118
|
-
)
|
119
|
-
|
120
|
-
|
121
|
-
T = TypeVar("T")
|
122
|
-
|
123
|
-
|
124
|
-
def _choose_original_or_optimizer_attribute(
|
125
|
-
original_attribute: Optional[T],
|
126
|
-
attribure_name: str,
|
127
|
-
default_value: T,
|
128
|
-
values: Dict[str, Any],
|
129
|
-
) -> T:
|
130
|
-
optimizer_preferences = values.get("optimizer_preferences", None)
|
131
|
-
optimizer_attribute = getattr(optimizer_preferences, attribure_name, None)
|
132
|
-
|
133
|
-
if original_attribute is None and optimizer_attribute is None:
|
134
|
-
return default_value
|
135
|
-
|
136
|
-
elif optimizer_attribute is None:
|
137
|
-
# mypy doesn't understand that original_attribute is not None
|
138
|
-
return original_attribute # type: ignore[return-value]
|
139
|
-
|
140
|
-
elif original_attribute is None:
|
141
|
-
return optimizer_attribute
|
142
|
-
|
143
|
-
elif original_attribute != optimizer_attribute:
|
144
|
-
raise ClassiqValueError(
|
145
|
-
f"Different {attribure_name} were given for ExecutionPreferences and OptimizerPreferences."
|
146
|
-
)
|
147
|
-
|
148
|
-
else: # This case is original_num_shots == optimizer_num_shots != None
|
149
|
-
return original_attribute
|
150
|
-
|
151
65
|
|
152
66
|
__all__ = [
|
153
67
|
"ExecutionPreferences",
|
154
|
-
"ErrorMitigationMethod",
|
155
68
|
"NoiseProperties",
|
156
|
-
"OptimizerPreferences",
|
157
69
|
"OptimizerType",
|
158
70
|
"QaeWithQpeEstimationMethod",
|
159
71
|
]
|
@@ -1,21 +1,17 @@
|
|
1
1
|
from datetime import datetime
|
2
|
-
from typing import
|
2
|
+
from typing import Annotated, Literal, Optional, Union
|
3
3
|
|
4
4
|
import pydantic
|
5
5
|
from pydantic import BaseModel, Field
|
6
|
-
from typing_extensions import Annotated
|
7
6
|
|
8
|
-
from classiq.interface.backend.backend_preferences import IonqBackendPreferences
|
9
7
|
from classiq.interface.executor.estimation import OperatorsEstimation
|
10
8
|
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
11
|
-
from classiq.interface.executor.quantum_code import QuantumCode
|
9
|
+
from classiq.interface.executor.quantum_code import QuantumCode
|
12
10
|
from classiq.interface.generator.quantum_program import QuantumProgram
|
13
11
|
from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
|
14
12
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
15
13
|
from classiq.interface.jobs import JobStatus
|
16
14
|
|
17
|
-
from classiq.exceptions import ClassiqValueError
|
18
|
-
|
19
15
|
|
20
16
|
class QuantumProgramExecution(QuantumProgram):
|
21
17
|
execution_type: Literal["quantum_program2"] = "quantum_program2"
|
@@ -42,60 +38,42 @@ class ExecutionRequest(BaseModel, json_encoders=CUSTOM_ENCODERS):
|
|
42
38
|
description="preferences for the execution",
|
43
39
|
)
|
44
40
|
|
45
|
-
@pydantic.validator("preferences")
|
46
|
-
def validate_ionq_backend(
|
47
|
-
cls, preferences: ExecutionPreferences, values: Dict[str, Any]
|
48
|
-
) -> ExecutionPreferences:
|
49
|
-
"""
|
50
|
-
This function implement the following check:
|
51
|
-
BE \\ payload | IonQ program | Qasm program | Other
|
52
|
-
--------------|--------------|--------------|------
|
53
|
-
IonQ backend | V | V | X
|
54
|
-
Other backend | X | V | V
|
55
|
-
Since:
|
56
|
-
- We can't execute non-programs on the IonQ backends
|
57
|
-
- We can't execute IonQ programs on non-IonQ backends
|
58
|
-
"""
|
59
|
-
quantum_program = values.get("execution_payload")
|
60
|
-
is_ionq_backend = isinstance(
|
61
|
-
preferences.backend_preferences, IonqBackendPreferences
|
62
|
-
)
|
63
|
-
if isinstance(quantum_program, QuantumCode):
|
64
|
-
if (
|
65
|
-
quantum_program.syntax == QuantumInstructionSet.IONQ
|
66
|
-
and not is_ionq_backend
|
67
|
-
):
|
68
|
-
raise ClassiqValueError("Can only execute IonQ code on IonQ backend.")
|
69
|
-
else:
|
70
|
-
# If we handle anything other than a program.
|
71
|
-
if is_ionq_backend:
|
72
|
-
raise ClassiqValueError(
|
73
|
-
"IonQ backend supports only execution of QuantumPrograms"
|
74
|
-
)
|
75
|
-
return preferences
|
76
|
-
|
77
41
|
|
78
42
|
class QuantumProgramExecutionRequest(ExecutionRequest):
|
79
43
|
execution_payload: QuantumCodeExecution
|
80
44
|
|
81
45
|
|
46
|
+
class ProviderJobs(BaseModel):
|
47
|
+
provider_job_id: str = Field(default="DUMMY")
|
48
|
+
cost: float = Field(default=0)
|
49
|
+
|
50
|
+
|
51
|
+
class JobCost(BaseModel):
|
52
|
+
total_cost: float = Field(default=0)
|
53
|
+
currency_code: str = Field(default="USD")
|
54
|
+
organization: Optional[str] = Field(default=None)
|
55
|
+
jobs: list[ProviderJobs] = Field(default=[])
|
56
|
+
|
57
|
+
|
82
58
|
class ExecutionJobDetails(VersionedModel):
|
83
59
|
id: str
|
84
60
|
|
85
|
-
name: Optional[str]
|
61
|
+
name: Optional[str] = Field(default=None)
|
86
62
|
start_time: datetime
|
87
|
-
end_time: Optional[datetime]
|
63
|
+
end_time: Optional[datetime] = Field(default=None)
|
88
64
|
|
89
|
-
provider: Optional[str]
|
90
|
-
backend_name: Optional[str]
|
65
|
+
provider: Optional[str] = Field(default=None)
|
66
|
+
backend_name: Optional[str] = Field(default=None)
|
91
67
|
|
92
68
|
status: JobStatus
|
93
69
|
|
94
|
-
num_shots: Optional[int]
|
95
|
-
program_id: Optional[str]
|
70
|
+
num_shots: Optional[int] = Field(default=None)
|
71
|
+
program_id: Optional[str] = Field(default=None)
|
72
|
+
|
73
|
+
error: Optional[str] = Field(default=None)
|
96
74
|
|
97
|
-
|
75
|
+
cost: Optional[JobCost] = Field(default=None)
|
98
76
|
|
99
77
|
|
100
78
|
class ExecutionJobsQueryResults(VersionedModel):
|
101
|
-
results:
|
79
|
+
results: list[ExecutionJobDetails]
|
@@ -1,15 +1,19 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Annotated, Any, Literal, Union
|
2
2
|
|
3
|
-
from pydantic import BaseModel, Field
|
4
|
-
from typing_extensions import
|
3
|
+
from pydantic import BaseModel, ConfigDict, Field
|
4
|
+
from typing_extensions import TypeAlias
|
5
5
|
|
6
|
+
from classiq.interface.enum_utils import StrEnum
|
6
7
|
from classiq.interface.executor.iqae_result import IQAEResult
|
7
|
-
from classiq.interface.executor.result import
|
8
|
+
from classiq.interface.executor.result import (
|
9
|
+
EstimationResult,
|
10
|
+
EstimationResults,
|
11
|
+
ExecutionDetails,
|
12
|
+
MultipleExecutionDetails,
|
13
|
+
)
|
8
14
|
from classiq.interface.executor.vqe_result import VQESolverResult
|
9
15
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
10
16
|
|
11
|
-
from classiq._internals.enum_utils import StrEnum
|
12
|
-
|
13
17
|
|
14
18
|
class SavedResultValueType(StrEnum):
|
15
19
|
Integer = "int"
|
@@ -17,7 +21,9 @@ class SavedResultValueType(StrEnum):
|
|
17
21
|
Boolean = "bool"
|
18
22
|
VQESolverResult = "VQESolverResult"
|
19
23
|
ExecutionDetails = "ExecutionDetails"
|
24
|
+
MultipleExecutionDetails = "MultipleExecutionDetails"
|
20
25
|
EstimationResult = "EstimationResult"
|
26
|
+
EstimationResults = "EstimationResults"
|
21
27
|
IQAEResult = "IQAEResult"
|
22
28
|
Unstructured = "Unstructured"
|
23
29
|
|
@@ -52,12 +58,24 @@ class TaggedExecutionDetails(BaseModel):
|
|
52
58
|
value: ExecutionDetails
|
53
59
|
|
54
60
|
|
61
|
+
class TaggedMultipleExecutionDetails(BaseModel):
|
62
|
+
value_type: Literal[SavedResultValueType.MultipleExecutionDetails]
|
63
|
+
name: str
|
64
|
+
value: MultipleExecutionDetails
|
65
|
+
|
66
|
+
|
55
67
|
class TaggedEstimationResult(BaseModel):
|
56
68
|
value_type: Literal[SavedResultValueType.EstimationResult]
|
57
69
|
name: str
|
58
70
|
value: EstimationResult
|
59
71
|
|
60
72
|
|
73
|
+
class TaggedEstimationResults(BaseModel):
|
74
|
+
value_type: Literal[SavedResultValueType.EstimationResults]
|
75
|
+
name: str
|
76
|
+
value: EstimationResults
|
77
|
+
|
78
|
+
|
61
79
|
class TaggedIQAEResult(BaseModel):
|
62
80
|
value_type: Literal[SavedResultValueType.IQAEResult]
|
63
81
|
name: str
|
@@ -67,7 +85,7 @@ class TaggedIQAEResult(BaseModel):
|
|
67
85
|
class TaggedUnstructured(BaseModel):
|
68
86
|
value_type: Literal[SavedResultValueType.Unstructured]
|
69
87
|
name: str
|
70
|
-
value: Any
|
88
|
+
value: Any = None
|
71
89
|
|
72
90
|
|
73
91
|
SavedResult = Annotated[
|
@@ -77,15 +95,19 @@ SavedResult = Annotated[
|
|
77
95
|
TaggedBoolean,
|
78
96
|
TaggedVQESolverResult,
|
79
97
|
TaggedExecutionDetails,
|
98
|
+
TaggedMultipleExecutionDetails,
|
80
99
|
TaggedEstimationResult,
|
100
|
+
TaggedEstimationResults,
|
81
101
|
TaggedIQAEResult,
|
82
102
|
TaggedUnstructured,
|
83
103
|
],
|
84
104
|
Field(..., discriminator="value_type"),
|
85
105
|
]
|
86
106
|
|
87
|
-
ResultsCollection: TypeAlias =
|
107
|
+
ResultsCollection: TypeAlias = list[SavedResult]
|
88
108
|
|
89
109
|
|
90
110
|
class ExecuteGeneratedCircuitResults(VersionedModel):
|
91
111
|
results: ResultsCollection
|
112
|
+
|
113
|
+
model_config = ConfigDict(extra="forbid")
|
@@ -1,6 +1,4 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
from pydantic import BaseModel
|
1
|
+
from pydantic import BaseModel, Field
|
4
2
|
|
5
3
|
from classiq.interface.executor.result import ExecutionDetails
|
6
4
|
from classiq.interface.generator.functions.classical_type import QmodPyObject
|
@@ -14,6 +12,6 @@ class IQAEIterationData(BaseModel):
|
|
14
12
|
|
15
13
|
class IQAEResult(VersionedModel, QmodPyObject):
|
16
14
|
estimation: float
|
17
|
-
confidence_interval:
|
18
|
-
iterations_data:
|
19
|
-
warnings:
|
15
|
+
confidence_interval: list[float] = Field(min_length=2, max_length=2)
|
16
|
+
iterations_data: list[IQAEIterationData]
|
17
|
+
warnings: list[str]
|