Changes in / [905:de428ebb47ab:904:c279b19abc62] in lemon-main
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
CMakeLists.txt
r902 r744 3 3 SET(PROJECT_NAME "LEMON") 4 4 PROJECT(${PROJECT_NAME}) 5 6 INCLUDE(FindPythonInterp)7 5 8 6 IF(EXISTS ${PROJECT_SOURCE_DIR}/cmake/version.cmake) … … 11 9 SET(LEMON_VERSION $ENV{LEMON_VERSION} CACHE STRING "LEMON version string.") 12 10 ELSE() 13 EXECUTE_PROCESS(14 COMMAND ${PYTHON_EXECUTABLE} ./scripts/chg-len.py15 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}16 OUTPUT_VARIABLE HG_REVISION_PATH17 ERROR_QUIET18 OUTPUT_STRIP_TRAILING_WHITESPACE19 )20 11 EXECUTE_PROCESS( 21 12 COMMAND hg id -i … … 26 17 ) 27 18 IF(HG_REVISION STREQUAL "") 28 SET(HG_REVISION_ID "hg-tip") 29 ELSE() 30 IF(HG_REVISION_PATH STREQUAL "") 31 SET(HG_REVISION_ID ${HG_REVISION}) 32 ELSE() 33 SET(HG_REVISION_ID ${HG_REVISION_PATH}.${HG_REVISION}) 34 ENDIF() 19 SET(HG_REVISION "hg-tip") 35 20 ENDIF() 36 SET(LEMON_VERSION ${HG_REVISION _ID} CACHE STRING "LEMON version string.")21 SET(LEMON_VERSION ${HG_REVISION} CACHE STRING "LEMON version string.") 37 22 ENDIF() 38 23 … … 47 32 FIND_PACKAGE(COIN) 48 33 49 IF(DEFINED ENV{LEMON_CXX_WARNING})50 SET(CXX_WARNING $ENV{LEMON_CXX_WARNING})51 ELSE()52 IF(CMAKE_COMPILER_IS_GNUCXX)53 SET(CXX_WARNING "-Wall -W -Wunused -Wformat=2 -Wctor-dtor-privacy -Wnon-virtual-dtor -Wno-char-subscripts -Wwrite-strings -Wno-char-subscripts -Wreturn-type -Wcast-qual -Wcast-align -Wsign-promo -Woverloaded-virtual -ansi -fno-strict-aliasing -Wold-style-cast -Wno-unknown-pragmas")54 SET(CMAKE_CXX_FLAGS_DEBUG CACHE STRING "-ggdb")55 SET(CMAKE_C_FLAGS_DEBUG CACHE STRING "-ggdb")56 ELSEIF(MSVC)57 # This part is unnecessary 'casue the same is set by the lemon/core.h.58 # Still keep it as an example.59 SET(CXX_WARNING "/wd4250 /wd4355 /wd4503 /wd4800 /wd4996")60 # Suppressed warnings:61 # C4250: 'class1' : inherits 'class2::member' via dominance62 # C4355: 'this' : used in base member initializer list63 # C4503: 'function' : decorated name length exceeded, name was truncated64 # C4800: 'type' : forcing value to bool 'true' or 'false'65 # (performance warning)66 # C4996: 'function': was declared deprecated67 ELSE()68 SET(CXX_WARNING "-Wall -W")69 ENDIF()70 ENDIF()71 SET(LEMON_CXX_WARNING_FLAGS ${CXX_WARNING} CACHE STRING "LEMON warning flags.")72 73 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LEMON_CXX_WARNING_FLAGS}")74 75 SET( CMAKE_CXX_FLAGS_MAINTAINER "-Werror -ggdb" CACHE STRING76 "Flags used by the C++ compiler during maintainer builds."77 FORCE )78 SET( CMAKE_C_FLAGS_MAINTAINER "-Werror" CACHE STRING79 "Flags used by the C compiler during maintainer builds."80 FORCE )81 SET( CMAKE_EXE_LINKER_FLAGS_MAINTAINER82 "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING83 "Flags used for linking binaries during maintainer builds."84 FORCE )85 SET( CMAKE_SHARED_LINKER_FLAGS_MAINTAINER86 "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING87 "Flags used by the shared libraries linker during maintainer builds."88 FORCE )89 MARK_AS_ADVANCED(90 CMAKE_CXX_FLAGS_MAINTAINER91 CMAKE_C_FLAGS_MAINTAINER92 CMAKE_EXE_LINKER_FLAGS_MAINTAINER93 CMAKE_SHARED_LINKER_FLAGS_MAINTAINER )94 95 IF(CMAKE_CONFIGURATION_TYPES)96 LIST(APPEND CMAKE_CONFIGURATION_TYPES Maintainer)97 LIST(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)98 SET(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING99 "Add the configurations that we need"100 FORCE)101 endif()102 103 IF(NOT CMAKE_BUILD_TYPE)104 SET(CMAKE_BUILD_TYPE "Release")105 ENDIF()106 107 SET( CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING108 "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel Maintainer."109 FORCE )110 111 112 34 INCLUDE(CheckTypeSize) 113 35 CHECK_TYPE_SIZE("long long" LONG_LONG) 114 36 SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG}) 115 37 38 INCLUDE(FindPythonInterp) 39 116 40 ENABLE_TESTING() 117 118 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer")119 ADD_CUSTOM_TARGET(check ALL COMMAND ${CMAKE_CTEST_COMMAND})120 ELSE()121 ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND})122 ENDIF()123 41 124 42 ADD_SUBDIRECTORY(lemon) … … 147 65 ENDIF() 148 66 149 IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} )67 IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} AND WIN32) 150 68 SET(CPACK_PACKAGE_NAME ${PROJECT_NAME}) 151 69 SET(CPACK_PACKAGE_VENDOR "EGRES") -
lemon/network_simplex.h
r896 r889 167 167 typedef std::vector<Value> ValueVector; 168 168 typedef std::vector<Cost> CostVector; 169 typedef std::vector<signed char> CharVector; 170 // Note: vector<signed char> is used instead of vector<ArcState> and 171 // vector<ArcDirection> for efficiency reasons 169 typedef std::vector<char> BoolVector; 170 // Note: vector<char> is used instead of vector<bool> for efficiency reasons 172 171 173 172 // State constants for arcs … … 178 177 }; 179 178 180 // Direction constants for tree arcs 181 enum ArcDirection { 182 DIR_DOWN = -1, 183 DIR_UP = 1 184 }; 179 typedef std::vector<signed char> StateVector; 180 // Note: vector<signed char> is used instead of vector<ArcState> for 181 // efficiency reasons 185 182 186 183 private: … … 221 218 IntVector _succ_num; 222 219 IntVector _last_succ; 223 CharVector _pred_dir;224 CharVector _state;225 220 IntVector _dirty_revs; 221 BoolVector _forward; 222 StateVector _state; 226 223 int _root; 227 224 228 225 // Temporary data used in the current pivot iteration 229 226 int in_arc, join, u_in, v_in, u_out, v_out; 227 int first, second, right, last; 228 int stem, par_stem, new_stem; 230 229 Value delta; 231 230 … … 252 251 const IntVector &_target; 253 252 const CostVector &_cost; 254 const CharVector &_state;253 const StateVector &_state; 255 254 const CostVector &_pi; 256 255 int &_in_arc; … … 304 303 const IntVector &_target; 305 304 const CostVector &_cost; 306 const CharVector &_state;305 const StateVector &_state; 307 306 const CostVector &_pi; 308 307 int &_in_arc; … … 343 342 const IntVector &_target; 344 343 const CostVector &_cost; 345 const CharVector &_state;344 const StateVector &_state; 346 345 const CostVector &_pi; 347 346 int &_in_arc; … … 416 415 const IntVector &_target; 417 416 const CostVector &_cost; 418 const CharVector &_state;417 const StateVector &_state; 419 418 const CostVector &_pi; 420 419 int &_in_arc; … … 519 518 const IntVector &_target; 520 519 const CostVector &_cost; 521 const CharVector &_state;520 const StateVector &_state; 522 521 const CostVector &_pi; 523 522 int &_in_arc; … … 572 571 // Check the current candidate list 573 572 int e; 574 Cost c;575 573 for (int i = 0; i != _curr_length; ++i) { 576 574 e = _candidates[i]; 577 c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]); 578 if (c < 0) { 579 _cand_cost[e] = c; 580 } else { 575 _cand_cost[e] = _state[e] * 576 (_cost[e] + _pi[_source[e]] - _pi[_target[e]]); 577 if (_cand_cost[e] >= 0) { 581 578 _candidates[i--] = _candidates[--_curr_length]; 582 579 } … … 588 585 589 586 for (e = _next_arc; e != _search_arc_num; ++e) { 590 c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);591 if (c < 0) {592 _cand_cost[e] = c;587 _cand_cost[e] = _state[e] * 588 (_cost[e] + _pi[_source[e]] - _pi[_target[e]]); 589 if (_cand_cost[e] < 0) { 593 590 _candidates[_curr_length++] = e; 594 591 } … … 637 634 /// 638 635 /// \param graph The digraph the algorithm runs on. 639 /// \param arc_mixing Indicate if the arcs willbe stored in a636 /// \param arc_mixing Indicate if the arcs have to be stored in a 640 637 /// mixed order in the internal data structure. 641 /// In general, it leads to similar performance as using the original 642 /// arc order, but it makes the algorithm more robust and in special 643 /// cases, even significantly faster. Therefore, it is enabled by default. 644 NetworkSimplex(const GR& graph, bool arc_mixing = true) : 638 /// In special cases, it could lead to better overall performance, 639 /// but it is usually slower. Therefore it is disabled by default. 640 NetworkSimplex(const GR& graph, bool arc_mixing = false) : 645 641 _graph(graph), _node_id(graph), _arc_id(graph), 646 642 _arc_mixing(arc_mixing), … … 918 914 _parent.resize(all_node_num); 919 915 _pred.resize(all_node_num); 920 _ pred_dir.resize(all_node_num);916 _forward.resize(all_node_num); 921 917 _thread.resize(all_node_num); 922 918 _rev_thread.resize(all_node_num); … … 932 928 if (_arc_mixing) { 933 929 // Store the arcs in a mixed order 934 const int skip = std::max(_arc_num / _node_num, 3);930 int k = std::max(int(std::sqrt(double(_arc_num))), 10); 935 931 int i = 0, j = 0; 936 932 for (ArcIt a(_graph); a != INVALID; ++a) { … … 938 934 _source[i] = _node_id[_graph.source(a)]; 939 935 _target[i] = _node_id[_graph.target(a)]; 940 if ((i += skip) >= _arc_num) i = ++j;936 if ((i += k) >= _arc_num) i = ++j; 941 937 } 942 938 } else { … … 1121 1117 _state[e] = STATE_TREE; 1122 1118 if (_supply[u] >= 0) { 1123 _ pred_dir[u] = DIR_UP;1119 _forward[u] = true; 1124 1120 _pi[u] = 0; 1125 1121 _source[e] = u; … … 1128 1124 _cost[e] = 0; 1129 1125 } else { 1130 _ pred_dir[u] = DIR_DOWN;1126 _forward[u] = false; 1131 1127 _pi[u] = ART_COST; 1132 1128 _source[e] = _root; … … 1148 1144 _last_succ[u] = u; 1149 1145 if (_supply[u] >= 0) { 1150 _ pred_dir[u] = DIR_UP;1146 _forward[u] = true; 1151 1147 _pi[u] = 0; 1152 1148 _pred[u] = e; … … 1158 1154 _state[e] = STATE_TREE; 1159 1155 } else { 1160 _ pred_dir[u] = DIR_DOWN;1156 _forward[u] = false; 1161 1157 _pi[u] = ART_COST; 1162 1158 _pred[u] = f; … … 1189 1185 _last_succ[u] = u; 1190 1186 if (_supply[u] <= 0) { 1191 _ pred_dir[u] = DIR_DOWN;1187 _forward[u] = false; 1192 1188 _pi[u] = 0; 1193 1189 _pred[u] = e; … … 1199 1195 _state[e] = STATE_TREE; 1200 1196 } else { 1201 _ pred_dir[u] = DIR_UP;1197 _forward[u] = true; 1202 1198 _pi[u] = -ART_COST; 1203 1199 _pred[u] = f; … … 1242 1238 // Initialize first and second nodes according to the direction 1243 1239 // of the cycle 1244 int first, second;1245 1240 if (_state[in_arc] == STATE_LOWER) { 1246 1241 first = _source[in_arc]; … … 1252 1247 delta = _cap[in_arc]; 1253 1248 int result = 0; 1254 Value c,d;1249 Value d; 1255 1250 int e; 1256 1251 1257 // Search the cycle form the first node to the join node1252 // Search the cycle along the path form the first node to the root 1258 1253 for (int u = first; u != join; u = _parent[u]) { 1259 1254 e = _pred[u]; 1260 d = _flow[e]; 1261 if (_pred_dir[u] == DIR_DOWN) { 1262 c = _cap[e]; 1263 d = c >= MAX ? INF : c - d; 1264 } 1255 d = _forward[u] ? 1256 _flow[e] : (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]); 1265 1257 if (d < delta) { 1266 1258 delta = d; … … 1269 1261 } 1270 1262 } 1271 1272 // Search the cycle form the second node to the join node 1263 // Search the cycle along the path form the second node to the root 1273 1264 for (int u = second; u != join; u = _parent[u]) { 1274 1265 e = _pred[u]; 1275 d = _flow[e]; 1276 if (_pred_dir[u] == DIR_UP) { 1277 c = _cap[e]; 1278 d = c >= MAX ? INF : c - d; 1279 } 1266 d = _forward[u] ? 1267 (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]) : _flow[e]; 1280 1268 if (d <= delta) { 1281 1269 delta = d; … … 1302 1290 _flow[in_arc] += val; 1303 1291 for (int u = _source[in_arc]; u != join; u = _parent[u]) { 1304 _flow[_pred[u]] -= _pred_dir[u] *val;1292 _flow[_pred[u]] += _forward[u] ? -val : val; 1305 1293 } 1306 1294 for (int u = _target[in_arc]; u != join; u = _parent[u]) { 1307 _flow[_pred[u]] += _ pred_dir[u] *val;1295 _flow[_pred[u]] += _forward[u] ? val : -val; 1308 1296 } 1309 1297 } … … 1320 1308 // Update the tree structure 1321 1309 void updateTreeStructure() { 1310 int u, w; 1322 1311 int old_rev_thread = _rev_thread[u_out]; 1323 1312 int old_succ_num = _succ_num[u_out]; … … 1325 1314 v_out = _parent[u_out]; 1326 1315 1327 // Check if u_in and u_out coincide 1328 if (u_in == u_out) { 1329 // Update _parent, _pred, _pred_dir 1330 _parent[u_in] = v_in; 1331 _pred[u_in] = in_arc; 1332 _pred_dir[u_in] = u_in == _source[in_arc] ? DIR_UP : DIR_DOWN; 1333 1334 // Update _thread and _rev_thread 1335 if (_thread[v_in] != u_out) { 1336 int after = _thread[old_last_succ]; 1337 _thread[old_rev_thread] = after; 1338 _rev_thread[after] = old_rev_thread; 1339 after = _thread[v_in]; 1340 _thread[v_in] = u_out; 1341 _rev_thread[u_out] = v_in; 1342 _thread[old_last_succ] = after; 1343 _rev_thread[after] = old_last_succ; 1344 } 1316 u = _last_succ[u_in]; // the last successor of u_in 1317 right = _thread[u]; // the node after it 1318 1319 // Handle the case when old_rev_thread equals to v_in 1320 // (it also means that join and v_out coincide) 1321 if (old_rev_thread == v_in) { 1322 last = _thread[_last_succ[u_out]]; 1345 1323 } else { 1346 // Handle the case when old_rev_thread equals to v_in 1347 // (it also means that join and v_out coincide) 1348 int thread_continue = old_rev_thread == v_in ? 1349 _thread[old_last_succ] : _thread[v_in]; 1350 1351 // Update _thread and _parent along the stem nodes (i.e. the nodes 1352 // between u_in and u_out, whose parent have to be changed) 1353 int stem = u_in; // the current stem node 1354 int par_stem = v_in; // the new parent of stem 1355 int next_stem; // the next stem node 1356 int last = _last_succ[u_in]; // the last successor of stem 1357 int before, after = _thread[last]; 1358 _thread[v_in] = u_in; 1359 _dirty_revs.clear(); 1360 _dirty_revs.push_back(v_in); 1361 while (stem != u_out) { 1362 // Insert the next stem node into the thread list 1363 next_stem = _parent[stem]; 1364 _thread[last] = next_stem; 1365 _dirty_revs.push_back(last); 1366 1367 // Remove the subtree of stem from the thread list 1368 before = _rev_thread[stem]; 1369 _thread[before] = after; 1370 _rev_thread[after] = before; 1371 1372 // Change the parent node and shift stem nodes 1373 _parent[stem] = par_stem; 1374 par_stem = stem; 1375 stem = next_stem; 1376 1377 // Update last and after 1378 last = _last_succ[stem] == _last_succ[par_stem] ? 1379 _rev_thread[par_stem] : _last_succ[stem]; 1380 after = _thread[last]; 1381 } 1382 _parent[u_out] = par_stem; 1383 _thread[last] = thread_continue; 1384 _rev_thread[thread_continue] = last; 1385 _last_succ[u_out] = last; 1386 1387 // Remove the subtree of u_out from the thread list except for 1388 // the case when old_rev_thread equals to v_in 1389 if (old_rev_thread != v_in) { 1390 _thread[old_rev_thread] = after; 1391 _rev_thread[after] = old_rev_thread; 1392 } 1393 1394 // Update _rev_thread using the new _thread values 1395 for (int i = 0; i != int(_dirty_revs.size()); ++i) { 1396 int u = _dirty_revs[i]; 1397 _rev_thread[_thread[u]] = u; 1398 } 1399 1400 // Update _pred, _pred_dir, _last_succ and _succ_num for the 1401 // stem nodes from u_out to u_in 1402 int tmp_sc = 0, tmp_ls = _last_succ[u_out]; 1403 for (int u = u_out, p = _parent[u]; u != u_in; u = p, p = _parent[u]) { 1404 _pred[u] = _pred[p]; 1405 _pred_dir[u] = -_pred_dir[p]; 1406 tmp_sc += _succ_num[u] - _succ_num[p]; 1407 _succ_num[u] = tmp_sc; 1408 _last_succ[p] = tmp_ls; 1409 } 1410 _pred[u_in] = in_arc; 1411 _pred_dir[u_in] = u_in == _source[in_arc] ? DIR_UP : DIR_DOWN; 1412 _succ_num[u_in] = old_succ_num; 1324 last = _thread[v_in]; 1325 } 1326 1327 // Update _thread and _parent along the stem nodes (i.e. the nodes 1328 // between u_in and u_out, whose parent have to be changed) 1329 _thread[v_in] = stem = u_in; 1330 _dirty_revs.clear(); 1331 _dirty_revs.push_back(v_in); 1332 par_stem = v_in; 1333 while (stem != u_out) { 1334 // Insert the next stem node into the thread list 1335 new_stem = _parent[stem]; 1336 _thread[u] = new_stem; 1337 _dirty_revs.push_back(u); 1338 1339 // Remove the subtree of stem from the thread list 1340 w = _rev_thread[stem]; 1341 _thread[w] = right; 1342 _rev_thread[right] = w; 1343 1344 // Change the parent node and shift stem nodes 1345 _parent[stem] = par_stem; 1346 par_stem = stem; 1347 stem = new_stem; 1348 1349 // Update u and right 1350 u = _last_succ[stem] == _last_succ[par_stem] ? 1351 _rev_thread[par_stem] : _last_succ[stem]; 1352 right = _thread[u]; 1353 } 1354 _parent[u_out] = par_stem; 1355 _thread[u] = last; 1356 _rev_thread[last] = u; 1357 _last_succ[u_out] = u; 1358 1359 // Remove the subtree of u_out from the thread list except for 1360 // the case when old_rev_thread equals to v_in 1361 // (it also means that join and v_out coincide) 1362 if (old_rev_thread != v_in) { 1363 _thread[old_rev_thread] = right; 1364 _rev_thread[right] = old_rev_thread; 1365 } 1366 1367 // Update _rev_thread using the new _thread values 1368 for (int i = 0; i != int(_dirty_revs.size()); ++i) { 1369 u = _dirty_revs[i]; 1370 _rev_thread[_thread[u]] = u; 1371 } 1372 1373 // Update _pred, _forward, _last_succ and _succ_num for the 1374 // stem nodes from u_out to u_in 1375 int tmp_sc = 0, tmp_ls = _last_succ[u_out]; 1376 u = u_out; 1377 while (u != u_in) { 1378 w = _parent[u]; 1379 _pred[u] = _pred[w]; 1380 _forward[u] = !_forward[w]; 1381 tmp_sc += _succ_num[u] - _succ_num[w]; 1382 _succ_num[u] = tmp_sc; 1383 _last_succ[w] = tmp_ls; 1384 u = w; 1385 } 1386 _pred[u_in] = in_arc; 1387 _forward[u_in] = (u_in == _source[in_arc]); 1388 _succ_num[u_in] = old_succ_num; 1389 1390 // Set limits for updating _last_succ form v_in and v_out 1391 // towards the root 1392 int up_limit_in = -1; 1393 int up_limit_out = -1; 1394 if (_last_succ[join] == v_in) { 1395 up_limit_out = join; 1396 } else { 1397 up_limit_in = join; 1413 1398 } 1414 1399 1415 1400 // Update _last_succ from v_in towards the root 1416 int up_limit_out = _last_succ[join] == v_in ? join : -1; 1417 int last_succ_out = _last_succ[u_out]; 1418 for (int u = v_in; u != -1 && _last_succ[u] == v_in; u = _parent[u]) { 1419 _last_succ[u] = last_succ_out; 1420 } 1421 1401 for (u = v_in; u != up_limit_in && _last_succ[u] == v_in; 1402 u = _parent[u]) { 1403 _last_succ[u] = _last_succ[u_out]; 1404 } 1422 1405 // Update _last_succ from v_out towards the root 1423 1406 if (join != old_rev_thread && v_in != old_rev_thread) { 1424 for ( intu = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;1407 for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ; 1425 1408 u = _parent[u]) { 1426 1409 _last_succ[u] = old_rev_thread; 1427 1410 } 1428 } 1429 else if (last_succ_out != old_last_succ) { 1430 for (int u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ; 1411 } else { 1412 for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ; 1431 1413 u = _parent[u]) { 1432 _last_succ[u] = last_succ_out;1414 _last_succ[u] = _last_succ[u_out]; 1433 1415 } 1434 1416 } 1435 1417 1436 1418 // Update _succ_num from v_in to join 1437 for ( intu = v_in; u != join; u = _parent[u]) {1419 for (u = v_in; u != join; u = _parent[u]) { 1438 1420 _succ_num[u] += old_succ_num; 1439 1421 } 1440 1422 // Update _succ_num from v_out to join 1441 for ( intu = v_out; u != join; u = _parent[u]) {1423 for (u = v_out; u != join; u = _parent[u]) { 1442 1424 _succ_num[u] -= old_succ_num; 1443 1425 } 1444 1426 } 1445 1427 1446 // Update potentials in the subtree that has been moved1428 // Update potentials 1447 1429 void updatePotential() { 1448 Cost sigma = _pi[v_in] - _pi[u_in] - 1449 _pred_dir[u_in] * _cost[in_arc]; 1430 Cost sigma = _forward[u_in] ? 1431 _pi[v_in] - _pi[u_in] - _cost[_pred[u_in]] : 1432 _pi[v_in] - _pi[u_in] + _cost[_pred[u_in]]; 1433 // Update potentials in the subtree, which has been moved 1450 1434 int end = _thread[_last_succ[u_in]]; 1451 1435 for (int u = u_in; u != end; u = _thread[u]) { -
test/CMakeLists.txt
r905 r904 119 119 120 120 FOREACH(TEST_NAME ${TESTS}) 121 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer") 122 ADD_EXECUTABLE(${TEST_NAME} ${TEST_NAME}.cc) 123 ELSE() 124 ADD_EXECUTABLE(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_NAME}.cc) 125 ENDIF() 121 ADD_EXECUTABLE(${TEST_NAME} ${TEST_NAME}.cc) 126 122 TARGET_LINK_LIBRARIES(${TEST_NAME} lemon) 127 123 ADD_TEST(${TEST_NAME} ${TEST_NAME}) 128 ADD_DEPENDENCIES(check ${TEST_NAME})129 124 ENDFOREACH()
Note: See TracChangeset
for help on using the changeset viewer.