12
12
#ifdef __linux__
13
13
#include < ext/pb_ds/assoc_container.hpp>
14
14
#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>
15
19
#endif
16
20
17
21
namespace csp ::cppnodes
@@ -1099,6 +1103,9 @@ void ost_erase( ost<Comparator> &t, double & v )
1099
1103
auto it = t.find_by_order ( rank );
1100
1104
t.erase ( it );
1101
1105
}
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>>>;
1102
1109
#endif
1103
1110
1104
1111
class Quantile
@@ -1214,52 +1221,50 @@ class Quantile
1214
1221
break ;
1215
1222
}
1216
1223
#else
1217
- auto it = m_tree.begin ();
1218
- std::advance ( it, ft );
1219
- switch ( m_interpolation )
1224
+ switch (m_interpolation)
1220
1225
{
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 ;
1263
1268
}
1264
1269
#endif
1265
1270
return qtl;
@@ -1270,7 +1275,7 @@ class Quantile
1270
1275
#ifdef __linux__
1271
1276
ost<std::less_equal<double >> m_tree;
1272
1277
#else
1273
- std::multiset <double > m_tree;
1278
+ ost< std::less <double > > m_tree;
1274
1279
#endif
1275
1280
std::vector<Dictionary::Data> m_quants;
1276
1281
int64_t m_interpolation;
0 commit comments