Changeset 2961


Ignore:
Timestamp:
Oct 17, 2013 1:07:06 PM (6 years ago)
Author:
bradbell
Message:

op_code.hpp: add CSkip (conditional skip opcode).
optimize.hpp: add back pass conditional connections for all operands.

Location:
branches/opt_cond_exp/cppad/local
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/opt_cond_exp/cppad/local/op_code.hpp

    r2960 r2961  
    7272        CosOp,    //  cos(variable)
    7373        CoshOp,   // cosh(variable)
     74        CSkipOp,  // Conditional skip
     75        // arg[0] = index of the corresponding CExpOp
     76        // arg[1] = number of operations to skip if CExpOp comparision is true
     77        // arg[2] = number of operations to skip if CExpOp comparision is false
     78        // arg[3] -> arg[2+arg[0]]               = skip operations if true
     79        // arg[3+arg[0]] -> arg[2+arg[0]+arg[1]] = skip operations if false
     80        // arg[3+arg[0]+arg[1]] = arg[1] + arg[2]
    7481        CSumOp,   // Cummulative summation
    7582        // arg[0] = number of addition variables in summation
     
    154161        1, // CosOp
    155162        1, // CoshOp
     163        0, // CSkipOp  (actually has a variable number of arguments, not zero)
    156164        0, // CSumOp   (actually has a variable number of arguments, not zero)
    157165        2, // DisOp
     
    255263        2, // CosOp
    256264        2, // CoshOp
     265        0, // CSkipOp
    257266        1, // CSumOp
    258267        1, // DisOp
     
    459468                "Cos"   ,
    460469                "Cosh"  ,
     470                "CSkip" ,
    461471                "CSum"  ,
    462472                "Dis"   ,
     
    538548                break;
    539549
     550                case CSkipOp:
     551                /*
     552                ind[0] = index of the corresponding CExpOp
     553                ind[1] = number of operations to skip if CExpOp comparision is true
     554                ind[2] = number of operations to skip if CExpOp comparision is false
     555                ind[3] -> ind[2+ind[0]]               = skip operations if true
     556                ind[3+ind[0]] -> ind[2+ind[0]+ind[1]] = skip operations if false
     557                ind[3+ind[0]+ind[1]] = ind[1] + ind[2]
     558                */
     559                CPPAD_ASSERT_UNKNOWN( ind[3+ind[0]+ind[1]] == ind[0]+ind[1] );
     560                printOpField(os, " pr=", Rec->GetPar(ind[2]), ncol);
     561                for(i = 0; i < size_t(ind[0]); i++)
     562                         printOpField(os, " +v=", ind[3+i], ncol);
     563                for(i = 0; i < size_t(ind[1]); i++)
     564                         printOpField(os, " -v=", ind[3+ind[0]+i], ncol);
     565                break;
     566
    540567                case CSumOp:
    541568                /*
  • branches/opt_cond_exp/cppad/local/optimize.hpp

    r2959 r2961  
    12561256                else    CPPAD_ASSERT_UNKNOWN((op != InvOp) & (op != BeginOp));
    12571257# endif
     1258                optimize_connection_type connect_type  = tape[i_var].connect_type;
     1259                size_t                  connect_index  = tape[i_var].connect_index;
     1260                bool flag;
    12581261                switch( op )
    12591262                {
     
    12741277                        case TanOp:
    12751278                        case TanhOp:
    1276                         if( tape[i_var].connect_type != not_connected )
     1279                        switch( connect_type )
     1280                        {       case not_connected:
     1281                                break;
     1282       
     1283                                case yes_connected:
     1284                                case sum_connected:
     1285                                case csum_connected:
    12771286                                tape[arg[0]].connect_type = yes_connected;
     1287                                break;
     1288
     1289                                case cexp_true_connected:
     1290                                case cexp_false_connected:
     1291                                if( tape[arg[0]].connect_type == not_connected )
     1292                                {       tape[arg[0]].connect_type  = connect_type;
     1293                                        tape[arg[0]].connect_index = connect_index;
     1294                                }
     1295                                flag  = tape[arg[0]].connect_type  != connect_type;
     1296                                flag |= tape[arg[0]].connect_index != connect_index;
     1297                                if( flag )
     1298                                        tape[arg[0]].connect_type = yes_connected;
     1299                                break;
     1300
     1301                                default:
     1302                                CPPAD_ASSERT_UNKNOWN(false);
     1303                        }
    12781304                        break; // --------------------------------------------
    12791305
     
    12831309                        case MulpvOp:
    12841310                        case PowpvOp:
    1285                         if( tape[i_var].connect_type != not_connected )
     1311                        switch( connect_type )
     1312                        {       case not_connected:
     1313                                break;
     1314       
     1315                                case yes_connected:
     1316                                case sum_connected:
     1317                                case csum_connected:
    12861318                                tape[arg[1]].connect_type = yes_connected;
     1319                                break;
     1320
     1321                                case cexp_true_connected:
     1322                                case cexp_false_connected:
     1323                                if( tape[arg[1]].connect_type == not_connected )
     1324                                {       tape[arg[1]].connect_type  = connect_type;
     1325                                        tape[arg[1]].connect_index = connect_index;
     1326                                }
     1327                                flag  = tape[arg[1]].connect_type  != connect_type;
     1328                                flag |= tape[arg[1]].connect_index != connect_index;
     1329                                if( flag )
     1330                                        tape[arg[1]].connect_type = yes_connected;
     1331                                break;
     1332
     1333                                default:
     1334                                CPPAD_ASSERT_UNKNOWN(false);
     1335                        }
    12871336                        break; // --------------------------------------------
    12881337               
    12891338                        // Special case for SubvpOp
    12901339                        case SubvpOp:
    1291                         if( tape[i_var].connect_type != not_connected )
    1292                         {
    1293                                 // check for case where i_var is sum_connected to and
    1294                                 // it is the result of a summation.
    1295                                 if( tape[i_var].connect_type == sum_connected )
    1296                                         tape[i_var].connect_type = csum_connected;
    1297 
    1298                                 // check for case where arg[0] is sum_connected
     1340                        switch( connect_type )
     1341                        {       case not_connected:
     1342                                break;
     1343       
     1344                                case yes_connected:
     1345                                case sum_connected:
     1346                                case csum_connected:
    12991347                                if( tape[arg[0]].connect_type == not_connected )
    13001348                                        tape[arg[0]].connect_type = sum_connected;
    13011349                                else    tape[arg[0]].connect_type = yes_connected;
    1302 
     1350                                break;
     1351
     1352                                case cexp_true_connected:
     1353                                case cexp_false_connected:
     1354                                if( tape[arg[0]].connect_type == not_connected )
     1355                                {       tape[arg[0]].connect_type  = connect_type;
     1356                                        tape[arg[0]].connect_index = connect_index;
     1357                                }
     1358                                flag  = tape[arg[0]].connect_type  != connect_type;
     1359                                flag |= tape[arg[0]].connect_index != connect_index;
     1360                                if( flag )
     1361                                        tape[arg[0]].connect_type = yes_connected;
     1362                                break;
     1363
     1364                                default:
     1365                                CPPAD_ASSERT_UNKNOWN(false);
     1366                        }
     1367                        if( connect_type == sum_connected )
     1368                        {       // convert sum to csum connection for this variable
     1369                                tape[i_var].connect_type = connect_type = csum_connected;
    13031370                        }
    13041371                        break; // --------------------------------------------
     
    13071374                        case AddpvOp:
    13081375                        case SubpvOp:
    1309                         if( tape[i_var].connect_type != not_connected )
    1310                         {
    1311                                 // check for case where i_var is sum_connected to and
    1312                                 // it is the result of a summation.
    1313                                 if( tape[i_var].connect_type == sum_connected )
    1314                                         tape[i_var].connect_type = csum_connected;
    1315 
    1316                                 // check for case where arg[1] is sum_connected
     1376                        switch( connect_type )
     1377                        {       case not_connected:
     1378                                break;
     1379       
     1380                                case yes_connected:
     1381                                case sum_connected:
     1382                                case csum_connected:
    13171383                                if( tape[arg[1]].connect_type == not_connected )
    13181384                                        tape[arg[1]].connect_type = sum_connected;
    13191385                                else    tape[arg[1]].connect_type = yes_connected;
    1320 
     1386                                break;
     1387
     1388                                case cexp_true_connected:
     1389                                case cexp_false_connected:
     1390                                if( tape[arg[1]].connect_type == not_connected )
     1391                                {       tape[arg[1]].connect_type  = connect_type;
     1392                                        tape[arg[1]].connect_index = connect_index;
     1393                                }
     1394                                flag  = tape[arg[1]].connect_type  != connect_type;
     1395                                flag |= tape[arg[1]].connect_index != connect_index;
     1396                                if( flag )
     1397                                        tape[arg[1]].connect_type = yes_connected;
     1398                                break;
     1399
     1400                                default:
     1401                                CPPAD_ASSERT_UNKNOWN(false);
     1402                        }
     1403                        if( connect_type == sum_connected )
     1404                        {       // convert sum to csum connection for this variable
     1405                                tape[i_var].connect_type = connect_type = csum_connected;
    13211406                        }
    13221407                        break; // --------------------------------------------
     
    13261411                        case AddvvOp:
    13271412                        case SubvvOp:
    1328                         if( tape[i_var].connect_type != not_connected )
    1329                         {
    1330                                 // check for case where i_var is sum_connected to and
    1331                                 // it is the result of a summation.
    1332                                 if( tape[i_var].connect_type == sum_connected )
    1333                                         tape[i_var].connect_type = csum_connected;
    1334 
    1335                                 // check for case where arg[0] is sum_connected
    1336                                 if( tape[arg[0]].connect_type == not_connected )
    1337                                         tape[arg[0]].connect_type = sum_connected;
    1338                                 else    tape[arg[0]].connect_type = yes_connected;
    1339 
    1340                                 // check for case where arg[1] is sum_connected
    1341                                 if( tape[arg[1]].connect_type == not_connected )
    1342                                         tape[arg[1]].connect_type = sum_connected;
    1343                                 else    tape[arg[1]].connect_type = yes_connected;
     1413                        for(i = 0; i < 2; i++) switch( connect_type )
     1414                        {       case not_connected:
     1415                                break;
     1416
     1417                                case yes_connected:
     1418                                case sum_connected:
     1419                                case csum_connected:
     1420                                if( tape[arg[i]].connect_type == not_connected )
     1421                                        tape[arg[i]].connect_type = sum_connected;
     1422                                else    tape[arg[i]].connect_type = yes_connected;
     1423                                break;
     1424
     1425                                case cexp_true_connected:
     1426                                case cexp_false_connected:
     1427                                if( tape[arg[i]].connect_type == not_connected )
     1428                                {       tape[arg[i]].connect_type  = connect_type;
     1429                                        tape[arg[i]].connect_index = connect_index;
     1430                                }
     1431                                flag  = tape[arg[i]].connect_type  != connect_type;
     1432                                flag |= tape[arg[i]].connect_index != connect_index;
     1433                                if( flag )
     1434                                        tape[arg[i]].connect_type = yes_connected;
     1435                                break;
     1436
     1437                                default:
     1438                                CPPAD_ASSERT_UNKNOWN(false);
     1439                        }
     1440                        if( connect_type == sum_connected )
     1441                        {       // convert sum to csum connection for this variable
     1442                                tape[i_var].connect_type = connect_type = csum_connected;
    13441443                        }
    13451444                        break; // --------------------------------------------
     
    13681467                                        {       if( i == 2 || i == 3 )
    13691468                                                        tape[arg[i]].connect_type = yes_connected;
    1370                                                 if( i == 4 )
    1371                                                         tape[arg[i]].connect_type =
    1372                                                                         cexp_true_connected;
    1373                                                 if( i == 5 )
    1374                                                         tape[arg[i]].connect_type =
    1375                                                                         cexp_false_connected;
     1469                                                else
     1470                                                {       tape[arg[i]].connect_index = i_var;
     1471                                                        if( i == 4 )
     1472                                                                tape[arg[i]].connect_type =
     1473                                                                                cexp_true_connected;
     1474                                                        else
     1475                                                        {       // i == 5
     1476                                                                tape[arg[i]].connect_type =
     1477                                                                                cexp_false_connected;
     1478                                                        }
     1479                                                }
    13761480                                        }
    13771481                                        mask = mask << 1;
Note: See TracChangeset for help on using the changeset viewer.