1 /*
2     SPDX-License-Identifier: GPL-2.0-or-later
3     SPDX-FileCopyrightText: 2016 Ivan Lakhtanov <ivan.lakhtanov@gmail.com>
4 */
5 #pragma once
6 
7 #include <extension.h>
8 
9 #define JULIA_EXT_CDTOR_DECL(name) Julia##name##Extension(QObject *parent); \
10                                    ~Julia##name##Extension();
11 
12 
13 /**
14  * Implementation of linear algebra wizards for Julia
15  */
16 class JuliaLinearAlgebraExtension: public Cantor::LinearAlgebraExtension
17 {
18 public:
19     JULIA_EXT_CDTOR_DECL(LinearAlgebra)
20 
21     /**
22      * @see Cantor::LinearAlgebraExtension::createVector
23      */
24     QString createVector(
25         const QStringList &entries,
26         VectorType type) override;
27 
28     /**
29      * @see Cantor::LinearAlgebraExtension::nullVector
30      */
31     QString nullVector(int size, VectorType type) override;
32 
33     /**
34      * @see Cantor::LinearAlgebraExtension::createMatrix
35      */
36     QString createMatrix(
37         const Cantor::LinearAlgebraExtension::Matrix &matrix) override;
38 
39     /**
40      * @see Cantor::LinearAlgebraExtension::identityMatrix
41      */
42     QString identityMatrix(int size) override;
43 
44     /**
45      * @see Cantor::LinearAlgebraExtension::nullMatrix
46      */
47     QString nullMatrix(int rows, int columns) override;
48 
49     /**
50      * @see Cantor::LinearAlgebraExtension::rank
51      */
52     QString rank(const QString &matrix) override;
53 
54     /**
55      * @see Cantor::LinearAlgebraExtension::invertMatrix
56      */
57     QString invertMatrix(const QString &matrix) override;
58 
59     /**
60      * @see Cantor::LinearAlgebraExtension::charPoly
61      */
62     QString charPoly(const QString &matrix) override;
63 
64     /**
65      * @see Cantor::LinearAlgebraExtension::eigenVectors
66      */
67     QString eigenVectors(const QString &matrix) override;
68 
69     /**
70      * @see Cantor::LinearAlgebraExtension::eigenValues
71      */
72     QString eigenValues(const QString &matrix) override;
73 };
74 
75 /**
76  * Implementation of packaging wizards for Julia
77  */
78 class JuliaPackagingExtension: public Cantor::PackagingExtension
79 {
80 public:
81     JULIA_EXT_CDTOR_DECL(Packaging)
82 
83     /**
84      * @see Cantor::PackagingExtension::importPackage
85      */
86     QString importPackage(const QString &module) override;
87 };
88 
89 /**
90  * Implementation of plot wizards for Julia
91  *
92  * Plotting is based on GR package
93  */
94 class JuliaPlotExtension: public Cantor::PlotExtension
95 {
96 public:
97     JULIA_EXT_CDTOR_DECL(Plot)
98 
99     /**
100      * @see Cantor::PlotExtension::plotFunction2d
101      */
102     QString plotFunction2d(
103         const QString &function,
104         const QString &variable,
105         const QString &left,
106         const QString &right) override;
107 
108     /**
109      * @see Cantor::PlotExtension::plotFunction3d
110      */
111     QString plotFunction3d(
112         const QString &function,
113         const VariableParameter& var1,
114         const VariableParameter& var2) override;
115 };
116 
117 /**
118  * Implementation of script wizard for Julia
119  */
120 class JuliaScriptExtension: public Cantor::ScriptExtension
121 {
122 public:
123     JULIA_EXT_CDTOR_DECL(Script)
124 
125     /**
126      * @see Cantor::ScriptExtension::scriptFileFilter
127      */
128     QString scriptFileFilter() override;
129 
130     /**
131      * @see Cantor::ScriptExtension::highlightingMode
132      */
133     QString highlightingMode() override;
134 
135     /**
136      * @see Cantor::ScriptExtension::runExternalScript
137      */
138     QString runExternalScript(const QString &path) override;
139 };
140 
141 /**
142  * Julia variable management extension
143  *
144  * Based on JLD package for loading/saving variables
145  */
146 class JuliaVariableManagementExtension: public Cantor::VariableManagementExtension
147 {
148 public:
149     JULIA_EXT_CDTOR_DECL(VariableManagement)
150 
151     // There is no way to completely delete object from scope:
152     // https://docs.julialang.org/en/v1/manual/faq/#How-do-I-delete-an-object-in-memory?-1
153     // So we are saving special marker to variable to mark it as removed
154     static const QString REMOVED_VARIABLE_MARKER;
155 
156     /**
157      * @see Cantor::VariableManagementExtension::addVariable
158      */
159     QString addVariable(
160         const QString &name,
161         const QString &value) override;
162 
163     /**
164      * @see Cantor::VariableManagementExtension::setValue
165      */
166     QString setValue(
167         const QString &name,
168         const QString &value) override;
169 
170     /**
171      * @see Cantor::VariableManagementExtension::removeVariable
172      */
173     QString removeVariable(const QString &name) override;
174 
175     /**
176      * @see Cantor::VariableManagementExtension::saveVariables
177      */
178     QString saveVariables(const QString &fileName) override;
179 
180     /**
181      * @see Cantor::VariableManagementExtension::loadVariables
182      */
183     QString loadVariables(const QString &fileName) override;
184 
185     /**
186      * @see Cantor::VariableManagementExtension::clearVariables
187      */
188     QString clearVariables() override;
189 };
190