`(i¥$$$666HHH[[[mmm‘‘‘£££¶¶¶ÈÈÈÚÚÚìììÿÿÿ D$404mNJN…L04e$ÐFHuqaY}ÎÒ},…•¡mª,Òª™mÂÊÚÔ^ÞîÖ 0ÿÿÿÿÿÿÿÿ2Tv˜ºÜþïÍ«‰gE#2Tv˜ºÜþ2Tv˜ºÜþ ffffffffffffffffffffffffffffffff»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ªª ªªªªª:£ªª33ª:33£ªªªª£ªª:033 ªª ªªªª:33£ª33ªª:£ªªªªª£ªª:033 ªª ªª£ªª:£ªª3£ªª:£ªªª£ª£ªª:033 ªª ª:ªªª:£ªª:3ªª:£ªª:ªª£ªª:033°»» »[µ»»U[»»UU»»U[»»U[»µ»»[PUU`fffaffffaffffafaff€ˆˆˆ"(ˆˆ"(ˆˆ(‚ˆˆ"(ˆˆ"(ˆ‚ˆˆ( ""�™™ ™DI™™DI™™DD™™I”™™I”™”™™I@DD�ÿÿÿ�ˆˆˆ�ˆ�ˆ�ˆøÿ�ˆˆˆ/"""ÿðÿþÿÿþÿ�ÿˆˆðï�ˆðððî""ÿîðïîÿÿîî�ÿÿÿ�ˆˆˆ�ˆ�ˆ�ˆøÿ�ˆˆˆ/"""ÿðÿþÿÿþÿ�ÿˆˆðï�ˆðððî""ÿîðïîÿÿîî£ >‚=ÿðÿÿððÿðÿÿÿððÿÿðÿÿðÿÿðÿðÿðÿÿÿÿðÿðððÿððÿÿÿÿðððððÿððÿÿÿððÿðÿðÿÿÿÿÿðÿðÿÿðÿÿððÿððÿÿÿÿÿðððÿÿÿðÿÿÿÿÿÿðÿððÿÿðÿÿðÿÿÿÿÿÿÿªªðÿÿÿÿÿîÿÿÿÿÿÿîîîªªªªªªÿÿÿÿÿÿàî»»ëªªªªªªÿÿÿÿÿÿî¾»»»îªUªªªªªÿÿÿÿÿÿODDDàî»»»»ë ªUªªªªªÿÿÿÿÿÿ@DDDDྻ»»»»îªªªª ªªªªðÿÿÿÿÿ  @DDDDî»»»»»»ë ªww§ªªªªªÿˆˆøŸ   DDDî»»»»»»ëªzwwwª ªªªªª€ˆˆˆ4� ªî»»»»»»ë ªwwww§ªªªªªªˆˆˆˆ ª333î»»»»»»«ªªªªª  zwwwwwªªªªªªªªªªªªª€ˆˆˆˆˆ0� ª 33333î»»»»»»ë ªªªªª ªwwwwww§ ªªªªªªªªªªªªˆˆˆˆˆˆ�03£:3ˆè¾»»»»»U ªªªªªwwwwww§ ªªªªªªªªˆˆˆˆˆˆH33™  €ˆíî»»»»[îUªwwwwww§ ªªªªªªªªˆˆˆˆˆˆH  ªˆÝ`î¾»»»àUªwwwwww73ªªªªˆˆˆˆˆˆh0�ª€ˆÝàî»»[PUUªwwwwww§ 333ªªªªˆˆˆˆˆˆhI™™ˆª Ð`´îªªZUPUU zwwwwwª333ªªªªª€ˆˆˆˆˆQ“™ €ˆ Ú `@»ªªªªuPUPU¥ªwwww—©333ªªªªªˆˆˆˆØQ0�™™Э @«ªww§uUUUUªzwww¡šªªªª€ˆˆˆ eG€ˆ™™™ Ð  ª´ªzwwwZPUUU� ªww ªªªª€ˆˆˆ¹v8 �™™ª«ªwwwwW§UUUP _ªªªª� ªªªªªªˆˆˆˆ˜]†H�Ù ™™ ªzwwwwwuPUUPP�ðPªª �ªªªªªª€ˆˆˆˆˆ°Qm@p7�`�™ªwwwwwwWWUPP� e™ªªªªˆˆˆˆˆˆˆepÝ »ªwwwwwwWP ðPF ªªªªˆˆˆˆˆˆ˜@0×D”IDDDDDªwwwwwwWzPPP�ðPFÌÌ �ªªªªªªªˆˆˆˆˆˆH[dDDDsG`�@°[ªwwwwwwWuPPeÌÌÌÌ ™ªªªªªªªˆˆˆˆˆˆ˜ Q`ÝÔ0p  "ªwwwwww§WUP�PõP`ÄÌwwÇÌ ªªªªªªˆˆˆˆˆˆ˜œ±ÖMv�)""u¡zwwwww§PpUUUU _UFÌ|wwwÌ �ªªªªªª€ˆˆˆˆˆ0ÉÁÕÐ0w "’° Õ­ªwwww§zPpUUUU™ðUÅÌwwwwÇ̪ª™ªªªªªˆÿÿ�5 Pl#"w@ Ýݪzwww‘ wUUUUP`Ä|wwwwwÌ ¡ª ªªªªªðÿÿÿ1“P ÆL""0w°�Y×Рªwwg¡ uPP ðUUUÌwwwwww§ � ªªªªªªªªÿÿÿÿ0 µ&ÂÔ w°• ت �wUP�ðFÌwwwwwwÇ �ªªªªªªªªðÿÿÿÿÿ3Y!%k@ÍÌ0@Ý w}™€U PuP`@ÌwwwwwwÇ  ªªªªªÿÿÿÿÿÿ2’U`@ÐÌð°Ýw Y îî`�Pw™Pð`UÌwwwwwwÇ �ªªªªªÿÿÿÿÿÿ“Y¶ Ý0ÌÜP×w�àîîîP pp�_UUUÌwwwwww— ªªªªªªÿÿÿÿÿÿ3 Uk@ÝÓÍÌîîîîV�pp UUUPÀ|wwwwwÌ™ 3ªªªªªªÿÿÿÿÿÿ_=Ù‘ÕeÐ ݰ=[ÐÁÌ àîîîîîeYUU`@pÇÌwwwwwÌ�‘3ªªªÿÿÿÿÿÿ1–YÐÖÝÔÝݽÓ}îîîîîînPUUW pðP`wpÌ|wwwÌ™ 0ªªªðÿÿÿÿÿ€Y ¶DÐÛÛ=ÝÝÝîîîîîî^Vp�ðPwÌÌwwÇÁp�0ªªªÿÿÿÿ_X�`[Õ´ÝP îîîîîî•�pWpÌÌÌÌ‘ ªªªðÿÿÿuPS�¶]K°Ýp8Ìîîîîîî`P ðpw`PpÀáÌÌ p3�™ªªðÿÿÿg…Õ0•1SÖ»EÐÀÝÌÃîîîîîîNdP�pw@ á0™ªªÿÿÿÿ_p�U0UÐ`ËÌÄ ]%àîîîîîF yðpptPÀp0ðÿÿÿÿÿÕX\Ul»Ð@…Õ2îîîî`@A�w`w`ÿÿÿÿÿÿ_pÈUM•U»PT%"]à àîîîÐ`` PDw`wwÀPà""sÿÿÿÿÿÿ_̇P5ÑP³mµ€$R Õ˜Pt9–P=¼„wffvø wÀ�mwPç`ÝI p3!· €ˆˆˆ4½ÌnèîH4—P1“gÝÅ#Kffff�p"P pg™Y~Ðf”`"{ˆˆˆˆØÃ ænŽUX×Sq9i\5cfˆˆhö|Ç”ÞF 33p" 3ƒ°p€ˆˆˆˆˆ0°în¾V€uS1IE‘ v'Pf†ˆˆˆow€ wÀ Ö• d&�3333`" 0 ˆˆˆˆˆˆ8î‹`ënЈ3�R”lrgfˆˆˆˆxf€wWl` P™y@b93ww73'0±pˆˆˆˆˆˆ¸°à†ÐX5�WÀi„`†ˆˆˆˆˆfw  `ÑPp™ f3swwwc"p ˆˆˆˆˆˆˆ8ˆ[`U€3€5Ðy)Ffˆˆˆˆˆˆx€,ÆÖ @™ 03wwww73"€°0pwwˆˆˆˆˆˆS»ˆ†ˆèˆXƒ�‰…˜fˆˆˆˆˆˆhPÀ` mÐp�9swwwww"p€ 0wwwwˆˆˆˆˆˆØ5 »6€€îXÓQ™\ �ifˆˆˆˆˆˆÈÌÌŒ ` Ý`]@p3wwwwww7 0ppwÌÌ|w€ˆˆˆˆˆݰ3kx€FØ5ÇY9fˆˆˆˆˆˆhVÀÈÌÌÌÌÌÆ\ÌÌ3wwwwww7p¸0wÇÌÌÌwˆˆˆˆˆ]Ý3P°Ph�>u9u“fˆˆˆˆˆˆhV €Ð àP ÇÌ3wwwwww7€ 0swÌÌÌÌ|w€ˆˆˆ[Õ 35ÝØ@؆à31“…i†ˆˆˆˆˆ™À€,â` p3wwwwwwgfffffv¸pÇÌÌÌÌÌwˆˆˆˆXÓPPƒÝm4ƒ6ÈãQ�WpifˆˆˆˆV™ `ØÀ.`Õp 3wwwwww7`gfffawÌÌÌÌÌÌ|€ˆˆˆˆˆS°ÝP83ÓÖh˜0…YÇ‘f†ˆˆˆfQÀ™ Ö€Aà P !0swwwww3°p`fffwÌÌÌÌÌÌ|ˆˆˆˆˆˆ53=ÓݶÝȆ0å u|ifˆˆhf � HàL RÒ"p03wwww73 ‹wÌÌÌÌÌÌ|ˆˆˆˆˆˆ8SØ 7T`+Œm(XžÅ‡�fªªjVÀm� „NÀb" p3swww33°pwÌÌÌÌÌÌ|ˆˆˆˆˆˆ¸…Ý=¶›ØØSÅYx|‘ªªªªZ Ý‘ ", Ð Ç03ww730 wÌÌÌÌÌÌ|ˆˆˆˆˆˆ¨ªZÐ}Ý l¼(€=ÁYÎw§ªww§¥ Ð@�‰" &P 3333 0»€pDtÇÌÌÌÌÌwˆˆˆˆˆˆX€¥¥ªª=Ál ‹€6]˜åªzwwwÊÚ ` "‚ À`R"Ðp333€@ApwÌÌÌÌ|w€ˆˆˆˆˆ"Õ]GÚ£ª&€Àh…• ªwwww§­`"@˜™ `"  p wÇÌÌÌwˆˆˆˆx€"ÝpÅÌ0�bª¨ƒY­zwwwwwª"䀙 "%ÀÐ °0GD pwÌÌ|w€ÿÿ�[wÝ"B\Ì ÓbÌ€€:QZYªwwwwww'"@à(ÉP q €0Dtªwwwwðÿÿÿ…Ð ,R#͆€‹0Á•¥wwwwww§j@‚ œ`P Ðq33 °€3@D wwÿÿÿÿß uÌ%R�2Ðm¸P©wwwwww§D  i  3333# Cp ðÿÿÿÿÿÀ w"É ƒÐ†XXUUYwwwwwwGDà€À –=3ww72°€@D0 ÿÿÿÿÿÿ tÇURU5UÖ€Œ;•wwwwwwg@DDD"€À `P 3swww3 €D0pÿÿÿÿÿÿ_UUuUUÌ%`͈0aR•uwwwwwkDDD `P�93wwww·3@D0  ÿÿÿÿÿÿÇÌ’P "Ö((U©wwww§¶ @à"@D„À0swwwww3D3 pÿÿÿÿÿÿO\r' 2À&‚€mUzwwwª° à  HDLF3wwwwwwG€£ÿÿÿÿÿÿ¿»[Àp€P"#`€�ÓV•ªww§j@° . À€ `E3wwwwww7€ :ðÿÿÿÿÿ|µ»»’€(RÀ0"Ø8±`U¥ @°À`P3wwwwww7 0pÿˆˆøOL !»{'&€8 V@⻠̀ V3wwwwww7ª3€ˆˆˆÄL$"‚{»ËP=`‚‚°`"»À€3Ãc5wwwwww—™  pˆˆˆˆÌB$"¼»Õ0ˆÝA" » 03À`5swwwww3€�™™ 0DD€ˆˆˆˆˆp%"B €pÝP»`8"@à »33€ÌV3wwww73™™ª0pDDDDˆˆˆˆˆˆ("!Dˆ }1k‹8@à233»ÈÌV3swww3 ™™ 3GDwwGDˆˆˆˆˆˆX�DÀÐQˆ433À ÀŒÀ`53ww73€ �™ 3DtwwwDˆˆˆˆˆˆØÝÝÝÝÝDÝÝ p0`ˆ0ã ° Àl3333ª�™ @DwwwwGDˆˆˆˆˆˆ( €ÐDÐÝwÝ]Ýc�8@àÀ° À €ÀV33 �™™@twwwwwDˆˆˆˆˆˆx�Ð D†8@ ° €ÀV€ ™DwwwwwwG€ˆˆˆˆˆ w—€ÐÍpP;kˆÀÌ ÌÀ ° l€ªDwwwwwwGˆˆˆˆ(yw @w»†ä ÀÌÌÌ ° €À™™  DwwwwwwG€ˆˆˆ"€Ù w@´»P9†8@ ÌḬ̀ È™™™™  �DwwwwwwG€ˆˆˆÑ� pw»» @p™cˆ@ÀÌÌ °�™""‚ �™™ DwwwwwwGˆˆˆˆˆÑ À°»w@” P0†ä ÌÀÌ »™)"""‘©�™™ @twwwwwD€ˆˆˆˆˆ »» pw™Ip5†DDäÀÌÀÌ ›™""""¢š�™™ @DwwwwGDˆˆˆˆˆˆ˜»» w—@pPcDDDD. ÌÀÌÌ�)"""""™�™™ DtwwwDˆˆˆˆˆˆ¸À™pw@EDwwG.ÀÌÌ™""""""’™™™ @DwwGDˆˆˆˆˆˆˆ �™wDpDtwwwB Ì™""""""’ DDDDˆˆˆˆˆˆXUUU� pwDDwwwwÇDÌ™""""""’ DDˆˆˆˆˆˆ PUUUUwGtwwwwwÌ33333™""""""’ €ˆˆˆˆˆÀ™PUUUUDwwwwwwG333333™""""""’ ˆÿÿ� ™UUUDwwwwww733333�)"""""™ðÿÿÿÈ�™DwwwwwwG�™""""’™ÿÿÿÿ� UUUDwwwwwwG™)"""™ ðÿÿÿÿÿ™ UUUUUDwwwwwwG�™""’™ÿÿÿÿÿÿPUUUU@twwwwwD™™™™ ÿÿÿÿÿÿ_UUU@DwwwwGD™™ ÿÿÿÿÿÿDtwwwDÿÿÿÿÿÿ@DwwGDÿÿÿÿÿÿDDDDðÿÿÿÿÿDDÿÿÿÿðÿÿÿÿÿZ-- title: Neural Wire -- author: fachi177 -- desc: train a neural network to run wireworld automata -- script: lua wmin,wmax=0,30*8 hmin,hmax=0,17*8 capas={} function mapeo(val,fromMin,fromMax,toMin,toMax) return (val-fromMin)*(toMax-toMin)/(fromMax-fromMin)+toMin end ---start of the neural network tool --this code is free to use rnd,exp=math.random,math.exp min,max=math.min,math.max function tanh(val, deriv) if deriv then return 1-val*val else return 2/(1+exp(-2*val))-1 end end function relu(val, deriv) if deriv then if val>=0 then return 1 else return 0 end else return max(0,val) end end function lrelu(val, deriv) if deriv then if val>=0 then return 1 else return 0.01 end else return max(val,val*0.01) end end function sigmoid(val, deriv) if deriv then return val*(1-val) else return 1/(1+exp(-val)) end end --learnig rate lr=0.1 --activation function --act=tanh --act=sigmoid act=lrelu neu={} neu.ron=function(input) local n={} for i=1,input do n[i]=rnd()*2-1 end n.bias=rnd()*2-1 return setmetatable(n,{__index=neu}) end neu.predict=function(n,inpu) local p=n.bias for i=1,#n do p=p+n[i]*inpu[i] end return act(p) end neu.train=function(n,inp,out,err) local er={} local grad=act(out,true)*err for i=1,#n do er[i]=n[i]*grad n[i]=n[i]-lr*grad*inp[i] end n.bias=n.bias-lr*grad return er end lay={} lay.er=function(input, neurons) local l={} for i=1,neurons do l[i]=neu.ron(input) end return setmetatable(l,{__index=lay}) end lay.predict=function(l,input) local p={} for i=1,#l do p[i]=l[i]:predict(input) end return p end lay.train=function(l,inp,out,err) local er={} for i=1,#inp do er[i]=0 end local ner={} for i=1,#l do ner=l[i]:train(inp,out[i],err[i]) for j=1,#er do er[j]=er[j]+ner[j] end end return er end --neural network constructor --input: number of input --neuByLay: an array with the number of neurons per layer netw={} netw.ork=function(input, neuByLay) local net={} local inp=input for i=1,#neuByLay do net[i]=lay.er(inp,neuByLay[i]) inp=neuByLay[i] end net.hid={} return setmetatable(net,{__index=netw}) end --Predict the result for input netw.predict=function(net,inputs) local p={} net.hid[0]=inputs for i=1,#net do net.hid[i]=net[i]:predict(net.hid[i-1]) end return net.hid[#net] end --train the network so that for input return target netw.train=function(net,input,target) local out=net:predict(input) local err={} for i=1,#out do err[i]=out[i]-target[i] end for i=#net,1,-1 do err=net[i]:train(net.hid[i-1],net.hid[i],err) end return out end ---end of the neural network tool capas={8,6,4} entra=12 net=netw.ork(entra,capas) capas[0]=entra inp={1,0,0,0,1,0,0,0,0,1,0,1} pre=net:predict(inp) error=0 gler=0 tra={ inp={0,1,1,1,0,0,0,1,0,0,0,0}, tar={1,0,0,0}, } tam=25 tamx=35 cli=false dra=1 gm={} for i=1,tamx do gm[i]={} for j=1,tam do --gm[i][j]=rnd(0,1) gm[i][j]={0,0,0,0} end end op={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}} wire={function(n)return 1 end, function(n)return 3 end, function(n) if n==1 or n==2 then return 4 else return 3 end end, function(n)return 2 end} function loadmap() gm={} for i=1,tamx do gm[i]={} for j=1,tam do --gm[i][j]=rnd(0,1) gm[i][j]=op[mget(i-1,j-1)] end end end nor=true function normal(ent) local max,val=0,-10 for i=1,4 do if val8 then if r==4 then ngb=ngb+1 tra.inp[j]=1 else tra.inp[j]=0 end end end tra.tar=op[wire[mid](ngb)] pre=net:train(tra.inp,tra.tar) error=0 for i=1,#pre do error=error+((pre[i]-tra.tar[i])^2)/2 end gler=gler+error end end if btn(4) then local ax={} for i=1,tamx do ax[i]={} for j=1,tam do local inp={} for k=-1,1 do for l=-1,1 do if k==0 and l==0 then for h=1,4 do table.insert(inp,gm[(i-1+k)%tamx+1][(j-1+l)%tam+1][h]) end else table.insert(inp,gm[(i-1+k)%tamx+1][(j-1+l)%tam+1][4]) end end end if not nor then ax[i][j]=net:predict(inp) else ax[i][j]=normal(net:predict(inp)) end end end gm=ax end if btnp(5) then loadmap() end if btnp(7) then reset() end -- for i=1,#pre do -- print(pre[i],1,(i-1)*8,mapeo(pre[i],-1,1,1,15)) -- end print(gler) for i=1,#net do for j=1,#net[i] do for k=1,#net[i][j] do -- print(net[i][j][k],(i-1)*100,(k-1)*8+(j-1)*8*#net[i][j],mapeo(net[i][j][k],-1,1,1,15)) line( mapeo(i-1,-1,#capas+1,wmin,wmax), mapeo(k,0,#net[i][j]+1,hmin,hmax), mapeo(i,-1,#capas+1,wmin,wmax), mapeo(j,0,capas[i]+1,hmin,hmax), mapeo(net[i][j][k],-1,1,1,15) ) end circ( mapeo(i,-1,#capas+1,wmin,wmax), mapeo(j,0,capas[i]+1,hmin,hmax), 8, mapeo(net[i][j].bias,-1,1,1,15) ) circ( mapeo(i,-1,#capas+1,wmin,wmax), mapeo(j,0,capas[i]+1,hmin,hmax), 6, 0 ) end end if #net.hid>0 then for i=0,#net.hid do for j=1,#net.hid[i] do circ( mapeo(i,-1,#capas+1,wmin,wmax), mapeo(j,0,capas[i]+1,hmin,hmax), 6, mapeo(net.hid[i][j],-1,1,1,15) ) end end end -- print(error,1,16*8) local cel=5 local ofx,ofy=50,0 if edit then for i=1,tamx do for j=1,tam do rect(ofx+i*cel,ofy+j*cel,cel,cel,mapeo(gm[i][j][1]+gm[i][j][2]*2+gm[i][j][3]*3+gm[i][j][4]*4,0.9,4.1,1,15)) end end tex={"empty","elec. tail","conductor","elec. head"} spr(10,5,50) spr(dra,20,50) print(tex[dra],0,60,1) if p or s then local cx,cy=(x-ofx)//cel,(y-ofy)//cel if cx>0 and cx<=tamx and cy>0 and cy<=tam then if not cli then cli=true end gm[cx][cy]=op[dra] end else cli=false end else for i=1,tamx do for j=1,tam do rect(170+i*2,j*2,2,2,mapeo(gm[i][j][1]+gm[i][j][2]*2+gm[i][j][3]*3+gm[i][j][4]*4,0.9,4.1,1,15)) end end end end