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,33 +1,39 @@
|
|
1
1
|
import json
|
2
|
-
from typing import
|
2
|
+
from typing import Any, Optional, Protocol, TypeVar
|
3
3
|
|
4
|
+
import httpx
|
4
5
|
import pydantic
|
5
6
|
|
6
7
|
import classiq.interface.executor.execution_result
|
7
8
|
import classiq.interface.pyomo_extension
|
8
9
|
from classiq.interface.analyzer import analysis_params, result as analysis_result
|
9
10
|
from classiq.interface.analyzer.analysis_params import AnalysisRBParams
|
11
|
+
from classiq.interface.analyzer.result import GraphStatus
|
10
12
|
from classiq.interface.chemistry import ground_state_problem, operator
|
13
|
+
from classiq.interface.enum_utils import StrEnum
|
14
|
+
from classiq.interface.exceptions import ClassiqAPIError, ClassiqValueError
|
15
|
+
from classiq.interface.execution.iqcc import (
|
16
|
+
IQCCInitAuthData,
|
17
|
+
IQCCInitAuthResponse,
|
18
|
+
IQCCProbeAuthData,
|
19
|
+
IQCCProbeAuthResponse,
|
20
|
+
)
|
11
21
|
from classiq.interface.execution.jobs import (
|
12
22
|
ExecutionJobDetailsV1,
|
13
23
|
ExecutionJobsQueryResultsV1,
|
14
24
|
)
|
15
|
-
from classiq.interface.
|
16
|
-
from classiq.interface.
|
17
|
-
from classiq.interface.
|
18
|
-
from classiq.interface.
|
25
|
+
from classiq.interface.execution.primitives import PrimitivesInput
|
26
|
+
from classiq.interface.executor import execution_request
|
27
|
+
from classiq.interface.generator import quantum_program as generator_result
|
28
|
+
from classiq.interface.hardware import HardwareInformation, Provider
|
29
|
+
from classiq.interface.jobs import JobDescription, JobID, JSONObject
|
30
|
+
from classiq.interface.model.model import Model
|
19
31
|
from classiq.interface.server import routes
|
20
32
|
|
21
33
|
from classiq._internals.client import client
|
22
|
-
from classiq._internals.enum_utils import StrEnum
|
23
34
|
from classiq._internals.jobs import JobPoller
|
24
|
-
from classiq.exceptions import ClassiqAPIError, ClassiqValueError
|
25
35
|
|
26
36
|
ResultType = TypeVar("ResultType", bound=pydantic.BaseModel)
|
27
|
-
CLASSIQ_ACCEPT_HEADER = "X-Classiq-Accept-Version"
|
28
|
-
|
29
|
-
_ACCEPT_HEADER = "X-Classiq-Accept-Version"
|
30
|
-
_CONTENT_TYPE_HEADER = "X-Classiq-Content-Type-Version"
|
31
37
|
|
32
38
|
|
33
39
|
class HTTPMethod(StrEnum):
|
@@ -35,6 +41,7 @@ class HTTPMethod(StrEnum):
|
|
35
41
|
GET = "GET"
|
36
42
|
POST = "POST"
|
37
43
|
PATCH = "PATCH"
|
44
|
+
PUT = "PUT"
|
38
45
|
|
39
46
|
|
40
47
|
class StatusType(Protocol):
|
@@ -43,12 +50,14 @@ class StatusType(Protocol):
|
|
43
50
|
|
44
51
|
def _parse_job_response(
|
45
52
|
job_result: JobDescription[JSONObject],
|
46
|
-
output_type:
|
53
|
+
output_type: type[ResultType],
|
47
54
|
) -> ResultType:
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
55
|
+
if job_result.result is not None:
|
56
|
+
return output_type.model_validate(job_result.result)
|
57
|
+
if job_result.failure_details:
|
58
|
+
raise ClassiqAPIError(job_result.failure_details)
|
59
|
+
|
60
|
+
raise ClassiqAPIError("Unexpected response from server")
|
52
61
|
|
53
62
|
|
54
63
|
class ApiWrapper:
|
@@ -59,13 +68,18 @@ class ApiWrapper:
|
|
59
68
|
url: str,
|
60
69
|
model: pydantic.BaseModel,
|
61
70
|
use_versioned_url: bool = True,
|
71
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
62
72
|
) -> dict:
|
63
73
|
# TODO: we can't use model.dict() - it doesn't serialize complex class.
|
64
74
|
# This was added because JSON serializer doesn't serialize complex type, and pydantic does.
|
65
75
|
# We should add support for smarter json serialization.
|
66
|
-
body = json.loads(model.
|
76
|
+
body = json.loads(model.model_dump_json())
|
67
77
|
return await cls._call_task(
|
68
|
-
http_method,
|
78
|
+
http_method,
|
79
|
+
url,
|
80
|
+
body,
|
81
|
+
use_versioned_url=use_versioned_url,
|
82
|
+
http_client=http_client,
|
69
83
|
)
|
70
84
|
|
71
85
|
@classmethod
|
@@ -73,80 +87,121 @@ class ApiWrapper:
|
|
73
87
|
cls,
|
74
88
|
http_method: str,
|
75
89
|
url: str,
|
76
|
-
body: Optional[
|
77
|
-
params: Optional[
|
90
|
+
body: Optional[dict] = None,
|
91
|
+
params: Optional[dict] = None,
|
78
92
|
use_versioned_url: bool = True,
|
79
|
-
headers: Optional[
|
93
|
+
headers: Optional[dict[str, str]] = None,
|
94
|
+
allow_none: bool = False,
|
95
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
80
96
|
) -> dict:
|
81
|
-
res = await client().call_api(
|
97
|
+
res: Any = await client().call_api(
|
82
98
|
http_method=http_method,
|
83
99
|
url=url,
|
84
100
|
body=body,
|
85
101
|
headers=headers,
|
86
102
|
params=params,
|
87
103
|
use_versioned_url=use_versioned_url,
|
104
|
+
http_client=http_client,
|
88
105
|
)
|
106
|
+
if allow_none and res is None:
|
107
|
+
return {}
|
89
108
|
if not isinstance(res, dict):
|
90
109
|
raise ClassiqValueError(f"Unexpected returned value: {res}")
|
91
110
|
return res
|
92
111
|
|
93
112
|
@classmethod
|
94
113
|
async def call_generation_task(
|
95
|
-
cls,
|
96
|
-
|
114
|
+
cls,
|
115
|
+
model: Model,
|
116
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
117
|
+
) -> generator_result.QuantumProgram:
|
97
118
|
poller = JobPoller(base_url=routes.TASKS_GENERATE_FULL_PATH)
|
98
|
-
result = await poller.run_pydantic(
|
99
|
-
|
119
|
+
result = await poller.run_pydantic(
|
120
|
+
model, timeout_sec=None, http_client=http_client
|
121
|
+
)
|
122
|
+
return _parse_job_response(result, generator_result.QuantumProgram)
|
123
|
+
|
124
|
+
@classmethod
|
125
|
+
async def call_create_execution_session(
|
126
|
+
cls,
|
127
|
+
circuit: generator_result.QuantumProgram,
|
128
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
129
|
+
) -> str:
|
130
|
+
raw_result = await cls._call_task_pydantic(
|
131
|
+
http_method=HTTPMethod.POST,
|
132
|
+
url=routes.EXECUTION_SESSIONS_PREFIX,
|
133
|
+
model=circuit,
|
134
|
+
http_client=http_client,
|
135
|
+
)
|
136
|
+
return raw_result["id"]
|
100
137
|
|
101
138
|
@classmethod
|
102
|
-
async def
|
103
|
-
cls,
|
139
|
+
async def call_create_session_job(
|
140
|
+
cls,
|
141
|
+
session_id: str,
|
142
|
+
primitives_input: PrimitivesInput,
|
143
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
104
144
|
) -> execution_request.ExecutionJobDetails:
|
105
|
-
|
145
|
+
data = await cls._call_task_pydantic(
|
146
|
+
http_method=HTTPMethod.POST,
|
147
|
+
url=routes.EXECUTION_SESSIONS_PREFIX + f"/{session_id}",
|
148
|
+
model=primitives_input,
|
149
|
+
http_client=http_client,
|
150
|
+
)
|
151
|
+
return execution_request.ExecutionJobDetails.model_validate(data)
|
152
|
+
|
153
|
+
@classmethod
|
154
|
+
async def call_convert_quantum_program(
|
155
|
+
cls,
|
156
|
+
circuit: generator_result.QuantumProgram,
|
157
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
158
|
+
) -> dict:
|
159
|
+
return await cls._call_task_pydantic(
|
106
160
|
http_method=HTTPMethod.POST,
|
107
161
|
url=routes.CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_FULL,
|
108
162
|
model=circuit,
|
163
|
+
http_client=http_client,
|
109
164
|
)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
165
|
+
|
166
|
+
@classmethod
|
167
|
+
async def call_execute_execution_input(
|
168
|
+
cls,
|
169
|
+
execution_input: dict,
|
170
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
171
|
+
) -> execution_request.ExecutionJobDetails:
|
114
172
|
data = await cls._call_task(
|
115
173
|
http_method=HTTPMethod.POST,
|
116
|
-
|
117
|
-
url=routes.EXECUTION_JOBS_NON_VERSIONED_FULL_PATH,
|
174
|
+
url=routes.EXECUTION_JOBS_FULL_PATH,
|
118
175
|
body=execution_input,
|
119
|
-
|
176
|
+
http_client=http_client,
|
120
177
|
)
|
121
|
-
return execution_request.ExecutionJobDetails.
|
178
|
+
return execution_request.ExecutionJobDetails.model_validate(data)
|
122
179
|
|
123
180
|
@classmethod
|
124
181
|
async def call_get_execution_job_details(
|
125
182
|
cls,
|
126
183
|
job_id: JobID,
|
184
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
127
185
|
) -> execution_request.ExecutionJobDetails:
|
128
|
-
headers = {_CONTENT_TYPE_HEADER: "v1"}
|
129
186
|
data = await cls._call_task(
|
130
187
|
http_method=HTTPMethod.GET,
|
131
|
-
|
132
|
-
|
133
|
-
use_versioned_url=False,
|
188
|
+
url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}",
|
189
|
+
http_client=http_client,
|
134
190
|
)
|
135
|
-
return execution_request.ExecutionJobDetails.
|
191
|
+
return execution_request.ExecutionJobDetails.model_validate(data)
|
136
192
|
|
137
193
|
@classmethod
|
138
194
|
async def call_get_execution_job_result(
|
139
195
|
cls,
|
140
196
|
job_id: JobID,
|
141
|
-
|
197
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
142
198
|
) -> classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults:
|
143
199
|
data = await cls._call_task(
|
144
200
|
http_method=HTTPMethod.GET,
|
145
|
-
url=f"{routes.
|
146
|
-
|
147
|
-
headers={CLASSIQ_ACCEPT_HEADER: version},
|
201
|
+
url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}/result",
|
202
|
+
http_client=http_client,
|
148
203
|
)
|
149
|
-
return classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults.
|
204
|
+
return classiq.interface.executor.execution_result.ExecuteGeneratedCircuitResults.model_validate(
|
150
205
|
data
|
151
206
|
)
|
152
207
|
|
@@ -155,147 +210,238 @@ class ApiWrapper:
|
|
155
210
|
cls,
|
156
211
|
job_id: JobID,
|
157
212
|
name: str,
|
213
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
158
214
|
) -> ExecutionJobDetailsV1:
|
159
215
|
data = await cls._call_task(
|
160
216
|
http_method=HTTPMethod.PATCH,
|
161
|
-
url=f"{routes.
|
217
|
+
url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}",
|
162
218
|
params={
|
163
219
|
"name": name,
|
164
220
|
},
|
165
|
-
|
221
|
+
http_client=http_client,
|
222
|
+
)
|
223
|
+
return ExecutionJobDetailsV1.model_validate(data)
|
224
|
+
|
225
|
+
@classmethod
|
226
|
+
async def call_cancel_execution_job(
|
227
|
+
cls,
|
228
|
+
job_id: JobID,
|
229
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
230
|
+
) -> None:
|
231
|
+
await cls._call_task(
|
232
|
+
http_method=HTTPMethod.PUT,
|
233
|
+
url=f"{routes.EXECUTION_JOBS_FULL_PATH}/{job_id.job_id}/cancel",
|
234
|
+
allow_none=True,
|
235
|
+
http_client=http_client,
|
166
236
|
)
|
167
|
-
return ExecutionJobDetailsV1.parse_obj(data)
|
168
237
|
|
169
238
|
@classmethod
|
170
239
|
async def call_query_execution_jobs(
|
171
240
|
cls,
|
172
241
|
offset: int,
|
173
242
|
limit: int,
|
243
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
174
244
|
) -> ExecutionJobsQueryResultsV1:
|
175
245
|
data = await cls._call_task(
|
176
246
|
http_method=HTTPMethod.GET,
|
177
|
-
url=f"{routes.
|
247
|
+
url=f"{routes.EXECUTION_JOBS_FULL_PATH}",
|
178
248
|
params={
|
179
249
|
"offset": offset,
|
180
250
|
"limit": limit,
|
181
251
|
},
|
182
|
-
|
252
|
+
http_client=http_client,
|
183
253
|
)
|
184
|
-
return ExecutionJobsQueryResultsV1.
|
185
|
-
|
186
|
-
@classmethod
|
187
|
-
async def call_execute_estimate(
|
188
|
-
cls, request: execution_request.ExecutionRequest
|
189
|
-
) -> execute_result.EstimationResults:
|
190
|
-
poller = JobPoller(base_url=routes.EXECUTE_ESTIMATE_FULL_PATH)
|
191
|
-
result = await poller.run_pydantic(request, timeout_sec=None)
|
192
|
-
return _parse_job_response(result, execute_result.EstimationResults)
|
193
|
-
|
194
|
-
@classmethod
|
195
|
-
async def call_execute_quantum_program(
|
196
|
-
cls, request: execution_request.ExecutionRequest
|
197
|
-
) -> execute_result.MultipleExecutionDetails:
|
198
|
-
poller = JobPoller(
|
199
|
-
base_url=routes.EXECUTE_QUANTUM_PROGRAM_FULL_PATH,
|
200
|
-
)
|
201
|
-
result = await poller.run_pydantic(request, timeout_sec=None)
|
202
|
-
return _parse_job_response(result, execute_result.MultipleExecutionDetails)
|
254
|
+
return ExecutionJobsQueryResultsV1.model_validate(data)
|
203
255
|
|
204
256
|
@classmethod
|
205
257
|
async def call_analysis_task(
|
206
|
-
cls,
|
258
|
+
cls,
|
259
|
+
params: analysis_params.AnalysisParams,
|
260
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
207
261
|
) -> analysis_result.Analysis:
|
208
262
|
data = await cls._call_task_pydantic(
|
209
263
|
http_method=HTTPMethod.POST,
|
210
264
|
url=routes.ANALYZER_FULL_PATH,
|
211
265
|
model=params,
|
266
|
+
http_client=http_client,
|
212
267
|
)
|
213
268
|
|
214
|
-
return analysis_result.Analysis.
|
269
|
+
return analysis_result.Analysis.model_validate(data)
|
215
270
|
|
216
271
|
@classmethod
|
217
272
|
async def call_analyzer_app(
|
218
|
-
cls,
|
273
|
+
cls,
|
274
|
+
params: generator_result.QuantumProgram,
|
275
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
219
276
|
) -> analysis_result.DataID:
|
220
277
|
data = await cls._call_task_pydantic(
|
221
278
|
http_method=HTTPMethod.POST,
|
222
279
|
url=routes.ANALYZER_DATA_FULL_PATH,
|
223
280
|
model=params,
|
281
|
+
http_client=http_client,
|
224
282
|
)
|
225
|
-
return analysis_result.DataID.
|
283
|
+
return analysis_result.DataID.model_validate(data)
|
226
284
|
|
227
285
|
@classmethod
|
228
286
|
async def get_generated_circuit_from_qasm(
|
229
|
-
cls,
|
230
|
-
|
287
|
+
cls,
|
288
|
+
params: analysis_result.QasmCode,
|
289
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
290
|
+
) -> generator_result.QuantumProgram:
|
231
291
|
data = await cls._call_task_pydantic(
|
232
292
|
http_method=HTTPMethod.POST,
|
233
293
|
url=routes.IDE_QASM_FULL_PATH,
|
234
294
|
model=params,
|
295
|
+
http_client=http_client,
|
235
296
|
)
|
236
|
-
return generator_result.
|
297
|
+
return generator_result.QuantumProgram.model_validate(data)
|
237
298
|
|
238
299
|
@classmethod
|
239
300
|
async def get_analyzer_app_data(
|
240
|
-
cls,
|
241
|
-
|
301
|
+
cls,
|
302
|
+
params: analysis_result.DataID,
|
303
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
304
|
+
) -> generator_result.QuantumProgram:
|
242
305
|
data = await cls._call_task(
|
243
306
|
http_method=HTTPMethod.GET,
|
244
307
|
url=f"{routes.ANALYZER_DATA_FULL_PATH}/{params.id}",
|
308
|
+
http_client=http_client,
|
245
309
|
)
|
246
|
-
return generator_result.
|
310
|
+
return generator_result.QuantumProgram.model_validate(data)
|
247
311
|
|
248
312
|
@classmethod
|
249
313
|
async def call_rb_analysis_task(
|
250
|
-
cls,
|
314
|
+
cls,
|
315
|
+
params: AnalysisRBParams,
|
316
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
251
317
|
) -> analysis_result.RbResults:
|
252
318
|
data = await cls._call_task(
|
253
319
|
http_method=HTTPMethod.POST,
|
254
320
|
url=routes.ANALYZER_RB_FULL_PATH,
|
255
|
-
body=params.
|
321
|
+
body=params.model_dump(),
|
322
|
+
http_client=http_client,
|
256
323
|
)
|
257
324
|
|
258
|
-
return analysis_result.RbResults.
|
325
|
+
return analysis_result.RbResults.model_validate(data)
|
259
326
|
|
260
327
|
@classmethod
|
261
328
|
async def call_hardware_connectivity_task(
|
262
|
-
cls,
|
329
|
+
cls,
|
330
|
+
params: analysis_params.AnalysisHardwareParams,
|
331
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
263
332
|
) -> analysis_result.GraphResult:
|
264
333
|
data = await cls._call_task_pydantic(
|
265
334
|
http_method=HTTPMethod.POST,
|
266
335
|
url=routes.ANALYZER_HC_GRAPH_FULL_PATH,
|
267
336
|
model=params,
|
337
|
+
http_client=http_client,
|
268
338
|
)
|
269
|
-
return analysis_result.GraphResult.
|
339
|
+
return analysis_result.GraphResult.model_validate(data)
|
270
340
|
|
271
341
|
@classmethod
|
272
342
|
async def call_table_graphs_task(
|
273
343
|
cls,
|
274
344
|
params: analysis_params.AnalysisHardwareListParams,
|
345
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
275
346
|
) -> analysis_result.GraphResult:
|
276
347
|
poller = JobPoller(base_url=routes.ANALYZER_HC_TABLE_GRAPH_FULL_PATH)
|
277
|
-
result = await poller.run_pydantic(
|
348
|
+
result = await poller.run_pydantic(
|
349
|
+
params, timeout_sec=None, http_client=http_client
|
350
|
+
)
|
278
351
|
return _parse_job_response(result, analysis_result.GraphResult)
|
279
352
|
|
280
353
|
@classmethod
|
281
354
|
async def call_available_devices_task(
|
282
355
|
cls,
|
283
356
|
params: analysis_params.AnalysisOptionalDevicesParams,
|
357
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
284
358
|
) -> analysis_result.DevicesResult:
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
359
|
+
hardware_info = await cls.call_get_all_hardware_devices(http_client=http_client)
|
360
|
+
return cls._get_devices_from_hardware_info(hardware_info, params)
|
361
|
+
|
362
|
+
@staticmethod
|
363
|
+
def _get_devices_from_hardware_info(
|
364
|
+
hardware_info: list[HardwareInformation],
|
365
|
+
params: analysis_params.AnalysisOptionalDevicesParams,
|
366
|
+
) -> analysis_result.DevicesResult:
|
367
|
+
available_hardware: dict[Provider, dict[str, bool]] = {
|
368
|
+
Provider.IBM_QUANTUM: {},
|
369
|
+
Provider.AMAZON_BRAKET: {},
|
370
|
+
Provider.AZURE_QUANTUM: {},
|
371
|
+
}
|
372
|
+
for info in hardware_info:
|
373
|
+
if info.provider not in available_hardware:
|
374
|
+
continue
|
375
|
+
is_available = info.number_of_qubits >= params.qubit_count
|
376
|
+
available_hardware[info.provider][info.display_name] = is_available
|
377
|
+
return analysis_result.DevicesResult(
|
378
|
+
devices=analysis_result.AvailableHardware(
|
379
|
+
ibm_quantum=available_hardware[Provider.IBM_QUANTUM],
|
380
|
+
azure_quantum=available_hardware[Provider.AZURE_QUANTUM],
|
381
|
+
amazon_braket=available_hardware[Provider.AMAZON_BRAKET],
|
382
|
+
),
|
383
|
+
status=GraphStatus.SUCCESS,
|
289
384
|
)
|
290
|
-
|
385
|
+
|
386
|
+
@classmethod
|
387
|
+
async def call_get_all_hardware_devices(
|
388
|
+
cls,
|
389
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
390
|
+
) -> list[HardwareInformation]:
|
391
|
+
data = await client().call_api(
|
392
|
+
http_method=HTTPMethod.GET,
|
393
|
+
url="/hardware-catalog/v1/hardwares",
|
394
|
+
use_versioned_url=False,
|
395
|
+
http_client=http_client,
|
396
|
+
)
|
397
|
+
if not isinstance(data, list):
|
398
|
+
raise ClassiqAPIError(f"Unexpected value: {data}")
|
399
|
+
return [HardwareInformation.model_validate(info) for info in data]
|
291
400
|
|
292
401
|
@classmethod
|
293
402
|
async def call_generate_hamiltonian_task(
|
294
|
-
cls,
|
403
|
+
cls,
|
404
|
+
problem: ground_state_problem.CHEMISTRY_PROBLEMS_TYPE,
|
405
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
295
406
|
) -> operator.PauliOperator:
|
296
407
|
poller = JobPoller(
|
297
408
|
base_url=routes.GENERATE_HAMILTONIAN_FULL_PATH,
|
298
|
-
use_versioned_url=False,
|
299
409
|
)
|
300
|
-
result = await poller.run_pydantic(
|
410
|
+
result = await poller.run_pydantic(
|
411
|
+
problem, timeout_sec=None, http_client=http_client
|
412
|
+
)
|
301
413
|
return _parse_job_response(result, operator.PauliOperator)
|
414
|
+
|
415
|
+
@classmethod
|
416
|
+
async def call_iqcc_init_auth(
|
417
|
+
cls,
|
418
|
+
data: IQCCInitAuthData,
|
419
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
420
|
+
) -> IQCCInitAuthResponse:
|
421
|
+
response = await cls._call_task_pydantic(
|
422
|
+
http_method=HTTPMethod.PUT,
|
423
|
+
url=f"{routes.IQCC_INIT_AUTH_FULL_PATH}",
|
424
|
+
model=data,
|
425
|
+
http_client=http_client,
|
426
|
+
)
|
427
|
+
return IQCCInitAuthResponse.model_validate(response)
|
428
|
+
|
429
|
+
@classmethod
|
430
|
+
async def call_iqcc_probe_auth(
|
431
|
+
cls,
|
432
|
+
data: IQCCProbeAuthData,
|
433
|
+
http_client: Optional[httpx.AsyncClient] = None,
|
434
|
+
) -> Optional[IQCCProbeAuthResponse]:
|
435
|
+
try:
|
436
|
+
response = await cls._call_task_pydantic(
|
437
|
+
http_method=HTTPMethod.PUT,
|
438
|
+
url=f"{routes.IQCC_PROBE_AUTH_FULL_PATH}",
|
439
|
+
model=data,
|
440
|
+
http_client=http_client,
|
441
|
+
)
|
442
|
+
except ClassiqAPIError as ex:
|
443
|
+
if ex.status_code == 418:
|
444
|
+
return None
|
445
|
+
raise
|
446
|
+
|
447
|
+
return IQCCProbeAuthResponse.model_validate(response)
|
@@ -1,25 +1,18 @@
|
|
1
|
-
import abc
|
2
1
|
import asyncio
|
3
2
|
import functools
|
4
|
-
import inspect
|
5
3
|
import itertools
|
6
4
|
import logging
|
7
5
|
import time
|
8
|
-
import
|
6
|
+
from collections.abc import AsyncGenerator, Awaitable, Iterable
|
9
7
|
from typing import (
|
10
8
|
Any,
|
11
|
-
AsyncGenerator,
|
12
|
-
Awaitable,
|
13
9
|
Callable,
|
14
|
-
Iterable,
|
15
10
|
Optional,
|
16
11
|
SupportsFloat,
|
17
12
|
TypeVar,
|
18
13
|
Union,
|
19
14
|
)
|
20
15
|
|
21
|
-
from classiq.exceptions import ClassiqValueError
|
22
|
-
|
23
16
|
T = TypeVar("T")
|
24
17
|
ASYNC_SUFFIX = "_async"
|
25
18
|
|
@@ -58,74 +51,6 @@ def syncify_function(async_func: Callable[..., Awaitable[T]]) -> Callable[..., T
|
|
58
51
|
return async_wrapper
|
59
52
|
|
60
53
|
|
61
|
-
def maybe_syncify_property_function(obj: Any) -> Any:
|
62
|
-
"""
|
63
|
-
The object is the input to `property` (or to `property.setter`)
|
64
|
-
Thus, we expect it to be either a function, or a function-that-returns-a-coroutine, or None
|
65
|
-
The only thing that should be syncified is a function-that-returns-a-coroutine
|
66
|
-
"""
|
67
|
-
if inspect.iscoroutinefunction(obj):
|
68
|
-
return syncify_function(obj)
|
69
|
-
elif isinstance(obj, types.FunctionType):
|
70
|
-
return obj
|
71
|
-
elif obj is None:
|
72
|
-
return obj
|
73
|
-
else:
|
74
|
-
raise ClassiqValueError(f"Invalid type: {obj.__class__.__name__}")
|
75
|
-
|
76
|
-
|
77
|
-
def syncify_property(async_prop: property) -> property:
|
78
|
-
if inspect.iscoroutinefunction(async_prop.fset):
|
79
|
-
raise ClassiqValueError(f"Setter cannot be `async def` (in {async_prop}")
|
80
|
-
if inspect.iscoroutinefunction(async_prop.fdel):
|
81
|
-
raise ClassiqValueError(f"Deleter cannot be `async def` (in {async_prop}")
|
82
|
-
|
83
|
-
return property(
|
84
|
-
maybe_syncify_property_function(async_prop.fget),
|
85
|
-
async_prop.fset,
|
86
|
-
async_prop.fdel,
|
87
|
-
async_prop.__doc__,
|
88
|
-
)
|
89
|
-
|
90
|
-
|
91
|
-
# Explanation about metaclasses
|
92
|
-
# https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python
|
93
|
-
|
94
|
-
|
95
|
-
class Asyncify(type):
|
96
|
-
def __new__(
|
97
|
-
mcls, name: str, bases: tuple, class_dict: dict # noqa: N804
|
98
|
-
) -> "Asyncify":
|
99
|
-
new_attrs = {}
|
100
|
-
|
101
|
-
for attr_name, attr_value in class_dict.items():
|
102
|
-
if attr_name.endswith(ASYNC_SUFFIX):
|
103
|
-
new_attr_name = attr_name[: -len(ASYNC_SUFFIX)]
|
104
|
-
if new_attr_name in class_dict:
|
105
|
-
raise ClassiqValueError(f"Method name collision: {new_attr_name}")
|
106
|
-
else:
|
107
|
-
new_attrs[new_attr_name] = attr_value
|
108
|
-
|
109
|
-
new_class = super().__new__(mcls, name, bases, class_dict)
|
110
|
-
|
111
|
-
for attr_name, attr_value in new_attrs.items():
|
112
|
-
if isinstance(attr_value, property):
|
113
|
-
setattr(new_class, attr_name, syncify_property(attr_value))
|
114
|
-
elif isinstance(attr_value, types.FunctionType):
|
115
|
-
setattr(new_class, attr_name, syncify_function(attr_value))
|
116
|
-
else:
|
117
|
-
raise ClassiqValueError(
|
118
|
-
f"Invalid async type: {attr_value.__class__.__name__}"
|
119
|
-
)
|
120
|
-
|
121
|
-
return new_class
|
122
|
-
|
123
|
-
|
124
|
-
# Used for resolving metaclass collision
|
125
|
-
class AsyncifyABC(Asyncify, abc.ABCMeta):
|
126
|
-
pass
|
127
|
-
|
128
|
-
|
129
54
|
def enable_jupyter_notebook() -> None:
|
130
55
|
import nest_asyncio # type: ignore[import]
|
131
56
|
|
@@ -172,7 +97,7 @@ def is_notebook() -> bool:
|
|
172
97
|
return True # Jupyter notebook or qtconsole
|
173
98
|
elif shell == "TerminalInteractiveShell":
|
174
99
|
return False # Terminal running IPython
|
175
|
-
elif "google.colab" in str(local_ipython):
|
100
|
+
elif "google.colab" in str(local_ipython): # noqa: SIM103
|
176
101
|
return True
|
177
102
|
else:
|
178
103
|
return False # Other type (?)
|