source: trunk/CoinMP/src/CoinProblem.c @ 361

Last change on this file since 361 was 361, checked in by bjarni, 10 years ago

Move coinComputeIntVariables to CoinProblem?

File size: 7.1 KB
Line 
1
2/*  CoinProblem.c  */
3
4
5#include <stdlib.h>
6#include <string.h>
7
8#include "CoinProblem.h"
9
10
11PPROBLEM coinCreateProblemObject()
12{
13        PPROBLEM pProblem;
14
15        pProblem = (PPROBLEM)malloc(sizeof(PROBLEMINFO));
16        memset(pProblem, 0, sizeof(PROBLEMINFO));
17
18        pProblem->ColCount    = 0;
19        pProblem->RowCount    = 0;
20        pProblem->NZCount     = 0;
21        pProblem->RangeCount  = 0;
22        pProblem->ObjectSense = 0;
23        pProblem->ObjectConst = 0.0;
24
25        pProblem->lenColNamesBuf   = 0;
26        pProblem->lenRowNamesBuf   = 0;
27        pProblem->lenObjNameBuf = 0;
28
29        pProblem->ObjectCoeffs = NULL;
30        pProblem->RHSValues    = NULL;
31        pProblem->RangeValues  = NULL;
32        pProblem->RowType      = NULL;
33        pProblem->MatrixBegin  = NULL;
34        pProblem->MatrixCount  = NULL;
35        pProblem->MatrixIndex  = NULL; 
36        pProblem->MatrixValues = NULL;
37        pProblem->LowerBounds  = NULL;
38        pProblem->UpperBounds  = NULL;
39        pProblem->ColNamesBuf  = NULL;
40        pProblem->RowNamesBuf  = NULL;
41        pProblem->ColNamesList = NULL;
42        pProblem->RowNamesList = NULL;
43        pProblem->ObjectName   = NULL;
44
45        pProblem->InitValues   = NULL;
46
47        pProblem->RowLower     = NULL;
48        pProblem->RowUpper     = NULL;
49
50        pProblem->ColType      = NULL;
51
52        pProblem->SolveAsMIP   = 0;
53        pProblem->IntCount     = 0;
54        pProblem->BinCount     = 0;
55        pProblem->numInts      = 0;
56        pProblem->IsInt        = NULL;
57
58        pProblem->PriorCount   = 0;
59        pProblem->PriorIndex   = NULL;
60        pProblem->PriorValues  = NULL;
61        pProblem->PriorBranch  = NULL;
62
63        pProblem->SosCount     = 0;
64        pProblem->SosNZCount   = 0;
65        pProblem->SosType      = NULL;
66        pProblem->SosPrior     = NULL;
67        pProblem->SosBegin     = NULL;
68        pProblem->SosIndex     = NULL;
69        pProblem->SosRef       = NULL;
70
71        pProblem->SemiCount    = 0;
72        pProblem->SemiIndex    = NULL;
73        pProblem->SemiIndex        = NULL;
74
75        return pProblem;
76}
77
78
79
80void coinSetProblemName(PPROBLEM pProblem, const char *ProblemName)
81{
82        size_t len;
83
84        len = strlen(ProblemName);
85        if (len >= sizeof(pProblem->ProblemName)) {
86                len = sizeof(pProblem->ProblemName) - 1;
87        }
88        strncpy(pProblem->ProblemName, ProblemName, len);
89        pProblem->ProblemName[len] = '\0';
90}
91
92
93void coinClearProblemObject(PPROBLEM pProblem)
94{
95        if (!pProblem) {
96                return;
97        }
98        if (pProblem->ObjectCoeffs) free(pProblem->ObjectCoeffs);
99        if (pProblem->RHSValues)    free(pProblem->RHSValues);
100        if (pProblem->RangeValues)  free(pProblem->RangeValues);
101        if (pProblem->RowType)      free(pProblem->RowType);
102        if (pProblem->MatrixBegin)  free(pProblem->MatrixBegin);
103        if (pProblem->MatrixCount)  free(pProblem->MatrixCount);
104        if (pProblem->MatrixIndex)  free(pProblem->MatrixIndex); 
105        if (pProblem->MatrixValues) free(pProblem->MatrixValues);
106        if (pProblem->LowerBounds)  free(pProblem->LowerBounds);
107        if (pProblem->UpperBounds)  free(pProblem->UpperBounds);
108
109        if (pProblem->ColNamesBuf)  free(pProblem->ColNamesBuf);
110        if (pProblem->RowNamesBuf)  free(pProblem->RowNamesBuf);
111        if (pProblem->ColNamesList) free(pProblem->ColNamesList);
112        if (pProblem->RowNamesList) free(pProblem->RowNamesList);
113        if (pProblem->ObjectName)   free(pProblem->ObjectName);
114
115        if (pProblem->InitValues)   free(pProblem->InitValues);
116
117        if (pProblem->RowLower)         free(pProblem->RowLower);
118        if (pProblem->RowUpper)         free(pProblem->RowUpper);
119
120        if (pProblem->ColType)      free(pProblem->ColType);
121
122        if (pProblem->PriorIndex)   free(pProblem->PriorIndex);
123        if (pProblem->PriorValues)  free(pProblem->PriorValues);
124        if (pProblem->PriorBranch)  free(pProblem->PriorBranch);
125
126        if (pProblem->SemiIndex)        free(pProblem->SemiIndex);
127
128        if (pProblem->SosType)          free(pProblem->SosType);
129        if (pProblem->SosPrior)         free(pProblem->SosPrior);
130        if (pProblem->SosBegin)         free(pProblem->SosBegin);
131        if (pProblem->SosIndex)         free(pProblem->SosIndex);
132        if (pProblem->SosRef)           free(pProblem->SosRef);
133
134        free(pProblem);
135}
136
137
138int coinComputeRowLowerUpper(PPROBLEM pProblem, double CoinDblMax)
139{
140        int i;
141        double RangeABS, RangeValue;
142
143        if (!pProblem->RowLower || !pProblem->RowUpper) {
144                return 0;
145        }
146        if (!pProblem->RowType) {
147                /* if NO RowType, we treat RHSValues as RowLower and RangeValues as RowUpper */
148                for (i = 0; i < pProblem->RowCount; i++) {
149                        pProblem->RowLower[i] = pProblem->RHSValues ? pProblem->RHSValues[i] : -CoinDblMax;
150                        pProblem->RowUpper[i] = pProblem->RangeValues ? pProblem->RangeValues[i] : CoinDblMax;
151                }
152                return 1;
153        }
154        for (i = 0; i < pProblem->RowCount; i++ ){
155                switch (pProblem->RowType[i]) {
156                        case 'L':
157                                pProblem->RowLower[i] = -CoinDblMax;
158                                pProblem->RowUpper[i] = pProblem->RHSValues ? pProblem->RHSValues[i] : CoinDblMax;
159                                break;
160
161                        case 'G':
162                                pProblem->RowLower[i] = pProblem->RHSValues ? pProblem->RHSValues[i] : -CoinDblMax;
163                                pProblem->RowUpper[i] = CoinDblMax;
164                                break;
165
166                        case 'E':
167                                pProblem->RowLower[i] = pProblem->RHSValues ? pProblem->RHSValues[i] : 0.0;
168                                pProblem->RowUpper[i] = pProblem->RHSValues ? pProblem->RHSValues[i] : 0.0;
169                                break;
170
171                        case 'R':
172                                RangeValue = pProblem->RangeValues ? pProblem->RangeValues[i] : 0.0;
173                                RangeABS = (RangeValue >= 0.0) ? RangeValue : -RangeValue;
174                                pProblem->RowLower[i] = (pProblem->RHSValues ? pProblem->RHSValues[i] : -CoinDblMax) - RangeABS;
175                                pProblem->RowUpper[i] = pProblem->RHSValues ? pProblem->RHSValues[i] : CoinDblMax;
176                                break;
177
178                        case 'N':
179                                pProblem->RowLower[i] = -CoinDblMax;
180                                pProblem->RowUpper[i] = CoinDblMax;
181                                break;
182
183                        default:
184                                return 0;
185                }
186        }
187        return 1;
188}
189
190
191int coinComputeIntVariables(PPROBLEM pProblem)
192{
193        int i;
194
195        pProblem->IsInt = (char* )malloc(pProblem->ColCount * sizeof(char));
196        if (!pProblem->IsInt) {
197                return 0;
198        }
199        for (i = 0; i < pProblem->ColCount; i++ ) {
200                switch (pProblem->ColType[i]) {
201                        case 'B':
202                                pProblem->BinCount++;
203                                pProblem->IsInt[i] = 1;
204                                break;
205
206                        case 'I':
207                                pProblem->IntCount++;
208                                pProblem->IsInt[i] = 1;
209                                break;
210
211                        default:
212                                pProblem->IsInt[i] = 0;
213                                break;
214                }
215        }
216        pProblem->numInts = pProblem->IntCount + pProblem->BinCount;
217        return pProblem->numInts;
218}
219
220
221int coinGetLenNameBuf(const char* NameBuf, int Count)
222{
223        int i, len;
224        int lenBuf;
225        const char* pName;
226
227        lenBuf = 0;
228        pName = &NameBuf[0];
229        for (i = 0; i < Count; i++) {
230                len = (int)strlen(pName) + 1;
231                lenBuf += len;
232                pName = pName + len;
233        }
234        return lenBuf;
235}
236
237
238int coinGetLenNameListBuf(char** NameList, int Count)
239{
240        int i, len;
241        int lenBuf;
242
243        lenBuf = 0;
244        for (i = 0; i < Count; i++) {
245                len = (int)strlen(NameList[i]) + 1;
246                lenBuf += len;
247        }
248        return lenBuf;
249}
250
251
252int coinCopyNamesList(char** NamesList, char* NamesBuf, char** argNamesList, int Count)
253{
254        int i,k,len;
255
256        if (!NamesList || !argNamesList || !NamesBuf || (Count == 0)) {
257                return 0;
258        }
259        k = 0;
260        for (i = 0; i < Count; i++) {
261                NamesList[i] = &NamesBuf[k];
262                strcpy(NamesList[i], argNamesList[i]);
263                len = (int)strlen(NamesList[i]) + 1;
264                k += len;
265        }
266        return 1;
267}
268
269
270int coinSetupNamesList(char** NamesList, char* NamesBuf, int Count)
271{
272        int i,k,len;
273
274        if (!NamesList || !NamesBuf || (Count == 0)) {
275                return 0;
276        }
277        k = 0;
278        for (i = 0; i < Count; i++) {
279                NamesList[i] = &NamesBuf[k];
280                len = (int)strlen(NamesList[i]) + 1;
281                k += len;
282        }
283        return 1;
284}
285
Note: See TracBrowser for help on using the repository browser.