mimo(modulation: Literal['BPSK', 'QPSK', '16QAM', '64QAM', '256QAM'] = 'BPSK', y: array | None = None, F: array | None = None, *, transmitted_symbols: array | None = None, channel_noise: array | None = None, num_transmitters: int | None = None, num_receivers: int | None = None, SNRb: float = inf, seed: RandomState | int | None = None, F_distribution: None | tuple = None, attenuation_matrix=None) BinaryQuadraticModel[source]#

Generate a multi-input multiple-output (MIMO) channel-decoding problem.

In radio networks, MIMO is a method of increasing link capacity by using multiple transmission and receiving antennas to exploit multipath propagation.

Users transmit complex-valued symbols over a random channel, \(F\), subject to additive white Gaussian noise. Given the received signal, \(y\), the log likelihood of a given symbol set, \(v\), is \(MLE = argmin || y - F v ||_2\). When \(v\) is encoded as a linear sum of bits, the optimization problem is a binary quadratic model.

Depending on its parameters, this function can model code division multiple access (CDMA) _[#T02, #R20], 5G communication networks _[#Prince], or other problems.

  • modulation

    Constellation (symbol set) users can transmit. Symbols are assumed to be transmitted with equal probability. Supported values are:

    • ’BPSK’

      Binary Phase Shift Keying. Transmitted symbols are \(+1, -1\); no encoding is required. A real-valued channel is assumed.

    • ’QPSK’

      Quadrature Phase Shift Keying. Transmitted symbols are \(1+1j, 1-1j, -1+1j, -1-1j\) normalized by \(\frac{1}{\sqrt{2}}\). Bits are encoded as a real vector concatenated with an imaginary vector.

    • ’16QAM’

      Each user is assumed to select independently from 16 symbols. The transmitted symbol is a complex value that can be encoded by two bits in the imaginary part and two bits in the real part. Highest precision real and imaginary bit vectors are concatenated to lower precision bit vectors.

    • ’64QAM’

      A QPSK symbol set is generated and symbols are further amplitude modulated by an independently and uniformly distributed random amount from \([1, 3]\).

    • ’256QAM’

      A QPSK symbol set is generated and symbols are further amplitude modulated by an independently and uniformly distributed random amount from \([1, 3, 5]\).

  • y – Complex- or real-valued received signal, as a NumPy array. If None, generated from other arguments.

  • F – Complex- or real-valued channel, as a NumPy array. If None, generated from other arguments. Note that for correct interpretation of SNRb, channel power should be normalized to num_transmitters.

  • num_transmitters – Number of users. Each user transmits one symbol per frame.

  • num_receivers – Number of receivers of a channel. Must be consistent with the length of any provided signal, len(y).

  • SNRb

    Signal-to-noise ratio per bit used to generate the noisy signal when y is not provided. If float('Inf'), no noise is added.

    \(SNR_b = E_b/N_0\), where \(E_b\) is energy per bit, and \(N_0\) is the one-sided power-spectral density. \(N_0\) is typically \(k_B T\) at the receiver. To convert units of \(dB\) to \(SNR_b\) use \(SNRb=10^{SNR_b[decibels]/10}\).

  • seed – Random seed, as an integer, or state, as a numpy.random.RandomState instance.

  • transmitted_symbols

    Set of symbols transmitted. Used in combination with F to generate the received signal, \(y\). The number of transmitted symbols must be consistent with F.

    For BPSK and QPSK modulations, statistics of the ensemble do not depend on the choice: all choices are equivalent. By default, symbols are chosen for all users as \(1\) or \(1 + 1j\), respectively. Note that for correct analysis by some solvers, applying spin-reversal transforms may be necessary.

    For QAM modulations such as 16QAM, amplitude randomness affects likelihood in a non-trivial way. By default, symbols are chosen independently and identically distributed from the constellations.

  • channel_noise – Channel noise as a NumPy array of complex values. Must be consistent with the number of receivers.

  • F_distribution

    Zero-mean, variance-one distribution, in tuple form (distribution, type), used to generate each element in F when F is not provided . Supported values are:

    • 'normal' or 'binary' for the distribution

    • 'real' or 'complex' for the type

    For large numbers of receivers and transmitters, statistical properties of the likelihood are weakly dependent on the distribution. Choosing 'binary' allows for integer-valued Hamiltonians while 'normal' is a more typical model. The channel can be real or complex; in many cases this represents a superficial distinction up to rescaling. For real-valued symbols (BPSK) the default is ('normal', 'real'); otherwise, the default is ('normal', 'complex').

  • attenuation_matrix – Root of the power associated with each transmitter-receiver channel; use for sparse and structured codes.


Binary quadratic model defining the log-likelihood function.


This example generates an instance of a CDMA problem in the high-load regime, near a first-order phase transition.

>>> num_transmitters = 64
>>> transmitters_per_receiver = 1.5
>>> SNRb = 5
>>> bqm = dimod.generators.mimo(modulation='BPSK',
...     num_transmitters = 64,
...     num_receivers = round(num_transmitters / transmitters_per_receiver),
...     SNRb=SNRb,
...     F_distribution = ('binary', 'real'))