From: zoav1602
Subject: Hooking umfpack into sbcl-1.0.6 problem
Date: Fri, 03 Oct 2008 12:16:05 +0000
Message-ID: <7e0308f0-a7ba-4036-bc37-6aff56fa1c88@s50g2000hsb.googlegroups.com> Hello, group,
I'm trying to load umfpack into sbcl via sb-alien. The code is :
==the code
(cl:defpackage "RANDOM-WALK-SPARSE"
(:use "CL" "SB-ALIEN" "SB-C-CALL"))
(cl:in-package "RANDOM-WALK-SPARSE")
(declaim (optimize (safety 3) (debug 3)))
(defun put-val(Ai Ax i j val)
(setf (deref (deref Ai) i) j
(deref (deref Ax) i) val))
(declaim (inline umfpack-solve))
(define-alien-routine umfpack-solve
(* double)
(n int)
(Ap (array int nil))
(Ai (array int nil))
(Ax (array double nil))
(b (array double nil))
(x (array double nil)))
(defun steady-state(n a b)
(let ((Ap (eval (list 'make-alien (list 'array 'int (+ 1 n)))))
(Ai (eval (list 'make-alien (list 'array 'int (* 4 n)))))
(Ax (eval (list 'make-alien (list 'array 'double (* 4 n)))))
(x (eval (list 'make-alien (list 'array 'double (+ 1 n)))))
(rhs (eval (list 'make-alien (list 'array 'double (+ 1 n))))))
;; prepare right-hand side
(dotimes (i n)
(setf (deref (deref rhs) i) 0d0))
(setf (deref (deref rhs) (+ n 1)) 1d0)
;; prepare the matrix
(setf (deref (deref Ap) 0) 0) ; j=0
(put-val Ai Ax 0 0 0d0)
(put-val Ai Ax 1 1 1d0)
(put-val Ai Ax 2 n 1d0)
(setf (deref (deref Ap) 1) 3) ; j=1
(put-val Ai Ax 3 0 (- a))
(put-val Ai Ax 4 1 (- 0d0 a b))
(put-val Ai Ax 5 2 b)
(put-val Ai Ax 6 n 1d0)
(do ((j 2 (+ j 1))
(i 7))
((= j ( - n 1)))
(setf (deref (deref Ap) j) i)
(put-val Ai Ax i (- j 1) a) (incf i)
(put-val Ai Ax i j (- 0d0 a b)) (incf i)
(put-val Ai Ax i (+ j 1) b) (incf i)
(put-val Ai Ax i n 1d0) (incf i))
(setf (deref (deref Ap) (- n 1)) (- (* 4 n) 5)) ; j=n-1
(put-val Ai Ax (- (* 4 n) 5) (- n 2) a)
(put-val Ai Ax (- (* 4 n) 4) (- n 1) (- 0d0 a b))
(put-val Ai Ax (- (* 4 n) 3) n 1d0)
(setf (deref (deref Ap) n) (- (* 4 n) 2)) ; j=n
(put-val Ai Ax (- (* 4 n) 2) (- n 1) 1d0)
(put-val Ai Ax (- (* 4 n) 1) n 1d0)
(setf (deref (deref Ap) (+ 1 n)) (* 4 n))
(dotimes (j (+ n 1))
(do ((i (deref (deref Ap) j) (+ i 1)))
((= i (deref (deref Ap) (+ 1 j))))
(format t "(~a, ~a): ~a~%" (deref (deref Ai) i) j (deref (deref Ax)
i))))
(break)
(with-alien ((res (* double)
(umfpack-solve (+ 1 n) (deref Ap) (deref Ai) (deref Ax)
(deref rhs) (deref x))))
(format t "back from UMFPACK-SOLVE"))))
== the C code:
#include <umfpack/umfpack.h>
double* umfpack_solve(int n, int *Ap, int *Ai, double *Ax, double *b,
double *x)
{
double *null = (double *) 0;
int i;
void *Symbolic, *Numeric;
(void) umfpack_di_symbolic(n, n, Ap, Ai, Ax, &Symbolic, null, null);
(void) umfpack_di_numeric(Ap, Ai, Ax, Symbolic, &Numeric, null,
null);
umfpack_di_free_symbolic(&Symbolic);
(void) umfpack_di_solve(UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null,
null);
umfpack_di_free_numeric(&Numeric);
return x;
};
I've got an error message:
*** glibc detected *** /usr/bin/sbcl: free(): invalid next size
(normal):
0x000000000063f450 ***
======= Backtrace: =========
/lib/libc.so.6[0x2b09af1bbb0a]
/lib/libc.so.6(cfree+0x8c)[0x2b09af1bf6fc]
/usr/lib/libumfpack.so.4(umf_i_free+0xe)[0x2b09b1d646ee]
/usr/lib/libumfpack.so.4(umfpack_di_qsymbolic+0x244a)[0x2b09b1d9e3ca]
/usr/lib/libumfpack.so.4(umfpack_di_symbolic+0x24)[0x2b09b1da55f4]
/home/andrei/src/cl/umfpack/random-walk.so(umfpack_solve+0x84)
[0x2b09b1b1d4c4]
======= Memory map: ========
... many lines ...
Can somebody tell me what happend and suggest how to recover?
--
Andrei Zorine From: Tamas K Papp
Subject: Re: Hooking umfpack into sbcl-1.0.6 problem
Date: Fri, 03 Oct 2008 14:28:33 +0000
Message-ID: <6kmoghF8ij91U1@mid.individual.net> On Fri, 03 Oct 2008 05:16:05 -0700, zoav1602 wrote:
> Hello, group,
>
> I'm trying to load umfpack into sbcl via sb-alien. The code is :
I have made bindings to UMFpack, in the cl-sparsematrix package:
http://www.cliki.net/cl-sparsematrix
Tamas