coordinated_multipoint(lattice: networkx.Graph, modulation: Literal['BPSK', 'QPSK', '16QAM', '64QAM', '256QAM'] = 'BPSK', y: Optional[numpy.array] = None, F: Optional[numpy.array] = None, *, transmitted_symbols: Optional[numpy.array] = None, channel_noise: Optional[numpy.array] = None, SNRb: float = inf, seed: Union[None, int, numpy.random.mtrand.RandomState] = None, F_distribution: Union[None, str] = None) dimod.binary.binary_quadratic_model.BinaryQuadraticModel[source]

Generate a coordinated multi-point (CoMP) decoding problem.

In coordinated multipoint (CoMP) neighboring cellular base stations coordinate transmissions and jointly process received signals.

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.

  • lattice

    Geometry, as a networkx.Graph, defining the set of nearest-neighbor base stations.

    Each base station has num_receivers receivers and num_transmitters local transmitters, set as either attributes of the graph or as per-node values. Transmitters from neighboring base stations are also received.

  • 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 – Transmission channel. Currently not supported and must be None.

  • 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 complex value.

  • SNRb – Signal-to-noise ratio per bit, \(SNRb=10^{SNR_b[decibels]/10}\), used to generate the noisy signal when y is not provided. If float('Inf'), no noise is added.

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

  • 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').


Binary quadratic model defining the log-likelihood function.

Return type



Generate an instance of a CDMA problem in the high-load regime, near a first-order phase transition:

>>> import networkx as nx
>>> G = nx.complete_graph(4)
>>> nx.set_node_attributes(G, values={n:2*n+1 for n in G.nodes()}, name='num_transmitters')
>>> nx.set_node_attributes(G, values={n:2 for n in G.nodes()}, name='num_receivers')
>>> transmitted_symbols = np.random.choice([1, -1],
...     size=(sum(nx.get_node_attributes(G, "num_transmitters").values()), 1))
>>> bqm = dimod.generators.coordinated_multipoint(G,
...     modulation='BPSK',
...     transmitted_symbols=transmitted_symbols,
...     SNRb=5,
...     F_distribution = ('binary', 'real'))