classiq 0.38.0__py3-none-any.whl → 0.65.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- classiq/__init__.py +47 -32
- classiq/_analyzer_extras/_ipywidgets_async_extension.py +2 -1
- classiq/_internals/api_wrapper.py +235 -97
- classiq/_internals/async_utils.py +1 -3
- classiq/_internals/authentication/auth0.py +26 -10
- classiq/_internals/authentication/authentication.py +11 -0
- classiq/_internals/authentication/device.py +10 -5
- classiq/_internals/authentication/password_manager.py +18 -6
- classiq/_internals/authentication/token_manager.py +10 -5
- classiq/_internals/client.py +94 -33
- classiq/_internals/config.py +3 -4
- classiq/_internals/host_checker.py +38 -15
- classiq/_internals/jobs.py +60 -57
- classiq/_internals/type_validation.py +9 -9
- classiq/analyzer/__init__.py +1 -3
- classiq/analyzer/analyzer.py +24 -19
- classiq/analyzer/analyzer_utilities.py +10 -10
- classiq/analyzer/rb.py +15 -15
- classiq/analyzer/show_interactive_hack.py +27 -4
- classiq/analyzer/url_utils.py +2 -3
- classiq/applications/__init__.py +3 -12
- classiq/applications/chemistry/__init__.py +14 -10
- classiq/applications/chemistry/ansatz_parameters.py +4 -4
- classiq/{applications_model_constructors → applications/chemistry}/chemistry_model_constructor.py +165 -158
- classiq/applications/chemistry/ground_state_problem.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/allowed_constraints.py +4 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/arithmetic_expression.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/isolation.py +1 -1
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/combinatorial_problem_utils.py +51 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_mapping.py +12 -12
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/encoding_utils.py +8 -6
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/memory.py +7 -11
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/optimization_model.py +67 -40
- classiq/applications/combinatorial_helpers/pauli_helpers/pauli_utils.py +46 -0
- classiq/applications/combinatorial_helpers/pyomo_utils.py +447 -0
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/sympy_utils.py +2 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/encoding.py +15 -20
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/fixed_variables.py +14 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/ising_converter.py +11 -15
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty.py +1 -2
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/penalty_support.py +3 -7
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/sign_seperation.py +2 -3
- classiq/{applications_model_constructors → applications}/combinatorial_helpers/transformations/slack_variables.py +5 -8
- classiq/applications/combinatorial_optimization/__init__.py +20 -6
- classiq/applications/combinatorial_optimization/combinatorial_optimization_config.py +2 -2
- classiq/{applications_model_constructors → applications/combinatorial_optimization}/combinatorial_optimization_model_constructor.py +35 -33
- classiq/applications/combinatorial_optimization/combinatorial_problem.py +229 -0
- classiq/applications/combinatorial_optimization/examples/__init__.py +1 -3
- classiq/applications/finance/__init__.py +4 -5
- classiq/{applications_model_constructors → applications/finance}/finance_model_constructor.py +48 -42
- classiq/applications/grover/__init__.py +9 -0
- classiq/{applications_model_constructors → applications/grover}/grover_model_constructor.py +52 -51
- classiq/applications/hamiltonian/pauli_decomposition.py +113 -0
- classiq/applications/libraries/qmci_library.py +22 -0
- classiq/applications/qnn/__init__.py +2 -4
- classiq/applications/qnn/circuit_utils.py +6 -6
- classiq/applications/qnn/datasets/__init__.py +9 -11
- classiq/applications/qnn/datasets/dataset_base_classes.py +7 -5
- classiq/applications/qnn/datasets/dataset_not.py +2 -1
- classiq/applications/qnn/datasets/dataset_parity.py +2 -2
- classiq/applications/qnn/gradients/quantum_gradient.py +1 -1
- classiq/applications/qnn/gradients/simple_quantum_gradient.py +2 -1
- classiq/applications/qnn/qlayer.py +30 -10
- classiq/applications/qnn/torch_utils.py +4 -3
- classiq/applications/qnn/types.py +5 -5
- classiq/applications/qsvm/__init__.py +6 -4
- classiq/applications/qsvm/qsvm.py +3 -6
- classiq/applications/qsvm/qsvm_data_generation.py +3 -3
- classiq/{applications_model_constructors → applications/qsvm}/qsvm_model_constructor.py +30 -28
- classiq/execution/__init__.py +8 -3
- classiq/execution/all_hardware_devices.py +11 -0
- classiq/execution/execution_session.py +400 -0
- classiq/execution/iqcc.py +63 -0
- classiq/execution/jobs.py +197 -25
- classiq/execution/qnn.py +79 -0
- classiq/executor.py +20 -115
- classiq/interface/_version.py +1 -1
- classiq/interface/analyzer/analysis_params.py +43 -13
- classiq/interface/analyzer/cytoscape_graph.py +15 -9
- classiq/interface/analyzer/result.py +28 -32
- classiq/interface/applications/qsvm.py +20 -29
- classiq/interface/ast_node.py +16 -0
- classiq/interface/backend/backend_preferences.py +390 -121
- classiq/interface/backend/ionq/ionq_quantum_program.py +15 -23
- classiq/interface/backend/pydantic_backend.py +25 -22
- classiq/interface/backend/quantum_backend_providers.py +69 -16
- classiq/interface/chemistry/fermionic_operator.py +30 -21
- classiq/interface/chemistry/ground_state_problem.py +28 -25
- classiq/interface/chemistry/molecule.py +14 -10
- classiq/interface/chemistry/operator.py +64 -231
- classiq/interface/combinatorial_optimization/encoding_types.py +1 -1
- classiq/interface/combinatorial_optimization/examples/ascending_sequence.py +1 -3
- classiq/interface/combinatorial_optimization/examples/integer_portfolio_optimization.py +2 -4
- classiq/interface/combinatorial_optimization/examples/knapsack.py +3 -3
- classiq/interface/combinatorial_optimization/examples/mht.py +10 -6
- classiq/interface/combinatorial_optimization/examples/portfolio_variations.py +2 -2
- classiq/interface/combinatorial_optimization/examples/set_cover.py +1 -2
- classiq/interface/combinatorial_optimization/mht_qaoa_input.py +8 -9
- classiq/interface/combinatorial_optimization/optimization_problem.py +2 -2
- classiq/interface/combinatorial_optimization/result.py +1 -3
- classiq/interface/combinatorial_optimization/solver_types.py +1 -1
- classiq/interface/debug_info/debug_info.py +86 -0
- classiq/{exceptions.py → interface/exceptions.py} +37 -9
- classiq/interface/execution/iqcc.py +19 -0
- classiq/interface/execution/jobs.py +15 -12
- classiq/interface/execution/primitives.py +18 -0
- classiq/interface/executor/constants.py +1 -0
- classiq/interface/executor/execution_preferences.py +26 -114
- classiq/interface/executor/execution_request.py +24 -46
- classiq/interface/executor/execution_result.py +30 -8
- classiq/interface/executor/iqae_result.py +4 -6
- classiq/interface/executor/optimizer_preferences.py +17 -14
- classiq/interface/executor/quantum_code.py +28 -24
- classiq/interface/executor/quantum_instruction_set.py +2 -2
- classiq/interface/executor/register_initialization.py +11 -14
- classiq/interface/executor/result.py +83 -56
- classiq/interface/executor/vqe_result.py +10 -10
- classiq/interface/finance/function_input.py +35 -25
- classiq/interface/finance/gaussian_model_input.py +5 -5
- classiq/interface/finance/log_normal_model_input.py +4 -4
- classiq/interface/finance/model_input.py +4 -4
- classiq/interface/generator/adjacency.py +1 -3
- classiq/interface/generator/amplitude_loading.py +22 -12
- classiq/interface/generator/ansatz_library.py +5 -5
- classiq/interface/generator/application_apis/arithmetic_declarations.py +8 -5
- classiq/interface/generator/application_apis/chemistry_declarations.py +27 -187
- classiq/interface/generator/application_apis/combinatorial_optimization_declarations.py +18 -21
- classiq/interface/generator/application_apis/entangler_declarations.py +11 -6
- classiq/interface/generator/application_apis/finance_declarations.py +48 -69
- classiq/interface/generator/application_apis/qsvm_declarations.py +0 -70
- classiq/interface/generator/arith/argument_utils.py +46 -5
- classiq/interface/generator/arith/arithmetic.py +35 -16
- classiq/interface/generator/arith/arithmetic_arg_type_validator.py +6 -7
- classiq/interface/generator/arith/arithmetic_expression_abc.py +66 -25
- classiq/interface/generator/arith/arithmetic_expression_parser.py +11 -11
- classiq/interface/generator/arith/arithmetic_expression_validator.py +47 -43
- classiq/interface/generator/arith/arithmetic_operations.py +14 -6
- classiq/interface/generator/arith/arithmetic_param_getters.py +7 -8
- classiq/interface/generator/arith/arithmetic_result_builder.py +21 -17
- classiq/interface/generator/arith/ast_node_rewrite.py +3 -2
- classiq/interface/generator/arith/binary_ops.py +218 -130
- classiq/interface/generator/arith/endianness.py +1 -1
- classiq/interface/generator/arith/extremum_operations.py +96 -25
- classiq/interface/generator/arith/logical_ops.py +14 -12
- classiq/interface/generator/arith/number_utils.py +12 -6
- classiq/interface/generator/arith/register_user_input.py +60 -37
- classiq/interface/generator/arith/unary_ops.py +49 -29
- classiq/interface/generator/arith/uncomputation_methods.py +1 -1
- classiq/interface/generator/builtin_api_builder.py +2 -9
- classiq/interface/generator/chemistry_function_params.py +3 -3
- classiq/interface/generator/circuit_code/circuit_code.py +7 -7
- classiq/interface/generator/circuit_code/types_and_constants.py +4 -7
- classiq/interface/generator/commuting_pauli_exponentiation.py +7 -7
- classiq/interface/generator/compiler_keywords.py +5 -1
- classiq/interface/generator/complex_type.py +13 -18
- classiq/interface/generator/constant.py +3 -4
- classiq/interface/generator/control_state.py +34 -29
- classiq/interface/generator/copy.py +47 -0
- classiq/interface/generator/custom_ansatz.py +2 -5
- classiq/interface/generator/distance.py +3 -5
- classiq/interface/generator/excitations.py +3 -2
- classiq/interface/generator/expressions/atomic_expression_functions.py +21 -5
- classiq/interface/generator/expressions/enums/__init__.py +0 -10
- classiq/interface/generator/expressions/enums/finance_functions.py +12 -22
- classiq/interface/generator/expressions/evaluated_expression.py +5 -5
- classiq/interface/generator/expressions/expression.py +26 -14
- classiq/interface/generator/expressions/expression_constants.py +9 -3
- classiq/interface/generator/expressions/non_symbolic_expr.py +119 -0
- classiq/interface/generator/expressions/qmod_qarray_proxy.py +99 -0
- classiq/interface/generator/expressions/qmod_qscalar_proxy.py +34 -8
- classiq/interface/generator/expressions/qmod_qstruct_proxy.py +36 -0
- classiq/interface/generator/expressions/qmod_sized_proxy.py +30 -2
- classiq/interface/generator/expressions/qmod_struct_instance.py +14 -2
- classiq/interface/generator/expressions/sympy_supported_expressions.py +19 -11
- classiq/interface/generator/finance.py +2 -2
- classiq/interface/generator/function_param_library.py +6 -6
- classiq/interface/generator/function_param_list_without_self_reference.py +2 -10
- classiq/interface/generator/function_params.py +36 -64
- classiq/interface/generator/functions/__init__.py +0 -22
- classiq/interface/generator/functions/builtins/internal_operators.py +16 -0
- classiq/interface/generator/functions/classical_function_declaration.py +18 -9
- classiq/interface/generator/functions/classical_type.py +47 -166
- classiq/interface/generator/functions/concrete_types.py +55 -0
- classiq/interface/generator/functions/function_declaration.py +13 -14
- classiq/interface/generator/functions/port_declaration.py +1 -13
- classiq/interface/generator/functions/qmod_python_interface.py +2 -1
- classiq/interface/generator/functions/type_name.py +90 -0
- classiq/interface/generator/generated_circuit_data.py +153 -20
- classiq/interface/generator/grover_diffuser.py +32 -25
- classiq/interface/generator/grover_operator.py +34 -25
- classiq/interface/generator/hamiltonian_evolution/exponentiation.py +4 -6
- classiq/interface/generator/hamiltonian_evolution/qdrift.py +4 -4
- classiq/interface/generator/hamiltonian_evolution/suzuki_trotter.py +9 -9
- classiq/interface/generator/hardware/hardware_data.py +72 -34
- classiq/interface/generator/hardware_efficient_ansatz.py +20 -16
- classiq/interface/generator/hartree_fock.py +13 -5
- classiq/interface/generator/identity.py +10 -6
- classiq/interface/generator/linear_pauli_rotations.py +32 -20
- classiq/interface/generator/mcmt_method.py +1 -1
- classiq/interface/generator/mcu.py +17 -15
- classiq/interface/generator/mcx.py +24 -17
- classiq/interface/generator/model/__init__.py +2 -5
- classiq/interface/generator/model/constraints.py +26 -8
- classiq/interface/generator/model/model.py +27 -190
- classiq/interface/generator/model/preferences/preferences.py +115 -41
- classiq/{quantum_register.py → interface/generator/model/quantum_register.py} +14 -17
- classiq/interface/generator/oracles/arithmetic_oracle.py +2 -4
- classiq/interface/generator/oracles/custom_oracle.py +15 -13
- classiq/interface/generator/oracles/oracle_abc.py +7 -7
- classiq/interface/generator/partitioned_register.py +7 -7
- classiq/interface/generator/piecewise_linear_amplitude_loading.py +45 -29
- classiq/interface/generator/preferences/optimization.py +1 -2
- classiq/interface/generator/qpe.py +41 -30
- classiq/interface/generator/qsvm.py +9 -10
- classiq/interface/generator/quantum_function_call.py +88 -73
- classiq/interface/generator/quantum_program.py +41 -24
- classiq/interface/generator/range_types.py +11 -12
- classiq/interface/generator/register_role.py +18 -6
- classiq/interface/generator/slice_parsing_utils.py +5 -5
- classiq/interface/generator/standard_gates/controlled_standard_gates.py +30 -39
- classiq/interface/generator/standard_gates/standard_angle_metaclass.py +2 -6
- classiq/interface/generator/standard_gates/standard_gates.py +3 -3
- classiq/interface/generator/standard_gates/u_gate.py +7 -10
- classiq/interface/generator/state_preparation/bell_state_preparation.py +3 -3
- classiq/interface/generator/state_preparation/computational_basis_state_preparation.py +2 -1
- classiq/interface/generator/state_preparation/distributions.py +16 -15
- classiq/interface/generator/state_preparation/metrics.py +4 -7
- classiq/interface/generator/state_preparation/state_preparation.py +25 -20
- classiq/interface/generator/synthesis_metadata/synthesis_duration.py +0 -4
- classiq/interface/generator/synthesis_metadata/synthesis_execution_data.py +20 -6
- classiq/interface/generator/transpiler_basis_gates.py +7 -3
- classiq/interface/generator/types/builtin_enum_declarations.py +178 -0
- classiq/interface/generator/types/compilation_metadata.py +6 -0
- classiq/interface/generator/types/enum_declaration.py +54 -0
- classiq/interface/generator/types/qstruct_declaration.py +18 -0
- classiq/interface/generator/types/struct_declaration.py +7 -11
- classiq/interface/generator/ucc.py +5 -4
- classiq/interface/generator/unitary_gate.py +5 -5
- classiq/interface/generator/user_defined_function_params.py +4 -1
- classiq/interface/generator/validations/flow_graph.py +7 -7
- classiq/interface/generator/validations/validator_functions.py +4 -4
- classiq/interface/generator/visitor.py +23 -16
- classiq/interface/hardware.py +29 -8
- classiq/interface/helpers/classproperty.py +8 -0
- classiq/interface/helpers/custom_encoders.py +2 -2
- classiq/interface/helpers/custom_pydantic_types.py +40 -50
- classiq/interface/helpers/datastructures.py +26 -0
- classiq/interface/helpers/hashable_mixin.py +3 -2
- classiq/interface/helpers/hashable_pydantic_base_model.py +2 -1
- classiq/interface/helpers/pydantic_model_helpers.py +7 -5
- classiq/interface/helpers/validation_helpers.py +3 -20
- classiq/interface/helpers/versioned_model.py +1 -4
- classiq/interface/ide/ide_data.py +16 -20
- classiq/interface/ide/visual_model.py +130 -0
- classiq/interface/interface_version.py +1 -0
- classiq/interface/jobs.py +29 -69
- classiq/interface/model/allocate.py +16 -0
- classiq/interface/model/bind_operation.py +32 -9
- classiq/interface/model/classical_if.py +15 -0
- classiq/interface/model/classical_parameter_declaration.py +33 -3
- classiq/interface/model/control.py +45 -0
- classiq/interface/model/handle_binding.py +298 -20
- classiq/interface/model/inplace_binary_operation.py +29 -24
- classiq/interface/model/invert.py +12 -0
- classiq/interface/model/model.py +69 -61
- classiq/interface/model/native_function_definition.py +17 -20
- classiq/interface/model/parameter.py +13 -0
- classiq/interface/model/phase_operation.py +11 -0
- classiq/interface/model/port_declaration.py +27 -9
- classiq/interface/model/power.py +14 -0
- classiq/interface/model/quantum_expressions/amplitude_loading_operation.py +30 -18
- classiq/interface/model/quantum_expressions/arithmetic_operation.py +51 -14
- classiq/interface/model/quantum_expressions/quantum_expression.py +12 -35
- classiq/interface/model/quantum_function_call.py +141 -343
- classiq/interface/model/quantum_function_declaration.py +190 -157
- classiq/interface/model/quantum_lambda_function.py +33 -32
- classiq/interface/model/quantum_statement.py +71 -12
- classiq/interface/model/quantum_type.py +177 -40
- classiq/interface/model/quantum_variable_declaration.py +3 -25
- classiq/interface/model/repeat.py +15 -0
- classiq/interface/model/statement_block.py +40 -14
- classiq/interface/model/validation_handle.py +13 -6
- classiq/interface/model/variable_declaration_statement.py +3 -1
- classiq/interface/model/within_apply_operation.py +7 -5
- classiq/interface/server/global_versions.py +6 -7
- classiq/interface/server/routes.py +17 -21
- classiq/interface/source_reference.py +59 -0
- classiq/model_expansions/atomic_expression_functions_defs.py +253 -0
- classiq/model_expansions/capturing/__init__.py +0 -0
- classiq/model_expansions/capturing/captured_vars.py +435 -0
- classiq/model_expansions/capturing/mangling_utils.py +56 -0
- classiq/model_expansions/closure.py +171 -0
- classiq/model_expansions/debug_flag.py +3 -0
- classiq/model_expansions/evaluators/__init__.py +0 -0
- classiq/model_expansions/evaluators/arg_type_match.py +158 -0
- classiq/model_expansions/evaluators/argument_types.py +42 -0
- classiq/model_expansions/evaluators/classical_expression.py +36 -0
- classiq/model_expansions/evaluators/control.py +144 -0
- classiq/model_expansions/evaluators/parameter_types.py +226 -0
- classiq/model_expansions/evaluators/quantum_type_utils.py +239 -0
- classiq/model_expansions/evaluators/type_type_match.py +90 -0
- classiq/model_expansions/expression_evaluator.py +135 -0
- classiq/model_expansions/expression_renamer.py +76 -0
- classiq/model_expansions/function_builder.py +247 -0
- classiq/model_expansions/generative_functions.py +158 -0
- classiq/model_expansions/interpreters/__init__.py +0 -0
- classiq/model_expansions/interpreters/base_interpreter.py +263 -0
- classiq/model_expansions/interpreters/frontend_generative_interpreter.py +28 -0
- classiq/model_expansions/interpreters/generative_interpreter.py +249 -0
- classiq/model_expansions/model_tables.py +18 -0
- classiq/model_expansions/quantum_operations/__init__.py +9 -0
- classiq/model_expansions/quantum_operations/bind.py +60 -0
- classiq/model_expansions/quantum_operations/call_emitter.py +266 -0
- classiq/model_expansions/quantum_operations/classicalif.py +53 -0
- classiq/model_expansions/quantum_operations/declarative_call_emitter.py +87 -0
- classiq/model_expansions/quantum_operations/emitter.py +181 -0
- classiq/model_expansions/quantum_operations/quantum_function_call.py +33 -0
- classiq/model_expansions/quantum_operations/repeat.py +56 -0
- classiq/model_expansions/quantum_operations/shallow_emitter.py +180 -0
- classiq/model_expansions/quantum_operations/variable_decleration.py +28 -0
- classiq/model_expansions/scope.py +240 -0
- classiq/model_expansions/scope_initialization.py +150 -0
- classiq/model_expansions/sympy_conversion/__init__.py +0 -0
- classiq/model_expansions/sympy_conversion/arithmetics.py +49 -0
- classiq/model_expansions/sympy_conversion/expression_to_sympy.py +179 -0
- classiq/model_expansions/sympy_conversion/sympy_to_python.py +123 -0
- classiq/model_expansions/transformers/__init__.py +0 -0
- classiq/model_expansions/transformers/ast_renamer.py +26 -0
- classiq/model_expansions/transformers/var_splitter.py +299 -0
- classiq/model_expansions/utils/__init__.py +0 -0
- classiq/model_expansions/utils/counted_name_allocator.py +11 -0
- classiq/model_expansions/utils/handles_collector.py +33 -0
- classiq/model_expansions/visitors/__init__.py +0 -0
- classiq/model_expansions/visitors/boolean_expression_transformers.py +214 -0
- classiq/model_expansions/visitors/variable_references.py +144 -0
- classiq/open_library/__init__.py +4 -0
- classiq/open_library/functions/__init__.py +130 -0
- classiq/open_library/functions/amplitude_estimation.py +30 -0
- classiq/open_library/functions/discrete_sine_cosine_transform.py +181 -0
- classiq/open_library/functions/grover.py +157 -0
- classiq/open_library/functions/hea.py +115 -0
- classiq/open_library/functions/linear_pauli_rotation.py +82 -0
- classiq/open_library/functions/modular_exponentiation.py +201 -0
- classiq/open_library/functions/qaoa_penalty.py +117 -0
- classiq/open_library/functions/qft_functions.py +54 -0
- classiq/open_library/functions/qpe.py +46 -0
- classiq/open_library/functions/qsvt.py +331 -0
- classiq/open_library/functions/state_preparation.py +301 -0
- classiq/open_library/functions/swap_test.py +27 -0
- classiq/open_library/functions/utility_functions.py +81 -0
- classiq/open_library/functions/variational.py +52 -0
- classiq/qmod/__init__.py +10 -10
- classiq/qmod/builtins/__init__.py +19 -2
- classiq/qmod/builtins/classical_execution_primitives.py +36 -14
- classiq/qmod/builtins/classical_functions.py +39 -43
- classiq/qmod/builtins/constants.py +10 -0
- classiq/qmod/builtins/enums.py +208 -0
- classiq/qmod/builtins/functions/__init__.py +137 -0
- classiq/qmod/builtins/functions/allocation.py +150 -0
- classiq/qmod/builtins/functions/arithmetic.py +55 -0
- classiq/qmod/builtins/functions/benchmarking.py +8 -0
- classiq/qmod/builtins/functions/chemistry.py +91 -0
- classiq/qmod/builtins/functions/exponentiation.py +105 -0
- classiq/qmod/builtins/functions/finance.py +34 -0
- classiq/qmod/builtins/functions/operators.py +16 -0
- classiq/qmod/builtins/functions/qsvm.py +24 -0
- classiq/qmod/builtins/functions/standard_gates.py +651 -0
- classiq/qmod/builtins/operations.py +373 -40
- classiq/qmod/builtins/structs.py +103 -80
- classiq/qmod/cfunc.py +2 -2
- classiq/qmod/classical_function.py +4 -8
- classiq/qmod/cparam.py +64 -0
- classiq/qmod/create_model_function.py +56 -0
- classiq/qmod/declaration_inferrer.py +143 -101
- classiq/qmod/expression_query.py +20 -4
- classiq/qmod/generative.py +42 -0
- classiq/qmod/model_state_container.py +18 -6
- classiq/qmod/native/__init__.py +7 -0
- classiq/qmod/native/expression_to_qmod.py +16 -11
- classiq/qmod/native/pretty_printer.py +187 -97
- classiq/qmod/pretty_print/__init__.py +7 -0
- classiq/qmod/pretty_print/expression_to_python.py +222 -0
- classiq/qmod/pretty_print/pretty_printer.py +572 -0
- classiq/qmod/python_classical_type.py +67 -0
- classiq/qmod/qfunc.py +60 -8
- classiq/qmod/qmod_constant.py +93 -26
- classiq/qmod/qmod_parameter.py +68 -59
- classiq/qmod/qmod_variable.py +468 -155
- classiq/qmod/quantum_callable.py +17 -7
- classiq/qmod/quantum_expandable.py +269 -96
- classiq/qmod/quantum_function.py +196 -41
- classiq/qmod/semantics/__init__.py +0 -0
- classiq/qmod/semantics/annotation/__init__.py +0 -0
- classiq/qmod/semantics/annotation/call_annotation.py +92 -0
- classiq/qmod/semantics/annotation/qstruct_annotator.py +23 -0
- classiq/qmod/semantics/error_manager.py +88 -0
- classiq/qmod/semantics/lambdas.py +25 -0
- classiq/qmod/semantics/static_semantics_visitor.py +384 -0
- classiq/qmod/semantics/validation/__init__.py +0 -0
- classiq/qmod/semantics/validation/constants_validation.py +16 -0
- classiq/qmod/semantics/validation/func_call_validation.py +99 -0
- classiq/qmod/semantics/validation/function_name_collisions_validation.py +23 -0
- classiq/qmod/semantics/validation/handle_validation.py +85 -0
- classiq/qmod/semantics/validation/main_validation.py +33 -0
- classiq/qmod/semantics/validation/types_validation.py +128 -0
- classiq/qmod/symbolic.py +147 -123
- classiq/qmod/symbolic_expr.py +27 -12
- classiq/qmod/symbolic_type.py +2 -5
- classiq/qmod/type_attribute_remover.py +32 -0
- classiq/qmod/utilities.py +98 -4
- classiq/qmod/write_qmod.py +17 -3
- classiq/synthesis.py +210 -22
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/METADATA +16 -9
- classiq-0.65.4.dist-info/RECORD +521 -0
- classiq/_internals/_qfunc_ext.py +0 -6
- classiq/applications/benchmarking/__init__.py +0 -9
- classiq/applications/benchmarking/mirror_benchmarking.py +0 -70
- classiq/applications/numpy_utils.py +0 -37
- classiq/applications_model_constructors/__init__.py +0 -25
- classiq/applications_model_constructors/combinatorial_helpers/multiple_comp_basis_sp.py +0 -34
- classiq/applications_model_constructors/combinatorial_helpers/pauli_helpers/pauli_utils.py +0 -65
- classiq/applications_model_constructors/combinatorial_helpers/pyomo_utils.py +0 -243
- classiq/applications_model_constructors/libraries/ampltitude_estimation_library.py +0 -11
- classiq/applications_model_constructors/libraries/qmci_library.py +0 -107
- classiq/builtin_functions/__init__.py +0 -43
- classiq/builtin_functions/amplitude_loading.py +0 -3
- classiq/builtin_functions/binary_ops.py +0 -1
- classiq/builtin_functions/exponentiation.py +0 -5
- classiq/builtin_functions/qpe.py +0 -4
- classiq/builtin_functions/qsvm.py +0 -7
- classiq/builtin_functions/range_types.py +0 -5
- classiq/builtin_functions/standard_gates.py +0 -1
- classiq/builtin_functions/state_preparation.py +0 -6
- classiq/builtin_functions/suzuki_trotter.py +0 -3
- classiq/interface/executor/aws_execution_cost.py +0 -73
- classiq/interface/executor/error_mitigation.py +0 -6
- classiq/interface/generator/credit_risk_example/linear_gci.py +0 -122
- classiq/interface/generator/credit_risk_example/weighted_adder.py +0 -69
- classiq/interface/generator/expressions/enums/chemistry.py +0 -28
- classiq/interface/generator/expressions/enums/classical_enum.py +0 -5
- classiq/interface/generator/expressions/enums/ladder_operator.py +0 -16
- classiq/interface/generator/expressions/enums/optimizers.py +0 -9
- classiq/interface/generator/expressions/enums/pauli.py +0 -8
- classiq/interface/generator/expressions/enums/qsvm_feature_map_entanglement.py +0 -9
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/__init__.py +0 -18
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/atomic_quantum_functions.py +0 -641
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/exponentiation_functions.py +0 -89
- classiq/interface/generator/functions/core_lib_declarations/quantum_functions/std_lib_functions.py +0 -1229
- classiq/interface/generator/functions/core_lib_declarations/quantum_operators.py +0 -95
- classiq/interface/generator/functions/foreign_function_definition.py +0 -114
- classiq/interface/generator/functions/function_implementation.py +0 -107
- classiq/interface/generator/functions/native_function_definition.py +0 -155
- classiq/interface/generator/functions/quantum_function_declaration.py +0 -69
- classiq/interface/generator/functions/register.py +0 -44
- classiq/interface/generator/functions/register_mapping_data.py +0 -106
- classiq/interface/generator/inequality_mixer.py +0 -51
- classiq/interface/generator/model/classical_main_validator.py +0 -106
- classiq/interface/generator/range_mixer.py +0 -56
- classiq/interface/generator/state_propagator.py +0 -74
- classiq/interface/generator/types/builtin_struct_declarations/__init__.py +0 -1
- classiq/interface/generator/types/builtin_struct_declarations/pauli_struct_declarations.py +0 -22
- classiq/interface/ide/show.py +0 -34
- classiq/interface/model/call_synthesis_data.py +0 -68
- classiq/interface/model/common_model_types.py +0 -23
- classiq/interface/model/quantum_expressions/control_state.py +0 -38
- classiq/interface/model/quantum_if_operation.py +0 -94
- classiq/interface/model/resolvers/function_call_resolver.py +0 -43
- classiq/interface/model/validations/handle_validation_base.py +0 -55
- classiq/interface/model/validations/handles_validator.py +0 -156
- classiq/interface/model/validations/port_to_wire_name_generator.py +0 -12
- classiq/model/__init__.py +0 -14
- classiq/model/composite_function_generator.py +0 -33
- classiq/model/function_handler.py +0 -462
- classiq/model/logic_flow.py +0 -149
- classiq/model/logic_flow_change_handler.py +0 -71
- classiq/model/model.py +0 -229
- classiq/qmod/builtins/functions.py +0 -913
- classiq/qmod/qmod_struct.py +0 -37
- classiq/quantum_functions/__init__.py +0 -17
- classiq/quantum_functions/annotation_parser.py +0 -205
- classiq/quantum_functions/decorators.py +0 -22
- classiq/quantum_functions/function_library.py +0 -181
- classiq/quantum_functions/function_parser.py +0 -74
- classiq/quantum_functions/quantum_function.py +0 -236
- classiq-0.38.0.dist-info/RECORD +0 -454
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/arithmetic/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/__init__.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/pauli_helpers/pauli_sparsing.py +0 -0
- /classiq/{applications_model_constructors → applications}/combinatorial_helpers/py.typed +0 -0
- /classiq/{applications_model_constructors/combinatorial_helpers/transformations → applications/combinatorial_helpers/solvers}/__init__.py +0 -0
- /classiq/{applications_model_constructors/libraries → applications/combinatorial_helpers/transformations}/__init__.py +0 -0
- /classiq/{interface/generator/credit_risk_example → applications/hamiltonian}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations → applications/libraries}/__init__.py +0 -0
- /classiq/interface/{model/resolvers → debug_info}/__init__.py +0 -0
- /classiq/{_internals → interface}/enum_utils.py +0 -0
- /classiq/interface/{model/validations → generator/functions/builtins}/__init__.py +0 -0
- /classiq/{interface/generator/functions/core_lib_declarations/quantum_functions/chemistry_functions.py → model_expansions/__init__.py} +0 -0
- {classiq-0.38.0.dist-info → classiq-0.65.4.dist-info}/WHEEL +0 -0
@@ -1,5 +1,4 @@
|
|
1
1
|
import itertools
|
2
|
-
from typing import List
|
3
2
|
|
4
3
|
from pyomo.core.base.constraint import _GeneralConstraintData
|
5
4
|
from pyomo.core.expr.relational_expr import EqualityExpression
|
@@ -7,7 +6,7 @@ from pyomo.environ import Expression
|
|
7
6
|
|
8
7
|
|
9
8
|
def get_penalty_expression(
|
10
|
-
flat_constraints:
|
9
|
+
flat_constraints: list[_GeneralConstraintData],
|
11
10
|
) -> Expression:
|
12
11
|
return sum(
|
13
12
|
_convert_constraint_to_penalty_term(constraint)
|
@@ -3,16 +3,12 @@ from pyomo.core.base.constraint import _GeneralConstraintData
|
|
3
3
|
from pyomo.core.expr.relational_expr import EqualityExpression
|
4
4
|
from pyomo.repn.standard_repn import _GeneralVarData
|
5
5
|
|
6
|
-
from classiq.
|
6
|
+
from classiq.applications.combinatorial_helpers import (
|
7
7
|
allowed_constraints,
|
8
8
|
encoding_utils,
|
9
9
|
)
|
10
|
-
from classiq.
|
11
|
-
|
12
|
-
)
|
13
|
-
from classiq.applications_model_constructors.combinatorial_helpers.sympy_utils import (
|
14
|
-
sympyify_expression,
|
15
|
-
)
|
10
|
+
from classiq.applications.combinatorial_helpers.pyomo_utils import extract
|
11
|
+
from classiq.applications.combinatorial_helpers.sympy_utils import sympyify_expression
|
16
12
|
|
17
13
|
|
18
14
|
def is_model_penalty_supported(model: ConcreteModel) -> bool:
|
@@ -1,5 +1,4 @@
|
|
1
1
|
from itertools import filterfalse
|
2
|
-
from typing import List, Tuple
|
3
2
|
|
4
3
|
from sympy import (
|
5
4
|
Add,
|
@@ -13,7 +12,7 @@ from sympy import (
|
|
13
12
|
simplify,
|
14
13
|
)
|
15
14
|
|
16
|
-
from classiq.exceptions import ClassiqCombOptError
|
15
|
+
from classiq.interface.exceptions import ClassiqCombOptError
|
17
16
|
|
18
17
|
|
19
18
|
def sign_separation(expr: Expr) -> LessThan:
|
@@ -43,7 +42,7 @@ def sign_separation(expr: Expr) -> LessThan:
|
|
43
42
|
return modified_expr
|
44
43
|
|
45
44
|
|
46
|
-
def _get_positive_and_negative_args(expr: Expr) ->
|
45
|
+
def _get_positive_and_negative_args(expr: Expr) -> tuple[list[Expr], list[Expr]]:
|
47
46
|
positive_args = []
|
48
47
|
negative_args = []
|
49
48
|
|
@@ -1,20 +1,17 @@
|
|
1
1
|
import math
|
2
2
|
from functools import cached_property
|
3
3
|
from itertools import filterfalse
|
4
|
-
from typing import List
|
5
4
|
|
6
5
|
import pyomo.core as pyo
|
7
6
|
from pyomo.core.base.component import _ComponentBase
|
8
7
|
from pyomo.core.expr.sympy_tools import sympy2pyomo_expression, sympyify_expression
|
9
8
|
|
10
|
-
from classiq.
|
11
|
-
from classiq.
|
9
|
+
from classiq.applications.combinatorial_helpers import pyomo_utils
|
10
|
+
from classiq.applications.combinatorial_helpers.arithmetic.arithmetic_expression import (
|
12
11
|
multivariate_extremum,
|
13
12
|
)
|
14
|
-
from classiq.
|
15
|
-
|
16
|
-
)
|
17
|
-
from classiq.applications_model_constructors.combinatorial_helpers.transformations.sign_seperation import (
|
13
|
+
from classiq.applications.combinatorial_helpers.transformations import penalty_support
|
14
|
+
from classiq.applications.combinatorial_helpers.transformations.sign_seperation import (
|
18
15
|
sign_separation,
|
19
16
|
)
|
20
17
|
|
@@ -69,7 +66,7 @@ class ConstraintConvertor:
|
|
69
66
|
return max_upper - min_lower
|
70
67
|
|
71
68
|
@cached_property
|
72
|
-
def _slack_coeffs(self) ->
|
69
|
+
def _slack_coeffs(self) -> list[int]:
|
73
70
|
coeffs = [2**idx for idx in self.slack_var_idxs[:-1]]
|
74
71
|
coeffs += [self._bound_int - sum(coeffs)]
|
75
72
|
return coeffs
|
@@ -1,22 +1,36 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
from classiq.interface.combinatorial_optimization import examples
|
2
|
+
from classiq.interface.combinatorial_optimization.encoding_types import EncodingType
|
4
3
|
from classiq.interface.combinatorial_optimization.solver_types import QSolver
|
5
4
|
|
6
|
-
from classiq.
|
5
|
+
from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
|
6
|
+
compute_qaoa_initial_point,
|
7
7
|
get_optimization_solution_from_pyo,
|
8
|
+
pyo_model_to_hamiltonian,
|
8
9
|
)
|
9
10
|
|
10
11
|
from .combinatorial_optimization_config import OptimizerConfig, QAOAConfig
|
12
|
+
from .combinatorial_optimization_model_constructor import (
|
13
|
+
construct_combinatorial_optimization_model,
|
14
|
+
)
|
15
|
+
from .combinatorial_problem import (
|
16
|
+
CombinatorialProblem,
|
17
|
+
execute_qaoa,
|
18
|
+
)
|
11
19
|
|
12
20
|
__all__ = [
|
21
|
+
"CombinatorialProblem",
|
22
|
+
"EncodingType",
|
23
|
+
"OptimizerConfig",
|
24
|
+
"QAOAConfig",
|
13
25
|
"QSolver",
|
26
|
+
"compute_qaoa_initial_point",
|
27
|
+
"construct_combinatorial_optimization_model",
|
14
28
|
"examples",
|
15
|
-
"
|
16
|
-
"OptimizerConfig",
|
29
|
+
"execute_qaoa",
|
17
30
|
"get_optimization_solution_from_pyo",
|
31
|
+
"pyo_model_to_hamiltonian",
|
18
32
|
]
|
19
33
|
|
20
34
|
|
21
|
-
def __dir__() ->
|
35
|
+
def __dir__() -> list[str]:
|
22
36
|
return __all__
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import dataclasses
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import
|
3
|
+
from typing import Optional
|
4
4
|
|
5
5
|
from classiq.interface.executor.optimizer_preferences import CostType, OptimizerType
|
6
6
|
|
@@ -20,4 +20,4 @@ class OptimizerConfig:
|
|
20
20
|
skip_compute_variance: bool = False
|
21
21
|
cost_type: CostType = CostType.CVAR
|
22
22
|
alpha_cvar: float = 1.0
|
23
|
-
initial_point: Optional[
|
23
|
+
initial_point: Optional[list[float]] = dataclasses.field(default=None)
|
@@ -9,30 +9,32 @@ from classiq.interface.generator.functions.classical_type import (
|
|
9
9
|
ClassicalArray,
|
10
10
|
ClassicalList,
|
11
11
|
Real,
|
12
|
-
Struct,
|
13
12
|
)
|
14
13
|
from classiq.interface.generator.functions.port_declaration import (
|
15
14
|
PortDeclarationDirection,
|
16
15
|
)
|
16
|
+
from classiq.interface.generator.functions.type_name import Struct
|
17
|
+
from classiq.interface.model.allocate import Allocate
|
18
|
+
from classiq.interface.model.classical_parameter_declaration import (
|
19
|
+
ClassicalParameterDeclaration,
|
20
|
+
)
|
17
21
|
from classiq.interface.model.handle_binding import HandleBinding
|
18
22
|
from classiq.interface.model.model import Model, SerializedModel
|
19
23
|
from classiq.interface.model.native_function_definition import NativeFunctionDefinition
|
20
24
|
from classiq.interface.model.port_declaration import PortDeclaration
|
21
25
|
from classiq.interface.model.quantum_function_call import QuantumFunctionCall
|
26
|
+
from classiq.interface.model.quantum_type import QuantumBitvector
|
22
27
|
|
23
|
-
from classiq.applications.
|
24
|
-
OptimizerConfig,
|
25
|
-
QAOAConfig,
|
26
|
-
)
|
27
|
-
from classiq.applications_model_constructors.combinatorial_helpers.combinatorial_problem_utils import (
|
28
|
+
from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
|
28
29
|
compute_qaoa_initial_point,
|
29
30
|
convert_pyomo_to_global_presentation,
|
30
31
|
pyo_model_to_hamiltonian,
|
31
32
|
)
|
32
|
-
from classiq.
|
33
|
-
|
34
|
-
get_pauli_operator,
|
33
|
+
from classiq.applications.combinatorial_helpers.pauli_helpers.pauli_utils import (
|
34
|
+
_pauli_terms_to_qmod,
|
35
35
|
)
|
36
|
+
from classiq.applications.combinatorial_optimization import OptimizerConfig, QAOAConfig
|
37
|
+
from classiq.open_library.functions.qaoa_penalty import qaoa_penalty
|
36
38
|
|
37
39
|
|
38
40
|
def construct_combi_opt_py_model(
|
@@ -51,10 +53,9 @@ def construct_combi_opt_py_model(
|
|
51
53
|
max_iteration = optimizer_config.max_iteration
|
52
54
|
|
53
55
|
hamiltonian = pyo_model_to_hamiltonian(pyo_model, qaoa_config.penalty_energy)
|
56
|
+
len_hamiltonian = len(hamiltonian[0].pauli) # type: ignore[arg-type]
|
54
57
|
qaoa_initial_point = compute_qaoa_initial_point(hamiltonian, qaoa_config.num_layers)
|
55
|
-
|
56
|
-
pauli_oper = get_pauli_operator(hamiltonian)
|
57
|
-
pauli_qmod = _pauli_operator_to_qmod(pauli_oper)
|
58
|
+
pauli_qmod = _pauli_terms_to_qmod(hamiltonian)
|
58
59
|
|
59
60
|
initial_point_expression = (
|
60
61
|
f"{optimizer_config.initial_point}"
|
@@ -73,37 +74,38 @@ def construct_combi_opt_py_model(
|
|
73
74
|
functions=[
|
74
75
|
NativeFunctionDefinition(
|
75
76
|
name="main",
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
77
|
+
positional_arg_declarations=[
|
78
|
+
ClassicalParameterDeclaration(
|
79
|
+
name="params_list",
|
80
|
+
classical_type=ClassicalArray(
|
81
|
+
element_type=Real(), size=qaoa_config.num_layers * 2
|
82
|
+
),
|
83
|
+
),
|
84
|
+
PortDeclaration(
|
83
85
|
name="target",
|
84
|
-
|
86
|
+
quantum_type=QuantumBitvector(
|
87
|
+
length=Expression(expr=f"{len_hamiltonian}"),
|
88
|
+
),
|
85
89
|
direction=PortDeclarationDirection.Output,
|
86
90
|
),
|
87
|
-
|
91
|
+
],
|
88
92
|
body=[
|
93
|
+
Allocate(
|
94
|
+
size=Expression(expr="get_field(target, 'len')"),
|
95
|
+
target=HandleBinding(name="target"),
|
96
|
+
),
|
89
97
|
QuantumFunctionCall(
|
90
|
-
function="
|
98
|
+
function="qaoa_penalty",
|
91
99
|
positional_args=[
|
92
|
-
Expression(expr="
|
100
|
+
Expression(expr="get_field(target, 'len')"),
|
101
|
+
Expression(expr="params_list"),
|
102
|
+
Expression(expr="hamiltonian"),
|
93
103
|
HandleBinding(name="target"),
|
94
104
|
],
|
95
105
|
),
|
96
|
-
QuantumFunctionCall(
|
97
|
-
function="qaoa_penalty",
|
98
|
-
params={
|
99
|
-
"num_qubits": Expression(expr="len(target)"),
|
100
|
-
"params_list": Expression(expr="params_list"),
|
101
|
-
"hamiltonian": Expression(expr="hamiltonian"),
|
102
|
-
},
|
103
|
-
inouts={"target": HandleBinding(name="target")},
|
104
|
-
),
|
105
106
|
],
|
106
107
|
),
|
108
|
+
*[f for f in qaoa_penalty.create_model().functions if f.name != "main"],
|
107
109
|
],
|
108
110
|
classical_execution_code=f"""
|
109
111
|
vqe_result = vqe(
|
@@ -119,7 +121,7 @@ alpha_cvar={optimizer_config.alpha_cvar}
|
|
119
121
|
)
|
120
122
|
|
121
123
|
save({{"vqe_result": vqe_result, "hamiltonian": hamiltonian}})
|
122
|
-
""",
|
124
|
+
""".strip(),
|
123
125
|
)
|
124
126
|
|
125
127
|
|
@@ -0,0 +1,229 @@
|
|
1
|
+
import math
|
2
|
+
import re
|
3
|
+
from typing import Callable, Optional
|
4
|
+
|
5
|
+
import numpy as np
|
6
|
+
import pandas as pd
|
7
|
+
import pyomo.core as pyo
|
8
|
+
import scipy
|
9
|
+
from tqdm import tqdm
|
10
|
+
|
11
|
+
from classiq.interface.executor.execution_preferences import ExecutionPreferences
|
12
|
+
from classiq.interface.executor.result import ExecutionDetails
|
13
|
+
from classiq.interface.model.model import SerializedModel
|
14
|
+
|
15
|
+
from classiq import Constraints, Preferences
|
16
|
+
from classiq.applications.combinatorial_helpers.combinatorial_problem_utils import (
|
17
|
+
pyo_model_to_qmod_problem,
|
18
|
+
)
|
19
|
+
from classiq.execution import ExecutionSession
|
20
|
+
from classiq.open_library.functions.utility_functions import (
|
21
|
+
apply_to_all,
|
22
|
+
hadamard_transform,
|
23
|
+
)
|
24
|
+
from classiq.qmod.builtins.functions import RX
|
25
|
+
from classiq.qmod.builtins.operations import allocate, phase, repeat
|
26
|
+
from classiq.qmod.cparam import CReal
|
27
|
+
from classiq.qmod.create_model_function import create_model
|
28
|
+
from classiq.qmod.qfunc import qfunc
|
29
|
+
from classiq.qmod.qmod_parameter import CArray
|
30
|
+
from classiq.qmod.qmod_variable import Output, QVar
|
31
|
+
from classiq.synthesis import SerializedQuantumProgram, synthesize
|
32
|
+
|
33
|
+
|
34
|
+
class CombinatorialProblem:
|
35
|
+
def __init__(
|
36
|
+
self,
|
37
|
+
pyo_model: pyo.ConcreteModel,
|
38
|
+
num_layers: int,
|
39
|
+
penalty_factor: int = 1,
|
40
|
+
):
|
41
|
+
self.problem_vars_, self.cost_func = pyo_model_to_qmod_problem(
|
42
|
+
pyo_model, penalty_factor
|
43
|
+
)
|
44
|
+
self.num_layers_ = num_layers
|
45
|
+
self.model_ = None
|
46
|
+
self.qprog_ = None
|
47
|
+
self.es_ = None
|
48
|
+
self.optimized_params_ = None
|
49
|
+
self.params_trace_: list[np.ndarray] = []
|
50
|
+
self.cost_trace_: list = []
|
51
|
+
|
52
|
+
@property
|
53
|
+
def cost_trace(self) -> list:
|
54
|
+
return self.cost_trace_
|
55
|
+
|
56
|
+
@property
|
57
|
+
def params_trace(self) -> list[np.ndarray]:
|
58
|
+
return self.params_trace_
|
59
|
+
|
60
|
+
@property
|
61
|
+
def optimized_params(self) -> list:
|
62
|
+
return self.optimized_params_ # type:ignore[return-value]
|
63
|
+
|
64
|
+
def get_model(
|
65
|
+
self,
|
66
|
+
constraints: Optional[Constraints] = None,
|
67
|
+
preferences: Optional[Preferences] = None,
|
68
|
+
) -> SerializedModel:
|
69
|
+
@qfunc
|
70
|
+
def main(
|
71
|
+
params: CArray[CReal, self.num_layers_ * 2], # type:ignore[valid-type]
|
72
|
+
v: Output[self.problem_vars_], # type:ignore[name-defined]
|
73
|
+
) -> None:
|
74
|
+
allocate(v.size, v)
|
75
|
+
hadamard_transform(v)
|
76
|
+
repeat(
|
77
|
+
self.num_layers_,
|
78
|
+
lambda i: [ # type:ignore[arg-type]
|
79
|
+
phase(
|
80
|
+
-self.cost_func(v), params[i]
|
81
|
+
), # type:ignore[func-returns-value]
|
82
|
+
apply_to_all(lambda q: RX(params[self.num_layers_ + i], q), v),
|
83
|
+
],
|
84
|
+
)
|
85
|
+
|
86
|
+
self.model_ = create_model(
|
87
|
+
main, constraints=constraints, preferences=preferences
|
88
|
+
) # type:ignore[assignment]
|
89
|
+
return self.model_ # type:ignore[return-value]
|
90
|
+
|
91
|
+
def get_qprog(self) -> SerializedQuantumProgram:
|
92
|
+
if self.model_ is None:
|
93
|
+
self.get_model()
|
94
|
+
self.qprog_ = synthesize(self.model_) # type:ignore[assignment,arg-type]
|
95
|
+
return self.qprog_ # type:ignore[return-value]
|
96
|
+
|
97
|
+
def optimize(
|
98
|
+
self,
|
99
|
+
execution_preferences: Optional[ExecutionPreferences] = None,
|
100
|
+
maxiter: int = 20,
|
101
|
+
quantile: float = 1.0,
|
102
|
+
) -> list[float]:
|
103
|
+
if self.qprog_ is None:
|
104
|
+
self.get_qprog()
|
105
|
+
self.es_ = ExecutionSession(
|
106
|
+
self.qprog_, execution_preferences # type:ignore[assignment,arg-type]
|
107
|
+
)
|
108
|
+
self.params_trace_ = []
|
109
|
+
self.cost_trace_ = []
|
110
|
+
|
111
|
+
def estimate_cost_wrapper(params: np.ndarray) -> float:
|
112
|
+
cost = self.es_.estimate_cost( # type:ignore[attr-defined]
|
113
|
+
lambda state: self.cost_func(state["v"]),
|
114
|
+
{"params": params.tolist()},
|
115
|
+
quantile=quantile,
|
116
|
+
)
|
117
|
+
self.cost_trace_.append(cost)
|
118
|
+
self.params_trace_.append(params)
|
119
|
+
return cost
|
120
|
+
|
121
|
+
initial_params = (
|
122
|
+
np.concatenate(
|
123
|
+
(
|
124
|
+
np.linspace(1 / self.num_layers_, 1, self.num_layers_),
|
125
|
+
np.linspace(1, 1 / self.num_layers_, self.num_layers_),
|
126
|
+
)
|
127
|
+
)
|
128
|
+
* math.pi
|
129
|
+
)
|
130
|
+
|
131
|
+
with tqdm(total=maxiter, desc="Optimization Progress", leave=True) as pbar:
|
132
|
+
|
133
|
+
def _minimze_callback(xk: np.ndarray) -> None:
|
134
|
+
pbar.update(1) # increment progress bar
|
135
|
+
self.optimized_params_ = xk.tolist() # save recent optimized value
|
136
|
+
|
137
|
+
self.optimized_params_ = scipy.optimize.minimize(
|
138
|
+
estimate_cost_wrapper,
|
139
|
+
callback=_minimze_callback,
|
140
|
+
x0=initial_params,
|
141
|
+
method="COBYLA",
|
142
|
+
options={"maxiter": maxiter},
|
143
|
+
).x.tolist()
|
144
|
+
|
145
|
+
return self.optimized_params_ # type:ignore[return-value]
|
146
|
+
|
147
|
+
def sample_uniform(self) -> pd.DataFrame:
|
148
|
+
return self.sample([0] * self.num_layers_ * 2)
|
149
|
+
|
150
|
+
def sample(self, params: list) -> pd.DataFrame:
|
151
|
+
assert self.es_ is not None
|
152
|
+
res = self.es_.sample( # type:ignore[unreachable]
|
153
|
+
{"params": params}
|
154
|
+
)
|
155
|
+
parsed_result = [
|
156
|
+
{
|
157
|
+
"solution": {
|
158
|
+
key: value
|
159
|
+
for key, value in sampled.state["v"].items()
|
160
|
+
if not re.match(".*_slack_var_.*", key)
|
161
|
+
},
|
162
|
+
"probability": sampled.shots / res.num_shots,
|
163
|
+
"cost": self.cost_func(sampled.state["v"]),
|
164
|
+
}
|
165
|
+
for sampled in res.parsed_counts
|
166
|
+
]
|
167
|
+
return pd.DataFrame.from_records(parsed_result)
|
168
|
+
|
169
|
+
|
170
|
+
def execute_qaoa(
|
171
|
+
problem_vars: type[QVar],
|
172
|
+
cost_func: Callable,
|
173
|
+
num_layers: int,
|
174
|
+
maxiter: int,
|
175
|
+
execution_preferences: Optional[ExecutionPreferences] = None,
|
176
|
+
) -> tuple[SerializedModel, SerializedQuantumProgram, ExecutionDetails]:
|
177
|
+
"""
|
178
|
+
Implements a simple QAOA algorithm, including the creation and synthesis of the QAOA
|
179
|
+
ansatz and the classical optimization loop.
|
180
|
+
|
181
|
+
Args:
|
182
|
+
problem_vars: the quantum type (scalar, array, or struct) of the problem variable(s)
|
183
|
+
cost_func: the arithmetic expression that evaluates the cost given an instance of the problem_vars type
|
184
|
+
num_layers: the number of layers of the QAOA ansatz
|
185
|
+
maxiter: the maximum number of iterations for the classical optimization loop
|
186
|
+
execution_preferences: the execution settings for running the QAOA ansatz
|
187
|
+
|
188
|
+
Returns:
|
189
|
+
a tuple containing the model of the QAOA ansatz, the corresponding synthesized quantum program,
|
190
|
+
and the result of the execution with the optimized parameters
|
191
|
+
"""
|
192
|
+
|
193
|
+
@qfunc
|
194
|
+
def main(
|
195
|
+
params: CArray[CReal, num_layers * 2], # type:ignore[valid-type]
|
196
|
+
v: Output[problem_vars], # type:ignore[valid-type]
|
197
|
+
) -> None:
|
198
|
+
allocate(v.size, v) # type:ignore[attr-defined]
|
199
|
+
hadamard_transform(v)
|
200
|
+
repeat(
|
201
|
+
num_layers,
|
202
|
+
lambda i: [ # type:ignore[arg-type]
|
203
|
+
phase(-cost_func(v), params[i]), # type:ignore[func-returns-value]
|
204
|
+
apply_to_all(lambda q: RX(params[num_layers + i], q), v),
|
205
|
+
],
|
206
|
+
)
|
207
|
+
|
208
|
+
model = create_model(main)
|
209
|
+
qprog = synthesize(model)
|
210
|
+
|
211
|
+
with ExecutionSession(qprog, execution_preferences) as es:
|
212
|
+
initial_params = (
|
213
|
+
np.concatenate(
|
214
|
+
(np.linspace(0, 1, num_layers), np.linspace(1, 0, num_layers))
|
215
|
+
)
|
216
|
+
* math.pi
|
217
|
+
)
|
218
|
+
final_params = scipy.optimize.minimize(
|
219
|
+
lambda params: es.estimate_cost(
|
220
|
+
lambda state: cost_func(state["v"]),
|
221
|
+
{"params": params.tolist()},
|
222
|
+
),
|
223
|
+
x0=initial_params,
|
224
|
+
method="COBYLA",
|
225
|
+
options={"maxiter": maxiter},
|
226
|
+
).x.tolist()
|
227
|
+
result = es.sample({"params": final_params})
|
228
|
+
|
229
|
+
return model, qprog, result
|
@@ -1,5 +1,3 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
from classiq.interface.combinatorial_optimization.examples.ascending_sequence import (
|
4
2
|
ascending_sequence,
|
5
3
|
)
|
@@ -47,5 +45,5 @@ __all__ = [
|
|
47
45
|
]
|
48
46
|
|
49
47
|
|
50
|
-
def __dir__() ->
|
48
|
+
def __dir__() -> list[str]:
|
51
49
|
return __all__
|
@@ -1,19 +1,18 @@
|
|
1
|
-
from typing import List
|
2
|
-
|
3
1
|
from classiq.interface.finance import (
|
4
2
|
function_input,
|
5
3
|
gaussian_model_input,
|
6
4
|
log_normal_model_input,
|
7
|
-
model_input,
|
8
5
|
)
|
9
6
|
|
7
|
+
from .finance_model_constructor import construct_finance_model
|
8
|
+
|
10
9
|
__all__ = [
|
10
|
+
"construct_finance_model",
|
11
11
|
"function_input",
|
12
12
|
"gaussian_model_input",
|
13
13
|
"log_normal_model_input",
|
14
|
-
"model_input",
|
15
14
|
]
|
16
15
|
|
17
16
|
|
18
|
-
def __dir__() ->
|
17
|
+
def __dir__() -> list[str]:
|
19
18
|
return __all__
|