15 #include <type_traits> 17 #include <unordered_map> 21 #include <unordered_set> 24 #include "../base/vector.h" 25 #include "../meta/type_traits.h" 32 typename std::enable_if<!emp::is_ptr_type<typename C::value_type>::value && std::is_scalar<typename C::value_type>::value,
typename C::value_type>::type
36 for (
auto element : elements) {
50 for (
auto element : elements) {
60 typename std::enable_if<!emp::is_ptr_type<typename C::value_type>::value,
double>::type
64 std::map<typename C::value_type, int> counts;
65 for (
auto element : elements) {
66 if (counts.find(element) != counts.end()) {
75 for (
auto element : counts) {
76 double p = double(element.second)/elements.size();
77 result += p *
Log2(p);
85 typename std::enable_if<emp::is_ptr_type<typename C::value_type>::value,
double>::type
90 std::map<pointed_at, int> counts;
91 for (
auto element : elements) {
92 if (counts.find(*element) != counts.end()) {
101 for (
auto element : counts) {
102 double p = double(element.second)/elements.size();
103 result += p * log2(p);
111 template <
typename C>
112 typename std::enable_if<!emp::is_ptr_type<typename C::value_type>::value && std::is_scalar<typename C::value_type>::value,
double>::type
116 double mean = (double)
Sum(elements)/elements.size();
117 for (
auto element : elements) {
120 return var/elements.size();
125 template <
typename C>
126 typename std::enable_if<emp::is_ptr_type<typename C::value_type>::value && std::is_scalar<typename emp::remove_ptr_type<typename C::value_type>::type >::value,
double>::type
130 double mean = (double)
Sum(elements)/elements.size();
131 for (
auto element : elements) {
132 var +=
emp::Pow(*element - mean, 2);
134 return var/elements.size();
140 template <
typename C>
143 return (
double)
Sum(elements)/elements.size();
149 template <
typename C>
156 template <
typename C>
157 typename std::enable_if<!emp::is_ptr_type<typename C::value_type>::value,
int>::type
160 std::set<typename C::value_type> unique_elements(elements.begin(),
162 return unique_elements.size();
167 template <
typename C>
168 typename std::enable_if<emp::is_ptr_type<typename C::value_type>::value,
int>::type
172 std::set<pointed_at> unique_elements;
173 for (
auto element : elements) {
174 unique_elements.insert(*element);
177 return unique_elements.size();
181 template <
typename C,
typename RET_TYPE,
typename ARG_TYPE>
182 RET_TYPE
MaxResult(std::function<RET_TYPE(ARG_TYPE)> & fun, C & elements){
183 auto best = fun(elements.front());
184 for (
auto element : elements){
185 auto result = fun(element);
186 if (result > best) best = result;
192 template <
typename C,
typename RET_TYPE,
typename ARG_TYPE>
193 RET_TYPE
MinResult(std::function<RET_TYPE(ARG_TYPE)> & fun, C & elements){
194 auto best = fun(elements.front());
195 for (
auto element : elements){
196 auto result = fun(element);
197 if (result < best) best = result;
204 template <
typename C,
typename RET_TYPE,
typename ARG_TYPE>
205 typename std::enable_if<std::is_scalar<RET_TYPE>::value,
double>::type
206 MeanResult(std::function<RET_TYPE(ARG_TYPE)> & fun, C & elements){
207 double cumulative_value = 0;
209 for (
auto element : elements){
211 cumulative_value += fun(element);
213 return (cumulative_value / count);
217 template <
typename C,
typename RET_TYPE,
typename ARG_TYPE>
220 for (
auto element : elements){
RET_TYPE MinResult(std::function< RET_TYPE(ARG_TYPE)> &fun, C &elements)
Run the provided function on every member of a container and return the MINIMUM result.
Definition: stats.h:193
RET_TYPE MaxResult(std::function< RET_TYPE(ARG_TYPE)> &fun, C &elements)
Run the provided function on every member of a container and return the MAXIMUM result.
Definition: stats.h:182
REAL_TYPE sfinae_decoy
Definition: meta.h:93
std::enable_if<!emp::is_ptr_type< typename C::value_type >::value, int >::type UniqueCount(C &elements)
Count the number of unique elements in a container.
Definition: stats.h:158
std::enable_if<!emp::is_ptr_type< typename C::value_type >::value, double >::type ShannonEntropy(C &elements)
Calculate Shannon Entropy of the members of the container passed.
Definition: stats.h:61
emp::sfinae_decoy< double, typename C::value_type > StandardDeviation(C &elements)
Definition: stats.h:151
void push_back(PB_Ts &&...args)
Definition: vector.h:189
emp::vector< RET_TYPE > ApplyFunction(std::function< RET_TYPE(ARG_TYPE)> &fun, C &elements)
Run the provided function on every member of a container and return a vector of ALL results...
Definition: stats.h:218
emp::sfinae_decoy< double, typename C::value_type > Mean(C &elements)
Definition: stats.h:142
static constexpr double Log2(double x)
Compile-time log base 2 calculator.
Definition: math.h:120
std::enable_if< std::is_scalar< RET_TYPE >::value, double >::type MeanResult(std::function< RET_TYPE(ARG_TYPE)> &fun, C &elements)
Definition: stats.h:206
static constexpr type_if< T, std::is_integral > Pow(T base, T p)
A fast (O(log p)) integral-power command.
Definition: math.h:150
T type
Definition: type_traits.h:30
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
std::enable_if<!emp::is_ptr_type< typename C::value_type >::value &&std::is_scalar< typename C::value_type >::value, double >::type Variance(C &elements)
Definition: stats.h:113
std::enable_if<!emp::is_ptr_type< typename C::value_type >::value &&std::is_scalar< typename C::value_type >::value, typename C::value_type >::type Sum(C &elements)
Definition: stats.h:33