Ejemplo n.º 1
0
// ================================
// 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;
}