LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
tensor3_views.c
浏览该文件的文档.
1
6#include "lmmc/tensor_nd.h"
7
8static lmmc_status_t lmmc_tensor3_reshape_error(
9 const lmmc_tensor3_t* tensor, const size_t* new_dims, lmmc_status_t status) {
11 size_t old_total, new_total;
12 if (!lmmc_safe_mul_size(tensor->dim0, tensor->dim1, &old_total) ||
13 !lmmc_safe_mul_size(old_total, tensor->dim2, &old_total) ||
14 !lmmc_safe_mul_size(new_dims[0], new_dims[1], &new_total) ||
15 !lmmc_safe_mul_size(new_total, new_dims[2], &new_total)) {
16 return status;
17 }
18 return old_total != new_total ? LMMC_STATUS_DIMENSION_MISMATCH : status;
19}
20
22 const lmmc_tensor3_t* tensor,
23 size_t new_dim0,
24 size_t new_dim1,
25 size_t new_dim2,
26 lmmc_tensor3_t* out_view
27) {
28 lmmc_tensor_nd_t nd_src;
29 lmmc_tensor_nd_t nd_view = {0};
30 size_t new_dims[3];
32
33 if (lmmc_tensor3_validate(tensor) != LMMC_STATUS_OK || out_view == NULL ||
34 new_dim0 == 0 || new_dim1 == 0 || new_dim2 == 0 ||
35 (tensor == out_view && tensor->owns_data)) {
37 }
38
39 nd_src.ndim = 3;
40 nd_src.dims[0] = tensor->dim0;
41 nd_src.dims[1] = tensor->dim1;
42 nd_src.dims[2] = tensor->dim2;
43 nd_src.strides[0] = tensor->stride0;
44 nd_src.strides[1] = tensor->stride1;
45 nd_src.strides[2] = tensor->stride2;
46 nd_src.data = tensor->data;
47 nd_src.owns_data = 0;
48
49 new_dims[0] = new_dim0;
50 new_dims[1] = new_dim1;
51 new_dims[2] = new_dim2;
52
53 st = lmmc_tensor_nd_reshape_view(&nd_src, 3, new_dims, &nd_view);
54 if (st != LMMC_STATUS_OK) {
55 return lmmc_tensor3_reshape_error(tensor, new_dims, st);
56 }
57
58 out_view->dim0 = nd_view.dims[0];
59 out_view->dim1 = nd_view.dims[1];
60 out_view->dim2 = nd_view.dims[2];
61 out_view->stride0 = nd_view.strides[0];
62 out_view->stride1 = nd_view.strides[1];
63 out_view->stride2 = nd_view.strides[2];
64 out_view->data = nd_view.data;
65 out_view->owns_data = 0;
66 return LMMC_STATUS_OK;
67}
68
69static lmmc_status_t lmmc_tensor3_slice_offset(
70 const lmmc_tensor3_t* tensor, size_t begin0, size_t begin1, size_t begin2,
71 size_t* out_offset) {
72 size_t off0 = 0;
73 size_t off1 = 0;
74 size_t off2 = 0;
75 size_t offset = 0;
76
77 if (!lmmc_safe_mul_size(begin0, tensor->stride0, &off0) ||
78 !lmmc_safe_mul_size(begin1, tensor->stride1, &off1) ||
79 !lmmc_safe_mul_size(begin2, tensor->stride2, &off2)) {
81 }
82
83 if (!lmmc_safe_add_size(off0, off1, &offset) ||
84 !lmmc_safe_add_size(offset, off2, &offset)) {
86 }
87 *out_offset = offset;
88 return LMMC_STATUS_OK;
89}
90
92 const lmmc_tensor3_t* tensor,
93 size_t begin0,
94 size_t end0,
95 size_t begin1,
96 size_t end1,
97 size_t begin2,
98 size_t end2,
99 lmmc_tensor3_t* out_view
100) {
101 size_t offset = 0;
102 lmmc_tensor3_t view;
103
104 if (lmmc_tensor3_validate(tensor) != LMMC_STATUS_OK || out_view == NULL ||
105 (tensor == out_view && tensor->owns_data)) {
107 }
108 if (begin0 >= end0 || begin1 >= end1 || begin2 >= end2) {
110 }
111 if (end0 > tensor->dim0 || end1 > tensor->dim1 || end2 > tensor->dim2) {
113 }
114
115 if (lmmc_tensor3_slice_offset(tensor, begin0, begin1, begin2, &offset) != LMMC_STATUS_OK) {
117 }
118
119 view.dim0 = end0 - begin0;
120 view.dim1 = end1 - begin1;
121 view.dim2 = end2 - begin2;
122 view.stride0 = tensor->stride0;
123 view.stride1 = tensor->stride1;
124 view.stride2 = tensor->stride2;
125 view.data = tensor->data + offset;
126 view.owns_data = 0;
127 *out_view = view;
128 return LMMC_STATUS_OK;
129}
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_DIMENSION_MISMATCH
@ LMMC_STATUS_INVALID_ARGUMENT
lmmc_status_t lmmc_tensor3_slice_view(const lmmc_tensor3_t *tensor, size_t begin0, size_t end0, size_t begin1, size_t end1, size_t begin2, size_t end2, lmmc_tensor3_t *out_view)
取张量子区间视图,每维使用半开区间 [begin, end)。
lmmc_real_t * data
lmmc_status_t lmmc_tensor3_reshape_view(const lmmc_tensor3_t *tensor, size_t new_dim0, size_t new_dim1, size_t new_dim2, lmmc_tensor3_t *out_view)
在元素总数与连续布局兼容时,构造共享缓冲区的重塑视图。
三阶张量结构。
三阶张量描述符的公共检查。
N-D 稠密张量数据结构、收缩与视图.
lmmc_real_t * data
lmmc_status_t lmmc_tensor_nd_reshape_view(const lmmc_tensor_nd_t *src, size_t new_ndim, const size_t *new_dims, lmmc_tensor_nd_t *out_view)
零拷贝重塑 N-D 张量,返回共享缓冲区的非拥有视图。
size_t dims[LMMC_TENSOR_MAX_NDIM]
size_t strides[LMMC_TENSOR_MAX_NDIM]
N-D 张量结构.