Source code for qiskit_optimization.applications.number_partition
# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2018, 2023.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""An application class for the number partitioning."""
from typing import List, Union
import numpy as np
from docplex.mp.model import Model
from qiskit_optimization.algorithms import OptimizationResult
from qiskit_optimization.problems.quadratic_program import QuadraticProgram
from qiskit_optimization.translators import from_docplex_mp
from .optimization_application import OptimizationApplication
[docs]class NumberPartition(OptimizationApplication):
    """Optimization application for the "number partition" [1] problem.
    References:
        [1]: "Partition problem",
        https://en.wikipedia.org/wiki/Partition_problem
    """
    def __init__(self, number_set: List[int]) -> None:
        """
        Args:
            number_set: A list of integers
        """
        self._number_set = number_set
[docs]    def to_quadratic_program(self) -> QuadraticProgram:
        """Convert a number partitioning problem instance into a
        :class:`~qiskit_optimization.problems.QuadraticProgram`
        Returns:
            The :class:`~qiskit_optimization.problems.QuadraticProgram` created
            from the number partitioning problem instance.
        """
        mdl = Model(name="Number partitioning")
        x = {i: mdl.binary_var(name=f"x_{i}") for i in range(len(self._number_set))}
        mdl.add_constraint(
            mdl.sum(num * (-2 * x[i] + 1) for i, num in enumerate(self._number_set)) == 0
        )
        op = from_docplex_mp(mdl)
        return op
[docs]    def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[List[int]]:
        """Interpret a result as a list of subsets
        Args:
            result: The calculated result of the problem
        Returns:
            A list of subsets whose sum is the half of the total.
        """
        x = self._result_to_x(result)
        num_subsets = [[], []]  # type: List[List[int]]
        for i, value in enumerate(x):
            if value == 0:
                num_subsets[0].append(self._number_set[i])
            else:
                num_subsets[1].append(self._number_set[i])
        return num_subsets