VariableLayout CNTKEvalExtended<ElemType>::ToVariableLayout(const ComputationNodeBasePtr n) { auto matrix = dynamic_pointer_cast<Matrix<ElemType>>(n->ValuePtr()); return VariableLayout { /* name */ n->GetName(), /* type */ sizeof(ElemType) == sizeof(float) ? VariableLayout::Float32 : VariableLayout::Float64, /* storage */ matrix ? matrix->GetMatrixType() == MatrixType::DENSE ? VariableLayout::Dense : matrix->GetMatrixType() == MatrixType::SPARSE ? VariableLayout::Sparse : VariableLayout::Undetermined : VariableLayout::Undetermined, /* dimension */ n->GetSampleLayout().GetNumElements() }; }
// replace the old node with the current node, assuming the old node is a leaf node // need to update those nodes who use oldNode as their child void ComputationNetwork::ReplaceLeafNode(wstring oldNodeName, ComputationNodeBasePtr newNode) { InvalidateCompiledNetwork(); ComputationNodeBasePtr oldNode = GetNodeFromName(oldNodeName); // change the input of those nodes whose child is oldNode for (auto nodeIter = m_nameToNodeMap.begin(); nodeIter != m_nameToNodeMap.end(); nodeIter++) { ComputationNodeBasePtr node = nodeIter->second; for (int i = 0; i < node->GetNumInputs(); i++) if (node->GetInputs()[i] == oldNode) node->SetInput(i, newNode); } m_nameToNodeMap[newNode->GetName()] = newNode; // now the old node becomes a orphan node , remove it DeleteNode(oldNodeName); // RemoveOrphanNode(oldNode); }