void NeuralNetwork::updateBeforeEdges(vector<double> &delta) { // 各中間ノード for(int m = 0; m < middle_nodes.size(); ++m) { // 修正量を計算 Node middle = getMiddleNode(m); double deriv = middle.value * (1.0 - middle.value); // 現在の中間ノードへ伝搬する誤差 double error = 0.0; for(int o = 0; o < output_nodes.size(); ++o) { Edge after_edge = after_edges.at(output_nodes.size() * middle.id + o); error += after_edge.weight * delta.at(o); } // 現在の中間ノードへ伸びてくるエッジ集合 vector<Edge> edges = getBeforeEdges(m); for(int i = 0; i < edges.size(); ++i) { Edge e = edges.at(i); // あるエッジ Node input = getInputNode(i); // 根元のノード // 修正量の計算 double update = learn_coeff * input.value * error * deriv; // 重みを修正して更新 e.weight += update; setBeforeEdge(e); } } }
void LocalTrackView::solo(bool b) { getInputNode()->setSolo(b);// audio only soloButton->setChecked(b);// gui only }
void LocalTrackView::mute(bool b) { getInputNode()->setMute(b);// audio only muteButton->setChecked(b);// gui only }