Skip to content

qoolqit.waveforms.utils

[docs] module qoolqit.waveforms.utils

from __future__ import annotations

import numpy as np


def round_to_sum(values: list[float]) -> list[int]:
    """Round a list of numbers such that their sum is the rounded sum.

    Σᵢround(aᵢ) = round(Σᵢaᵢ)

    Example:
        ```python
        >>> round_to_sum([100.3, 100.3, 100.4])
        >>> [100, 100, 101]
        ```
    """
    rounded_values = [round(el) for el in values]
    reminders = [el - rel for rel, el in zip(rounded_values, values)]
    sum_reminders = round(sum(reminders))
    p = np.argsort(reminders)

    for i in range(abs(sum_reminders)):
        if sum_reminders < 0:
            rounded_values[p[i]] -= 1
        if sum_reminders > 0:
            rounded_values[p[-1 - i]] += 1

    return rounded_values