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]
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
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]
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]
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)
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]
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")
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
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
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]
""" .. 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 "
""" .. 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 "