예제 #1
0
        /// <summary>
        /// Moves the walker
        /// </summary>
        /// <returns>Node where walker moved onto.</returns>
        public Node Next()
        {
            if (mathUtils.Test(jump))
            {
                current    = Utils.Extensions.GetAtRandom(mnet.GetNodes());
                justJumped = true;
                noAction   = false;
            }
            else
            {
                Layer flattened   = mnet.GetLayer("flattenedNetwork");
                var   layerId     = layerIds[current.Layer.Id];
                var   layerIdTest = mathUtils.Test(transitions, layerId);
                var   newLayer    = mnet.GetLayers().Except(new HashSet <Layer>()
                {
                    flattened
                }).ElementAt(layerIdTest);

                if (current.Layer == newLayer)
                {
                    // Inside same layer.
                    var neigh = mnet.Neighbors(current, EdgeMode.Out);
                    if (neigh.Count == 0)
                    {
                        // Cant move.
                        // No action.
                        noAction = true;
                        return(current);
                    }

                    var rand = mathUtils.GetRandomInt(neigh.Count);
                    current    = neigh.ElementAt(rand);
                    justJumped = false;
                    noAction   = false;
                }
                else
                {
                    // Changing to another node with this actor.
                    var nextNode = mnet.GetNode(current.Actor, newLayer);
                    if (nextNode == null)
                    {
                        // No other nodes with this actor.
                        noAction = true;
                        return(current);
                    }

                    current    = nextNode;
                    justJumped = false;
                    noAction   = false;
                }
            }

            return(current);
        }
        /// <summary>
        /// Flatten layers into single layer.
        /// </summary>
        /// <param name="mnet">Multilayer network.</param>
        /// <param name="newLayerName">Name of the new layer.</param>
        /// <param name="layers">Layers to flatten.</param>
        /// <param name="forceDirected">True if new edges should be directed, false if not.</param>
        /// <param name="forceActors">True if all actors should be on the new layer, false if not.</param>
        /// <returns>Flattened layer.</returns>
        public Layer FlattenUnweighted(MultilayerNetwork mnet, string newLayerName, HashSet <Layer> layers,
                                       bool forceDirected = false, bool forceActors = false)
        {
            var newLayer = createLayer(mnet, newLayerName, layers, forceDirected, forceActors);
            var directed = mnet.IsDirected(newLayer, newLayer);

            foreach (var layer1 in layers)
            {
                foreach (var layer2 in layers)
                {
                    foreach (var edge in mnet.GetEdges(layer1, layer2))
                    {
                        var node1   = mnet.GetNode(edge.V1.Actor, newLayer);
                        var node2   = mnet.GetNode(edge.V2.Actor, newLayer);
                        var newEdge = mnet.GetEdge(node1, node2);

                        if (newEdge == null)
                        {
                            newEdge = mnet.AddEdge(node1, node2);
                        }

                        // If new layer is directed, undirected edges must be added twice in both directions.
                        if (directed && edge.Directionality == EdgeDirectionality.Undirected)
                        {
                            newEdge = mnet.GetEdge(node2, node1);
                            if (newEdge == null)
                            {
                                newEdge = mnet.AddEdge(node2, node1);
                            }
                        }
                    }
                }
            }

            return(newLayer);
        }