Esempio n. 1
0
        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;
                    }
                }
            }
        }