Esempio n. 1
0
def test_tuple_integer_limits(row_limits, col_limits, weights, prob, seed):
    """Verify that `mutation` creates a valid individual where the lower and
    upper column limits and tuple and integer respectively."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]
    state = np.random.RandomState(seed)

    individual = create_individual(row_limits, col_limits, families, weights,
                                   state)

    mutant = mutation(individual, prob, row_limits, col_limits, families,
                      weights)

    _common_asserts(mutant, families)

    dataframe, metadata = mutant
    assert row_limits[0] <= dataframe.shape[0] <= row_limits[1]
    assert sum(col_limits[0]) <= dataframe.shape[1] <= col_limits[1]

    family_counts = {
        family: sum(pdf.family is family for pdf in metadata)
        for family in families
    }

    for i, count in enumerate(family_counts.values()):
        assert count >= col_limits[0][i]
Esempio n. 2
0
def test_get_fitness(row_limits, col_limits, weights, seed):
    """Create an individual and get its fitness. Then verify that the fitness
    is of the correct data type and has been added to the cache."""

    distributions = [Normal, Poisson, Uniform]
    families = [edo.Family(dist) for dist in distributions]
    random_state = np.random.RandomState(seed)

    individual = create_individual(
        row_limits, col_limits, families, weights, random_state
    )

    fit = get_fitness(individual, trivial_fitness).compute()
    assert isinstance(fit, float)
    assert individual.fitness == fit
Esempio n. 3
0
def test_integer_limits(row_limits, col_limits, weights, prob, seed):
    """Verify that `mutation` creates a valid individual with all integer
    column limits."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]
    state = np.random.RandomState(seed)

    individual = create_individual(row_limits, col_limits, families, weights,
                                   state)

    mutant = mutation(individual, prob, row_limits, col_limits, families,
                      weights)

    _common_asserts(mutant, families)

    for i, limits in enumerate([row_limits, col_limits]):
        assert limits[0] <= mutant.dataframe.shape[i] <= limits[1]
Esempio n. 4
0
def test_integer_limits(row_limits, col_limits, weights, seed):
    """Create an individual with all-integer column limits and verify that it
    is a namedtuple with a `pandas.DataFrame` field of a valid shape, and
    metadata made up of instances from the classes in families."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]

    state = np.random.RandomState(seed)

    individual = create_individual(
        row_limits, col_limits, families, weights, state
    )

    _common_asserts(individual, state, families)

    for i, limits in enumerate([row_limits, col_limits]):
        assert limits[0] <= individual.dataframe.shape[i] <= limits[1]
Esempio n. 5
0
def test_integer_limits(row_limits, col_limits, weights, prob, seed):
    """Verify that `crossover` produces a valid individual with all integer
    column limits."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]
    random_state = np.random.RandomState(seed)

    parents = [
        create_individual(
            row_limits, col_limits, families, weights, random_state
        )
        for _ in [0, 1]
    ]

    individual = crossover(*parents, col_limits, families, random_state, prob)

    _common_asserts(individual, *parents)
Esempio n. 6
0
def test_tuple_limits(row_limits, col_limits, weights, prob, seed):
    """Verify that `crossover` produces a valid individual with all tuple
    column limits."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]
    random_state = np.random.RandomState(seed)

    parents = [
        create_individual(
            row_limits, col_limits, families, weights, random_state
        )
        for _ in [0, 1]
    ]

    individual = crossover(*parents, col_limits, families, random_state, prob)

    _common_asserts(individual, *parents)
    for i, family in enumerate(families):
        count = sum(pdf.family is family for pdf in individual.metadata)
        assert col_limits[0][i] <= count <= col_limits[1][i]
Esempio n. 7
0
def test_to_and_from_file(row_limits, col_limits, weights, seed):
    """ Test that an individual can be saved to and created from file. """

    path = Path(".testcache/individual")

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]

    state = np.random.RandomState(seed)

    individual = create_individual(
        row_limits, col_limits, families, weights, state
    )

    individual.to_file(path, ".testcache")
    assert (path / "main.csv").exists()
    assert (path / "main.meta").exists()
    assert (path / "main.state").exists()

    saved_individual = Individual.from_file(path, distributions, ".testcache")

    assert np.allclose(
        saved_individual.dataframe.values, individual.dataframe.values
    )

    for saved_pdf, pdf in zip(saved_individual.metadata, individual.metadata):

        assert saved_pdf.family.name == pdf.family.name
        assert saved_pdf.family.distribution is pdf.family.distribution
        assert saved_pdf.to_dict() == pdf.to_dict()

    for saved_part, state_part in zip(
        saved_individual.random_state.get_state(), state.get_state()
    ):
        try:
            assert all(saved_part == state_part)
        except TypeError:
            assert saved_part == state_part

    os.system("rm -r .testcache")
Esempio n. 8
0
def test_tuple_integer_limits(row_limits, col_limits, weights, prob, seed):
    """Verify that `crossover` produces a valid individual where the lower and
    upper column limits are tuple and integer respectively."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]
    random_state = np.random.RandomState(seed)

    parents = [
        create_individual(
            row_limits, col_limits, families, weights, random_state
        )
        for _ in [0, 1]
    ]

    individual = crossover(*parents, col_limits, families, random_state, prob)

    _common_asserts(individual, *parents)

    for family, lower_limit in zip(families, col_limits[0]):
        count = sum(pdf.family is family for pdf in individual.metadata)
        assert count >= lower_limit
Esempio n. 9
0
def test_tuple_integer_limits(row_limits, col_limits, weights, seed):
    """Create an individual with tuple lower limits and integer upper limits on
    the columns. Verify the individual is valid and of a reasonable shape and
    does not exceed the lower bounds."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]

    state = np.random.RandomState(seed)

    individual = create_individual(
        row_limits, col_limits, families, weights, state
    )

    _common_asserts(individual, state, families)

    dataframe, metadata = individual
    assert row_limits[0] <= dataframe.shape[0] <= row_limits[1]
    assert sum(col_limits[0]) <= dataframe.shape[1] <= col_limits[1]

    for family, lower_limit in zip(families, col_limits[0]):
        count = sum([isinstance(pdf, family.distribution) for pdf in metadata])
        assert count >= lower_limit
Esempio n. 10
0
def test_tuple_limits(row_limits, col_limits, weights, seed):
    """Create an individual with tuple column limits. Verify the individual is
    valid and of a reasonable shape and does not exceed either of the column
    bounds."""

    distributions = [Gamma, Normal, Poisson]
    families = [Family(distribution) for distribution in distributions]

    state = np.random.RandomState(seed)

    individual = create_individual(
        row_limits, col_limits, families, weights, state
    )

    _common_asserts(individual, state, families)

    dataframe, metadata = individual
    assert row_limits[0] <= dataframe.shape[0] <= row_limits[1]
    assert sum(col_limits[0]) <= dataframe.shape[1] <= sum(col_limits[1])

    for i, family in enumerate(families):
        count = sum([isinstance(pdf, family.distribution) for pdf in metadata])
        assert col_limits[0][i] <= count <= col_limits[1][i]
Esempio n. 11
0
""" .. Mutation example. """

import numpy as np

from edo.individual import create_individual
from edo.operators import mutation
from edo.pdfs import Poisson

np.random.seed(0)

row_limits, col_limits = [1, 3], [1, 5]
pdfs = [Poisson]

individual = create_individual(row_limits, col_limits, pdfs)

mutation_prob = 0.5

mutant = mutation(individual, mutation_prob, row_limits, col_limits, pdfs)

for name, ind in zip(["individual", "mutant"], [individual, mutant]):
    df, meta = ind

    df.to_csv(f"../discussion/operators/{name}.csv")

    with open(f"../discussion/operators/{name}.rst", "w") as ind_file:
        string = ".. :orphan:\n\n"
        string += "And their metadata is::\n\n    ["
        for col in meta:
            string += str(col) + ", "
        string = string[:-2]
        string += "]\n    "
Esempio n. 12
0
""" .. Crossover example. """

import numpy as np

from edo.individual import create_individual
from edo.operators import crossover
from edo.pdfs import Poisson

np.random.seed(0)

row_limits, col_limits = [1, 3], [1, 5]
pdfs = [Poisson]

parents = [create_individual(row_limits, col_limits, pdfs) for _ in range(2)]

crossover_prob = 0.5

offspring = crossover(*parents, col_limits, pdfs, crossover_prob)

for i, parent in enumerate(parents):
    parent.dataframe.to_csv(f"../discussion/operators/parent_{i+1}.csv")

with open("../discussion/operators/parents.rst", "w") as parent_file:
    string = ".. :orphan:\n\n"
    string += "And their metadata is::\n\n    "
    for parent in parents:
        string += "["
        for col in parent.metadata:
            string += str(col) + ", "
        string = string[:-2]
        string += "]\n    "