Skip to content

Data generation

Table des codes de générateurs

All generators are integrated via the generator_codes key in config/simulation.toml.

Code Generator status
EUCLID Euclidean Box Tested & validated
GAUSS Gaussian Well Tested & validated
IANC Impartial, Anonymous & Neutral Culture ⚠️ Known issues
IC Impartial Culture Tested & validated
LADDER Ladder Tested & validated
PERTURB Perturbed Culture Tested & validated
SPHEROID Spheroid Tested & validated
UFR Uniform Few Rankings Tested & validated
UNANIMOUS Unanimous Tested & validated
UNI Cubic Uniform Tested & validated
VMF_HC Von Mises-Fisher Hypercircle Tested & validated
VMF_HS Von Mises-Fisher Hypersphere Tested & validated

Generator registry mapping short codes to svvamp GeneratorProfile factories.

Usage examples:

> from vote_simulation.models.data_generation.generator_registry import get_generator_builder
> builder = get_generator_builder("UNI")
> profile = builder(n_v=100, n_c=5, seed=42)

GeneratorBuilder = Callable[..., Profile] module-attribute

Signature: (n_v, n_c, seed=0, **extra) -> svvamp.Profile

get_generator_builder(code)

Return the generator builder for the given code.

Raises:

Type Description
ValueError

If code is not registered.

Source code in src/vote_simulation/models/data_generation/generator_registry.py
def get_generator_builder(code: str) -> GeneratorBuilder:
    """Return the generator builder for the given code.

    Raises:
        ValueError: If code is not registered.
    """
    normalized = code.strip().upper()
    try:
        return _GENERATOR_BUILDERS[normalized]
    except KeyError as exc:
        available = ", ".join(sorted(_GENERATOR_BUILDERS))
        raise ValueError(f"Unknown generator code: '{code}'. Available: {available}") from exc

list_generator_codes()

Return sorted list of all registered generator codes.

Source code in src/vote_simulation/models/data_generation/generator_registry.py
def list_generator_codes() -> list[str]:
    """Return sorted list of all registered generator codes."""
    return sorted(_GENERATOR_BUILDERS)

make_generator_builder(generator_factory, **default_kwargs)

Create a public GeneratorBuilder from a generator factory.

This helper is intended for external users who want to register custom generators while reusing the registry's seeding and relabeling logic.

Parameters:

Name Type Description Default
generator_factory Callable[..., Any]

Callable (n_v, n_c, **kw) -> svvamp generator that, when called, returns an svvamp generator object.

required
**default_kwargs object

Default keyword arguments forwarded to the factory.

{}

Returns:

Type Description
GeneratorBuilder

A GeneratorBuilder that can be registered in the registry.

Example::

from svvamp import GeneratorProfileEuclideanBox
builder = make_generator_builder(
    GeneratorProfileEuclideanBox,
    box_dimensions=[1.0, 1.0, 1.0],
)
register_generator("MY_EUCLID_3D", builder)
Source code in src/vote_simulation/models/data_generation/generator_registry.py
def make_generator_builder(
    generator_factory: Callable[..., Any],
    **default_kwargs: object,
) -> GeneratorBuilder:
    """Create a public `GeneratorBuilder` from a generator factory.

    This helper is intended for external users who want to register custom
    generators while reusing the registry's seeding and relabeling logic.

    Args:
        generator_factory: Callable ``(n_v, n_c, **kw) -> svvamp generator``
            that, when called, returns an svvamp generator object.
        **default_kwargs: Default keyword arguments forwarded to the factory.

    Returns:
        A `GeneratorBuilder` that can be registered in the registry.

    Example::

        from svvamp import GeneratorProfileEuclideanBox
        builder = make_generator_builder(
            GeneratorProfileEuclideanBox,
            box_dimensions=[1.0, 1.0, 1.0],
        )
        register_generator("MY_EUCLID_3D", builder)
    """

    def _builder(
        n_v: int,
        n_c: int,
        *,
        seed: int = 0,
        iteration: int = 0,
        **kw: object,
    ) -> Profile:
        _seed(seed, iteration)
        merged = {**default_kwargs, **kw}
        gen = generator_factory(n_v=n_v, n_c=n_c, **merged)
        return _relabel(gen(), n_c)

    return _builder

normalize_between_0_and_1(profile)

Return a new Profile with utilities normalized to [0, 1].

Source code in src/vote_simulation/models/data_generation/generator_registry.py
def normalize_between_0_and_1(profile: Profile) -> Profile:
    """Return a new Profile with utilities normalized to [0, 1]."""
    ut = profile.preferences_ut
    min_ut = np.min(ut)
    max_ut = np.max(ut)
    if max_ut > min_ut:
        normalized_ut = (ut - min_ut) / (max_ut - min_ut)
    else:
        normalized_ut = np.zeros_like(ut)
    return Profile(preferences_ut=normalized_ut, labels_candidates=profile.labels_candidates)

register_generator(code, builder)

Register a generator builder under a short code.

Parameters:

Name Type Description Default
code str

Short code - case-insensitive, will be normalized.

required
builder GeneratorBuilder

Callable (n_v, n_c, seed=0, **extra) -> Profile.

required
Source code in src/vote_simulation/models/data_generation/generator_registry.py
def register_generator(code: str, builder: GeneratorBuilder) -> None:
    """Register a generator builder under a short code.

    Args:
        code: Short code - case-insensitive, will be normalized.
        builder: Callable ``(n_v, n_c, seed=0, **extra) -> Profile``.
    """
    _GENERATOR_BUILDERS[code.strip().upper()] = builder

Euclidean box

plot3 mds

Gauss

plot3 mds

IANC

Issue to fix not working for now

IC

plot3 mds

Ladder

plot3 mds

Perturb

plot3 mds

Spheroid

plot3 mds

Uniform few ranking

plot3 mds

Unanimous

plot3 mds

Uniform

plot3 plot3

Von Mises-Fisher Hypercircle

plot3 mds

Von Mises-Fisher Hypersphere

plot3 mds