Changeset 194 for cpp/frams/genetics/fT/oper_fTest.cpp
- Timestamp:
- 03/25/14 00:15:11 (10 years ago)
- 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 G enoFX library.2 // Copyright (C) 2002-201 1 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. 3 3 // Refer to http://www.framsticks.com/ for further information. 4 4 5 #include " geno_ftest.h"6 #include "nonstd.h"//randomN, rnd015 #include "oper_fTest.h" 6 #include <common/nonstd.h> //randomN, rnd01 7 7 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 /** 9 Sample output (simple examples of various genetic operations) produced by genooper_test_fTest.cpp: 10 $ ./genooper_test_fTest.exe 11 GATCGATTACA [mutated 0.0%] 12 GATCCATTACA [mutated 9.1%] 13 GATCCTGTACA [mutated 27.3%] 14 GATCCTGTACA [mutated 0.0%] 15 GATCCTGTACA [mutated 0.0%] 16 GATCCTGTATA [mutated 9.1%] 17 GATCCTGTATA [mutated 0.0%] 18 GATACTGTATA [mutated 9.1%] 19 GATACTGTATA [mutated 9.1%] 20 GATACTGTATA [mutated 0.0%] 21 22 Crossing over the last mutant, 23 GATACTGTATA 24 and the simplest genotype 25 GATCGATTACA 26 : 27 Offspring 1: 28 GATACTCGATTACA (35.7% genes from parent1) 29 Offspring 2: 30 GATGTATA (25.0% genes from parent2) 31 32 Checking genotype: 33 ATGsomethingCG... error at position 4. 34 After validation: 35 ATGCG 36 ...and how about YOUR genotype? 14 37 */ 15 38 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 46 static ParamEntry GENOtestparam_tab[] = //external access to ftest genetic parameters 18 47 { 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, }, 22 51 }; 23 52 #undef FIELDSTRUCT 24 53 25 Geno _ftest::Geno_ftest()54 GenoOper_fTest::GenoOper_fTest() 26 55 { 27 28 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; 31 60 } 32 61 33 62 ///The only letters allowed are A,T,G,C 34 int Geno _ftest::checkValidity(const char* gene)63 int GenoOper_fTest::checkValidity(const char* gene) 35 64 { 36 37 bool ok=true;38 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; 41 70 } 42 71 43 72 ///Remove all invalid letters from the genotype 44 int Geno _ftest::validate(char *&gene)73 int GenoOper_fTest::validate(char *&gene) 45 74 { 46 47 for(int i=0;i<strlen(gene);i++)48 if (strchr("ATGC",gene[i])) validated+=gene[i]; //validated contains only ATGC49 50 gene=strdup(validated); //reallocate51 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; 52 81 } 53 82 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 84 int GenoOper_fTest::mutate(char *&geno, float &chg, int &method) 56 85 { 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; 64 97 } 65 98 66 99 ///A simple one-point crossover 67 int Geno _ftest::crossOver(char *&g1,char *&g2,float& chg1,float& chg2)100 int GenoOper_fTest::crossOver(char *&g1, char *&g2, float& chg1, float& chg2) 68 101 { 69 int len1=strlen(g1),len2=strlen(g2);70 int p1=randomN(len1); //random cut point for first genotype71 int p2=randomN(len2); //random cut point for second genotype72 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 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; 81 114 } 82 115 83 116 ///Applying some colors and font styles... 84 unsigned long Geno _ftest::style(const char *g, int pos)117 unsigned long GenoOper_fTest::style(const char *g, int pos) 85 118 { 86 char ch=g[pos];87 unsigned long style=GENSTYLE_CS(0,GENSTYLE_INVALID); //default, should be changed below88 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 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; 93 126 } 94 95 96 #ifdef GENO_FTEST_APPL //define this macro to compile a simple testing main function97 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 #endif128
Note: See TracChangeset
for help on using the changeset viewer.