13 #ifndef EMP_DATA_TRAIT_H 14 #define EMP_DATA_TRAIT_H 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" 27 template <
typename TARGET_T,
typename VALUE_T>
class Trait;
29 template <
typename TARGET_T>
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;
40 template <
typename VALUE_T>
44 template <
typename TARGET_T,
typename VALUE_T=
double>
50 using fun_t = std::function<value_t(target_t &)>;
61 : name(_n), desc(
""), fun(_f), range() { ; }
63 : name(_n), desc(
""), fun(_f), range(min, max) { ; }
65 : name(_n), desc(
""), fun(_f), range(_r) { ; }
72 const std::string &
GetName()
const {
return name; }
73 const std::string &
GetDesc()
const {
return desc; }
77 void SetName(
const std::string & _in) { name = _in; }
78 void SetDesc(
const std::string & _in) { desc = _in; }
92 const value_t val = fun(target);
93 return range.
CalcBin(val, num_bins);
97 return NewPtr<this_t>(*this);
102 template <
typename TARGET_T>
134 void Clear() {
for (
auto & ptr : traits) ptr.Delete(); traits.resize(0); }
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;
142 bool Has(
const std::string & name)
const {
return Find(name) < traits.
size(); }
144 template <
typename VALUE_T,
typename... EXTRA>
146 const std::function<VALUE_T(
target_t &)> & fun,
148 auto ptr = emp::NewPtr< Trait<target_t, VALUE_T> >(name, fun, std::forward<EXTRA>(extra)...);
152 std::string
EvalString(
size_t id,
target_t & target)
const {
return traits[id]->EvalString(target); }
157 for (
size_t i = 0; i < traits.
size(); i++) results[i] = traits[i]->
EvalString(target);
162 for (
size_t i = 0; i < traits.
size(); i++) results[i] = traits[i]->
EvalValue(target);
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];
179 for (
size_t i = 0; i < traits.
size(); i++) {
180 offsets[i] = traits[i]->EvalValue(target2) - traits[i]->EvalValue(target1);
const std::string & GetName() const
Definition: Trait.h:72
value_t Eval(target_t &target) const
Definition: Trait.h:85
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
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
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