8 int choleski_solve(
double *a,
double *b,
int nsize,
int flag);
9 int inverse (
double *a,
int nsize);
10 int isymp(
int row,
int col);
12 int indeces_from_set(
int *indeces,
int set,
int set_size,
int n);
13 int binomial_coeficient(
int n,
int k);
15 inline int isymp(
int row,
int col)
24 if(row < col) k= row + col *(col -1)/2;
25 else k= col + row * (row - 1)/2;
31 inline int binomial_coeficient(
int n,
int k)
83 inline int indeces_from_set(
int *indeces,
int set,
int set_size,
int n)
94 if(
set > binomial_coeficient(n, set_size) )
99 for( i =0,j=0;i<set_size-1;i++,j=indeces[i-1]+1)
101 k = binomial_coeficient( n - j - 1, set_size - i - 1);
106 k = binomial_coeficient( n - j - 1, set_size - i - 1);
111 indeces[i] = j+
set-1;
117 int decompose (
double *,
int);
118 int foresub (
double *,
double *,
int);
119 int backsub (
double *,
double *,
int);
122 #define NOT_SOLVABLE 0 126 inline int choleski_solve (
double *a,
double *b,
int nsize,
int flag)
135 if (flag < 1 && flag > 3)
139 if (! decompose (a, nsize))
return NOT_SOLVABLE;
141 if (flag == 1)
return SOLVED;
144 if (! foresub (a, b, nsize))
return NOT_SOLVABLE;
148 if (! backsub (a, b, nsize))
return NOT_SOLVABLE;
150 if (flag == 2)
return SOLVED;
160 inline int decompose (
double *a,
int nsize)
174 int i, j, k, m, n = 2;
177 for (k = 0; k < nsize; k++)
183 for (i = 0; i < k; i++)
188 for (j = 0; j < i; j++)
190 sum += *ap4++ * *ap5++;
194 *ap3 = (*ap3 - sum) / *ap2;ap3++;
199 for (j = 0; j < k; j++)
201 sum += *ap1 * *ap1;ap1++;
209 if ((*ap6 - sum) <= 0)
210 *ap6 = sqrt(-(*ap6 - sum));
212 *ap6 = sqrt(*ap6 - sum);
224 inline int foresub (
double *a,
double *b,
int nsize)
235 for (i = 1; i < nsize; i++)
238 for (j = 0, bp2 = b; j < i; j++)
240 sum += *ap1++ * *bp2++;
244 *bp1 = (*bp1 - sum) / *ap1;bp1++;ap1++;
252 inline int backsub (
double *a,
double *b,
int nsize)
261 double *ap1 = a + (k + k * (k + 1) / 2);
262 double *ap2 = ap1 - 1;
270 *bp1 = *bp1 / *ap1;bp1--;
271 for (i = k - 1; i >= 0; i--)
275 for (j = nsize - 1, ap3 = ap2--, bp3 = bp2; j >= i + 1; j--)
277 sum += *ap3 * *bp3--;
283 *bp1 = (*bp1 - sum) / *ap1;bp1--;
291 inline int inverse (
double *a,
int nsize)
305 while (ap1 < (a + (nsize * (nsize + 1)/2)))
313 for (i = 1; i < nsize; i++)
318 for (j = m; j <= nsize; j++)
325 sum += *ap1 * *ap2++;
329 *ap3 = -(*ap4) * sum;
337 ap1 = ap2 = ap3 = ap4 = a;
338 for (i = 0; i < nsize;)
342 for (j = i; j < nsize;)
345 ap1 = ap3 = ap5 + i + n;
348 for (k = j; k < nsize;)
Namespace for ISIS/Bullet specific routines.