BigIntegerChromosome.java
001 /*
002  * Java Genetic Algorithm Library (jenetics-4.4.0).
003  * Copyright (c) 2007-2019 Franz Wilhelmstötter
004  *
005  * Licensed under the Apache License, Version 2.0 (the "License");
006  * you may not use this file except in compliance with the License.
007  * You may obtain a copy of the License at
008  *
009  *      http://www.apache.org/licenses/LICENSE-2.0
010  *
011  * Unless required by applicable law or agreed to in writing, software
012  * distributed under the License is distributed on an "AS IS" BASIS,
013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014  * See the License for the specific language governing permissions and
015  * limitations under the License.
016  *
017  * Author:
018  *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmail.com)
019  */
020 package io.jenetics.ext;
021 
022 import java.io.IOException;
023 import java.io.ObjectInputStream;
024 import java.io.ObjectOutputStream;
025 import java.io.Serializable;
026 import java.math.BigInteger;
027 
028 import io.jenetics.AbstractChromosome;
029 import io.jenetics.DoubleGene;
030 import io.jenetics.NumericChromosome;
031 import io.jenetics.internal.util.reflect;
032 import io.jenetics.util.ISeq;
033 import io.jenetics.util.MSeq;
034 
035 /**
036  * Numeric chromosome implementation which holds arbitrary sized integer numbers.
037  *
038  @author <a href="mailto:franz.wilhelmstoetter@gmail.com">Franz Wilhelmstötter</a>
039  @version 3.5
040  @since 3.5
041  */
042 public class BigIntegerChromosome
043     extends AbstractChromosome<BigIntegerGene>
044     implements
045         NumericChromosome<BigInteger, BigIntegerGene>,
046         Serializable
047 {
048 
049     private static final long serialVersionUID = 1L;
050 
051     private final BigInteger _min;
052     private final BigInteger _max;
053 
054     /**
055      * Create a new chromosome from the given genes array.
056      *
057      @param genes the genes of the new chromosome.
058      @throws IllegalArgumentException if the {@code genes.length()} is smaller
059      *         than one.
060      @throws NullPointerException if the {@code genes} are {@code null}.
061      @throws IllegalArgumentException if the gene sequence is empty
062      */
063     protected BigIntegerChromosome(final ISeq<BigIntegerGene> genes) {
064         super(genes);
065         _min = genes.get(0).getMin();
066         _max = genes.get(0).getMax();
067     }
068 
069     /**
070      * Create a new random {@code BigIntegerChromosome} with the given
071      * {@code length}.
072      *
073      @param min the min value of the {@link BigIntegerGene}s (inclusively).
074      @param max the max value of the {@link BigIntegerGene}s (inclusively).
075      @param length the length of the chromosome.
076      @throws NullPointerException if one of the arguments is {@code null}.
077      @throws IllegalArgumentException if the {@code length} is smaller than
078      *         one.
079      */
080     public BigIntegerChromosome(
081         final BigInteger min,
082         final BigInteger max,
083         final int length
084     ) {
085         this(BigIntegerGene.seq(min, max, length));
086         _valid = true;
087     }
088 
089     /**
090      * Create a new random {@code DoubleChromosome} of length one.
091      *
092      @param min the minimal value of this chromosome (inclusively).
093      @param max the maximal value of this chromosome (exclusively).
094      @throws NullPointerException if one of the arguments is {@code null}.
095      */
096     public BigIntegerChromosome(final BigInteger min, final BigInteger max) {
097         this(min, max, 1);
098     }
099 
100     @Override
101     public BigInteger getMin() {
102         return _min;
103     }
104 
105     @Override
106     public BigInteger getMax() {
107         return _max;
108     }
109 
110     @Override
111     public BigIntegerChromosome newInstance(final ISeq<BigIntegerGene> genes) {
112         return new BigIntegerChromosome(genes);
113     }
114 
115     @Override
116     public BigIntegerChromosome newInstance() {
117         return new BigIntegerChromosome(_min, _max, length());
118     }
119 
120     /* *************************************************************************
121      * Static factory methods.
122      **************************************************************************/
123 
124     /**
125      * Create a new {@code DoubleChromosome} with the given genes.
126      *
127      @param genes the genes of the chromosome.
128      @return a new chromosome with the given genes.
129      @throws IllegalArgumentException if the length of the genes array is
130      *         empty.
131      @throws NullPointerException if the given {@code genes} array is
132      *         {@code null}
133      */
134     public static BigIntegerChromosome of(final BigIntegerGene... genes) {
135         return new BigIntegerChromosome(ISeq.of(genes));
136     }
137 
138     /**
139      * Create a new random {@code DoubleChromosome}.
140      *
141      @param min the min value of the {@link DoubleGene}s (inclusively).
142      @param max the max value of the {@link DoubleGene}s (exclusively).
143      @param length the length of the chromosome.
144      @return a new {@code DoubleChromosome} with the given parameter
145      */
146     public static BigIntegerChromosome of(final BigInteger min, BigInteger max, final int length) {
147         return new BigIntegerChromosome(min, max, length);
148     }
149 
150     /**
151      * Create a new random {@code DoubleChromosome} of length one.
152      *
153      @param min the minimal value of this chromosome (inclusively).
154      @param max the maximal value of this chromosome (exclusively).
155      @return a new {@code DoubleChromosome} with the given parameter
156      */
157     public static BigIntegerChromosome of(final BigInteger min, final BigInteger max) {
158         return new BigIntegerChromosome(min, max);
159     }
160 
161     /* *************************************************************************
162      *  Java object serialization
163      * ************************************************************************/
164 
165     private void writeObject(final ObjectOutputStream out)
166         throws IOException
167     {
168         out.defaultWriteObject();
169 
170         out.writeInt(length());
171         out.writeObject(_min);
172         out.writeObject(_max);
173 
174         for (BigIntegerGene gene : _genes) {
175             out.writeObject(gene.getAllele());
176         }
177     }
178 
179     private void readObject(final ObjectInputStream in)
180         throws IOException, ClassNotFoundException
181     {
182         in.defaultReadObject();
183 
184         final MSeq<BigIntegerGene> genes = MSeq.ofLength(in.readInt());
185         reflect.setField(this, "_min", in.readObject());
186         reflect.setField(this, "_max", in.readObject());
187 
188         for (int i = 0; i < genes.length(); ++i) {
189             final BigInteger value = (BigInteger)in.readObject();
190             genes.set(i, BigIntegerGene.of(value, _min, _max));
191         }
192 
193         reflect.setField(this, "_genes", genes.toISeq());
194     }
195 
196 }