source: releases/1.7.0/CoinMP/examples/csharp/Coinmp.cs @ 493

Last change on this file since 493 was 493, checked in by bjarni, 7 years ago

Fixing marshalling for returning strings in CSharp Coinmp.cs wrapper functions for release 1.7.0

File size: 17.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Runtime.InteropServices;
5
6namespace Coin.CoinMP
7{
8    public class CoinMP
9    {
10        public const int SOLV_CALL_SUCCESS = 0;
11        public const int SOLV_CALL_FAILED = -1;
12
13        public const int SOLV_METHOD_DEFAULT = 0;
14
15        public const int SOLV_METHOD_PRIMAL = 0x1;
16        public const int SOLV_METHOD_DUAL = 0x2;
17        public const int SOLV_METHOD_NETWORK = 0x4;
18        public const int SOLV_METHOD_BARRIER = 0x8;
19
20        public const int SOLV_METHOD_BENDERS = 0x100;
21        public const int SOLV_METHOD_DEQ = 0x200;
22        public const int SOLV_METHOD_EV = 0x400;
23
24
25        public const int SOLV_FEATURE_LP = 0x1;
26        public const int SOLV_FEATURE_QP = 0x2;
27        public const int SOLV_FEATURE_QCP = 0x4;
28        public const int SOLV_FEATURE_NLP = 0x8;
29
30        public const int SOLV_FEATURE_MIP = 0x10;
31        public const int SOLV_FEATURE_MIQP = 0x20;
32        public const int SOLV_FEATURE_MIQCP = 0x40;
33        public const int SOLV_FEATURE_MINLP = 0x80;
34
35        public const int SOLV_FEATURE_SP = 0x10000;
36
37        public const int SOLV_OBJSENS_MAX = -1;
38        public const int SOLV_OBJSENS_MIN = 1;
39
40
41        public const int SOLV_FILE_LOG = 0;
42        public const int SOLV_FILE_BASIS = 1;
43        public const int SOLV_FILE_MIPSTART = 2;
44        public const int SOLV_FILE_MPS = 3;
45        public const int SOLV_FILE_LP = 4;
46        public const int SOLV_FILE_BINARY = 5;
47        public const int SOLV_FILE_OUTPUT = 6;
48        public const int SOLV_FILE_BINOUT = 7;
49        public const int SOLV_FILE_IIS = 8;
50
51        public const int SOLV_CHECK_COLCOUNT = 1;
52        public const int SOLV_CHECK_ROWCOUNT = 2;
53        public const int SOLV_CHECK_RANGECOUNT = 3;
54        public const int SOLV_CHECK_OBJSENSE = 4;
55        public const int SOLV_CHECK_ROWTYPE = 5;
56        public const int SOLV_CHECK_MATBEGIN = 6;
57        public const int SOLV_CHECK_MATCOUNT = 7;
58        public const int SOLV_CHECK_MATBEGCNT = 8;
59        public const int SOLV_CHECK_MATBEGNZ = 9;
60        public const int SOLV_CHECK_MATINDEX = 10;
61        public const int SOLV_CHECK_MATINDEXROW = 11;
62        public const int SOLV_CHECK_BOUNDS = 12;
63        public const int SOLV_CHECK_COLTYPE = 13;
64        public const int SOLV_CHECK_COLNAMES = 14;
65        public const int SOLV_CHECK_COLNAMESLEN = 15;
66        public const int SOLV_CHECK_ROWNAMES = 16;
67        public const int SOLV_CHECK_ROWNAMSLEN = 17;
68
69
70        private static string GenerateNamesBuf(string[] namesList)
71        {
72            int i;
73            StringBuilder namesBuf = new StringBuilder();
74
75            if (namesList.GetLength(0) > 0)
76            {
77                namesBuf.Append(namesList[0] + "\0");
78                for (i = 1; i < namesList.GetLength(0); i++)
79                {
80                    namesBuf.Append(namesList[i] + "\0");
81                }
82            }
83            return namesBuf.ToString();
84        }
85
86        public delegate int MsgLogDelegate(string messageStr);
87
88        public delegate int IterDelegate(int    iterCount,
89                                         double objectValue,
90                                         int    isFeasible,
91                                         double infeasValue);
92
93        public delegate int MipNodeDelegate(int    iterCount,
94                                            int    mipNodeCount,
95                                            double bestBound,
96                                            double bestInteger,
97                                            int    isMipImproved);
98
99        [DllImport("coinmp.dll")] public static extern int CoinInitSolver(string licenseStr);
100        [DllImport("coinmp.dll")] public static extern int CoinFreeSolver();
101
102        [DllImport("coinmp.dll")] public static extern string CoinGetSolverName();
103        [DllImport("coinmp.dll")] public static extern int CoinGetSolverNameBuf(StringBuilder solverName, int buflen);
104
105        [DllImport("coinmp.dll", EntryPoint = "CoinGetVersionStr")] public static extern IntPtr CoinGetVersionStrIntPtr();
106        public static string CoinGetVersionStr() { return Marshal.PtrToStringAnsi(CoinGetVersionStrIntPtr()); }
107        [DllImport("coinmp.dll")] public static extern int CoinGetVersionStrBuf(StringBuilder versionStr, int buflen);
108        [DllImport("coinmp.dll")] public static extern double CoinGetVersion();
109
110        [DllImport("coinmp.dll")] public static extern int CoinGetFeatures();
111        [DllImport("coinmp.dll")] public static extern int CoinGetMethods();
112        [DllImport("coinmp.dll")] public static extern double CoinGetInfinity();
113
114        [DllImport("coinmp.dll")] public static extern IntPtr CoinCreateProblem(string problemName);
115
116        [DllImport("coinmp.dll")] public static extern int CoinLoadMatrix(IntPtr hProb, int colCount, int rowCount,
117                        int nzCount, int rangeCount, int objectSense, double objectConst, double[] objectCoeffs,
118                        double[] lowerBounds, double[] upperBounds, char[] rowType, double[] rhsValues,
119                        double[] rangeValues, int[] matrixBegin, int[] matrixCount, int[] matrixIndex,
120                        double[] matrixValues);
121
122        [DllImport("coinmp.dll")] public static extern int CoinLoadNamesBuf(IntPtr hProb, string colNamesBuf, 
123                        string rowNamesBuf, string objName);
124
125        public static int CoinLoadNames(IntPtr hProb, string[] colNames, string[] rowNames, string objName)
126        {
127            return CoinLoadNamesBuf(hProb, GenerateNamesBuf(colNames), GenerateNamesBuf(rowNames), objName);
128        }
129
130        [DllImport("coinmp.dll")] public static extern int CoinLoadProblemBuf(IntPtr hProb, int colCount, int rowCount,
131                        int nzCount, int rangeCount, int objectSense, double objectConst, double[] objectCoeffs,
132                        double[] lowerBounds, double[] upperBounds, char[] rowType, double[] rhsValues,
133                        double[] rangeValues, int[] matrixBegin, int[] matrixCount, int[] matrixIndex,
134                        double[] matrixValues, string colNamesBuf, string rowNamesBuf, string objName);
135
136        public static int CoinLoadProblem(IntPtr hProb, int colCount, int rowCount, int nzCount,
137                        int rangeCount, int objectSense, double objectConst, double[] objectCoeffs,
138                        double[] lowerBounds, double[] upperBounds, char[] rowType, double[] rhsValues,
139                        double[] rangeValues, int[] matrixBegin, int[] matrixCount, int[] matrixIndex,
140                        double[] matrixValues, string[] colNames, string[] rowNames, string objName)
141        {
142            return CoinLoadProblemBuf(hProb, colCount, rowCount, nzCount, rangeCount, objectSense, 
143                        objectConst, objectCoeffs, lowerBounds, upperBounds, rowType, rhsValues, 
144                        rangeValues, matrixBegin, matrixCount, matrixIndex, matrixValues,
145                        GenerateNamesBuf(colNames), GenerateNamesBuf(rowNames), objName);
146
147        }
148
149        // when there is no rowType argument, CoinLoadProblem switches to rowLower and rowUpper arguments
150        public static int CoinLoadProblem(IntPtr hProb, int colCount, int rowCount, int nzCount,
151                        int rangeCount, int objectSense, double objectConst, double[] objectCoeffs,
152                        double[] lowerBounds, double[] upperBounds, double[] rowLower, double[] rowUpper,
153                        int[] matrixBegin, int[] matrixCount, int[] matrixIndex, double[] matrixValues, 
154                        string[] colNames, string[] rowNames, string objName)
155        {
156            return CoinLoadProblemBuf(hProb, colCount, rowCount, nzCount, rangeCount, objectSense,
157                        objectConst, objectCoeffs, lowerBounds, upperBounds, null, rowLower,
158                        rowUpper, matrixBegin, matrixCount, matrixIndex, matrixValues,
159                        GenerateNamesBuf(colNames), GenerateNamesBuf(rowNames), objName);
160
161        }
162
163        [DllImport("coinmp.dll")] public static extern int CoinLoadInitValues(IntPtr hProb, double[] initValues);
164
165        [DllImport("coinmp.dll")] public static extern int CoinLoadInteger(IntPtr hProb, char[] columnType);
166
167
168        [DllImport("coinmp.dll")] public static extern int CoinLoadPriority(IntPtr hProb, int priorCount,
169                        int[] priorIndex, int[] priorValues, int[] PriorBranch);
170
171        [DllImport("coinmp.dll")] public static extern int CoinLoadSos(IntPtr hProb, int sosCount,
172                        int sosNZCount, int[] sosType, int[] sosPrior,
173                        int[] sosBegin, int[] sosIndex, double[] sosRef);
174
175        [DllImport("coinmp.dll")] public static extern int CoinLoadSemiCont(IntPtr hProb, int semiCount,
176                        int[] semiIndex);
177
178        [DllImport("coinmp.dll")] public static extern int CoinLoadQuadratic(IntPtr hProb, int[] quadBegin,
179                        int[] quadCount, int[] quadIndex, double[] quadValues);
180
181        [DllImport("coinmp.dll")] public static extern int CoinLoadNonlinear(IntPtr hProb, int nlpTreeCount,
182                        int nlpLineCount, int[] nlpBegin, int[] nlpOper,
183                        int[] nlpArg1, int[] nlpArg2, int[] nlpIndex1,
184                        int[] nlpIndex2, double[] nlpValue1, double[] nlpValue2);
185
186        [DllImport("coinmp.dll")] public static extern int CoinUnloadProblem(IntPtr hProb);
187
188        [DllImport("coinmp.dll")] public static extern int CoinCheckProblem(IntPtr hProb);
189
190        [DllImport("coinmp.dll", EntryPoint = "CoinGetProblemName")] public static extern IntPtr CoinGetProblemNameIntPtr(IntPtr hProb);
191        public static string CoinGetProblemName(IntPtr hProb) { return Marshal.PtrToStringAnsi(CoinGetProblemNameIntPtr(hProb)); }
192        [DllImport("coinmp.dll")] public static extern int CoinGetProblemNameBuf(IntPtr hProb, StringBuilder problemName, int buflen);
193
194        [DllImport("coinmp.dll")] public static extern int CoinGetColCount(IntPtr hProb);
195        [DllImport("coinmp.dll")] public static extern int CoinGetRowCount(IntPtr hProb);
196
197        [DllImport("coinmp.dll", EntryPoint = "CoinGetColName")] public static extern IntPtr CoinGetColNameIntPtr(IntPtr hProb, int col);
198        public static string CoinGetColName(IntPtr hProb, int col) { return Marshal.PtrToStringAnsi(CoinGetColNameIntPtr(hProb, col)); }
199        [DllImport("coinmp.dll")] public static extern int CoinGetColNameBuf(IntPtr hProb, int col, StringBuilder colName, int buflen);
200
201        [DllImport("coinmp.dll", EntryPoint = "CoinGetRowName")] public static extern IntPtr CoinGetRowNameIntPtr(IntPtr hProb, int row);
202        public static string CoinGetRowName(IntPtr hProb, int row) { return Marshal.PtrToStringAnsi(CoinGetRowNameIntPtr(hProb, row)); }
203        [DllImport("coinmp.dll")] public static extern int CoinGetRowNameBuf(IntPtr hProb, int row, StringBuilder rowName, int buflen);
204
205        [DllImport("coinmp.dll")] public static extern int CoinSetMsgLogCallback(IntPtr hProb, MsgLogDelegate msgLogDelegate);
206        [DllImport("coinmp.dll")] public static extern int CoinSetIterCallback(IntPtr hProb, IterDelegate iterDelegate);
207        [DllImport("coinmp.dll")] public static extern int CoinSetMipNodeCallback(IntPtr hProb, MipNodeDelegate mipNodeDelegate);
208
209        [DllImport("coinmp.dll")] public static extern int CoinOptimizeProblem(IntPtr hProb, int method);
210
211        public static int CoinOptimizeProblem(IntPtr hProb)
212        {
213            return CoinOptimizeProblem(hProb, SOLV_METHOD_DEFAULT);
214        }
215
216        [DllImport("coinmp.dll")] public static extern int CoinGetSolutionStatus(IntPtr hProb);
217
218        [DllImport("coinmp.dll", EntryPoint = "CoinGetSolutionText")] public static extern IntPtr CoinGetSolutionTextIntPtr(IntPtr hProb);
219        public static string CoinGetSolutionText(IntPtr hProb) { return Marshal.PtrToStringAnsi(CoinGetSolutionTextIntPtr(hProb)); }
220        [DllImport("coinmp.dll")] public static extern int CoinGetSolutionTextBuf(IntPtr hProb, StringBuilder solutionText, int buflen);
221
222        [DllImport("coinmp.dll")] public static extern double CoinGetObjectValue(IntPtr hProb);
223        [DllImport("coinmp.dll")] public static extern double CoinGetMipBestBound(IntPtr hProb);
224
225        [DllImport("coinmp.dll")] public static extern int CoinGetIterCount(IntPtr hProb);
226        [DllImport("coinmp.dll")] public static extern int CoinGetMipNodeCount(IntPtr hProb);
227
228        [DllImport("coinmp.dll")] public static extern int CoinGetSolutionValues(IntPtr hProb, [In, Out] double[] activity,
229                        [In, Out] double[] reducedCost, [In, Out] double[] slackValues, [In, Out] double[] shadowPrice);
230
231        [DllImport("coinmp.dll")] public static extern int CoinGetSolutionRanges(IntPtr hProb, [In, Out] double[] objLoRange,
232                        [In, Out] double[] objUpRange, [In, Out] double[] rhsLoRange, [In, Out] double[] rhsUpRange);
233
234        [DllImport("coinmp.dll")] public static extern int CoinGetSolutionBasis(IntPtr hProb, [In, Out] int[] colStatus,
235                        [In, Out] double[] rowStatus);
236
237        [DllImport("coinmp.dll")] public static extern int CoinReadFile(IntPtr hProb, int fileType, string readFilename);
238        [DllImport("coinmp.dll")] public static extern int CoinWriteFile(IntPtr hProb, int fileType, string writeFilename);
239
240
241        [DllImport("coinmp.dll")] public static extern int CoinOpenLogFile(IntPtr hProb, string logFilename);
242        [DllImport("coinmp.dll")] public static extern int CoinCloseLogFile(IntPtr hProb);
243
244
245        [DllImport("coinmp.dll")] public static extern int CoinGetOptionCount(IntPtr hProb);
246        [DllImport("coinmp.dll")] public static extern int CoinLocateOptionID(IntPtr hProb, int optionID);
247        [DllImport("coinmp.dll")] public static extern int CoinLocateOptionName(IntPtr hProb, string optionName);
248
249        [DllImport("coinmp.dll")] public static extern int CoinGetOptionID(IntPtr hProb, int optionNr);
250        [DllImport("coinmp.dll")] public static extern int CoinGetOptionInfo(IntPtr hProb, int optionNr, 
251                        [In, Out] int[] optionID, [In, Out] int[] groupType, [In, Out] int[] optionType);
252        [DllImport("coinmp.dll")] public static extern int CoinGetIntOptionMinMax(IntPtr hProb, int optionNr,
253                        [In, Out] int[] minValue, [In, Out] int[] maxValue);
254        [DllImport("coinmp.dll")] public static extern int CoinGetRealOptionMinMax(IntPtr hProb, int optionNr,
255                        [In, Out] double[] minValue, [In, Out] double[] maxValue);
256        [DllImport("coinmp.dll")] public static extern int CoinGetOptionNamesBuf(IntPtr hProb, int optionNr,
257                        StringBuilder optionName, StringBuilder shortName, int buflen);
258
259                                               
260        [DllImport("coinmp.dll")] public static extern int CoinGetOptionGroup(IntPtr hProb, int optionID);
261        [DllImport("coinmp.dll")] public static extern int CoinGetOptionType(IntPtr hProb, int optionID);
262
263        [DllImport("coinmp.dll")] public static extern int CoinGetIntOptionDefaultValue(IntPtr hProb, int optionID);
264        [DllImport("coinmp.dll")] public static extern int CoinGetIntOptionMinValue(IntPtr hProb, int optionID);
265        [DllImport("coinmp.dll")] public static extern int CoinGetIntOptionMaxValue(IntPtr hProb, int optionID);
266
267        [DllImport("coinmp.dll")] public static extern double CoinGetRealOptionDefaultValue(IntPtr hProb, int optionID);
268        [DllImport("coinmp.dll")] public static extern double CoinGetRealOptionMinValue(IntPtr hProb, int optionID);
269        [DllImport("coinmp.dll")] public static extern double CoinGetRealOptionMaxValue(IntPtr hProb, int optionID);
270
271
272        [DllImport("coinmp.dll", EntryPoint = "CoinGetOptionName")] public static extern IntPtr CoinGetOptionNameIntPtr(IntPtr hProb, int optionID);
273        public static string CoinGetOptionName(IntPtr hProb, int optionID) { return Marshal.PtrToStringAnsi(CoinGetOptionNameIntPtr(hProb, optionID)); }
274        [DllImport("coinmp.dll")] public static extern int CoinGetOptionNameBuf(IntPtr hProb, int optionID, StringBuilder optionName, int buflen);
275
276        [DllImport("coinmp.dll", EntryPoint = "CoinGetOptionShortName")] public static extern IntPtr CoinGetOptionShortNameIntPtr(IntPtr hProb, int optionID);
277        public static string CoinGetOptionShortName(IntPtr hProb, int optionID) { return Marshal.PtrToStringAnsi(CoinGetOptionShortNameIntPtr(hProb, optionID)); }
278        [DllImport("coinmp.dll")] public static extern int CoinGetOptionShortNameBuf(IntPtr hProb, int optionID, StringBuilder shortName, int buflen);
279
280        [DllImport("coinmp.dll")] public static extern int CoinGetOptionChanged(IntPtr hProb, int optionID);
281
282        [DllImport("coinmp.dll")] public static extern int CoinGetIntOption(IntPtr hProb, int optionID);
283        [DllImport("coinmp.dll")] public static extern int CoinSetIntOption(IntPtr hProb, int optionID, int intValue);
284
285        [DllImport("coinmp.dll")] public static extern int CoinGetRealOption(IntPtr hProb, int optionID);
286        [DllImport("coinmp.dll")] public static extern int CoinSetRealOption(IntPtr hProb, int optionID, double realValue);
287
288        [DllImport("coinmp.dll", EntryPoint = "CoinGetStringOption")] public static extern IntPtr CoinGetStringOptionIntPtr(IntPtr hProb, int optionID);
289        public static string CoinGetStringOption(IntPtr hProb, int optionID) { return Marshal.PtrToStringAnsi(CoinGetStringOptionIntPtr(hProb, optionID)); }
290        [DllImport("coinmp.dll")] public static extern int CoinGetStringOptionBuf(IntPtr hProb, int optionID, StringBuilder stringValue, int buflen);
291        [DllImport("coinmp.dll")] public static extern int CoinSetStringOption(IntPtr hProb, int optionID, string stringValue);
292    }
293}
Note: See TracBrowser for help on using the repository browser.