Ignore:
Timestamp:
03/25/14 00:15:11 (10 years ago)
Author:
Maciej Komosinski
Message:

Updated sources of the fT (ATGC sequences) genetic operators - useful as an educational example for developers; added genooper_test_fTest.cpp as a demo; removed outdated sources that now have new counterparts

Location:
cpp/frams/genetics/fT
Files:
1 added
1 copied

Legend:

Unmodified
Added
Removed
  • cpp/frams/genetics/fT/oper_fTest.cpp

    r193 r194  
    1 // This file is a part of the Framsticks GenoFX library.
    2 // Copyright (C) 2002-2011  Maciej Komosinski.  See LICENSE.txt for details.
     1// This file is a part of the Framsticks GDK.
     2// Copyright (C) 2002-2014  Maciej Komosinski and Szymon Ulatowski.  See LICENSE.txt for details.
    33// Refer to http://www.framsticks.com/ for further information.
    44
    5 #include "geno_ftest.h"
    6 #include "nonstd.h" //randomN, rnd01
     5#include "oper_fTest.h"
     6#include <common/nonstd.h> //randomN, rnd01
    77
    8 /** \file
    9 Sample output (simple examples of various genetic operations):
    10 \anchor geno_ftest_example
    11 \include geno_ftest_example
    12 Produced by the source:
    13 \include geno_ftest.cpp
     8/**
     9Sample output (simple examples of various genetic operations) produced by genooper_test_fTest.cpp:
     10$ ./genooper_test_fTest.exe
     11GATCGATTACA   [mutated 0.0%]
     12GATCCATTACA   [mutated 9.1%]
     13GATCCTGTACA   [mutated 27.3%]
     14GATCCTGTACA   [mutated 0.0%]
     15GATCCTGTACA   [mutated 0.0%]
     16GATCCTGTATA   [mutated 9.1%]
     17GATCCTGTATA   [mutated 0.0%]
     18GATACTGTATA   [mutated 9.1%]
     19GATACTGTATA   [mutated 9.1%]
     20GATACTGTATA   [mutated 0.0%]
     21
     22Crossing over the last mutant,
     23GATACTGTATA
     24and the simplest genotype
     25GATCGATTACA
     26:
     27Offspring 1:
     28GATACTCGATTACA  (35.7% genes from parent1)
     29Offspring 2:
     30GATGTATA  (25.0% genes from parent2)
     31
     32Checking genotype:
     33ATGsomethingCG... error at position 4.
     34After validation:
     35ATGCG
     36...and how about YOUR genotype?
    1437*/
    1538
    16 #define FIELDSTRUCT Geno_ftest
    17 static ParamEntry GENOtestparam_tab[]=   //external access to ftest genetic parameters
     39
     40// To test this genetic format, you can also use the general genooper_test app that supports all genetic formats:
     41// $ ./genooper_test.exe /*T*/AAAAAAAAAAA
     42
     43
     44
     45#define FIELDSTRUCT GenoOper_fTest
     46static ParamEntry GENOtestparam_tab[] =   //external access to ftest genetic parameters
    1847{
    19 {"Genetics: ftest",1,1,},
    20 {"ftest_mut",0,0,"Mutation probability","f 0 1",FIELD(prob),"How many genes should be mutated during single mutation (1=all genes, 0.1=ten percent)",},
    21 {0,},
     48        { "Genetics: fTest", 1, 1, },
     49        { "fTest_mut", 0, 0, "Mutation probability", "f 0 1", FIELD(prob), "How many genes should be mutated during single mutation (1=all genes, 0.1=ten percent)", },
     50        { 0, },
    2251};
    2352#undef FIELDSTRUCT
    2453
    25 Geno_ftest::Geno_ftest()
     54GenoOper_fTest::GenoOper_fTest()
    2655{
    27    par.setParamTab(GENOtestparam_tab);
    28    par.select(this);
    29    supported_format='t'; //'0' for f0, '1' for f1, etc.
    30    prob=0.1;
     56        par.setParamTab(GENOtestparam_tab);
     57        par.select(this);
     58        supported_format = 'T'; //'0' for f0, '1' for f1, 'F' for fF, etc.
     59        prob = 0.1;
    3160}
    3261
    3362///The only letters allowed are A,T,G,C
    34 int Geno_ftest::checkValidity(const char* gene)
     63int GenoOper_fTest::checkValidity(const char* gene)
    3564{
    36    if (!gene[0]) return 1; //empty is not valid
    37    bool ok=true;
    38    int i;
    39    for(i=0;i<strlen(gene);i++) if (!strchr("ATGC",gene[i])) {ok=false; break;}
    40    return ok ? GENOPER_OK : i+1;
     65        if (!gene[0]) return 1; //empty is not valid
     66        bool ok = true;
     67        int i;
     68        for (i = 0; i < strlen(gene); i++) if (!strchr("ATGC", gene[i])) { ok = false; break; }
     69        return ok ? GENOPER_OK : i + 1;
    4170}
    4271
    4372///Remove all invalid letters from the genotype
    44 int Geno_ftest::validate(char *&gene)
     73int GenoOper_fTest::validate(char *&gene)
    4574{
    46    SString validated; //new genotype (everything except ATGC is skipped)
    47    for(int i=0;i<strlen(gene);i++)
    48       if (strchr("ATGC",gene[i])) validated+=gene[i];  //validated contains only ATGC
    49    free(gene);
    50    gene=strdup(validated); //reallocate
    51    return GENOPER_OK;
     75        SString validated; //new genotype (everything except ATGC is skipped)
     76        for (int i = 0; i < strlen(gene); i++)
     77                if (strchr("ATGC", gene[i])) validated += gene[i];  //validated contains only ATGC
     78        free(gene);
     79        gene = strdup(validated); //reallocate
     80        return GENOPER_OK;
    5281}
    5382
    54 ///Very simple mutation
    55 int Geno_ftest::mutate(char *&gene,float &chg)
     83///Very simple mutation; should be improved to guarantee at least one gene changed
     84int GenoOper_fTest::mutate(char *&geno, float &chg, int &method)
    5685{
    57    static char a[]="ATGC";
    58    int changes=0,len=strlen(gene);
    59    for(int i=0;i<len;i++)
    60       if (rnd01<prob) //normalize prob with length of genotype
    61          {gene[i]=a[randomN(4)]; changes++;}
    62    chg=(float)changes/len;
    63    return GENOPER_OK;
     86        static char a[] = "ATGC";
     87        method = 0;
     88        int changes = 0, len = strlen(geno);
     89        for (int i = 0; i < len; i++)
     90                if (rnd01 < prob) //normalize prob with length of genotype
     91                {
     92                        geno[i] = a[randomN(4)];
     93                        changes++;
     94                }
     95        chg = (float)changes / len;
     96        return GENOPER_OK;
    6497}
    6598
    6699///A simple one-point crossover
    67 int Geno_ftest::crossOver(char *&g1,char *&g2,float& chg1,float& chg2)
     100int GenoOper_fTest::crossOver(char *&g1, char *&g2, float& chg1, float& chg2)
    68101{
    69    int len1=strlen(g1),len2=strlen(g2);
    70    int p1=randomN(len1);  //random cut point for first genotype
    71    int p2=randomN(len2);  //random cut point for second genotype
    72    char *child1=(char*)malloc(p1+len2-p2+1);
    73    char *child2=(char*)malloc(p2+len1-p1+1);
    74    strncpy(child1,g1,p1);   strcpy(child1+p1,g2+p2);
    75    strncpy(child2,g2,p2);   strcpy(child2+p2,g1+p1);
    76    free(g1); g1=child1;
    77    free(g2); g2=child2;
    78    chg1=(float)p1/strlen(child1);
    79    chg2=(float)p2/strlen(child2);
    80    return GENOPER_OK;
     102        int len1 = strlen(g1), len2 = strlen(g2);
     103        int p1 = randomN(len1);  //random cut point for first genotype
     104        int p2 = randomN(len2);  //random cut point for second genotype
     105        char *child1 = (char*)malloc(p1 + len2 - p2 + 1);
     106        char *child2 = (char*)malloc(p2 + len1 - p1 + 1);
     107        strncpy(child1, g1, p1);   strcpy(child1 + p1, g2 + p2);
     108        strncpy(child2, g2, p2);   strcpy(child2 + p2, g1 + p1);
     109        free(g1); g1 = child1;
     110        free(g2); g2 = child2;
     111        chg1 = (float)p1 / strlen(child1);
     112        chg2 = (float)p2 / strlen(child2);
     113        return GENOPER_OK;
    81114}
    82115
    83116///Applying some colors and font styles...
    84 unsigned long Geno_ftest::style(const char *g, int pos)
     117unsigned long GenoOper_fTest::style(const char *g, int pos)
    85118{
    86    char ch=g[pos];
    87    unsigned long style=GENSTYLE_CS(0,GENSTYLE_INVALID); //default, should be changed below
    88    if (ch=='A') style=GENSTYLE_RGBS(200,0,0,GENSTYLE_BOLD);
    89    if (ch=='T') style=GENSTYLE_RGBS(0,200,0,GENSTYLE_BOLD);
    90    if (ch=='G') style=GENSTYLE_RGBS(0,0,200,GENSTYLE_NONE);
    91    if (ch=='C') style=GENSTYLE_RGBS(200,200,0,GENSTYLE_NONE);
    92    return style;
     119        char ch = g[pos];
     120        unsigned long style = GENSTYLE_CS(0, GENSTYLE_INVALID); //default, should be changed below
     121        if (ch == 'A') style = GENSTYLE_RGBS(200, 0, 0, GENSTYLE_BOLD);
     122        if (ch == 'T') style = GENSTYLE_RGBS(0, 200, 0, GENSTYLE_BOLD);
     123        if (ch == 'G') style = GENSTYLE_RGBS(0, 0, 200, GENSTYLE_NONE);
     124        if (ch == 'C') style = GENSTYLE_RGBS(200, 200, 0, GENSTYLE_NONE);
     125        return style;
    93126}
    94 
    95 
    96 #ifdef GENO_FTEST_APPL //define this macro to compile a simple testing main function
    97 
    98 Geno_ftest gft;
    99 
    100 void main()
    101 {
    102    float chg;
    103    char *g=strdup(gft.getSimplest());
    104    for(int i=0;i<10;i++)
    105    {
    106       int result=gft.mutate(g,chg);
    107       printf("%s   [mutated %.1f%%]\n",g,chg*100);
    108    }
    109 
    110    char *g2=strdup(gft.getSimplest());
    111    float chg2;
    112    printf("\nCrossing over the last mutant, \n\t%s\nand the simplest genotype\n\t%s\n:\n",g,g2);
    113    gft.crossOver(g,g2,chg,chg2);
    114    printf("Offspring 1:\n\t%s  (%.1f%% genes from parent1)\n",g,chg*100);
    115    printf("Offspring 2:\n\t%s  (%.1f%% genes from parent2)\n",g2,chg2*100);
    116    free(g);
    117    free(g2);
    118 
    119    g=strdup("ATGsomethingCG");
    120    printf("\nChecking genotype:\n\t%s... error at position %d.\n",g,gft.checkValidity(g));
    121    gft.validate(g);
    122    printf("After validation:\n\t%s\n",g);
    123    free(g);
    124    printf("...and is YOUR genotype O.K.?\n\n");
    125 }
    126 
    127 #endif
    128 
Note: See TracChangeset for help on using the changeset viewer.