File: ruletable_algo.h

package info (click to toggle)
golly 3.3-1.1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 20,176 kB
  • sloc: cpp: 72,638; ansic: 25,919; python: 7,921; sh: 4,245; objc: 3,721; java: 2,781; xml: 1,362; makefile: 530; javascript: 279; perl: 69
file content (53 lines) | stat: -rw-r--r-- 1,947 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// This file is part of Golly.
// See docs/License.html for the copyright notice.

#ifndef RULETABLE_ALGO_H
#define RULETABLE_ALGO_H
#include "ghashbase.h"
#include <string>
#include <vector>
#include <utility>
/**
 *   An algo that takes a rule table.
 */
class ruletable_algo : public ghashbase {

public:

   ruletable_algo() ;
   virtual ~ruletable_algo() ;
   virtual state slowcalc(state nw, state n, state ne, state w, state c,
                          state e, state sw, state s, state se) ;
   virtual const char* setrule(const char* s) ;
   virtual const char* getrule() ;
   virtual const char* DefaultRule() ;
   virtual int NumCellStates() ;
   static void doInitializeAlgoInfo(staticAlgoInfo &) ;

   // these two methods are needed for RuleLoader algo
   bool IsDefaultRule(const char* rulename);
   const char* LoadTable(FILE* rulefile, int lineno, char endchar, const char* s);

protected:

   std::string LoadRuleTable(std::string filename);
   void PackTransitions(const std::string& symmetries, int n_inputs, 
                        const std::vector< std::pair< std::vector< std::vector<state> >, state> > & transition_table);
   void PackTransition(const std::vector< std::vector<state> > & inputs, state output);
                        
protected:

   std::string current_rule;
   unsigned int n_states;
   enum TNeighborhood { vonNeumann, Moore, hexagonal, oneDimensional } neighborhood; 
   static const int N_SUPPORTED_NEIGHBORHOODS = 4;
   static const std::string neighborhood_value_keywords[N_SUPPORTED_NEIGHBORHOODS];

   // we use a lookup table to match inputs to outputs:
   typedef unsigned long long int TBits; // we can use unsigned int if we hit portability issues (not much slower)
   std::vector< std::vector< std::vector<TBits> > > lut; // TBits lut[neighbourhood_size][n_states][n_compressed_rules];
   unsigned int n_compressed_rules;
   std::vector<state> output; // state output[n_rules];

};
#endif