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,10 +1,10 @@
|
|
1
|
-
from typing import TYPE_CHECKING,
|
1
|
+
from typing import TYPE_CHECKING, Optional
|
2
2
|
|
3
3
|
from typing_extensions import TypeAlias
|
4
4
|
|
5
|
-
from classiq.
|
5
|
+
from classiq.interface.enum_utils import StrEnum
|
6
6
|
|
7
|
-
BasisGates: TypeAlias =
|
7
|
+
BasisGates: TypeAlias = frozenset[str]
|
8
8
|
|
9
9
|
SINGLE_QUBIT_GATES: BasisGates = frozenset(
|
10
10
|
(
|
@@ -86,6 +86,10 @@ class LowerValsEnum(StrEnum):
|
|
86
86
|
if TYPE_CHECKING:
|
87
87
|
# A subset of the gates for better type checking
|
88
88
|
class TranspilerBasisGates(StrEnum):
|
89
|
+
"""
|
90
|
+
A subset of the gates used in the transpiler.
|
91
|
+
"""
|
92
|
+
|
89
93
|
X = "x"
|
90
94
|
CX = "cx"
|
91
95
|
CZ = "cz"
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# This file was generated automatically - do not edit manually
|
2
|
+
|
3
|
+
|
4
|
+
from enum import IntEnum
|
5
|
+
|
6
|
+
|
7
|
+
class Element(IntEnum):
|
8
|
+
H = 0
|
9
|
+
He = 1
|
10
|
+
Li = 2
|
11
|
+
Be = 3
|
12
|
+
B = 4
|
13
|
+
C = 5
|
14
|
+
N = 6
|
15
|
+
O = 7 # noqa: E741
|
16
|
+
F = 8
|
17
|
+
Ne = 9
|
18
|
+
Na = 10
|
19
|
+
Mg = 11
|
20
|
+
Al = 12
|
21
|
+
Si = 13
|
22
|
+
P = 14
|
23
|
+
S = 15
|
24
|
+
Cl = 16
|
25
|
+
Ar = 17
|
26
|
+
K = 18
|
27
|
+
Ca = 19
|
28
|
+
Sc = 20
|
29
|
+
Ti = 21
|
30
|
+
V = 22
|
31
|
+
Cr = 23
|
32
|
+
Mn = 24
|
33
|
+
Fe = 25
|
34
|
+
Co = 26
|
35
|
+
Ni = 27
|
36
|
+
Cu = 28
|
37
|
+
Zn = 29
|
38
|
+
Ga = 30
|
39
|
+
Ge = 31
|
40
|
+
As = 32
|
41
|
+
Se = 33
|
42
|
+
Br = 34
|
43
|
+
Kr = 35
|
44
|
+
Rb = 36
|
45
|
+
Sr = 37
|
46
|
+
Y = 38
|
47
|
+
Zr = 39
|
48
|
+
Nb = 40
|
49
|
+
Mo = 41
|
50
|
+
Tc = 42
|
51
|
+
Ru = 43
|
52
|
+
Rh = 44
|
53
|
+
Pd = 45
|
54
|
+
Ag = 46
|
55
|
+
Cd = 47
|
56
|
+
In = 48
|
57
|
+
Sn = 49
|
58
|
+
Sb = 50
|
59
|
+
Te = 51
|
60
|
+
I = 52 # noqa: E741
|
61
|
+
Xe = 53
|
62
|
+
Cs = 54
|
63
|
+
Ba = 55
|
64
|
+
La = 56
|
65
|
+
Ce = 57
|
66
|
+
Pr = 58
|
67
|
+
Nd = 59
|
68
|
+
Pm = 60
|
69
|
+
Sm = 61
|
70
|
+
Eu = 62
|
71
|
+
Gd = 63
|
72
|
+
Tb = 64
|
73
|
+
Dy = 65
|
74
|
+
Ho = 66
|
75
|
+
Er = 67
|
76
|
+
Tm = 68
|
77
|
+
Yb = 69
|
78
|
+
Lu = 70
|
79
|
+
Hf = 71
|
80
|
+
Ta = 72
|
81
|
+
W = 73
|
82
|
+
Re = 74
|
83
|
+
Os = 75
|
84
|
+
Ir = 76
|
85
|
+
Pt = 77
|
86
|
+
Au = 78
|
87
|
+
Hg = 79
|
88
|
+
Tl = 80
|
89
|
+
Pb = 81
|
90
|
+
Bi = 82
|
91
|
+
Po = 83
|
92
|
+
At = 84
|
93
|
+
Rn = 85
|
94
|
+
Fr = 86
|
95
|
+
Ra = 87
|
96
|
+
Ac = 88
|
97
|
+
Th = 89
|
98
|
+
Pa = 90
|
99
|
+
U = 91
|
100
|
+
Np = 92
|
101
|
+
Pu = 93
|
102
|
+
Am = 94
|
103
|
+
Cm = 95
|
104
|
+
Bk = 96
|
105
|
+
Cf = 97
|
106
|
+
Es = 98
|
107
|
+
Fm = 99
|
108
|
+
Md = 100
|
109
|
+
No = 101
|
110
|
+
Lr = 102
|
111
|
+
Rf = 103
|
112
|
+
Db = 104
|
113
|
+
Sg = 105
|
114
|
+
Bh = 106
|
115
|
+
Hs = 107
|
116
|
+
Mt = 108
|
117
|
+
Ds = 109
|
118
|
+
Rg = 110
|
119
|
+
Cn = 111
|
120
|
+
Nh = 112
|
121
|
+
Fl = 113
|
122
|
+
Mc = 114
|
123
|
+
Lv = 115
|
124
|
+
Ts = 116
|
125
|
+
Og = 117
|
126
|
+
|
127
|
+
|
128
|
+
class FermionMapping(IntEnum):
|
129
|
+
JORDAN_WIGNER = 0
|
130
|
+
PARITY = 1
|
131
|
+
BRAVYI_KITAEV = 2
|
132
|
+
FAST_BRAVYI_KITAEV = 3
|
133
|
+
|
134
|
+
|
135
|
+
class FinanceFunctionType(IntEnum):
|
136
|
+
VAR = 0
|
137
|
+
SHORTFALL = 1
|
138
|
+
X_SQUARE = 2
|
139
|
+
EUROPEAN_CALL_OPTION = 3
|
140
|
+
|
141
|
+
|
142
|
+
class LadderOperator(IntEnum):
|
143
|
+
PLUS = 0
|
144
|
+
MINUS = 1
|
145
|
+
|
146
|
+
|
147
|
+
class Optimizer(IntEnum):
|
148
|
+
COBYLA = 1
|
149
|
+
SPSA = 2
|
150
|
+
L_BFGS_B = 3
|
151
|
+
NELDER_MEAD = 4
|
152
|
+
ADAM = 5
|
153
|
+
|
154
|
+
|
155
|
+
class Pauli(IntEnum):
|
156
|
+
I = 0 # noqa: E741
|
157
|
+
X = 1
|
158
|
+
Y = 2
|
159
|
+
Z = 3
|
160
|
+
|
161
|
+
|
162
|
+
class QSVMFeatureMapEntanglement(IntEnum):
|
163
|
+
FULL = 0
|
164
|
+
LINEAR = 1
|
165
|
+
CIRCULAR = 2
|
166
|
+
SCA = 3
|
167
|
+
PAIRWISE = 4
|
168
|
+
|
169
|
+
|
170
|
+
__all__ = [
|
171
|
+
"Element",
|
172
|
+
"FermionMapping",
|
173
|
+
"FinanceFunctionType",
|
174
|
+
"LadderOperator",
|
175
|
+
"Optimizer",
|
176
|
+
"Pauli",
|
177
|
+
"QSVMFeatureMapEntanglement",
|
178
|
+
]
|
@@ -0,0 +1,54 @@
|
|
1
|
+
from collections import Counter
|
2
|
+
from enum import Enum, EnumMeta, IntEnum
|
3
|
+
|
4
|
+
import pydantic
|
5
|
+
|
6
|
+
from classiq.interface.ast_node import HashableASTNode
|
7
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
|
+
|
9
|
+
|
10
|
+
class EnumDeclaration(HashableASTNode):
|
11
|
+
name: str
|
12
|
+
|
13
|
+
members: dict[str, int] = pydantic.Field(
|
14
|
+
default_factory=dict,
|
15
|
+
description="Dictionary of member names and their values",
|
16
|
+
)
|
17
|
+
|
18
|
+
@pydantic.field_validator("members")
|
19
|
+
@classmethod
|
20
|
+
def _validate_members(cls, members: dict[str, int]) -> dict[str, int]:
|
21
|
+
underscore_members = [
|
22
|
+
member for member in members.keys() if member.startswith("_")
|
23
|
+
]
|
24
|
+
if len(underscore_members) > 0:
|
25
|
+
raise ClassiqValueError(
|
26
|
+
f"Enum member names must not start with an underscore. The offending "
|
27
|
+
f"members: {underscore_members}"
|
28
|
+
)
|
29
|
+
|
30
|
+
counter = Counter(members.values())
|
31
|
+
repeating_members = [
|
32
|
+
member for member, value in members.items() if counter[value] > 1
|
33
|
+
]
|
34
|
+
if len(repeating_members) > 0:
|
35
|
+
raise ClassiqValueError(
|
36
|
+
f"Cannot assign the same value to more than one enum member. The "
|
37
|
+
f"offending members: {repeating_members}"
|
38
|
+
)
|
39
|
+
|
40
|
+
return members
|
41
|
+
|
42
|
+
def create_enum(self) -> IntEnum:
|
43
|
+
return IntEnum(self.name, self.members)
|
44
|
+
|
45
|
+
|
46
|
+
def declaration_from_enum(enum_type: EnumMeta) -> EnumDeclaration:
|
47
|
+
members: list[Enum] = list(enum_type)
|
48
|
+
return EnumDeclaration(
|
49
|
+
name=enum_type.__name__,
|
50
|
+
members={
|
51
|
+
member.name: member.value
|
52
|
+
for member in sorted(members, key=lambda member: member.value)
|
53
|
+
},
|
54
|
+
)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
from collections.abc import Mapping
|
2
|
+
from typing import TYPE_CHECKING
|
3
|
+
|
4
|
+
import pydantic
|
5
|
+
|
6
|
+
from classiq.interface.ast_node import HashableASTNode
|
7
|
+
|
8
|
+
if TYPE_CHECKING:
|
9
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteQuantumType
|
10
|
+
|
11
|
+
|
12
|
+
class QStructDeclaration(HashableASTNode):
|
13
|
+
name: str
|
14
|
+
|
15
|
+
fields: Mapping[str, "ConcreteQuantumType"] = pydantic.Field(
|
16
|
+
default_factory=dict,
|
17
|
+
description="Dictionary of field names and their quantum types",
|
18
|
+
)
|
@@ -1,25 +1,26 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Mapping
|
2
|
+
from typing import Any
|
2
3
|
|
3
4
|
import pydantic
|
4
5
|
|
5
|
-
from classiq.interface.
|
6
|
-
from classiq.interface.
|
7
|
-
|
8
|
-
)
|
6
|
+
from classiq.interface.ast_node import HashableASTNode
|
7
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
|
9
9
|
|
10
|
-
from classiq.exceptions import ClassiqValueError
|
11
10
|
|
12
|
-
|
13
|
-
class StructDeclaration(HashablePydanticBaseModel):
|
11
|
+
class StructDeclaration(HashableASTNode):
|
14
12
|
name: str
|
15
13
|
|
16
|
-
variables:
|
14
|
+
variables: dict[str, ConcreteClassicalType] = pydantic.Field(
|
17
15
|
default_factory=dict,
|
18
|
-
description="Dictionary of variable names and their classical
|
16
|
+
description="Dictionary of variable names and their classical types",
|
19
17
|
)
|
20
18
|
|
21
|
-
BUILTIN_STRUCT_DECLARATIONS: ClassVar[Dict[str, "StructDeclaration"]] = {}
|
22
|
-
|
23
19
|
def validate_fields(self, fields: Mapping[str, Any]) -> None:
|
24
|
-
|
25
|
-
|
20
|
+
expected_field_names = list(self.variables.keys())
|
21
|
+
received_field_names = list(fields.keys())
|
22
|
+
if set(expected_field_names) != set(received_field_names):
|
23
|
+
raise ClassiqValueError(
|
24
|
+
f"Invalid fields for {self.name} instance. Expected fields "
|
25
|
+
f"{expected_field_names}, got {received_field_names}"
|
26
|
+
)
|
@@ -1,7 +1,9 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Iterable
|
2
|
+
from typing import Optional
|
2
3
|
|
3
4
|
import pydantic
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.generator.chemistry_function_params import (
|
6
8
|
ChemistryFunctionParams,
|
7
9
|
)
|
@@ -40,11 +42,12 @@ class UCC(ChemistryFunctionParams):
|
|
40
42
|
description="Prefix for the generated parameters",
|
41
43
|
)
|
42
44
|
|
43
|
-
@pydantic.
|
45
|
+
@pydantic.field_validator("excitations")
|
46
|
+
@classmethod
|
44
47
|
def _validate_excitations(cls, excitations: EXCITATIONS_TYPE) -> EXCITATIONS_TYPE:
|
45
48
|
if isinstance(excitations, int):
|
46
49
|
if excitations not in _EXCITATIONS_DICT.values():
|
47
|
-
raise
|
50
|
+
raise ClassiqValueError(
|
48
51
|
f"possible values of excitations are {list(_EXCITATIONS_DICT.values())}"
|
49
52
|
)
|
50
53
|
excitations = [excitations]
|
@@ -53,19 +56,19 @@ class UCC(ChemistryFunctionParams):
|
|
53
56
|
excitations = list(excitations) # type: ignore[assignment]
|
54
57
|
if all(isinstance(idx, int) for idx in excitations):
|
55
58
|
if any(idx not in _EXCITATIONS_DICT.values() for idx in excitations):
|
56
|
-
raise
|
59
|
+
raise ClassiqValueError(
|
57
60
|
f"possible values of excitations are {list(_EXCITATIONS_DICT.values())}"
|
58
61
|
)
|
59
62
|
|
60
63
|
elif all(isinstance(idx, str) for idx in excitations):
|
61
64
|
if any(idx not in _EXCITATIONS_DICT.keys() for idx in excitations):
|
62
|
-
raise
|
65
|
+
raise ClassiqValueError(
|
63
66
|
f"possible values of excitations are {list(_EXCITATIONS_DICT.keys())}"
|
64
67
|
)
|
65
68
|
excitations = sorted(_EXCITATIONS_DICT[idx] for idx in excitations) # type: ignore[index]
|
66
69
|
|
67
70
|
else:
|
68
|
-
raise
|
71
|
+
raise ClassiqValueError(
|
69
72
|
"excitations must be of the same type (all str or all int)"
|
70
73
|
)
|
71
74
|
return excitations
|
@@ -1,13 +1,14 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Union
|
2
2
|
|
3
3
|
import numpy as np
|
4
4
|
import pydantic
|
5
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
6
7
|
from classiq.interface.generator import complex_type, function_params
|
7
8
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
8
9
|
|
9
10
|
DataNumber = Union[complex_type.Complex, float, int]
|
10
|
-
DataArray =
|
11
|
+
DataArray = list[list[DataNumber]]
|
11
12
|
|
12
13
|
UNITARY_GATE_INPUT: str = "TARGET"
|
13
14
|
UNITARY_GATE_OUTPUT: str = "TARGET"
|
@@ -24,15 +25,18 @@ class UnitaryGate(function_params.FunctionParams):
|
|
24
25
|
)
|
25
26
|
|
26
27
|
# TODO - decide if to include assertion on the unitarity of the matrix. It is already done in Qiskit and could be computationally expensive
|
27
|
-
@pydantic.
|
28
|
+
@pydantic.field_validator("data")
|
29
|
+
@classmethod
|
28
30
|
def validate_data(cls, data: DataArray) -> DataArray:
|
29
31
|
data_np = np.array(data, dtype=object)
|
30
32
|
if data_np.ndim != 2:
|
31
|
-
raise
|
33
|
+
raise ClassiqValueError("Data must me two dimensional")
|
32
34
|
if data_np.shape[0] != data_np.shape[1]:
|
33
|
-
raise
|
35
|
+
raise ClassiqValueError("Matrix must be square")
|
34
36
|
if not np.mod(np.log2(data_np.shape[0]), 1) == 0:
|
35
|
-
raise
|
37
|
+
raise ClassiqValueError(
|
38
|
+
"Matrix dimensions must be an integer exponent of 2"
|
39
|
+
)
|
36
40
|
return data
|
37
41
|
|
38
42
|
@property
|
@@ -1,6 +1,7 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Mapping
|
2
2
|
|
3
3
|
import pydantic
|
4
|
+
from pydantic import ConfigDict
|
4
5
|
|
5
6
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
6
7
|
from classiq.interface.generator.function_params import ArithmeticIODict, FunctionParams
|
@@ -11,6 +12,8 @@ class CustomFunction(FunctionParams):
|
|
11
12
|
A user-defined custom function parameters object.
|
12
13
|
"""
|
13
14
|
|
15
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
16
|
+
|
14
17
|
_name: str = pydantic.PrivateAttr(default="")
|
15
18
|
|
16
19
|
input_decls: ArithmeticIODict = pydantic.Field(
|
@@ -1,10 +1,12 @@
|
|
1
1
|
from collections import Counter, defaultdict
|
2
|
+
from collections.abc import Collection, Iterable, Mapping
|
2
3
|
from dataclasses import dataclass
|
3
4
|
from itertools import chain
|
4
|
-
from typing import
|
5
|
+
from typing import Optional, TypeVar
|
5
6
|
|
6
7
|
import networkx as nx
|
7
8
|
|
9
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
10
|
from classiq.interface.generator.quantum_function_call import (
|
9
11
|
SynthesisQuantumFunctionCall,
|
10
12
|
WireName,
|
@@ -40,7 +42,7 @@ def _parse_call_inputs(
|
|
40
42
|
wire = wires[wire_name]
|
41
43
|
|
42
44
|
if wire.end:
|
43
|
-
raise
|
45
|
+
raise ClassiqValueError(
|
44
46
|
IO_MULTI_USE_ERROR_MSG
|
45
47
|
+ f". The name {wire_name} is used multiple times."
|
46
48
|
)
|
@@ -62,7 +64,7 @@ def _parse_call_outputs(
|
|
62
64
|
wire = wires[wire_name]
|
63
65
|
|
64
66
|
if wire.start:
|
65
|
-
raise
|
67
|
+
raise ClassiqValueError(
|
66
68
|
IO_MULTI_USE_ERROR_MSG
|
67
69
|
+ f". The name {wire_name} is used multiple times."
|
68
70
|
)
|
@@ -148,10 +150,10 @@ def validate_legal_wiring(
|
|
148
150
|
if unconnected_wires:
|
149
151
|
error_messages.append(f"{UNCONNECTED_WIRES_ERROR_MSG}: {unconnected_wires}")
|
150
152
|
|
151
|
-
raise
|
153
|
+
raise ClassiqValueError(_join_errors(error_messages))
|
152
154
|
|
153
155
|
|
154
|
-
def _join_errors(error_messages:
|
156
|
+
def _join_errors(error_messages: list[str]) -> str:
|
155
157
|
if not error_messages:
|
156
158
|
error_messages.append(f"{UNKNOWN_ERROR_MSG}")
|
157
159
|
|
@@ -161,7 +163,7 @@ def _join_errors(error_messages: List[str]) -> str:
|
|
161
163
|
T = TypeVar("T")
|
162
164
|
|
163
165
|
|
164
|
-
def _recurring_names(name_list:
|
166
|
+
def _recurring_names(name_list: list[T]) -> Iterable[T]:
|
165
167
|
name_counter = Counter(name_list)
|
166
168
|
return (name for name, appearances in name_counter.items() if appearances > 1)
|
167
169
|
|
@@ -180,17 +182,17 @@ def validate_acyclic_logic_flow(
|
|
180
182
|
|
181
183
|
if not nx.algorithms.is_directed_acyclic_graph(graph):
|
182
184
|
cycles = list(nx.algorithms.simple_cycles(graph))
|
183
|
-
raise
|
185
|
+
raise ClassiqValueError(CYCLE_ERROR_MSG + ". Cycles are: " + str(cycles))
|
184
186
|
|
185
187
|
return graph
|
186
188
|
|
187
189
|
|
188
190
|
def validate_acyclicity_and_topologically_sort_logic_flow(
|
189
|
-
body:
|
191
|
+
body: list[SynthesisQuantumFunctionCall],
|
190
192
|
*,
|
191
193
|
flow_input_names: Collection[str],
|
192
194
|
flow_output_names: Collection[str],
|
193
|
-
) ->
|
195
|
+
) -> list[SynthesisQuantumFunctionCall]:
|
194
196
|
graph = validate_acyclic_logic_flow(
|
195
197
|
body=body,
|
196
198
|
flow_input_names=flow_input_names,
|
@@ -1,14 +1,16 @@
|
|
1
|
-
from
|
1
|
+
from collections.abc import Iterable, Sequence, Sized
|
2
|
+
from typing import TypeVar
|
2
3
|
|
3
4
|
import numpy as np
|
4
5
|
|
6
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
7
|
from classiq.interface.helpers.custom_pydantic_types import PydanticProbabilityFloat
|
6
8
|
|
7
9
|
NOT_SUM_TO_ONE_ERROR = "Probabilities do not sum to 1"
|
8
10
|
|
9
11
|
SUM_TO_ONE_SENSITIVITY = 8
|
10
12
|
|
11
|
-
Amplitude = TypeVar("Amplitude",
|
13
|
+
Amplitude = TypeVar("Amplitude", tuple[float, ...], list[complex])
|
12
14
|
|
13
15
|
|
14
16
|
def _is_power_of_two(vector: Sized) -> bool:
|
@@ -26,9 +28,9 @@ def is_probabilities_sum_to_one(pro: Iterable[PydanticProbabilityFloat]) -> bool
|
|
26
28
|
|
27
29
|
def validate_amplitudes(amp: Amplitude) -> Amplitude:
|
28
30
|
if not is_amplitudes_sum_to_one(amp):
|
29
|
-
raise
|
31
|
+
raise ClassiqValueError("Amplitudes do not sum to 1")
|
30
32
|
if not _is_power_of_two(amp):
|
31
|
-
raise
|
33
|
+
raise ClassiqValueError("Amplitudes length must be power of 2")
|
32
34
|
return amp
|
33
35
|
|
34
36
|
|
@@ -36,7 +38,7 @@ def validate_probabilities(
|
|
36
38
|
cls: type, pmf: Sequence[PydanticProbabilityFloat]
|
37
39
|
) -> Sequence[PydanticProbabilityFloat]:
|
38
40
|
if not is_probabilities_sum_to_one(pmf):
|
39
|
-
raise
|
41
|
+
raise ClassiqValueError(NOT_SUM_TO_ONE_ERROR)
|
40
42
|
if not _is_power_of_two(pmf):
|
41
|
-
raise
|
43
|
+
raise ClassiqValueError("Probabilities length must be power of 2")
|
42
44
|
return pmf
|
@@ -1,14 +1,10 @@
|
|
1
|
-
from collections import abc
|
1
|
+
from collections import abc, defaultdict
|
2
|
+
from collections.abc import Collection, Mapping, Sequence
|
2
3
|
from typing import (
|
3
4
|
TYPE_CHECKING,
|
4
5
|
Any,
|
5
|
-
|
6
|
-
Dict,
|
7
|
-
List,
|
8
|
-
Mapping,
|
6
|
+
Callable,
|
9
7
|
Optional,
|
10
|
-
Sequence,
|
11
|
-
Tuple,
|
12
8
|
TypeVar,
|
13
9
|
Union,
|
14
10
|
)
|
@@ -21,7 +17,7 @@ NodeType = Union[
|
|
21
17
|
BaseModel,
|
22
18
|
int,
|
23
19
|
bool,
|
24
|
-
|
20
|
+
tuple["NodeType", ...],
|
25
21
|
Mapping[Key, "NodeType"],
|
26
22
|
Sequence["NodeType"],
|
27
23
|
]
|
@@ -47,19 +43,19 @@ class Visitor:
|
|
47
43
|
|
48
44
|
return node
|
49
45
|
|
50
|
-
def visit_list(self, node:
|
46
|
+
def visit_list(self, node: list[NodeType]) -> Optional[RetType]:
|
51
47
|
for elem in node:
|
52
48
|
self.visit(elem)
|
53
49
|
|
54
50
|
return None
|
55
51
|
|
56
|
-
def visit_dict(self, node:
|
52
|
+
def visit_dict(self, node: dict[Key, NodeType]) -> Optional[RetType]:
|
57
53
|
for value in node.values():
|
58
54
|
self.visit(value)
|
59
55
|
|
60
56
|
return None
|
61
57
|
|
62
|
-
def visit_tuple(self, node:
|
58
|
+
def visit_tuple(self, node: tuple[NodeType, ...]) -> Optional[tuple[RetType, ...]]:
|
63
59
|
for value in node:
|
64
60
|
self.visit(value)
|
65
61
|
|
@@ -83,13 +79,24 @@ class Transformer(Visitor):
|
|
83
79
|
|
84
80
|
def visit(self, node: NodeType) -> Any: ...
|
85
81
|
|
86
|
-
def visit_list(self, node:
|
82
|
+
def visit_list(self, node: list[NodeType]) -> list[RetType]:
|
87
83
|
return [self.visit(elem) for elem in node]
|
88
84
|
|
89
|
-
def visit_dict(self, node:
|
85
|
+
def visit_dict(self, node: dict[Key, NodeType]) -> dict[Key, RetType]:
|
90
86
|
return {key: self.visit(value) for key, value in node.items()}
|
91
87
|
|
92
|
-
def
|
88
|
+
def visit_defaultdict(
|
89
|
+
self, node: defaultdict[Key, NodeType]
|
90
|
+
) -> defaultdict[Key, RetType]:
|
91
|
+
new_default_factory: Callable[[], RetType] | None = None
|
92
|
+
if (default_factory := node.default_factory) is not None:
|
93
|
+
|
94
|
+
def new_default_factory() -> RetType:
|
95
|
+
return self.visit(default_factory()) # type: ignore[misc]
|
96
|
+
|
97
|
+
return defaultdict(new_default_factory, self.visit_dict(node))
|
98
|
+
|
99
|
+
def visit_tuple(self, node: tuple[NodeType, ...]) -> tuple[RetType, ...]:
|
93
100
|
return tuple(self.visit(value) for value in node)
|
94
101
|
|
95
102
|
def visit_BaseModel(
|
@@ -97,12 +104,12 @@ class Transformer(Visitor):
|
|
97
104
|
) -> RetType:
|
98
105
|
fields_to_skip = fields_to_skip or set()
|
99
106
|
|
100
|
-
result:
|
107
|
+
result: dict[str, Any] = dict()
|
101
108
|
for name, value in node:
|
102
109
|
if name not in fields_to_skip:
|
103
110
|
result[name] = self.visit(value)
|
104
111
|
|
105
|
-
return node.
|
112
|
+
return node.model_copy(update=result)
|
106
113
|
|
107
114
|
def visit_int(self, n: int) -> int:
|
108
115
|
return n
|