1 /*
2     SPDX-License-Identifier: GPL-2.0-or-later
3     SPDX-FileCopyrightText: 2009 Alexander Rieder <alexanderrieder@gmail.com>
4 */
5 
6 #include "sageextensions.h"
7 #include <QStringList>
8 #include <KLocalizedString>
9 
10 #define SAGE_EXTENSION_CONSTRUCTORS(name) Sage##name##Extension::Sage##name##Extension(QObject* parent) : name##Extension(parent) {} \
11                                      Sage##name##Extension::~Sage##name##Extension() {}
12 
13 
14 //History Extension
SAGE_EXTENSION_CONSTRUCTORS(History)15 SAGE_EXTENSION_CONSTRUCTORS(History)
16 
17 QString SageHistoryExtension::lastResult()
18 {
19     return QLatin1String("_");
20 }
21 
22 //Script Extension
SAGE_EXTENSION_CONSTRUCTORS(Script)23 SAGE_EXTENSION_CONSTRUCTORS(Script)
24 
25 QString SageScriptExtension::runExternalScript(const QString& path)
26 {
27     return QString::fromLatin1("execfile(\"%1\")").arg(path);
28 }
29 
scriptFileFilter()30 QString SageScriptExtension::scriptFileFilter()
31 {
32     return i18n("Python script file (*.py);;Sage script file (*.sage)");
33 }
34 
highlightingMode()35 QString SageScriptExtension::highlightingMode()
36 {
37     return QLatin1String("python");
38 }
39 
40 //CAS extension
SAGE_EXTENSION_CONSTRUCTORS(CAS)41 SAGE_EXTENSION_CONSTRUCTORS(CAS)
42 
43 QString SageCASExtension::solve(const QStringList& equations, const QStringList& variables)
44 {
45     QString eqstr=QString::fromLatin1("[%1]").arg(equations.join(QLatin1String(",")));
46     eqstr.replace(QLatin1Char('='), QLatin1String("==")); //Sage uses == for equations and = for assignments
47     QString variablestr=variables.join(QLatin1String(","));
48 
49     return QString::fromLatin1("solve(%1,%2)").arg(eqstr, variablestr);
50 }
51 
simplify(const QString & expression)52 QString SageCASExtension::simplify(const QString& expression)
53 {
54     return QString::fromLatin1("simplify(%1)").arg(expression);
55 }
56 
expand(const QString & expression)57 QString SageCASExtension::expand(const QString& expression)
58 {
59     return QString::fromLatin1("expand(%1)").arg(expression);
60 }
61 
62 //Calculus Extension
SAGE_EXTENSION_CONSTRUCTORS(Calculus)63 SAGE_EXTENSION_CONSTRUCTORS(Calculus)
64 
65 QString SageCalculusExtension::limit(const QString& expression, const QString& variable, const QString& limit)
66 {
67     return QString::fromLatin1("limit(%1,%2=%3)").arg(expression, variable, limit);
68 }
69 
differentiate(const QString & function,const QString & variable,int times)70 QString SageCalculusExtension::differentiate(const QString& function,const QString& variable, int times)
71 {
72     return QString::fromLatin1("diff(%1,%2,%3)").arg(function, variable, QString::number(times));
73 }
74 
integrate(const QString & function,const QString & variable)75 QString SageCalculusExtension::integrate(const QString& function, const QString& variable)
76 {
77     return QString::fromLatin1("integral(%1,%2)").arg(function, variable);
78 }
79 
integrate(const QString & function,const QString & variable,const QString & left,const QString & right)80 QString SageCalculusExtension::integrate(const QString& function,const QString& variable, const QString& left, const QString& right)
81 {
82     return QString::fromLatin1("integral(%1,%2,%3,%4)").arg(function, variable, left, right);
83 }
84 
85 //Linear Algebra
SAGE_EXTENSION_CONSTRUCTORS(LinearAlgebra)86 SAGE_EXTENSION_CONSTRUCTORS(LinearAlgebra)
87 
88 QString SageLinearAlgebraExtension::createVector(const QStringList& entries, VectorType type)
89 {
90     QString cmd=QLatin1String("vector(");
91     foreach(const QString& e, entries)
92         cmd+=e+QLatin1Char(',');
93     cmd.chop(1);
94     cmd+=QLatin1Char(')');
95 
96     if(type==Cantor::LinearAlgebraExtension::ColumnVector)
97         cmd+=QLatin1String(".transpose()");
98 
99     return cmd;
100 }
101 
nullVector(int size,VectorType type)102 QString SageLinearAlgebraExtension::nullVector(int size, VectorType type)
103 {
104     QString cmd=QString::fromLatin1("vector(seq(0 for i in range(0,%1)))").arg(size);
105     if(type==Cantor::LinearAlgebraExtension::ColumnVector)
106         cmd+=QLatin1String(".transpose()");
107 
108     return cmd;
109 }
110 
createMatrix(const Matrix & matrix)111 QString SageLinearAlgebraExtension::createMatrix(const Matrix& matrix)
112 {
113     QString cmd=QLatin1String("matrix([");
114     foreach(const QStringList& row, matrix)
115     {
116         cmd+=QLatin1Char('[');
117         foreach(const QString& entry, row)
118             cmd+=entry+QLatin1Char(',');
119         cmd.chop(1);
120         cmd+=QLatin1String("],");
121     }
122     cmd.chop(1);
123     cmd+=QLatin1String("])");
124 
125     return cmd;
126 }
127 
identityMatrix(int size)128 QString SageLinearAlgebraExtension::identityMatrix(int size)
129 {
130     return QString::fromLatin1("identity_matrix(%1)").arg(size);
131 }
132 
nullMatrix(int rows,int columns)133 QString SageLinearAlgebraExtension::nullMatrix(int rows,int columns)
134 {
135     return QString::fromLatin1("null_matrix(%1,%2)").arg(rows, columns);
136 }
137 
rank(const QString & matrix)138 QString SageLinearAlgebraExtension::rank(const QString& matrix)
139 {
140     return QString::fromLatin1("%1.rank()").arg(matrix);
141 }
142 
invertMatrix(const QString & matrix)143 QString SageLinearAlgebraExtension::invertMatrix(const QString& matrix)
144 {
145     return QString::fromLatin1("%1.inverse()").arg(matrix);
146 }
147 
charPoly(const QString & matrix)148 QString SageLinearAlgebraExtension::charPoly(const QString& matrix)
149 {
150     return QString::fromLatin1("%1.char_poly()").arg(matrix);
151 }
152 
eigenVectors(const QString & matrix)153 QString SageLinearAlgebraExtension::eigenVectors(const QString& matrix)
154 {
155     return QString::fromLatin1("%1.eigenvectors_right()").arg(matrix);
156 }
157 
eigenValues(const QString & matrix)158 QString SageLinearAlgebraExtension::eigenValues(const QString& matrix)
159 {
160     return QString::fromLatin1("%1.eigenvalues()").arg(matrix);
161 }
162 
163 //Plotting
SAGE_EXTENSION_CONSTRUCTORS(Plot)164 SAGE_EXTENSION_CONSTRUCTORS(Plot)
165 
166 QString SagePlotExtension::plotFunction2d(const QString& function, const QString& variable, const QString& left, const QString& right)
167 {
168     return QString::fromLatin1("plot(%1,%2,%3,%4)").arg(function, variable, left, right);
169 }
170 
plotFunction3d(const QString & function,const VariableParameter & var1,const VariableParameter & var2)171 QString SagePlotExtension::plotFunction3d(const QString& function, const VariableParameter& var1, const VariableParameter& var2)
172 {
173     const Interval& int1=var1.second;
174     const Interval& int2=var2.second;
175     return QString::fromLatin1("plot3d(%1,(%2,%3,%4),(%6,%7,%8))").arg(function,
176                                                            var1.first, int1.first, int1.second,
177                                                            var2.first, int2.first, int2.second);
178 }
179 
180 //Packaging
SAGE_EXTENSION_CONSTRUCTORS(Packaging)181 SAGE_EXTENSION_CONSTRUCTORS(Packaging)
182 
183 QString SagePackagingExtension::importPackage(const QString& module)
184 {
185     return QString::fromLatin1("import %1").arg(module);
186 }
187