196196 return alpha_operator, beta_operator
197197end
198198
199+ @inline function replicate (chromosome1:: Chromosome , chromosome2:: Chromosome , toolbox)
200+ return [Chromosome (deepcopy (chromosome1. genes), toolbox), Chromosome (deepcopy (chromosome2. genes), toolbox)]
201+ end
202+
199203
200- @inline function gene_dominant_fusion (chromosome1:: Chromosome , chromosome2:: Chromosome , toolbox :: Toolbox , pb:: Real = 0.2 )
204+ @inline function gene_dominant_fusion! (chromosome1:: Chromosome , chromosome2:: Chromosome , pb:: Real = 0.2 )
201205 gene_seq_alpha = chromosome1. genes
202206 gene_seq_beta = chromosome2. genes
203207 alpha_operator, beta_operator = create_operator_masks (gene_seq_alpha, gene_seq_beta, pb)
@@ -210,10 +214,11 @@ end
210214 child_2_genes[i] = beta_operator[i] == 1 ? max (gene_seq_alpha[i], gene_seq_beta[i]) : gene_seq_beta[i]
211215 end
212216
213- return [Chromosome (child_1_genes, toolbox), Chromosome (child_2_genes, toolbox)]
217+ chromosome1. genes = child_1_genes
218+ chromosome2. genes = child_2_genes
214219end
215220
216- @inline function gen_rezessiv (chromosome1:: Chromosome , chromosome2:: Chromosome , toolbox :: Toolbox , pb:: Real = 0.2 )
221+ @inline function gen_rezessiv! (chromosome1:: Chromosome , chromosome2:: Chromosome , pb:: Real = 0.2 )
217222 gene_seq_alpha = chromosome1. genes
218223 gene_seq_beta = chromosome2. genes
219224 alpha_operator, beta_operator = create_operator_masks (gene_seq_alpha, gene_seq_beta, pb)
@@ -226,10 +231,11 @@ end
226231 child_2_genes[i] = beta_operator[i] == 1 ? min (gene_seq_alpha[i], gene_seq_beta[i]) : gene_seq_beta[i]
227232 end
228233
229- return [Chromosome (child_1_genes, toolbox), Chromosome (child_2_genes, toolbox)]
234+ chromosome1. genes = child_1_genes
235+ chromosome2. genes = child_2_genes
230236end
231237
232- @inline function gene_fussion (chromosome1:: Chromosome , chromosome2:: Chromosome , toolbox :: Toolbox , pb:: Real = 0.2 )
238+ @inline function gene_fussion! (chromosome1:: Chromosome , chromosome2:: Chromosome , pb:: Real = 0.2 )
233239 gene_seq_alpha = chromosome1. genes
234240 gene_seq_beta = chromosome2. genes
235241 alpha_operator, beta_operator = create_operator_masks (gene_seq_alpha, gene_seq_beta, pb)
@@ -242,10 +248,11 @@ end
242248 child_2_genes[i] = beta_operator[i] == 1 ? Int8 ((gene_seq_alpha[i] + gene_seq_beta[i]) ÷ 2 ) : gene_seq_beta[i]
243249 end
244250
245- return [Chromosome (child_1_genes, toolbox), Chromosome (child_2_genes,toolbox)]
251+ chromosome1. genes = child_1_genes
252+ chromosome2. genes = child_2_genes
246253end
247254
248- @inline function gene_one_point_cross_over (chromosome1:: Chromosome , chromosome2:: Chromosome , toolbox :: Toolbox )
255+ @inline function gene_one_point_cross_over! (chromosome1:: Chromosome , chromosome2:: Chromosome )
249256 gene_seq_alpha = chromosome1. genes
250257 gene_seq_beta = chromosome2. genes
251258 alpha_operator, beta_operator = create_operator_point_one_masks (gene_seq_alpha, gene_seq_beta, chromosome1. toolbox)
@@ -258,10 +265,11 @@ end
258265 child_2_genes[i] = beta_operator[i] == 1 ? gene_seq_beta[i] : gene_seq_alpha[i]
259266 end
260267
261- return [Chromosome (child_1_genes, toolbox), Chromosome (child_2_genes, toolbox)]
268+ chromosome1. genes = child_1_genes
269+ chromosome2. genes = child_2_genes
262270end
263271
264- @inline function gene_two_point_cross_over (chromosome1:: Chromosome , chromosome2:: Chromosome , toolbox :: Toolbox )
272+ @inline function gene_two_point_cross_over! (chromosome1:: Chromosome , chromosome2:: Chromosome )
265273 gene_seq_alpha = chromosome1. genes
266274 gene_seq_beta = chromosome2. genes
267275 alpha_operator, beta_operator = create_operator_point_two_masks (gene_seq_alpha, gene_seq_beta, chromosome1. toolbox)
@@ -274,37 +282,38 @@ end
274282 child_2_genes[i] = beta_operator[i] == 1 ? gene_seq_beta[i] : gene_seq_alpha[i]
275283 end
276284
277- return [Chromosome (child_1_genes, toolbox), Chromosome (child_2_genes, toolbox)]
285+ chromosome1. genes = child_1_genes
286+ chromosome2. genes = child_2_genes
278287end
279288
280- @inline function gene_mutation (chromosome1:: Chromosome , toolbox :: Toolbox , pb:: Real = 0.25 )
289+ @inline function gene_mutation! (chromosome1:: Chromosome , pb:: Real = 0.25 )
281290 gene_seq_alpha = chromosome1. genes
282291 alpha_operator, _ = create_operator_masks (gene_seq_alpha, gene_seq_alpha, pb)
283292 mutation_seq_1 = generate_chromosome (chromosome1. toolbox)
284293
285- child_1_genes = similar (gene_seq_alpha)
286294
287295 @inbounds @simd for i in eachindex (gene_seq_alpha)
288- child_1_genes[i] = alpha_operator[i] == 1 ? mutation_seq_1. genes[i] : gene_seq_alpha[i]
289- end
290-
291- return Chromosome (child_1_genes, toolbox)
296+ gene_seq_alpha[i] = alpha_operator[i] == 1 ? mutation_seq_1. genes[i] : gene_seq_alpha[i]
297+ end
292298end
293299
294- @inline function gene_inversion (chromosome1:: Chromosome , toolbox :: Toolbox )
300+ @inline function gene_inversion! (chromosome1:: Chromosome )
295301 start_1 = rand (chromosome1. toolbox. gen_start_indices)
296- gene_1 = copy (chromosome1. genes)
297- reverse! (@view gene_1[start_1: chromosome1. toolbox. head_len- 1 ])
298- return Chromosome (gene_1, toolbox)
302+ reverse! (@view chromosome1. genes[start_1: chromosome1. toolbox. head_len- 1 ])
303+ end
304+
305+ @inline function gene_insertion! (chromosome:: Chromosome )
306+ start_1 = rand (chromosome. toolbox. gen_start_indices)
307+ insert_pos = rand (start_1: (start_1+ chromosome. toolbox. head_len- 1 ))
308+ insert_sym = rand (chromosome. toolbox. tailsyms)
309+ chromosome. genes[insert_pos] = insert_sym
299310end
300311
301- @inline function gene_insertion (chromosome:: Chromosome , toolbox :: Toolbox )
312+ @inline function reverse_insertion! (chromosome:: Chromosome )
302313 start_1 = rand (chromosome. toolbox. gen_start_indices)
303314 insert_pos = rand (start_1: (start_1+ chromosome. toolbox. head_len- 1 ))
304315 insert_sym = rand (chromosome. toolbox. tailsyms)
305- gene_1 = copy (chromosome. genes)
306- gene_1[insert_pos] = insert_sym
307- return Chromosome (gene_1, toolbox)
316+ chromosome. genes[insert_pos] = insert_sym
308317end
309318
310319@inline function compute_fitness (elem:: Chromosome , operators:: OperatorEnum , x_data:: AbstractArray{T} , y_data:: AbstractArray{T} , loss_function:: Function ,
@@ -323,48 +332,53 @@ end
323332
324333
325334@inline function genetic_operations! (space_next:: Vector{Chromosome} , i:: Int , toolbox:: Toolbox )
326- if rand () < toolbox. gep_probs[" one_point_cross_over_prob" ]
327- space_next[i: i+ 1 ] = gene_one_point_cross_over (space_next[i], space_next[i+ 1 ],toolbox)
335+ # allocate them within the space - create them once instead of n time
336+ space_next[i: i+ 1 ] = replicate (space_next[i], space_next[i+ 1 ], toolbox)
337+ rand_space = rand (11 )
338+
339+
340+ if rand_space[1 ] < toolbox. gep_probs[" one_point_cross_over_prob" ]
341+ gene_one_point_cross_over! (space_next[i], space_next[i+ 1 ])
328342 end
329343
330- if rand () < toolbox. gep_probs[" two_point_cross_over_prob" ]
331- space_next[i : i + 1 ] = gene_two_point_cross_over (space_next[i], space_next[i+ 1 ],toolbox )
344+ if rand_space[ 2 ] < toolbox. gep_probs[" two_point_cross_over_prob" ]
345+ gene_two_point_cross_over! (space_next[i], space_next[i+ 1 ])
332346 end
333347
334- if rand () < toolbox. gep_probs[" mutation_prob" ]
335- space_next[i] = gene_mutation (space_next[i], toolbox, toolbox. gep_probs[" mutation_rate" ])
348+ if rand_space[ 3 ] < toolbox. gep_probs[" mutation_prob" ]
349+ gene_mutation! (space_next[i], toolbox. gep_probs[" mutation_rate" ])
336350 end
337351
338- if rand () < toolbox. gep_probs[" mutation_prob" ]
339- space_next[i + 1 ] = gene_mutation (space_next[i+ 1 ], toolbox , toolbox. gep_probs[" mutation_rate" ])
352+ if rand_space[ 4 ] < toolbox. gep_probs[" mutation_prob" ]
353+ gene_mutation! (space_next[i+ 1 ], toolbox. gep_probs[" mutation_rate" ])
340354 end
341355
342- if rand () < toolbox. gep_probs[" dominant_fusion_prob" ]
343- space_next[i : i + 1 ] = gene_dominant_fusion (space_next[i], space_next[i+ 1 ], toolbox, toolbox. gep_probs[" fusion_rate" ])
356+ if rand_space[ 5 ] < toolbox. gep_probs[" dominant_fusion_prob" ]
357+ gene_dominant_fusion! (space_next[i], space_next[i+ 1 ], toolbox. gep_probs[" fusion_rate" ])
344358 end
345359
346- if rand () < toolbox. gep_probs[" rezessiv_fusion_prob" ]
347- space_next[i : i + 1 ] = gen_rezessiv (space_next[i], space_next[i+ 1 ], toolbox , toolbox. gep_probs[" rezessiv_fusion_rate" ])
360+ if rand_space[ 6 ] < toolbox. gep_probs[" rezessiv_fusion_prob" ]
361+ gen_rezessiv! (space_next[i], space_next[i+ 1 ], toolbox. gep_probs[" rezessiv_fusion_rate" ])
348362 end
349363
350- if rand () < toolbox. gep_probs[" fusion_prob" ]
351- space_next[i : i + 1 ] = gene_fussion (space_next[i], space_next[i+ 1 ], toolbox, toolbox. gep_probs[" fusion_rate" ])
364+ if rand_space[ 7 ] < toolbox. gep_probs[" fusion_prob" ]
365+ gene_fussion! (space_next[i], space_next[i+ 1 ], toolbox. gep_probs[" fusion_rate" ])
352366 end
353367
354- if rand () < toolbox. gep_probs[" inversion_prob" ]
355- space_next[i] = gene_inversion (space_next[i], toolbox )
368+ if rand_space[ 8 ] < toolbox. gep_probs[" inversion_prob" ]
369+ gene_inversion! (space_next[i])
356370 end
357371
358- if rand () < toolbox. gep_probs[" inversion_prob" ]
359- space_next[i + 1 ] = gene_inversion (space_next[i+ 1 ], toolbox )
372+ if rand_space[ 9 ] < toolbox. gep_probs[" inversion_prob" ]
373+ gene_inversion! (space_next[i+ 1 ])
360374 end
361375
362- if rand () < toolbox. gep_probs[" inversion_prob" ]
363- space_next[i] = gene_insertion (space_next[i], toolbox )
376+ if rand_space[ 10 ] < toolbox. gep_probs[" inversion_prob" ]
377+ gene_insertion! (space_next[i])
364378 end
365379
366- if rand () < toolbox. gep_probs[" inversion_prob" ]
367- space_next[i + 1 ] = gene_insertion (space_next[i+ 1 ], toolbox )
380+ if rand_space[ 11 ] < toolbox. gep_probs[" inversion_prob" ]
381+ gene_insertion! (space_next[i+ 1 ])
368382 end
369383end
370384
0 commit comments