1 | /* $Id: CbcMessage.cpp 1432 2010-02-07 19:33:53Z tkr $ */ |
---|
2 | // Copyright (C) 2002, International Business Machines |
---|
3 | // Corporation and others. All Rights Reserved. |
---|
4 | #if defined(_MSC_VER) |
---|
5 | // Turn off compiler warning about long names |
---|
6 | # pragma warning(disable:4786) |
---|
7 | #endif |
---|
8 | |
---|
9 | #include "CbcMessage.hpp" |
---|
10 | #include <cstring> |
---|
11 | |
---|
12 | typedef struct { |
---|
13 | CBC_Message internalNumber; |
---|
14 | int externalNumber; // or continuation |
---|
15 | char detail; |
---|
16 | const char * message; |
---|
17 | } Cbc_message; |
---|
18 | static Cbc_message us_english[] = { |
---|
19 | {CBC_END_GOOD, 1, 1, "Search completed - best objective %.16g, took %d iterations and %d nodes (%.2f seconds)"}, |
---|
20 | {CBC_MAXNODES, 3, 1, "Exiting on maximum nodes"}, |
---|
21 | {CBC_SOLUTION, 4, 1, "Integer solution of %g found after %d iterations and %d nodes (%.2f seconds)"}, |
---|
22 | {CBC_END, 5, 1, "Partial search - best objective %g (best possible %g), took %d iterations and %d nodes (%.2f seconds)"}, |
---|
23 | {CBC_INFEAS, 6, 1, "The LP relaxation is infeasible or too expensive"}, |
---|
24 | {CBC_STRONG, 7, 3, "Strong branching on %d (%d), down %g (%d) up %g (%d) value %g"}, |
---|
25 | {CBC_SOLINDIVIDUAL, 8, 2, "%d has value %g"}, |
---|
26 | {CBC_INTEGERINCREMENT, 9, 1, "Objective coefficients multiple of %g"}, |
---|
27 | {CBC_STATUS, 10, 1, "After %d nodes, %d on tree, %g best solution, best possible %g (%.2f seconds)"}, |
---|
28 | {CBC_GAP, 11, 1, "Exiting as integer gap of %g less than %g or %g%%"}, |
---|
29 | {CBC_ROUNDING, 12, 1, "Integer solution of %g found by %s after %d iterations and %d nodes (%.2f seconds)"}, |
---|
30 | {CBC_ROOT, 13, 1, "At root node, %d cuts changed objective from %g to %g in %d passes"}, |
---|
31 | {CBC_GENERATOR, 14, 1, "Cut generator %d (%s) - %d row cuts average %.1f elements, %d column cuts (%d active) %? in %.3f seconds - new frequency is %d"}, |
---|
32 | {CBC_BRANCH, 15, 2, "Node %d Obj %g Unsat %d depth %d"}, |
---|
33 | {CBC_STRONGSOL, 16, 1, "Integer solution of %g found by strong branching after %d iterations and %d nodes (%.2f seconds)"}, |
---|
34 | {CBC_VUB_PASS, 17, 1, "%d solved, %d variables fixed, %d tightened"}, |
---|
35 | {CBC_VUB_END, 18, 1, "After tightenVubs, %d variables fixed, %d tightened"}, |
---|
36 | {CBC_MAXSOLS, 19, 1, "Exiting on maximum solutions"}, |
---|
37 | {CBC_MAXTIME, 20, 1, "Exiting on maximum time"}, |
---|
38 | {CBC_NOTFEAS1, 21, 2, "On closer inspection node is infeasible"}, |
---|
39 | {CBC_NOTFEAS2, 22, 2, "On closer inspection objective value of %g above cutoff of %g"}, |
---|
40 | {CBC_NOTFEAS3, 23, 2, "Allowing solution, even though largest row infeasibility is %g"}, |
---|
41 | {CBC_TREE_SOL, 24, 1, "Integer solution of %g found by subtree after %d iterations and %d nodes (%.2f seconds)"}, |
---|
42 | {CBC_ITERATE_STRONG, 25, 3, "%d cleanup iterations before strong branching"}, |
---|
43 | {CBC_PRIORITY, 26, 1, "Setting priorities for objects %d to %d inclusive (out of %d)"}, |
---|
44 | {CBC_EVENT, 27, 1, "Exiting on user event"}, |
---|
45 | {CBC_START_SUB, 28, 1, "Starting sub-tree for %s - maximum nodes %d"}, |
---|
46 | {CBC_END_SUB, 29, 1, "Ending sub-tree for %s"}, |
---|
47 | {CBC_THREAD_STATS, 30, 1, "%s%? %d used %d times, waiting to start %g, %?%g cpu time,%? %g waiting for threads, %? %d locks, %g locked, %g waiting for locks"}, |
---|
48 | {CBC_CUTS_STATS, 31, 1, "%d added rows had average density of %g"}, |
---|
49 | {CBC_STRONG_STATS, 32, 1, "Strong branching done %d times (%d iterations), fathomed %d nodes and fixed %d variables"}, |
---|
50 | {CBC_SOLUTION2, 33, 1, "Integer solution of %g found (by alternate solver) after %d iterations and %d nodes (%.2f seconds)"}, |
---|
51 | {CBC_UNBOUNDED, 34, 1, "The LP relaxation is unbounded!"}, |
---|
52 | {CBC_OTHER_STATS, 35, 1, "Maximum depth %d, %g variables fixed on reduced cost"}, |
---|
53 | {CBC_HEURISTICS_OFF, 36, 1, "Heuristics switched off as %d branching objects are of wrong type"}, |
---|
54 | {CBC_STATUS2, 37, 1, "%d nodes, %d on tree, best %g - possible %g depth %d unsat %d its %d (%.2f seconds)"}, |
---|
55 | {CBC_FPUMP1, 38, 1, "%s"}, |
---|
56 | {CBC_FPUMP2, 39, 2, "%s"}, |
---|
57 | {CBC_STATUS3, 40, 1, "%d nodes (+%d), %d on tree, best %g - possible %g depth %d unsat %d its %d (+%d) (%.2f seconds)"}, |
---|
58 | {CBC_OTHER_STATS2, 41, 1, "Maximum depth %d, %g variables fixed on reduced cost (%d nodes in complete fathoming taking %d iterations)"}, |
---|
59 | {CBC_RELAXED1, 42, 1, "Possible objective of %.18g but variable %d is %g from integer value, integer tolerance %g"}, |
---|
60 | {CBC_RELAXED2, 43, 2, "Possible objective of %.18g but had to fudge solution with tolerance of %g - check scaling of problem?"}, |
---|
61 | {CBC_RESTART, 44, 1, "Reduced cost fixing - %d rows, %d columns - restarting search"}, |
---|
62 | {CBC_GENERAL, 45, 1, "%s"}, |
---|
63 | {CBC_ROOT_DETAIL, 46, 2, "Root node pass %d, %d rows, %d total tight cuts - objective %g"}, |
---|
64 | {CBC_CUTOFF_WARNING1, 47, 1, "Cutoff set to %g - equivalent to best solution of %g"}, |
---|
65 | {CBC_END_SOLUTION, 48, 2, "Final check on integer solution of %g found after %d iterations and %d nodes (%.2f seconds)"}, |
---|
66 | {CBC_NOINT, 3007, 1, "No integer variables - nothing to do"}, |
---|
67 | {CBC_WARNING_STRONG, 3008, 1, "Strong branching is fixing too many variables, too expensively!"}, |
---|
68 | {CBC_DUMMY_END, 999999, 0, ""} |
---|
69 | }; |
---|
70 | /* Constructor */ |
---|
71 | CbcMessage::CbcMessage(Language language) : |
---|
72 | CoinMessages(sizeof(us_english) / sizeof(Cbc_message)) |
---|
73 | { |
---|
74 | language_ = language; |
---|
75 | strcpy(source_, "Cbc"); |
---|
76 | class_ = 0; // branch and bound |
---|
77 | Cbc_message * message = us_english; |
---|
78 | |
---|
79 | while (message->internalNumber != CBC_DUMMY_END) { |
---|
80 | CoinOneMessage oneMessage(message->externalNumber, message->detail, |
---|
81 | message->message); |
---|
82 | addMessage(message->internalNumber, oneMessage); |
---|
83 | message ++; |
---|
84 | } |
---|
85 | // Put into compact form |
---|
86 | toCompact(); |
---|
87 | |
---|
88 | // now override any language ones |
---|
89 | |
---|
90 | //switch (language) { |
---|
91 | |
---|
92 | //default: |
---|
93 | message = NULL; |
---|
94 | // break; |
---|
95 | //} |
---|
96 | |
---|
97 | // replace if any found |
---|
98 | if (message) { |
---|
99 | while (message->internalNumber != CBC_DUMMY_END) { |
---|
100 | replaceMessage(message->internalNumber, message->message); |
---|
101 | message ++; |
---|
102 | } |
---|
103 | } |
---|
104 | } |
---|
105 | |
---|