Empirical
Trait.h
Go to the documentation of this file.
1 
13 #ifndef EMP_DATA_TRAIT_H
14 #define EMP_DATA_TRAIT_H
15 
16 #include <string>
17 
18 #include "../base/assert.h"
19 #include "../base/Ptr.h"
20 #include "../base/vector.h"
21 #include "../tools/Range.h"
22 #include "../tools/string_utils.h"
23 
24 namespace emp {
25 
26  // Pre-declaration of traits.
27  template <typename TARGET_T, typename VALUE_T> class Trait;
28 
29  template <typename TARGET_T>
30  class BaseTrait {
31  public:
32  virtual ~BaseTrait() { ; }
33 
34  virtual std::string EvalString(TARGET_T & target) const = 0;
35  virtual double EvalValue(TARGET_T & target) const = 0;
36  virtual size_t EvalBin(TARGET_T & target, size_t num_bins) const = 0;
37 
38  virtual Ptr<BaseTrait<TARGET_T>> Clone() const = 0;
39 
40  template <typename VALUE_T>
41  bool IsType() { return (bool) dynamic_cast<Trait<TARGET_T,VALUE_T>>(this); }
42  };
43 
44  template <typename TARGET_T, typename VALUE_T=double>
45  class Trait : public BaseTrait<TARGET_T> {
46  public:
48  using target_t = TARGET_T;
49  using value_t = VALUE_T;
50  using fun_t = std::function<value_t(target_t &)>;
52 
53  protected:
54  std::string name;
55  std::string desc;
58 
59  public:
60  Trait(const std::string & _n, const fun_t & _f)
61  : name(_n), desc(""), fun(_f), range() { ; }
62  Trait(const std::string & _n, const fun_t & _f, value_t min, value_t max)
63  : name(_n), desc(""), fun(_f), range(min, max) { ; }
64  Trait(const std::string & _n, const fun_t & _f, const range_t & _r)
65  : name(_n), desc(""), fun(_f), range(_r) { ; }
66  Trait(const Trait &) = default;
67  Trait(Trait &&) = default;
68 
69  Trait & operator=(const Trait &) = default;
70  Trait & operator=(Trait &&) = default;
71 
72  const std::string & GetName() const { return name; }
73  const std::string & GetDesc() const { return desc; }
74  const fun_t & GetFun() const { return fun; }
75  const range_t & GetRange() const { return range; }
76 
77  void SetName(const std::string & _in) { name = _in; }
78  void SetDesc(const std::string & _in) { desc = _in; }
79  void SetFun(const fun_t & _in) { fun = _in; }
80  void SetRange(const range_t & _in) { range = _in; }
81  void SetRange(value_t min, value_t max) { range.Set(min, max); }
82  void SetMin(value_t min) { range.SetLower(min); }
83  void SetMax(value_t max) { range.SetUpper(max); }
84 
85  value_t Eval(target_t & target) const { return fun(target); }
86  value_t EvalLimit(target_t & target) const { return range.Limit(fun(target)); }
87  std::string EvalString(target_t & target) const { return std::to_string(EvalLimit(target)); }
88  double EvalValue(target_t & target) const { return (double) EvalLimit(target); }
89 
90  // Determine which bin a trait fits in based on the number of bins and the range.
91  size_t EvalBin(target_t & target, size_t num_bins) const {
92  const value_t val = fun(target);
93  return range.CalcBin(val, num_bins);
94  }
95 
97  return NewPtr<this_t>(*this);
98  };
99  };
100 
102  template <typename TARGET_T>
103  class TraitSet {
104  public:
105  using target_t = TARGET_T;
107 
108  protected:
110 
111  public:
112  TraitSet() : traits(0) { ; }
113  TraitSet(TraitSet && in) : traits(in.traits) { in.traits.resize(0); }
114  TraitSet(const TraitSet & in) : traits(ClonePtrs(in.traits)) { ; }
115  ~TraitSet() { Clear(); }
116 
118  Clear();
119  traits = in.traits;
120  in.traits.resize(0);
121  return *this;
122  }
123  TraitSet & operator=(const TraitSet & in) {
124  Clear();
125  traits = ClonePtrs(in.traits);
126  return *this;
127  }
128 
129  trait_t & operator[](size_t id) { return *(traits[id]); }
130  const trait_t & operator[](size_t id) const { return *(traits[id]); }
131 
132  size_t GetSize() const { return traits.size(); }
133 
134  void Clear() { for (auto & ptr : traits) ptr.Delete(); traits.resize(0); }
135 
136  size_t Find(const std::string & name) const {
137  for (size_t i = 0; i < traits.size(); i++) {
138  if (traits[i]->GetName() == name) return i;
139  }
140  return (size_t) -1;
141  }
142  bool Has(const std::string & name) const { return Find(name) < traits.size(); }
143 
144  template <typename VALUE_T, typename... EXTRA>
145  void AddTrait(const std::string & name,
146  const std::function<VALUE_T(target_t &)> & fun,
147  EXTRA &&... extra) {
148  auto ptr = emp::NewPtr< Trait<target_t, VALUE_T> >(name, fun, std::forward<EXTRA>(extra)...);
149  traits.push_back(ptr);
150  }
151 
152  std::string EvalString(size_t id, target_t & target) const { return traits[id]->EvalString(target); }
153  double EvalValue(size_t id, target_t & target) const { return traits[id]->EvalValue(target); }
154 
156  emp::vector<std::string> results(traits.size());
157  for (size_t i = 0; i < traits.size(); i++) results[i] = traits[i]->EvalString(target);
158  return results;
159  }
161  emp::vector<double> results(traits.size());
162  for (size_t i = 0; i < traits.size(); i++) results[i] = traits[i]->EvalValue(target);
163  return results;
164  }
165 
166  // Determine which bin a trait fits in based on the number of bins and the range.
167  size_t EvalBin(target_t & target, emp::vector<size_t> bin_counts) const {
168  size_t mult = 1;
169  size_t id = 0;
170  for (size_t i = 0; i < traits.size(); i++) {
171  id += traits[i]->EvalBin(target, bin_counts[i]) * mult;
172  mult *= bin_counts[i];
173  }
174  return id;
175  }
176 
177  emp::vector<double> CalcOffsets(target_t & target1, target_t & target2) const {
178  emp::vector<double> offsets(traits.size());
179  for (size_t i = 0; i < traits.size(); i++) {
180  offsets[i] = traits[i]->EvalValue(target2) - traits[i]->EvalValue(target1);
181  }
182  return offsets;
183  }
184  };
185 
186 }
187 
188 #endif
const std::string & GetName() const
Definition: Trait.h:72
value_t Eval(target_t &target) const
Definition: Trait.h:85
Definition: Trait.h:27
size_t Find(const std::string &name) const
Definition: Trait.h:136
std::function< value_t(target_t &)> fun_t
Definition: Trait.h:50
void Clear()
Definition: Trait.h:134
std::string to_string(ALL_TYPES &&...all_values)
Definition: string_utils.h:511
Ptr< BaseTrait< TARGET_T > > Clone() const
Definition: Trait.h:96
Trait(const std::string &_n, const fun_t &_f)
Definition: Trait.h:60
Definition: Trait.h:30
std::string name
Unique name for this trait.
Definition: Trait.h:54
emp::vector< double > EvalValues(target_t &target) const
Definition: Trait.h:160
virtual ~BaseTrait()
Definition: Trait.h:32
void SetUpper(T u)
Definition: Range.h:44
virtual double EvalValue(TARGET_T &target) const =0
trait_t & operator[](size_t id)
Definition: Trait.h:129
TraitSet & operator=(TraitSet &&in)
Definition: Trait.h:117
void SetDesc(const std::string &_in)
Definition: Trait.h:78
bool IsType()
Definition: Trait.h:41
TraitSet()
Definition: Trait.h:112
size_t CalcBin(T value, size_t num_bins) const
Definition: Range.h:35
T Limit(T _in) const
Force a value into range.
Definition: Range.h:54
void push_back(PB_Ts &&...args)
Definition: vector.h:189
void SetRange(const range_t &_in)
Definition: Trait.h:80
virtual std::string EvalString(TARGET_T &target) const =0
const trait_t & operator[](size_t id) const
Definition: Trait.h:130
emp::vector< emp::Ptr< trait_t > > traits
Definition: Trait.h:109
double EvalValue(size_t id, target_t &target) const
Definition: Trait.h:153
void SetName(const std::string &_in)
Definition: Trait.h:77
void AddTrait(const std::string &name, const std::function< VALUE_T(target_t &)> &fun, EXTRA &&...extra)
Definition: Trait.h:145
std::string EvalString(target_t &target) const
Definition: Trait.h:87
size_t size() const
Definition: vector.h:151
emp::vector< Ptr< T > > ClonePtrs(const emp::vector< Ptr< T >> &in)
Copy a vector of objects pointed to by using their Clone() member function; return vector...
Definition: Ptr.h:841
fun_t fun
Function to retrieve trait value from target.
Definition: Trait.h:56
TraitSet(const TraitSet &in)
Definition: Trait.h:114
VALUE_T value_t
Definition: Trait.h:49
const std::string & GetDesc() const
Definition: Trait.h:73
virtual Ptr< BaseTrait< TARGET_T > > Clone() const =0
auto Find(const MAP_T &in_map, const KEY_T &key, const typename MAP_T::mapped_type &dval)
Definition: map_utils.h:29
Trait(const std::string &_n, const fun_t &_f, const range_t &_r)
Definition: Trait.h:64
emp::vector< std::string > EvalStrings(target_t &target) const
Definition: Trait.h:155
void SetFun(const fun_t &_in)
Definition: Trait.h:79
TraitSet & operator=(const TraitSet &in)
Definition: Trait.h:123
size_t EvalBin(target_t &target, size_t num_bins) const
Definition: Trait.h:91
const fun_t & GetFun() const
Definition: Trait.h:74
size_t GetSize() const
Definition: Trait.h:132
void SetMin(value_t min)
Definition: Trait.h:82
value_t EvalLimit(target_t &target) const
Definition: Trait.h:86
size_t EvalBin(target_t &target, emp::vector< size_t > bin_counts) const
Definition: Trait.h:167
void resize(size_t new_size)
Definition: vector.h:161
TraitSet(TraitSet &&in)
Definition: Trait.h:113
TARGET_T target_t
Definition: Trait.h:48
double EvalValue(target_t &target) const
Definition: Trait.h:88
If we are in emscripten, make sure to include the header.
Definition: array.h:37
Definition: Ptr.h:711
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
range_t range
Limits on legal values (defaults to extremes)
Definition: Trait.h:57
void SetLower(T l)
Definition: Range.h:43
Trait(const std::string &_n, const fun_t &_f, value_t min, value_t max)
Definition: Trait.h:62
std::string desc
Full description explaining this trait.
Definition: Trait.h:55
A TraitSet houses a collection of traits and can trigger them to all be evaluated at once...
Definition: Trait.h:103
TRAIT_TYPES... target_t
Definition: Trait.h:105
const range_t & GetRange() const
Definition: Trait.h:75
std::string EvalString(size_t id, target_t &target) const
Definition: Trait.h:152
~TraitSet()
Definition: Trait.h:115
virtual size_t EvalBin(TARGET_T &target, size_t num_bins) const =0
emp::vector< double > CalcOffsets(target_t &target1, target_t &target2) const
Definition: Trait.h:177
void Set(T _l, T _u)
Definition: Range.h:45
void SetRange(value_t min, value_t max)
Definition: Trait.h:81
bool Has(const std::string &name) const
Definition: Trait.h:142
void SetMax(value_t max)
Definition: Trait.h:83