;; Copyright (C) 1996 DIMACS Center, Rutgers, The State University of New Jersey
;; Author(s): Jonathan Berry

;; This software is copyrighted by the DIMACS Center at Rutgers, The State
;; University of New Jersey.  IT IS PROVIDED AS IS, AND THE AUTHORS, DIMACS, AND
;; RUTGERS, THE STATE UNIVERSITY OF NEW JERSEY  DISCLAIM
;; ALL LIABILITY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
;; DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
;; DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
;; POSSIBILITY OF SUCH DAMAGE.

;; THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
;; FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
;; IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
;; NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
;; MODIFICATIONS.

;; The authors hereby grant permission to use, copy, modify, distribute,
;; and license this software and its documentation for any purpose, provided
;; that existing copyright notices are retained in all copies and that this
;; notice is included verbatim in any distributions. No written agreement,
;; license, or royalty fee is required for any of the authorized uses.
;; Modifications to this software may be copyrighted by their authors
;; and need not follow the licensing terms described here, provided that
;; the new terms are clearly indicated on the first page of each file where
;; they apply.

;; Last File Update: 5-Dec-1996
;; 


(define-generic directed?)
(define-generic mixed?)
(define-generic binary?)
(define-generic multigraph?)

(define-generic <mbingraph*>?)
(define-generic <mubingraph*>?)
(define-generic <mdbingraph*>?)
(define-generic <mhypergraph*>?)
(define-generic <muhypergraph*>?)
(define-generic <mdhypergraph*>?)
(define-generic <bingraph*>?)
(define-generic <ubingraph*>?)
(define-generic <dbingraph*>?)
(define-generic <hypergraph*>?)
(define-generic <uhypergraph*>?)
(define-generic <dhypergraph*>?)

(define-method <mbingraph*>? ((g <mbingraph*>)) #t)
(define-method <mubingraph*>? ((g <mubingraph*>)) #t)
(define-method <mdbingraph*>? ((g <mdbingraph*>)) #t)
(define-method <mhypergraph*>? ((g <mhypergraph*>)) #t)
(define-method <muhypergraph*>? ((g <muhypergraph*>)) #t)
(define-method <mdhypergraph*>? ((g <mdhypergraph*>)) #t)
(define-method <bingraph*>? ((g <bingraph*>)) #t)
(define-method <ubingraph*>? ((g <ubingraph*>)) #t)
(define-method <dbingraph*>? ((g <dbingraph*>)) #t)
(define-method <hypergraph*>? ((g <hypergraph*>)) #t)
(define-method <uhypergraph*>? ((g <uhypergraph*>)) #t)
(define-method <dhypergraph*>? ((g <dhypergraph*>)) #t)

(define-method mixed? ((g <mhypergraph*>)) #t)
(define-method mixed? ((g <mbingraph*>)) #t)
(define-method mixed? ((g <hypergraph*>)) #t)
(define-method mixed? ((g <bingraph*>)) #t)
(define-method mixed? ((g <top>)) #f)

(define-method directed? ((g <mdhypergraph*>)) #t)
(define-method directed? ((g <dhypergraph*>)) #t)
(define-method directed? ((g <mdbingraph*>)) #t)
(define-method directed? ((g <dbingraph*>)) #t)
(define-method directed? ((g <top>)) #f)

(define-method undirected? ((g <muhypergraph*>)) #t)
(define-method undirected? ((g <uhypergraph*>)) #t)
(define-method undirected? ((g <mubingraph*>)) #t)
(define-method undirected? ((g <ubingraph*>)) #t)
(define-method undirected? ((g <top>)) #f)

(define-method binary? ((g <mbingraph*>)) #t)
(define-method binary? ((g <mubingraph*>)) #t)
(define-method binary? ((g <mdbingraph*>)) #t)
(define-method binary? ((g <bingraph*>)) #t)
(define-method binary? ((g <ubingraph*>)) #t)
(define-method binary? ((g <dbingraph*>)) #t)
(define-method binary? ((g <top>)) #f)

(define-method multigraph? ((g <mbingraph*>)) #t)
(define-method multigraph? ((g <mubingraph*>)) #t)
(define-method multigraph? ((g <mdbingraph*>)) #t)
(define-method multigraph? ((g <mhypergraph*>)) #t)
(define-method multigraph? ((g <muhypergraph*>)) #t)
(define-method multigraph? ((g <mdhypergraph*>)) #t)
(define-method multigraph? ((g <top>)) #f)
(define-method multigraph? ((g <bingraph*>)) #f)
(define-method multigraph? ((g <ubingraph*>)) #f)
(define-method multigraph? ((g <dbingraph*>)) #f)
(define-method multigraph? ((g <hypergraph*>)) #f)
(define-method multigraph? ((g <uhypergraph*>)) #f)
(define-method multigraph? ((g <dhypergraph*>)) #f)


(define-method <mbingraph*>? ((g <top>)) #f)
(define-method <mubingraph*>? ((g <top>)) #f)
(define-method <mdbingraph*>? ((g <top>)) #f)
(define-method <mhypergraph*>? ((g <top>)) #f)
(define-method <muhypergraph*>? ((g <top>)) #f)
(define-method <mdhypergraph*>? ((g <top>)) #f)
(define-method <bingraph*>? ((g <top>)) #f)
(define-method <ubingraph*>? ((g <top>)) #f)
(define-method <dbingraph*>? ((g <top>)) #f)
(define-method <hypergraph*>? ((g <top>)) #f)
(define-method <uhypergraph*>? ((g <top>)) #f)
(define-method <dhypergraph*>? ((g <top>)) #f)

(define (gen-random-graphs g n p)
	(cond ((<= g 0) '())
              (#t (cons (gen-random-graph n p)
	 		(gen-random-graphs (- g 1) n p)))))


(provide "graph-types")
