/// update - Recompute Value from Bias and Links. Return true when node /// preference changes. bool update(const Node nodes[]) { // Compute the weighted sum of inputs. BlockFrequency SumN = BiasN; BlockFrequency SumP = BiasP; for (LinkVector::iterator I = Links.begin(), E = Links.end(); I != E; ++I) { if (nodes[I->second].Value == -1) SumN += I->first; else if (nodes[I->second].Value == 1) SumP += I->first; } // Each weighted sum is going to be less than the total frequency of the // bundle. Ideally, we should simply set Value = sign(SumP - SumN), but we // will add a dead zone around 0 for two reasons: // // 1. It avoids arbitrary bias when all links are 0 as is possible during // initial iterations. // 2. It helps tame rounding errors when the links nominally sum to 0. // bool Before = preferReg(); if (SumN >= SumP + Threshold) Value = -1; else if (SumP >= SumN + Threshold) Value = 1; else Value = 0; return Before != preferReg(); }
/// addLink - Add a link to bundle b with weight w. /// out=0 for an ingoing link, and 1 for an outgoing link. void addLink(unsigned b, float w, bool out) { // Normalize w relative to all connected blocks from that direction. w /= Frequency[out]; // There can be multiple links to the same bundle, add them up. for (LinkVector::iterator I = Links.begin(), E = Links.end(); I != E; ++I) if (I->second == b) { I->first += w; return; } // This must be the first link to b. Links.push_back(std::make_pair(w, b)); }
/// addLink - Add a link to bundle b with weight w. void addLink(unsigned b, BlockFrequency w) { // Update cached sum. SumLinkWeights += w; // There can be multiple links to the same bundle, add them up. for (LinkVector::iterator I = Links.begin(), E = Links.end(); I != E; ++I) if (I->second == b) { I->first += w; return; } // This must be the first link to b. Links.push_back(std::make_pair(w, b)); }
/// update - Recompute Value from Bias and Links. Return true when node /// preference changes. bool update(const Node nodes[]) { // Compute the weighted sum of inputs. float Sum = Bias; for (LinkVector::iterator I = Links.begin(), E = Links.end(); I != E; ++I) Sum += I->first * nodes[I->second].Value; // The weighted sum is going to be in the range [-2;2]. Ideally, we should // simply set Value = sign(Sum), but we will add a dead zone around 0 for // two reasons: // 1. It avoids arbitrary bias when all links are 0 as is possible during // initial iterations. // 2. It helps tame rounding errors when the links nominally sum to 0. const float Thres = 1e-4f; bool Before = preferReg(); if (Sum < -Thres) Value = -1; else if (Sum > Thres) Value = 1; else Value = 0; return Before != preferReg(); }