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,7 +1,9 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Optional
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic_core.core_schema import ValidationInfo
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
8
|
from classiq.interface.generator.control_state import ControlState
|
7
9
|
from classiq.interface.generator.function_params import FunctionParams
|
@@ -15,50 +17,57 @@ class Mcx(FunctionParams):
|
|
15
17
|
multi-controlled x-gate
|
16
18
|
"""
|
17
19
|
|
18
|
-
arguments:
|
20
|
+
arguments: list[RegisterUserInput] = pydantic.Field(
|
19
21
|
default_factory=list, description="registers describing the state (ordered)"
|
20
22
|
)
|
21
23
|
num_ctrl_qubits: Optional[pydantic.PositiveInt] = pydantic.Field(
|
22
|
-
description="number of control qubits"
|
24
|
+
description="number of control qubits",
|
25
|
+
default=None,
|
26
|
+
)
|
27
|
+
ctrl_state: str = pydantic.Field(
|
28
|
+
default="", description="control state string", validate_default=True
|
23
29
|
)
|
24
|
-
ctrl_state: str = pydantic.Field(default="", description="control state string")
|
25
30
|
|
26
|
-
@pydantic.
|
31
|
+
@pydantic.field_validator("arguments")
|
32
|
+
@classmethod
|
27
33
|
def _validate_argument_names(
|
28
|
-
cls, arguments:
|
29
|
-
) ->
|
30
|
-
register_name_list:
|
34
|
+
cls, arguments: list[RegisterUserInput]
|
35
|
+
) -> list[RegisterUserInput]:
|
36
|
+
register_name_list: list[Optional[str]] = [arg.name for arg in arguments]
|
31
37
|
if None in register_name_list:
|
32
|
-
raise
|
38
|
+
raise ClassiqValueError("All registers must be named")
|
33
39
|
if len(set(register_name_list)) != len(register_name_list):
|
34
|
-
raise
|
40
|
+
raise ClassiqValueError("Registers must have distinct names")
|
35
41
|
return arguments
|
36
42
|
|
37
|
-
@pydantic.
|
38
|
-
|
43
|
+
@pydantic.model_validator(mode="before")
|
44
|
+
@classmethod
|
45
|
+
def _validate_sizes(cls, values: dict[str, Any]) -> dict[str, Any]:
|
39
46
|
arguments_size = sum(arg.size for arg in values.get("arguments", list()))
|
40
|
-
|
47
|
+
num_ctrl_qubits = values.get("num_ctrl_qubits")
|
41
48
|
if not num_ctrl_qubits:
|
42
49
|
num_ctrl_qubits = arguments_size - 1
|
43
50
|
|
44
51
|
if num_ctrl_qubits < 1:
|
45
|
-
raise
|
52
|
+
raise ClassiqValueError("Must have control qubits")
|
46
53
|
|
47
54
|
if arguments_size == 0:
|
48
55
|
ctrl_register = RegisterUserInput(size=num_ctrl_qubits, name=CTRL)
|
49
56
|
target_register = RegisterUserInput(size=1, name=TARGET_QUBIT)
|
50
57
|
values["arguments"] = [ctrl_register, target_register]
|
51
58
|
elif num_ctrl_qubits != arguments_size - 1:
|
52
|
-
raise
|
53
|
-
|
59
|
+
raise ClassiqValueError("Given sizes do not match")
|
60
|
+
values["num_ctrl_qubits"] = num_ctrl_qubits
|
61
|
+
return values
|
54
62
|
|
55
|
-
@pydantic.
|
56
|
-
|
57
|
-
|
63
|
+
@pydantic.field_validator("ctrl_state")
|
64
|
+
@classmethod
|
65
|
+
def _validate_ctrl_state(cls, ctrl_state: str, info: ValidationInfo) -> str:
|
66
|
+
num_ctrl_qubits = info.data.get("num_ctrl_qubits", -1)
|
58
67
|
if not ctrl_state:
|
59
68
|
return "1" * num_ctrl_qubits
|
60
69
|
if len(ctrl_state) != num_ctrl_qubits:
|
61
|
-
raise
|
70
|
+
raise ClassiqValueError(
|
62
71
|
"control state length should be equal to the number of control qubits"
|
63
72
|
)
|
64
73
|
ControlState.validate_control_string(ctrl_state)
|
@@ -1,20 +1,17 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
from classiq.interface.generator.model.constraints import (
|
4
2
|
Constraints,
|
5
3
|
OptimizationParameter,
|
6
4
|
TranspilerBasisGates,
|
7
5
|
)
|
8
|
-
from classiq.interface.generator.model.model import SynthesisModel
|
9
6
|
from classiq.interface.generator.model.preferences import (
|
10
7
|
CustomHardwareSettings,
|
11
8
|
Preferences,
|
12
9
|
)
|
13
10
|
|
14
|
-
__all__:
|
11
|
+
__all__: list[str] = [
|
15
12
|
"Constraints",
|
16
|
-
"Preferences",
|
17
13
|
"CustomHardwareSettings",
|
18
14
|
"OptimizationParameter",
|
15
|
+
"Preferences",
|
19
16
|
"TranspilerBasisGates",
|
20
17
|
]
|
@@ -1,13 +1,13 @@
|
|
1
1
|
from collections import defaultdict
|
2
|
-
from typing import
|
2
|
+
from typing import Optional, Union
|
3
3
|
|
4
4
|
import pydantic
|
5
|
-
from pydantic import BaseModel,
|
5
|
+
from pydantic import BaseModel, ConfigDict
|
6
6
|
|
7
|
+
from classiq.interface.enum_utils import StrEnum
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
7
9
|
from classiq.interface.generator.transpiler_basis_gates import TranspilerBasisGates
|
8
10
|
|
9
|
-
from classiq._internals.enum_utils import StrEnum
|
10
|
-
|
11
11
|
UNCONSTRAINED = -1
|
12
12
|
|
13
13
|
|
@@ -26,21 +26,40 @@ def optimization_parameter_type_from_string(param: str) -> OptimizationParameter
|
|
26
26
|
return enum_(param) # type: ignore[return-value]
|
27
27
|
except ValueError:
|
28
28
|
pass
|
29
|
-
raise
|
29
|
+
raise ClassiqValueError(f"Invalid OptimizationParameterType {param}")
|
30
30
|
|
31
31
|
|
32
|
-
class Constraints(BaseModel
|
32
|
+
class Constraints(BaseModel):
|
33
33
|
"""
|
34
|
-
|
34
|
+
Constraints for the quantum circuit synthesis engine.
|
35
|
+
|
36
|
+
This class is used to specify constraints such as maximum width, depth,
|
37
|
+
gate count, and optimization parameters for the synthesis engine,
|
38
|
+
guiding the generation of quantum circuits that satisfy these constraints.
|
39
|
+
|
40
|
+
Attributes:
|
41
|
+
max_width (int):
|
42
|
+
Maximum number of qubits allowed in the generated quantum circuit.
|
43
|
+
Defaults to `None`.
|
44
|
+
max_depth (int):
|
45
|
+
Maximum depth of the generated quantum circuit. Defaults to `None`.
|
46
|
+
max_gate_count (Dict[TranspilerBasisGates, int]):
|
47
|
+
A dictionary specifying the maximum allowed count for each type of gate
|
48
|
+
in the quantum circuit. Defaults to an empty dictionary.
|
49
|
+
optimization_parameter (OptimizationParameterType):
|
50
|
+
Determines if and how the synthesis engine should optimize
|
51
|
+
the solution. Defaults to `NO_OPTIMIZATION`. See `OptimizationParameterType`
|
35
52
|
"""
|
36
53
|
|
54
|
+
model_config = ConfigDict(extra="forbid")
|
55
|
+
|
37
56
|
max_width: Optional[pydantic.PositiveInt] = pydantic.Field(
|
38
57
|
default=None,
|
39
58
|
description="Maximum number of qubits in generated quantum circuit",
|
40
59
|
)
|
41
60
|
max_depth: Optional[pydantic.PositiveInt] = None
|
42
61
|
|
43
|
-
max_gate_count:
|
62
|
+
max_gate_count: dict[TranspilerBasisGates, pydantic.NonNegativeInt] = (
|
44
63
|
pydantic.Field(default_factory=lambda: defaultdict(int))
|
45
64
|
)
|
46
65
|
|
@@ -1,81 +1,44 @@
|
|
1
1
|
from abc import ABC
|
2
|
-
from typing import Any, Dict, List, Literal, Mapping, NewType, Optional, Union
|
3
2
|
|
4
3
|
import pydantic
|
5
4
|
|
5
|
+
from classiq.interface.exceptions import ClassiqValueError
|
6
6
|
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
7
7
|
from classiq.interface.generator.constant import Constant
|
8
|
-
from classiq.interface.generator.function_params import
|
9
|
-
from classiq.interface.generator.
|
10
|
-
|
11
|
-
SynthesisPortDeclaration,
|
12
|
-
SynthesisQuantumFunctionDeclaration,
|
13
|
-
)
|
14
|
-
from classiq.interface.generator.functions.port_declaration import (
|
15
|
-
PortDeclarationDirection,
|
16
|
-
)
|
17
|
-
from classiq.interface.generator.model.constraints import Constraints
|
18
|
-
from classiq.interface.generator.model.preferences.preferences import Preferences
|
19
|
-
from classiq.interface.generator.quantum_function_call import (
|
20
|
-
SUFFIX_RANDOMIZER,
|
21
|
-
SynthesisQuantumFunctionCall,
|
22
|
-
WireDict,
|
23
|
-
WireName,
|
24
|
-
)
|
25
|
-
from classiq.interface.generator.types.combinatorial_problem import (
|
26
|
-
CombinatorialOptimizationStructDeclaration,
|
27
|
-
)
|
8
|
+
from classiq.interface.generator.function_params import ArithmeticIODict
|
9
|
+
from classiq.interface.generator.types.enum_declaration import EnumDeclaration
|
10
|
+
from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
|
28
11
|
from classiq.interface.generator.types.struct_declaration import StructDeclaration
|
29
|
-
from classiq.interface.helpers.pydantic_model_helpers import (
|
30
|
-
get_discriminator_field,
|
31
|
-
nameables_to_dict,
|
32
|
-
)
|
33
12
|
from classiq.interface.helpers.validation_helpers import is_list_unique
|
34
13
|
from classiq.interface.helpers.versioned_model import VersionedModel
|
35
|
-
|
36
|
-
from classiq import ForeignFunctionDefinition as SynthesisForeignFunctionDefinition
|
37
|
-
from classiq.exceptions import ClassiqValueError
|
38
|
-
from classiq.quantum_register import QReg, QRegGenericAlias
|
39
|
-
|
40
|
-
MAIN_FUNCTION_NAME = "main"
|
41
|
-
CLASSICAL_ENTRY_FUNCTION_NAME = "cmain"
|
42
|
-
|
43
|
-
DEFAULT_PORT_SIZE = 1
|
44
|
-
|
45
|
-
|
46
|
-
SerializedModel = NewType("SerializedModel", str)
|
47
|
-
|
48
|
-
ConcreteStructDeclaration = Union[
|
49
|
-
CombinatorialOptimizationStructDeclaration, StructDeclaration
|
50
|
-
]
|
51
|
-
|
52
|
-
# We need to define ConcreteFunctionData so pydantic will know
|
53
|
-
# what class to use when deserializing from object (pydantic attempts to
|
54
|
-
# parse as each of the classes in the Union, in order).
|
55
|
-
ConcreteFunctionDefinition = Union[
|
56
|
-
SynthesisForeignFunctionDefinition, SynthesisNativeFunctionDefinition
|
57
|
-
]
|
14
|
+
from classiq.interface.model.quantum_type import RegisterQuantumTypeDict
|
58
15
|
|
59
16
|
TYPE_LIBRARY_DUPLICATED_TYPE_NAMES = (
|
60
17
|
"Cannot have multiple struct types with the same name"
|
61
18
|
)
|
62
19
|
|
63
20
|
|
64
|
-
def _create_default_functions() -> List[ConcreteFunctionDefinition]:
|
65
|
-
return [SynthesisNativeFunctionDefinition(name=MAIN_FUNCTION_NAME)]
|
66
|
-
|
67
|
-
|
68
21
|
class ClassiqBaseModel(VersionedModel, ABC):
|
69
22
|
"""
|
70
23
|
All the relevant data for evaluating execution in one place.
|
71
24
|
"""
|
72
25
|
|
73
|
-
|
26
|
+
enums: list[EnumDeclaration] = pydantic.Field(
|
27
|
+
default_factory=list,
|
28
|
+
description="user-defined enums",
|
29
|
+
)
|
30
|
+
|
31
|
+
types: list[StructDeclaration] = pydantic.Field(
|
74
32
|
default_factory=list,
|
75
|
-
description="
|
33
|
+
description="user-defined structs",
|
76
34
|
)
|
77
35
|
|
78
|
-
|
36
|
+
qstructs: list[QStructDeclaration] = pydantic.Field(
|
37
|
+
default_factory=list,
|
38
|
+
description="user-defined quantum structs",
|
39
|
+
)
|
40
|
+
|
41
|
+
constants: list[Constant] = pydantic.Field(
|
79
42
|
default_factory=list,
|
80
43
|
)
|
81
44
|
|
@@ -87,158 +50,24 @@ class ClassiqBaseModel(VersionedModel, ABC):
|
|
87
50
|
default_factory=ExecutionPreferences
|
88
51
|
)
|
89
52
|
|
90
|
-
@pydantic.
|
91
|
-
|
92
|
-
|
93
|
-
) -> List[ConcreteStructDeclaration]:
|
53
|
+
@pydantic.field_validator("types")
|
54
|
+
@classmethod
|
55
|
+
def types_validator(cls, types: list[StructDeclaration]) -> list[StructDeclaration]:
|
94
56
|
if not is_list_unique([struct_type.name for struct_type in types]):
|
95
|
-
raise
|
57
|
+
raise ClassiqValueError(TYPE_LIBRARY_DUPLICATED_TYPE_NAMES)
|
96
58
|
|
97
59
|
return types
|
98
60
|
|
99
61
|
|
100
62
|
class ExecutionModel(ClassiqBaseModel):
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
# Must be validated before logic_flow
|
112
|
-
functions: List[ConcreteFunctionDefinition] = pydantic.Field(
|
113
|
-
default_factory=_create_default_functions,
|
114
|
-
description="The quantum functions of the model.",
|
63
|
+
circuit_outputs: ArithmeticIODict = pydantic.Field(
|
64
|
+
description="Mapping between a measured register name and its arithmetic type",
|
65
|
+
default_factory=dict,
|
66
|
+
)
|
67
|
+
circuit_output_types: RegisterQuantumTypeDict = pydantic.Field(
|
68
|
+
description="Mapping between a measured register name and its qmod type",
|
69
|
+
default=dict(),
|
70
|
+
)
|
71
|
+
register_filter_bitstrings: dict[str, list[str]] = pydantic.Field(
|
72
|
+
default_factory=dict,
|
115
73
|
)
|
116
|
-
|
117
|
-
constraints: Constraints = pydantic.Field(default_factory=Constraints)
|
118
|
-
preferences: Preferences = pydantic.Field(default_factory=Preferences)
|
119
|
-
|
120
|
-
def __init__(
|
121
|
-
self,
|
122
|
-
*,
|
123
|
-
body: Optional[List[SynthesisQuantumFunctionCall]] = None,
|
124
|
-
inputs: Optional[WireDict] = None,
|
125
|
-
outputs: Optional[WireDict] = None,
|
126
|
-
**kwargs: Any,
|
127
|
-
) -> None:
|
128
|
-
super().__init__(**kwargs)
|
129
|
-
if body:
|
130
|
-
self.main_func.body.extend(body)
|
131
|
-
if inputs:
|
132
|
-
self.set_inputs(
|
133
|
-
{
|
134
|
-
name: QRegGenericAlias(
|
135
|
-
QReg(DEFAULT_PORT_SIZE), (DEFAULT_PORT_SIZE, 0)
|
136
|
-
)
|
137
|
-
for name in inputs.keys()
|
138
|
-
},
|
139
|
-
inputs,
|
140
|
-
)
|
141
|
-
if outputs:
|
142
|
-
self.set_outputs(
|
143
|
-
{name: QReg(DEFAULT_PORT_SIZE) for name in outputs.keys()}, outputs
|
144
|
-
)
|
145
|
-
|
146
|
-
@property
|
147
|
-
def main_func(self) -> SynthesisNativeFunctionDefinition:
|
148
|
-
return self.function_dict[MAIN_FUNCTION_NAME] # type:ignore[return-value]
|
149
|
-
|
150
|
-
@property
|
151
|
-
def body(self) -> List[SynthesisQuantumFunctionCall]:
|
152
|
-
return self.main_func.body
|
153
|
-
|
154
|
-
@property
|
155
|
-
def inputs(self) -> WireDict:
|
156
|
-
return self.main_func.input_ports_wiring
|
157
|
-
|
158
|
-
def set_inputs(
|
159
|
-
self,
|
160
|
-
inputs: Mapping[IOName, QRegGenericAlias],
|
161
|
-
input_wiring: Mapping[IOName, WireName],
|
162
|
-
) -> None:
|
163
|
-
self._update_main_declarations(inputs, PortDeclarationDirection.Input)
|
164
|
-
self.main_func.input_ports_wiring.update(input_wiring)
|
165
|
-
|
166
|
-
@property
|
167
|
-
def outputs(self) -> WireDict:
|
168
|
-
return self.main_func.output_ports_wiring
|
169
|
-
|
170
|
-
def set_outputs(
|
171
|
-
self, outputs: Mapping[IOName, QReg], output_wiring: Mapping[IOName, WireName]
|
172
|
-
) -> None:
|
173
|
-
self._update_main_declarations(outputs, PortDeclarationDirection.Output)
|
174
|
-
self.main_func.output_ports_wiring.update(output_wiring)
|
175
|
-
|
176
|
-
@pydantic.validator("preferences", always=True)
|
177
|
-
def _seed_suffix_randomizer(cls, preferences: Preferences) -> Preferences:
|
178
|
-
SUFFIX_RANDOMIZER.seed(preferences.random_seed)
|
179
|
-
return preferences
|
180
|
-
|
181
|
-
def _get_qualified_direction(
|
182
|
-
self, port_name: str, direction: PortDeclarationDirection
|
183
|
-
) -> PortDeclarationDirection:
|
184
|
-
if port_name in self.main_func.port_declarations:
|
185
|
-
return PortDeclarationDirection.Inout
|
186
|
-
return direction
|
187
|
-
|
188
|
-
def _update_main_declarations(
|
189
|
-
self,
|
190
|
-
value: Union[Mapping[IOName, QReg], Mapping[IOName, QRegGenericAlias]],
|
191
|
-
direction: PortDeclarationDirection,
|
192
|
-
) -> None:
|
193
|
-
for port_name, register in value.items():
|
194
|
-
if isinstance(register, QReg):
|
195
|
-
size = len(register)
|
196
|
-
is_signed = getattr(register, "is_signed", False) or False
|
197
|
-
fraction_places = getattr(register, "fraction_places", 0) or 0
|
198
|
-
else:
|
199
|
-
size = register.size if register.size is not None else DEFAULT_PORT_SIZE
|
200
|
-
is_signed = False
|
201
|
-
fraction_places = (
|
202
|
-
register.fraction_places
|
203
|
-
if register.fraction_places is not None
|
204
|
-
else 0
|
205
|
-
)
|
206
|
-
|
207
|
-
self.main_func.port_declarations[port_name] = SynthesisPortDeclaration(
|
208
|
-
name=port_name,
|
209
|
-
size=size,
|
210
|
-
direction=self._get_qualified_direction(port_name, direction),
|
211
|
-
is_signed=is_signed,
|
212
|
-
fraction_places=fraction_places,
|
213
|
-
)
|
214
|
-
|
215
|
-
@property
|
216
|
-
def function_dict(self) -> Dict[str, SynthesisQuantumFunctionDeclaration]:
|
217
|
-
return nameables_to_dict(self.functions)
|
218
|
-
|
219
|
-
@pydantic.validator("functions", each_item=True)
|
220
|
-
def validate_static_correctness(
|
221
|
-
cls, func_def: ConcreteFunctionDefinition
|
222
|
-
) -> ConcreteFunctionDefinition:
|
223
|
-
if isinstance(func_def, SynthesisNativeFunctionDefinition):
|
224
|
-
func_def.validate_body()
|
225
|
-
return func_def
|
226
|
-
|
227
|
-
@pydantic.validator("functions")
|
228
|
-
def validate_main_function_exists(
|
229
|
-
cls, func_defs: List[ConcreteFunctionDefinition]
|
230
|
-
) -> List[ConcreteFunctionDefinition]:
|
231
|
-
if MAIN_FUNCTION_NAME not in {func.name for func in func_defs}:
|
232
|
-
raise ClassiqValueError("The model must contain a `main` function")
|
233
|
-
return func_defs
|
234
|
-
|
235
|
-
def get_model(self) -> SerializedModel:
|
236
|
-
return SerializedModel(self.json(exclude_defaults=True, indent=2))
|
237
|
-
|
238
|
-
def classical_model(self) -> ExecutionModel:
|
239
|
-
return ExecutionModel(
|
240
|
-
types=self.types,
|
241
|
-
constants=self.constants,
|
242
|
-
classical_execution_code=self.classical_execution_code,
|
243
|
-
execution_preferences=self.execution_preferences,
|
244
|
-
)
|