$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r51469 - in sandbox/numeric_bindings: boost/numeric/bindings/blas/level1 boost/numeric/bindings/blas/level2 boost/numeric/bindings/blas/level3 boost/numeric/bindings/lapack/computational boost/numeric/bindings/lapack/driver libs/numeric/bindings/tools libs/numeric/bindings/tools/templates
From: rutger_at_[hidden]
Date: 2009-02-27 08:13:15
Author: rutger
Date: 2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
New Revision: 51469
URL: http://svn.boost.org/trac/boost/changeset/51469
Log:
Added initial support for static assert on value type types for both BLAS and LAPACK
Text files modified: 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/asum.hpp           |     8 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/axpy.hpp           |    15 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/copy.hpp           |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dot.hpp            |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotc.hpp           |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotu.hpp           |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/drot.hpp           |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/nrm2.hpp           |     8 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rot.hpp            |    14 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotg.hpp           |    15 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotm.hpp           |    16 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotmg.hpp          |    12 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/scal.hpp           |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/sdot.hpp           |    12 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/srot.hpp           |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/swap.hpp           |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gbmv.hpp           |    22 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gemv.hpp           |    22 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/ger.hpp            |    14 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gerc.hpp           |    17 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/geru.hpp           |    17 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hbmv.hpp           |    22 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hemv.hpp           |    20 +++++-                                  
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her.hpp            |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her2.hpp           |    17 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpmv.hpp           |    21 +++++-                                  
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr.hpp            |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr2.hpp           |    17 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/sbmv.hpp           |    16 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spmv.hpp           |    16 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr.hpp            |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr2.hpp           |    14 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/symv.hpp           |    19 ++++--                                  
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr.hpp            |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr2.hpp           |    14 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbmv.hpp           |    12 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbsv.hpp           |    12 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpmv.hpp           |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpsv.hpp           |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trmv.hpp           |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trsv.hpp           |    11 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/gemm.hpp           |    24 ++++++--                                
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/hemm.hpp           |    22 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/her2k.hpp          |    21 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/herk.hpp           |    15 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/symm.hpp           |    22 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syr2k.hpp          |    22 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syrk.hpp           |    19 ++++--                                  
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trmm.hpp           |    17 +++--                                   
   sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trsm.hpp           |    17 +++--                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsdc.hpp |    15 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsqr.hpp |    24 ++++++++                                
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbbrd.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbcon.hpp |    12 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbequ.hpp |    55 +++++++++++++++++--                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbrfs.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrf.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebak.hpp |    47 +++++++++++++++-                        
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebal.hpp |    39 +++++++++++++                           
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebrd.hpp |    32 +++++++++-                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gecon.hpp |     5 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geequ.hpp |    46 +++++++++++++++                         
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gehrd.hpp |    17 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gelqf.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqlf.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqp3.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqrf.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerfs.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerqf.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrf.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getri.hpp |     5 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbak.hpp |    54 ++++++++++++++++++-                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbal.hpp |    88 ++++++++++++++++++++++++++++++-         
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gghrd.hpp |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggqrf.hpp |    29 ++++++++-                               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggrqf.hpp |    29 ++++++++-                               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggsvp.hpp |    41 ++++++++++++--                          
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gtrfs.hpp |    60 +++++++++++++++++++++                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gttrs.hpp |    15 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbgst.hpp |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbtrd.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hecon.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hegst.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/herfs.hpp |    15 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrd.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrf.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetri.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hgeqz.hpp |    37 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hprfs.hpp |    15 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hptrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hsein.hpp |    37 +++++++++++-                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hseqr.hpp |    19 ++++++                                  
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/labrd.hpp |    36 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/lacon.hpp |     5 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/laebz.hpp |    18 ++++++                                  
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/larz.hpp  |    30 ++++------                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrd.hpp |    18 ++++++                                  
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrs.hpp |    49 ++++++++++++++++                        
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrz.hpp |    17 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opgtr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opmtr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgbr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orghr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orglq.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgql.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgqr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgrq.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgtr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormbr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormhr.hpp |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormlq.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormql.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormqr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrq.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrz.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormtr.hpp |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbcon.hpp |    12 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbequ.hpp |    46 ++++++++++++++-                         
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbrfs.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbstf.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrf.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pocon.hpp |    12 ++-                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/poequ.hpp |    38 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/porfs.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrf.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potri.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pprfs.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pptrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pteqr.hpp |    72 ++++++++++++++++++++++++-               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ptrfs.hpp |    43 ++++++++++++++                          
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pttrs.hpp |    13 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbgst.hpp |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbtrd.hpp |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sprfs.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sptrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stebz.hpp |    27 ++++++---                               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stedc.hpp |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stegr.hpp |   112 +++++++++++++++++++++++++++++++++++++++ 
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stein.hpp |   111 ++++++++++++++++++++++++++++++++++++++  
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/steqr.hpp |    72 ++++++++++++++++++++++++-               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sterf.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sycon.hpp |     5 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sygst.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/syrfs.hpp |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrd.hpp |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrf.hpp |     5 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytri.hpp |     5 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbcon.hpp |     5 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbrfs.hpp |    24 ++++++++                                
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbtrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgevc.hpp |    24 +++++++                                 
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgexc.hpp |    22 +++++++                                 
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsen.hpp |    54 ++++++++++++++++--                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsja.hpp |    54 +++++++++++++++---                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsna.hpp |    33 +++++++++++                             
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsyl.hpp |    33 +++++++++++                             
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tprfs.hpp |    24 ++++++++                                
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tptrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trcon.hpp |    18 +++--                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trevc.hpp |    18 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trexc.hpp |    10 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trrfs.hpp |    24 ++++++++                                
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsen.hpp |    18 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsna.hpp |    27 ++++++++                                
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsyl.hpp |    19 +++++-                                  
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtri.hpp |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtrs.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tzrzf.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungbr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unghr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unglq.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungql.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungqr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungrq.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungtr.hpp |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmbr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmhr.hpp |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmlq.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmql.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmqr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrq.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrz.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmtr.hpp |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upgtr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upmtr.hpp |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/cgesv.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsvx.hpp        |    42 ++++++++++++++                          
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gees.hpp         |    19 ++++++                                  
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geesx.hpp        |    26 +++++++--                               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geev.hpp         |    25 ++++++++                                
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geevx.hpp        |    54 +++++++++++++++---                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gegv.hpp         |    37 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gels.hpp         |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsd.hpp        |    16 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelss.hpp        |    14 ++++                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsy.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesdd.hpp        |    22 ++++++-                                 
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvd.hpp        |    20 ++++++                                  
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvx.hpp        |    47 +++++++++++++++-                        
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gges.hpp         |    37 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggesx.hpp        |    46 +++++++++++++++                         
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggev.hpp         |    37 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggevx.hpp        |    67 +++++++++++++++++++++--                 
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggglm.hpp        |    27 +++++++++                               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gglse.hpp        |    27 +++++++++                               
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggsvd.hpp        |    36 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsv.hpp         |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsvx.hpp        |    60 +++++++++++++++++++++                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbev.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevd.hpp        |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevx.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgv.hpp         |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvd.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvx.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heev.hpp         |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevd.hpp        |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevr.hpp        |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevx.hpp        |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvd.hpp        |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvx.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesvx.hpp        |    15 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpev.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevd.hpp        |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevx.hpp        |    18 +++--                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgv.hpp         |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvd.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvx.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsvx.hpp        |    15 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lacgv.hpp        |     4 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lalsd.hpp        |    16 ++++-                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/largv.hpp        |    44 +++++++++++++++                         
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsvx.hpp        |    41 +++++++++++++-                          
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posvx.hpp        |    36 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsvx.hpp        |    36 ++++++++++++                            
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsv.hpp         |    45 +++++++++++++++                         
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsvx.hpp        |    42 ++++++++++++++                          
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbev.hpp         |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevd.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevx.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgv.hpp         |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvd.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvx.hpp        |    15 +++++                                   
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sgesv.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spev.hpp         |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevd.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevx.hpp        |    21 +++++--                                 
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgv.hpp         |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvd.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvx.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsv.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsvx.hpp        |    30 ++++++++++                              
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stev.hpp         |    13 +++-                                    
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevd.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevr.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevx.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syev.hpp         |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevd.hpp        |     6 +                                       
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevr.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevx.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygv.hpp         |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvd.hpp        |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvx.hpp        |    12 +++                                     
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysv.hpp         |     9 ++                                      
   sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysvx.hpp        |    30 ++++++++++                              
   sandbox/numeric_bindings/libs/numeric/bindings/tools/bindings.py               |     2                                         
   sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py         |    28 +++++++++                               
   sandbox/numeric_bindings/libs/numeric/bindings/tools/lapack_generator.py       |    59 ++++++++++++++------                    
   sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py                 |    22 +++++++                                 
   sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp        |     5 +                                       
   sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/lapack.hpp      |     6 +-                                      
   284 files changed, 4414 insertions(+), 654 deletions(-)
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/asum.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/asum.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/asum.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -46,6 +48,7 @@
     // templated specialization
     template< typename VectorX >
     static return_type compute( VectorX& x ) {
+        
         return detail::asum( traits::vector_size(x),
                 traits::vector_storage(x), traits::vector_stride(x) );
     }
@@ -53,12 +56,13 @@
 
 // template function to call asum
 template< typename VectorX >
-inline integer_t asum( VectorX& x ) {
+inline typename asum_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+asum( VectorX& x ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     return asum_impl< value_type >::compute( x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/axpy.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/axpy.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/axpy.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,8 +61,10 @@
 
     // templated specialization
     template< typename VectorX, typename VectorY >
-    static return_type compute( traits::complex_d const a, VectorX& x,
-            VectorY& y ) {
+    static return_type compute( value_type const a, VectorX& x, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::axpy( traits::vector_size(x), a,
                 traits::vector_storage(x), traits::vector_stride(x),
                 traits::vector_storage(y), traits::vector_stride(y) );
@@ -69,13 +73,14 @@
 
 // template function to call axpy
 template< typename VectorX, typename VectorY >
-inline integer_t axpy( traits::complex_d const a, VectorX& x,
-        VectorY& y ) {
+inline typename axpy_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+axpy( typename traits::vector_traits< VectorX >::value_type const a,
+        VectorX& x, VectorY& y ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     axpy_impl< value_type >::compute( a, x, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/copy.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/copy.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/copy.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,9 @@
     // templated specialization
     template< typename VectorX, typename VectorY >
     static return_type compute( VectorX& x, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::copy( traits::vector_size(x), traits::vector_storage(x),
                 traits::vector_stride(x), traits::vector_storage(y),
                 traits::vector_stride(y) );
@@ -68,12 +73,13 @@
 
 // template function to call copy
 template< typename VectorX, typename VectorY >
-inline integer_t copy( VectorX& x, VectorY& y ) {
+inline typename copy_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+copy( VectorX& x, VectorY& y ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     copy_impl< value_type >::compute( x, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dot.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dot.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dot.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -48,6 +50,9 @@
     // templated specialization
     template< typename VectorX, typename VectorY >
     static return_type compute( VectorX& x, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         return detail::dot( traits::vector_size(x),
                 traits::vector_storage(x), traits::vector_stride(x),
                 traits::vector_storage(y), traits::vector_stride(y) );
@@ -56,12 +61,13 @@
 
 // template function to call dot
 template< typename VectorX, typename VectorY >
-inline integer_t dot( VectorX& x, VectorY& y ) {
+inline typename dot_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+dot( VectorX& x, VectorY& y ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     return dot_impl< value_type >::compute( x, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -52,6 +54,9 @@
     // templated specialization
     template< typename VectorX, typename VectorY >
     static return_type compute( VectorX& x, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         return detail::dotc( traits::vector_size(x),
                 traits::vector_storage(x), traits::vector_stride(x),
                 traits::vector_storage(y), traits::vector_stride(y) );
@@ -60,12 +65,13 @@
 
 // template function to call dotc
 template< typename VectorX, typename VectorY >
-inline integer_t dotc( VectorX& x, VectorY& y ) {
+inline typename dotc_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+dotc( VectorX& x, VectorY& y ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     return dotc_impl< value_type >::compute( x, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotu.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotu.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/dotu.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -52,6 +54,9 @@
     // templated specialization
     template< typename VectorX, typename VectorY >
     static return_type compute( VectorX& x, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         return detail::dotu( traits::vector_size(x),
                 traits::vector_storage(x), traits::vector_stride(x),
                 traits::vector_storage(y), traits::vector_stride(y) );
@@ -60,12 +65,13 @@
 
 // template function to call dotu
 template< typename VectorX, typename VectorY >
-inline integer_t dotu( VectorX& x, VectorY& y ) {
+inline typename dotu_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+dotu( VectorX& x, VectorY& y ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     return dotu_impl< value_type >::compute( x, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/drot.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/drot.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/drot.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -47,6 +49,9 @@
     template< typename VectorCX, typename VectorCY >
     static return_type compute( integer_t const n, VectorCX& cx, VectorCY& cy,
             real_type const c, real_type const s ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorCX >::value_type, typename traits::vector_traits<
+                VectorCY >::value_type > );
         detail::drot( n, traits::vector_storage(cx),
                 traits::vector_stride(cx), traits::vector_storage(cy),
                 traits::vector_stride(cy), c, s );
@@ -55,14 +60,15 @@
 
 // template function to call drot
 template< typename VectorCX, typename VectorCY >
-inline integer_t drot( integer_t const n, VectorCX& cx, VectorCY& cy,
+inline typename drot_impl< typename traits::vector_traits<
+        VectorCX >::value_type >::return_type
+drot( integer_t const n, VectorCX& cx, VectorCY& cy,
         typename traits::vector_traits< VectorCX >::value_type const c,
         typename traits::vector_traits< VectorCX >::value_type const s ) {
     typedef typename traits::vector_traits< VectorCX >::value_type value_type;
     drot_impl< value_type >::compute( n, cx, cy, c, s );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/nrm2.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/nrm2.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/nrm2.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -46,6 +48,7 @@
     // templated specialization
     template< typename VectorX >
     static return_type compute( VectorX& x ) {
+        
         return detail::nrm2( traits::vector_size(x),
                 traits::vector_storage(x), traits::vector_stride(x) );
     }
@@ -53,12 +56,13 @@
 
 // template function to call nrm2
 template< typename VectorX >
-inline integer_t nrm2( VectorX& x ) {
+inline typename nrm2_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+nrm2( VectorX& x ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     return nrm2_impl< value_type >::compute( x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rot.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rot.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rot.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -49,6 +51,9 @@
     template< typename VectorX, typename VectorY >
     static return_type compute( VectorX& x, VectorY& y, real_type const c,
             real_type const s ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::rot( traits::vector_size(x), traits::vector_storage(x),
                 traits::vector_stride(x), traits::vector_storage(y),
                 traits::vector_stride(y), c, s );
@@ -57,14 +62,15 @@
 
 // template function to call rot
 template< typename VectorX, typename VectorY >
-inline integer_t rot( VectorX& x, VectorY& y,
-        typename traits::vector_traits< VectorX >::value_type const c,
-        typename traits::vector_traits< VectorX >::value_type const s ) {
+inline typename rot_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+rot( VectorX& x, VectorY& y, typename traits::vector_traits<
+        VectorX >::value_type const c, typename traits::vector_traits<
+        VectorX >::value_type const s ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     rot_impl< value_type >::compute( x, y, c, s );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotg.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotg.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotg.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,22 +57,25 @@
 
     // templated specialization
     template<  >
-    static return_type compute( traits::complex_d& a, traits::complex_d& b,
-            real_type& c, traits::complex_d& s ) {
+    static return_type compute( value_type& a, value_type& b, real_type& c,
+            value_type& s ) {
+        
         detail::rotg( a, b, c, s );
     }
 };
 
 // template function to call rotg
 template<  >
-inline integer_t rotg( traits::complex_d& a, traits::complex_d& b,
+inline typename rotg_impl< typename traits::TODO_traits<
+        TODO >::value_type >::return_type
+rotg( typename traits::TODO_traits< TODO >::value_type& a,
+        typename traits::TODO_traits< TODO >::value_type& b,
         typename traits::TODO_traits< TODO >::value_type& c,
-        traits::complex_d& s ) {
+        typename traits::TODO_traits< TODO >::value_type& s ) {
     typedef typename traits::TODO_traits< TODO >::value_type value_type;
     rotg_impl< value_type >::compute( a, b, c, s );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotm.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotm.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotm.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -50,6 +52,12 @@
     static return_type compute( integer_t const n, VectorX& x,
             integer_t const incx, VectorY& y, integer_t const incy,
             VectorPARAM& param ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorPARAM >::value_type > );
         detail::rotm( n, traits::vector_storage(x), incx,
                 traits::vector_storage(y), incy,
                 traits::vector_storage(param) );
@@ -58,14 +66,14 @@
 
 // template function to call rotm
 template< typename VectorX, typename VectorY, typename VectorPARAM >
-inline integer_t rotm( integer_t const n, VectorX& x,
-        integer_t const incx, VectorY& y, integer_t const incy,
-        VectorPARAM& param ) {
+inline typename rotm_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+rotm( integer_t const n, VectorX& x, integer_t const incx, VectorY& y,
+        integer_t const incy, VectorPARAM& param ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     rotm_impl< value_type >::compute( n, x, incx, y, incy, param );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotmg.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotmg.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/rotmg.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -49,23 +51,25 @@
     template< typename VectorDPARAM >
     static return_type compute( real_type& d1, real_type& d2, real_type& x1,
             real_type const y1, VectorDPARAM& dparam ) {
+        
         detail::rotmg( d1, d2, x1, y1, traits::vector_storage(dparam) );
     }
 };
 
 // template function to call rotmg
 template< typename VectorDPARAM >
-
-        inline integer_t rotmg( typename traits::vector_traits< VectorDPARAM >::value_type& d1,
+inline typename rotmg_impl< typename traits::vector_traits<
+        VectorDPARAM >::value_type >::return_type
+rotmg( typename traits::vector_traits< VectorDPARAM >::value_type& d1,
         typename traits::vector_traits< VectorDPARAM >::value_type& d2,
         typename traits::vector_traits< VectorDPARAM >::value_type& x1,
         typename traits::vector_traits< VectorDPARAM >::value_type const y1,
         VectorDPARAM& dparam ) {
-    typedef typename traits::vector_traits< VectorDPARAM >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorDPARAM >::value_type value_type;
     rotmg_impl< value_type >::compute( d1, d2, x1, y1, dparam );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/scal.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/scal.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/scal.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,7 +59,8 @@
 
     // templated specialization
     template< typename VectorX >
-    static return_type compute( traits::complex_d const a, VectorX& x ) {
+    static return_type compute( value_type const a, VectorX& x ) {
+        
         detail::scal( traits::vector_size(x), a,
                 traits::vector_storage(x), traits::vector_stride(x) );
     }
@@ -65,12 +68,14 @@
 
 // template function to call scal
 template< typename VectorX >
-inline integer_t scal( traits::complex_d const a, VectorX& x ) {
+inline typename scal_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+scal( typename traits::vector_traits< VectorX >::value_type const a,
+        VectorX& x ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     scal_impl< value_type >::compute( a, x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/sdot.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/sdot.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/sdot.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -45,6 +47,9 @@
     template< typename VectorSX, typename VectorSY >
     static return_type compute( integer_t const n, VectorSX& sx,
             integer_t const incx, VectorSY& sy, integer_t const incy ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorSX >::value_type, typename traits::vector_traits<
+                VectorSY >::value_type > );
         return detail::sdot( n, traits::vector_storage(sx), incx,
                 traits::vector_storage(sy), incy );
     }
@@ -52,13 +57,14 @@
 
 // template function to call sdot
 template< typename VectorSX, typename VectorSY >
-inline integer_t sdot( integer_t const n, VectorSX& sx,
-        integer_t const incx, VectorSY& sy, integer_t const incy ) {
+inline typename sdot_impl< typename traits::vector_traits<
+        VectorSX >::value_type >::return_type
+sdot( integer_t const n, VectorSX& sx, integer_t const incx,
+        VectorSY& sy, integer_t const incy ) {
     typedef typename traits::vector_traits< VectorSX >::value_type value_type;
     return sdot_impl< value_type >::compute( n, sx, incx, sy, incy );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/srot.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/srot.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/srot.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -47,6 +49,9 @@
     template< typename VectorCX, typename VectorCY >
     static return_type compute( integer_t const n, VectorCX& cx, VectorCY& cy,
             real_type const c, real_type const s ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorCX >::value_type, typename traits::vector_traits<
+                VectorCY >::value_type > );
         detail::srot( n, traits::vector_storage(cx),
                 traits::vector_stride(cx), traits::vector_storage(cy),
                 traits::vector_stride(cy), c, s );
@@ -55,14 +60,15 @@
 
 // template function to call srot
 template< typename VectorCX, typename VectorCY >
-inline integer_t srot( integer_t const n, VectorCX& cx, VectorCY& cy,
+inline typename srot_impl< typename traits::vector_traits<
+        VectorCX >::value_type >::return_type
+srot( integer_t const n, VectorCX& cx, VectorCY& cy,
         typename traits::vector_traits< VectorCX >::value_type const c,
         typename traits::vector_traits< VectorCX >::value_type const s ) {
     typedef typename traits::vector_traits< VectorCX >::value_type value_type;
     srot_impl< value_type >::compute( n, cx, cy, c, s );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/swap.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/swap.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level1/swap.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,9 @@
     // templated specialization
     template< typename VectorX, typename VectorY >
     static return_type compute( VectorX& x, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::swap( traits::vector_size(x), traits::vector_storage(x),
                 traits::vector_stride(x), traits::vector_storage(y),
                 traits::vector_stride(y) );
@@ -68,12 +73,13 @@
 
 // template function to call swap
 template< typename VectorX, typename VectorY >
-inline integer_t swap( VectorX& x, VectorY& y ) {
+inline typename swap_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+swap( VectorX& x, VectorY& y ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     swap_impl< value_type >::compute( x, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gbmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gbmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gbmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -74,8 +76,14 @@
     // templated specialization
     template< typename MatrixA, typename VectorX, typename VectorY >
     static return_type compute( char const trans, integer_t const kl,
-            integer_t const ku, traits::complex_d const alpha, MatrixA& a,
-            VectorX& x, traits::complex_d const beta, VectorY& y ) {
+            integer_t const ku, value_type const alpha, MatrixA& a,
+            VectorX& x, value_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::gbmv( trans, traits::matrix_size1(a),
                 traits::matrix_size2(a), kl, ku, alpha,
                 traits::matrix_storage(a), traits::leading_dimension(a),
@@ -86,15 +94,17 @@
 
 // template function to call gbmv
 template< typename MatrixA, typename VectorX, typename VectorY >
-inline integer_t gbmv( char const trans, integer_t const kl,
-        integer_t const ku, traits::complex_d const alpha, MatrixA& a,
-        VectorX& x, traits::complex_d const beta, VectorY& y ) {
+inline typename gbmv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+gbmv( char const trans, integer_t const kl, integer_t const ku,
+        typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, VectorX& x, typename traits::matrix_traits<
+        MatrixA >::value_type const beta, VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     gbmv_impl< value_type >::compute( trans, kl, ku, alpha, a, x, beta,
             y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gemv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gemv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gemv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -71,9 +73,14 @@
 
     // templated specialization
     template< typename MatrixA, typename VectorX, typename VectorY >
-    static return_type compute( char const trans,
-            traits::complex_d const alpha, MatrixA& a, VectorX& x,
-            traits::complex_d const beta, VectorY& y ) {
+    static return_type compute( char const trans, value_type const alpha,
+            MatrixA& a, VectorX& x, value_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::gemv( trans, traits::matrix_size1(a),
                 traits::matrix_size2(a), alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -84,13 +91,16 @@
 
 // template function to call gemv
 template< typename MatrixA, typename VectorX, typename VectorY >
-inline integer_t gemv( char const trans, traits::complex_d const alpha,
-        MatrixA& a, VectorX& x, traits::complex_d const beta, VectorY& y ) {
+inline typename gemv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+gemv( char const trans, typename traits::matrix_traits<
+        MatrixA >::value_type const alpha, MatrixA& a, VectorX& x,
+        typename traits::matrix_traits< MatrixA >::value_type const beta,
+        VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     gemv_impl< value_type >::compute( trans, alpha, a, x, beta, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/ger.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/ger.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/ger.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,6 +53,12 @@
     template< typename VectorX, typename VectorY, typename MatrixA >
     static return_type compute( real_type const alpha, VectorX& x, VectorY& y,
             MatrixA& a ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixA >::value_type > );
         detail::ger( traits::matrix_size1(a), traits::matrix_size2(a),
                 alpha, traits::vector_storage(x), traits::vector_stride(x),
                 traits::vector_storage(y), traits::vector_stride(y),
@@ -60,14 +68,14 @@
 
 // template function to call ger
 template< typename VectorX, typename VectorY, typename MatrixA >
-
-        inline integer_t ger( typename traits::vector_traits< VectorX >::value_type const alpha,
+inline typename ger_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+ger( typename traits::vector_traits< VectorX >::value_type const alpha,
         VectorX& x, VectorY& y, MatrixA& a ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     ger_impl< value_type >::compute( alpha, x, y, a );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gerc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gerc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/gerc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,8 +57,14 @@
 
     // templated specialization
     template< typename VectorX, typename VectorY, typename MatrixA >
-    static return_type compute( traits::complex_d const alpha, VectorX& x,
+    static return_type compute( value_type const alpha, VectorX& x,
             VectorY& y, MatrixA& a ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixA >::value_type > );
         detail::gerc( traits::matrix_size1(a), traits::matrix_size2(a),
                 alpha, traits::vector_storage(x), traits::vector_stride(x),
                 traits::vector_storage(y), traits::vector_stride(y),
@@ -66,13 +74,14 @@
 
 // template function to call gerc
 template< typename VectorX, typename VectorY, typename MatrixA >
-inline integer_t gerc( traits::complex_d const alpha, VectorX& x,
-        VectorY& y, MatrixA& a ) {
+inline typename gerc_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+gerc( typename traits::vector_traits< VectorX >::value_type const alpha,
+        VectorX& x, VectorY& y, MatrixA& a ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     gerc_impl< value_type >::compute( alpha, x, y, a );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/geru.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/geru.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/geru.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,8 +57,14 @@
 
     // templated specialization
     template< typename VectorX, typename VectorY, typename MatrixA >
-    static return_type compute( traits::complex_d const alpha, VectorX& x,
+    static return_type compute( value_type const alpha, VectorX& x,
             VectorY& y, MatrixA& a ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixA >::value_type > );
         detail::geru( traits::matrix_size1(a), traits::matrix_size2(a),
                 alpha, traits::vector_storage(x), traits::vector_stride(x),
                 traits::vector_storage(y), traits::vector_stride(y),
@@ -66,13 +74,14 @@
 
 // template function to call geru
 template< typename VectorX, typename VectorY, typename MatrixA >
-inline integer_t geru( traits::complex_d const alpha, VectorX& x,
-        VectorY& y, MatrixA& a ) {
+inline typename geru_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+geru( typename traits::vector_traits< VectorX >::value_type const alpha,
+        VectorX& x, VectorY& y, MatrixA& a ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     geru_impl< value_type >::compute( alpha, x, y, a );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hbmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hbmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hbmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,9 +59,14 @@
 
     // templated specialization
     template< typename MatrixA, typename VectorX, typename VectorY >
-    static return_type compute( integer_t const k,
-            traits::complex_d const alpha, MatrixA& a, VectorX& x,
-            traits::complex_d const beta, VectorY& y ) {
+    static return_type compute( integer_t const k, value_type const alpha,
+            MatrixA& a, VectorX& x, value_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::hbmv( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), k, alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -70,13 +77,16 @@
 
 // template function to call hbmv
 template< typename MatrixA, typename VectorX, typename VectorY >
-inline integer_t hbmv( integer_t const k, traits::complex_d const alpha,
-        MatrixA& a, VectorX& x, traits::complex_d const beta, VectorY& y ) {
+inline typename hbmv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+hbmv( integer_t const k, typename traits::matrix_traits<
+        MatrixA >::value_type const alpha, MatrixA& a, VectorX& x,
+        typename traits::matrix_traits< MatrixA >::value_type const beta,
+        VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     hbmv_impl< value_type >::compute( k, alpha, a, x, beta, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hemv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hemv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hemv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,8 +59,14 @@
 
     // templated specialization
     template< typename MatrixA, typename VectorX, typename VectorY >
-    static return_type compute( traits::complex_d const alpha, MatrixA& a,
-            VectorX& x, traits::complex_d const beta, VectorY& y ) {
+    static return_type compute( value_type const alpha, MatrixA& a,
+            VectorX& x, value_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::hemv( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -69,13 +77,15 @@
 
 // template function to call hemv
 template< typename MatrixA, typename VectorX, typename VectorY >
-inline integer_t hemv( traits::complex_d const alpha, MatrixA& a,
-        VectorX& x, traits::complex_d const beta, VectorY& y ) {
+inline typename hemv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+hemv( typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, VectorX& x, typename traits::matrix_traits<
+        MatrixA >::value_type const beta, VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     hemv_impl< value_type >::compute( alpha, a, x, beta, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,6 +55,9 @@
     template< typename VectorX, typename MatrixA >
     static return_type compute( real_type const alpha, VectorX& x,
             MatrixA& a ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixA >::value_type > );
         detail::her( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::matrix_storage(a),
@@ -62,14 +67,14 @@
 
 // template function to call her
 template< typename VectorX, typename MatrixA >
-
-        inline integer_t her( typename traits::vector_traits< VectorX >::value_type const alpha,
+inline typename her_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+her( typename traits::vector_traits< VectorX >::value_type const alpha,
         VectorX& x, MatrixA& a ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     her_impl< value_type >::compute( alpha, x, a );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her2.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her2.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/her2.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,8 +57,14 @@
 
     // templated specialization
     template< typename VectorX, typename VectorY, typename MatrixA >
-    static return_type compute( traits::complex_d const alpha, VectorX& x,
+    static return_type compute( value_type const alpha, VectorX& x,
             VectorY& y, MatrixA& a ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixA >::value_type > );
         detail::her2( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::vector_storage(y),
@@ -67,13 +75,14 @@
 
 // template function to call her2
 template< typename VectorX, typename VectorY, typename MatrixA >
-inline integer_t her2( traits::complex_d const alpha, VectorX& x,
-        VectorY& y, MatrixA& a ) {
+inline typename her2_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+her2( typename traits::vector_traits< VectorX >::value_type const alpha,
+        VectorX& x, VectorY& y, MatrixA& a ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     her2_impl< value_type >::compute( alpha, x, y, a );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,8 +59,14 @@
 
     // templated specialization
     template< typename MatrixAP, typename VectorX, typename VectorY >
-    static return_type compute( traits::complex_d const alpha, MatrixAP& ap,
-            VectorX& x, traits::complex_d const beta, VectorY& y ) {
+    static return_type compute( value_type const alpha, MatrixAP& ap,
+            VectorX& x, value_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::hpmv( traits::matrix_uplo_tag(ap),
                 traits::matrix_size2(ap), alpha, traits::matrix_storage(ap),
                 traits::vector_storage(x), traits::vector_stride(x), beta,
@@ -68,13 +76,16 @@
 
 // template function to call hpmv
 template< typename MatrixAP, typename VectorX, typename VectorY >
-inline integer_t hpmv( traits::complex_d const alpha, MatrixAP& ap,
-        VectorX& x, traits::complex_d const beta, VectorY& y ) {
+inline typename hpmv_impl< typename traits::matrix_traits<
+        MatrixAP >::value_type >::return_type
+hpmv( typename traits::matrix_traits<
+        MatrixAP >::value_type const alpha, MatrixAP& ap, VectorX& x,
+        typename traits::matrix_traits< MatrixAP >::value_type const beta,
+        VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixAP >::value_type value_type;
     hpmv_impl< value_type >::compute( alpha, ap, x, beta, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,6 +55,9 @@
     template< typename VectorX, typename MatrixAP >
     static return_type compute( real_type const alpha, VectorX& x,
             MatrixAP& ap ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixAP >::value_type > );
         detail::hpr( traits::matrix_uplo_tag(ap),
                 traits::matrix_size2(ap), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::matrix_storage(ap) );
@@ -61,14 +66,14 @@
 
 // template function to call hpr
 template< typename VectorX, typename MatrixAP >
-
-        inline integer_t hpr( typename traits::vector_traits< VectorX >::value_type const alpha,
+inline typename hpr_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+hpr( typename traits::vector_traits< VectorX >::value_type const alpha,
         VectorX& x, MatrixAP& ap ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     hpr_impl< value_type >::compute( alpha, x, ap );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr2.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr2.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/hpr2.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,8 +57,14 @@
 
     // templated specialization
     template< typename VectorX, typename VectorY, typename MatrixAP >
-    static return_type compute( traits::complex_d const alpha, VectorX& x,
+    static return_type compute( value_type const alpha, VectorX& x,
             VectorY& y, MatrixAP& ap ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixAP >::value_type > );
         detail::hpr2( traits::matrix_uplo_tag(ap),
                 traits::matrix_size2(ap), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::vector_storage(y),
@@ -66,13 +74,14 @@
 
 // template function to call hpr2
 template< typename VectorX, typename VectorY, typename MatrixAP >
-inline integer_t hpr2( traits::complex_d const alpha, VectorX& x,
-        VectorY& y, MatrixAP& ap ) {
+inline typename hpr2_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+hpr2( typename traits::vector_traits< VectorX >::value_type const alpha,
+        VectorX& x, VectorY& y, MatrixAP& ap ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     hpr2_impl< value_type >::compute( alpha, x, y, ap );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/sbmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/sbmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/sbmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,12 @@
     template< typename MatrixA, typename VectorX, typename VectorY >
     static return_type compute( integer_t const k, real_type const alpha,
             MatrixA& a, VectorX& x, real_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::sbmv( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), k, alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -65,16 +73,16 @@
 
 // template function to call sbmv
 template< typename MatrixA, typename VectorX, typename VectorY >
-inline integer_t sbmv( integer_t const k,
-        typename traits::matrix_traits< MatrixA >::value_type const alpha,
-        MatrixA& a, VectorX& x,
+inline typename sbmv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+sbmv( integer_t const k, typename traits::matrix_traits<
+        MatrixA >::value_type const alpha, MatrixA& a, VectorX& x,
         typename traits::matrix_traits< MatrixA >::value_type const beta,
         VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     sbmv_impl< value_type >::compute( k, alpha, a, x, beta, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,6 +53,12 @@
     template< typename MatrixAP, typename VectorX, typename VectorY >
     static return_type compute( real_type const alpha, MatrixAP& ap,
             VectorX& x, real_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::spmv( traits::matrix_uplo_tag(ap),
                 traits::matrix_size2(ap), alpha, traits::matrix_storage(ap),
                 traits::vector_storage(x), traits::vector_stride(x), beta,
@@ -60,16 +68,16 @@
 
 // template function to call spmv
 template< typename MatrixAP, typename VectorX, typename VectorY >
-
-        inline integer_t spmv( typename traits::matrix_traits< MatrixAP >::value_type const alpha,
-        MatrixAP& ap, VectorX& x,
+inline typename spmv_impl< typename traits::matrix_traits<
+        MatrixAP >::value_type >::return_type
+spmv( typename traits::matrix_traits<
+        MatrixAP >::value_type const alpha, MatrixAP& ap, VectorX& x,
         typename traits::matrix_traits< MatrixAP >::value_type const beta,
         VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixAP >::value_type value_type;
     spmv_impl< value_type >::compute( alpha, ap, x, beta, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -49,6 +51,9 @@
     template< typename VectorX, typename MatrixAP >
     static return_type compute( real_type const alpha, VectorX& x,
             MatrixAP& ap ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixAP >::value_type > );
         detail::spr( traits::matrix_uplo_tag(ap),
                 traits::matrix_size2(ap), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::matrix_storage(ap) );
@@ -57,14 +62,14 @@
 
 // template function to call spr
 template< typename VectorX, typename MatrixAP >
-
-        inline integer_t spr( typename traits::vector_traits< VectorX >::value_type const alpha,
+inline typename spr_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+spr( typename traits::vector_traits< VectorX >::value_type const alpha,
         VectorX& x, MatrixAP& ap ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     spr_impl< value_type >::compute( alpha, x, ap );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr2.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr2.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/spr2.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,6 +53,12 @@
     template< typename VectorX, typename VectorY, typename MatrixAP >
     static return_type compute( real_type const alpha, VectorX& x, VectorY& y,
             MatrixAP& ap ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixAP >::value_type > );
         detail::spr2( traits::matrix_uplo_tag(ap),
                 traits::matrix_size2(ap), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::vector_storage(y),
@@ -60,14 +68,14 @@
 
 // template function to call spr2
 template< typename VectorX, typename VectorY, typename MatrixAP >
-
-        inline integer_t spr2( typename traits::vector_traits< VectorX >::value_type const alpha,
+inline typename spr2_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+spr2( typename traits::vector_traits< VectorX >::value_type const alpha,
         VectorX& x, VectorY& y, MatrixAP& ap ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     spr2_impl< value_type >::compute( alpha, x, y, ap );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/symv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/symv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/symv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,6 +53,12 @@
     template< typename MatrixA, typename VectorX, typename VectorY >
     static return_type compute( real_type const alpha, MatrixA& a, VectorX& x,
             real_type const beta, VectorY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
         detail::symv( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -61,16 +69,15 @@
 
 // template function to call symv
 template< typename MatrixA, typename VectorX, typename VectorY >
-
-        inline integer_t symv( typename traits::matrix_traits< MatrixA >::value_type const alpha,
-        MatrixA& a, VectorX& x,
-        typename traits::matrix_traits< MatrixA >::value_type const beta,
-        VectorY& y ) {
+inline typename symv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+symv( typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, VectorX& x, typename traits::matrix_traits<
+        MatrixA >::value_type const beta, VectorY& y ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     symv_impl< value_type >::compute( alpha, a, x, beta, y );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -49,6 +51,9 @@
     template< typename VectorX, typename MatrixA >
     static return_type compute( real_type const alpha, VectorX& x,
             MatrixA& a ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixA >::value_type > );
         detail::syr( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::matrix_storage(a),
@@ -58,14 +63,14 @@
 
 // template function to call syr
 template< typename VectorX, typename MatrixA >
-
-        inline integer_t syr( typename traits::vector_traits< VectorX >::value_type const alpha,
+inline typename syr_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+syr( typename traits::vector_traits< VectorX >::value_type const alpha,
         VectorX& x, MatrixA& a ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     syr_impl< value_type >::compute( alpha, x, a );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr2.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr2.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/syr2.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,6 +53,12 @@
     template< typename VectorX, typename VectorY, typename MatrixA >
     static return_type compute( real_type const alpha, VectorX& x, VectorY& y,
             MatrixA& a ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::matrix_traits<
+                MatrixA >::value_type > );
         detail::syr2( traits::matrix_uplo_tag(a),
                 traits::matrix_size2(a), alpha, traits::vector_storage(x),
                 traits::vector_stride(x), traits::vector_storage(y),
@@ -61,14 +69,14 @@
 
 // template function to call syr2
 template< typename VectorX, typename VectorY, typename MatrixA >
-
-        inline integer_t syr2( typename traits::vector_traits< VectorX >::value_type const alpha,
+inline typename syr2_impl< typename traits::vector_traits<
+        VectorX >::value_type >::return_type
+syr2( typename traits::vector_traits< VectorX >::value_type const alpha,
         VectorX& x, VectorY& y, MatrixA& a ) {
     typedef typename traits::vector_traits< VectorX >::value_type value_type;
     syr2_impl< value_type >::compute( alpha, x, y, a );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixA, typename VectorX >
     static return_type compute( char const trans, char const diag,
             integer_t const k, MatrixA& a, VectorX& x ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
         detail::tbmv( traits::matrix_uplo_tag(a), trans, diag,
                 traits::matrix_size2(a), k, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -72,13 +77,14 @@
 
 // template function to call tbmv
 template< typename MatrixA, typename VectorX >
-inline integer_t tbmv( char const trans, char const diag,
-        integer_t const k, MatrixA& a, VectorX& x ) {
+inline typename tbmv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+tbmv( char const trans, char const diag, integer_t const k, MatrixA& a,
+        VectorX& x ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     tbmv_impl< value_type >::compute( trans, diag, k, a, x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tbsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixA, typename VectorX >
     static return_type compute( char const trans, char const diag,
             integer_t const k, MatrixA& a, VectorX& x ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
         detail::tbsv( traits::matrix_uplo_tag(a), trans, diag,
                 traits::matrix_size2(a), k, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -72,13 +77,14 @@
 
 // template function to call tbsv
 template< typename MatrixA, typename VectorX >
-inline integer_t tbsv( char const trans, char const diag,
-        integer_t const k, MatrixA& a, VectorX& x ) {
+inline typename tbsv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+tbsv( char const trans, char const diag, integer_t const k, MatrixA& a,
+        VectorX& x ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     tbsv_impl< value_type >::compute( trans, diag, k, a, x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     template< typename MatrixAP, typename VectorX >
     static return_type compute( char const trans, char const diag,
             MatrixAP& ap, VectorX& x ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
         detail::tpmv( traits::matrix_uplo_tag(ap), trans, diag,
                 traits::matrix_size2(ap), traits::matrix_storage(ap),
                 traits::vector_storage(x), traits::vector_stride(x) );
@@ -69,13 +74,13 @@
 
 // template function to call tpmv
 template< typename MatrixAP, typename VectorX >
-inline integer_t tpmv( char const trans, char const diag, MatrixAP& ap,
-        VectorX& x ) {
+inline typename tpmv_impl< typename traits::matrix_traits<
+        MatrixAP >::value_type >::return_type
+tpmv( char const trans, char const diag, MatrixAP& ap, VectorX& x ) {
     typedef typename traits::matrix_traits< MatrixAP >::value_type value_type;
     tpmv_impl< value_type >::compute( trans, diag, ap, x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/tpsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     template< typename MatrixAP, typename VectorX >
     static return_type compute( char const trans, char const diag,
             MatrixAP& ap, VectorX& x ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
         detail::tpsv( traits::matrix_uplo_tag(ap), trans, diag,
                 traits::matrix_size2(ap), traits::matrix_storage(ap),
                 traits::vector_storage(x), traits::vector_stride(x) );
@@ -69,13 +74,13 @@
 
 // template function to call tpsv
 template< typename MatrixAP, typename VectorX >
-inline integer_t tpsv( char const trans, char const diag, MatrixAP& ap,
-        VectorX& x ) {
+inline typename tpsv_impl< typename traits::matrix_traits<
+        MatrixAP >::value_type >::return_type
+tpsv( char const trans, char const diag, MatrixAP& ap, VectorX& x ) {
     typedef typename traits::matrix_traits< MatrixAP >::value_type value_type;
     tpsv_impl< value_type >::compute( trans, diag, ap, x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trmv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trmv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trmv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixA, typename VectorX >
     static return_type compute( char const trans, char const diag, MatrixA& a,
             VectorX& x ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
         detail::trmv( traits::matrix_uplo_tag(a), trans, diag,
                 traits::matrix_size2(a), traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -72,13 +77,13 @@
 
 // template function to call trmv
 template< typename MatrixA, typename VectorX >
-inline integer_t trmv( char const trans, char const diag, MatrixA& a,
-        VectorX& x ) {
+inline typename trmv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+trmv( char const trans, char const diag, MatrixA& a, VectorX& x ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     trmv_impl< value_type >::compute( trans, diag, a, x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level2/trsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixA, typename VectorX >
     static return_type compute( char const trans, char const diag, MatrixA& a,
             VectorX& x ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
         detail::trsv( traits::matrix_uplo_tag(a), trans, diag,
                 traits::matrix_size2(a), traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::vector_storage(x),
@@ -72,13 +77,13 @@
 
 // template function to call trsv
 template< typename MatrixA, typename VectorX >
-inline integer_t trsv( char const trans, char const diag, MatrixA& a,
-        VectorX& x ) {
+inline typename trsv_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+trsv( char const trans, char const diag, MatrixA& a, VectorX& x ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     trsv_impl< value_type >::compute( trans, diag, a, x );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/gemm.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/gemm.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/gemm.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -74,9 +76,14 @@
     // templated specialization
     template< typename MatrixA, typename MatrixB, typename MatrixC >
     static return_type compute( char const transa, char const transb,
-            integer_t const m, integer_t const k,
-            traits::complex_d const alpha, MatrixA& a, MatrixB& b,
-            traits::complex_d const beta, MatrixC& c ) {
+            integer_t const m, integer_t const k, value_type const alpha,
+            MatrixA& a, MatrixB& b, value_type const beta, MatrixC& c ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
         detail::gemm( transa, transb, m, traits::matrix_size2(c), k,
                 alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::matrix_storage(b),
@@ -87,15 +94,18 @@
 
 // template function to call gemm
 template< typename MatrixA, typename MatrixB, typename MatrixC >
-inline integer_t gemm( char const transa, char const transb,
-        integer_t const m, integer_t const k, traits::complex_d const alpha,
-        MatrixA& a, MatrixB& b, traits::complex_d const beta, MatrixC& c ) {
+inline typename gemm_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+gemm( char const transa, char const transb, integer_t const m,
+        integer_t const k, typename traits::matrix_traits<
+        MatrixA >::value_type const alpha, MatrixA& a, MatrixB& b,
+        typename traits::matrix_traits< MatrixA >::value_type const beta,
+        MatrixC& c ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     gemm_impl< value_type >::compute( transa, transb, m, k, alpha, a, b,
             beta, c );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/hemm.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/hemm.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/hemm.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,9 +59,14 @@
 
     // templated specialization
     template< typename MatrixA, typename MatrixB, typename MatrixC >
-    static return_type compute( char const side,
-            traits::complex_d const alpha, MatrixA& a, MatrixB& b,
-            traits::complex_d const beta, MatrixC& c ) {
+    static return_type compute( char const side, value_type const alpha,
+            MatrixA& a, MatrixB& b, value_type const beta, MatrixC& c ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
         detail::hemm( side, traits::matrix_uplo_tag(a),
                 traits::matrix_size1(c), traits::matrix_size2(c), alpha,
                 traits::matrix_storage(a), traits::leading_dimension(a),
@@ -70,13 +77,16 @@
 
 // template function to call hemm
 template< typename MatrixA, typename MatrixB, typename MatrixC >
-inline integer_t hemm( char const side, traits::complex_d const alpha,
-        MatrixA& a, MatrixB& b, traits::complex_d const beta, MatrixC& c ) {
+inline typename hemm_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+hemm( char const side, typename traits::matrix_traits<
+        MatrixA >::value_type const alpha, MatrixA& a, MatrixB& b,
+        typename traits::matrix_traits< MatrixA >::value_type const beta,
+        MatrixC& c ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     hemm_impl< value_type >::compute( side, alpha, a, b, beta, c );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/her2k.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/her2k.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/her2k.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -58,8 +60,14 @@
     // templated specialization
     template< typename MatrixA, typename MatrixB, typename MatrixC >
     static return_type compute( char const trans, integer_t const k,
-            traits::complex_d const alpha, MatrixA& a, MatrixB& b,
+            value_type const alpha, MatrixA& a, MatrixB& b,
             real_type const beta, MatrixC& c ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
         detail::her2k( traits::matrix_uplo_tag(c), trans,
                 traits::matrix_size2(c), k, alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::matrix_storage(b),
@@ -70,15 +78,16 @@
 
 // template function to call her2k
 template< typename MatrixA, typename MatrixB, typename MatrixC >
-inline integer_t her2k( char const trans, integer_t const k,
-        traits::complex_d const alpha, MatrixA& a, MatrixB& b,
-        typename traits::matrix_traits< MatrixA >::value_type const beta,
-        MatrixC& c ) {
+inline typename her2k_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+her2k( char const trans, integer_t const k,
+        typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, MatrixB& b, typename traits::matrix_traits<
+        MatrixA >::value_type const beta, MatrixC& c ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     her2k_impl< value_type >::compute( trans, k, alpha, a, b, beta, c );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/herk.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/herk.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/herk.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -56,6 +58,9 @@
     static return_type compute( char const trans, integer_t const k,
             real_type const alpha, MatrixA& a, real_type const beta,
             MatrixC& c ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
         detail::herk( traits::matrix_uplo_tag(c), trans,
                 traits::matrix_size2(c), k, alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), beta, traits::matrix_storage(c),
@@ -65,16 +70,16 @@
 
 // template function to call herk
 template< typename MatrixA, typename MatrixC >
-inline integer_t herk( char const trans, integer_t const k,
+inline typename herk_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+herk( char const trans, integer_t const k,
         typename traits::matrix_traits< MatrixA >::value_type const alpha,
-        MatrixA& a,
-        typename traits::matrix_traits< MatrixA >::value_type const beta,
-        MatrixC& c ) {
+        MatrixA& a, typename traits::matrix_traits<
+        MatrixA >::value_type const beta, MatrixC& c ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     herk_impl< value_type >::compute( trans, k, alpha, a, beta, c );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/symm.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/symm.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/symm.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -71,9 +73,14 @@
 
     // templated specialization
     template< typename MatrixA, typename MatrixB, typename MatrixC >
-    static return_type compute( char const side,
-            traits::complex_d const alpha, MatrixA& a, MatrixB& b,
-            traits::complex_d const beta, MatrixC& c ) {
+    static return_type compute( char const side, value_type const alpha,
+            MatrixA& a, MatrixB& b, value_type const beta, MatrixC& c ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
         detail::symm( side, traits::matrix_uplo_tag(a),
                 traits::matrix_size1(c), traits::matrix_size2(c), alpha,
                 traits::matrix_storage(a), traits::leading_dimension(a),
@@ -84,13 +91,16 @@
 
 // template function to call symm
 template< typename MatrixA, typename MatrixB, typename MatrixC >
-inline integer_t symm( char const side, traits::complex_d const alpha,
-        MatrixA& a, MatrixB& b, traits::complex_d const beta, MatrixC& c ) {
+inline typename symm_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+symm( char const side, typename traits::matrix_traits<
+        MatrixA >::value_type const alpha, MatrixA& a, MatrixB& b,
+        typename traits::matrix_traits< MatrixA >::value_type const beta,
+        MatrixC& c ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     symm_impl< value_type >::compute( side, alpha, a, b, beta, c );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syr2k.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syr2k.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syr2k.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -72,8 +74,14 @@
     // templated specialization
     template< typename MatrixA, typename MatrixB, typename MatrixC >
     static return_type compute( char const trans, integer_t const k,
-            traits::complex_d const alpha, MatrixA& a, MatrixB& b,
-            traits::complex_d const beta, MatrixC& c ) {
+            value_type const alpha, MatrixA& a, MatrixB& b,
+            value_type const beta, MatrixC& c ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
         detail::syr2k( traits::matrix_uplo_tag(c), trans,
                 traits::matrix_size2(c), k, alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), traits::matrix_storage(b),
@@ -84,14 +92,16 @@
 
 // template function to call syr2k
 template< typename MatrixA, typename MatrixB, typename MatrixC >
-inline integer_t syr2k( char const trans, integer_t const k,
-        traits::complex_d const alpha, MatrixA& a, MatrixB& b,
-        traits::complex_d const beta, MatrixC& c ) {
+inline typename syr2k_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+syr2k( char const trans, integer_t const k,
+        typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, MatrixB& b, typename traits::matrix_traits<
+        MatrixA >::value_type const beta, MatrixC& c ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     syr2k_impl< value_type >::compute( trans, k, alpha, a, b, beta, c );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syrk.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syrk.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/syrk.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -70,8 +72,11 @@
     // templated specialization
     template< typename MatrixA, typename MatrixC >
     static return_type compute( char const trans, integer_t const k,
-            traits::complex_d const alpha, MatrixA& a,
-            traits::complex_d const beta, MatrixC& c ) {
+            value_type const alpha, MatrixA& a, value_type const beta,
+            MatrixC& c ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
         detail::syrk( traits::matrix_uplo_tag(c), trans,
                 traits::matrix_size2(c), k, alpha, traits::matrix_storage(a),
                 traits::leading_dimension(a), beta, traits::matrix_storage(c),
@@ -81,14 +86,16 @@
 
 // template function to call syrk
 template< typename MatrixA, typename MatrixC >
-inline integer_t syrk( char const trans, integer_t const k,
-        traits::complex_d const alpha, MatrixA& a,
-        traits::complex_d const beta, MatrixC& c ) {
+inline typename syrk_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+syrk( char const trans, integer_t const k,
+        typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, typename traits::matrix_traits<
+        MatrixA >::value_type const beta, MatrixC& c ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     syrk_impl< value_type >::compute( trans, k, alpha, a, beta, c );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trmm.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trmm.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trmm.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -70,8 +72,10 @@
     // templated specialization
     template< typename MatrixA, typename MatrixB >
     static return_type compute( char const side, char const transa,
-            char const diag, traits::complex_d const alpha, MatrixA& a,
-            MatrixB& b ) {
+            char const diag, value_type const alpha, MatrixA& a, MatrixB& b ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
         detail::trmm( side, traits::matrix_uplo_tag(a), transa, diag,
                 traits::matrix_size1(b), traits::matrix_size2(b), alpha,
                 traits::matrix_storage(a), traits::leading_dimension(a),
@@ -81,14 +85,15 @@
 
 // template function to call trmm
 template< typename MatrixA, typename MatrixB >
-inline integer_t trmm( char const side, char const transa,
-        char const diag, traits::complex_d const alpha, MatrixA& a,
-        MatrixB& b ) {
+inline typename trmm_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+trmm( char const side, char const transa, char const diag,
+        typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, MatrixB& b ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     trmm_impl< value_type >::compute( side, transa, diag, alpha, a, b );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trsm.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trsm.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/blas/level3/trsm.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/blas/blas.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -70,8 +72,10 @@
     // templated specialization
     template< typename MatrixA, typename MatrixB >
     static return_type compute( char const side, char const transa,
-            char const diag, traits::complex_d const alpha, MatrixA& a,
-            MatrixB& b ) {
+            char const diag, value_type const alpha, MatrixA& a, MatrixB& b ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
         detail::trsm( side, traits::matrix_uplo_tag(a), transa, diag,
                 traits::matrix_size1(b), traits::matrix_size2(b), alpha,
                 traits::matrix_storage(a), traits::leading_dimension(a),
@@ -81,14 +85,15 @@
 
 // template function to call trsm
 template< typename MatrixA, typename MatrixB >
-inline integer_t trsm( char const side, char const transa,
-        char const diag, traits::complex_d const alpha, MatrixA& a,
-        MatrixB& b ) {
+inline typename trsm_impl< typename traits::matrix_traits<
+        MatrixA >::value_type >::return_type
+trsm( char const side, char const transa, char const diag,
+        typename traits::matrix_traits< MatrixA >::value_type const alpha,
+        MatrixA& a, MatrixB& b ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     trsm_impl< value_type >::compute( side, transa, diag, alpha, a, b );
 }
 
-
 }}}} // namespace boost::numeric::bindings::blas
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsdc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsdc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsdc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,18 @@
             VectorD& d, VectorE& e, MatrixU& u, MatrixVT& vt, VectorQ& q,
             VectorIQ& iq, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixVT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorQ >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( compq == 'N' || compq == 'P' || compq == 'I' );
@@ -131,7 +145,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/bdsqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -86,6 +88,18 @@
     static void compute( char const uplo, integer_t const n, VectorD& d,
             VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixVT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -150,6 +164,15 @@
     static void compute( char const uplo, integer_t const n, VectorD& d,
             VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, integer_t& info,
             detail::workspace1< RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixVT >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixVT >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -215,7 +238,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbbrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbbrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbbrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,21 @@
             integer_t const n, integer_t const kl, integer_t const ku,
             MatrixAB& ab, VectorD& d, VectorE& e, MatrixQ& q, MatrixPT& pt,
             MatrixC& c, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixPT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'N' || vect == 'Q' || vect == 'P' || vect == 'B' );
         assert( m >= 0 );
@@ -158,6 +175,18 @@
             MatrixAB& ab, VectorD& d, VectorE& e, MatrixQ& q, MatrixPT& pt,
             MatrixC& c, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixPT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'N' || vect == 'Q' || vect == 'P' || vect == 'B' );
         assert( m >= 0 );
@@ -232,7 +261,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbcon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbcon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbcon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -83,6 +85,7 @@
             integer_t const kl, integer_t const ku, MatrixAB& ab,
             VectorIPIV& ipiv, real_type const anorm, real_type& rcond,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( n >= 0 );
@@ -147,6 +150,7 @@
             integer_t const kl, integer_t const ku, MatrixAB& ab,
             VectorIPIV& ipiv, real_type const anorm, real_type& rcond,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( n >= 0 );
@@ -202,10 +206,9 @@
 template< typename MatrixAB, typename VectorIPIV, typename Workspace >
 inline integer_t gbcon( char const norm, integer_t const n,
         integer_t const kl, integer_t const ku, MatrixAB& ab,
-        VectorIPIV& ipiv,
-        typename traits::matrix_traits< MatrixAB >::value_type const anorm,
-        typename traits::matrix_traits< MatrixAB >::value_type& rcond,
-        Workspace work = optimal_workspace() ) {
+        VectorIPIV& ipiv, typename traits::matrix_traits<
+        MatrixAB >::value_type const anorm, typename traits::matrix_traits<
+        MatrixAB >::value_type& rcond, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixAB >::value_type value_type;
     integer_t info(0);
     gbcon_impl< value_type >::compute( norm, n, kl, ku, ab, ipiv, anorm,
@@ -213,7 +216,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbequ.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbequ.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbequ.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_GBEQU_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,8 +64,44 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct gbequ_impl{};
+
+// real specialization
+template< typename ValueType >
+struct gbequ_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename MatrixAB, typename VectorR, typename VectorC >
+    static void compute( integer_t const m, integer_t const n,
+            integer_t const kl, integer_t const ku, MatrixAB& ab, VectorR& r,
+            VectorC& c, real_type& rowcnd, real_type& colcnd, real_type& amax,
+            integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+#ifndef NDEBUG
+        assert( m >= 0 );
+        assert( n >= 0 );
+        assert( kl >= 0 );
+        assert( ku >= 0 );
+        assert( traits::leading_dimension(ab) >= kl+ku+1 );
+#endif
+        detail::gbequ( m, n, kl, ku, traits::matrix_storage(ab),
+                traits::leading_dimension(ab), traits::vector_storage(r),
+                traits::vector_storage(c), rowcnd, colcnd, amax, info );
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct gbequ_impl {
+struct gbequ_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -71,6 +112,9 @@
             integer_t const kl, integer_t const ku, MatrixAB& ab, VectorR& r,
             VectorC& c, real_type& rowcnd, real_type& colcnd, real_type& amax,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= 0 );
@@ -89,10 +133,10 @@
 template< typename MatrixAB, typename VectorR, typename VectorC >
 inline integer_t gbequ( integer_t const m, integer_t const n,
         integer_t const kl, integer_t const ku, MatrixAB& ab, VectorR& r,
-        VectorC& c,
-        typename traits::matrix_traits< MatrixAB >::value_type& rowcnd,
-        typename traits::matrix_traits< MatrixAB >::value_type& colcnd,
-        typename traits::matrix_traits< MatrixAB >::value_type& amax ) {
+        VectorC& c, typename traits::matrix_traits<
+        MatrixAB >::value_type& rowcnd, typename traits::matrix_traits<
+        MatrixAB >::value_type& colcnd, typename traits::matrix_traits<
+        MatrixAB >::value_type& amax ) {
     typedef typename traits::matrix_traits< MatrixAB >::value_type value_type;
     integer_t info(0);
     gbequ_impl< value_type >::compute( m, n, kl, ku, ab, r, c, rowcnd,
@@ -100,7 +144,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbrfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbrfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbrfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -97,6 +99,21 @@
             MatrixAFB& afb, VectorIPIV& ipiv, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( n >= 0 );
@@ -178,6 +195,18 @@
             MatrixAFB& afb, VectorIPIV& ipiv, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( n >= 0 );
@@ -259,7 +288,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,7 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const kl, integer_t const ku, MatrixAB& ab,
             VectorIPIV& ipiv, integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= 0 );
@@ -90,7 +93,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gbtrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -70,6 +72,9 @@
     static void compute( char const trans, integer_t const n,
             integer_t const kl, integer_t const ku, MatrixAB& ab,
             VectorIPIV& ipiv, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( n >= 0 );
@@ -100,7 +105,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebak.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebak.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebak.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_GEBAK_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,8 +64,43 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct gebak_impl{};
+
+// real specialization
+template< typename ValueType >
+struct gebak_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename VectorSCALE, typename MatrixV >
+    static void compute( char const job, char const side, integer_t const ilo,
+            integer_t const ihi, VectorSCALE& scale, MatrixV& v,
+            integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorSCALE >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+#ifndef NDEBUG
+        assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
+        assert( side == 'R' || side == 'L' );
+        assert( traits::matrix_size1(v) >= 0 );
+        assert( traits::vector_size(scale) >= traits::matrix_size1(v) );
+        assert( traits::matrix_size2(v) >= 0 );
+        assert( traits::leading_dimension(v) >= std::max(1,
+                traits::matrix_size1(v)) );
+#endif
+        detail::gebak( job, side, traits::matrix_size1(v), ilo, ihi,
+                traits::vector_storage(scale), traits::matrix_size2(v),
+                traits::matrix_storage(v), traits::leading_dimension(v),
+                info );
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct gebak_impl {
+struct gebak_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -70,6 +110,7 @@
     static void compute( char const job, char const side, integer_t const ilo,
             integer_t const ihi, VectorSCALE& scale, MatrixV& v,
             integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
         assert( side == 'R' || side == 'L' );
@@ -92,14 +133,14 @@
 inline integer_t gebak( char const job, char const side,
         integer_t const ilo, integer_t const ihi, VectorSCALE& scale,
         MatrixV& v ) {
-    typedef typename traits::vector_traits< VectorSCALE >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSCALE >::value_type value_type;
     integer_t info(0);
     gebak_impl< value_type >::compute( job, side, ilo, ihi, scale, v,
             info );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebal.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebal.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebal.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_GEBAL_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,8 +58,12 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct gebal_impl{};
+
+// real specialization
 template< typename ValueType >
-struct gebal_impl {
+struct gebal_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -63,6 +72,33 @@
     template< typename MatrixA, typename VectorSCALE >
     static void compute( char const job, MatrixA& a, integer_t& ilo,
             integer_t& ihi, VectorSCALE& scale, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorSCALE >::value_type > );
+#ifndef NDEBUG
+        assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
+        assert( traits::matrix_size2(a) >= 0 );
+        assert( traits::leading_dimension(a) >= std::max(1,
+                traits::matrix_size2(a)) );
+#endif
+        detail::gebal( job, traits::matrix_size2(a),
+                traits::matrix_storage(a), traits::leading_dimension(a), ilo,
+                ihi, traits::vector_storage(scale), info );
+    }
+};
+
+// complex specialization
+template< typename ValueType >
+struct gebal_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename MatrixA, typename VectorSCALE >
+    static void compute( char const job, MatrixA& a, integer_t& ilo,
+            integer_t& ihi, VectorSCALE& scale, integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -86,7 +122,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gebrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -80,8 +82,20 @@
     template< typename MatrixA, typename VectorD, typename VectorE,
             typename VectorTAUQ, typename VectorTAUP, typename WORK >
     static void compute( MatrixA& a, VectorD& d, VectorE& e, VectorTAUQ& tauq,
-            VectorTAUP& taup, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAUP& taup, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUP >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -146,8 +160,17 @@
     template< typename MatrixA, typename VectorD, typename VectorE,
             typename VectorTAUQ, typename VectorTAUP, typename WORK >
     static void compute( MatrixA& a, VectorD& d, VectorE& e, VectorTAUQ& tauq,
-            VectorTAUP& taup, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAUP& taup, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUP >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -215,7 +238,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gecon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gecon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gecon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -77,6 +79,7 @@
     static void compute( char const norm, MatrixA& a, real_type const anorm,
             real_type& rcond, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -134,6 +137,7 @@
     static void compute( char const norm, MatrixA& a, real_type const anorm,
             real_type& rcond, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -193,7 +197,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geequ.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geequ.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geequ.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_GEEQU_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,8 +58,12 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct geequ_impl{};
+
+// real specialization
 template< typename ValueType >
-struct geequ_impl {
+struct geequ_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -64,6 +73,40 @@
     static void compute( MatrixA& a, VectorR& r, VectorC& c,
             real_type& rowcnd, real_type& colcnd, real_type& amax,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+#ifndef NDEBUG
+        assert( traits::matrix_size1(a) >= 0 );
+        assert( traits::matrix_size2(a) >= 0 );
+        assert( traits::leading_dimension(a) >= std::max(1,
+                traits::matrix_size1(a)) );
+#endif
+        detail::geequ( traits::matrix_size1(a), traits::matrix_size2(a),
+                traits::matrix_storage(a), traits::leading_dimension(a),
+                traits::vector_storage(r), traits::vector_storage(c), rowcnd,
+                colcnd, amax, info );
+    }
+};
+
+// complex specialization
+template< typename ValueType >
+struct geequ_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename MatrixA, typename VectorR, typename VectorC >
+    static void compute( MatrixA& a, VectorR& r, VectorC& c,
+            real_type& rowcnd, real_type& colcnd, real_type& amax,
+            integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -91,7 +134,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gehrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gehrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gehrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -76,8 +78,11 @@
     // user-defined workspace specialization
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( integer_t const ilo, integer_t const ihi, MatrixA& a,
-            VectorTAU& tau, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAU& tau, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,
@@ -130,8 +135,11 @@
     // user-defined workspace specialization
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( integer_t const ilo, integer_t const ihi, MatrixA& a,
-            VectorTAU& tau, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAU& tau, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,
@@ -185,7 +193,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gelqf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gelqf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gelqf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -75,6 +77,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -130,6 +135,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -185,7 +193,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqlf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqlf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqlf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -75,6 +77,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -130,6 +135,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -185,7 +193,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqp3.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqp3.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqp3.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -78,6 +80,9 @@
             typename WORK >
     static void compute( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -135,6 +140,9 @@
             typename WORK, typename RWORK >
     static void compute( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -203,7 +211,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/geqrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -75,6 +77,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -130,6 +135,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -185,7 +193,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,21 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -172,6 +189,18 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -252,7 +281,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerqf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerqf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gerqf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -75,6 +77,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -130,6 +135,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -185,7 +193,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -58,6 +60,7 @@
     // templated specialization
     template< typename MatrixA, typename VectorIPIV >
     static void compute( MatrixA& a, VectorIPIV& ipiv, integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -82,7 +85,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getri.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getri.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getri.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -73,6 +75,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, integer_t& info,
             detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,
@@ -125,6 +128,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, integer_t& info,
             detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,
@@ -177,7 +181,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/getrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -66,6 +68,9 @@
     template< typename MatrixA, typename VectorIPIV, typename MatrixB >
     static void compute( char const trans, MatrixA& a, VectorIPIV& ipiv,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -95,7 +100,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbak.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbak.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbak.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_GGBAK_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,8 +64,48 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct ggbak_impl{};
+
+// real specialization
+template< typename ValueType >
+struct ggbak_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename VectorLSCALE, typename VectorRSCALE, typename MatrixV >
+    static void compute( char const job, char const side, integer_t const ilo,
+            integer_t const ihi, VectorLSCALE& lscale, VectorRSCALE& rscale,
+            MatrixV& v, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorLSCALE >::value_type, typename traits::vector_traits<
+                VectorRSCALE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorLSCALE >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+#ifndef NDEBUG
+        assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
+        assert( side == 'R' || side == 'L' );
+        assert( traits::matrix_size1(v) >= 0 );
+        assert( traits::vector_size(lscale) >= traits::matrix_size1(v) );
+        assert( traits::vector_size(rscale) >= traits::matrix_size1(v) );
+        assert( traits::matrix_size2(v) >= 0 );
+        assert( traits::leading_dimension(v) >= std::max(1,
+                traits::matrix_size1(v)) );
+#endif
+        detail::ggbak( job, side, traits::matrix_size1(v), ilo, ihi,
+                traits::vector_storage(lscale),
+                traits::vector_storage(rscale), traits::matrix_size2(v),
+                traits::matrix_storage(v), traits::leading_dimension(v),
+                info );
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct ggbak_impl {
+struct ggbak_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -70,6 +115,9 @@
     static void compute( char const job, char const side, integer_t const ilo,
             integer_t const ihi, VectorLSCALE& lscale, VectorRSCALE& rscale,
             MatrixV& v, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorLSCALE >::value_type, typename traits::vector_traits<
+                VectorRSCALE >::value_type > );
 #ifndef NDEBUG
         assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
         assert( side == 'R' || side == 'L' );
@@ -94,14 +142,14 @@
 inline integer_t ggbak( char const job, char const side,
         integer_t const ilo, integer_t const ihi, VectorLSCALE& lscale,
         VectorRSCALE& rscale, MatrixV& v ) {
-    typedef typename traits::vector_traits< VectorLSCALE >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorLSCALE >::value_type value_type;
     integer_t info(0);
     ggbak_impl< value_type >::compute( job, side, ilo, ihi, lscale,
             rscale, v, info );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbal.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbal.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggbal.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,8 +17,13 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/lapack/workspace.hpp>
 #include <boost/numeric/bindings/traits/detail/array.hpp>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,8 +68,12 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct ggbal_impl{};
+
+// real specialization
 template< typename ValueType >
-struct ggbal_impl {
+struct ggbal_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -74,8 +83,80 @@
             typename VectorRSCALE, typename WORK >
     static void compute( char const job, integer_t const n, MatrixA& a,
             MatrixB& b, integer_t& ilo, integer_t& ihi, VectorLSCALE& lscale,
-            VectorRSCALE& rscale, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorRSCALE& rscale, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorLSCALE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRSCALE >::value_type > );
+#ifndef NDEBUG
+        assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
+        assert( n >= 0 );
+        assert( traits::leading_dimension(a) >= std::max(1,n) );
+        assert( traits::leading_dimension(b) >= std::max(1,n) );
+        assert( traits::vector_size(work.select(real_type()) >= min_size_work(
+                $CALL_MIN_SIZE )));
+#endif
+        detail::ggbal( job, n, traits::matrix_storage(a),
+                traits::leading_dimension(a), traits::matrix_storage(b),
+                traits::leading_dimension(b), ilo, ihi,
+                traits::vector_storage(lscale),
+                traits::vector_storage(rscale),
+                traits::vector_storage(work.select(real_type())), info );
+    }
+
+    // minimal workspace specialization
+    template< typename MatrixA, typename MatrixB, typename VectorLSCALE,
+            typename VectorRSCALE >
+    static void compute( char const job, integer_t const n, MatrixA& a,
+            MatrixB& b, integer_t& ilo, integer_t& ihi, VectorLSCALE& lscale,
+            VectorRSCALE& rscale, integer_t& info, minimal_workspace work ) {
+        traits::detail::array< real_type > tmp_work( min_size_work(
+                $CALL_MIN_SIZE ) );
+        compute( job, n, a, b, ilo, ihi, lscale, rscale, info,
+                workspace( tmp_work ) );
+    }
+
+    // optimal workspace specialization
+    template< typename MatrixA, typename MatrixB, typename VectorLSCALE,
+            typename VectorRSCALE >
+    static void compute( char const job, integer_t const n, MatrixA& a,
+            MatrixB& b, integer_t& ilo, integer_t& ihi, VectorLSCALE& lscale,
+            VectorRSCALE& rscale, integer_t& info, optimal_workspace work ) {
+        compute( job, n, a, b, ilo, ihi, lscale, rscale, info,
+                minimal_workspace() );
+    }
+
+    static integer_t min_size_work( $ARGUMENTS ) {
+        $MIN_SIZE
+    }
+};
+
+// complex specialization
+template< typename ValueType >
+struct ggbal_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // user-defined workspace specialization
+    template< typename MatrixA, typename MatrixB, typename VectorLSCALE,
+            typename VectorRSCALE, typename WORK >
+    static void compute( char const job, integer_t const n, MatrixA& a,
+            MatrixB& b, integer_t& ilo, integer_t& ihi, VectorLSCALE& lscale,
+            VectorRSCALE& rscale, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorLSCALE >::value_type, typename traits::vector_traits<
+                VectorRSCALE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( job == 'N' || job == 'P' || job == 'S' || job == 'B' );
         assert( n >= 0 );
@@ -133,7 +214,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gghrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gghrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gghrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -77,6 +79,15 @@
     static void compute( char const compq, char const compz,
             integer_t const n, integer_t const ilo, MatrixA& a, MatrixB& b,
             MatrixQ& q, MatrixZ& z, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( compq == 'N' || compq == 'I' || compq == 'V' );
         assert( compz == 'N' || compz == 'I' || compz == 'V' );
@@ -107,7 +118,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggqrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggqrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggqrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -85,8 +87,17 @@
     template< typename MatrixA, typename VectorTAUA, typename MatrixB,
             typename VectorTAUB, typename WORK >
     static void compute( MatrixA& a, VectorTAUA& taua, MatrixB& b,
-            VectorTAUB& taub, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAUB& taub, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(b) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -153,8 +164,17 @@
     template< typename MatrixA, typename VectorTAUA, typename MatrixB,
             typename VectorTAUB, typename WORK >
     static void compute( MatrixA& a, VectorTAUA& taua, MatrixB& b,
-            VectorTAUB& taub, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAUB& taub, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(b) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -222,7 +242,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggrqf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggrqf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggrqf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -85,8 +87,17 @@
     template< typename MatrixA, typename VectorTAUA, typename MatrixB,
             typename VectorTAUB, typename WORK >
     static void compute( MatrixA& a, VectorTAUA& taua, MatrixB& b,
-            VectorTAUB& taub, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAUB& taub, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size1(b) >= 0 );
@@ -153,8 +164,17 @@
     template< typename MatrixA, typename VectorTAUA, typename MatrixB,
             typename VectorTAUB, typename WORK >
     static void compute( MatrixA& a, VectorTAUA& taua, MatrixB& b,
-            VectorTAUB& taub, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAUB& taub, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size1(b) >= 0 );
@@ -222,7 +242,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggsvp.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggsvp.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ggsvp.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -107,8 +109,20 @@
     static void compute( char const jobu, char const jobv, char const jobq,
             MatrixA& a, MatrixB& b, real_type const tola,
             real_type const tolb, integer_t& k, integer_t& l, MatrixU& u,
-            MatrixV& v, MatrixQ& q, integer_t& info,
-            detail::workspace3< IWORK, TAU, WORK > work ) {
+            MatrixV& v, MatrixQ& q, integer_t& info, detail::workspace3<
+            IWORK, TAU, WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( jobu == 'U' || jobu == 'N' );
         assert( jobv == 'V' || jobv == 'N' );
@@ -150,7 +164,8 @@
             MatrixV& v, MatrixQ& q, integer_t& info, minimal_workspace work ) {
         traits::detail::array< integer_t > tmp_iwork( min_size_iwork(
                 traits::matrix_size2(b) ) );
-        traits::detail::array< real_type > tmp_tau( min_size_tau( traits::matrix_size2(b) ) );
+        traits::detail::array<
+                real_type > tmp_tau( min_size_tau( traits::matrix_size2(b) ) );
         traits::detail::array< real_type > tmp_work( min_size_work(
                 traits::matrix_size2(b), traits::matrix_size1(a),
                 traits::matrix_size1(b) ) );
@@ -197,8 +212,20 @@
     static void compute( char const jobu, char const jobv, char const jobq,
             MatrixA& a, MatrixB& b, real_type const tola,
             real_type const tolb, integer_t& k, integer_t& l, MatrixU& u,
-            MatrixV& v, MatrixQ& q, integer_t& info,
-            detail::workspace4< IWORK, RWORK, TAU, WORK > work ) {
+            MatrixV& v, MatrixQ& q, integer_t& info, detail::workspace4<
+            IWORK, RWORK, TAU, WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( jobu == 'U' || jobu == 'N' );
         assert( jobv == 'V' || jobv == 'N' );
@@ -245,7 +272,8 @@
                 traits::matrix_size2(b) ) );
         traits::detail::array< real_type > tmp_rwork( min_size_rwork(
                 traits::matrix_size2(b) ) );
-        traits::detail::array< value_type > tmp_tau( min_size_tau( traits::matrix_size2(b) ) );
+        traits::detail::array<
+                value_type > tmp_tau( min_size_tau( traits::matrix_size2(b) ) );
         traits::detail::array< value_type > tmp_work( min_size_work(
                 traits::matrix_size2(b), traits::matrix_size1(a),
                 traits::matrix_size1(b) ) );
@@ -299,7 +327,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gtrfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gtrfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gtrfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -104,6 +106,36 @@
             VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, MatrixB& b,
             MatrixX& x, VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDLF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDUF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU2 >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( n >= 0 );
@@ -193,6 +225,33 @@
             VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, MatrixB& b,
             MatrixX& x, VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDLF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDUF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU2 >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( n >= 0 );
@@ -283,7 +342,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gttrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gttrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/gttrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -74,6 +76,18 @@
     static void compute( char const trans, integer_t const n, VectorDL& dl,
             VectorD& d, VectorDU& du, VectorDU2& du2, VectorIPIV& ipiv,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU2 >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
         assert( traits::matrix_size2(b) >= 0 );
@@ -106,7 +120,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbgst.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbgst.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbgst.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,8 +64,14 @@
             typename WORK, typename RWORK >
     static void compute( char const vect, integer_t const n,
             integer_t const ka, integer_t const kb, MatrixAB& ab,
-            MatrixBB& bb, MatrixX& x, integer_t& info,
-            detail::workspace2< WORK, RWORK > work ) {
+            MatrixBB& bb, MatrixX& x, integer_t& info, detail::workspace2<
+            WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'N' || vect == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -130,7 +138,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbtrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbtrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hbtrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,12 @@
     static void compute( char const vect, integer_t const n,
             integer_t const kd, MatrixAB& ab, VectorD& d, VectorE& e,
             MatrixQ& q, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'N' || vect == 'V' || vect == 'U' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -117,7 +125,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hecon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hecon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hecon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -58,6 +60,7 @@
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             real_type const anorm, real_type& rcond, integer_t& info,
             detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -110,7 +113,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hegst.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hegst.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hegst.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,6 +55,9 @@
     template< typename MatrixA, typename MatrixB >
     static void compute( integer_t const itype, integer_t const n, MatrixA& a,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -78,7 +83,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/herfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/herfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/herfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -68,6 +70,18 @@
     static void compute( MatrixA& a, MatrixAF& af, VectorIPIV& ipiv,
             MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -148,7 +162,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,12 @@
             typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorD& d, VectorE& e, VectorTAU& tau,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -122,7 +130,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, integer_t& info,
             detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -102,7 +105,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetri.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetri.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetri.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             integer_t& info, detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -102,7 +105,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hetrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,9 @@
     template< typename MatrixA, typename VectorIPIV, typename MatrixB >
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -83,7 +88,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hgeqz.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hgeqz.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hgeqz.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -101,6 +103,24 @@
             integer_t const ilo, MatrixH& h, MatrixT& t, VectorALPHAR& alphar,
             VectorALPHAI& alphai, VectorBETA& beta, MatrixQ& q, MatrixZ& z,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorALPHAR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorALPHAI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'S' );
         assert( compq == 'N' || compq == 'I' || compq == 'V' );
@@ -179,6 +199,21 @@
             integer_t const ilo, MatrixH& h, MatrixT& t, VectorALPHA& alpha,
             VectorBETA& beta, MatrixQ& q, MatrixZ& z, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'S' );
         assert( compq == 'N' || compq == 'I' || compq == 'V' );
@@ -266,7 +301,6 @@
             alphar, alphai, beta, q, z, info, work );
     return info;
 }
-
 // template function to call hgeqz
 template< typename MatrixH, typename MatrixT, typename VectorALPHA,
         typename VectorBETA, typename MatrixQ, typename MatrixZ,
@@ -282,7 +316,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hprfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hprfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hprfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -69,6 +71,18 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -142,7 +156,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hptrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hptrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hptrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,6 +55,9 @@
     template< typename MatrixAP, typename VectorIPIV, typename MatrixB >
     static void compute( char const uplo, integer_t const n, MatrixAP& ap,
             VectorIPIV& ipiv, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -79,7 +84,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hsein.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hsein.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hsein.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -99,6 +101,21 @@
             MatrixVL& vl, MatrixVR& vr, integer_t const mm, integer_t& m,
             VectorIFAILL& ifaill, VectorIFAILR& ifailr, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorWR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorWI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorIFAILL >::value_type, typename traits::vector_traits<
+                VectorIFAILR >::value_type > );
 #ifndef NDEBUG
         assert( side == 'R' || side == 'L' || side == 'B' );
         assert( eigsrc == 'Q' || eigsrc == 'N' );
@@ -173,6 +190,18 @@
             MatrixVR& vr, integer_t const mm, integer_t& m,
             VectorIFAILL& ifaill, VectorIFAILR& ifailr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorIFAILL >::value_type, typename traits::vector_traits<
+                VectorIFAILR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( side == 'R' || side == 'L' || side == 'B' );
         assert( eigsrc == 'Q' || eigsrc == 'N' );
@@ -248,13 +277,13 @@
         VectorWI& wi, MatrixVL& vl, MatrixVR& vr, integer_t const mm,
         integer_t& m, VectorIFAILL& ifaill, VectorIFAILR& ifailr,
         Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     hsein_impl< value_type >::compute( side, eigsrc, initv, select, h,
             wr, wi, vl, vr, mm, m, ifaill, ifailr, info, work );
     return info;
 }
-
 // template function to call hsein
 template< typename VectorSELECT, typename MatrixH, typename VectorW,
         typename MatrixVL, typename MatrixVR, typename VectorIFAILL,
@@ -264,14 +293,14 @@
         MatrixVL& vl, MatrixVR& vr, integer_t const mm, integer_t& m,
         VectorIFAILL& ifaill, VectorIFAILR& ifailr,
         Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     hsein_impl< value_type >::compute( side, eigsrc, initv, select, h, w,
             vl, vr, mm, m, ifaill, ifailr, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hseqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hseqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/hseqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -87,6 +89,15 @@
             integer_t const ilo, integer_t const ihi, MatrixH& h,
             VectorWR& wr, VectorWI& wi, MatrixZ& z, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorWR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorWI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'S' );
         assert( compz == 'N' || compz == 'I' || compz == 'V' );
@@ -144,6 +155,12 @@
     static void compute( char const job, char const compz,
             integer_t const ilo, integer_t const ihi, MatrixH& h, VectorW& w,
             MatrixZ& z, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixH >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'S' );
         assert( compz == 'N' || compz == 'I' || compz == 'V' );
@@ -194,7 +211,6 @@
             z, info, work );
     return info;
 }
-
 // template function to call hseqr
 template< typename MatrixH, typename VectorW, typename MatrixZ,
         typename Workspace >
@@ -208,7 +224,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/labrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/labrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/labrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -82,6 +84,24 @@
             typename MatrixY >
     static void compute( MatrixA& a, VectorD& d, VectorE& e, VectorTAUQ& tauq,
             VectorTAUP& taup, MatrixX& x, MatrixY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixY >::value_type > );
 #ifndef NDEBUG
         assert( traits::leading_dimension(a) >= std::max(1,
                 traits::matrix_size1(a)) );
@@ -115,6 +135,21 @@
             typename MatrixY >
     static void compute( MatrixA& a, VectorD& d, VectorE& e, VectorTAUQ& tauq,
             VectorTAUP& taup, MatrixX& x, MatrixY& y ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAUP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixY >::value_type > );
 #ifndef NDEBUG
         assert( traits::leading_dimension(a) >= std::max(1,
                 traits::matrix_size1(a)) );
@@ -150,7 +185,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/lacon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/lacon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/lacon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -68,6 +70,7 @@
     template< typename VectorX, typename V, typename ISGN >
     static void compute( integer_t const n, VectorX& x, real_type& est,
             integer_t& kase, detail::workspace2< V, ISGN > work ) {
+        
 #ifndef NDEBUG
         assert( n >= 1 );
         assert( traits::vector_size(work.select(real_type()) >=
@@ -116,6 +119,7 @@
     template< typename VectorX, typename V >
     static void compute( integer_t const n, VectorX& x, real_type& est,
             integer_t& kase, detail::workspace1< V > work ) {
+        
 #ifndef NDEBUG
         assert( n >= 1 );
         assert( traits::vector_size(work.select(value_type()) >=
@@ -157,7 +161,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/laebz.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/laebz.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/laebz.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -70,6 +72,21 @@
             VectorNVAL& nval, MatrixAB& ab, VectorC& c, integer_t& mout,
             MatrixNAB& nab, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE2 >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixAB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorNVAL >::value_type, typename traits::matrix_traits<
+                MatrixNAB >::value_type > );
 #ifndef NDEBUG
         assert( traits::vector_size(d) >= n );
         assert( traits::vector_size(e) >= n );
@@ -151,7 +168,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/larz.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/larz.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/larz.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -77,6 +79,9 @@
     static void compute( char const side, integer_t const l, VectorV& v,
             integer_t const incv, real_type const tau, MatrixC& c,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorV >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( traits::leading_dimension(c) >= std::max(1,
@@ -127,8 +132,11 @@
     // user-defined workspace specialization
     template< typename VectorV, typename MatrixC, typename WORK >
     static void compute( char const side, integer_t const l, VectorV& v,
-            integer_t const incv, traits::complex_f const tau, MatrixC& c,
+            integer_t const incv, value_type const tau, MatrixC& c,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorV >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( traits::leading_dimension(c) >= std::max(1,
@@ -146,7 +154,7 @@
     // minimal workspace specialization
     template< typename VectorV, typename MatrixC >
     static void compute( char const side, integer_t const l, VectorV& v,
-            integer_t const incv, traits::complex_f const tau, MatrixC& c,
+            integer_t const incv, value_type const tau, MatrixC& c,
             minimal_workspace work ) {
         traits::detail::array< value_type > tmp_work( min_size_work( side,
                 traits::matrix_size1(c), traits::matrix_size2(c) ) );
@@ -156,7 +164,7 @@
     // optimal workspace specialization
     template< typename VectorV, typename MatrixC >
     static void compute( char const side, integer_t const l, VectorV& v,
-            integer_t const incv, traits::complex_f const tau, MatrixC& c,
+            integer_t const incv, value_type const tau, MatrixC& c,
             optimal_workspace work ) {
         compute( side, l, v, incv, tau, c, minimal_workspace() );
     }
@@ -174,19 +182,8 @@
 // template function to call larz
 template< typename VectorV, typename MatrixC, typename Workspace >
 inline integer_t larz( char const side, integer_t const l, VectorV& v,
-        integer_t const incv,
-        typename traits::vector_traits< VectorV >::value_type const tau,
-        MatrixC& c, Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorV >::value_type value_type;
-    integer_t info(0);
-    larz_impl< value_type >::compute( side, l, v, incv, tau, c, work );
-    return info;
-}
-
-// template function to call larz
-template< typename VectorV, typename MatrixC, typename Workspace >
-inline integer_t larz( char const side, integer_t const l, VectorV& v,
-        integer_t const incv, traits::complex_f const tau, MatrixC& c,
+        integer_t const incv, typename traits::vector_traits<
+        VectorV >::value_type const tau, MatrixC& c,
         Workspace work = optimal_workspace() ) {
     typedef typename traits::vector_traits< VectorV >::value_type value_type;
     integer_t info(0);
@@ -194,7 +191,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -73,6 +75,15 @@
             typename MatrixW >
     static void compute( integer_t const nb, MatrixA& a, VectorE& e,
             VectorTAU& tau, MatrixW& w ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixW >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -99,6 +110,12 @@
             typename MatrixW >
     static void compute( integer_t const nb, MatrixA& a, VectorE& e,
             VectorTAU& tau, MatrixW& w ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixW >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(h) == 'U' ||
                 traits::matrix_uplo_tag(h) == 'L' );
@@ -126,7 +143,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_LATRS_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,8 +66,46 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct latrs_impl{};
+
+// real specialization
+template< typename ValueType >
+struct latrs_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename MatrixA, typename VectorX, typename VectorCNORM >
+    static void compute( char const uplo, char const trans, char const diag,
+            char const normin, MatrixA& a, VectorX& x, real_type& scale,
+            VectorCNORM& cnorm, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorCNORM >::value_type > );
+#ifndef NDEBUG
+        assert( uplo == 'U' || uplo == 'L' );
+        assert( trans == 'N' || trans == 'T' || trans == 'C' );
+        assert( diag == 'N' || diag == 'U' );
+        assert( normin == 'Y' || normin == 'N' );
+        assert( traits::matrix_size2(a) >= 0 );
+        assert( traits::leading_dimension(a) >= ?MAX );
+        assert( traits::vector_size(x) >= traits::matrix_size2(a) );
+#endif
+        detail::latrs( uplo, trans, diag, normin, traits::matrix_size2(a),
+                traits::matrix_storage(a), traits::leading_dimension(a),
+                traits::vector_storage(x), scale,
+                traits::vector_storage(cnorm), info );
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct latrs_impl {
+struct latrs_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -72,6 +115,9 @@
     static void compute( char const uplo, char const trans, char const diag,
             char const normin, MatrixA& a, VectorX& x, real_type& scale,
             VectorCNORM& cnorm, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -102,7 +148,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrz.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrz.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/latrz.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -70,8 +72,11 @@
 
     // user-defined workspace specialization
     template< typename MatrixA, typename VectorTAU, typename WORK >
-    static void compute( MatrixA& a, VectorTAU& tau,
-            detail::workspace1< WORK > work ) {
+    static void compute( MatrixA& a, VectorTAU& tau, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -116,8 +121,11 @@
 
     // user-defined workspace specialization
     template< typename MatrixA, typename VectorTAU, typename WORK >
-    static void compute( MatrixA& a, VectorTAU& tau,
-            detail::workspace1< WORK > work ) {
+    static void compute( MatrixA& a, VectorTAU& tau, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -164,7 +172,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opgtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opgtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opgtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -54,6 +56,12 @@
             typename WORK >
     static void compute( char const uplo, VectorAP& ap, VectorTAU& tau,
             MatrixQ& q, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(q) >= 0 );
@@ -104,7 +112,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opmtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opmtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/opmtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,6 +59,12 @@
     static void compute( char const side, char const uplo, char const trans,
             VectorAP& ap, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( uplo == 'U' || uplo == 'L' );
@@ -116,7 +124,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgbr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgbr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgbr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,9 @@
     static void compute( char const vect, integer_t const m,
             integer_t const n, integer_t const k, MatrixA& a, VectorTAU& tau,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'Q' || vect == 'P' );
         assert( m >= 0 );
@@ -110,7 +115,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orghr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orghr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orghr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,9 @@
     static void compute( integer_t const n, integer_t const ilo,
             integer_t const ihi, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,n) );
@@ -109,7 +114,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orglq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orglq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orglq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= m );
@@ -110,7 +115,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgql.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgql.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgql.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= n );
@@ -110,7 +115,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= n );
@@ -110,7 +115,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgrq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgrq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgrq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= m );
@@ -110,7 +115,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/orgtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -54,6 +56,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( integer_t const n, MatrixA& a, VectorTAU& tau,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -107,7 +112,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormbr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormbr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormbr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,12 @@
     static void compute( char const vect, char const side, char const trans,
             integer_t const k, MatrixA& a, VectorTAU& tau, MatrixC& c,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'Q' || vect == 'P' );
         assert( side == 'L' || side == 'R' );
@@ -133,7 +141,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormhr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormhr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormhr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,8 +63,14 @@
             typename WORK >
     static void compute( char const side, char const trans,
             integer_t const ilo, integer_t const ihi, MatrixA& a,
-            VectorTAU& tau, MatrixC& c, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAU& tau, MatrixC& c, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'T' );
@@ -134,7 +142,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormlq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormlq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormlq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'T' );
@@ -129,7 +137,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormql.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormql.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormql.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'T' );
@@ -128,7 +136,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'T' );
@@ -128,7 +136,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'T' );
@@ -129,7 +137,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrz.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrz.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormrz.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'T' );
@@ -127,7 +135,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ormtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -58,8 +60,14 @@
     template< typename MatrixA, typename VectorTAU, typename MatrixC,
             typename WORK >
     static void compute( char const side, char const trans, MatrixA& a,
-            VectorTAU& tau, MatrixC& c, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAU& tau, MatrixC& c, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -129,7 +137,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbcon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbcon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbcon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -78,6 +80,7 @@
             integer_t const kd, MatrixAB& ab, real_type const anorm,
             real_type& rcond, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -135,6 +138,7 @@
             integer_t const kd, MatrixAB& ab, real_type const anorm,
             real_type& rcond, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -183,10 +187,9 @@
 // template function to call pbcon
 template< typename MatrixAB, typename Workspace >
 inline integer_t pbcon( char const uplo, integer_t const n,
-        integer_t const kd, MatrixAB& ab,
-        typename traits::matrix_traits< MatrixAB >::value_type const anorm,
-        typename traits::matrix_traits< MatrixAB >::value_type& rcond,
-        Workspace work = optimal_workspace() ) {
+        integer_t const kd, MatrixAB& ab, typename traits::matrix_traits<
+        MatrixAB >::value_type const anorm, typename traits::matrix_traits<
+        MatrixAB >::value_type& rcond, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixAB >::value_type value_type;
     integer_t info(0);
     pbcon_impl< value_type >::compute( uplo, n, kd, ab, anorm, rcond,
@@ -194,7 +197,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbequ.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbequ.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbequ.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_PBEQU_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,8 +58,39 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct pbequ_impl{};
+
+// real specialization
+template< typename ValueType >
+struct pbequ_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename MatrixAB, typename VectorS >
+    static void compute( integer_t const n, integer_t const kd, MatrixAB& ab,
+            VectorS& s, real_type& scond, real_type& amax, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+#ifndef NDEBUG
+        assert( traits::matrix_uplo_tag(a) == 'U' ||
+                traits::matrix_uplo_tag(a) == 'L' );
+        assert( n >= 0 );
+        assert( kd >= 0 );
+        assert( traits::leading_dimension(ab) >= kd+1 );
+#endif
+        detail::pbequ( traits::matrix_uplo_tag(a), n, kd,
+                traits::matrix_storage(ab), traits::leading_dimension(ab),
+                traits::vector_storage(s), scond, amax, info );
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct pbequ_impl {
+struct pbequ_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -63,6 +99,7 @@
     template< typename MatrixAB, typename VectorS >
     static void compute( integer_t const n, integer_t const kd, MatrixAB& ab,
             VectorS& s, real_type& scond, real_type& amax, integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -80,16 +117,15 @@
 // template function to call pbequ
 template< typename MatrixAB, typename VectorS >
 inline integer_t pbequ( integer_t const n, integer_t const kd,
-        MatrixAB& ab, VectorS& s,
-        typename traits::matrix_traits< MatrixAB >::value_type& scond,
-        typename traits::matrix_traits< MatrixAB >::value_type& amax ) {
+        MatrixAB& ab, VectorS& s, typename traits::matrix_traits<
+        MatrixAB >::value_type& scond, typename traits::matrix_traits<
+        MatrixAB >::value_type& amax ) {
     typedef typename traits::matrix_traits< MatrixAB >::value_type value_type;
     integer_t info(0);
     pbequ_impl< value_type >::compute( n, kd, ab, s, scond, amax, info );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbrfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbrfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbrfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,21 @@
             MatrixAFB& afb, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -164,6 +181,18 @@
             MatrixAFB& afb, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -237,7 +266,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbstf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbstf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbstf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,6 +59,7 @@
     template< typename MatrixAB >
     static void compute( integer_t const n, integer_t const kd, MatrixAB& ab,
             integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -81,7 +84,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,6 +59,7 @@
     template< typename MatrixAB >
     static void compute( integer_t const n, integer_t const kd, MatrixAB& ab,
             integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -81,7 +84,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pbtrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixAB, typename MatrixB >
     static void compute( char const uplo, integer_t const n,
             integer_t const kd, MatrixAB& ab, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -89,7 +94,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pocon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pocon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pocon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -76,6 +78,7 @@
     template< typename MatrixA, typename WORK, typename IWORK >
     static void compute( MatrixA& a, real_type const anorm, real_type& rcond,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -132,6 +135,7 @@
     template< typename MatrixA, typename WORK, typename RWORK >
     static void compute( MatrixA& a, real_type const anorm, real_type& rcond,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -180,17 +184,15 @@
 
 // template function to call pocon
 template< typename MatrixA, typename Workspace >
-inline integer_t pocon( MatrixA& a,
-        typename traits::matrix_traits< MatrixA >::value_type const anorm,
-        typename traits::matrix_traits< MatrixA >::value_type& rcond,
-        Workspace work = optimal_workspace() ) {
+inline integer_t pocon( MatrixA& a, typename traits::matrix_traits<
+        MatrixA >::value_type const anorm, typename traits::matrix_traits<
+        MatrixA >::value_type& rcond, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     pocon_impl< value_type >::compute( a, anorm, rcond, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/poequ.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/poequ.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/poequ.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_POEQU_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,8 +56,37 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct poequ_impl{};
+
+// real specialization
+template< typename ValueType >
+struct poequ_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename MatrixA, typename VectorS >
+    static void compute( MatrixA& a, VectorS& s, real_type& scond,
+            real_type& amax, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+#ifndef NDEBUG
+        assert( traits::matrix_size2(a) >= 0 );
+        assert( traits::leading_dimension(a) >= std::max(1,
+                traits::matrix_size2(a)) );
+#endif
+        detail::poequ( traits::matrix_size2(a), traits::matrix_storage(a),
+                traits::leading_dimension(a), traits::vector_storage(s),
+                scond, amax, info );
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct poequ_impl {
+struct poequ_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -61,6 +95,7 @@
     template< typename MatrixA, typename VectorS >
     static void compute( MatrixA& a, VectorS& s, real_type& scond,
             real_type& amax, integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,
@@ -84,7 +119,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/porfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/porfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/porfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -91,6 +93,21 @@
     static void compute( MatrixA& a, MatrixAF& af, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -167,6 +184,18 @@
     static void compute( MatrixA& a, MatrixAF& af, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -244,7 +273,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -56,6 +58,7 @@
     // templated specialization
     template< typename MatrixA >
     static void compute( MatrixA& a, integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -79,7 +82,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potri.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potri.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potri.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -56,6 +58,7 @@
     // templated specialization
     template< typename MatrixA >
     static void compute( MatrixA& a, integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -79,7 +82,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/potrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,6 +64,9 @@
     // templated specialization
     template< typename MatrixA, typename MatrixB >
     static void compute( MatrixA& a, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -89,7 +94,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pprfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pprfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pprfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -89,6 +91,21 @@
     static void compute( integer_t const n, MatrixAP& ap, VectorAFP& afp,
             MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -156,6 +173,18 @@
     static void compute( integer_t const n, MatrixAP& ap, VectorAFP& afp,
             MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -224,7 +253,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pptrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pptrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pptrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename VectorAP, typename MatrixB >
     static void compute( integer_t const n, VectorAP& ap, MatrixB& b,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -86,7 +91,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pteqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pteqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pteqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,8 +17,13 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/lapack/workspace.hpp>
 #include <boost/numeric/bindings/traits/detail/array.hpp>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,8 +60,12 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct pteqr_impl{};
+
+// real specialization
 template< typename ValueType >
-struct pteqr_impl {
+struct pteqr_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -65,8 +74,64 @@
     template< typename VectorD, typename VectorE, typename MatrixZ,
             typename WORK >
     static void compute( char const compz, integer_t const n, VectorD& d,
-            VectorE& e, MatrixZ& z, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorE& e, MatrixZ& z, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
+#ifndef NDEBUG
+        assert( compz == 'N' || compz == 'V' || compz == 'I' );
+        assert( n >= 0 );
+        assert( traits::vector_size(d) >= n );
+        assert( traits::vector_size(e) >= n-1 );
+        assert( traits::vector_size(work.select(real_type()) >= min_size_work(
+                n )));
+#endif
+        detail::pteqr( compz, n, traits::vector_storage(d),
+                traits::vector_storage(e), traits::matrix_storage(z),
+                traits::leading_dimension(z),
+                traits::vector_storage(work.select(real_type())), info );
+    }
+
+    // minimal workspace specialization
+    template< typename VectorD, typename VectorE, typename MatrixZ >
+    static void compute( char const compz, integer_t const n, VectorD& d,
+            VectorE& e, MatrixZ& z, integer_t& info, minimal_workspace work ) {
+        traits::detail::array< real_type > tmp_work( min_size_work( n ) );
+        compute( compz, n, d, e, z, info, workspace( tmp_work ) );
+    }
+
+    // optimal workspace specialization
+    template< typename VectorD, typename VectorE, typename MatrixZ >
+    static void compute( char const compz, integer_t const n, VectorD& d,
+            VectorE& e, MatrixZ& z, integer_t& info, optimal_workspace work ) {
+        compute( compz, n, d, e, z, info, minimal_workspace() );
+    }
+
+    static integer_t min_size_work( integer_t const n ) {
+        return 4*n;
+    }
+};
+
+// complex specialization
+template< typename ValueType >
+struct pteqr_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // user-defined workspace specialization
+    template< typename VectorD, typename VectorE, typename MatrixZ,
+            typename WORK >
+    static void compute( char const compz, integer_t const n, VectorD& d,
+            VectorE& e, MatrixZ& z, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
 #ifndef NDEBUG
         assert( compz == 'N' || compz == 'V' || compz == 'I' );
         assert( n >= 0 );
@@ -113,7 +178,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ptrfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ptrfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ptrfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -90,6 +92,27 @@
             VectorDF& df, VectorEF& ef, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorEF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -158,6 +181,24 @@
             VectorE& e, VectorDF& df, VectorEF& ef, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::vector_traits<
+                VectorEF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -233,7 +274,6 @@
             info, work );
     return info;
 }
-
 // template function to call ptrfs
 template< typename VectorD, typename VectorE, typename VectorDF,
         typename VectorEF, typename MatrixB, typename MatrixX,
@@ -249,7 +289,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pttrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pttrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/pttrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -68,6 +70,12 @@
     template< typename VectorD, typename VectorE, typename MatrixB >
     static void compute( integer_t const n, VectorD& d, VectorE& e,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -92,6 +100,9 @@
     template< typename VectorD, typename VectorE, typename MatrixB >
     static void compute( char const uplo, integer_t const n, VectorD& d,
             VectorE& e, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -116,7 +127,6 @@
     pttrs_impl< value_type >::compute( n, d, e, b, info );
     return info;
 }
-
 // template function to call pttrs
 template< typename VectorD, typename VectorE, typename MatrixB >
 inline integer_t pttrs( char const uplo, integer_t const n, VectorD& d,
@@ -127,7 +137,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbgst.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbgst.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbgst.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -58,8 +60,14 @@
             typename WORK >
     static void compute( char const vect, integer_t const n,
             integer_t const ka, integer_t const kb, MatrixAB& ab,
-            MatrixBB& bb, MatrixX& x, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            MatrixBB& bb, MatrixX& x, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'N' || vect == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -117,7 +125,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbtrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbtrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sbtrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,6 +61,15 @@
     static void compute( char const vect, integer_t const n,
             integer_t const kd, MatrixAB& ab, VectorD& d, VectorE& e,
             MatrixQ& q, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'N' || vect == 'V' || vect == 'U' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -115,7 +126,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sprfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sprfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sprfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,21 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -165,6 +182,18 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -238,7 +267,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sptrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sptrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sptrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixAP, typename VectorIPIV, typename MatrixB >
     static void compute( char const uplo, integer_t const n, MatrixAP& ap,
             VectorIPIV& ipiv, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
@@ -89,7 +94,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stebz.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stebz.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stebz.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -67,6 +69,15 @@
             VectorD& d, VectorE& e, integer_t& m, integer_t& nsplit,
             VectorW& w, VectorIBLOCK& iblock, VectorISPLIT& isplit,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorIBLOCK >::value_type, typename traits::vector_traits<
+                VectorISPLIT >::value_type > );
 #ifndef NDEBUG
         assert( range == 'A' || range == 'V' || range == 'I' );
         assert( order == 'B' || order == 'E' );
@@ -131,14 +142,13 @@
 template< typename VectorD, typename VectorE, typename VectorW,
         typename VectorIBLOCK, typename VectorISPLIT, typename Workspace >
 inline integer_t stebz( char const range, char const order,
-        integer_t const n,
-        typename traits::vector_traits< VectorD >::value_type const vl,
-        typename traits::vector_traits< VectorD >::value_type const vu,
-        integer_t const il, integer_t const iu,
-        typename traits::vector_traits< VectorD >::value_type const abstol,
-        VectorD& d, VectorE& e, integer_t& m, integer_t& nsplit, VectorW& w,
-        VectorIBLOCK& iblock, VectorISPLIT& isplit,
-        Workspace work = optimal_workspace() ) {
+        integer_t const n, typename traits::vector_traits<
+        VectorD >::value_type const vl, typename traits::vector_traits<
+        VectorD >::value_type const vu, integer_t const il,
+        integer_t const iu, typename traits::vector_traits<
+        VectorD >::value_type const abstol, VectorD& d, VectorE& e,
+        integer_t& m, integer_t& nsplit, VectorW& w, VectorIBLOCK& iblock,
+        VectorISPLIT& isplit, Workspace work = optimal_workspace() ) {
     typedef typename traits::vector_traits< VectorD >::value_type value_type;
     integer_t info(0);
     stebz_impl< value_type >::compute( range, order, n, vl, vu, il, iu,
@@ -146,7 +156,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stedc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stedc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stedc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -85,6 +87,12 @@
     static void compute( char const compz, integer_t const n, VectorD& d,
             VectorE& e, MatrixZ& z, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( compz == 'N' || compz == 'I' || compz == 'V' );
         assert( n >= 0 );
@@ -152,6 +160,9 @@
     static void compute( char const compz, integer_t const n, VectorD& d,
             VectorE& e, MatrixZ& z, integer_t& info, detail::workspace3< WORK,
             RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
 #ifndef NDEBUG
         assert( compz == 'N' || compz == 'I' || compz == 'V' );
         assert( n >= 0 );
@@ -233,7 +244,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stegr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stegr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stegr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -18,8 +18,13 @@
 #include <boost/numeric/bindings/lapack/workspace.hpp>
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -73,8 +78,12 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct stegr_impl{};
+
+// real specialization
 template< typename ValueType >
-struct stegr_impl {
+struct stegr_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -88,6 +97,106 @@
             integer_t const il, integer_t const iu, real_type const abstol,
             integer_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
+#ifndef NDEBUG
+        assert( jobz == 'N' || jobz == 'V' );
+        assert( range == 'A' || range == 'V' || range == 'I' );
+        assert( n >= 0 );
+        assert( traits::vector_size(d) >= n );
+        assert( traits::vector_size(e) >= n );
+        assert( traits::vector_size(w) >= n );
+        assert( traits::vector_size(work.select(real_type()) >= min_size_work(
+                $CALL_MIN_SIZE )));
+        assert( traits::vector_size(work.select(integer_t()) >=
+                min_size_iwork( $CALL_MIN_SIZE )));
+#endif
+        detail::stegr( jobz, range, n, traits::vector_storage(d),
+                traits::vector_storage(e), vl, vu, il, iu, abstol, m,
+                traits::vector_storage(w), traits::matrix_storage(z),
+                traits::leading_dimension(z), traits::vector_storage(isuppz),
+                traits::vector_storage(work.select(real_type())),
+                traits::vector_size(work.select(real_type())),
+                traits::vector_storage(work.select(integer_t())),
+                traits::vector_size(work.select(integer_t())), info );
+    }
+
+    // minimal workspace specialization
+    template< typename VectorD, typename VectorE, typename VectorW,
+            typename MatrixZ, typename VectorISUPPZ >
+    static void compute( char const jobz, char const range, integer_t const n,
+            VectorD& d, VectorE& e, real_type const vl, real_type const vu,
+            integer_t const il, integer_t const iu, real_type const abstol,
+            integer_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz,
+            integer_t& info, minimal_workspace work ) {
+        traits::detail::array< real_type > tmp_work( min_size_work(
+                $CALL_MIN_SIZE ) );
+        traits::detail::array< integer_t > tmp_iwork( min_size_iwork(
+                $CALL_MIN_SIZE ) );
+        compute( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z,
+                isuppz, info, workspace( tmp_work, tmp_iwork ) );
+    }
+
+    // optimal workspace specialization
+    template< typename VectorD, typename VectorE, typename VectorW,
+            typename MatrixZ, typename VectorISUPPZ >
+    static void compute( char const jobz, char const range, integer_t const n,
+            VectorD& d, VectorE& e, real_type const vl, real_type const vu,
+            integer_t const il, integer_t const iu, real_type const abstol,
+            integer_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz,
+            integer_t& info, optimal_workspace work ) {
+        real_type opt_size_work;
+        integer_t opt_size_iwork;
+        detail::stegr( jobz, range, n, traits::vector_storage(d),
+                traits::vector_storage(e), vl, vu, il, iu, abstol, m,
+                traits::vector_storage(w), traits::matrix_storage(z),
+                traits::leading_dimension(z), traits::vector_storage(isuppz),
+                &opt_size_work, -1, &opt_size_iwork, -1, info );
+        traits::detail::array< real_type > tmp_work(
+                traits::detail::to_int( opt_size_work ) );
+        traits::detail::array< integer_t > tmp_iwork( opt_size_iwork );
+        compute( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z,
+                isuppz, info, workspace( tmp_work, tmp_iwork ) );
+    }
+
+    static integer_t min_size_work( $ARGUMENTS ) {
+        $MIN_SIZE
+    }
+
+    static integer_t min_size_iwork( $ARGUMENTS ) {
+        $MIN_SIZE
+    }
+};
+
+// complex specialization
+template< typename ValueType >
+struct stegr_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // user-defined workspace specialization
+    template< typename VectorD, typename VectorE, typename VectorW,
+            typename MatrixZ, typename VectorISUPPZ, typename WORK,
+            typename IWORK >
+    static void compute( char const jobz, char const range, integer_t const n,
+            VectorD& d, VectorE& e, real_type const vl, real_type const vu,
+            integer_t const il, integer_t const iu, real_type const abstol,
+            integer_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz,
+            integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -176,7 +285,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stein.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stein.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/stein.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,8 +17,13 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/lapack/workspace.hpp>
 #include <boost/numeric/bindings/traits/detail/array.hpp>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,8 +67,99 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct stein_impl{};
+
+// real specialization
+template< typename ValueType >
+struct stein_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // user-defined workspace specialization
+    template< typename VectorD, typename VectorE, typename VectorW,
+            typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ,
+            typename VectorIFAIL, typename WORK, typename IWORK >
+    static void compute( integer_t const n, VectorD& d, VectorE& e,
+            integer_t const m, VectorW& w, VectorIBLOCK& iblock,
+            VectorISPLIT& isplit, MatrixZ& z, VectorIFAIL& ifail,
+            integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorIBLOCK >::value_type, typename traits::vector_traits<
+                VectorISPLIT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorIBLOCK >::value_type, typename traits::vector_traits<
+                VectorIFAIL >::value_type > );
+#ifndef NDEBUG
+        assert( n >= 0 );
+        assert( traits::vector_size(d) >= n );
+        assert( traits::vector_size(e) >= n-1 );
+        assert( traits::vector_size(w) >= n );
+        assert( traits::vector_size(isplit) >= n );
+        assert( traits::leading_dimension(z) >= std::max(1,n) );
+        assert( traits::vector_size(work.select(real_type()) >= min_size_work(
+                n )));
+        assert( traits::vector_size(work.select(integer_t()) >=
+                min_size_iwork( n )));
+#endif
+        detail::stein( n, traits::vector_storage(d),
+                traits::vector_storage(e), m, traits::vector_storage(w),
+                traits::vector_storage(iblock),
+                traits::vector_storage(isplit), traits::matrix_storage(z),
+                traits::leading_dimension(z),
+                traits::vector_storage(work.select(real_type())),
+                traits::vector_storage(work.select(integer_t())),
+                traits::vector_storage(ifail), info );
+    }
+
+    // minimal workspace specialization
+    template< typename VectorD, typename VectorE, typename VectorW,
+            typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ,
+            typename VectorIFAIL >
+    static void compute( integer_t const n, VectorD& d, VectorE& e,
+            integer_t const m, VectorW& w, VectorIBLOCK& iblock,
+            VectorISPLIT& isplit, MatrixZ& z, VectorIFAIL& ifail,
+            integer_t& info, minimal_workspace work ) {
+        traits::detail::array< real_type > tmp_work( min_size_work( n ) );
+        traits::detail::array< integer_t > tmp_iwork( min_size_iwork( n ) );
+        compute( n, d, e, m, w, iblock, isplit, z, ifail, info,
+                workspace( tmp_work, tmp_iwork ) );
+    }
+
+    // optimal workspace specialization
+    template< typename VectorD, typename VectorE, typename VectorW,
+            typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ,
+            typename VectorIFAIL >
+    static void compute( integer_t const n, VectorD& d, VectorE& e,
+            integer_t const m, VectorW& w, VectorIBLOCK& iblock,
+            VectorISPLIT& isplit, MatrixZ& z, VectorIFAIL& ifail,
+            integer_t& info, optimal_workspace work ) {
+        compute( n, d, e, m, w, iblock, isplit, z, ifail, info,
+                minimal_workspace() );
+    }
+
+    static integer_t min_size_work( integer_t const n ) {
+        return 5*n;
+    }
+
+    static integer_t min_size_iwork( integer_t const n ) {
+        return n;
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct stein_impl {
+struct stein_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -76,6 +172,18 @@
             integer_t const m, VectorW& w, VectorIBLOCK& iblock,
             VectorISPLIT& isplit, MatrixZ& z, VectorIFAIL& ifail,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorIBLOCK >::value_type, typename traits::vector_traits<
+                VectorISPLIT >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorIBLOCK >::value_type, typename traits::vector_traits<
+                VectorIFAIL >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::vector_size(d) >= n );
@@ -149,7 +257,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/steqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/steqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/steqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,8 +17,13 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/lapack/workspace.hpp>
 #include <boost/numeric/bindings/traits/detail/array.hpp>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,8 +60,12 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct steqr_impl{};
+
+// real specialization
 template< typename ValueType >
-struct steqr_impl {
+struct steqr_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -65,8 +74,64 @@
     template< typename VectorD, typename VectorE, typename MatrixZ,
             typename WORK >
     static void compute( char const compz, integer_t const n, VectorD& d,
-            VectorE& e, MatrixZ& z, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorE& e, MatrixZ& z, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
+#ifndef NDEBUG
+        assert( compz == 'N' || compz == 'V' || compz == 'I' );
+        assert( n >= 0 );
+        assert( traits::vector_size(e) >= n-1 );
+        assert( traits::vector_size(work.select(real_type()) >= min_size_work(
+                $CALL_MIN_SIZE )));
+#endif
+        detail::steqr( compz, n, traits::vector_storage(d),
+                traits::vector_storage(e), traits::matrix_storage(z),
+                traits::leading_dimension(z),
+                traits::vector_storage(work.select(real_type())), info );
+    }
+
+    // minimal workspace specialization
+    template< typename VectorD, typename VectorE, typename MatrixZ >
+    static void compute( char const compz, integer_t const n, VectorD& d,
+            VectorE& e, MatrixZ& z, integer_t& info, minimal_workspace work ) {
+        traits::detail::array< real_type > tmp_work( min_size_work(
+                $CALL_MIN_SIZE ) );
+        compute( compz, n, d, e, z, info, workspace( tmp_work ) );
+    }
+
+    // optimal workspace specialization
+    template< typename VectorD, typename VectorE, typename MatrixZ >
+    static void compute( char const compz, integer_t const n, VectorD& d,
+            VectorE& e, MatrixZ& z, integer_t& info, optimal_workspace work ) {
+        compute( compz, n, d, e, z, info, minimal_workspace() );
+    }
+
+    static integer_t min_size_work( $ARGUMENTS ) {
+        $MIN_SIZE
+    }
+};
+
+// complex specialization
+template< typename ValueType >
+struct steqr_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // user-defined workspace specialization
+    template< typename VectorD, typename VectorE, typename MatrixZ,
+            typename WORK >
+    static void compute( char const compz, integer_t const n, VectorD& d,
+            VectorE& e, MatrixZ& z, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
 #ifndef NDEBUG
         assert( compz == 'N' || compz == 'V' || compz == 'I' );
         assert( n >= 0 );
@@ -113,7 +178,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sterf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sterf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sterf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -49,6 +51,9 @@
     template< typename VectorD, typename VectorE >
     static void compute( integer_t const n, VectorD& d, VectorE& e,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::vector_size(e) >= n-1 );
@@ -68,7 +73,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sycon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sycon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sycon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -78,6 +80,7 @@
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             real_type const anorm, real_type& rcond, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -138,6 +141,7 @@
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             real_type const anorm, real_type& rcond, integer_t& info,
             detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -190,7 +194,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sygst.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sygst.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sygst.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,6 +53,9 @@
     template< typename MatrixA, typename MatrixB >
     static void compute( integer_t const itype, integer_t const n, MatrixA& a,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -76,7 +81,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/syrfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/syrfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/syrfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -91,6 +93,21 @@
     static void compute( MatrixA& a, MatrixAF& af, VectorIPIV& ipiv,
             MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -170,6 +187,18 @@
     static void compute( MatrixA& a, MatrixAF& af, VectorIPIV& ipiv,
             MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -250,7 +279,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,15 @@
             typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorD& d, VectorE& e, VectorTAU& tau,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -117,7 +128,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -73,6 +75,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, integer_t& info,
             detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -128,6 +131,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, integer_t& info,
             detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -183,7 +187,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytri.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytri.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytri.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -72,6 +74,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             integer_t& info, detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -119,6 +122,7 @@
     template< typename MatrixA, typename VectorIPIV, typename WORK >
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             integer_t& info, detail::workspace1< WORK > work ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -166,7 +170,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/sytrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -66,6 +68,9 @@
     template< typename MatrixA, typename VectorIPIV, typename MatrixB >
     static void compute( char const uplo, MatrixA& a, VectorIPIV& ipiv,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(a) >= 0 );
@@ -94,7 +99,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbcon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbcon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbcon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -80,6 +82,7 @@
             integer_t const n, integer_t const kd, MatrixAB& ab,
             real_type& rcond, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( uplo == 'U' || uplo == 'L' );
@@ -140,6 +143,7 @@
             integer_t const n, integer_t const kd, MatrixAB& ab,
             real_type& rcond, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( uplo == 'U' || uplo == 'L' );
@@ -201,7 +205,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbrfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbrfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbrfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,18 @@
             integer_t const n, integer_t const kd, MatrixAB& ab, MatrixB& b,
             MatrixX& x, VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -165,6 +179,15 @@
             integer_t const n, integer_t const kd, MatrixAB& ab, MatrixB& b,
             MatrixX& x, VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -238,7 +261,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbtrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbtrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tbtrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -72,6 +74,9 @@
     static void compute( char const uplo, char const trans, char const diag,
             integer_t const n, integer_t const kd, MatrixAB& ab, MatrixB& b,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -102,7 +107,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgevc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgevc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgevc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -91,6 +93,15 @@
             VectorSELECT& select, integer_t const n, MatrixS& s, MatrixP& p,
             MatrixVL& vl, MatrixVR& vr, integer_t const mm, integer_t& m,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixS >::value_type, typename traits::matrix_traits<
+                MatrixP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixS >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixS >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( side == 'R' || side == 'L' || side == 'B' );
         assert( howmny == 'A' || howmny == 'B' || howmny == 'S' );
@@ -152,6 +163,15 @@
             VectorSELECT& select, integer_t const n, MatrixS& s, MatrixP& p,
             MatrixVL& vl, MatrixVR& vr, integer_t const mm, integer_t& m,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixS >::value_type, typename traits::matrix_traits<
+                MatrixP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixS >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixS >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( side == 'R' || side == 'L' || side == 'B' );
         assert( howmny == 'A' || howmny == 'B' || howmny == 'S' );
@@ -214,14 +234,14 @@
         VectorSELECT& select, integer_t const n, MatrixS& s, MatrixP& p,
         MatrixVL& vl, MatrixVR& vr, integer_t const mm, integer_t& m,
         Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     tgevc_impl< value_type >::compute( side, howmny, select, n, s, p, vl,
             vr, mm, m, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgexc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgexc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgexc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -87,6 +89,15 @@
     static void compute( logical_t const wantq, logical_t const wantz,
             integer_t const n, MatrixA& a, MatrixB& b, MatrixQ& q, MatrixZ& z,
             integer_t& ifst, integer_t& ilst, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,n) );
@@ -118,6 +129,15 @@
             integer_t const n, MatrixA& a, MatrixB& b, MatrixQ& q, MatrixZ& z,
             integer_t const ifst, integer_t& ilst, integer_t& info,
             detail::workspace$WORKSPACE_SIZE< $WORKSPACE_TYPES > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,n) );
@@ -168,7 +188,6 @@
             ilst, info );
     return info;
 }
-
 // template function to call tgexc
 template< typename MatrixA, typename MatrixB, typename MatrixQ,
         typename MatrixZ, typename Workspace >
@@ -183,7 +202,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsen.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsen.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsen.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -114,6 +116,27 @@
             VectorALPHAI& alphai, VectorBETA& beta, MatrixQ& q, MatrixZ& z,
             integer_t& m, real_type& pl, real_type& pr, VectorDIF& dif,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorDIF >::value_type > );
 #ifndef NDEBUG
         assert( traits::vector_size(select) >= n );
         assert( n >= 0 );
@@ -213,6 +236,21 @@
             MatrixQ& q, MatrixZ& z, integer_t& m, real_type& pl,
             real_type& pr, VectorDIF& dif, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( traits::vector_size(select) >= n );
         assert( n >= 0 );
@@ -305,13 +343,13 @@
         typename traits::vector_traits< VectorSELECT >::value_type& pl,
         typename traits::vector_traits< VectorSELECT >::value_type& pr,
         VectorDIF& dif, Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     tgsen_impl< value_type >::compute( ijob, wantq, wantz, select, n, a,
             b, alphar, alphai, beta, q, z, m, pl, pr, dif, info, work );
     return info;
 }
-
 // template function to call tgsen
 template< typename VectorSELECT, typename MatrixA, typename MatrixB,
         typename VectorALPHA, typename VectorBETA, typename MatrixQ,
@@ -319,18 +357,18 @@
 inline integer_t tgsen( integer_t const ijob, logical_t const wantq,
         logical_t const wantz, VectorSELECT& select, integer_t const n,
         MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta,
-        MatrixQ& q, MatrixZ& z, integer_t& m,
-        typename traits::vector_traits< VectorSELECT >::value_type& pl,
-        typename traits::vector_traits< VectorSELECT >::value_type& pr,
-        VectorDIF& dif, Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+        MatrixQ& q, MatrixZ& z, integer_t& m, typename traits::vector_traits<
+        VectorSELECT >::value_type& pl, typename traits::vector_traits<
+        VectorSELECT >::value_type& pr, VectorDIF& dif,
+        Workspace work = optimal_workspace() ) {
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     tgsen_impl< value_type >::compute( ijob, wantq, wantz, select, n, a,
             b, alpha, beta, q, z, m, pl, pr, dif, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsja.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsja.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsja.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -106,8 +108,26 @@
             integer_t const k, integer_t const l, MatrixA& a, MatrixB& b,
             real_type const tola, real_type const tolb, VectorALPHA& alpha,
             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
-            integer_t& ncycle, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            integer_t& ncycle, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( jobu == 'U' || jobu == 'I' || jobu == 'N' );
         assert( jobv == 'V' || jobv == 'I' || jobv == 'N' );
@@ -184,8 +204,23 @@
             integer_t const k, integer_t const l, MatrixA& a, MatrixB& b,
             real_type const tola, real_type const tolb, VectorALPHA& alpha,
             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
-            integer_t& ncycle, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            integer_t& ncycle, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorALPHA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( jobu == 'U' || jobu == 'I' || jobu == 'N' );
         assert( jobv == 'V' || jobv == 'I' || jobv == 'N' );
@@ -254,11 +289,11 @@
         typename MatrixQ, typename Workspace >
 inline integer_t tgsja( char const jobu, char const jobv,
         char const jobq, integer_t const k, integer_t const l, MatrixA& a,
-        MatrixB& b,
-        typename traits::matrix_traits< MatrixA >::value_type const tola,
-        typename traits::matrix_traits< MatrixA >::value_type const tolb,
-        VectorALPHA& alpha, VectorBETA& beta, MatrixU& u, MatrixV& v,
-        MatrixQ& q, integer_t& ncycle, Workspace work = optimal_workspace() ) {
+        MatrixB& b, typename traits::matrix_traits<
+        MatrixA >::value_type const tola, typename traits::matrix_traits<
+        MatrixA >::value_type const tolb, VectorALPHA& alpha,
+        VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
+        integer_t& ncycle, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     tgsja_impl< value_type >::compute( jobu, jobv, jobq, k, l, a, b,
@@ -266,7 +301,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsna.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsna.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsna.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -98,6 +100,21 @@
             MatrixVL& vl, MatrixVR& vr, VectorS& s, VectorDIF& dif,
             integer_t const mm, integer_t& m, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorDIF >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'V' || job == 'B' );
         assert( howmny == 'A' || howmny == 'S' );
@@ -188,6 +205,18 @@
             MatrixVL& vl, MatrixVR& vr, VectorS& s, VectorDIF& dif,
             integer_t const mm, integer_t& m, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorDIF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'V' || job == 'B' );
         assert( howmny == 'A' || howmny == 'S' );
@@ -260,14 +289,14 @@
         MatrixVL& vl, MatrixVR& vr, VectorS& s, VectorDIF& dif,
         integer_t const mm, integer_t& m,
         Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     tgsna_impl< value_type >::compute( job, howmny, select, n, a, b, vl,
             vr, s, dif, mm, m, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsyl.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsyl.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tgsyl.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -106,6 +108,21 @@
             MatrixC& c, MatrixD& d, MatrixE& e, MatrixF& f, real_type& scale,
             real_type& dif, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixF >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' );
         assert( traits::vector_size(work.select(real_type()) >= min_size_work(
@@ -187,6 +204,21 @@
             MatrixC& c, MatrixD& d, MatrixE& e, MatrixF& f, real_type& scale,
             real_type& dif, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixF >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'C' );
         assert( traits::vector_size(work.select(value_type()) >=
@@ -270,7 +302,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tprfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tprfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tprfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -88,6 +90,18 @@
             integer_t const n, MatrixAP& ap, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -159,6 +173,15 @@
             integer_t const n, MatrixAP& ap, MatrixB& b, MatrixX& x,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -230,7 +253,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tptrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tptrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tptrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixAP, typename MatrixB >
     static void compute( char const uplo, char const trans, char const diag,
             integer_t const n, MatrixAP& ap, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -89,7 +94,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trcon.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trcon.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trcon.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -75,8 +77,9 @@
     // user-defined workspace specialization
     template< typename MatrixA, typename WORK, typename IWORK >
     static void compute( char const norm, char const uplo, char const diag,
-            MatrixA& a, real_type& rcond, integer_t& info,
-            detail::workspace2< WORK, IWORK > work ) {
+            MatrixA& a, real_type& rcond, integer_t& info, detail::workspace2<
+            WORK, IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( uplo == 'U' || uplo == 'L' );
@@ -135,8 +138,9 @@
     // user-defined workspace specialization
     template< typename MatrixA, typename WORK, typename RWORK >
     static void compute( char const norm, char const uplo, char const diag,
-            MatrixA& a, real_type& rcond, integer_t& info,
-            detail::workspace2< WORK, RWORK > work ) {
+            MatrixA& a, real_type& rcond, integer_t& info, detail::workspace2<
+            WORK, RWORK > work ) {
+        
 #ifndef NDEBUG
         assert( norm == '1' || norm == 'O' || norm == 'I' );
         assert( uplo == 'U' || uplo == 'L' );
@@ -189,9 +193,8 @@
 // template function to call trcon
 template< typename MatrixA, typename Workspace >
 inline integer_t trcon( char const norm, char const uplo,
-        char const diag, MatrixA& a,
-        typename traits::matrix_traits< MatrixA >::value_type& rcond,
-        Workspace work = optimal_workspace() ) {
+        char const diag, MatrixA& a, typename traits::matrix_traits<
+        MatrixA >::value_type& rcond, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     trcon_impl< value_type >::compute( norm, uplo, diag, a, rcond, info,
@@ -199,7 +202,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trevc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trevc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trevc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -87,6 +89,12 @@
             VectorSELECT& select, MatrixT& t, MatrixVL& vl, MatrixVR& vr,
             integer_t const mm, integer_t& m, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( side == 'R' || side == 'L' || side == 'B' );
         assert( howmny == 'A' || howmny == 'B' || howmny == 'S' );
@@ -148,6 +156,12 @@
             VectorSELECT& select, MatrixT& t, MatrixVL& vl, MatrixVR& vr,
             integer_t const mm, integer_t& m, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( side == 'R' || side == 'L' || side == 'B' );
         assert( howmny == 'A' || howmny == 'B' || howmny == 'S' );
@@ -212,14 +226,14 @@
         VectorSELECT& select, MatrixT& t, MatrixVL& vl, MatrixVR& vr,
         integer_t const mm, integer_t& m,
         Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     trevc_impl< value_type >::compute( side, howmny, select, t, vl, vr,
             mm, m, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trexc.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trexc.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trexc.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -76,6 +78,9 @@
     template< typename MatrixT, typename MatrixQ >
     static void compute( char const compq, MatrixT& t, MatrixQ& q,
             integer_t& ifst, integer_t& ilst, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( compq == 'V' || compq == 'N' );
         assert( traits::matrix_size2(t) >= 0 );
@@ -105,6 +110,9 @@
     static void compute( char const compq, MatrixT& t, MatrixQ& q,
             integer_t const ifst, integer_t const ilst, integer_t& info,
             detail::workspace$WORKSPACE_SIZE< $WORKSPACE_TYPES > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( compq == 'V' || compq == 'N' );
         assert( traits::matrix_size2(t) >= 0 );
@@ -149,7 +157,6 @@
     trexc_impl< value_type >::compute( compq, t, q, ifst, ilst, info );
     return info;
 }
-
 // template function to call trexc
 template< typename MatrixT, typename MatrixQ, typename Workspace >
 inline integer_t trexc( char const compq, MatrixT& t, MatrixQ& q,
@@ -162,7 +169,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trrfs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trrfs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trrfs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,18 @@
             MatrixA& a, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -168,6 +182,15 @@
             MatrixA& a, MatrixB& b, MatrixX& x, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -243,7 +266,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsen.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsen.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsen.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -65,6 +67,12 @@
             VectorSELECT& select, MatrixT& t, MatrixQ& q, VectorW& w,
             integer_t& m, real_type& s, real_type& sep, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
 #ifndef NDEBUG
         assert( job == 'N' || job == 'E' || job == 'V' || job == 'B' );
         assert( compq == 'V' || compq == 'N' );
@@ -127,18 +135,18 @@
         typename VectorW, typename Workspace >
 inline integer_t trsen( char const job, char const compq,
         VectorSELECT& select, MatrixT& t, MatrixQ& q, VectorW& w,
-        integer_t& m,
-        typename traits::vector_traits< VectorSELECT >::value_type& s,
-        typename traits::vector_traits< VectorSELECT >::value_type& sep,
+        integer_t& m, typename traits::vector_traits<
+        VectorSELECT >::value_type& s, typename traits::vector_traits<
+        VectorSELECT >::value_type& sep,
         Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     trsen_impl< value_type >::compute( job, compq, select, t, q, w, m, s,
             sep, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsna.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsna.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsna.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -93,6 +95,18 @@
             VectorSELECT& select, MatrixT& t, MatrixVL& vl, MatrixVR& vr,
             VectorS& s, VectorSEP& sep, integer_t const mm, integer_t& m,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::vector_traits<
+                VectorSEP >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'V' || job == 'B' );
         assert( howmny == 'A' || howmny == 'S' );
@@ -165,6 +179,15 @@
             VectorSELECT& select, MatrixT& t, MatrixVL& vl, MatrixVR& vr,
             VectorS& s, VectorSEP& sep, integer_t const mm, integer_t& m,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorSEP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixT >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( job == 'E' || job == 'V' || job == 'B' );
         assert( howmny == 'A' || howmny == 'S' );
@@ -231,14 +254,14 @@
         VectorSELECT& select, MatrixT& t, MatrixVL& vl, MatrixVR& vr,
         VectorS& s, VectorSEP& sep, integer_t const mm, integer_t& m,
         Workspace work = optimal_workspace() ) {
-    typedef typename traits::vector_traits< VectorSELECT >::value_type value_type;
+    typedef typename traits::vector_traits<
+            VectorSELECT >::value_type value_type;
     integer_t info(0);
     trsna_impl< value_type >::compute( job, howmny, select, t, vl, vr, s,
             sep, mm, m, info, work );
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsyl.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsyl.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trsyl.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -82,6 +84,12 @@
             integer_t const isgn, integer_t const m, integer_t const n,
             MatrixA& a, MatrixB& b, MatrixC& c, real_type& scale,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( trana == 'N' || trana == 'T' || trana == 'C' );
         assert( tranb == 'N' || tranb == 'T' || tranb == 'C' );
@@ -111,6 +119,12 @@
             integer_t const isgn, integer_t const m, integer_t const n,
             MatrixA& a, MatrixB& b, MatrixC& c, real_type& scale,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( trana == 'N' || trana == 'C' );
         assert( tranb == 'N' || tranb == 'C' );
@@ -132,8 +146,8 @@
 template< typename MatrixA, typename MatrixB, typename MatrixC >
 inline integer_t trsyl( char const trana, char const tranb,
         integer_t const isgn, integer_t const m, integer_t const n,
-        MatrixA& a, MatrixB& b, MatrixC& c,
-        typename traits::matrix_traits< MatrixA >::value_type& scale ) {
+        MatrixA& a, MatrixB& b, MatrixC& c, typename traits::matrix_traits<
+        MatrixA >::value_type& scale ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     trsyl_impl< value_type >::compute( trana, tranb, isgn, m, n, a, b, c,
@@ -141,7 +155,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtri.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtri.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtri.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,6 +59,7 @@
     template< typename MatrixA >
     static void compute( char const uplo, char const diag, MatrixA& a,
             integer_t& info ) {
+        
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( diag == 'N' || diag == 'U' );
@@ -80,7 +83,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtrs.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtrs.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/trtrs.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -71,6 +73,9 @@
     template< typename MatrixA, typename MatrixB >
     static void compute( char const uplo, char const trans, char const diag,
             MatrixA& a, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -100,7 +105,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tzrzf.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tzrzf.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/tzrzf.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -75,6 +77,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= traits::matrix_size1(a) );
@@ -129,6 +134,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= traits::matrix_size1(a) );
@@ -183,7 +191,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungbr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungbr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungbr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( char const vect, integer_t const m,
             integer_t const n, integer_t const k, MatrixA& a, VectorTAU& tau,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'Q' || vect == 'P' );
         assert( m >= 0 );
@@ -116,7 +121,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unghr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unghr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unghr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( integer_t const n, integer_t const ilo,
             integer_t const ihi, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::leading_dimension(a) >= std::max(1,n) );
@@ -115,7 +120,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unglq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unglq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unglq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= m );
@@ -116,7 +121,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungql.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungql.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungql.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= n );
@@ -116,7 +121,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= n );
@@ -116,7 +121,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungrq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungrq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungrq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( integer_t const m, integer_t const n,
             integer_t const k, MatrixA& a, VectorTAU& tau, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( m >= 0 );
         assert( n >= m );
@@ -116,7 +121,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/ungtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -58,6 +60,9 @@
     template< typename MatrixA, typename VectorTAU, typename WORK >
     static void compute( integer_t const n, MatrixA& a, VectorTAU& tau,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -116,7 +121,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmbr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmbr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmbr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -66,6 +68,12 @@
     static void compute( char const vect, char const side, char const trans,
             integer_t const k, MatrixA& a, VectorTAU& tau, MatrixC& c,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( vect == 'Q' || vect == 'P' );
         assert( side == 'L' || side == 'R' );
@@ -139,7 +147,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmhr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmhr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmhr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -65,8 +67,14 @@
             typename WORK >
     static void compute( char const side, char const trans,
             integer_t const ilo, integer_t const ihi, MatrixA& a,
-            VectorTAU& tau, MatrixC& c, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAU& tau, MatrixC& c, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'C' );
@@ -139,7 +147,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmlq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmlq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmlq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'C' );
@@ -134,7 +142,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmql.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmql.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmql.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'C' );
@@ -133,7 +141,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmqr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmqr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmqr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'C' );
@@ -133,7 +141,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrq.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrq.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrq.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'C' );
@@ -134,7 +142,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrz.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrz.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmrz.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,12 @@
     static void compute( char const side, char const trans, integer_t const k,
             MatrixA& a, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( trans == 'N' || trans == 'C' );
@@ -130,7 +138,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/unmtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,8 +64,14 @@
     template< typename MatrixA, typename VectorTAU, typename MatrixC,
             typename WORK >
     static void compute( char const side, char const trans, MatrixA& a,
-            VectorTAU& tau, MatrixC& c, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorTAU& tau, MatrixC& c, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -134,7 +142,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upgtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upgtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upgtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,12 @@
             typename WORK >
     static void compute( char const uplo, VectorAP& ap, VectorTAU& tau,
             MatrixQ& q, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( traits::matrix_size2(q) >= 0 );
@@ -110,7 +118,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upmtr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upmtr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/computational/upmtr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,12 @@
     static void compute( char const side, char const uplo, char const trans,
             VectorAP& ap, VectorTAU& tau, MatrixC& c, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::vector_traits<
+                VectorTAU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorAP >::value_type, typename traits::matrix_traits<
+                MatrixC >::value_type > );
 #ifndef NDEBUG
         assert( side == 'L' || side == 'R' );
         assert( uplo == 'U' || uplo == 'L' );
@@ -116,7 +124,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/cgesv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/cgesv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/cgesv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -55,6 +57,12 @@
     static void compute( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, MatrixX& x,
             integer_t& iter, integer_t& info, detail::workspace2< WORK,
             SWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -122,7 +130,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -67,6 +69,9 @@
     template< typename MatrixAB, typename VectorIPIV, typename MatrixB >
     static void compute( integer_t const kl, integer_t const ku, MatrixAB& ab,
             VectorIPIV& ipiv, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size2(ab) >= 0 );
         assert( kl >= 0 );
@@ -96,7 +101,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gbsvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -107,6 +109,27 @@
             VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' || fact == 'E' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -195,6 +218,24 @@
             VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' || fact == 'E' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -285,7 +326,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gees.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gees.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gees.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,15 @@
             MatrixA& a, integer_t& sdim, VectorWR& wr, VectorWI& wi,
             MatrixVS& vs, integer_t& info, detail::workspace2< WORK,
             BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVS >::value_type > );
 #ifndef NDEBUG
         assert( jobvs == 'N' || jobvs == 'V' );
         assert( sort == 'N' || sort == 'S' );
@@ -173,6 +184,12 @@
     static void compute( char const jobvs, char const sort, logical_t* select,
             MatrixA& a, integer_t& sdim, VectorW& w, MatrixVS& vs,
             integer_t& info, detail::workspace3< WORK, RWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVS >::value_type > );
 #ifndef NDEBUG
         assert( jobvs == 'N' || jobvs == 'V' );
         assert( sort == 'N' || sort == 'S' );
@@ -263,7 +280,6 @@
             wi, vs, info, work );
     return info;
 }
-
 // template function to call gees
 template< typename MatrixA, typename VectorW, typename MatrixVS,
         typename Workspace >
@@ -277,7 +293,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geesx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geesx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geesx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -96,6 +98,15 @@
             char const sense, MatrixA& a, integer_t& sdim, VectorWR& wr,
             VectorWI& wi, MatrixVS& vs, real_type& rconde, real_type& rcondv,
             integer_t& info, detail::workspace3< WORK, IWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVS >::value_type > );
 #ifndef NDEBUG
         assert( jobvs == 'N' || jobvs == 'V' );
         assert( sort == 'N' || sort == 'S' );
@@ -202,6 +213,12 @@
             char const sense, MatrixA& a, integer_t& sdim, VectorW& w,
             MatrixVS& vs, real_type& rconde, real_type& rcondv,
             integer_t& info, detail::workspace3< WORK, RWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVS >::value_type > );
 #ifndef NDEBUG
         assert( jobvs == 'N' || jobvs == 'V' );
         assert( sort == 'N' || sort == 'S' );
@@ -302,16 +319,14 @@
             sdim, wr, wi, vs, rconde, rcondv, info, work );
     return info;
 }
-
 // template function to call geesx
 template< typename MatrixA, typename VectorW, typename MatrixVS,
         typename Workspace >
 inline integer_t geesx( char const jobvs, char const sort,
         logical_t* select, char const sense, MatrixA& a, integer_t& sdim,
-        VectorW& w, MatrixVS& vs,
-        typename traits::matrix_traits< MatrixA >::value_type& rconde,
-        typename traits::matrix_traits< MatrixA >::value_type& rcondv,
-        Workspace work = optimal_workspace() ) {
+        VectorW& w, MatrixVS& vs, typename traits::matrix_traits<
+        MatrixA >::value_type& rconde, typename traits::matrix_traits<
+        MatrixA >::value_type& rcondv, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     geesx_impl< value_type >::compute( jobvs, sort, select, sense, a,
@@ -319,7 +334,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -90,6 +92,18 @@
     static void compute( char const jobvl, char const jobvr, MatrixA& a,
             VectorWR& wr, VectorWI& wi, MatrixVL& vl, MatrixVR& vr,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( jobvl == 'N' || jobvl == 'V' );
         assert( jobvr == 'N' || jobvr == 'V' );
@@ -163,6 +177,15 @@
     static void compute( char const jobvl, char const jobvr, MatrixA& a,
             VectorW& w, MatrixVL& vl, MatrixVR& vr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( jobvl == 'N' || jobvl == 'V' );
         assert( jobvr == 'N' || jobvr == 'V' );
@@ -242,7 +265,6 @@
             info, work );
     return info;
 }
-
 // template function to call geev
 template< typename MatrixA, typename VectorW, typename MatrixVL,
         typename MatrixVR, typename Workspace >
@@ -256,7 +278,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/geevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -106,6 +108,27 @@
             integer_t& ihi, VectorSCALE& scale, real_type& abnrm,
             VectorRCONDE& rconde, VectorRCONDV& rcondv, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorWI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorSCALE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRCONDE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRCONDV >::value_type > );
 #ifndef NDEBUG
         assert( balanc == 'N' || balanc == 'P' || balanc == 'S' ||
                 balanc == 'B' );
@@ -222,6 +245,21 @@
             VectorSCALE& scale, real_type& abnrm, VectorRCONDE& rconde,
             VectorRCONDV& rcondv, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorSCALE >::value_type, typename traits::vector_traits<
+                VectorRCONDE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorSCALE >::value_type, typename traits::vector_traits<
+                VectorRCONDV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( balanc == 'N' || balanc == 'P' || balanc == 'S' ||
                 balanc == 'B' );
@@ -318,10 +356,9 @@
 inline integer_t geevx( char const balanc, char const jobvl,
         char const jobvr, char const sense, MatrixA& a, VectorWR& wr,
         VectorWI& wi, MatrixVL& vl, MatrixVR& vr, integer_t& ilo,
-        integer_t& ihi, VectorSCALE& scale,
-        typename traits::matrix_traits< MatrixA >::value_type& abnrm,
-        VectorRCONDE& rconde, VectorRCONDV& rcondv,
-        Workspace work = optimal_workspace() ) {
+        integer_t& ihi, VectorSCALE& scale, typename traits::matrix_traits<
+        MatrixA >::value_type& abnrm, VectorRCONDE& rconde,
+        VectorRCONDV& rcondv, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     geevx_impl< value_type >::compute( balanc, jobvl, jobvr, sense, a,
@@ -329,7 +366,6 @@
             work );
     return info;
 }
-
 // template function to call geevx
 template< typename MatrixA, typename VectorW, typename MatrixVL,
         typename MatrixVR, typename VectorSCALE, typename VectorRCONDE,
@@ -337,10 +373,9 @@
 inline integer_t geevx( char const balanc, char const jobvl,
         char const jobvr, char const sense, MatrixA& a, VectorW& w,
         MatrixVL& vl, MatrixVR& vr, integer_t& ilo, integer_t& ihi,
-        VectorSCALE& scale,
-        typename traits::matrix_traits< MatrixA >::value_type& abnrm,
-        VectorRCONDE& rconde, VectorRCONDV& rcondv,
-        Workspace work = optimal_workspace() ) {
+        VectorSCALE& scale, typename traits::matrix_traits<
+        MatrixA >::value_type& abnrm, VectorRCONDE& rconde,
+        VectorRCONDV& rcondv, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     geevx_impl< value_type >::compute( balanc, jobvl, jobvr, sense, a, w,
@@ -348,7 +383,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gegv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gegv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gegv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -97,6 +99,24 @@
             MatrixB& b, VectorALPHAR& alphar, VectorALPHAI& alphai,
             VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( jobvl == 'N' || jobvl == 'V' );
         assert( jobvr == 'N' || jobvr == 'V' );
@@ -178,6 +198,21 @@
             MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl,
             MatrixVR& vr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( jobvl == 'N' || jobvl == 'V' );
         assert( jobvr == 'N' || jobvr == 'V' );
@@ -264,7 +299,6 @@
             alphai, beta, vl, vr, info, work );
     return info;
 }
-
 // template function to call gegv
 template< typename MatrixA, typename MatrixB, typename VectorALPHA,
         typename VectorBETA, typename MatrixVL, typename MatrixVR,
@@ -279,7 +313,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gels.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gels.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gels.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -81,6 +83,9 @@
     template< typename MatrixA, typename MatrixB, typename WORK >
     static void compute( char const trans, MatrixA& a, MatrixB& b,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'T' );
         assert( traits::matrix_size1(a) >= 0 );
@@ -145,6 +150,9 @@
     template< typename MatrixA, typename MatrixB, typename WORK >
     static void compute( char const trans, MatrixA& a, MatrixB& b,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( trans == 'N' || trans == 'C' );
         assert( traits::matrix_size1(a) >= 0 );
@@ -209,7 +217,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -23,6 +23,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -90,13 +92,19 @@
     static void compute( MatrixA& a, MatrixB& b, VectorS& s,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
         integer_t minmn = std::min( traits::matrix_size1(a),
                 traits::matrix_size2(a) );
         integer_t smlsiz = ilaenv(9, "GELSD", "");
         integer_t nlvl = static_cast<integer_t>(((std::log(
                 static_cast<real_type>(minmn)) /
                 std::log(static_cast<real_type>(2.))) / (smlsiz+1)) + 1);
+#ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -185,13 +193,16 @@
     static void compute( MatrixA& a, MatrixB& b, VectorS& s,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace3< WORK, RWORK, IWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
         integer_t minmn = std::min( traits::matrix_size1(a),
                 traits::matrix_size2(a) );
         integer_t smlsiz = ilaenv(9, "GELSD", "");
         integer_t nlvl = static_cast<integer_t>(((std::log(
                 static_cast<real_type>(minmn)) /
                 std::log(static_cast<real_type>(2.))) / (smlsiz+1)) + 1);
+#ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -296,7 +307,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelss.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelss.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelss.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -86,6 +88,12 @@
     static void compute( MatrixA& a, MatrixB& b, VectorS& s,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -156,9 +164,12 @@
     static void compute( MatrixA& a, MatrixB& b, VectorS& s,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
         integer_t minmn = std::min( traits::matrix_size1(a),
                 traits::matrix_size2(a) );
+#ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -245,7 +256,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsy.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsy.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gelsy.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -87,6 +89,9 @@
     static void compute( MatrixA& a, MatrixB& b, VectorJPVT& jpvt,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -154,6 +159,9 @@
     static void compute( MatrixA& a, MatrixB& b, VectorJPVT& jpvt,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -237,7 +245,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesdd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesdd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesdd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -88,9 +90,18 @@
     static void compute( char const jobz, MatrixA& a, VectorS& s, MatrixU& u,
             MatrixVT& vt, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVT >::value_type > );
         integer_t minmn = std::min( traits::matrix_size1(a),
                 traits::matrix_size2(a) );
+#ifndef NDEBUG
         assert( jobz == 'A' || jobz == 'S' || jobz == 'O' || jobz == 'N' );
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -165,9 +176,15 @@
     static void compute( char const jobz, MatrixA& a, VectorS& s, MatrixU& u,
             MatrixVT& vt, integer_t& info, detail::workspace3< WORK, RWORK,
             IWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVT >::value_type > );
         integer_t minmn = std::min( traits::matrix_size1(a),
                 traits::matrix_size2(a) );
+#ifndef NDEBUG
         assert( jobz == 'A' || jobz == 'S' || jobz == 'O' || jobz == 'N' );
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(a) >= 0 );
@@ -267,7 +284,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixA, typename VectorIPIV, typename MatrixB >
     static void compute( MatrixA& a, VectorIPIV& ipiv, MatrixB& b,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -89,7 +94,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -87,6 +89,15 @@
     static void compute( char const jobu, char const jobvt, MatrixA& a,
             VectorS& s, MatrixU& u, MatrixVT& vt, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVT >::value_type > );
 #ifndef NDEBUG
         assert( jobu == 'A' || jobu == 'S' || jobu == 'O' || jobu == 'N' );
         assert( jobvt == 'A' || jobvt == 'S' || jobvt == 'O' || jobvt == 'N' );
@@ -156,9 +167,15 @@
     static void compute( char const jobu, char const jobvt, MatrixA& a,
             VectorS& s, MatrixU& u, MatrixVT& vt, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVT >::value_type > );
         integer_t minmn = std::min( traits::matrix_size1(a),
                 traits::matrix_size2(a) );
+#ifndef NDEBUG
         assert( jobu == 'A' || jobu == 'S' || jobu == 'O' || jobu == 'N' );
         assert( jobvt == 'A' || jobvt == 'S' || jobvt == 'O' || jobvt == 'N' );
         assert( traits::matrix_size1(a) >= 0 );
@@ -246,7 +263,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gesvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -100,6 +102,27 @@
             VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' || fact == 'E' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -189,6 +212,24 @@
             VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' || fact == 'E' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -269,9 +310,8 @@
         typename Workspace >
 inline integer_t gesvx( char const fact, char const trans, MatrixA& a,
         MatrixAF& af, VectorIPIV& ipiv, char& equed, VectorR& r, VectorC& c,
-        MatrixB& b, MatrixX& x,
-        typename traits::matrix_traits< MatrixA >::value_type& rcond,
-        VectorFERR& ferr, VectorBERR& berr,
+        MatrixB& b, MatrixX& x, typename traits::matrix_traits<
+        MatrixA >::value_type& rcond, VectorFERR& ferr, VectorBERR& berr,
         Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
@@ -280,7 +320,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gges.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gges.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gges.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -110,6 +112,24 @@
             integer_t& sdim, VectorALPHAR& alphar, VectorALPHAI& alphai,
             VectorBETA& beta, MatrixVSL& vsl, MatrixVSR& vsr, integer_t& info,
             detail::workspace2< WORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSR >::value_type > );
 #ifndef NDEBUG
         assert( jobvsl == 'N' || jobvsl == 'V' );
         assert( jobvsr == 'N' || jobvsr == 'V' );
@@ -210,6 +230,21 @@
             integer_t& sdim, VectorALPHA& alpha, VectorBETA& beta,
             MatrixVSL& vsl, MatrixVSR& vsr, integer_t& info,
             detail::workspace3< WORK, RWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSR >::value_type > );
 #ifndef NDEBUG
         assert( jobvsl == 'N' || jobvsl == 'V' );
         assert( jobvsr == 'N' || jobvsr == 'V' );
@@ -318,7 +353,6 @@
             b, sdim, alphar, alphai, beta, vsl, vsr, info, work );
     return info;
 }
-
 // template function to call gges
 template< typename MatrixA, typename MatrixB, typename VectorALPHA,
         typename VectorBETA, typename MatrixVSL, typename MatrixVSR,
@@ -334,7 +368,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggesx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggesx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggesx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -118,6 +120,30 @@
             VectorALPHAI& alphai, VectorBETA& beta, MatrixVSL& vsl,
             MatrixVSR& vsr, VectorRCONDE& rconde, VectorRCONDV& rcondv,
             integer_t& info, detail::workspace3< WORK, IWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRCONDE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRCONDV >::value_type > );
 #ifndef NDEBUG
         assert( jobvsl == 'N' || jobvsl == 'V' );
         assert( jobvsr == 'N' || jobvsr == 'V' );
@@ -250,6 +276,24 @@
             MatrixVSL& vsl, MatrixVSR& vsr, VectorRCONDE& rconde,
             VectorRCONDV& rcondv, integer_t& info, detail::workspace4< WORK,
             RWORK, IWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorRCONDE >::value_type, typename traits::vector_traits<
+                VectorRCONDV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVSR >::value_type > );
 #ifndef NDEBUG
         assert( jobvsl == 'N' || jobvsl == 'V' );
         assert( jobvsr == 'N' || jobvsr == 'V' );
@@ -389,7 +433,6 @@
             info, work );
     return info;
 }
-
 // template function to call ggesx
 template< typename MatrixA, typename MatrixB, typename VectorALPHA,
         typename VectorBETA, typename MatrixVSL, typename MatrixVSR,
@@ -407,7 +450,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -97,6 +99,24 @@
             MatrixB& b, VectorALPHAR& alphar, VectorALPHAI& alphai,
             VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( jobvl == 'N' || jobvl == 'V' );
         assert( jobvr == 'N' || jobvr == 'V' );
@@ -178,6 +198,21 @@
             MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl,
             MatrixVR& vr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( jobvl == 'N' || jobvl == 'V' );
         assert( jobvr == 'N' || jobvr == 'V' );
@@ -264,7 +299,6 @@
             alphai, beta, vl, vr, info, work );
     return info;
 }
-
 // template function to call ggev
 template< typename MatrixA, typename MatrixB, typename VectorALPHA,
         typename VectorBETA, typename MatrixVL, typename MatrixVR,
@@ -279,7 +313,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -123,6 +125,36 @@
             VectorLSCALE& lscale, VectorRSCALE& rscale, real_type& abnrm,
             real_type& bbnrm, VectorRCONDE& rconde, VectorRCONDV& rcondv,
             integer_t& info, detail::workspace3< WORK, IWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHAI >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorLSCALE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRSCALE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRCONDE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorRCONDV >::value_type > );
 #ifndef NDEBUG
         assert( balanc == 'N' || balanc == 'P' || balanc == 'S' ||
                 balanc == 'B' );
@@ -266,6 +298,30 @@
             VectorRSCALE& rscale, real_type& abnrm, real_type& bbnrm,
             VectorRCONDE& rconde, VectorRCONDV& rcondv, integer_t& info,
             detail::workspace4< WORK, RWORK, IWORK, BWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorLSCALE >::value_type, typename traits::vector_traits<
+                VectorRSCALE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorLSCALE >::value_type, typename traits::vector_traits<
+                VectorRCONDE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorLSCALE >::value_type, typename traits::vector_traits<
+                VectorRCONDV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVL >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixVR >::value_type > );
 #ifndef NDEBUG
         assert( balanc == 'N' || balanc == 'P' || balanc == 'S' ||
                 balanc == 'B' );
@@ -425,7 +481,6 @@
             bbnrm, rconde, rcondv, info, work );
     return info;
 }
-
 // template function to call ggevx
 template< typename MatrixA, typename MatrixB, typename VectorALPHA,
         typename VectorBETA, typename MatrixVL, typename MatrixVR,
@@ -435,11 +490,10 @@
         char const jobvr, char const sense, MatrixA& a, MatrixB& b,
         VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr,
         integer_t& ilo, integer_t& ihi, VectorLSCALE& lscale,
-        VectorRSCALE& rscale,
-        typename traits::matrix_traits< MatrixA >::value_type& abnrm,
-        typename traits::matrix_traits< MatrixA >::value_type& bbnrm,
-        VectorRCONDE& rconde, VectorRCONDV& rcondv,
-        Workspace work = optimal_workspace() ) {
+        VectorRSCALE& rscale, typename traits::matrix_traits<
+        MatrixA >::value_type& abnrm, typename traits::matrix_traits<
+        MatrixA >::value_type& bbnrm, VectorRCONDE& rconde,
+        VectorRCONDV& rcondv, Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
     integer_t info(0);
     ggevx_impl< value_type >::compute( balanc, jobvl, jobvr, sense, a, b,
@@ -448,7 +502,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggglm.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggglm.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggglm.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -86,6 +88,18 @@
             typename VectorX, typename VectorY, typename WORK >
     static void compute( MatrixA& a, MatrixB& b, VectorD& d, VectorX& x,
             VectorY& y, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(b) >= 0 );
         assert( traits::matrix_size2(b) >=
@@ -156,6 +170,18 @@
             typename VectorX, typename VectorY, typename WORK >
     static void compute( MatrixA& a, MatrixB& b, VectorD& d, VectorX& x,
             VectorY& y, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(b) >= 0 );
         assert( traits::matrix_size2(b) >=
@@ -226,7 +252,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gglse.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gglse.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gglse.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -86,6 +88,18 @@
             typename VectorD, typename VectorX, typename WORK >
     static void compute( MatrixA& a, MatrixB& b, VectorC& c, VectorD& d,
             VectorX& x, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -155,6 +169,18 @@
             typename VectorD, typename VectorX, typename WORK >
     static void compute( MatrixA& a, MatrixB& b, VectorC& c, VectorD& d,
             VectorX& x, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size1(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -224,7 +250,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggsvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggsvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ggsvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -107,6 +109,24 @@
             VectorALPHA& alpha, VectorBETA& beta, MatrixU& u, MatrixV& v,
             MatrixQ& q, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorALPHA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( jobu == 'U' || jobu == 'N' );
         assert( jobv == 'V' || jobv == 'N' );
@@ -192,6 +212,21 @@
             VectorALPHA& alpha, VectorBETA& beta, MatrixU& u, MatrixV& v,
             MatrixQ& q, integer_t& info, detail::workspace3< WORK, RWORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorALPHA >::value_type, typename traits::vector_traits<
+                VectorBETA >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixV >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
 #ifndef NDEBUG
         assert( jobu == 'U' || jobu == 'N' );
         assert( jobv == 'V' || jobv == 'N' );
@@ -286,7 +321,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -68,6 +70,15 @@
             typename MatrixB >
     static void compute( integer_t const n, VectorDL& dl, VectorD& d,
             VectorDU& du, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -95,7 +106,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/gtsvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -108,6 +110,36 @@
             MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDLF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDUF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU2 >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -195,6 +227,33 @@
             MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr,
             VectorBERR& berr, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorD >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDLF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDUF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::vector_traits<
+                VectorDU2 >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorDL >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( trans == 'N' || trans == 'T' || trans == 'C' );
@@ -284,7 +343,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( char const jobz, integer_t const n,
             integer_t const kd, MatrixAB& ab, VectorW& w, MatrixZ& z,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -123,7 +128,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -66,6 +68,9 @@
     static void compute( char const jobz, integer_t const n,
             integer_t const kd, MatrixAB& ab, VectorW& w, MatrixZ& z,
             integer_t& info, detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -173,7 +178,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -75,6 +77,12 @@
             real_type const abstol, integer_t& m, VectorW& w, MatrixZ& z,
             VectorIFAIL& ifail, integer_t& info, detail::workspace3< WORK,
             RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -162,7 +170,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -66,6 +68,12 @@
             integer_t const ka, integer_t const kb, MatrixAB& ab,
             MatrixBB& bb, VectorW& w, MatrixZ& z, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -135,7 +143,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -71,6 +73,12 @@
             integer_t const ka, integer_t const kb, MatrixAB& ab,
             MatrixBB& bb, VectorW& w, MatrixZ& z, integer_t& info,
             detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -186,7 +194,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hbgvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -79,6 +81,15 @@
             integer_t const il, integer_t const iu, real_type const abstol,
             integer_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail,
             integer_t& info, detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -172,7 +183,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,6 +61,7 @@
             typename RWORK >
     static void compute( char const jobz, MatrixA& a, VectorW& w,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -126,7 +129,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,7 @@
             typename RWORK, typename IWORK >
     static void compute( char const jobz, MatrixA& a, VectorW& w,
             integer_t& info, detail::workspace3< WORK, RWORK, IWORK > work ) {
+        
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -164,7 +167,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -75,6 +77,9 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz, integer_t& info,
             detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -181,7 +186,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/heevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -73,6 +75,9 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorIFAIL& ifail, integer_t& info,
             detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -177,7 +182,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,9 @@
     static void compute( integer_t const itype, char const jobz,
             integer_t const n, MatrixA& a, MatrixB& b, VectorW& w,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -137,7 +142,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -66,6 +68,9 @@
     static void compute( integer_t const itype, char const jobz,
             integer_t const n, MatrixA& a, MatrixB& b, VectorW& w,
             integer_t& info, detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -173,7 +178,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hegvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -79,6 +81,12 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorIFAIL& ifail, integer_t& info,
             detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -181,7 +189,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
             typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, MatrixB& b,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -121,7 +126,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hesvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -72,6 +74,18 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -173,7 +187,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -61,6 +63,9 @@
     static void compute( char const jobz, integer_t const n, MatrixAP& ap,
             VectorW& w, MatrixZ& z, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -115,7 +120,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,9 @@
     static void compute( char const jobz, integer_t const n, MatrixAP& ap,
             VectorW& w, MatrixZ& z, integer_t& info, detail::workspace3< WORK,
             RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -164,7 +169,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -69,6 +71,9 @@
             integer_t const il, integer_t const iu, real_type const abstol,
             integer_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail,
             integer_t& info, detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -137,12 +142,12 @@
 template< typename MatrixAP, typename VectorW, typename MatrixZ,
         typename VectorIFAIL, typename Workspace >
 inline integer_t hpevx( char const jobz, char const range,
-        integer_t const n, MatrixAP& ap,
-        typename traits::matrix_traits< MatrixAP >::value_type const vl,
-        typename traits::matrix_traits< MatrixAP >::value_type const vu,
-        integer_t const il, integer_t const iu,
-        typename traits::matrix_traits< MatrixAP >::value_type const abstol,
-        integer_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail,
+        integer_t const n, MatrixAP& ap, typename traits::matrix_traits<
+        MatrixAP >::value_type const vl, typename traits::matrix_traits<
+        MatrixAP >::value_type const vu, integer_t const il,
+        integer_t const iu, typename traits::matrix_traits<
+        MatrixAP >::value_type const abstol, integer_t& m, VectorW& w,
+        MatrixZ& z, VectorIFAIL& ifail,
         Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixAP >::value_type value_type;
     integer_t info(0);
@@ -151,7 +156,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,6 +64,12 @@
             integer_t const n, MatrixAP& ap, MatrixBP& bp, VectorW& w,
             MatrixZ& z, integer_t& info, detail::workspace2< WORK,
             RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixBP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -124,7 +132,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -69,6 +71,12 @@
             integer_t const n, MatrixAP& ap, MatrixBP& bp, VectorW& w,
             MatrixZ& z, integer_t& info, detail::workspace3< WORK, RWORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixBP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -176,7 +184,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpgvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -74,6 +76,12 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorIFAIL& ifail, integer_t& info,
             detail::workspace3< WORK, RWORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixBP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -159,7 +167,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,6 +55,9 @@
     template< typename MatrixAP, typename VectorIPIV, typename MatrixB >
     static void compute( MatrixAP& ap, VectorIPIV& ipiv, MatrixB& b,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
                 traits::matrix_uplo_tag(ap) == 'L' );
@@ -78,7 +83,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/hpsvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -69,6 +71,18 @@
             MatrixAFP& afp, VectorIPIV& ipiv, MatrixB& b, MatrixX& x,
             real_type& rcond, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -146,7 +160,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lacgv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lacgv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lacgv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -49,6 +51,7 @@
     template< typename VectorX >
     static void compute( integer_t const n, VectorX& x,
             integer_t const incx ) {
+        
 #ifndef NDEBUG
         assert( n >= 0 );
 #endif
@@ -67,7 +70,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lalsd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lalsd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/lalsd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -86,11 +88,17 @@
             integer_t const n, VectorD& d, VectorE& e, MatrixB& b,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
         integer_t nlvl = std::max( 0, static_cast<integer_t>(
             std::log(static_cast<real_type>(n)/static_cast<real_type>(smlsiz+
                     1)) /
             std::log(static_cast<real_type>(2.)) ) + 1 );
+#ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
         assert( traits::matrix_size2(b) >= 1 );
@@ -163,12 +171,15 @@
             integer_t const n, VectorD& d, VectorE& e, MatrixB& b,
             real_type const rcond, integer_t& rank, integer_t& info,
             detail::workspace3< WORK, RWORK, IWORK > work ) {
-#ifndef NDEBUG
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
         integer_t nlvl = std::max( 0, static_cast<integer_t>(
             std::log(static_cast<real_type>(std::min(traits::matrix_size2(b),
                     n))/
             static_cast<real_type>(smlsiz+1)) /
             std::log(static_cast<real_type>(2.))) + 1 );
+#ifndef NDEBUG
         assert( uplo == 'U' || uplo == 'L' );
         assert( n >= 0 );
         assert( traits::matrix_size2(b) >= 1 );
@@ -254,7 +265,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/largv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/largv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/largv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_LARGV_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -52,8 +57,12 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct largv_impl{};
+
+// real specialization
 template< typename ValueType >
-struct largv_impl {
+struct largv_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -63,6 +72,38 @@
     static void compute( integer_t const n, VectorX& x, integer_t const incx,
             VectorY& y, integer_t const incy, VectorC& c,
             integer_t const incc ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorC >::value_type > );
+#ifndef NDEBUG
+        assert( traits::vector_size(x) >= 1+(n-1)*incx );
+        assert( traits::vector_size(y) >= 1+(n-1)*incy );
+        assert( traits::vector_size(c) >= 1+(n-1)*incc );
+#endif
+        detail::largv( n, traits::vector_storage(x), incx,
+                traits::vector_storage(y), incy, traits::vector_storage(c),
+                incc );
+    }
+};
+
+// complex specialization
+template< typename ValueType >
+struct largv_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename VectorX, typename VectorY, typename VectorC >
+    static void compute( integer_t const n, VectorX& x, integer_t const incx,
+            VectorY& y, integer_t const incy, VectorC& c,
+            integer_t const incc ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorX >::value_type, typename traits::vector_traits<
+                VectorY >::value_type > );
 #ifndef NDEBUG
         assert( traits::vector_size(x) >= 1+(n-1)*incx );
         assert( traits::vector_size(y) >= 1+(n-1)*incy );
@@ -86,7 +127,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixAB, typename MatrixB >
     static void compute( integer_t const kd, MatrixAB& ab, MatrixB& b,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
                 traits::matrix_uplo_tag(ab) == 'L' );
@@ -90,7 +95,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/pbsvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -99,6 +101,24 @@
             VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'Y' || fact == 'N' || fact == 'E' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -182,6 +202,21 @@
             VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixAFB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'Y' || fact == 'N' || fact == 'E' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -256,9 +291,8 @@
         typename VectorBERR, typename Workspace >
 inline integer_t pbsvx( char const fact, integer_t const n,
         integer_t const kd, MatrixAB& ab, MatrixAFB& afb, char& equed,
-        VectorS& s, MatrixB& b, MatrixX& x,
-        typename traits::matrix_traits< MatrixAB >::value_type& rcond,
-        VectorFERR& ferr, VectorBERR& berr,
+        VectorS& s, MatrixB& b, MatrixX& x, typename traits::matrix_traits<
+        MatrixAB >::value_type& rcond, VectorFERR& ferr, VectorBERR& berr,
         Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixAB >::value_type value_type;
     integer_t info(0);
@@ -267,7 +301,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,6 +64,9 @@
     // templated specialization
     template< typename MatrixA, typename MatrixB >
     static void compute( MatrixA& a, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -89,7 +94,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/posvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -96,6 +98,24 @@
             char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'Y' || fact == 'N' || fact == 'E' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -181,6 +201,21 @@
             char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'Y' || fact == 'N' || fact == 'E' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -268,7 +303,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,6 +64,9 @@
     // templated specialization
     template< typename MatrixAP, typename MatrixB >
     static void compute( MatrixAP& ap, MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
                 traits::matrix_uplo_tag(ap) == 'L' );
@@ -87,7 +92,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ppsvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,24 @@
             char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorS >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'Y' || fact == 'N' || fact == 'E' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -172,6 +192,21 @@
             char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorS >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'Y' || fact == 'N' || fact == 'E' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -254,7 +289,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -15,8 +15,13 @@
 #define BOOST_NUMERIC_BINDINGS_LAPACK_PTSV_HPP
 
 #include <boost/numeric/bindings/lapack/lapack.h>
+#include <boost/numeric/bindings/traits/is_complex.hpp>
+#include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
 #include <cassert>
 
 namespace boost {
@@ -51,8 +56,42 @@
 }
 
 // value-type based template
+template< typename ValueType, typename Enable = void >
+struct ptsv_impl{};
+
+// real specialization
+template< typename ValueType >
+struct ptsv_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
+
+    typedef ValueType value_type;
+    typedef typename traits::type_traits<ValueType>::real_type real_type;
+
+    // templated specialization
+    template< typename VectorD, typename VectorE, typename MatrixB >
+    static void compute( integer_t const n, VectorD& d, VectorE& e,
+            MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+#ifndef NDEBUG
+        assert( n >= 0 );
+        assert( traits::matrix_size2(b) >= 0 );
+        assert( traits::vector_size(d) >= n );
+        assert( traits::vector_size(e) >= n-1 );
+        assert( traits::leading_dimension(b) >= std::max(1,n) );
+#endif
+        detail::ptsv( n, traits::matrix_size2(b), traits::vector_storage(d),
+                traits::vector_storage(e), traits::matrix_storage(b),
+                traits::leading_dimension(b), info );
+    }
+};
+
+// complex specialization
 template< typename ValueType >
-struct ptsv_impl {
+struct ptsv_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
 
     typedef ValueType value_type;
     typedef typename traits::type_traits<ValueType>::real_type real_type;
@@ -61,6 +100,9 @@
     template< typename VectorD, typename VectorE, typename MatrixB >
     static void compute( integer_t const n, VectorD& d, VectorE& e,
             MatrixB& b, integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( n >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -85,7 +127,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/ptsvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,27 @@
             VectorE& e, VectorDF& df, VectorEF& ef, MatrixB& b, MatrixX& x,
             real_type& rcond, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorEF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( n >= 0 );
@@ -160,6 +183,24 @@
             VectorE& e, VectorDF& df, VectorEF& ef, MatrixB& b, MatrixX& x,
             real_type& rcond, VectorFERR& ferr, VectorBERR& berr,
             integer_t& info, detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorDF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::vector_traits<
+                VectorEF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorE >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( n >= 0 );
@@ -237,7 +278,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,6 +59,12 @@
     static void compute( char const jobz, integer_t const n,
             integer_t const kd, MatrixAB& ab, VectorW& w, MatrixZ& z,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -110,7 +118,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,6 +64,12 @@
             integer_t const kd, MatrixAB& ab, VectorW& w, MatrixZ& z,
             integer_t const liwork, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -149,7 +157,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -71,6 +73,15 @@
             real_type const abstol, integer_t& m, VectorW& w, MatrixZ& z,
             VectorIFAIL& ifail, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -150,7 +161,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,15 @@
             integer_t const ka, integer_t const kb, MatrixAB& ab,
             MatrixBB& bb, VectorW& w, MatrixZ& z, integer_t& info,
             detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -120,7 +131,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -64,6 +66,15 @@
             integer_t const ka, integer_t const kb, MatrixAB& ab,
             MatrixBB& bb, VectorW& w, MatrixZ& z, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ab) == 'U' ||
@@ -159,7 +170,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sbgvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -73,6 +75,18 @@
             integer_t const il, integer_t const iu, real_type const abstol,
             integer_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixBB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixQ >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAB >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -157,7 +171,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sgesv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sgesv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sgesv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -52,6 +54,12 @@
     static void compute( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, MatrixX& x,
             integer_t& iter, integer_t& info, detail::workspace2< WORK,
             SWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_size2(a) >= 0 );
         assert( traits::matrix_size2(b) >= 0 );
@@ -118,7 +126,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -53,8 +55,14 @@
     template< typename MatrixAP, typename VectorW, typename MatrixZ,
             typename WORK >
     static void compute( char const jobz, integer_t const n, MatrixAP& ap,
-            VectorW& w, MatrixZ& z, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorW& w, MatrixZ& z, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -101,7 +109,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,12 @@
     static void compute( char const jobz, integer_t const n, MatrixAP& ap,
             VectorW& w, MatrixZ& z, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -137,7 +145,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -65,6 +67,12 @@
             integer_t const il, integer_t const iu, real_type const abstol,
             integer_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -125,12 +133,12 @@
 template< typename MatrixAP, typename VectorW, typename MatrixZ,
         typename VectorIFAIL, typename Workspace >
 inline integer_t spevx( char const jobz, char const range,
-        integer_t const n, MatrixAP& ap,
-        typename traits::matrix_traits< MatrixAP >::value_type const vl,
-        typename traits::matrix_traits< MatrixAP >::value_type const vu,
-        integer_t const il, integer_t const iu,
-        typename traits::matrix_traits< MatrixAP >::value_type const abstol,
-        integer_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail,
+        integer_t const n, MatrixAP& ap, typename traits::matrix_traits<
+        MatrixAP >::value_type const vl, typename traits::matrix_traits<
+        MatrixAP >::value_type const vu, integer_t const il,
+        integer_t const iu, typename traits::matrix_traits<
+        MatrixAP >::value_type const abstol, integer_t& m, VectorW& w,
+        MatrixZ& z, VectorIFAIL& ifail,
         Workspace work = optimal_workspace() ) {
     typedef typename traits::matrix_traits< MatrixAP >::value_type value_type;
     integer_t info(0);
@@ -139,7 +147,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -57,6 +59,15 @@
     static void compute( integer_t const itype, char const jobz,
             integer_t const n, MatrixAP& ap, MatrixBP& bp, VectorW& w,
             MatrixZ& z, integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixBP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -110,7 +121,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,15 @@
             integer_t const n, MatrixAP& ap, MatrixBP& bp, VectorW& w,
             MatrixZ& z, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixBP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -150,7 +161,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spgvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -67,6 +69,15 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorIFAIL& ifail, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixBP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -144,7 +155,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -17,6 +17,8 @@
 #include <boost/numeric/bindings/lapack/lapack.h>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -63,6 +65,9 @@
     template< typename MatrixAP, typename VectorIPIV, typename MatrixB >
     static void compute( MatrixAP& ap, VectorIPIV& ipiv, MatrixB& b,
             integer_t& info ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
                 traits::matrix_uplo_tag(ap) == 'L' );
@@ -88,7 +93,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/spsvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -21,6 +21,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -92,6 +94,21 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -171,6 +188,18 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixAFP >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixAP >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( traits::matrix_uplo_tag(ap) == 'U' ||
@@ -252,7 +281,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -52,8 +54,14 @@
     template< typename VectorD, typename VectorE, typename MatrixZ,
             typename WORK >
     static void compute( char const jobz, integer_t const n, VectorD& d,
-            VectorE& e, MatrixZ& z, integer_t& info,
-            detail::workspace1< WORK > work ) {
+            VectorE& e, MatrixZ& z, integer_t& info, detail::workspace1<
+            WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( n >= 0 );
@@ -99,7 +107,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,6 +61,12 @@
     static void compute( char const jobz, integer_t const n, VectorD& d,
             VectorE& e, MatrixZ& z, integer_t& info, detail::workspace2< WORK,
             IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( n >= 0 );
@@ -131,7 +139,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -67,6 +69,15 @@
             integer_t const il, integer_t const iu, real_type const abstol,
             integer_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -154,7 +165,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/stevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -19,6 +19,8 @@
 #include <boost/numeric/bindings/traits/detail/array.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -66,6 +68,15 @@
             integer_t const il, integer_t const iu, real_type const abstol,
             integer_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorE >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorD >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -141,7 +152,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syev.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syev.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syev.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -54,6 +56,9 @@
     template< typename MatrixA, typename VectorW, typename WORK >
     static void compute( char const jobz, MatrixA& a, VectorW& w,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -110,7 +115,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -59,6 +61,9 @@
             typename IWORK >
     static void compute( char const jobz, MatrixA& a, VectorW& w,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -137,7 +142,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevr.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevr.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevr.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -70,6 +72,12 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -162,7 +170,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/syevx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -67,6 +69,12 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorIFAIL& ifail, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -162,7 +170,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -60,6 +62,12 @@
     static void compute( integer_t const itype, char const jobz,
             integer_t const n, MatrixA& a, MatrixB& b, VectorW& w,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -121,7 +129,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvd.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvd.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvd.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -62,6 +64,12 @@
     static void compute( integer_t const itype, char const jobz,
             integer_t const n, MatrixA& a, MatrixB& b, VectorW& w,
             integer_t& info, detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -149,7 +157,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sygvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -20,6 +20,8 @@
 #include <boost/numeric/bindings/traits/detail/utils.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <cassert>
 
 namespace boost {
@@ -73,6 +75,15 @@
             integer_t const iu, real_type const abstol, integer_t& m,
             VectorW& w, MatrixZ& z, VectorIFAIL& ifail, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorW >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixZ >::value_type > );
 #ifndef NDEBUG
         assert( jobz == 'N' || jobz == 'V' );
         assert( range == 'A' || range == 'V' || range == 'I' );
@@ -165,7 +176,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysv.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysv.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysv.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -82,6 +84,9 @@
             typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, MatrixB& b,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -142,6 +147,9 @@
             typename WORK >
     static void compute( MatrixA& a, VectorIPIV& ipiv, MatrixB& b,
             integer_t& info, detail::workspace1< WORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
 #ifndef NDEBUG
         assert( traits::matrix_uplo_tag(a) == 'U' ||
                 traits::matrix_uplo_tag(a) == 'L' );
@@ -202,7 +210,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysvx.hpp
==============================================================================
--- sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysvx.hpp	(original)
+++ sandbox/numeric_bindings/boost/numeric/bindings/lapack/driver/sysvx.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -22,6 +22,8 @@
 #include <boost/numeric/bindings/traits/is_real.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/static_assert.hpp
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <cassert>
 
@@ -99,6 +101,21 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, IWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorFERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -198,6 +215,18 @@
             VectorIPIV& ipiv, MatrixB& b, MatrixX& x, real_type& rcond,
             VectorFERR& ferr, VectorBERR& berr, integer_t& info,
             detail::workspace2< WORK, RWORK > work ) {
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::vector_traits<
+                VectorFERR >::value_type, typename traits::vector_traits<
+                VectorBERR >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixAF >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixB >::value_type > );
+        BOOST_STATIC_ASSERT( boost::is_same< typename traits::matrix_traits<
+                MatrixA >::value_type, typename traits::matrix_traits<
+                MatrixX >::value_type > );
 #ifndef NDEBUG
         assert( fact == 'F' || fact == 'N' );
         assert( traits::matrix_uplo_tag(a) == 'U' ||
@@ -299,7 +328,6 @@
     return info;
 }
 
-
 }}}} // namespace boost::numeric::bindings::lapack
 
 #endif
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/bindings.py
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/bindings.py	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/bindings.py	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -32,7 +32,7 @@
 def proper_indent( input_string ):
   max_chars = 80
   all_results = []
-  find_delim = re.compile( "([\,\+/]|\|\||>=|std::log\(|work\()[ ]*" )
+  find_delim = re.compile( "([\,\+/]|\|\||>=|< |std::log\(|work\()[ ]*" )
   for input_line in input_string.splitlines():
     result = ''
     # extra indentation size is 8
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -50,7 +50,9 @@
     includes = [ '#include <cassert>',
       '#include <boost/numeric/bindings/traits/traits.hpp>',
       '#include <boost/numeric/bindings/traits/type_traits.hpp>', 
-      '#include <boost/numeric/bindings/blas/blas.h>' ]
+      '#include <boost/numeric/bindings/blas/blas.h>',
+      '#include <boost/type_traits/is_same.hpp>',
+      '#include <boost/static_assert.hpp' ]
       
     if template_map.has_key( group_name.lower() + '.includes' ):
       includes += template_map[ group_name.lower() + '.includes' ].splitlines()
@@ -91,6 +93,7 @@
           cases[ 'complex' ][ 'subroutines' ] = []
         cases[ 'complex' ][ 'subroutines' ] += [ subroutine ]
 
+
     #
     # LEVEL 1 and 2 HANDLING
     #
@@ -108,6 +111,28 @@
       call_level1_arg_list = []
       level1_type_arg_list = []
       level1_assert_list = []
+      level1_static_assert_list = []
+
+      #
+      # Create static assertions, first by value type
+      #
+      for value_type_tmp_key in info_map[ subroutine ][ 'grouped_arguments' ][ 'by_value_type' ].keys():
+        # look up whether they are template params
+        static_asserts = []
+        for arg in info_map[ subroutine ][ 'grouped_arguments' ][ 'by_value_type' ][ value_type_tmp_key ]:
+          if info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'level_1_type' ] != None:
+            static_asserts.append( arg )
+        if len(static_asserts)>1:
+          arg_A = static_asserts[0]
+          for arg_B in static_asserts[1:]:
+            print "Adding static assert for argA", arg_A, " argb", arg_B
+            assert_line = 'BOOST_STATIC_ASSERT( boost::is_same< ' + \
+                info_map[ subroutine ][ 'argument_map' ][ arg_A ][ 'code' ][ 'level_1_static_assert' ] + ', ' + \
+                info_map[ subroutine ][ 'argument_map' ][ arg_B ][ 'code' ][ 'level_1_static_assert' ] + \
+                ' > );'
+            level1_static_assert_list += [ assert_line ]
+
+      # import the code by argument
       for arg in info_map[ subroutine ][ 'arguments' ]:
         level0_arg_list += [ info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'call_level_0' ] ]
         if info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'level_1' ] != None:
@@ -128,6 +153,7 @@
       level1_template = level1_template.replace( "$LEVEL1", ", ".join( level1_arg_list ) )
       level1_template = level1_template.replace( "$TYPES", ", ".join( level1_type_arg_list ) )
       level1_template = level1_template.replace( "$ASSERTS", "\n        ".join( level1_assert_list ) )
+      level1_template = level1_template.replace( "$STATIC_ASSERTS", "\n        ".join( level1_static_assert_list ) )
       level1_template = level1_template.replace( '$RETURN_TYPE', info_map[ subroutine ][ 'level1_return_type' ] )
       level1_template = level1_template.replace( '$RETURN_STATEMENT', info_map[ subroutine ][ 'return_statement' ] )
 
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/lapack_generator.py
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/lapack_generator.py	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/lapack_generator.py	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -58,8 +58,10 @@
     includes = [ '#include <cassert>',
       '#include <boost/numeric/bindings/traits/traits.hpp>',
       '#include <boost/numeric/bindings/traits/type_traits.hpp>', 
-      '#include <boost/numeric/bindings/lapack/lapack.h>' ]
-      
+      '#include <boost/numeric/bindings/lapack/lapack.h>',
+      '#include <boost/type_traits/is_same.hpp>',
+      '#include <boost/static_assert.hpp' ]
+
     if template_map.has_key( group_name.lower() + '.includes' ):
       includes += template_map[ group_name.lower() + '.includes' ].splitlines()
 
@@ -125,10 +127,32 @@
       level2_arg_list = []
       level1_type_arg_list = []
       level1_assert_list = []
+      level1_static_assert_list = []
       call_level1_arg_list = []
       workspace_query_arg_list = []
       user_defined_arg_list = []
       user_defined_opt_arg_list = []
+
+      #
+      # Create static assertions, first by value type
+      #
+      for value_type_tmp_key in info_map[ subroutine ][ 'grouped_arguments' ][ 'by_value_type' ].keys():
+        # look up whether they are template params
+        static_asserts = []
+        for arg in info_map[ subroutine ][ 'grouped_arguments' ][ 'by_value_type' ][ value_type_tmp_key ]:
+          if info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'level_1_type' ] != None:
+            static_asserts.append( arg )
+        if len(static_asserts)>1:
+          arg_A = static_asserts[0]
+          for arg_B in static_asserts[1:]:
+            print "Adding static assert for argA", arg_A, " argb", arg_B
+            assert_line = 'BOOST_STATIC_ASSERT( boost::is_same< ' + \
+                info_map[ subroutine ][ 'argument_map' ][ arg_A ][ 'code' ][ 'level_1_static_assert' ] + ', ' + \
+                info_map[ subroutine ][ 'argument_map' ][ arg_B ][ 'code' ][ 'level_1_static_assert' ] + \
+                ' > );'
+            level1_static_assert_list += [ assert_line ]
+
+      # import the code, by argument
       for arg in info_map[ subroutine ][ 'arguments' ]:
         level0_arg_list += [ info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'call_level_0' ] ]
         if info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'level_1' ] != None:
@@ -144,26 +168,28 @@
           call_level1_arg_list += [ info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'call_level_1' ] ]
         if info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'opt_workspace_query' ] != None:
           workspace_query_arg_list += [ info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'opt_workspace_query' ] ]
-          
+
       if info_map[ subroutine ][ 'user_defined_variables' ] != None:
         for arg in info_map[ subroutine ][ 'user_defined_variables' ]:
           print arg
           if info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'user_defined_init' ] != None:
             user_defined_arg_list += [ info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'user_defined_init' ] ]
-      
+
       if info_map[ subroutine ][ 'user_defined_opt_variables' ] != None:
         for arg in info_map[ subroutine ][ 'user_defined_opt_variables' ]:
           print arg
           if info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'user_defined_init' ] != None:
             user_defined_opt_arg_list += [ info_map[ subroutine ][ 'argument_map' ][ arg ][ 'code' ][ 'user_defined_init' ] ]
-      
+
       # Level 1 replacements
       level1_template = level1_template.replace( "$CALL_LEVEL0", ", ".join( level0_arg_list ) )
       level1_template = level1_template.replace( "$CALL_LEVEL1", ", ".join( call_level1_arg_list ) )
       level1_template = level1_template.replace( "$LEVEL1", ", ".join( level1_arg_list ) )
       level1_template = level1_template.replace( "$TYPES", ", ".join( level1_type_arg_list ) )
       level1_template = level1_template.replace( "$ASSERTS", "\n        ".join( level1_assert_list ) )
-      
+      level1_template = level1_template.replace( "$STATIC_ASSERTS", "\n        ".join( level1_static_assert_list ) )
+
+
       if len( user_defined_arg_list ) > 0:
         level1_template = level1_template.replace( "$INIT_USER_DEFINED_VARIABLES", indent_lines( "\n".join(user_defined_arg_list), 8 ) )
       else:
@@ -221,8 +247,8 @@
             setup_opt_workarrays_pre += [ info_map[ subroutine ][ 'argument_map' ][ name ][ 'code' ][ 'opt_workspace_pre' ] ]
           if info_map[ subroutine ][ 'argument_map' ][ name ][ 'code' ][ 'opt_workspace_post' ] != None:
             setup_opt_workarrays_post += [ info_map[ subroutine ][ 'argument_map' ][ name ][ 'code' ][ 'opt_workspace_post' ] ]
-          
-          
+
+
         # if the length of setup_opt_workarrays_post equals 0, it's equal to the minimal_case
         opt_workspace_template = ''
         if len( setup_opt_workarrays_post ) == 0:
@@ -231,7 +257,7 @@
         else:
           includes += [ '#include <boost/numeric/bindings/traits/detail/utils.hpp>' ]
           opt_workspace_template = template_map[ 'level1_opt_workspace' ]
-          
+
         opt_workspace_template = opt_workspace_template.replace( "$WORKSPACE_QUERY", ", ".join( workspace_query_arg_list ) )
         opt_workspace_template = opt_workspace_template.replace( "$SETUP_OPT_WORKARRAYS_POST", "\n        ".join( setup_opt_workarrays_post ) )
         opt_workspace_template = opt_workspace_template.replace( "$SETUP_OPT_WORKARRAYS_PRE", "\n        ".join( setup_opt_workarrays_pre ) )
@@ -257,18 +283,13 @@
         for name in info_map[ subroutine ][ 'grouped_arguments' ][ 'by_io' ][ 'workspace' ]:
           sub_template = template_map[ 'min_size_func' ]
           sub_template = sub_template.replace( "$NAME", name.lower() )
-          
+
           # first: user-defined stuff (overrules any auto-detected stuff)
+
           my_key = group_name.lower() + '.' + value_type + '.min_size_' + name.lower()
-          my_key_all = group_name.lower() + '.all.min_size_' + name.lower()
-          print my_key
-          if template_map.has_key( my_key ):
-            sub_template = sub_template.replace( "$MIN_SIZE", indent_lines( template_map[ my_key ].rstrip(), 8 ) )
-            
-          # if that fails, try the more generic key "all"
-          elif template_map.has_key( my_key_all ):
-            sub_template = sub_template.replace( "$MIN_SIZE", indent_lines( template_map[ my_key_all ].rstrip(), 8 ) )
-          
+          if netlib.my_has_key( my_key, template_map ):
+            sub_template = sub_template.replace( "$MIN_SIZE", indent_lines( template_map[ netlib.my_has_key( my_key, template_map ) ].rstrip(), 8 ) )
+
           elif info_map[ subroutine ][ 'argument_map' ][ name ][ 'code' ][ 'min_workspace' ] != None:
             resulting_code = 'return ' + info_map[ subroutine ][ 'argument_map' ][ name ][ 'code' ][ 'min_workspace' ] + ';'
             sub_template = sub_template.replace( "$MIN_SIZE", resulting_code.rstrip() )
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -135,6 +135,11 @@
         result = result.replace( "float", "real_type" )
       if properties[ 'value_type' ] == 'DOUBLE PRECISION':
         result = result.replace( "double", "real_type" )
+      if properties[ 'value_type' ][ 0:7] == 'COMPLEX' or \
+        properties[ 'value_type' ] == 'DOUBLE COMPLEX':
+         result = result.replace( "traits::complex_d", "value_type" )
+         result = result.replace( "traits::complex_f", "value_type" )
+
   return result
 
 
@@ -147,7 +152,10 @@
     if properties[ 'value_type' ] == 'REAL' or properties[ 'value_type' ] == 'DOUBLE PRECISION':
       result = result.replace( "real_type", "typename traits::$TYPEOF_FIRST_TYPENAME" + \
         "_traits< $FIRST_TYPENAME >::value_type" )
-
+    if properties[ 'value_type' ][ 0:7] == 'COMPLEX' or \
+      properties[ 'value_type' ] == 'DOUBLE COMPLEX':
+      result = result.replace( "value_type", "typename traits::$TYPEOF_FIRST_TYPENAME" + \
+        "_traits< $FIRST_TYPENAME >::value_type" )
   return result
 
 
@@ -161,6 +169,17 @@
   return result
 
 
+def level1_static_assert( name, properties ):
+  result = None
+  if 'workspace' not in properties[ 'io' ]:
+    if properties[ 'type' ] == 'matrix':
+      result = "typename traits::matrix_traits< " + level1_typename( name, properties ).replace( "typename ", "") + " >::value_type"
+    elif properties[ 'type' ] == 'vector':
+      result = "typename traits::vector_traits< " + level1_typename( name, properties ).replace( "typename ", "") + " >::value_type"
+    elif properties[ 'type' ] == 'scalar':
+      result = "TODO"
+  return result
+
 
 def nested_list_args( arg ):
   print "finding nested list arguments of", arg
@@ -1111,6 +1130,7 @@
   # variables which have been assigned their code in pass 1.
   for argument_name, argument_properties in argument_map.iteritems():
     argument_properties[ 'code' ][ 'level_1_assert' ] = level1_assert( argument_name, argument_properties, argument_map )
+    argument_properties[ 'code' ][ 'level_1_static_assert' ] = level1_static_assert( argument_name, argument_properties )
     argument_properties[ 'code' ][ 'opt_workspace_query' ] = opt_workspace_query_type( argument_name, argument_properties, argument_map )
     argument_properties[ 'code' ][ 'opt_workspace_pre' ] = opt_workspace_pre_type( argument_name, argument_properties, argument_map )
     argument_properties[ 'code' ][ 'opt_workspace_post' ] = opt_workspace_post_type( argument_name, argument_properties )
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -48,15 +48,16 @@
     // templated specialization
     template< $TYPES >
     static return_type compute( $LEVEL1 ) {
+        $STATIC_ASSERTS
         $RETURN_STATEMENTdetail::$groupname( $CALL_LEVEL0 );
     }
 };
 $TEMPLATE[blas_level2]
 // template function to call $groupname
 template< $TYPES >
-inline integer_t $groupname( $LEVEL2 ) {
+inline typename $groupname_impl< typename traits::$TYPEOF_FIRST_TYPENAME_traits< $FIRST_TYPENAME >::value_type >::return_type
+$groupname( $LEVEL2 ) {
     typedef typename traits::$TYPEOF_FIRST_TYPENAME_traits< $FIRST_TYPENAME >::value_type value_type;
     $RETURN_STATEMENT$groupname_impl< value_type >::compute( $CALL_LEVEL1 );
 }
-
 $TEMPLATE[end]
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/lapack.hpp
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/lapack.hpp	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/lapack.hpp	2009-02-27 08:12:50 EST (Fri, 27 Feb 2009)
@@ -59,8 +59,9 @@
     // user-defined workspace specialization
     template< $TYPES, $WORKSPACE_TYPENAMES >
     static void compute( $LEVEL1, detail::workspace$WORKSPACE_SIZE< $WORKSPACE_TYPES > work ) {
-#ifndef NDEBUG
+        $STATIC_ASSERTS
         $INIT_USER_DEFINED_VARIABLES
+#ifndef NDEBUG
         $ASSERTS
 #endif
         detail::$groupname( $CALL_LEVEL0 );
@@ -100,7 +101,6 @@
     $groupname_impl< value_type >::compute( $CALL_LEVEL1, work );
     return info;
 }
-
 $TEMPLATE[setup_min_workspace]
         traits::detail::array< $WORKSPACE_TYPE > tmp_$NAME( min_size_$NAME( $CALL_MIN_SIZE ) );
 $TEMPLATE[setup_opt_workspace]
@@ -117,6 +117,7 @@
     // templated specialization
     template< $TYPES >
     static void compute( $LEVEL1 ) {
+        $STATIC_ASSERTS
 #ifndef NDEBUG
         $ASSERTS
 #endif
@@ -133,5 +134,4 @@
     $groupname_impl< value_type >::compute( $CALL_LEVEL1 );
     return info;
 }
-
 $TEMPLATE[end]