Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 9820 → Rev 9821

/programs/develop/libraries/nnp/about.htm
53,6 → 53,7
<ul>
<li><a href="#f_init">lib_init</a></li>
<li><a href="#f_create">NNP_Create</a></li>
<li><a href="#f_reset">NNP_Reset</a></li>
<li><a href="#f_feedf">NNP_FeedForward</a></li>
<li><a href="#f_backp">NNP_BackPropagation</a></li>
<li><a href="#f_getmd">NNP_GetMemData</a></li>
62,6 → 63,7
</li>
<li><a href="#const">Êîíñòàíòû</a></li>
<li><a href="#tabl_e">Òàáëèöà ýêñïîðòà</a></li>
<li><a href="#ex1">Ïðèìåð</a></li>
<li><a href="#hist">Èñòîðèÿ</a></li>
</ul>
 
69,7 → 71,7
<p>Äîêóìåíòàöèÿ ê áèáëèîòåêå <b>nnp.obj</b>, äëÿ <b>ÎÑ Êîëèáðè</b>. Ýòà áèáëèîòåêà ñîçäàíà äëÿ ðàáîòû ñ íåéðîñåòÿìè (neural network perceptron). Âèäåî ïî íåéðîñåòÿì: <a href="https://www.youtube.com/watch?v=GNcGPw_Kb_0">1</a>,
<a href="https://www.youtube.com/watch?v=wzIOl4hWP3U">2</a>. Èñõîäíûé êîä (ÿçûê java), íà îñíîâå êîòîðîãî äåëàëñü áèáëèîòåêà: <a href="https://github.com/ArtemOnigiri/SimpleNN">3</a>.</p>
 
<p>Ïîñëåäíåå îáíîâëåíèå áèáëèîòåêè 01.03.22.</p>
<p>Ïîñëåäíåå îáíîâëåíèå áèáëèîòåêè 28.05.22.</p>
 
<h1><a name="fun">Ôóíêöèè</a></h1>
 
96,7 → 98,7
nnlopt dd 2,8,8,8,8,8,3
...
stdcall [NNP_Create], nnp_0, 0.01, 0, 0, nnlopt, NNLOPT_LEN</pre>
<p>ãäå nnp_0 - ñòðóêòóðà áóôåðà.</p>
<p>ãäå nnp_0 - ñòðóêòóðà íåéðîñåòè.</p>
<p>0.01 - ñêîðîñòü îáó÷åíèÿ.</p>
<p>0 - àäðåñ ôóíêöèè àêòèâàöèè, åñëè 0 òî áåðåòñÿ ñòàíäàðòíàÿ ôóíêöèÿ âíóòðè áèáëèîòåêè.</p>
<p>0 - àäðåñ ôóíêöèè ñâ¸ðòêè, åñëè 0 òî áåðåòñÿ ñòàíäàðòíàÿ ôóíêöèÿ âíóòðè áèáëèîòåêè.</p>
103,12 → 105,17
<p>nnlopt - ìàññèâ ñ ÷èñëîì íåéðîíîâ íà êàæäîì ñëîå.</p>
<p>NNLOPT_LEN - äëèííà ìàññèâà nnlopt.</p>
 
<h4><a name="f_reset">NNP_Reset</a></h4>
<p>Ñáðîñ ïàðàìåòðîâ íåéðîñåòè. Äëÿ êàæäîãî ñëîÿ áàçèñíûé âåêòîð è âåñà çàïîëíÿþòñÿ ñëó÷àéíûìè ÷èñëàìè îò -1 äî 1. Òàêèå æå äåéñòâèÿ ïðîèñõîäÿò â êîíñòðóêòîðå NNP_Create.</p>
<pre>stdcall [NNP_Reset], nnp_0</pre>
<p>ãäå nnp_0 - ñòðóêòóðà íåéðîñåòè.</p>
 
<h4><a name="f_feedf">NNP_FeedForward</a></h4>
<p>Ôóíêöèÿ ðàñ÷åòà çíà÷åíèé âûõîäíûõ íåéðîíîâ. Íà âõîä ïîäàþòüñÿ çíà÷åíèÿ âõîäíûõ íåéðîíîâ. Íà âûõîäå âîçâðàùàåòñÿ óêàçàòåëü íà ñëîé âûõîäíûõ íåéðîíîâ.</p>
<pre>n_input dq ?,?,?
...
stdcall [NNP_FeedForward], nnp_0,n_input</pre>
<p>ãäå nnp_0 - ñòðóêòóðà áóôåðà, n_input - óêàçàòåëü íà äàííûå âõîäíûõ íåéðîíîâ.</p>
<p>ãäå nnp_0 - ñòðóêòóðà íåéðîñåòè, n_input - óêàçàòåëü íà äàííûå âõîäíûõ íåéðîíîâ.</p>
 
<h4><a name="f_backp">NNP_BackPropagation</a></h4>
<p>Ôóíêöèÿ äëÿ îáó÷åíèÿ ñåòè. Ïðèìåð:</p>
115,7 → 122,7
<pre>n_targ dq ?,?,?
...
stdcall [NNP_BackPropagation], nnp_0, n_targ</pre>
<p>ãäå nnp_0 - ñòðóêòóðà áóôåðà, n_targ - óêàçàòåëü íà äàííûå äëÿ îáó÷åíèÿ ñåòè.</p>
<p>ãäå nnp_0 - ñòðóêòóðà íåéðîñåòè, n_targ - óêàçàòåëü íà äàííûå äëÿ îáó÷åíèÿ ñåòè.</p>
 
<h4><a name="f_getmd">NNP_GetMemData</a></h4>
<p>Áåðåò äàííûå íåéðîñåòè è çàïèñûâàåò èõ â óêàçàííîå ìåñòî â ïàìÿòè. Ïðèìåð:</p>
122,14 → 129,14
<pre>f_data dd ?
...
stdcall [NNP_GetMemData], nnp_0, NNP_FF_JSON, [f_data]</pre>
<p>ãäå nnp_0 - ñòðóêòóðà áóôåðà, f_data - óêàçàòåëü íà äàííûå äëÿ çàïèñè ïàðàìåòðîâ ñåòè.</p>
<p>ãäå nnp_0 - ñòðóêòóðà íåéðîñåòè, f_data - óêàçàòåëü íà äàííûå äëÿ çàïèñè ïàðàìåòðîâ ñåòè.</p>
 
<h4><a name="f_setmd">NNP_SetMemData</a></h4>
<p>Áåðåò äàííûå èç óêàçàííîãî ìåñòà ïàìÿòè è çàïèñûâàåò èõ â íåéðîñåòü. Ïðèìåð:</p>
<p>Áåðåò äàííûå èç óêàçàííîãî ìåñòà ïàìÿòè è çàïèñûâàåò èõ â íåéðîñåòü.  ñëó÷àå óñïåõà â ðåãèñòðå eax âîçâðàùàåòñÿ 0, èíà÷å óêàçàòåëü íà ñòðîêó ñ òåêñòîì îøèáêè. Ïðèìåð:</p>
<pre>f_data dd ?
...
stdcall [NNP_SetMemData], nnp_0, NNP_FF_JSON, [f_data]</pre>
<p>ãäå nnp_0 - ñòðóêòóðà áóôåðà, f_data - óêàçàòåëü íà äàííûå ñ ïàðàìåòðàìè ñåòè.</p>
<p>ãäå nnp_0 - ñòðóêòóðà íåéðîñåòè, f_data - óêàçàòåëü íà äàííûå ñ ïàðàìåòðàìè ñåòè.</p>
 
<h4><a name="f_delete">NNP_Destroy</a></h4>
<p>Îñâîáîæäàåò ïàìÿòü çàíÿòóþ íåéðîñåòüþ.</p>
145,24 → 152,31
<pre>align 4
import_nnp_lib:
dd sz_lib_init
NNP_Create dd sz_nnp_create
NNP_FeedForward dd sz_nnp_FeedForward
NNP_BackPropagation dd sz_nnp_BackPropagation
NNP_GetMemData dd sz_nnp_GetMemData
NNP_SetMemData dd sz_nnp_SetMemData
NNP_Destroy dd sz_nnp_Destroy
NNP_Create dd sz_create
NNP_Reset dd sz_reset
NNP_FeedForward dd sz_feedforward
NNP_BackPropagation dd sz_backpropagation
NNP_GetMemData dd sz_getmemdata
NNP_SetMemData dd sz_setmemdata
NNP_Destroy dd sz_destroy
dd 0,0
sz_lib_init db 'lib_init',0
sz_nnp_create db 'NNP_Create',0
sz_nnp_FeedForward db 'NNP_FeedForward',0
sz_nnp_BackPropagation db 'NNP_BackPropagation',0
sz_nnp_GetMemData db 'NNP_GetMemData',0
sz_nnp_SetMemData db 'NNP_SetMemData',0
sz_nnp_Destroy db 'NNP_Destroy',0
sz_create db 'NNP_Create',0
sz_reset db 'NNP_Reset',0
sz_feedforward db 'NNP_FeedForward',0
sz_backpropagation db 'NNP_BackPropagation',0
sz_getmemdata db 'NNP_GetMemData',0
sz_setmemdata db 'NNP_SetMemData',0
sz_destroy db 'NNP_Destroy',0
</pre>
 
<h1><a name="ex1">Ïðèìåð</a></h1>
<p> äàííîì ïðèìåðå ñîçäàþòñÿ 8 îáúåêòîâ (òî÷åê ñ êîîðäèíàòàìè x, y), êàæäûé èç êîòîðûõ èìååò òèï 0 (ñèíèå) èëè 1 (çåëåíûå). Ïðè íàæàòèè êíîïêè <img src="but05.png"> ïðîèñõîäèò òðåíèðîâêà íåéðîñåòè.  ïðîöåññå òðåíèðîâêè íåéðîñåòü ó÷èòñÿ îïðåäåëÿòü êàêîé öâåò äîëæåí ñîîòâåòñòâîâàòü çàäàííûì êîîðäèíàòàì x, y. Òðåíèðîâàòü ñåòü ìîæíî ìíîãî ðàç, ÷èñëî öèêëîâ òðåíèðîâêè ïîêàçàíî â çàãîëîâêå îêíà. Êíîïêà <img src="but04.png"> ïåðåñòàâëÿåò òî÷êè ñëó÷àéíûì îáðàçîì. Êíîïêà <img src="but01.png"> ñáðàñûâàåò ñîñòîÿíèå íåéðîñåòè.</p>
<p><img src="img01.png"></p>
<p>Ðèñ. 1. Ïðèìåð èñïîëüçîâàíèÿ áèáëèîòåêè</p>
 
<h1><a name="hist">Èñòîðèÿ</a></h1>
<p>01.03.22 - ñàìàÿ ïåðâàÿ âåðñèÿ áèáëèîòåêè (ïðèìåðû èñïîëüçîâàíèÿ âîçìîæíî áóäóò ïîçæå).</p>
 
<p>01.03.22 - ñàìàÿ ïåðâàÿ âåðñèÿ áèáëèîòåêè.</p>
<p>28.05.22 - ïðèìåð èñïîëüçîâàíèÿ áèáëèîòåêè, íîâàÿ ôóíêöèÿ NNP_Reset, îáíîâëåíèå ôóíêöèè NNP_SetMemData.</p>
</body>
</html>
/programs/develop/libraries/nnp/but01.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/nnp/but04.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/nnp/but05.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/nnp/examples/build.bat
0,0 → 1,6
if not exist bin mkdir bin
@fasm.exe ..\nnp.asm bin\nnp.obj
 
@fasm.exe -m 16384 nnp_points.asm bin\nnp_points.kex
@kpack nnp_points.kex
pause
/programs/develop/libraries/nnp/examples/nnp_points.asm
0,0 → 1,747
use32
org 0
db 'MENUET01' ;¨¤¥­â¨ä. ¨á¯®«­ï¥¬®£® ä ©«  ¢á¥£¤  8 ¡ ©â
dd 1, start, i_end, mem, stacktop, 0, sys_path
 
include '../../../../macros.inc'
include '../../../../proc32.inc'
include '../../../../KOSfuncs.inc'
include '../../../../load_img.inc'
include '../../../../load_lib.mac'
include '../../../../develop/libraries/box_lib/trunk/box_lib.mac'
 
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
caption db 'NNP example 28.05.22',0 ;¯®¤¯¨áì ®ª­ 
 
run_file_70 FileInfoBlock
 
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
image_data_toolbar dd 0
 
memory_file_size dd 512*1024 ;à §¬¥à ¯ ¬ï⨠¤«ï ®âªàëâ¨ï ä ©«®¢ (¢ ­ ç «¥ 512 Kb, ­® ¬®¦¥â 㢥«¨ç¨¢ âáï ¯à¨ ­¥®¡å®¤¨¬®áâ¨)
 
NNP_FF_BIN equ 0x6e6962
NNP_FF_JSON equ 0x6e6f736a
 
struct NeuralNetwork
learningRate dq ? ;+ 0 ᪮à®áâì ®¡ã祭¨ï
layers dd ? ;+ 8 [] á«®¨
layers_length dd ? ;+12 ç¨á«® á«®¥¢
activation dd ? ;+16 㪠§ â¥«ì ­  äã­ªæ¨î  ªâ¨¢ æ¨¨
derivative dd ? ;+20 㪠§ â¥«ì ­  äã­ªæ¨î
errors dd ? ;+24 ¬ áᨢ ¤«ï ¢ëç¨á«¥­¨©
errorsNext dd ? ;+28
gradients dd ? ;+32
deltas dd ? ;+36
ends
 
struct Point
x dq ? ;double
y dq ?
t dd ? ;long
ends
 
align 4
NNLOPT_LEN equ 4
nnlopt dd 2,3,3,2
_nn NeuralNetwork
lea_rate dq 0.01
 
POINTS_COUNT equ 8 ;ç¨á«® â®ç¥ª
_p rb sizeof.Point*POINTS_COUNT
 
_cycles_st dd 0
_r_op rb 128
txt_error db '"Error open: ',39,'%s',39,'" -tE',0
txt_cycles db 'Cycles = %i000',0
 
;Œ ªà®á ¤«ï ¯ à ¬¥â஢ ⨯  double (8 ¡ ©â)
macro glpush double_v {
push dword[double_v+4]
push dword[double_v]
}
 
align 8
proc __ftol
sub esp,12
wait
fstcw word[esp+8]
wait
mov al,[esp+9]
or byte[esp+9],0x0c
fldcw word[esp+8]
fistp qword[esp]
mov [esp+9],al
fldcw word[esp+8]
mov eax,[esp]
mov edx,[esp+4]
add esp,12
ret
endp
 
align 16
Math_random:
imul eax,dword[_rand_x],22695477
inc eax
push ecx
mov dword[_rand_x],eax
and eax,65535
mov dword[esp],eax
fild dword[esp]
fmul dword[@f]
pop edx
ret
align 4
@@:
db 0,0,128,55 ;dd 1.0/65536.0
_rand_x dd 0
 
 
align 8
start:
load_libraries l_libs_start,l_libs_end
;¯à®¢¥àª  ­  ᪮«ìª® 㤠筮 § £ã§¨« áì ¡¨¡«¨®â¥ª 
mov ebp,lib_0
cmp dword [ebp+ll_struc_size-4],0
jz @f
mcall SF_TERMINATE_PROCESS
@@:
mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
mcall SF_SET_EVENTS_MASK,0xC0000027
stdcall [OpenDialog_Init],OpenDialog_data ;¯®¤£®â®¢ª  ¤¨ «®£ 
stdcall [buf2d_create], buf_0 ;ᮧ¤ ­¨¥ ¡ãä¥à 
 
include_image_file 'toolbar.png', image_data_toolbar
 
stdcall mem.Alloc,[memory_file_size]
mov dword[open_file],eax
 
push NNLOPT_LEN
push nnlopt
push 0
push 0
glpush lea_rate
stdcall [NNP_Create], _nn
call but_update
 
align 8
red_win:
call draw_window
 
align 16
still:
mcall SF_WAIT_EVENT
 
cmp al,1
jz red_win
cmp al,2
jz key
cmp al,3
jz button
cmp al,6 ;¬ëèì
jne @f
jmp mouse
@@:
jmp still
 
align 8
draw_window:
pushad
mcall SF_REDRAW,SSF_BEGIN_DRAW
 
; *** à¨á®¢ ­¨¥ £« ¢­®£® ®ª­  (¢ë¯®«­ï¥âáï 1 à § ¯à¨ § ¯ã᪥) ***
mov edx,[sc.work]
or edx,(3 shl 24)+0x30000000
mov edi,caption
mcall SF_CREATE_WINDOW, (20 shl 16)+590, (20 shl 16)+540
 
; *** ᮧ¤ ­¨¥ ª­®¯®ª ­  ¯ ­¥«ì ***
mov esi,[sc.work_button]
mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (5 shl 16)+20, 3
 
add ebx,(25 shl 16)
mov edx,4
int 0x40
 
add ebx,(25 shl 16)
mov edx,5
int 0x40
 
add ebx,(30 shl 16)
mov edx,6
int 0x40
 
add ebx,(25 shl 16)
mov edx,7
int 0x40
 
; *** à¨á®¢ ­¨¥ ¨ª®­®ª ­  ª­®¯ª å ***
mcall SF_PUT_IMAGE, [image_data_toolbar], (16 shl 16)+16, (7 shl 16)+7 ;icon new
 
add ebx,IMAGE_TOOLBAR_ICON_SIZE
add edx,(25 shl 16) ;icon open
int 0x40
add ebx,IMAGE_TOOLBAR_ICON_SIZE
add edx,(25 shl 16) ;icon save
int 0x40
 
add ebx,IMAGE_TOOLBAR_ICON_SIZE
add edx,(30 shl 16) ;icon update points
int 0x40
add ebx,IMAGE_TOOLBAR_ICON_SIZE
add edx,(25 shl 16) ;icon calculate
int 0x40
 
call PointsDraw
; *** à¨á®¢ ­¨¥ ¡ãä¥à  ***
stdcall [buf2d_draw], buf_0
 
mcall SF_REDRAW,SSF_END_DRAW
popad
ret
 
align 8
key:
mcall SF_GET_KEY
jmp still
 
align 8
mouse:
 
jmp still
 
align 8
button:
mcall SF_GET_BUTTON
cmp ah,3
jne @f
call but_new_file
jmp red_win
@@:
cmp ah,4
jne @f
call but_open_file
jmp red_win
@@:
cmp ah,5
jne @f
call but_save_file
jmp red_win
@@:
cmp ah,6
jne @f
call but_update
jmp red_win
@@:
cmp ah,7
jne @f
call but_calc
jmp red_win
@@:
cmp ah,1
jne still
.exit:
stdcall [buf2d_delete],buf_0
stdcall mem.Free,[image_data_toolbar]
stdcall mem.Free,[open_file]
stdcall [NNP_Destroy], _nn
mcall SF_TERMINATE_PROCESS
 
align 8
but_calc:
push esi edi ebp
add esp,-32
mov ebp,_p
xor edi,edi ;i=0
.cycle_0: ;for(i=0;i<50000;i++)
call Math_random
fimul dword[.172]
call __ftol
mov esi,eax ;k=(long)(Math_random()*POINTS_COUNT)
imul esi,sizeof.Point
fld qword[ebp+esi+Point.x]
fsub dword[f_0_5]
fstp qword[esp] ;v[0]=p[k].x-.5
fld qword[ebp+esi+Point.y]
fsub dword[f_0_5]
fstp qword[esp+8] ;v[1]=p[k].y-.5
stdcall [NNP_FeedForward], _nn,esp ;r=NNP_FeedForward(&nn,v)
 
xor eax,eax
mov dword[esp+16],eax
mov dword[esp+20],eax ;t[0]=0.0
mov dword[esp+24],eax
mov dword[esp+28],eax ;t[1]=0.0
cmp dword[ebp+esi+Point.t],eax
je .173
mov dword[esp+16],eax
mov dword[esp+20],1072693248 ;if(p[k].t) t[0]=1.0
jmp .174
.173:
mov dword[esp+24],eax
mov dword[esp+28],1072693248 ;else t[1]=1.0
.174:
lea edx,dword[esp+16]
stdcall [NNP_BackPropagation], _nn,edx ;NNP_BackPropagation(&nn,t)
inc edi ;i++
cmp edi,50000
jl .cycle_0
add dword[_cycles_st],50
stdcall [sprintf], _r_op,txt_cycles,[_cycles_st]
add esp,12
call NNP_DrawInBuf
call PointsDraw
; SaveNN("/tmp0/1/nnp_end.txt")
;push s@+835
;call @@SaveNN$qpxc
;pop ecx
mcall SF_SET_CAPTION,1,_r_op
add esp,32
pop ebp edi esi
ret
align 4
.172:
dd POINTS_COUNT
 
align 8
but_new_file:
mov dword[_cycles_st],0
stdcall [NNP_Reset], _nn
call NNP_DrawInBuf
call PointsDraw
ret
 
align 8
but_update:
mov dword[_cycles_st],0
call PointsInit
call NNP_DrawInBuf
call PointsDraw
ret
 
align 8
PointsInit:
push ebx esi
xor esi,esi ;i=0
mov ebx,_p
.cycle_0: ;for(i=0;i<POINTS_COUNT;i++)
call Math_random
fstp qword[ebx+Point.x] ;p[i].x=Math_random()
call Math_random
fstp qword[ebx+Point.y] ;p[i].y=Math_random()
mov eax,esi
and eax,1
mov dword[ebx+Point.t],eax ;p[i].t=i&1
add ebx,sizeof.Point
inc esi ;i++
cmp esi,POINTS_COUNT
jl .cycle_0
pop esi ebx
ret
 
align 8
PointsDraw:
push ebx ecx esi edi ebp
xor ecx,ecx
mov ebx,_p
align 4
.cycle_0: ;for(i=0;i<POINTS_COUNT;i++)
fild dword[buf_0.w]
fmul qword[ebx+Point.x]
call __ftol
fild dword[buf_0.h]
mov esi,eax ;x=p[i].x*buf0.w
fmul qword[ebx+Point.y]
call __ftol
mov edi,eax ;y=p[i].y*buf0.h
 
mov ebp,255 ;c=0xff
cmp dword[ebx+Point.t],0
je @f
shl ebp,8 ;if(p[i].t) c<<=8
@@:
sub esi,4
sub edi,4
stdcall [buf2d_rect_by_size], buf_0,esi,edi,7,7,0xffffff
inc esi
inc edi
stdcall [buf2d_filled_rect_by_size], buf_0,esi,edi,5,5,ebp
inc ecx
add ebx,sizeof.Point
cmp ecx,POINTS_COUNT
jl .cycle_0
pop ebp edi esi ecx ebx
ret
 
align 8
NNP_DrawInBuf:
push ebx esi ebp
add esp,-32
lea ebp,dword [esp+16]
; ebp = &v
xor eax,eax
mov dword [esp+8],eax
mov dword [esp+12],eax
jmp .cycle_0_end
.cycle_0: ;for(y=0;y<buf0.h;y++)
fild dword [buf_0.h]
fdivr qword [esp+8]
fsub dword [f_0_5]
fstp qword [ebp+8] ;v[1]=(double)y/buf0.h-.5
xor eax,eax
mov dword [esp],eax
mov dword [esp+4],eax
jmp .cycle_1_end
.cycle_1: ;for(x=0;x<buf0.w;x++)
fild dword [buf_0.w]
fdivr qword [esp]
fsub dword [f_0_5]
fstp qword [ebp] ;v[0]=(double)x/buf0.w-.5
stdcall [NNP_FeedForward], _nn,ebp
mov esi,eax ;r=NNP_FeedForward(&nn,v)
fld qword [esi]
fmul dword [f_255_0]
call __ftol
movzx ebx,al ;k=(unsigned char)(r[0]*255.0)
shl ebx,8 ;k<<=8
fld qword [esi+8]
fmul dword [f_255_0]
call __ftol
and eax,0xff
add ebx,eax ;k+=(unsigned char)(r[1]*255.0)
push ebx
fld qword [esp+12]
call __ftol
push eax
fld qword [esp+8]
call __ftol
stdcall [buf2d_set_pixel], buf_0,eax ;buf2d_set_pixel(&buf0,x,y,k)
fld1
fadd qword [esp]
fstp qword [esp]
.cycle_1_end:
fild dword [buf_0.w]
fcomp qword [esp]
fnstsw ax
sahf
ja .cycle_1
fld1
fadd qword [esp+8]
fstp qword [esp+8]
.cycle_0_end:
fild dword [buf_0.h]
fcomp qword [esp+8]
fnstsw ax
sahf
ja .cycle_0
add esp,32
pop ebp esi ebx
ret
 
align 4
f_0_5 dd 0.5
f_255_0 dd 255.0
open_file dd 0 ;㪠§ â¥«ì ­  ¯ ¬ïâì ¤«ï ®âªàëâ¨ï ä ©«®¢
open_file_size dd 0 ;à §¬¥à ®âªàë⮣® ä ©«  (¤®«¦¥­ ¡ëâì ­¥ ¡®«ìè¥ memory_file_size)
 
align 8
but_open_file:
pushad
copy_path open_dialog_name,communication_area_default_path,file_name,0
mov [OpenDialog_data.type],0
stdcall [OpenDialog_Start],OpenDialog_data
cmp [OpenDialog_data.status],2
je .end_open_file
;ª®¤ ¯à¨ 㤠筮¬ ®âªàë⨨ ¤¨ «®£ 
 
mov [run_file_70.Function], SSF_GET_INFO
mov [run_file_70.Position], 0
mov [run_file_70.Flags], 0
mov dword[run_file_70.Count], 0
m2m [run_file_70.Buffer], [open_file]
mov byte[run_file_70+20], 0
mov dword[run_file_70.FileName], openfile_path
mcall SF_FILE,run_file_70
cmp eax,0
jne .end_open_file
 
mov eax,[open_file]
mov ebx,[eax+32] ;dword[eax+32] - à §¬¥à ®âªà뢠¥¬®£® ä ©« 
mov [open_file_size],ebx ;ebx - à §¬¥à ®âªà뢠¥¬®£® ä ©« 
;memory_file_size - à §¬¥à ¢ë¤¥«¥­­®© ¯ ¬ï⨠¤«ï ä ©« 
cmp [memory_file_size],ebx
jge @f
;㢥«¨ç¨¢ ¥¬ ¯ ¬ïâì ¥á«¨ ­¥ 墠⨫®
mov [memory_file_size],ebx
stdcall mem.ReAlloc, [open_file],ebx
mov [open_file],eax
@@:
 
mov [run_file_70.Function], SSF_READ_FILE
mov [run_file_70.Position], 0
mov [run_file_70.Flags], 0
m2m dword[run_file_70.Count], dword[open_file_size]
m2m dword[run_file_70.Buffer],dword[open_file]
mov byte[run_file_70+20], 0
mov dword[run_file_70.FileName], openfile_path
mcall SF_FILE,run_file_70 ;§ £à㦠¥¬ ä ©«
cmp ebx,0xffffffff
je .end_open_file
 
mov [open_file_size],ebx
mcall SF_SET_CAPTION,1,openfile_path
 
stdcall [NNP_SetMemData], _nn,NNP_FF_JSON,[open_file]
or eax,eax
jnz @f
mov dword[_cycles_st],0
call NNP_DrawInBuf
call PointsDraw
jmp .end_open_file
@@:
stdcall [sprintf], _r_op,txt_error,eax
add esp,12
notify_window_run _r_op
.end_open_file:
popad
ret
 
align 8
but_save_file:
pushad
copy_path open_dialog_name,communication_area_default_path,file_name,0
mov [OpenDialog_data.type],1
stdcall [OpenDialog_Set_file_ext],OpenDialog_data,Filter.1
stdcall [OpenDialog_Start],OpenDialog_data
cmp [OpenDialog_data.status],2
je .end_save_file
;ª®¤ ¯à¨ 㤠筮¬ ®âªàë⨨ ¤¨ «®£ 
 
mov [run_file_70.Function], SSF_CREATE_FILE
mov [run_file_70.Position], 0
mov [run_file_70.Flags], 0
 
stdcall [NNP_GetMemData], _nn,NNP_FF_JSON,[open_file]
stdcall [strlen], [open_file]
pop ebx ;add esp,4
mov ebx, [open_file]
mov [run_file_70.Buffer], ebx
mov [open_file_size],eax
 
mov dword[run_file_70.Count], eax ;à §¬¥à ä ©« 
mov byte[run_file_70+20], 0
mov dword[run_file_70.FileName], openfile_path
mcall SF_FILE,run_file_70 ;á®å࠭塞 ä ©«
;cmp ebx,0xffffffff
;je .end_save_file
; ... á®®¡é¥­¨¥ ® ­¥ã¤ ç­®¬ á®åà ­¥­¨¨ ...
 
.end_save_file:
popad
ret
 
 
;¤ ­­ë¥ ¤«ï ¤¨ «®£  ®âªàëâ¨ï ä ©«®¢
align 4
OpenDialog_data:
.type dd 0 ;0 - ®âªàëâì, 1 - á®åà ­¨âì, 2 - ¢ë¡à âì ¤â४â®à¨î
.procinfo dd procinfo ;+4
.com_area_name dd communication_area_name ;+8
.com_area dd 0 ;+12
.opendir_path dd plugin_path ;+16
.dir_default_path dd default_dir ;+20
.start_path dd file_name ;+24 ¯ãâì ª ¤¨ «®£ã ®âªàëâ¨ï ä ©«®¢
.draw_window dd draw_window ;+28
.status dd 0 ;+32
.openfile_path dd openfile_path ;+36 ¯ãâì ª ®âªà뢠¥¬®¬ã ä ©«ã
.filename_area dd filename_area ;+40
.filter_area dd Filter
.x:
.x_size dw 420 ;+48 ; Window X size
.x_start dw 10 ;+50 ; Window X position
.y:
.y_size dw 320 ;+52 ; Window y size
.y_start dw 10 ;+54 ; Window Y position
 
default_dir db '/sys',0
 
communication_area_name:
db 'FFFFFFFF_open_dialog',0
open_dialog_name:
db 'opendial',0
communication_area_default_path:
db '/sys/File managers/',0
 
Filter:
dd Filter.end - Filter ;.1
.1:
db 'TXT',0
db 'JSON',0
db 'BIN',0
.end:
db 0
 
 
system_dir_0 db '/sys/lib/'
lib_name_0 db 'proc_lib.obj',0
system_dir_1 db '/sys/lib/'
lib_name_1 db 'libimg.obj',0
system_dir_2 db '/sys/lib/'
lib_name_2 db 'buf2d.obj',0
system_dir_3 db '/sys/lib/'
lib_name_3 db 'nnp.obj',0
system_dir_4 db '/sys/lib/'
lib_name_4 db 'libc.obj',0
 
l_libs_start:
lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib
lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg
lib_2 l_libs lib_name_2, file_name, system_dir_2, import_buf2d
lib_3 l_libs lib_name_3, file_name, system_dir_3, import_nnp
lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libc
l_libs_end:
 
sz_lib_init db 'lib_init',0
 
align 4
import_libimg:
dd sz_lib_init
img_is_img dd aimg_is_img
img_info dd aimg_info
img_from_file dd aimg_from_file
img_to_file dd aimg_to_file
img_from_rgb dd aimg_from_rgb
img_to_rgb dd aimg_to_rgb
img_to_rgb2 dd aimg_to_rgb2
img_decode dd aimg_decode
img_encode dd aimg_encode
img_create dd aimg_create
img_destroy dd aimg_destroy
img_destroy_layer dd aimg_destroy_layer
img_count dd aimg_count
img_lock_bits dd aimg_lock_bits
img_unlock_bits dd aimg_unlock_bits
img_flip dd aimg_flip
img_flip_layer dd aimg_flip_layer
img_rotate dd aimg_rotate
img_rotate_layer dd aimg_rotate_layer
img_draw dd aimg_draw
 
dd 0,0
aimg_is_img db 'img_is_img',0 ;®¯à¥¤¥«ï¥â ¯® ¤ ­­ë¬, ¬®¦¥â «¨ ¡¨¡«¨®â¥ª  ᤥ« âì ¨§ ­¨å ¨§®¡à ¦¥­¨¥
aimg_info db 'img_info',0
aimg_from_file db 'img_from_file',0
aimg_to_file db 'img_to_file',0
aimg_from_rgb db 'img_from_rgb',0
aimg_to_rgb db 'img_to_rgb',0 ;¯à¥®¡à §®¢ ­¨¥ ¨§®¡à ¦¥­¨ï ¢ ¤ ­­ë¥ RGB
aimg_to_rgb2 db 'img_to_rgb2',0
aimg_decode db 'img_decode',0 ; ¢â®¬ â¨ç¥áª¨ ®¯à¥¤¥«ï¥â ä®à¬ â £à ä¨ç¥áª¨å ¤ ­­ëå
aimg_encode db 'img_encode',0
aimg_create db 'img_create',0
aimg_destroy db 'img_destroy',0
aimg_destroy_layer db 'img_destroy_layer',0
aimg_count db 'img_count',0
aimg_lock_bits db 'img_lock_bits',0
aimg_unlock_bits db 'img_unlock_bits',0
aimg_flip db 'img_flip',0
aimg_flip_layer db 'img_flip_layer',0
aimg_rotate db 'img_rotate',0
aimg_rotate_layer db 'img_rotate_layer',0
aimg_draw db 'img_draw',0
 
align 4
import_proclib: ;®¯¨á ­¨¥ íªá¯®àâ¨à㥬ëå ä㭪権
OpenDialog_Init dd aOpenDialog_Init
OpenDialog_Start dd aOpenDialog_Start
;OpenDialog_Set_file_name dd aOpenDialog_Set_file_name
OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext
dd 0,0
aOpenDialog_Init db 'OpenDialog_init',0
aOpenDialog_Start db 'OpenDialog_start',0
;aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0
aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0
 
align 4
import_buf2d:
dd sz_lib_init
buf2d_create dd sz_buf2d_create
buf2d_create_f_img dd sz_buf2d_create_f_img
buf2d_clear dd sz_buf2d_clear
buf2d_draw dd sz_buf2d_draw
buf2d_delete dd sz_buf2d_delete
buf2d_resize dd sz_buf2d_resize
buf2d_rect_by_size dd sz_buf2d_rect_by_size
buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
buf2d_circle dd sz_buf2d_circle
buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
buf2d_bit_blt dd sz_buf2d_bit_blt
;buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
;buf2d_draw_text dd sz_buf2d_draw_text
buf2d_set_pixel dd sz_buf2d_set_pixel
dd 0,0
sz_buf2d_create db 'buf2d_create',0
sz_buf2d_create_f_img db 'buf2d_create_f_img',0
sz_buf2d_clear db 'buf2d_clear',0
sz_buf2d_draw db 'buf2d_draw',0
sz_buf2d_delete db 'buf2d_delete',0
sz_buf2d_resize db 'buf2d_resize',0
sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
sz_buf2d_circle db 'buf2d_circle',0
sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
sz_buf2d_bit_blt db 'buf2d_bit_blt',0
;sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
;sz_buf2d_draw_text db 'buf2d_draw_text',0
sz_buf2d_set_pixel db 'buf2d_set_pixel',0
 
align 4
import_nnp:
dd sz_lib_init
NNP_Create dd sz_create
NNP_Reset dd sz_reset
NNP_FeedForward dd sz_feedforward
NNP_BackPropagation dd sz_backpropagation
NNP_GetMemData dd sz_getmemdata
NNP_SetMemData dd sz_setmemdata
NNP_Destroy dd sz_destroy
dd 0,0
sz_create db 'NNP_Create',0
sz_reset db 'NNP_Reset',0
sz_feedforward db 'NNP_FeedForward',0
sz_backpropagation db 'NNP_BackPropagation',0
sz_getmemdata db 'NNP_GetMemData',0
sz_setmemdata db 'NNP_SetMemData',0
sz_destroy db 'NNP_Destroy',0
 
align 4
import_libc:
strlen dd sz_strlen
sprintf dd sz_sprintf
dd 0,0
sz_strlen db 'strlen',0
sz_sprintf db 'sprintf',0
 
sc system_colors
 
align 16
procinfo process_information
 
align 4
buf_0: dd 0 ;㪠§ â¥«ì ­  ¡ãä¥à ¨§®¡à ¦¥­¨ï
dw 5 ;+4 left
dw 31 ;+6 top
.w: dd 570 ;+8 w
.h: dd 480 ;+12 h
.color: dd 0xffffd0 ;+16 color
db 24 ;+20 bit in pixel
 
align 16
i_end:
rb 2048
stacktop:
sys_path rb 1024
file_name rb 4096
plugin_path rb 4096
openfile_path rb 4096
filename_area rb 256
mem:
/programs/develop/libraries/nnp/examples/toolbar.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/nnp/img01.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/nnp/nnp.asm
100,6 → 100,13
txt_biases db '"biases"',0
txt_weights db '"weights"',0
 
txt_err_layers_neq db 'number of layers does not match',0
txt_err_c_size db "not found value 'c_size'",0
txt_err_sqbrl_b1 db "not found opening '[' for biases",0
txt_err_sqbrl_w1 db "not found opening '[' for weights",0
txt_err_sqbrl_w2 db "not found opening '[[' for weights",0
txt_err_sqbrr_w2 db "not found closing ']]' for weights",0
 
align 16
proc lib_init
mov [mem.alloc], eax
232,8 → 239,7
mov dword[edx+NeuralNetwork.derivative],eax
mov eax,[ebp+32] ;sizes_length
imul eax,sizeof.Layer
push eax
call @$bnwa$qui
stdcall @$bnwa$qui,eax
pop ecx
mov edx,[ebp+8] ;o
mov dword[edx+NeuralNetwork.layers],eax
240,14 → 246,14
mov ecx,[ebp+8] ;o
mov eax,[ebp+32] ;sizes_length
mov dword[ecx+NeuralNetwork.layers_length],eax
xor edi,edi
xor edi,edi ;i=0
mov eax,[ebp+28] ;sizes
lea edx,[eax+4]
mov dword[ebp-8],edx
mov dword[ebp-8],edx ;save &sizes[i+1]
jmp .150
.149:
.cycle_0: ;for (i=0; i < sizes_length; i++)
xor ecx,ecx
mov dword[ebp-4],ecx
mov dword[ebp-4],ecx ;nextSize = 0
mov eax,[ebp+32] ;sizes_length
dec eax
cmp edi,eax
254,7 → 260,7
jae .152
mov edx,[ebp-8]
mov ecx,[edx]
mov dword[ebp-4],ecx
mov dword[ebp-4],ecx ;nextSize = sizes[i+1]
.152:
mov eax,[ebp-4]
push eax
262,38 → 268,38
mov ecx,[edx-4]
push ecx
mov ecx,edi
shl ecx,2
imul ecx,sizeof.Layer
mov eax,[ebp+8] ;o
mov edx,[eax+NeuralNetwork.layers]
lea ecx,[ecx+4*ecx]
add edx,ecx
push edx
call Layer_Create
xor esi,esi
stdcall Layer_Create,edx
xor esi,esi ;j=0
mov eax,[ebp-8]
lea edx,[eax-4]
mov dword[ebp-12],edx
mov dword[ebp-12],edx ;save &sizes[i]
jmp .154
.153:
.cycle_1: ;for (j=0; j < sizes[i]; j++)
call Math_random
fmul dword[f_2_0]
fsub dword[f_1_0]
mov eax,[ebp+8] ;o
lea ecx,[edi+4*edi]
xor ebx,ebx
mov edx,[eax+NeuralNetwork.layers]
mov ecx,[edx+4*ecx+12]
mov ecx,edi
imul ecx,sizeof.Layer
add ecx,[eax+NeuralNetwork.layers]
mov ecx,[ecx+Layer.biases]
fstp qword[ecx+8*esi]
xor ebx,ebx ;k=0
cmp ebx,[ebp-4]
jae .157
@@:
@@: ;for (k=0; k < nextSize; k++)
call Math_random
fmul dword[f_2_0]
fsub dword[f_1_0]
lea eax,[edi+4*edi]
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8] ;o
mov ecx,[edx+NeuralNetwork.layers]
mov eax,[ecx+4*eax+16]
mov eax,[ecx+eax+Layer.weights]
mov edx,[eax+4*esi]
fstp qword[edx+8*ebx]
inc ebx
304,19 → 310,18
.154:
mov ecx,[ebp-12]
cmp esi,[ecx]
jb .153
jb .cycle_1
inc edi
add dword[ebp-8],4
.150:
cmp edi,[ebp+32] ;sizes_length
jb .149
jb .cycle_0
;create errors array
push dword[ebp+8]
call NNP_GetMaxLLen
mov esi,eax
shl esi,4
push esi
call @$bnwa$qui
stdcall @$bnwa$qui,esi
pop ecx
mov edx,[ebp+8]
mov dword[edx+NeuralNetwork.errors],eax
324,15 → 329,13
add eax,esi
mov dword[edx+NeuralNetwork.errorsNext],eax
;create gradients array
push esi
call @$bnwa$qui
stdcall @$bnwa$qui,esi
pop ecx
mov edx,[ebp+8]
mov dword[edx+NeuralNetwork.gradients],eax
;create deltas array
shr esi,1
push esi
call @$bnwa$qui
stdcall @$bnwa$qui,esi
pop ecx
mov edx,[ebp+8]
mov dword[edx+NeuralNetwork.deltas],eax
346,7 → 349,72
f_1_0:
dd 1.0
 
;заполнение случайными числами
;+ 8 NeuralNetwork* o
align 16
NNP_Reset:
push ebp
mov ebp,esp
add esp,-8
push ebx esi edi
 
xor edi,edi ;i=0
jmp .3
.cycle_0: ;for (i=0; i < o->layers_length; i++)
xor esi,esi ;j=0
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8]
add eax,[edx+NeuralNetwork.layers]
mov edx,[eax+Layer.n_size]
mov [ebp-4],edx
mov edx,[eax+Layer.c_size]
mov [ebp-8],edx
jmp .2
.cycle_1: ;for (j=0; j < o->layers[i].c_size; j++)
call Math_random
fmul dword[f_2_0]
fsub dword[f_1_0]
mov eax,[ebp+8] ;o
mov ecx,edi
imul ecx,sizeof.Layer
add ecx,[eax+NeuralNetwork.layers]
mov ecx,[ecx+Layer.biases]
fstp qword[ecx+8*esi]
xor ebx,ebx ;k=0
cmp ebx,[ebp-4]
jae .1
@@: ;for (k=0; k < o->layers[i].n_size; k++)
call Math_random
fmul dword[f_2_0]
fsub dword[f_1_0]
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8] ;o
add eax,[edx+NeuralNetwork.layers]
mov eax,[eax+Layer.weights]
mov edx,[eax+4*esi] ;edx = &o->layers[i].weights[j]
fstp qword[edx+8*ebx] ;o->layers[i].weights[j][k] = Math_random()*2.0-1.0;
inc ebx ;k++
cmp ebx,[ebp-4]
jb @b
.1:
inc esi ;j++
.2:
cmp esi,[ebp-8]
jb .cycle_1
inc edi ;i++
.3:
mov ecx,[ebp+8] ;o
cmp edi,[ecx+NeuralNetwork.layers_length]
jb .cycle_0
pop edi esi ebx
mov esp,ebp
pop ebp
ret 4
 
;расчет входных и выходных нейронов
;+ 8 NeuralNetwork* o
;+12 double* inputs
align 16
NNP_FeedForward:
621,7 → 689,7
mov ebp,esp
add esp,-12
push ebx esi edi
cmp dword[ebp+12],1852797802
cmp dword[ebp+12],NNP_FF_JSON
jne .end_f
mov esi,[ebp+16]
mov byte[esi],0
665,14 → 733,15
add esi,eax
stdcall [_strcat], esi,txt_nl_t_Qc_sizeQ
add esp,8
lea ebx,[edi+4*edi]
mov ebx,edi
imul ebx,sizeof.Layer
push 1
push 0
mov eax,[ebp+8]
mov edx,[eax+8]
mov edx,[ebp+8]
mov edx,[edx+NeuralNetwork.layers]
xor eax,eax
add esp,-8
mov ecx,[edx+4*ebx]
mov ecx,[edx+ebx+Layer.c_size]
mov dword[ebp-12],ecx
mov dword[ebp-8],eax
fild qword[ebp-12]
685,11 → 754,11
add esp,8
push 1
push 0
mov edx,[ebp+8]
mov ecx,[edx+8]
mov ecx,[ebp+8]
mov ecx,[ecx+NeuralNetwork.layers]
xor edx,edx
add esp,-8
mov eax,[ecx+4*ebx+4]
mov eax,[ecx+ebx+Layer.n_size]
mov dword[ebp-12],eax
mov dword[ebp-8],edx
fild qword[ebp-12]
713,10 → 782,11
.235:
push 1
push PRECISION
lea eax,[edi+4*edi]
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8]
mov ecx,[edx+8]
mov eax,[ecx+4*eax+8]
mov ecx,[edx+NeuralNetwork.layers]
mov eax,[ecx+eax+Layer.neurons]
push dword[eax+8*ebx+4]
push dword[eax+8*ebx]
call @@DoubleToStr$qduso
746,10 → 816,11
.239:
push 1
push PRECISION
lea eax,[edi+4*edi]
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8]
mov ecx,[edx+8]
mov eax,[ecx+4*eax+12]
add eax,[edx+NeuralNetwork.layers]
mov eax,[eax+Layer.biases]
push dword[eax+8*ebx+4]
push dword[eax+8*ebx]
call @@DoubleToStr$qduso
758,17 → 829,19
add esp,8
inc ebx
.238:
lea ecx,[edi+4*edi]
mov ecx,edi
imul ecx,sizeof.Layer
mov eax,[ebp+8]
mov edx,[eax+8]
cmp ebx,[edx+4*ecx]
add ecx,[eax+NeuralNetwork.layers]
cmp ebx,[ecx+Layer.c_size]
jb .cycle_2
stdcall [_strcat], esi,txt_sqbr_zap_t_QweightsQ
add esp,8
mov eax,[ebp+8]
lea ecx,[edi+4*edi]
mov edx,[eax+8]
cmp dword[edx+4*ecx+4],0
mov ecx,edi
imul ecx,sizeof.Layer
add ecx,[eax+NeuralNetwork.layers]
cmp dword[ecx+Layer.n_size],0
je .241
xor ebx,ebx
jmp .243
791,10 → 864,11
.247:
push 1
push PRECISION
lea edx,[edi+4*edi]
mov ecx,[ebp+8]
mov eax,[ecx+8]
mov edx,[eax+4*edx+16]
mov edx,edi
imul edx,sizeof.Layer
mov eax,[ebp+8]
add edx,[eax+NeuralNetwork.layers]
mov edx,[edx+Layer.weights]
mov ecx,[edx+4*ebx]
mov eax,[ebp-4]
push dword[ecx+8*eax+4]
811,10 → 885,11
add esp,8
inc dword[ebp-4]
.246:
lea ecx,[edi+4*edi]
mov ecx,edi
imul ecx,sizeof.Layer
mov eax,[ebp+8]
mov edx,[eax+8]
mov ecx,[edx+4*ecx+4]
add ecx,[eax+NeuralNetwork.layers]
mov ecx,[ecx+Layer.n_size]
cmp ecx,[ebp-4]
ja .245
stdcall [_strcat], esi,txt_sqbr
821,10 → 896,11
add esp,8
inc ebx
.243:
lea eax,[edi+4*edi]
mov edx,[ebp+8]
mov ecx,[edx+8]
cmp ebx,[ecx+4*eax]
mov eax,edi
imul eax,sizeof.Layer
mov ecx,[ebp+8]
add eax,[ecx+NeuralNetwork.layers]
cmp ebx,[eax+Layer.c_size]
jb .242
.241:
stdcall [_strcat], esi,txt_sqbr_fbr_zap
852,27 → 928,26
cmp dword[ebx+NeuralNetwork.layers_length],1
jge .1
xor eax,eax
jmp .5
jmp .end_f
.1:
mov edx,[ebx+NeuralNetwork.layers]
mov eax,[ebx+NeuralNetwork.layers]
add eax,sizeof.Layer
lea eax,[edx+sizeof.Layer]
mov ecx,[edx]
mov edx,1
jmp .4
.2:
mov edx,1 ;i=1
jmp .3
.cycle_0: ;for (i=1; i < o->layers_length; i++)
mov esi,[eax]
cmp esi,ecx
jbe .3
jbe .2
mov ecx,esi
.3:
.2:
inc edx
add eax,sizeof.Layer
.4:
.3:
cmp edx,[ebx+NeuralNetwork.layers_length]
jl .2
jl .cycle_0
mov eax,ecx
.5:
.end_f:
pop esi ebx ebp
ret 4
 
934,18 → 1009,18
mov edx,[eax+12]
cmp edx,[ebp-4]
je .203
mov eax,4
mov eax,txt_err_layers_neq
jmp .193
.203:
xor edi,edi
xor edi,edi ;i=0
jmp .205
.204:
.204: ;for(i=0;i<o->layers_length;i++)
stdcall @@strstr$qpxct1, esi,txt_c_size
add esp,8
mov esi,eax
test esi,esi
jne .206
mov eax,5
mov eax,txt_err_c_size
jmp .193
.206:
stdcall @@strchr$qpxci, esi,':'
997,46 → 1072,39
.211:
mov byte[esi],0
inc esi
push ebx
call @@StrToInt$qpc
stdcall @@StrToInt$qpc,ebx
pop ecx
mov dword[ebp-8],eax
lea eax,[edi+4*edi]
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8]
mov ecx,[edx+8]
mov edx,[ecx+4*eax]
add eax,[edx+NeuralNetwork.layers]
mov edx,[eax+Layer.c_size]
cmp edx,[ebp-4]
jne .213
mov ecx,[ebp+8]
mov edx,[ecx+8]
mov eax,[edx+4*eax+4]
cmp eax,[ebp-8]
mov edx,[eax+Layer.n_size]
cmp edx,[ebp-8]
je .214
.213:
mov ecx,[ebp+8]
push ecx
call NNP_GetMaxLLen
stdcall NNP_GetMaxLLen,ecx
mov ecx,edi
imul ecx,sizeof.Layer
mov ebx,eax
shl ecx,2
mov eax,[ebp+8]
mov edx,[eax+8]
lea ecx,[ecx+4*ecx]
mov edx,[eax+NeuralNetwork.layers]
add edx,ecx
push edx
call Layer_Destroy
stdcall Layer_Destroy,edx
mov eax,[ebp-8]
push eax
mov edx,[ebp-4]
push edx
mov edx,edi
shl edx,2
imul edx,sizeof.Layer
mov ecx,[ebp+8]
mov eax,[ecx+8]
lea edx,[edx+4*edx]
mov eax,[ecx+NeuralNetwork.layers]
add eax,edx
push eax
call Layer_Create
stdcall Layer_Create,eax
cmp ebx,[ebp-4] ;if(n>s || k>s)
jb .215
cmp ebx,[ebp-8]
1081,7 → 1149,7
mov ebx,eax
test ebx,ebx
jne .217
mov eax,12
mov eax,txt_err_sqbrl_b1
jmp .193
.217:
inc ebx
1089,11 → 1157,8
mov dword[ebp-8],edx
jmp .219
.218:
mov esi,[ebp+8]
dec edx
cmp eax,edx
lea ecx,[edi+4*edi]
mov esi,[esi+8]
jae .220
stdcall @@strchr$qpxci, ebx,','
add esp,8
1110,22 → 1175,23
jmp .193
.222:
mov byte[esi],0
push ebx
call @@StrToDouble$qpc
stdcall @@StrToDouble$qpc,ebx
pop ecx
lea edx,[edi+4*edi]
mov edx,edi
imul edx,sizeof.Layer
mov ecx,[ebp+8]
lea ebx,[esi+1]
mov eax,[ecx+8]
mov eax,[ecx+NeuralNetwork.layers]
mov ecx,[ebp-8]
mov edx,[eax+4*edx+12]
mov edx,[eax+edx+Layer.biases]
fstp qword[edx+8*ecx]
inc dword[ebp-8]
.219:
lea edx,[edi+4*edi]
mov edx,edi
imul edx,sizeof.Layer
mov ecx,[ebp+8]
mov ecx,[ecx+8]
mov edx,[ecx+4*edx]
add edx,[ecx+NeuralNetwork.layers]
mov edx,[edx+Layer.c_size]
mov eax,[ebp-8]
cmp edx,eax
ja .218
1143,32 → 1209,41
mov esi,eax
test esi,esi
jne .225
mov eax,15
mov eax,txt_err_sqbrl_w1
jmp .193
.225:
inc esi
xor edx,edx
mov dword[ebp-8],edx
mov dword[ebp-8],edx ;k=0
jmp .227
.226:
.226: ;for(k=0;k<o->layers[i].c_size;k++)
 
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8]
add eax,[edx+NeuralNetwork.layers]
mov eax,[eax+Layer.n_size]
or eax,eax
jnz .end_null_we
inc dword[ebp-8] ;k++
jmp .227 ;if 'weights' is null array
.end_null_we:
 
stdcall @@strchr$qpxci, esi,'['
add esp,8
mov ebx,eax
test ebx,ebx
jne .228
mov eax,16
mov eax,txt_err_sqbrl_w2
jmp .193
.228:
inc ebx
xor edx,edx
mov dword[ebp-12],edx
mov dword[ebp-12],edx ;j=0
jmp .230
.229:
mov esi,[ebp+8]
.229: ;for(j=0;j<o->layers[i].n_size;j++)
dec edx
cmp eax,edx
lea ecx,[edi+4*edi]
mov esi,[esi+8]
cmp eax,edx ;eax = j, edx = n_size-1
jae .231
stdcall @@strchr$qpxci, ebx,','
add esp,8
1181,28 → 1256,29
.232:
test esi,esi
jne .233
mov eax,17
mov eax,txt_err_sqbrr_w2
jmp .193
.233:
mov byte[esi],0
push ebx
call @@StrToDouble$qpc
stdcall @@StrToDouble$qpc,ebx
pop ecx
lea edx,[edi+4*edi]
mov edx,edi
imul edx,sizeof.Layer
mov ecx,[ebp+8]
lea ebx,[esi+1]
mov eax,[ecx+8]
mov eax,[ecx+NeuralNetwork.layers]
mov ecx,[ebp-8]
mov edx,[eax+4*edx+16]
mov edx,[eax+edx+Layer.weights]
mov eax,[edx+4*ecx]
mov edx,[ebp-12]
fstp qword[eax+8*edx]
inc dword[ebp-12]
.230:
lea edx,[edi+4*edi]
mov edx,edi
imul edx,sizeof.Layer
mov ecx,[ebp+8]
mov ecx,[ecx+8]
mov edx,[ecx+4*edx+4]
add edx,[ecx+NeuralNetwork.layers]
mov edx,[edx+Layer.n_size]
mov eax,[ebp-12]
cmp edx,eax
ja .229
1209,16 → 1285,17
mov esi,ebx
inc dword[ebp-8]
.227:
lea eax,[edi+4*edi]
mov eax,edi
imul eax,sizeof.Layer
mov edx,[ebp+8]
mov ecx,[edx+8]
mov eax,[ecx+4*eax]
add eax,[edx+NeuralNetwork.layers]
mov eax,[eax+Layer.c_size]
cmp eax,[ebp-8]
ja .226
inc edi
.205:
mov edx,[ebp+8]
cmp edi,[edx+12]
cmp edi,[edx+NeuralNetwork.layers_length]
jb .204
xor eax,eax
jmp .193
1306,6 → 1383,7
EXPORTS:
dd sz_lib_init, lib_init
dd sz_create, NNP_Create
dd sz_reset, NNP_Reset
dd sz_feedforward, NNP_FeedForward
dd sz_backpropagation, NNP_BackPropagation
dd sz_getmemdata, NNP_GetMemData
1314,6 → 1392,7
dd 0,0
sz_lib_init db 'lib_init',0
sz_create db 'NNP_Create',0
sz_reset db 'NNP_Reset',0
sz_feedforward db 'NNP_FeedForward',0
sz_backpropagation db 'NNP_BackPropagation',0
sz_getmemdata db 'NNP_GetMemData',0