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