Package io.jenetics.engine
Interface InvertibleCodec<T,G extends Gene<?,G>>
-
- Type Parameters:
T
- the argument type of a given problemG
- theGene
type used for encoding the argument typeT
- All Superinterfaces:
Codec<T,G>
public interface InvertibleCodec<T,G extends Gene<?,G>> extends Codec<T,G>
This interface extends theCodec
and allows to encode an object from the problem space to a correspondingGenotype
, which is the inverse functionality of the codec. The following example shows the relation between encoder and decoder function must fulfill.The main usage of an invertible codec is to simplify the definition offinal InvertibleCodec<int[], IntegerGene> codec = Codecs.ofVector(IntRange.of(0, 100), 6); final int[] value = new int[]{3, 4, 6, 7, 8, 3}; final Genotype<IntegerGene> gt = codec.encode(value); assert Arrays.equals(value, codec.decode(gt));
Constraint
objects. Instead of working with the GA classes (Phenotype
orGenotype
), it is possible to work in the native problem domainT
.
-
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description default Genotype<G>
encode(T value)
Decodes the givenvalue
, which is an element of the native problem domain, into aGenotype
.Function<T,Genotype<G>>
encoder()
Return the encoder function which transforms a value from the native problem domain back to the genotype.default <B> InvertibleCodec<B,G>
map(Function<? super T,? extends B> mapper, Function<? super B,? extends T> inverseMapper)
Create a newInvertibleCodec
with the mapped result type.static <T,G extends Gene<?,G>>
InvertibleCodec<T,G>of(Factory<Genotype<G>> encoding, Function<? super Genotype<G>,? extends T> decoder, Function<? super T,Genotype<G>> encoder)
Create a new invertible codec from the given parameters.
-
-
-
Method Detail
-
encoder
Function<T,Genotype<G>> encoder()
Return the encoder function which transforms a value from the native problem domain back to the genotype. This is the inverse of theCodec.decoder()
function. The following code snippet shows how a given value in the native problem domain can be converted into aGenotype
and transformed back.final InvertibleCodec<int[], IntegerGene> codec = Codecs.ofVector(IntRange.of(0, 100), 6); final int[] value = new int[]{3, 4, 6, 7, 8, 3}; final Genotype<IntegerGene> gt = codec.encode(value); assert Arrays.equals(value, codec.decode(gt));
- Returns:
- value encoder function
- See Also:
Codec.decoder()
,encode(Object)
-
encode
default Genotype<G> encode(T value)
Decodes the givenvalue
, which is an element of the native problem domain, into aGenotype
.- Parameters:
value
- the value of the native problem domain- Returns:
- the genotype, which represents the given
value
-
map
default <B> InvertibleCodec<B,G> map(Function<? super T,? extends B> mapper, Function<? super B,? extends T> inverseMapper)
Create a newInvertibleCodec
with the mapped result type. This method can also be used for creating non-trivial codes like split ranges, as shown in the following example, where only values between [0, 2) and [8, 10) are valid.+--+--+--+--+--+--+--+--+--+--+ | | | | | | | | | | | 0 1 2 3 4 5 6 7 8 9 10 |-----|xxxxxxxxxxxxxxxxx|-----| ^ |llllllll|rrrrrrrr| ^ | | | | +-------+ +------+
final InvertibleCodec<Double, DoubleGene> codec = Codecs .ofScalar(DoubleRange.of(0, 10)) .map(v -> { if (v >= 2 && v < 8) { return v < 5 ? ((v - 2)/3)*2 : ((8 - v)/3)*2 + 8; } return v; }, Function.identity());
- Type Parameters:
B
- the new argument type of the given problem- Parameters:
mapper
- the mapper functioninverseMapper
- the inverse function of themapper
- Returns:
- a new
InvertibleCodec
with the mapped result type - Throws:
NullPointerException
- if one the mapper isnull
.- See Also:
Codec.map(Function)
-
of
static <T,G extends Gene<?,G>> InvertibleCodec<T,G> of(Factory<Genotype<G>> encoding, Function<? super Genotype<G>,? extends T> decoder, Function<? super T,Genotype<G>> encoder)
Create a new invertible codec from the given parameters.- Type Parameters:
G
- theGene
typeT
- the fitness function argument type in the problem domain- Parameters:
encoding
- the genotype factory used for creating newGenotypes
decoder
- decoder function, which converts aGenotype
to a value in the problem domain.encoder
- encoder function, which converts a value of the problem domain into aGenotype
- Returns:
- a new
InvertibleCodec
object with the given parameters. - Throws:
NullPointerException
- if one of the arguments isnull
.
-
-