// вычисляем всю входящую стимуляцию клетки, приходящую как по афферентам, // так и по коллатеральным связям от соседних пирамид. public void IntegrateAllIncomingSignals( int[] afferent_data, InhibitionCell inhibition ) { // суммируем афференты double sum_a = 0; for( int i = 0; i < afferents.Count; ++i ) { afferents[i].Accept( afferent_data ); sum_a += afferents[i].GetA(); } // коллатерали for( int i = 0; i < collaterals.Count; ++i ) { collaterals[i].Accept(); sum_a += collaterals[i].GetA(); } // теперь определим текущий порог double theta = inhibition.GetTheta() + inhibition.GetThetaNoise(); // если суммарная стимуляция входов больше порога, и если нейрон не в состоянии рефракции - генерируется спайк. if( a == 0.0 && sum_a > theta ) a_next = 1.0; else a_next = 0.0; return; }
public void AcceptInput( int[] afferent_data, InhibitionCell inhibition ) { for( int i = 0; i < pyramids.Count; ++i ) pyramids[i].IntegrateAllIncomingSignals( afferent_data, inhibition ); for( int i = 0; i < pyramids.Count; ++i ) pyramids[i].Tick_A(); return; }
// s - каждая пирамида получает столько сигналов от других пирамид в миниколонке public void Init( int total_input, int s, int m, InhibitionCell inhibition ) { int N = total_input; // общее число входных сигналов int r = 7; // столько входных сигналов получает каждая пирамида в микроколонке pyramids = new List<PyramidalCell>(); for( int i = 0; i < m; ++i ) { PyramidalCell p = new PyramidalCell(); p.inhibition = inhibition; p.AttachToInputs( total_input, r, s ); pyramids.Add( p ); } for( int i = 0; i < pyramids.Count; ++i ) { pyramids[i].AttachCollaterals( pyramids, s, i ); } // тормозной нейрон собирает активность со всех пирамид всех микроколонок inhibition.Attach( this ); return; }
int[] ni_a; // активность входных нейронов в течение одной итерации #endregion Fields #region Constructors public MacroColumn( int RF_size, // длина входного вектора данных int k // число микроколонок в одной макроколонке ) { int s = 15; // каждая пирамида получает столько сигналов от других пирамид в миниколонке inhibition = new InhibitionCell( m, s ); columns = new List<MiniColumn>(); for( int i = 0; i < k; ++i ) { MiniColumn c = new MiniColumn(); c.Init( RF_size, s, m, inhibition ); columns.Add( c ); } current_input = new int[RF_size]; ni_a = new int[RF_size]; }