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