classiq 0.38.0__py3-none-any.whl → 0.65.4__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 +47 -32
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
- classiq/_internals/api_wrapper.py +235 -97
- classiq/_internals/async_utils.py +1 -3
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +10 -5
- classiq/_internals/authentication/password_manager.py +18 -6
- classiq/_internals/authentication/token_manager.py +10 -5
- classiq/_internals/client.py +94 -33
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +60 -57
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +24 -19
- classiq/analyzer/analyzer_utilities.py +10 -10
- classiq/analyzer/rb.py +15 -15
- classiq/analyzer/show_interactive_hack.py +27 -4
- 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 +165 -158
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
- classiq/applications/combinatorial_optimization/__init__.py +20 -6
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
- 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 +48 -42
- classiq/applications/grover/__init__.py +9 -0
- classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +6 -6
- 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 +1 -1
- 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 +5 -5
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +3 -6
- classiq/applications/qsvm/qsvm_data_generation.py +3 -3
- 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 +20 -115
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +43 -13
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +28 -32
- classiq/interface/applications/qsvm.py +20 -29
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -121
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +25 -22
- classiq/interface/backend/quantum_backend_providers.py +69 -16
- classiq/interface/chemistry/fermionic_operator.py +30 -21
- classiq/interface/chemistry/ground_state_problem.py +28 -25
- classiq/interface/chemistry/molecule.py +14 -10
- classiq/interface/chemistry/operator.py +64 -231
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
- 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/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -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/debug_info.py +86 -0
- classiq/{exceptions.py → interface/exceptions.py} +37 -9
- 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/execution_preferences.py +26 -114
- classiq/interface/executor/execution_request.py +24 -46
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +17 -14
- classiq/interface/executor/quantum_code.py +28 -24
- classiq/interface/executor/quantum_instruction_set.py +2 -2
- classiq/interface/executor/register_initialization.py +11 -14
- classiq/interface/executor/result.py +83 -56
- classiq/interface/executor/vqe_result.py +10 -10
- classiq/interface/finance/function_input.py +35 -25
- classiq/interface/finance/gaussian_model_input.py +5 -5
- classiq/interface/finance/log_normal_model_input.py +4 -4
- classiq/interface/finance/model_input.py +4 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +22 -12
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
- 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 +46 -5
- classiq/interface/generator/arith/arithmetic.py +35 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
- classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
- classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
- classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
- classiq/interface/generator/arith/arithmetic_operations.py +14 -6
- 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 +3 -2
- classiq/interface/generator/arith/binary_ops.py +218 -130
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -25
- classiq/interface/generator/arith/logical_ops.py +14 -12
- classiq/interface/generator/arith/number_utils.py +12 -6
- classiq/interface/generator/arith/register_user_input.py +60 -37
- classiq/interface/generator/arith/unary_ops.py +49 -29
- 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 +3 -3
- 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 +7 -7
- classiq/interface/generator/compiler_keywords.py +5 -1
- classiq/interface/generator/complex_type.py +13 -18
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +34 -29
- 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 +21 -5
- 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 +5 -5
- classiq/interface/generator/expressions/expression.py +26 -14
- 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 +34 -8
- 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 +19 -11
- classiq/interface/generator/finance.py +2 -2
- 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 +36 -64
- classiq/interface/generator/functions/__init__.py +0 -22
- 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 +153 -20
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -25
- 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 +9 -9
- classiq/interface/generator/hardware/hardware_data.py +72 -34
- classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
- classiq/interface/generator/hartree_fock.py +13 -5
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +32 -20
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +17 -15
- classiq/interface/generator/mcx.py +24 -17
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +26 -8
- classiq/interface/generator/model/model.py +27 -190
- classiq/interface/generator/model/preferences/preferences.py +115 -41
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +15 -13
- classiq/interface/generator/oracles/oracle_abc.py +7 -7
- 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 +41 -30
- classiq/interface/generator/qsvm.py +9 -10
- classiq/interface/generator/quantum_function_call.py +88 -73
- classiq/interface/generator/quantum_program.py +41 -24
- classiq/interface/generator/range_types.py +11 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +5 -5
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -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 +4 -7
- classiq/interface/generator/state_preparation/state_preparation.py +25 -20
- 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 +7 -11
- classiq/interface/generator/ucc.py +5 -4
- classiq/interface/generator/unitary_gate.py +5 -5
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +7 -7
- classiq/interface/generator/validations/validator_functions.py +4 -4
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +29 -8
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +2 -2
- 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 -5
- classiq/interface/helpers/validation_helpers.py +3 -20
- classiq/interface/helpers/versioned_model.py +1 -4
- 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 +29 -69
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +32 -9
- 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 +29 -24
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +69 -61
- classiq/interface/model/native_function_definition.py +17 -20
- 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 +30 -18
- 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 +141 -343
- classiq/interface/model/quantum_function_declaration.py +190 -157
- classiq/interface/model/quantum_lambda_function.py +33 -32
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +177 -40
- classiq/interface/model/quantum_variable_declaration.py +3 -25
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +40 -14
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +7 -5
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +17 -21
- classiq/interface/source_reference.py +59 -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 +10 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +36 -14
- classiq/qmod/builtins/classical_functions.py +39 -43
- 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 +373 -40
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +2 -2
- classiq/qmod/classical_function.py +4 -8
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +143 -101
- classiq/qmod/expression_query.py +20 -4
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +18 -6
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +16 -11
- classiq/qmod/native/pretty_printer.py +187 -97
- 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 +60 -8
- classiq/qmod/qmod_constant.py +93 -26
- classiq/qmod/qmod_parameter.py +68 -59
- classiq/qmod/qmod_variable.py +468 -155
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +269 -96
- classiq/qmod/quantum_function.py +196 -41
- 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 +147 -123
- classiq/qmod/symbolic_expr.py +27 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +98 -4
- classiq/qmod/write_qmod.py +17 -3
- classiq/synthesis.py +210 -22
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
- classiq-0.65.4.dist-info/RECORD +521 -0
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -25
- classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
- classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
- classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
- 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/interface/executor/aws_execution_cost.py +0 -73
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
- 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/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 -1229
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
- classiq/interface/generator/functions/foreign_function_definition.py +0 -114
- classiq/interface/generator/functions/function_implementation.py +0 -107
- classiq/interface/generator/functions/native_function_definition.py +0 -155
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -44
- classiq/interface/generator/functions/register_mapping_data.py +0 -106
- 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 -74
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/call_synthesis_data.py +0 -68
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -94
- 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 -156
- 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 -462
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -229
- classiq/qmod/builtins/functions.py +0 -913
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -205
- 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.38.0.dist-info/RECORD +0 -454
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
- /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
- /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
- /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,9 +1,11 @@
|
|
1
1
|
import ast
|
2
2
|
from _ast import AST
|
3
|
-
from
|
3
|
+
from collections.abc import Collection
|
4
|
+
from typing import Optional, Union, cast
|
4
5
|
|
5
6
|
import networkx as nx
|
6
7
|
|
8
|
+
from classiq.interface.exceptions import ClassiqArithmeticError
|
7
9
|
from classiq.interface.generator.arith.arithmetic_expression_validator import (
|
8
10
|
DEFAULT_EXPRESSION_TYPE,
|
9
11
|
DEFAULT_SUPPORTED_FUNC_NAMES,
|
@@ -16,11 +18,9 @@ from classiq.interface.generator.arith.ast_node_rewrite import (
|
|
16
18
|
AstNodeRewrite,
|
17
19
|
)
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
_MULTIPLE_RESULTS_ERROR_MESSAGE: str = "Expression cannot contain multiple result"
|
21
|
+
_MULTIPLE_RESULTS_ERROR_MESSAGE: str = "Expression cannot contain multiple results"
|
22
22
|
_UNEXPECTED_ARITHMETIC_ERROR_MESSAGE: str = (
|
23
|
-
"
|
23
|
+
"Quantum expressions that evaluate to a classical value are not supported"
|
24
24
|
)
|
25
25
|
_ALLOWED_MULTI_ARGUMENT_FUNCTIONS = ("min", "max")
|
26
26
|
Node = Union[str, float, int]
|
@@ -29,9 +29,9 @@ Node = Union[str, float, int]
|
|
29
29
|
class ExpressionVisitor(ExpressionValidator):
|
30
30
|
def __init__(
|
31
31
|
self,
|
32
|
-
supported_nodes:
|
32
|
+
supported_nodes: tuple[type[AST], ...],
|
33
33
|
expression_type: str = DEFAULT_EXPRESSION_TYPE,
|
34
|
-
supported_functions: Optional[
|
34
|
+
supported_functions: Optional[set[str]] = None,
|
35
35
|
) -> None:
|
36
36
|
super().__init__(supported_nodes, expression_type, supported_functions)
|
37
37
|
self.graph = nx.DiGraph()
|
@@ -91,8 +91,8 @@ class ExpressionVisitor(ExpressionValidator):
|
|
91
91
|
class InDegreeLimiter:
|
92
92
|
@staticmethod
|
93
93
|
def _sort_in_edges(
|
94
|
-
in_edges: Collection[
|
95
|
-
) ->
|
94
|
+
in_edges: Collection[tuple[Node, str]]
|
95
|
+
) -> list[tuple[Node, str]]:
|
96
96
|
return sorted(
|
97
97
|
in_edges,
|
98
98
|
key=lambda edge_tuple: isinstance(edge_tuple[0], str), # vars before consts
|
@@ -135,9 +135,9 @@ class InDegreeLimiter:
|
|
135
135
|
def parse_expression(
|
136
136
|
expression: str,
|
137
137
|
*,
|
138
|
-
supported_nodes:
|
138
|
+
supported_nodes: tuple[type[AST], ...] = DEFAULT_SUPPORTED_NODE_TYPES,
|
139
139
|
expression_type: str = DEFAULT_EXPRESSION_TYPE,
|
140
|
-
supported_functions: Optional[
|
140
|
+
supported_functions: Optional[set[str]] = None,
|
141
141
|
) -> nx.DiGraph:
|
142
142
|
supported_functions = supported_functions or DEFAULT_SUPPORTED_FUNC_NAMES
|
143
143
|
|
@@ -1,26 +1,23 @@
|
|
1
1
|
import ast
|
2
|
-
import builtins
|
3
2
|
import re
|
4
3
|
from _ast import AST
|
5
|
-
from typing import Any, Optional,
|
4
|
+
from typing import Any, Optional, Union
|
6
5
|
|
7
|
-
from
|
6
|
+
from sympy import Expr
|
7
|
+
from typing_extensions import TypeAlias, get_args
|
8
8
|
|
9
|
+
from classiq.interface.exceptions import ClassiqArithmeticError, ClassiqValueError
|
9
10
|
from classiq.interface.generator.arith.ast_node_rewrite import AstNodeRewrite
|
10
11
|
from classiq.interface.generator.expressions.sympy_supported_expressions import (
|
11
12
|
SYMPY_SUPPORTED_EXPRESSIONS,
|
12
13
|
)
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
DEFAULT_SUPPORTED_FUNC_NAMES: Set[str] = {"CLShift", "CRShift", "min", "max"}
|
15
|
+
DEFAULT_SUPPORTED_FUNC_NAMES: set[str] = {"CLShift", "CRShift", "min", "max"}
|
17
16
|
|
18
17
|
DEFAULT_EXPRESSION_TYPE = "arithmetic"
|
19
18
|
IDENITIFIER_REGEX = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*")
|
20
19
|
|
21
|
-
|
22
|
-
"Repeated variables in the beginning of an arithmetic expression are not allowed."
|
23
|
-
)
|
20
|
+
ValidKeyValuePairs: TypeAlias = dict[str, set[str]]
|
24
21
|
|
25
22
|
SupportedNodesTypes = Union[
|
26
23
|
ast.Expression,
|
@@ -58,20 +55,26 @@ SupportedNodesTypes = Union[
|
|
58
55
|
DEFAULT_SUPPORTED_NODE_TYPES = get_args(SupportedNodesTypes)
|
59
56
|
|
60
57
|
|
58
|
+
def is_constant(expr: Union[str, Expr]) -> bool:
|
59
|
+
try:
|
60
|
+
float(expr)
|
61
|
+
return True
|
62
|
+
except (ValueError, TypeError):
|
63
|
+
return False
|
64
|
+
|
65
|
+
|
61
66
|
class ExpressionValidator(ast.NodeVisitor):
|
62
67
|
def __init__(
|
63
68
|
self,
|
64
|
-
supported_nodes:
|
69
|
+
supported_nodes: tuple[type[AST], ...],
|
65
70
|
expression_type: str = DEFAULT_EXPRESSION_TYPE,
|
66
|
-
supported_functions: Optional[
|
67
|
-
supported_attr_values: Optional[Set[str]] = None,
|
71
|
+
supported_functions: Optional[set[str]] = None,
|
68
72
|
mode: str = "eval",
|
69
73
|
) -> None:
|
70
74
|
super().__init__()
|
71
75
|
self.supported_nodes = supported_nodes
|
72
76
|
self._expression_type = expression_type
|
73
77
|
self._supported_functions = supported_functions or DEFAULT_SUPPORTED_FUNC_NAMES
|
74
|
-
self._supported_attr_values = supported_attr_values or set()
|
75
78
|
self._mode = mode
|
76
79
|
self._ast_obj: Optional[ast.AST] = None
|
77
80
|
|
@@ -92,7 +95,7 @@ class ExpressionValidator(ast.NodeVisitor):
|
|
92
95
|
@staticmethod
|
93
96
|
def _get_adjusted_expression(expression: str) -> str:
|
94
97
|
# This works around the simplification of the trivial expressions such as a + 0, 1 * a, etc.
|
95
|
-
if IDENITIFIER_REGEX.fullmatch(expression):
|
98
|
+
if IDENITIFIER_REGEX.fullmatch(expression) or is_constant(expression):
|
96
99
|
return f"0 + {expression}"
|
97
100
|
return expression
|
98
101
|
|
@@ -102,13 +105,25 @@ class ExpressionValidator(ast.NodeVisitor):
|
|
102
105
|
raise ClassiqArithmeticError("Must call `validate` before getting ast_obj")
|
103
106
|
return self._ast_obj
|
104
107
|
|
105
|
-
|
106
|
-
|
108
|
+
def _check_repeated_variables(
|
109
|
+
self, variables: tuple[Any, Any], expr: ast.AST, error_suffix: str
|
110
|
+
) -> None:
|
111
|
+
if (
|
112
|
+
isinstance(expr, ast.BinOp)
|
113
|
+
and isinstance(expr.op, ast.Pow)
|
114
|
+
and ast.Pow not in self.supported_nodes
|
115
|
+
):
|
116
|
+
raise ClassiqValueError(
|
117
|
+
"Raising to a power (<var> ** <exp>) and multiplying a variable by "
|
118
|
+
"itself (<var> * <var>) are not supported"
|
119
|
+
)
|
107
120
|
if (
|
108
121
|
all(isinstance(var, ast.Name) for var in variables)
|
109
122
|
and variables[0].id == variables[1].id
|
110
123
|
):
|
111
|
-
raise ClassiqValueError(
|
124
|
+
raise ClassiqValueError(
|
125
|
+
f"Expression {ast.unparse(expr)!r} is not supported ({error_suffix})"
|
126
|
+
)
|
112
127
|
|
113
128
|
@staticmethod
|
114
129
|
def _check_multiple_comparators(node: ast.Compare) -> None:
|
@@ -130,7 +145,11 @@ class ExpressionValidator(ast.NodeVisitor):
|
|
130
145
|
)
|
131
146
|
|
132
147
|
def validate_Compare(self, node: ast.Compare) -> None: # noqa: N802
|
133
|
-
self._check_repeated_variables(
|
148
|
+
self._check_repeated_variables(
|
149
|
+
(node.left, node.comparators[0]),
|
150
|
+
node,
|
151
|
+
"both sides of the comparison are identical",
|
152
|
+
)
|
134
153
|
self._check_multiple_comparators(node)
|
135
154
|
|
136
155
|
def visit_Compare(self, node: ast.Compare) -> None:
|
@@ -138,7 +157,9 @@ class ExpressionValidator(ast.NodeVisitor):
|
|
138
157
|
self.generic_visit(node)
|
139
158
|
|
140
159
|
def validate_BinOp(self, node: ast.BinOp) -> None: # noqa: N802
|
141
|
-
self._check_repeated_variables(
|
160
|
+
self._check_repeated_variables(
|
161
|
+
(node.left, node.right), node, "both sides of the operation are identical"
|
162
|
+
)
|
142
163
|
|
143
164
|
def visit_BinOp(self, node: ast.BinOp) -> None:
|
144
165
|
self.validate_BinOp(node)
|
@@ -146,7 +167,11 @@ class ExpressionValidator(ast.NodeVisitor):
|
|
146
167
|
|
147
168
|
def validate_Call(self, node: ast.Call) -> None: # noqa: N802
|
148
169
|
if len(node.args) >= 2:
|
149
|
-
self._check_repeated_variables(
|
170
|
+
self._check_repeated_variables(
|
171
|
+
(node.args[0], node.args[1]),
|
172
|
+
node,
|
173
|
+
"the first two call arguments are identical",
|
174
|
+
)
|
150
175
|
node_id = AstNodeRewrite().extract_node_id(node)
|
151
176
|
if node_id not in self._supported_functions:
|
152
177
|
raise ClassiqValueError(f"{node_id} not in supported functions")
|
@@ -170,26 +195,7 @@ class ExpressionValidator(ast.NodeVisitor):
|
|
170
195
|
self.validate_Constant(node)
|
171
196
|
self.generic_visit(node)
|
172
197
|
|
173
|
-
def validate_Attribute(self, node: ast.Attribute) -> None: # noqa: N802
|
174
|
-
if not (
|
175
|
-
isinstance(node.value, ast.Name)
|
176
|
-
and node.value.id in self._supported_attr_values
|
177
|
-
):
|
178
|
-
raise ClassiqValueError(
|
179
|
-
f"Attribute is not supported for value {node.value}"
|
180
|
-
)
|
181
|
-
|
182
198
|
def visit_Attribute(self, node: ast.Attribute) -> None:
|
183
|
-
self.validate_Attribute(node)
|
184
|
-
self.generic_visit(node)
|
185
|
-
|
186
|
-
def visit_FunctionDef(self, node: ast.FunctionDef) -> Any:
|
187
|
-
if self._mode == "exec":
|
188
|
-
if hasattr(builtins, node.name):
|
189
|
-
raise ClassiqValueError(
|
190
|
-
f"Defining a function named {node.name} is forbidden"
|
191
|
-
)
|
192
|
-
self._supported_functions.add(node.name)
|
193
199
|
self.generic_visit(node)
|
194
200
|
|
195
201
|
@classmethod
|
@@ -200,10 +206,9 @@ class ExpressionValidator(ast.NodeVisitor):
|
|
200
206
|
def validate_expression(
|
201
207
|
expression: str,
|
202
208
|
*,
|
203
|
-
supported_nodes:
|
209
|
+
supported_nodes: tuple[type[AST], ...] = DEFAULT_SUPPORTED_NODE_TYPES,
|
204
210
|
expression_type: str = DEFAULT_EXPRESSION_TYPE,
|
205
|
-
supported_functions: Optional[
|
206
|
-
supported_attr_values: Optional[Set[str]] = None,
|
211
|
+
supported_functions: Optional[set[str]] = None,
|
207
212
|
mode: str = "eval",
|
208
213
|
) -> ast.AST:
|
209
214
|
supported_functions = supported_functions or set(SYMPY_SUPPORTED_EXPRESSIONS).union(
|
@@ -213,7 +218,6 @@ def validate_expression(
|
|
213
218
|
supported_nodes,
|
214
219
|
expression_type,
|
215
220
|
supported_functions,
|
216
|
-
supported_attr_values,
|
217
221
|
mode,
|
218
222
|
)
|
219
223
|
validator.validate(expression)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import abc
|
2
|
-
from
|
2
|
+
from collections.abc import Iterable
|
3
|
+
from typing import ClassVar, Final, Optional
|
3
4
|
|
4
5
|
import pydantic
|
5
6
|
|
@@ -9,11 +10,15 @@ from classiq.interface.generator.arith.machine_precision import (
|
|
9
10
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
10
11
|
from classiq.interface.generator.function_params import FunctionParams
|
11
12
|
|
12
|
-
|
13
|
+
IMPLICIT_OUTPUTS: Final[str] = "implicit_outputs"
|
14
|
+
DEFAULT_GARBAGE_OUT_NAME: Final[str] = "extra_qubits"
|
15
|
+
MODULO_WITH_FRACTION_PLACES_ERROR_MSG: Final[str] = (
|
16
|
+
"Modulo with fraction places not supported"
|
17
|
+
)
|
13
18
|
|
14
19
|
|
15
20
|
class ArithmeticOperationParams(FunctionParams):
|
16
|
-
output_size: Optional[pydantic.PositiveInt]
|
21
|
+
output_size: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
|
17
22
|
machine_precision: pydantic.PositiveInt = DEFAULT_MACHINE_PRECISION
|
18
23
|
output_name: ClassVar[str]
|
19
24
|
garbage_output_name: ClassVar[str] = DEFAULT_GARBAGE_OUT_NAME
|
@@ -40,9 +45,12 @@ class ArithmeticOperationParams(FunctionParams):
|
|
40
45
|
return self.output_size is None
|
41
46
|
|
42
47
|
def _legal_bounds(
|
43
|
-
self, suggested_bounds:
|
44
|
-
) -> Optional[
|
45
|
-
if self.
|
48
|
+
self, suggested_bounds: tuple[float, float], max_bounds: tuple[float, float]
|
49
|
+
) -> Optional[tuple[float, float]]:
|
50
|
+
if self.output_size is None or (
|
51
|
+
suggested_bounds[0] >= max_bounds[0]
|
52
|
+
and suggested_bounds[1] <= max_bounds[1]
|
53
|
+
):
|
46
54
|
return suggested_bounds
|
47
55
|
return None
|
48
56
|
|
@@ -1,5 +1,6 @@
|
|
1
|
-
from typing import Callable,
|
1
|
+
from typing import Callable, Optional
|
2
2
|
|
3
|
+
from classiq.interface.exceptions import ClassiqArithmeticError
|
3
4
|
from classiq.interface.generator.arith.argument_utils import (
|
4
5
|
RegisterOrConst as RegisterOrFloat,
|
5
6
|
)
|
@@ -35,12 +36,10 @@ from classiq.interface.generator.arith.logical_ops import LogicalAnd, LogicalOr
|
|
35
36
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
36
37
|
from classiq.interface.generator.arith.unary_ops import BitwiseInvert, Negation
|
37
38
|
|
38
|
-
from classiq.exceptions import ClassiqArithmeticError
|
39
|
-
|
40
39
|
ParamsGetter = Callable[..., ArithmeticOperationParams] # Argument vary
|
41
40
|
|
42
41
|
_TARGET_ERROR_MESSAGE: str = "Target unavailable for the requested operation"
|
43
|
-
_OPERATIONS_ALLOWING_TARGET:
|
42
|
+
_OPERATIONS_ALLOWING_TARGET: frozenset = frozenset(
|
44
43
|
{"And", "Or", "Eq", "NotEq", "Lt", "Gt", "LtE", "GtE"}
|
45
44
|
)
|
46
45
|
|
@@ -56,7 +55,7 @@ def operation_allows_target(operation: str) -> bool:
|
|
56
55
|
def get_params(
|
57
56
|
*,
|
58
57
|
node_id: str,
|
59
|
-
args:
|
58
|
+
args: list[RegisterOrFloat],
|
60
59
|
machine_precision: int,
|
61
60
|
output_size: Optional[int] = None,
|
62
61
|
inplace_arg: Optional[str] = None,
|
@@ -331,7 +330,7 @@ def less_equal_params_getter(
|
|
331
330
|
|
332
331
|
|
333
332
|
def logical_and_params_getter(
|
334
|
-
*arg:
|
333
|
+
*arg: list[RegisterOrFloat],
|
335
334
|
machine_precision: int,
|
336
335
|
output_size: Optional[int] = None,
|
337
336
|
inplace_arg: Optional[str] = None,
|
@@ -341,7 +340,7 @@ def logical_and_params_getter(
|
|
341
340
|
|
342
341
|
|
343
342
|
def logical_or_params_getter(
|
344
|
-
*arg:
|
343
|
+
*arg: list[RegisterOrFloat],
|
345
344
|
machine_precision: int,
|
346
345
|
output_size: Optional[int] = None,
|
347
346
|
inplace_arg: Optional[str] = None,
|
@@ -435,7 +434,7 @@ def modulo_params_getter(
|
|
435
434
|
)
|
436
435
|
|
437
436
|
|
438
|
-
params_getter_map:
|
437
|
+
params_getter_map: dict[str, ParamsGetter] = dict(
|
439
438
|
BitOr=or_params_getter,
|
440
439
|
BitAnd=and_params_getter,
|
441
440
|
BitXor=xor_params_getter,
|
@@ -1,15 +1,14 @@
|
|
1
|
-
from typing import Any,
|
1
|
+
from typing import Any, Optional
|
2
2
|
|
3
3
|
import networkx as nx
|
4
4
|
|
5
|
+
from classiq.interface.exceptions import ClassiqArithmeticError
|
5
6
|
from classiq.interface.generator.arith import arithmetic_param_getters, number_utils
|
6
7
|
from classiq.interface.generator.arith.argument_utils import RegisterOrConst
|
7
8
|
from classiq.interface.generator.arith.ast_node_rewrite import OUTPUT_SIZE
|
8
9
|
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
ArithmeticDefinitions = Dict[str, RegisterOrConst]
|
11
|
+
ArithmeticDefinitions = dict[str, RegisterOrConst]
|
13
12
|
|
14
13
|
|
15
14
|
class ArithmeticResultBuilder:
|
@@ -20,7 +19,7 @@ class ArithmeticResultBuilder:
|
|
20
19
|
definitions: ArithmeticDefinitions,
|
21
20
|
machine_precision: int,
|
22
21
|
) -> None:
|
23
|
-
self.result = self._fill_operation_results(
|
22
|
+
self.result, self.garbage = self._fill_operation_results(
|
24
23
|
graph=graph,
|
25
24
|
result_definitions=definitions,
|
26
25
|
machine_precision=machine_precision,
|
@@ -44,10 +43,10 @@ class ArithmeticResultBuilder:
|
|
44
43
|
def _compute_inputs_data(
|
45
44
|
cls,
|
46
45
|
*,
|
47
|
-
inputs_node_set:
|
46
|
+
inputs_node_set: set[Any],
|
48
47
|
result_definitions: ArithmeticDefinitions,
|
49
48
|
machine_precision: int,
|
50
|
-
) ->
|
49
|
+
) -> dict[str, RegisterOrConst]:
|
51
50
|
return {
|
52
51
|
cls._convert_int_to_float_str(node): cls.convert_result_definition(
|
53
52
|
node, result_definitions.get(node), machine_precision
|
@@ -62,11 +61,11 @@ class ArithmeticResultBuilder:
|
|
62
61
|
graph: nx.DiGraph,
|
63
62
|
result_definitions: ArithmeticDefinitions,
|
64
63
|
machine_precision: int,
|
65
|
-
) -> RegisterArithmeticInfo:
|
66
|
-
inputs_node_set:
|
64
|
+
) -> tuple[RegisterArithmeticInfo, Optional[RegisterArithmeticInfo]]:
|
65
|
+
inputs_node_set: set[str] = {
|
67
66
|
vertex for vertex, deg in graph.in_degree if deg == 0
|
68
67
|
}
|
69
|
-
node_results:
|
68
|
+
node_results: dict[str, RegisterOrConst] = cls._compute_inputs_data(
|
70
69
|
inputs_node_set=inputs_node_set,
|
71
70
|
result_definitions=result_definitions,
|
72
71
|
machine_precision=machine_precision,
|
@@ -80,29 +79,34 @@ class ArithmeticResultBuilder:
|
|
80
79
|
for predecessor_node in graph.predecessors(node)
|
81
80
|
]
|
82
81
|
if graph.out_degree(node) == 0:
|
83
|
-
return cls.
|
82
|
+
return cls._get_node_result_and_garbage(
|
84
83
|
graph, args, node, machine_precision=machine_precision
|
85
84
|
)
|
86
|
-
node_results[node] = cls.
|
85
|
+
node_results[node], _ = cls._get_node_result_and_garbage(
|
87
86
|
graph, args, node, machine_precision=machine_precision
|
88
87
|
)
|
89
88
|
raise ClassiqArithmeticError("Expression has no result")
|
90
89
|
|
91
90
|
@classmethod
|
92
|
-
def
|
91
|
+
def _get_node_result_and_garbage(
|
93
92
|
cls,
|
94
93
|
graph: nx.DiGraph,
|
95
|
-
args:
|
94
|
+
args: list[RegisterOrConst],
|
96
95
|
node: str,
|
97
96
|
*,
|
98
97
|
machine_precision: int,
|
99
|
-
) -> RegisterArithmeticInfo:
|
100
|
-
|
98
|
+
) -> tuple[RegisterArithmeticInfo, Optional[RegisterArithmeticInfo]]:
|
99
|
+
node_params = arithmetic_param_getters.get_params(
|
101
100
|
node_id=node,
|
102
101
|
args=args,
|
103
102
|
output_size=graph.nodes[node].get(OUTPUT_SIZE, None),
|
104
103
|
machine_precision=machine_precision,
|
105
|
-
)
|
104
|
+
)
|
105
|
+
|
106
|
+
return (
|
107
|
+
node_params.outputs[node_params.output_name],
|
108
|
+
node_params.outputs.get(node_params.garbage_output_name),
|
109
|
+
)
|
106
110
|
|
107
111
|
@staticmethod
|
108
112
|
def _convert_int_to_float_str(node: Any) -> str:
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import ast
|
2
2
|
import itertools
|
3
|
-
from
|
3
|
+
from collections.abc import Iterator
|
4
|
+
from typing import Any, Optional, Union, cast
|
4
5
|
|
5
|
-
from classiq.exceptions import ClassiqArithmeticError
|
6
|
+
from classiq.interface.exceptions import ClassiqArithmeticError
|
6
7
|
|
7
8
|
SEPARATOR: str = "_"
|
8
9
|
OUTPUT_SIZE: str = "output_size"
|