# -*- tcl -*-
# graphops.testsupport:  Helper commands for the graph ops testsuite.
#
# Copyright (c) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
#
# All rights reserved.
#
# RCS: @(#) $Id: XOpsSupport,v 1.5 2008/11/18 03:49:57 andreas_kupries Exp $

# -------------------------------------------------------------------------

# Code to generate various graphs to operate on.

#----------------------------------------------------------------------

proc bicanon {bi} {
    return [lsort -dict [list [lsort -dict [lindex $bi 0]] [lsort -dict [lindex $bi 1]]]]
}

proc setsetcanon {s} {
    set r {}
    foreach item $s {
	lappend r [lsort -dict $item]
    }
    return [lsort -dict $r]
}

#----------------------------------------------------------------------

proc EulerTour {g arcs} {
    Euler 1 $g $arcs
}

proc EulerPath {g arcs} {
    Euler 0 $g $arcs
}

proc Euler {tour g arcs} {
    if {[llength [lsort -unique $arcs]] < [llength $arcs]} {
	#puts [lsort $arcs]
	return dup-arcs
    } elseif {![struct::set equal $arcs [$g arcs]]} {
	#puts [lsort $arcs]
	#puts [lsort [$g arcs]
	return missing-arcs
    }
    set a [lindex $arcs 0]
    set first [list [$g arc source $a] [$g arc target $a]]
    set last  $first

    #puts T=($arcs)
    #puts "$a == ($first)"
    foreach a [lrange $arcs 1 end] {
	set now  [list [$g arc source $a] [$g arc target $a]]
	set nail [struct::set intersect $last $now]

	#puts -nonewline "$a == ($now) * ($last) = ($nail)"

	if {[struct::set size $nail] < 1} {
	    return gap
	} elseif {[struct::set size $nail] > 1} {
	    return same
	}

	if {[struct::set size $now] > 1} {
	    set last [struct::set difference $now $nail]
	} ; # else: a loop arc has no effect on last.

	#puts " --> ($last)"
    }
    if {$tour} {
	set nail [struct::set intersect $last $first]
	if {[struct::set size $nail] < 1} {
	    return gap
	} elseif {[struct::set size $nail] > 1} {
	    return same
	}
    }
    return ok
}

#----------------------------------------------------------------------
#----------------------------------------------------------------------
#----------------------------------------------------------------------
