Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. (eval-when (:execute :load-toplevel :compile-toplevel)
  2. (defstruct route
  3. (dest 0 :type fixnum)
  4. (cost 0 :type fixnum)))
  5.  
  6. (defun parse-line (line &aux (pos 0) n)
  7. (declare (ignorable n))
  8. (loop repeat 3
  9. collect (multiple-value-setq (n pos)
  10. (parse-integer line :start pos :junk-allowed t))))
  11.  
  12. (defparameter *file* "/Users/joswig/Desktop/graph-bench/agraph.txt")
  13.  
  14. (defun read-places ()
  15. (with-open-file (stream *file*)
  16. (let ((num-lines (parse-integer (read-line stream nil))))
  17. (values (loop for line = (read-line stream nil nil)
  18. while line
  19. collect (parse-line line))
  20. num-lines))))
  21.  
  22. (defun parse-places ()
  23. (multiple-value-bind (place-data num-nodes)
  24. (read-places)
  25. (let ((nodes (make-array num-nodes :initial-element nil)))
  26. (loop for (node-id neighbour dist) in place-data
  27. do (push (make-route :dest neighbour :cost dist)
  28. (aref nodes node-id)))
  29. nodes)))
  30.  
  31. (defun get-longest-path (nodes node-id visited)
  32. (declare (optimize (speed 3) (space 0) (debug 0) (safety 0)
  33. (compilation-speed 0)
  34. #+lispworks (fixnum-safety 0))
  35. (type fixnum node-id)
  36. (type (vector list) nodes)
  37. (type (vector boolean) visited))
  38. (setf (svref visited node-id) t)
  39. (let ((max (loop for neighbour of-type route in (svref nodes node-id)
  40. unless (svref visited (route-dest neighbour))
  41. maximize (the fixnum
  42. (+ (the fixnum (route-cost neighbour))
  43. (the fixnum (get-longest-path nodes (route-dest neighbour) visited)))))))
  44. (declare (fixnum max))
  45. (setf (svref visited node-id) nil)
  46. max))
  47.  
  48. (defun run ()
  49. (let* ((nodes (parse-places))
  50. (visited (make-array (length nodes) :element-type 'boolean :initial-element nil))
  51. (start (get-internal-real-time))
  52. (len (get-longest-path nodes 0 visited))
  53. (duration (- (get-internal-real-time) start)))
  54. (format t "~d LANGUAGE Lisp ~d ~%" len duration)))
  55.  
  56. #+ignore
  57. (sb-ext:save-lisp-and-die "lisp" :toplevel #'run :executable t)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement