LMMC
Lamina Mathematic core
Toggle main menu visibility
载入中...
搜索中...
未找到
tensor3_views.c
浏览该文件的文档.
1
5
#include "
internal/tensor3_internal.h
"
6
#include "
lmmc/tensor_nd.h
"
7
8
static
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
21
lmmc_status_t
lmmc_tensor3_reshape_view
(
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];
31
lmmc_status_t
st;
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
)) {
36
return
LMMC_STATUS_INVALID_ARGUMENT
;
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
69
static
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)) {
80
return
LMMC_STATUS_INVALID_ARGUMENT
;
81
}
82
83
if
(!lmmc_safe_add_size(off0, off1, &offset) ||
84
!lmmc_safe_add_size(offset, off2, &offset)) {
85
return
LMMC_STATUS_INVALID_ARGUMENT
;
86
}
87
*out_offset = offset;
88
return
LMMC_STATUS_OK
;
89
}
90
91
lmmc_status_t
lmmc_tensor3_slice_view
(
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
)) {
106
return
LMMC_STATUS_INVALID_ARGUMENT
;
107
}
108
if
(begin0 >= end0 || begin1 >= end1 || begin2 >= end2) {
109
return
LMMC_STATUS_INVALID_ARGUMENT
;
110
}
111
if
(end0 > tensor->
dim0
|| end1 > tensor->
dim1
|| end2 > tensor->
dim2
) {
112
return
LMMC_STATUS_INVALID_ARGUMENT
;
113
}
114
115
if
(lmmc_tensor3_slice_offset(tensor, begin0, begin1, begin2, &offset) !=
LMMC_STATUS_OK
) {
116
return
LMMC_STATUS_INVALID_ARGUMENT
;
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_status_t
LMMC 库统一返回的状态码.
定义
status.h:22
LMMC_STATUS_OK
@ LMMC_STATUS_OK
定义
status.h:23
LMMC_STATUS_DIMENSION_MISMATCH
@ LMMC_STATUS_DIMENSION_MISMATCH
定义
status.h:25
LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_INVALID_ARGUMENT
定义
status.h:24
lmmc_tensor3_t::dim0
size_t dim0
定义
tensor3.h:23
lmmc_tensor3_t::stride1
size_t stride1
定义
tensor3.h:27
lmmc_tensor3_t::stride0
size_t stride0
定义
tensor3.h:26
lmmc_tensor3_t::dim2
size_t dim2
定义
tensor3.h:25
lmmc_tensor3_t::stride2
size_t stride2
定义
tensor3.h:28
lmmc_tensor3_t::dim1
size_t dim1
定义
tensor3.h:24
lmmc_tensor3_t::owns_data
int owns_data
定义
tensor3.h:30
lmmc_tensor3_slice_view
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)。
定义
tensor3_views.c:91
lmmc_tensor3_t::data
lmmc_real_t * data
定义
tensor3.h:29
lmmc_tensor3_reshape_view
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)
在元素总数与连续布局兼容时,构造共享缓冲区的重塑视图。
定义
tensor3_views.c:21
lmmc_tensor3_t
三阶张量结构。
定义
tensor3.h:22
tensor3_internal.h
三阶张量描述符的公共检查。
tensor_nd.h
N-D 稠密张量数据结构、收缩与视图.
lmmc_tensor_nd_t::owns_data
int owns_data
定义
tensor_nd.h:30
lmmc_tensor_nd_t::ndim
size_t ndim
定义
tensor_nd.h:26
lmmc_tensor_nd_t::data
lmmc_real_t * data
定义
tensor_nd.h:29
lmmc_tensor_nd_reshape_view
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 张量,返回共享缓冲区的非拥有视图。
定义
tensor_nd_views.c:97
lmmc_tensor_nd_t::dims
size_t dims[LMMC_TENSOR_MAX_NDIM]
定义
tensor_nd.h:27
lmmc_tensor_nd_t::strides
size_t strides[LMMC_TENSOR_MAX_NDIM]
定义
tensor_nd.h:28
lmmc_tensor_nd_t
N-D 张量结构.
定义
tensor_nd.h:25
src
tensor3_views.c
生成于
, 为 LMMC使用
1.18.0