LMMC
Lamina Mathematic core
Toggle main menu visibility
载入中...
搜索中...
未找到
tensor3_storage.c
浏览该文件的文档.
1
5
#include "
memory_bridge.h
"
6
#include "
internal/tensor3_internal.h
"
7
#include "
lmmc/tensor_nd.h
"
8
9
lmmc_status_t
lmmc_tensor3_create
(
size_t
dim0,
size_t
dim1,
size_t
dim2,
lmmc_tensor3_t
* out_tensor) {
10
lmmc_tensor_nd_t
nd = {0};
11
size_t
dims[3];
12
lmmc_status_t
st;
13
14
if
(out_tensor == NULL || dim0 == 0 || dim1 == 0 || dim2 == 0) {
15
return
LMMC_STATUS_INVALID_ARGUMENT
;
16
}
17
18
dims[0] = dim0;
19
dims[1] = dim1;
20
dims[2] = dim2;
21
st =
lmmc_tensor_nd_create
(3, dims, &nd);
22
if
(st !=
LMMC_STATUS_OK
) {
23
return
st;
24
}
25
26
out_tensor->
dim0
= nd.
dims
[0];
27
out_tensor->
dim1
= nd.
dims
[1];
28
out_tensor->
dim2
= nd.
dims
[2];
29
out_tensor->
stride0
= nd.
strides
[0];
30
out_tensor->
stride1
= nd.
strides
[1];
31
out_tensor->
stride2
= nd.
strides
[2];
32
out_tensor->
data
= nd.
data
;
33
out_tensor->
owns_data
= nd.
owns_data
;
34
return
LMMC_STATUS_OK
;
35
}
36
37
lmmc_status_t
lmmc_tensor3_wrap
(
38
size_t
dim0,
39
size_t
dim1,
40
size_t
dim2,
41
size_t
stride0,
42
size_t
stride1,
43
size_t
stride2,
44
lmmc_real_t
* data,
45
lmmc_tensor3_t
* out_tensor
46
) {
47
lmmc_tensor3_t
candidate = {0};
48
if
(out_tensor == NULL || data == NULL || dim0 == 0 || dim1 == 0 || dim2 == 0) {
49
return
LMMC_STATUS_INVALID_ARGUMENT
;
50
}
51
if
(stride0 == 0 || stride1 == 0 || stride2 == 0) {
52
return
LMMC_STATUS_INVALID_ARGUMENT
;
53
}
54
55
candidate.
dim0
= dim0;
56
candidate.
dim1
= dim1;
57
candidate.
dim2
= dim2;
58
candidate.
stride0
= stride0;
59
candidate.
stride1
= stride1;
60
candidate.
stride2
= stride2;
61
candidate.
data
= data;
62
candidate.
owns_data
= 0;
63
64
if
(lmmc_tensor3_validate(&candidate) !=
LMMC_STATUS_OK
) {
65
return
LMMC_STATUS_INVALID_ARGUMENT
;
66
}
67
68
*out_tensor = candidate;
69
return
LMMC_STATUS_OK
;
70
}
71
72
void
lmmc_tensor3_destroy
(
lmmc_tensor3_t
* tensor) {
73
if
(tensor == NULL) {
74
return
;
75
}
76
if
(tensor->
owns_data
&& tensor->
data
!= NULL) {
77
size_t
total = 0;
78
size_t
total_part = 0;
79
if
(lmmc_safe_mul_size(tensor->
dim0
, tensor->
dim1
, &total_part) &&
80
lmmc_safe_mul_size(total_part, tensor->
dim2
, &total)) {
81
for
(
size_t
i = 0; i < total; ++i) {
82
LMMC_REAL_CLEAR
(&tensor->
data
[i]);
83
}
84
}
85
lmmc_memory_free
(tensor->
data
);
86
}
87
tensor->
dim0
= 0;
88
tensor->
dim1
= 0;
89
tensor->
dim2
= 0;
90
tensor->
stride0
= 0;
91
tensor->
stride1
= 0;
92
tensor->
stride2
= 0;
93
tensor->
data
= NULL;
94
tensor->
owns_data
= 0;
95
}
96
97
lmmc_status_t
lmmc_tensor3_set
(
98
lmmc_tensor3_t
* tensor,
size_t
i,
size_t
j,
size_t
k,
99
lmmc_real_t
value)
100
{
101
if
(lmmc_tensor3_validate(tensor) !=
LMMC_STATUS_OK
) {
102
return
LMMC_STATUS_INVALID_ARGUMENT
;
103
}
104
if
(i >= tensor->
dim0
|| j >= tensor->
dim1
|| k >= tensor->
dim2
) {
105
return
LMMC_STATUS_INVALID_ARGUMENT
;
106
}
107
const
size_t
offset =
108
i * tensor->
stride0
+ j * tensor->
stride1
+ k * tensor->
stride2
;
109
LMMC_REAL_SET
(&tensor->
data
[offset], &value);
110
return
LMMC_STATUS_OK
;
111
}
112
113
lmmc_status_t
lmmc_tensor3_get
(
114
const
lmmc_tensor3_t
* tensor,
size_t
i,
size_t
j,
size_t
k,
115
lmmc_real_t
* out_value)
116
{
117
if
(lmmc_tensor3_validate(tensor) !=
LMMC_STATUS_OK
||
118
out_value == NULL) {
119
return
LMMC_STATUS_INVALID_ARGUMENT
;
120
}
121
if
(i >= tensor->
dim0
|| j >= tensor->
dim1
|| k >= tensor->
dim2
) {
122
return
LMMC_STATUS_INVALID_ARGUMENT
;
123
}
124
const
size_t
offset =
125
i * tensor->
stride0
+ j * tensor->
stride1
+ k * tensor->
stride2
;
126
LMMC_REAL_SET
(out_value, &tensor->
data
[offset]);
127
return
LMMC_STATUS_OK
;
128
}
LMMC_REAL_CLEAR
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
定义
config.h:38
lmmc_real_t
double lmmc_real_t
Public and internal LMMC real type.
定义
config.h:28
LMMC_REAL_SET
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
定义
config.h:41
lmmc_memory_free
void lmmc_memory_free(void *pointer)
定义
memory_bridge.c:75
memory_bridge.h
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
lmmc_status_t
LMMC 库统一返回的状态码.
定义
status.h:22
LMMC_STATUS_OK
@ LMMC_STATUS_OK
定义
status.h:23
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_get
lmmc_status_t lmmc_tensor3_get(const lmmc_tensor3_t *tensor, size_t i, size_t j, size_t k, lmmc_real_t *out_value)
读取元素 (i,j,k)。
定义
tensor3_storage.c:113
lmmc_tensor3_destroy
void lmmc_tensor3_destroy(lmmc_tensor3_t *tensor)
销毁张量。
定义
tensor3_storage.c:72
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_create
lmmc_status_t lmmc_tensor3_create(size_t dim0, size_t dim1, size_t dim2, lmmc_tensor3_t *out_tensor)
创建 dim0 x dim1 x dim2 的张量,元素未初始化。
定义
tensor3_storage.c:9
lmmc_tensor3_wrap
lmmc_status_t lmmc_tensor3_wrap(size_t dim0, size_t dim1, size_t dim2, size_t stride0, size_t stride1, size_t stride2, lmmc_real_t *data, lmmc_tensor3_t *out_tensor)
用外部缓冲区构造张量视图。
定义
tensor3_storage.c:37
lmmc_tensor3_set
lmmc_status_t lmmc_tensor3_set(lmmc_tensor3_t *tensor, size_t i, size_t j, size_t k, lmmc_real_t value)
写入元素 (i,j,k)。
定义
tensor3_storage.c:97
lmmc_tensor3_t::data
lmmc_real_t * data
定义
tensor3.h:29
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::data
lmmc_real_t * data
定义
tensor_nd.h:29
lmmc_tensor_nd_create
lmmc_status_t lmmc_tensor_nd_create(size_t ndim, const size_t *dims, lmmc_tensor_nd_t *out)
创建 N-D 张量,行优先连续存储,元素初始化为零.
定义
tensor_nd_storage.c:9
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_storage.c
生成于
, 为 LMMC使用
1.18.0