source: cpp/tests/genomanipulation-default.goal @ 1025

Last change on this file since 1025 was 1009, checked in by Maciej Komosinski, 4 years ago

Added tests for most SDK demo programs

File size: 14.6 KB
Line 
1    #############################################
2   ##                                           ##
3  ##    Welcome to Genotype Manipulation Demo!    ##
4   ##                                           ##
5    #############################################
6Found converter accepting f1: "Recursive encoding"
7Found 6 converter(s) producing f0
8
9Source genotype: 'X[|G:1.23]'
10                  ( format 1 )
11Converted to f0:
12p:vr=0.5, 0.5, 0.5
13p:1.0, vr=0.5, 0.5, 0.5
14j:0, 1, dx=1.0, 0.0, 0.0, vr=0.5, 0.5, 0.5
15n:p=1
16n:j=0, d="|:p=0.25,r=1"
17n:j=0, d=G
18c:0, 2, 1.23
19c:1, 0
20
21Model contains: 2 part(s)
22                1 joint(s)
23                3 neuron(s)
24
25Investigating details...
26    #############################################
27   ##                                           ##
28  ##    P A R T    O B J E C T                   ##
29   ##                                           ##
30    #############################################
31            (part # 1)
32Here is the full listing of properties as they are printed in f0
33 (please compare with f0 genotype).
34Some properties have special meaning (eg. geometry and connections groups)
35and should be handled with care, because they influence other elements of the model.
36
37 [this data is provided by Part::properties() ]
38 #        id                      type  name        group (22 properties)
39 0.        x = 1.0                  f   position.x  Geometry 
40 1.        y = 0.0                  f   position.y  Geometry 
41 2.        z = 0.0                  f   position.z  Geometry 
42 3.       sh = 0                    d 0 3 0 shape       Geometry 
43 4.        s = 1.0                  f 0.1 10.0 1.0 size        Geometry 
44 5.       sx = 1.0                  f 0.001 1000.0 1.0 scale.x     Geometry 
45 6.       sy = 1.0                  f 0.001 1000.0 1.0 scale.y     Geometry 
46 7.       sz = 1.0                  f 0.001 1000.0 1.0 scale.z     Geometry 
47 8.        h = 0.0                  f 0 1 0 hollow      Other properties
48 9.       dn = 1.0                  f 0.2 5.0 1.0 density     Other properties
4910.       fr = 0.4                  f 0.0 4.0 0.4 friction    Other properties
5011.      ing = 0.25                 f 0.0 1.0 0.25 ingestion   Other properties
5112.       as = 0.25                 f 0.0 1.0 0.25 assimilation  Other properties
5213.       rx = 0.0                  f   rot.x       Geometry 
5314.       ry = 0.0                  f   rot.y       Geometry 
5415.       rz = 0.0                  f   rot.z       Geometry 
5516.        i =                      s   info        Other properties
5617.   Vstyle = part                 s 0 0 part vis_style   Visual   
5718.       vs = 0.2                  f 0.05 0.7 0.2 visual thickness  Visual   
5819.       vr = 0.5                  f 0.0 1.0 1.0 red component  Visual   
5920.       vg = 0.5                  f 0.0 1.0 1.0 green component  Visual   
6021.       vb = 0.5                  f 0.0 1.0 1.0 blue component  Visual   
61
62However, there is a subset of properties which may be modified more freely.
63Properties on this list are related only to this part and can be changed
64without much consideration. They are guaranteed to be always valid; any inconsistencies
65will be silently repaired.
66
67 [this data is provided by Part::extraProperties() ]
68 #        id                      type  name        group (9 properties)
69 0.        h = 0.0                  f 0 1 0 hollow      Extra properties
70 1.       dn = 1.0                  f 0.2 5.0 1.0 density     Extra properties
71 2.       fr = 0.4                  f 0.0 4.0 0.4 friction    Extra properties
72 3.      ing = 0.25                 f 0.0 1.0 0.25 ingestion   Extra properties
73 4.       as = 0.25                 f 0.0 1.0 0.25 assimilation  Extra properties
74 5.       vs = 0.2                  f 0.05 0.7 0.2 visual thickness  Extra properties
75 6.       vr = 0.5                  f 0.0 1.0 1.0 red component  Extra properties
76 7.       vg = 0.5                  f 0.0 1.0 1.0 green component  Extra properties
77 8.       vb = 0.5                  f 0.0 1.0 1.0 blue component  Extra properties
78
79This set of properties can vary from release to release,
80but can be safely accessed by using extraProperties() call.
81This method accesses the full set of properies (even those
82which appear in future releases).
83Now we will try to change some of properties:
84
85      Change property #0 to random value from range [0..1]
86      Current value of 'h' (hollow) is '0.0'
87      Setting new value... [ using ParamInterface::set() ]
88      The value is now '0.548814'
89
90Let's see f0... (check out part #1 !)
91
92p:vr=0.5, 0.5, 0.5
93p:1.0, h=0.548814, vr=0.5, 0.5, 0.5
94j:0, 1, dx=1.0, 0.0, 0.0, vr=0.5, 0.5, 0.5
95n:p=1
96n:j=0, d="|:p=0.25,r=1"
97n:j=0, d=G
98c:0, 2, 1.23
99c:1, 0
100
101    #############################################
102   ##                                           ##
103  ##    J O I N T    O B J E C T                 ##
104   ##                                           ##
105    #############################################
106            (joint # 0)
107Similarly as with Part, the full list of properties comes first:
108
109 #        id                      type  name        group (27 properties)
110 0.       p1 = 0                    d -1 999999 -1 part1 ref#  Connections
111 1.       p2 = 1                    d -1 999999 -1 part2 ref#  Connections
112 2.       rx = 0.0                  f   rotation.x  Geometry 
113 3.       ry = 0.0                  f   rotation.y  Geometry 
114 4.       rz = 0.0                  f   rotation.z  Geometry 
115 5.       dx = 1.0                  f -2 2 0 delta.x     Geometry 
116 6.       dy = 0.0                  f -2 2 0 delta.y     Geometry 
117 7.       dz = 0.0                  f -2 2 0 delta.z     Geometry 
118 8.       sh = 0                    d 0 3 0 shape       Geometry 
119 9.       hx = 0.0                  f   hinge position.x  Geometry 
12010.       hy = 0.0                  f   hinge position.y  Geometry 
12111.       hz = 0.0                  f   hinge position.z  Geometry 
12212.      hrx = 0.0                  f   hinge rotation.x  Geometry 
12313.      hry = 0.0                  f   hinge rotation.y  Geometry 
12414.      hrz = 0.0                  f   hinge rotation.z  Geometry 
12515.      hxn = -1.5708              f -6.2832 0 -1.5708 hinge x negative limit  Geometry 
12616.      hxp = 1.5708               f 0 6.2832 1.5708 hinge x positive limit  Geometry 
12717.      hyn = -1.5708              f -6.2832 0 -1.5708 hinge y negative limit  Geometry 
12818.      hyp = 1.5708               f 0 6.2832 1.5708 hinge y positive limit  Geometry 
12919.     stif = 1.0                  f 0.0 1.0 1.0 stiffness   Other properties
13020.  rotstif = 1.0                  f 0.0 1.0 1.0 rotation stiffness  Other properties
13121.     stam = 0.25                 f 0.0 1.0 0.25 stamina     Other properties
13222.        i =                      s   info        Other properties
13323.   Vstyle = joint                s 0 0 joint vis_style   Visual   
13424.       vr = 0.5                  f 0.0 1.0 1.0 red component  Visual   
13525.       vg = 0.5                  f 0.0 1.0 1.0 green component  Visual   
13626.       vb = 0.5                  f 0.0 1.0 1.0 blue component  Visual   
137
138Actually, there are two kinds of Joints: delta and absolute.
139For this object, Joint::isDelta() returns 1, so this is the delta Joint.
140
141Delta fields (dx,dy,dz) describe relative location of the second part.
142This joint will change the second Part's positions to preserve delta distance.
143Let's move the first Part (#0) along y axis (+0.1) and change delta.z (dz) by 0.1.
144Position of the second Part referenced by this joint (part #1) is now changed:
145
146p:y=0.1, vr=0.5, 0.5, 0.5
147p:1.0, 0.1, 0.1, h=0.548814, vr=0.5, 0.5, 0.5
148j:0, 1, dx=1.0, 0.0, 0.1, vr=0.5, 0.5, 0.5
149n:p=1
150n:j=0, d="|:p=0.25,r=1"
151n:j=0, d=G
152c:0, 2, 1.23
153c:1, 0
154
155If no delta fields are defined, they will be computed automatically.
156You can always delete existing delta values by using Joint::resetDelta().
157Now we will change the second Part's z position by -0.2 and call resetDelta()...
158As you can see, Joint's delta fields have altered:
159
160p:y=0.1, vr=0.5, 0.5, 0.5
161p:1.0, 0.1, -0.1, h=0.548814, vr=0.5, 0.5, 0.5
162j:0, 1, dx=1.0, 0.0, -0.1, vr=0.5, 0.5, 0.5
163n:p=1
164n:j=0, d="|:p=0.25,r=1"
165n:j=0, d=G
166c:0, 2, 1.23
167c:1, 0
168
169How would this joint look like with delta option disabled?
170[ by calling Joint::useDelta(0) ]
171f0 is now:
172
173p:y=0.1, vr=0.5, 0.5, 0.5
174p:1.0, 0.1, -0.1, h=0.548814, vr=0.5, 0.5, 0.5
175j:0, 1, vr=0.5, 0.5, 0.5
176n:p=1
177n:j=0, d="|:p=0.25,r=1"
178n:j=0, d=G
179c:0, 2, 1.23
180c:1, 0
181
182...so this is an absolute joint.
183
184Absolute Joints adapt to its Parts' positions.
185We can move a Part, and it does not influence the second part, nor the Joint.
186Let's move the first Part along y axis by -0.1...
187The Part's position is changed, but everything else stays intact:
188
189p:vr=0.5, 0.5, 0.5
190p:1.0, 0.1, -0.1, h=0.548814, vr=0.5, 0.5, 0.5
191j:0, 1, vr=0.5, 0.5, 0.5
192n:p=1
193n:j=0, d="|:p=0.25,r=1"
194n:j=0, d=G
195c:0, 2, 1.23
196c:1, 0
197
198Part references and delta fields are the 'core' properties of the Joint.
199The other properties are available from Joint::extraProperties()
200and at the moment are defined as follows:
201
202 #        id                      type  name        group (5 properties)
203 0.     stif = 1.0                  f 0.0 1.0 1.0 stiffness   Extra properties
204 1.  rotstif = 1.0                  f 0.0 1.0 1.0 rotation stiffness  Extra properties
205 2.       vr = 0.5                  f 0.0 1.0 1.0 red component  Extra properties
206 3.       vg = 0.5                  f 0.0 1.0 1.0 green component  Extra properties
207 4.       vb = 0.5                  f 0.0 1.0 1.0 blue component  Extra properties
208
209They can be changed just like Part's extra properties:
210      Change property #4 to random value from range [0..1]
211      Current value of 'vb' (blue component) is '0.5'
212      Setting new value... [ using ParamInterface::set() ]
213      The value is now '0.592845'
214And after that we have this genotype:
215
216p:vr=0.5, 0.5, 0.5
217p:1.0, 0.1, -0.1, h=0.548814, vr=0.5, 0.5, 0.5
218j:0, 1, vr=0.5, 0.5, 0.592845
219n:p=1
220n:j=0, d="|:p=0.25,r=1"
221n:j=0, d=G
222c:0, 2, 1.23
223c:1, 0
224
225    #############################################
226   ##                                           ##
227  ##    N E U R O    O B J E C T                 ##
228   ##                                           ##
229    #############################################
230            (neuro # 0)
231Basic features of Neuro object are similar to those of Part and Joint.
232We can request a property list:
233
234 #        id                      type  name        group (10 properties)
235 0.        p = 1                    d -1 999999 -1 part ref#   Connections
236 1.        j = -1                   d -1 999999 -1 joint ref#  Connections
237 2.        d = N                    s   details     Other     
238 3.        i =                      s   info        Other     
239 4.   Vstyle = neuro                s 0 0 neuro vis_style   Visual   
240 5. getInputCount = 1                    d   input count  Connections
241 9. classObject = null                 oNeuroClass neuron class  Connections
242
243...and extra properties (which are designed to be always valid and easy to change):
244
245 #        id                      type  name        group (0 properties)
246
247As usual, we will change something:
248Each neuron can have any number of inputs = weighted connections
249 with other neurons.
250According to Neuro::getInputCount(), this one has 1 inputs.
251Standard API is provided for accessing those inputs (getInput(int)),
252adding inputs (addInput(Neuro*)) and removing them (removeInput(int)).
253
254
255The most unusual thing is 'details' field (d).
256It is something like separate object with its own set of properties.
257Currently the value of 'd' is 'N'.
258'N' is the class name (Neuro::getClassName() == 'N') and means 'Neuron'.
259Neuro::getClass() gives you information about basic characteristic
260of the class, that can be analyzed automatically.
261For the current object we can learn that it supports any number of inputs (getPreferredInputs()) and provides meaningful output signal (getPreferredOutput()==1).
262Instances of 'N' can be used in models having any shape types.
263The class defines its own properties:
264
265 [ data provided by Neuro::classProperties() ]
266 #        id                      type  name        group (4 properties)
267 0.       in = 0.8                  f 0.0 1.0 0.8 Inertia     (null)   
268 1.       fo = 0.04                 f 0.0 999.0 0.04 Force       (null)   
269 2.       si = 2.0                  f -99999.0 99999.0 2.0 Sigmoid     (null)   
270 3.        s = 0.0                  f -1.0 1.0 0.0 State       (null)   
271and they can be changed:
272      Change property #0 to random value from range [0..1]
273      Current value of 'in' (Inertia) is '0.8'
274      Setting new value... [ using ParamInterface::set() ]
275      The value is now '0.715189'
276After that, 'details' contains the new object: 'N:in=0.715189'.
277The class of this object can be changed using Neuro::setClassName()
278The following classes are available:
279 [ data provided by Neuro::getClassInfo()->getProperties() ]
280
281 #  class  description       properties
282 0.     N  Neuron                 4
283 1.    Nu  Unipolar neuron [EXPERIMENTAL!]   4
284 2.     G  Gyroscope              0
285 3. Gpart  Part Gyroscope         2
286 4.     T  Touch                  3
287 5.Tcontact  Touch contact          0
288 6.Tproximity  Touch proximity        3
289 7.     S  Smell                  0
290 8.     *  Constant               0
291 9.     |  Bend muscle            2
29210.     @  Rotation muscle        1
29311.     M  Muscle for solids      2
29412.     D  Differentiate          0
29513. Fuzzy  Fuzzy system [EXPERIMENTAL!]   4
29614.   Sti  Sticky [EXPERIMENTAL!]   0
29715.   LMu  Linear muscle [EXPERIMENTAL!]   1
29816. Water  Water detector         0
29917.Energy  Energy level           0
30018.    Ch  Channelize             0
30119. ChMux  Channel multiplexer    0
30220. ChSel  Channel selector       1
30321.   Rnd  Random noise           0
30422.   Sin  Sinus generator        2
305
306Let's change the Neuro's class to 'Water'...
307[WARN] Param.loadSingleLine: Unknown property 'Water.in' (ignored)
308Info for input #0 = ""
309Info for input #0, field "abc" = ""
310The final object description will be then: 'Water'
311And the full f0 genotype:
312
313p:vr=0.5, 0.5, 0.5
314p:1.0, 0.1, -0.1, h=0.548814, vr=0.5, 0.5, 0.5
315j:0, 1, vr=0.5, 0.5, 0.592845
316n:p=1, d=Water
317n:j=0, d="|:p=0.25,r=1"
318n:j=0, d=G
319c:0, 2, 1.23, i="test=44,abc=yeah"
320c:1, 0
321
322
323######### THE END ###########
324
325Hints:
326  1. You can redirect output: genomanipulation >filename.txt
327  2. Each run can yield different results and new behaviors, but you
328     need to uncomment srand(time(0)) in genomanipulation.cpp.
329  3. This application will use custom genotype passed as
330     a commandline parameter: genomanipulation "/*9*/FULU"
331
332
Note: See TracBrowser for help on using the repository browser.