/// <summary>
 /// Copy constructor of the <see cref="NonDirectedGraph&lt;TVertex, TEdge&gt;"/> class.
 /// </summary>
 /// <param name="graph">The graph.</param>
 /// <param name="edgeProducerFunc">The edge producer func which produces edges for this directed graph. Used in some algorithms which
 /// have to produce edges.</param>
 /// <param name="isCommandified">If set to true, the graph is a commandified graph, which means all actions taken on this graph which mutate
 /// graph state are undoable.</param>
 /// <param name="isSynchronized">if set to <c>true</c> this list is a synchronized collection, using a lock on SyncRoot to synchronize activity in multithreading
 /// scenarios</param>
 public NonDirectedGraph(NonDirectedGraph <TVertex, TEdge> graph, Func <TVertex, TVertex, TEdge> edgeProducerFunc, bool isCommandified, bool isSynchronized)
     : base(graph, false, isCommandified, isSynchronized)
 {
     this.EdgeProducerFunc = edgeProducerFunc;
 }
 /// <summary>
 /// Copy constructor of the <see cref="NonDirectedGraph&lt;TVertex, TEdge&gt;"/> class.
 /// </summary>
 /// <param name="graph">The graph.</param>
 /// <param name="edgeProducerFunc">The edge producer func which produces edges for this directed graph. Used in some algorithms which
 /// have to produce edges.</param>
 /// <param name="isCommandified">If set to true, the graph is a commandified graph, which means all actions taken on this graph which mutate
 /// graph state are undoable.</param>
 public NonDirectedGraph(NonDirectedGraph <TVertex, TEdge> graph, Func <TVertex, TVertex, TEdge> edgeProducerFunc, bool isCommandified)
     : this(graph, edgeProducerFunc, isCommandified, isSynchronized : false)
 {
 }
 /// <summary>
 /// Copy constructor of the <see cref="NonDirectedGraph&lt;TVertex, TEdge&gt;"/> class.
 /// </summary>
 /// <param name="graph">The graph.</param>
 /// <param name="isCommandified">If set to true, the graph is a commandified graph, which means all actions taken on this graph which mutate
 /// graph state are undoable.</param>
 public NonDirectedGraph(NonDirectedGraph <TVertex, TEdge> graph, bool isCommandified)
     : this(graph, null, isCommandified, isSynchronized : false)
 {
 }
 /// <summary>
 /// Copy constructor of the <see cref="NonDirectedGraph&lt;TVertex, TEdge&gt;"/> class.
 /// </summary>
 /// <param name="graph">The graph.</param>
 public NonDirectedGraph(NonDirectedGraph <TVertex, TEdge> graph)
     : this(graph, null, false)
 {
 }
 /// <summary>
 /// Copy constructor of the <see cref="NonDirectedGraph&lt;TVertex, TEdge&gt;"/> class.
 /// </summary>
 /// <param name="graph">The graph.</param>
 /// <param name="edgeProducerFunc">The edge producer func which produces edges for this directed graph. Used in some algorithms which
 /// have to produce edges.</param>
 public NonDirectedGraph(NonDirectedGraph <TVertex, TEdge> graph, Func <TVertex, TVertex, TEdge> edgeProducerFunc)
     : this(graph, edgeProducerFunc, false)
 {
 }
 /// <summary>
 /// Copy constructor of the <see cref="NonDirectedGraph&lt;TVertex, TEdge&gt;"/> class.
 /// </summary>
 /// <param name="graph">The graph.</param>
 /// <param name="isCommandified">If set to true, the graph is a commandified graph, which means all actions taken on this graph which mutate
 /// graph state are undoable.</param>
 public NonDirectedGraph(NonDirectedGraph <TVertex, TEdge> graph, bool isCommandified)
     : this(graph, null, isCommandified)
 {
 }