Exemplo n.º 1
0
        /// <summary>
        /// Removes the given <paramref name="transitionFactory"/> from this graph.
        /// </summary>
        /// <param name="transitionFactory">Transition factory to remove.</param>
        public bool RemoveTransitionFactory([CanBeNull] ITransitionFactory <TVertex, TEdge> transitionFactory)
        {
            if (_transitionFactories.Remove(transitionFactory))
            {
                _verticesEdgesCache.Clear();    // Cache no longer valid
                CleanNotProcessedCache();
                return(true);
            }

            return(false);

            #region Local function

            void CleanNotProcessedCache()
            {
                foreach (KeyValuePair <TVertex, HashSet <ITransitionFactory <TVertex, TEdge> > > pair in _verticesNotProcessedCache.ToArray())
                {
                    if (pair.Value.Count == 0 || pair.Value.Contains(transitionFactory))
                    {
                        _verticesNotProcessedCache.Remove(pair.Key);
                    }
                }
            }

            #endregion
        }
Exemplo n.º 2
0
        /// <summary>
        /// Adds a new <see cref="ITransitionFactory{TVertex,TEdge}"/> to this graph.
        /// </summary>
        /// <param name="transitionFactory">Transition factory to add.</param>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="transitionFactory"/> is <see langword="null"/>.</exception>
        public void AddTransitionFactory([NotNull] ITransitionFactory <TVertex, TEdge> transitionFactory)
        {
            if (transitionFactory is null)
            {
                throw new ArgumentNullException(nameof(transitionFactory));
            }

            _transitionFactories.Add(transitionFactory);
            MoveMainCacheToNotProcessedVertices();
        }
        private void GenerateFromTransitionFactory(
            [NotNull] TVertex current,
            [NotNull] ITransitionFactory <TVertex, TEdge> transitionFactory)
        {
            if (current == null)
            {
                throw new ArgumentNullException(nameof(current));
            }
            if (transitionFactory is null)
            {
                throw new ArgumentNullException(nameof(transitionFactory));
            }

            if (!transitionFactory.IsValid(current))
            {
                return;
            }

            foreach (TEdge transition in transitionFactory.Apply(current))
            {
                if (!AddVertexPredicate(transition.Target) ||
                    !AddEdgePredicate(transition))
                {
                    OnEdgeSkipped(transition);
                    continue;
                }

                bool backEdge = VisitedGraph.ContainsVertex(transition.Target);
                if (!backEdge)
                {
                    OnVertexDiscovered(transition.Target);
                }

                VisitedGraph.AddEdge(transition);
                if (backEdge)
                {
                    OnBackEdge(transition);
                }
                else
                {
                    OnTreeEdge(transition);
                }
            }
        }
        private void GenerateFromTransitionFactory(
            TVertex current,
            ITransitionFactory <TVertex, TEdge> transitionFactory
            )
        {
            if (!transitionFactory.IsValid(current))
            {
                return;
            }

            foreach (var transition in transitionFactory.Apply(current))
            {
                if (
                    !this.AddVertexPredicate(transition.Target) ||
                    !this.AddEdgePredicate(transition))
                {
                    this.OnEdgeSkipped(transition);
                    continue;
                }

                bool backEdge = this.VisitedGraph.ContainsVertex(transition.Target);
                if (!backEdge)
                {
                    this.OnDiscoverVertex(transition.Target);
                }

                this.VisitedGraph.AddEdge(transition);
                if (backEdge)
                {
                    this.OnBackEdge(transition);
                }
                else
                {
                    this.OnTreeEdge(transition);
                }
            }
        }
Exemplo n.º 5
0
 public bool ContainsTransitionFactory([CanBeNull] ITransitionFactory <TVertex, TEdge> transitionFactory)
 {
     return(_transitionFactories.Contains(transitionFactory));
 }
 public WorkflowEngineBuilder WithTransitionFactory(ITransitionFactory transitionFactory)
 {
     TransitionFactory = transitionFactory;
     return(this);
 }