public Associations Associate(SGF query, List <SGF> queryResult) { //add new queries AddQueriesFromResultsSgf(queryResult); //remove old query Queries.Remove(query); //add graph edges var queryDecomposed = query.Decompose(); foreach (var sgf in queryResult) { foreach (var msgfTo in sgf.Decompose()) { foreach (var msgfFrom in queryDecomposed) { Graph.AddEdge(msgfFrom, msgfTo); } } } //update limits UnitsLimit.UpdateCurrentValues( (uint)Math.Max(QueriesList.Count(), Queries.Count) , Graph.GetNodeCount() , Graph.GetEdgeCount()); return(this); }
protected void DoWave() { TotalUpdates += 1; MSGF currentNode = StartNodes.ToList()[Rnd.Next(StartNodes.Count)]; HashSet <MSGF> uniquePathsNodes = new HashSet <MSGF>(new MsgfEqualityComparer()); double rnd = Math.Min(0.999999, Rnd.NextDouble()); uint maxSteps = (uint)Math.Floor((TargetDistance + 1) * ((Math.Log(1 - rnd)) / (Math.Log(0.05)))); maxSteps = Math.Max(0, Math.Min(2 * TargetDistance, maxSteps)); for (uint i = 0; i < maxSteps; ++i) { uniquePathsNodes.Add(currentNode); var nodesTo = MsgfGraph.GetOutgoingNodes(currentNode).FindAll(node => !uniquePathsNodes.Contains(node)); if (!nodesTo.Any()) { break; } uint outputSum = nodesTo.Select(node => MsgfGraph.GetEdgeFreq(currentNode, node)) .Aggregate((a, b) => a + b); int pathNumber = Rnd.Next((int)outputSum); foreach (var nodeTo in nodesTo) { pathNumber -= (int)MsgfGraph.GetEdgeFreq(currentNode, nodeTo); if (pathNumber <= 0) { ProbabilityGraph.AddEdge(currentNode, nodeTo); if (!StartNodes.Contains(nodeTo)) { NodesProbability[nodeTo] += 1; } currentNode = nodeTo; break; } } } }