package dagro

type postorderRange struct{ low, lim int }

func parentDummyChains( *Graph) {
	 := compoundPostorder()
	,  := asAttrs(.Graph())["dummyChains"].([]string)
	for ,  := range  {
		 := 
		 := asAttrs(.Node())
		 := ["edgeObj"].(Edge)
		,  := findCompoundPath(, , .V, .W)
		 := 0
		 := []
		 := true
		for  != .W {
			 = asAttrs(.Node())
			if  {
				for {
					 = []
					if  ==  || num(asAttrs(.Node()), "maxRank") >= num(, "rank") {
						break
					}
					++
				}
				if  ==  {
					 = false
				}
			}
			if ! {
				for  < len()-1 {
					 := [+1]
					if num(asAttrs(.Node()), "minRank") > num(, "rank") {
						break
					}
					++
					 = 
				}
				 = []
			}
			if  == "" {
				_ = .setParentKnownAcyclic()
			} else {
				_ = .setParentKnownAcyclic(, )
			}
			 = .Successors()[0]
		}
	}
}

func findCompoundPath( *Graph,  map[string]postorderRange, ,  string) ([]string, string) {
	var ,  []string
	 := [].low
	if [].low <  {
		 = [].low
	}
	 := [].lim
	if [].lim >  {
		 = [].lim
	}
	 := 
	for {
		,  := .Parent()
		if  {
			 = 
		} else {
			 = ""
		}
		 = append(, )
		if  == "" || !([].low >  ||  > [].lim) {
			break
		}
	}
	 := 
	 = 
	for {
		,  := .Parent()
		if  {
			 = 
		} else {
			 = ""
		}
		if  ==  {
			break
		}
		 = append(, )
	}
	for ,  := 0, len()-1;  < ; ,  = +1, -1 {
		[], [] = [], []
	}
	return append(, ...), 
}

func compoundPostorder( *Graph) map[string]postorderRange {
	 := map[string]postorderRange{}
	 := 0
	var  func(string)
	 = func( string) {
		 := 
		for ,  := range .Children() {
			()
		}
		[] = postorderRange{low: , lim: }
		++
	}
	for ,  := range .Children() {
		()
	}
	return 
}