bool NeuralGas::trainOneEpoch(const std::vector<std::shared_ptr<wv::Point>>& points, double epsilon) { //create vector with order of iterating by points std::vector<uint32_t> order; for (uint32_t i = 0; i < points.size(); i++) order.push_back(i); std::random_shuffle(order.begin(), order.end()); uint32_t iteration = 1; alr::AdaptLearnRateNeuralGas alrn(0, m_AdaptLearnRateWinner, m_AdaptLearnRateNotWinner); double error_before = getErrorOnNeuron(); for (uint32_t i = 0; i < order.size(); i++) { findWinners(points[order[i]].get()); updateWeights(points[order[i]].get(), &alrn); incrementEdgeAgeFromWinner(); updateEdgeWinSecWin(); deleteOldEdges(); if (iteration % m_Lambda == 0) { insertNode(); } decreaseAllErrors(); iteration++; } double error_after = getErrorOnNeuron(); log_netw->info((boost::format("Error before %g. Error after %g") % error_before % error_after).str()); log_netw->info((boost::format("Network size: %d neurons") % m_Neurons.size()).str()); return (error_before - getErrorOnNeuron() > epsilon); }
void GraphDrawingScene::notify(Subject *subject) { _graph = (Graph*)subject; // get the last added nodes, only these nodes have to be linked with observers addNewNodes(_graph->getLastAddedNodes()); // add all the new edges and link these with observers addNewEdges(_graph->getLastAddedEdges()); // remove old nodes and edges deleteOldNodes(); deleteOldEdges(); _cachedNode = NULL; }