source: cpp/frams/_demos/genoconv_test.cpp @ 564

Last change on this file since 564 was 534, checked in by Maciej Komosinski, 8 years ago

Renamed: get/setGene -> get/setGenes, setGeneOnly -> setGenesAssumingSameFormat

  • Property svn:eol-style set to native
File size: 4.1 KB
RevLine 
[286]1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
[109]4
5#include <ctype.h>
[129]6#include <frams/genetics/defgenoconv.h>
[109]7#include <frams/model/model.h>
8#include <frams/util/multimap.h>
[527]9#include <common/virtfile/stdiofile.h>
[109]10#include "printconvmap.h"
[391]11#include <common/loggers/loggertostdout.h>
[109]12
13/**
14 @file
15 Sample code: Genotype converter class
16*/
17
18/// Sample Geno converter not using Model class.
19/// (this converter generates the same output for each input).
20/// such a converter is responsible for doing valid
21/// f0 (or other format) output and storing temporary data
22class GenoConv_Test: public GenoConverter
23{
24public:
25GenoConv_Test()
26        {
27        name="Test Converter";
28        in_format='x';
29        }
30SString convert(SString &i,MultiMap *map) {return SString("after conversion...");}
31~GenoConv_Test() {}
32};
33
34/// Sample Geno converter using Model class.
35/// (this converter generates the same output for each input).
36class GenoConv_Test2: public GenoConverter
37{
38public:
39GenoConv_Test2()
40        {
41        name="Test Converter #2";
42        in_format='y';
43        }
44SString convert(SString &i,MultiMap *map)
45{
46Model mod;
47mod.open();
48mod.singleStepBuild("p:");
49mod.singleStepBuild("p:");
50mod.singleStepBuild("j:0,1");
51mod.getPart(1)->p=Pt3D(0,0.2,-1);
52mod.close();
[534]53return mod.getGeno().getGenes();
[109]54}
55~GenoConv_Test2() {}
56};
57
58/// Sample Geno converter supporting conversion mapping.
59/// the conversion is very simple: any sequence of <digit><character>
60/// (but not inside neurons) is replaced by the repeated sequence of the character
61class GenoConv_Test3: public GenoConverter
62{
63public:
64GenoConv_Test3()
65        {
66        name="Test Converter #3";
67        in_format='z';
68        out_format='1';
69        mapsupport=1;
70        }
71SString convert(SString &in,MultiMap *map);
72~GenoConv_Test3() {}
73};
74
75/** main converting routine - most important: direct conversion map example */
76SString GenoConv_Test3::convert(SString &in,MultiMap *map)
77{
78SString dst;
[348]79const char* src=in.c_str();
[109]80const char* t;
81int insideneuron=0;
82int n;
83for(t=src;*t;t++)
84        {
85        if (insideneuron&&*t==']') insideneuron=0;
86        if (*t=='[') insideneuron=1;
87        if ((!insideneuron)&&isdigit(*t)&&t[1])
88                { // special sequence detected!
89                n=*t-'0';
90                t++; // *t will be repeated 'n' times
91                for (int i=0;i<n;i++)
92                        dst+=*t;
93                if (map) // fill in the map only if requested
94                        map->add(t-src, t-src, dst.len()-n, dst.len()-1);
95                // meaning: source character (t-src) becomes (dst.len()-n ... dst.len()-1)
96                }
97        else
98                {
99                dst+=*t;
100                if (map)
101                        map->add(t-src, t-src, dst.len()-1, dst.len()-1);
102                // meaning: map single to single character: (t-src) into (dst.len()-1)
103                }
104        }
105return dst;
106}
107
108
109///////////////////////////////////////////////
110
111void printGen(Geno &g)
112{
113printf("Genotype:\n%s\nFormat: %c\nValid: %s\nComment: %s\n",
[534]114        g.getGenes().c_str(),g.getFormat(),g.isValid()?"yes":"no",g.getComment().c_str());
[109]115}
116
117int main(int argc,char *argv[])
118{
[375]119LoggerToStdout messages_to_stdout(LoggerBase::Enable);
[145]120
[129]121DefaultGenoConvManager gcm;
[145]122gcm.addDefaultConverters();
[109]123gcm.addConverter(new GenoConv_Test());
124gcm.addConverter(new GenoConv_Test2());
125gcm.addConverter(new GenoConv_Test3());
[348]126Geno::useConverters(&gcm);
[109]127
[348]128Geno::Validators validators;
[145]129ModelGenoValidator model_validator;
[348]130validators+=&model_validator;
131Geno::useValidators(&validators);
[145]132
[527]133SString src;
134if (argc>1)
135        {
136        src=argv[1];
137        if (src=="-")
138                {
139                StdioFILEDontClose in(stdin);
140                src="";
141                loadSString(&in,src,false);
142                }
143        }
144else
145        src="X";
[109]146char dst=(argc>2)?*argv[2]:'0';
147
148printf("*** source genotype:\n");
149Geno g1(src);
150printGen(g1);
151MultiMap m;
152Geno g2=g1.getConverted(dst,&m);
153printf("*** converted to f%c:\n",dst);
154printGen(g2);
155if (m.isEmpty())
156        printf("(conversion map not available)\n");
157else
158        {
159        printf("conversion map:\n");
160        m.print();
[534]161        printConvMap(g1.getGenes(),g2.getGenes(),m);
[109]162        printf("reverse conversion map:\n");
163        MultiMap rm;
164        rm.addReversed(m);
165        rm.print();
[534]166        printConvMap(g2.getGenes(),g1.getGenes(),rm);
[109]167        }
168
169Model mod1(g1,1);
170printf("\nmodel map for f%c genotype:\n",g1.getFormat());
[534]171printModelMap(g1.getGenes(),mod1.getMap());
[527]172mod1.getMap().print();
[109]173Model mod2(g2,1);
174printf("\nmodel map for f%c genotype:\n",g2.getFormat());
[534]175printModelMap(g2.getGenes(),mod2.getMap());
[527]176mod2.getMap().print();
[109]177return 0;
178}
Note: See TracBrowser for help on using the repository browser.