GiNaC 1.8.8
fderivative.cpp
Go to the documentation of this file.
1
5/*
6 * GiNaC Copyright (C) 1999-2025 Johannes Gutenberg University Mainz, Germany
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include "fderivative.h"
24#include "operators.h"
25#include "archive.h"
26#include "utils.h"
27
28namespace GiNaC {
29
32 print_func<print_latex>(&fderivative::do_print_latex).
33 print_func<print_csrc>(&fderivative::do_print_csrc).
34 print_func<print_tree>(&fderivative::do_print_tree))
35
36
37// default constructor
39
41{
42}
43
45// other constructors
47
48fderivative::fderivative(unsigned ser, unsigned param, const exvector & args) : function(ser, args)
49{
50 parameter_set.insert(param);
51}
52
53fderivative::fderivative(unsigned ser, const paramset & params, const exvector & args) : function(ser, args), parameter_set(params)
54{
55}
56
57fderivative::fderivative(unsigned ser, const paramset & params, exvector && v) : function(ser, std::move(v)), parameter_set(params)
58{
59}
60
62// archiving
64
66{
67 inherited::read_archive(n, sym_lst);
68 unsigned i = 0;
69 while (true) {
70 unsigned u;
71 if (n.find_unsigned("param", u, i))
72 parameter_set.insert(u);
73 else
74 break;
75 ++i;
76 }
77}
79
81{
82 inherited::archive(n);
83 auto i = parameter_set.begin(), end = parameter_set.end();
84 while (i != end) {
85 n.add_unsigned("param", *i);
86 ++i;
87 }
88}
89
90
92// functions overriding virtual functions from base classes
94
95void fderivative::print(const print_context & c, unsigned level) const
96{
97 // class function overrides print(), but we don't want that
98 basic::print(c, level);
99}
100
101void fderivative::do_print(const print_context & c, unsigned level) const
102{
103 c.s << "D[";
104 auto i = parameter_set.begin(), end = parameter_set.end();
105 --end;
106 while (i != end) {
107 c.s << *i++ << ",";
108 }
109 c.s << *i << "](" << registered_functions()[serial].name << ")";
111}
112
113void fderivative::do_print_latex(const print_context & c, unsigned level) const
114{
115 int order=1;
116 c.s << "\\partial_{";
117 auto i = parameter_set.begin(), end = parameter_set.end();
118 --end;
119 while (i != end) {
120 ++order;
121 c.s << *i++ << ",";
122 }
123 c.s << *i << "}";
124 if (order>1)
125 c.s << "^{" << order << "}";
126 c.s << "(" << registered_functions()[serial].TeX_name << ")";
128}
129
130void fderivative::do_print_csrc(const print_csrc & c, unsigned level) const
131{
132 c.s << "D_";
133 auto i = parameter_set.begin(), end = parameter_set.end();
134 --end;
135 while (i != end)
136 c.s << *i++ << "_";
137 c.s << *i << "_" << registered_functions()[serial].name;
139}
140
141void fderivative::do_print_tree(const print_tree & c, unsigned level) const
142{
143 c.s << std::string(level, ' ') << class_name() << " "
144 << registered_functions()[serial].name << " @" << this
145 << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec
146 << ", nops=" << nops()
147 << ", params=";
148 auto i = parameter_set.begin(), end = parameter_set.end();
149 --end;
150 while (i != end)
151 c.s << *i++ << ",";
152 c.s << *i << std::endl;
153 for (auto & i : seq)
154 i.print(c, level + c.delta_indent);
155 c.s << std::string(level + c.delta_indent, ' ') << "=====" << std::endl;
156}
157
159{
160 // No parameters specified? Then return the function itself
161 if (parameter_set.empty())
162 return function(serial, seq);
163
164 // If the function in question actually has a derivative, return it
165 if (registered_functions()[serial].has_derivative() && parameter_set.size() == 1)
166 return pderivative(*(parameter_set.begin()));
167
168 return this->hold();
169}
170
173ex fderivative::series(const relational & r, int order, unsigned options) const
174{
175 return basic::series(r, order, options);
176}
177
179{
180 return fderivative(serial, parameter_set, v);
181}
182
184{
185 return fderivative(serial, parameter_set, std::move(v));
186}
187
191{
192 ex result;
193 for (size_t i=0; i<seq.size(); i++) {
194 ex arg_diff = seq[i].diff(s);
195 if (!arg_diff.is_zero()) {
197 ps.insert(i);
198 result += arg_diff * fderivative(serial, ps, seq);
199 }
200 }
201 return result;
202}
203
204int fderivative::compare_same_type(const basic & other) const
205{
206 GINAC_ASSERT(is_a<fderivative>(other));
207 const fderivative & o = static_cast<const fderivative &>(other);
208
210 return parameter_set < o.parameter_set ? -1 : 1;
211 else
212 return inherited::compare_same_type(o);
213}
214
215bool fderivative::is_equal_same_type(const basic & other) const
216{
217 GINAC_ASSERT(is_a<fderivative>(other));
218 const fderivative & o = static_cast<const fderivative &>(other);
219
221 return false;
222 else
223 return inherited::is_equal_same_type(o);
224}
225
226bool fderivative::match_same_type(const basic & other) const
227{
228 GINAC_ASSERT(is_a<fderivative>(other));
229 const fderivative & o = static_cast<const fderivative &>(other);
230
231 return parameter_set == o.parameter_set && inherited::match_same_type(other);
232}
233
245{
246 return parameter_set;
247}
248
249
250} // namespace GiNaC
Archiving of GiNaC expressions.
#define GINAC_ASSERT(X)
Assertion macro for checking invariances.
Definition assertion.h:33
This class stores all properties needed to record/retrieve the state of one object of class basic (or...
Definition archive.h:49
This class is the ABC (abstract base class) of GiNaC's class hierarchy.
Definition basic.h:105
unsigned hashvalue
hash value
Definition basic.h:303
unsigned flags
of type status_flags
Definition basic.h:302
virtual void print(const print_context &c, unsigned level=0) const
Output to stream.
Definition basic.cpp:116
const basic & hold() const
Stop further evaluation.
Definition basic.cpp:887
virtual ex series(const relational &r, int order, unsigned options=0) const
Default implementation of ex::series().
Definition pseries.cpp:611
virtual int compare_same_type(const basic &other) const
Returns order relation between two objects of same type.
Definition basic.cpp:719
Wrapper template for making GiNaC classes out of STL containers.
Definition container.h:73
virtual void printseq(const print_context &c, char openbracket, char delim, char closebracket, unsigned this_precedence, unsigned upper_precedence=0) const
Print sequence of contained elements.
Definition container.h:451
const_iterator end() const
Definition container.h:240
size_t nops() const override
Number of operands/members.
Definition container.h:118
unsigned precedence() const override
Return relative operator precedence (for parenthezing output).
Definition container.h:117
Lightweight wrapper for GiNaC's symbolic objects.
Definition ex.h:73
ex diff(const symbol &s, unsigned nth=1) const
Compute partial derivative of an expression.
Definition ex.cpp:87
bool is_zero() const
Definition ex.h:214
This class represents the (abstract) derivative of a symbolic function.
Definition fderivative.h:38
void do_print_latex(const print_context &c, unsigned level) const
const paramset & derivatives() const
Expose this object's derivative structure.
void do_print(const print_context &c, unsigned level) const
ex derivative(const symbol &s) const override
Implementation of ex::diff() for derivatives.
bool match_same_type(const basic &other) const override
Returns true if the attributes of two objects are similar enough for a match.
ex series(const relational &r, int order, unsigned options=0) const override
The series expansion of derivatives falls back to Taylor expansion.
ex thiscontainer(const exvector &v) const override
fderivative(unsigned ser, unsigned param, const exvector &args)
Construct derivative with respect to one parameter.
void do_print_tree(const print_tree &c, unsigned level) const
ex eval() const override
Perform automatic non-interruptive term rewriting rules.
bool is_equal_same_type(const basic &other) const override
Returns true if two objects of same type are equal.
paramset parameter_set
Set of parameter numbers with respect to which to take the derivative.
Definition fderivative.h:85
void do_print_csrc(const print_csrc &c, unsigned level) const
void print(const print_context &c, unsigned level=0) const override
Output to stream.
void archive(archive_node &n) const override
Archive the object.
void read_archive(const archive_node &n, lst &syms) override
Load (deserialize) the object from an archive node.
The class function is used to implement builtin functions like sin, cos... and user defined functions...
Definition function.h:674
unsigned serial
Definition function.h:751
static std::vector< function_options > & registered_functions()
unsigned precedence() const override
Return relative operator precedence (for parenthezing output).
Definition function.h:707
ex pderivative(unsigned diff_param) const
Base class for print_contexts.
Definition print.h:102
Base context for C source output.
Definition print.h:157
Context for tree-like output for debugging.
Definition print.h:146
This class holds a relation consisting of two expressions and a logical relation between them.
Definition relational.h:35
Basic CAS symbol.
Definition symbol.h:39
unsigned options
Definition factor.cpp:2474
size_t n
Definition factor.cpp:1432
size_t c
Definition factor.cpp:757
size_t r
Definition factor.cpp:757
Interface to abstract derivatives of functions.
Definition add.cpp:36
std::multiset< unsigned > paramset
Definition fderivative.h:32
print_func< print_context >(&varidx::do_print). print_func< print_latex >(&varidx
Definition idx.cpp:44
GINAC_IMPLEMENT_REGISTERED_CLASS_OPT_T(lst, basic, print_func< print_context >(&lst::do_print). print_func< print_tree >(&lst::do_print_tree)) template<> bool lst GINAC_BIND_UNARCHIVER(lst)
Specialization of container::info() for lst.
Definition lst.cpp:42
std::vector< ex > exvector
Definition basic.h:48
Definition ex.h:988
Interface to GiNaC's overloaded operators.
#define GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(classname, supername, options)
Macro for inclusion in the implementation of each registered class.
Definition registrar.h:184
Interface to several small and furry utilities needed within GiNaC but not of any interest to the use...

This page is part of the GiNaC developer's reference. It was generated automatically by doxygen. For an introduction, see the tutorial.