Skip to content

Commit

Permalink
#632: Convert 'AltererResult' into a record.
Browse files Browse the repository at this point in the history
  • Loading branch information
jenetics committed Sep 18, 2020
1 parent 0a8db3f commit 7902295
Show file tree
Hide file tree
Showing 10 changed files with 29 additions and 101 deletions.
Expand Up @@ -94,7 +94,7 @@ public AltererResult<G, C> alter(
pop.set(i, mpt);
});

return AltererResult.of(pop.toISeq(), alterations.value);
return new AltererResult<>(pop.toISeq(), alterations.value);
}

private Genotype<G> mutate(
Expand Down
Expand Up @@ -98,7 +98,7 @@ public WeaselMutator() {
final var result = population
.map(pt -> mutate(pt, generation, _probability, random));

return AltererResult.of(
return new AltererResult<>(
result
.map(MutatorResult::result)
.asISeq(),
Expand Down
2 changes: 1 addition & 1 deletion jenetics/src/main/java/io/jenetics/Alterer.java
Expand Up @@ -113,7 +113,7 @@ default Alterer<G, C> andThen(final Alterer<G, C> after) {
static <G extends Gene<?, G>, C extends Comparable<? super C>>
Alterer<G, C> of(final Alterer<G, C>... alterers) {
return alterers.length == 0
? (p, g) -> AltererResult.of(p.asISeq())
? (p, g) -> new AltererResult<>(p.asISeq(), 0)
: alterers.length == 1
? alterers[0]
: new CompositeAlterer<>(ISeq.of(alterers));
Expand Down
104 changes: 16 additions & 88 deletions jenetics/src/main/java/io/jenetics/AltererResult.java
Expand Up @@ -19,12 +19,11 @@
*/
package io.jenetics;

import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
import static io.jenetics.internal.util.Hashes.hash;

import java.io.Serializable;

import io.jenetics.internal.util.Requires;
import io.jenetics.util.ISeq;
import io.jenetics.util.Seq;

Expand All @@ -34,109 +33,38 @@
*
* @see Alterer
*
* @implSpec
* This class is immutable and thread-safe.
* @param population the altered population
* @param alterations the number of altered individuals
* @param <G> the gene type
* @param <C> the result type
*
* @author <a href="mailto:franz.wilhelmstoetter@gmail.com">Franz Wilhelmstötter</a>
* @version 6.0
* @since 4.0
* @version !__version__!
*/
public final /*record*/ class AltererResult<
public final record AltererResult<
G extends Gene<?, G>,
C extends Comparable<? super C>
>
> (
ISeq<Phenotype<G, C>> population,
int alterations
)
implements Serializable
{
private static final long serialVersionUID = 1L;

private final ISeq<Phenotype<G, C>> _population;
private final int _alterations;

private AltererResult(
final Seq<Phenotype<G, C>> population,
final int alterations
) {
if (alterations < 0) {
throw new IllegalArgumentException(
"Alterations must not be negative: " + alterations
);
}

_population = requireNonNull(population).asISeq();
_alterations = alterations;
}

/**
* Return the altered population.
*
* @return the altered population
*/
public ISeq<Phenotype<G, C>> population() {
return _population;
}
private static final long serialVersionUID = 2L;

/**
* Return the number of altered individuals.
*
* @return the number of altered individuals
*/
public int alterations() {
return _alterations;
}

@Override
public int hashCode() {
return
hash(_population,
hash(_alterations));
}

@Override
public boolean equals(final Object obj) {
return obj == this ||
obj instanceof AltererResult &&
_alterations == ((AltererResult)obj)._alterations &&
_population.equals(((AltererResult)obj)._population);
}

@Override
public String toString() {
return format("[%s, %s]", _population, _alterations);
}

/**
* Return a new alter result for the given arguments.
* Create a new alter result for the given arguments.
*
* @param population the altered population
* @param alterations the number of altered individuals
* @param <G> the gene type
* @param <C> the result type
* @return a new alterer for the given arguments
* @throws NullPointerException if the given population is {@code null}
* @throws IllegalArgumentException if the given {@code alterations} is
* negative
*/
public static <G extends Gene<?, G>, C extends Comparable<? super C>>
AltererResult<G, C> of(
final Seq<Phenotype<G, C>> population,
final int alterations
) {
return new AltererResult<>(population, alterations);
}

/**
* Return a new alter result for the given arguments.
*
* @param population the altered population
* @param <G> the gene type
* @param <C> the result type
* @return a new alterer for the given arguments
* @throws NullPointerException if the given population is {@code null}
*/
public static <G extends Gene<?, G>, C extends Comparable<? super C>>
AltererResult<G, C>
of(final Seq<Phenotype<G, C>> population) {
return new AltererResult<>(population, 0);
public AltererResult {
Requires.nonNegative(alterations);
requireNonNull(population);
}

}
4 changes: 2 additions & 2 deletions jenetics/src/main/java/io/jenetics/CompositeAlterer.java
Expand Up @@ -73,14 +73,14 @@ public AltererResult<G, C> alter(
final Seq<Phenotype<G, C>> population,
final long generation
) {
AltererResult<G, C> result = AltererResult.of(population.asISeq());
AltererResult<G, C> result = new AltererResult<>(population.asISeq(), 0);
for (var alterer : _alterers) {
final AltererResult<G, C> as = alterer.alter(
result.population(),
generation
);

result = AltererResult.of(
result = new AltererResult<>(
as.population(),
as.alterations() + result.alterations()
);
Expand Down
2 changes: 1 addition & 1 deletion jenetics/src/main/java/io/jenetics/Mutator.java
Expand Up @@ -122,7 +122,7 @@ public AltererResult<G, C> alter(
? mutate(pt, generation, p, random)
: MutatorResult.of(pt));

return AltererResult.of(
return new AltererResult<>(
result.map(MutatorResult::result).asISeq(),
result.stream().mapToInt(MutatorResult::mutations).sum()
);
Expand Down
4 changes: 2 additions & 2 deletions jenetics/src/main/java/io/jenetics/PartialAlterer.java
Expand Up @@ -94,12 +94,12 @@ private PartialAlterer(final Alterer<G, C> alterer, final Projection projection)
final var projectedPopulation = _projection.project(population);
final var result = _alterer.alter(projectedPopulation, generation);

return AltererResult.of(
return new AltererResult<>(
_projection.merge(result.population(), population),
result.alterations()
);
} else {
return AltererResult.of(population.asISeq(), 0);
return new AltererResult<>(population.asISeq(), 0);
}
}

Expand Down
4 changes: 2 additions & 2 deletions jenetics/src/main/java/io/jenetics/Recombinator.java
Expand Up @@ -108,9 +108,9 @@ public final AltererResult<G, C> alter(
.mapToInt(ind -> recombine(pop, ind, generation))
.sum();

result = AltererResult.of(pop.toISeq(), count);
result = new AltererResult<>(pop.toISeq(), count);
} else {
result = AltererResult.of(population.asISeq());
result = new AltererResult<>(population.asISeq(), 0);
}

return result;
Expand Down
4 changes: 2 additions & 2 deletions jenetics/src/test/java/io/jenetics/PartialAltererTest.java
Expand Up @@ -149,7 +149,7 @@ public void noneAlterer() {
.collect(ISeq.toISeq());

final Alterer<DoubleGene, Double> alterer = PartialAlterer.of(
(pop, gen) -> AltererResult.of(pop),
(pop, gen) -> new AltererResult<>(pop.asISeq(), 0),
1, 2
);

Expand Down Expand Up @@ -182,7 +182,7 @@ public AltererResult<G, C> alter(
final long generation
) {
final ISeq<Phenotype<G, C>> pop = population.map(this::mapPt).asISeq();
return AltererResult.of(pop, pop.length());
return new AltererResult<>(pop, pop.length());
}

private Phenotype<G, C> mapPt(final Phenotype<G, C> phenotype) {
Expand Down
Expand Up @@ -64,7 +64,7 @@ public AltererResult<G, C> alter(
pop.set(i, repair(pop.get(i)));
}
}
return AltererResult.of(pop.toISeq(), result.alterations());
return new AltererResult<>(pop.toISeq(), result.alterations());
}

private Phenotype<G, C> repair(final Phenotype<G, C> pt) {
Expand Down

0 comments on commit 7902295

Please sign in to comment.