aboutsummaryrefslogtreecommitdiff
path: root/prescheme-nim-local/openblas.scm
blob: c1719064c22c2836638c4bfc87e626bee61f3253 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
;; openblas+gsl example (WIP)

(define %vec-a (vector-unfold (lambda (i)
                                (* i i))
                              5))

;; take vec-a's length at compile-time
(define %len-a (vector-length %vec-a))


(define foox
  (external "computefoox" (=> (integer integer) integer)
            (lambda (x y)
              (display (+ x y)))))

(define (handle-error message)
  (define out (current-error-port))
  (error message))

(define-wrapper-type gsl-vector)

(define (gsl-create-vector size) ; gsl_vector_alloc (3);
  ((external "gsl_vector_alloc" (=> (integer) gsl-vector))
   size))

(define (gsl-destroy-vector vector)
  ((external "gsl_vector_free" (=> (gsl-vector) unit ) )
   vector))

(define (with-vector vector proc)
  (if (null-pointer? vector)
      (handle-error "Could not create vector")
      (let ((result (proc vector)))
        (gsl-destroy-vector vector)
        result)))

;; void gsl_vector_set(gsl_vector *v, const size_t i, double x)
(define (gsl-vector-set! v i x)
  ((external "gsl_vector_set" (=> (gsl-vector integer float) unit ) )
   v i x))

;; double gsl_vector_get(const gsl_vector *v, const size_t i)
(define (gsl-vector-get v i)
  ((external "gsl_vector_get" (=> (gsl-vector integer) float ) )
   v i))

;; gcvt (float value, int ndigits, char * buf);
(define (gcvt v ndigits buf)
  ((external "gcvt" (=> (float integer (^ char)) unit ) )
   v ndigits buf))


;;(define-c-generator make-string #t
;;  (lambda (call port indent)
;;    ; calloc is used as a hack to get a zero at the end
;;    (format port "(char *)calloc( 1, 1 + ")
;;    (c-value (call-arg call 0) port)
;;    (format port ")")))

(define (main)
  (define out (current-output-port))

  (write-string "Prescheme vector: print vec-a with vector-for-each:\n" out)
  ; (make-pointer gsl-vector)

  (vector-for-each (lambda (i val)
                     (write-string " vec-a[" out)
                     (write-integer i out)
                     (write-string "] = " out)
                     (write-integer val out)
                     (write-string ", " out)
                     )
                   %vec-a %len-a)
  (newline out)
  (write-string "OpenBLAS: print vec-a with vector-for-each:\n" out)
  (with-vector
   (gsl-create-vector 5)
   (lambda (one-vec)
     ;; (gsl-vector-for-each (lambda (i val)
     ;;                    gsl-set-vector(one-vec,i,val);
     ;;                    )
     ;;                 one-vec)
     (let ((x 1.1))
       (gsl-vector-set! one-vec 0 (fl* x 0.0))
       (gsl-vector-set! one-vec 1 (fl* x x))
       (gsl-vector-set! one-vec 2 (fl* x 2.1))
       (gsl-vector-set! one-vec 3 4.0)
       (gsl-vector-set! one-vec 4 5.0)
       ;; (gsl-vector-set one-vec 5 6.0)
       )
     (vector-for-each (lambda (i val)
                        (write-string " vec-b[" out)
                        (write-integer i out)
                        (write-string "] = " out)
                        ;; (write-number (gsl-vector-get one-vec i) out)
                        (let ((target (make-string 20)))
                          ;; (write-integer (gsl-vector-get one-vec i) out)
                          ;; (gcvt (gsl-vector-get one-vec i) target)
                          (gcvt (gsl-vector-get one-vec i) 4 target)
                          (write-string target out)
                          )
                        (write-string ", " out)
                        )
                      %vec-a %len-a)
     ))
  (newline out)
  0
)