classiq 0.38.0__py3-none-any.whl → 0.65.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +47 -32
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
- classiq/_internals/api_wrapper.py +235 -97
- classiq/_internals/async_utils.py +1 -3
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +10 -5
- classiq/_internals/authentication/password_manager.py +18 -6
- classiq/_internals/authentication/token_manager.py +10 -5
- classiq/_internals/client.py +94 -33
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +60 -57
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +24 -19
- classiq/analyzer/analyzer_utilities.py +10 -10
- classiq/analyzer/rb.py +15 -15
- classiq/analyzer/show_interactive_hack.py +27 -4
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
- classiq/applications/combinatorial_optimization/__init__.py +20 -6
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
- classiq/applications/grover/__init__.py +9 -0
- classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +6 -6
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +5 -5
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +3 -6
- classiq/applications/qsvm/qsvm_data_generation.py +3 -3
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +20 -115
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +43 -13
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +28 -32
- classiq/interface/applications/qsvm.py +20 -29
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -121
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +25 -22
- classiq/interface/backend/quantum_backend_providers.py +69 -16
- classiq/interface/chemistry/fermionic_operator.py +30 -21
- classiq/interface/chemistry/ground_state_problem.py +28 -25
- classiq/interface/chemistry/molecule.py +14 -10
- classiq/interface/chemistry/operator.py +64 -231
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/{exceptions.py → interface/exceptions.py} +37 -9
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/execution_preferences.py +26 -114
- classiq/interface/executor/execution_request.py +24 -46
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +17 -14
- classiq/interface/executor/quantum_code.py +28 -24
- classiq/interface/executor/quantum_instruction_set.py +2 -2
- classiq/interface/executor/register_initialization.py +11 -14
- classiq/interface/executor/result.py +83 -56
- classiq/interface/executor/vqe_result.py +10 -10
- classiq/interface/finance/function_input.py +35 -25
- classiq/interface/finance/gaussian_model_input.py +5 -5
- classiq/interface/finance/log_normal_model_input.py +4 -4
- classiq/interface/finance/model_input.py +4 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +22 -12
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +46 -5
- classiq/interface/generator/arith/arithmetic.py +35 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
- classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
- classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
- classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
- classiq/interface/generator/arith/arithmetic_operations.py +14 -6
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
- classiq/interface/generator/arith/binary_ops.py +218 -130
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -25
- classiq/interface/generator/arith/logical_ops.py +14 -12
- classiq/interface/generator/arith/number_utils.py +12 -6
- classiq/interface/generator/arith/register_user_input.py +60 -37
- classiq/interface/generator/arith/unary_ops.py +49 -29
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +3 -3
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
- classiq/interface/generator/compiler_keywords.py +5 -1
- classiq/interface/generator/complex_type.py +13 -18
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +34 -29
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +5 -5
- classiq/interface/generator/expressions/expression.py +26 -14
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
- classiq/interface/generator/finance.py +2 -2
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +36 -64
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +153 -20
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -25
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
- classiq/interface/generator/hardware/hardware_data.py +72 -34
- classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
- classiq/interface/generator/hartree_fock.py +13 -5
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +32 -20
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +17 -15
- classiq/interface/generator/mcx.py +24 -17
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +26 -8
- classiq/interface/generator/model/model.py +27 -190
- classiq/interface/generator/model/preferences/preferences.py +115 -41
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +15 -13
- classiq/interface/generator/oracles/oracle_abc.py +7 -7
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +41 -30
- classiq/interface/generator/qsvm.py +9 -10
- classiq/interface/generator/quantum_function_call.py +88 -73
- classiq/interface/generator/quantum_program.py +41 -24
- classiq/interface/generator/range_types.py +11 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +5 -5
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +4 -7
- classiq/interface/generator/state_preparation/state_preparation.py +25 -20
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +7 -11
- classiq/interface/generator/ucc.py +5 -4
- classiq/interface/generator/unitary_gate.py +5 -5
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +7 -7
- classiq/interface/generator/validations/validator_functions.py +4 -4
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +29 -8
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +2 -2
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -5
- classiq/interface/helpers/validation_helpers.py +3 -20
- classiq/interface/helpers/versioned_model.py +1 -4
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +29 -69
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +32 -9
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +29 -24
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +69 -61
- classiq/interface/model/native_function_definition.py +17 -20
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +141 -343
- classiq/interface/model/quantum_function_declaration.py +190 -157
- classiq/interface/model/quantum_lambda_function.py +33 -32
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +177 -40
- classiq/interface/model/quantum_variable_declaration.py +3 -25
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +40 -14
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +7 -5
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +17 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +10 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +36 -14
- classiq/qmod/builtins/classical_functions.py +39 -43
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +373 -40
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +2 -2
- classiq/qmod/classical_function.py +4 -8
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +143 -101
- classiq/qmod/expression_query.py +20 -4
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +18 -6
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +16 -11
- classiq/qmod/native/pretty_printer.py +187 -97
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +60 -8
- classiq/qmod/qmod_constant.py +93 -26
- classiq/qmod/qmod_parameter.py +68 -59
- classiq/qmod/qmod_variable.py +468 -155
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +269 -96
- classiq/qmod/quantum_function.py +196 -41
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +147 -123
- classiq/qmod/symbolic_expr.py +27 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +98 -4
- classiq/qmod/write_qmod.py +17 -3
- classiq/synthesis.py +210 -22
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
- classiq-0.65.4.dist-info/RECORD +521 -0
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -25
- classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
- classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
- classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/interface/executor/aws_execution_cost.py +0 -73
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
- classiq/interface/generator/functions/foreign_function_definition.py +0 -114
- classiq/interface/generator/functions/function_implementation.py +0 -107
- classiq/interface/generator/functions/native_function_definition.py +0 -155
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -44
- classiq/interface/generator/functions/register_mapping_data.py +0 -106
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -74
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/call_synthesis_data.py +0 -68
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -94
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -156
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -462
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -229
- classiq/qmod/builtins/functions.py +0 -913
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -205
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.38.0.dist-info/RECORD +0 -454
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
- /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
- /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
- /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,30 +1,32 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
|
-
from pydantic import
|
5
|
-
from typing_extensions import
|
4
|
+
from pydantic import BaseModel, ConfigDict, Field
|
5
|
+
from typing_extensions import Self
|
6
6
|
|
7
|
+
from classiq.interface.ast_node import HashableASTNode
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
7
9
|
from classiq.interface.generator.arith.register_user_input import (
|
8
10
|
RegisterArithmeticInfo,
|
9
11
|
RegisterUserInput,
|
10
12
|
)
|
11
13
|
from classiq.interface.generator.expressions.expression import Expression
|
14
|
+
from classiq.interface.generator.expressions.qmod_qarray_proxy import QmodQArrayProxy
|
12
15
|
from classiq.interface.generator.expressions.qmod_qscalar_proxy import (
|
16
|
+
QmodQBitProxy,
|
13
17
|
QmodQNumProxy,
|
14
18
|
QmodQScalarProxy,
|
15
19
|
)
|
16
20
|
from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
|
17
|
-
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
18
|
-
HashablePydanticBaseModel,
|
19
|
-
)
|
20
21
|
from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
|
22
|
+
from classiq.interface.model.handle_binding import HandleBinding
|
21
23
|
|
22
|
-
|
24
|
+
if TYPE_CHECKING:
|
25
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
|
23
26
|
|
24
27
|
|
25
|
-
class QuantumType(
|
26
|
-
|
27
|
-
extra = Extra.forbid
|
28
|
+
class QuantumType(HashableASTNode):
|
29
|
+
model_config = ConfigDict(extra="forbid")
|
28
30
|
|
29
31
|
_size_in_bits: Optional[int] = pydantic.PrivateAttr(default=None)
|
30
32
|
|
@@ -46,13 +48,29 @@ class QuantumType(HashablePydanticBaseModel):
|
|
46
48
|
def set_size_in_bits(self, val: int) -> None:
|
47
49
|
self._size_in_bits = val
|
48
50
|
|
49
|
-
def get_proxy(self,
|
50
|
-
return QmodSizedProxy(size=self.size_in_bits)
|
51
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodSizedProxy:
|
52
|
+
return QmodSizedProxy(handle=handle, size=self.size_in_bits)
|
53
|
+
|
54
|
+
@property
|
55
|
+
def qmod_type_name(self) -> str:
|
56
|
+
raise NotImplementedError
|
57
|
+
|
58
|
+
@property
|
59
|
+
def type_name(self) -> str:
|
60
|
+
raise NotImplementedError
|
61
|
+
|
62
|
+
@property
|
63
|
+
def is_instantiated(self) -> bool:
|
64
|
+
raise NotImplementedError
|
65
|
+
|
66
|
+
@property
|
67
|
+
def is_evaluated(self) -> bool:
|
68
|
+
raise NotImplementedError
|
51
69
|
|
52
70
|
|
53
71
|
class QuantumScalar(QuantumType):
|
54
|
-
def get_proxy(self,
|
55
|
-
return QmodQScalarProxy(
|
72
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodQScalarProxy:
|
73
|
+
return QmodQScalarProxy(handle, size=self.size_in_bits)
|
56
74
|
|
57
75
|
|
58
76
|
class QuantumBit(QuantumScalar):
|
@@ -62,47 +80,120 @@ class QuantumBit(QuantumScalar):
|
|
62
80
|
super().__init__(**kwargs)
|
63
81
|
self._size_in_bits = 1
|
64
82
|
|
65
|
-
@pydantic.
|
66
|
-
|
83
|
+
@pydantic.model_validator(mode="before")
|
84
|
+
@classmethod
|
85
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
67
86
|
return values_with_discriminator(values, "kind", "qbit")
|
68
87
|
|
88
|
+
@property
|
89
|
+
def qmod_type_name(self) -> str:
|
90
|
+
return "QBit"
|
91
|
+
|
92
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodQBitProxy:
|
93
|
+
return QmodQBitProxy(handle)
|
94
|
+
|
95
|
+
@property
|
96
|
+
def type_name(self) -> str:
|
97
|
+
return "Quantum bit"
|
98
|
+
|
99
|
+
@property
|
100
|
+
def is_instantiated(self) -> bool:
|
101
|
+
return True
|
69
102
|
|
70
|
-
|
71
|
-
|
103
|
+
@property
|
104
|
+
def is_evaluated(self) -> bool:
|
105
|
+
return True
|
72
106
|
|
73
107
|
|
74
|
-
class QuantumBitvector(
|
108
|
+
class QuantumBitvector(QuantumType):
|
109
|
+
element_type: "ConcreteQuantumType" = Field(
|
110
|
+
discriminator="kind", default_factory=QuantumBit
|
111
|
+
)
|
75
112
|
kind: Literal["qvec"]
|
113
|
+
length: Optional[Expression] = Field(default=None)
|
76
114
|
|
77
|
-
@pydantic.
|
78
|
-
|
115
|
+
@pydantic.model_validator(mode="before")
|
116
|
+
@classmethod
|
117
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
79
118
|
return values_with_discriminator(values, "kind", "qvec")
|
80
119
|
|
81
120
|
def _update_size_in_bits_from_declaration(self) -> None:
|
82
|
-
|
83
|
-
|
121
|
+
self.element_type._update_size_in_bits_from_declaration()
|
122
|
+
if self.element_type.has_size_in_bits and self.has_length:
|
123
|
+
assert self.length is not None
|
124
|
+
self._size_in_bits = (
|
125
|
+
self.element_type.size_in_bits * self.length.to_int_value()
|
126
|
+
)
|
127
|
+
|
128
|
+
@property
|
129
|
+
def has_length(self) -> bool:
|
130
|
+
return self.length is not None and self.length.is_evaluated()
|
131
|
+
|
132
|
+
@property
|
133
|
+
def length_value(self) -> int:
|
134
|
+
if not self.has_length:
|
135
|
+
raise ClassiqValueError(
|
136
|
+
"Tried to access unevaluated length of quantum array"
|
137
|
+
)
|
138
|
+
assert self.length is not None
|
139
|
+
return self.length.to_int_value()
|
140
|
+
|
141
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodQArrayProxy:
|
142
|
+
element_size = self.element_type.size_in_bits
|
143
|
+
assert self.size_in_bits % element_size == 0
|
144
|
+
return QmodQArrayProxy(
|
145
|
+
handle,
|
146
|
+
self.element_type,
|
147
|
+
element_size,
|
148
|
+
self.size_in_bits // element_size,
|
149
|
+
)
|
150
|
+
|
151
|
+
@property
|
152
|
+
def qmod_type_name(self) -> str:
|
153
|
+
element_type = [self.element_type.qmod_type_name]
|
154
|
+
length = [self.length.expr] if self.length is not None else []
|
155
|
+
return f"QArray[{', '.join(element_type + length)}]"
|
156
|
+
|
157
|
+
@property
|
158
|
+
def type_name(self) -> str:
|
159
|
+
return "Quantum array"
|
160
|
+
|
161
|
+
@property
|
162
|
+
def is_instantiated(self) -> bool:
|
163
|
+
return self.length is not None and self.element_type.is_instantiated
|
164
|
+
|
165
|
+
@property
|
166
|
+
def is_evaluated(self) -> bool:
|
167
|
+
return (
|
168
|
+
self.length is not None
|
169
|
+
and self.length.is_evaluated()
|
170
|
+
and self.element_type.is_evaluated
|
171
|
+
)
|
84
172
|
|
85
173
|
|
86
174
|
class QuantumNumeric(QuantumScalar):
|
87
175
|
kind: Literal["qnum"]
|
88
176
|
|
89
|
-
size: Optional[Expression] = pydantic.Field()
|
90
|
-
is_signed: Optional[Expression] = pydantic.Field()
|
91
|
-
fraction_digits: Optional[Expression] = pydantic.Field()
|
177
|
+
size: Optional[Expression] = pydantic.Field(default=None)
|
178
|
+
is_signed: Optional[Expression] = pydantic.Field(default=None)
|
179
|
+
fraction_digits: Optional[Expression] = pydantic.Field(default=None)
|
92
180
|
|
93
|
-
@pydantic.
|
94
|
-
|
181
|
+
@pydantic.model_validator(mode="before")
|
182
|
+
@classmethod
|
183
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
95
184
|
return values_with_discriminator(values, "kind", "qnum")
|
96
185
|
|
97
|
-
@pydantic.
|
98
|
-
def _validate_fields(
|
99
|
-
has_sign =
|
100
|
-
has_fraction_digits =
|
101
|
-
if has_sign and not has_fraction_digits or
|
186
|
+
@pydantic.model_validator(mode="after")
|
187
|
+
def _validate_fields(self) -> Self:
|
188
|
+
has_sign = self.is_signed is not None
|
189
|
+
has_fraction_digits = self.fraction_digits is not None
|
190
|
+
if (has_sign and not has_fraction_digits) or (
|
191
|
+
not has_sign and has_fraction_digits
|
192
|
+
):
|
102
193
|
raise ClassiqValueError(
|
103
194
|
"Assign neither or both of is_signed and fraction_digits"
|
104
195
|
)
|
105
|
-
return
|
196
|
+
return self
|
106
197
|
|
107
198
|
@property
|
108
199
|
def has_sign(self) -> bool:
|
@@ -126,19 +217,56 @@ class QuantumNumeric(QuantumScalar):
|
|
126
217
|
if self.size is not None and self.size.is_evaluated():
|
127
218
|
self._size_in_bits = self.size.to_int_value()
|
128
219
|
|
129
|
-
def get_proxy(self,
|
220
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodQNumProxy:
|
130
221
|
return QmodQNumProxy(
|
131
|
-
|
222
|
+
handle,
|
132
223
|
size=self.size_in_bits,
|
133
224
|
fraction_digits=self.fraction_digits_value,
|
134
225
|
is_signed=self.sign_value,
|
135
226
|
)
|
136
227
|
|
228
|
+
@property
|
229
|
+
def qmod_type_name(self) -> str:
|
230
|
+
if (
|
231
|
+
self.size is not None
|
232
|
+
and self.is_signed is not None
|
233
|
+
and self.fraction_digits is not None
|
234
|
+
):
|
235
|
+
return f"QNum[{self.size.expr}, {self.is_signed.expr}, {self.fraction_digits.expr}]"
|
236
|
+
return "QNum"
|
137
237
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
238
|
+
@property
|
239
|
+
def type_name(self) -> str:
|
240
|
+
return "Quantum numeric"
|
241
|
+
|
242
|
+
@property
|
243
|
+
def is_instantiated(self) -> bool:
|
244
|
+
return self.size is not None
|
245
|
+
|
246
|
+
@property
|
247
|
+
def is_evaluated(self) -> bool:
|
248
|
+
if self.size is None or not self.size.is_evaluated():
|
249
|
+
return False
|
250
|
+
if self.is_signed is not None and not self.is_signed.is_evaluated():
|
251
|
+
return False
|
252
|
+
return not (
|
253
|
+
self.fraction_digits is not None and not self.fraction_digits.is_evaluated()
|
254
|
+
)
|
255
|
+
|
256
|
+
|
257
|
+
class RegisterQuantumType(BaseModel):
|
258
|
+
quantum_types: "ConcreteQuantumType"
|
259
|
+
size: int = Field(default=1)
|
260
|
+
|
261
|
+
@property
|
262
|
+
def qmod_type_name(self) -> str:
|
263
|
+
try:
|
264
|
+
return self.quantum_types.qmod_type_name.split("[")[0]
|
265
|
+
except AttributeError:
|
266
|
+
return "default"
|
267
|
+
|
268
|
+
|
269
|
+
RegisterQuantumTypeDict = dict[str, RegisterQuantumType]
|
142
270
|
|
143
271
|
|
144
272
|
def register_info_to_quantum_type(reg_info: RegisterArithmeticInfo) -> QuantumNumeric:
|
@@ -165,3 +293,12 @@ def quantum_var_to_register(name: str, qtype: QuantumType) -> RegisterUserInput:
|
|
165
293
|
is_signed=signed,
|
166
294
|
fraction_places=fraction_places,
|
167
295
|
)
|
296
|
+
|
297
|
+
|
298
|
+
def quantum_type_to_register_quantum_type(
|
299
|
+
qtype: QuantumType, size: int
|
300
|
+
) -> RegisterQuantumType:
|
301
|
+
return RegisterQuantumType(
|
302
|
+
quantum_types=qtype,
|
303
|
+
size=size,
|
304
|
+
)
|
@@ -1,29 +1,7 @@
|
|
1
|
-
from
|
1
|
+
from classiq.interface.ast_node import ASTNode
|
2
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
|
2
3
|
|
3
|
-
import pydantic
|
4
|
-
from pydantic import BaseModel
|
5
4
|
|
6
|
-
|
7
|
-
from classiq.interface.model.quantum_type import (
|
8
|
-
ConcreteQuantumType,
|
9
|
-
QuantumBitvector,
|
10
|
-
QuantumNumeric,
|
11
|
-
)
|
12
|
-
|
13
|
-
|
14
|
-
class QuantumVariableDeclaration(BaseModel):
|
5
|
+
class QuantumVariableDeclaration(ASTNode):
|
15
6
|
name: str
|
16
7
|
quantum_type: ConcreteQuantumType
|
17
|
-
size: Optional[Expression] = pydantic.Field(default=None)
|
18
|
-
|
19
|
-
@pydantic.validator("size")
|
20
|
-
def _propagate_size_to_type(
|
21
|
-
cls, size: Optional[Expression], values: Mapping[str, Any]
|
22
|
-
) -> Optional[Expression]:
|
23
|
-
if size is not None:
|
24
|
-
quantum_type = values.get("quantum_type")
|
25
|
-
if isinstance(quantum_type, QuantumBitvector):
|
26
|
-
quantum_type.length = size
|
27
|
-
elif isinstance(quantum_type, QuantumNumeric):
|
28
|
-
quantum_type.size = size
|
29
|
-
return size
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from typing import TYPE_CHECKING, Literal
|
2
|
+
|
3
|
+
from classiq.interface.generator.expressions.expression import Expression
|
4
|
+
from classiq.interface.model.quantum_statement import QuantumOperation
|
5
|
+
|
6
|
+
if TYPE_CHECKING:
|
7
|
+
from classiq.interface.model.statement_block import StatementBlock
|
8
|
+
|
9
|
+
|
10
|
+
class Repeat(QuantumOperation):
|
11
|
+
kind: Literal["Repeat"]
|
12
|
+
|
13
|
+
iter_var: str
|
14
|
+
count: Expression
|
15
|
+
body: "StatementBlock"
|
@@ -1,7 +1,16 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Annotated, Union
|
2
2
|
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from classiq.interface.model.allocate import Allocate
|
3
6
|
from classiq.interface.model.bind_operation import BindOperation
|
7
|
+
from classiq.interface.model.classical_if import ClassicalIf
|
8
|
+
from classiq.interface.model.control import Control
|
4
9
|
from classiq.interface.model.inplace_binary_operation import InplaceBinaryOperation
|
10
|
+
from classiq.interface.model.invert import Invert
|
11
|
+
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
12
|
+
from classiq.interface.model.phase_operation import PhaseOperation
|
13
|
+
from classiq.interface.model.power import Power
|
5
14
|
from classiq.interface.model.quantum_expressions.amplitude_loading_operation import (
|
6
15
|
AmplitudeLoadingOperation,
|
7
16
|
)
|
@@ -9,24 +18,41 @@ from classiq.interface.model.quantum_expressions.arithmetic_operation import (
|
|
9
18
|
ArithmeticOperation,
|
10
19
|
)
|
11
20
|
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
12
|
-
from classiq.interface.model.quantum_if_operation import QuantumIfOperation
|
13
21
|
from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
|
22
|
+
from classiq.interface.model.repeat import Repeat
|
14
23
|
from classiq.interface.model.variable_declaration_statement import (
|
15
24
|
VariableDeclarationStatement,
|
16
25
|
)
|
17
|
-
from classiq.interface.model.within_apply_operation import
|
26
|
+
from classiq.interface.model.within_apply_operation import WithinApply
|
18
27
|
|
19
|
-
ConcreteQuantumStatement =
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
ConcreteQuantumStatement = Annotated[
|
29
|
+
Union[
|
30
|
+
Allocate,
|
31
|
+
QuantumFunctionCall,
|
32
|
+
ArithmeticOperation,
|
33
|
+
AmplitudeLoadingOperation,
|
34
|
+
VariableDeclarationStatement,
|
35
|
+
BindOperation,
|
36
|
+
InplaceBinaryOperation,
|
37
|
+
Repeat,
|
38
|
+
Power,
|
39
|
+
Invert,
|
40
|
+
ClassicalIf,
|
41
|
+
Control,
|
42
|
+
WithinApply,
|
43
|
+
PhaseOperation,
|
44
|
+
],
|
45
|
+
Field(..., discriminator="kind"),
|
28
46
|
]
|
29
47
|
|
30
|
-
StatementBlock =
|
48
|
+
StatementBlock = list[ConcreteQuantumStatement]
|
31
49
|
|
32
|
-
|
50
|
+
Control.model_rebuild()
|
51
|
+
QuantumLambdaFunction.model_rebuild()
|
52
|
+
Repeat.model_rebuild()
|
53
|
+
Power.model_rebuild()
|
54
|
+
Invert.model_rebuild()
|
55
|
+
WithinApply.model_rebuild()
|
56
|
+
ClassicalIf.model_rebuild()
|
57
|
+
NativeFunctionDefinition.model_rebuild()
|
58
|
+
PhaseOperation.model_rebuild()
|
@@ -1,27 +1,34 @@
|
|
1
1
|
import dataclasses
|
2
|
+
from collections.abc import Mapping
|
2
3
|
from enum import Enum
|
3
|
-
from typing import
|
4
|
+
from typing import Optional
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqError
|
5
7
|
from classiq.interface.model.handle_binding import HandleBinding
|
6
8
|
|
7
|
-
from classiq.exceptions import ClassiqError
|
8
|
-
|
9
9
|
|
10
10
|
class HandleState(Enum):
|
11
11
|
INITIALIZED = 0
|
12
12
|
UNINITIALIZED = 1
|
13
13
|
ERRORED = 2
|
14
14
|
|
15
|
+
def __invert__(self) -> "HandleState":
|
16
|
+
if self == HandleState.INITIALIZED:
|
17
|
+
return HandleState.UNINITIALIZED
|
18
|
+
if self == HandleState.UNINITIALIZED:
|
19
|
+
return HandleState.INITIALIZED
|
20
|
+
return self
|
21
|
+
|
15
22
|
|
16
23
|
@dataclasses.dataclass
|
17
24
|
class ValidationHandle:
|
18
25
|
_state: HandleState
|
19
|
-
errors:
|
26
|
+
errors: list[str] = dataclasses.field(default_factory=list)
|
20
27
|
|
21
28
|
def __init__(
|
22
29
|
self,
|
23
30
|
initial_state: Optional[HandleState] = None,
|
24
|
-
errors: Optional[
|
31
|
+
errors: Optional[list[str]] = None,
|
25
32
|
) -> None:
|
26
33
|
if initial_state is None and not errors:
|
27
34
|
raise ClassiqError("Missing initial state for ValidationHandle")
|
@@ -44,5 +51,5 @@ class ValidationHandle:
|
|
44
51
|
self._state = HandleState.UNINITIALIZED
|
45
52
|
|
46
53
|
|
47
|
-
def get_unique_handle_names(io_dict: Mapping[str, HandleBinding]) ->
|
54
|
+
def get_unique_handle_names(io_dict: Mapping[str, HandleBinding]) -> set[str]:
|
48
55
|
return {handle_binding.name for handle_binding in io_dict.values()}
|
@@ -1,3 +1,5 @@
|
|
1
|
+
from typing import Literal
|
2
|
+
|
1
3
|
from classiq.interface.model.quantum_statement import QuantumStatement
|
2
4
|
from classiq.interface.model.quantum_variable_declaration import (
|
3
5
|
QuantumVariableDeclaration,
|
@@ -5,4 +7,4 @@ from classiq.interface.model.quantum_variable_declaration import (
|
|
5
7
|
|
6
8
|
|
7
9
|
class VariableDeclarationStatement(QuantumStatement, QuantumVariableDeclaration):
|
8
|
-
|
10
|
+
kind: Literal["VariableDeclarationStatement"]
|
@@ -1,11 +1,13 @@
|
|
1
|
-
from typing import TYPE_CHECKING
|
1
|
+
from typing import TYPE_CHECKING, Literal
|
2
2
|
|
3
3
|
from classiq.interface.model.quantum_statement import QuantumOperation
|
4
4
|
|
5
5
|
if TYPE_CHECKING:
|
6
|
-
from classiq.interface.model.
|
6
|
+
from classiq.interface.model.statement_block import StatementBlock
|
7
7
|
|
8
8
|
|
9
|
-
class
|
10
|
-
|
11
|
-
|
9
|
+
class WithinApply(QuantumOperation):
|
10
|
+
kind: Literal["WithinApply"]
|
11
|
+
|
12
|
+
compute: "StatementBlock"
|
13
|
+
action: "StatementBlock"
|
@@ -1,15 +1,14 @@
|
|
1
|
-
from datetime import
|
2
|
-
from typing import Any
|
1
|
+
from datetime import date
|
2
|
+
from typing import Any
|
3
3
|
|
4
|
-
import pydantic
|
5
4
|
from pydantic import BaseModel
|
6
5
|
|
7
6
|
|
8
7
|
class DeprecationInfo(BaseModel):
|
9
|
-
deprecation_date:
|
10
|
-
removal_date:
|
8
|
+
deprecation_date: date
|
9
|
+
removal_date: date
|
11
10
|
|
12
11
|
|
13
12
|
class GlobalVersions(BaseModel):
|
14
|
-
deprecated:
|
15
|
-
deployed:
|
13
|
+
deprecated: dict[str, DeprecationInfo]
|
14
|
+
deployed: dict[str, Any]
|
@@ -1,8 +1,11 @@
|
|
1
1
|
ANALYZER_PREFIX = "/analyzer"
|
2
2
|
CHEMISTRY_PREFIX = "/chemistry"
|
3
|
-
LEGACY_EXECUTE_PREFIX = "/execute"
|
4
3
|
EXECUTION_PREFIX = "/execution"
|
4
|
+
EXECUTION_SESSIONS_PREFIX = EXECUTION_PREFIX + "/sessions"
|
5
5
|
CONVERSION_PREFIX = "/conversion"
|
6
|
+
PROVIDERS_PREFIX = "/providers"
|
7
|
+
|
8
|
+
IQCC_PREFIX = PROVIDERS_PREFIX + "/iqcc"
|
6
9
|
|
7
10
|
EXECUTION_NON_VERSIONED_PREFIX = "/execution/v1"
|
8
11
|
SYNTHESIS_NON_VERSIONED_PREFIX = "/synthesis/v1"
|
@@ -18,21 +21,20 @@ ANALYZER_HC_TABLE_GRAPH_FULL_PATH = ANALYZER_PREFIX + ANALYZER_HC_TABLE_GRAPH
|
|
18
21
|
|
19
22
|
ANALYZER_HC_GRAPH_NEW = "/graphs/hardware_connectivity/new"
|
20
23
|
|
21
|
-
ANALYZER_OPTIONAL_DEVICES = "/graphs/available_devices"
|
22
|
-
ANALYZER_OPTIONAL_DEVICES_FULL_PATH = ANALYZER_PREFIX + ANALYZER_OPTIONAL_DEVICES
|
23
|
-
|
24
24
|
TASKS_SUFFIX = "/tasks"
|
25
|
-
QUANTUM_PROGRAM_SUFFIX = "/quantum_program"
|
26
|
-
ESTIMATE_SUFFIX = "/estimate"
|
27
25
|
RB = "/rb"
|
28
26
|
ANALYZER_DATA_TASK = f"{TASKS_SUFFIX}/data"
|
29
27
|
ANALYZER_QASM_TASK = f"{TASKS_SUFFIX}/qasm"
|
28
|
+
ANALYZER_GET_VISUAL_MODEL = "/get_visual_model"
|
29
|
+
ANALYZER_GET_IDE_DATA = "/get_ide_data"
|
30
30
|
IDE_EVENT_TASK = f"{TASKS_SUFFIX}/event"
|
31
31
|
DATA_DOG_EVENT_TASK = f"{TASKS_SUFFIX}/data_dog_event"
|
32
32
|
|
33
33
|
ANALYZER_DATA_TASK_UPLOAD_FILE = f"{TASKS_SUFFIX}/data/file_upload"
|
34
34
|
ANALYZER_DATA_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_DATA_TASK}"
|
35
35
|
ANALYZER_QASM_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_QASM_TASK}"
|
36
|
+
ANALYZER_GET_VISUAL_MODEL_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_GET_VISUAL_MODEL}"
|
37
|
+
ANALYZER_GET_IDE_DATA_FULL_PATH = f"{ANALYZER_PREFIX}{ANALYZER_GET_IDE_DATA}"
|
36
38
|
IDE_EVENT_TASK_FULL_PATH = f"{ANALYZER_PREFIX}{IDE_EVENT_TASK}"
|
37
39
|
DATA_DOG_EVENT_TASK_FULL_PATH = f"{ANALYZER_PREFIX}{DATA_DOG_EVENT_TASK}"
|
38
40
|
|
@@ -40,9 +42,8 @@ IDE_QASM_TASK = f"{TASKS_SUFFIX}/generated_circuit_from_qasm"
|
|
40
42
|
IDE_QASM_FULL_PATH = f"{ANALYZER_PREFIX}{IDE_QASM_TASK}"
|
41
43
|
TASKS_GENERATE_SUFFIX = TASKS_SUFFIX + "/generate"
|
42
44
|
TASKS_VISUALIZE_SUFFIX = TASKS_SUFFIX + "/visualize"
|
45
|
+
TASKS_VISUAL_MODEL_SUFFIX = TASKS_SUFFIX + "/visual_model"
|
43
46
|
TASKS_SOLVE_SUFFIX = "/tasks/solve"
|
44
|
-
MODEL_GENERATE_PREFIX = "/generate_model"
|
45
|
-
CHEMISTRY_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/chemistry"
|
46
47
|
|
47
48
|
CHEMISTRY_QMOD_PATH = "/generate_model/chemistry/qmod"
|
48
49
|
GROVER_QMOD_PATH = "/generate_model/grover/qmod"
|
@@ -60,8 +61,6 @@ EXECUTION_JOBS_FULL_PATH = EXECUTION_PREFIX + EXECUTION_JOBS_SUFFIX
|
|
60
61
|
EXECUTION_JOBS_NON_VERSIONED_FULL_PATH = (
|
61
62
|
EXECUTION_NON_VERSIONED_PREFIX + EXECUTION_JOBS_SUFFIX
|
62
63
|
)
|
63
|
-
EXECUTE_QUANTUM_PROGRAM_FULL_PATH = LEGACY_EXECUTE_PREFIX + QUANTUM_PROGRAM_SUFFIX
|
64
|
-
EXECUTE_ESTIMATE_FULL_PATH = LEGACY_EXECUTE_PREFIX + ESTIMATE_SUFFIX
|
65
64
|
|
66
65
|
ANALYZER_FULL_PATH = ANALYZER_PREFIX + TASKS_SUFFIX
|
67
66
|
ANALYZER_RB_FULL_PATH = ANALYZER_PREFIX + TASK_RB_SUFFIX
|
@@ -70,19 +69,16 @@ GENERATE_RESOURCE_ESTIMATOR_REPORT = "/resource_estimator_report"
|
|
70
69
|
TASKS_SOLVE_EXACT_SUFFIX = "/tasks/solve_exact"
|
71
70
|
|
72
71
|
GENERATE_HAMILTONIAN_SUFFIX = "/generate_hamiltonian"
|
73
|
-
GENERATE_HAMILTONIAN_FULL_PATH =
|
74
|
-
SYNTHESIS_NON_VERSIONED_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
|
75
|
-
)
|
76
|
-
|
77
|
-
FINANCE_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/finance"
|
78
|
-
|
79
|
-
GROVER_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/grover"
|
80
|
-
|
81
|
-
QMOD_PREFIX = ANALYZER_PREFIX + "/qmods"
|
82
|
-
QMOD_METADATA_PATH = QMOD_PREFIX + "/metadata"
|
83
|
-
QMOD_FILE_PATH = QMOD_PREFIX + "/file"
|
72
|
+
GENERATE_HAMILTONIAN_FULL_PATH = CHEMISTRY_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
|
84
73
|
|
85
74
|
CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX = "/execution_input"
|
86
75
|
CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_FULL = (
|
87
76
|
CONVERSION_PREFIX + CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX
|
88
77
|
)
|
78
|
+
|
79
|
+
STATIC_SEMANTICS_VALIDATION_PATH = "/validate_static_semantics"
|
80
|
+
|
81
|
+
IQCC_INIT_AUTH_SUFFIX = "/init_auth"
|
82
|
+
IQCC_INIT_AUTH_FULL_PATH = IQCC_PREFIX + IQCC_INIT_AUTH_SUFFIX
|
83
|
+
IQCC_PROBE_AUTH_SUFFIX = "/probe_auth"
|
84
|
+
IQCC_PROBE_AUTH_FULL_PATH = IQCC_PREFIX + IQCC_PROBE_AUTH_SUFFIX
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import os
|
2
|
+
import re
|
3
|
+
from pathlib import Path
|
4
|
+
from typing import Optional
|
5
|
+
|
6
|
+
import pydantic
|
7
|
+
|
8
|
+
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
9
|
+
HashablePydanticBaseModel,
|
10
|
+
)
|
11
|
+
|
12
|
+
|
13
|
+
def _identify_ipynb_cell(file_name: str) -> bool:
|
14
|
+
file_path = Path(file_name)
|
15
|
+
base_file = file_path.name
|
16
|
+
if re.fullmatch(r"\d*\.py", base_file) is None:
|
17
|
+
return False
|
18
|
+
parent_folder = file_path.parent
|
19
|
+
return re.fullmatch(r"ipykernel_\d*", parent_folder.name) is not None
|
20
|
+
|
21
|
+
|
22
|
+
def _prepare_file_string(file_name: str) -> str:
|
23
|
+
if _identify_ipynb_cell(file_name):
|
24
|
+
return "ipynb cell "
|
25
|
+
return f"file {os.path.basename(file_name)} "
|
26
|
+
|
27
|
+
|
28
|
+
class SourceReference(HashablePydanticBaseModel):
|
29
|
+
start_line: int
|
30
|
+
start_column: int
|
31
|
+
end_line: int
|
32
|
+
end_column: int
|
33
|
+
file_name: Optional[str] = pydantic.Field(default=None)
|
34
|
+
|
35
|
+
def __str__(self) -> str:
|
36
|
+
file_string = _prepare_file_string(self.file_name) if self.file_name else ""
|
37
|
+
start_character_string = (
|
38
|
+
f" character {self.start_column + 1}" if self.start_column > 0 else ""
|
39
|
+
)
|
40
|
+
return f"{file_string}line {self.start_line + 1}{start_character_string}"
|
41
|
+
|
42
|
+
|
43
|
+
class SourceReferencedError(pydantic.BaseModel):
|
44
|
+
error: str
|
45
|
+
source_ref: Optional[SourceReference] = None
|
46
|
+
function: Optional[str] = None
|
47
|
+
|
48
|
+
def __str__(self) -> str:
|
49
|
+
source_referenced_error = (
|
50
|
+
f"{self.error}\n\t\tat {self.source_ref}"
|
51
|
+
if self.source_ref is not None
|
52
|
+
else self.error
|
53
|
+
)
|
54
|
+
function_scoped_error = (
|
55
|
+
f"{source_referenced_error} in function {self.function}"
|
56
|
+
if self.function is not None
|
57
|
+
else source_referenced_error
|
58
|
+
)
|
59
|
+
return function_scoped_error
|