Changes in / [1176:2e0c2c25d63e:1169:8db773f19586] in lemon-main
- Files:
-
- 42 edited
Legend:
- Unmodified
- Added
- Removed
-
CMakeLists.txt
r1137 r1088 1 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 2 3 IF(POLICY CMP0048) 4 CMAKE_POLICY(SET CMP0048 OLD) 5 ENDIF(POLICY CMP0048) 6 7 IF(POLICY CMP0026) 8 #This is for copying the dll's needed by glpk (in lp_test and mip_test) 9 CMAKE_POLICY(SET CMP0026 OLD) 10 ENDIF(POLICY CMP0026) 1 CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 11 2 12 3 SET(PROJECT_NAME "LEMON") … … 71 62 FIND_PACKAGE(Doxygen) 72 63 FIND_PACKAGE(Ghostscript) 73 74 IF(WIN32)75 SET(LEMON_WIN32 TRUE)76 ENDIF(WIN32)77 64 78 65 SET(LEMON_ENABLE_GLPK YES CACHE STRING "Enable GLPK solver backend.") … … 135 122 SET(LEMON_DEFAULT_LP ${DEFAULT_LP} CACHE STRING 136 123 "Default LP solver backend (GLPK, CPLEX, CLP or SOPLEX)" FORCE) 137 ELSE()138 SET(LEMON_DEFAULT_LP ${DEFAULT_LP} CACHE STRING139 "Default LP solver backend (GLPK, CPLEX, CLP or SOPLEX)")140 124 ENDIF() 141 125 IF(NOT LEMON_DEFAULT_MIP OR … … 145 129 SET(LEMON_DEFAULT_MIP ${DEFAULT_MIP} CACHE STRING 146 130 "Default MIP solver backend (GLPK, CPLEX or CBC)" FORCE) 147 ELSE()148 SET(LEMON_DEFAULT_MIP ${DEFAULT_MIP} CACHE STRING149 "Default MIP solver backend (GLPK, CPLEX or CBC)")150 131 ENDIF() 151 132 … … 160 141 ELSEIF(MSVC) 161 142 # This part is unnecessary 'casue the same is set by the lemon/core.h. 162 # Still kept as an example. 163 164 # SET(CXX_WARNING "/wd4250 /wd4267 /wd4355 /wd4503 /wd4800 /wd4996") 165 143 # Still keep it as an example. 144 SET(CXX_WARNING "/wd4250 /wd4355 /wd4503 /wd4800 /wd4996") 166 145 # Suppressed warnings: 167 146 # C4250: 'class1' : inherits 'class2::member' via dominance 168 # C4267: conversion from 'size_t' to 'type', possible loss of data169 147 # C4355: 'this' : used in base member initializer list 170 148 # C4503: 'function' : decorated name length exceeded, name was truncated … … 181 159 182 160 IF(MSVC) 183 SET(CMAKE_CXX_FLAGS "/bigobj ${CMAKE_CXX_FLAGS}")184 161 SET( CMAKE_CXX_FLAGS_MAINTAINER "/WX ${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING 185 162 "Flags used by the C++ compiler during maintainer builds." … … 204 181 ) 205 182 SET( CMAKE_EXE_LINKER_FLAGS_MAINTAINER 206 " ${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING183 "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING 207 184 "Flags used for linking binaries during maintainer builds." 208 185 ) 209 186 SET( CMAKE_SHARED_LINKER_FLAGS_MAINTAINER 210 " ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING187 "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING 211 188 "Flags used by the shared libraries linker during maintainer builds." 212 189 ) -
NEWS
r1094 r881 1 2013-08-10 Version 1.3 released2 3 This is major feature release4 5 * New data structures6 7 #69 : Bipartite graph concepts and implementations8 9 * New algorithms10 11 #177: Port Edmonds-Karp algorithm12 #380, #405: Heuristic algorithm for the max clique problem13 #386: Heuristic algorithms for symmetric TSP14 ----: Nagamochi-Ibaraki algorithm [5087694945e4]15 #397, #56: Max. cardinality search16 17 * Other new features18 19 #223: Thread safe graph and graph map implementations20 #442: Different TimeStamp print formats21 #457: File export functionality to LpBase22 #362: Bidirectional iterator support for radixSort()23 24 * Implementation improvements25 26 ----: Network Simplex27 #391: Better update process, pivot rule and arc mixing28 #435: Improved Altering List pivot rule29 #417: Various fine tunings in CostScaling30 #438: Optional iteration limit in HowardMmc31 #436: Ensure strongly polynomial running time for CycleCanceling32 while keeping the same performance33 ----: Make the CBC interface be compatible with latest CBC releases34 [ee581a0ecfbf]35 36 * CMAKE has become the default build environment (#434)37 38 ----: Autotool support has been dropped39 ----: Improved LP/MIP configuration40 #465: Enable/disable options for LP/MIP backends41 #446: Better CPLEX discovery42 #460: Add cmake config to find SoPlex43 ----: Allow CPACK configuration on all platforms44 #390: Add 'Maintainer' CMAKE build type45 #388: Add 'check' target.46 #401: Add contrib dir47 #389: Better version string setting in CMAKE48 #433: Support shared library build49 #416: Support testing with valgrind50 51 * Doc improvements52 53 #395: SOURCE_BROWSER Doxygen switch is configurable from CMAKE54 update-external-tags CMAKE target55 #455: Optionally use MathJax for rendering the math formulae56 #402, #437, #459, #456, #463: Various doc improvements57 58 * Bugfixes (compared to release 1.2):59 60 #432: Add missing doc/template.h and doc/references.bib to release61 tarball62 ----: Intel C++ compatibility fixes63 #441: Fix buggy reinitialization in _solver_bits::VarIndex::clear()64 #444: Bugfix in path copy constructors and assignment operators65 #447: Bugfix in AllArcLookUp<>66 #448: Bugfix in adaptor_test.cc67 #449: Fix clang compilation warnings and errors68 #440: Fix a bug + remove redundant typedefs in dimacs-solver69 #453: Avoid GCC 4.7 compiler warnings70 #445: Fix missing initialization in CplexEnv::CplexEnv()71 #428: Add missing lemon/lemon.pc.cmake to the release tarball72 #393: Create and install lemon.pc73 #429: Fix VS warnings74 #430: Fix LpBase::Constr two-side limit bug75 #392: Bug fix in Dfs::start(s,t)76 #414: Fix wrong initialization in Preflow77 #418: Better Win CodeBlock/MinGW support78 #419: Build environment improvements79 - Build of mip_test and lp_test precede the running of the tests80 - Also search for coin libs under ${COIN_ROOT_DIR}/lib/coin81 - Do not look for COIN_VOL libraries82 #382: Allow lgf file without Arc maps83 #417: Bug fix in CostScaling84 #366: Fix Pred[Matrix]MapPath::empty()85 #371: Bug fix in (di)graphCopy()86 The target graph is cleared before adding nodes and arcs/edges.87 #364: Add missing UndirectedTags88 #368: Fix the usage of std::numeric_limits<>::min() in Network Simplex89 #372: Fix a critical bug in preflow90 #461: Bugfix in assert.h91 #470: Fix compilation issues related to various gcc versions92 #446: Fix #define indicating CPLEX availability93 #294: Add explicit namespace to94 ignore_unused_variable_warning() usages95 #420: Bugfix in IterableValueMap96 #439: Bugfix in biNodeConnected()97 98 99 1 2010-03-19 Version 1.2 released 100 2 -
cmake/FindILOG.cmake
r1126 r1064 63 63 ${ILOG_CPLEX_ROOT_DIR}/lib/x86_debian4.0_4.1/static_pic 64 64 ${ILOG_CPLEX_ROOT_DIR}/lib/x86-64_debian4.0_4.1/static_pic 65 ${ILOG_CPLEX_ROOT_DIR}/lib/x86_linux/static_pic66 ${ILOG_CPLEX_ROOT_DIR}/lib/x86-64_linux/static_pic67 65 ${ILOG_CPLEX_ROOT_DIR}/lib/${ILOG_WIN_COMPILER}/stat_mda 68 66 NO_DEFAULT_PATH … … 75 73 ${ILOG_CONCERT_ROOT_DIR}/lib/x86_debian4.0_4.1/static_pic 76 74 ${ILOG_CONCERT_ROOT_DIR}/lib/x86-64_debian4.0_4.1/static_pic 77 ${ILOG_CONCERT_ROOT_DIR}/lib/x86_linux/static_pic78 ${ILOG_CONCERT_ROOT_DIR}/lib/x86-64_linux/static_pic79 75 ${ILOG_CONCERT_ROOT_DIR}/lib/${ILOG_WIN_COMPILER}/stat_mda 80 76 NO_DEFAULT_PATH -
doc/groups.dox
r1093 r1092 423 423 However, other algorithms could be faster in special cases. 424 424 For example, if the total supply and/or capacities are rather small, 425 \ref CapacityScaling is usually the fastest algorithm 426 (without effective scaling). 425 \ref CapacityScaling is usually the fastest algorithm (without effective scaling). 427 426 428 427 These classes are intended to be used with integer-valued input data -
lemon/CMakeLists.txt
r1116 r1088 56 56 57 57 ADD_LIBRARY(lemon ${LEMON_SOURCES}) 58 59 TARGET_LINK_LIBRARIES(lemon60 ${GLPK_LIBRARIES} ${COIN_LIBRARIES} ${ILOG_LIBRARIES} ${SOPLEX_LIBRARIES}61 )62 63 58 IF(UNIX) 64 SET_TARGET_PROPERTIES(lemon PROPERTIES OUTPUT_NAME emon VERSION ${LEMON_VERSION} SOVERSION ${LEMON_VERSION})59 SET_TARGET_PROPERTIES(lemon PROPERTIES OUTPUT_NAME emon) 65 60 ENDIF() 66 61 -
lemon/arg_parser.h
r1123 r879 27 27 #include <sstream> 28 28 #include <algorithm> 29 #include <lemon/core.h>30 29 #include <lemon/assert.h> 31 30 -
lemon/bits/windows.cc
r1135 r1092 22 22 #include<lemon/bits/windows.h> 23 23 24 #if defined(LEMON_WIN32) && defined(__GNUC__) 25 #pragma GCC diagnostic ignored "-Wold-style-cast" 26 #endif 27 28 #ifdef LEMON_WIN32 24 #ifdef WIN32 29 25 #ifndef WIN32_LEAN_AND_MEAN 30 26 #define WIN32_LEAN_AND_MEAN … … 45 41 #include <unistd.h> 46 42 #include <ctime> 47 #ifndef LEMON_WIN3243 #ifndef WIN32 48 44 #include <sys/times.h> 49 45 #endif … … 60 56 double &cutime, double &cstime) 61 57 { 62 #ifdef LEMON_WIN3258 #ifdef WIN32 63 59 static const double ch = 4294967296.0e-7; 64 60 static const double cl = 1.0e-7; … … 99 95 { 100 96 std::ostringstream os; 101 #ifdef LEMON_WIN3297 #ifdef WIN32 102 98 SYSTEMTIME time; 103 99 GetSystemTime(&time); 104 100 char buf1[11], buf2[9], buf3[5]; 105 if (GetDateFormat(MY_LOCALE, 0, &time,101 if (GetDateFormat(MY_LOCALE, 0, &time, 106 102 ("ddd MMM dd"), buf1, 11) && 107 103 GetTimeFormat(MY_LOCALE, 0, &time, … … 125 121 int getWinRndSeed() 126 122 { 127 #ifdef LEMON_WIN32123 #ifdef WIN32 128 124 FILETIME time; 129 125 GetSystemTimeAsFileTime(&time); … … 137 133 138 134 WinLock::WinLock() { 139 #ifdef LEMON_WIN32135 #ifdef WIN32 140 136 CRITICAL_SECTION *lock = new CRITICAL_SECTION; 141 137 InitializeCriticalSection(lock); … … 147 143 148 144 WinLock::~WinLock() { 149 #ifdef LEMON_WIN32145 #ifdef WIN32 150 146 CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr); 151 147 DeleteCriticalSection(lock); … … 155 151 156 152 void WinLock::lock() { 157 #ifdef LEMON_WIN32153 #ifdef WIN32 158 154 CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr); 159 155 EnterCriticalSection(lock); … … 162 158 163 159 void WinLock::unlock() { 164 #ifdef LEMON_WIN32160 #ifdef WIN32 165 161 CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr); 166 162 LeaveCriticalSection(lock); -
lemon/bits/windows.h
r1134 r1092 20 20 #define LEMON_BITS_WINDOWS_H 21 21 22 #include <lemon/config.h>23 22 #include <string> 24 23 … … 36 35 ~WinLock(); 37 36 void lock(); 38 void unlock(); \37 void unlock(); 39 38 private: 40 39 void *_repr; -
lemon/capacity_scaling.h
r1155 r1092 28 28 #include <limits> 29 29 #include <lemon/core.h> 30 #include <lemon/maps.h>31 30 #include <lemon/bin_heap.h> 32 31 … … 165 164 166 165 // Parameters of the problem 167 bool _ha s_lower;166 bool _have_lower; 168 167 Value _sum_supply; 169 168 … … 358 357 template <typename LowerMap> 359 358 CapacityScaling& lowerMap(const LowerMap& map) { 360 _ha s_lower = true;359 _have_lower = true; 361 360 for (ArcIt a(_graph); a != INVALID; ++a) { 362 361 _lower[_arc_idf[a]] = map[a]; 362 _lower[_arc_idb[a]] = map[a]; 363 363 } 364 364 return *this; … … 544 544 _cost[j] = _forward[j] ? 1 : -1; 545 545 } 546 _ha s_lower = false;546 _have_lower = false; 547 547 return *this; 548 548 } … … 755 755 const Value MAX = std::numeric_limits<Value>::max(); 756 756 int last_out; 757 if (_ha s_lower) {757 if (_have_lower) { 758 758 for (int i = 0; i != _root; ++i) { 759 759 last_out = _first_out[i+1]; … … 840 840 } 841 841 842 // Check if the upper bound is greater thanor equal to the lower bound843 // on each forwardarc.842 // Check if the upper bound is greater or equal to the lower bound 843 // on each arc. 844 844 bool checkBoundMaps() { 845 845 for (int j = 0; j != _res_arc_num; ++j) { 846 if (_ forward[j] && _upper[j] < _lower[j]) return false;846 if (_upper[j] < _lower[j]) return false; 847 847 } 848 848 return true; … … 858 858 859 859 // Handle non-zero lower bounds 860 if (_ha s_lower) {860 if (_have_lower) { 861 861 int limit = _first_out[_root]; 862 862 for (int j = 0; j != limit; ++j) { 863 if ( _forward[j]) _res_cap[_reverse[j]] += _lower[j];863 if (!_forward[j]) _res_cap[j] += _lower[j]; 864 864 } 865 865 } -
lemon/concepts/digraph.h
r1093 r1092 313 313 /// Sets the iterator to the first arc of the given digraph. 314 314 /// 315 explicit ArcIt(const Digraph& g) { 316 ::lemon::ignore_unused_variable_warning(g); 317 } 315 explicit ArcIt(const Digraph& g) { ::lemon::ignore_unused_variable_warning(g); } 318 316 /// Sets the iterator to the given arc. 319 317 -
lemon/concepts/graph.h
r1093 r1092 397 397 /// Sets the iterator to the first arc of the given graph. 398 398 /// 399 explicit ArcIt(const Graph &g) { 400 ::lemon::ignore_unused_variable_warning(g); 401 } 399 explicit ArcIt(const Graph &g) { ::lemon::ignore_unused_variable_warning(g); } 402 400 /// Sets the iterator to the given arc. 403 401 -
lemon/config.h.in
r1134 r1088 1 #ifndef LEMON_CONFIG_H2 #define LEMON_CONFIG_H3 4 1 #define LEMON_VERSION "@PROJECT_VERSION@" 5 2 #cmakedefine LEMON_HAVE_LONG_LONG 1 6 7 #cmakedefine LEMON_WIN32 18 9 3 #cmakedefine LEMON_HAVE_LP 1 10 4 #cmakedefine LEMON_HAVE_MIP 1 … … 14 8 #cmakedefine LEMON_HAVE_CLP 1 15 9 #cmakedefine LEMON_HAVE_CBC 1 16 17 #define LEMON_CPLEX_ 1 18 #define LEMON_CLP_ 2 19 #define LEMON_GLPK_ 3 20 #define LEMON_SOPLEX_ 4 21 #define LEMON_CBC_ 5 22 23 #cmakedefine LEMON_DEFAULT_LP LEMON_@LEMON_DEFAULT_LP@_ 24 #cmakedefine LEMON_DEFAULT_MIP LEMON_@LEMON_DEFAULT_MIP@_ 25 10 #cmakedefine LEMON_DEFAULT_LP @LEMON_DEFAULT_LP@ 11 #cmakedefine LEMON_DEFAULT_MIP @LEMON_DEFAULT_MIP@ 26 12 #cmakedefine LEMON_USE_PTHREAD 1 27 13 #cmakedefine LEMON_USE_WIN32_THREADS 1 28 29 #endif -
lemon/core.h
r1135 r1092 20 20 #define LEMON_CORE_H 21 21 22 #include <vector> 23 #include <algorithm> 24 25 #include <lemon/config.h> 26 #include <lemon/bits/enable_if.h> 27 #include <lemon/bits/traits.h> 28 #include <lemon/assert.h> 29 30 // Disable the following warnings when compiling with MSVC: 31 // C4250: 'class1' : inherits 'class2::member' via dominance 32 // C4355: 'this' : used in base member initializer list 33 // C4503: 'function' : decorated name length exceeded, name was truncated 34 // C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning) 35 // C4996: 'function': was declared deprecated 36 #ifdef _MSC_VER 37 #pragma warning( disable : 4250 4355 4503 4800 4996 ) 38 #endif 39 40 #ifdef __GNUC__ 41 #define GCC_VERSION (__GNUC__ * 10000 \ 42 + __GNUC_MINOR__ * 100 \ 43 + __GNUC_PATCHLEVEL__) 44 #endif 45 46 #if GCC_VERSION >= 40800 47 // Needed by the [DI]GRAPH_TYPEDEFS marcos for gcc 4.8 48 #pragma GCC diagnostic ignored "-Wunused-local-typedefs" 49 #endif 50 22 51 ///\file 23 52 ///\brief LEMON core utilities. … … 26 55 ///It is automatically included by all graph types, therefore it usually 27 56 ///do not have to be included directly. 28 29 // Disable the following warnings when compiling with MSVC:30 // C4250: 'class1' : inherits 'class2::member' via dominance31 // C4267: conversion from 'size_t' to 'type', possible loss of data32 // C4355: 'this' : used in base member initializer list33 // C4503: 'function' : decorated name length exceeded, name was truncated34 // C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning)35 // C4996: 'function': was declared deprecated36 #ifdef _MSC_VER37 #pragma warning( disable : 4250 4267 4355 4503 4800 4996 )38 #endif39 40 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)41 // Needed by the [DI]GRAPH_TYPEDEFS marcos for gcc 4.842 #pragma GCC diagnostic ignored "-Wunused-local-typedefs"43 #endif44 45 #include <vector>46 #include <algorithm>47 48 #include <lemon/config.h>49 #include <lemon/bits/enable_if.h>50 #include <lemon/bits/traits.h>51 #include <lemon/assert.h>52 53 54 57 55 58 namespace lemon { -
lemon/cost_scaling.h
r1104 r1092 92 92 /// \ref CostScaling implements a cost scaling algorithm that performs 93 93 /// push/augment and relabel operations for finding a \ref min_cost_flow 94 /// "minimum cost flow" \cite amo93networkflows, 95 /// \cite goldberg90approximation, 94 /// "minimum cost flow" \cite amo93networkflows, \cite goldberg90approximation, 96 95 /// \cite goldberg97efficient, \cite bunnagel98efficient. 97 96 /// It is a highly efficient primal-dual solution method, which … … 215 214 typedef std::vector<LargeCost> LargeCostVector; 216 215 typedef std::vector<char> BoolVector; 217 // Note: vector<char> is used instead of vector<bool> 218 // for efficiency reasons 216 // Note: vector<char> is used instead of vector<bool> for efficiency reasons 219 217 220 218 private: … … 257 255 258 256 // Parameters of the problem 259 bool _ha s_lower;257 bool _have_lower; 260 258 Value _sum_supply; 261 259 int _sup_node_num; … … 373 371 template <typename LowerMap> 374 372 CostScaling& lowerMap(const LowerMap& map) { 375 _ha s_lower = true;373 _have_lower = true; 376 374 for (ArcIt a(_graph); a != INVALID; ++a) { 377 375 _lower[_arc_idf[a]] = map[a]; 376 _lower[_arc_idb[a]] = map[a]; 378 377 } 379 378 return *this; … … 568 567 _scost[_reverse[j]] = 0; 569 568 } 570 _ha s_lower = false;569 _have_lower = false; 571 570 return *this; 572 571 } … … 780 779 const Value MAX = std::numeric_limits<Value>::max(); 781 780 int last_out; 782 if (_ha s_lower) {781 if (_have_lower) { 783 782 for (int i = 0; i != _root; ++i) { 784 783 last_out = _first_out[i+1]; … … 837 836 sup[n] = _supply[_node_id[n]]; 838 837 } 839 if (_ha s_lower) {838 if (_have_lower) { 840 839 for (ArcIt a(_graph); a != INVALID; ++a) { 841 840 int j = _arc_idf[a]; … … 907 906 } 908 907 909 // Check if the upper bound is greater thanor equal to the lower bound910 // on each forwardarc.908 // Check if the upper bound is greater or equal to the lower bound 909 // on each arc. 911 910 bool checkBoundMaps() { 912 911 for (int j = 0; j != _res_arc_num; ++j) { 913 if (_ forward[j] && _upper[j] < _lower[j]) return false;912 if (_upper[j] < _lower[j]) return false; 914 913 } 915 914 return true; … … 991 990 992 991 // Handle non-zero lower bounds 993 if (_ha s_lower) {992 if (_have_lower) { 994 993 int limit = _first_out[_root]; 995 994 for (int j = 0; j != limit; ++j) { 996 if ( _forward[j]) _res_cap[_reverse[j]] += _lower[j];995 if (!_forward[j]) _res_cap[j] += _lower[j]; 997 996 } 998 997 } -
lemon/counter.h
r1123 r786 22 22 #include <string> 23 23 #include <iostream> 24 25 #include <lemon/core.h>26 24 27 25 ///\ingroup timecount -
lemon/cplex.cc
r1139 r1092 38 38 } 39 39 40 void CplexEnv::incCnt() 41 { 42 _cnt_lock->lock(); 40 CplexEnv::CplexEnv() { 41 int status; 42 _cnt = new int; 43 (*_cnt) = 1; 44 _env = CPXopenCPLEX(&status); 45 if (_env == 0) { 46 delete _cnt; 47 _cnt = 0; 48 throw LicenseError(status); 49 } 50 } 51 52 CplexEnv::CplexEnv(const CplexEnv& other) { 53 _env = other._env; 54 _cnt = other._cnt; 43 55 ++(*_cnt); 44 _cnt_lock->unlock(); 45 } 46 47 void CplexEnv::decCnt() 48 { 49 _cnt_lock->lock(); 56 } 57 58 CplexEnv& CplexEnv::operator=(const CplexEnv& other) { 59 _env = other._env; 60 _cnt = other._cnt; 61 ++(*_cnt); 62 return *this; 63 } 64 65 CplexEnv::~CplexEnv() { 50 66 --(*_cnt); 51 67 if (*_cnt == 0) { 52 68 delete _cnt; 53 _cnt_lock->unlock();54 delete _cnt_lock;55 69 CPXcloseCPLEX(&_env); 56 70 } 57 else _cnt_lock->unlock();58 }59 60 CplexEnv::CplexEnv() {61 int status;62 _env = CPXopenCPLEX(&status);63 if (_env == 0)64 throw LicenseError(status);65 _cnt = new int;66 (*_cnt) = 1;67 _cnt_lock = new bits::Lock;68 }69 70 CplexEnv::CplexEnv(const CplexEnv& other) {71 _env = other._env;72 _cnt = other._cnt;73 _cnt_lock = other._cnt_lock;74 incCnt();75 }76 77 CplexEnv& CplexEnv::operator=(const CplexEnv& other) {78 decCnt();79 _env = other._env;80 _cnt = other._cnt;81 _cnt_lock = other._cnt_lock;82 incCnt();83 return *this;84 }85 86 CplexEnv::~CplexEnv() {87 decCnt();88 71 } 89 72 -
lemon/cplex.h
r1139 r1092 24 24 25 25 #include <lemon/lp_base.h> 26 #include <lemon/bits/lock.h>27 26 28 27 struct cpxenv; … … 42 41 cpxenv* _env; 43 42 mutable int* _cnt; 44 mutable bits::Lock* _cnt_lock; 45 46 void incCnt(); 47 void decCnt(); 48 43 49 44 public: 50 45 -
lemon/cycle_canceling.h
r1104 r1092 196 196 197 197 // Parameters of the problem 198 bool _ha s_lower;198 bool _have_lower; 199 199 Value _sum_supply; 200 200 … … 279 279 template <typename LowerMap> 280 280 CycleCanceling& lowerMap(const LowerMap& map) { 281 _ha s_lower = true;281 _have_lower = true; 282 282 for (ArcIt a(_graph); a != INVALID; ++a) { 283 283 _lower[_arc_idf[a]] = map[a]; 284 _lower[_arc_idb[a]] = map[a]; 284 285 } 285 286 return *this; … … 471 472 _cost[_reverse[j]] = 0; 472 473 } 473 _ha s_lower = false;474 _have_lower = false; 474 475 return *this; 475 476 } … … 684 685 const Value MAX = std::numeric_limits<Value>::max(); 685 686 int last_out; 686 if (_ha s_lower) {687 if (_have_lower) { 687 688 for (int i = 0; i != _root; ++i) { 688 689 last_out = _first_out[i+1]; … … 727 728 sup[n] = _supply[_node_id[n]]; 728 729 } 729 if (_ha s_lower) {730 if (_have_lower) { 730 731 for (ArcIt a(_graph); a != INVALID; ++a) { 731 732 int j = _arc_idf[a]; … … 784 785 } 785 786 786 // Check if the upper bound is greater thanor equal to the lower bound787 // on each forwardarc.787 // Check if the upper bound is greater or equal to the lower bound 788 // on each arc. 788 789 bool checkBoundMaps() { 789 790 for (int j = 0; j != _res_arc_num; ++j) { 790 if (_ forward[j] && _upper[j] < _lower[j]) return false;791 if (_upper[j] < _lower[j]) return false; 791 792 } 792 793 return true; … … 835 836 836 837 // Handle non-zero lower bounds 837 if (_ha s_lower) {838 if (_have_lower) { 838 839 int limit = _first_out[_root]; 839 840 for (int j = 0; j != limit; ++j) { 840 if ( _forward[j]) _res_cap[_reverse[j]] += _lower[j];841 if (!_forward[j]) _res_cap[j] += _lower[j]; 841 842 } 842 843 } -
lemon/dim2.h
r1112 r714 21 21 22 22 #include <iostream> 23 #include <algorithm>24 23 25 24 ///\ingroup geomdat -
lemon/dimacs.h
r1160 r1092 26 26 #include <lemon/maps.h> 27 27 #include <lemon/error.h> 28 29 28 /// \ingroup dimacs_group 30 29 /// \file … … 124 123 /// 125 124 /// If the file type was previously evaluated by dimacsType(), then 126 /// the descriptor struct should be given by the \c des cparameter.125 /// the descriptor struct should be given by the \c dest parameter. 127 126 template <typename Digraph, typename LowerMap, 128 127 typename CapacityMap, typename CostMap, … … 278 277 /// 279 278 /// If the file type was previously evaluated by dimacsType(), then 280 /// the descriptor struct should be given by the \c des cparameter.279 /// the descriptor struct should be given by the \c dest parameter. 281 280 template<typename Digraph, typename CapacityMap> 282 281 void readDimacsMax(std::istream& is, … … 305 304 /// 306 305 /// If the file type was previously evaluated by dimacsType(), then 307 /// the descriptor struct should be given by the \c des cparameter.306 /// the descriptor struct should be given by the \c dest parameter. 308 307 template<typename Digraph, typename LengthMap> 309 308 void readDimacsSp(std::istream& is, … … 336 335 /// 337 336 /// If the file type was previously evaluated by dimacsType(), then 338 /// the descriptor struct should be given by the \c des cparameter.337 /// the descriptor struct should be given by the \c dest parameter. 339 338 template<typename Digraph, typename CapacityMap> 340 339 void readDimacsCap(std::istream& is, … … 345 344 typename Digraph::Node u,v; 346 345 if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is); 347 if(desc.type!=DimacsDescriptor::MAX &&desc.type!=DimacsDescriptor::SP)346 if(desc.type!=DimacsDescriptor::MAX || desc.type!=DimacsDescriptor::SP) 348 347 throw FormatError("Problem type mismatch"); 349 348 _readDimacs(is, g, capacity, u, v, infty, desc); … … 376 375 /// 377 376 /// If the file type was previously evaluated by dimacsType(), then 378 /// the descriptor struct should be given by the \c des cparameter.377 /// the descriptor struct should be given by the \c dest parameter. 379 378 template<typename Graph> 380 379 void readDimacsMat(std::istream& is, Graph &g, -
lemon/elevator.h
r1124 r581 168 168 int onLevel(int l) const 169 169 { 170 return static_cast<int>(_first[l+1]-_first[l]);170 return _first[l+1]-_first[l]; 171 171 } 172 172 ///Return true if level \c l is empty. … … 178 178 int aboveLevel(int l) const 179 179 { 180 return static_cast<int>(_first[_max_level+1]-_first[l+1]);180 return _first[_max_level+1]-_first[l+1]; 181 181 } 182 182 ///Return the number of active items on level \c l. 183 183 int activesOnLevel(int l) const 184 184 { 185 return static_cast<int>(_last_active[l]-_first[l]+1);185 return _last_active[l]-_first[l]+1; 186 186 } 187 187 ///Return true if there is no active item on level \c l. -
lemon/graph_to_eps.h
r1134 r1092 26 26 #include<vector> 27 27 28 #ifndef LEMON_WIN3228 #ifndef WIN32 29 29 #include<sys/time.h> 30 30 #include<ctime> … … 223 223 using T::_copyright; 224 224 225 using T::NodeTextColorType; 225 226 using T::CUST_COL; 226 227 using T::DIST_COL; … … 675 676 { 676 677 os << "%%CreationDate: "; 677 #ifndef LEMON_WIN32678 #ifndef WIN32 678 679 timeval tv; 679 680 gettimeofday(&tv, 0); -
lemon/howard_mmc.h
r1093 r1092 362 362 /// \return The termination cause of the search process. 363 363 /// For more information, see \ref TerminationCause. 364 TerminationCause findCycleMean(int limit = 365 std::numeric_limits<int>::max()) { 364 TerminationCause findCycleMean(int limit = std::numeric_limits<int>::max()) { 366 365 // Initialize and find strongly connected components 367 366 init(); -
lemon/list_graph.h
r1148 r1092 583 583 } 584 584 virtual void add(const std::vector<Node>& nodes) { 585 for (int i = nodes.size() - 1; i >= 0; --i) {585 for (int i = nodes.size() - 1; i >= 0; ++i) { 586 586 snapshot.addNode(nodes[i]); 587 587 } … … 633 633 } 634 634 virtual void add(const std::vector<Arc>& arcs) { 635 for (int i = arcs.size() - 1; i >= 0; --i) {635 for (int i = arcs.size() - 1; i >= 0; ++i) { 636 636 snapshot.addArc(arcs[i]); 637 637 } … … 1395 1395 } 1396 1396 virtual void add(const std::vector<Node>& nodes) { 1397 for (int i = nodes.size() - 1; i >= 0; --i) {1397 for (int i = nodes.size() - 1; i >= 0; ++i) { 1398 1398 snapshot.addNode(nodes[i]); 1399 1399 } … … 1445 1445 } 1446 1446 virtual void add(const std::vector<Edge>& edges) { 1447 for (int i = edges.size() - 1; i >= 0; --i) {1447 for (int i = edges.size() - 1; i >= 0; ++i) { 1448 1448 snapshot.addEdge(edges[i]); 1449 1449 } … … 2300 2300 } 2301 2301 virtual void add(const std::vector<Node>& nodes) { 2302 for (int i = nodes.size() - 1; i >= 0; --i) {2302 for (int i = nodes.size() - 1; i >= 0; ++i) { 2303 2303 snapshot.addNode(nodes[i]); 2304 2304 } … … 2350 2350 } 2351 2351 virtual void add(const std::vector<Edge>& edges) { 2352 for (int i = edges.size() - 1; i >= 0; --i) {2352 for (int i = edges.size() - 1; i >= 0; ++i) { 2353 2353 snapshot.addEdge(edges[i]); 2354 2354 } -
lemon/lp.h
r1134 r1092 23 23 24 24 25 #if LEMON_DEFAULT_LP == LEMON_GLPK_ || LEMON_DEFAULT_MIP == LEMON_GLPK_25 #ifdef LEMON_HAVE_GLPK 26 26 #include <lemon/glpk.h> 27 #endif 28 #if LEMON_DEFAULT_LP == LEMON_CPLEX_ || LEMON_DEFAULT_MIP == LEMON_CPLEX_ 27 #elif LEMON_HAVE_CPLEX 29 28 #include <lemon/cplex.h> 30 #endif 31 #if LEMON_DEFAULT_LP == LEMON_SOPLEX_ 29 #elif LEMON_HAVE_SOPLEX 32 30 #include <lemon/soplex.h> 33 #endif 34 #if LEMON_DEFAULT_LP == LEMON_CLP_ 31 #elif LEMON_HAVE_CLP 35 32 #include <lemon/clp.h> 36 #endif37 #if LEMON_DEFAULT_MIP == LEMON_CBC_38 #include <lemon/cbc.h>39 33 #endif 40 34 … … 50 44 ///\ingroup lp_group 51 45 /// 52 ///Currently, the possible values are \c LEMON_GLPK_, \c LEMON_CPLEX_,53 ///\c LEMON_SOPLEX_ or \c LEMON_CLP_46 ///Currently, the possible values are \c GLPK, \c CPLEX, 47 ///\c SOPLEX or \c CLP 54 48 #define LEMON_DEFAULT_LP SOLVER 55 49 ///The default LP solver … … 66 60 ///\ingroup lp_group 67 61 /// 68 ///Currently, the possible values are \c LEMON_GLPK_, \c LEMON_CPLEX_ 69 ///or \c LEMON_CBC_ 62 ///Currently, the possible values are \c GLPK, \c CPLEX or \c CBC 70 63 #define LEMON_DEFAULT_MIP SOLVER 71 64 ///The default MIP solver. … … 77 70 typedef GlpkMip Mip; 78 71 #else 79 #if LEMON_DEFAULT_LP == LEMON_GLPK_72 #if LEMON_DEFAULT_LP == GLPK 80 73 typedef GlpkLp Lp; 81 #elif LEMON_DEFAULT_LP == LEMON_CPLEX_74 #elif LEMON_DEFAULT_LP == CPLEX 82 75 typedef CplexLp Lp; 83 #elif LEMON_DEFAULT_LP == LEMON_SOPLEX_76 #elif LEMON_DEFAULT_LP == SOPLEX 84 77 typedef SoplexLp Lp; 85 #elif LEMON_DEFAULT_LP == LEMON_CLP_78 #elif LEMON_DEFAULT_LP == CLP 86 79 typedef ClpLp Lp; 87 80 #endif 88 #if LEMON_DEFAULT_MIP == LEMON_GLPK_89 typedef Glpk Mip Mip;90 #elif LEMON_DEFAULT_MIP == LEMON_CPLEX_81 #if LEMON_DEFAULT_MIP == GLPK 82 typedef GlpkLp Mip; 83 #elif LEMON_DEFAULT_MIP == CPLEX 91 84 typedef CplexMip Mip; 92 #elif LEMON_DEFAULT_MIP == LEMON_CBC_85 #elif LEMON_DEFAULT_MIP == CBC 93 86 typedef CbcMip Mip; 94 87 #endif -
lemon/math.h
r1112 r1092 68 68 ///Round a value to its closest integer 69 69 inline double round(double r) { 70 return (r > 0.0) ? std::floor(r + 0.5) : std::ceil(r - 0.5);70 return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); 71 71 } 72 72 -
lemon/max_cardinality_search.h
r1093 r1092 165 165 /// 166 166 /// This function instantiates a \ref CardinalityMap. 167 /// \param digraph is the digraph, to which we would like to 168 /// define the \refCardinalityMap167 /// \param digraph is the digraph, to which we would like to define the \ref 168 /// CardinalityMap 169 169 static CardinalityMap *createCardinalityMap(const Digraph &digraph) { 170 170 return new CardinalityMap(digraph); … … 181 181 /// Search algorithm. The maximum cardinality search first chooses any 182 182 /// node of the digraph. Then every time it chooses one unprocessed node 183 /// with maximum cardinality, i.e the sum of capacities on out arcs 184 /// to the nodes 183 /// with maximum cardinality, i.e the sum of capacities on out arcs to the nodes 185 184 /// which were previusly processed. 186 185 /// If there is a cut in the digraph the algorithm should choose -
lemon/nearest_neighbor_tsp.h
r1101 r1092 116 116 for (IncEdgeIt e(_gr, n1); e != INVALID; ++e) { 117 117 if (!used[_gr.runningNode(e)] && 118 ( min_edge1 == INVALID || _cost[e] < _cost[min_edge1])) {118 (_cost[e] < _cost[min_edge1] || min_edge1 == INVALID)) { 119 119 min_edge1 = e; 120 120 } … … 125 125 for (IncEdgeIt e(_gr, n2); e != INVALID; ++e) { 126 126 if (!used[_gr.runningNode(e)] && 127 ( min_edge2 == INVALID||_cost[e] < _cost[min_edge2])) {127 (_cost[e] < _cost[min_edge2] || min_edge2 == INVALID)) { 128 128 min_edge2 = e; 129 129 } -
lemon/network_simplex.h
r1118 r1092 199 199 200 200 // Parameters of the problem 201 bool _ha s_lower;201 bool _have_lower; 202 202 SupplyType _stype; 203 203 Value _sum_supply; … … 683 683 template <typename LowerMap> 684 684 NetworkSimplex& lowerMap(const LowerMap& map) { 685 _ha s_lower = true;685 _have_lower = true; 686 686 for (ArcIt a(_graph); a != INVALID; ++a) { 687 687 _lower[_arc_id[a]] = map[a]; … … 880 880 _cost[i] = 1; 881 881 } 882 _ha s_lower = false;882 _have_lower = false; 883 883 _stype = GEQ; 884 884 return *this; … … 937 937 _node_id[n] = i; 938 938 } 939 if (_arc_mixing && _node_num > 1) {939 if (_arc_mixing) { 940 940 // Store the arcs in a mixed order 941 941 const int skip = std::max(_arc_num / _node_num, 3); … … 1073 1073 1074 1074 // Remove non-zero lower bounds 1075 if (_ha s_lower) {1075 if (_have_lower) { 1076 1076 for (int i = 0; i != _arc_num; ++i) { 1077 1077 Value c = _lower[i]; … … 1236 1236 } 1237 1237 1238 // Check if the upper bound is greater thanor equal to the lower bound1238 // Check if the upper bound is greater or equal to the lower bound 1239 1239 // on each arc. 1240 1240 bool checkBoundMaps() { … … 1613 1613 1614 1614 // Transform the solution and the supply map to the original form 1615 if (_ha s_lower) {1615 if (_have_lower) { 1616 1616 for (int i = 0; i != _arc_num; ++i) { 1617 1617 Value c = _lower[i]; -
lemon/radix_sort.h
r1124 r1092 329 329 Allocator allocator; 330 330 331 int length = st atic_cast<int>(std::distance(first, last));331 int length = std::distance(first, last); 332 332 Key* buffer = allocator.allocate(2 * length); 333 333 try { -
lemon/random.h
r1134 r584 63 63 #define LEMON_RANDOM_H 64 64 65 #include <lemon/config.h>66 67 65 #include <algorithm> 68 66 #include <iterator> … … 74 72 #include <lemon/dim2.h> 75 73 76 #ifndef LEMON_WIN3274 #ifndef WIN32 77 75 #include <sys/time.h> 78 76 #include <ctime> … … 202 200 initState(init); 203 201 204 num = static_cast<int>(length > end - begin ? length : end - begin);202 num = length > end - begin ? length : end - begin; 205 203 while (num--) { 206 204 curr[0] = (curr[0] ^ ((curr[1] ^ (curr[1] >> (bits - 2))) * mul1)) … … 216 214 } 217 215 218 num = length - 1; cnt = static_cast<int>(length - (curr - state) - 1);216 num = length - 1; cnt = length - (curr - state) - 1; 219 217 while (num--) { 220 218 curr[0] = (curr[0] ^ ((curr[1] ^ (curr[1] >> (bits - 2))) * mul2)) … … 608 606 /// \return Currently always \c true. 609 607 bool seed() { 610 #ifndef LEMON_WIN32608 #ifndef WIN32 611 609 if (seedFromFile("/dev/urandom", 0)) return true; 612 610 #endif … … 628 626 /// \param offset The offset, from the file read. 629 627 /// \return \c true when the seeding successes. 630 #ifndef LEMON_WIN32628 #ifndef WIN32 631 629 bool seedFromFile(const std::string& file = "/dev/urandom", int offset = 0) 632 630 #else … … 650 648 /// \return Currently always \c true. 651 649 bool seedFromTime() { 652 #ifndef LEMON_WIN32650 #ifndef WIN32 653 651 timeval tv; 654 652 gettimeofday(&tv, 0); -
lemon/static_graph.h
r1124 r877 204 204 205 205 node_num = n; 206 arc_num = st atic_cast<int>(std::distance(first, last));206 arc_num = std::distance(first, last); 207 207 208 208 node_first_out = new int[node_num + 1]; -
lemon/time_measure.h
r1134 r1092 24 24 ///\brief Tools for measuring cpu usage 25 25 26 #include <lemon/config.h> 27 28 #ifdef LEMON_WIN32 26 #ifdef WIN32 29 27 #include <lemon/bits/windows.h> 30 28 #else … … 105 103 void stamp() 106 104 { 107 #ifndef LEMON_WIN32105 #ifndef WIN32 108 106 timeval tv; 109 107 gettimeofday(&tv, 0); -
test/arc_look_up_test.cc
r1113 r1092 25 25 using namespace lemon; 26 26 27 const int lgfn = 4; 27 28 const std::string lgf = 28 29 "@nodes\n" -
test/bpgraph_test.cc
r1100 r1092 79 79 e2 = G.addEdge(bn1, rn1), 80 80 e3 = G.addEdge(rn1, bn2); 81 ::lemon::ignore_unused_variable_warning(e2,e3);82 81 83 82 checkGraphNodeList(G, 3); … … 121 120 e1 = G.addEdge(n1, n2), e2 = G.addEdge(n1, n3), 122 121 e3 = G.addEdge(n4, n2), e4 = G.addEdge(n4, n3); 123 ::lemon::ignore_unused_variable_warning(e1,e3,e4);124 122 125 123 // Check edge deletion … … 170 168 e1 = G.addEdge(n1, n2), e2 = G.addEdge(n1, n3), 171 169 e3 = G.addEdge(n4, n2), e4 = G.addEdge(n4, n3); 172 ::lemon::ignore_unused_variable_warning(e1,e3,e4);173 170 174 171 G.changeRed(e2, n4); … … 223 220 e1 = G.addEdge(n1, n2), 224 221 e2 = G.addEdge(n1, n3); 225 ::lemon::ignore_unused_variable_warning(e1,e2);226 222 227 223 checkGraphNodeList(G, 3); … … 309 305 e1 = g.addEdge(n1, n2), 310 306 e2 = g.addEdge(n1, n3); 311 ::lemon::ignore_unused_variable_warning(e2);312 307 313 308 check(g.valid(n1), "Wrong validity check"); -
test/lp_test.cc
r1105 r1092 40 40 #endif 41 41 42 #ifdef LEMON_HAVE_LP43 #include <lemon/lp.h>44 #endif45 42 using namespace lemon; 46 43 … … 420 417 lpTest(lp_skel); 421 418 422 #ifdef LEMON_HAVE_LP423 {424 Lp lp,lp2;425 lpTest(lp);426 aTest(lp2);427 cloneTest<Lp>();428 }429 #endif430 431 419 #ifdef LEMON_HAVE_GLPK 432 420 { -
test/min_cost_flow_test.cc
r1118 r1092 396 396 checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s, 397 397 mcf3.OPTIMAL, true, -300, test_str + "-18", GEQ); 398 399 // Tests for empty graph400 Digraph gr0;401 MCF mcf0(gr0);402 mcf0.run(param);403 check(mcf0.totalCost() == 0, "Wrong total cost");404 398 } 405 399 -
test/mip_test.cc
r1105 r748 31 31 #ifdef LEMON_HAVE_CBC 32 32 #include <lemon/cbc.h> 33 #endif34 35 #ifdef LEMON_HAVE_MIP36 #include <lemon/lp.h>37 33 #endif 38 34 … … 133 129 { 134 130 135 #ifdef LEMON_HAVE_MIP136 {137 Mip mip1;138 aTest(mip1);139 cloneTest<Mip>();140 }141 #endif142 143 131 #ifdef LEMON_HAVE_GLPK 144 132 { -
test/radix_sort_test.cc
r1135 r1092 16 16 * 17 17 */ 18 19 #include <lemon/core.h>20 18 21 19 #include <lemon/time_measure.h> -
test/tsp_test.cc
r1106 r1092 67 67 68 68 int node_cnt = 0; 69 for (typename Container::const_iterator it = p.begin(); it != p.end(); ++it) 70 { 71 FullGraph::Node node = *it; 72 if (used[node]) return false; 73 used[node] = true; 74 ++node_cnt; 75 } 69 for (typename Container::const_iterator it = p.begin(); it != p.end(); ++it) { 70 FullGraph::Node node = *it; 71 if (used[node]) return false; 72 used[node] = true; 73 ++node_cnt; 74 } 76 75 77 76 return (node_cnt == gr.nodeNum()); … … 133 132 int esize = n <= 1 ? 0 : n; 134 133 135 ConstMap<Edge, int> cost_map(1); 136 TSP alg(g, cost_map); 134 TSP alg(g, constMap<Edge, int>(1)); 137 135 138 136 check(alg.run() == esize, alg_name + ": Wrong total cost"); … … 267 265 tspTestSmall<GreedyTsp<ConstMap<Edge, int> > >("Greedy"); 268 266 tspTestSmall<NearestInsertionTsp<ConstMap<Edge, int> > >("Nearest Insertion"); 269 tspTestSmall<FarthestInsertionTsp<ConstMap<Edge, int> > > 270 ("Farthest Insertion"); 271 tspTestSmall<CheapestInsertionTsp<ConstMap<Edge, int> > > 272 ("Cheapest Insertion"); 267 tspTestSmall<FarthestInsertionTsp<ConstMap<Edge, int> > >("Farthest Insertion"); 268 tspTestSmall<CheapestInsertionTsp<ConstMap<Edge, int> > >("Cheapest Insertion"); 273 269 tspTestSmall<RandomInsertionTsp<ConstMap<Edge, int> > >("Random Insertion"); 274 270 tspTestSmall<ChristofidesTsp<ConstMap<Edge, int> > >("Christofides"); -
tools/dimacs-solver.cc
r1093 r1092 128 128 if (report) { 129 129 std::cerr << "Run NetworkSimplex: " << ti << "\n\n"; 130 std::cerr << "Feasible flow: " << (res == MCF::OPTIMAL ? "found" : 131 "not found") << '\n'; 130 std::cerr << "Feasible flow: " << (res == MCF::OPTIMAL ? "found" : "not found") << '\n'; 132 131 if (res) std::cerr << "Min flow cost: " 133 132 << ns.template totalCost<LargeValue>() << '\n'; -
tools/lgf-gen.cc
r1109 r654 247 247 struct BeachIt; 248 248 249 typedef std::multimap<double, BeachIt *> SpikeHeap;249 typedef std::multimap<double, BeachIt> SpikeHeap; 250 250 251 251 typedef std::multimap<Part, SpikeHeap::iterator, YLess> Beach; … … 330 330 331 331 if (bit->second != spikeheap.end()) { 332 delete bit->second->second;333 332 spikeheap.erase(bit->second); 334 333 } … … 344 343 circle_form(points[prev], points[curr], points[site])) { 345 344 double x = circle_point(points[prev], points[curr], points[site]); 346 pit = spikeheap.insert(std::make_pair(x, newBeachIt(beach.end())));347 pit->second ->it =345 pit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end()))); 346 pit->second.it = 348 347 beach.insert(std::make_pair(Part(prev, curr, site), pit)); 349 348 } else { … … 357 356 circle_form(points[site], points[curr],points[next])) { 358 357 double x = circle_point(points[site], points[curr], points[next]); 359 nit = spikeheap.insert(std::make_pair(x, newBeachIt(beach.end())));360 nit->second ->it =358 nit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end()))); 359 nit->second.it = 361 360 beach.insert(std::make_pair(Part(site, curr, next), nit)); 362 361 } else { … … 368 367 sweep = spit->first; 369 368 370 Beach::iterator bit = spit->second ->it;369 Beach::iterator bit = spit->second.it; 371 370 372 371 int prev = bit->first.prev; … … 401 400 int nnt = nbit->first.next; 402 401 403 if (bit->second != spikeheap.end()) 404 { 405 delete bit->second->second; 406 spikeheap.erase(bit->second); 407 } 408 if (pbit->second != spikeheap.end()) 409 { 410 delete pbit->second->second; 411 spikeheap.erase(pbit->second); 412 } 413 if (nbit->second != spikeheap.end()) 414 { 415 delete nbit->second->second; 416 spikeheap.erase(nbit->second); 417 } 418 402 if (bit->second != spikeheap.end()) spikeheap.erase(bit->second); 403 if (pbit->second != spikeheap.end()) spikeheap.erase(pbit->second); 404 if (nbit->second != spikeheap.end()) spikeheap.erase(nbit->second); 405 419 406 beach.erase(nbit); 420 407 beach.erase(bit); … … 426 413 double x = circle_point(points[ppv], points[prev], points[next]); 427 414 if (x < sweep) x = sweep; 428 pit = spikeheap.insert(std::make_pair(x, newBeachIt(beach.end())));429 pit->second ->it =415 pit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end()))); 416 pit->second.it = 430 417 beach.insert(std::make_pair(Part(ppv, prev, next), pit)); 431 418 } else { … … 438 425 double x = circle_point(points[prev], points[next], points[nnt]); 439 426 if (x < sweep) x = sweep; 440 nit = spikeheap.insert(std::make_pair(x, newBeachIt(beach.end())));441 nit->second ->it =427 nit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end()))); 428 nit->second.it = 442 429 beach.insert(std::make_pair(Part(prev, next, nnt), nit)); 443 430 } else {
Note: See TracChangeset
for help on using the changeset viewer.