// ================================ // solve linear equations C = A\B // ================================ void solve(double* C, double* A, double* B, const int rA, const int cA, const int rB, const int cB, const char *mod, double *W, const int LW, ptrdiff_t *S) { #ifdef USE_BLAS int i, j, rank; char uplo = 'U', side = 'L', trans = 'N', unit = 'N'; double one = 1.0, rcond = 0.000000001; ptrdiff_t rA0 = rA, cA0 = cA, cB0 = cB, Lwork=LW, info; ptrdiff_t rC0 = (rA>cA) ? rA : cA; //ptrdiff_t ptr_S = S; switch (mod[0]){ case 'L': case 'U': uplo = mod[0]; dtrsm(&side, &uplo, &trans, &unit, &rC0, &cB0, &one, A, &rA0, C, &rC0); break; case 'P': dposv(&uplo, &rA0, &cB0, W, &rA0, C, &rA0, &info);// A has already been copied into W break; default: if (rA == cA) { //dgesv(&rA0, &cB0, W, &rA0, S, C, &rA0, &info);// A has already been copied into W dgesv(&rA0, &cB0, W, &rA0, (ptrdiff_t*)S, C, &rA0, &info);// A has already been copied into W } else{ for( i=0; i<cB; i++ ) for( j=0; j<rB; j++ ) C[i*rC0+j] = B[i*rB+j]; //dgelsy(&rA0, &cA0, &cB0, A, &rA0, C, &rC0, S, &rcond, &rank, W, &Lwork, &info); dgelsy(&rA0, &cA0, &cB0, A, &rA0, C, &rC0, (ptrdiff_t*)S, &rcond, (ptrdiff_t*)&rank, W, &Lwork, &info); } } #endif }
void encode(const double* dict_words, const double* im_words, const double* nn_ind, ptrdiff_t dim, ptrdiff_t dict_size, ptrdiff_t im_size, ptrdiff_t nn_size, double beta, double* encoding_sr, mwIndex* encoding_ir, mwIndex* encoding_jc, double* hist, bool output_full_mat){ char upper_triangle = 'U'; ptrdiff_t INFO; ptrdiff_t int_one = 1; double sum; double* z = new double[dim*nn_size]; double* C = new double[nn_size*nn_size]; double* b = new double[nn_size]; ptrdiff_t* IPIV = new ptrdiff_t[nn_size]; if (output_full_mat) { // first column with non-zero value in encoding has index 0 encoding_jc[0] = 0; } for(mwIndex i=0; i<im_size; i++){ mwIndex tmp_ind; for(mwIndex n=0;n<nn_size;n++){ for(mwIndex m=0;m<dim;m++){ tmp_ind = (mwIndex)nn_ind[i*nn_size+n]; z[n*dim+m] = dict_words[tmp_ind*dim+m]-im_words[i*dim+m]; } } mult_help(z,dim,nn_size,C); // dgemm(&transpose,&non_trans,&nn_size,&nn_size,&dim,&one,z,&nn_size,z,&dim,&zero,C,&nn_size); sum = 0; for(mwIndex m=0;m<nn_size;m++) sum += C[m*nn_size+m]; sum = sum*beta; for(mwIndex m=0;m<nn_size;m++) C[m*nn_size+m] += sum; for(mwIndex m=0;m<nn_size;m++) b[m] = 1; dposv(&upper_triangle,&nn_size,&int_one,C,&nn_size,b,&nn_size,&INFO); // dgesv(&nn_size,&int_one,C,&nn_size,IPIV,b,&nn_size,&INFO); sum = 0; for(mwIndex m=0;m<nn_size;m++) sum += b[m]; for(mwIndex m=0;m<nn_size;m++) b[m] /= sum; for(mwIndex m=0;m<nn_size;m++){ tmp_ind = (mwIndex)nn_ind[i*nn_size+m]; if (output_full_mat) { encoding_sr[encoding_jc[i]+m] = b[m]; encoding_ir[encoding_jc[i]+m] = tmp_ind; } else { if(hist[tmp_ind]<b[m]) hist[tmp_ind] = b[m]; } } if (output_full_mat) { encoding_jc[i+1] = encoding_jc[i] + nn_size; } } delete [] z; delete [] C; delete [] b; delete [] IPIV; return; }