Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 6.66 KB | None | 0 0
  1. #lang racket
  2. (require compatibility/mlist)
  3.  
  4. ;;
  5. ; cooperative trheading from website
  6. ;;
  7.  
  8. ; thread-queue : list[continuation]
  9. (define thread-queue '())
  10.  
  11. ; halt : continuation
  12. (define halt #f)
  13.  
  14. ; void : -> void
  15. (define (void) (if #f #t #f))
  16.  
  17. ; current-continuation : -> continuation
  18. (define (current-continuation)
  19.   (call-with-current-continuation
  20.    (lambda (cc)
  21.      (cc cc))))
  22.  
  23. ; spawn : (-> anything) -> void
  24. (define (spawn thunk)
  25.   (let ((cc (current-continuation)))
  26.     (if (procedure? cc)
  27.         (set! thread-queue (append thread-queue (list cc)))
  28.         (begin (thunk)
  29.                (quit)))))
  30.  
  31. ; yield : value -> void
  32. (define (yield)
  33.   (let ((cc (current-continuation)))
  34.     (if (and (procedure? cc) (pair? thread-queue))
  35.         (let ((next-thread (car thread-queue)))
  36.           (set! thread-queue (append (cdr thread-queue) (list cc)))
  37.           (next-thread 'resume))
  38.         (void))))
  39.  
  40. ; quit : -> ...
  41. (define (quit)
  42.   (if (pair? thread-queue)
  43.       (let ((next-thread (car thread-queue)))
  44.         (set! thread-queue (cdr thread-queue))
  45.         (next-thread 'resume))
  46.       (halt)))
  47.    
  48. ; start-threads : -> ...
  49. (define (start-threads)
  50.   (let ((cc (current-continuation)))
  51.     (if cc
  52.         (begin
  53.           (set! halt (lambda () (cc #f)))
  54.           (if (null? thread-queue)
  55.               (void)
  56.               (begin
  57.                 (let ((next-thread (car thread-queue)))
  58.                   (set! thread-queue (cdr thread-queue))
  59.                   (next-thread 'resume)))))
  60.         (void))))
  61.  
  62.  
  63. ;;
  64. ; Frequency table helper functions
  65. ;;
  66.  
  67. ;; initializes empty frequency table,
  68. ;  keys: prime numbers
  69. ;  values: frequency
  70. (define freq-table
  71.   (mlist (mcons 0 0)))
  72.  
  73. (define (reset-freq-table)
  74.   (set! freq-table  (mlist (mcons 0 0))))
  75.  
  76. ;; finds the prime pair and grabs the frequency
  77. (define (lookup-freq prime)
  78.   (mcdr (massoc prime freq-table)))
  79.  
  80. ;; update frequency +1
  81. (define (set-freq prime)
  82.   (set-mcdr! (massoc prime freq-table) (+ 1 (lookup-freq prime))))
  83. ;; include a new prime into mutable pairs list
  84. (define (include-prime prime)
  85.   (set! freq-table (mappend freq-table (mlist (mcons prime 1)))))
  86. ;; decides whether to set-freq or make new prime
  87. (define (update-table prime)
  88.   (if (massoc prime freq-table)
  89.       (set-freq prime)
  90.       (include-prime prime)))
  91.  
  92.  
  93. (define (iter-factors factor-list)
  94.   (cond
  95.     ((null? factor-list) (display "")) ;(display "done ") (display freq-table))
  96.     (else
  97.      (let ((fact (car factor-list))
  98.            (rest (cdr factor-list)))
  99.        (update-table fact)
  100.        (iter-factors rest)))))
  101.  
  102.  
  103. ;;
  104. ; Factorization threading example
  105. ;;
  106.  
  107. ;; PARAMS
  108. (define t-limit 6) ;limits how many integers get factored
  109. (define t-count 0) ;running count of how many factored so far
  110. (define t-done-list '())
  111.  
  112. ;; METHODS
  113. (define (make-f-thread name)
  114.   (letrec ((loop
  115.             (lambda ()
  116.               (cond ((null? c-int-list)
  117.                      (display "terminating thread ") (display name) (newline)
  118.                      (quit))
  119.                     (else
  120.                      (display "in thread ") (display name)
  121.                      (let ((int (car c-int-list)))
  122.                        (display "; integer = ") (display int) (newline)
  123.                        (set! c-int-list (cdr c-int-list))
  124.                        (cond ((integer? int)
  125.                               (iter-factors (t-factor int int))
  126.                               (loop))
  127.                              (else
  128.                               (display "ERROR Non-integer passed")))))))))
  129.     loop))
  130.  
  131. (define (t-factor number raw)
  132.   (define (*t-factor divisor number)
  133.     (if (<= t-limit t-count) (quit) (display ""))
  134.     (if (> (* divisor divisor) number)
  135.         (begin
  136.           (set! t-count (+ t-count 1))
  137.           (set! t-done-list (append t-done-list `(,raw)))
  138.           (list number))
  139.         (if (= (modulo number divisor) 0)
  140.             (cons divisor (*t-factor divisor (/ number divisor)))
  141.             (begin
  142.               (yield)
  143.               (*t-factor (+ divisor 1) number)))))
  144.   (*t-factor 2 number))
  145.  
  146.  
  147. ;;
  148. ; Regular factorization example
  149. ;;
  150.  
  151.  
  152. ;; PARAMS
  153. (define r-limit 6) ;limits how many integers get factored
  154. (define r-count 0) ;running count of how many factored so far
  155. (define r-done-list '())
  156.  
  157. ;; METHODS
  158.  
  159. (define (r-factor number raw)
  160.   (define (*r-factor divisor number)
  161.     (if (> (* divisor divisor) number)
  162.         (begin
  163.           (set! r-done-list (append r-done-list `(,raw)))
  164.           (list number))
  165.         (if (= (modulo number divisor) 0)
  166.             (cons divisor (*r-factor divisor (/ number divisor)))
  167.             (*r-factor (+ divisor 1) number))))
  168.   (*r-factor 2 number))
  169.  
  170. (define (regular-run int-list)
  171.   (cond ((null? int-list) (display "")) ;when not null OR unless null
  172.         ((<= r-limit r-count) (display "reached limit") (newline))
  173.  
  174.         (else
  175.          (let ((int (car int-list))
  176.                (rest (cdr int-list)))
  177.            (cond ((integer? int)
  178.                   (set! r-count (+ r-count 1))
  179.                   (iter-factors (r-factor int int))
  180.                   (regular-run rest))
  181.                  (else (display "Error must only pass integers")))))))
  182.  
  183.  
  184.  
  185. ;;
  186. ; Run examples
  187. ;;
  188.  
  189.  
  190. (define c-int-list
  191.   '(13412301912340922
  192.     32432142
  193.     113421341
  194.     1324012
  195.     132409
  196.     019239384
  197.     01939
  198.     2
  199.     12309485
  200.     4102
  201.     109817724
  202.     1098129
  203.     103928734
  204.     0918217))
  205.  
  206. ;;
  207. ; threaded example
  208. ;;
  209. (spawn (make-f-thread 'a))
  210. (spawn (make-f-thread 'b))
  211. (spawn (make-f-thread 'c))
  212. (spawn (make-f-thread 'd))
  213. (define t-start-time (current-inexact-milliseconds))
  214. (start-threads)
  215. (define t-end-time (current-inexact-milliseconds))
  216. (display "Threading runtime: ") (display (- t-end-time t-start-time)) (newline)
  217. (display (mcdr freq-table)) (newline)
  218. (newline)
  219.  
  220. ;;
  221. ; non threaded example
  222. ;;
  223.  
  224. (set! c-int-list
  225.       '(13412301912340922
  226.         3243214210
  227.         113421341
  228.         1324012
  229.         132409
  230.         019239384
  231.         01939
  232.         2
  233.         12309485
  234.         4102
  235.         109817724
  236.         1098129
  237.         103928734
  238.         0918217))
  239.  
  240. (reset-freq-table)
  241. (define r-start-time (current-inexact-milliseconds))
  242. (regular-run c-int-list)
  243. (define r-end-time (current-inexact-milliseconds))
  244. (display "Regular runtime: ") (display (- r-end-time r-start-time))
  245. (newline) (display (mcdr freq-table)) (newline)
  246.  
  247.  
  248. ;;
  249. ;
  250. ;;
  251.  
  252. (display "threadtime - regtime = ")
  253. (display (- t-end-time t-start-time)) (display " - ") (display (- r-end-time r-start-time))
  254. (display " = ") (display (- (- t-end-time t-start-time) (- r-end-time r-start-time)))
  255.  
  256.  
  257.  
  258. (newline)
  259. (display t-done-list)
  260. (newline)
  261. (display r-done-list)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement