2
0
Fork 0
CVE/CVE_C/src/cve_subroutines.c

96 lines
2.4 KiB
C

#include "cve.h"
int getWorkLen(const int n, const int p, const int q) {
int mpq; /**< Max of p and q */
int nn = ((n - 1) * n) / 2;
if (p > q) {
mpq = p;
} else {
mpq = q;
}
if (nn * p < (mpq + 1) * mpq) {
return 2 * (mpq + 1) * mpq;
} else {
return (nn + mpq) * mpq;
}
}
double cost(const unsigned int method,
const int n,
const double *Y,
const double *vecK,
const double *colSums,
double *y1, double *L) {
int i, j, k;
double tmp, sum;
for (i = 0; i < n; ++i) {
y1[i] = Y[i];
L[i] = Y[i] * Y[i];
}
for (k = j = 0; j < n; ++j) {
for (i = j + 1; i < n; ++i, ++k) {
y1[i] += Y[j] * vecK[k];
y1[j] += Y[i] * vecK[k];
L[i] += Y[j] * Y[j] * vecK[k];
L[j] += Y[i] * Y[i] * vecK[k];
}
}
for (i = 0; i < n; ++i) {
y1[i] /= colSums[i];
L[i] /= colSums[i];
}
tmp = 0.0;
if (method == CVE_METHOD_WEIGHTED) {
sum = 0.0;
for (i = 0; i < n; ++i) {
tmp += (colSums[i] - 1.0) * (L[i] -= y1[i] * y1[i]);
sum += colSums[i];
}
return tmp / (sum - (double)n); // TODO: check for division by zero!
} else {
for (i = 0; i < n; ++i) {
tmp += (L[i] -= y1[i] * y1[i]);
}
return tmp / (double)n;
}
}
void scaling(const unsigned int method,
const int n,
const double *Y, const double *y1, const double *L,
const double *vecD, const double *vecK,
const double *colSums,
double *vecS) {
int i, j, k, nn = (n * (n - 1)) / 2;
double tmp;
if (method == CVE_METHOD_WEIGHTED) {
for (k = j = 0; j < n; ++j) {
for (i = j + 1; i < n; ++i, ++k) {
tmp = Y[j] - y1[i];
vecS[k] = (L[i] - (tmp * tmp));
tmp = Y[i] - y1[j];
vecS[k] += (L[j] - (tmp * tmp));
}
}
} else {
for (k = j = 0; j < n; ++j) {
for (i = j + 1; i < n; ++i, ++k) {
tmp = Y[j] - y1[i];
vecS[k] = (L[i] - (tmp * tmp)) / colSums[i];
tmp = Y[i] - y1[j];
vecS[k] += (L[j] - (tmp * tmp)) / colSums[j];
}
}
}
for (k = 0; k < nn; ++k) {
vecS[k] *= vecK[k] * vecD[k];
}
}