3 #ifndef DIMTREE_DDT_HPP_ 4 #define DIMTREE_DDT_HPP_ 14 tensor *projection_Tensor;
15 tensor *buffer_Tensor;
16 ktensor *projection_Ktensor;
26 long int split_mode) {
27 m_local_T =
reinterpret_cast<tensor *
>(malloc(
sizeof *m_local_T));
28 m_local_Y =
reinterpret_cast<ktensor *
>(malloc(
sizeof *m_local_Y));
30 reinterpret_cast<tensor *
>(malloc(
sizeof *projection_Tensor));
31 buffer_Tensor =
reinterpret_cast<tensor *
>(malloc(
sizeof *buffer_Tensor));
33 reinterpret_cast<ktensor *
>(malloc(
sizeof *projection_Ktensor));
34 m_local_T->data =
const_cast<double *
>(&i_input_tensor.
m_data[0]);
35 m_local_T->nmodes = i_input_tensor.
modes();
36 m_local_T->dims_product = i_input_tensor.
numel();
37 m_local_Y->factors =
reinterpret_cast<double **
>(
38 malloc(
sizeof(
double *) * m_local_T->nmodes));
39 m_local_Y->dims = (
long int *)malloc(
sizeof(
long int) * m_local_T->nmodes);
40 m_local_T->dims = (
long int *)malloc(
sizeof(
long int) * m_local_T->nmodes);
41 m_local_Y->nmodes = i_ncp_factors.
modes();
42 m_local_Y->rank = i_ncp_factors.
rank();
44 m_local_Y->lambdas = temp_vec.memptr();
45 m_local_Y->dims_product = arma::prod(i_ncp_factors.
dimensions());
47 for (
long int i = 0; i < m_local_T->nmodes; i++) {
48 m_local_T->dims[i] = i_input_tensor.
dimensions()[i];
49 m_local_Y->dims[i] = i_input_tensor.
dimensions()[i];
50 m_local_Y->factors[i] =
reinterpret_cast<double *
>(
51 malloc(
sizeof(
double) * i_ncp_factors.
rank() * m_local_T->dims[i]));
58 projection_Tensor->data =
reinterpret_cast<double *
>(
59 malloc(
sizeof(
double) * rdp * m_local_Y->rank));
60 buffer_Tensor->data =
reinterpret_cast<double *
>(
61 malloc(
sizeof(
double) * m_local_Y->rank * rdp));
63 projection_Tensor->data =
reinterpret_cast<double *
>(
64 malloc(
sizeof(
double) * ldp * m_local_Y->rank));
65 buffer_Tensor->data =
reinterpret_cast<double *
>(
66 malloc(
sizeof(
double) * m_local_Y->rank * ldp));
69 projection_Tensor->nmodes = m_local_T->nmodes;
70 buffer_Tensor->nmodes = m_local_T->nmodes;
72 projection_Tensor->dims =
73 (
long int *)malloc(
sizeof(
long int) * m_local_T->nmodes);
75 (
long int *)malloc(
sizeof(
long int) * m_local_T->nmodes);
76 for (
long int i = 0; i < m_local_T->nmodes; i++) {
77 projection_Tensor->dims[i] = m_local_T->dims[i];
78 buffer_Tensor->dims[i] = m_local_T->dims[i];
81 projection_Tensor->dims_product = m_local_T->dims_product;
82 buffer_Tensor->dims_product = m_local_T->dims_product;
84 for (
long int i = 0; i < i_ncp_factors.
modes(); i++) {
86 std::memcpy(m_local_Y->factors[i], temp.memptr(),
87 sizeof(double) * temp.n_rows * temp.n_cols);
93 void set_factor(
const double *arma_factor_ptr,
const long int mode) {
96 std::memcpy(m_local_Y->factors[mode], arma_factor_ptr,
97 sizeof(
double) * m_local_Y->dims[mode] * m_local_Y->rank);
101 for (
long int i = 0; i < m_local_T->nmodes; i++) {
102 free(m_local_Y->factors[i]);
104 free(m_local_Y->factors);
105 free(m_local_Y->dims);
106 free(m_local_T->dims);
112 free(projection_Ktensor);
114 free(projection_Tensor);
121 for (
long int i = 0; i < m_local_T->nmodes; i++) {
122 if (i <= i_split_mode) {
123 ldp *= m_local_T->dims[i];
125 rdp *= m_local_T->dims[i];
135 double &multittv_time,
double &mttkrp_time) {
145 D = ::direction::right;
147 m_local_Y, projection_Ktensor, s + 1,
150 if (projection_Ktensor->nmodes == 1) {
160 mttkrp_time +=
toc();
174 projection_Tensor, num_threads);
175 mttkrp_time +=
toc();
179 multittv_time +=
toc();
181 }
else if (n == s + 1) {
185 D = ::direction::left;
187 m_local_Y, projection_Ktensor, s,
189 if (projection_Ktensor->nmodes == 1) {
192 mttkrp_time +=
toc();
196 projection_Tensor, num_threads);
197 mttkrp_time +=
toc();
202 projection_Ktensor, num_threads);
203 multittv_time +=
toc();
206 D = ::direction::left;
207 if (projection_Ktensor->nmodes == 2) {
212 multittv_time +=
toc();
220 buffer_Tensor, num_threads);
221 multittv_time +=
toc();
224 buffer_Tensor->nmodes, D);
232 projection_Ktensor, num_threads);
233 multittv_time +=
toc();
237 TransposeM(m_local_Y->factors[n], out, m_local_Y->rank,
240 std::memcpy(out, m_local_Y->factors[n],
241 sizeof(
double) * m_local_Y->rank * m_local_Y->dims[n]);
246 #endif // DIMTREE_DDT_HPP_
UVEC dimensions() const
dimensions of every mode
Data is stored such that the unfolding is column major.
void ktensor_copy_constructor(ktensor *Y, ktensor *nY)
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 tic()
start the timer. easy to call as tic(); some code; double t=toc();
void tensor_data_swap(tensor *t1, tensor *t2)
void LR_tensor_Reduction(tensor *T, tensor *nT, long int n, direction D)
void set_factor(const double *arma_factor_ptr, const long int mode)
std::vector< double > m_data
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)
void set_left_right_product(const long int i_split_mode)
VEC lambda() const
returns the lambda vector
void LR_Ktensor_Reordering_existingY(ktensor *Y, ktensor *nY, long int n, direction D)
DenseDimensionTree(const planc::Tensor &i_input_tensor, const planc::NCPFactors &i_ncp_factors, long int split_mode)
void in_order_reuse_MTTKRP(long int n, double *out, bool colmajor, double &multittv_time, double &mttkrp_time)
direction opposite_direction(direction D)
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...
int modes() const
Return the number of modes. It is a scalar value.
void destruct_Tensor(tensor *T)
int rank() const
returns low rank
int modes() const
returns number of modes
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...
void TransposeM(double *A, double *A_T, long int rowsA, long int colsA)
UVEC dimensions() const
Returns a vector of dimensions on every mode.
UWORD numel() const
Returns total number of elements.
void remove_mode_Ktensor(ktensor *Y, long int n)
MAT & factor(const int i_n) const
factor matrix of a mode i_n