public Verdict GetVerdict(IEnumerable <Channel> outputChannels) { return(OutputComparer.Compare(outputChannels, _smeMemoryStore, _originalMemoryStore)); }
private void MoveToLookupStructures() { MarkChains(); RenameNodeIds(); int nChains = m_nHiEdges - m_nHiSources + 1; for (int i = 0; i < m_numStates; i++) { if (m_descendantsUpdate[i].Count >= m_topL) { int newid = m_oldId2NewId[i]; int[] descendants = m_descendantsUpdate[i].ToArray(); m_descendants.Add(newid, descendants); } } m_descendantsUpdate.Clear(); m_descendantsUpdate = null; int nOutput = 0; for (int i = 0; i < m_numStates; i++) { if (m_outputFnUpdate[i].Count > 0) { nOutput++; } } m_outputFn = new OutputStruct[nOutput]; int totalChars = 0; foreach (string e in m_EntitiesUpdate) { totalChars += e.Length; } m_EntityChars = new char[totalChars]; m_EntityOffsets = new int[m_EntitiesUpdate.Count]; int currOffset = 0; int currEntityId = 0; foreach (string e in m_EntitiesUpdate) { m_EntityOffsets[currEntityId++] = currOffset; foreach (char c in e) { m_EntityChars[currOffset++] = c; } } m_EntitiesUpdate.Clear(); m_EntitiesUpdate = null; int TotalEdges = 0; int idx = 0; for (int i = 0; i < m_numStates; i++) { if (m_outputFnUpdate[i].Count > 0) { if (m_outputFnUpdate[i].Count > 1) { throw new Exception("Output size exceeded 1"); } m_outputFn[idx].nodeid = m_oldId2NewId[i]; m_outputFn[idx].entityid = m_outputFnUpdate[i][0]; idx++; } m_outputFnUpdate[i].Clear(); int nChildren = m_childTokensUpdate[i].Count; TotalEdges += nChildren; } OutputComparer comparer = new OutputComparer(); Array.Sort(m_outputFn, comparer); m_outputFnUpdate.Clear(); m_outputFnUpdate = null; m_childState = new TrieChildState(m_numStates, m_nHiSources, TotalEdges, m_nHiEdges); Dictionary <int, int> newId2oldId = new Dictionary <int, int>(); Dictionary <int, int> .Enumerator old2newEnum = m_oldId2NewId.GetEnumerator(); int maxNewId = 0; while (old2newEnum.MoveNext()) { newId2oldId.Add(old2newEnum.Current.Value, old2newEnum.Current.Key); if (old2newEnum.Current.Value > maxNewId) { maxNewId = old2newEnum.Current.Value; } } for (int i = 0; i < m_nHiSources; i++) { int oldid = newId2oldId[i]; m_childState.BeginHiSource(i, m_childTokensUpdate[oldid].Count); m_childTokensUpdate[oldid].Sort(); foreach (char c in m_childTokensUpdate[oldid]) { int tgt; m_gotoFnUpdate.TryGetValue(oldid, c, out tgt); m_childState.AddHiTarget(i, c, m_oldId2NewId[tgt]); } m_childTokensUpdate[oldid].Clear(); } m_childState.BeginLo(); for (int i = m_nHiSources; i < maxNewId; i++) { int oldid = newId2oldId[i]; if (m_chains.ContainsKey(oldid)) { m_childState.AddLo(i, m_chains[oldid].ToCharArray()); } } newId2oldId.Clear(); newId2oldId = null; m_childTokensUpdate.Clear(); m_childTokensUpdate = null; m_gotoFnUpdate.Clear(); m_gotoFnUpdate = null; m_oldId2NewId.Clear(); m_oldId2NewId = null; m_chains.Clear(); m_chains = null; }