finalyze moving
This commit is contained in:
182
src/Predictor/Lib/Ls.cpp
Normal file
182
src/Predictor/Lib/Ls.cpp
Normal file
@@ -0,0 +1,182 @@
|
||||
// LS.cpp: implementation of the LS class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "Ls.h"
|
||||
|
||||
extern void s_s_intersect (long l1, long u1, long l2, long u2, long * l3, long *u3);
|
||||
extern void r_s_intersect (long l1, long u1, long s1, long l2, long u2,
|
||||
long * l3, long * u3, long * s3);
|
||||
extern void r_r_intersect (long l1, long u1, long s1, long l2, long u2, long s2,
|
||||
long * l3, long * u3, long * s3);
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
#if defined (_MSC_VER) || (defined (__GNUG__) && (__GNUC__ < 3))
|
||||
/*template <class T>
|
||||
T min(T a, T b)
|
||||
{
|
||||
return a < b ? a : b;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
T max(T a, T b)
|
||||
{
|
||||
return a >= b ? a : b;
|
||||
}*/
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
LS::LS()
|
||||
{
|
||||
// create empty LS
|
||||
Lower = 0;
|
||||
Upper = -1;
|
||||
Stride = 1;
|
||||
}
|
||||
|
||||
LS::~LS()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
LS::LS(long ALower, long AUpper, long AStride)
|
||||
{
|
||||
|
||||
if (ALower <= AUpper) {
|
||||
Lower = ALower;
|
||||
Upper = AUpper;
|
||||
Stride = AStride;
|
||||
} else {
|
||||
Lower = 0;
|
||||
Upper = -1;
|
||||
Stride = 1;
|
||||
}
|
||||
}
|
||||
|
||||
bool operator == (const LS& x, const LS& y)
|
||||
{
|
||||
return x.Lower == y.Lower && x.Upper == y.Upper && x.Stride == y.Stride;
|
||||
}
|
||||
|
||||
bool operator < (const LS& x, const LS& y)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
LS LS::operator ^ (const LS & x) const
|
||||
{
|
||||
LS temp;
|
||||
|
||||
if ((Stride == 1) && (x.Stride == 1)) {
|
||||
s_s_intersect(Lower, Upper, x.Lower, x.Upper, &temp.Lower, &temp.Upper);
|
||||
temp.Stride = 1;
|
||||
} else if (Stride == 1) {
|
||||
r_s_intersect(x.Lower, x.Upper, x.Stride, Lower, Upper,
|
||||
&temp.Lower, &temp.Upper, &temp.Stride);
|
||||
} else if (x.Stride == 1) {
|
||||
r_s_intersect(Lower, Upper, Stride, x.Lower, x.Upper,
|
||||
&temp.Lower, &temp.Upper, &temp.Stride);
|
||||
} else {
|
||||
r_r_intersect(Lower, Upper, Stride, x.Lower, x.Upper, x.Stride,
|
||||
&temp.Lower, &temp.Upper, &temp.Stride);
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
long LS::GetLSSize() const
|
||||
{
|
||||
//====
|
||||
//printf("GETSIZE Lower=%d Upper=%d Stride=%d\n",Lower,Upper,Stride);
|
||||
//was return IsEmpty() ? 0 : Upper - Lower + 1;
|
||||
return IsEmpty() ? 0 : (Upper - Lower) / Stride + 1;
|
||||
//=***
|
||||
}
|
||||
|
||||
bool LS::IsEmpty() const
|
||||
{
|
||||
return (Lower > Upper) ? true : false;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LS <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// i = A * j * B ==> j = (i - B) / A <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
void LS::transform(long A, long B, long daDimSize)
|
||||
{
|
||||
// printf("LS::transform %d %d %d \n",A,B,daDimSize);
|
||||
|
||||
long daB1, daB2;
|
||||
long daLower, daUpper;
|
||||
long displace, displace_0, temp;
|
||||
|
||||
daB1 = (Lower - B) / A;
|
||||
daB2 = (Upper - B) / A;
|
||||
displace = (Lower - B) % A;
|
||||
displace_0 = (Upper - B) % A;
|
||||
if (A < 0)
|
||||
{
|
||||
temp = displace;
|
||||
displace = displace_0;
|
||||
displace_0 = -temp;
|
||||
}
|
||||
daLower = min(daB1, daB2);
|
||||
daUpper = max(daB1, daB2);
|
||||
|
||||
if ((daLower < 0 && daUpper < 0) ||
|
||||
(daLower >= daDimSize) ||
|
||||
(daUpper == 0 && displace_0 < 0))
|
||||
{
|
||||
Lower = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
if (displace != 0 && daUpper != 0)
|
||||
daLower++;
|
||||
if (daLower < 0)
|
||||
daLower = 0;
|
||||
if (daUpper >= daDimSize)
|
||||
daUpper = daDimSize - 1;
|
||||
if (daUpper < daLower)
|
||||
{
|
||||
Lower = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
Lower = daLower;
|
||||
Upper = daUpper;
|
||||
|
||||
}
|
||||
|
||||
bool LS::IsBoundIn(long ALeftBSize, long ARightBSize) const
|
||||
{
|
||||
// printf("IsBoundIn %d %d vs %d\n",ALeftBSize,ARightBSize,GetLSSize());
|
||||
if (ALeftBSize > GetLSSize())
|
||||
return false;
|
||||
if (ARightBSize > GetLSSize())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LS::IsLeft(long elem) const
|
||||
{
|
||||
return IsEmpty() ? false : Lower > elem;
|
||||
}
|
||||
|
||||
bool LS::IsRight(long elem) const
|
||||
{
|
||||
return IsEmpty() ? false : Upper < elem;
|
||||
}
|
||||
|
||||
//====
|
||||
long LS::GetLower()
|
||||
{ return Lower;
|
||||
}
|
||||
|
||||
long LS::GetUpper()
|
||||
{ return Upper;
|
||||
}
|
||||
//=***
|
||||
Reference in New Issue
Block a user