april  1.0.0
...
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
dna.h
Go to the documentation of this file.
1 /* ========================================================================= */
2 /* ------------------------------------------------------------------------- *//*
12 
13 
14  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15  Please read COPYING and README files in root folder
16  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17 */
18 /* ------------------------------------------------------------------------- */
19 /* ========================================================================= */
20 #ifndef __DNA_INC__
21 #define __DNA_INC__
22 //
23 //
24 //
25 //
26 /* INCLUDES ------------------------------------------------------------ */
27 
28 #include <april/april.h>
29 #include <april/logic/uniqueid.h>
30 #include <april/logic/dnaview.h>
31 
32 #include <QSettings>
33 #include <QVector>
34 
35 /* INCLUDES ============================================================ */
36 //
37 //
38 //
39 //
40 /* DEFINITIONS --------------------------------------------------------- */
41 
42 namespace april {
43 
44 class World;
45 class Factory;
46 
47 /* DEFINITIONS ========================================================= */
48 //
49 //
50 //
51 //
52 /* CLASS --------------------------------------------------------------- */
53 
62 class
64  DNA {
65 
66  //
67  //
68  //
69  //
70  /* DEFINITIONS ----------------------------------------------------- */
71 
72  friend class DNAView;
73  friend class ActorFactory;
74 
75 public:
76 
77 
79  struct Partition {
80 
82  ID id_;
83 
85  int start_;
86 
88  int count_;
89 
90 
92  bool operator == ( const Partition & other ) const
93  {
94  return ( ( id_ == other.id_ ) &&
95  ( start_ == other.start_ ) &&
96  ( count_ == other.count_ ) );
97  }
99  bool operator != ( const Partition & other ) const
100  {
101  return !operator==(other);
102  }
103  };
104 
105 public:
106 
108  struct InitData {
109  ID kind_;
110  quint64 cost_;
111  quint64 age_;
112  quint64 energy_;
113  };
114 
115 public:
116 
118  enum Predef {
119  OffKind = 0,
132  OffMax,
133  OffLastList = OffReflexes+1
134  /* the list of brains, actuators, sensors, reflex id's follows */
135  };
136 
137  /* DEFINITIONS ===================================================== */
138  //
139  //
140  //
141  //
142  /* DATA ------------------------------------------------------------ */
143 
144 protected:
145 
147  QVector<Partition> parts_;
148 
150  QList<qreal> values_;
151 
153  QList<quint64> values_i_;
154 
155 
156  /* DATA ============================================================ */
157  //
158  //
159  //
160  //
161  /* FUNCTIONS ------------------------------------------------------- */
162 
163 public:
164 
165 
169  DNA ( void );
170 
184  DNA ( const World * w, ID kind );
185 
189  ~DNA ( void );
190 
192 
200  bool fromMerge (
201  const DNA & p1,
202  const DNA & p2
203  );
204 
206  bool isValid ( void ) const;
207 
209  bool operator == ( const DNA & other ) const;
210 
211 
212 
213  /* OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO */
216 
217 
218 
220 
225  DNAView getView ( ID id, Factory * f = NULL );
226 
228 
239  DNAView getView ( ID id, int sz, Factory * f = NULL );
240 
242  ID kind ( void ) const;
243 
245  quint64 cost ( void ) const
246  {
247  Q_ASSERT(values_i_.length() >= OffMax );
248  return values_i_.at( OffCost );
249  }
250 
252  quint64 age ( void ) const
253  {
254  Q_ASSERT(values_i_.length() >= OffMax );
255  return values_i_.at( OffAge );
256  }
257 
259  quint64 energy ( void ) const
260  {
261  Q_ASSERT(values_i_.length() >= OffMax );
262  return values_i_.at( OffStartEnergy );
263  }
264 
266  QList<ID> brains ( void ) const;
267 
269  QList<ID> actuators ( void ) const;
270 
272  QList<ID> sensors ( void ) const;
273 
275  QList<ID> reflexes ( void ) const;
276 
278  QVector<Partition> partitions ( void ) const
279  { return parts_; }
280 
282  /* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo */
283 
284 
285  /* OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO */
288 
289 
291 
297  bool addBrain ( ID id );
298 
300 
306  bool addActuator ( ID id );
307 
309 
315  bool addSensor ( ID id );
316 
318 
324  bool addReflex ( ID id );
325 
326 
328  /* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo */
329 
330 
331 
333  bool save ( QSettings & stg ) const;
334 
336  bool load ( QSettings & stg );
337 
338 
340  static qreal dnaNoise ( void );
341 
342 
344  int findID ( ID id ) const;
345 
347 
351  void initDNA ( const InitData & init );
352 
354 
359  void reinitDNA ( const DNA & src, bool clear_content );
360 
361 
362  /* OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO */
365 
366 
367 private:
368 
369  bool mergeAllVals (
370  const DNA & p1,
371  const DNA & p2
372  );
373 
374  int mergeUniteEl (
375  int iter_1,
376  int iter_2,
377  int i_max_1,
378  int i_max_2,
379  const DNA & p1,
380  const DNA & p2
381  );
382 
383  bool mergeBrains (
384  const DNA & p1,
385  const DNA & p2
386  );
387 
388  void mergeAllParts (
389  const DNA & p1,
390  const DNA & p2
391  );
392 
393  void mergeParts (
394  const Partition & part_1,
395  const Partition & part_2,
396  const DNA & p1,
397  const DNA & p2
398  );
399 
400  void mergePart (
401  const Partition & part,
402  const DNA & p
403  );
404 
405 
407  /* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo */
408 
409 
410 #ifdef APRIL_INTERNAL_TESTS
411 public:
412  void setParts ( QVector<Partition> & new_val )
413  { parts_ = new_val; }
414  void setValues ( QList<qreal> & new_val )
415  { values_ = new_val; }
416  void setValuesI ( QList<quint64> & new_val )
417  { values_i_ = new_val; }
418 #endif
419 
420 private:
421 
423  bool getViewNotFound (
424  DNAView & view,
425  ID id,
426  Factory * f
427  );
428 
429 
430  /* FUNCTIONS ======================================================= */
431  //
432  //
433  //
434  //
435 
436 }; /* class DNA */
437 
438 /* CLASS =============================================================== */
439 //
440 //
441 //
442 //
443 
444 } // namespace april
445 
446 #endif // __DNA_INC__
447 /* ------------------------------------------------------------------------- */
448 /* ========================================================================= */