stagePlanner.go
func mirrorStageSubtree(stages []*evaluationStage) {

	var rootStage, inverseStage, carryStage, frontStage *evaluationStage

	stagesLength := len(stages)

	// reverse all right/left
	for _, frontStage = range stages {

		carryStage = frontStage.rightStage
		frontStage.rightStage = frontStage.leftStage
		frontStage.leftStage = carryStage
	}

	// end left swaps with root right
	rootStage = stages[0]
	frontStage = stages[stagesLength-1]

	carryStage = frontStage.leftStage
	frontStage.leftStage = rootStage.rightStage
	rootStage.rightStage = carryStage

	// for all non-root non-end stages, right is swapped with inverse stage right in list
	for i := 0; i < (stagesLength-2)/2+1; i++ {

		frontStage = stages[i+1]
		inverseStage = stages[stagesLength-i-1]

		carryStage = frontStage.rightStage
		frontStage.rightStage = inverseStage.rightStage
		inverseStage.rightStage = carryStage
	}

	// swap all other information with inverse stages
	for i := 0; i < stagesLength/2; i++ {

		frontStage = stages[i]
		inverseStage = stages[stagesLength-i-1]
		frontStage.swapWith(inverseStage)
	}
}
func mirrorStageSubtree(stages []*evaluationStage) {

	var rootStage, inverseStage, carryStage, frontStage *evaluationStage

	stagesLength := len(stages)

	// reverse all right/left
	for _, frontStage = range stages {

		carryStage = frontStage.rightStage
		frontStage.rightStage = frontStage.leftStage
		frontStage.leftStage = carryStage
	}

	// end left swaps with root right
	rootStage = stages[0]
	frontStage = stages[stagesLength-1]

	carryStage = frontStage.leftStage
	frontStage.leftStage = rootStage.rightStage
	rootStage.rightStage = carryStage

	// for all non-root non-end stages, right is swapped with inverse stage right in list
	for i := 0; i < (stagesLength-2)/2+1; i++ {

		frontStage = stages[i+1]
		inverseStage = stages[stagesLength-i-1]

		carryStage = frontStage.rightStage
		frontStage.rightStage = inverseStage.rightStage
		inverseStage.rightStage = carryStage
	}

	// swap all other information with inverse stages
	for i := 0; i < stagesLength/2; i++ {

		frontStage = stages[i]
		inverseStage = stages[stagesLength-i-1]
		frontStage.swapWith(inverseStage)
	}
}
func mirrorStageSubtree ( stages [ ] * evaluationStage ) { var rootStage , inverseStage , carryStage , frontStage * evaluationStage stagesLength := len ( stages ) // reverse all right/left for _ , frontStage = range stages { carryStage = frontStage . rightStage frontStage . rightStage = frontStage . leftStage frontStage . leftStage = carryStage } // end left swaps with root right rootStage = stages [ 0 ] frontStage = stages [ stagesLength - 1 ] carryStage = frontStage . leftStage frontStage . leftStage = rootStage . rightStage rootStage . rightStage = carryStage // for all non-root non-end stages, right is swapped with inverse stage right in list for i := 0 ; i < ( stagesLength - 2 ) / 2 + 1 ; i ++ { frontStage = stages [ i + 1 ] inverseStage = stages [ stagesLength - i - 1 ] carryStage = frontStage . rightStage frontStage . rightStage = inverseStage . rightStage inverseStage . rightStage = carryStage } // swap all other information with inverse stages for i := 0 ; i < stagesLength / 2 ; i ++ { frontStage = stages [ i ] inverseStage = stages [ stagesLength - i - 1 ] frontStage . swapWith ( inverseStage ) } }
/*
	Performs a "mirror" on a subtree of stages.
	This mirror functionally inverts the order of execution for all members of the [stages] list.
	That list is assumed to be a root-to-leaf (ordered) list of evaluation stages, where each is a right-hand stage of the last.
*/
/ * Performs a mirror on a subtree of stages . This mirror functionally inverts the order of execution for all members of the [ stages ] list . That list is assumed to be a root - to - leaf ( ordered ) list of evaluation stages where each is a right - hand stage of the last .