Skip to content

Commit 58dba81

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

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

cpp/csp/cppnodes/statsimpl.h

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,7 +1370,10 @@ class Rank
13701370
else
13711371
m_mintree.insert( x );
13721372
#else
1373-
m_tree.insert( x );
1373+
if( m_method == MAX )
1374+
m_maxtree.insert( x );
1375+
else
1376+
m_mintree.insert( x );
13741377
#endif
13751378
}
13761379
}
@@ -1385,21 +1388,20 @@ class Rank
13851388
else
13861389
ost_erase( m_mintree, x );
13871390
#else
1388-
m_tree.erase( m_tree.find( x ) );
1391+
if ( m_method == MAX )
1392+
m_maxtree.erase ( m_maxtree.find( x ) );
1393+
else
1394+
m_mintree.erase ( m_mintree.find( x ) );
13891395
#endif
13901396
}
13911397
}
13921398

13931399
void reset()
13941400
{
1395-
#ifdef __linux__
13961401
if( m_method == MAX )
13971402
m_maxtree.clear();
13981403
else
13991404
m_mintree.clear();
1400-
#else
1401-
m_tree.clear();
1402-
#endif
14031405
}
14041406

14051407
double compute() const
@@ -1442,30 +1444,39 @@ class Rank
14421444
}
14431445
}
14441446
#else
1445-
if( likely( !isnan( m_lastval ) && m_tree.size() > 0 ) )
1447+
if( likely( !isnan( m_lastval ) && ( ( m_method == MAX && m_maxtree.size() > 0 ) || m_mintree.size() > 0 ) ) )
14461448
{
14471449
switch( m_method )
14481450
{
14491451
case MIN:
14501452
{
1451-
return std::distance( m_tree.begin(), m_tree.find( m_lastval ) );
1453+
if ( m_mintree.size() == 1 )
1454+
return 0;
1455+
return m_mintree.get<0>().find_rank( m_lastval );
14521456
}
14531457
case MAX:
14541458
{
1455-
auto end_range = m_tree.equal_range( m_lastval ).second;
1456-
return std::distance( m_tree.begin(), std::prev( end_range ) );
1459+
if ( m_maxtree.size() == 1 )
1460+
return 0;
1461+
return m_maxtree.size() - 1 - m_maxtree.get<0>().find_rank( m_lastval );
14571462
}
14581463
case AVG:
14591464
{
1460-
auto range = m_tree.equal_range( m_lastval );
1461-
return std::distance( m_tree.begin(), range.first ) + ( double )std::distance( range.first, std::prev( range.second ) ) / 2;
1465+
if ( m_mintree.size() == 1 )
1466+
return 0;
1467+
1468+
int min_rank = m_mintree.get<0>().find_rank( m_lastval );
1469+
int max_rank = min_rank;
1470+
auto it = m_mintree.get<0>().nth( min_rank );
1471+
it++;
1472+
for( ; it != m_mintree.end() && *it == m_lastval ; it++ ) max_rank++;
1473+
return ( double )( min_rank + max_rank ) / 2;
14621474
}
14631475
default:
14641476
break;
14651477
}
14661478
}
14671479
#endif
1468-
14691480
return std::numeric_limits<double>::quiet_NaN();
14701481
}
14711482

@@ -1475,7 +1486,8 @@ class Rank
14751486
ost<std::less_equal<double>> m_mintree;
14761487
ost<std::greater_equal<double>> m_maxtree;
14771488
#else
1478-
std::multiset<double> m_tree;
1489+
ost<std::less<double>> m_mintree;
1490+
ost<std::greater<double>> m_maxtree;
14791491
#endif
14801492
double m_lastval;
14811493

0 commit comments

Comments
 (0)