示例#1
0
void Genome::crossover(const Genome &with,Genome &baby1,Genome &baby2)
{
	baby1.setFitness(0.0);
	baby2.setFitness(0.0);

	int crossoverPoint = NeuralNetRandom::RandomInt(0,numberOfGenes()-1);

	std::vector<double> newChromosome1;
	std::vector<double> newChromosome2;

	std::vector<double>::iterator myGenes = _chromosome.begin();
	std::vector<double> otherChromosome = with.chromosome();
	std::vector<double>::iterator otherGenes = otherChromosome.begin();

	if (crossoverPoint > 0)
	{
		newChromosome1.assign(myGenes,myGenes+crossoverPoint+1);
		newChromosome2.assign(otherGenes,otherGenes+crossoverPoint+1);
	}
	newChromosome1.insert(newChromosome1.end(),otherGenes+crossoverPoint,otherChromosome.end());
	newChromosome2.insert(newChromosome2.end(),myGenes+crossoverPoint,_chromosome.end());

	baby1.setChromosome(newChromosome1);
	baby2.setChromosome(newChromosome2);
}
示例#2
0
void Genome::mutate(Genome &theGenome)
{
	std::vector<double> chromosome = theGenome.chromosome();
	for (int i=0;i<(int)chromosome.size();++i)
	{
		if (NeuralNetRandom::RandomFloat() < MutationRate)
			chromosome[i] += NeuralNetRandom::RandomClamped()*MaxMutationPerturbation;
	}
	theGenome.setChromosome(chromosome);
}
示例#3
0
void Genome::sex(const Genome &with,Genome &baby1,Genome &baby2)
{
	if (_chromosome.size() != with.chromosome().size())
	{
		std::cerr << "Genome::sex - incompatible chromosomes!" << std::endl;
		return;
	}
	if ((with==*this)||(NeuralNetRandom::RandomFloat()>CrossoverRate))
	{
		baby1 = *this;
		baby2 = with;
	}
	else
	{
		crossover(with,baby1,baby2);
	}
	mutate(baby1);
	mutate(baby2);
}
示例#4
0
int load_chromosomes(Genome & genome, VariantMap & variants, GenomeMaps & genome_mask)
{
    unsigned int eof = 0;
    unsigned int chr = 0;
    POS p;
    BLOCK = 0;
    char CHR_DESC_TMP_orig[1000];
    strcpy(CHR_DESC_TMP_orig, CHR_DESC_TMP) ;

    // alloc all seeds present in masked regions, do not add kmers
    if (has_genome_mask && genome_mask_use_rep_seeds)
    {
        unsigned long int fp = ftell(GENOME_FP);
        while (!eof) {

            if (VERBOSE) {
                printf("Start chromosome nb. %d\n", chr+1);
            }

            eof = load_chr();

            p.chr = chr;
            p.pos = 0;
            BLOCK_TABLE[BLOCK] = p;
            POSITION = 0;

            if (VERBOSE) {
                printf("\tLength %d\n", CHR_LENGTH);
            }

            if (strlen(GENOME_VARIANTS_FILE_NAME)==0)
                index_chromosome_novariants(chr, genome, genome_mask, true, false, false);
            else
                index_chromosome(chr, genome, variants, genome_mask, true, false, false);

            ++BLOCK;
            ++chr;

        }
        // reset file handle & counters
        fseek(GENOME_FP, fp, SEEK_SET) ;
        eof = 0;
        chr = 0;
        BLOCK = 0;
        strcpy(CHR_DESC_TMP, CHR_DESC_TMP_orig) ;
    }

    // alloc all seeds present in masked regions, do not add kmers
    if (has_genome_mask && genome_mask_use_secondary_regions)
    {
        unsigned long int fp = ftell(GENOME_FP);
        while (!eof) {

            if (VERBOSE) {
                printf("Start chromosome nb. %d\n", chr+1);
            }

            eof = load_chr();

            p.chr = chr;
            p.pos = 0;
            BLOCK_TABLE[BLOCK] = p;
            POSITION = 0;

            if (VERBOSE) {
                printf("\tLength %d\n", CHR_LENGTH);
            }

            if (strlen(GENOME_VARIANTS_FILE_NAME)==0)
                index_chromosome_novariants(chr, genome, genome_mask, false, true, false);
            else
                index_chromosome(chr, genome, variants, genome_mask, false, true, false);

            int num_hits=0 ;
            int start_pos=0 ;
            int num_regions=0 ;
            int num_positions=0 ;
            int winlen=0 ;
            int num_hits_win = 0 ;
            const int target_winlen=100 ;
            for (unsigned int pos=0; pos<CHR_LENGTH; pos++)
            {
                char elem=genome_mask.CHR_MAP(genome.chromosome(chr), pos) ;
                if ((elem & MASK_REGION_SECONDARY)>0)
                {
                    start_pos=pos ;
                    num_hits++ ;
                    if (num_hits==secondary_min_num_hits)
                        num_regions++ ;
                    num_hits_win++ ;
                }
                else
                    num_hits=0 ;
                winlen++ ;
                if (winlen>=target_winlen)
                {
                    if ((int)pos>=winlen)
                        if ((genome_mask.CHR_MAP(genome.chromosome(chr), pos-winlen) & MASK_REGION_SECONDARY)>0)
                            num_hits_win-=1 ;
                    winlen-- ;
                }
                assert(num_hits_win<=target_winlen+1) ;
                if (num_hits_win>=secondary_min_hits_perc)
                {
                    for (int pp=pos-winlen-secondary_region_extra; pp<=(int)pos+secondary_region_extra; pp++)
                    {
                        if (pp<0 || pp>=(int)CHR_LENGTH)
                            continue ;
                        char elem2= genome_mask.CHR_MAP(genome.chromosome(chr), pp) ;
                        if ((elem2 & MASK_REGION_SECONDARY_REGION)==0)
                        {
                            genome_mask.CHR_MAP_set(genome.chromosome(chr), pp, elem2+MASK_REGION_SECONDARY_REGION) ;
                            num_positions++ ;
                        }
                    }
                }
                if (num_hits>=secondary_min_num_hits)
                {
                    for (int pp=start_pos-secondary_region_extra; pp<=(int)pos+secondary_region_extra; pp++)
                    {
                        if (pp<0 || pp>=(int)CHR_LENGTH)
                            continue ;
                        char elem2= genome_mask.CHR_MAP(genome.chromosome(chr), pp) ;
                        if ((elem2 & MASK_REGION_SECONDARY_REGION)==0)
                        {
                            genome_mask.CHR_MAP_set(genome.chromosome(chr), pp, elem2+MASK_REGION_SECONDARY_REGION) ;
                            num_positions++ ;
                        }
                    }
                }
            }
            if (VERBOSE)
                fprintf(stdout, "extended regions around secondary hits: %i positions in %i regions\n", num_positions, num_regions) ;

            ++BLOCK;
            ++chr;

        }
        // reset file handle & counters
        fseek(GENOME_FP, fp, SEEK_SET) ;
        eof = 0;
        chr = 0;
        BLOCK = 0;
        strcpy(CHR_DESC_TMP, CHR_DESC_TMP_orig) ;
    }

    while (!eof)
    {
        if (VERBOSE) {
            printf("Start chromosome nb. %d\n", chr+1);
        }

        eof = load_chr();

        p.chr = chr;
        p.pos = 0;
        BLOCK_TABLE[BLOCK] = p;
        POSITION = 0;

        if (VERBOSE) {
            printf("\tLength %d\n", CHR_LENGTH);
        }

        if (strlen(GENOME_VARIANTS_FILE_NAME)==0)
        {
            if (!has_genome_mask)
                index_chromosome_novariants(chr, genome, genome_mask, true, false, true);
            else
                index_chromosome_novariants(chr, genome, genome_mask, false, false, true);
        }
        else if (!has_genome_mask)
            index_chromosome(chr, genome, variants, genome_mask, true, false, true);
        else
            index_chromosome(chr, genome, variants, genome_mask, false, false, true);

        write_chr_desc(chr);

        ++BLOCK;
        ++chr;

    }

    if (VERBOSE) {
        printf("Write meta data to file ...");
        fflush(stdout);
    }

    write_meta_index(chr);

    return(0);
}