finalyze moving

This commit is contained in:
2025-03-12 14:28:04 +03:00
parent f840006398
commit 033bbce220
774 changed files with 0 additions and 0 deletions

182
src/Predictor/Lib/Ls.cpp Normal file
View 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;
}
//=***