Changeset 194 for cpp/frams/genetics/fT
- Timestamp:
- 03/25/14 00:15:11 (11 years ago)
- Location:
- cpp/frams/genetics/fT
- Files:
-
- 1 added
- 2 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 -
cpp/frams/genetics/fT/oper_fTest.h
r191 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 #ifndef _GENO _FTEST_H_6 #define _GENO _FTEST_H_5 #ifndef _GENOOPER_FTEST_H_ 6 #define _GENOOPER_FTEST_H_ 7 7 8 #include "param.h" 9 #include "sstring.h" 10 #include "geno_fx.h" 8 #include "../oper_fx.h" 11 9 12 10 /** \file */ … … 16 14 \author Maciej Komosinski 17 15 18 This is a very simple class to illustrate basic genetic operations. 19 To compile this code, you may need some GDK files. 20 For a more sophisticated example of Geno_f4 derived from Geno_fx, refer to 21 the available source on developmental encoding and f4 genotype format. 16 This is a very simple class that illustrates basic genetic operations performed on ATGC sequences. 17 For a more sophisticated and realistic examples of genetic formats and operators derived from GenoOperators, 18 refer to the available source for genetic formats f9, fF, and f4. 22 19 23 20 \sa \ref geno_ftest_example 24 */ 21 */ 25 22 26 class Geno _ftest : public Geno_fx23 class GenoOper_fTest : public GenoOperators 27 24 { 28 29 Geno_ftest();30 31 32 int mutate(char *&g,float& chg);33 int crossOver(char *&g1,char *&g2,float& chg1,float& chg2);34 35 char* getSimplest() {return "GTTCAGATC";}25 public: 26 GenoOper_fTest(); 27 int checkValidity(const char *); 28 int validate(char *&); 29 int mutate(char *&geno, float& chg, int &method); 30 int crossOver(char *&g1, char *&g2, float& chg1, float& chg2); 31 unsigned long style(const char *g, int pos); 32 const char* getSimplest() { return "GATCGATTACA"; } 36 33 37 34 double prob; 38 35 }; 39 36 40 37 #endif 41
Note: See TracChangeset
for help on using the changeset viewer.