private void Learn()
{
int i;
int step;
if (_lengthCount < MinPictureBytes)
_samplefac = 1;
_alphadec = 30 + ((_samplefac - 1) / 3);
var p = _thepicture;
var pix = 0;
var lim = _lengthCount;
var samplepixels = _lengthCount / (3 * _samplefac);
var delta = samplepixels / NumCycles;
var alpha = InitAlpha;
var radius = InitRadius;
var rad = radius >> RadiusBiasShift;
if (rad <= 1)
rad = 0;
for (i = 0; i < rad; i++)
_radPower[i] =
alpha * (((rad * rad - i * i) * RadBias) / (rad * rad));
//Console.WriteLine("Beginning 1D learning: Initial radius= " + rad);
if (_lengthCount < MinPictureBytes)
step = 3;
else if ((_lengthCount % Prime1) != 0)
step = 3 * Prime1;
else
{
if ((_lengthCount % Prime2) != 0)
step = 3 * Prime2;
else
{
if ((_lengthCount % Prime3) != 0)
step = 3 * Prime3;
else
step = 3 * Prime4;
}
}
i = 0;
while (i < samplepixels)
{
#region Get Blue-Green-Red
var b = (p[pix + 0] & 0xff) << Netbiasshift;
var g = (p[pix + 1] & 0xff) << Netbiasshift;
var r = (p[pix + 2] & 0xff) << Netbiasshift;
#endregion
var bestBias = Contest(b, g, r);
Altersingle(alpha, bestBias, b, g, r);
if (rad != 0)
AlterNeighbour(rad, bestBias, b, g, r);
pix += step;
if (pix >= lim)
pix -= _lengthCount;
i++;
if (delta == 0)
delta = 1;
if (i % delta == 0)
{
alpha -= alpha / _alphadec;
radius -= radius / RadiusDec;
rad = radius >> RadiusBiasShift;
if (rad <= 1)
rad = 0;
for (bestBias = 0; bestBias < rad; bestBias++)
_radPower[bestBias] =
alpha * (((rad * rad - bestBias * bestBias) * RadBias) / (rad * rad));
}
}
//Console.WriteLine("Finished 1D learning: alpha= " + ((float)alpha) / InitAlpha);
}