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