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

Last change on this file since 196 was 145, checked in by sz, 11 years ago

Genetics reorganization (affects ALL applications!):

  • Converters/Validators? are now configured/initialized in a more verbose but also less confusing way
  • At the same time, the PreconfiguredGenetics? object will help you avoid the increased complexity by creating the ready-to-use environment that is sufficient in 99% of cases (see the demos)
  • Format F genetics updated (work in progress)
  • Property svn:eol-style set to native
File size: 4.0 KB
Line 
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// Refer to http://www.framsticks.com/ for further information.
4
5#include <ctype.h>
6#include <frams/genetics/defgenoconv.h>
7#include <frams/model/model.h>
8#include <frams/util/multimap.h>
9
10#include "printconvmap.h"
11#include <frams/errmgr/stdouterr.h>
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();
53return mod.getGeno().getGene();
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;
79const char* src=in;
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",
114        (const char*)g.getGene(),g.getFormat(),g.isValid()?"yes":"no",(const char*)g.getComment());
115}
116
117int main(int argc,char *argv[])
118{
119StdoutErrorHandler err;//the default ErrorHandler constructor automatically registers this object to receive framsg messages (and in this case, redirect them to standard output)
120
121DefaultGenoConvManager gcm;
122gcm.addDefaultConverters();
123gcm.addConverter(new GenoConv_Test());
124gcm.addConverter(new GenoConv_Test2());
125gcm.addConverter(new GenoConv_Test3());
126Geno::useConverters(gcm);
127
128ModelGenoValidator model_validator;
129Geno::addValidator(&model_validator);
130
131const char* src=(argc>1)?argv[1]:"X";
132char dst=(argc>2)?*argv[2]:'0';
133
134printf("*** source genotype:\n");
135Geno g1(src);
136printGen(g1);
137MultiMap m;
138Geno g2=g1.getConverted(dst,&m);
139printf("*** converted to f%c:\n",dst);
140printGen(g2);
141if (m.isEmpty())
142        printf("(conversion map not available)\n");
143else
144        {
145        printf("conversion map:\n");
146        m.print();
147        printConvMap(g1.getGene(),g2.getGene(),m);
148        printf("reverse conversion map:\n");
149        MultiMap rm;
150        rm.addReversed(m);
151        rm.print();
152        printConvMap(g2.getGene(),g1.getGene(),rm);
153        }
154
155Model mod1(g1,1);
156printf("\nmodel map for f%c genotype:\n",g1.getFormat());
157printModelMap(g1.getGene(),mod1.getMap());
158Model mod2(g2,1);
159printf("\nmodel map for f%c genotype:\n",g2.getFormat());
160printModelMap(g2.getGene(),mod2.getMap());
161return 0;
162}
Note: See TracBrowser for help on using the repository browser.