CSsharp Example:
using System; using Maximal.OptiMax; namespace Efrontier { class MplEFrontier { private OptiMax _mpl; private Model _model; private Solver _solver; private string _resultString; private double _targetReturn; private double _riskVariance; private int _solCount; public MplEFrontier() { _mpl = null; _model = null; _solver = null; _resultString = ""; _targetReturn = 0.0; _riskVariance = 0.0; _solCount = 0; } private ResultType loadModelWithData(Model model, double targetReturn, string[] monthNames, string[] stockNames, double[] stockPrices) { const double minInvest = 0.0; const double maxInvest = 1.0; const int minStock = 5; const int maxStock = 10; try { IndexSet idxStock = model.IndexSets.Add("stock", stockNames); model.IndexSets.AddAlias("stock2", idxStock); model.IndexSets.Add("month", monthNames); model.IndexSets.Add("period[month]", "month - (First(month))"); model.DataConstants.Add("MinInvest", minInvest); model.DataConstants.Add("MaxInvest", maxInvest); model.DataConstants.Add("MinStocks", minStock); model.DataConstants.Add("MaxStocks", maxStock); model.DataConstants.Add("TargetReturn", targetReturn); model.DataVectors.Add("Price[stock,month]", stockPrices); model.ReadFilePart("Portfolio.mpl", "DATA_RETURN_MARKER"); } catch (Exception ex) { Console.WriteLine(ex.Message); } return model.LastResult; } public bool LoadModel(double targetReturn, string[] monthNames, string[] stockNames, double[] stockPrices) { _mpl = new OptiMax(); _model = _mpl.Models.Add("EFrontier"); _mpl.Options["ModelStats"].Value = 0; _mpl.Options["StatusMessages"].Value = 0; _mpl.Options["ModelType"].ValueStr = "Quadratic"; _model.WorkingDirectory = _mpl.ModelDirectory; ResultType result = loadModelWithData(_model, targetReturn, monthNames, stockNames, stockPrices); if (result != ResultType.Success) { _resultString = _model.Error.ToString(); return false; } return true; } public bool SolveFirstModel(string solverName, double origTarget) { _solver = _mpl.Solvers.Add(solverName); if (_solver.Name == "CPLEX") { _solver.Options["BarrierIterLogInd"].Value = 0; _solver.Options["SimplexIterLogInd"].Value = 0; } return SolveModel(0, origTarget); } public bool SolveModel(int iter, double targetReturn) { const int CPLEX_OPTIMAL = 1; const int CPLEX_MIPOPTIMAL = 101; Constraint conMeetTarget = _model.PlainConstraints["MeetTarget"]; conMeetTarget.RHSValue = targetReturn; ResultType result = _model.Solve(_solver); if (result != ResultType.Success) { _resultString = _model.ResultString + "\n" + _model.Solution.ResultString; return false; } if ((_model.Solution.ResultCode != CPLEX_OPTIMAL) && (_model.Solution.ResultCode != CPLEX_MIPOPTIMAL)){ _resultString = iter.ToString() + ") FINISHED: " + _model.Solution.ResultString + " " + _model.Solution.ResultCode.ToString(); return false; } Macro macroVariance = _model.Macros["Variance"]; _riskVariance = macroVariance.Value; _solCount++; _resultString = iter.ToString() + ") " + "return = " + targetReturn.ToString() + "%, " + "risk = " + _riskVariance.ToString(); return true; } public string ResultString { get { return _resultString; } } public int SolutionCount { get { return _solCount; } } public double RiskVariance { get { return _riskVariance; } } public double TargetReturn { get { return _targetReturn; } } public string DataDir { get { if (_mpl == null) { return GetDataDir(); } return _mpl.ModelDirectory; } } public static string GetDataDir() { OptiMax tempMpl = new OptiMax(); string dataDir = tempMpl.ModelDirectory; tempMpl = null; return dataDir; } } }