File: linpack.l

package info (click to toggle)
euslisp 9.27%2Bdfsg-7
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 55,344 kB
  • sloc: ansic: 41,162; lisp: 3,339; makefile: 256; sh: 208; asm: 138; python: 53
file content (169 lines) | stat: -rw-r--r-- 6,082 bytes parent folder | download | duplicates (3)
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
;
(unless (find-package "LINPACK")
   (make-package "LINPACK" :nicknames '("LP" "LIN")))
(in-package "LINPACK")
(export '(ssvdc pseudo-inverse sgedi sgesl))

(defparameter linpack
	 (load-foreign "/usr/local/eus/clib/linpackref.o"
		:ld-option
		   "-L/usr/local/lib -llinpack -lF77 -lm -lc"
		:symbol-output "euslinpack"
		:symbol-file "euslinpack"
		))
(unix:unlink "euslinpack")

(defforeign fortran-sgeco linpack "_sgeco_" () :integer)
(defforeign fortran-sgefa linpack "_sgefa_" () :integer)
(defforeign fortran-sgesl linpack "_sgesl_" () :integer)
(defforeign fortran-sgedi linpack "_sgedi_" () :integer)
(defforeign fortran-spoco linpack "_spoco_" () :integer)
(defforeign fortran-spofa linpack "_spofa_" () :integer)
(defforeign fortran-sposl linpack "_sposl_" () :integer)
(defforeign fortran-spodi linpack "_spodi_" () :integer)
(defforeign fortran-sppco linpack "_sppco_" () :integer)
(defforeign fortran-sppfa linpack "_sppfa_" () :integer)
(defforeign fortran-sppsl linpack "_sppsl_" () :integer)
(defforeign fortran-sppdi linpack "_sppdi_" () :integer)
(defforeign fortran-spbco linpack "_spbco_" () :integer)
(defforeign fortran-spbfa linpack "_spbfa_" () :integer)
(defforeign fortran-spbsl linpack "_spbsl_" () :integer)
(defforeign fortran-spbdi linpack "_spbdi_" () :integer)
(defforeign fortran-ssico linpack "_ssico_" () :integer)
(defforeign fortran-ssifa linpack "_ssifa_" () :integer)
(defforeign fortran-ssisl linpack "_ssisl_" () :integer)
(defforeign fortran-ssidi linpack "_ssidi_" () :integer)
(defforeign fortran-sspco linpack "_sspco_" () :integer)
(defforeign fortran-sspfa linpack "_sspfa_" () :integer)
(defforeign fortran-sspsl linpack "_sspsl_" () :integer)
(defforeign fortran-sspdi linpack "_sspdi_" () :integer)
(defforeign fortran-chico linpack "_chico_" () :integer)
(defforeign fortran-chifa linpack "_chifa_" () :integer)
(defforeign fortran-chisl linpack "_chisl_" () :integer)
(defforeign fortran-chidi linpack "_chidi_" () :integer)
(defforeign fortran-chpco linpack "_chpco_" () :integer)
(defforeign fortran-chpfa linpack "_chpfa_" () :integer)
(defforeign fortran-chpsl linpack "_chpsl_" () :integer)
(defforeign fortran-chpdi linpack "_chpdi_" () :integer)
(defforeign fortran-strco linpack "_strco_" () :integer)
(defforeign fortran-strsl linpack "_strsl_" () :integer)
(defforeign fortran-strdi linpack "_strdi_" () :integer)
(defforeign fortran-sgtsl linpack "_sgtsl_" () :integer)
(defforeign fortran-sptsl linpack "_sptsl_" () :integer)
(defforeign fortran-schdc linpack "_schdc_" () :integer)
(defforeign fortran-sqrdc linpack "_sqrdc_" () :integer)
(defforeign fortran-sqrsl linpack "_sqrsl_" () :integer)
(defforeign fortran-schud linpack "_schud_" () :integer)
(defforeign fortran-schdd linpack "_schdd_" () :integer)
(defforeign fortran-schex linpack "_schex_" () :integer)
(defforeign fortran-ssvdc linpack "_ssvdc_" () :integer)
;(defforeign fortran-sgemv linpack "_sgemv_" () :integer)
;(defforeign fortran-sgemm linpack "_sgemm_" () :integer)


(defun sgesl (a b)	; a is a matrix; b is a float-vector
			; b is destroyed to return answer
   (let ((at (transpose a))
	 (lda (integer-vector (length b)))
	 (n (integer-vector (length b)))
	 (ipvt (instantiate integer-vector (length b)))
	 (rcond (float-vector 0))
	 (z (instantiate integer-vector (length b))))
     (fortran-sgeco (at . entity) lda n ipvt rcond z)
     (fortran-sgesl (at . entity) lda n ipvt b #i(0))
     b))

(defun sgedi (a b)	; a is a matrix; b is a float-vector
			; b is destroyed to return answer
   (let ((at (transpose a))
	 (lda (integer-vector (length b)))
	 (n (integer-vector (length b)))
	 (ipvt (instantiate integer-vector (length b)))
	 (det (instantiate integer-vector 2))
	 (rcond (float-vector 0))
	 (work (instantiate integer-vector (length b))))
     (fortran-sgeco (at . entity) lda n ipvt rcond z)
     (fortran-sgedi (at . entity) lda n ipvt det work #i(11))
     (list (transpose at) (+ (* 10.0 (aref det 0)) (aref det 1))])))
  

(defun ssvdc (mat)
  (let* ((nn (array-dimension mat 0))
	 (pp (array-dimension mat 1))
	 (x (transpose mat))
	 (ldu (integer-vector nn))
	 (ldx (integer-vector nn))
	 (ldv (integer-vector pp))
	 (n (integer-vector nn))
	 (p (integer-vector pp))
	 (size (min (1+ nn) pp))
	 (s (make-array size :element-type :float))
	 (e (make-array pp   :element-type :float))
	 (u (make-array (list nn nn)  :element-type :float))
	 (v (make-array (list pp pp)  :element-type :float))
	 (work (make-array nn :element-type :float))
	 (job (integer-vector 11))
	 (info (integer-vector 0)) )
	 
   (fortran-ssvdc (array-entity x)		;x
		  ldx				;ldx
		  n
		  p
		  s
		  e
		  (array-entity u)
		  ldu
		  (array-entity v)
		  ldv
		  work
		  job info)
    (list (elt info 0) u s v)))

(defun pseudo-inverse (mat)
  "(mat) : mat can have more colums than rows."
  (let (mat-ssvdc u s v (j 0) v1d u1)
    (setq mat-ssvdc (ssvdc mat))
    (setq u (second mat-ssvdc))
    (setq s (third mat-ssvdc))
    (setq v (fourth mat-ssvdc))
    (while (> (elt s j) 0.0001)
      (push (scale (/ 1 (elt s j)) (matrix-column v j)) v1d)
      (setq j (1+ j)))
    (setq v1d (reverse v1d))
    (setq v1d (apply 'matrix v1d))
    (setq v1d (transpose v1d))
    (setq j (1- j))
    (while (>= j 0)
      (push (matrix-column u j) u1)
      (setq j (1- j)))
    (setq u1 (apply 'matrix u1))
    (m* v1d u1)))

(defun ssvdc-test ()
   (let (y1 y2 y3 y4 y)
	(setq y1 #f(0. 0. 1. -25. 15.0))
	(setq y2 #f(0. 0. 1. -25. -15. 0.))
	(setq y3 #f(0. 0. 1. 25. -15. 0.)) 
	(setq y4 #f(0. 0. 1. 25. 15. 0.))
	(setq y (matrix y1 y2 y3 y4))
	(ssvdc y)))

(defun pseudo-inverse-test ()
   (let (y1 y2 y3 y4 y x)
	(setq y1 #f(0. 0. 1. -25. 15.0))
	(setq y2 #f(0. 0. 1. -25. -15. 0.))
	(setq y3 #f(0. 0. 1. 25. -15. 0.)) 
	(setq y4 #f(0. 0. 1. 25. 15. 0.))
	(setq y (matrix y1 y2 y3 y4))
	(pseudo-inverse y)))

(defun random-matrix (m n &optional (r 1.0) &aux mat)
   (setq mat (make-matrix m n))
   (dotimes (i m)
      (dotimes (j n)
	 (setf (aref mat i j) (- (random (* 2.0 r)) r))
      ))
   mat)

(in-package "USER")
(use-package "LINPACK")