28 August 2006

Working Toward Gauge-Covariant Derivatives

I've posted the latest version of my functional differential geometry code (darcs pull http://web.mit.edu/farr/www/SchemeCode/ should get it for you). I now have code for arbitrary linear representations of lie groups. I'm working up to implementing the gauge covariant derivative (a generalization of the covariant derivative of GR to arbitrary symmetry operations). Unfortunately, the code is presently really slow---just like practically every other schemer out there, I have coded up a quick memoization HOF, which I reproduce below. I suspect that this will prove useful in optimizing the code, which performs many redundant computations.

UPDATE: I've fixed up the code for representations of lie groups. It's a lot cleaner, and mirrors the math more closely now. Latest version in the darcs repository.

;    Copyright (C) 2006  Will M. Farr 
;
;    This program is free software; you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation; either version 2 of the License, or
;    (at your option) any later version.
;
;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.
;
;    You should have received a copy of the GNU General Public License along
;    with this program; if not, write to the Free Software Foundation, Inc.,
;    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

(module memoization mzscheme
  (provide memoize1 memoize)
  
  (define (memoize1 proc1)
    (let ((results (make-hash-table 'weak 'equal)))
      (lambda (x)
        (hash-table-get 
         results 
         x
         (lambda ()
           (let ((result (proc1 x)))
             (hash-table-put! results x result)
             result))))))
  
  (define (memoize proc)
    (let ((aux (memoize1 (lambda (x) (apply proc x)))))
      (lambda args (aux args)))))

No comments: