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