Changeset 12567 in project


Ignore:
Timestamp:
11/21/08 08:33:31 (13 years ago)
Author:
Ivan Raikov
Message:

More fixes to the matlab code generator.

Location:
release/3/nemo/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • release/3/nemo/trunk/examples/hh-substrate.nemo

    r12558 r12567  
    1515       (const Vrest = -65)
    1616
     17       (component (type membrane-capacitance)
     18           (const C = 1)
     19           (output C))
     20
    1721       (component (type ion-channel)
    1822         (component (type gate)
     
    2327            (defun ahf (v)   (0.07 *  (exp ((neg (v + 65)) / 20))))
    2428            (defun bhf (v)   (1.0  /  (1.0 + (exp ((neg (v + 35)) / 10)))))
    25            
     29
    2630            ;; model states
    2731           
     
    3337                              (initial (amf (Vrest) / (amf (Vrest) + bmf (Vrest))) )
    3438                              (open O)  (power 3)))
     39
     40
    3541           
    3642            ;; the value of state complex h is determined by state h1 (open state)
     
    4854            )
    4955
    50          (component (type permeating-substance) (name k)
    51                     (const e_K = -85)
    52                     (output e_K ))
     56         (component (type permeating-substance) (name na)
     57                    (const e_Na = 50)
     58                    (output e_Na ))
    5359
    5460         
     
    6167            (defun anf (v)   (0.01  * ((v + 55) / (1 - (exp ((neg (v + 55)) / 10))))))
    6268            (defun bnf (v)   (0.125 * (exp ((neg (v + 65)) / 80))))
    63            
     69
    6470            ;; model states
    6571           
     
    8187            (output  gbar_K ))
    8288
    83          (component (type permeating-substance) (name na)
    84                     (const e_Na = -85)
    85                     (output e_Na ))
     89         (component (type permeating-substance) (name k)
     90                    (const e_K = -77)
     91                    (output e_K ))
     92
    8693
    8794          )
     95
     96
     97       (component (type ion-channel) (name Leak)
     98                 
     99                  (component (type pore)
     100                             (const  gbar_Leak  = 0.3)
     101                             (output gbar_Leak ))
     102                 
     103              (component (type permeating-substance) (name non-specific)
     104                         (const e_Leak = -54.4)
     105                         (output e_Leak ))
     106             
     107              ) ;; end leak current
     108
    88109       ))
  • release/3/nemo/trunk/nemo-matlab.scm

    r12561 r12567  
    7171    ((pp indent val ...) (ppf indent (quasiquote val) ...))))
    7272
     73
     74(define group/MATLAB   (doc:block 2 (doc:text "(") (doc:text ")")))
     75(define block/MATLAB   (doc:block 2 (doc:empty) (doc:empty)))
     76(define (stmt/MATLAB x)
     77  (match x
     78         (($ doc 'DocCons _ ($ doc 'DocText ";")) x)
     79         (else  (doc:cons x (doc:text ";")))))
     80
     81
    7382(define (ifthen/MATLAB c e1 e2)
    7483  (doc:nest
     
    7988      (doc:text "endif"))))
    8089
    81 
    8290(define (letblk/MATLAB e1 e2)
    8391  (cond ((equal? e1 (doc:empty)) (doc:group (doc:nest 2 e2)))
    8492        ((equal? e2 (doc:empty)) (doc:group (doc:nest 2 e1)))
    85         (else (doc:connect (doc:group (doc:concat (list (doc:nest 2 e1) (doc:text ";"))))
     93        (else (doc:connect (doc:group (doc:nest 2 (stmt/MATLAB e1)))
    8694                           (doc:group (doc:nest 2 e2))))))
    8795       
    88 
    89 (define group/MATLAB   (doc:block 2 (doc:text "(") (doc:text ")")))
    90 (define block/MATLAB   (doc:block 2 (doc:empty) (doc:empty)))
    9196
    9297(define (format-op/MATLAB indent op args)
     
    157162                       (block/MATLAB (format-expr/MATLAB indent e (first x)))))
    158163                     (else
    159                       (format-op/MATLAB indent+ " = "
    160                                        (list (format-expr/MATLAB indent (first x) )
    161                                              (format-expr/MATLAB indent (second x))))))
     164                      (stmt/MATLAB
     165                       (format-op/MATLAB indent+ " = "
     166                                         (list (format-expr/MATLAB indent (first x) )
     167                                               (format-expr/MATLAB indent (second x)))))))
    162168              ax))
    163169           (doc:empty) bindings)
    164170         (let ((body1 (doc:nest indent (format-expr/MATLAB indent body))))
    165            (if rv  (format-op/MATLAB indent " = " (list (format-expr/MATLAB indent+ rv ) body1))
     171           (if rv  (stmt/MATLAB (format-op/MATLAB indent " = " (list (format-expr/MATLAB indent+ rv ) body1)))
    166172               body1))))
    167173       
     
    204210                      (format-fncall/MATLAB indent op (map (lambda (x) (format-expr/MATLAB indent+ x)) rest))))))
    205211           (if rv
    206                (format-op/MATLAB indent " = " (list (format-expr/MATLAB indent+ rv ) fe))
     212               (stmt/MATLAB (format-op/MATLAB indent " = " (list (format-expr/MATLAB indent+ rv ) fe)))
    207213               fe))))
    208214     
    209215      (else  (let ((fe (doc:text (->string expr))))
    210216               (if rv
    211                    (format-op/MATLAB indent " = " (list (format-expr/MATLAB indent+ rv ) fe))
     217                   (stmt/MATLAB (format-op/MATLAB indent " = " (list (format-expr/MATLAB indent+ rv ) fe)))
    212218                   fe)))))))
    213219               
     
    438444  (define (cid x)  (second x))
    439445  (define (cn x)   (first x))
    440   (let-optionals rest ((method 'cnexp) (table? #f) (min-v -100) (max-v 100) (step 0.5) )
     446  (let-optionals rest ((method 'lsode) (table? #f) (min-v -100) (max-v 100) (step 0.5) )
    441447  (match-let ((($ nemo:quantity 'DISPATCH  dis) (environment-ref sys (nemo-intern 'dispatch))))
    442448    (let ((imports  ((dis 'imports)  sys))
     
    454460             (components  ((dis 'components) sys))
    455461             (ionchs      (filter-map (match-lambda ((name 'ion-channel id) (list name id)) (else #f)) components))
     462             (capcomp     (any (match-lambda ((name 'membrane-capacitance id) (list name id)) (else #f)) components))
    456463             (epools      (collect-epools sys)))
    457464
    458 
    459465        (match-let (((state-list asgn-list g) deps*))
    460          (let* ((const-defs (filter-map
    461                                (lambda (nv)
    462                                  (and (not (member (first nv) matlab-builtin-consts))
    463                                       (let ((v1 (canonicalize-expr/MATLAB (second nv))))
    464                                         (list (first nv) v1))))
    465                                consts))
     466         (let* ((const-defs       (filter-map
     467                                   (lambda (nv)
     468                                     (and (not (member (first nv) matlab-builtin-consts))
     469                                          (let ((v1 (canonicalize-expr/MATLAB (second nv))))
     470                                            (list (first nv) v1))))
     471                                   consts))
     472                (globals          (delete-duplicates (append (map first imports) exports (map first const-defs))))
    466473                (poset            (vector->list ((dis 'depgraph->bfs-dist-poset) g)))
    467474                (asgn-eq-defs     (poset->asgn-eq-defs poset sys))
    468                 (perm-ions (fold (lambda (ionch ax)
    469                                     (let* ((subcomps ((dis 'component-subcomps) sys (cid ionch)))
    470                                            (perm      (lookup-def 'permeating-substance subcomps)))
    471                                       (if perm
    472                                           (case (cn perm)
    473                                             ((non-specific)   
    474                                              (let* ((erev (car ((dis 'component-exports) sys (cid perm))))
    475                                                     (i    (matlab-name 'i))
    476                                                     (e    (matlab-name 'e)))
    477                                                (cons `(,(cn perm) ,i ,e ,erev) ax)))
    478                                             (else (let* ((erev (car ((dis 'component-exports) sys (cid perm))))
    479                                                          (i    (matlab-name (s+ 'i (cn perm))))
    480                                                          (e    (matlab-name (s+ 'e (cn perm)))))
    481                                                     (cons `(,(cn perm) ,i ,e ,erev) ax))))
    482                                           ax)))
    483                                   (list) ionchs))
    484                (acc-ions (fold (lambda (ionch ax)
    485                                   (let* ((subcomps ((dis 'component-subcomps) sys (cid ionch)))
    486                                          (acc   (lookup-def 'accumulating-substance subcomps))
    487                                          (i     (and acc (matlab-name (s+ 'i (cn acc)))))
    488                                          (in    (and acc (matlab-name (s+ (cn acc) 'i))))
    489                                          (out   (and acc (matlab-name (s+ (cn acc) 'o)))))
    490                                     (if acc  (cons `(,(cn acc) ,i ,in ,out) ax) ax)))
    491                                 (list) ionchs))
    492                (pool-ions (map (lambda (ep)
    493                                   (let ((ion (car ep)))
    494                                     `(,(matlab-name ion) ,(matlab-name (s+ 'i ion)) ,(matlab-name (s+ ion 'i)))))
    495                                epools)))
    496            
     475                (mcap             (and capcomp (car ((dis 'component-exports) sys (cid capcomp)))))
     476                (perm-ions        (fold (lambda (ionch ax)
     477                                          (let* ((subcomps ((dis 'component-subcomps) sys (cid ionch)))
     478                                                 (perm      (lookup-def 'permeating-substance subcomps)))
     479                                            (if perm
     480                                                (case (cn perm)
     481                                                  ((non-specific)   
     482                                                   (let* ((erev (car ((dis 'component-exports) sys (cid perm))))
     483                                                          (i    (matlab-name 'i))
     484                                                          (e    (matlab-name 'e)))
     485                                                     (cons `(,(cn perm) ,i ,e ,erev) ax)))
     486                                                  (else (let* ((erev (car ((dis 'component-exports) sys (cid perm))))
     487                                                               (i    (matlab-name (s+ 'i (cn perm))))
     488                                                               (e    (matlab-name (s+ 'e (cn perm)))))
     489                                                          (cons `(,(cn perm) ,i ,e ,erev) ax))))
     490                                                ax)))
     491                                        (list) ionchs))
     492               (acc-ions           (fold (lambda (ionch ax)
     493                                           (let* ((subcomps ((dis 'component-subcomps) sys (cid ionch)))
     494                                                  (acc   (lookup-def 'accumulating-substance subcomps))
     495                                                  (i     (and acc (matlab-name (s+ 'i (cn acc)))))
     496                                                  (in    (and acc (matlab-name (s+ (cn acc) 'i))))
     497                                                  (out   (and acc (matlab-name (s+ (cn acc) 'o)))))
     498                                             (if acc  (cons `(,(cn acc) ,i ,in ,out) ax) ax)))
     499                                         (list) ionchs))
     500               (pool-ions          (map (lambda (ep)
     501                                          (let ((ion (car ep)))
     502                                            `(,(matlab-name ion) ,(matlab-name (s+ 'i ion)) ,(matlab-name (s+ ion 'i)))))
     503                                        epools)))
     504
    497505           (for-each
    498506            (lambda (a)
     
    537545                     epools)
    538546         
    539            (pp indent ,nl (function dy = ,sysname (,(sl\ ", " `(dy t)))))
    540            
    541            (if (not (null? exports)) (pp indent+ (global ,(sl\ ", " exports))))
     547           (if (not (null? globals)) (pp indent+ (global ,(sl\ " " globals))))
     548
     549           (pp indent ,nl (function dy = ,sysname (,(sl\ ", " (case method
     550                                                                ((lsode)  `(y t))
     551                                                                ((odepkg) `(t y))
     552                                                                (else     `(y t)))))))
     553
     554           (if (not (null? globals)) (pp indent+ (global ,(sl\ " " globals))))
    542555           
    543556           (if (not (null? asgns))
     
    572585                                       (else
    573586                                        (let* ((i     (matlab-name (s+ 'i (cn perm))))
    574                                                (e     (matlab-name (s+ 'e (cn perm))))
     587                                               (e     (car permqs))
    575588                                               (gmax  (car ((dis 'component-exports) sys (cid pore))))
    576589                                               (pwrs  (map (lambda (n) (state-power sys n)) sts))
     
    646659                                                         (list (+ 1 (first ax))
    647660                                                               (cons `(,st-name ,(first ax)) (second ax)))))
    648                                                      (list 0 (list)) rate-eq-defs)))
     661                                                     (list 1 (list))
     662                                                     (cons (list 'v) rate-eq-defs))))
     663                                                             
    649664                                      (second acc)))
    650665                  )
    651666
    652667
     668             (if (member 'v globals)
     669                 (let ((vi (lookup-def 'v state-index-map)))
     670                   (if vi (pp indent+ (v = ,(s+ "y(" vi ")") #\;)))))
    653671
    654672             (for-each (lambda (def)
    655673                         (let ((n (first def)) )
    656                            (pp indent+ (,n = ,(s+ "y(" (lookup-def n state-index-map) ")"))))) rate-eq-defs)
     674                           (pp indent+ (,n = ,(s+ "y(" (lookup-def n state-index-map) ");"))))) rate-eq-defs)
    657675
    658676             (for-each (lambda (def)
     
    660678                           (pp indent+ ,(expr->string/MATLAB b n)))) stcomp-eq-defs)
    661679
    662              (pp indent+ (dy = zeros(length(y) #\, 1)))
     680             (pp indent+ (dy = zeros(length(y) #\, 1) #\;))
    663681
    664682             (for-each (lambda (def)
     
    671689             (for-each (lambda (def)
    672690                         (pp indent+ ,(expr->string/MATLAB (second def) (first def)))) i-eqs)
     691
     692             (if (and mcap (member 'v globals))
     693                 (let ((vi (lookup-def 'v state-index-map)))
     694                   (if vi (pp indent+  ,(expr->string/MATLAB `(/ (neg ,(sum (map first i-eqs))) ,mcap) 
     695                                                             (s+ "dy(" vi ")"))))))
    673696             
    674697             (pp indent ,nl (endfunction))
    675698
    676              (pp indent ,nl (function y0 = ,(s+ sysname "_init") (v)))
    677 
    678              (if (not (null? exports)) (pp indent+ (global ,(sl\ ", " exports))))
    679              (if (not (null? exports)) (pp indent+ (global ,(sl\ ", " (map first const-defs)))))
     699             (pp indent ,nl (function y0 = ,(s+ sysname "_init") (Vinit)))
     700
     701             (if (not (null? globals)) (pp indent+ (global ,(sl\ " " globals))))
    680702
    681703             (let* ((init-defs         (poset->state-init-defs poset sys)))
    682704;;                  (init-eq-defs      (poset->state-init-eq-defs poset sys)))
     705
     706               (pp indent+ (y0 = zeros(,(length state-index-map) #\, 1) #\;))
     707
     708               (if (member 'v globals)
     709                   (let ((vi (lookup-def 'v state-index-map)))
     710                     (pp indent+ (v = Vinit #\;))
     711                     (if vi (pp indent+ (,(s+ "y0(" vi ")") = v #\;)))))
     712
    683713               
    684714               (for-each (lambda (def)
  • release/3/nemo/trunk/nemo.scm

    r12558 r12567  
    7171    ,@(if nemo-matlab?
    7272          (list (args:make-option (matlab)      (optional: "FILE")   
    73                                   (s+ "write MATLAB output to file (default: <model-name>.m)")))
     73                                  (s+ "write MATLAB output to file (default: <model-name>.m)"))
     74                (args:make-option (matlab-method)       (required: "METHOD")
     75                                  (s+ "specify MATLAB/Octave integration method")
     76                                  (string->symbol arg))
     77                )
    7478          `())
    7579    ,@(if nemo-nmodl?
     
    8589           (args:make-option (nmodl-depend)       (required: "VARS")
    8690                             (s+ "specify DEPEND variables for NMODL interpolation tables")
    87                              (map string->symbol (string-split arg ","))))
     91                             (map string->symbol (string-split arg ",")))
     92           )
    8893          `())
    8994    ,(args:make-option (t)       #:none
     
    640645                             newton simplex simeq seidel sparse derivimplicit cnexp clsoda
    641646                             after_cvode cvode_t cvode_t_v expeuler #f) method)
    642                      (else (error "unknown nmodl-method " method))))))
     647                     (else (error "unknown nmodl-method " method)))))
     648
     649                (matlab-method
     650                 (let ((method  ($ (lookup-def 'matlab-method options) )))
     651                   (case method
     652                     ((lsode odepkg #f) method)
     653                     (else (error "unknown matlab-method " method)))))
     654                )
    643655           (if sxml-fname (with-output-to-file sxml-fname (lambda () (pretty-print (model->ncml options model)))))
    644656           (if xml-fname  (let* ((doc  (model->ncml options model))
     
    663675               (with-output-to-file
    664676                   mat-fname  (lambda ()
    665                                 (model->matlab `(;(method  . ,matlab-method)
     677                                (model->matlab `((method  . ,matlab-method)
    666678                                                 (table   . ,(assoc 't options))
    667679                                                 )
Note: See TracChangeset for help on using the changeset viewer.