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,6 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from typing import
|
3
|
+
from typing import Union
|
4
4
|
|
5
5
|
import pydantic
|
6
6
|
|
@@ -20,7 +20,7 @@ DEFAULT_POST_INPUT_NAME = "post_function_input"
|
|
20
20
|
|
21
21
|
class Finance(function_params.FunctionParams):
|
22
22
|
model: Union[GaussianModelInput, LogNormalModelInput] = pydantic.Field(
|
23
|
-
description="Load a financial model"
|
23
|
+
description="Load a financial model", discriminator="kind"
|
24
24
|
)
|
25
25
|
finance_function: FinanceFunctionInput = pydantic.Field(
|
26
26
|
description="The finance function to solve the model"
|
@@ -90,7 +90,7 @@ class FinancePayoff(function_params.FunctionParams):
|
|
90
90
|
description="The finance function to solve the model"
|
91
91
|
)
|
92
92
|
num_qubits: pydantic.PositiveInt
|
93
|
-
distribution_range:
|
93
|
+
distribution_range: tuple[float, float]
|
94
94
|
|
95
95
|
def _create_ios(self) -> None:
|
96
96
|
self._inputs = {
|
@@ -1,19 +1,19 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Iterable
|
2
2
|
|
3
3
|
from classiq.interface.generator.function_params import FunctionParams
|
4
4
|
|
5
5
|
|
6
6
|
class FunctionParamLibrary:
|
7
|
-
def __init__(self, param_list: Iterable[
|
8
|
-
self._param_list:
|
7
|
+
def __init__(self, param_list: Iterable[type[FunctionParams]]) -> None:
|
8
|
+
self._param_list: set[type[FunctionParams]] = set(param_list)
|
9
9
|
|
10
10
|
@property
|
11
|
-
def param_list(self) ->
|
11
|
+
def param_list(self) -> set[type[FunctionParams]]:
|
12
12
|
return self._param_list.copy()
|
13
13
|
|
14
14
|
# Private methods are for tests only
|
15
|
-
def _add(self, param:
|
15
|
+
def _add(self, param: type[FunctionParams]) -> None:
|
16
16
|
self._param_list.add(param)
|
17
17
|
|
18
|
-
def _remove(self, param:
|
18
|
+
def _remove(self, param: type[FunctionParams]) -> None:
|
19
19
|
self._param_list.discard(param)
|
@@ -28,8 +28,7 @@ from classiq.interface.generator.arith.unary_ops import BitwiseInvert, Negation,
|
|
28
28
|
from classiq.interface.generator.commuting_pauli_exponentiation import (
|
29
29
|
CommutingPauliExponentiation,
|
30
30
|
)
|
31
|
-
from classiq.interface.generator.
|
32
|
-
from classiq.interface.generator.credit_risk_example.weighted_adder import WeightedAdder
|
31
|
+
from classiq.interface.generator.copy import Copy
|
33
32
|
from classiq.interface.generator.entangler_params import (
|
34
33
|
GridEntangler,
|
35
34
|
HypercubeEntangler,
|
@@ -53,7 +52,6 @@ from classiq.interface.generator.hardware_efficient_ansatz import (
|
|
53
52
|
from classiq.interface.generator.hartree_fock import HartreeFock
|
54
53
|
from classiq.interface.generator.hva import HVA
|
55
54
|
from classiq.interface.generator.identity import Identity
|
56
|
-
from classiq.interface.generator.inequality_mixer import InequalityMixer
|
57
55
|
from classiq.interface.generator.linear_pauli_rotations import LinearPauliRotations
|
58
56
|
from classiq.interface.generator.mcu import Mcu
|
59
57
|
from classiq.interface.generator.mcx import Mcx
|
@@ -67,7 +65,6 @@ from classiq.interface.generator.piecewise_linear_amplitude_loading import (
|
|
67
65
|
from classiq.interface.generator.qft import QFT
|
68
66
|
from classiq.interface.generator.qsvm import QSVMFeatureMap
|
69
67
|
from classiq.interface.generator.randomized_benchmarking import RandomizedBenchmarking
|
70
|
-
from classiq.interface.generator.range_mixer import RangeMixer
|
71
68
|
from classiq.interface.generator.standard_gates.standard_gates_param_list import (
|
72
69
|
standard_gate_function_param_library,
|
73
70
|
)
|
@@ -81,7 +78,6 @@ from classiq.interface.generator.state_preparation import (
|
|
81
78
|
UniformDistributionStatePreparation,
|
82
79
|
WStatePreparation,
|
83
80
|
)
|
84
|
-
from classiq.interface.generator.state_propagator import StatePropagator
|
85
81
|
from classiq.interface.generator.ucc import UCC
|
86
82
|
from classiq.interface.generator.unitary_gate import UnitaryGate
|
87
83
|
from classiq.interface.generator.user_defined_function_params import CustomFunction
|
@@ -97,7 +93,6 @@ function_param_library_without_self_reference: FunctionParamLibrary = (
|
|
97
93
|
GHZStatePreparation,
|
98
94
|
WStatePreparation,
|
99
95
|
ExponentialStatePreparation,
|
100
|
-
StatePropagator,
|
101
96
|
QFT,
|
102
97
|
BitwiseAnd,
|
103
98
|
BitwiseOr,
|
@@ -134,11 +129,9 @@ function_param_library_without_self_reference: FunctionParamLibrary = (
|
|
134
129
|
CustomFunction,
|
135
130
|
HardwareEfficientAnsatz,
|
136
131
|
UnitaryGate,
|
137
|
-
WeightedAdder,
|
138
132
|
LinearPauliRotations,
|
139
133
|
Multiplier,
|
140
134
|
Power,
|
141
|
-
LinearGCI,
|
142
135
|
HartreeFock,
|
143
136
|
UCC,
|
144
137
|
Min,
|
@@ -150,14 +143,13 @@ function_param_library_without_self_reference: FunctionParamLibrary = (
|
|
150
143
|
Identity,
|
151
144
|
RandomizedBenchmarking,
|
152
145
|
HVA,
|
153
|
-
InequalityMixer,
|
154
|
-
RangeMixer,
|
155
146
|
UGate,
|
156
147
|
AmplitudeLoading,
|
157
148
|
QSVMFeatureMap,
|
158
149
|
PiecewiseLinearAmplitudeLoading,
|
159
150
|
PiecewiseLinearRotationAmplitudeLoading,
|
160
151
|
HadamardTransform,
|
152
|
+
Copy,
|
161
153
|
},
|
162
154
|
standard_gate_function_param_library.param_list,
|
163
155
|
oracle_function_param_library.param_list,
|
@@ -1,40 +1,35 @@
|
|
1
1
|
import ast
|
2
2
|
import itertools
|
3
3
|
import re
|
4
|
+
from collections.abc import Collection, Iterable, Mapping
|
4
5
|
from typing import (
|
6
|
+
Annotated,
|
5
7
|
Any,
|
6
|
-
Collection,
|
7
|
-
Dict,
|
8
|
-
Iterable,
|
9
|
-
List,
|
10
|
-
Mapping,
|
11
8
|
Optional,
|
12
|
-
Set,
|
13
|
-
Type,
|
14
9
|
Union,
|
15
10
|
get_args,
|
16
11
|
)
|
17
12
|
|
18
13
|
import pydantic
|
19
14
|
import sympy
|
20
|
-
from pydantic
|
15
|
+
from pydantic import BeforeValidator, ConfigDict
|
21
16
|
|
17
|
+
from classiq.interface.enum_utils import StrEnum
|
18
|
+
from classiq.interface.exceptions import ClassiqValueError
|
22
19
|
from classiq.interface.generator.arith.arithmetic_expression_validator import (
|
23
20
|
validate_expression,
|
24
21
|
)
|
25
22
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
26
|
-
from classiq.interface.generator.
|
23
|
+
from classiq.interface.generator.parameters import ParameterFloatType
|
27
24
|
from classiq.interface.helpers.custom_pydantic_types import PydanticNonEmptyString
|
28
25
|
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
29
26
|
HashablePydanticBaseModel,
|
30
27
|
)
|
31
28
|
|
32
|
-
from classiq._internals.enum_utils import StrEnum
|
33
|
-
|
34
29
|
FunctionParamsDiscriminator = str
|
35
30
|
|
36
31
|
IOName = PydanticNonEmptyString
|
37
|
-
ArithmeticIODict =
|
32
|
+
ArithmeticIODict = dict[IOName, RegisterArithmeticInfo]
|
38
33
|
|
39
34
|
DEFAULT_ZERO_NAME = "zero"
|
40
35
|
DEFAULT_OUTPUT_NAME = "OUT"
|
@@ -84,7 +79,6 @@ ExecutionExpressionSupportedNodeTypes = Union[
|
|
84
79
|
]
|
85
80
|
|
86
81
|
GenerationOnlyExpressionSupportedNodeTypes = Union[
|
87
|
-
ast.FloorDiv,
|
88
82
|
ast.Pow,
|
89
83
|
ast.List,
|
90
84
|
ast.Subscript,
|
@@ -96,6 +90,7 @@ GenerationOnlyExpressionSupportedNodeTypes = Union[
|
|
96
90
|
ast.Lt,
|
97
91
|
ast.LtE,
|
98
92
|
ast.Eq,
|
93
|
+
ast.NotEq,
|
99
94
|
ast.Call,
|
100
95
|
ast.Dict,
|
101
96
|
ast.Slice,
|
@@ -111,11 +106,9 @@ GenerationExpressionSupportedNodeTypes = Union[
|
|
111
106
|
ExecutionExpressionSupportedNodeTypes, GenerationOnlyExpressionSupportedNodeTypes
|
112
107
|
]
|
113
108
|
|
114
|
-
GenerationExpressionSupportedAttrSymbols = set(BUILTIN_ENUMS.keys())
|
115
|
-
|
116
109
|
|
117
110
|
def validate_expression_str(
|
118
|
-
expr_str: str, supported_functions: Optional[
|
111
|
+
expr_str: str, supported_functions: Optional[set[str]] = None
|
119
112
|
) -> None:
|
120
113
|
# By default, no functions are allowed.
|
121
114
|
supported_functions = supported_functions or set()
|
@@ -126,10 +119,25 @@ def validate_expression_str(
|
|
126
119
|
supported_nodes=get_args(GenerationExpressionSupportedNodeTypes),
|
127
120
|
expression_type="parameter",
|
128
121
|
supported_functions=supported_functions,
|
129
|
-
supported_attr_values=GenerationExpressionSupportedAttrSymbols,
|
130
122
|
)
|
131
123
|
|
132
124
|
|
125
|
+
def validate_parameters(value: Any) -> Any:
|
126
|
+
if isinstance(value, str):
|
127
|
+
validate_expression_str(value)
|
128
|
+
elif isinstance(value, sympy.Expr):
|
129
|
+
return str(value)
|
130
|
+
try:
|
131
|
+
return float(value)
|
132
|
+
except ValueError:
|
133
|
+
return value
|
134
|
+
|
135
|
+
|
136
|
+
FunctionParamsNumericParameter = Annotated[
|
137
|
+
ParameterFloatType, BeforeValidator(validate_parameters)
|
138
|
+
]
|
139
|
+
|
140
|
+
|
133
141
|
class PortDirection(StrEnum):
|
134
142
|
Input = "input"
|
135
143
|
Output = "output"
|
@@ -175,11 +183,11 @@ class FunctionParams(HashablePydanticBaseModel):
|
|
175
183
|
return sum(reg.size for reg in self.outputs.values())
|
176
184
|
|
177
185
|
@property
|
178
|
-
def _input_names(self) ->
|
186
|
+
def _input_names(self) -> list[IOName]:
|
179
187
|
return list(self._inputs.keys())
|
180
188
|
|
181
189
|
@property
|
182
|
-
def _output_names(self) ->
|
190
|
+
def _output_names(self) -> list[IOName]:
|
183
191
|
return list(self._outputs.keys())
|
184
192
|
|
185
193
|
def _create_zero_input_registers(self, names_and_sizes: Mapping[str, int]) -> None:
|
@@ -201,20 +209,6 @@ class FunctionParams(HashablePydanticBaseModel):
|
|
201
209
|
if self.discriminator() not in _UNVALIDATED_FUNCTIONS:
|
202
210
|
self._validate_total_io_sizes()
|
203
211
|
|
204
|
-
def is_field_param_type(self, name: str, param_type_signature: str) -> bool:
|
205
|
-
f = type(self).__fields__[name]
|
206
|
-
return isinstance(f, ModelField) and (
|
207
|
-
param_type_signature in f.field_info.extra
|
208
|
-
)
|
209
|
-
|
210
|
-
def is_field_gen_param(self, name: str) -> bool:
|
211
|
-
return self.is_field_param_type(
|
212
|
-
name, "is_gen_param"
|
213
|
-
) or self.is_field_exec_param(name)
|
214
|
-
|
215
|
-
def is_field_exec_param(self, name: str) -> bool:
|
216
|
-
return self.is_field_param_type(name, "is_exec_param")
|
217
|
-
|
218
212
|
def is_powerable(self, strict_zero_ios: bool = True) -> bool:
|
219
213
|
input_names = set(self.inputs_full(strict_zero_ios))
|
220
214
|
output_names = set(self._output_names)
|
@@ -238,12 +232,12 @@ class FunctionParams(HashablePydanticBaseModel):
|
|
238
232
|
return sum(reg.size if reg is not None else 0 for reg in registers)
|
239
233
|
|
240
234
|
def _validate_io_names(self) -> None:
|
241
|
-
error_msg:
|
235
|
+
error_msg: list[str] = []
|
242
236
|
error_msg += self._get_error_msg(self._inputs, BAD_INPUT_REGISTER_ERROR_MSG)
|
243
237
|
error_msg += self._get_error_msg(self._outputs, BAD_OUTPUT_REGISTER_ERROR_MSG)
|
244
238
|
if error_msg:
|
245
239
|
error_msg += [END_BAD_REGISTER_ERROR_MSG]
|
246
|
-
raise
|
240
|
+
raise ClassiqValueError("\n".join(error_msg))
|
247
241
|
|
248
242
|
@staticmethod
|
249
243
|
def _sum_registers_sizes(registers: Iterable[RegisterArithmeticInfo]) -> int:
|
@@ -255,9 +249,9 @@ class FunctionParams(HashablePydanticBaseModel):
|
|
255
249
|
)
|
256
250
|
total_outputs_size = self._sum_registers_sizes(self._outputs.values())
|
257
251
|
if total_inputs_size != total_outputs_size:
|
258
|
-
raise
|
252
|
+
raise ClassiqValueError(REGISTER_SIZES_MISMATCH_ERROR_MSG)
|
259
253
|
|
260
|
-
def _get_error_msg(self, names: Iterable[IOName], msg: str) ->
|
254
|
+
def _get_error_msg(self, names: Iterable[IOName], msg: str) -> list[str]:
|
261
255
|
bad_names = [name for name in names if re.fullmatch(NAME_REGEX, name) is None]
|
262
256
|
return [f"{msg}: {bad_names}"] if bad_names else []
|
263
257
|
|
@@ -265,38 +259,17 @@ class FunctionParams(HashablePydanticBaseModel):
|
|
265
259
|
def discriminator(cls) -> FunctionParamsDiscriminator:
|
266
260
|
return cls.__name__
|
267
261
|
|
268
|
-
|
269
|
-
def _params(self) -> List[str]:
|
270
|
-
return [
|
271
|
-
name
|
272
|
-
for name, field in self.__fields__.items()
|
273
|
-
if field.field_info.extra.get("is_exec_param", False)
|
274
|
-
]
|
275
|
-
|
276
|
-
@pydantic.validator("*", pre=True)
|
277
|
-
def validate_parameters(cls, value: Any, field: pydantic.fields.ModelField) -> Any:
|
278
|
-
if (
|
279
|
-
"is_exec_param" in field.field_info.extra
|
280
|
-
or "is_gen_param" in field.field_info.extra
|
281
|
-
):
|
282
|
-
if isinstance(value, str):
|
283
|
-
validate_expression_str(value)
|
284
|
-
elif isinstance(value, sympy.Expr):
|
285
|
-
return str(value)
|
286
|
-
return value
|
287
|
-
|
288
|
-
class Config:
|
289
|
-
frozen = True
|
262
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
290
263
|
|
291
264
|
|
292
265
|
def parse_function_params(
|
293
266
|
*,
|
294
267
|
params: Any,
|
295
268
|
discriminator: Optional[Any],
|
296
|
-
param_classes: Collection[
|
269
|
+
param_classes: Collection[type[FunctionParams]],
|
297
270
|
no_discriminator_error: Exception,
|
298
271
|
bad_function_error: Exception,
|
299
|
-
default_parser_class: Optional[
|
272
|
+
default_parser_class: Optional[type[FunctionParams]] = None,
|
300
273
|
) -> FunctionParams: # Any is for use in pydantic validators.
|
301
274
|
if not discriminator:
|
302
275
|
raise no_discriminator_error
|
@@ -310,21 +283,21 @@ def parse_function_params(
|
|
310
283
|
if len(matching_classes) != 1:
|
311
284
|
if default_parser_class is not None:
|
312
285
|
try:
|
313
|
-
return default_parser_class.
|
286
|
+
return default_parser_class.model_validate(params)
|
314
287
|
except Exception:
|
315
|
-
raise bad_function_error
|
288
|
+
raise bad_function_error from None
|
316
289
|
raise bad_function_error
|
317
290
|
|
318
|
-
return matching_classes[0].
|
291
|
+
return matching_classes[0].model_validate(params)
|
319
292
|
|
320
293
|
|
321
294
|
def parse_function_params_values(
|
322
295
|
*,
|
323
|
-
values:
|
296
|
+
values: dict[str, Any],
|
324
297
|
params_key: str,
|
325
298
|
discriminator_key: str,
|
326
|
-
param_classes: Collection[
|
327
|
-
default_parser_class:
|
299
|
+
param_classes: Collection[type[FunctionParams]],
|
300
|
+
default_parser_class: type[FunctionParams],
|
328
301
|
) -> None:
|
329
302
|
params = values.get(params_key, dict())
|
330
303
|
if isinstance(params, FunctionParams):
|
@@ -335,10 +308,10 @@ def parse_function_params_values(
|
|
335
308
|
params=params,
|
336
309
|
discriminator=discriminator,
|
337
310
|
param_classes=param_classes,
|
338
|
-
no_discriminator_error=
|
311
|
+
no_discriminator_error=ClassiqValueError(
|
339
312
|
f"The {discriminator_key} {NO_DISCRIMINATOR_ERROR_MSG} {params_key} type."
|
340
313
|
),
|
341
|
-
bad_function_error=
|
314
|
+
bad_function_error=ClassiqValueError(
|
342
315
|
f"{BAD_FUNCTION_ERROR_MSG} {discriminator_key}: {discriminator}"
|
343
316
|
),
|
344
317
|
default_parser_class=default_parser_class,
|
@@ -1,23 +1 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
|
-
import classiq.interface.generator.functions.core_lib_declarations.quantum_functions
|
4
|
-
import classiq.interface.generator.functions.core_lib_declarations.quantum_operators # noqa: F401
|
5
|
-
from classiq.interface.generator.functions.foreign_function_definition import *
|
6
|
-
from classiq.interface.generator.functions.foreign_function_definition import (
|
7
|
-
SynthesisForeignFunctionDefinition as ForeignFunctionDefinition,
|
8
|
-
)
|
9
1
|
from classiq.interface.generator.functions.function_declaration import *
|
10
|
-
from classiq.interface.generator.functions.function_implementation import *
|
11
|
-
from classiq.interface.generator.functions.native_function_definition import *
|
12
|
-
from classiq.interface.generator.functions.register import *
|
13
|
-
|
14
|
-
__all__ = [ # noqa: F405
|
15
|
-
"ForeignFunctionDefinition",
|
16
|
-
"FunctionImplementation",
|
17
|
-
"Register",
|
18
|
-
"RegisterMappingData",
|
19
|
-
]
|
20
|
-
|
21
|
-
|
22
|
-
def __dir__() -> List[str]:
|
23
|
-
return __all__
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
CTRL_VAR_PREFIX = "ctrl__"
|
2
|
+
CONTROL_OPERATOR_NAME = "control"
|
3
|
+
INVERT_OPERATOR_NAME = "invert"
|
4
|
+
REPEAT_OPERATOR_NAME = "iteration"
|
5
|
+
POWER_OPERATOR_NAME = "power"
|
6
|
+
UNCOMPUTE_OPERATOR_NAME = "uncompute"
|
7
|
+
WITHIN_APPLY_NAME = "within_apply"
|
8
|
+
|
9
|
+
All_BUILTINS_OPERATORS = {
|
10
|
+
CONTROL_OPERATOR_NAME,
|
11
|
+
INVERT_OPERATOR_NAME,
|
12
|
+
REPEAT_OPERATOR_NAME,
|
13
|
+
POWER_OPERATOR_NAME,
|
14
|
+
UNCOMPUTE_OPERATOR_NAME,
|
15
|
+
WITHIN_APPLY_NAME,
|
16
|
+
}
|
@@ -1,11 +1,15 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Sequence
|
2
|
+
from typing import ClassVar, Optional
|
2
3
|
|
3
4
|
import pydantic
|
4
5
|
|
5
|
-
from classiq.interface.generator.functions.
|
6
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
|
6
7
|
from classiq.interface.generator.functions.function_declaration import (
|
7
8
|
FunctionDeclaration,
|
8
9
|
)
|
10
|
+
from classiq.interface.model.classical_parameter_declaration import (
|
11
|
+
ClassicalParameterDeclaration,
|
12
|
+
)
|
9
13
|
|
10
14
|
|
11
15
|
class ClassicalFunctionDeclaration(FunctionDeclaration):
|
@@ -13,23 +17,28 @@ class ClassicalFunctionDeclaration(FunctionDeclaration):
|
|
13
17
|
Facilitates the creation of a common classical function interface object.
|
14
18
|
"""
|
15
19
|
|
20
|
+
name: str
|
21
|
+
|
22
|
+
positional_parameters: Sequence[ClassicalParameterDeclaration] = pydantic.Field(
|
23
|
+
default_factory=list,
|
24
|
+
)
|
25
|
+
|
16
26
|
return_type: Optional[ConcreteClassicalType] = pydantic.Field(
|
17
27
|
description="The type of the classical value that is returned by the function (for classical functions)",
|
18
28
|
default=None,
|
19
29
|
)
|
20
30
|
|
21
31
|
BUILTIN_FUNCTION_DECLARATIONS: ClassVar[
|
22
|
-
|
32
|
+
dict[str, "ClassicalFunctionDeclaration"]
|
23
33
|
] = {}
|
24
34
|
|
25
35
|
FOREIGN_FUNCTION_DECLARATIONS: ClassVar[
|
26
|
-
|
36
|
+
dict[str, "ClassicalFunctionDeclaration"]
|
27
37
|
] = {}
|
28
38
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
pass
|
39
|
+
@property
|
40
|
+
def param_decls(self) -> Sequence[ClassicalParameterDeclaration]:
|
41
|
+
return self.positional_parameters
|
33
42
|
|
34
43
|
|
35
|
-
ClassicalFunctionDeclaration.
|
44
|
+
ClassicalFunctionDeclaration.model_rebuild()
|