@@ -177,6 +177,98 @@ mod population_tests {
177177 ) ;
178178 }
179179
180+ #[ test]
181+ fn unique_chromosome_indices ( ) {
182+ let genotype = BinaryGenotype :: builder ( )
183+ . with_genes_size ( 3 )
184+ . with_genes_hashing ( true )
185+ . build ( )
186+ . unwrap ( ) ;
187+
188+ let mut population: Population < BinaryChromosome > =
189+ build:: population_with_fitness_scores ( vec ! [
190+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
191+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
192+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
193+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
194+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
195+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
196+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
197+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
198+ ( vec![ true , true , false ] , None ) ,
199+ ( vec![ true , true , false ] , None ) ,
200+ ] ) ;
201+
202+ population. chromosomes . iter_mut ( ) . for_each ( |chromosome| {
203+ let genes_hash = genotype. calculate_genes_hash ( chromosome) ;
204+ chromosome. set_genes_hash ( genes_hash) ;
205+ } ) ;
206+
207+ assert_eq ! ( population. unique_chromosome_indices( ) , vec![ 0 , 2 , 3 , 6 , 8 ] ) ;
208+ }
209+
210+ #[ test]
211+ fn best_unique_chromosome_indices ( ) {
212+ let genotype = BinaryGenotype :: builder ( )
213+ . with_genes_size ( 3 )
214+ . with_genes_hashing ( true )
215+ . build ( )
216+ . unwrap ( ) ;
217+
218+ let mut population: Population < BinaryChromosome > =
219+ build:: population_with_fitness_scores ( vec ! [
220+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
221+ ( vec![ false , true , true ] , Some ( 2 ) ) ,
222+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
223+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
224+ ( vec![ false , false , false ] , Some ( 0 ) ) ,
225+ ( vec![ true , true , true ] , Some ( 3 ) ) ,
226+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
227+ ( vec![ false , false , true ] , Some ( 1 ) ) ,
228+ ( vec![ true , true , false ] , None ) ,
229+ ( vec![ true , true , false ] , None ) ,
230+ ] ) ;
231+
232+ population. chromosomes . iter_mut ( ) . for_each ( |chromosome| {
233+ let genes_hash = genotype. calculate_genes_hash ( chromosome) ;
234+ chromosome. set_genes_hash ( genes_hash) ;
235+ } ) ;
236+
237+ assert_eq ! (
238+ population. best_unique_chromosome_indices( 2 , FitnessOrdering :: Maximize ) ,
239+ vec![ 0 , 3 ]
240+ ) ;
241+ assert_eq ! (
242+ population. best_unique_chromosome_indices( 1 , FitnessOrdering :: Maximize ) ,
243+ vec![ 3 ]
244+ ) ;
245+ assert_eq ! (
246+ population. best_unique_chromosome_indices( 0 , FitnessOrdering :: Maximize ) ,
247+ vec![ ]
248+ ) ;
249+ assert_eq ! (
250+ population. best_unique_chromosome_indices( 10 , FitnessOrdering :: Maximize ) ,
251+ vec![ 0 , 2 , 3 , 6 ]
252+ ) ;
253+
254+ assert_eq ! (
255+ population. best_unique_chromosome_indices( 2 , FitnessOrdering :: Minimize ) ,
256+ vec![ 2 , 6 ]
257+ ) ;
258+ assert_eq ! (
259+ population. best_unique_chromosome_indices( 1 , FitnessOrdering :: Minimize ) ,
260+ vec![ 2 ]
261+ ) ;
262+ assert_eq ! (
263+ population. best_unique_chromosome_indices( 0 , FitnessOrdering :: Minimize ) ,
264+ vec![ ]
265+ ) ;
266+ assert_eq ! (
267+ population. best_unique_chromosome_indices( 10 , FitnessOrdering :: Minimize ) ,
268+ vec![ 0 , 2 , 3 , 6 ]
269+ ) ;
270+ }
271+
180272 #[ test]
181273 fn fitness_score_cardinality ( ) {
182274 let population: Population < BinaryChromosome > = build:: population ( vec ! [
0 commit comments