From: zoav1602
Subject: Hooking umfpack into sbcl-1.0.6 problem
Date: 
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: 
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