;;; .EnTete "Le-Lisp (c) version 15.2" " " "The Le-Lisp Benchmarks (10-11)" ;;; .EnPied "traverse.ll" "%" " " ;;; .SuperTitre "The Le-Lisp Benchmarks (10-11)" ;;; ;;; .Centre "*****************************************************************" ;;; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA. " ;;; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly " ;;; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA " ;;; .Centre "*****************************************************************" ;;; ;;; .Centre "$Header: traverse.ll,v 1.1 88/11/17 09:51:27 chaillou Exp $" ;;; (10-11) TRAVERSE -- Benchmark which creates and traverses a tree structure. (defun check-travinit () (check-value '(test-travinit 1) t)) (defun meter-travinit () (perform-meter '(init-traverse) 'travinit)) (defun test-travinit (n) (if (eq n 1) (init-traverse) (repeat n (init-traverse)))) (defun check-travrun () (check-value '(test-travrun 1) t)) (defun meter-travrun () (perform-meter '(run-traverse) 'travrun)) (defun test-travrun (n) (if (eq n 1) (run-traverse) (repeat n (run-traverse)))) (defstruct node (parents ()) (sons ()) (sn (snb)) (entry1 ()) (entry2 ()) (entry3 ()) (entry4 ()) (entry5 ()) (entry6 ()) (mark ())) (defsetf #:node:parents (x) (y) `(#:node:parents ,x ,y)) (defsetf #:node:sons (x) (y) `(#:node:sons ,x ,y)) (defsetf #:node:sn (x) (y) `(#:node:sn ,x ,y)) (defsetf #:node:entry1 (x) (y) `(#:node:entry1 ,x ,y)) (defsetf #:node:entry2 (x) (y) `(#:node:entry2 ,x ,y)) (defsetf #:node:entry3 (x) (y) `(#:node:entry3 ,x ,y)) (defsetf #:node:entry4 (x) (y) `(#:node:entry4 ,x ,y)) (defsetf #:node:entry5 (x) (y) `(#:node:entry5 ,x ,y)) (defsetf #:node:entry6 (x) (y) `(#:node:entry6 ,x ,y)) (defsetf #:node:mark (x) (y) `(#:node:mark ,x ,y)) (defvar traverse-sn 0) (defvar *count-call* 0) (defvar traverse-rand 21) (defvar traverse-count 0) (defvar traverse-marker nil) (defvar traverse-root) (setq traverse-sn 0 traverse-rand 21 traverse-count 0 traverse-marker nil) (defun snb () (setq traverse-sn (add1 traverse-sn))) (defun traverse-seed () (setq traverse-rand 21)) (defun traverse-random () (setq traverse-rand (rem (mul traverse-rand 17) 251))) (defun traverse-remove (n q) (cond ((eq (cdr (car q)) (car q)) (prog2 () (caar q) (rplaca q ()))) ((eq n 0) (prog2 () (caar q) (do ((p (car q) (cdr p))) ((eq (cdr p) (car q)) (rplaca q (rplacd p (cdr (car q)))))))) (t (do ((n n (sub1 n)) (q (car q) (cdr q)) (p (cdr (car q)) (cdr p))) ((eq n 0) (prog2 () (car q) (rplacd q p))))))) (defun traverse-select (n q) (do ((n n (sub1 n)) (q (car q) (cdr q))) ((eq n 0) (car q)))) (defun traverse-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 traverse-create-structure (n) (let ((a `(,(#:node:make)))) (do ((m (sub1 n) (sub1 m)) (p a)) ((eq m 0) (setq a `(,(rplacd p a))) (do ((unused a) (used (traverse-add (traverse-remove 0 a) ())) (x) (y)) ((null (car unused)) (find-root (traverse-select 0 used) n)) (setq x (traverse-remove (rem (traverse-random) n) unused)) (setq y (traverse-select (rem (traverse-random) n) used)) (traverse-add x used) (setf (#:node:sons y) `(,x .,(#:node:sons y))) (setf (#:node:parents x) `(,y .,(#:node:parents x))) )) (setq a (cons (#:node:make) a))))) (defun find-root (node n) (do ((n n (sub1 n))) ((or (eq n 0) (null (#:node:parents node))) node) (setq node (car (#:node:parents node))))) (defun travers (node mark) (setq *count-call* (add1 *count-call*)) (cond ((eq (#:node:mark node) mark) ()) (t (#:node:mark node mark) (setq traverse-count (add1 traverse-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) ()) (travers (car sons) mark))))) (defun traverse (root) (let ((traverse-count 0)) (travers root (setq traverse-marker (not traverse-marker))) traverse-count)) (defun init-traverse() (setq traverse-root (traverse-create-structure 100)) nil) (defun run-traverse () (repeat 50 (traverse traverse-root) (traverse traverse-root) (traverse traverse-root) (traverse traverse-root) (traverse traverse-root))) ;;; to initialize, call: (init-traverse) ;;; to run traverse, call: (run-traverse)