00001 # ifndef CPPAD_OP_CODE_INCLUDED
00002 # define CPPAD_OP_CODE_INCLUDED
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 namespace CppAD {
00081 
00082         
00083         enum OpCode {
00084                 AbsOp,    
00085                 AcosOp,   
00086                 AddpvOp,  
00087                 AddvpOp,  
00088                 AddvvOp,  
00089                 AsinOp,   
00090                 AtanOp,   
00091                 CExpOp,   
00092                 ComOp,    
00093                 CosOp,    
00094                 CoshOp,   
00095                 DisOp,    
00096                 DivpvOp,  
00097                 DivvpOp,  
00098                 DivvvOp,  
00099                 ExpOp,    
00100                 LdpOp,    
00101                 LdvOp,    
00102                 InvOp,    
00103                 LogOp,    
00104                 MulpvOp,  
00105                 MulvpOp,  
00106                 MulvvOp,  
00107                 NonOp,    
00108                 ParOp,    
00109                 PowvpOp,  
00110                 PowpvOp,  
00111                 PowvvOp,  
00112                 PripOp,   
00113                 PrivOp,   
00114                 SinOp,    
00115                 SinhOp,   
00116                 SqrtOp,   
00117                 StppOp,   
00118                 StvpOp,   
00119                 StpvOp,   
00120                 StvvOp,   
00121                 SubpvOp,  
00122                 SubvpOp,  
00123                 SubvvOp   
00124         };
00125 }
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254 
00255 
00256 
00257 # include <string>
00258 # include <sstream>
00259 # include <iomanip>
00260 
00261 namespace CppAD {
00262 
00263 
00264 const size_t NumIndTable[] = {
00265         1, 
00266         1, 
00267         2, 
00268         2, 
00269         2, 
00270         1, 
00271         1, 
00272         6, 
00273         4, 
00274         1, 
00275         1, 
00276         2, 
00277         2, 
00278         2, 
00279         2, 
00280         1, 
00281         3, 
00282         3, 
00283         0, 
00284         1, 
00285         2, 
00286         2, 
00287         2, 
00288         0, 
00289         1, 
00290         2, 
00291         2, 
00292         2, 
00293         2, 
00294         2, 
00295         1, 
00296         1, 
00297         1, 
00298         3, 
00299         3, 
00300         3, 
00301         3, 
00302         2, 
00303         2, 
00304         2  
00305 };
00306 
00307 inline size_t NumInd(OpCode op)
00308 {
00309         CPPAD_ASSERT_UNKNOWN( size_t(SubvvOp) == 
00310                 sizeof(NumIndTable) / sizeof(NumIndTable[0]) - 1
00311         );
00312         CPPAD_ASSERT_UNKNOWN( size_t(op) <= size_t(SubvvOp) );
00313 
00314         return NumIndTable[(size_t) op];
00315 }
00316 
00317 
00318 const size_t NumVarTable[] = {
00319         1, 
00320         2, 
00321         1, 
00322         1, 
00323         1, 
00324         2, 
00325         2, 
00326         1, 
00327         0, 
00328         2, 
00329         2, 
00330         1, 
00331         1, 
00332         1, 
00333         1, 
00334         1, 
00335         1, 
00336         1, 
00337         1, 
00338         1, 
00339         1, 
00340         1, 
00341         1, 
00342         1, 
00343         1, 
00344         3, 
00345         3, 
00346         3, 
00347         0, 
00348         1, 
00349         2, 
00350         2, 
00351         1, 
00352         0, 
00353         0, 
00354         0, 
00355         0, 
00356         1, 
00357         1, 
00358         1  
00359 };
00360 
00361 inline size_t NumVar(OpCode op)
00362 {
00363         CPPAD_ASSERT_UNKNOWN( size_t(SubvvOp) == 
00364                 sizeof(NumVarTable) / sizeof(NumVarTable[0]) - 1
00365         );
00366         CPPAD_ASSERT_UNKNOWN( size_t(op) <= size_t(SubvvOp) );
00367 
00368         return NumVarTable[(size_t) op];
00369 }
00370 
00371 template <class Type>
00372 void printOpField(
00373         std::ostream      &os , 
00374         const char *   leader ,
00375         const Type     &value , 
00376         size_t          width )
00377 {
00378         std::ostringstream buffer;
00379         std::string        str;
00380 
00381         
00382         os << leader;
00383 
00384         
00385         buffer << std::setw(width) << value;
00386         str = buffer.str();
00387 
00388         
00389         size_t len = str.size();
00390         if( len > width )
00391         {       size_t i;
00392                 for(i = 0; i < width-1; i++)
00393                         os << str[i];
00394                 os << "*";
00395                 return;
00396         }
00397 
00398         
00399         size_t nspace = 0; 
00400         while(str[nspace] == ' ' && nspace < len)
00401                 nspace++;
00402 
00403         
00404         size_t i = nspace;
00405         while( i < len )
00406                 os << str[i++];
00407 
00408         i = width - len + nspace;
00409         while(i--)
00410                 os << " "; 
00411 }
00412 
00413 template <class Base, class Value>
00414 void printOp(
00415         std::ostream          &os     , 
00416         const TapeRec<Base>   *Rec    ,
00417         size_t                 i_var  , 
00418         OpCode                 op     ,
00419         const size_t          *ind    ,
00420         size_t                 nfz    ,
00421         const  Value          *fz     ,
00422         size_t                 nrz    ,
00423         const  Value          *rz     )
00424 {       
00425         static char *CompareOpName[] = { "Lt", "Le", "Eq", "Ge", "Gt", "Ne" };
00426         static char *OpName[] = {
00427                 "Abs"   ,
00428                 "Acos"  ,
00429                 "Addpv" ,
00430                 "Addvp" ,
00431                 "Addvv" ,
00432                 "Asin"  ,
00433                 "Atan"  ,
00434                 "CExp"  ,
00435                 "Com"   ,
00436                 "Cos"   ,
00437                 "Cosh"  ,
00438                 "DisOp" ,
00439                 "Divpv" ,
00440                 "Divvp" ,
00441                 "Divvv" ,
00442                 "Exp"   ,
00443                 "Ldp"   ,
00444                 "Ldv"   ,
00445                 "Inv"   ,
00446                 "Log"   ,
00447                 "Mulpv" ,
00448                 "Mulvp" ,
00449                 "Mulvv" ,
00450                 "Non"   ,
00451                 "Par"   ,
00452                 "Powvp" ,
00453                 "Powpv" ,
00454                 "Powvv" ,
00455                 "Prip"  ,
00456                 "Priv"  ,
00457                 "Sin"   ,
00458                 "Sinh"  ,
00459                 "Sqrt"  ,
00460                 "Stpp"  ,
00461                 "Stvp"  ,
00462                 "Stpv"  ,
00463                 "Stvv"  ,
00464                 "Subpv" ,
00465                 "Subvp" ,
00466                 "Subvv"
00467         };
00468         CPPAD_ASSERT_UNKNOWN( 
00469                 size_t(SubvvOp) == sizeof(OpName) / sizeof(OpName[0]) - 1
00470         );
00471 
00472         
00473         printOpField(os,  "i=",      i_var, 5);
00474         if( op == CExpOp )
00475         {       printOpField(os, "op=", OpName[op], 4); 
00476                 printOpField(os, "", CompareOpName[ ind[0] ], 3);
00477         }
00478         else if( op == ComOp )
00479         {       printOpField(os, "op=", OpName[op], 3); 
00480                 printOpField(os, "", CompareOpName[ ind[0] ], 4);
00481         }
00482         else    printOpField(os, "op=", OpName[op], 7); 
00483 
00484         
00485         size_t ncol = 5;
00486         switch( op )
00487         {
00488                 case LdpOp:
00489                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 3 );
00490                 printOpField(os, "off=", ind[0], ncol);
00491                 printOpField(os, "  p=", *(Rec->GetPar(ind[1])), ncol);
00492                 break;
00493 
00494                 case LdvOp:
00495                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 3 );
00496                 printOpField(os, "off=", ind[0], ncol);
00497                 printOpField(os, "  v=", ind[1], ncol);
00498                 break;
00499 
00500                 case StppOp:
00501                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 3 );
00502                 printOpField(os, "off=", ind[0], ncol);
00503                 printOpField(os, " pl=", *(Rec->GetPar(ind[1])), ncol);
00504                 printOpField(os, " pr=", *(Rec->GetPar(ind[2])), ncol);
00505                 break;
00506 
00507                 case StpvOp:
00508                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 3 );
00509                 printOpField(os, "off=", ind[0], ncol);
00510                 printOpField(os, " pl=", *(Rec->GetPar(ind[1])), ncol);
00511                 printOpField(os, " vr=", ind[2], ncol);
00512                 break;
00513 
00514                 case StvpOp:
00515                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 3 );
00516                 printOpField(os, "off=", ind[0], ncol);
00517                 printOpField(os, " vl=", ind[1], ncol);
00518                 printOpField(os, " pr=", *(Rec->GetPar(ind[2])), ncol);
00519                 break;
00520 
00521                 case StvvOp:
00522                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 3 );
00523                 printOpField(os, "off=", ind[0], ncol);
00524                 printOpField(os, " vl=", ind[1], ncol);
00525                 printOpField(os, " vr=", ind[2], ncol);
00526                 break;
00527 
00528                 case AddvvOp:
00529                 case DivvvOp:
00530                 case MulvvOp:
00531                 case PowvvOp:
00532                 case SubvvOp:
00533                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 2 );
00534                 printOpField(os, " vl=", ind[0], ncol);
00535                 printOpField(os, " vr=", ind[1], ncol);
00536                 break;
00537 
00538                 case AddpvOp:
00539                 case SubpvOp:
00540                 case MulpvOp:
00541                 case PowpvOp:
00542                 case DivpvOp:
00543                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 2 );
00544                 printOpField(os, " pl=", *(Rec->GetPar(ind[0])), ncol);
00545                 printOpField(os, " vr=", ind[1], ncol);
00546                 break;
00547 
00548                 case AddvpOp:
00549                 case DivvpOp:
00550                 case MulvpOp:
00551                 case PowvpOp:
00552                 case SubvpOp:
00553                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 2 );
00554                 printOpField(os, " vl=", ind[0], ncol);
00555                 printOpField(os, " pr=", *(Rec->GetPar(ind[1])), ncol);
00556                 break;
00557 
00558                 case AbsOp:
00559                 case AcosOp:
00560                 case AsinOp:
00561                 case AtanOp:
00562                 case CosOp:
00563                 case CoshOp:
00564                 case ExpOp:
00565                 case LogOp:
00566                 case SinOp:
00567                 case SinhOp:
00568                 case SqrtOp:
00569                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 1 );
00570                 printOpField(os, "  v=", ind[0], ncol);
00571                 break;
00572 
00573                 case ParOp:
00574                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 1 );
00575                 printOpField(os, "  p=", *(Rec->GetPar(ind[0])), ncol);
00576                 break;
00577 
00578                 case PripOp:
00579                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 2 );
00580                 printOpField(os, "txt=", *(Rec->GetTxt(ind[0])), ncol);
00581                 printOpField(os, "  p=", *(Rec->GetPar(ind[1])), ncol);
00582                 break;
00583 
00584                 case PrivOp:
00585                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 2 );
00586                 printOpField(os, "txt=", *(Rec->GetTxt(ind[0])), ncol);
00587                 printOpField(os, "  v=", ind[1], ncol);
00588                 break;
00589 
00590                 case InvOp:
00591                 case NonOp:
00592                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 0 );
00593                 break;
00594 
00595                 case DisOp:
00596                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 2 );
00597                 printOpField(os, "  v=", ind[0], ncol);
00598                 printOpField(os, "  f=", ind[1], ncol);
00599                 break;
00600         
00601 
00602                 case CExpOp:
00603                 CPPAD_ASSERT_UNKNOWN(ind[1] != 0);
00604                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 6 );
00605                 if( ind[1] & 1 )
00606                         printOpField(os, " vl=", ind[2], ncol);
00607                 else    printOpField(os, " pl=", *(Rec->GetPar(ind[2])), ncol);
00608                 if( ind[1] & 2 )
00609                         printOpField(os, " vr=", ind[3], ncol);
00610                 else    printOpField(os, " pr=", *(Rec->GetPar(ind[3])), ncol);
00611                 if( ind[1] & 4 )
00612                         printOpField(os, " vt=", ind[4], ncol);
00613                 else    printOpField(os, " pt=", *(Rec->GetPar(ind[4])), ncol);
00614                 if( ind[1] & 8 )
00615                         printOpField(os, " vf=", ind[5], ncol);
00616                 else    printOpField(os, " pf=", *(Rec->GetPar(ind[5])), ncol);
00617                 break;
00618 
00619                 case ComOp:
00620                 CPPAD_ASSERT_UNKNOWN(ind[1] != 0);
00621                 CPPAD_ASSERT_UNKNOWN( NumInd(op) == 4 );
00622                 if( ind[1] & 1 )
00623                         printOpField(os, "res=", 1, ncol);
00624                 else    printOpField(os, "res=", 0, ncol);
00625                 if( ind[1] & 2 )
00626                         printOpField(os, " vl=", ind[2], ncol);
00627                 else    printOpField(os, " pl=", *(Rec->GetPar(ind[2])), ncol);
00628                 if( ind[1] & 4 )
00629                         printOpField(os, " vr=", ind[3], ncol);
00630                 else    printOpField(os, " pr=", *(Rec->GetPar(ind[3])), ncol);
00631                 break;
00632 
00633                 default:
00634                 CPPAD_ASSERT_UNKNOWN(0);
00635         }
00636         size_t k;
00637         if( NumVar(op) > 0 )
00638         { 
00639                 for(k = 0; k < nfz; k++)
00640                         std::cout << "| fz[" << k << "]=" << fz[k];
00641                 for(k = 0; k < nrz; k++)
00642                         std::cout << "| rz[" << k << "]=" << rz[k];
00643         }
00644         std::cout << std::endl;
00645 }
00646 
00647 } 
00648 
00649 # endif