classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
@@ -1,24 +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
|
4
|
+
from pydantic import BaseModel, ConfigDict, Field
|
5
|
+
from typing_extensions import Self
|
5
6
|
|
7
|
+
from classiq.interface.ast_node import HashableASTNode
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
6
9
|
from classiq.interface.generator.arith.register_user_input import (
|
7
10
|
RegisterArithmeticInfo,
|
8
11
|
RegisterUserInput,
|
9
12
|
)
|
10
13
|
from classiq.interface.generator.expressions.expression import Expression
|
11
|
-
from classiq.interface.
|
12
|
-
|
14
|
+
from classiq.interface.generator.expressions.qmod_qarray_proxy import QmodQArrayProxy
|
15
|
+
from classiq.interface.generator.expressions.qmod_qscalar_proxy import (
|
16
|
+
QmodQBitProxy,
|
17
|
+
QmodQNumProxy,
|
18
|
+
QmodQScalarProxy,
|
13
19
|
)
|
20
|
+
from classiq.interface.generator.expressions.qmod_sized_proxy import QmodSizedProxy
|
14
21
|
from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
|
22
|
+
from classiq.interface.model.handle_binding import HandleBinding
|
15
23
|
|
16
|
-
|
24
|
+
if TYPE_CHECKING:
|
25
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
|
17
26
|
|
18
27
|
|
19
|
-
class QuantumType(
|
20
|
-
|
21
|
-
extra = Extra.forbid
|
28
|
+
class QuantumType(HashableASTNode):
|
29
|
+
model_config = ConfigDict(extra="forbid")
|
22
30
|
|
23
31
|
_size_in_bits: Optional[int] = pydantic.PrivateAttr(default=None)
|
24
32
|
|
@@ -40,112 +48,232 @@ class QuantumType(HashablePydanticBaseModel):
|
|
40
48
|
def set_size_in_bits(self, val: int) -> None:
|
41
49
|
self._size_in_bits = val
|
42
50
|
|
51
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodSizedProxy:
|
52
|
+
return QmodSizedProxy(handle=handle, size=self.size_in_bits)
|
43
53
|
|
44
|
-
|
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
|
69
|
+
|
70
|
+
|
71
|
+
class QuantumScalar(QuantumType):
|
72
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodQScalarProxy:
|
73
|
+
return QmodQScalarProxy(handle, size=self.size_in_bits)
|
74
|
+
|
75
|
+
|
76
|
+
class QuantumBit(QuantumScalar):
|
45
77
|
kind: Literal["qbit"]
|
46
78
|
|
47
79
|
def __init__(self, **kwargs: Any) -> None:
|
48
80
|
super().__init__(**kwargs)
|
49
81
|
self._size_in_bits = 1
|
50
82
|
|
51
|
-
@pydantic.
|
52
|
-
|
83
|
+
@pydantic.model_validator(mode="before")
|
84
|
+
@classmethod
|
85
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
53
86
|
return values_with_discriminator(values, "kind", "qbit")
|
54
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
|
55
102
|
|
56
|
-
|
57
|
-
|
103
|
+
@property
|
104
|
+
def is_evaluated(self) -> bool:
|
105
|
+
return True
|
58
106
|
|
59
107
|
|
60
|
-
class QuantumBitvector(
|
108
|
+
class QuantumBitvector(QuantumType):
|
109
|
+
element_type: "ConcreteQuantumType" = Field(
|
110
|
+
discriminator="kind", default_factory=QuantumBit
|
111
|
+
)
|
61
112
|
kind: Literal["qvec"]
|
113
|
+
length: Optional[Expression] = Field(default=None)
|
62
114
|
|
63
|
-
@pydantic.
|
64
|
-
|
115
|
+
@pydantic.model_validator(mode="before")
|
116
|
+
@classmethod
|
117
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
65
118
|
return values_with_discriminator(values, "kind", "qvec")
|
66
119
|
|
67
120
|
def _update_size_in_bits_from_declaration(self) -> None:
|
68
|
-
|
69
|
-
|
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
|
+
)
|
70
127
|
|
128
|
+
@property
|
129
|
+
def has_length(self) -> bool:
|
130
|
+
return self.length is not None and self.length.is_evaluated()
|
71
131
|
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
+
)
|
75
150
|
|
76
|
-
@
|
77
|
-
def
|
78
|
-
|
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)}]"
|
79
156
|
|
80
|
-
|
157
|
+
@property
|
158
|
+
def type_name(self) -> str:
|
159
|
+
return "Quantum array"
|
81
160
|
|
82
|
-
|
161
|
+
@property
|
162
|
+
def is_instantiated(self) -> bool:
|
163
|
+
return self.length is not None and self.element_type.is_instantiated
|
83
164
|
|
84
165
|
@property
|
85
|
-
def
|
86
|
-
return
|
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
|
+
)
|
172
|
+
|
173
|
+
|
174
|
+
class QuantumNumeric(QuantumScalar):
|
175
|
+
kind: Literal["qnum"]
|
176
|
+
|
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)
|
180
|
+
|
181
|
+
@pydantic.model_validator(mode="before")
|
182
|
+
@classmethod
|
183
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
184
|
+
return values_with_discriminator(values, "kind", "qnum")
|
185
|
+
|
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
|
+
):
|
193
|
+
raise ClassiqValueError(
|
194
|
+
"Assign neither or both of is_signed and fraction_digits"
|
195
|
+
)
|
196
|
+
return self
|
87
197
|
|
88
198
|
@property
|
89
|
-
def
|
90
|
-
return self.
|
199
|
+
def has_sign(self) -> bool:
|
200
|
+
return self.is_signed is not None
|
91
201
|
|
92
|
-
|
93
|
-
|
202
|
+
@property
|
203
|
+
def sign_value(self) -> bool:
|
204
|
+
return False if self.is_signed is None else self.is_signed.to_bool_value()
|
94
205
|
|
95
206
|
@property
|
96
|
-
def
|
97
|
-
return self.
|
207
|
+
def has_fraction_digits(self) -> bool:
|
208
|
+
return self.fraction_digits is not None
|
98
209
|
|
99
|
-
|
100
|
-
|
210
|
+
@property
|
211
|
+
def fraction_digits_value(self) -> int:
|
212
|
+
return (
|
213
|
+
0 if self.fraction_digits is None else self.fraction_digits.to_int_value()
|
214
|
+
)
|
101
215
|
|
102
216
|
def _update_size_in_bits_from_declaration(self) -> None:
|
103
217
|
if self.size is not None and self.size.is_evaluated():
|
104
218
|
self._size_in_bits = self.size.to_int_value()
|
105
219
|
|
220
|
+
def get_proxy(self, handle: "HandleBinding") -> QmodQNumProxy:
|
221
|
+
return QmodQNumProxy(
|
222
|
+
handle,
|
223
|
+
size=self.size_in_bits,
|
224
|
+
fraction_digits=self.fraction_digits_value,
|
225
|
+
is_signed=self.sign_value,
|
226
|
+
)
|
106
227
|
|
107
|
-
|
108
|
-
|
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"
|
109
237
|
|
110
|
-
@
|
111
|
-
def
|
112
|
-
return
|
238
|
+
@property
|
239
|
+
def type_name(self) -> str:
|
240
|
+
return "Quantum numeric"
|
113
241
|
|
242
|
+
@property
|
243
|
+
def is_instantiated(self) -> bool:
|
244
|
+
return self.size is not None
|
114
245
|
|
115
|
-
|
116
|
-
|
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
|
+
)
|
117
255
|
|
118
|
-
kind: Literal["qfixed"]
|
119
256
|
|
120
|
-
|
121
|
-
|
122
|
-
|
257
|
+
class RegisterQuantumType(BaseModel):
|
258
|
+
quantum_types: "ConcreteQuantumType"
|
259
|
+
size: int = Field(default=1)
|
123
260
|
|
124
261
|
@property
|
125
|
-
def
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
raise ClassiqValueError(
|
131
|
-
"Cannot assign value of fixed-point number with incompatible fraction digits"
|
132
|
-
)
|
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"
|
133
267
|
|
134
268
|
|
135
|
-
|
136
|
-
QuantumBit,
|
137
|
-
QuantumBitvector,
|
138
|
-
QuantumNumeric,
|
139
|
-
QuantumInteger,
|
140
|
-
QuantumFixedReal,
|
141
|
-
]
|
269
|
+
RegisterQuantumTypeDict = dict[str, RegisterQuantumType]
|
142
270
|
|
143
271
|
|
144
272
|
def register_info_to_quantum_type(reg_info: RegisterArithmeticInfo) -> QuantumNumeric:
|
145
273
|
result = QuantumNumeric()
|
146
274
|
result.set_size_in_bits(reg_info.size)
|
147
|
-
result.
|
148
|
-
result.
|
275
|
+
result.is_signed = Expression(expr=str(reg_info.is_signed))
|
276
|
+
result.fraction_digits = Expression(expr=str(reg_info.fraction_places))
|
149
277
|
return result
|
150
278
|
|
151
279
|
|
@@ -153,10 +281,11 @@ UNRESOLVED_SIZE = 1000
|
|
153
281
|
|
154
282
|
|
155
283
|
def quantum_var_to_register(name: str, qtype: QuantumType) -> RegisterUserInput:
|
156
|
-
|
157
|
-
|
158
|
-
fraction_places = qtype.
|
284
|
+
if isinstance(qtype, QuantumNumeric):
|
285
|
+
signed = qtype.sign_value
|
286
|
+
fraction_places = qtype.fraction_digits_value
|
159
287
|
else:
|
288
|
+
signed = False
|
160
289
|
fraction_places = 0
|
161
290
|
return RegisterUserInput(
|
162
291
|
name=name,
|
@@ -164,3 +293,12 @@ def quantum_var_to_register(name: str, qtype: QuantumType) -> RegisterUserInput:
|
|
164
293
|
is_signed=signed,
|
165
294
|
fraction_places=fraction_places,
|
166
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
|
-
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
|
7
|
+
quantum_type: ConcreteQuantumType
|
@@ -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"
|
@@ -0,0 +1,58 @@
|
|
1
|
+
from typing import Annotated, Union
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from classiq.interface.model.allocate import Allocate
|
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
|
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
|
14
|
+
from classiq.interface.model.quantum_expressions.amplitude_loading_operation import (
|
15
|
+
AmplitudeLoadingOperation,
|
16
|
+
)
|
17
|
+
from classiq.interface.model.quantum_expressions.arithmetic_operation import (
|
18
|
+
ArithmeticOperation,
|
19
|
+
)
|
20
|
+
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
21
|
+
from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
|
22
|
+
from classiq.interface.model.repeat import Repeat
|
23
|
+
from classiq.interface.model.variable_declaration_statement import (
|
24
|
+
VariableDeclarationStatement,
|
25
|
+
)
|
26
|
+
from classiq.interface.model.within_apply_operation import WithinApply
|
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"),
|
46
|
+
]
|
47
|
+
|
48
|
+
StatementBlock = list[ConcreteQuantumStatement]
|
49
|
+
|
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"]
|
@@ -0,0 +1,13 @@
|
|
1
|
+
from typing import TYPE_CHECKING, Literal
|
2
|
+
|
3
|
+
from classiq.interface.model.quantum_statement import QuantumOperation
|
4
|
+
|
5
|
+
if TYPE_CHECKING:
|
6
|
+
from classiq.interface.model.statement_block import StatementBlock
|
7
|
+
|
8
|
+
|
9
|
+
class WithinApply(QuantumOperation):
|
10
|
+
kind: Literal["WithinApply"]
|
11
|
+
|
12
|
+
compute: "StatementBlock"
|
13
|
+
action: "StatementBlock"
|
@@ -1,10 +1,13 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
1
3
|
import sympy
|
2
4
|
from pyomo.core.base import _GeneralVarData
|
5
|
+
from pyomo.core.expr.sympy_tools import PyomoSympyBimap
|
3
6
|
|
4
7
|
|
5
8
|
# This code is a pure copy paste from pyomo.core.expr.sympy_tools.PyomoSympyBimap.getSympySymbol
|
6
9
|
# except one line.
|
7
|
-
def get_sympy_symbol(self, pyomo_object):
|
10
|
+
def get_sympy_symbol(self: PyomoSympyBimap, pyomo_object: Any) -> sympy.Symbol:
|
8
11
|
if pyomo_object in self.pyomo2sympy:
|
9
12
|
return self.pyomo2sympy[pyomo_object]
|
10
13
|
# Pyomo currently ONLY supports Real variables (not complex
|
@@ -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,13 @@ 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
|
-
|
45
|
-
|
47
|
+
|
48
|
+
CHEMISTRY_QMOD_PATH = "/generate_model/chemistry/qmod"
|
49
|
+
GROVER_QMOD_PATH = "/generate_model/grover/qmod"
|
50
|
+
FINANCE_QMOD_PATH = "/generate_model/finance/qmod"
|
51
|
+
|
46
52
|
|
47
53
|
TASK_TRAIN_SUFFIX = TASKS_SUFFIX + "/train"
|
48
54
|
TASK_TEST_SUFFIX = TASKS_SUFFIX + "/test"
|
@@ -55,8 +61,6 @@ EXECUTION_JOBS_FULL_PATH = EXECUTION_PREFIX + EXECUTION_JOBS_SUFFIX
|
|
55
61
|
EXECUTION_JOBS_NON_VERSIONED_FULL_PATH = (
|
56
62
|
EXECUTION_NON_VERSIONED_PREFIX + EXECUTION_JOBS_SUFFIX
|
57
63
|
)
|
58
|
-
EXECUTE_QUANTUM_PROGRAM_FULL_PATH = LEGACY_EXECUTE_PREFIX + QUANTUM_PROGRAM_SUFFIX
|
59
|
-
EXECUTE_ESTIMATE_FULL_PATH = LEGACY_EXECUTE_PREFIX + ESTIMATE_SUFFIX
|
60
64
|
|
61
65
|
ANALYZER_FULL_PATH = ANALYZER_PREFIX + TASKS_SUFFIX
|
62
66
|
ANALYZER_RB_FULL_PATH = ANALYZER_PREFIX + TASK_RB_SUFFIX
|
@@ -65,19 +69,16 @@ GENERATE_RESOURCE_ESTIMATOR_REPORT = "/resource_estimator_report"
|
|
65
69
|
TASKS_SOLVE_EXACT_SUFFIX = "/tasks/solve_exact"
|
66
70
|
|
67
71
|
GENERATE_HAMILTONIAN_SUFFIX = "/generate_hamiltonian"
|
68
|
-
GENERATE_HAMILTONIAN_FULL_PATH =
|
69
|
-
SYNTHESIS_NON_VERSIONED_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
|
70
|
-
)
|
71
|
-
|
72
|
-
FINANCE_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/finance"
|
73
|
-
|
74
|
-
GROVER_GENERATE_MODEL_PATH = MODEL_GENERATE_PREFIX + "/grover"
|
75
|
-
|
76
|
-
QMOD_PREFIX = ANALYZER_PREFIX + "/qmods"
|
77
|
-
QMOD_METADATA_PATH = QMOD_PREFIX + "/metadata"
|
78
|
-
QMOD_FILE_PATH = QMOD_PREFIX + "/file"
|
72
|
+
GENERATE_HAMILTONIAN_FULL_PATH = CHEMISTRY_PREFIX + GENERATE_HAMILTONIAN_SUFFIX
|
79
73
|
|
80
74
|
CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX = "/execution_input"
|
81
75
|
CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_FULL = (
|
82
76
|
CONVERSION_PREFIX + CONVERSION_GENERATED_CIRCUIT_TO_EXECUTION_INPUT_SUFFIX
|
83
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
|