Skip to content

Commit f5dd645

Browse files
committed
remove the median_chromosome implementation and just make an effort to estimate the permutable_allele_size(s)_scaled directly
1 parent f4b0c15 commit f5dd645

File tree

4 files changed

+42
-189
lines changed

4 files changed

+42
-189
lines changed

src/genotype/multi_range.rs

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -612,16 +612,11 @@ where
612612
fn chromosome_permutations_size(&self, scale_index: Option<usize>) -> BigUint {
613613
if self.seed_genes_list.is_empty() {
614614
match self.mutation_type {
615-
MutationType::Scaled => {
616-
let median_chromosome = self.median_chromosome();
617-
self.permutable_gene_values_scaled(
618-
Some(&median_chromosome),
619-
scale_index.unwrap(),
620-
)
615+
MutationType::Scaled => self
616+
.permutable_allele_sizes_scaled(scale_index.unwrap())
621617
.iter()
622-
.map(|v| BigUint::from(v.len()))
623-
.product()
624-
}
618+
.map(|v| BigUint::from(*v))
619+
.product(),
625620
MutationType::Relative => {
626621
panic!("RangeGenotype is not permutable for MutationType::Relative")
627622
}
@@ -710,51 +705,41 @@ where
710705
.collect()
711706
}
712707

713-
// pub fn permutable_gene_values_relative(
714-
// &self,
715-
// _chromosome: Option<&MultiRangeChromosome<T>>,
716-
// ) -> Vec<Vec<T>> {
717-
// panic!("MultiRangeGenotype is not permutable for MutationType::Relative");
718-
// }
719-
//
720-
// pub fn permutable_gene_values_random(
721-
// &self,
722-
// _chromosome: Option<&MultiRangeChromosome<T>>,
723-
// ) -> Vec<Vec<T>> {
724-
// panic!("MultiRangeGenotype is not permutable for MutationType::Random");
725-
// }
726-
727-
pub fn median_chromosome(&self) -> MultiRangeChromosome<T> {
728-
let median_genes = self
729-
.allele_ranges
708+
pub fn permutable_allele_sizes_scaled(&self, scale_index: usize) -> Vec<usize> {
709+
self.allele_ranges
730710
.clone()
731711
.into_iter()
732712
.enumerate()
733713
.map(|(index, allele_range)| {
734-
let allele_range_start = *allele_range.start();
735-
let allele_range_end = *allele_range.end();
714+
let (allele_value_start, allele_value_end) =
715+
if let Some(previous_scale_index) = scale_index.checked_sub(1) {
716+
let working_range = &self.allele_mutation_scaled_ranges.as_ref().unwrap()
717+
[previous_scale_index][index];
718+
719+
(*working_range.start(), *working_range.end())
720+
} else {
721+
(*allele_range.start(), *allele_range.end())
722+
};
736723

737-
let working_range = &self.allele_mutation_scaled_ranges.as_ref().unwrap()[0][index];
724+
let working_range =
725+
&self.allele_mutation_scaled_ranges.as_ref().unwrap()[scale_index][index];
738726
let working_range_step = *working_range.end();
739727

740-
let allele_value_iter = std::iter::successors(Some(allele_range_start), |value| {
741-
if *value < allele_range_end {
728+
std::iter::successors(Some(allele_value_start), |value| {
729+
if *value < allele_value_end {
742730
let next_value = *value + working_range_step;
743-
if next_value > allele_range_end {
744-
Some(allele_range_end)
731+
if next_value > allele_value_end {
732+
Some(allele_value_end)
745733
} else {
746734
Some(next_value)
747735
}
748736
} else {
749737
None
750738
}
751-
});
752-
753-
let median_step = allele_value_iter.clone().count() / 2;
754-
allele_value_iter.clone().nth(median_step).unwrap()
739+
})
740+
.count()
755741
})
756-
.collect();
757-
MultiRangeChromosome::new(median_genes)
742+
.collect()
758743
}
759744
}
760745

src/genotype/range.rs

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -554,14 +554,8 @@ where
554554
if self.seed_genes_list.is_empty() {
555555
match self.mutation_type {
556556
MutationType::Scaled => {
557-
let median_chromosome = self.median_chromosome();
558-
self.permutable_gene_values_scaled(
559-
Some(&median_chromosome),
560-
scale_index.unwrap(),
561-
)
562-
.iter()
563-
.map(|v| BigUint::from(v.len()))
564-
.product()
557+
BigUint::from(self.permutable_allele_size_scaled(scale_index.unwrap()))
558+
.pow(self.genes_size() as u32)
565559
}
566560
MutationType::Relative => {
567561
panic!("RangeGenotype is not permutable for MutationType::Relative")
@@ -647,44 +641,32 @@ where
647641
.collect()
648642
}
649643

650-
// pub fn permutable_gene_values_relative(
651-
// &self,
652-
// _chromosome: Option<&RangeChromosome<T>>,
653-
// ) -> Vec<Vec<T>> {
654-
// panic!("RangeGenotype is not permutable for MutationType::Relative");
655-
// }
656-
//
657-
// pub fn permutable_gene_values_random(
658-
// &self,
659-
// _chromosome: Option<&RangeChromosome<T>>,
660-
// ) -> Vec<Vec<T>> {
661-
// panic!("RangeGenotype is not permutable for MutationType::Random");
662-
// }
663-
664-
pub fn median_chromosome(&self) -> RangeChromosome<T> {
665-
let allele_range_start = *self.allele_range.start();
666-
let allele_range_end = *self.allele_range.end();
644+
pub fn permutable_allele_size_scaled(&self, scale_index: usize) -> usize {
645+
let (allele_value_start, allele_value_end) =
646+
if let Some(previous_scale_index) = scale_index.checked_sub(1) {
647+
let working_range =
648+
&self.allele_mutation_scaled_range.as_ref().unwrap()[previous_scale_index];
649+
(*working_range.start(), *working_range.end())
650+
} else {
651+
(*self.allele_range.start(), *self.allele_range.end())
652+
};
667653

668-
let working_range = &self.allele_mutation_scaled_range.as_ref().unwrap()[0];
654+
let working_range = &self.allele_mutation_scaled_range.as_ref().unwrap()[scale_index];
669655
let working_range_step = *working_range.end();
670656

671-
let allele_value_iter = std::iter::successors(Some(allele_range_start), |value| {
672-
if *value < allele_range_end {
657+
std::iter::successors(Some(allele_value_start), |value| {
658+
if *value < allele_value_end {
673659
let next_value = *value + working_range_step;
674-
if next_value > allele_range_end {
675-
Some(allele_range_end)
660+
if next_value > allele_value_end {
661+
Some(allele_value_end)
676662
} else {
677663
Some(next_value)
678664
}
679665
} else {
680666
None
681667
}
682-
});
683-
684-
let median_step = allele_value_iter.clone().count() / 2;
685-
let median_value = allele_value_iter.clone().nth(median_step).unwrap();
686-
let median_genes = (0..self.genes_size()).map(|_| median_value).collect();
687-
RangeChromosome::new(median_genes)
668+
})
669+
.count()
688670
}
689671
}
690672

tests/genotype/multi_range_test.rs

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -376,42 +376,6 @@ fn float_permutable_gene_values_scaled() {
376376
));
377377
}
378378

379-
#[test]
380-
fn float_median_chromosome() {
381-
// large
382-
let mut genotype = MultiRangeGenotype::builder()
383-
.with_allele_ranges(vec![0.0..=10.0, 0.0..=5.0])
384-
.with_allele_mutation_scaled_ranges(vec![vec![-1.0..=1.0, -2.0..=2.0]])
385-
.build()
386-
.unwrap();
387-
genotype.chromosomes_setup();
388-
389-
let chromosome = genotype.median_chromosome();
390-
assert_eq!(inspect::chromosome(&chromosome), vec![5.0, 4.0]);
391-
392-
// even
393-
let mut genotype = MultiRangeGenotype::builder()
394-
.with_allele_ranges(vec![0.0..=1.0, 0.0..=2.0])
395-
.with_allele_mutation_scaled_ranges(vec![vec![-1.0..=1.0, -2.0..=2.0]])
396-
.build()
397-
.unwrap();
398-
genotype.chromosomes_setup();
399-
400-
let chromosome = genotype.median_chromosome();
401-
assert_eq!(inspect::chromosome(&chromosome), vec![1.0, 2.0]);
402-
403-
// odd
404-
let mut genotype = MultiRangeGenotype::builder()
405-
.with_allele_ranges(vec![0.0..=2.0, 0.0..=4.0])
406-
.with_allele_mutation_scaled_ranges(vec![vec![-1.0..=1.0, -2.0..=2.0]])
407-
.build()
408-
.unwrap();
409-
genotype.chromosomes_setup();
410-
411-
let chromosome = genotype.median_chromosome();
412-
assert_eq!(inspect::chromosome(&chromosome), vec![1.0, 2.0]);
413-
}
414-
415379
#[test]
416380
fn float_chromosome_permutations_2_scaled() {
417381
let mut rng = SmallRng::seed_from_u64(0);

tests/genotype/range_test.rs

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -451,45 +451,6 @@ fn float_permutable_gene_values_scaled() {
451451
));
452452
}
453453

454-
#[test]
455-
fn float_median_chromosome() {
456-
// large
457-
let mut genotype = RangeGenotype::builder()
458-
.with_genes_size(2)
459-
.with_allele_range(0.0..=1.0)
460-
.with_allele_mutation_scaled_range(vec![-0.1..=0.1])
461-
.build()
462-
.unwrap();
463-
genotype.chromosomes_setup();
464-
465-
let chromosome = genotype.median_chromosome();
466-
assert_eq!(inspect::chromosome(&chromosome), vec![0.6, 0.6]);
467-
468-
// even
469-
let mut genotype = RangeGenotype::builder()
470-
.with_genes_size(2)
471-
.with_allele_range(0.0..=0.1)
472-
.with_allele_mutation_scaled_range(vec![-0.1..=0.1])
473-
.build()
474-
.unwrap();
475-
genotype.chromosomes_setup();
476-
477-
let chromosome = genotype.median_chromosome();
478-
assert_eq!(inspect::chromosome(&chromosome), vec![0.1, 0.1]);
479-
480-
// odd
481-
let mut genotype = RangeGenotype::builder()
482-
.with_genes_size(2)
483-
.with_allele_range(0.0..=0.2)
484-
.with_allele_mutation_scaled_range(vec![-0.1..=0.1])
485-
.build()
486-
.unwrap();
487-
genotype.chromosomes_setup();
488-
489-
let chromosome = genotype.median_chromosome();
490-
assert_eq!(inspect::chromosome(&chromosome), vec![0.1, 0.1]);
491-
}
492-
493454
#[test]
494455
fn float_chromosome_permutations_2_scaled() {
495456
let mut rng = SmallRng::seed_from_u64(0);
@@ -864,45 +825,6 @@ fn integer_permutable_gene_values_scaled() {
864825
);
865826
}
866827

867-
#[test]
868-
fn integer_median_chromosome() {
869-
// large
870-
let mut genotype = RangeGenotype::builder()
871-
.with_genes_size(2)
872-
.with_allele_range(0..=1000)
873-
.with_allele_mutation_scaled_range(vec![-1..=1])
874-
.build()
875-
.unwrap();
876-
genotype.chromosomes_setup();
877-
878-
let chromosome = genotype.median_chromosome();
879-
assert_eq!(inspect::chromosome(&chromosome), vec![500, 500]);
880-
881-
// even
882-
let mut genotype = RangeGenotype::builder()
883-
.with_genes_size(2)
884-
.with_allele_range(0..=1)
885-
.with_allele_mutation_scaled_range(vec![-1..=1])
886-
.build()
887-
.unwrap();
888-
genotype.chromosomes_setup();
889-
890-
let chromosome = genotype.median_chromosome();
891-
assert_eq!(inspect::chromosome(&chromosome), vec![1, 1]);
892-
893-
// odd
894-
let mut genotype = RangeGenotype::builder()
895-
.with_genes_size(2)
896-
.with_allele_range(0..=2)
897-
.with_allele_mutation_scaled_range(vec![-1..=1])
898-
.build()
899-
.unwrap();
900-
genotype.chromosomes_setup();
901-
902-
let chromosome = genotype.median_chromosome();
903-
assert_eq!(inspect::chromosome(&chromosome), vec![1, 1]);
904-
}
905-
906828
#[test]
907829
fn integer_chromosome_permutations_2_scaled() {
908830
let mut rng = SmallRng::seed_from_u64(0);

0 commit comments

Comments
 (0)