1 /*
2 SPDX-License-Identifier: GPL-2.0-or-later
3 SPDX-FileCopyrightText: 2009-2012 Alexander Rieder <alexanderrieder@gmail.com>
4 */
5
6 #include "maximaextensions.h"
7 #include <QStringList>
8 #include <KLocalizedString>
9
10 #define MAXIMA_EXTENSION_CONSTRUCTORS(name) Maxima##name##Extension::Maxima##name##Extension(QObject* parent) : name##Extension(parent) {} \
11 Maxima##name##Extension::~Maxima##name##Extension() {}
12
13 //History Extension
MAXIMA_EXTENSION_CONSTRUCTORS(History)14 MAXIMA_EXTENSION_CONSTRUCTORS(History)
15
16 QString MaximaHistoryExtension::lastResult()
17 {
18 return QLatin1String("%");
19 }
20
21 //Script
MAXIMA_EXTENSION_CONSTRUCTORS(Script)22 MAXIMA_EXTENSION_CONSTRUCTORS(Script)
23
24 QString MaximaScriptExtension::runExternalScript(const QString& file)
25 {
26 return QString::fromLatin1("batch(\"%1\")$").arg(file);
27 }
28
scriptFileFilter()29 QString MaximaScriptExtension::scriptFileFilter()
30 {
31 return i18n("Maxima batch file (*.mac)");
32 }
33
highlightingMode()34 QString MaximaScriptExtension::highlightingMode()
35 {
36 return QLatin1String("maxima");
37 }
38
commentStartingSequence()39 QString MaximaScriptExtension::commentStartingSequence()
40 {
41 return QLatin1String("/* ");
42 }
43
commentEndingSequence()44 QString MaximaScriptExtension::commentEndingSequence()
45 {
46 return QLatin1String(" */");
47 }
48
49 //CAS Extension
MAXIMA_EXTENSION_CONSTRUCTORS(CAS)50 MAXIMA_EXTENSION_CONSTRUCTORS(CAS)
51
52 QString MaximaCASExtension::solve(const QStringList& equations, const QStringList& variables)
53 {
54 QString eqstr=QString::fromLatin1("[%1]").arg(equations.join(QLatin1String(",")));
55
56 QString variablestr=QString::fromLatin1("[%1]").arg(variables.join(QLatin1String(",")));
57
58 return QString::fromLatin1("solve(%1,%2);").arg(eqstr, variablestr);
59 }
60
simplify(const QString & expression)61 QString MaximaCASExtension::simplify(const QString& expression)
62 {
63 return QString::fromLatin1("simplify(%1);").arg(expression);
64 }
65
expand(const QString & expression)66 QString MaximaCASExtension::expand(const QString& expression)
67 {
68 return QString::fromLatin1("expand(%1);").arg(expression);
69 }
70
71 //Calculus Extension
MAXIMA_EXTENSION_CONSTRUCTORS(Calculus)72 MAXIMA_EXTENSION_CONSTRUCTORS(Calculus)
73
74 QString MaximaCalculusExtension::limit(const QString& expression, const QString& variable, const QString& limit)
75 {
76 return QString::fromLatin1("limit(%1, %2=%3);").arg(expression, variable, limit);
77 }
78
differentiate(const QString & function,const QString & variable,int times)79 QString MaximaCalculusExtension::differentiate(const QString& function,const QString& variable, int times)
80 {
81 return QString::fromLatin1("diff(%1, %2, %3);").arg(function, variable, QString::number(times));
82 }
83
integrate(const QString & function,const QString & variable)84 QString MaximaCalculusExtension::integrate(const QString& function, const QString& variable)
85 {
86 return QString::fromLatin1("integrate(%1, %2);").arg(function, variable);
87 }
88
integrate(const QString & function,const QString & variable,const QString & left,const QString & right)89 QString MaximaCalculusExtension::integrate(const QString& function,const QString& variable, const QString& left, const QString& right)
90 {
91 return QString::fromLatin1("integrate(%1, %2, %3, %4);").arg(function, variable, left, right);
92 }
93
94 //Linear Algebra Extension
MAXIMA_EXTENSION_CONSTRUCTORS(LinearAlgebra)95 MAXIMA_EXTENSION_CONSTRUCTORS(LinearAlgebra)
96
97 //Commands to create Vectors/Matrices
98 QString MaximaLinearAlgebraExtension::createVector(const QStringList& entries, VectorType type)
99 {
100 QString list=entries.join(QLatin1String(","));
101
102 if(type==Cantor::LinearAlgebraExtension::ColumnVector)
103 return QString::fromLatin1("columnvector([%1]);").arg(list);
104 else
105 return QString::fromLatin1("rowvector([%1]);").arg(list);
106 }
107
createMatrix(const Matrix & matrix)108 QString MaximaLinearAlgebraExtension::createMatrix(const Matrix& matrix)
109 {
110 QString cmd=QLatin1String("matrix(");
111 for (const QStringList& row : matrix)
112 {
113 cmd+=QLatin1Char('[');
114 for (const QString& entry : row)
115 cmd+=entry+QLatin1Char(',');
116 cmd.chop(1);
117 cmd+=QLatin1String("],");
118 }
119 cmd.chop(1);
120 cmd+=QLatin1String(");");
121
122 return cmd;
123 }
124
identityMatrix(int size)125 QString MaximaLinearAlgebraExtension::identityMatrix(int size)
126 {
127 return QString::fromLatin1("ident(%1);").arg(size);
128 }
129
130 //basic functions
rank(const QString & matrix)131 QString MaximaLinearAlgebraExtension::rank(const QString& matrix)
132 {
133 return QString::fromLatin1("rank(%1);").arg(matrix);
134 }
135
invertMatrix(const QString & matrix)136 QString MaximaLinearAlgebraExtension::invertMatrix(const QString& matrix)
137 {
138 return QString::fromLatin1("invert(%1);").arg(matrix);
139 }
140
charPoly(const QString & matrix)141 QString MaximaLinearAlgebraExtension::charPoly(const QString& matrix)
142 {
143 return QString::fromLatin1("charpoly(%1,x);").arg(matrix);
144 }
145
eigenVectors(const QString & matrix)146 QString MaximaLinearAlgebraExtension::eigenVectors(const QString& matrix)
147 {
148 return QString::fromLatin1("eigenvectors(%1);").arg(matrix);
149 }
150
eigenValues(const QString & matrix)151 QString MaximaLinearAlgebraExtension::eigenValues(const QString& matrix)
152 {
153 return QString::fromLatin1("eigenvalues(%1);").arg(matrix);
154 }
155
156 //Plotting
MAXIMA_EXTENSION_CONSTRUCTORS(Plot)157 MAXIMA_EXTENSION_CONSTRUCTORS(Plot)
158
159 QString MaximaPlotExtension::plotFunction2d(const QString& function, const QString& variable, const QString& left, const QString& right)
160 {
161 return QString::fromLatin1("plot2d(%1,[%2,%3,%4])").arg(function, variable, left, right);
162 }
163
plotFunction3d(const QString & function,const VariableParameter & var1,const VariableParameter & var2)164 QString MaximaPlotExtension::plotFunction3d(const QString& function, const VariableParameter& var1, const VariableParameter& var2)
165 {
166 const Interval& int1=var1.second;
167 const Interval& int2=var2.second;
168 return QString::fromLatin1("plot3d(%1,[%2,%3,%4],[%6,%7,%8])").arg(function,
169 var1.first, int1.first, int1.second,
170 var2.first, int2.first, int2.second);
171 }
172
173 //Variable Management
MAXIMA_EXTENSION_CONSTRUCTORS(VariableManagement)174 MAXIMA_EXTENSION_CONSTRUCTORS(VariableManagement)
175
176 QString MaximaVariableManagementExtension::addVariable(const QString& name, const QString& value)
177 {
178 return QString::fromLatin1("%1: %2").arg(name).arg(value);
179 }
180
setValue(const QString & name,const QString & value)181 QString MaximaVariableManagementExtension::setValue(const QString& name,const QString& value)
182 {
183 return QString::fromLatin1("%1: %2").arg(name).arg(value);
184 }
185
removeVariable(const QString & name)186 QString MaximaVariableManagementExtension::removeVariable(const QString& name)
187 {
188 return QString::fromLatin1("kill(%1)").arg(name);
189 }
190
saveVariables(const QString & fileName)191 QString MaximaVariableManagementExtension::saveVariables(const QString& fileName)
192 {
193 return QString::fromLatin1("save(\"%1\", values,functions)").arg(fileName);
194 }
195
loadVariables(const QString & fileName)196 QString MaximaVariableManagementExtension::loadVariables(const QString& fileName)
197 {
198 return QString::fromLatin1("load(\"%1\")").arg(fileName);
199 }
200
clearVariables()201 QString MaximaVariableManagementExtension::clearVariables()
202 {
203 return QLatin1String("kill(all)");
204 }
205