Пример #1
0
 protected MsgfGraph TouchNode(MSGF node)
 {
     if (!HasNode(node))
     {
         NodeDictionary.Add(node, new NodeEdges());
     }
     return(this);
 }
Пример #2
0
 public MsgfGraph PopNode(MSGF node)
 {
     foreach (var edge in NodeDictionary[node].IncomingEdges.ToList())
     {
         ClearEdge(edge.NodeFrom, edge.NodeTo);
     }
     NodeDictionary.Remove(node);
     return(this);
 }
Пример #3
0
 public MsgfGraph AddEdge(MSGF nodeFrom, MSGF nodeTo, uint count = 1)
 {
     if (count == 0)
     {
         return(this);
     }
     TouchEdge(nodeFrom, nodeTo);
     EdgeDictionary[new Edge(nodeFrom, nodeTo)] += count;
     return(this);
 }
Пример #4
0
 public MsgfGraph SetEdge(MSGF nodeFrom, MSGF nodeTo, uint freq = 1)
 {
     if (freq == 0)
     {
         return(ClearEdge(nodeFrom, nodeTo));
     }
     TouchEdge(nodeFrom, nodeTo);
     EdgeDictionary[new Edge(nodeFrom, nodeTo)] = freq;
     return(this);
 }
Пример #5
0
 public MsgfGraph ClearEdge(MSGF nodeFrom, MSGF nodeTo)
 {
     if (HasEdge(nodeFrom, nodeTo))
     {
         EdgeDictionary.Remove(new Edge(nodeFrom, nodeTo));
         NodeDictionary[nodeFrom].IncomingEdges.Remove(new Edge(nodeFrom, nodeTo));
         NodeDictionary[nodeFrom].OutgoingEdges.Remove(new Edge(nodeFrom, nodeTo));
     }
     return(this);
 }
Пример #6
0
 public List <MSGF> GetIncomingNodes(MSGF node)
 {
     if (!HasNode(node))
     {
         return(new List <MSGF>());
     }
     return
         (NodeDictionary[node].IncomingEdges
          .Select(edge => edge.NodeFrom)
          .ToList());
 }
Пример #7
0
 public List <MSGF> GetOutgoingNodes(MSGF node)
 {
     if (!HasNode(node))
     {
         return(new List <MSGF>());
     }
     return
         (NodeDictionary[node].OutgoingEdges
          .Select(edge => edge.NodeTo)
          .ToList());
 }
Пример #8
0
 public uint GetEdgeFreq(MSGF nodeFrom, MSGF nodeTo)
 {
     if (HasEdge(nodeFrom, nodeTo))
     {
         return(EdgeDictionary[new Edge(nodeFrom, nodeTo)]);
     }
     else
     {
         return(0);
     }
 }
Пример #9
0
        public static List <SGF> GenQueries(SGF sgf)
        {
            var list = sgf.Decompose();
            var ret  = new List <SGF>();
            {//gen words
                foreach (var msgf in list)
                {
                    ret.Add(
                        new SGF().AggregateFrom(
                            new List <MSGF> {
                        msgf
                    }));
                }
            }
            {//gen pairs
                MSGF a1 = null;
                foreach (var msgf in list)
                {
                    if (a1 != null)
                    {
                        ret.Add(
                            new SGF().AggregateFrom(
                                new List <MSGF> {
                            a1, msgf
                        }.OrderBy(l => l.GetContent())
                                .ToList()));
                    }
                    a1 = msgf;
                }
            }
            {//gen tripples
                MSGF a1 = null, a2 = null;
                foreach (var msgf in list)
                {
                    if (a1 != null && a2 != null)
                    {
                        ret.Add(
                            new SGF().AggregateFrom(
                                new List <MSGF> {
                            a1, a2, msgf
                        }.OrderBy(l => l.GetContent())
                                .ToList()));
                    }
                    a1 = a2;
                    a2 = msgf;
                }
            }
            var rnd = new Random();

            return
                (ret.OrderBy(x => rnd.Next())
                 .Take(Math.Max(3, (ret.Count + 9) / 10))
                 .ToList());
        }
Пример #10
0
        protected MsgfGraph TouchEdge(MSGF nodeFrom, MSGF nodeTo)
        {
            TouchNode(nodeFrom);
            TouchNode(nodeTo);

            if (!HasEdge(nodeFrom, nodeTo))
            {
                EdgeDictionary.Add(new Edge(nodeFrom, nodeTo), 0);
                NodeDictionary[nodeFrom].OutgoingEdges.Add(new Edge(nodeFrom, nodeTo));
                NodeDictionary[nodeTo].IncomingEdges.Add(new Edge(nodeFrom, nodeTo));
            }
            return(this);
        }
Пример #11
0
 public MsgfGraph PopEdge(MSGF nodeFrom, MSGF nodeTo, uint count = 1)
 {
     if (count == 0)
     {
         return(this);
     }
     TouchEdge(nodeFrom, nodeTo);
     if (EdgeDictionary[new Edge(nodeFrom, nodeTo)] <= count)
     {
         return(ClearEdge(nodeFrom, nodeTo));
     }
     EdgeDictionary[new Edge(nodeFrom, nodeTo)] -= count;
     return(this);
 }
Пример #12
0
        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;
                    }
                }
            }
        }
Пример #13
0
 public bool HasNode(MSGF node)
 {
     return(NodeDictionary.ContainsKey(node));
 }
Пример #14
0
 public MsgfGraph AddNode(MSGF node)
 {
     return(TouchNode(node));
 }
Пример #15
0
 public Edge(MSGF nodeFrom, MSGF nodeTo)
 {
     NodeFrom = nodeFrom;
     NodeTo   = nodeTo;
 }
Пример #16
0
 public bool HasEdge(MSGF nodeFrom, MSGF nodeTo)
 {
     return(EdgeDictionary.ContainsKey(new Edge(nodeFrom, nodeTo)));
 }