File indexing completed on 2024-04-28 11:20:34

0001 /*
0002     SPDX-FileCopyrightText: 2010 Miha Čančula <miha.cancula@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "octaveextensions.h"
0008 #include <KLocalizedString>
0009 #include <QDebug>
0010 
0011 #define OCTAVE_EXT_CDTOR(name) Octave##name##Extension::Octave##name##Extension(QObject* parent) : name##Extension(parent) {} \
0012                                      Octave##name##Extension::~Octave##name##Extension() {}
0013 
0014 
0015 const QList<QChar> octaveMatrixOperators = QList<QChar>() << QLatin1Char('*') << QLatin1Char('/') << QLatin1Char('^');
0016 const QString octavePrintFileCommand = QLatin1String("print('-depsc',strcat(tempname(tempdir,'c-ob-'),'.eps')); ");
0017 
0018 OCTAVE_EXT_CDTOR(History)
0019 
0020 QString OctaveHistoryExtension::lastResult()
0021 {
0022     return QLatin1String("ans");
0023 }
0024 
0025 OCTAVE_EXT_CDTOR(Script)
0026 
0027 QString OctaveScriptExtension::runExternalScript(const QString& path)
0028 {
0029     return QString::fromLatin1("source \"%1\"").arg(path);
0030 }
0031 
0032 QString OctaveScriptExtension::scriptFileFilter()
0033 {
0034     return i18n("Octave script file (*.m)");
0035 }
0036 
0037 QString OctaveScriptExtension::highlightingMode()
0038 {
0039     return QLatin1String("octave");
0040 }
0041 
0042 QString OctaveScriptExtension::commandSeparator()
0043 {
0044     return QLatin1String(";");
0045 }
0046 
0047 OCTAVE_EXT_CDTOR(Plot)
0048 
0049 QString OctavePlotExtension::plotFunction2d(const QString& function, const QString& variable, const QString& left, const QString& right)
0050 {
0051     return QString::fromLatin1("cantor_plot2d('%1','%2',%3,%4);")
0052             .arg(function)
0053             .arg(variable)
0054             .arg(left)
0055             .arg(right);
0056 }
0057 
0058 QString OctavePlotExtension::plotFunction3d(const QString& function, const VariableParameter& var1, const VariableParameter& var2)
0059 {
0060   return QString::fromLatin1("cantor_plot3d('%1','%2',%3,%4,'%5',%6,%7);")
0061           .arg(function)
0062           .arg(var1.first)
0063           .arg(var1.second.first)
0064           .arg(var1.second.second)
0065           .arg(var2.first)
0066           .arg(var2.second.first)
0067           .arg(var2.second.second);
0068 }
0069 
0070 
0071 OCTAVE_EXT_CDTOR(LinearAlgebra)
0072 
0073 QString OctaveLinearAlgebraExtension::charPoly(const QString& matrix)
0074 {
0075     return QString::fromLatin1("poly(%1)").arg(matrix);
0076 }
0077 
0078 QString OctaveLinearAlgebraExtension::createMatrix(const Cantor::LinearAlgebraExtension::Matrix& matrix)
0079 {
0080     QString command;
0081     command += QLatin1Char('[');
0082     foreach (const QStringList row, matrix)
0083     {
0084         foreach (const QString entry, row)
0085         {
0086             command += entry;
0087             command += QLatin1String(", ");
0088         }
0089         command.chop(2); // Removes the last comma
0090         command += QLatin1String("; ");
0091     }
0092     command.chop(2); // Removes the last semicolon
0093     command += QLatin1Char(']');
0094     return command;
0095 }
0096 
0097 QString OctaveLinearAlgebraExtension::createVector(const QStringList& entries, Cantor::LinearAlgebraExtension::VectorType type)
0098 {
0099     QString separator;
0100     if (type == ColumnVector)
0101     {
0102         separator = QLatin1String("; ");
0103     }
0104     else
0105     {
0106         separator = QLatin1String(", ");
0107     }
0108     QString command;
0109     command += QLatin1Char('[');
0110     foreach (const QString& entry, entries)
0111     {
0112         command += entry;
0113         command += separator;
0114     }
0115     command.chop(1);
0116     command += QLatin1Char(']');
0117     return command;
0118 }
0119 
0120 QString OctaveLinearAlgebraExtension::eigenValues(const QString& matrix)
0121 {
0122     return QString::fromLatin1("eig(%1)").arg(matrix);
0123 }
0124 
0125 QString OctaveLinearAlgebraExtension::eigenVectors(const QString& matrix)
0126 {
0127     return QString::fromLatin1("cantor_eigenvectors(%1)").arg(matrix);
0128 }
0129 
0130 QString OctaveLinearAlgebraExtension::identityMatrix(int size)
0131 {
0132     return QString::fromLatin1("eye(%1)").arg(size);
0133 }
0134 
0135 QString OctaveLinearAlgebraExtension::invertMatrix(const QString& matrix)
0136 {
0137     return QString::fromLatin1("inv(%1)").arg(matrix);
0138 }
0139 
0140 QString OctaveLinearAlgebraExtension::nullMatrix(int rows, int columns)
0141 {
0142     return QString::fromLatin1("zeros(%1,%2)").arg(rows).arg(columns);
0143 }
0144 
0145 QString OctaveLinearAlgebraExtension::nullVector(int size, Cantor::LinearAlgebraExtension::VectorType type)
0146 {
0147     QString command = QLatin1String("zeros(%1,%2)");
0148     switch (type)
0149     {
0150         case ColumnVector:
0151             return command.arg(size).arg(1);
0152         case RowVector:
0153             return command.arg(1).arg(size);
0154         default:
0155             return Cantor::LinearAlgebraExtension::nullVector(size, type);
0156     }
0157 }
0158 
0159 QString OctaveLinearAlgebraExtension::rank(const QString& matrix)
0160 {
0161     return QString::fromLatin1("rank(%1)").arg(matrix);
0162 }
0163 
0164 OCTAVE_EXT_CDTOR(VariableManagement)
0165 
0166 QString OctaveVariableManagementExtension::addVariable(const QString& name, const QString& value)
0167 {
0168     return setValue(name,value);
0169 }
0170 
0171 QString OctaveVariableManagementExtension::setValue(const QString& name, const QString& value)
0172 {
0173     return QString::fromLatin1("%1 = %2").arg(name).arg(value);
0174 }
0175 
0176 QString OctaveVariableManagementExtension::removeVariable(const QString& name)
0177 {
0178     return QString::fromLatin1("clear %1;").arg(name);
0179 }
0180 
0181 QString OctaveVariableManagementExtension::clearVariables()
0182 {
0183     return QLatin1String("clear;");
0184 }
0185 
0186 QString OctaveVariableManagementExtension::saveVariables(const QString& fileName)
0187 {
0188     return QString::fromLatin1("save %1;").arg(fileName);
0189 }
0190 
0191 QString OctaveVariableManagementExtension::loadVariables(const QString& fileName)
0192 {
0193     return QString::fromLatin1("load %1;").arg(fileName);
0194 }
0195 
0196 OCTAVE_EXT_CDTOR(Packaging)
0197 
0198 QString OctavePackagingExtension::importPackage(const QString& package)
0199 {
0200     return QString::fromLatin1("pkg load %1").arg(package);
0201 }