classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,98 +1,56 @@
|
|
1
|
-
from
|
2
|
-
from typing import Any, Dict, List, Optional, TypeVar, Union
|
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
|
-
|
27
|
-
DIFFERENT_TIMEOUT_MSG = (
|
28
|
-
"Timeout is defined differently in the execution preferences and the "
|
29
|
-
"AWS Backend Preferences."
|
30
|
-
)
|
31
|
-
|
32
|
-
TIMEOUT_LARGE_FOR_AWS_MSG = (
|
33
|
-
"Timeout is larger than the current allowed limit of "
|
34
|
-
f"{timedelta(MAX_EXECUTION_TIMEOUT_SECONDS)}"
|
35
|
-
)
|
36
|
-
|
37
20
|
|
38
21
|
class QaeWithQpeEstimationMethod(int, ReprEnum):
|
39
22
|
MAXIMUM_LIKELIHOOD = 0
|
40
23
|
BEST_FIT = 1
|
41
24
|
|
42
25
|
|
43
|
-
class AmplitudeAmplification(pydantic.BaseModel):
|
44
|
-
iterations: List[int] = pydantic.Field(
|
45
|
-
default_factory=list,
|
46
|
-
description="Number or list of numbers of iteration to use",
|
47
|
-
)
|
48
|
-
growth_rate: float = pydantic.Field(
|
49
|
-
default=1.25,
|
50
|
-
description="Number of iteration used is set to round(growth_rate**iterations)",
|
51
|
-
)
|
52
|
-
sample_from_iterations: bool = pydantic.Field(
|
53
|
-
default=False,
|
54
|
-
description="If True, number of iterations used is picked randomly from "
|
55
|
-
"[1, iteration] range",
|
56
|
-
)
|
57
|
-
num_of_highest_probability_states_to_check: pydantic.PositiveInt = pydantic.Field(
|
58
|
-
default=1, description="Then number of highest probability states to check"
|
59
|
-
)
|
60
|
-
|
61
|
-
@pydantic.validator("iterations")
|
62
|
-
def _validate_iterations(cls, iterations: Union[List[int], int]) -> List[int]:
|
63
|
-
if isinstance(iterations, int):
|
64
|
-
return [iterations]
|
65
|
-
return iterations
|
66
|
-
|
67
|
-
|
68
26
|
class ExecutionPreferences(pydantic.BaseModel):
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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
|
+
|
87
45
|
noise_properties: Optional[NoiseProperties] = pydantic.Field(
|
88
46
|
default=None, description="Properties of the noise in the circuit"
|
89
47
|
)
|
90
48
|
random_seed: int = pydantic.Field(
|
91
|
-
|
49
|
+
default_factory=create_random_seed,
|
92
50
|
description="The random seed used for the execution",
|
93
51
|
)
|
94
52
|
backend_preferences: BackendPreferencesTypes = backend_preferences_field(
|
95
|
-
backend_name=
|
53
|
+
backend_name=ClassiqSimulatorBackendNames.SIMULATOR
|
96
54
|
)
|
97
55
|
num_shots: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
|
98
56
|
transpile_to_hardware: TranspilationOption = pydantic.Field(
|
@@ -101,88 +59,13 @@ class ExecutionPreferences(pydantic.BaseModel):
|
|
101
59
|
title="Transpilation Option",
|
102
60
|
)
|
103
61
|
job_name: Optional[str] = pydantic.Field(
|
104
|
-
min_length=1,
|
105
|
-
description="The job name",
|
62
|
+
min_length=1, description="The job name", default=None
|
106
63
|
)
|
107
64
|
|
108
|
-
def __init__(self, **kwargs: Any) -> None:
|
109
|
-
super().__init__(**kwargs)
|
110
|
-
|
111
|
-
@pydantic.validator("num_shots", always=True)
|
112
|
-
def validate_num_shots(
|
113
|
-
cls, original_num_shots: Optional[pydantic.PositiveInt], values: Dict[str, Any]
|
114
|
-
) -> Optional[pydantic.PositiveInt]:
|
115
|
-
return _choose_original_or_optimizer_attribute(
|
116
|
-
original_num_shots, "num_shots", None, values
|
117
|
-
)
|
118
|
-
|
119
|
-
@pydantic.validator("backend_preferences", always=True)
|
120
|
-
def validate_timeout_for_aws(
|
121
|
-
cls, backend_preferences: BackendPreferencesTypes, values: Dict[str, Any]
|
122
|
-
) -> BackendPreferencesTypes:
|
123
|
-
timeout = values.get("timeout_sec", None)
|
124
|
-
if (
|
125
|
-
not isinstance(backend_preferences, AwsBackendPreferences)
|
126
|
-
or timeout is None
|
127
|
-
):
|
128
|
-
return backend_preferences
|
129
|
-
if (
|
130
|
-
timeout != backend_preferences.job_timeout
|
131
|
-
and backend_preferences.job_timeout != AWS_DEFAULT_JOB_TIMEOUT_SECONDS
|
132
|
-
):
|
133
|
-
raise ValueError(DIFFERENT_TIMEOUT_MSG)
|
134
|
-
if timeout > MAX_EXECUTION_TIMEOUT_SECONDS:
|
135
|
-
raise ValueError(TIMEOUT_LARGE_FOR_AWS_MSG)
|
136
|
-
|
137
|
-
backend_preferences.job_timeout = timeout
|
138
|
-
return backend_preferences
|
139
|
-
|
140
|
-
@pydantic.validator("random_seed", always=True)
|
141
|
-
def validate_random_seed(
|
142
|
-
cls, original_random_seed: Optional[int], values: Dict[str, Any]
|
143
|
-
) -> int:
|
144
|
-
return _choose_original_or_optimizer_attribute(
|
145
|
-
original_random_seed, "random_seed", create_random_seed(), values
|
146
|
-
)
|
147
|
-
|
148
|
-
|
149
|
-
T = TypeVar("T")
|
150
|
-
|
151
|
-
|
152
|
-
def _choose_original_or_optimizer_attribute(
|
153
|
-
original_attribute: Optional[T],
|
154
|
-
attribure_name: str,
|
155
|
-
default_value: T,
|
156
|
-
values: Dict[str, Any],
|
157
|
-
) -> T:
|
158
|
-
optimizer_preferences = values.get("optimizer_preferences", None)
|
159
|
-
optimizer_attribute = getattr(optimizer_preferences, attribure_name, None)
|
160
|
-
|
161
|
-
if original_attribute is None and optimizer_attribute is None:
|
162
|
-
return default_value
|
163
|
-
|
164
|
-
elif optimizer_attribute is None:
|
165
|
-
# mypy doesn't understand that original_attribute is not None
|
166
|
-
return original_attribute # type: ignore[return-value]
|
167
|
-
|
168
|
-
elif original_attribute is None:
|
169
|
-
return optimizer_attribute
|
170
|
-
|
171
|
-
elif original_attribute != optimizer_attribute:
|
172
|
-
raise ValueError(
|
173
|
-
f"Different {attribure_name} were given for ExecutionPreferences and OptimizerPreferences."
|
174
|
-
)
|
175
|
-
|
176
|
-
else: # This case is original_num_shots == optimizer_num_shots != None
|
177
|
-
return original_attribute
|
178
|
-
|
179
65
|
|
180
66
|
__all__ = [
|
181
67
|
"ExecutionPreferences",
|
182
|
-
"AmplitudeAmplification",
|
183
|
-
"ErrorMitigationMethod",
|
184
68
|
"NoiseProperties",
|
185
|
-
"OptimizerPreferences",
|
186
69
|
"OptimizerType",
|
187
70
|
"QaeWithQpeEstimationMethod",
|
188
71
|
]
|
@@ -1,99 +1,79 @@
|
|
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
|
-
from pydantic import BaseModel
|
5
|
+
from pydantic import BaseModel, Field
|
6
6
|
|
7
|
-
from classiq.interface.backend.backend_preferences import IonqBackendPreferences
|
8
7
|
from classiq.interface.executor.estimation import OperatorsEstimation
|
9
8
|
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
10
|
-
from classiq.interface.executor.
|
11
|
-
|
12
|
-
|
13
|
-
)
|
14
|
-
from classiq.interface.generator.generated_circuit import GeneratedCircuit
|
9
|
+
from classiq.interface.executor.quantum_code import QuantumCode
|
10
|
+
from classiq.interface.generator.quantum_program import QuantumProgram
|
11
|
+
from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
|
15
12
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
16
13
|
from classiq.interface.jobs import JobStatus
|
17
14
|
|
18
15
|
|
19
|
-
class
|
20
|
-
execution_type: Literal["
|
16
|
+
class QuantumProgramExecution(QuantumProgram):
|
17
|
+
execution_type: Literal["quantum_program2"] = "quantum_program2"
|
21
18
|
|
22
19
|
|
23
|
-
class
|
24
|
-
execution_type: Literal["
|
20
|
+
class QuantumCodeExecution(QuantumCode):
|
21
|
+
execution_type: Literal["quantum_code"] = "quantum_code"
|
25
22
|
|
26
23
|
|
27
24
|
class EstimateOperatorsExecution(OperatorsEstimation):
|
28
25
|
execution_type: Literal["estimate_operators"] = "estimate_operators"
|
29
26
|
|
30
27
|
|
31
|
-
ExecutionPayloads =
|
32
|
-
|
28
|
+
ExecutionPayloads = Annotated[
|
29
|
+
Union[QuantumProgramExecution, QuantumCodeExecution, EstimateOperatorsExecution],
|
30
|
+
Field(discriminator="execution_type"),
|
33
31
|
]
|
34
32
|
|
35
33
|
|
36
|
-
class ExecutionRequest(BaseModel):
|
34
|
+
class ExecutionRequest(BaseModel, json_encoders=CUSTOM_ENCODERS):
|
37
35
|
execution_payload: ExecutionPayloads
|
38
36
|
preferences: ExecutionPreferences = pydantic.Field(
|
39
37
|
default_factory=ExecutionPreferences,
|
40
38
|
description="preferences for the execution",
|
41
39
|
)
|
42
40
|
|
43
|
-
@pydantic.validator("preferences")
|
44
|
-
def validate_ionq_backend(
|
45
|
-
cls, preferences: ExecutionPreferences, values: Dict[str, Any]
|
46
|
-
) -> ExecutionPreferences:
|
47
|
-
"""
|
48
|
-
This function implement the following check:
|
49
|
-
BE \\ payload | IonQ program | Qasm program | Other
|
50
|
-
--------------|--------------|--------------|------
|
51
|
-
IonQ backend | V | V | X
|
52
|
-
Other backend | X | V | V
|
53
|
-
Since:
|
54
|
-
- We can't execute non-programs on the IonQ backends
|
55
|
-
- We can't execute IonQ programs on non-IonQ backends
|
56
|
-
"""
|
57
|
-
quantum_program = values.get("execution_payload")
|
58
|
-
is_ionq_backend = isinstance(
|
59
|
-
preferences.backend_preferences, IonqBackendPreferences
|
60
|
-
)
|
61
|
-
if isinstance(quantum_program, QuantumProgram):
|
62
|
-
if (
|
63
|
-
quantum_program.syntax == QuantumInstructionSet.IONQ
|
64
|
-
and not is_ionq_backend
|
65
|
-
):
|
66
|
-
raise ValueError("Can only execute IonQ code on IonQ backend.")
|
67
|
-
else:
|
68
|
-
# If we handle anything other than a program.
|
69
|
-
if is_ionq_backend:
|
70
|
-
raise ValueError(
|
71
|
-
"IonQ backend supports only execution of QuantumPrograms"
|
72
|
-
)
|
73
|
-
return preferences
|
74
|
-
|
75
41
|
|
76
42
|
class QuantumProgramExecutionRequest(ExecutionRequest):
|
77
|
-
execution_payload:
|
43
|
+
execution_payload: QuantumCodeExecution
|
44
|
+
|
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=[])
|
78
56
|
|
79
57
|
|
80
58
|
class ExecutionJobDetails(VersionedModel):
|
81
59
|
id: str
|
82
60
|
|
83
|
-
name: Optional[str]
|
61
|
+
name: Optional[str] = Field(default=None)
|
84
62
|
start_time: datetime
|
85
|
-
end_time: Optional[datetime]
|
63
|
+
end_time: Optional[datetime] = Field(default=None)
|
86
64
|
|
87
|
-
provider: Optional[str]
|
88
|
-
backend_name: Optional[str]
|
65
|
+
provider: Optional[str] = Field(default=None)
|
66
|
+
backend_name: Optional[str] = Field(default=None)
|
89
67
|
|
90
68
|
status: JobStatus
|
91
69
|
|
92
|
-
num_shots: Optional[int]
|
93
|
-
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)
|
94
74
|
|
95
|
-
|
75
|
+
cost: Optional[JobCost] = Field(default=None)
|
96
76
|
|
97
77
|
|
98
78
|
class ExecutionJobsQueryResults(VersionedModel):
|
99
|
-
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]
|
@@ -1,12 +1,13 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
from pydantic import BaseModel
|
5
|
+
from pydantic_core.core_schema import ValidationInfo
|
5
6
|
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
6
9
|
from classiq.interface.helpers.custom_pydantic_types import PydanticAlphaParamCVAR
|
7
10
|
|
8
|
-
from classiq._internals.enum_utils import StrEnum
|
9
|
-
|
10
11
|
|
11
12
|
class CostType(StrEnum):
|
12
13
|
MIN = "MIN"
|
@@ -33,10 +34,10 @@ class OptimizerPreferences(BaseModel):
|
|
33
34
|
max_iteration: pydantic.PositiveInt = pydantic.Field(
|
34
35
|
default=100, description="Maximal number of optimizer iterations"
|
35
36
|
)
|
36
|
-
tolerance: pydantic.PositiveFloat = pydantic.Field(
|
37
|
+
tolerance: Optional[pydantic.PositiveFloat] = pydantic.Field(
|
37
38
|
default=None, description="Final accuracy in the optimization"
|
38
39
|
)
|
39
|
-
step_size: pydantic.PositiveFloat = pydantic.Field(
|
40
|
+
step_size: Optional[pydantic.PositiveFloat] = pydantic.Field(
|
40
41
|
default=None,
|
41
42
|
description="step size for numerically " "calculating the gradient",
|
42
43
|
)
|
@@ -44,7 +45,7 @@ class OptimizerPreferences(BaseModel):
|
|
44
45
|
default=None,
|
45
46
|
description="The random seed used for the generation",
|
46
47
|
)
|
47
|
-
initial_point: Optional[
|
48
|
+
initial_point: Optional[list[float]] = pydantic.Field(
|
48
49
|
default=None,
|
49
50
|
description="Initial values for the ansatz parameters",
|
50
51
|
)
|
@@ -53,31 +54,39 @@ class OptimizerPreferences(BaseModel):
|
|
53
54
|
description="If True, the optimizer will not compute the variance of the ansatz.",
|
54
55
|
)
|
55
56
|
|
56
|
-
@pydantic.
|
57
|
-
|
58
|
-
|
57
|
+
@pydantic.field_validator("tolerance", mode="before")
|
58
|
+
@classmethod
|
59
|
+
def check_tolerance(
|
60
|
+
cls, tolerance: Optional[pydantic.PositiveFloat], info: ValidationInfo
|
61
|
+
) -> Optional[pydantic.PositiveFloat]:
|
62
|
+
optimizer_type = info.data.get("type")
|
59
63
|
if tolerance is not None and optimizer_type == OptimizerType.SPSA:
|
60
|
-
raise
|
64
|
+
raise ClassiqValueError("No tolerance param for SPSA optimizer")
|
61
65
|
|
62
66
|
if tolerance is None and optimizer_type != OptimizerType.SPSA:
|
63
|
-
tolerance = 0.001
|
67
|
+
tolerance = pydantic.PositiveFloat(0.001)
|
64
68
|
|
65
69
|
return tolerance
|
66
70
|
|
67
|
-
@pydantic.
|
68
|
-
|
69
|
-
|
71
|
+
@pydantic.field_validator("step_size", mode="before")
|
72
|
+
@classmethod
|
73
|
+
def check_step_size(
|
74
|
+
cls, step_size: Optional[pydantic.PositiveFloat], info: ValidationInfo
|
75
|
+
) -> Optional[pydantic.PositiveFloat]:
|
76
|
+
optimizer_type = info.data.get("name")
|
70
77
|
if step_size is not None and optimizer_type not in (
|
71
78
|
OptimizerType.L_BFGS_B,
|
72
79
|
OptimizerType.ADAM,
|
73
80
|
):
|
74
|
-
raise
|
81
|
+
raise ClassiqValueError(
|
82
|
+
"Use step_size only for L_BFGS_B or ADAM optimizers."
|
83
|
+
)
|
75
84
|
|
76
85
|
if step_size is None and optimizer_type in (
|
77
86
|
OptimizerType.L_BFGS_B,
|
78
87
|
OptimizerType.ADAM,
|
79
88
|
):
|
80
|
-
step_size = 0.05
|
89
|
+
step_size = pydantic.PositiveFloat(0.05)
|
81
90
|
|
82
91
|
return step_size
|
83
92
|
|
@@ -91,7 +100,7 @@ class CombinatorialOptimizer(OptimizerPreferences):
|
|
91
100
|
default=CostType.CVAR,
|
92
101
|
description="Summarizing method of the measured bit strings",
|
93
102
|
)
|
94
|
-
alpha_cvar: PydanticAlphaParamCVAR = pydantic.Field(
|
103
|
+
alpha_cvar: Optional[PydanticAlphaParamCVAR] = pydantic.Field(
|
95
104
|
default=None, description="Parameter for the CVAR summarizing method"
|
96
105
|
)
|
97
106
|
is_maximization: bool = pydantic.Field(
|
@@ -103,13 +112,16 @@ class CombinatorialOptimizer(OptimizerPreferences):
|
|
103
112
|
description="Whether to check if all the solutions satisfy the constraints",
|
104
113
|
)
|
105
114
|
|
106
|
-
@pydantic.
|
107
|
-
|
108
|
-
|
115
|
+
@pydantic.field_validator("alpha_cvar", mode="before")
|
116
|
+
@classmethod
|
117
|
+
def check_alpha_cvar(
|
118
|
+
cls, alpha_cvar: Optional[PydanticAlphaParamCVAR], info: ValidationInfo
|
119
|
+
) -> Optional[PydanticAlphaParamCVAR]:
|
120
|
+
cost_type = info.data.get("cost_type")
|
109
121
|
if alpha_cvar is not None and cost_type != CostType.CVAR:
|
110
|
-
raise
|
122
|
+
raise ClassiqValueError("Use CVAR params only for CostType.CVAR.")
|
111
123
|
|
112
124
|
if alpha_cvar is None and cost_type == CostType.CVAR:
|
113
|
-
alpha_cvar = 0.2
|
125
|
+
alpha_cvar = PydanticAlphaParamCVAR(0.2)
|
114
126
|
|
115
127
|
return alpha_cvar
|