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,169 +0,0 @@
|
|
1
|
-
from classiq.interface.generator.expressions.expression import Expression
|
2
|
-
from classiq.interface.generator.functions.classical_type import Bool, Integer
|
3
|
-
from classiq.interface.generator.functions.port_declaration import (
|
4
|
-
PortDeclarationDirection,
|
5
|
-
)
|
6
|
-
from classiq.interface.helpers.pydantic_model_helpers import nameables_to_dict
|
7
|
-
from classiq.interface.model.port_declaration import PortDeclaration
|
8
|
-
from classiq.interface.model.quantum_function_declaration import (
|
9
|
-
QuantumFunctionDeclaration,
|
10
|
-
QuantumOperandDeclaration,
|
11
|
-
)
|
12
|
-
|
13
|
-
REPEAT_OPERATOR = QuantumFunctionDeclaration(
|
14
|
-
name="repeat",
|
15
|
-
param_decls={"count": Integer()},
|
16
|
-
operand_declarations={
|
17
|
-
"iteration": QuantumOperandDeclaration(
|
18
|
-
name="iteration", param_decls={"index": Integer()}
|
19
|
-
)
|
20
|
-
},
|
21
|
-
)
|
22
|
-
|
23
|
-
OPERAND_FIELD_NAME = "operand"
|
24
|
-
CTRL_FIELD_NAME = "ctrl"
|
25
|
-
|
26
|
-
|
27
|
-
INVERT_OPERATOR = QuantumFunctionDeclaration(
|
28
|
-
name="invert",
|
29
|
-
operand_declarations={
|
30
|
-
OPERAND_FIELD_NAME: QuantumOperandDeclaration(name=OPERAND_FIELD_NAME)
|
31
|
-
},
|
32
|
-
)
|
33
|
-
|
34
|
-
|
35
|
-
CONTROL_OPERATOR = QuantumFunctionDeclaration(
|
36
|
-
name="control",
|
37
|
-
port_declarations={
|
38
|
-
CTRL_FIELD_NAME: PortDeclaration(
|
39
|
-
name=CTRL_FIELD_NAME,
|
40
|
-
direction=PortDeclarationDirection.Inout,
|
41
|
-
)
|
42
|
-
},
|
43
|
-
operand_declarations={
|
44
|
-
OPERAND_FIELD_NAME: QuantumOperandDeclaration(name=OPERAND_FIELD_NAME)
|
45
|
-
},
|
46
|
-
)
|
47
|
-
|
48
|
-
IF_OPERATOR = QuantumFunctionDeclaration(
|
49
|
-
name="if",
|
50
|
-
param_decls={"condition": Bool()},
|
51
|
-
operand_declarations={
|
52
|
-
"then": QuantumOperandDeclaration(name="then"),
|
53
|
-
"else": QuantumOperandDeclaration(name="else"),
|
54
|
-
},
|
55
|
-
)
|
56
|
-
|
57
|
-
SWITCH_OPERATOR = QuantumFunctionDeclaration(
|
58
|
-
name="switch",
|
59
|
-
param_decls={"selector": Integer()},
|
60
|
-
operand_declarations={
|
61
|
-
"cases": QuantumOperandDeclaration(
|
62
|
-
name="cases",
|
63
|
-
is_list=True,
|
64
|
-
)
|
65
|
-
},
|
66
|
-
)
|
67
|
-
|
68
|
-
|
69
|
-
JOIN_OPERATOR = QuantumFunctionDeclaration(
|
70
|
-
name="join",
|
71
|
-
port_declarations={
|
72
|
-
"in1": PortDeclaration(name="in1", direction="input"),
|
73
|
-
"in2": PortDeclaration(name="in2", direction="input"),
|
74
|
-
"out": PortDeclaration(
|
75
|
-
name="out",
|
76
|
-
direction="output",
|
77
|
-
size=Expression(expr="len(in1)+len(in2)"),
|
78
|
-
),
|
79
|
-
},
|
80
|
-
)
|
81
|
-
|
82
|
-
|
83
|
-
SPLIT_OPERATOR = QuantumFunctionDeclaration(
|
84
|
-
name="split",
|
85
|
-
param_decls={"out1_size": Integer(), "out2_size": Integer()},
|
86
|
-
port_declarations={
|
87
|
-
"in": PortDeclaration(
|
88
|
-
name="in",
|
89
|
-
direction="input",
|
90
|
-
size=Expression(expr="out1_size+out2_size"),
|
91
|
-
),
|
92
|
-
"out1": PortDeclaration(
|
93
|
-
name="out1", direction="output", size=Expression(expr="out1_size")
|
94
|
-
),
|
95
|
-
"out2": PortDeclaration(
|
96
|
-
name="out2", direction="output", size=Expression(expr="out2_size")
|
97
|
-
),
|
98
|
-
},
|
99
|
-
)
|
100
|
-
|
101
|
-
|
102
|
-
PERMUTE_OPERATOR = QuantumFunctionDeclaration(
|
103
|
-
name="permute",
|
104
|
-
operand_declarations={
|
105
|
-
"functions": QuantumOperandDeclaration(
|
106
|
-
name="functions",
|
107
|
-
is_list=True,
|
108
|
-
)
|
109
|
-
},
|
110
|
-
)
|
111
|
-
|
112
|
-
|
113
|
-
POWER_OPERATOR = QuantumFunctionDeclaration(
|
114
|
-
name="power",
|
115
|
-
param_decls={"power": Integer()},
|
116
|
-
operand_declarations={
|
117
|
-
OPERAND_FIELD_NAME: QuantumOperandDeclaration(name=OPERAND_FIELD_NAME)
|
118
|
-
},
|
119
|
-
)
|
120
|
-
|
121
|
-
APPLY = QuantumFunctionDeclaration(
|
122
|
-
name="apply",
|
123
|
-
operand_declarations={
|
124
|
-
OPERAND_FIELD_NAME: QuantumOperandDeclaration(
|
125
|
-
name=OPERAND_FIELD_NAME,
|
126
|
-
)
|
127
|
-
},
|
128
|
-
)
|
129
|
-
|
130
|
-
|
131
|
-
COMPUTE = QuantumFunctionDeclaration(
|
132
|
-
name="compute",
|
133
|
-
operand_declarations={
|
134
|
-
OPERAND_FIELD_NAME: QuantumOperandDeclaration(
|
135
|
-
name=OPERAND_FIELD_NAME,
|
136
|
-
)
|
137
|
-
},
|
138
|
-
)
|
139
|
-
|
140
|
-
|
141
|
-
UNCOMPUTE = QuantumFunctionDeclaration(
|
142
|
-
name="uncompute",
|
143
|
-
operand_declarations={
|
144
|
-
OPERAND_FIELD_NAME: QuantumOperandDeclaration(
|
145
|
-
name=OPERAND_FIELD_NAME,
|
146
|
-
)
|
147
|
-
},
|
148
|
-
)
|
149
|
-
|
150
|
-
|
151
|
-
BUILTIN_QUANTUM_OPERATOR_LIST = [
|
152
|
-
REPEAT_OPERATOR,
|
153
|
-
INVERT_OPERATOR,
|
154
|
-
CONTROL_OPERATOR,
|
155
|
-
IF_OPERATOR,
|
156
|
-
SWITCH_OPERATOR,
|
157
|
-
JOIN_OPERATOR,
|
158
|
-
SPLIT_OPERATOR,
|
159
|
-
PERMUTE_OPERATOR,
|
160
|
-
POWER_OPERATOR,
|
161
|
-
APPLY,
|
162
|
-
COMPUTE,
|
163
|
-
UNCOMPUTE,
|
164
|
-
]
|
165
|
-
|
166
|
-
|
167
|
-
QuantumFunctionDeclaration.BUILTIN_FUNCTION_DECLARATIONS.update(
|
168
|
-
nameables_to_dict(BUILTIN_QUANTUM_OPERATOR_LIST)
|
169
|
-
)
|
@@ -1,106 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from typing import Any, Dict, List, NoReturn, Optional, Tuple, Union
|
4
|
-
|
5
|
-
import pydantic
|
6
|
-
|
7
|
-
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
8
|
-
from classiq.interface.generator.function_params import ArithmeticIODict, IOName
|
9
|
-
from classiq.interface.generator.functions.function_implementation import (
|
10
|
-
FunctionImplementation,
|
11
|
-
)
|
12
|
-
from classiq.interface.generator.functions.port_declaration import (
|
13
|
-
SynthesisPortDeclaration,
|
14
|
-
)
|
15
|
-
from classiq.interface.generator.functions.quantum_function_declaration import (
|
16
|
-
SynthesisQuantumFunctionDeclaration,
|
17
|
-
)
|
18
|
-
from classiq.interface.generator.functions.register import Register
|
19
|
-
from classiq.interface.generator.functions.register_mapping_data import (
|
20
|
-
RegisterMappingData,
|
21
|
-
)
|
22
|
-
|
23
|
-
ImplementationsType = Tuple[FunctionImplementation, ...]
|
24
|
-
|
25
|
-
|
26
|
-
class SynthesisForeignFunctionDefinition(SynthesisQuantumFunctionDeclaration):
|
27
|
-
"""
|
28
|
-
Facilitates the creation of a user-defined elementary function
|
29
|
-
|
30
|
-
This class sets extra to forbid so that it can be used in a Union and not "steal"
|
31
|
-
objects from other classes.
|
32
|
-
"""
|
33
|
-
|
34
|
-
register_mapping: RegisterMappingData = pydantic.Field(
|
35
|
-
default_factory=RegisterMappingData,
|
36
|
-
description="The PortDirection data that is common to all implementations of the function",
|
37
|
-
)
|
38
|
-
implementations: Optional[ImplementationsType] = pydantic.Field(
|
39
|
-
description="The implementations of the custom function",
|
40
|
-
)
|
41
|
-
|
42
|
-
@pydantic.validator("register_mapping")
|
43
|
-
def _validate_register_mapping(
|
44
|
-
cls, register_mapping: RegisterMappingData
|
45
|
-
) -> RegisterMappingData:
|
46
|
-
if not register_mapping.output_registers:
|
47
|
-
raise ValueError("The outputs of a custom function must be non-empty")
|
48
|
-
return register_mapping
|
49
|
-
|
50
|
-
@pydantic.validator("implementations", pre=True)
|
51
|
-
def _parse_implementations(
|
52
|
-
cls,
|
53
|
-
implementations: Optional[Union[ImplementationsType, FunctionImplementation]],
|
54
|
-
) -> Optional[ImplementationsType]:
|
55
|
-
if isinstance(implementations, FunctionImplementation):
|
56
|
-
return (implementations,)
|
57
|
-
|
58
|
-
return implementations
|
59
|
-
|
60
|
-
@pydantic.validator("implementations")
|
61
|
-
def _validate_implementations(
|
62
|
-
cls,
|
63
|
-
implementations: Optional[ImplementationsType],
|
64
|
-
values: Dict[str, Any],
|
65
|
-
) -> Optional[ImplementationsType]:
|
66
|
-
if not implementations:
|
67
|
-
raise ValueError(
|
68
|
-
"The implementations of a custom function must be non-empty."
|
69
|
-
)
|
70
|
-
|
71
|
-
register_mapping = values.get("register_mapping")
|
72
|
-
assert isinstance(register_mapping, RegisterMappingData)
|
73
|
-
for impl in implementations:
|
74
|
-
impl.validate_ranges_of_all_registers(register_mapping=register_mapping)
|
75
|
-
|
76
|
-
return implementations
|
77
|
-
|
78
|
-
@property
|
79
|
-
def inputs(self) -> ArithmeticIODict:
|
80
|
-
return _map_reg_user_input(self.register_mapping.input_registers)
|
81
|
-
|
82
|
-
@property
|
83
|
-
def outputs(self) -> ArithmeticIODict:
|
84
|
-
return _map_reg_user_input(self.register_mapping.output_registers)
|
85
|
-
|
86
|
-
def renamed(self, new_name: str) -> SynthesisForeignFunctionDefinition:
|
87
|
-
return SynthesisForeignFunctionDefinition(
|
88
|
-
name=new_name,
|
89
|
-
implementations=self.implementations,
|
90
|
-
register_mapping=self.register_mapping,
|
91
|
-
)
|
92
|
-
|
93
|
-
@property
|
94
|
-
def port_declarations(self) -> Dict[IOName, SynthesisPortDeclaration]:
|
95
|
-
raise ValueError("Bad usage of foreign function definition: port_declarations")
|
96
|
-
|
97
|
-
@port_declarations.setter
|
98
|
-
def port_declarations(self, value: Any) -> NoReturn:
|
99
|
-
raise ValueError("Bad usage of foreign function definition: port_declarations")
|
100
|
-
|
101
|
-
|
102
|
-
def _map_reg_user_input(registers: List[Register]) -> ArithmeticIODict:
|
103
|
-
return {
|
104
|
-
reg.name: RegisterUserInput(size=len(reg.qubits), name=reg.name)
|
105
|
-
for reg in registers
|
106
|
-
}
|
@@ -1,103 +0,0 @@
|
|
1
|
-
from itertools import chain
|
2
|
-
from typing import Optional, Tuple, Union
|
3
|
-
|
4
|
-
import pydantic
|
5
|
-
from pydantic import BaseModel
|
6
|
-
|
7
|
-
from classiq.interface.generator.functions.register import Register
|
8
|
-
from classiq.interface.generator.functions.register_mapping_data import (
|
9
|
-
RegisterMappingData,
|
10
|
-
)
|
11
|
-
from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
|
12
|
-
|
13
|
-
RegistersStrictType = Tuple[Register, ...]
|
14
|
-
RegistersType = Union[Register, RegistersStrictType]
|
15
|
-
|
16
|
-
|
17
|
-
def to_tuple(reg_type: RegistersType) -> RegistersStrictType:
|
18
|
-
if isinstance(reg_type, Register):
|
19
|
-
return (reg_type,)
|
20
|
-
else:
|
21
|
-
return reg_type
|
22
|
-
|
23
|
-
|
24
|
-
class FunctionImplementation(BaseModel):
|
25
|
-
"""
|
26
|
-
Facilitates the creation of a user-defined custom function implementation
|
27
|
-
"""
|
28
|
-
|
29
|
-
class Config:
|
30
|
-
validate_all = True
|
31
|
-
extra = "forbid"
|
32
|
-
|
33
|
-
name: Optional[PydanticNonEmptyString] = pydantic.Field(
|
34
|
-
default=None,
|
35
|
-
description="The name of the custom implementation",
|
36
|
-
)
|
37
|
-
|
38
|
-
serialized_circuit: PydanticNonEmptyString = pydantic.Field(
|
39
|
-
description="The QASM code of the custom function implementation",
|
40
|
-
)
|
41
|
-
|
42
|
-
auxiliary_registers: RegistersStrictType = pydantic.Field(
|
43
|
-
default_factory=tuple,
|
44
|
-
description="A tuple of auxiliary registers to the custom implementation",
|
45
|
-
)
|
46
|
-
|
47
|
-
def num_qubits_in_all_registers(self, register_mapping: RegisterMappingData) -> int:
|
48
|
-
all_input_registers = (
|
49
|
-
register_mapping.input_registers
|
50
|
-
+ register_mapping.zero_input_registers
|
51
|
-
+ list(self.auxiliary_registers)
|
52
|
-
)
|
53
|
-
input_qubits = set(
|
54
|
-
chain.from_iterable(register.qubits for register in all_input_registers)
|
55
|
-
)
|
56
|
-
return len(input_qubits)
|
57
|
-
|
58
|
-
@pydantic.validator(
|
59
|
-
"auxiliary_registers",
|
60
|
-
pre=True,
|
61
|
-
always=True,
|
62
|
-
)
|
63
|
-
def validate_all_registers_are_tuples(
|
64
|
-
cls,
|
65
|
-
registers: RegistersType,
|
66
|
-
) -> RegistersStrictType:
|
67
|
-
if isinstance(registers, Register):
|
68
|
-
return (registers,)
|
69
|
-
return registers
|
70
|
-
|
71
|
-
def validate_ranges_of_all_registers(
|
72
|
-
self, register_mapping: RegisterMappingData
|
73
|
-
) -> None:
|
74
|
-
input_registers = register_mapping.input_registers
|
75
|
-
output_registers = register_mapping.output_registers
|
76
|
-
zero_input_registers = register_mapping.zero_input_registers
|
77
|
-
auxiliary_registers = list(self.auxiliary_registers)
|
78
|
-
|
79
|
-
all_input_registers = (
|
80
|
-
input_registers + zero_input_registers + auxiliary_registers
|
81
|
-
)
|
82
|
-
input_qubits = set(
|
83
|
-
chain.from_iterable(register.qubits for register in all_input_registers)
|
84
|
-
)
|
85
|
-
num_qubits = len(input_qubits)
|
86
|
-
all_qubits = set(range(num_qubits))
|
87
|
-
if num_qubits != sum(register.width for register in all_input_registers):
|
88
|
-
raise ValueError("The input registers must not overlap.")
|
89
|
-
if input_qubits != all_qubits:
|
90
|
-
raise ValueError(
|
91
|
-
"The set of qubits contained in all registers must be consecutive."
|
92
|
-
)
|
93
|
-
|
94
|
-
all_output_registers = output_registers + auxiliary_registers
|
95
|
-
output_qubits = set(
|
96
|
-
chain.from_iterable(register.qubits for register in all_output_registers)
|
97
|
-
)
|
98
|
-
if len(output_qubits) != sum(
|
99
|
-
register.width for register in all_output_registers
|
100
|
-
):
|
101
|
-
raise ValueError("The output registers must not overlap.")
|
102
|
-
if not output_qubits == all_qubits:
|
103
|
-
raise ValueError("The input and output qubits must be mutually consistent.")
|
@@ -1,153 +0,0 @@
|
|
1
|
-
from typing import Any, Dict, List, Optional
|
2
|
-
|
3
|
-
import pydantic
|
4
|
-
|
5
|
-
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
|
-
from classiq.interface.generator.function_params import IOName, PortDirection
|
7
|
-
from classiq.interface.generator.functions.port_declaration import (
|
8
|
-
SynthesisPortDeclaration,
|
9
|
-
)
|
10
|
-
from classiq.interface.generator.functions.quantum_function_declaration import (
|
11
|
-
SynthesisQuantumFunctionDeclaration,
|
12
|
-
)
|
13
|
-
from classiq.interface.generator.quantum_function_call import (
|
14
|
-
SynthesisQuantumFunctionCall,
|
15
|
-
WireDict,
|
16
|
-
WireName,
|
17
|
-
)
|
18
|
-
from classiq.interface.generator.validations import flow_graph
|
19
|
-
|
20
|
-
LOGIC_FLOW_DUPLICATE_NAME_ERROR_MSG = (
|
21
|
-
"Cannot have multiple function calls with the same name"
|
22
|
-
)
|
23
|
-
|
24
|
-
|
25
|
-
class IOData(pydantic.BaseModel):
|
26
|
-
wire: WireName = pydantic.Field(
|
27
|
-
description="The name of the wire of the PortDirection data."
|
28
|
-
)
|
29
|
-
reg: RegisterUserInput = pydantic.Field(
|
30
|
-
description="The register information about the PortDirection data."
|
31
|
-
)
|
32
|
-
|
33
|
-
class Config:
|
34
|
-
frozen = True
|
35
|
-
|
36
|
-
|
37
|
-
class SynthesisNativeFunctionDefinition(SynthesisQuantumFunctionDeclaration):
|
38
|
-
"""
|
39
|
-
Facilitates the creation of a user-defined composite function
|
40
|
-
|
41
|
-
This class sets extra to forbid so that it can be used in a Union and not "steal"
|
42
|
-
objects from other classes.
|
43
|
-
"""
|
44
|
-
|
45
|
-
input_ports_wiring: Dict[IOName, WireName] = pydantic.Field(
|
46
|
-
description="The mapping between the functions input ports, to inner wires",
|
47
|
-
default_factory=dict,
|
48
|
-
)
|
49
|
-
|
50
|
-
output_ports_wiring: Dict[IOName, WireName] = pydantic.Field(
|
51
|
-
description="The mapping between the functions output ports, to inner wires",
|
52
|
-
default_factory=dict,
|
53
|
-
)
|
54
|
-
|
55
|
-
body: List[SynthesisQuantumFunctionCall] = pydantic.Field(
|
56
|
-
default_factory=list, description="List of function calls to perform."
|
57
|
-
)
|
58
|
-
|
59
|
-
def validate_body(self) -> None:
|
60
|
-
function_call_names = {call.name for call in self.body}
|
61
|
-
if len(function_call_names) != len(self.body):
|
62
|
-
raise ValueError(LOGIC_FLOW_DUPLICATE_NAME_ERROR_MSG)
|
63
|
-
flow_graph.validate_legal_wiring(
|
64
|
-
self.body,
|
65
|
-
flow_input_names=list(self.input_ports_wiring.values()),
|
66
|
-
flow_output_names=list(self.output_ports_wiring.values()),
|
67
|
-
)
|
68
|
-
flow_graph.validate_acyclic_logic_flow(
|
69
|
-
self.body,
|
70
|
-
flow_input_names=list(self.input_ports_wiring.values()),
|
71
|
-
flow_output_names=list(self.output_ports_wiring.values()),
|
72
|
-
)
|
73
|
-
|
74
|
-
@classmethod
|
75
|
-
def _validate_direction_ports(
|
76
|
-
cls,
|
77
|
-
port_declarations: Dict[IOName, SynthesisPortDeclaration],
|
78
|
-
directions_external_port_wiring: WireDict,
|
79
|
-
direction: PortDirection,
|
80
|
-
) -> None:
|
81
|
-
for io_name in directions_external_port_wiring:
|
82
|
-
if (
|
83
|
-
io_name not in port_declarations
|
84
|
-
or not port_declarations[io_name].direction == direction
|
85
|
-
):
|
86
|
-
raise ValueError(
|
87
|
-
f"The wired {direction} port {io_name!r} is not declared."
|
88
|
-
)
|
89
|
-
|
90
|
-
@pydantic.root_validator
|
91
|
-
def validate_ports(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
92
|
-
port_declarations: Optional[Dict[IOName, SynthesisPortDeclaration]] = (
|
93
|
-
values.get("port_declarations")
|
94
|
-
)
|
95
|
-
if port_declarations is None:
|
96
|
-
return values
|
97
|
-
cls._validate_direction_ports(
|
98
|
-
port_declarations,
|
99
|
-
values.get("input_ports_wiring", dict()),
|
100
|
-
PortDirection.Input,
|
101
|
-
)
|
102
|
-
cls._validate_direction_ports(
|
103
|
-
port_declarations,
|
104
|
-
values.get("output_ports_wiring", dict()),
|
105
|
-
PortDirection.Output,
|
106
|
-
)
|
107
|
-
return values
|
108
|
-
|
109
|
-
@pydantic.validator("input_ports_wiring", always=True)
|
110
|
-
def _populate_input_ports_wiring(
|
111
|
-
cls, input_ports_wiring: Dict[IOName, WireName], values: Dict[str, Any]
|
112
|
-
) -> Dict[IOName, WireName]:
|
113
|
-
return _validate_ports_wiring_for_direction(
|
114
|
-
input_ports_wiring, values, PortDirection.Input
|
115
|
-
)
|
116
|
-
|
117
|
-
@pydantic.validator("output_ports_wiring", always=True)
|
118
|
-
def _populate_output_ports_wiring(
|
119
|
-
cls, output_ports_wiring: Dict[IOName, WireName], values: Dict[str, Any]
|
120
|
-
) -> Dict[IOName, WireName]:
|
121
|
-
return _validate_ports_wiring_for_direction(
|
122
|
-
output_ports_wiring, values, PortDirection.Output
|
123
|
-
)
|
124
|
-
|
125
|
-
|
126
|
-
def _get_single_port_wiring(
|
127
|
-
ports_wiring: Dict[IOName, WireName], name: str, direction: PortDirection
|
128
|
-
) -> WireName:
|
129
|
-
direction_id = "out" if direction == PortDirection.Output else "in"
|
130
|
-
return ports_wiring.get(name) or f"{name}_{direction_id}"
|
131
|
-
|
132
|
-
|
133
|
-
def _port_declarations_to_wiring(
|
134
|
-
ports_wiring: Dict[IOName, WireName],
|
135
|
-
port_decls: Dict[IOName, SynthesisPortDeclaration],
|
136
|
-
direction: PortDirection,
|
137
|
-
) -> Dict[IOName, WireName]:
|
138
|
-
return {
|
139
|
-
name: _get_single_port_wiring(ports_wiring, name, direction)
|
140
|
-
for name, port in port_decls.items()
|
141
|
-
if port.direction.includes_port_direction(direction)
|
142
|
-
}
|
143
|
-
|
144
|
-
|
145
|
-
def _validate_ports_wiring_for_direction(
|
146
|
-
ports_wiring: Dict[IOName, WireName],
|
147
|
-
values: Dict[str, Any],
|
148
|
-
direction: PortDirection,
|
149
|
-
) -> Dict[IOName, WireName]:
|
150
|
-
port_decls = values.get("port_declarations")
|
151
|
-
if port_decls is None:
|
152
|
-
return ports_wiring
|
153
|
-
return _port_declarations_to_wiring(ports_wiring, port_decls, direction)
|
@@ -1,69 +0,0 @@
|
|
1
|
-
from typing import Dict, Set
|
2
|
-
|
3
|
-
import pydantic
|
4
|
-
from pydantic import BaseModel
|
5
|
-
|
6
|
-
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
7
|
-
from classiq.interface.generator.function_params import (
|
8
|
-
ArithmeticIODict,
|
9
|
-
IOName,
|
10
|
-
PortDirection,
|
11
|
-
)
|
12
|
-
from classiq.interface.generator.functions.port_declaration import (
|
13
|
-
SynthesisPortDeclaration,
|
14
|
-
)
|
15
|
-
from classiq.interface.helpers.validation_helpers import validate_nameables_mapping
|
16
|
-
|
17
|
-
|
18
|
-
class SynthesisQuantumFunctionDeclaration(BaseModel):
|
19
|
-
"""
|
20
|
-
Facilitates the creation of a common quantum function interface object.
|
21
|
-
"""
|
22
|
-
|
23
|
-
name: str = pydantic.Field(description="The name of the function")
|
24
|
-
|
25
|
-
port_declarations: Dict[IOName, SynthesisPortDeclaration] = pydantic.Field(
|
26
|
-
description="The input and output ports of the function.",
|
27
|
-
default_factory=dict,
|
28
|
-
)
|
29
|
-
|
30
|
-
@property
|
31
|
-
def input_set(self) -> Set[IOName]:
|
32
|
-
return set(self.inputs.keys())
|
33
|
-
|
34
|
-
@property
|
35
|
-
def output_set(self) -> Set[IOName]:
|
36
|
-
return set(self.outputs.keys())
|
37
|
-
|
38
|
-
@property
|
39
|
-
def inputs(self) -> ArithmeticIODict:
|
40
|
-
return _ports_to_registers(self.port_declarations, PortDirection.Input)
|
41
|
-
|
42
|
-
@property
|
43
|
-
def outputs(self) -> ArithmeticIODict:
|
44
|
-
return _ports_to_registers(self.port_declarations, PortDirection.Output)
|
45
|
-
|
46
|
-
@pydantic.validator("port_declarations")
|
47
|
-
def _validate_port_declarations_names(
|
48
|
-
cls, port_declarations: Dict[IOName, SynthesisPortDeclaration]
|
49
|
-
) -> Dict[IOName, SynthesisPortDeclaration]:
|
50
|
-
validate_nameables_mapping(port_declarations, "Port")
|
51
|
-
return port_declarations
|
52
|
-
|
53
|
-
class Config:
|
54
|
-
extra = pydantic.Extra.forbid
|
55
|
-
|
56
|
-
|
57
|
-
def _ports_to_registers(
|
58
|
-
port_declarations: Dict[IOName, SynthesisPortDeclaration], direction: PortDirection
|
59
|
-
) -> ArithmeticIODict:
|
60
|
-
return {
|
61
|
-
name: RegisterUserInput(
|
62
|
-
name=name,
|
63
|
-
size=port_decl.size,
|
64
|
-
is_signed=port_decl.is_signed,
|
65
|
-
fraction_places=port_decl.fraction_places,
|
66
|
-
)
|
67
|
-
for name, port_decl in port_declarations.items()
|
68
|
-
if port_decl.direction.includes_port_direction(direction)
|
69
|
-
}
|
@@ -1,42 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from operator import attrgetter
|
4
|
-
from typing import Iterable, Tuple
|
5
|
-
|
6
|
-
import pydantic
|
7
|
-
from pydantic import BaseModel
|
8
|
-
|
9
|
-
from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
|
10
|
-
|
11
|
-
QubitsType = Tuple[pydantic.NonNegativeInt, ...]
|
12
|
-
|
13
|
-
|
14
|
-
class Register(BaseModel):
|
15
|
-
"""
|
16
|
-
A user-defined custom register.
|
17
|
-
"""
|
18
|
-
|
19
|
-
name: PydanticNonEmptyString = pydantic.Field(
|
20
|
-
description="The name of the custom register",
|
21
|
-
)
|
22
|
-
|
23
|
-
qubits: QubitsType = pydantic.Field(
|
24
|
-
description="A tuple of qubits as integers as indexed within a custom function code",
|
25
|
-
)
|
26
|
-
|
27
|
-
@property
|
28
|
-
def width(self) -> pydantic.PositiveInt:
|
29
|
-
"""The number of qubits of the custom register"""
|
30
|
-
return len(self.qubits)
|
31
|
-
|
32
|
-
@pydantic.validator("qubits")
|
33
|
-
def validate_qubits(cls, qubits: QubitsType) -> QubitsType:
|
34
|
-
if len(qubits) == 0:
|
35
|
-
raise ValueError("qubits field must be non-empty.")
|
36
|
-
if len(set(qubits)) != len(qubits):
|
37
|
-
raise ValueError("All qubits of a register must be distinct.")
|
38
|
-
return qubits
|
39
|
-
|
40
|
-
|
41
|
-
def get_register_names(reg_list: Iterable[Register]) -> Iterable[str]:
|
42
|
-
return map(attrgetter("name"), reg_list)
|