using System; namespace Science.Biology.PopulationGenetics { /// /// MaleGenotype /// public class GenotypeMale { private int numberOfAllele = 1; private int[,] configuration; private int[,,] configurationdetail; private double[,] mutation; // mutation between genotypes public int NumberOfAllele { get{return numberOfAllele;} } public int[,] Configuration // chromosomepair configuration { get{return configuration;} } public int[,,] ConfigurationDetail // chromosomepairdetail configuration { get{return configurationdetail;} } public double[,] Mutation // property of mutation { get{return mutation;} } private int[] gtpart; public GenotypeMale(ChromosomePair[] ac, Chromosome x, Chromosome y, Mitochondria mito, SocialGene[] socialgene) { gtpart = new int[ac.Length+1+1+1+socialgene.Length]; for(int i = 0; i < ac.Length; i++) gtpart[i] = ac[i].NumberOfAllele; gtpart[ac.Length] = x.NumberOfAllele; gtpart[ac.Length+1] = y.NumberOfAllele; gtpart[ac.Length+2] = mito.NumberOfAllele; for(int i = 0; i < socialgene.Length; i++) gtpart[ac.Length+3+i] = socialgene[i].NumberOfAllele; for(int i = 0; i < gtpart.Length; i++) numberOfAllele *= gtpart[i]; configuration = new int[numberOfAllele,gtpart.Length]; int temp; for(int i = 0; i < numberOfAllele; i++) { temp = i; for(int j = gtpart.Length - 1; j >= 0 ; j--) { configuration[i,j] = temp % gtpart[j]; temp -= configuration[i,j]; temp /= gtpart[j]; } } configurationdetail = new int[numberOfAllele,ac.Length,2]; for(int i = 0; i < numberOfAllele; i++) { for(int j = 0; j < ac.Length; j++) { configurationdetail[i,j,0] = ac[j].Configuration[configuration[i,j],0]; configurationdetail[i,j,1] = ac[j].Configuration[configuration[i,j],1]; } } mutation = new double[numberOfAllele,numberOfAllele]; for(int i = 0; i < numberOfAllele; i++) { for(int j = 0; j < numberOfAllele; j++) { mutation[i,j] = 1.0; for(int k = 0; k < ac.Length; k++) { mutation[i,j] *= ac[k].Mutation [configuration[i,k],configuration[j,k]]; } mutation[i,j] *= x.Mutation[configuration[i,ac.Length],configuration[j,ac.Length]] *y.Mutation[configuration[i,ac.Length+1],configuration[j,ac.Length+1]] *mito.Mutation[configuration[i,ac.Length+2],configuration[j,ac.Length+2]]; for(int k = 0; k < socialgene.Length; k++) { mutation[i,j] *= socialgene[k].Mutation[configuration[i,ac.Length+3+k],configuration[j,ac.Length+3+k]]; } } } socialGene = socialgene; } public int Allele(int[] cpc) // used inside { int y = 0; for(int i = 0; i < cpc.Length; i++) { y = gtpart[i]*y + cpc[i]; } return y; } private SocialGene[] socialGene; public SocialGene[] SocialGenes { get { return socialGene; } } } }