class svvamp.GeneratorProfileSpheroid(n_v, n_c, stretching=1, sort_voters=False)[source]

Profile generator using the ‘Spheroid’ model.

Parameters:
  • n_v (int) – Number of voters.

  • n_c (int) – Number of candidates.

  • stretching (number) – Number between 0 and numpy.inf (both included).

  • sort_voters (bool) – This argument is passed to Profile.

Notes

The utility vector of each voter is drawn independently and uniformly on a sphere in \(\mathbb{R}^n_c\). Then, it is sent on the spheroid that is the image of the sphere by a dilatation of factor stretching in direction [1, …, 1]. Cf. Durand et al., ‘Geometry on the Utility Sphere’.

The ordinal part of this distribution is the Impartial Culture.

The parameter stretching has an influence only on voting systems based on utilities, especially Approval voting.

  • stretching = 0: pure Von Neumann-Morgenstern utility, normalized to \(\sum_c u_v(c) = 0\) ( spherical model with n_c-2 dimensions).

  • stretching = 1: spherical model with n_c-1 dimensions.

  • stretching = inf: axial/cylindrical model with only two possible values, all-approval [1, …, 1] and all-reject [-1, …, -1].

N.B.: This model gives is equivalent to a Von Mises-Fisher model with concentration = 0.

Examples

Typical usage:

>>> generator = GeneratorProfileSpheroid(n_v=10, n_c=3, stretching=1)
>>> profile = generator()
>>> profile.preferences_rk.shape
(10, 3)

With some stretching:

>>> generator = GeneratorProfileSpheroid(n_v=10, n_c=3, stretching=2)
>>> profile = generator()
>>> profile.preferences_rk.shape
(10, 3)
>>> generator = GeneratorProfileSpheroid(n_v=10, n_c=3, stretching=.5)
>>> profile = generator()
>>> profile.preferences_rk.shape
(10, 3)