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 }