/* Like X(tensor_copy), but copy all of the dimensions *except* except_dim. */ tensor *X(tensor_copy_except)(const tensor *sz, int except_dim) { tensor *x; A(FINITE_RNK(sz->rnk) && sz->rnk >= 1 && except_dim < sz->rnk); x = X(mktensor)(sz->rnk - 1); dimcpy(x->dims, sz->dims, except_dim); dimcpy(x->dims + except_dim, sz->dims + except_dim + 1, x->rnk - except_dim); return x; }
tensor *X(tensor_append)(const tensor *a, const tensor *b) { if (!FINITE_RNK(a->rnk) || !FINITE_RNK(b->rnk)) { return X(mktensor)(RNK_MINFTY); } else { tensor *x = X(mktensor)(a->rnk + b->rnk); dimcpy(x->dims, a->dims, a->rnk); dimcpy(x->dims + a->rnk, b->dims, b->rnk); return x; } }
bench_tensor *tensor_append(const bench_tensor *a, const bench_tensor *b) { if (!BENCH_FINITE_RNK(a->rnk) || !BENCH_FINITE_RNK(b->rnk)) { return mktensor(BENCH_RNK_MINFTY); } else { bench_tensor *x = mktensor(a->rnk + b->rnk); dimcpy(x->dims, a->dims, a->rnk); dimcpy(x->dims + a->rnk, b->dims, b->rnk); return x; } }
/* Like X(tensor_copy), but copy only rnk dimensions starting with start_dim. */ tensor *X(tensor_copy_sub)(const tensor *sz, int start_dim, int rnk) { tensor *x; A(FINITE_RNK(sz->rnk) && start_dim + rnk <= sz->rnk); x = X(mktensor)(rnk); dimcpy(x->dims, sz->dims + start_dim, rnk); return x; }
/* Like tensor_copy, but copy only rnk dimensions starting with start_dim. */ bench_tensor *tensor_copy_sub(const bench_tensor *sz, int start_dim, int rnk) { bench_tensor *x; BENCH_ASSERT(BENCH_FINITE_RNK(sz->rnk) && start_dim + rnk <= sz->rnk); x = mktensor(rnk); dimcpy(x->dims, sz->dims + start_dim, rnk); return x; }
tensor *X(tensor_copy)(const tensor *sz) { tensor *x = X(mktensor)(sz->rnk); dimcpy(x->dims, sz->dims, sz->rnk); return x; }
bench_tensor *tensor_copy(const bench_tensor *sz) { bench_tensor *x = mktensor(sz->rnk); dimcpy(x->dims, sz->dims, sz->rnk); return x; }