3 #ifndef DIMTREE_DIMTREES_HPP_     4 #define DIMTREE_DIMTREES_HPP_    32                     double *A, 
long int r, 
double *C, 
long int num_threads) {
    36   CBLAS_ORDER dgemm_layout;  
    39   char trans_tensor, trans_A;
    41   int i, m, n, k, output_stride, tensor_stride, right_dims_product,
    42       left_dims_product, i_r;
    48   if (s < 0 || s >= T->nmodes - 1) {  
    50     printf(
"Invalid value of s in partial_MTTKRP(), s = %ld\nExit\n", s);
    54     printf(
"T == NULL in partial_MTTKRP()\nExit\n");
    58     printf(
"A == NULL in partial_MTTKRP()\nExit\n");
    62     printf(
"C == NULL in partial_MTTKRP()\nExit\n");
    66   right_dims_product = 1;
    67   left_dims_product = 1;  
    69   for (i = 0; i < s + 1; i++) left_dims_product *= T->dims[i];
    70   for (i = s + 1; i < T->nmodes; i++) right_dims_product *= T->dims[i];
    72   if (D == ::direction::left) {
    78       dgemm_layout = CblasRowMajor;
    84       n = right_dims_product;
    85       k = left_dims_product;
    86       tensor_stride = left_dims_product;
    88       dgemm_(&trans_A, &trans_tensor, &m, &n, &k, &alpha, A, &m, T->data, &tensor_stride,
    89              &beta, C, &output_stride);
    94       dgemm_layout = CblasColMajor;
    97       output_stride = right_dims_product;
    98       m = right_dims_product;  
   100       k = left_dims_product;
   102       tensor_stride = left_dims_product;
   103       dgemm_(&trans_tensor, &trans_A, &m, &i_r, &k, &alpha, T->data,
   104              &tensor_stride, A, &i_r, &beta, C, &output_stride);
   110     tensor_stride = left_dims_product;
   112       dgemm_layout = CblasRowMajor;
   118       n = left_dims_product;
   119       k = right_dims_product;
   121       tensor_stride = left_dims_product;
   122       dgemm_(&trans_A, &trans_tensor, &m, &n, &k, &alpha, A,
   123              &m, T->data, &tensor_stride, &beta, C, &output_stride);
   125       dgemm_layout = CblasColMajor;
   130       output_stride = left_dims_product;
   131       m = left_dims_product;
   133       k = right_dims_product;
   135       tensor_stride = left_dims_product;
   136       dgemm_(&trans_tensor, &trans_A, &m, &i_r, &k, &alpha, T->data,
   137              &tensor_stride, A, &i_r, &beta, C, &output_stride);
   177                              ktensor *Y, tensor *T, 
double *C,
   178                              long int num_threads) {
   182   if ((s < 0) || (s >= T->nmodes - 1)) {  
   184     printf(
"Invalid value of s in partial_MTTKRP_with_KRP(), s = %ld\nExit\n",
   189     printf(
"T == NULL in partial_MTTKRP_with_KRP()\nExit\n");
   193     printf(
"Y == NULL in partial_MTTKRP_with_KRP()\nExit\n");
   197   long int i, right_dims_product, left_dims_product, free_KRP;
   201   right_dims_product = 1;
   202   left_dims_product = 1;  
   204   for (i = 0; i < s + 1; i++) left_dims_product *= T->dims[i];
   205   for (i = s + 1; i < T->nmodes; i++) right_dims_product *= T->dims[i];
   207   if (D == ::direction::left) {  
   213   if (tempY.nmodes == 1) {  
   214     KRP = tempY.factors[0];
   217     KRP = 
reinterpret_cast<double *
>(
   218         malloc(
sizeof(
double) * Y->rank * tempY.dims_product));
   236   if (free_KRP == 1) free(KRP);
   251                                        long int num_threads) {
   254   if (D == ::direction::left) {
   282                                       ktensor *input_ktensor,
   283                                       tensor *input_tensor,
   284                                       tensor *output_tensor,
   285                                       long int num_threads) {
   290                           output_tensor->data, num_threads);
   292   if (D == ::direction::left) {
   303   output_tensor->nmodes += 1;
   304   output_tensor->dims[output_tensor->nmodes - 1] = input_ktensor->rank;
   305   output_tensor->dims_product *= input_ktensor->rank;
   316                long int r, 
double *C, 
long int num_threads) {
   317   if (s < 0 || s >= T->nmodes - 1) {  
   319     printf(
"Invalid value of s in multi_TTV(), s = %ld\nExit\n", s);
   323     printf(
"T == NULL in multi_TTV()\nExit\n");
   327     printf(
"A == NULL in multi_TTV()\nExit\n");
   331     printf(
"C == NULL in multi_TTV()\nExit\n");
   334   if (r != T->dims[T->nmodes - 1]) {  
   336         "r and the last mode of the tensor T must be equal, r = %ld, "   337         "T->dims[T->nmodes-1] = %ld\nmulti_TTV()\n\nExit\n",
   338         r, T->dims[T->nmodes - 1]);
   342   CBLAS_ORDER dgemv_layout;
   343   CBLAS_TRANSPOSE trans_tensor;
   344   long int right_dims_product, left_dims_product, i, m, n, tensor_stride,
   345       output_stride, output_col_stride;
   351   left_dims_product = 1;
   352   right_dims_product = 1;
   354   for (i = 0; i < s + 1; i++)  
   355     left_dims_product *= T->dims[i];
   356   for (i = s + 1; i < T->nmodes - 1;
   358     right_dims_product *= T->dims[i];
   360   trans_tensor = CblasNoTrans;  
   362   if (D == ::direction::left) {
   363     dgemv_layout = CblasRowMajor;
   364     m = right_dims_product;
   365     n = left_dims_product;
   369       output_col_stride = 1;
   372       output_col_stride = m;
   375     dgemv_layout = CblasColMajor;
   376     m = left_dims_product;
   377     n = right_dims_product;
   381       output_col_stride = 1;
   384       output_col_stride = m;
   389   for (i = 0; i < r; i++) {
   406     cblas_dgemv(dgemv_layout, trans_tensor, m, n, alpha, T->data + i * m * n,
   407                 tensor_stride, A + i, r, beta, &C[i * output_col_stride],
   419                         ktensor *Y, 
double *C, 
long int num_threads) {
   425   if (T->nmodes != Y->nmodes + 1) {
   427         "In multi_TTV_with_KRP(), T->nmodes = %ld and Y->nmodes = %ld\nThe "   428         "tensor should have 1 more mode than the ktensor.\nExit\n",
   429         T->nmodes, Y->nmodes);
   434   if (D == ::direction::left) {
   440   if (tempY.nmodes == 1) {
   441     KRP = tempY.factors[0];
   444     KRP = 
reinterpret_cast<double *
>(
   445         malloc(
sizeof(
double) * Y->rank * tempY.dims_product));
   452   multi_TTV(OL, s, D, T, KRP, Y->rank, C, num_threads);
   454   if (free_KRP == 1) free(KRP);
   465                                   ktensor *input_ktensor,
   466                                   long int num_threads) {
   469   if (D == ::direction::left) {
   470     s = input_ktensor->nmodes - 2;
   478                      input_ktensor->factors[n], num_threads);
   482                                  ktensor *input_ktensor, tensor *output_tensor,
   483                                  long int num_threads) {
   488                      output_tensor->data, num_threads);
   490   if (D == ::direction::left) {
   491     op_D = ::direction::right;
   494     op_D = ::direction::left;
   503     output_tensor->nmodes += 1;
   504     output_tensor->dims[output_tensor->nmodes - 1] = input_ktensor->rank;
   505     output_tensor->dims_product *= input_ktensor->rank;
   509 #endif  // DIMTREE_DIMTREES_HPP_ void partial_MTTKRP(Output_Layout OL, long int s, direction D, tensor *T, double *A, long int r, double *C, long int num_threads)
Performs a tensor times a matrix based on some split of dimensions. 
 
void multi_TTV_with_KRP(Output_Layout OL, long int s, direction D, tensor *T, ktensor *Y, double *C, long int num_threads)
multi_TTV_with_KRP(); KRP wrapper for the general multi_TTV function. 
 
void multi_TTV(Output_Layout OL, long int s, direction D, tensor *T, double *A, long int r, double *C, long int num_threads)
 multi_TTV();  performs a multi_ttv with between subtensors of T->data and the column  of the matrix ...
 
void multi_TTV_with_KRP_output_FM(direction D, tensor *input_tensor, ktensor *input_ktensor, long int num_threads)
 multi_TTV_with_KRP_output_FM();  Wrapper function for performing a multi_TTV with a KRP and outputin...
 
void LR_tensor_Reduction(tensor *T, tensor *nT, long int n, direction D)
 
void multi_TTV_with_KRP_output_T(long int s, direction D, tensor *input_tensor, ktensor *input_ktensor, tensor *output_tensor, long int num_threads)
 
void destruct_Ktensor(ktensor *Y, long int clear_factors)
 
direction opposite_direction(direction D)
 
void partial_MTTKRP_with_KRP(Output_Layout OL, long int s, direction D, ktensor *Y, tensor *T, double *C, long int num_threads)
Wrapper function for partial_MTTKRP() Forms a desired KRP, manages all the memory for the KRP Passes ...
 
void partial_MTTKRP_with_KRP_output_FM(direction D, ktensor *Y, tensor *T, long int num_threads)
 partial_MTTKRP_with_KRP_output_FM();  Wrapper function for computing a partial_MTTKRP with KRP and o...
 
Output_Layout
This .h file contains all the functions need to construct dimension trees for fast_CP_ALS algorithms...
 
void wrapper_Parallel_Multi_revKRP(ktensor *Y, long int num_threads, double *KRP)
 Wrapper function for the reverse KRP of a ktensor Y 1) Ktensor object 2) number of threads to use 3)...
 
void LR_Ktensor_Reordering_newY(ktensor *Y, ktensor *nY, long int n, direction D)
 
void partial_MTTKRP_with_KRP_output_T(long int s, direction D, ktensor *input_ktensor, tensor *input_tensor, tensor *output_tensor, long int num_threads)
 partial_MTTKRP_with_KRP_output_T()  Wrapper function for computing partial_MTTKRP with KRP and outpu...