2 people like it.
Like the snippet!
Mixed Integer Programming tuning tool for OPL Model (CPLEX)
This is a tool to run model in F# and to tune a MIP. We run sequentially a MIP using different parameters
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
|
// OplFs: OPL tools in FSharp
#light
namespace OplFs
open System
open ILOG.Concert
open ILOG.OPL
open ILOG.CPLEX
module MathProg =
let GenererModele fichierModele fichierDonnees =
let stopWatch = Diagnostics.Stopwatch.StartNew()
// 01. Loading OPL objects
printfn "\ta. Loading OPL object"
stopWatch.Restart()
OplFactory.DebugMode <-true
let factory = new OplFactory()
let errorHandler = factory.CreateOplErrorHandler(Console.Out)
let settings = factory.CreateOplSettings(errorHandler)
settings.DisplayPrecision <- 10
settings.setWithWarnings(false)
let modelSource = factory.CreateOplModelSource(fichierModele)
let modelDefinition = factory.CreateOplModelDefinition(modelSource, settings)
let cplex = factory.CreateCplex()
let model = factory.CreateOplModel(modelDefinition, cplex)
//let proj = factory.CreateOplProject(repertoireProjet)
//let x=proj.MakeRunConfiguration()
printfn "\t\tObjects load in %d millisec" (stopWatch.ElapsedMilliseconds/1000L)
// 02. Chargement des données
printfn "\tb. Loading data and pre-process"
stopWatch.Restart()
let dataSource = factory.CreateOplDataSource(fichierDonnees)
model.AddDataSource(dataSource)
let dataElement=model.MakeDataElements
printfn"\t\tData load in %d millisec" stopWatch.ElapsedMilliseconds
// Génération du modèle
stopWatch.Restart()
printfn "\tc. Generate model"
model.Generate()
printfn"\t\tModel load in %d millisec" stopWatch.ElapsedMilliseconds
model, dataElement, cplex
module Util =
type cplexParamCat =
|IntParam of int
|DoubleParam of float
|BooleanParam of bool
|StringParam of string
|LongParam of int64
type cplexParam = {
cplexParamName:string;
cplexParamValue:cplexParamCat}
type tuningTrial = cplexParam list
type tuningResult = {
cplexParamList: cplexParam list;
result:string;
cplexStatus:string;
elapsedTime:int64}
let setCplexIntParam (cplex : Cplex) cplexParamName cplexParamValue=
match cplexParamName with
| "AdvInd" -> cplex.SetParam(Cplex.IntParam.AdvInd, cplexParamValue)//General
| "ClockType" -> cplex.SetParam(Cplex.IntParam.ClockType, cplexParamValue)//General
| "MIPEmphasis" -> cplex.SetParam(Cplex.IntParam.MIPEmphasis, cplexParamValue)//Insistance
| "BndStrenInd" -> cplex.SetParam(Cplex.IntParam.BndStrenInd, cplexParamValue)//Pré-traitement
| "CoeRedInd" -> cplex.SetParam(Cplex.IntParam.CoeRedInd, cplexParamValue)//Pré-traitement
| "DepInd" -> cplex.SetParam(Cplex.IntParam.DepInd, cplexParamValue)//Pré-traitement
| "PreDual" -> cplex.SetParam(Cplex.IntParam.PreDual, cplexParamValue)//Pré-traitement
| "AggFill" -> cplex.SetParam(Cplex.IntParam.AggFill, cplexParamValue)//Pré-traitement
| "PrePass" -> cplex.SetParam(Cplex.IntParam.PrePass, cplexParamValue)//Pré-traitement
| "Reduce" -> cplex.SetParam(Cplex.IntParam.Reduce, cplexParamValue)//Pré-traitement
| "RelaxPreInd" -> cplex.SetParam(Cplex.IntParam.RelaxPreInd, cplexParamValue)//Pré-traitement
| "RepeatPresolve" -> cplex.SetParam(Cplex.IntParam.RepeatPresolve, cplexParamValue)//Pré-traitement
| "Symmetry" -> cplex.SetParam(Cplex.IntParam.Symmetry, cplexParamValue)//Pré-traitement
| "ScaInd" -> cplex.SetParam(Cplex.IntParam.ScaInd, cplexParamValue) //Lecture
| "MIPDisplay" -> cplex.SetParam(Cplex.IntParam.MIPDisplay, cplexParamValue)//MIP General
| "MIPOrdType" -> cplex.SetParam(Cplex.IntParam.MIPOrdType, cplexParamValue)//MIP General
| "BrDir" -> cplex.SetParam(Cplex.IntParam.BrDir, cplexParamValue)//MIP Stratégie
| "DiveType" -> cplex.SetParam(Cplex.IntParam.DiveType, cplexParamValue)//MIP Stratégie
| "FPHeur" -> cplex.SetParam(Cplex.IntParam.FPHeur, cplexParamValue)//MIP Stratégie
| "HeurFreq" -> cplex.SetParam(Cplex.IntParam.HeurFreq, cplexParamValue)//MIP Stratégie
| "MIPKappaStats" -> cplex.SetParam(Cplex.IntParam.MIPKappaStats, cplexParamValue)//MIP Stratégie
| "NodeSel" -> cplex.SetParam(Cplex.IntParam.NodeSel, cplexParamValue)
| "PreslvNd" -> cplex.SetParam(Cplex.IntParam.PreslvNd, cplexParamValue)
| "Probe" -> cplex.SetParam(Cplex.IntParam.Probe, cplexParamValue)
| "RINSHeur" -> cplex.SetParam(Cplex.IntParam.RINSHeur, cplexParamValue)
| "RootAlg" -> cplex.SetParam(Cplex.IntParam.RootAlg, cplexParamValue)
| "NodeAlg" -> cplex.SetParam(Cplex.IntParam.NodeAlg, cplexParamValue)
| "VarSel" -> cplex.SetParam(Cplex.IntParam.VarSel, cplexParamValue)
| "MIPSearch" -> cplex.SetParam(Cplex.IntParam.MIPSearch, cplexParamValue)
| "CutPass" -> cplex.SetParam(Cplex.IntParam.CutPass, cplexParamValue)//MIP Limites
| "Cliques" -> cplex.SetParam(Cplex.IntParam.Cliques, cplexParamValue)//Coupes
| "Covers" -> cplex.SetParam(Cplex.IntParam.Covers, cplexParamValue)//Coupes
| "DisjCuts" -> cplex.SetParam(Cplex.IntParam.DisjCuts, cplexParamValue)//Coupes
| "FlowCovers" -> cplex.SetParam(Cplex.IntParam.FlowCovers, cplexParamValue)//Coupes
| "FracCuts" -> cplex.SetParam(Cplex.IntParam.FracCuts, cplexParamValue)//Coupes
| "GUBCovers" -> cplex.SetParam(Cplex.IntParam.GUBCovers, cplexParamValue)//Coupes
| "ImplBd" -> cplex.SetParam(Cplex.IntParam.ImplBd, cplexParamValue)//Coupes
| "MIRCuts" -> cplex.SetParam(Cplex.IntParam.MIRCuts, cplexParamValue)//Coupes
| "MCFCuts" -> cplex.SetParam(Cplex.IntParam.MCFCuts, cplexParamValue)//Coupes
| "FlowPaths" -> cplex.SetParam(Cplex.IntParam.FlowPaths, cplexParamValue)//Coupes
| "ZeroHalfCuts" -> cplex.SetParam(Cplex.IntParam.ZeroHalfCuts, cplexParamValue)//Coupes
| "BarColNz" -> cplex.SetParam(Cplex.IntParam.BarColNz, cplexParamValue)//Barrière
| "BarAlg" -> cplex.SetParam(Cplex.IntParam.BarAlg, cplexParamValue)//Barrière
| "BarCrossAlg" -> cplex.SetParam(Cplex.IntParam.BarCrossAlg, cplexParamValue)
| "BarDisplay" -> cplex.SetParam(Cplex.IntParam.BarDisplay, cplexParamValue)
| "BarOrder" -> cplex.SetParam(Cplex.IntParam.BarOrder, cplexParamValue)
| "BarStartAlg" -> cplex.SetParam(Cplex.IntParam.BarStartAlg, cplexParamValue)
| _ -> printfn "Paramètre inexistant: %s" cplexParamName //Manquante: LocalImplied, solutiontype, BQP, LPMethode
//Fonctionne pas: AggFill
let setCplexDoubleParam (cplex : Cplex) cplexParamName cplexParamValue=
match cplexParamName with
| "TiLim" -> cplex.SetParam(Cplex.DoubleParam.TiLim, cplexParamValue)//Général
| "DetTiLim" -> cplex.SetParam(Cplex.DoubleParam.DetTiLim, cplexParamValue)//Général
| "EpGap" -> cplex.SetParam(Cplex.DoubleParam.EpGap, cplexParamValue)//MIP Tolérance
| "BarEpComp" -> cplex.SetParam(Cplex.DoubleParam.BarEpComp, cplexParamValue)//Barrière
| "BarQCPEpComp" -> cplex.SetParam(Cplex.DoubleParam.BarQCPEpComp, cplexParamValue)//Barrière
| "BarGrowth" -> cplex.SetParam(Cplex.DoubleParam.BarGrowth, cplexParamValue)//Barrière
| "BarObjRng" -> cplex.SetParam(Cplex.DoubleParam.BarObjRng, cplexParamValue)//Barrière
| _ -> printfn "Unavailable parameter: %s" cplexParamName
let setCplexBooleanParam (cplex : Cplex) cplexParamName cplexParamValue =
match cplexParamName with
| "NumericalEmphasis" -> cplex.SetParam(Cplex.BooleanParam.NumericalEmphasis, cplexParamValue)//Insistance
| "PreLinear" -> cplex.SetParam(Cplex.BooleanParam.PreLinear, cplexParamValue)//Pré-traitement
| "PreInd" -> cplex.SetParam(Cplex.BooleanParam.PreInd, cplexParamValue)//Pré-traitement
| "LBHeur" -> cplex.SetParam(Cplex.BooleanParam.LBHeur, cplexParamValue)//MIP Stratégie
| "MIPOrdInd" -> cplex.SetParam(Cplex.BooleanParam.MIPOrdInd, cplexParamValue)//MIP Stratégie
| _ -> printfn "Unavailable parameter: %s" cplexParamName
let setCplexStringParam (cplex : Cplex) cplexParamName cplexParamValue =
match cplexParamName with
| "WorkDir" -> cplex.SetParam(Cplex.StringParam.WorkDir, cplexParamValue)//Général
| _ -> printfn "Unavailable parameter: %s" cplexParamName
let setCplexLongParam (cplex : Cplex) cplexParamName cplexParamValue =
match cplexParamName with
| "CutPass" -> cplex.SetParam(Cplex.LongParam.CutPass, cplexParamValue)//MIP Limites
| "BarMaxCor" -> cplex.SetParam(Cplex.LongParam.BarMaxCor, cplexParamValue)//Barrière
| "BarItLim" -> cplex.SetParam(Cplex.LongParam.BarItLim, cplexParamValue)//Barrière
| _ -> printfn "Unavailable parameter: %s" cplexParamName
let setCplexParam (cplex : Cplex)(param :cplexParam) =
match param.cplexParamValue with
| IntParam prm -> setCplexIntParam cplex param.cplexParamName prm
| DoubleParam prm -> setCplexDoubleParam cplex param.cplexParamName prm
| BooleanParam prm -> setCplexBooleanParam cplex param.cplexParamName prm
| StringParam prm -> setCplexStringParam cplex param.cplexParamName prm
| LongParam prm -> setCplexLongParam cplex param.cplexParamName prm
let generateTuningList lstParamToTest=
let rec listCartesianProduct LL =
match LL with
| [] -> Seq.singleton []
| L::Ls -> seq {for x in L do for xs in listCartesianProduct Ls -> x::xs}
let tblLstPrm =
seq{for (paramName, paramValues) in lstParamToTest do
for paramValue in paramValues do
yield{cplexParamName=paramName; cplexParamValue=paramValue}
}|>Seq.groupBy (fun x -> x.cplexParamName)|>Seq.map (fun (a,b) -> b)|>Seq.toList
listCartesianProduct tblLstPrm|>Seq.toList
let tune (cplex : Cplex) (tuningList: tuningTrial list) :tuningResult list=
let setCplexParamInst = setCplexParam cplex
let stopWatch = Diagnostics.Stopwatch.StartNew()
let resultats=
seq{for trial in tuningList do
cplex.SetParam(Cplex.IntParam.AdvInd, 0)//Advanced start switch à off
//cplex.SetParam(Cplex.IntParam.ClockType, 1)//Temps déterministe
stopWatch.Restart()
trial|>Seq.iter setCplexParamInst
let resultat=
match cplex.Solve() with
| true -> "Success"
| false -> "Error"
yield{cplexParamList=trial;result=resultat;
cplexStatus=cplex.GetCplexStatus().ToString(); elapsedTime=stopWatch.ElapsedMilliseconds}
}
Seq.toList résultats
// Script to tune OPL Cplex model. Enter a list of all parameters possible value and the script will try all combinaison of parameters
(*#light
#if INTERACTIVE
#r "C:\Program Files\IBM\ILOG\CPLEX_Studio1263\opl\lib\oplall.dll"
#load "OplFs.fs"
#endif
open OplFs
open OplFs.Util
open OplFs.MathProg
open System
let stopWatch = Diagnostics.Stopwatch.StartNew()
let repertoireProjet = @"C:\YourProjectDirectory\"
let fichierModele = repertoireProjet + "Warehouse.mod"
let fichierDonnees = repertoireProjet + "Warehouse.dat"
let model, dataElement, cplex =GenererModele fichierModele fichierDonnees
//Parmètres CPLEX
//Liste de paramètres à tester
//Test de coupes
let lstParamToTest=
[("TiLim", [DoubleParam 140.0]);
("RootAlg", [IntParam 4]);
("BarAlg", [ IntParam 3]);
("BarStartAlg", [IntParam 4]);
("BarOrder", [IntParam 1;IntParam 2;IntParam 3]);
("BarCrossAlg", [IntParam 1]);
("BarColNz", [IntParam 229;IntParam 100;IntParam 300;IntParam 400]);
("EpGap", [DoubleParam 0.05]);
("NodeAlg", [IntParam 4]);
("HeurFreq",[IntParam 10]);
("CutPass", [IntParam -1]);
]
stopWatch.Restart()
printfn "\td. Tune"
let tuningList = generateTuningList lstParamToTest
let resultatTuning=tune cplex tuningList
for x in resultatTuning do
printfn "%d" x.elapsedTime*)
// Script to optimise a model
(*#light
#if INTERACTIVE
#r "C:\Program Files\IBM\ILOG\CPLEX_Studio1263\opl\lib\oplall.dll"
#load "OplFs.fs"
#endif
open OplFs
open OplFs.Util
open OplFs.MathProg
open System
let stopWatch = Diagnostics.Stopwatch.StartNew()
let repertoireProjet = @"C:\YourProjectDirectory\"
let fichierModele = repertoireProjet + "Warehouse.mod"
let fichierDonnees = repertoireProjet + "Warehouse.dat"
let model, dataElement, cplex =GenererModele fichierModele fichierDonnees
printfn "\td. Optimise"
stopWatch.Restart()
let resultatOptimisation=tune cplex [[{cplexParamName = "TiLim"; cplexParamValue = DoubleParam 140.0;};
{cplexParamName = "RootAlg"; cplexParamValue = IntParam 4;};
{cplexParamName = "BarAlg"; cplexParamValue = IntParam 3;};
{cplexParamName = "ScaInd"; cplexParamValue = IntParam 1;};
{cplexParamName ="BarColNz"; cplexParamValue = IntParam 1000;};
{cplexParamName = "BarStartAlg"; cplexParamValue = IntParam 4;};
{cplexParamName = "BarCrossAlg";cplexParamValue = IntParam 1;};
{cplexParamName = "EpGap";cplexParamValue = DoubleParam 0.05;};
{cplexParamName = "HeurFreq";cplexParamValue = IntParam 10;};
{cplexParamName = "MIPEmphasis";cplexParamValue = IntParam 1;};
{cplexParamName = "NodeAlg";cplexParamValue = IntParam 4;};
{cplexParamName = "Symmetry"; cplexParamValue=IntParam 0;};
{cplexParamName = "DiveType"; cplexParamValue=IntParam 1;};
{cplexParamName = "FlowCovers";cplexParamValue = IntParam 0;};
{cplexParamName = "FPHeur";cplexParamValue = IntParam 2;};
{cplexParamName = "FracCuts";cplexParamValue = IntParam 0;};
{cplexParamName = "GUBCovers";cplexParamValue = IntParam 0;};
{cplexParamName = "ImplBd";cplexParamValue = IntParam 0;};
{cplexParamName = "MIRCuts";cplexParamValue = IntParam 0;};
{cplexParamName = "MCFCuts";cplexParamValue = IntParam 2;};
{cplexParamName = "FlowPaths";cplexParamValue = IntParam 0;};
{cplexParamName = "ZeroHalfCuts";cplexParamValue = IntParam 0;}
]]
printfn"\t\tOptimisation en %d millisec" stopWatch.ElapsedMilliseconds
*)
|
namespace System
val GenererModele : fichierModele:'a -> fichierDonnees:'b -> 'c * 'd * 'e
Full name: OplFs.MathProg.GenererModele
val fichierModele : 'a
val fichierDonnees : 'b
val stopWatch : Diagnostics.Stopwatch
namespace System.Diagnostics
Multiple items
type Stopwatch =
new : unit -> Stopwatch
member Elapsed : TimeSpan
member ElapsedMilliseconds : int64
member ElapsedTicks : int64
member IsRunning : bool
member Reset : unit -> unit
member Restart : unit -> unit
member Start : unit -> unit
member Stop : unit -> unit
static val Frequency : int64
...
Full name: System.Diagnostics.Stopwatch
--------------------
Diagnostics.Stopwatch() : unit
Diagnostics.Stopwatch.StartNew() : Diagnostics.Stopwatch
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
Diagnostics.Stopwatch.Restart() : unit
val factory : obj
val errorHandler : obj
type Console =
static member BackgroundColor : ConsoleColor with get, set
static member Beep : unit -> unit + 1 overload
static member BufferHeight : int with get, set
static member BufferWidth : int with get, set
static member CapsLock : bool
static member Clear : unit -> unit
static member CursorLeft : int with get, set
static member CursorSize : int with get, set
static member CursorTop : int with get, set
static member CursorVisible : bool with get, set
...
Full name: System.Console
property Console.Out: IO.TextWriter
val settings : obj
val modelSource : obj
val modelDefinition : obj
val cplex : 'e
val model : 'c
property Diagnostics.Stopwatch.ElapsedMilliseconds: int64
val dataSource : obj
val dataElement : 'd
module Util
from OplFs
type cplexParamCat =
| IntParam of int
| DoubleParam of float
| BooleanParam of bool
| StringParam of string
| LongParam of int64
Full name: OplFs.Util.cplexParamCat
union case cplexParamCat.IntParam: int -> cplexParamCat
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
union case cplexParamCat.DoubleParam: float -> cplexParamCat
Multiple items
val float : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float = Double
Full name: Microsoft.FSharp.Core.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
union case cplexParamCat.BooleanParam: bool -> cplexParamCat
type bool = Boolean
Full name: Microsoft.FSharp.Core.bool
union case cplexParamCat.StringParam: string -> cplexParamCat
Multiple items
val string : value:'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = String
Full name: Microsoft.FSharp.Core.string
union case cplexParamCat.LongParam: int64 -> cplexParamCat
Multiple items
val int64 : value:'T -> int64 (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int64
--------------------
type int64 = Int64
Full name: Microsoft.FSharp.Core.int64
--------------------
type int64<'Measure> = int64
Full name: Microsoft.FSharp.Core.int64<_>
type cplexParam =
{cplexParamName: string;
cplexParamValue: cplexParamCat;}
Full name: OplFs.Util.cplexParam
cplexParam.cplexParamName: string
cplexParam.cplexParamValue: cplexParamCat
type tuningTrial = cplexParam list
Full name: OplFs.Util.tuningTrial
type 'T list = List<'T>
Full name: Microsoft.FSharp.Collections.list<_>
type tuningResult =
{cplexParamList: cplexParam list;
result: string;
cplexStatus: string;
elapsedTime: int64;}
Full name: OplFs.Util.tuningResult
tuningResult.cplexParamList: cplexParam list
tuningResult.result: string
tuningResult.cplexStatus: string
tuningResult.elapsedTime: int64
val setCplexIntParam : cplex:'a -> cplexParamName:string -> cplexParamValue:'b -> unit
Full name: OplFs.Util.setCplexIntParam
val cplex : 'a
val cplexParamName : string
val cplexParamValue : 'b
val setCplexDoubleParam : cplex:'a -> cplexParamName:string -> cplexParamValue:'b -> unit
Full name: OplFs.Util.setCplexDoubleParam
val setCplexBooleanParam : cplex:'a -> cplexParamName:string -> cplexParamValue:'b -> unit
Full name: OplFs.Util.setCplexBooleanParam
val setCplexStringParam : cplex:'a -> cplexParamName:string -> cplexParamValue:'b -> unit
Full name: OplFs.Util.setCplexStringParam
val setCplexLongParam : cplex:'a -> cplexParamName:string -> cplexParamValue:'b -> unit
Full name: OplFs.Util.setCplexLongParam
val setCplexParam : cplex:'a -> param:cplexParam -> unit
Full name: OplFs.Util.setCplexParam
val param : cplexParam
val prm : int
val prm : float
val prm : bool
val prm : string
val prm : int64
val generateTuningList : lstParamToTest:seq<string * #seq<cplexParamCat>> -> cplexParam list list
Full name: OplFs.Util.generateTuningList
val lstParamToTest : seq<string * #seq<cplexParamCat>>
val listCartesianProduct : (#seq<'c> list -> seq<'c list>)
val LL : #seq<'c> list
module Seq
from Microsoft.FSharp.Collections
val singleton : value:'T -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.singleton
val L : #seq<'c>
val Ls : #seq<'c> list
Multiple items
val seq : sequence:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Core.Operators.seq
--------------------
type seq<'T> = Collections.Generic.IEnumerable<'T>
Full name: Microsoft.FSharp.Collections.seq<_>
val x : 'c
val xs : 'c list
val tblLstPrm : seq<cplexParam> list
val paramName : string
val paramValues : #seq<cplexParamCat>
val paramValue : cplexParamCat
val groupBy : projection:('T -> 'Key) -> source:seq<'T> -> seq<'Key * seq<'T>> (requires equality)
Full name: Microsoft.FSharp.Collections.Seq.groupBy
val x : cplexParam
val map : mapping:('T -> 'U) -> source:seq<'T> -> seq<'U>
Full name: Microsoft.FSharp.Collections.Seq.map
val a : string
val b : seq<cplexParam>
val toList : source:seq<'T> -> 'T list
Full name: Microsoft.FSharp.Collections.Seq.toList
val tune : cplex:'a -> tuningList:tuningTrial list -> tuningResult list
Full name: OplFs.Util.tune
val tuningList : tuningTrial list
val setCplexParamInst : (cplexParam -> unit)
val resultats : seq<tuningResult>
val trial : tuningTrial
val iter : action:('T -> unit) -> source:seq<'T> -> unit
Full name: Microsoft.FSharp.Collections.Seq.iter
val resultat : string
More information