Esempio n. 1
0
 protected override RNdArray ForwardProcess(RNdArray input, params RNdArray[] rNdArrays)
 {
     i = (R1dArray)input;
     Calculation.Forwerd(i, w, out u, out o, activator);
     return(o);
 }
Esempio n. 2
0
        public override void InnerStep(
            ref RNdArray state, ref RNdArray value, ref RNdArray signal, ref RNdArray potential, ref RNdArray activity,
            ref RNdArray weight,
            RNdArray connectionCount, RNdArray connectionStartPosition, RNdArray connectionIndex)
        {
            for (int i0 = 0; i0 < Count; i0++)
            {
                int idx = (int)ID[i0];

                int start = (int)connectionStartPosition[idx];
                int count = (int)connectionCount[idx];

                int   tid = -1;
                float ptlmax = 0, ptlmin = 100, ptldiff = 0, tptl = 0;
                float dp     = 0;
                int   maxtid = -1;
                for (int i = 0; i < count; i++)
                {
                    tid  = (int)connectionIndex[start + i];
                    dp  += weight[start + i] * signal[tid];
                    tptl = potential[tid];
                    if (ptlmax < tptl)
                    {
                        ptlmax = tptl; maxtid = tid;
                    }
                    if (ptlmin > tptl)
                    {
                        ptlmin = tptl;
                    }
                }
                ptldiff = ptlmax - ptlmin;

                float ps = signal[idx];
                float pv = value[idx];

                if (state[idx] == 0)
                {
                    if (value[idx] > 0.5)
                    {
                        state[idx] = 1;
                    }
                    else
                    {
                        value[idx] *= 0.25;
                        value[idx] += dp;
                    }
                }
                else
                if (state[idx] == 1)
                {
                    if (value[idx] > 1)
                    {
                        state[idx] = 2;
                    }
                    else
                    {
                        value[idx] *= 1.5;
                    }
                }
                else
                if (state[idx] == 2)
                {
                    if (value[idx] < -0.25)
                    {
                        state[idx] = 3;
                    }
                    else
                    {
                        value[idx] *= 0.95;
                        value[idx] -= 0.05;
                    }
                }
                else
                if (state[idx] == 3)
                {
                    if (value[idx] >= 0)
                    {
                        state[idx] = 0;
                    }
                    else
                    {
                        value[idx] *= 0.95;
                        value[idx] += 0.01;
                    }
                }

                if (state[idx] != 3)
                {
                    if (dp > potential[idx])
                    {
                        float sum = 0;
                        if (ptldiff > 0)
                        {
                            for (int i = 0; i < count; i++)
                            {
                                tid = (int)connectionIndex[start + i];
                                weight[start + i] += activity[tid] * (potential[tid] - ptlmin) / ptldiff;
                                sum += weight[start + i];
                            }
                            if (sum > 1)
                            {
                                for (int i = 0; i < count; i++)
                                {
                                    weight[start + i] /= sum;
                                }
                            }
                        }
                    }
                    else
                    {
                    }
                }

                if (value[idx] > 0.75)
                {
                    signal[idx] = 1;
                }
                else
                {
                    signal[idx] = 0;
                }
            }
        }