home *** CD-ROM | disk | FTP | other *** search
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; File: traverse.cl
- ; Description: TRAVERSE benchmark
- ; Author: Richard Gabriel
- ; Created: 12-Apr-85
- ; Modified: 12-Apr-85 10:24:04 (Bob Shaw)
- ; Language: Common Lisp
- ; Package: User
- ; Status: Public Domain
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;;; TRAVERSE -- Benchmark which creates and traverses a tree structure.
-
- (defstruct node
- (parents nil)
- (sons nil)
- (sn (snb))
- (entry1 nil)
- (entry2 nil)
- (entry3 nil)
- (entry4 nil)
- (entry5 nil)
- (entry6 nil)
- (mark nil))
-
- (defvar *sn* 0)
- (defvar *rand* 21)
- (defvar *count* 0)
- (defvar *marker* nil)
- (defvar *root*)
-
- (proclaim '(type fixnum *sn* *rand* *count*))
-
- (defun snb ()
- (setq *sn* (1+ *sn*)))
-
- (defun seed ()
- (setq *rand* 21))
-
- (defun traverse-random () (setq *rand* (mod (* *rand* 17) 251)))
-
- (defun traverse-remove (n q)
- (cond ((eq (cdr (car q)) (car q))
- (prog2 nil (caar q) (rplaca q nil)))
- ((= n 0)
- (prog2 nil (caar q)
- (do ((p (car q) (cdr p)))
- ((eq (cdr p) (car q))
- (rplaca q
- (rplacd p (cdr (car q))))))))
- (t (do ((n n (1- n))
- (q (car q) (cdr q))
- (p (cdr (car q)) (cdr p)))
- ((= n 0) (prog2 nil (car q) (rplacd q p)))
- (declare (fixnum n))))))
-
- (defun traverse-select (n q)
- (do ((n n (1- n))
- (q (car q) (cdr q)))
- ((= n 0) (car q))
- (declare (fixnum n))))
-
- (defun add (a q)
- (cond ((null q)
- `(,(let ((x `(,a)))
- (rplacd x x) x)))
- ((null (car q))
- (let ((x `(,a)))
- (rplacd x x)
- (rplaca q x)))
- (t (rplaca q
- (rplacd (car q) `(,a .,(cdr (car q))))))))
-
- (defun create-structure (n)
- (declare (fixnum n))
- (let ((a `(,(make-node))))
- (do ((m (1- n) (1- m))
- (p a))
- ((= m 0) (setq a `(,(rplacd p a)))
- (do ((unused a)
- (used (add (traverse-remove 0 a) nil))
- (x) (y))
- ((null (car unused))
- (find-root (traverse-select 0 used) n))
- (setq x (traverse-remove (mod (traverse-random) n) unused))
- (setq y (traverse-select (mod (traverse-random) n) used))
- (add x used)
- (setf (node-sons y) `(,x .,(node-sons y)))
- (setf (node-parents x) `(,y .,(node-parents x))) ))
- (declare (fixnum m))
- (push (make-node) a))))
-
- (defun find-root (node n)
- (do ((n n (1- n)))
- ((= n 0) node)
- (declare (fixnum n))
- (cond ((null (node-parents node))
- (return node))
- (t (setq node (car (node-parents node)))))))
-
- (defun travers (node mark)
- (cond ((eq (node-mark node) mark) nil)
- (t (setf (node-mark node) mark)
- (setq *count* (1+ *count*))
- (setf (node-entry1 node) (not (node-entry1 node)))
- (setf (node-entry2 node) (not (node-entry2 node)))
- (setf (node-entry3 node) (not (node-entry3 node)))
- (setf (node-entry4 node) (not (node-entry4 node)))
- (setf (node-entry5 node) (not (node-entry5 node)))
- (setf (node-entry6 node) (not (node-entry6 node)))
- (do ((sons (node-sons node) (cdr sons)))
- ((null sons) nil)
- (travers (car sons) mark)))))
-
- (defun traverse (root)
- (let ((*count* 0))
- (travers root (setq *marker* (not *marker*)))
- *count*))
-
- (defun init-traverse () ; Changed from defmacro to defun \bs
- (setq *root* (create-structure 100))
- nil)
-
- (defun run-traverse () ; Changed from defmacro to defun \bs
- (do ((i 50 (1- i)))
- ((= i 0))
- (declare (fixnum i))
- (traverse *root*)
- (traverse *root*)))
-
- ;;; to initialize, call: (init-traverse)
- ;;; to run traverse, call: (run-traverse)
-
- (run-benchmark "Traverse-init" '(init-traverse))
- (run-benchmark "Traverse" '(run-traverse))
-