ae2f_docs
SlpPredict-Primal.c
Go to the documentation of this file.
1#include <ae2fVK/Ann/Slp.h>
2#include <vulkan/vulkan_core.h>
3#include "../vk.h"
4#include "ae2f/Cast.h"
5#include "ae2f/Float.h"
6#include "ae2f/errGlob.h"
7
8#include <string.h>
9#include <math.h>
10
11
12#if 1
13
14ae2fVK_AnnSlpMk_t mk;
15
16size_t mapinp;
17
18static void
19Act(ae2f_float_t* r, ae2f_float_t x) {
20 *r = 1.0 / (1.0 + exp(-x));
21}
22
23static void
24ActDeriv(ae2f_float_t* r, ae2f_float_t output) {
25 output += 1e-7;
26 *r = output * (1.0 - output);
27}
28
29/** Cross entrophy */
30static void
31LossDeriv(ae2f_float_t* r, const ae2f_float_t* output, const ae2f_float_t* target, size_t i, size_t c) {
32 ae2f_float_t epsilon = 1e-7; // Small value to prevent division by zero
33 ae2f_float_t o_i = output[i];
34 // Clip output to avoid log(0) or division by zero
35 o_i = o_i < epsilon ? epsilon : (o_i > 1.0 - epsilon ? 1.0 - epsilon : o_i);
36 *r = (o_i - target[i]) / (c * o_i * (1.0 - o_i));
37}
38
40
41#define fgetc(...)
42
43int main() {
44 Test_VkInit();
45 memset(&(mk), 0, sizeof(mk));
46
48 mk,
49 0, 0, 0
50 , 2, 1, 0, 0
51 , Act, ActDeriv, LossDeriv
52 , 0, 0
53 , vkdev
54 , vkphydevmemprops
55 , NULL
56 ,
57
58 "#define LOSS_DERIV(r, y, y_desired, i, c) \n"
59 "#define ACT(r, x) { (*(r) = (1.0 / (1.0 + exp(-x)))); } \n"
60 , "/** This is also a comment */\n"
61 );
62
63 puts("__ae2fVK_AnnSlpMk_imp is done");
64 fgetc(stdin);
65
66 assert(mk.m_U0.m_alter.m_ptr->m_slp.m_Slp[0].m_inc == 2);
67 assert(mk.m_U0.m_alter.m_ptr->m_slp.m_Slp[0].m_outc == 1);
68
69 printf("Stateval: %d\n", (mk).m_U0.m_alter.m_ptr->m_vkres);
70
71 assert(mk.m_U0.m_alter.m_ptr && "__ae2fVK_AnnSlpMk_imp has failed");
72 assert(mk.m_reterr == ae2f_errGlob_OK);
73
74 assert(mk.m_U0.m_alter.m_ptr->m_vkres == VK_SUCCESS);
75
76 {
77 ae2f_float_t* weight;
78 ae2f_float_t* bias;
79 ae2f_err_t e;
80 size_t i, j;
81
83
85 &e
86 , mk.m_U0.m_alter.m_ptr
87 , &weight
88 , &bias
89 );
90
91 assert(ae2f_errGlob_OK == e && "__ae2fVK_AnnSlpWBMap has failed.");
92 assert(weight);
93 assert(bias);
94
95 for(i = 0; i < 2; i++) {
96 bias[0] = ((double)rand() / RAND_MAX) - 0.5;
97 weight[i] = ((double)rand() / RAND_MAX) - 0.5;
98 }
99
101 v_unmap
102 , mk.m_U0.m_alter.m_ptr[0]
103 );
104 }
105
106 {
107 ae2f_err_t err = 0;
108 ae2fVK_AnnSlpUnMap_t v_unmap;
109
111 * OutputMapped = NULL,
112 * InputMapped = NULL
113 ;
114
116 &err
117 , mk.m_U0.m_alter.m_ptr
118 , (&InputMapped)
119 , (&OutputMapped)
120 );
121
122 puts("Before OutputMapped written");
123 fgetc(stdin);
124
125 assert(OutputMapped);
126 assert(InputMapped);
127
128 assert((mk.m_U0.m_alter.m_ptr[0].m_vkres) == VK_SUCCESS);
129
130 OutputMapped[0] = 7;
131
132 InputMapped[0] = 7;
133 InputMapped[1] = 7;
134
135 printf("Inputmapped before predict: %f %f\n", InputMapped[0], InputMapped[1]);
136 printf("Outputmapped before predict: %f\n", OutputMapped[0]);
137
138 fgetc(stdin);
139 __ae2fVK_AnnSlpIOUnMap_imp(v_unmap, mk.m_U0.m_alter.m_ptr[0]);
140
141 puts("After __ae2fVK_AnnSlpIOUnMapOutput_imp.");
142 fgetc(stdin);
143 }
144
145 VkCommandBuffer vkcmdbuf = NULL;
146 VkCommandPool vkcmdpool = NULL;
147
148 {
149 VkCommandPoolCreateInfo vkcmdpoolcreatinfo;
150 vkcmdpoolcreatinfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
151 vkcmdpoolcreatinfo.pNext = NULL;
152 vkcmdpoolcreatinfo.queueFamilyIndex = 0;
153 vkcmdpoolcreatinfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
154
155 if((((mk).m_U0.m_alter.m_ptr->m_vkres) = vkCreateCommandPool(
156 vkdev
157 , &vkcmdpoolcreatinfo
158 , NULL
159 , &vkcmdpool
160 )) != VK_SUCCESS)
161 {
162 printf("Errval: %d\n", (mk).m_U0.m_alter.m_ptr->m_vkres);
163 assert(!"vkCreateCommandPool has failed.");
164 return -1;
165 }
166
167 puts("After vkCreateCommandPool.");
168 fgetc(stdin);
169
170 unless(vkcmdpool) {
171 assert(!"vkCreateCommandPool went null");
172 return -1;
173 }
174 }
175
176 {
177 VkCommandBufferAllocateInfo vkcmdallocinfo;
178 vkcmdallocinfo.commandBufferCount = 1;
179 vkcmdallocinfo.pNext = NULL;
180 vkcmdallocinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
181 vkcmdallocinfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
182 vkcmdallocinfo.commandPool = vkcmdpool;
183
184 if((mk.m_U0.m_alter.m_ptr->m_vkres =
185 vkAllocateCommandBuffers(
186 (vkdev)
187 , &vkcmdallocinfo
188 , &vkcmdbuf
189 )) != VK_SUCCESS)
190 {
191 printf("Errval: %d\n", (mk).m_U0.m_alter.m_ptr->m_vkres);
192 assert(!"vkAllocateCommandBuffers has failed.");
193 return -1;
194 }
195
196 puts("After vkAllocateCommandBuffers.");
197 fgetc(stdin);
198
199 unless((vkcmdbuf))
200 {
201 printf("Errval: %d\n", (mk).m_U0.m_alter.m_ptr->m_vkres);
202 assert(!"vkAllocateCommandBuffers went null.");
203 return -1;
204 }
205 }
206
207 {
208 ae2fVK_AnnSlpCreatDescPool_t v_poolmk;
209 ae2fVK_AnnSlpDescPoolCmdMk_t v_cmdmk;
210
211 ae2fVK_AnnSlpDescPool v_descpool;
212 ae2fVK_AnnSlpDescPoolCmd v_descpoolcmd;
213
214
215 ae2f_err_t err = 0;
216
217 puts("Before __ae2fVK_AnnSlpPredictPerformed_imp");
218
219 /** Getting pool */
221 v_poolmk
222 , v_descpool
223 , err
224 , (mk.m_U0.m_alter.m_ptr[0])
225 , VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
226 , 1
227 );
228
229 /** Getting predict command */
231 v_cmdmk
232 , (mk.m_U0.m_alter.m_ptr[0])
233 , err
234 , v_descpool
235 , v_descpoolcmd
236 , vkcmdbuf
237 );
238
239 puts("After __ae2fVK_AnnSlpPredictPerformed_imp");
240 fgetc(stdin);
241
242 if(err != ae2f_errGlob_OK) {
243 if (err & ae2f_errGlob_NFOUND)
244 printf(
245 "Vulkan state number %d: \n"
246 , mk.m_U0.m_alter.m_ptr->m_vkres
247 );
248
249 printf("Error value %x, \n", err);
250 assert(!"__ae2fVK_AnnSlpPredictPerformed_imp has failed.");
251 return -1;
252 }
253
254 unless((v_descpoolcmd).m_vkdescset) {
255 assert(!"__ae2fVK_AnnSlpPredictPerformed_imp went null.");
256 return -1;
257 }
258
259 {
260 VkSubmitInfo submit_info = {
261 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
262 .commandBufferCount = 1,
263 .pCommandBuffers = &vkcmdbuf,
264 };
265
266 ae2fVK_AnnSlpUnMap_t v_unmap;
267
269 * OutputMapped = NULL,
270 * InputMapped = NULL
271 ;
272
273 if (vkQueueSubmit(
274 vkqueue
275 , 1
276 , &submit_info
277 , VK_NULL_HANDLE
278 ) != VK_SUCCESS)
279 {
280 assert(!"vkQueueSubmit failed");
281 return -1;
282 }
283
284 if (vkQueueWaitIdle(vkqueue) != VK_SUCCESS) {
285 assert(!"vkQueueWaitIdle failed");
286 return -1;
287 }
288
289 puts("After vkQueueSubmit");
290 fgetc(stdin);
291
292 if (vkQueueSubmit(
293 vkqueue
294 , 1
295 , &submit_info
296 , VK_NULL_HANDLE
297 ) != VK_SUCCESS)
298 {
299 assert(!"vkQueueSubmit failed");
300 return -1;
301 }
302
303 if (vkQueueWaitIdle(vkqueue) != VK_SUCCESS) {
304 assert(!"vkQueueWaitIdle failed");
305 return -1;
306 }
307
308 puts("After vkQueueSubmit 2");
309 fgetc(stdin);
310
311 if (vkQueueSubmit(
312 vkqueue
313 , 1
314 , &submit_info
315 , VK_NULL_HANDLE
316 ) != VK_SUCCESS)
317 {
318 assert(!"vkQueueSubmit failed");
319 return -1;
320 }
321
322 if (vkQueueWaitIdle(vkqueue) != VK_SUCCESS) {
323 assert(!"vkQueueWaitIdle failed");
324 return -1;
325 }
326
327 puts("After vkQueueSubmit 3");
328 fgetc(stdin);
329
330 puts("After vkQueueWaitIdle");
331 fgetc(stdin);
332
333 /** Check is required, but not planned to write for no */
335 &err
336 , mk.m_U0.m_alter.m_ptr
337 , &InputMapped
338 , &OutputMapped
339 );
340
341 assert(OutputMapped);
342 assert((mk.m_U0.m_alter.m_ptr[0].m_vkres) == VK_SUCCESS);
343
344 printf("Inputmapped before predict: %f %f\n", InputMapped[0], InputMapped[1]);
345 printf("Outputmapped after prediction %f\n", OutputMapped[0]);
346
348 v_unmap
349 , *mk.m_U0.m_alter.m_ptr
350 );
351 }
352
354 mk.m_U0.m_alter.m_ptr[0]
355 , v_descpool
356 , v_descpoolcmd
357 );
358
360 mk.m_U0.m_alter.m_ptr[0]
361 , v_descpool
362 );
363 }
364
365 __ae2fVK_AnnSlpClean_imp((*mk.m_U0.m_alter.m_ptr));
366 vkFreeCommandBuffers(vkdev, vkcmdpool, 1, &vkcmdbuf);
367 vkDestroyCommandPool(vkdev, vkcmdpool, NULL);
368
369 memset(mk.m_U0.m_alter.m_ptr, 0, sizeof(*mk.m_U0.m_alter.m_ptr));
370 free(mk.m_U0.m_alter.m_ptr);
371
372 memset(&mk, 0, sizeof(mk));
373 Test_VkEnd();
374 return 0;
375}
376
377#else
378
379int main() {
380 return 0;
381}
382
383#endif
#define unless(...)
Invokes when condition is false.
Definition Cast.h:103
ae2f_float ae2f_float_t
Definition Float.h:38
VkMappedMemoryRange ae2fVK_AnnSlpUnMap_t
Definition Slp.core.h:152
#define __ae2fVK_AnnSlpDescPoolMk_imp(v_descpool, r_pool, r_reterr, iv_slp, i_vkdescpoolcreatflags, i_vkmaxdescsets)
#define __ae2fVK_AnnSlpDescPoolCmdMkPredict_imp(v_cmdmk, iv_slp, iv_err, i_pool, r_cmd, i_vkcmdbuf)
#define __ae2fVK_AnnSlpDescPoolCmdClean_imp(iv_slp, i_pool, i_cmd)
#define __ae2fVK_AnnSlpDescPoolClean_imp(i_slp, i_pool)
size_t mapinp
#define fgetc(...)
ae2f_float_t * map
ae2fVK_AnnSlpMk_t mk
#define ae2f_errGlob_OK
The Operation you've wanted went successful.
Definition errGlob.h:23
#define ae2f_errGlob_NFOUND
Found some errors, but not by parameters. The operation has failed.
Definition errGlob.h:50
uint8_t ae2f_err_t
Informs that this number represents the error.
Definition errGlob.h:19
#define __ae2fVK_AnnSlpIOMap(r_err, slp, ir_ptrinp, ir_ptrout)
Definition Slp.auto.h:1154
#define __ae2fVK_AnnSlpWBMap(r_err, slp, ir_ptrweight, ir_ptrbias)
Maps Weight and Bias.
Definition Slp.auto.h:1087
#define __ae2fVK_AnnSlpMk_imp(v_mk, weight_opt, bias_opt, cache_opt, inc, outc, prm_offset, extra, act, actderiv, lossderiv, learningrate, learningrate_bias, vkdev, vkmemprops, vkalloccalls, vkcldeclaration, vkcldefinition)
Make slp with OpenCL compute shader.
Definition Slp.auto.h:389
#define __ae2fVK_AnnSlpIOUnMap_imp(v_out, vi_slp)
Definition Slp.auto.h:1133
#define __ae2fVK_AnnSlpClean_imp(block)
Definition Slp.auto.h:941
#define __ae2fVK_AnnSlpWBUnMap_imp(v_out, vi_slp)
Unmaps Weight and Bias.
Definition Slp.auto.h:1067