示例#1
0
文件: GWNode.cs 项目: dtklinh/CRFTool
        public GWEdge <NodeData, EdgeData, GraphData> CreateEdge(GWNode <NodeData, EdgeData, GraphData> foot, GWNode <NodeData, EdgeData, GraphData> head)
        {
            var newEdge = new GWEdge <NodeData, EdgeData, GraphData>(foot, head);

            foot.AddOutEdge(newEdge);
            head.AddInEdge(newEdge);

            edges.Add(newEdge);

            return(newEdge);
        }
示例#2
0
文件: GWNode.cs 项目: dtklinh/CRFTool
        internal void AddInEdge(GWEdge <NodeData, EdgeData, GraphData> edge)
        {
            switch (Graph.GraphStyle)
            {
            case GraphStyle.Directed:
                inEdges.Add(edge);
                parents.Add(edge.Foot);
                break;

            case GraphStyle.Undirected:

                edges.Add(edge);
                neighbours.Add(edge.Foot);
                break;

            default:
                break;
            }
        }
示例#3
0
文件: GWNode.cs 项目: dtklinh/CRFTool
        internal void AddOutEdge(GWEdge <NodeData, EdgeData, GraphData> edge)
        {
            switch (Graph.GraphStyle)
            {
            case GraphStyle.Directed:
                outEdges.AddLast(edge);
                children.Add(edge.Head);
                break;

            case GraphStyle.Undirected:

                edges.Add(edge);
                neighbours.Add(edge.Head);
                break;

            default:
                break;
            }
        }
示例#4
0
        public GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData> CreateGraph(ErdösGraphCreationParameter parameter)
        {
            GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData> graph = new GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData>();

            graph.Data = new SGLGraphData();
            graph.Data.NumberCategories = parameter.NumberCategories;

            for (int i = 0; i < parameter.NumberNodes; i++)
            {
                graph.CreateNode();
            }


            //put each node in category s.t. no empty categories
            bool hasEmptyCategory = true;

            while (hasEmptyCategory)
            {
                List <int> categoriesUsed = new List <int>();
                for (int i = 0; i < parameter.NumberCategories; i++)
                {
                    categoriesUsed.Add(i);
                }
                foreach (var node in graph.Nodes)
                {
                    node.Data = new SGLNodeData();
                    //put node in random category
                    var category = random.Next(parameter.NumberCategories);
                    node.Data.Category = category;
                    categoriesUsed.Remove(category);
                }

                if (categoriesUsed.Count == 0)
                {
                    hasEmptyCategory = false;
                }
            }


            var nodes = graph.Nodes.ToList();

            //connect nodes
            for (int i = 1; i < nodes.Count; i++)
            {
                GWNode <SGLNodeData, SGLEdgeData, SGLGraphData> currentNode = nodes[i];
                //create edge to previous nodes with defined probabilty
                for (int j = 0; j < i; j++)
                {
                    if (currentNode.Data.Category == nodes[j].Data.Category)
                    {
                        double probabilty = random.NextDouble();
                        if (probabilty <= parameter.IntraConnectivityDegree)
                        {
                            GWEdge <SGLNodeData, SGLEdgeData, SGLGraphData> edge = graph.CreateEdge(currentNode, nodes[j]);
                            edge.Data      = new SGLEdgeData();
                            edge.Data.Type = EdgeType.Intra;
                        }
                    }
                    //nodes are in different category
                    else if (currentNode.Data.Category != nodes[j].Data.Category)
                    {
                        double probabilty = random.NextDouble();
                        if (probabilty <= parameter.InterConnectivityDegree)
                        {
                            GWEdge <SGLNodeData, SGLEdgeData, SGLGraphData> edge = graph.CreateEdge(currentNode, nodes[j]);
                            edge.Data      = new SGLEdgeData();
                            edge.Data.Type = EdgeType.Inter;
                        }
                    }
                }
            }


            return(graph);
        }