Skip to content

Commit 3979a96

Browse files
committed
quantile
Signed-off-by: Mohit Chhaya <[email protected]>
1 parent a198332 commit 3979a96

File tree

1 file changed

+51
-46
lines changed

1 file changed

+51
-46
lines changed

cpp/csp/cppnodes/statsimpl.h

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
#ifdef __linux__
1313
#include <ext/pb_ds/assoc_container.hpp>
1414
#include <ext/pb_ds/tree_policy.hpp>
15+
#else
16+
#include <boost/multi_index_container.hpp>
17+
#include <boost/multi_index/ordered_index.hpp>
18+
#include <boost/multi_index/ranked_index.hpp>
1519
#endif
1620

1721
namespace csp::cppnodes
@@ -1099,6 +1103,9 @@ void ost_erase( ost<Comparator> &t, double & v )
10991103
auto it = t.find_by_order( rank );
11001104
t.erase( it );
11011105
}
1106+
#else
1107+
template <typename Comparator>
1108+
using ost = boost::multi_index::multi_index_container<double, boost::multi_index::indexed_by<boost::multi_index::ranked_non_unique<boost::multi_index::identity<double>, Comparator>>>;
11021109
#endif
11031110

11041111
class Quantile
@@ -1214,52 +1221,50 @@ class Quantile
12141221
break;
12151222
}
12161223
#else
1217-
auto it = m_tree.begin();
1218-
std::advance( it, ft );
1219-
switch ( m_interpolation )
1224+
switch (m_interpolation)
12201225
{
1221-
case LINEAR:
1222-
if( ft == target )
1223-
{
1224-
qtl = *it;
1225-
}
1226-
else
1227-
{
1228-
double lower = *it;
1229-
double higher = *++it;
1230-
qtl = ( 1 - target + ft ) * lower + ( 1 - ct + target ) * higher;
1231-
}
1232-
break;
1233-
case LOWER:
1234-
qtl = *it;
1235-
break;
1236-
case HIGHER:
1237-
qtl = ( ft == ct ? *it : *++it );
1238-
break;
1239-
case MIDPOINT:
1240-
if( ft == target )
1241-
{
1242-
qtl = *it;
1243-
}
1244-
else
1245-
{
1246-
double lower = *it;
1247-
double higher = *++it;
1248-
qtl = ( higher+lower ) / 2;
1249-
}
1250-
break;
1251-
case NEAREST:
1252-
if( target - ft <= ct - target )
1253-
{
1254-
qtl = *it;
1255-
}
1256-
else
1257-
{
1258-
qtl = *++it;
1259-
}
1260-
break;
1261-
default:
1262-
break;
1226+
case LINEAR:
1227+
if (ft == target)
1228+
{
1229+
qtl = *m_tree.get<0>().nth(ft);
1230+
}
1231+
else
1232+
{
1233+
double lower = *m_tree.get<0>().nth(ft);
1234+
double higher = *m_tree.get<0>().nth(ct);
1235+
qtl = (1 - target + ft) * lower + (1 - ct + target) * higher;
1236+
}
1237+
break;
1238+
case LOWER:
1239+
qtl = *m_tree.get<0>().nth(ft);
1240+
break;
1241+
case HIGHER:
1242+
qtl = *m_tree.get<0>().nth(ct);
1243+
break;
1244+
case MIDPOINT:
1245+
if (ft == target)
1246+
{
1247+
qtl = *m_tree.get<0>().nth(ft);
1248+
}
1249+
else
1250+
{
1251+
double lower = *m_tree.get<0>().nth(ft);
1252+
double higher = *m_tree.get<0>().nth(ct);
1253+
qtl = (higher + lower) / 2;
1254+
}
1255+
break;
1256+
case NEAREST:
1257+
if (target - ft < ct - target)
1258+
{
1259+
qtl = *m_tree.get<0>().nth(ft);
1260+
}
1261+
else
1262+
{
1263+
qtl = *m_tree.get<0>().nth(ct);
1264+
}
1265+
break;
1266+
default:
1267+
break;
12631268
}
12641269
#endif
12651270
return qtl;
@@ -1270,7 +1275,7 @@ class Quantile
12701275
#ifdef __linux__
12711276
ost<std::less_equal<double>> m_tree;
12721277
#else
1273-
std::multiset<double> m_tree;
1278+
ost<std::less<double>> m_tree;
12741279
#endif
12751280
std::vector<Dictionary::Data> m_quants;
12761281
int64_t m_interpolation;

0 commit comments

Comments
 (0)