classiq 0.38.0__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 +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.3.dist-info}/METADATA +16 -9
- classiq-0.65.3.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.3.dist-info}/WHEEL +0 -0
@@ -1,22 +1,19 @@
|
|
1
|
-
from typing import Dict, Tuple
|
2
|
-
|
3
1
|
from typing_extensions import TypeAlias
|
4
2
|
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
5
4
|
from classiq.interface.executor.quantum_instruction_set import QuantumInstructionSet
|
6
5
|
from classiq.interface.generator.model.preferences.preferences import QuantumFormat
|
7
6
|
from classiq.interface.hardware import Provider
|
8
7
|
|
9
|
-
from classiq._internals.enum_utils import StrEnum
|
10
|
-
|
11
8
|
Code: TypeAlias = str
|
12
|
-
CodeAndSyntax: TypeAlias =
|
9
|
+
CodeAndSyntax: TypeAlias = tuple[Code, QuantumInstructionSet]
|
13
10
|
|
14
|
-
INSTRUCTION_SET_TO_FORMAT:
|
11
|
+
INSTRUCTION_SET_TO_FORMAT: dict[QuantumInstructionSet, QuantumFormat] = {
|
15
12
|
QuantumInstructionSet.QASM: QuantumFormat.QASM,
|
16
13
|
QuantumInstructionSet.QSHARP: QuantumFormat.QSHARP,
|
17
14
|
QuantumInstructionSet.IONQ: QuantumFormat.IONQ,
|
18
15
|
}
|
19
|
-
VENDOR_TO_INSTRUCTION_SET:
|
16
|
+
VENDOR_TO_INSTRUCTION_SET: dict[Provider, QuantumInstructionSet] = {
|
20
17
|
Provider.CLASSIQ: QuantumInstructionSet.QASM,
|
21
18
|
Provider.IONQ: QuantumInstructionSet.IONQ,
|
22
19
|
Provider.AZURE_QUANTUM: QuantumInstructionSet.QSHARP,
|
@@ -2,15 +2,14 @@ import pydantic
|
|
2
2
|
|
3
3
|
from classiq.interface.chemistry import operator
|
4
4
|
from classiq.interface.chemistry.operator import PauliOperator
|
5
|
+
from classiq.interface.exceptions import ClassiqValueError
|
5
6
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
6
7
|
from classiq.interface.generator.function_params import (
|
7
8
|
DEFAULT_INPUT_NAME,
|
8
9
|
DEFAULT_OUTPUT_NAME,
|
9
10
|
FunctionParams,
|
11
|
+
FunctionParamsNumericParameter,
|
10
12
|
)
|
11
|
-
from classiq.interface.generator.parameters import ParameterFloatType
|
12
|
-
|
13
|
-
from classiq.exceptions import ClassiqValueError
|
14
13
|
|
15
14
|
|
16
15
|
class CommutingPauliExponentiation(FunctionParams):
|
@@ -21,17 +20,18 @@ class CommutingPauliExponentiation(FunctionParams):
|
|
21
20
|
pauli_operator: PauliOperator = pydantic.Field(
|
22
21
|
description="A weighted sum of Pauli strings."
|
23
22
|
)
|
24
|
-
evolution_coefficient:
|
23
|
+
evolution_coefficient: FunctionParamsNumericParameter = pydantic.Field(
|
25
24
|
default=1.0,
|
26
25
|
description="A global coefficient multiplying the operator.",
|
27
|
-
is_exec_param=True,
|
28
26
|
)
|
29
27
|
|
30
|
-
@pydantic.
|
28
|
+
@pydantic.field_validator("pauli_operator")
|
29
|
+
@classmethod
|
31
30
|
def _validate_is_hermitian(cls, pauli_operator: PauliOperator) -> PauliOperator:
|
32
31
|
return operator.validate_operator_is_hermitian(pauli_operator)
|
33
32
|
|
34
|
-
@pydantic.
|
33
|
+
@pydantic.field_validator("pauli_operator")
|
34
|
+
@classmethod
|
35
35
|
def _validate_paulis_commute(cls, pauli_operator: PauliOperator) -> PauliOperator:
|
36
36
|
if not pauli_operator.is_commutative:
|
37
37
|
raise ClassiqValueError("Pauli strings are not commutative")
|
@@ -1,4 +1,8 @@
|
|
1
1
|
EXPANDED_KEYWORD = "expanded__"
|
2
2
|
CAPTURE_SUFFIX = "_captured__"
|
3
3
|
LAMBDA_KEYWORD = "lambda__"
|
4
|
-
|
4
|
+
INPLACE_ARITH_AUX_VAR_PREFIX = "result__temp__"
|
5
|
+
|
6
|
+
|
7
|
+
def generate_original_function_name(name: str) -> str:
|
8
|
+
return name.split(f"_{EXPANDED_KEYWORD}")[0]
|
@@ -1,23 +1,18 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Annotated, Union
|
2
2
|
|
3
|
-
from
|
3
|
+
from pydantic import PlainSerializer, PlainValidator
|
4
|
+
from pydantic.json_schema import WithJsonSchema
|
4
5
|
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
yield cls.validate
|
7
|
+
def validate_complex(v: Union[complex, str]) -> complex:
|
8
|
+
if isinstance(v, str):
|
9
|
+
v = "".join(v.split())
|
10
|
+
return complex(v)
|
11
11
|
|
12
|
-
@classmethod
|
13
|
-
def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None:
|
14
|
-
field_schema.update(
|
15
|
-
pattern=r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j",
|
16
|
-
)
|
17
12
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
13
|
+
Complex = Annotated[
|
14
|
+
complex,
|
15
|
+
PlainValidator(validate_complex),
|
16
|
+
PlainSerializer(lambda x: str(x)),
|
17
|
+
WithJsonSchema({"type": "string", "pattern": r"[+-]?\d+\.?\d* *[+-] *\d+\.?\d*j"}),
|
18
|
+
]
|
@@ -1,10 +1,9 @@
|
|
1
|
-
import
|
2
|
-
|
1
|
+
from classiq.interface.ast_node import ASTNode
|
3
2
|
from classiq.interface.generator.expressions.expression import Expression
|
4
|
-
from classiq.interface.generator.functions.
|
3
|
+
from classiq.interface.generator.functions.concrete_types import ConcreteClassicalType
|
5
4
|
|
6
5
|
|
7
|
-
class Constant(
|
6
|
+
class Constant(ASTNode):
|
8
7
|
name: str
|
9
8
|
const_type: ConcreteClassicalType
|
10
9
|
value: Expression
|
@@ -1,14 +1,13 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from typing import Any
|
3
|
+
from typing import Any
|
4
4
|
|
5
5
|
import pydantic
|
6
|
-
from pydantic import BaseModel
|
6
|
+
from pydantic import BaseModel, ConfigDict
|
7
7
|
|
8
|
+
from classiq.interface.exceptions import ClassiqValueError
|
8
9
|
from classiq.interface.generator.arith.register_user_input import RegisterUserInput
|
9
10
|
|
10
|
-
from classiq.exceptions import ClassiqValueError
|
11
|
-
|
12
11
|
_DEFAULT_CONTROL_NAME: str = "ctrl"
|
13
12
|
_DEFAULT_NUM_CONTROL_QUBITS = 1
|
14
13
|
_INVALID_CONTROL_STATE = "invalid_control_state"
|
@@ -19,45 +18,52 @@ class ControlState(BaseModel):
|
|
19
18
|
default=_DEFAULT_NUM_CONTROL_QUBITS, description="Number of control qubits"
|
20
19
|
)
|
21
20
|
ctrl_state: str = pydantic.Field(
|
22
|
-
default=_INVALID_CONTROL_STATE,
|
21
|
+
default=_INVALID_CONTROL_STATE,
|
22
|
+
description="Control state string",
|
23
|
+
validate_default=True,
|
24
|
+
)
|
25
|
+
name: str = pydantic.Field(
|
26
|
+
default=_DEFAULT_CONTROL_NAME, description="Control name"
|
23
27
|
)
|
24
|
-
name: str = pydantic.Field(default=None, description="Control name")
|
25
28
|
|
26
|
-
@pydantic.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
@pydantic.model_validator(mode="before")
|
30
|
+
@classmethod
|
31
|
+
def _validate_control(cls, values: Any) -> dict[str, Any]:
|
32
|
+
if isinstance(values, dict):
|
33
|
+
num_ctrl_qubits: int = (
|
34
|
+
values.get("num_ctrl_qubits", _DEFAULT_NUM_CONTROL_QUBITS) or 0
|
35
|
+
)
|
32
36
|
|
33
|
-
|
34
|
-
ctrl_state = "1" * num_ctrl_qubits
|
35
|
-
values["ctrl_state"] = ctrl_state
|
37
|
+
ctrl_state: str = values.get("ctrl_state") or _INVALID_CONTROL_STATE
|
36
38
|
|
37
|
-
|
39
|
+
if ctrl_state == _INVALID_CONTROL_STATE:
|
40
|
+
ctrl_state = "1" * num_ctrl_qubits
|
41
|
+
values["ctrl_state"] = ctrl_state
|
38
42
|
|
39
|
-
|
40
|
-
num_ctrl_qubits = len(ctrl_state)
|
41
|
-
values["num_ctrl_qubits"] = num_ctrl_qubits
|
43
|
+
cls.validate_control_string(ctrl_state)
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
"
|
46
|
-
)
|
45
|
+
if num_ctrl_qubits == _DEFAULT_NUM_CONTROL_QUBITS:
|
46
|
+
num_ctrl_qubits = len(ctrl_state)
|
47
|
+
values["num_ctrl_qubits"] = num_ctrl_qubits
|
47
48
|
|
48
|
-
|
49
|
-
|
49
|
+
if len(ctrl_state) != num_ctrl_qubits:
|
50
|
+
raise ClassiqValueError(
|
51
|
+
"Control state length should be equal to the number of control qubits"
|
52
|
+
)
|
53
|
+
|
54
|
+
if "name" not in values or values["name"] is None:
|
55
|
+
values["name"] = f"{_DEFAULT_CONTROL_NAME}_{ctrl_state}"
|
50
56
|
|
51
57
|
return values
|
52
58
|
|
53
59
|
@staticmethod
|
54
60
|
def validate_control_string(ctrl_state: str) -> None:
|
61
|
+
if not ctrl_state:
|
62
|
+
raise ClassiqValueError("Control state cannot be empty")
|
55
63
|
if not set(ctrl_state) <= {"1", "0"}:
|
56
64
|
raise ClassiqValueError(
|
57
65
|
f"Control state can only be constructed from 0 and 1, received: {ctrl_state}"
|
58
66
|
)
|
59
|
-
if not ctrl_state:
|
60
|
-
raise ClassiqValueError("Control state cannot be empty")
|
61
67
|
|
62
68
|
def __str__(self) -> str:
|
63
69
|
return self.ctrl_state
|
@@ -72,5 +78,4 @@ class ControlState(BaseModel):
|
|
72
78
|
def rename(self, name: str) -> ControlState:
|
73
79
|
return ControlState(ctrl_state=self.ctrl_state, name=name)
|
74
80
|
|
75
|
-
|
76
|
-
frozen = True
|
81
|
+
model_config = ConfigDict(frozen=True)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
import pydantic
|
4
|
+
|
5
|
+
from classiq.interface.generator.arith import argument_utils
|
6
|
+
from classiq.interface.generator.arith.register_user_input import RegisterArithmeticInfo
|
7
|
+
from classiq.interface.generator.function_params import FunctionParams
|
8
|
+
|
9
|
+
|
10
|
+
class Copy(FunctionParams):
|
11
|
+
source: argument_utils.RegisterOrConst
|
12
|
+
target: RegisterArithmeticInfo
|
13
|
+
output_size: Optional[pydantic.PositiveInt] = pydantic.Field(default=None)
|
14
|
+
|
15
|
+
@property
|
16
|
+
def source_size(self) -> int:
|
17
|
+
return argument_utils.size(self.source)
|
18
|
+
|
19
|
+
@property
|
20
|
+
def source_reg_size(self) -> int:
|
21
|
+
return (
|
22
|
+
self.source.size if isinstance(self.source, RegisterArithmeticInfo) else 0
|
23
|
+
)
|
24
|
+
|
25
|
+
@property
|
26
|
+
def source_fraction_places(self) -> int:
|
27
|
+
return argument_utils.fraction_places(self.source)
|
28
|
+
|
29
|
+
@property
|
30
|
+
def offset(self) -> int:
|
31
|
+
return self.target.fraction_places - self.source_fraction_places
|
32
|
+
|
33
|
+
@property
|
34
|
+
def source_name(self) -> str:
|
35
|
+
return "source"
|
36
|
+
|
37
|
+
@property
|
38
|
+
def target_name(self) -> str:
|
39
|
+
return "target"
|
40
|
+
|
41
|
+
def _create_ios(self) -> None:
|
42
|
+
self._inputs = {
|
43
|
+
self.target_name: self.target,
|
44
|
+
}
|
45
|
+
if isinstance(self.source, RegisterArithmeticInfo):
|
46
|
+
self._inputs[self.source_name] = self.source
|
47
|
+
self._outputs = {**self._inputs}
|
@@ -1,7 +1,6 @@
|
|
1
|
-
from typing import Dict, Type
|
2
|
-
|
3
1
|
import pydantic
|
4
2
|
|
3
|
+
from classiq.interface.enum_utils import StrEnum
|
5
4
|
from classiq.interface.generator.ansatz_library import (
|
6
5
|
EntanglingLayersArgs,
|
7
6
|
HypercubeArgs,
|
@@ -11,8 +10,6 @@ from classiq.interface.generator.ansatz_library import (
|
|
11
10
|
TwoLocalArgs,
|
12
11
|
)
|
13
12
|
|
14
|
-
from classiq._internals.enum_utils import StrEnum
|
15
|
-
|
16
13
|
|
17
14
|
class CustomAnsatzType(StrEnum):
|
18
15
|
TwoLocal = "TwoLocal"
|
@@ -23,7 +20,7 @@ class CustomAnsatzType(StrEnum):
|
|
23
20
|
RandomTwoQubitGates = "RandomTwoQubitGates"
|
24
21
|
|
25
22
|
|
26
|
-
CUSTOM_ANSATZ_ARGS_MAPPING:
|
23
|
+
CUSTOM_ANSATZ_ARGS_MAPPING: dict[CustomAnsatzType, type[pydantic.BaseModel]] = {
|
27
24
|
CustomAnsatzType.TwoLocal: TwoLocalArgs,
|
28
25
|
CustomAnsatzType.SeparateU3: SeparateU3Args,
|
29
26
|
CustomAnsatzType.Hypercube: HypercubeArgs,
|
@@ -1,5 +1,3 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
import numpy as np
|
4
2
|
|
5
3
|
# Taken and modified from quantum_tsp_tutorials repository of mstechly in github.
|
@@ -10,7 +8,7 @@ def _distance_between_points(point_1: np.ndarray, point_2: np.ndarray) -> float:
|
|
10
8
|
return float(np.linalg.norm(point_1 - point_2))
|
11
9
|
|
12
10
|
|
13
|
-
def get_distance_matrix(cities: np.ndarray) ->
|
11
|
+
def get_distance_matrix(cities: np.ndarray) -> list[list[float]]:
|
14
12
|
number_of_cities = len(cities)
|
15
13
|
matrix = np.zeros((number_of_cities, number_of_cities))
|
16
14
|
for i in range(number_of_cities):
|
@@ -20,14 +18,14 @@ def get_distance_matrix(cities: np.ndarray) -> List[List[float]]:
|
|
20
18
|
return matrix.tolist()
|
21
19
|
|
22
20
|
|
23
|
-
def get_rand_euclidean_distance_matrix(num_points: int) ->
|
21
|
+
def get_rand_euclidean_distance_matrix(num_points: int) -> list[list[float]]:
|
24
22
|
_points_array_dim = 2
|
25
23
|
points = np.random.rand(num_points, _points_array_dim)
|
26
24
|
distance_matrix = get_distance_matrix(points)
|
27
25
|
return distance_matrix
|
28
26
|
|
29
27
|
|
30
|
-
def get_rand_distance_matrix(num_points: int) ->
|
28
|
+
def get_rand_distance_matrix(num_points: int) -> list[list[float]]:
|
31
29
|
distance_matrix = np.random.rand(num_points, num_points)
|
32
30
|
distance_matrix *= 0.5
|
33
31
|
distance_matrix += distance_matrix.T
|
@@ -1,6 +1,11 @@
|
|
1
|
-
|
1
|
+
from classiq.interface.generator.functions.classical_type import CLASSICAL_ATTRIBUTES
|
2
2
|
|
3
|
-
|
3
|
+
SUPPORTED_PYTHON_BUILTIN_FUNCTIONS = {"len", "sum", "print"}
|
4
|
+
|
5
|
+
SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS = {
|
6
|
+
"do_div",
|
7
|
+
"do_slice",
|
8
|
+
"do_subscript",
|
4
9
|
"hypercube_entangler_graph",
|
5
10
|
"grid_entangler_graph",
|
6
11
|
"qft_const_adder_phase",
|
@@ -9,14 +14,25 @@ SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
|
|
9
14
|
"get_type",
|
10
15
|
"struct_literal",
|
11
16
|
"get_field",
|
12
|
-
"fraction_digits",
|
13
|
-
"is_signed",
|
14
17
|
"molecule_problem_to_hamiltonian",
|
15
18
|
"fock_hamiltonian_problem_to_hamiltonian",
|
16
19
|
"molecule_ground_state_solution_post_process",
|
20
|
+
}
|
21
|
+
|
22
|
+
SUPPORTED_CLASSIQ_SYMPY_WRAPPERS = {
|
17
23
|
"BitwiseAnd",
|
18
24
|
"BitwiseXor",
|
19
25
|
"BitwiseNot",
|
20
26
|
"BitwiseOr",
|
21
|
-
|
27
|
+
"LogicalXor",
|
22
28
|
}
|
29
|
+
|
30
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS = {
|
31
|
+
*SUPPORTED_CLASSIQ_BUILTIN_FUNCTIONS,
|
32
|
+
*SUPPORTED_CLASSIQ_SYMPY_WRAPPERS,
|
33
|
+
*SUPPORTED_PYTHON_BUILTIN_FUNCTIONS,
|
34
|
+
}
|
35
|
+
|
36
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD = (
|
37
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS - CLASSICAL_ATTRIBUTES
|
38
|
+
)
|
@@ -1,10 +0,0 @@
|
|
1
|
-
from enum import EnumMeta
|
2
|
-
|
3
|
-
from .chemistry import Element, FermionMapping
|
4
|
-
from .finance_functions import FinanceFunctionType
|
5
|
-
from .ladder_operator import LadderOperator
|
6
|
-
from .optimizers import Optimizer
|
7
|
-
from .pauli import Pauli
|
8
|
-
from .qsvm_feature_map_entanglement import QSVMFeatureMapEntanglement
|
9
|
-
|
10
|
-
BUILTIN_ENUMS = dict(filter(lambda pair: isinstance(pair[1], EnumMeta), vars().items()))
|
@@ -1,22 +1,12 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def from_string(func_str: str) -> "FinanceFunctionType":
|
14
|
-
return FINANCE_FUNCTION_STRING[func_str]
|
15
|
-
|
16
|
-
|
17
|
-
FINANCE_FUNCTION_STRING: Dict[str, FinanceFunctionType] = {
|
18
|
-
"var": FinanceFunctionType.VAR,
|
19
|
-
"expected shortfall": FinanceFunctionType.SHORTFALL,
|
20
|
-
"x**2": FinanceFunctionType.X_SQUARE,
|
21
|
-
"european call option": FinanceFunctionType.EUROPEAN_CALL_OPTION,
|
22
|
-
}
|
1
|
+
from classiq.interface.generator.types.builtin_enum_declarations import (
|
2
|
+
FinanceFunctionType,
|
3
|
+
)
|
4
|
+
|
5
|
+
|
6
|
+
def get_finance_function_dict() -> dict[str, "FinanceFunctionType"]:
|
7
|
+
return {
|
8
|
+
"var": FinanceFunctionType.VAR,
|
9
|
+
"expected shortfall": FinanceFunctionType.SHORTFALL,
|
10
|
+
"x**2": FinanceFunctionType.X_SQUARE,
|
11
|
+
"european call option": FinanceFunctionType.EUROPEAN_CALL_OPTION,
|
12
|
+
}
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import re
|
2
|
+
from collections.abc import Mapping
|
2
3
|
from dataclasses import dataclass
|
3
|
-
from typing import Any,
|
4
|
+
from typing import Any, Optional
|
4
5
|
|
5
6
|
from sympy import Expr
|
6
7
|
from typing_extensions import get_args
|
7
8
|
|
8
9
|
from classiq.interface.backend.pydantic_backend import EXECUTION_PARAMETER_PATTERN
|
10
|
+
from classiq.interface.exceptions import ClassiqValueError
|
9
11
|
from classiq.interface.generator.expressions.expression_types import (
|
10
12
|
ExpressionValue,
|
11
13
|
QmodStructInstance,
|
@@ -13,14 +15,12 @@ from classiq.interface.generator.expressions.expression_types import (
|
|
13
15
|
)
|
14
16
|
from classiq.interface.generator.expressions.handle_identifier import HandleIdentifier
|
15
17
|
|
16
|
-
from classiq.exceptions import ClassiqValueError
|
17
|
-
|
18
18
|
|
19
19
|
@dataclass(frozen=True)
|
20
20
|
class EvaluatedExpression:
|
21
21
|
value: ExpressionValue
|
22
22
|
|
23
|
-
def is_constant(self, constant_type: Optional[
|
23
|
+
def is_constant(self, constant_type: Optional[type] = None) -> bool:
|
24
24
|
if self.value is None:
|
25
25
|
return False
|
26
26
|
|
@@ -29,7 +29,7 @@ class EvaluatedExpression:
|
|
29
29
|
get_args(RuntimeConstant) if constant_type is None else constant_type,
|
30
30
|
)
|
31
31
|
|
32
|
-
def as_constant_type(self, constant_type:
|
32
|
+
def as_constant_type(self, constant_type: type) -> Any:
|
33
33
|
if not self.is_constant():
|
34
34
|
raise ClassiqValueError(
|
35
35
|
f"Invalid access to expression {self.value!r} as {constant_type}"
|
@@ -1,14 +1,17 @@
|
|
1
1
|
import ast
|
2
|
-
from
|
2
|
+
from collections.abc import Mapping
|
3
|
+
from typing import Any, Optional
|
3
4
|
|
4
5
|
import pydantic
|
5
|
-
from pydantic import PrivateAttr
|
6
|
+
from pydantic import ConfigDict, PrivateAttr
|
6
7
|
|
8
|
+
from classiq.interface.ast_node import HashableASTNode
|
9
|
+
from classiq.interface.exceptions import ClassiqError
|
7
10
|
from classiq.interface.generator.arith.arithmetic_expression_validator import (
|
8
11
|
DEFAULT_SUPPORTED_FUNC_NAMES,
|
9
12
|
)
|
10
13
|
from classiq.interface.generator.expressions.atomic_expression_functions import (
|
11
|
-
|
14
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD,
|
12
15
|
)
|
13
16
|
from classiq.interface.generator.expressions.evaluated_expression import (
|
14
17
|
EvaluatedExpression,
|
@@ -17,14 +20,9 @@ from classiq.interface.generator.expressions.sympy_supported_expressions import
|
|
17
20
|
SYMPY_SUPPORTED_EXPRESSIONS,
|
18
21
|
)
|
19
22
|
from classiq.interface.generator.function_params import validate_expression_str
|
20
|
-
from classiq.interface.helpers.hashable_pydantic_base_model import (
|
21
|
-
HashablePydanticBaseModel,
|
22
|
-
)
|
23
|
-
|
24
|
-
from classiq.exceptions import ClassiqError
|
25
23
|
|
26
24
|
|
27
|
-
class Expression(
|
25
|
+
class Expression(HashableASTNode):
|
28
26
|
expr: str
|
29
27
|
_evaluated_expr: Optional[EvaluatedExpression] = PrivateAttr(default=None)
|
30
28
|
|
@@ -33,20 +31,27 @@ class Expression(HashablePydanticBaseModel):
|
|
33
31
|
|
34
32
|
self._try_to_immediate_evaluate()
|
35
33
|
|
36
|
-
@pydantic.
|
34
|
+
@pydantic.field_validator("expr")
|
35
|
+
@classmethod
|
37
36
|
def validate_expression(cls, expr: str) -> str:
|
38
37
|
supported_functions = (
|
39
|
-
|
38
|
+
SUPPORTED_ATOMIC_EXPRESSION_FUNCTIONS_QMOD
|
40
39
|
| set(SYMPY_SUPPORTED_EXPRESSIONS)
|
41
40
|
| set(DEFAULT_SUPPORTED_FUNC_NAMES)
|
42
41
|
)
|
43
42
|
validate_expression_str(expr, supported_functions=supported_functions)
|
44
43
|
return expr
|
45
44
|
|
45
|
+
@pydantic.field_validator("expr")
|
46
|
+
@classmethod
|
47
|
+
def format_expression(cls, expr: str) -> str:
|
48
|
+
expr = ast.unparse(ast.parse(expr))
|
49
|
+
return expr
|
50
|
+
|
46
51
|
def is_evaluated(self) -> bool:
|
47
52
|
return self._evaluated_expr is not None
|
48
53
|
|
49
|
-
def as_constant(self, constant_type:
|
54
|
+
def as_constant(self, constant_type: type) -> Any:
|
50
55
|
return self.value.as_constant_type(constant_type)
|
51
56
|
|
52
57
|
def to_int_value(self) -> int:
|
@@ -65,6 +70,14 @@ class Expression(HashablePydanticBaseModel):
|
|
65
70
|
return self.as_constant(list)
|
66
71
|
|
67
72
|
def _try_to_immediate_evaluate(self) -> None:
|
73
|
+
# FIXME remove special treatment (CAD-22999)
|
74
|
+
if self.expr == "SIGNED":
|
75
|
+
self._evaluated_expr = EvaluatedExpression(value=True)
|
76
|
+
return
|
77
|
+
if self.expr == "UNSIGNED":
|
78
|
+
self._evaluated_expr = EvaluatedExpression(value=False)
|
79
|
+
return
|
80
|
+
|
68
81
|
try:
|
69
82
|
result = ast.literal_eval(self.expr)
|
70
83
|
if isinstance(result, (int, float, bool)):
|
@@ -85,8 +98,7 @@ class Expression(HashablePydanticBaseModel):
|
|
85
98
|
def is_constant(self) -> bool:
|
86
99
|
return self.value.is_constant()
|
87
100
|
|
88
|
-
|
89
|
-
frozen = True
|
101
|
+
model_config = ConfigDict(frozen=True)
|
90
102
|
|
91
103
|
def __str__(self) -> str:
|
92
104
|
return self.expr
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import keyword
|
2
|
-
from typing import
|
2
|
+
from typing import Final
|
3
3
|
|
4
4
|
from classiq.interface.generator.arith.arithmetic_expression_parser import (
|
5
5
|
DEFAULT_SUPPORTED_FUNC_NAMES,
|
@@ -11,9 +11,15 @@ from classiq.interface.generator.function_params import NAME_REGEX
|
|
11
11
|
|
12
12
|
SUPPORTED_VAR_NAMES_REG = NAME_REGEX
|
13
13
|
|
14
|
-
SUPPORTED_FUNC_NAMES:
|
14
|
+
SUPPORTED_FUNC_NAMES: set[str] = (
|
15
15
|
{"or", "and"}
|
16
16
|
.union(DEFAULT_SUPPORTED_FUNC_NAMES)
|
17
17
|
.union(set(SYMPY_SUPPORTED_EXPRESSIONS))
|
18
18
|
)
|
19
|
-
|
19
|
+
BOOLEAN_LITERALS = {"True", "False"}
|
20
|
+
FORBIDDEN_LITERALS: set[str] = set(keyword.kwlist) - SUPPORTED_FUNC_NAMES
|
21
|
+
CPARAM_EXECUTION_SUFFIX: Final[str] = "_param"
|
22
|
+
RESERVED_EXPRESSIONS: frozenset[str] = frozenset({"i"})
|
23
|
+
CPARAM_EXECUTION_SUFFIX_PATTERN = (
|
24
|
+
rf"({CPARAM_EXECUTION_SUFFIX}|^({'|'.join(RESERVED_EXPRESSIONS)}))(_\d+)*$"
|
25
|
+
)
|