forked from xboot/libonnx
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAcosh.c
More file actions
139 lines (126 loc) · 2.9 KB
/
Copy pathAcosh.c
File metadata and controls
139 lines (126 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <onnx.h>
static int Acosh_init(struct onnx_node_t * n)
{
if((n->ninput == 1) && (n->noutput == 1))
return 1;
return 0;
}
static int Acosh_exit(struct onnx_node_t * n)
{
return 1;
}
static int Acosh_reshape(struct onnx_node_t * n)
{
struct onnx_tensor_t * x = n->inputs[0];
struct onnx_tensor_t * y = n->outputs[0];
return onnx_tensor_reshape_identity(y, x, x->type);
}
static void Acosh_bfloat16(struct onnx_node_t * n)
{
struct onnx_tensor_t * x = n->inputs[0];
struct onnx_tensor_t * y = n->outputs[0];
uint16_t * px = (uint16_t *)x->datas;
uint16_t * py = (uint16_t *)y->datas;
float v;
size_t i, l;
for(i = 0, l = y->ndata; i < l; i++)
{
v = bfloat16_to_float32(px[i]);
py[i] = float32_to_bfloat16(acoshf(v));
}
}
static void Acosh_float16(struct onnx_node_t * n)
{
struct onnx_tensor_t * x = n->inputs[0];
struct onnx_tensor_t * y = n->outputs[0];
uint16_t * px = (uint16_t *)x->datas;
uint16_t * py = (uint16_t *)y->datas;
float v;
size_t i, l;
for(i = 0, l = y->ndata; i < l; i++)
{
v = float16_to_float32(px[i]);
py[i] = float32_to_float16(acoshf(v));
}
}
static void Acosh_float32(struct onnx_node_t * n)
{
struct onnx_tensor_t * x = n->inputs[0];
struct onnx_tensor_t * y = n->outputs[0];
float * px = (float *)x->datas;
float * py = (float *)y->datas;
size_t i, l;
for(i = 0, l = y->ndata; i < l; i++)
py[i] = acoshf(px[i]);
}
static void Acosh_float64(struct onnx_node_t * n)
{
struct onnx_tensor_t * x = n->inputs[0];
struct onnx_tensor_t * y = n->outputs[0];
double * px = (double *)x->datas;
double * py = (double *)y->datas;
size_t i, l;
for(i = 0, l = y->ndata; i < l; i++)
py[i] = acosh(px[i]);
}
void resolver_default_op_Acosh(struct onnx_node_t * n)
{
if(n->opset >= 22)
{
switch(n->inputs[0]->type)
{
case ONNX_TENSOR_TYPE_BFLOAT16:
n->init = Acosh_init;
n->exit = Acosh_exit;
n->reshape = Acosh_reshape;
n->op = Acosh_bfloat16;
break;
case ONNX_TENSOR_TYPE_FLOAT16:
n->init = Acosh_init;
n->exit = Acosh_exit;
n->reshape = Acosh_reshape;
n->op = Acosh_float16;
break;
case ONNX_TENSOR_TYPE_FLOAT32:
n->init = Acosh_init;
n->exit = Acosh_exit;
n->reshape = Acosh_reshape;
n->op = Acosh_float32;
break;
case ONNX_TENSOR_TYPE_FLOAT64:
n->init = Acosh_init;
n->exit = Acosh_exit;
n->reshape = Acosh_reshape;
n->op = Acosh_float64;
break;
default:
break;
}
}
else if(n->opset >= 9)
{
switch(n->inputs[0]->type)
{
case ONNX_TENSOR_TYPE_FLOAT16:
n->init = Acosh_init;
n->exit = Acosh_exit;
n->reshape = Acosh_reshape;
n->op = Acosh_float16;
break;
case ONNX_TENSOR_TYPE_FLOAT32:
n->init = Acosh_init;
n->exit = Acosh_exit;
n->reshape = Acosh_reshape;
n->op = Acosh_float32;
break;
case ONNX_TENSOR_TYPE_FLOAT64:
n->init = Acosh_init;
n->exit = Acosh_exit;
n->reshape = Acosh_reshape;
n->op = Acosh_float64;
break;
default:
break;
}
}
}