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

0001 /*
0002     SPDX-FileCopyrightText: 2011 Matteo Agostinelli <agostinelli@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "qalculateextensions.h"
0008 
0009 #include <libqalculate/Calculator.h>
0010 #include <libqalculate/ExpressionItem.h>
0011 #include <libqalculate/Variable.h>
0012 
0013 #include <QStringList>
0014 
0015 #define QALCULATE_EXT_CDTOR(name) Qalculate##name##Extension::Qalculate##name##Extension(QObject* parent) : name##Extension(parent) {} \
0016                                   Qalculate##name##Extension::~Qalculate##name##Extension() {}
0017 
0018 QALCULATE_EXT_CDTOR(History)
0019 QALCULATE_EXT_CDTOR(VariableManagement)
0020 QALCULATE_EXT_CDTOR(CAS)
0021 QALCULATE_EXT_CDTOR(Calculus)
0022 QALCULATE_EXT_CDTOR(LinearAlgebra)
0023 
0024 QString QalculateHistoryExtension::lastResult()
0025 {
0026     return QLatin1String("ans");
0027 }
0028 
0029 QString QalculateVariableManagementExtension::addVariable(const QString& name, const QString& value)
0030 {
0031     return setValue(name,value);
0032 }
0033 
0034 QString QalculateVariableManagementExtension::setValue(const QString& name, const QString& value)
0035 {
0036     return QString::fromLatin1("%1 := %2").arg(name).arg(value);
0037 }
0038 
0039 QString QalculateVariableManagementExtension::removeVariable(const QString& name)
0040 {
0041     Q_UNUSED(name)
0042     //CALCULATOR->getVariable(name.toStdString())->setActive(false);
0043     return QString();
0044 }
0045 
0046 QString QalculateVariableManagementExtension::clearVariables()
0047 {
0048     //CALCULATOR->resetVariables();
0049     return QString();
0050 }
0051 
0052 QString QalculateVariableManagementExtension::saveVariables(const QString& fileName)
0053 {
0054     QString escapedFileName = fileName;
0055     escapedFileName.replace(QLatin1Char(' '), QLatin1String("\\ "));
0056     return QString::fromLatin1("saveVariables %1").arg(escapedFileName);
0057 }
0058 
0059 QString QalculateVariableManagementExtension::loadVariables(const QString& fileName)
0060 {
0061     QString escapedFileName = fileName;
0062     escapedFileName.replace(QLatin1Char(' '), QLatin1String("\\ "));
0063     return QString::fromLatin1("loadVariables %1").arg(escapedFileName);
0064 }
0065 
0066 // Custom Plot Extension. This extension does not fit into the normal pattern,
0067 // because it inherits Cantor::Extension directly.
0068 // Also it does not do anything at all, because all the work is done by the
0069 // QalculatePlotAssistant
0070 QalculatePlotExtension::QalculatePlotExtension(QObject* parent) :
0071     Cantor::Extension(QLatin1String("QalculatePlotExtension"), parent)
0072 {
0073 }
0074 
0075 QalculatePlotExtension::~QalculatePlotExtension() = default;
0076 
0077 QString QalculateCASExtension::solve(const QStringList& equations, const QStringList& variables)
0078 {
0079     QString eqstr=QString::fromLatin1("[%1]").arg(equations.join(QLatin1String(",")));
0080 
0081     QString variablestr=QString::fromLatin1("[%1]").arg(variables.join(QLatin1String(",")));
0082 
0083     return QString::fromLatin1("multisolve(%1,%2)").arg(eqstr, variablestr);
0084 }
0085 
0086 QString QalculateCASExtension::simplify(const QString& expression)
0087 {
0088     // There is (currently) no way to do this
0089     return QString::fromLatin1("").arg(expression);
0090 }
0091 
0092 QString QalculateCASExtension::expand(const QString& expression)
0093 {
0094     // There is (currently) no way to do this
0095     return QString::fromLatin1("").arg(expression);
0096 }
0097 
0098 QString QalculateCalculusExtension::limit(const QString& expression, const QString& variable, const QString& limit)
0099 {
0100     Q_UNUSED(expression)
0101     Q_UNUSED(variable)
0102     Q_UNUSED(limit)
0103     // There is no limit function in Qalculate (at least none I know of),
0104     // but fortunately this function seems not to be used anyway.
0105     return QLatin1String("");
0106     //return QString("limit(%1, %2=%3);").arg(expression, variable, limit);
0107 }
0108 
0109 QString QalculateCalculusExtension::differentiate(const QString& function,const QString& variable, int times)
0110 {
0111     return QString::fromLatin1("diff(%1, %2, %3)").arg(function, variable, QString::number(times));
0112 }
0113 
0114 QString QalculateCalculusExtension::integrate(const QString& function, const QString& variable)
0115 {
0116     return QString::fromLatin1("integrate(%1, %2)").arg(function, variable);
0117 }
0118 
0119 QString QalculateCalculusExtension::integrate(const QString& function,const QString& variable, const QString& left, const QString& right)
0120 {
0121     return QString::fromLatin1("integrate(%1, %2, %3, %4)").arg(function, variable, left, right);
0122 }
0123 
0124 //Commands to create Vectors/Matrices
0125 QString QalculateLinearAlgebraExtension::createVector(const QStringList& entries, VectorType type)
0126 {
0127     // Neither of these does create a normal vector, but a n-times-1 or
0128     // an 1-times-n matrix.
0129     if(type==Cantor::LinearAlgebraExtension::ColumnVector) {
0130         QString list=entries.join(QLatin1String("], ["));
0131         return QString::fromLatin1("[[%1]]").arg(list);
0132     }
0133     else {
0134         QString list=entries.join(QLatin1String(","));
0135         return QString::fromLatin1("[[%1]]").arg(list);
0136     }
0137 }
0138 
0139 QString QalculateLinearAlgebraExtension::createMatrix(const Matrix& matrix)
0140 {
0141   QString cmd=QLatin1String("[");
0142     foreach(const QStringList& row, matrix)
0143     {
0144         cmd+=QLatin1Char('[');
0145         foreach(const QString& entry, row)
0146             cmd+=entry+QLatin1Char(',');
0147         cmd.chop(1);
0148         cmd+=QLatin1String("],");
0149     }
0150     cmd.chop(1);
0151     cmd+=QLatin1String("]");
0152 
0153     return cmd;
0154 }
0155 
0156 QString QalculateLinearAlgebraExtension::identityMatrix(int size)
0157 {
0158     return QString::fromLatin1("identity(%1)").arg(size);
0159 }
0160 
0161 //basic functions
0162 QString QalculateLinearAlgebraExtension::rank(const QString& matrix)
0163 {
0164     // This feature seems to be missing in Qalculate
0165     return QString::fromLatin1("").arg(matrix);
0166 }
0167 
0168 QString QalculateLinearAlgebraExtension::invertMatrix(const QString& matrix)
0169 {
0170     return QString::fromLatin1("inverse(%1)").arg(matrix);
0171 }
0172 
0173 QString QalculateLinearAlgebraExtension::charPoly(const QString& matrix)
0174 {
0175   return QString::fromLatin1("det(x*identity(%1)-%2)").arg(matrix, matrix);
0176 }
0177 
0178 QString QalculateLinearAlgebraExtension::eigenVectors(const QString& matrix)
0179 {
0180     // No such function
0181     return QString::fromLatin1("").arg(matrix);
0182 }
0183 
0184 QString QalculateLinearAlgebraExtension::eigenValues(const QString& matrix)
0185 {
0186     // No such function
0187     return QString::fromLatin1("").arg(matrix);
0188 }