classiq 0.37.1__py3-none-any.whl → 0.65.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +49 -34
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +3 -2
- classiq/_analyzer_extras/interactive_hardware.py +3 -3
- classiq/_internals/api_wrapper.py +241 -95
- classiq/_internals/async_utils.py +2 -77
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +18 -8
- classiq/_internals/authentication/password_manager.py +40 -13
- classiq/_internals/authentication/token_manager.py +11 -6
- classiq/_internals/client.py +106 -37
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +56 -50
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +50 -47
- classiq/analyzer/analyzer_utilities.py +15 -15
- classiq/analyzer/rb.py +19 -20
- classiq/analyzer/show_interactive_hack.py +30 -7
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +170 -170
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/applications/combinatorial_helpers/allowed_constraints.py +23 -0
- classiq/applications/combinatorial_helpers/arithmetic/arithmetic_expression.py +35 -0
- classiq/applications/combinatorial_helpers/arithmetic/isolation.py +42 -0
- classiq/applications/combinatorial_helpers/combinatorial_problem_utils.py +166 -0
- classiq/applications/combinatorial_helpers/encoding_mapping.py +107 -0
- classiq/applications/combinatorial_helpers/encoding_utils.py +124 -0
- classiq/applications/combinatorial_helpers/memory.py +75 -0
- classiq/applications/combinatorial_helpers/optimization_model.py +193 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +31 -0
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/applications/combinatorial_helpers/sympy_utils.py +22 -0
- classiq/applications/combinatorial_helpers/transformations/encoding.py +189 -0
- classiq/applications/combinatorial_helpers/transformations/fixed_variables.py +143 -0
- classiq/applications/combinatorial_helpers/transformations/ising_converter.py +120 -0
- classiq/applications/combinatorial_helpers/transformations/penalty.py +31 -0
- classiq/applications/combinatorial_helpers/transformations/penalty_support.py +37 -0
- classiq/applications/combinatorial_helpers/transformations/sign_seperation.py +74 -0
- classiq/applications/combinatorial_helpers/transformations/slack_variables.py +87 -0
- classiq/applications/combinatorial_optimization/__init__.py +24 -5
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/applications/combinatorial_optimization/combinatorial_optimization_model_constructor.py +137 -0
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +50 -57
- classiq/applications/grover/__init__.py +9 -0
- classiq/applications/grover/grover_model_constructor.py +157 -0
- classiq/applications/hamiltonian/__init__.py +0 -0
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/__init__.py +0 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +8 -8
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +2 -2
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +7 -7
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +4 -10
- classiq/applications/qsvm/qsvm_data_generation.py +5 -8
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +23 -117
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +49 -16
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +36 -32
- classiq/interface/applications/qsvm.py +28 -25
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -119
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +27 -22
- classiq/interface/backend/quantum_backend_providers.py +70 -16
- classiq/interface/chemistry/fermionic_operator.py +43 -32
- classiq/interface/chemistry/ground_state_problem.py +42 -24
- classiq/interface/chemistry/molecule.py +20 -14
- classiq/interface/chemistry/operator.py +75 -236
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +2 -4
- classiq/interface/combinatorial_optimization/examples/greater_than_ilp.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ilp.py +2 -1
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mds.py +2 -1
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/mis.py +4 -1
- classiq/interface/combinatorial_optimization/examples/mvc.py +2 -1
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +3 -3
- classiq/interface/combinatorial_optimization/examples/tsp.py +4 -3
- classiq/interface/combinatorial_optimization/examples/tsp_digraph.py +6 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +14 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/__init__.py +0 -0
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/interface/exceptions.py +201 -0
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/estimation.py +2 -2
- classiq/interface/executor/execution_preferences.py +26 -143
- classiq/interface/executor/execution_request.py +36 -56
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +34 -22
- classiq/interface/executor/{quantum_program.py → quantum_code.py} +44 -34
- classiq/interface/executor/quantum_instruction_set.py +3 -2
- classiq/interface/executor/register_initialization.py +12 -17
- classiq/interface/executor/result.py +122 -64
- classiq/interface/executor/vqe_result.py +11 -11
- classiq/interface/finance/function_input.py +42 -19
- classiq/interface/finance/gaussian_model_input.py +7 -5
- classiq/interface/finance/log_normal_model_input.py +6 -4
- classiq/interface/finance/model_input.py +6 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +27 -14
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/__init__.py +1 -0
- classiq/interface/generator/application_apis/arithmetic_declarations.py +17 -0
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +57 -6
- classiq/interface/generator/arith/arithmetic.py +37 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +15 -17
- classiq/interface/generator/arith/arithmetic_expression_abc.py +70 -26
- classiq/interface/generator/arith/arithmetic_expression_parser.py +18 -12
- classiq/interface/generator/arith/arithmetic_expression_validator.py +61 -43
- classiq/interface/generator/arith/arithmetic_operations.py +19 -16
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +4 -3
- classiq/interface/generator/arith/binary_ops.py +375 -139
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -23
- classiq/interface/generator/arith/logical_ops.py +16 -12
- classiq/interface/generator/arith/machine_precision.py +3 -0
- classiq/interface/generator/arith/number_utils.py +44 -48
- classiq/interface/generator/arith/register_user_input.py +70 -27
- classiq/interface/generator/arith/unary_ops.py +57 -46
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +5 -5
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +8 -6
- classiq/interface/generator/compiler_keywords.py +8 -0
- classiq/interface/generator/complex_type.py +13 -25
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +35 -28
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +26 -8
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +21 -7
- classiq/interface/generator/expressions/expression.py +27 -15
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +59 -0
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +20 -11
- classiq/interface/generator/finance.py +3 -3
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +42 -69
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/__init__.py +0 -0
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +155 -22
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -23
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +12 -8
- classiq/interface/generator/hardware/hardware_data.py +76 -36
- classiq/interface/generator/hardware_efficient_ansatz.py +38 -17
- classiq/interface/generator/hartree_fock.py +14 -4
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +33 -19
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +20 -16
- classiq/interface/generator/mcx.py +29 -20
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +27 -8
- classiq/interface/generator/model/model.py +32 -203
- classiq/interface/generator/model/preferences/preferences.py +118 -43
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +27 -22
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +17 -13
- classiq/interface/generator/oracles/oracle_abc.py +9 -9
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +47 -34
- classiq/interface/generator/qsvm.py +13 -17
- classiq/interface/generator/quantum_function_call.py +107 -87
- classiq/interface/generator/{generated_circuit.py → quantum_program.py} +50 -37
- classiq/interface/generator/range_types.py +13 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +11 -6
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +32 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +5 -7
- classiq/interface/generator/state_preparation/state_preparation.py +30 -23
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +15 -14
- classiq/interface/generator/ucc.py +9 -6
- classiq/interface/generator/unitary_gate.py +10 -6
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +11 -9
- classiq/interface/generator/validations/validator_functions.py +8 -6
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +31 -10
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +3 -0
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -11
- classiq/interface/helpers/validation_helpers.py +4 -21
- classiq/interface/helpers/versioned_model.py +1 -1
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +35 -6
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +44 -14
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +31 -26
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +87 -73
- classiq/interface/model/native_function_definition.py +16 -21
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +38 -21
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +146 -462
- classiq/interface/model/quantum_function_declaration.py +193 -152
- classiq/interface/model/quantum_lambda_function.py +65 -0
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +205 -67
- classiq/interface/model/quantum_variable_declaration.py +4 -26
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +58 -0
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +13 -0
- classiq/interface/pyomo_extension/pyomo_sympy_bimap.py +4 -1
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +22 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/__init__.py +0 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +17 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +60 -47
- classiq/qmod/builtins/classical_functions.py +44 -38
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +379 -57
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +42 -0
- classiq/qmod/classical_function.py +8 -20
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +145 -112
- classiq/qmod/expression_query.py +39 -0
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +19 -5
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +194 -0
- classiq/qmod/native/pretty_printer.py +401 -0
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +79 -0
- classiq/qmod/qmod_constant.py +143 -0
- classiq/qmod/qmod_parameter.py +84 -53
- classiq/qmod/qmod_variable.py +497 -100
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +278 -105
- classiq/qmod/quantum_function.py +232 -48
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +178 -111
- classiq/qmod/symbolic_expr.py +36 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +108 -1
- classiq/qmod/write_qmod.py +53 -0
- classiq/synthesis.py +210 -22
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/METADATA +16 -8
- classiq-0.65.3.dist-info/RECORD +521 -0
- {classiq-0.37.1.dist-info → classiq-0.65.3.dist-info}/WHEEL +1 -1
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -67
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -17
- classiq/applications_model_constructors/combinatorial_optimization_model_constructor.py +0 -178
- classiq/applications_model_constructors/grover_model_constructor.py +0 -227
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -109
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/exceptions.py +0 -131
- classiq/interface/executor/aws_execution_cost.py +0 -72
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -115
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -59
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/expressions/qmod_qnum_proxy.py +0 -22
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -862
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -169
- classiq/interface/generator/functions/foreign_function_definition.py +0 -106
- classiq/interface/generator/functions/function_implementation.py +0 -103
- classiq/interface/generator/functions/native_function_definition.py +0 -153
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -42
- classiq/interface/generator/functions/register_mapping_data.py +0 -102
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -63
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -2
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/generator/types/builtin_struct_declarations/qaoa_declarations.py +0 -23
- classiq/interface/generator/types/combinatorial_problem.py +0 -26
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/numeric_reinterpretation.py +0 -25
- classiq/interface/model/operator_synthesis_data.py +0 -48
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -95
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -154
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -466
- classiq/model/function_handler.pyi +0 -152
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -246
- classiq/qmod/builtins/functions.py +0 -896
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -207
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.37.1.dist-info/RECORD +0 -418
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/combinatorial_helpers/arithmetic}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/combinatorial_helpers/pauli_helpers}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → applications/combinatorial_helpers/py.typed} +0 -0
- /classiq/{interface/model/resolvers → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{interface/model/validations → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py
RENAMED
@@ -1,18 +1,27 @@
|
|
1
1
|
# flake8: noqa
|
2
2
|
|
3
|
-
from typing import
|
3
|
+
from typing import Optional, cast
|
4
|
+
from collections.abc import Mapping
|
4
5
|
|
5
6
|
from classiq.interface.chemistry.fermionic_operator import (
|
6
7
|
FermionicOperator,
|
7
8
|
SummedFermionicOperator,
|
8
9
|
)
|
10
|
+
from classiq.interface.model.allocate import Allocate
|
11
|
+
from classiq.interface.model.quantum_statement import QuantumStatement
|
12
|
+
from classiq.qmod.builtins.structs import (
|
13
|
+
MoleculeProblem as QmodMoleculeProblem,
|
14
|
+
Molecule as QmodMolecule,
|
15
|
+
ChemistryAtom as QmodChemistryAtom,
|
16
|
+
Position as QmodPosition,
|
17
|
+
)
|
9
18
|
from classiq.interface.chemistry.ground_state_problem import (
|
10
19
|
CHEMISTRY_PROBLEMS_TYPE,
|
11
20
|
HamiltonianProblem,
|
12
21
|
MoleculeProblem,
|
13
22
|
)
|
14
23
|
from classiq.interface.chemistry.molecule import Atom
|
15
|
-
from classiq.
|
24
|
+
from classiq.qmod.builtins.enums import (
|
16
25
|
Element,
|
17
26
|
FermionMapping,
|
18
27
|
)
|
@@ -20,20 +29,20 @@ from classiq.interface.generator.expressions.expression import Expression
|
|
20
29
|
from classiq.interface.generator.function_params import IOName
|
21
30
|
from classiq.interface.generator.functions.classical_type import (
|
22
31
|
ClassicalArray,
|
23
|
-
ClassicalType,
|
24
32
|
Real,
|
25
33
|
)
|
26
34
|
from classiq.interface.generator.functions.port_declaration import (
|
27
35
|
PortDeclarationDirection,
|
28
36
|
)
|
37
|
+
from classiq.interface.model.classical_parameter_declaration import (
|
38
|
+
ClassicalParameterDeclaration,
|
39
|
+
)
|
29
40
|
from classiq.interface.model.handle_binding import HandleBinding
|
30
41
|
from classiq.interface.model.model import Model, SerializedModel
|
31
42
|
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
32
43
|
from classiq.interface.model.port_declaration import PortDeclaration
|
33
|
-
from classiq.interface.model.quantum_function_call import
|
34
|
-
|
35
|
-
QuantumLambdaFunction,
|
36
|
-
)
|
44
|
+
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
45
|
+
from classiq.interface.model.quantum_lambda_function import QuantumLambdaFunction
|
37
46
|
|
38
47
|
from classiq.applications.chemistry.ansatz_parameters import (
|
39
48
|
AnsatzParameters,
|
@@ -44,19 +53,21 @@ from classiq.applications.chemistry.ansatz_parameters import (
|
|
44
53
|
from classiq.applications.chemistry.chemistry_execution_parameters import (
|
45
54
|
ChemistryExecutionParameters,
|
46
55
|
)
|
47
|
-
from classiq.exceptions import ClassiqError
|
56
|
+
from classiq.interface.exceptions import ClassiqError
|
57
|
+
from classiq.qmod.utilities import qmod_val_to_expr_str
|
58
|
+
from classiq.open_library.functions.hea import full_hea
|
48
59
|
|
49
|
-
_LADDER_OPERATOR_TYPE_INDICATOR_TO_QMOD_MAPPING:
|
60
|
+
_LADDER_OPERATOR_TYPE_INDICATOR_TO_QMOD_MAPPING: dict[str, str] = {
|
50
61
|
"+": "PLUS",
|
51
62
|
"-": "MINUS",
|
52
63
|
}
|
53
64
|
|
54
|
-
_CHEMISTRY_PROBLEM_PREFIX_MAPPING:
|
65
|
+
_CHEMISTRY_PROBLEM_PREFIX_MAPPING: dict[type[CHEMISTRY_PROBLEMS_TYPE], str] = {
|
55
66
|
MoleculeProblem: "molecule",
|
56
67
|
HamiltonianProblem: "fock_hamiltonian",
|
57
68
|
}
|
58
69
|
|
59
|
-
_ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING:
|
70
|
+
_ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: dict[type[AnsatzParameters], str] = {
|
60
71
|
UCCParameters: "ucc",
|
61
72
|
HVAParameters: "hva",
|
62
73
|
}
|
@@ -64,180 +75,158 @@ _ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING: Dict[Type[AnsatzParameters], str] = {
|
|
64
75
|
_EXECUTION_RESULT = "vqe_result"
|
65
76
|
_MOLECULE_PROBLEM_RESULT = "molecule_result"
|
66
77
|
|
67
|
-
_HAE_GATE_MAPPING:
|
78
|
+
_HAE_GATE_MAPPING: dict[str, QuantumFunctionCall] = {
|
68
79
|
"h": QuantumFunctionCall(
|
69
80
|
function="H",
|
70
|
-
|
81
|
+
positional_args=[HandleBinding(name="q")],
|
71
82
|
),
|
72
83
|
"x": QuantumFunctionCall(
|
73
84
|
function="X",
|
74
|
-
|
85
|
+
positional_args=[HandleBinding(name="q")],
|
75
86
|
),
|
76
87
|
"y": QuantumFunctionCall(
|
77
88
|
function="Y",
|
78
|
-
|
89
|
+
positional_args=[HandleBinding(name="q")],
|
79
90
|
),
|
80
91
|
"z": QuantumFunctionCall(
|
81
92
|
function="Z",
|
82
|
-
|
93
|
+
positional_args=[HandleBinding(name="q")],
|
83
94
|
),
|
84
95
|
"i": QuantumFunctionCall(
|
85
96
|
function="I",
|
86
|
-
|
97
|
+
positional_args=[HandleBinding(name="q")],
|
87
98
|
),
|
88
99
|
"s": QuantumFunctionCall(
|
89
100
|
function="S",
|
90
|
-
|
101
|
+
positional_args=[HandleBinding(name="q")],
|
91
102
|
),
|
92
103
|
"t": QuantumFunctionCall(
|
93
104
|
function="T",
|
94
|
-
|
105
|
+
positional_args=[HandleBinding(name="q")],
|
95
106
|
),
|
96
107
|
"sdg": QuantumFunctionCall(
|
97
108
|
function="SDG",
|
98
|
-
|
109
|
+
positional_args=[HandleBinding(name="q")],
|
99
110
|
),
|
100
111
|
"tdg": QuantumFunctionCall(
|
101
112
|
function="TDG",
|
102
|
-
|
113
|
+
positional_args=[HandleBinding(name="q")],
|
103
114
|
),
|
104
115
|
"p": QuantumFunctionCall(
|
105
116
|
function="PHASE",
|
106
|
-
|
117
|
+
positional_args=[HandleBinding(name="q")],
|
107
118
|
),
|
108
119
|
"rx": QuantumFunctionCall(
|
109
120
|
function="RX",
|
110
|
-
|
111
|
-
inouts={"target": HandleBinding(name="q")},
|
121
|
+
positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
|
112
122
|
),
|
113
123
|
"ry": QuantumFunctionCall(
|
114
124
|
function="RY",
|
115
|
-
|
116
|
-
inouts={"target": HandleBinding(name="q")},
|
125
|
+
positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
|
117
126
|
),
|
118
127
|
"rz": QuantumFunctionCall(
|
119
128
|
function="RZ",
|
120
|
-
|
121
|
-
inouts={"target": HandleBinding(name="q")},
|
129
|
+
positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
|
122
130
|
),
|
123
131
|
"rxx": QuantumFunctionCall(
|
124
132
|
function="RXX",
|
125
|
-
|
126
|
-
inouts={"target": HandleBinding(name="q")},
|
133
|
+
positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
|
127
134
|
),
|
128
135
|
"ryy": QuantumFunctionCall(
|
129
136
|
function="RYY",
|
130
|
-
|
131
|
-
inouts={"target": HandleBinding(name="q")},
|
137
|
+
positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
|
132
138
|
),
|
133
139
|
"rzz": QuantumFunctionCall(
|
134
140
|
function="RZZ",
|
135
|
-
|
136
|
-
inouts={"target": HandleBinding(name="q")},
|
141
|
+
positional_args=[Expression(expr="angle"), HandleBinding(name="q")],
|
137
142
|
),
|
138
143
|
"ch": QuantumFunctionCall(
|
139
144
|
function="CH",
|
140
|
-
|
141
|
-
"target": HandleBinding(name="q1"),
|
142
|
-
"control": HandleBinding(name="q2"),
|
143
|
-
},
|
145
|
+
positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
|
144
146
|
),
|
145
147
|
"cx": QuantumFunctionCall(
|
146
148
|
function="CX",
|
147
|
-
|
148
|
-
"target": HandleBinding(name="q1"),
|
149
|
-
"control": HandleBinding(name="q2"),
|
150
|
-
},
|
149
|
+
positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
|
151
150
|
),
|
152
151
|
"cy": QuantumFunctionCall(
|
153
152
|
function="CY",
|
154
|
-
|
155
|
-
"target": HandleBinding(name="q1"),
|
156
|
-
"control": HandleBinding(name="q2"),
|
157
|
-
},
|
153
|
+
positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
|
158
154
|
),
|
159
155
|
"cz": QuantumFunctionCall(
|
160
156
|
function="CZ",
|
161
|
-
|
162
|
-
"target": HandleBinding(name="q1"),
|
163
|
-
"control": HandleBinding(name="q2"),
|
164
|
-
},
|
157
|
+
positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
|
165
158
|
),
|
166
159
|
"crx": QuantumFunctionCall(
|
167
160
|
function="CRX",
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
161
|
+
positional_args=[
|
162
|
+
Expression(expr="angle"),
|
163
|
+
HandleBinding(name="q1"),
|
164
|
+
HandleBinding(name="q2"),
|
165
|
+
],
|
173
166
|
),
|
174
167
|
"cry": QuantumFunctionCall(
|
175
168
|
function="CRY",
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
169
|
+
positional_args=[
|
170
|
+
Expression(expr="angle"),
|
171
|
+
HandleBinding(name="q1"),
|
172
|
+
HandleBinding(name="q2"),
|
173
|
+
],
|
181
174
|
),
|
182
175
|
"crz": QuantumFunctionCall(
|
183
176
|
function="CRZ",
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
177
|
+
positional_args=[
|
178
|
+
Expression(expr="angle"),
|
179
|
+
HandleBinding(name="q1"),
|
180
|
+
HandleBinding(name="q2"),
|
181
|
+
],
|
189
182
|
),
|
190
183
|
"cp": QuantumFunctionCall(
|
191
184
|
function="CPHASE",
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
185
|
+
positional_args=[
|
186
|
+
Expression(expr="angle"),
|
187
|
+
HandleBinding(name="q1"),
|
188
|
+
HandleBinding(name="q2"),
|
189
|
+
],
|
197
190
|
),
|
198
191
|
"swap": QuantumFunctionCall(
|
199
192
|
function="SWAP",
|
200
|
-
|
193
|
+
positional_args=[HandleBinding(name="q1"), HandleBinding(name="q2")],
|
201
194
|
),
|
202
195
|
}
|
203
196
|
|
204
197
|
|
205
|
-
def _atoms_to_qmod_atoms(atoms:
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
")"
|
198
|
+
def _atoms_to_qmod_atoms(atoms: list[Atom]) -> list[QmodChemistryAtom]:
|
199
|
+
return [
|
200
|
+
QmodChemistryAtom(
|
201
|
+
element=Element[atom.symbol], # type:ignore[arg-type]
|
202
|
+
position=QmodPosition(
|
203
|
+
x=atom.x, # type:ignore[arg-type]
|
204
|
+
y=atom.y, # type:ignore[arg-type]
|
205
|
+
z=atom.z, # type:ignore[arg-type]
|
206
|
+
),
|
207
|
+
)
|
216
208
|
for atom in atoms
|
217
209
|
]
|
218
|
-
# fmt: on
|
219
|
-
return ",".join(atom_struct_literals)
|
220
210
|
|
221
211
|
|
222
|
-
def
|
212
|
+
def molecule_problem_to_qmod(
|
223
213
|
molecule_problem: MoleculeProblem,
|
224
|
-
) ->
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
# fmt: on
|
214
|
+
) -> QmodMoleculeProblem:
|
215
|
+
return QmodMoleculeProblem(
|
216
|
+
mapping=FermionMapping[ # type:ignore[arg-type]
|
217
|
+
molecule_problem.mapping.value.upper()
|
218
|
+
],
|
219
|
+
z2_symmetries=molecule_problem.z2_symmetries, # type:ignore[arg-type]
|
220
|
+
molecule=QmodMolecule(
|
221
|
+
atoms=_atoms_to_qmod_atoms(
|
222
|
+
molecule_problem.molecule.atoms
|
223
|
+
), # type:ignore[arg-type]
|
224
|
+
spin=molecule_problem.molecule.spin, # type:ignore[arg-type]
|
225
|
+
charge=molecule_problem.molecule.charge, # type:ignore[arg-type]
|
226
|
+
),
|
227
|
+
freeze_core=molecule_problem.freeze_core, # type:ignore[arg-type]
|
228
|
+
remove_orbitals=molecule_problem.remove_orbitals, # type:ignore[arg-type]
|
229
|
+
)
|
241
230
|
|
242
231
|
|
243
232
|
def _fermionic_operator_to_qmod_ladder_ops(
|
@@ -273,11 +262,12 @@ def _summed_fermionic_operator_to_qmod_lader_terms(
|
|
273
262
|
def _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(
|
274
263
|
hamiltonian_problem: HamiltonianProblem,
|
275
264
|
) -> str:
|
265
|
+
mapping = FermionMapping[hamiltonian_problem.mapping.value.upper()]
|
276
266
|
return (
|
277
267
|
# fmt: off
|
278
268
|
"struct_literal("
|
279
269
|
"FockHamiltonianProblem,"
|
280
|
-
f"mapping={
|
270
|
+
f"mapping={qmod_val_to_expr_str(mapping)},"
|
281
271
|
f"z2_symmetries={hamiltonian_problem.z2_symmetries},"
|
282
272
|
f"terms=[{_summed_fermionic_operator_to_qmod_lader_terms(hamiltonian_problem.hamiltonian)}],"
|
283
273
|
f"num_particles={hamiltonian_problem.num_particles}"
|
@@ -288,7 +278,7 @@ def _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(
|
|
288
278
|
|
289
279
|
def _convert_library_problem_to_qmod_problem(problem: CHEMISTRY_PROBLEMS_TYPE) -> str:
|
290
280
|
if isinstance(problem, MoleculeProblem):
|
291
|
-
return
|
281
|
+
return qmod_val_to_expr_str(molecule_problem_to_qmod(problem))
|
292
282
|
elif isinstance(problem, HamiltonianProblem):
|
293
283
|
return _hamiltonian_problem_to_qmod_fock_hamiltonian_problem(problem)
|
294
284
|
else:
|
@@ -299,18 +289,18 @@ def _get_chemistry_function(
|
|
299
289
|
chemistry_problem: CHEMISTRY_PROBLEMS_TYPE,
|
300
290
|
chemistry_function_name: str,
|
301
291
|
inouts: Mapping[IOName, HandleBinding],
|
302
|
-
ansatz_parameters_expressions: Optional[
|
292
|
+
ansatz_parameters_expressions: Optional[list[Expression]] = None,
|
303
293
|
) -> QuantumFunctionCall:
|
304
294
|
problem_prefix = _CHEMISTRY_PROBLEM_PREFIX_MAPPING[type(chemistry_problem)]
|
305
295
|
return QuantumFunctionCall(
|
306
296
|
function=f"{problem_prefix}_{chemistry_function_name}",
|
307
|
-
|
308
|
-
|
309
|
-
f"{problem_prefix}_problem": Expression(
|
297
|
+
positional_args=[
|
298
|
+
Expression(
|
310
299
|
expr=_convert_library_problem_to_qmod_problem(chemistry_problem)
|
311
300
|
),
|
312
|
-
|
313
|
-
|
301
|
+
*(ansatz_parameters_expressions or []),
|
302
|
+
*inouts.values(),
|
303
|
+
],
|
314
304
|
)
|
315
305
|
|
316
306
|
|
@@ -327,28 +317,32 @@ def _get_hartree_fock(
|
|
327
317
|
def _get_hea_function(hea_parameters: HEAParameters) -> QuantumFunctionCall:
|
328
318
|
return QuantumFunctionCall(
|
329
319
|
function="full_hea",
|
330
|
-
|
331
|
-
|
332
|
-
|
320
|
+
positional_args=[
|
321
|
+
Expression(expr=f"{hea_parameters.num_qubits}"),
|
322
|
+
Expression(
|
333
323
|
expr=f"{[int(_is_parametric_gate(_HAE_GATE_MAPPING[gate])) for gate in hea_parameters.one_qubit_gates+hea_parameters.two_qubit_gates]}"
|
334
324
|
),
|
335
|
-
"
|
325
|
+
Expression(expr="t"),
|
326
|
+
Expression(
|
336
327
|
expr=f"{[list(connectivity_pair) for connectivity_pair in hea_parameters.connectivity_map]}"
|
337
328
|
),
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
329
|
+
Expression(expr=f"{hea_parameters.reps}"),
|
330
|
+
[
|
331
|
+
QuantumLambdaFunction(
|
332
|
+
pos_rename_params=["angle", "q"],
|
333
|
+
body=[_HAE_GATE_MAPPING[gate]],
|
334
|
+
)
|
344
335
|
for gate in hea_parameters.one_qubit_gates
|
345
336
|
],
|
346
|
-
|
347
|
-
QuantumLambdaFunction(
|
337
|
+
[
|
338
|
+
QuantumLambdaFunction(
|
339
|
+
pos_rename_params=["angle", "q1", "q2"],
|
340
|
+
body=[_HAE_GATE_MAPPING[gate]],
|
341
|
+
)
|
348
342
|
for gate in hea_parameters.two_qubit_gates
|
349
343
|
],
|
350
|
-
|
351
|
-
|
344
|
+
HandleBinding(name="qbv"),
|
345
|
+
],
|
352
346
|
)
|
353
347
|
|
354
348
|
|
@@ -362,10 +356,10 @@ def _get_ansatz(
|
|
362
356
|
chemistry_problem,
|
363
357
|
_ANSATZ_PARAMETERS_FUNCTION_NAME_MAPPING[type(ansatz_parameters)],
|
364
358
|
{"qbv": HandleBinding(name="qbv")},
|
365
|
-
|
366
|
-
|
359
|
+
[
|
360
|
+
Expression(expr=str(param_value))
|
367
361
|
for param_name, param_value in ansatz_parameters.__dict__.items()
|
368
|
-
|
362
|
+
],
|
369
363
|
)
|
370
364
|
|
371
365
|
|
@@ -387,19 +381,16 @@ def _get_molecule_problem_execution_post_processing(
|
|
387
381
|
molecule_problem: MoleculeProblem,
|
388
382
|
) -> str:
|
389
383
|
return f"""
|
390
|
-
{_MOLECULE_PROBLEM_RESULT} = molecule_ground_state_solution_post_process({
|
384
|
+
{_MOLECULE_PROBLEM_RESULT} = molecule_ground_state_solution_post_process({qmod_val_to_expr_str(molecule_problem_to_qmod(molecule_problem))},{_EXECUTION_RESULT})
|
391
385
|
save({{{_MOLECULE_PROBLEM_RESULT!r}: {_MOLECULE_PROBLEM_RESULT}}})
|
392
386
|
"""
|
393
387
|
|
394
388
|
|
395
|
-
def _get_fock_hamiltonian_problem_execution_post_processing(
|
396
|
-
hamiltonian_problem: HamiltonianProblem,
|
397
|
-
) -> str:
|
398
|
-
return f"save({{{_EXECUTION_RESULT!r}: {_EXECUTION_RESULT}}})"
|
399
|
-
|
400
|
-
|
401
389
|
def _is_parametric_gate(call: QuantumFunctionCall) -> bool:
|
402
|
-
|
390
|
+
# FIXME: call call.params instead (CAD-21568)
|
391
|
+
return any(
|
392
|
+
arg for arg in call.positional_args if isinstance(arg, Expression)
|
393
|
+
) or any(isinstance(arg, Expression) for arg in call.positional_args)
|
403
394
|
|
404
395
|
|
405
396
|
def _get_execution_result_post_processing_statements(
|
@@ -408,12 +399,12 @@ def _get_execution_result_post_processing_statements(
|
|
408
399
|
if isinstance(problem, MoleculeProblem):
|
409
400
|
return _get_molecule_problem_execution_post_processing(problem)
|
410
401
|
elif isinstance(problem, HamiltonianProblem):
|
411
|
-
return
|
402
|
+
return ""
|
412
403
|
else:
|
413
404
|
raise ClassiqError(f"Invalid problem type: {problem}")
|
414
405
|
|
415
406
|
|
416
|
-
def _count_parametric_gates(gates:
|
407
|
+
def _count_parametric_gates(gates: list[str]) -> int:
|
417
408
|
return sum(_is_parametric_gate(_HAE_GATE_MAPPING[gate]) for gate in gates)
|
418
409
|
|
419
410
|
|
@@ -428,14 +419,18 @@ def _get_hea_port_size(hea_parameters: HEAParameters) -> int:
|
|
428
419
|
|
429
420
|
def _get_chemistry_quantum_main_params(
|
430
421
|
ansatz_parameters: AnsatzParameters,
|
431
|
-
) ->
|
422
|
+
) -> list[ClassicalParameterDeclaration]:
|
432
423
|
if not isinstance(ansatz_parameters, HEAParameters):
|
433
|
-
return
|
434
|
-
return
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
424
|
+
return []
|
425
|
+
return [
|
426
|
+
ClassicalParameterDeclaration(
|
427
|
+
name="t",
|
428
|
+
classical_type=ClassicalArray(
|
429
|
+
element_type=Real(),
|
430
|
+
size=_get_hea_port_size(ansatz_parameters),
|
431
|
+
),
|
432
|
+
),
|
433
|
+
]
|
439
434
|
|
440
435
|
|
441
436
|
def _get_problem_to_hamiltonian_name(chemistry_problem: CHEMISTRY_PROBLEMS_TYPE) -> str:
|
@@ -448,16 +443,13 @@ def _get_chemistry_quantum_main(
|
|
448
443
|
use_hartree_fock: bool,
|
449
444
|
ansatz_parameters: AnsatzParameters,
|
450
445
|
) -> NativeFunctionDefinition:
|
451
|
-
body = []
|
446
|
+
body: list[QuantumStatement] = []
|
452
447
|
body.append(
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
),
|
459
|
-
HandleBinding(name="qbv"),
|
460
|
-
],
|
448
|
+
Allocate(
|
449
|
+
size=Expression(
|
450
|
+
expr=f"get_field(get_field({_get_problem_to_hamiltonian_name(chemistry_problem)}({_convert_library_problem_to_qmod_problem(chemistry_problem)})[0], 'pauli'), 'len')"
|
451
|
+
),
|
452
|
+
target=HandleBinding(name="qbv"),
|
461
453
|
),
|
462
454
|
)
|
463
455
|
if use_hartree_fock:
|
@@ -467,14 +459,10 @@ def _get_chemistry_quantum_main(
|
|
467
459
|
|
468
460
|
return NativeFunctionDefinition(
|
469
461
|
name="main",
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
name="qbv", direction=PortDeclarationDirection.Output
|
475
|
-
)
|
476
|
-
}
|
477
|
-
),
|
462
|
+
positional_arg_declarations=_get_chemistry_quantum_main_params(
|
463
|
+
ansatz_parameters
|
464
|
+
)
|
465
|
+
+ [PortDeclaration(name="qbv", direction=PortDeclarationDirection.Output)],
|
478
466
|
body=body,
|
479
467
|
)
|
480
468
|
|
@@ -484,13 +472,15 @@ def _get_chemistry_classical_code(
|
|
484
472
|
execution_parameters: ChemistryExecutionParameters,
|
485
473
|
) -> str:
|
486
474
|
qmod_problem = _convert_library_problem_to_qmod_problem(chemistry_problem)
|
487
|
-
return
|
475
|
+
return (
|
476
|
+
f"""
|
488
477
|
{_EXECUTION_RESULT} = vqe(
|
489
478
|
hamiltonian={_get_problem_to_hamiltonian_name(chemistry_problem)}({qmod_problem}), {_get_chemistry_vqe_additional_params(execution_parameters)}
|
490
479
|
)
|
491
|
-
|
492
|
-
|
493
|
-
|
480
|
+
save({{{_EXECUTION_RESULT!r}: {_EXECUTION_RESULT}}})
|
481
|
+
"""
|
482
|
+
+ _get_execution_result_post_processing_statements(chemistry_problem)
|
483
|
+
).strip()
|
494
484
|
|
495
485
|
|
496
486
|
def construct_chemistry_model(
|
@@ -499,12 +489,22 @@ def construct_chemistry_model(
|
|
499
489
|
ansatz_parameters: AnsatzParameters,
|
500
490
|
execution_parameters: ChemistryExecutionParameters,
|
501
491
|
) -> SerializedModel:
|
492
|
+
chemistry_functions = [
|
493
|
+
_get_chemistry_quantum_main(
|
494
|
+
chemistry_problem,
|
495
|
+
use_hartree_fock,
|
496
|
+
ansatz_parameters,
|
497
|
+
)
|
498
|
+
]
|
499
|
+
if isinstance(ansatz_parameters, HEAParameters):
|
500
|
+
chemistry_functions.append(
|
501
|
+
cast(
|
502
|
+
NativeFunctionDefinition,
|
503
|
+
full_hea.create_model().function_dict["full_hea"],
|
504
|
+
)
|
505
|
+
)
|
502
506
|
model = Model(
|
503
|
-
functions=
|
504
|
-
_get_chemistry_quantum_main(
|
505
|
-
chemistry_problem, use_hartree_fock, ansatz_parameters
|
506
|
-
),
|
507
|
-
],
|
507
|
+
functions=chemistry_functions,
|
508
508
|
classical_execution_code=_get_chemistry_classical_code(
|
509
509
|
chemistry_problem, execution_parameters
|
510
510
|
),
|
@@ -33,7 +33,7 @@ async def update_problem_async(
|
|
33
33
|
) -> CHEMISTRY_PROBLEMS_TYPE:
|
34
34
|
if num_qubits is None:
|
35
35
|
num_qubits = await _get_num_qubits(problem)
|
36
|
-
return problem.
|
36
|
+
return problem.model_copy(update={"num_qubits": num_qubits})
|
37
37
|
|
38
38
|
|
39
39
|
ground_state_problem.GroundStateProblem.update_problem = async_utils.syncify_function( # type: ignore[attr-defined]
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from sympy import Add, Expr, LessThan, Symbol
|
4
|
+
|
5
|
+
from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
|
6
|
+
|
7
|
+
_INEQUALITY_UPPER_LIMIT = 1
|
8
|
+
|
9
|
+
|
10
|
+
def is_constraint_sum_less_than_one(
|
11
|
+
expression: Expr, encoding_type: Optional[EncodingType] = None
|
12
|
+
) -> bool:
|
13
|
+
# tests the case: x_1 + ... + x_n <= 1
|
14
|
+
return (
|
15
|
+
isinstance(expression, LessThan)
|
16
|
+
and isinstance(expression.args[0], Add)
|
17
|
+
and all(isinstance(arg, Symbol) for arg in expression.args[0].args)
|
18
|
+
and (
|
19
|
+
expression.args[1] == _INEQUALITY_UPPER_LIMIT
|
20
|
+
or expression.args[1] == float(_INEQUALITY_UPPER_LIMIT)
|
21
|
+
)
|
22
|
+
and encoding_type is None
|
23
|
+
)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
import sympy
|
4
|
+
from pyomo.core.expr.sympy_tools import PyomoSympyBimap
|
5
|
+
from scipy.optimize import differential_evolution
|
6
|
+
from sympy import Expr
|
7
|
+
|
8
|
+
from classiq.applications.combinatorial_helpers import encoding_utils
|
9
|
+
|
10
|
+
|
11
|
+
def sympy_lambdify(*args: Any, **kwargs: Any) -> Any:
|
12
|
+
new_kwargs = kwargs
|
13
|
+
new_kwargs["modules"] = ["sympy"]
|
14
|
+
return sympy.lambdify(*args, **new_kwargs)
|
15
|
+
|
16
|
+
|
17
|
+
def multivariate_extremum(
|
18
|
+
expr: Expr, symbols_map: PyomoSympyBimap, is_min: bool
|
19
|
+
) -> float:
|
20
|
+
if expr.is_number:
|
21
|
+
return float(expr)
|
22
|
+
|
23
|
+
free_symbols = tuple(expr.free_symbols)
|
24
|
+
bounds = [
|
25
|
+
(0, encoding_utils.get_var_span(symbols_map.sympy2pyomo[sym]))
|
26
|
+
for sym in free_symbols
|
27
|
+
]
|
28
|
+
|
29
|
+
# differential_evolution finds the global minimum, where we looking for the minimum or the maximum
|
30
|
+
extremum_type_coeff = 1 if is_min else -1
|
31
|
+
|
32
|
+
# Should be used only with sanitized imports due to use could be a potential risk to exec function https://docs.sympy.org/latest/modules/utilities/lambdify.html
|
33
|
+
func = sympy_lambdify([free_symbols], expr=extremum_type_coeff * expr)
|
34
|
+
result = differential_evolution(func, bounds)
|
35
|
+
return result.fun * extremum_type_coeff
|