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,43 +1,31 @@
|
|
1
|
-
from
|
2
|
-
from typing import Any, Dict, List, Literal, Union
|
1
|
+
from typing import TYPE_CHECKING, Any, Literal, Union
|
3
2
|
|
4
3
|
import pydantic
|
5
|
-
from pydantic import
|
4
|
+
from pydantic import ConfigDict
|
6
5
|
from sympy import IndexedBase, Symbol
|
7
|
-
from typing_extensions import Annotated
|
8
6
|
|
9
|
-
from classiq.interface.
|
10
|
-
LadderOperator as LadderOperatorEnum,
|
11
|
-
)
|
12
|
-
from classiq.interface.generator.expressions.enums.pauli import Pauli as PauliEnum
|
7
|
+
from classiq.interface.ast_node import HashableASTNode
|
13
8
|
from classiq.interface.generator.expressions.expression_types import RuntimeExpression
|
14
|
-
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
15
|
-
HashablePydanticBaseModel,
|
16
|
-
)
|
17
9
|
from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
|
18
10
|
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from classiq.interface.generator.functions.concrete_types import (
|
13
|
+
ConcreteClassicalType,
|
14
|
+
)
|
15
|
+
|
16
|
+
CLASSICAL_ATTRIBUTES = {"len", "size", "is_signed", "fraction_digits"}
|
17
|
+
|
19
18
|
NamedSymbol = Union[IndexedBase, Symbol]
|
20
19
|
|
21
20
|
|
22
|
-
class ClassicalType(
|
23
|
-
def as_symbolic(self, name: str) -> Union[NamedSymbol,
|
21
|
+
class ClassicalType(HashableASTNode):
|
22
|
+
def as_symbolic(self, name: str) -> Union[NamedSymbol, list[NamedSymbol]]:
|
24
23
|
return Symbol(name)
|
25
24
|
|
26
|
-
|
27
|
-
@abstractmethod
|
28
|
-
def default_value(self) -> Any:
|
29
|
-
raise NotImplementedError(
|
30
|
-
f"{self.__class__.__name__} type has no default value"
|
31
|
-
)
|
25
|
+
model_config = ConfigDict(extra="forbid")
|
32
26
|
|
33
|
-
|
34
|
-
|
35
|
-
raise NotImplementedError(
|
36
|
-
f"{self.__class__.__name__!r} has no Python SDK equivalent"
|
37
|
-
)
|
38
|
-
|
39
|
-
class Config:
|
40
|
-
extra = Extra.forbid
|
27
|
+
def __str__(self) -> str:
|
28
|
+
return str(type(self).__name__)
|
41
29
|
|
42
30
|
|
43
31
|
class Integer(ClassicalType):
|
@@ -46,18 +34,11 @@ class Integer(ClassicalType):
|
|
46
34
|
def as_symbolic(self, name: str) -> Symbol:
|
47
35
|
return Symbol(name, integer=True)
|
48
36
|
|
49
|
-
@
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
@pydantic.root_validator(pre=True)
|
54
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
37
|
+
@pydantic.model_validator(mode="before")
|
38
|
+
@classmethod
|
39
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
55
40
|
return values_with_discriminator(values, "kind", "int")
|
56
41
|
|
57
|
-
@property
|
58
|
-
def python_type(self) -> type:
|
59
|
-
return int
|
60
|
-
|
61
42
|
|
62
43
|
class Real(ClassicalType):
|
63
44
|
kind: Literal["real"]
|
@@ -65,34 +46,20 @@ class Real(ClassicalType):
|
|
65
46
|
def as_symbolic(self, name: str) -> Symbol:
|
66
47
|
return Symbol(name, real=True)
|
67
48
|
|
68
|
-
@
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
@pydantic.root_validator(pre=True)
|
73
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
49
|
+
@pydantic.model_validator(mode="before")
|
50
|
+
@classmethod
|
51
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
74
52
|
return values_with_discriminator(values, "kind", "real")
|
75
53
|
|
76
|
-
@property
|
77
|
-
def python_type(self) -> type:
|
78
|
-
return float
|
79
|
-
|
80
54
|
|
81
55
|
class Bool(ClassicalType):
|
82
56
|
kind: Literal["bool"]
|
83
57
|
|
84
|
-
@
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
@pydantic.root_validator(pre=True)
|
89
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
58
|
+
@pydantic.model_validator(mode="before")
|
59
|
+
@classmethod
|
60
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
90
61
|
return values_with_discriminator(values, "kind", "bool")
|
91
62
|
|
92
|
-
@property
|
93
|
-
def python_type(self) -> type:
|
94
|
-
return bool
|
95
|
-
|
96
63
|
|
97
64
|
class ClassicalList(ClassicalType):
|
98
65
|
kind: Literal["list"]
|
@@ -101,68 +68,21 @@ class ClassicalList(ClassicalType):
|
|
101
68
|
def as_symbolic(self, name: str) -> Symbol:
|
102
69
|
return IndexedBase(name)
|
103
70
|
|
104
|
-
@
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
@pydantic.root_validator(pre=True)
|
109
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
71
|
+
@pydantic.model_validator(mode="before")
|
72
|
+
@classmethod
|
73
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
110
74
|
return values_with_discriminator(values, "kind", "list")
|
111
75
|
|
112
|
-
@property
|
113
|
-
def python_type(self) -> type:
|
114
|
-
return List[self.element_type.python_type] # type:ignore[name-defined]
|
115
|
-
|
116
|
-
|
117
|
-
class Pauli(ClassicalType):
|
118
|
-
kind: Literal["pauli"]
|
119
|
-
|
120
|
-
@property
|
121
|
-
def default_value(self) -> PauliEnum:
|
122
|
-
return PauliEnum.I
|
123
|
-
|
124
|
-
@pydantic.root_validator(pre=True)
|
125
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
126
|
-
return values_with_discriminator(values, "kind", "pauli")
|
127
|
-
|
128
|
-
@property
|
129
|
-
def python_type(self) -> type:
|
130
|
-
return int
|
131
|
-
|
132
76
|
|
133
77
|
class StructMetaType(ClassicalType):
|
134
78
|
kind: Literal["type_proxy"]
|
135
79
|
|
136
|
-
@
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
@pydantic.root_validator(pre=True)
|
141
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
80
|
+
@pydantic.model_validator(mode="before")
|
81
|
+
@classmethod
|
82
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
142
83
|
return values_with_discriminator(values, "kind", "type_proxy")
|
143
84
|
|
144
85
|
|
145
|
-
class QStructBase: # marker for Qmod structs in the Python SDK
|
146
|
-
pass
|
147
|
-
|
148
|
-
|
149
|
-
class Struct(ClassicalType):
|
150
|
-
kind: Literal["struct_instance"]
|
151
|
-
name: str = pydantic.Field(description="The struct type of the instance")
|
152
|
-
|
153
|
-
@property
|
154
|
-
def default_value(self) -> Any:
|
155
|
-
return super().default_value
|
156
|
-
|
157
|
-
@pydantic.root_validator(pre=True)
|
158
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
159
|
-
return values_with_discriminator(values, "kind", "struct_instance")
|
160
|
-
|
161
|
-
@property
|
162
|
-
def python_type(self) -> type:
|
163
|
-
return type(self.name, (QStructBase,), dict())
|
164
|
-
|
165
|
-
|
166
86
|
class ClassicalArray(ClassicalType):
|
167
87
|
kind: Literal["array"]
|
168
88
|
element_type: "ConcreteClassicalType"
|
@@ -171,92 +91,53 @@ class ClassicalArray(ClassicalType):
|
|
171
91
|
def as_symbolic(self, name: str) -> list:
|
172
92
|
return [self.element_type.as_symbolic(f"{name}_{i}") for i in range(self.size)]
|
173
93
|
|
174
|
-
@
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
@pydantic.root_validator(pre=True)
|
179
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
94
|
+
@pydantic.model_validator(mode="before")
|
95
|
+
@classmethod
|
96
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
180
97
|
return values_with_discriminator(values, "kind", "array")
|
181
98
|
|
182
99
|
|
183
100
|
class OpaqueHandle(ClassicalType):
|
184
|
-
|
185
|
-
def default_value(self) -> int:
|
186
|
-
return 0
|
101
|
+
pass
|
187
102
|
|
188
103
|
|
189
104
|
class VQEResult(OpaqueHandle):
|
190
105
|
kind: Literal["vqe_result"]
|
191
106
|
|
192
|
-
@pydantic.
|
193
|
-
|
107
|
+
@pydantic.model_validator(mode="before")
|
108
|
+
@classmethod
|
109
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
194
110
|
return values_with_discriminator(values, "kind", "vqe_result")
|
195
111
|
|
196
112
|
|
197
113
|
class Histogram(OpaqueHandle):
|
198
114
|
kind: Literal["histogram"]
|
199
115
|
|
200
|
-
@pydantic.
|
201
|
-
|
116
|
+
@pydantic.model_validator(mode="before")
|
117
|
+
@classmethod
|
118
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
202
119
|
return values_with_discriminator(values, "kind", "histogram")
|
203
120
|
|
204
121
|
|
205
122
|
class Estimation(OpaqueHandle):
|
206
123
|
kind: Literal["estimation_result"]
|
207
124
|
|
208
|
-
@pydantic.
|
209
|
-
|
125
|
+
@pydantic.model_validator(mode="before")
|
126
|
+
@classmethod
|
127
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
210
128
|
return values_with_discriminator(values, "kind", "estimation_result")
|
211
129
|
|
212
130
|
|
213
131
|
class IQAERes(OpaqueHandle):
|
214
132
|
kind: Literal["iqae_result"]
|
215
133
|
|
216
|
-
@pydantic.
|
217
|
-
|
134
|
+
@pydantic.model_validator(mode="before")
|
135
|
+
@classmethod
|
136
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
218
137
|
return values_with_discriminator(values, "kind", "iqae_result")
|
219
138
|
|
220
139
|
|
221
|
-
|
222
|
-
kind: Literal["ladder_operator"]
|
223
|
-
|
224
|
-
@property
|
225
|
-
def default_value(self) -> LadderOperatorEnum:
|
226
|
-
return LadderOperatorEnum.PLUS
|
227
|
-
|
228
|
-
@pydantic.root_validator(pre=True)
|
229
|
-
def _set_kind(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
230
|
-
return values_with_discriminator(values, "kind", "ladder_operator")
|
231
|
-
|
232
|
-
@property
|
233
|
-
def python_type(self) -> type:
|
234
|
-
return int
|
235
|
-
|
236
|
-
|
237
|
-
ConcreteClassicalType = Annotated[
|
238
|
-
Union[
|
239
|
-
Integer,
|
240
|
-
Real,
|
241
|
-
Bool,
|
242
|
-
ClassicalList,
|
243
|
-
Pauli,
|
244
|
-
StructMetaType,
|
245
|
-
Struct,
|
246
|
-
ClassicalArray,
|
247
|
-
VQEResult,
|
248
|
-
Histogram,
|
249
|
-
Estimation,
|
250
|
-
LadderOperator,
|
251
|
-
IQAERes,
|
252
|
-
],
|
253
|
-
Field(discriminator="kind"),
|
254
|
-
]
|
255
|
-
ClassicalList.update_forward_refs()
|
256
|
-
ClassicalArray.update_forward_refs()
|
257
|
-
|
258
|
-
|
259
|
-
def as_symbolic(symbols: Dict[str, ClassicalType]) -> Dict[str, RuntimeExpression]:
|
140
|
+
def as_symbolic(symbols: dict[str, ClassicalType]) -> dict[str, RuntimeExpression]:
|
260
141
|
return {
|
261
142
|
param_name: param_type.as_symbolic(param_name)
|
262
143
|
for param_name, param_type in symbols.items()
|
@@ -0,0 +1,55 @@
|
|
1
|
+
from typing import Annotated, Union
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from classiq.interface.generator.functions.classical_type import (
|
6
|
+
Bool,
|
7
|
+
ClassicalArray,
|
8
|
+
ClassicalList,
|
9
|
+
Estimation,
|
10
|
+
Histogram,
|
11
|
+
Integer,
|
12
|
+
IQAERes,
|
13
|
+
Real,
|
14
|
+
StructMetaType,
|
15
|
+
VQEResult,
|
16
|
+
)
|
17
|
+
from classiq.interface.generator.functions.type_name import Enum, TypeName
|
18
|
+
from classiq.interface.generator.types.qstruct_declaration import QStructDeclaration
|
19
|
+
from classiq.interface.model.quantum_type import (
|
20
|
+
QuantumBit,
|
21
|
+
QuantumBitvector,
|
22
|
+
QuantumNumeric,
|
23
|
+
RegisterQuantumType,
|
24
|
+
)
|
25
|
+
|
26
|
+
ConcreteClassicalType = Annotated[
|
27
|
+
Union[
|
28
|
+
Integer,
|
29
|
+
Real,
|
30
|
+
Bool,
|
31
|
+
ClassicalList,
|
32
|
+
StructMetaType,
|
33
|
+
TypeName,
|
34
|
+
ClassicalArray,
|
35
|
+
VQEResult,
|
36
|
+
Histogram,
|
37
|
+
Estimation,
|
38
|
+
IQAERes,
|
39
|
+
],
|
40
|
+
Field(discriminator="kind"),
|
41
|
+
]
|
42
|
+
ClassicalList.model_rebuild()
|
43
|
+
ClassicalArray.model_rebuild()
|
44
|
+
|
45
|
+
NativePythonClassicalTypes = (int, float, bool, list)
|
46
|
+
PythonClassicalPydanticTypes = (Enum,)
|
47
|
+
|
48
|
+
ConcreteQuantumType = Annotated[
|
49
|
+
Union[QuantumBit, QuantumBitvector, QuantumNumeric, TypeName],
|
50
|
+
Field(discriminator="kind", default_factory=QuantumBitvector),
|
51
|
+
]
|
52
|
+
QuantumBitvector.model_rebuild()
|
53
|
+
TypeName.model_rebuild()
|
54
|
+
QStructDeclaration.model_rebuild()
|
55
|
+
RegisterQuantumType.model_rebuild()
|
@@ -1,26 +1,25 @@
|
|
1
1
|
import abc
|
2
|
-
from
|
2
|
+
from collections.abc import Sequence
|
3
3
|
|
4
|
-
import
|
5
|
-
from pydantic.main import BaseModel
|
4
|
+
from pydantic import ConfigDict
|
6
5
|
|
7
|
-
from classiq.interface.
|
6
|
+
from classiq.interface.model.classical_parameter_declaration import (
|
7
|
+
AnonClassicalParameterDeclaration,
|
8
|
+
)
|
9
|
+
from classiq.interface.model.parameter import Parameter
|
8
10
|
|
9
11
|
|
10
|
-
class FunctionDeclaration(
|
12
|
+
class FunctionDeclaration(Parameter, abc.ABC):
|
11
13
|
"""
|
12
14
|
Facilitates the creation of a common function interface object.
|
13
15
|
"""
|
14
16
|
|
15
|
-
|
17
|
+
@property
|
18
|
+
@abc.abstractmethod
|
19
|
+
def param_decls(self) -> Sequence["AnonClassicalParameterDeclaration"]:
|
20
|
+
pass
|
16
21
|
|
17
|
-
|
18
|
-
description="The expected interface of the functions parameters",
|
19
|
-
default_factory=dict,
|
20
|
-
)
|
22
|
+
model_config = ConfigDict(extra="forbid")
|
21
23
|
|
22
|
-
class Config:
|
23
|
-
extra = pydantic.Extra.forbid
|
24
24
|
|
25
|
-
|
26
|
-
FunctionDeclaration.update_forward_refs()
|
25
|
+
FunctionDeclaration.model_rebuild()
|
@@ -1,12 +1,8 @@
|
|
1
1
|
from typing import Any
|
2
2
|
|
3
|
-
import
|
4
|
-
from pydantic import BaseModel
|
5
|
-
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
6
4
|
from classiq.interface.generator.function_params import PortDirection
|
7
5
|
|
8
|
-
from classiq._internals.enum_utils import StrEnum
|
9
|
-
|
10
6
|
|
11
7
|
class PortDeclarationDirection(StrEnum):
|
12
8
|
Input = "input"
|
@@ -39,11 +35,3 @@ class PortDeclarationDirection(StrEnum):
|
|
39
35
|
cls, port_direction: PortDirection
|
40
36
|
) -> "PortDeclarationDirection":
|
41
37
|
return cls(port_direction.value)
|
42
|
-
|
43
|
-
|
44
|
-
class SynthesisPortDeclaration(BaseModel):
|
45
|
-
name: str
|
46
|
-
size: int
|
47
|
-
direction: PortDeclarationDirection
|
48
|
-
is_signed: bool = pydantic.Field(default=False)
|
49
|
-
fraction_places: int = pydantic.Field(default=0)
|
@@ -0,0 +1,90 @@
|
|
1
|
+
from collections.abc import Mapping
|
2
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional
|
3
|
+
|
4
|
+
import pydantic
|
5
|
+
|
6
|
+
from classiq.interface.exceptions import ClassiqInternalError
|
7
|
+
from classiq.interface.generator.expressions.qmod_qstruct_proxy import QmodQStructProxy
|
8
|
+
from classiq.interface.generator.functions.classical_type import (
|
9
|
+
ClassicalType,
|
10
|
+
)
|
11
|
+
from classiq.interface.helpers.pydantic_model_helpers import values_with_discriminator
|
12
|
+
from classiq.interface.model.handle_binding import HandleBinding
|
13
|
+
from classiq.interface.model.quantum_type import (
|
14
|
+
QuantumType,
|
15
|
+
)
|
16
|
+
|
17
|
+
if TYPE_CHECKING:
|
18
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
|
19
|
+
|
20
|
+
|
21
|
+
class TypeName(ClassicalType, QuantumType):
|
22
|
+
kind: Literal["struct_instance"]
|
23
|
+
name: str = pydantic.Field(description="The type name of the instance")
|
24
|
+
_assigned_fields: Optional[Mapping[str, "ConcreteQuantumType"]] = (
|
25
|
+
pydantic.PrivateAttr(default=None)
|
26
|
+
)
|
27
|
+
|
28
|
+
@pydantic.model_validator(mode="before")
|
29
|
+
@classmethod
|
30
|
+
def _set_kind(cls, values: Any) -> dict[str, Any]:
|
31
|
+
return values_with_discriminator(values, "kind", "struct_instance")
|
32
|
+
|
33
|
+
def _update_size_in_bits_from_declaration(self) -> None:
|
34
|
+
fields_types = list(self.fields.values())
|
35
|
+
for field_type in fields_types:
|
36
|
+
field_type._update_size_in_bits_from_declaration()
|
37
|
+
if all(field_type.has_size_in_bits for field_type in fields_types):
|
38
|
+
self._size_in_bits = sum(
|
39
|
+
field_type.size_in_bits for field_type in fields_types
|
40
|
+
)
|
41
|
+
|
42
|
+
def get_proxy(self, handle: "HandleBinding") -> "QmodQStructProxy":
|
43
|
+
from classiq.interface.generator.expressions.qmod_qstruct_proxy import (
|
44
|
+
QmodQStructProxy,
|
45
|
+
)
|
46
|
+
|
47
|
+
return QmodQStructProxy(
|
48
|
+
handle=handle, struct_name=self.name, fields=self.fields
|
49
|
+
)
|
50
|
+
|
51
|
+
@property
|
52
|
+
def qmod_type_name(self) -> str:
|
53
|
+
return self.name
|
54
|
+
|
55
|
+
@property
|
56
|
+
def type_name(self) -> str:
|
57
|
+
return self.name
|
58
|
+
|
59
|
+
@property
|
60
|
+
def fields(self) -> Mapping[str, "ConcreteQuantumType"]:
|
61
|
+
if self._assigned_fields is None:
|
62
|
+
raise ClassiqInternalError("Fields not set")
|
63
|
+
return self._assigned_fields
|
64
|
+
|
65
|
+
@property
|
66
|
+
def has_fields(self) -> bool:
|
67
|
+
return self._assigned_fields is not None
|
68
|
+
|
69
|
+
def set_fields(self, fields: Mapping[str, "ConcreteQuantumType"]) -> None:
|
70
|
+
self._assigned_fields = fields
|
71
|
+
|
72
|
+
@property
|
73
|
+
def is_instantiated(self) -> bool:
|
74
|
+
return self.has_fields and all(
|
75
|
+
field_type.is_instantiated for field_type in self.fields.values()
|
76
|
+
)
|
77
|
+
|
78
|
+
@property
|
79
|
+
def is_evaluated(self) -> bool:
|
80
|
+
return self.has_fields and all(
|
81
|
+
field_type.is_evaluated for field_type in self.fields.values()
|
82
|
+
)
|
83
|
+
|
84
|
+
|
85
|
+
class Enum(TypeName):
|
86
|
+
pass
|
87
|
+
|
88
|
+
|
89
|
+
class Struct(TypeName):
|
90
|
+
pass
|