124#define BTATYPE btScalar **
125#define BTAROW(i) (m_A[i])
132#define BTNUB_OPTIMIZATIONS
151 for (i = 0; i < n; i += 2)
160 for (
j = i - 2;
j >= 0;
j -= 2)
222 btScalar Z11,
m11,
Z12,
m12,
Z21,
m21,
Z22,
m22,
p1,
q1,
p2,
q2, *
ex;
226 for (i = 0; i < n; i += 2)
237 for (
j = i - 2;
j >= 0;
j -= 2)
308 btScalar sum, *ell, *
dee,
dd,
p1,
p2,
q1,
q2,
Z11,
m11,
Z21,
m21,
Z22,
m22;
311 for (i = 0; i <= n - 2; i += 2)
322 for (
j = i - 6;
j >= 0;
j -= 6)
456 for (
j = i - 6;
j >= 0;
j -= 6)
543 for (i = 0; i <= n - 4; i += 4)
554 for (
j = i - 12;
j >= 0;
j -= 12)
738 for (
j = i - 12;
j >= 0;
j -= 12)
835 btScalar Z11,
m11,
Z21,
m21,
Z31,
m31,
Z41,
m41,
p1,
q1,
p2,
p3,
p4, *
ex;
840 L = L + (n - 1) * (
lskip1 + 1);
847 for (i = 0; i <= n - 4; i += 4)
858 for (
j = i - 4;
j >= 0;
j -= 4)
975 for (
j = i - 4;
j >= 0;
j -= 4)
1030 for (
int i = 0; i < n; i++)
1061 for (
int i =
i1 + 1; i <
i2; ++i)
1079 for (
int k = 0;
k <=
i2; ++
k)
1087 for (
int j =
i2 + 1;
j < n; ++
j)
1097 for (
int k = 0;
k <
i1; ++
k)
1136 if (
i1 ==
i2)
return;
1165 state[
i1] = state[
i2];
1288 for (
int k = 0;
k < n; ++
k) p[
k] =
k;
1328 btSwapProblem(
m_A,
m_x,
m_b,
m_w,
lo,
hi,
m_p,
m_state,
findex, n,
m_nub,
k,
m_nskip, 0);
1338 const int nub =
m_nub;
1350 for (
int k = 0;
k < nub; ++
k) C[
k] =
k;
1358 const int nub =
m_nub;
1361 for (
int k =
m_n - 1;
k >= nub;
k--)
1365 btSwapProblem(
m_A,
m_x,
m_b,
m_w,
m_lo,
m_hi,
m_p,
m_state,
findex,
m_n,
k,
m_n - 1 -
num_at_end,
m_nskip, 1);
1405 btSwapProblem(
m_A,
m_x,
m_b,
m_w,
m_lo,
m_hi,
m_p,
m_state,
m_findex,
m_n,
m_nC, i,
m_nskip, 1);
1422#ifdef BTNUB_OPTIMIZATIONS
1424 const int nub =
m_nub;
1426 for (;
j < nub; ++
j) Dell[
j] =
aptr[
j];
1431 for (
int j = 0;
j <
nC; ++
j) Dell[
j] =
aptr[C[
j]];
1439 for (
int j = 0;
j <
nC; ++
j)
Ltgt[
j] = ell[
j] = Dell[
j] * d[
j];
1449 btSwapProblem(
m_A,
m_x,
m_b,
m_w,
m_lo,
m_hi,
m_p,
m_state,
m_findex,
m_n,
m_nC, i,
m_nskip, 1);
1467 if (r >= n - 1)
return;
1473 for (
int i = 0; i < r;
Adst +=
nskip, ++i)
1482 for (
int i = r; i < (n - 1); ++i)
1493 for (
int i = r; i < (n - 1); ++i)
1514 for (
int j = 1;
j < n; ++
j)
1539 for (
int p = 1; p < n;
ll +=
nskip, ++p)
1569 for (
int p =
j + 1; p < n; l +=
nskip, ++p)
1583#define _BTGETA(i, j) (A[i][j])
1585#define BTGETA(i, j) ((i > j) ? _BTGETA(i, j) : _BTGETA(j, i))
1598 for (
int i = 0; i <
n2; ++i)
1615 const int p_0 = p[0];
1616 for (
int i = 0; i <
n2; ++i)
1628 for (
int i = 0; i < r; ++
Lcurr, ++i)
1675 for (
k =
j + 1;
k <
nC; ++
k)
1689 if (
j < (
nC - 1))
memmove(C +
j, C +
j + 1, (
nC -
j - 1) *
sizeof(
int));
1695 btSwapProblem(
m_A,
m_x,
m_b,
m_w,
m_lo,
m_hi,
m_p,
m_state,
m_findex,
m_n, i,
nC - 1,
m_nskip, 1);
1712 for (
int i = 0; i <
nN; ++i)
1738 for (
int i = 0; i <
nC; ++i)
1749 for (
int i = 0; i <
nN; ++i)
1769#ifdef BTNUB_OPTIMIZATIONS
1771 const int nub =
m_nub;
1773 for (;
j < nub; ++
j) Dell[
j] =
aptr[
j];
1778 for (
int j = 0;
j <
nC; ++
j) Dell[
j] =
aptr[C[
j]];
1785 for (
int j = 0;
j <
nC; ++
j) ell[
j] = Dell[
j] * d[
j];
1793 for (
int j = 0;
j <
nC; ++
j)
tmp[
j] = ell[
j];
1801 for (
int j = 0;
j <
nC; ++
j) a[C[
j]] = -
tmp[
j];
1808 for (
int j = 0;
j <
nC; ++
j) a[C[
j]] =
tmp[
j];
1822 for (
int j = 0;
j < n; ++
j) x[p[
j]] =
tmp[
j];
1829 for (
int j = 0;
j < n; ++
j) w[p[
j]] =
tmp[
j];
1844 btAssert(n > 0 &&
A && x && b &&
lo &&
hi && nub >= 0 && nub <= n);
1850 for (
int k = 0;
k < n; ++
k)
1867 const int nskip = (n);
1886 btLCP lcp(n,
nskip, nub,
A, x, b, w,
lo,
hi, &
scratchMem.L[0], &
scratchMem.d[0], &
scratchMem.Dell[0], &
scratchMem.ell[0], &
scratchMem.delta_w[0], &
scratchMem.state[0],
findex, &
scratchMem.p[0], &
scratchMem.C[0], &
scratchMem.Arows[0]);
1899 for (
int i =
adj_nub; i < n; ++i)
1921 for (
int k = i;
k < n; ++
k)
1940 w[i] =
lcp.AiC_times_qC(i, x) +
lcp.AiN_times_qN(i, x) - b[i];
1953 if (
lo[i] == 0 && w[i] >= 0)
1955 lcp.transfer_i_to_N(i);
1958 else if (
hi[i] == 0 && w[i] <= 0)
1960 lcp.transfer_i_to_N(i);
1972 lcp.transfer_i_to_C(i);
2037 const int numN =
lcp.numN();
2038 for (
int k = 0;
k < numN; ++
k)
2057 const int numC =
lcp.numC();
2117 lcp.transfer_i_to_C(i);
2122 lcp.transfer_i_to_N(i);
2127 lcp.transfer_i_to_N(i);
2131 lcp.transfer_i_from_N_to_C(
si);
2145 if (
cmd <= 3)
break;
void btLDLTAddTL(btScalar *L, btScalar *d, const btScalar *a, int n, int nskip, btAlignedObjectArray< btScalar > &scratch)
static void btSolveL1_1(const btScalar *L, btScalar *B, int n, int lskip1)
void btLDLTRemove(btScalar **A, const int *p, btScalar *L, btScalar *d, int n1, int n2, int r, int nskip, btAlignedObjectArray< btScalar > &scratch)
void btSolveL1(const btScalar *L, btScalar *B, int n, int lskip1)
void btSolveL1T(const btScalar *L, btScalar *B, int n, int lskip1)
static void btSwapRowsAndCols(BTATYPE A, int n, int i1, int i2, int nskip, int do_fast_row_swaps)
static void btSwapProblem(BTATYPE A, btScalar *x, btScalar *b, btScalar *w, btScalar *lo, btScalar *hi, int *p, bool *state, int *findex, int n, int i1, int i2, int nskip, int do_fast_row_swaps)
bool btSolveDantzigLCP(int n, btScalar *A, btScalar *x, btScalar *b, btScalar *outer_w, int nub, btScalar *lo, btScalar *hi, int *findex, btDantzigScratchMemory &scratchMem)
void btSolveLDLT(const btScalar *L, const btScalar *d, btScalar *b, int n, int nskip)
size_t btEstimateLDLTAddTLTmpbufSize(int nskip)
void btRemoveRowCol(btScalar *A, int n, int nskip, int r)
void btFactorLDLT(btScalar *A, btScalar *d, int n, int nskip1)
void btVectorScale(btScalar *a, const btScalar *d, int n)
static void btSolveL1_2(const btScalar *L, btScalar *B, int n, int lskip1)
const T & btMax(const T &a, const T &b)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
void btSetZero(T *a, int n)
btScalar btFabs(btScalar x)
btScalar btLargeDot(const btScalar *a, const btScalar *b, int n)
static T sum(const btAlignedObjectArray< T > &items)
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
btScalar Aii(int i) const
void pN_equals_ANC_times_qC(btScalar *p, btScalar *q)
btScalar *const *const *const *const m_lo
btScalar AiN_times_qN(int i, btScalar *q) const
btScalar *const *const m_ell
void transfer_i_to_N(int i)
int *const *const *const m_C
void pN_plusequals_s_times_qN(btScalar *p, btScalar s, btScalar *q)
btScalar *const *const m_d
void transfer_i_from_N_to_C(int i)
btScalar *const *const *const *const *const m_hi
void solve1(btScalar *a, int i, int dir=1, int only_transfer=0)
btScalar *const *const *const m_tmp
void pC_plusequals_s_times_qC(btScalar *p, btScalar s, btScalar *q)
void pN_plusequals_ANi(btScalar *p, int i, int sign=1)
void transfer_i_to_C(int i)
btScalar *const *const m_b
btScalar AiC_times_qC(int i, btScalar *q) const
btLCP(int _n, int _nskip, int _nub, btScalar *_Adata, btScalar *_x, btScalar *_b, btScalar *_w, btScalar *_lo, btScalar *_hi, btScalar *l, btScalar *_d, btScalar *_Dell, btScalar *_ell, btScalar *_tmp, bool *_state, int *_findex, int *p, int *c, btScalar **Arows)
btScalar *const *const *const m_w
void transfer_i_from_C_to_N(int i, btAlignedObjectArray< btScalar > &scratch)