def test_invalid_find_critical_values():
    dga = DiffusionGA('just_for_test')

    fit_arr = [
        [[1,2,4], [1,2,4]],
        [[2,6,8], [1,2,4]],
        [[1,2,4], [8,7,5]]
    ]
    fit_arr = numpy.array(fit_arr)

    with pytest.raises(ValueError):
        dga._find_critical_values(fit_arr)
def test_valid_find_critical_values(optim, arr, rmin, rmax):
    ga = RealGA(fitness_test_sin_func, optim=optim)
    dga = DiffusionGA(ga)

    arr = numpy.array(arr)

    coords_best, coords_worst = dga._find_critical_values(arr)

    if optim == 'min':
        assert arr[coords_best] == rmin
        assert arr[coords_worst] == rmax
    else:
        assert arr[coords_best] == rmax
        assert arr[coords_worst] == rmin
def test_init_random_population_real(optim, type):
    size, dim, interval = 9, 1, (-5, 5)

    if type == 'real':
        ga = RealGA(fitness_test_linear_func, optim=optim)
        dga = DiffusionGA(ga)

        dga.init_random_population(size, dim, interval)
    else:
        ga = BinaryGA(test_bin_data, fitness_test_func, optim=optim)
        dga = DiffusionGA(ga)
        dga.init_random_population(size)

    assert dga.population[0].size == size
    assert dga.population[1].size == size

    shape = dga.population[0].shape
    if optim == 'max':
        for row in range(shape[0]):
            for column in range(shape[1]):
                assert dga.population[1][row][column] <= dga.best_solution[1]
    else:
        for row in range(shape[0]):
            for column in range(shape[1]):
                assert dga.population[1][row][column] >= dga.best_solution[1]
def test_get_neighbour(fit_list, row, column):
    ga = RealGA(fitness_test_sin_func)
    dga = DiffusionGA(ga)
    dga._chrom_arr = numpy.array(list(range(9))).reshape((3, 3))
    dga._fitness_arr = numpy.array(fit_list).reshape(3, 3)
    shape = dga._chrom_arr.shape

    selected_chromosome = dga._get_neighbour(row, column)

    indices = numpy.where(dga._chrom_arr == selected_chromosome)
    coords = (indices[0][0], indices[1][0])

    valid_indices = [((row - 1) % shape[0], column),
                     ((row + 1) % shape[0], column),
                     (row, (column - 1) % shape[1]),
                     (row, (column + 1) % shape[1])]

    assert coords in valid_indices
def test_valid_run(optim):
    """
    "Run" function is the same for both types of diffusion GA: RealGA and Binary GA and thus,
    it is not necessary to test it twice.
    """
    ga = RealGA(fitness_test_sin_func, optim=optim)
    dga = DiffusionGA(ga)
    dga.init_random_population(11, 1, (-5, 5))  # size is 11 but actually wil be 9 (truncated square root from 11)

    init_best = dga.best_solution

    generations = 10
    fitness_progress = dga.run(generations)

    assert len(fitness_progress) == generations + 1

    if optim == 'min':
        assert init_best[1] >= dga.best_solution[1]
    else:
        assert init_best[1] <= dga.best_solution[1]
def test_get_population():
    ga = DiffusionGA('just_for_test')

    arr = numpy.empty(4)
    for i in range(4):
        arr[i] = i

    ga._fitness_arr = numpy.empty(2)
    ga._fitness_arr[0] = arr[0]
    ga._fitness_arr[1] = arr[1]
    ga._chrom_arr = numpy.empty(2)
    ga._chrom_arr[0] = arr[2]
    ga._chrom_arr[1] = arr[3]

    assert (ga.population[0] == arr[2:]).all()
    assert (ga.population[1] == arr[:2]).all()
def test_valid_init_population(optim):
    """
    This test includes testing of the following parts: *init_population()*,
    *_init_diffusion_model()*, *_construct_diffusion_model()* and *best_solution*.
    """
    ga = RealGA(fitness_test_linear_func, optim=optim)
    dga = DiffusionGA(ga)

    array_side = 3
    population = list(range(array_side * array_side))
    fitness = [fitness_test_linear_func(chrom) for chrom in population]

    dga.init_population(population)

    for elem, fit in zip(population, fitness):
        assert elem in dga._chrom_arr
        assert fit in dga._fitness_arr

    if optim == 'min':
        assert dga.best_solution[0] == min(population)
        assert dga.best_solution[1] == fitness_test_linear_func(min(population))
    else:
        assert dga.best_solution[0] == max(population)
        assert dga.best_solution[1] == fitness_test_linear_func(max(population))
def test_invalid_init_population(population):
    with pytest.raises(ValueError):
        DiffusionGA('just_for_test').init_population(population)
def test_invalid_run(generations):
    with pytest.raises(ValueError):
        DiffusionGA('just_for_test').run(generations)
def test_invalid_init_random_population(size, dim, interval, ga_inst):
    with pytest.raises(ValueError):
        DiffusionGA(ga_inst).init_random_population(size, dim, interval)