#ifdef NERV_GENERIC_MMATRIX
#include "matrix.h"
#include "elem_type.h"
#define MATRIX_DATA_FREE(ptr, status) host_matrix_(free)(ptr, status)
#define MATRIX_DATA_ALLOC(dptr, stride, width, height, status) \
host_matrix_(alloc)(dptr, stride, width, height, status)
#define NERV_GENERIC_MATRIX
#include "../cuda_helper.h"
#include "../../common.h"
#include "../../io/chunk_file.h"
#include <string.h>
#include <cblas.h>
#include <float.h>
Matrix *nerv_matrix_(colsum)(Matrix *a, Status *status) {
Matrix *b = nerv_matrix_(create)(1, a->ncol, status);
if (status->err_code != NERV_NORMAL)
return NULL;
MATRIX_ELEM *arow = MATRIX_ELEM_PTR(a),
*brow = MATRIX_ELEM_PTR(b);
int i, j;
size_t astride = a->stride;
memset(brow, 0, sizeof(MATRIX_ELEM) * b->ncol);
for (i = 0; i < a->nrow; i++)
{
for (j = 0; j < a->ncol; j++)
brow[j] += arow[j];
arow = MATRIX_NEXT_ROW_PTR(arow, astride);
}
NERV_SET_STATUS(status, NERV_NORMAL, 0);
return b;
}
Matrix *nerv_matrix_(colsame)(Matrix *a, const Matrix *ref, Status *status) {
Matrix *b = nerv_matrix_(create)(1, a->ncol, status);
if (status->err_code != NERV_NORMAL)
return NULL;
CHECK_SAME_DIMENSION_RET(a, ref, status);
int i, j;
size_t astride = a->stride, cstride = ref->stride;
MATRIX_ELEM *arow = MATRIX_ELEM_PTR(a),
*brow = MATRIX_ELEM_PTR(b);
const MATRIX_ELEM *crow = MATRIX_ELEM_PTR(ref);
memset(brow, 0, sizeof(MATRIX_ELEM) * b->ncol);
for (i = 0; i < a->nrow; i++)
{
for (j = 0; j < a->ncol; j++)
{
brow[j] += (int)(arow[j] == crow[j]);
}
arow = MATRIX_NEXT_ROW_PTR(arow, astride);
crow = MATRIX_NEXT_ROW_PTR(crow, cstride);
}
NERV_SET_STATUS(status, NERV_NORMAL, 0);
return b;
}
Matrix *nerv_matrix_(rowsum)(Matrix *a, Status *status) {
Matrix *b = nerv_matrix_(create)(a->nrow, 1, status);
if (status->err_code != NERV_NORMAL)
return NULL;
MATRIX_ELEM *arow = MATRIX_ELEM_PTR(a),
*brow = MATRIX_ELEM_PTR(b);
int i, j;
size_t astride = a->stride, bstride = b->stride;
memset(brow, 0, b->stride * b->nrow);
for (i = 0; i < a->nrow; i++)
{
for (j = 0; j < a->ncol; j++)
brow[0] += arow[j];
arow = MATRIX_NEXT_ROW_PTR(arow, astride);
brow = MATRIX_NEXT_ROW_PTR(brow, bstride);
}
NERV_SET_STATUS(status, NERV_NORMAL, 0);
return b;
}
Matrix *nerv_matrix_(rowmax)(Matrix *a, Status *status) {
Matrix *b = nerv_matrix_(create)(a->nrow, 1, status);
if (status->err_code != NERV_NORMAL)
return NULL;
MATRIX_ELEM *arow = MATRIX_ELEM_PTR(a),
*brow = MATRIX_ELEM_PTR(b);
int i, j;
size_t astride = a->stride, bstride = b->stride;
for (i = 0; i < a->nrow; i++)
{
brow[0] = arow[0];
for (j = 1; j < a->ncol; j++)
if (arow[j] > brow[0])
brow[0] = arow[j];
arow = MATRIX_NEXT_ROW_PTR(arow, astride);
brow = MATRIX_NEXT_ROW_PTR(brow, bstride);
}
NERV_SET_STATUS(status, NERV_NORMAL, 0);
return b;
}
void nerv_matrix_(rowmax_idx