// Copyright (c) 2015 Kiel University and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0.
//
// SPDX-License-Identifier: EPL-2.0

package p3order

import (
	

	basegraph 
	
)

// GreedySwitchIntermediateForGraph implements GraphConfigurator's exact
// activation decision. It must be called while the graph is still layerless,
// since the threshold is compared to LGraph.layerlessNodes.size().
func (
	 *layered.LGraphArena,
	 layered.LGraphID,
) (layered.IntermediateProcessorStrategy, bool) {
	 := .Graph()
	 := basegraph.Get(&.Properties, layered.Hierarchy) == layered.HierarchyIncludeChildren
	var  layered.GreedySwitchType
	if  {
		 = basegraph.Get(&.Properties, layered.GreedySwitchHierarchical)
		if .ParentNode != nil ||  == layered.GreedySwitchOff {
			return 0, false
		}
	} else {
		 = basegraph.Get(&.Properties, layered.GreedySwitch)
		 := basegraph.Get(&.Properties, layered.SemiInteractive) ||
			basegraph.Get(&.Properties, layered.CrossingMinimization) == layered.CrossingMinimizationInteractive
		 := basegraph.Get(&.Properties, layered.GreedySwitchActivationThreshold)
		if  ||  == layered.GreedySwitchOff ||
			 != 0 &&  <= len(.LayerlessNodes) {
			return 0, false
		}
	}
	if  == layered.GreedySwitchOneSided {
		return layered.OneSidedGreedySwitch, true
	}
	return layered.TwoSidedGreedySwitch, true
}

// NewGreedySwitchPostprocessor constructs IntermediateProcessorStrategy's
// exact LayerSweepCrossingMinimizer variant.
func (
	 layered.IntermediateProcessorStrategy,
) (*LayerSweepCrossingMinimizer, error) {
	switch  {
	case layered.OneSidedGreedySwitch:
		return NewLayerSweepCrossingMinimizer(CrossMinOneSidedGreedySwitch), nil
	case layered.TwoSidedGreedySwitch:
		return NewLayerSweepCrossingMinimizer(CrossMinTwoSidedGreedySwitch), nil
	default:
		return nil, fmt.Errorf("p3order: strategy %d is not a greedy-switch processor", )
	}
}

func (
	 *layered.LGraphArena,
	 layered.LGraphID,
	 layered.IntermediateProcessorStrategy,
) error {
	,  := NewGreedySwitchPostprocessor()
	if  != nil {
		return 
	}
	return .ProcessHierarchy(, )
}