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
classiq/interface/hardware.py
CHANGED
@@ -1,12 +1,27 @@
|
|
1
1
|
import datetime
|
2
|
-
from typing import TYPE_CHECKING,
|
2
|
+
from typing import TYPE_CHECKING, Annotated, Optional
|
3
3
|
|
4
4
|
import pydantic
|
5
5
|
|
6
|
-
from classiq.
|
6
|
+
from classiq.interface.enum_utils import StrEnum
|
7
|
+
|
8
|
+
QueueTime = Annotated[
|
9
|
+
Optional[datetime.timedelta],
|
10
|
+
pydantic.PlainSerializer(
|
11
|
+
lambda _timedelta: (
|
12
|
+
_timedelta.total_seconds() if _timedelta is not None else None
|
13
|
+
),
|
14
|
+
return_type=Optional[float],
|
15
|
+
),
|
16
|
+
]
|
7
17
|
|
8
18
|
|
9
19
|
class Provider(StrEnum):
|
20
|
+
"""
|
21
|
+
This class defines all Providers that Classiq supports.
|
22
|
+
This is mainly used in backend_preferences when specifying where do we want to execute the defined model.
|
23
|
+
"""
|
24
|
+
|
10
25
|
IBM_QUANTUM = "IBM Quantum"
|
11
26
|
AZURE_QUANTUM = "Azure Quantum"
|
12
27
|
AMAZON_BRAKET = "Amazon Braket"
|
@@ -15,10 +30,13 @@ class Provider(StrEnum):
|
|
15
30
|
GOOGLE = "Google"
|
16
31
|
ALICE_AND_BOB = "Alice & Bob"
|
17
32
|
OQC = "OQC"
|
33
|
+
INTEL = "Intel"
|
34
|
+
AQT = "AQT"
|
35
|
+
IQCC = "IQCC"
|
18
36
|
|
19
37
|
@property
|
20
|
-
def id(self):
|
21
|
-
return self.value.replace(" ", "-").lower()
|
38
|
+
def id(self) -> "ProviderIDEnum":
|
39
|
+
return self.value.replace(" ", "-").lower() # type: ignore[return-value]
|
22
40
|
|
23
41
|
|
24
42
|
ProviderIDEnum = StrEnum("ProviderIDEnum", {p.id: p.id for p in Provider}) # type: ignore[misc]
|
@@ -48,14 +66,17 @@ class HardwareStatus(pydantic.BaseModel):
|
|
48
66
|
default_factory=lambda: datetime.datetime.now(tz=datetime.UTC)
|
49
67
|
)
|
50
68
|
availability: AvailabilityStatus
|
51
|
-
queue_time:
|
52
|
-
|
69
|
+
queue_time: QueueTime = pydantic.Field(
|
70
|
+
default=None,
|
71
|
+
description="The estimated queue time for the hardware in seconds.",
|
72
|
+
)
|
73
|
+
pending_jobs: Optional[int] = None
|
53
74
|
|
54
75
|
|
55
76
|
if TYPE_CHECKING:
|
56
|
-
ConnectivityMapEntry =
|
77
|
+
ConnectivityMapEntry = tuple[int, int]
|
57
78
|
else:
|
58
|
-
ConnectivityMapEntry =
|
79
|
+
ConnectivityMapEntry = list[int]
|
59
80
|
|
60
81
|
|
61
82
|
class HardwareInformation(pydantic.BaseModel):
|
@@ -65,8 +86,8 @@ class HardwareInformation(pydantic.BaseModel):
|
|
65
86
|
display_name: str
|
66
87
|
device_type: DeviceType
|
67
88
|
number_of_qubits: int
|
68
|
-
connectivity_map: Optional[
|
69
|
-
basis_gates:
|
89
|
+
connectivity_map: Optional[list[ConnectivityMapEntry]] = None
|
90
|
+
basis_gates: list[str]
|
70
91
|
status: HardwareStatus
|
71
92
|
|
72
93
|
def is_simulator(self) -> bool:
|
@@ -1,6 +1,7 @@
|
|
1
|
-
from typing import TYPE_CHECKING,
|
1
|
+
from typing import TYPE_CHECKING, Annotated, Any
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic import Field, StrictStr, StringConstraints
|
4
5
|
|
5
6
|
from classiq.interface.generator.arith.number_utils import MAXIMAL_MACHINE_PRECISION
|
6
7
|
from classiq.interface.generator.parameters import ParameterComplexType
|
@@ -13,13 +14,9 @@ if TYPE_CHECKING:
|
|
13
14
|
PydanticLargerThanOneInteger = int
|
14
15
|
PydanticMachinePrecision = int
|
15
16
|
else:
|
17
|
+
PydanticLargerThanOneInteger = Annotated[int, Field(gt=1)]
|
16
18
|
|
17
|
-
|
18
|
-
gt = 1
|
19
|
-
|
20
|
-
class PydanticMachinePrecision(pydantic.ConstrainedInt):
|
21
|
-
gt = 0
|
22
|
-
le = MAXIMAL_MACHINE_PRECISION
|
19
|
+
PydanticMachinePrecision = Annotated[int, Field(gt=0, le=MAXIMAL_MACHINE_PRECISION)]
|
23
20
|
|
24
21
|
|
25
22
|
# Probability float types
|
@@ -28,93 +25,86 @@ if TYPE_CHECKING:
|
|
28
25
|
PydanticNonOneProbabilityFloat = float
|
29
26
|
PydanticNonZeroProbabilityFloat = float
|
30
27
|
else:
|
28
|
+
PydanticProbabilityFloat = Annotated[float, Field(ge=0.0, le=1.0)]
|
31
29
|
|
32
|
-
|
33
|
-
ge = 0.0
|
34
|
-
le = 1.0
|
35
|
-
|
36
|
-
class PydanticNonOneProbabilityFloat(pydantic.ConstrainedFloat):
|
37
|
-
ge = 0.0
|
38
|
-
lt = 1.0
|
30
|
+
PydanticNonOneProbabilityFloat = Annotated[float, Field(ge=0.0, lt=1.0)]
|
39
31
|
|
40
|
-
|
41
|
-
gt = 0.0
|
42
|
-
le = 1.0
|
32
|
+
PydanticNonZeroProbabilityFloat = Annotated[float, Field(gt=0.0, le=1.0)]
|
43
33
|
|
44
34
|
|
45
35
|
# CVAR parameter types
|
46
36
|
if TYPE_CHECKING:
|
47
37
|
PydanticAlphaParamCVAR = float
|
48
38
|
else:
|
49
|
-
|
50
|
-
class PydanticAlphaParamCVAR(pydantic.ConstrainedFloat):
|
51
|
-
gt = 0.0
|
52
|
-
le = 1.0
|
39
|
+
PydanticAlphaParamCVAR = Annotated[float, Field(gt=0.0, le=1.0)]
|
53
40
|
|
54
41
|
|
55
42
|
# General string types
|
56
43
|
if TYPE_CHECKING:
|
57
44
|
PydanticNonEmptyString = str
|
58
45
|
else:
|
59
|
-
PydanticNonEmptyString =
|
46
|
+
PydanticNonEmptyString = Annotated[str, Field(min_length=1)]
|
60
47
|
|
61
48
|
# Name string types
|
62
49
|
if TYPE_CHECKING:
|
63
50
|
PydanticFunctionNameStr = str
|
64
51
|
else:
|
65
|
-
PydanticFunctionNameStr =
|
66
|
-
strict=True,
|
67
|
-
|
52
|
+
PydanticFunctionNameStr = Annotated[
|
53
|
+
str, Field(strict=True, pattern="^([A-Za-z][A-Za-z0-9_]*)$")
|
54
|
+
]
|
68
55
|
|
69
56
|
if TYPE_CHECKING:
|
70
57
|
PydanticPauliMonomial = tuple
|
71
58
|
else:
|
72
|
-
PydanticPauliMonomial =
|
59
|
+
PydanticPauliMonomial = Annotated[list[Any], Field(min_length=2, max_length=2)]
|
73
60
|
|
74
61
|
if TYPE_CHECKING:
|
75
62
|
PydanticPauliMonomialStr = str
|
76
63
|
else:
|
77
|
-
PydanticPauliMonomialStr =
|
78
|
-
|
79
|
-
|
64
|
+
PydanticPauliMonomialStr = Annotated[
|
65
|
+
StrictStr,
|
66
|
+
StringConstraints(strip_whitespace=True, min_length=1, pattern="^[IXYZ]+$"),
|
67
|
+
]
|
80
68
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
PydanticPauliList = pydantic.conlist(item_type=tuple, min_items=1)
|
69
|
+
PydanticPauliList = Annotated[
|
70
|
+
list[tuple[PydanticPauliMonomialStr, ParameterComplexType]], Field(min_length=1)
|
71
|
+
]
|
85
72
|
|
86
73
|
if TYPE_CHECKING:
|
87
|
-
PydanticFloatTuple =
|
74
|
+
PydanticFloatTuple = tuple[float, float]
|
88
75
|
else:
|
89
|
-
PydanticFloatTuple =
|
76
|
+
PydanticFloatTuple = Annotated[list[float], Field(min_length=2, max_length=2)]
|
90
77
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
PydanticNonNegIntTuple = pydantic.conlist(
|
95
|
-
item_type=pydantic.NonNegativeInt, min_items=2, max_items=2
|
96
|
-
)
|
78
|
+
PydanticNonNegIntTuple = Annotated[
|
79
|
+
list[pydantic.NonNegativeInt], Field(min_length=2, max_length=2)
|
80
|
+
]
|
97
81
|
|
98
82
|
if TYPE_CHECKING:
|
99
83
|
PydanticExpressionStr = str
|
100
84
|
else:
|
101
|
-
PydanticExpressionStr =
|
102
|
-
|
103
|
-
|
85
|
+
PydanticExpressionStr = Annotated[
|
86
|
+
str,
|
87
|
+
StringConstraints(
|
88
|
+
strip_whitespace=True, min_length=1, max_length=MAX_EXPRESSION_SIZE
|
89
|
+
),
|
90
|
+
]
|
104
91
|
if TYPE_CHECKING:
|
105
|
-
AtomType =
|
92
|
+
AtomType = tuple[str, list[float]]
|
106
93
|
else:
|
107
|
-
AtomType =
|
94
|
+
AtomType = Annotated[list[Any], Field(min_length=2, max_length=2)]
|
108
95
|
|
109
96
|
|
110
97
|
if TYPE_CHECKING:
|
111
98
|
PydanticDataDogUuid = str
|
112
99
|
else:
|
113
|
-
PydanticDataDogUuid =
|
114
|
-
|
115
|
-
|
100
|
+
PydanticDataDogUuid = Annotated[
|
101
|
+
str,
|
102
|
+
Field(
|
103
|
+
pattern=r"^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
|
104
|
+
),
|
105
|
+
]
|
116
106
|
|
117
107
|
if TYPE_CHECKING:
|
118
108
|
PydanticDataDogGo = int
|
119
109
|
else:
|
120
|
-
PydanticDataDogGo =
|
110
|
+
PydanticDataDogGo = Annotated[int, Field(ge=0)]
|
@@ -0,0 +1,26 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
|
4
|
+
class DotDict(dict):
|
5
|
+
def __getattr__(self, key: str) -> Any:
|
6
|
+
return super().get(key)
|
7
|
+
|
8
|
+
def __setattr__(self, key: str, value: Any) -> None:
|
9
|
+
super().__setitem__(key, value)
|
10
|
+
|
11
|
+
def __delattr__(self, key: str) -> None:
|
12
|
+
super().__delitem__(key)
|
13
|
+
|
14
|
+
|
15
|
+
class LenList(list):
|
16
|
+
@property
|
17
|
+
def len(self) -> int:
|
18
|
+
return len(self)
|
19
|
+
|
20
|
+
|
21
|
+
def get_sdk_compatible_python_object(obj: Any) -> Any:
|
22
|
+
if isinstance(obj, list):
|
23
|
+
return LenList([get_sdk_compatible_python_object(item) for item in obj])
|
24
|
+
if isinstance(obj, dict):
|
25
|
+
return DotDict({k: get_sdk_compatible_python_object(v) for k, v in obj.items()})
|
26
|
+
return obj
|
@@ -1,7 +1,8 @@
|
|
1
1
|
import itertools
|
2
2
|
import numbers
|
3
|
+
from collections.abc import Iterator
|
3
4
|
from enum import EnumMeta
|
4
|
-
from typing import Any
|
5
|
+
from typing import Any
|
5
6
|
|
6
7
|
|
7
8
|
def immutable_version(value: Any) -> Any:
|
@@ -29,5 +30,5 @@ class HashableMixin:
|
|
29
30
|
for val in self._values_to_hash():
|
30
31
|
yield immutable_version(val)
|
31
32
|
|
32
|
-
def _value_tuple(self) ->
|
33
|
+
def _value_tuple(self) -> tuple[Any, ...]:
|
33
34
|
return tuple(itertools.chain((str(type(self))), self._immutable_fields()))
|
@@ -1,16 +1,12 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
import pydantic
|
4
|
-
|
5
|
-
|
6
|
-
def get_discriminator_field(default: str, **kwargs: Any) -> Any:
|
7
|
-
return pydantic.Field(default_factory=lambda: default, **kwargs)
|
1
|
+
from collections.abc import Sequence
|
2
|
+
from typing import Any, Protocol, TypeVar
|
8
3
|
|
9
4
|
|
10
5
|
def values_with_discriminator(
|
11
|
-
values:
|
12
|
-
) ->
|
13
|
-
values
|
6
|
+
values: Any, discriminator: str, discriminator_value: Any
|
7
|
+
) -> dict[str, Any]:
|
8
|
+
if isinstance(values, dict):
|
9
|
+
values.setdefault(discriminator, discriminator_value)
|
14
10
|
return values
|
15
11
|
|
16
12
|
|
@@ -21,5 +17,5 @@ class Nameable(Protocol):
|
|
21
17
|
NameableType = TypeVar("NameableType", bound=Nameable)
|
22
18
|
|
23
19
|
|
24
|
-
def nameables_to_dict(nameables: Sequence[NameableType]) ->
|
20
|
+
def nameables_to_dict(nameables: Sequence[NameableType]) -> dict[str, NameableType]:
|
25
21
|
return {value.name: value for value in nameables}
|
@@ -1,34 +1,17 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Hashable, Mapping
|
2
2
|
|
3
|
+
from classiq.interface.exceptions import ClassiqValueError
|
3
4
|
from classiq.interface.helpers.pydantic_model_helpers import Nameable
|
4
5
|
|
5
|
-
from classiq.exceptions import ClassiqValueError
|
6
6
|
|
7
|
-
|
8
|
-
def is_list_unique(lst: List[Hashable]) -> bool:
|
7
|
+
def is_list_unique(lst: list[Hashable]) -> bool:
|
9
8
|
return len(set(lst)) == len(lst)
|
10
9
|
|
11
10
|
|
12
11
|
def validate_nameables_mapping(
|
13
12
|
nameables_dict: Mapping[str, Nameable], declaration_type: str
|
14
13
|
) -> None:
|
15
|
-
if not all(
|
14
|
+
if not all(name == nameable.name for (name, nameable) in nameables_dict.items()):
|
16
15
|
raise ClassiqValueError(
|
17
16
|
f"{declaration_type} declaration names should match the keys of their names."
|
18
17
|
)
|
19
|
-
|
20
|
-
|
21
|
-
def validate_nameables_no_overlap(
|
22
|
-
left_nameables_dict: Optional[Mapping[str, Nameable]],
|
23
|
-
right_nameables_dict: Optional[Mapping[str, Nameable]],
|
24
|
-
left_declaration_type: str,
|
25
|
-
right_declaration_type: str,
|
26
|
-
) -> Optional[str]:
|
27
|
-
if left_nameables_dict is None or right_nameables_dict is None:
|
28
|
-
return None
|
29
|
-
|
30
|
-
matched_names = left_nameables_dict.keys() & right_nameables_dict.keys()
|
31
|
-
if matched_names:
|
32
|
-
return f"{left_declaration_type} declaration names overlap with {right_declaration_type} declaration names: {matched_names}"
|
33
|
-
|
34
|
-
return None
|
@@ -1,20 +1,21 @@
|
|
1
1
|
from enum import IntEnum
|
2
|
-
from typing import
|
2
|
+
from typing import Optional, Union
|
3
3
|
|
4
4
|
import pydantic
|
5
5
|
|
6
6
|
from classiq.interface.generator.generated_circuit_data import GeneratedFunction
|
7
7
|
from classiq.interface.generator.hardware.hardware_data import SynthesisHardwareData
|
8
8
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
9
|
+
from classiq.interface.ide.visual_model import CircuitMetrics
|
9
10
|
|
10
|
-
GateCount =
|
11
|
+
GateCount = dict[str, int]
|
11
12
|
Depth = int
|
12
13
|
|
13
14
|
|
14
15
|
class IDEDataQubit(pydantic.BaseModel):
|
15
16
|
id: int
|
16
|
-
numChildren: Optional[int]
|
17
|
-
name: Optional[str]
|
17
|
+
numChildren: Optional[int] = None
|
18
|
+
name: Optional[str] = None
|
18
19
|
|
19
20
|
|
20
21
|
class IDEQubitDef(pydantic.BaseModel):
|
@@ -51,17 +52,17 @@ class ConditionalRender(IntEnum):
|
|
51
52
|
class IDEDataOperation(pydantic.BaseModel):
|
52
53
|
gate: str
|
53
54
|
displayName: str
|
54
|
-
children:
|
55
|
+
children: list["IDEDataOperation"]
|
55
56
|
depth: Depth
|
56
57
|
width: int
|
57
58
|
gate_count: GateCount
|
58
59
|
_qubits: list = pydantic.PrivateAttr() # list[Qubit]
|
59
60
|
|
60
61
|
displayArgs: str = ""
|
61
|
-
targets: Union[
|
62
|
+
targets: Union[list[IDEQubitDef], list[IDEClassicalBitDef]] = pydantic.Field(
|
62
63
|
default_factory=list
|
63
64
|
)
|
64
|
-
controls:
|
65
|
+
controls: list[IDEQubitDef] = list()
|
65
66
|
dataAttributes: DataAttributes = pydantic.Field(default_factory=DataAttributes)
|
66
67
|
isControlled: bool = False
|
67
68
|
isMeasurement: bool = False
|
@@ -75,13 +76,13 @@ class IDEDataOperation(pydantic.BaseModel):
|
|
75
76
|
|
76
77
|
|
77
78
|
class IDEDataProperties(pydantic.BaseModel):
|
78
|
-
color: Optional[str]
|
79
|
-
rightLabel: Optional[str]
|
80
|
-
leftLabel: Optional[str]
|
79
|
+
color: Optional[str] = None
|
80
|
+
rightLabel: Optional[str] = None
|
81
|
+
leftLabel: Optional[str] = None
|
81
82
|
|
82
83
|
|
83
84
|
class RegisterData(pydantic.BaseModel):
|
84
|
-
segmentIds:
|
85
|
+
segmentIds: list[str]
|
85
86
|
properties: IDEDataProperties
|
86
87
|
registerId: str
|
87
88
|
|
@@ -91,16 +92,11 @@ class InterfaceSegmentData(pydantic.BaseModel):
|
|
91
92
|
properties: IDEDataProperties
|
92
93
|
|
93
94
|
|
94
|
-
class CircuitMetrics(pydantic.BaseModel):
|
95
|
-
depth: int
|
96
|
-
count_ops: Dict[str, int]
|
97
|
-
|
98
|
-
|
99
95
|
class IDEData(VersionedModel):
|
100
|
-
qubits:
|
101
|
-
operations:
|
102
|
-
register_data:
|
103
|
-
segment_data:
|
96
|
+
qubits: list[IDEDataQubit]
|
97
|
+
operations: list[IDEDataOperation]
|
98
|
+
register_data: list[RegisterData]
|
99
|
+
segment_data: list[InterfaceSegmentData]
|
104
100
|
circuit_metrics: Optional[CircuitMetrics]
|
105
101
|
hardware_data: SynthesisHardwareData
|
106
102
|
creation_time: str
|
@@ -0,0 +1,130 @@
|
|
1
|
+
from collections import Counter
|
2
|
+
from typing import Any, Optional
|
3
|
+
|
4
|
+
import pydantic
|
5
|
+
from pydantic import ConfigDict
|
6
|
+
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
8
|
+
from classiq.interface.generator.generated_circuit_data import (
|
9
|
+
OperationLevel,
|
10
|
+
OperationParameter,
|
11
|
+
)
|
12
|
+
from classiq.interface.generator.hardware.hardware_data import SynthesisHardwareData
|
13
|
+
from classiq.interface.helpers.versioned_model import VersionedModel
|
14
|
+
|
15
|
+
|
16
|
+
class OperationType(StrEnum):
|
17
|
+
REGULAR = "REGULAR"
|
18
|
+
ALLOCATE = "ALLOCATE"
|
19
|
+
FREE = "FREE"
|
20
|
+
BIND = "BIND"
|
21
|
+
ATOMIC = "ATOMIC"
|
22
|
+
|
23
|
+
|
24
|
+
class OperationData(pydantic.BaseModel):
|
25
|
+
approximated_depth: Optional[int] = None
|
26
|
+
width: int
|
27
|
+
gate_count: Counter[str] = pydantic.Field(default_factory=dict)
|
28
|
+
|
29
|
+
|
30
|
+
class CircuitMetrics(pydantic.BaseModel):
|
31
|
+
depth: int
|
32
|
+
count_ops: dict[str, int]
|
33
|
+
|
34
|
+
|
35
|
+
class ProgramData(pydantic.BaseModel):
|
36
|
+
hardware_data: SynthesisHardwareData
|
37
|
+
circuit_metrics: CircuitMetrics
|
38
|
+
|
39
|
+
|
40
|
+
class OperationLink(pydantic.BaseModel):
|
41
|
+
label: str
|
42
|
+
inner_label: Optional[str] = None
|
43
|
+
qubits: tuple[int, ...]
|
44
|
+
type: str
|
45
|
+
is_captured: bool = False
|
46
|
+
|
47
|
+
model_config = ConfigDict(frozen=True)
|
48
|
+
|
49
|
+
def __hash__(self) -> int:
|
50
|
+
return hash((type(self), self.label, self.qubits, self.type))
|
51
|
+
|
52
|
+
def __eq__(self, other: Any) -> bool:
|
53
|
+
if not isinstance(other, OperationLink):
|
54
|
+
return False
|
55
|
+
return hash(self) == hash(other)
|
56
|
+
|
57
|
+
|
58
|
+
class OperationLinks(pydantic.BaseModel):
|
59
|
+
inputs: list[OperationLink]
|
60
|
+
outputs: list[OperationLink]
|
61
|
+
|
62
|
+
@property
|
63
|
+
def input_width(self) -> int:
|
64
|
+
return sum(len(link.qubits) for link in self.inputs)
|
65
|
+
|
66
|
+
@property
|
67
|
+
def output_width(self) -> int:
|
68
|
+
return sum(len(link.qubits) for link in self.outputs)
|
69
|
+
|
70
|
+
|
71
|
+
class AtomicGate(StrEnum):
|
72
|
+
UNKNOWN = ""
|
73
|
+
H = "H"
|
74
|
+
X = "X"
|
75
|
+
Y = "Y"
|
76
|
+
Z = "Z"
|
77
|
+
I = "I" # noqa: E741
|
78
|
+
S = "S"
|
79
|
+
T = "T"
|
80
|
+
SDG = "SDG"
|
81
|
+
TDG = "TDG"
|
82
|
+
PHASE = "PHASE"
|
83
|
+
RX = "RX"
|
84
|
+
RY = "RY"
|
85
|
+
RZ = "RZ"
|
86
|
+
R = "R"
|
87
|
+
RXX = "RXX"
|
88
|
+
RYY = "RYY"
|
89
|
+
RZZ = "RZZ"
|
90
|
+
CH = "CH"
|
91
|
+
CX = "CX"
|
92
|
+
CY = "CY"
|
93
|
+
CZ = "CZ"
|
94
|
+
CRX = "CRX"
|
95
|
+
CRY = "CRY"
|
96
|
+
CRZ = "CRZ"
|
97
|
+
CPHASE = "CPHASE"
|
98
|
+
SWAP = "SWAP"
|
99
|
+
IDENTITY = "IDENTITY"
|
100
|
+
U = "U"
|
101
|
+
|
102
|
+
@property
|
103
|
+
def is_control_gate(self) -> bool:
|
104
|
+
return self.startswith("C")
|
105
|
+
|
106
|
+
|
107
|
+
class Operation(pydantic.BaseModel):
|
108
|
+
name: str
|
109
|
+
qasm_name: str = pydantic.Field(default="")
|
110
|
+
details: str = pydantic.Field(default="")
|
111
|
+
children: list["Operation"]
|
112
|
+
operation_data: Optional[OperationData] = None
|
113
|
+
operation_links: OperationLinks
|
114
|
+
control_qubits: tuple[int, ...] = pydantic.Field(default_factory=tuple)
|
115
|
+
auxiliary_qubits: tuple[int, ...]
|
116
|
+
target_qubits: tuple[int, ...]
|
117
|
+
parameters: list[OperationParameter] = pydantic.Field(default_factory=list)
|
118
|
+
operation_level: OperationLevel
|
119
|
+
operation_type: OperationType = pydantic.Field(
|
120
|
+
description="Identifies unique operations that are visualized differently"
|
121
|
+
)
|
122
|
+
gate: AtomicGate = pydantic.Field(
|
123
|
+
default=AtomicGate.UNKNOWN, description="Gate type"
|
124
|
+
)
|
125
|
+
is_daggered: bool = pydantic.Field(default=False)
|
126
|
+
|
127
|
+
|
128
|
+
class ProgramVisualModel(VersionedModel):
|
129
|
+
main_operation: Operation
|
130
|
+
program_data: ProgramData
|
@@ -0,0 +1 @@
|
|
1
|
+
INTERFACE_VERSION = "7"
|
classiq/interface/jobs.py
CHANGED
@@ -1,14 +1,17 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Generic, Optional, TypeVar, Union
|
2
2
|
|
3
3
|
import pydantic
|
4
4
|
from pydantic import BaseModel
|
5
|
-
from
|
5
|
+
from typing_extensions import Self
|
6
6
|
|
7
|
-
from classiq.
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
8
|
+
from classiq.interface.exceptions import ClassiqAPIError
|
9
|
+
from classiq.interface.helpers.custom_encoders import CUSTOM_ENCODERS
|
8
10
|
|
9
|
-
JSONObject =
|
11
|
+
JSONObject = dict[str, Any]
|
10
12
|
T = TypeVar("T", bound=Union[pydantic.BaseModel, JSONObject])
|
11
13
|
AUTH_HEADER = "Classiq-BE-Auth"
|
14
|
+
INVALID_RESPONSE_ERROR_MSG = "Invalid response from Classiq API"
|
12
15
|
|
13
16
|
|
14
17
|
class JobID(BaseModel):
|
@@ -29,6 +32,32 @@ class JobStatus(StrEnum):
|
|
29
32
|
return self in (self.COMPLETED, self.FAILED, self.CANCELLED)
|
30
33
|
|
31
34
|
|
32
|
-
|
35
|
+
"""
|
36
|
+
A job can be in either of 3 states: ongoing, completed successfully or completed
|
37
|
+
unsuccessfully. Each job status belongs to one of the 3 states
|
38
|
+
For ongoing jobs, we expect both the failure_details and result to be None
|
39
|
+
For successful jobs, we expect failure_details to be None and result to be an instance of T
|
40
|
+
For unsuccessful jobs, we expect failure_details to be a string and result to be None
|
41
|
+
"""
|
42
|
+
|
43
|
+
|
44
|
+
class JobDescription(BaseModel, Generic[T], json_encoders=CUSTOM_ENCODERS):
|
33
45
|
status: JobStatus
|
34
|
-
|
46
|
+
failure_details: Optional[str] = pydantic.Field(default=None)
|
47
|
+
result: Optional[T] = pydantic.Field(default=None)
|
48
|
+
|
49
|
+
@pydantic.model_validator(mode="after")
|
50
|
+
def validate_status_and_fields(self) -> Self:
|
51
|
+
if self.status is JobStatus.COMPLETED:
|
52
|
+
# Completed job must return result and not have an error
|
53
|
+
if self.result is None or self.failure_details is not None:
|
54
|
+
raise ClassiqAPIError(INVALID_RESPONSE_ERROR_MSG)
|
55
|
+
elif self.status in (JobStatus.FAILED, JobStatus.CANCELLED):
|
56
|
+
# Failed job must return error and not have result
|
57
|
+
if self.result is not None or self.failure_details is None:
|
58
|
+
raise ClassiqAPIError(INVALID_RESPONSE_ERROR_MSG)
|
59
|
+
elif self.result is not None or self.failure_details is not None:
|
60
|
+
# Pending job must have no result and no error
|
61
|
+
raise ClassiqAPIError(INVALID_RESPONSE_ERROR_MSG)
|
62
|
+
|
63
|
+
return self
|
@@ -0,0 +1,16 @@
|
|
1
|
+
from collections.abc import Mapping
|
2
|
+
from typing import Literal, Optional
|
3
|
+
|
4
|
+
from classiq.interface.generator.expressions.expression import Expression
|
5
|
+
from classiq.interface.model.handle_binding import ConcreteHandleBinding, HandleBinding
|
6
|
+
from classiq.interface.model.quantum_statement import QuantumOperation
|
7
|
+
|
8
|
+
|
9
|
+
class Allocate(QuantumOperation):
|
10
|
+
kind: Literal["Allocate"]
|
11
|
+
size: Optional[Expression] = None
|
12
|
+
target: ConcreteHandleBinding
|
13
|
+
|
14
|
+
@property
|
15
|
+
def wiring_outputs(self) -> Mapping[str, HandleBinding]:
|
16
|
+
return {"out": self.target}
|