[ABACUS-tickets] [A Branch-And-CUt System] #1: Abacus - Wishlist from M. Chimani - University of Dortmund
A Branch-And-CUt System
coin-trac at coin-or.org
Thu Jul 31 05:20:06 EDT 2008
#1: Abacus - Wishlist from M. Chimani - University of Dortmund
---------------------------+------------------------------------------------
Reporter: mark.sprenger | Owner: mark.sprenger
Type: enhancement | Status: new
Priority: major | Milestone: milestone1
Component: component1 | Version: 1.0
Keywords: wishlist |
---------------------------+------------------------------------------------
ABACUS - Flaws and Wishes
----
Die Zahlen (X/Y) in Klammern vor den Eintraegen gegeben die Wichtigkeit
und die
Geschaetzte Schwierigkeit an:
X=[1,..,5]; 1="unbedingt noetig" bis 5="waere schoen/sinnvoll"
Y=[1,..,5]; 1="einfach und schnell machbar" bis 5="aufwaendig"
(1/?) Windows/VisualC++ 7.x/8.x/9.x Support:
Es ist wichtig, dass Abacus auch unter Windows mit Visual C++
kompiliert (dabei gibt es erfahrungsgemaess keine echten
Unterscheide
zwische Version 7 und 8), da OGDF Linux&Windows unterstützt.
Update: Carsten hat es mit ein paar änderungen wohl irgendwie ans
Laufen gebracht. Details dazu weiss im Moment nur er ;-)
(1/1) GCC Makefiles:
Erfahrungsgemaess ist -O3 bei GCC leider hoffnungslos. Sogar die
eigenen
Webseiten beschreiben es als "experimental" - und tatsaechlich
entstehen
dadurch in Abacus Bugs. Sogar bei "-O2" haben wir bei
komplizierteren
OGDF Algorithmen probleme, so dass wir nur -O1 einschalten.
(1/1) & (4/4) Exit & Exceptions:
Abacus beendet sich bei jedem Fehler einfach mit exit. Das ist
natürlich
unschön, wenn Abacus als Teil einer anderen Bibliothek läuft, und
das
ganze programm beendet. Daher brauchen wir wohl oder übel
Exception
Handling notwendig (siehe auch schon im CWeb vorhandener alter
Original-
Kommentar)
1) (1/1) Einfache erste Version: statt mit "exit" einfach mit
"throw"
rausspringen. Am einfachsten in abacusroot::exit() das eigentliche
exit auf throw aendern.
2) (4/4) Komplexere (spaetere?) Variante: Variante 1 ist unsauber,
da
der ganze Abacus-Speicher dann nicht freigegeben! - Darum muessten
sich
die Destruktoren der Abacus-Objekte am Stack kuemmern. Ich glaube
nicht
das sie das im Moment sauber tun, nachdem da froehliche
Warnmeldungen
kommen...
(BUG/1) compress & expand (in ABA_CONVAR, convar.h) [A]:
Die eigentlich privat gemeinten Funktionen _compress, _expand sind
public. Besonders dringlich ist vorallem auch, dass die
*virtuellen*
Funktionen deletable(), expand() und compress() *private* sind.
Diese dienen eigentlich dazu, dass diese Funktionalitaeten
implementiert
werden koennen (in dem man sie in seinen abgeleiteten Klassen
ueberschreibt).
(2/1) compress & expand (in ABA_CONVAR) [B]:
verursachen zeitweise bei Pricing überflüssige Warnungsmeldungen
(die
dank automatischem flush auf cerr Laufzeit verbraten). Die
Warnungsmeldungen kann man gefahrlos einfach streichen, da sie
falsch
sind (Abacus ruft faelschlicherweise compress auf komprimierten
Objekten auf, etc.) -- zumal diese Funktionen derzeit ohnehin nie
benutzt werden konnten wegen oberhalb beschriebenem Bug.
(2/2) Namespace:
Es wäre sauberer, wenn Abacus einfach einen eigenen Namespace
"abacus"
definieren würde, statt alle Klassen mit ABA_ starten zu
lassen. (Als Abacus entwickelt wurde, hat das wohl noch nicht auf
allen
Compilern funktioniert). Darueber hinaus wär es homogener mit
allen
anderen "modernen" Bibliotheken, wenn die Klassen nicht in All-
Caps
bezeichnet wären. Also statt ABA_MASTER einfach abacus::Master,
etc.
(2/5) Const Correctness:
war noch kein grosses Thema als Abacus damals zum ersten Mal
geschrieben
wurde. Inzwischen kennt man die Vorteile und quasi alle modernen
Bibliotheken halten sich daran (mehr oder weniger). So auch OGDF.
Das Problem ist, dass nicht const-corr Bibliotheken (wie Abacus)
infektioes sind, bzw. "unconst"-casts. Das zerstoert dadurch auch
die
const-corr. unseres OGDF und zwingt uns zu unschoenem unsauberen
Code.
(3/1) Timeout funktioniert nicht richtig:
Timeout bricht im Moment nur "hin und wieder" ab, naemlich nur
wenn
separate und pricing ohne etwas zu tun durchlaufen (zB beim
Selektieren
eines neuen Subproblems). Wenn er aber lange _innerhalb_ eines
Subproblems arbeitet, nicht. Das fürht zB dazu dass ein Job mit
30min
Beschraenkung auch mal ueber 800 Minuten läuft.
Dies passiert weil in der while Schleife der Check zwar drin
steht,
aber vorher auch gerne immer mal wieder 'continue' aufgerufen
wird...
=> der Zeitcheck muss also VOR dem solveLP Aufruf passieren, statt
am
Ende der Schleife
(3/1) CpuTime-Limit-Setting:
ist derzeit durch einen String gegeben. Sowas hätten wir gerne mit
einem
einfachen Aufruf der Art "set(int hour, int min, int sec)" gelöst.
Der String ist einfach ineffizient und kompliziert, weil man
selber
immer integer zahlen in formatierte Strings umrechnen muss, und
Abacus
intern dann auch wieder den String umwandelt...
(3/2) Speicher-Limit erreicht:
Wenn CPLEX der Speicher ausgeht (zB bei CPXdualopt) wird derzeit
nicht
"normal" abgebrochen und das vorhandene Status-Flag gesetzt,
sondern
"exit" aufgerufen... -> siehe auch "Exit&Exceptions"
(5/1) Make-settings:
Es wird nur gcc3.3, 3.4, 4.1 unterstuetzt. Im Make-settings
Unterverzeichnis gibt es aber noch settings füg uralte egcs, gcc,
etc.
(1/1) Preprocessor Flag ABAUCS_COMPILER_GCC, ABACUS_COMPILER_GCCxx:
alle Versionsnummern verhalten sich gleich. Wozu?
Das Flag ohne Versionsnummer funktioniert derzeit uebrigens nicht
richtig, da dafuer ABACUS_NEW_TEMPLATE_SYNTAX nicht gesetzt
wird...
(1/1) Preprocessor Flag ABACUS_SYS_SOLARIS, ABACUS_SYS_LINUX:
Es gibt nur diese beiden Systeme, und die werden nie
unterschieden...
Apropos: man kann das System und den Compiler (inkl. Version)
direkt
durch vom Compiler vordefinierte Preprocessor-Flags abfragen.
"Eigene"
Flags dafür sind nicht (mehr) nötig, und führen im Zweifelsfall
nur zu
falschen Settings.
(4/2) Preprocessor Flag ABACUS_NO_FOR_SCOPE:
Diese Dinge machen den Code leider sehr hässlich und
fehleranfaellig.
Einfacher und klarer ist es zB nach dem Muster:
int i;
for(i=0; i<..;++i) {}
for(i=0; i<..;++i) {}
for(i=0; i<..;++i) {}
Das funktioniert mit jedem Compiler.
(5/1) Preprocessor Flag ABACUS_PARALLEL:
Ist das im Code noch wichtig, und funktioniert es richtig?
(Vielleicht
weiss Christoph oder Frauke das?). Auch vor dem Hintergrund:
wenn's
wiedereinmal jemand angreift, muss derjenige das ggf. ohnehin
komplett
neu machen?
(5/1) Preprocessor Flag SUN-CC:
ist der Cun-CC notwendig und getestet? Den benutzt ja
niemand mehr, oder? Der Code wuerde uebersichtlicher werden
ohne...
Insbesondere koennte man sich ABACUS_NEW_TEMPLATE_SYNTAX dann ggf.
sparen. (offiziell wird der Compiler eh nicht mehr supportet.)
(5/1) Preprocessor Flag ABACUS_NO_BOOL:
wird nur benutzt um den Typ ABACUS_BOOL zu definieren.
Der wird dann nie verwendet.
(5/1) Preprocessor Flag ABACUS_OLD_NEW:
wird nur an 2 Stellen benutzt... und eine der beiden Varianten
(die mit dem typedef) funktioniert immer. Flag schreichen und nur
die
eine Codevariante wäre übersichtlicher?
--
Ticket URL: <https://projects.coin-or.org/ABACUS/ticket/1>
A Branch-And-CUt System <https://projects.coin-or.org/ABACUS>
ABACUS - A Branch-And-CUt System
More information about the ABACUS-tickets
mailing list