Skip to content

Commit 6b11fb2

Browse files
authored
Update Gep.jl
1 parent e60f1ca commit 6b11fb2

File tree

1 file changed

+60
-46
lines changed

1 file changed

+60
-46
lines changed

src/Gep.jl

Lines changed: 60 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,12 @@ end
196196
return alpha_operator, beta_operator
197197
end
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
214219
end
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
230236
end
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
246253
end
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
262270
end
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
278287
end
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
292298
end
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
299310
end
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
308317
end
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
369383
end
370384

0 commit comments

Comments
 (0)