diff --git a/jenetics.example/src/main/java/io/jenetics/example/DynamicGenotype.java b/jenetics.example/src/main/java/io/jenetics/example/DynamicGenotype.java index e8a31c44e9..00e956818a 100644 --- a/jenetics.example/src/main/java/io/jenetics/example/DynamicGenotype.java +++ b/jenetics.example/src/main/java/io/jenetics/example/DynamicGenotype.java @@ -94,7 +94,7 @@ public AltererResult alter( pop.set(i, mpt); }); - return AltererResult.of(pop.toISeq(), alterations.value); + return new AltererResult<>(pop.toISeq(), alterations.value); } private Genotype mutate( diff --git a/jenetics.ext/src/main/java/io/jenetics/ext/WeaselMutator.java b/jenetics.ext/src/main/java/io/jenetics/ext/WeaselMutator.java index 3775bcbff3..f85fc514b9 100644 --- a/jenetics.ext/src/main/java/io/jenetics/ext/WeaselMutator.java +++ b/jenetics.ext/src/main/java/io/jenetics/ext/WeaselMutator.java @@ -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(), diff --git a/jenetics/src/main/java/io/jenetics/Alterer.java b/jenetics/src/main/java/io/jenetics/Alterer.java index 2fcdc8dbe4..5e3119866a 100644 --- a/jenetics/src/main/java/io/jenetics/Alterer.java +++ b/jenetics/src/main/java/io/jenetics/Alterer.java @@ -113,7 +113,7 @@ default Alterer andThen(final Alterer after) { static , C extends Comparable> Alterer of(final Alterer... 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)); diff --git a/jenetics/src/main/java/io/jenetics/AltererResult.java b/jenetics/src/main/java/io/jenetics/AltererResult.java index d5c7d890cf..0fc66d07ee 100644 --- a/jenetics/src/main/java/io/jenetics/AltererResult.java +++ b/jenetics/src/main/java/io/jenetics/AltererResult.java @@ -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; @@ -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 the gene type + * @param the result type * * @author Franz Wilhelmstötter - * @version 6.0 * @since 4.0 + * @version !__version__! */ -public final /*record*/ class AltererResult< +public final record AltererResult< G extends Gene, C extends Comparable -> +> ( + ISeq> population, + int alterations +) implements Serializable { - private static final long serialVersionUID = 1L; - - private final ISeq> _population; - private final int _alterations; - - private AltererResult( - final Seq> 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> 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 the gene type - * @param 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 , C extends Comparable> - AltererResult of( - final Seq> population, - final int alterations - ) { - return new AltererResult<>(population, alterations); - } - - /** - * Return a new alter result for the given arguments. - * - * @param population the altered population - * @param the gene type - * @param the result type - * @return a new alterer for the given arguments - * @throws NullPointerException if the given population is {@code null} - */ - public static , C extends Comparable> - AltererResult - of(final Seq> population) { - return new AltererResult<>(population, 0); + public AltererResult { + Requires.nonNegative(alterations); + requireNonNull(population); } } diff --git a/jenetics/src/main/java/io/jenetics/CompositeAlterer.java b/jenetics/src/main/java/io/jenetics/CompositeAlterer.java index f821a615a5..1711772848 100644 --- a/jenetics/src/main/java/io/jenetics/CompositeAlterer.java +++ b/jenetics/src/main/java/io/jenetics/CompositeAlterer.java @@ -73,14 +73,14 @@ public AltererResult alter( final Seq> population, final long generation ) { - AltererResult result = AltererResult.of(population.asISeq()); + AltererResult result = new AltererResult<>(population.asISeq(), 0); for (var alterer : _alterers) { final AltererResult as = alterer.alter( result.population(), generation ); - result = AltererResult.of( + result = new AltererResult<>( as.population(), as.alterations() + result.alterations() ); diff --git a/jenetics/src/main/java/io/jenetics/Mutator.java b/jenetics/src/main/java/io/jenetics/Mutator.java index 2df5900cce..92ea4fb70e 100644 --- a/jenetics/src/main/java/io/jenetics/Mutator.java +++ b/jenetics/src/main/java/io/jenetics/Mutator.java @@ -122,7 +122,7 @@ public AltererResult 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() ); diff --git a/jenetics/src/main/java/io/jenetics/PartialAlterer.java b/jenetics/src/main/java/io/jenetics/PartialAlterer.java index 96710fa57d..38920c9487 100644 --- a/jenetics/src/main/java/io/jenetics/PartialAlterer.java +++ b/jenetics/src/main/java/io/jenetics/PartialAlterer.java @@ -94,12 +94,12 @@ private PartialAlterer(final Alterer 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); } } diff --git a/jenetics/src/main/java/io/jenetics/Recombinator.java b/jenetics/src/main/java/io/jenetics/Recombinator.java index a688c0ffb0..561d7aba5a 100644 --- a/jenetics/src/main/java/io/jenetics/Recombinator.java +++ b/jenetics/src/main/java/io/jenetics/Recombinator.java @@ -108,9 +108,9 @@ public final AltererResult 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; diff --git a/jenetics/src/test/java/io/jenetics/PartialAltererTest.java b/jenetics/src/test/java/io/jenetics/PartialAltererTest.java index ad32cd377b..04b5790b5c 100644 --- a/jenetics/src/test/java/io/jenetics/PartialAltererTest.java +++ b/jenetics/src/test/java/io/jenetics/PartialAltererTest.java @@ -149,7 +149,7 @@ public void noneAlterer() { .collect(ISeq.toISeq()); final Alterer alterer = PartialAlterer.of( - (pop, gen) -> AltererResult.of(pop), + (pop, gen) -> new AltererResult<>(pop.asISeq(), 0), 1, 2 ); @@ -182,7 +182,7 @@ public AltererResult alter( final long generation ) { final ISeq> pop = population.map(this::mapPt).asISeq(); - return AltererResult.of(pop, pop.length()); + return new AltererResult<>(pop, pop.length()); } private Phenotype mapPt(final Phenotype phenotype) { diff --git a/jenetics/src/test/java/io/jenetics/engine/RepairingAlterer.java b/jenetics/src/test/java/io/jenetics/engine/RepairingAlterer.java index 58e9f8e0c8..7cab65f388 100644 --- a/jenetics/src/test/java/io/jenetics/engine/RepairingAlterer.java +++ b/jenetics/src/test/java/io/jenetics/engine/RepairingAlterer.java @@ -64,7 +64,7 @@ public AltererResult alter( pop.set(i, repair(pop.get(i))); } } - return AltererResult.of(pop.toISeq(), result.alterations()); + return new AltererResult<>(pop.toISeq(), result.alterations()); } private Phenotype repair(final Phenotype pt) {