Changeset 25713 in project for release


Ignore:
Timestamp:
12/16/11 03:41:03 (10 years ago)
Author:
Ivan Raikov
Message:

nemo: fixes to pyparams module

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

Legend:

Unmodified
Added
Removed
  • release/4/nemo/trunk/examples/AKP06_parts/AKP06_CaP.nemo

    r21244 r25713  
    4949                         (const cao       = 2.4)
    5050                         (pca_CaP        = (pcabar_CaP * ghk (v celsius cai cao)))
    51                          (output pca_CaP ))
     51                         (output pca_CaP pcabar_CaP ))
    5252             
    5353              (component (type permeating-ion) (name ca) )
  • release/4/nemo/trunk/nemo-pyparams.scm

    r25668 r25713  
    5050            (loop (cons c1 lst) (cdr cs)))))))
    5151           
     52
     53(define (nmodl-name s)
     54  (let ((cs (string->list (->string s))))
     55    (let loop ((lst (list)) (cs cs))
     56      (if (null? cs) (string->symbol (list->string (reverse lst)))
     57          (let* ((c (car cs))
     58                 (c1 (cond ((or (char-alphabetic? c) (char-numeric? c) (char=? c #\_)) c)
     59                           (else #\_))))
     60            (loop (cons c1 lst) (cdr cs)))))))
     61
     62
    5263(define (rhsexpr/python expr)
    5364  (match expr
     
    6980
    7081
     82(define tuple/python   (doc:block 2 (doc:text "(") (doc:text ")")))
    7183(define dict/python    (doc:block 2 (doc:text "{") (doc:text "}")))
    7284(define group/python   (doc:block 2 (doc:text "(") (doc:text ")")))
     
    123135                                                  (doc:cons (doc:text v)
    124136                                                            (doc:empty))))))
     137                          (lambda () (doc:cons (doc:text ", ")
     138                                               (doc:cons (doc:break)
     139                                                         (doc:empty)))))
     140                args)))
     141
     142(define (format-tuple/python indent args)
     143  (tuple/python ((doc:list indent
     144                          (lambda (v) (doc:text v))
    125145                          (lambda () (doc:cons (doc:text ", ")
    126146                                               (doc:cons (doc:break)
     
    454474                const-defs)
    455475
     476      (pp indent ,nl)
     477
    456478      (let recur ((i-params i-params)
    457                   (property-pairs '() ))
     479                  (property-tuples '() ))
    458480
    459481        (if (null? i-params)
    460             (pp indent ,nl (active_properties = ,(doc->string (format-dict/python indent+ property-pairs)) ,nl))
     482           
     483            (for-each (lambda (t)
     484                        (pp indent (,(car t) = ,(doc->string (format-tuple/python indent+ (cdr t))))))
     485                      property-tuples)
     486
    461487            (let ((paramset (car i-params)))
    462488              (let ((alst (cdr paramset)))
    463489                (let ((label (lookup-def 'label alst))
    464                       (maximal-conductance (lookup-def 'maximal-conductance alst))
    465                       (reversal-potential  (lookup-def 'reversal-potential alst)))
     490                      (maximal-permeability (lookup-def 'maximal-permeability alst))
     491                      (maximal-conductance  (lookup-def 'maximal-conductance alst))
     492                      (reversal-potential   (lookup-def 'reversal-potential alst)))
    466493                  (recur (cdr i-params)
    467                          (let* ((property-pairs1
    468                                 (or (and maximal-conductance
    469                                          (cons
    470                                          `(,(s+ #\' (s+ label "_MAXIMAL_CONDUCTANCE") #\') .
    471                                            ,(symbol->string (python-name maximal-conductance)))
    472                                          property-pairs))
    473                                     property-pairs))
    474                                 (property-pairs2
    475                                  (or (and maximal-conductance
    476                                           (cons
    477                                           `(,(s+ #\' (s+ label "_REVERSAL_POTENTIAL") #\') .
    478                                             ,(symbol->string (python-name reversal-potential)))
    479                                           property-pairs1))
    480                                      property-pairs1)))
    481                            property-pairs2))
     494                         (let* ((property-tuples1
     495                                 (fold (lambda (l x ax)
     496                                         (or (and x (cons `(,l ,(symbol->string (python-name x))
     497                                                               ,(s+ "'" (nmodl-name x) "'")) ax))
     498                                             ax))
     499                                       property-tuples
     500                                       (list (s+ label "_MAXIMAL_PERMEABILITY")
     501                                             (s+ label "_MAXIMAL_CONDUCTANCE")
     502                                             (s+ label "_REVERSAL_POTENTIAL"))
     503                                       (list maximal-permeability
     504                                             maximal-conductance
     505                                             reversal-potential)
     506                                       )))
     507                           property-tuples1))
    482508                  )))
    483509            ))
     
    497523             (sysname     (python-name ((dis 'sysname) sys)))
    498524             (prefix      sysname)
    499              (filename    (or filename (s+ sysname ".m")))
     525             (filename    (or filename (s+ sysname ".py")))
    500526             (deps*       ((dis 'depgraph*) sys))
    501527             (consts      ((dis 'consts)  sys))
     
    553579                         (cond ((and perm permeability gate)
    554580                                     (let* ((i     (python-name (s+ 'i (cn perm))))
    555                                             (pmax  (car ((dis 'component-exports) sys (cid permeability))))
     581                                            (pmax  (cadr ((dis 'component-exports) sys (cid permeability))))
    556582                                            (pwrs  (map (lambda (n) (reaction-power sys n)) sts))
    557583                                            (sptms (map (lambda (st pwr) `(pow ,st ,pwr)) sts pwrs))
     
    693719         pool-ions)
    694720       
    695         (let ((output  (case mode
    696                          ((single)  (open-output-file filename))
    697                          (else #f))))
     721        (let ((output
     722               (case mode
     723                 ((single)  (open-output-file filename #:append))
     724                 (else #f))))
    698725         
    699726             (let ((output1 (or output (open-output-file (s+ prefix "_params.py")))))
     727
    700728               (with-output-to-port output1
    701729                 (lambda ()
    702730                   (output-pyparams sysname i-params i-eqs const-defs asgn-eq-defs init-eq-defs pool-ions perm-ions indent indent+)
    703731                   (pp indent ,nl)))
     732
    704733               (if (not output) (close-output-port output1)))
    705734
     
    709738
    710739
    711 (define (nemo:pyparams-translator sys . rest)
    712   (apply pyparams-translator1 (cons sys (cons 'multiple rest))))
     740(define (nemo:pyparams-translator syss . rest)
     741  (let-optionals rest ((filename #f))
     742    (close-output-port (open-output-file filename))
     743    (for-each
     744     (lambda (sys)
     745       (apply pyparams-translator1 (cons sys (cons 'single rest))))
     746     syss)))
    713747
    714748
  • release/4/nemo/trunk/nemo.scm

    r25668 r25713  
    268268        (void))))
    269269
    270 (define model->pyparams
     270(define models->pyparams
    271271  (if nemo-pyparams?
    272       (lambda (options model)
    273         (nemo:pyparams-translator model (lookup-def 'filename options)))
     272      (lambda (options models)
     273        (nemo:pyparams-translator models (lookup-def 'filename options)))
    274274      (lambda (options model)
    275275        (void))))
     
    829829(define (main opt operands)
    830830  (if (null? operands)
     831
    831832      (nemo:usage)
    832       (for-each
    833        (lambda (operand)
    834          (let* ((read-xml   (lambda (name) (call-with-input-file name
    835                                             (lambda (port) (ssax:xml->sxml port '((ncml . "ncml")))) )))
    836                 (read-sexp  (lambda (name) (call-with-input-file name read)))
    837 
    838                 (in-format  (cond ((opt 'input-format) =>
    839                                    (lambda (x)
    840                                      (case x
    841                                        ((nemo)        'nemo)
    842                                        ((s-exp sexp)  'sexp)
    843                                        ((sxml)        'sxml)
    844                                        ((xml)         'xml)
    845                                        (else          (error 'nemo "unknown input format" x)))))
    846                                   (else  (case ((lambda (x) (or (not x) ($ x)))
    847                                                 (pathname-extension operand))
    848                                            ((s-exp sexp)  'sexp)
    849                                            ((sxml)  'sxml)
    850                                            ((xml)   'xml)
    851                                            (else    'nemo)))))
    852 
    853                 (doc        (case in-format
    854                               ((nemo sxml s-exp sexp)  (read-sexp operand))
    855                               ((xml)   (read-xml operand))
    856                               (else    (error 'nemo "unknown input format" in-format))))
    857 
    858                 (parse-expr  (case in-format
    859                                ((sxml xml)          identity)
    860                                ((s-exp sexp)        identity)
    861                                ((nemo)              nemo:parse-sym-expr)
    862                                (else    (error 'nemo "unknown input format" in-format)))) 
    863 
    864                 (model       (case in-format
    865                                ((sxml xml)          (ncml->model '() doc))
    866                                ((s-exp sexp)        (sexp->model '() doc parse-expr))
    867                                ((nemo)              (sexp->model '() doc parse-expr))
    868                                (else    (error 'nemo "unknown input format" in-format))))
    869 
    870                 (make-fname  (lambda (operand x suffix)
    871                                (and x (let ((fname (pathname-strip-extension operand)))
    872                                         (if (string? x) x (s+ fname suffix))))))
    873 
    874                 (sxml-fname   (make-fname operand (opt 'sxml) ".sxml"))
    875                 (xml-fname    (make-fname operand (opt 'xml) ".xml"))
    876                 (mod-fname    (make-fname operand (opt 'nmodl) ".mod"))
    877                 (octave-fname (and (string? (opt 'octave)) (make-fname operand (opt 'octave) ".m") ))
    878                 (nest-fname   (and (string? (opt 'nest)) (make-fname operand (opt 'nest) ".cpp") ))
    879                 (pyparams-fname   (and (string? (opt 'pyparams)) (make-fname operand (opt 'pyparams) ".py") ))
    880                 (vclamp-ses-fname    (make-fname operand (opt 'vclamp-hoc) ".ses"))
    881                 (vclamp-octave-fname (make-fname operand (opt 'vclamp-octave) "_vclamp.m"))
    882 
    883                 (pyparams       (opt 'pyparams))
    884                 (nest           (opt 'nest))
    885                 (matlab         (opt 'matlab))
    886                 (octave         (opt 'octave))
    887                 (vclamp-hoc     (opt 'vclamp-hoc))
    888                 (vclamp-octave  (opt 'vclamp-octave))
    889 
    890                 (nmodl-depend  (opt 'nmodl-depend))
    891                                  
    892                 (nmodl-method
    893                  (let ((method  ($ (opt 'nmodl-method) )))
    894                    (case method
    895 
    896                      ((adams runge euler adeuler heun adrunge gear
    897                              newton simplex simeq seidel sparse derivimplicit cnexp clsoda
    898                              after_cvode cvode_t cvode_t_v expeuler #f) method)
    899                      (else (error "unknown nmodl-method " method)))))
    900 
    901                 (octave-method
    902                  (let ((method  ($ (opt 'octave-method) )))
    903                    (case method
    904                      ((lsode odepkg #f) method)
    905                      (else (error "unknown octave method " method)))))
    906                 )
    907            (if sxml-fname (with-output-to-file sxml-fname
    908                             (lambda () (pretty-print (model->ncml model parse-expr)))))
    909            (if xml-fname  (let* ((doc  (model->ncml model parse-expr))
    910                                  (doc1 (ensure-xmlns
    911                                        (cond ((eq? (car doc) '*TOP*) (assoc 'ncml:model (cdr doc)))
    912                                              (else doc)))))
    913                             (with-output-to-file xml-fname
    914                               (lambda () (print-fragments (generate-XML `(begin ,doc1)))))))
    915            (if mod-fname
    916                (with-output-to-file
    917                    mod-fname  (lambda ()
    918                                 (model->nmodl `((depend  . ,nmodl-depend)
    919                                                 (method  . ,nmodl-method)
    920                                                 (table   . ,(opt 't))
    921                                                 (kinetic . ,(opt 'nmodl-kinetic)))
    922                                               model))))
    923 
    924            (if octave (model->octave `((filename  . ,octave-fname)
    925                                        (method  . ,octave-method))
    926                                      model))
    927 
    928            (if matlab (model->matlab `() model))
    929 
    930            (if nest (model->nest `((filename . ,nest-fname)) model))
    931 
    932            (if pyparams (model->pyparams `((filename . ,pyparams-fname)) model))
    933 
    934            (if vclamp-hoc (model->vclamp-hoc `((filename . ,vclamp-ses-fname)
    935                                                )
    936                                              model))
    937            (if vclamp-octave (model->vclamp-octave `((filename . ,vclamp-octave-fname)
    938                                                      )
    939                                                    model))
    940 
    941            ))
    942        operands)))
     833
     834      (let ((models
     835             (map (lambda (operand)
     836                    (let* ((read-xml   (lambda (name) (call-with-input-file name
     837                                                        (lambda (port) (ssax:xml->sxml port '((ncml . "ncml")))) )))
     838                           (read-sexp  (lambda (name) (call-with-input-file name read)))
     839                           
     840                           (in-format  (cond ((opt 'input-format) =>
     841                                              (lambda (x)
     842                                                (case x
     843                                                  ((nemo)        'nemo)
     844                                                  ((s-exp sexp)  'sexp)
     845                                                  ((sxml)        'sxml)
     846                                                  ((xml)         'xml)
     847                                                  (else          (error 'nemo "unknown input format" x)))))
     848                                             (else  (case ((lambda (x) (or (not x) ($ x)))
     849                                                           (pathname-extension operand))
     850                                                      ((s-exp sexp)  'sexp)
     851                                                      ((sxml)  'sxml)
     852                                                      ((xml)   'xml)
     853                                                      (else    'nemo)))))
     854                           
     855                           (doc        (case in-format
     856                                         ((nemo sxml s-exp sexp)  (read-sexp operand))
     857                                         ((xml)   (read-xml operand))
     858                                         (else    (error 'nemo "unknown input format" in-format))))
     859                           
     860                           (parse-expr  (case in-format
     861                                          ((sxml xml)          identity)
     862                                          ((s-exp sexp)        identity)
     863                                          ((nemo)              nemo:parse-sym-expr)
     864                                          (else    (error 'nemo "unknown input format" in-format)))) 
     865                           
     866                           (model       (case in-format
     867                                          ((sxml xml)          (ncml->model '() doc))
     868                                          ((s-exp sexp)        (sexp->model '() doc parse-expr))
     869                                          ((nemo)              (sexp->model '() doc parse-expr))
     870                                          (else    (error 'nemo "unknown input format" in-format))))
     871                           )
     872                      model))
     873                  operands)))
     874        (for-each
     875         (lambda (operand model)
     876           (let* (
     877                  (make-fname  (lambda (operand x suffix)
     878                                 (and x (let ((fname (pathname-strip-extension operand)))
     879                                          (if (string? x) x (s+ fname suffix))))))
     880                 
     881                  (sxml-fname   (make-fname operand (opt 'sxml) ".sxml"))
     882                  (xml-fname    (make-fname operand (opt 'xml) ".xml"))
     883                  (mod-fname    (make-fname operand (opt 'nmodl) ".mod"))
     884                  (octave-fname (and (string? (opt 'octave)) (make-fname operand (opt 'octave) ".m") ))
     885                  (nest-fname   (and (string? (opt 'nest)) (make-fname operand (opt 'nest) ".cpp") ))
     886                  (vclamp-ses-fname    (make-fname operand (opt 'vclamp-hoc) ".ses"))
     887                  (vclamp-octave-fname (make-fname operand (opt 'vclamp-octave) "_vclamp.m"))
     888                 
     889                  (nest           (opt 'nest))
     890                  (matlab         (opt 'matlab))
     891                  (octave         (opt 'octave))
     892                  (vclamp-hoc     (opt 'vclamp-hoc))
     893                  (vclamp-octave  (opt 'vclamp-octave))
     894                 
     895                  (nmodl-depend  (opt 'nmodl-depend))
     896                 
     897                  (nmodl-method
     898                   (let ((method  ($ (opt 'nmodl-method) )))
     899                     (case method
     900                       
     901                       ((adams runge euler adeuler heun adrunge gear
     902                               newton simplex simeq seidel sparse derivimplicit cnexp clsoda
     903                               after_cvode cvode_t cvode_t_v expeuler #f) method)
     904                       (else (error "unknown nmodl-method " method)))))
     905                 
     906                  (octave-method
     907                   (let ((method  ($ (opt 'octave-method) )))
     908                     (case method
     909                       ((lsode odepkg #f) method)
     910                       (else (error "unknown octave method " method)))))
     911                  )
     912             (if sxml-fname (with-output-to-file sxml-fname
     913                              (lambda () (pretty-print (model->ncml model parse-expr)))))
     914             (if xml-fname  (let* ((doc  (model->ncml model parse-expr))
     915                                   (doc1 (ensure-xmlns
     916                                          (cond ((eq? (car doc) '*TOP*) (assoc 'ncml:model (cdr doc)))
     917                                                (else doc)))))
     918                              (with-output-to-file xml-fname
     919                                (lambda () (print-fragments (generate-XML `(begin ,doc1)))))))
     920             (if mod-fname
     921                 (with-output-to-file
     922                     mod-fname  (lambda ()
     923                                  (model->nmodl `((depend  . ,nmodl-depend)
     924                                                  (method  . ,nmodl-method)
     925                                                  (table   . ,(opt 't))
     926                                                  (kinetic . ,(opt 'nmodl-kinetic)))
     927                                                model))))
     928             
     929             (if octave (model->octave `((filename  . ,octave-fname)
     930                                         (method  . ,octave-method))
     931                                       model))
     932             
     933             (if matlab (model->matlab `() model))
     934             
     935             (if nest (model->nest `((filename . ,nest-fname)) model))
     936             
     937             
     938             (if vclamp-hoc (model->vclamp-hoc `((filename . ,vclamp-ses-fname)
     939                                                 )
     940                                               model))
     941             (if vclamp-octave (model->vclamp-octave `((filename . ,vclamp-octave-fname)
     942                                                       )
     943                                                     model))
     944             
     945             ))
     946         operands models)
     947
     948      (let ((pyparams       (opt 'pyparams)))
     949        (if pyparams
     950            (let ((pyparams-fname
     951                   (or (and (string? (opt 'pyparams))
     952                            (make-fname operand (opt 'pyparams) ".py") )
     953                       "pyparams.py")))
     954              (models->pyparams `((filename . ,pyparams-fname)) models))))
     955
     956      )))
    943957
    944958(main opt (opt '@))
Note: See TracChangeset for help on using the changeset viewer.