summaryrefslogtreecommitdiffstats
path: root/sc/inc/SolverSettings.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/inc/SolverSettings.hxx')
-rw-r--r--sc/inc/SolverSettings.hxx209
1 files changed, 209 insertions, 0 deletions
diff --git a/sc/inc/SolverSettings.hxx b/sc/inc/SolverSettings.hxx
new file mode 100644
index 0000000000..ec1ef994a7
--- /dev/null
+++ b/sc/inc/SolverSettings.hxx
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#pragma once
+
+#include <memory>
+#include <utility>
+#include <variant>
+#include <rtl/ustring.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+class ScTable;
+class ScDocShell;
+
+namespace sc
+{
+// These values are MS compatible
+enum ObjectiveType
+{
+ OT_MAXIMIZE = 1,
+ OT_MINIMIZE = 2,
+ OT_VALUE = 3
+};
+
+enum SolverParameter
+{
+ SP_OBJ_CELL, // Objective cell
+ SP_OBJ_TYPE, // Objective type (max, min, value)
+ SP_OBJ_VAL, // Value (used when objective is of type "value")
+ SP_VAR_CELLS, // Variable cells
+ SP_CONSTR_COUNT, // Number of constraints (MSO only)
+ SP_LO_ENGINE, // Engine name used in LO
+ SP_MS_ENGINE, // Engine ID used in MSO
+ SP_INTEGER, // Assume all variables are integer (0: no, 1: yes)
+ SP_NON_NEGATIVE, // Assume non negativity (1: yes, 2: no)
+ SP_EPSILON_LEVEL, // Epsilon level
+ SP_LIMIT_BBDEPTH, // Branch and bound depth
+ SP_TIMEOUT, // Time limit to return a solution
+ SP_ALGORITHM // Algorithm used by the SwarmSolver (1, 2 or 3)
+};
+
+// Starts at 1 to maintain MS compatibility
+enum ConstraintOperator
+{
+ CO_LESS_EQUAL = 1,
+ CO_EQUAL = 2,
+ CO_GREATER_EQUAL = 3,
+ CO_INTEGER = 4,
+ CO_BINARY = 5
+};
+
+// Parts of a constraint
+enum ConstraintPart
+{
+ CP_LEFT_HAND_SIDE,
+ CP_OPERATOR,
+ CP_RIGHT_HAND_SIDE
+};
+
+// Stores the information of a single constraint (condition)
+struct ModelConstraint
+{
+ OUString aLeftStr;
+ ConstraintOperator nOperator;
+ OUString aRightStr;
+
+ ModelConstraint()
+ : nOperator(CO_LESS_EQUAL)
+ {
+ }
+ bool IsDefault() const
+ {
+ return aLeftStr.isEmpty() && aRightStr.isEmpty() && nOperator == CO_LESS_EQUAL;
+ }
+};
+
+/* Class SolverSettings
+ *
+ * This class is used to load/save and manipulate solver settings in a Calc tab.
+ *
+ * During initialization, (see Initialize() method) all settings stored in the tab are loaded onto
+ * the object. Settings that are not defined use default values.
+ *
+ * Read/Write methods are private and are used internally to load/write solver settings from
+ * named ranges associated with the sheet.
+ *
+ * Get/Set methods are public methods used to change object properties (they do not save data
+ * to the file).
+ *
+ * The method SaveSolverSettings() is used to create the named ranges containing the current
+ * property values into the file.
+ *
+ */
+
+class SolverSettings
+{
+private:
+ ScTable& m_rTable;
+ ScDocument& m_rDoc;
+ ScDocShell* m_pDocShell;
+
+ // Used to read/write the named ranges in the tab
+ ScRangeName* m_pRangeName;
+
+ OUString m_sObjCell;
+ ObjectiveType m_eObjType;
+ OUString m_sObjVal;
+ OUString m_sVariableCells;
+ OUString m_sLOEngineName;
+ OUString m_sMSEngineId;
+
+ // Solver engine options
+ OUString m_sInteger;
+ OUString m_sNonNegative;
+ OUString m_sEpsilonLevel;
+ OUString m_sLimitBBDepth;
+ OUString m_sTimeout;
+ OUString m_sAlgorithm;
+ css::uno::Sequence<css::beans::PropertyValue> m_aEngineOptions;
+
+ std::vector<ModelConstraint> m_aConstraints;
+
+ void Initialize();
+
+ // Used to create or read a single solver parameter based on its named range
+ bool ReadParamValue(SolverParameter eParam, OUString& rValue, bool bRemoveQuotes = false);
+ void WriteParamValue(SolverParameter eParam, OUString sValue, bool bQuoted = false);
+
+ // Creates or reads all constraints stored in named ranges
+ void ReadConstraints();
+ void WriteConstraints();
+
+ // Used to create or get a single constraint part
+ bool ReadConstraintPart(ConstraintPart ePart, tools::Long nIndex, OUString& rValue);
+ void WriteConstraintPart(ConstraintPart ePart, tools::Long nIndex, OUString sValue);
+
+ // Creates or reads all named ranges associated with solver engine options
+ void ReadEngine();
+ void WriteEngine();
+
+ void DeleteAllNamedRanges();
+
+ // Maps solver parameters to named ranges
+ std::map<SolverParameter, OUString> m_mNamedRanges
+ = { { SP_OBJ_CELL, "solver_opt" }, { SP_OBJ_TYPE, "solver_typ" },
+ { SP_OBJ_VAL, "solver_val" }, { SP_VAR_CELLS, "solver_adj" },
+ { SP_CONSTR_COUNT, "solver_num" }, { SP_LO_ENGINE, "solver_lo_eng" },
+ { SP_MS_ENGINE, "solver_eng" }, { SP_INTEGER, "solver_int" },
+ { SP_NON_NEGATIVE, "solver_neg" }, { SP_EPSILON_LEVEL, "solver_eps" },
+ { SP_LIMIT_BBDEPTH, "solver_bbd" }, { SP_TIMEOUT, "solver_tim" },
+ { SP_ALGORITHM, "solver_alg" } };
+
+ // Maps LO solver implementation names to MS engine codes
+ std::map<OUString, OUString> SolverNamesToExcelEngines = {
+ { "com.sun.star.comp.Calc.CoinMPSolver", "2" }, // Simplex LP
+ { "com.sun.star.comp.Calc.LpsolveSolver", "2" }, // Simplex LP
+ { "com.sun.star.comp.Calc.SwarmSolver", "1" } // GRG Nonlinear
+ };
+
+ // Maps MS solver engine codes to LO solver implementation names
+ std::map<OUString, OUString> SolverCodesToLOEngines = {
+ { "1", "com.sun.star.comp.Calc.SwarmSolver" }, // GRG Nonlinear
+ { "2", "com.sun.star.comp.Calc.CoinMPSolver" }, // Simplex LP
+ { "3", "com.sun.star.comp.Calc.SwarmSolver" } // Evolutionary
+ };
+
+ // Maps LO solver parameters to named ranges to be used
+ // NonNegative: for MS compatibility, use 1 for selected and 2 for not selected
+ typedef std::vector<std::variant<OUString, SolverParameter>> TParamInfo;
+ std::map<OUString, TParamInfo> SolverParamNames
+ = { { "Integer", { SP_INTEGER, "solver_int", "bool" } },
+ { "NonNegative", { SP_NON_NEGATIVE, "solver_neg", "bool" } },
+ { "EpsilonLevel", { SP_EPSILON_LEVEL, "solver_eps", "int" } },
+ { "LimitBBDepth", { SP_LIMIT_BBDEPTH, "solver_bbd", "bool" } },
+ { "Timeout", { SP_TIMEOUT, "solver_tim", "int" } },
+ { "Algorithm", { SP_ALGORITHM, "solver_alg", "int" } } };
+
+ // Stores the roots used for named ranges of constraint parts
+ // Items here must be in the same order as in ConstraintPart enum
+ std::vector<OUString> m_aConstraintParts{ "solver_lhs", "solver_rel", "solver_rhs" };
+
+public:
+ /* A SolverSettings object is linked to the ScTable where solver parameters
+ * are located and saved to */
+ SolverSettings(ScTable& pTable);
+
+ SC_DLLPUBLIC OUString GetParameter(SolverParameter eParam);
+ SC_DLLPUBLIC void SetParameter(SolverParameter eParam, OUString sValue);
+ SC_DLLPUBLIC ObjectiveType GetObjectiveType() { return m_eObjType; }
+ SC_DLLPUBLIC void SetObjectiveType(ObjectiveType eType);
+ SC_DLLPUBLIC void GetEngineOptions(css::uno::Sequence<css::beans::PropertyValue>& aOptions);
+ SC_DLLPUBLIC void SetEngineOptions(css::uno::Sequence<css::beans::PropertyValue>& aOptions);
+ SC_DLLPUBLIC std::vector<ModelConstraint> GetConstraints() { return m_aConstraints; }
+ SC_DLLPUBLIC void SetConstraints(std::vector<ModelConstraint> aConstraints);
+
+ SC_DLLPUBLIC void SaveSolverSettings();
+ SC_DLLPUBLIC void ResetToDefaults();
+};
+
+} // namespace sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */