File indexing completed on 2024-05-05 11:55:59

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2009 Alexander Rieder <alexanderrieder@gmail.com>
0004 */
0005 
0006 #include "sageextensions.h"
0007 #include <QStringList>
0008 #include <KLocalizedString>
0009 
0010 #define SAGE_EXTENSION_CONSTRUCTORS(name) Sage##name##Extension::Sage##name##Extension(QObject* parent) : name##Extension(parent) {} \
0011                                      Sage##name##Extension::~Sage##name##Extension() {}
0012 
0013 
0014 //History Extension
0015 SAGE_EXTENSION_CONSTRUCTORS(History)
0016 
0017 QString SageHistoryExtension::lastResult()
0018 {
0019     return QLatin1String("_");
0020 }
0021 
0022 //Script Extension
0023 SAGE_EXTENSION_CONSTRUCTORS(Script)
0024 
0025 QString SageScriptExtension::runExternalScript(const QString& path)
0026 {
0027     return QString::fromLatin1("execfile(\"%1\")").arg(path);
0028 }
0029 
0030 QString SageScriptExtension::scriptFileFilter()
0031 {
0032     return i18n("Python script file (*.py);;Sage script file (*.sage)");
0033 }
0034 
0035 QString SageScriptExtension::highlightingMode()
0036 {
0037     return QLatin1String("python");
0038 }
0039 
0040 //CAS extension
0041 SAGE_EXTENSION_CONSTRUCTORS(CAS)
0042 
0043 QString SageCASExtension::solve(const QStringList& equations, const QStringList& variables)
0044 {
0045     QString eqstr=QString::fromLatin1("[%1]").arg(equations.join(QLatin1String(",")));
0046     eqstr.replace(QLatin1Char('='), QLatin1String("==")); //Sage uses == for equations and = for assignments
0047     QString variablestr=variables.join(QLatin1String(","));
0048 
0049     return QString::fromLatin1("solve(%1,%2)").arg(eqstr, variablestr);
0050 }
0051 
0052 QString SageCASExtension::simplify(const QString& expression)
0053 {
0054     return QString::fromLatin1("simplify(%1)").arg(expression);
0055 }
0056 
0057 QString SageCASExtension::expand(const QString& expression)
0058 {
0059     return QString::fromLatin1("expand(%1)").arg(expression);
0060 }
0061 
0062 //Calculus Extension
0063 SAGE_EXTENSION_CONSTRUCTORS(Calculus)
0064 
0065 QString SageCalculusExtension::limit(const QString& expression, const QString& variable, const QString& limit)
0066 {
0067     return QString::fromLatin1("limit(%1,%2=%3)").arg(expression, variable, limit);
0068 }
0069 
0070 QString SageCalculusExtension::differentiate(const QString& function,const QString& variable, int times)
0071 {
0072     return QString::fromLatin1("diff(%1,%2,%3)").arg(function, variable, QString::number(times));
0073 }
0074 
0075 QString SageCalculusExtension::integrate(const QString& function, const QString& variable)
0076 {
0077     return QString::fromLatin1("integral(%1,%2)").arg(function, variable);
0078 }
0079 
0080 QString SageCalculusExtension::integrate(const QString& function,const QString& variable, const QString& left, const QString& right)
0081 {
0082     return QString::fromLatin1("integral(%1,%2,%3,%4)").arg(function, variable, left, right);
0083 }
0084 
0085 //Linear Algebra
0086 SAGE_EXTENSION_CONSTRUCTORS(LinearAlgebra)
0087 
0088 QString SageLinearAlgebraExtension::createVector(const QStringList& entries, VectorType type)
0089 {
0090     QString cmd=QLatin1String("vector(");
0091     foreach(const QString& e, entries)
0092         cmd+=e+QLatin1Char(',');
0093     cmd.chop(1);
0094     cmd+=QLatin1Char(')');
0095 
0096     if(type==Cantor::LinearAlgebraExtension::ColumnVector)
0097         cmd+=QLatin1String(".transpose()");
0098 
0099     return cmd;
0100 }
0101 
0102 QString SageLinearAlgebraExtension::nullVector(int size, VectorType type)
0103 {
0104     QString cmd=QString::fromLatin1("vector(seq(0 for i in range(0,%1)))").arg(size);
0105     if(type==Cantor::LinearAlgebraExtension::ColumnVector)
0106         cmd+=QLatin1String(".transpose()");
0107 
0108     return cmd;
0109 }
0110 
0111 QString SageLinearAlgebraExtension::createMatrix(const Matrix& matrix)
0112 {
0113     QString cmd=QLatin1String("matrix([");
0114     foreach(const QStringList& row, matrix)
0115     {
0116         cmd+=QLatin1Char('[');
0117         foreach(const QString& entry, row)
0118             cmd+=entry+QLatin1Char(',');
0119         cmd.chop(1);
0120         cmd+=QLatin1String("],");
0121     }
0122     cmd.chop(1);
0123     cmd+=QLatin1String("])");
0124 
0125     return cmd;
0126 }
0127 
0128 QString SageLinearAlgebraExtension::identityMatrix(int size)
0129 {
0130     return QString::fromLatin1("identity_matrix(%1)").arg(size);
0131 }
0132 
0133 QString SageLinearAlgebraExtension::nullMatrix(int rows,int columns)
0134 {
0135     return QString::fromLatin1("null_matrix(%1,%2)").arg(rows, columns);
0136 }
0137 
0138 QString SageLinearAlgebraExtension::rank(const QString& matrix)
0139 {
0140     return QString::fromLatin1("%1.rank()").arg(matrix);
0141 }
0142 
0143 QString SageLinearAlgebraExtension::invertMatrix(const QString& matrix)
0144 {
0145     return QString::fromLatin1("%1.inverse()").arg(matrix);
0146 }
0147 
0148 QString SageLinearAlgebraExtension::charPoly(const QString& matrix)
0149 {
0150     return QString::fromLatin1("%1.char_poly()").arg(matrix);
0151 }
0152 
0153 QString SageLinearAlgebraExtension::eigenVectors(const QString& matrix)
0154 {
0155     return QString::fromLatin1("%1.eigenvectors_right()").arg(matrix);
0156 }
0157 
0158 QString SageLinearAlgebraExtension::eigenValues(const QString& matrix)
0159 {
0160     return QString::fromLatin1("%1.eigenvalues()").arg(matrix);
0161 }
0162 
0163 //Plotting
0164 SAGE_EXTENSION_CONSTRUCTORS(Plot)
0165 
0166 QString SagePlotExtension::plotFunction2d(const QString& function, const QString& variable, const QString& left, const QString& right)
0167 {
0168     return QString::fromLatin1("plot(%1,%2,%3,%4)").arg(function, variable, left, right);
0169 }
0170 
0171 QString SagePlotExtension::plotFunction3d(const QString& function, const VariableParameter& var1, const VariableParameter& var2)
0172 {
0173     const Interval& int1=var1.second;
0174     const Interval& int2=var2.second;
0175     return QString::fromLatin1("plot3d(%1,(%2,%3,%4),(%6,%7,%8))").arg(function,
0176                                                            var1.first, int1.first, int1.second,
0177                                                            var2.first, int2.first, int2.second);
0178 }
0179 
0180 //Packaging
0181 SAGE_EXTENSION_CONSTRUCTORS(Packaging)
0182 
0183 QString SagePackagingExtension::importPackage(const QString& module)
0184 {
0185     return QString::fromLatin1("import %1").arg(module);
0186 }