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...