GiNaC 1.8.8
constant.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 "constant.h"
24#include "numeric.h"
25#include "ex.h"
26#include "archive.h"
27#include "utils.h"
28#include "inifcns.h"
29
30#include <stdexcept>
31#include <string>
32
33namespace GiNaC {
34
37 print_func<print_latex>(&constant::do_print_latex).
38 print_func<print_tree>(&constant::do_print_tree).
39 print_func<print_python_repr>(&constant::do_print_python_repr))
40
41
42// default constructor
44
45// public
46
47constant::constant() : ef(nullptr), serial(next_serial++), domain(domain::complex)
48{
50}
51
53// other constructors
55
56// public
57
58constant::constant(const std::string & initname, evalffunctype efun, const std::string & texname, unsigned dm)
59 : name(initname), ef(efun), serial(next_serial++), domain(dm)
60{
61 if (texname.empty())
62 TeX_name = "\\mathrm{" + name + "}";
63 else
64 TeX_name = texname;
66}
67
68constant::constant(const std::string & initname, const numeric & initnumber, const std::string & texname, unsigned dm)
69 : name(initname), ef(nullptr), number(initnumber), serial(next_serial++), domain(dm)
70{
71 if (texname.empty())
72 TeX_name = "\\mathrm{" + name + "}";
73 else
74 TeX_name = texname;
76}
77
79// archiving
81
83{
84 // Find constant by name (!! this is bad: 'twould be better if there
85 // was a list of all global constants that we could search)
86 std::string s;
87 if (n.find_string("name", s)) {
88 if (s == Pi.name)
89 *this = Pi;
90 else if (s == Catalan.name)
91 *this = Catalan;
92 else if (s == Euler.name)
93 *this = Euler;
94 else
95 throw (std::runtime_error("unknown constant '" + s + "' in archive"));
96 } else
97 throw (std::runtime_error("unnamed constant in archive"));
98}
100
102{
103 inherited::archive(n);
104 n.add_string("name", name);
105}
106
108// functions overriding virtual functions from base classes
110
111// public
112
113void constant::do_print(const print_context & c, unsigned level) const
114{
115 c.s << name;
116}
117
118void constant::do_print_tree(const print_tree & c, unsigned level) const
119{
120 c.s << std::string(level, ' ') << name << " (" << class_name() << ")" << " @" << this
121 << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec
122 << std::endl;
123}
124
125void constant::do_print_latex(const print_latex & c, unsigned level) const
126{
127 c.s << TeX_name;
128}
129
130void constant::do_print_python_repr(const print_python_repr & c, unsigned level) const
131{
132 c.s << class_name() << "('" << name << "'";
133 if (TeX_name != "\\mathrm{" + name + "}")
134 c.s << ",TeX_name='" << TeX_name << "'";
135 c.s << ')';
136}
137
138bool constant::info(unsigned inf) const
139{
140 if (inf == info_flags::polynomial)
141 return true;
142 if (inf == info_flags::real)
145 return domain == domain::positive;
146 else
147 return inherited::info(inf);
148}
149
151{
152 if (ef!=nullptr) {
153 return ef();
154 } else {
155 return number.evalf();
156 }
157 return *this;
158}
159
160bool constant::is_polynomial(const ex & var) const
161{
162 return true;
163}
164
166{
168 return *this;
169 return conjugate_function(*this).hold();
170}
171
173{
175 return *this;
176 return real_part_function(*this).hold();
177}
178
180{
182 return 0;
183 return imag_part_function(*this).hold();
184}
185
186// protected
187
192{
193 return _ex0;
194}
195
196int constant::compare_same_type(const basic & other) const
197{
198 GINAC_ASSERT(is_exactly_a<constant>(other));
199 const constant &o = static_cast<const constant &>(other);
200
201 if (serial == o.serial)
202 return 0;
203 else
204 return serial < o.serial ? -1 : 1;
205}
206
207bool constant::is_equal_same_type(const basic & other) const
208{
209 GINAC_ASSERT(is_exactly_a<constant>(other));
210 const constant &o = static_cast<const constant &>(other);
211
212 return serial == o.serial;
213}
214
215unsigned constant::calchash() const
216{
217 const void* typeid_this = (const void*)typeid(*this).name();
218 hashvalue = golden_ratio_hash((uintptr_t)typeid_this ^ serial);
219
221
222 return hashvalue;
223}
224
226// new virtual functions which can be overridden by derived classes
228
229// none
230
232// non-virtual functions in this class
234
235// none
236
238// static member variables
240
241unsigned constant::next_serial = 0;
242
244// global constants
246
248const constant Pi("Pi", PiEvalf, "\\pi", domain::positive);
249
252const constant Euler("Euler", EulerEvalf, "\\gamma_E", domain::positive);
253
255const constant Catalan("Catalan", CatalanEvalf, "G", domain::positive);
256
257} // 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
const basic & setflag(unsigned f) const
Set some status_flags.
Definition basic.h:288
unsigned hashvalue
hash value
Definition basic.h:303
unsigned flags
of type status_flags
Definition basic.h:302
virtual int compare_same_type(const basic &other) const
Returns order relation between two objects of same type.
Definition basic.cpp:719
This class holds constants, symbols with specific numerical value.
Definition constant.h:41
evalffunctype ef
Definition constant.h:74
ex number
numerical value this constant evalf()s to
Definition constant.h:75
ex evalf() const override
Evaluate object numerically.
Definition constant.cpp:150
std::string name
printname of this constant
Definition constant.h:72
void read_archive(const archive_node &n, lst &syms) override
Load (deserialize) the object from an archive node.
Definition constant.cpp:82
unsigned serial
unique serial number for comparison
Definition constant.h:76
void do_print_latex(const print_latex &c, unsigned level) const
Definition constant.cpp:125
bool is_equal_same_type(const basic &other) const override
Returns true if two objects of same type are equal.
Definition constant.cpp:207
void archive(archive_node &n) const override
Save (serialize) the object into archive node.
Definition constant.cpp:101
void do_print(const print_context &c, unsigned level) const
Definition constant.cpp:113
std::string TeX_name
LaTeX name.
Definition constant.h:73
bool info(unsigned inf) const override
Information about the object.
Definition constant.cpp:138
ex real_part() const override
Definition constant.cpp:172
static unsigned next_serial
Definition constant.h:77
ex derivative(const symbol &s) const override
Implementation of ex::diff() for a constant always returns 0.
Definition constant.cpp:191
void do_print_python_repr(const print_python_repr &c, unsigned level) const
Definition constant.cpp:130
void do_print_tree(const print_tree &c, unsigned level) const
Definition constant.cpp:118
unsigned calchash() const override
Compute the hash value of an object and if it makes sense to store it in the objects status_flags,...
Definition constant.cpp:215
constant(const std::string &initname, evalffunctype efun=nullptr, const std::string &texname=std::string(), unsigned domain=domain::complex)
Definition constant.cpp:58
bool is_polynomial(const ex &var) const override
Check whether this is a polynomial in the given variables.
Definition constant.cpp:160
ex conjugate() const override
Definition constant.cpp:165
ex imag_part() const override
Definition constant.cpp:179
Wrapper template for making GiNaC classes out of STL containers.
Definition container.h:73
Domain of an object.
Definition flags.h:66
Lightweight wrapper for GiNaC's symbolic objects.
Definition ex.h:73
ex evalf() const
Definition ex.h:122
This class is a wrapper around CLN-numbers within the GiNaC class hierarchy.
Definition numeric.h:82
Base class for print_contexts.
Definition print.h:102
Context for latex-parsable output.
Definition print.h:122
Context for python-parsable output.
Definition print.h:138
Context for tree-like output for debugging.
Definition print.h:146
@ expanded
.expand(0) has already done its job (other expand() options ignore this flag)
Definition flags.h:204
@ evaluated
.eval() has already done its job
Definition flags.h:203
@ hash_calculated
.calchash() has already done its job
Definition flags.h:205
Basic CAS symbol.
Definition symbol.h:39
Interface to GiNaC's constant types and some special constants.
Interface to GiNaC's light-weight expression handles.
size_t n
Definition factor.cpp:1432
size_t c
Definition factor.cpp:757
Interface to GiNaC's initially known functions.
Definition add.cpp:36
unsigned golden_ratio_hash(uintptr_t n)
Truncated multiplication with golden ratio, for computing hash values.
Definition utils.h:68
const constant Euler("Euler", EulerEvalf, "\\gamma_E", domain::positive)
Euler's constant.
Definition constant.h:84
ex EulerEvalf()
Floating point evaluation of Euler's constant gamma.
Definition numeric.cpp:2506
ex PiEvalf()
Floating point evaluation of Archimedes' constant Pi.
Definition numeric.cpp:2499
const constant Pi("Pi", PiEvalf, "\\pi", domain::positive)
Pi.
Definition constant.h:82
print_func< print_context >(&varidx::do_print). print_func< print_latex >(&varidx
Definition idx.cpp:44
const constant Catalan("Catalan", CatalanEvalf, "G", domain::positive)
Catalan's constant.
Definition constant.h:83
ex CatalanEvalf()
Floating point evaluation of Catalan's constant.
Definition numeric.cpp:2513
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
const ex _ex0
Definition utils.cpp:369
Makes the interface to the underlying bignum package available.
#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.