package grouping

import 

// ResetClusters removes inactive vessel metadata so a later layout rediscovers
// clusters from ordinary nodes and edges.
func ( *layoutgraph.Graph) {
	if len(.Clusters) == 0 {
		return
	}
	 := len(.Clusters) > 1
	var  *layoutgraph.Node
	 := 0
	for ,  := range .Clusters {
		if  == nil {
			continue
		}
		for ,  := range .EdgeAbductions {
			if  == nil || .Edge == nil {
				continue
			}
			if .OriginallyFrom != nil {
				.Edge.Reconnect(.OriginallyFrom, false)
			}
			if .OriginallyTo != nil {
				.Edge.Reconnect(.OriginallyTo, true)
			}
		}
		for ,  := range .Nodes {
			if  != nil && .Cluster ==  {
				.Cluster = nil
			}
			if  != nil && .Nears != nil {
				delete(.Nears, )
			}
		}
		if  == nil {
			continue
		}
		for  := range .Nears {
			if  != nil && .Nears != nil {
				delete(.Nears, )
			}
		}
		.Nears = map[*layoutgraph.Node]struct{}{}
		if  {
			++
			if  == 1 {
				 = 
			}
		} else {
			 := .Nodes[:0]
			for ,  := range .Nodes {
				if  !=  {
					 = append(, )
				}
			}
			.Nodes = 
			for ,  := range .Containers {
				 := [:0]
				for ,  := range  {
					if  !=  {
						 = append(, )
					}
				}
				.Containers[] = 
			}
		}
		.Container = nil
		.Graph = nil
		.UnmarkClusterVessel()
	}
	if ! {
		clear(.Clusters)
		return
	}
	if  == 0 {
		clear(.Clusters)
		return
	}
	if  == 1 {
		 := .Nodes[:0]
		for ,  := range .Nodes {
			if  !=  {
				 = append(, )
			}
		}
		.Nodes = 
		for ,  := range .Containers {
			 := [:0]
			for ,  := range  {
				if  !=  {
					 = append(, )
				}
			}
			.Containers[] = 
		}
		clear(.Clusters)
		return
	}
	// The loop above detaches every removable vessel. Check that cheap marker
	// before consulting Clusters so ordinary survivors avoid a map lookup.
	 := .Nodes[:0]
	for ,  := range .Nodes {
		 :=  != nil && .Graph == nil && .Clusters[] != nil
		if ! {
			 = append(, )
		}
	}
	.Nodes = 
	for ,  := range .Containers {
		 := [:0]
		for ,  := range  {
			 :=  != nil && .Graph == nil && .Clusters[] != nil
			if ! {
				 = append(, )
			}
		}
		.Containers[] = 
	}
	clear(.Clusters)
}

// Cleanup restores cluster and sequence members after node placement and
// retires the temporary vessels while retaining rediscovery metadata.
func ( *layoutgraph.Graph) {
	for ,  := range .ClusterOrder() {
		 := .Clusters[]
		.ArrangeClusterNodes()
		for ,  := range .Nodes {
			.AddNewNodeToContainer(.Container, )
		}
		for ,  := range .EdgeAbductions {
			if .OriginallyFrom != nil {
				.Edge.Reconnect(.OriginallyFrom, false)
			}
			if .OriginallyTo != nil {
				.Edge.Reconnect(.OriginallyTo, true)
			}
		}
		if len(.Vessel.Nears) != 0 {
			for ,  := range .Vessel.OrderedNears() {
				delete(.Nears, .Vessel)
				for ,  := range .Nodes {
					.AddNear()
				}
			}
			.Vessel.Nears = map[*layoutgraph.Node]struct{}{}
		}
		.RemoveNode(.Vessel)
		 := make([]*layoutgraph.Node, 0)
		for ,  := range .Containers[.Container] {
			if  != .Vessel {
				 = append(, )
			}
		}
		.Containers[.Container] = 
		.Vessel.Container = nil
		.Vessel.Graph = nil
	}

	for ,  := range .SequenceOrder() {
		 := .Sequences[]
		.ArrangeSteps()
		for ,  := range .Nodes {
			.AddNewNodeToContainer(.Container, )
		}
		for ,  := range .EdgeAbductions {
			if .OriginallyFrom != nil {
				.Edge.Reconnect(.OriginallyFrom, false)
			}
			if .OriginallyTo != nil {
				.Edge.Reconnect(.OriginallyTo, true)
			}
		}
		if len(.Vessel.Nears) != 0 {
			for ,  := range .Vessel.OrderedNears() {
				delete(.Nears, .Vessel)
				for ,  := range .Nodes {
					.AddNear()
				}
			}
			.Vessel.Nears = map[*layoutgraph.Node]struct{}{}
		}
		.RemoveNode()
		var  []*layoutgraph.Node
		for ,  := range .Containers[.Container] {
			if  !=  {
				 = append(, )
			}
		}
		.Containers[.Container] = 
		.Vessel.Container = nil
		.Vessel.Graph = nil
	}
	for ,  := range .Nodes {
		.HerdAssignment = nil
	}
}