1 // globals.h 2 3 // In this file 4 // - some facilities as the g++ input/output routines are included, 5 // - the general data type can be chosen (the people of Singular do not like 6 // templates), 7 // - some makros are defined for an easier handling of the program, 8 // - some flags and constants can be set to observe the behaviour of the 9 // algorithms when using different strategies. 10 11 #ifndef GLOBALS_H 12 #define GLOBALS_H 13 // Include facilities needed by several files: 14 15 // the following is not good! TODO: move to all including sources... 16 17 #include "singularconfig.h" 18 19 20 #include <stdio.h> 21 #ifndef HAVE_IOSTREAM_H 22 #include <iostream> 23 #include <fstream> 24 #include <iomanip> 25 #include <limits> 26 #else 27 #include <iostream.h> 28 #include <fstream.h> 29 #include <iomanip.h> 30 #include <limits.h> 31 #endif 32 #include <stddef.h> 33 #include <stdlib.h> 34 #include <math.h> 35 #include <string.h> 36 37 using namespace std; 38 39 // Include a BigInt class from a foreign library: 40 // This is needed by the LLL algorithm. If no such class is included, 41 // it computes with long ints; this results in overflows and unexpected 42 // behaviour even when computing with relatively small instances. 43 44 #define GMP 45 46 #ifdef GMP 47 48 #include "BigInt.h" 49 50 #else // GMP 51 52 typedef long BigInt; 53 54 #endif // GMP 55 56 // Define the general data type: 57 // short seems to be sufficient for most practicable instances. 58 59 typedef short Integer; 60 // The general data type to deal with can be short, long or int... 61 62 //#define _SHORT_ 63 // For an overflow control for thE result of the LLL algorithm, we have to 64 // know the data type used. 65 66 67 68 // Define a BOOLEAN data type etc. for an easy-to-read code: 69 70 typedef char BOOLEAN; 71 #define TRUE 1 72 #define FALSE 0 73 74 #define MAXIMUM(a,b) (a>b? a:b) 75 76 #define INHOMOGENEOUS 0 77 #define HOMOGENEOUS 1 78 // For a more comfortable call of the term_ordering constructors. 79 80 81 82 83 // Enumerate the algorithms: 84 // The ideal constructor (builds an ideal from the input matrix) depends on 85 // the algorithm. The constants are defined to make constructor calls easier 86 // (you do not need to remember a number). 87 88 #define CONTI_TRAVERSO 1 89 #define POSITIVE_CONTI_TRAVERSO 2 90 #define POTTIER 3 91 #define HOSTEN_STURMFELS 4 92 #define DIBIASE_URBANKE 5 93 #define BIGATTI_LASCALA_ROBBIANO 6 94 95 96 97 98 // Enumerate the criteria to discard unnecessary S-pairs: 99 // The constants are defined to allow an easier call of Buchberger�s algorithm 100 // with different criteria. This algorithm takes as an argument a short int 101 // which represents the combination of criteria to be used (with a default 102 // combination if no argument is given). 103 // The method to compute the argument for a certain combination is simple: 104 // Simply add the constants that belong to criteria you want to use. As the 105 // constants are chosen to be different powers of 2, each short int (in the 106 // range of 0 to 31) gives a unique combination (cf. the read-write-execute 107 // rights for files in UNIX systems). 108 // EXAMPLE: 109 // If you want to call Buchberger�s algorithm with the criterion "relatively 110 // prime leading terms" and the second criterion for the ideal I, write: 111 // 112 // I.reduced_Groebner_basis_1(REL_PRIMENESS + SECOND_CRITERION); 113 // or 114 // I.reduced_Groebner_basis_1(17); 115 // 116 // The argument 0 means that no criteria are used, the argument 31 leads to 117 // the use of all criteria. 118 119 #define REL_PRIMENESS 1 120 #define M_CRITERION 2 121 #define F_CRITERION 4 122 #define B_CRITERION 8 123 #define SECOND_CRITERION 16 124 125 // The names of tehse criteria are chosen according to the criteria 126 // described in Gebauer/Moeller (except from the last). 127 // The first one (relatively prime leading terms) is a local criterion 128 // and the most effective. 129 // The last four criteria are global ones involving searches over the 130 // generator lists. But although the lcm-computations performed by these 131 // checks are not much cheaper than a reduction, most of the criteria seem to 132 // accelerate the computations. 133 // REL_PRIMENESS should always be used. 134 // The Gebauer/Moeller-criteria (M,F,B) seem to improve computation time in 135 // the general case; Buchberger's second criterion seems to improve it in 136 // more special cases (for example the transportation problem). They should 137 // be switched on and off according to these results, but never be enabled 138 // together; the overhead of too many criteria leads to a rather bad 139 // performance in all cases. 140 // The relatively primeness criterion is tested first because it 141 // is very easy to check. The order of the Gebauer/Moeller-criteria does not 142 // really affect computation. The relative order of the Gebauer/Moeller 143 // criteria and the second criterion (if they are enabled together) has almost 144 // the same effect as switching off the last criterion in this order. 145 // There is no possibility to change the order in which the criteria are 146 // tested without changing the program! 147 148 149 150 151 // Enumerate the term orderings that can be used to refine the weight: 152 // W_REV_LEX will give a term ordering in the classical sense if and only if 153 // all weights are positive. It has been implemented because several 154 // algorithms need a reverse lexicographical refinement. (Of course, these 155 // algorithms control if they have a positive grading.) 156 // A warning will be output when using W_REV_LEX in an insecure case. 157 158 #define W_LEX 4 159 #define W_REV_LEX 5 160 #define W_DEG_LEX 6 161 #define W_DEG_REV_LEX 7 162 163 164 165 // Enumerate the term ordering used for the block of elimination variables: 166 167 #define LEX 1 168 #define DEG_LEX 2 169 #define DEG_REV_LEX 3 170 171 ////////////////////////////////////////////////////////////////////////////// 172 /////////////// TEST PARAMETER SECTION //////////////////////////////// 173 ////////////////////////////////////////////////////////////////////////////// 174 175 // Set flags concerning the basic operations and the course of Buchberger's 176 // algorithm: 177 178 #define SUPPORT_DRIVEN_METHODS 179 // possibilities: 180 // SUPPORT_DRIVEN_METHODS 181 // NO_SUPPORT_DRIVEN_METHODS 182 183 // This flag allows to switch of and on the use of the support vectors in 184 // the binomial class; these are used to speed up tests for reducibility of 185 // binomials, relative primeness etc. 186 187 #define SUPPORT_DRIVEN_METHODS_EXTENDED 188 // possibilities: 189 // SUPPORT_DRIVEN_METHODS_EXTENDED 190 // NO_SUPPORT_DRIVEN_METHODS_EXTENDED 191 192 // This flag allows to switch of and on the extended use of the support 193 // information. This includes the splitting of the ideal generators into 194 // several lists according to their head support. This discards many 195 // unnecessary tests for divisibility etc. 196 // SUPPORT_DRIVEN_METHODS_EXTENDED should only be enabled when 197 // SUPPORT_DRIVEN_METHODS is set, too! The combination 198 // NO_SUPPORT_DRIVEN_METHODS and SUPPORT_DRIVEN_METHODS_EXTENDED is quite 199 // senseless and will only work if your compiler automatically initializes 200 // integers to zero. 201 202 const unsigned short List_Support_Variables=8; 203 204 // This is the number of variables considered to create and maintain the 205 // generator lists of an ideal if SUPPORT_DRIVEN_METHODS_EXTENDED is 206 // enabled. As there are 2^List_Support_Variables lists, this number 207 // should not be too big (to avoid the overhead of many empty lists). 208 // The best number may depend on the problem size and structure... 209 210 #define SUPPORT_VARIABLES_LAST 211 // possibilities: 212 // SUPPORT_VARIABLES_LAST 213 // SUPPORT_VARIABLES_FIRST 214 215 // This flag determines whether the first or the last variables are considered 216 // by the support methods. So this setting will only affect the computation if 217 // such methods are enabled. 218 // The reason for the introduction of this flag is the following: 219 // The Conti-Traverso algorithm for solving an integer program works in two 220 // phases: Given an artificial solution in auxiliary variables, these 221 // variables are first eliminated to get a feasible solution. The elimination 222 // variables are for technical reasons always the last. In a second phase, 223 // this solution is reduced to a minimal solution with respect to a given 224 // term ordering. 225 // If SUPPORT_VARIABLES_LAST is set, the first phase will probably take 226 // less time as if SUPPORT_VARIABLES_FIRST is set. If one is only interested 227 // in finding a feasible solution (not necessary minimal), 228 // SUPPORT_VARIABLES_LAST might be the better choice. 229 230 #endif // GLOBALS_H 231 232