module des.isys.neiro.layer.rand;

public import std.random;
import std.traits;
import std.math;

import des.isys.neiro.layer.neiron;
import des.isys.neiro.layer.structure;

T symmetry_uniform(T)( T lim ) 
    if( isNumeric!T )
{ return uniform( -lim, lim ); }

auto gap_symmetry_uniform(T,G)( T lim, G gap )
    if( isNumeric!T && isNumeric!G )
{
    auto u = symmetry_uniform( lim );
    return u + gap * sgn(u);
}

void rndLayers(T)( BPLayer!T[] layers )
{ foreach( layer; layers ) rndLayer(layer); }

void rndLayer(T)( BPLayer!T layer )
{
    foreach( neiron; layer.neirons )
        rndLinkedNeiron( neiron );
}

void rndLinkedNeiron(T)( BPNeiron!T neiron )
{
    foreach( link; neiron.bpLinks )
        rndLink( link );
}

void rndLink(T,L=float,G=float)( BPLink!T link, L lim=0.2, G gap=0.1 )
    if( isFloatingPoint!L && isFloatingPoint!G )
{ link.weight = gap_symmetry_uniform( lim, gap ); }