1
+ //Funções de ativações.
2
+ const ArcTan = valor => Math . atan ( valor )
3
+ const BentIdentity = valor => ( ( Math . sqrt ( ( valor ** 2 ) + 1 ) - 1 ) / 2 ) + valor
4
+ const BinaryStep = valor => ( ( valor < 0 ) ? 0 : 1 )
5
+ const Gaussian = valor => Math . exp ( - ( valor ** 2 ) )
6
+ const Identity = valor => valor
7
+ const LeakyReLU = valor => PReLU ( valor , 0.01 )
8
+ const ReLU = valor => ( ( valor < 0 ) ? 0 : valor )
9
+ const SELU = valor => 1.0507 * ELU ( valor , 1.67326 )
10
+ const Sigmoid = valor => 1.0 / ( 1.0 + Math . exp ( - valor ) )
11
+ const SigmoidRcional = valor => valor / ( 1.0 + Math . sqrt ( 1.0 + valor * valor ) )
12
+ const SiLU = valor => valor * Sigmoid ( valor )
13
+ const Sinc = valor => ( valor = 0 ) ? 1 : ( Math . sin ( valor ) / valor )
14
+ const Sinusoid = valor => Math . sin ( valor )
15
+ const SoftSign = valor => valor / ( 1 + Math . abs ( valor ) )
16
+ const SoftPlus = valor => Math . log ( 1 + Math . exp ( valor ) )
17
+ const TanH = valor => ( Math . exp ( valor ) - Math . exp ( - valor ) ) + ( Math . exp ( valor ) + Math . exp ( - valor ) )
18
+ const PReLU = ( valor , arg ) => ( ( valor < 0 ) ? ( arg * valor ) : valor )
19
+ const ELU = ( valor , arg ) => PReLU ( arg , Math . expm1 ( valor ) )
20
+ const Pipe = ( valor , ...fns ) => fns . reduce ( ( acc , current ) => acc = current ( valor ) )
21
+ /*
22
+ Gaussian_Derivative: valor => -2.0 * valor * Gaussian(valor),
23
+ Sigmoid_Derivative: valor => Sigmoid(valor) * (1 - Sigmoid(valor)),
24
+ SigmoidRcional_Derivative: valor => 1.0 / (Math.sqrt(1.0 + valor * valor) * (1 + Math.sqrt(1.0 + valor * valor)))
25
+ */
26
+
27
+ //Função interna
28
+ const calcular = ( pesos , entradas , vies = 0 ) => {
29
+ const result = pesos . map ( ( peso , i ) => peso * entradas [ i ] )
30
+ return result . reduce ( ( acc , current ) => acc + current ) + vies
31
+ }
32
+
33
+ //Função interna
34
+ const randpesos = ( ...entradas ) => {
35
+ const min = Math . ceil ( - 1000 )
36
+ const max = Math . floor ( 1000 )
37
+ return entradas [ 0 ] . map ( entrada => entrada = Math . floor ( Math . random ( ) * ( max - min + 1 ) ) + min )
38
+ }
39
+
40
+ const Softmax = genoma => {
41
+ const gens = genoma . map ( x => Math . exp ( x - Math . max ( ...genoma ) ) )
42
+ return gens . map ( y => y / gens . reduce ( ( acc , current ) => acc + current ) )
43
+ }
44
+
45
+ const entradas = entradas => {
46
+ let pesos = randpesos ( entradas ) || [ 0 ]
47
+ let vies = 0
48
+ return {
49
+ vies : {
50
+ get : ( ) => vies ,
51
+ set : ( valor ) => vies = valor || 0
52
+ } ,
53
+ pesos : {
54
+ get : ( ) => pesos ,
55
+ set : ( valores ) => pesos = valores || [ 0 ]
56
+ } ,
57
+ saida : callback => {
58
+ if ( ! callback ) return calcular ( pesos , entradas , vies )
59
+ if ( typeof callback === 'function' ) return callback ( calcular ( pesos , entradas , vies ) )
60
+ }
61
+ }
62
+ }
63
+
64
+ //console.log(mutar([1,2,3,4,5,6,7,8,9], 1))
65
+ const mutar = ( genoma , vezes = 1 ) => {
66
+ if ( vezes <= 0 ) vezes = 1
67
+
68
+ const indexList = Array ( vezes ) . fill ( 0 ) . map ( vez => Math . floor ( Math . random ( ) * genoma . length ) )
69
+ const filho = genoma . map ( ( gen , index ) => indexList . includes ( index ) ? randpesos ( [ 0 ] ) [ 0 ] : gen )
70
+ return filho
71
+ }
72
+
73
+ //console.log(crossover([1,2,8,9,10], [6,7,3,4,5], 2))
74
+ const crossover = ( genoma1 , genoma2 , index ) => [
75
+ genoma1 . slice ( 0 , index ) . concat ( genoma2 . slice ( index ) ) ,
76
+ genoma2 . slice ( 0 , index ) . concat ( genoma1 . slice ( index ) )
77
+ ]
78
+
79
+ const neuronios = ( entrada , contia ) => Array ( contia ) . fill ( 0 ) . map ( _ => entradas ( entrada ) )
80
+ const saidas = ( neuronios , fn , contia ) => {
81
+ return Array ( contia ) . fill ( 0 ) . map ( _ => entradas ( neuronios . map ( entrada => entrada . saida ( fn ) ) ) )
82
+ }
83
+
84
+ const setPesos = ( neuronio , pesos ) => neuronio . map ( ( neuro , index ) => neuro . pesos . set ( pesos [ index ] ) )
85
+
86
+ //console.log(genConcat(neuronio, oculta))
87
+ const genConcat = ( ...neuronios ) => {
88
+ return neuronios . map ( gen => gen . map ( g => g . pesos . get ( ) ) )
89
+ . reduce ( ( acc , current ) => acc . concat ( current ) )
90
+ . reduce ( ( acc , current ) => acc . concat ( current ) )
91
+ }
92
+
93
+ module . exports = {
94
+ entradas,
95
+ mutar,
96
+ crossover,
97
+ Softmax,
98
+ calcular,
99
+ neuronios,
100
+ saidas,
101
+ setPesos,
102
+ genConcat,
103
+
104
+ fn : {
105
+ ArcTan,
106
+ BentIdentity,
107
+ BinaryStep,
108
+ Gaussian,
109
+ Identity,
110
+ LeakyReLU,
111
+ ReLU,
112
+ SELU ,
113
+ Sigmoid,
114
+ SigmoidRcional,
115
+ SiLU,
116
+ Sinc,
117
+ Sinusoid,
118
+ SoftSign,
119
+ SoftPlus,
120
+ TanH,
121
+ PReLU,
122
+ ELU ,
123
+ Pipe
124
+ }
125
+ }
0 commit comments