template<class TV> static inline Tuple<T,TV> weighted_average(RawArray<const T> mass, RawArray<const TV> X) { const int n = X.size(); if (mass.size()) { GEODE_ASSERT(mass.size()==X.size()); const T total = mass.sum(); TV center; for (int i=0;i<n;i++) center += mass[i]*X[i]; return tuple(total,center/total); } else { // Unweighted return tuple(n,X.mean()); } }