GiNaC 1.8.10
function.cpp
Go to the documentation of this file.
1
5/*
6 * This file was generated automatically by function.py.
7 * Please do not modify it directly, edit function.cppy instead!
8 * function.py options: maxargs=14
9 *
10 * GiNaC Copyright (C) 1999-2026 Johannes Gutenberg University Mainz, Germany
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
26#include "function.h"
27#include "operators.h"
28#include "fderivative.h"
29#include "ex.h"
30#include "lst.h"
31#include "symmetry.h"
32#include "print.h"
33#include "power.h"
34#include "archive.h"
35#include "inifcns.h"
36#include "utils.h"
37#include "hash_seed.h"
38#include "remember.h"
39
40#include <iostream>
41#include <limits>
42#include <list>
43#include <stdexcept>
44#include <string>
45
46namespace GiNaC {
47
49// helper class function_options
51
56
57function_options::function_options(std::string const & n, std::string const & tn)
58{
59 initialize();
60 set_name(n, tn);
61}
62
63function_options::function_options(std::string const & n, unsigned np)
64{
65 initialize();
66 set_name(n, std::string());
67 nparams = np;
68}
69
71{
72 // nothing to clean up at the moment
73}
74
100
102 std::string const & tn)
103{
104 name = n;
105 if (tn==std::string())
106 TeX_name = "\\mbox{"+name+"}";
107 else
108 TeX_name = tn;
109 return *this;
110}
111
113{
114 TeX_name = tn;
115 return *this;
116}
117
118// the following lines have been generated for max. 14 parameters
1043// end of generated lines
1044
1111
1112// end of generated lines
1113
1115{
1116 use_return_type = true;
1117 return_type = rt;
1118 if (rtt != nullptr)
1120 else
1122 return *this;
1123}
1124
1126{
1127 evalf_params_first = false;
1128 return *this;
1129}
1130
1132 unsigned assoc_size,
1133 unsigned strategy)
1134{
1135 use_remember = true;
1136 remember_size = size;
1139 return *this;
1140}
1141
1143{
1145 return *this;
1146}
1147
1149{
1150 symtree = s;
1151 return *this;
1152}
1153
1155{
1156 if (nparams==0) {
1157 nparams = n;
1158 } else if (nparams!=n) {
1159 // we do not throw an exception here because this code is
1160 // usually executed before main(), so the exception could not
1161 // be caught anyhow
1162 std::cerr << "WARNING: " << name << "(): number of parameters ("
1163 << n << ") differs from number set before ("
1164 << nparams << ")" << std::endl;
1165 }
1166}
1167
1169{
1170 if (id >= print_dispatch_table.size())
1171 print_dispatch_table.resize(id + 1);
1172 print_dispatch_table[id] = f;
1173}
1174
1176unsigned function::current_serial = 0;
1177
1178
1180
1181
1182// default constructor
1184
1185// public
1186
1187function::function() : serial(0)
1188{
1189}
1190
1192// other constructors
1194
1195// public
1196
1197function::function(unsigned ser) : serial(ser)
1198{
1199}
1200
1201// the following lines have been generated for max. 14 parameters
1202function::function(unsigned ser, const ex & param1)
1203 : exprseq{param1}, serial(ser)
1204{
1205}
1206function::function(unsigned ser, const ex & param1, const ex & param2)
1207 : exprseq{param1, param2}, serial(ser)
1208{
1209}
1210function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3)
1211 : exprseq{param1, param2, param3}, serial(ser)
1212{
1213}
1214function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4)
1215 : exprseq{param1, param2, param3, param4}, serial(ser)
1216{
1217}
1218function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5)
1219 : exprseq{param1, param2, param3, param4, param5}, serial(ser)
1220{
1221}
1222function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6)
1223 : exprseq{param1, param2, param3, param4, param5, param6}, serial(ser)
1224{
1225}
1226function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7)
1227 : exprseq{param1, param2, param3, param4, param5, param6, param7}, serial(ser)
1228{
1229}
1230function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7, const ex & param8)
1231 : exprseq{param1, param2, param3, param4, param5, param6, param7, param8}, serial(ser)
1232{
1233}
1234function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7, const ex & param8, const ex & param9)
1235 : exprseq{param1, param2, param3, param4, param5, param6, param7, param8, param9}, serial(ser)
1236{
1237}
1238function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7, const ex & param8, const ex & param9, const ex & param10)
1239 : exprseq{param1, param2, param3, param4, param5, param6, param7, param8, param9, param10}, serial(ser)
1240{
1241}
1242function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7, const ex & param8, const ex & param9, const ex & param10, const ex & param11)
1243 : exprseq{param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11}, serial(ser)
1244{
1245}
1246function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7, const ex & param8, const ex & param9, const ex & param10, const ex & param11, const ex & param12)
1247 : exprseq{param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12}, serial(ser)
1248{
1249}
1250function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7, const ex & param8, const ex & param9, const ex & param10, const ex & param11, const ex & param12, const ex & param13)
1251 : exprseq{param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13}, serial(ser)
1252{
1253}
1254function::function(unsigned ser, const ex & param1, const ex & param2, const ex & param3, const ex & param4, const ex & param5, const ex & param6, const ex & param7, const ex & param8, const ex & param9, const ex & param10, const ex & param11, const ex & param12, const ex & param13, const ex & param14)
1255 : exprseq{param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14}, serial(ser)
1256{
1257}
1258
1259function::function(unsigned ser, const exprseq & es) : exprseq(es), serial(ser)
1260{
1261
1262 // Force re-evaluation even if the exprseq was already evaluated
1263 // (the exprseq copy constructor copies the flags)
1265}
1266
1267function::function(unsigned ser, const exvector & v)
1268 : exprseq(v), serial(ser)
1269{
1270}
1271
1272function::function(unsigned ser, exvector && v)
1273 : exprseq(std::move(v)), serial(ser)
1274{
1275}
1276
1278// archiving
1280
1283{
1284 inherited::read_archive(n, sym_lst);
1285 // Find serial number by function name and number of parameters
1286 unsigned np = seq.size();
1287 std::string s;
1288 if (n.find_string("name", s)) {
1289 unsigned int ser = 0;
1290 for (auto & it : registered_functions()) {
1291 if (s == it.name && np == registered_functions()[ser].nparams) {
1292 serial = ser;
1293 return;
1294 }
1295 ++ser;
1296 }
1297 throw (std::runtime_error("unknown function '" + s +
1298 "' with " + std::to_string(np) + " parameters in archive"));
1299 } else
1300 throw (std::runtime_error("unnamed function in archive"));
1301}
1302
1305{
1306 inherited::archive(n);
1308 n.add_string("name", registered_functions()[serial].name);
1309}
1310
1312
1314// functions overriding virtual functions from base classes
1316
1317// public
1318
1319void function::print(const print_context & c, unsigned level) const
1320{
1323 const std::vector<print_funcp> &pdt = opt.print_dispatch_table;
1324
1325 // Dynamically dispatch on print_context type
1326 const print_context_class_info *pc_info = &c.get_class_info();
1327
1328next_context:
1329 unsigned id = pc_info->options.get_id();
1330 if (id >= pdt.size() || pdt[id] == nullptr) {
1331
1332 // Method not found, try parent print_context class
1333 const print_context_class_info *parent_pc_info = pc_info->get_parent();
1334 if (parent_pc_info) {
1335 pc_info = parent_pc_info;
1336 goto next_context;
1337 }
1338
1339 // Method still not found, use default output
1340 if (is_a<print_tree>(c)) {
1341
1342 c.s << std::string(level, ' ') << class_name() << " "
1343 << opt.name << " @" << this
1344 << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec
1345 << ", nops=" << nops()
1346 << std::endl;
1347 unsigned delta_indent = static_cast<const print_tree &>(c).delta_indent;
1348 for (size_t i=0; i<seq.size(); ++i)
1349 seq[i].print(c, level + delta_indent);
1350 c.s << std::string(level + delta_indent, ' ') << "=====" << std::endl;
1351
1352 } else if (is_a<print_csrc>(c)) {
1353
1354 // Print function name in lowercase
1355 std::string lname = opt.name;
1356 size_t num = lname.size();
1357 for (size_t i=0; i<num; i++)
1358 lname[i] = tolower(lname[i]);
1359 c.s << lname;
1360 printseq(c, '(', ',', ')', exprseq::precedence(), function::precedence());
1361
1362 } else if (is_a<print_latex>(c)) {
1363 c.s << opt.TeX_name;
1364 printseq(c, '(', ',', ')', exprseq::precedence(), function::precedence());
1365 } else {
1366 c.s << opt.name;
1367 printseq(c, '(', ',', ')', exprseq::precedence(), function::precedence());
1368 }
1369
1370 } else {
1371
1372 // Method found, call it
1375 ((print_funcp_exvector)pdt[id])(seq, c);
1376 else switch (opt.nparams) {
1377 // the following lines have been generated for max. 14 parameters
1378 case 1:
1379 ((print_funcp_1)(pdt[id]))(seq[0], c);
1380 break;
1381 case 2:
1382 ((print_funcp_2)(pdt[id]))(seq[0], seq[1], c);
1383 break;
1384 case 3:
1385 ((print_funcp_3)(pdt[id]))(seq[0], seq[1], seq[2], c);
1386 break;
1387 case 4:
1388 ((print_funcp_4)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], c);
1389 break;
1390 case 5:
1391 ((print_funcp_5)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], c);
1392 break;
1393 case 6:
1394 ((print_funcp_6)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], c);
1395 break;
1396 case 7:
1397 ((print_funcp_7)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], c);
1398 break;
1399 case 8:
1400 ((print_funcp_8)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], c);
1401 break;
1402 case 9:
1403 ((print_funcp_9)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], c);
1404 break;
1405 case 10:
1406 ((print_funcp_10)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], c);
1407 break;
1408 case 11:
1409 ((print_funcp_11)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], c);
1410 break;
1411 case 12:
1412 ((print_funcp_12)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], c);
1413 break;
1414 case 13:
1415 ((print_funcp_13)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], c);
1416 break;
1417 case 14:
1418 ((print_funcp_14)(pdt[id]))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13], c);
1419 break;
1420 // end of generated lines
1421 default:
1422 throw(std::logic_error("function::print(): invalid nparams"));
1423 }
1424 }
1425}
1426
1428{
1430 return *this;
1431 }
1432
1435
1436 // Canonicalize argument order according to the symmetry properties
1437 if (seq.size() > 1 && !(opt.symtree.is_zero())) {
1438 exvector v = seq;
1439 GINAC_ASSERT(is_a<symmetry>(opt.symtree));
1440 int sig = canonicalize(v.begin(), ex_to<symmetry>(opt.symtree));
1441 if (sig != std::numeric_limits<int>::max()) {
1442 // Something has changed while sorting arguments, more evaluations later
1443 if (sig == 0)
1444 return _ex0;
1445 return ex(sig) * thiscontainer(std::move(v));
1446 }
1447 }
1448
1449 if (opt.eval_f==nullptr) {
1450 return this->hold();
1451 }
1452
1453 bool use_remember = opt.use_remember;
1454 ex eval_result;
1455 if (use_remember && lookup_remember_table(eval_result)) {
1456 return eval_result;
1457 }
1459 if (opt.eval_use_exvector_args)
1460 eval_result = ((eval_funcp_exvector)(opt.eval_f))(seq);
1461 else
1462 switch (opt.nparams) {
1463 // the following lines have been generated for max. 14 parameters
1464 case 1:
1465 eval_result = ((eval_funcp_1)(opt.eval_f))(seq[0]);
1466 break;
1467 case 2:
1468 eval_result = ((eval_funcp_2)(opt.eval_f))(seq[0], seq[1]);
1469 break;
1470 case 3:
1471 eval_result = ((eval_funcp_3)(opt.eval_f))(seq[0], seq[1], seq[2]);
1472 break;
1473 case 4:
1474 eval_result = ((eval_funcp_4)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3]);
1475 break;
1476 case 5:
1477 eval_result = ((eval_funcp_5)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4]);
1478 break;
1479 case 6:
1480 eval_result = ((eval_funcp_6)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5]);
1481 break;
1482 case 7:
1483 eval_result = ((eval_funcp_7)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6]);
1484 break;
1485 case 8:
1486 eval_result = ((eval_funcp_8)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7]);
1487 break;
1488 case 9:
1489 eval_result = ((eval_funcp_9)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8]);
1490 break;
1491 case 10:
1492 eval_result = ((eval_funcp_10)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9]);
1493 break;
1494 case 11:
1495 eval_result = ((eval_funcp_11)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10]);
1496 break;
1497 case 12:
1498 eval_result = ((eval_funcp_12)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11]);
1499 break;
1500 case 13:
1501 eval_result = ((eval_funcp_13)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12]);
1502 break;
1503 case 14:
1504 eval_result = ((eval_funcp_14)(opt.eval_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13]);
1505 break;
1506 // end of generated lines
1507 default:
1508 throw(std::logic_error("function::eval(): invalid nparams"));
1509 }
1510 if (use_remember) {
1511 store_remember_table(eval_result);
1512 }
1513 return eval_result;
1514}
1515
1517{
1520
1521 // Evaluate children first
1522 exvector eseq;
1523 if (!opt.evalf_params_first)
1524 eseq = seq;
1525 else {
1526 eseq.reserve(seq.size());
1527 for (auto & it : seq) {
1528 eseq.push_back(it.evalf());
1529 }
1530 }
1531
1532 if (opt.evalf_f==nullptr) {
1533 return function(serial,eseq).hold();
1534 }
1537 return ((evalf_funcp_exvector)(opt.evalf_f))(eseq);
1538 switch (opt.nparams) {
1539 // the following lines have been generated for max. 14 parameters
1540 case 1:
1541 return ((evalf_funcp_1)(opt.evalf_f))(eseq[0]);
1542 case 2:
1543 return ((evalf_funcp_2)(opt.evalf_f))(eseq[0], eseq[1]);
1544 case 3:
1545 return ((evalf_funcp_3)(opt.evalf_f))(eseq[0], eseq[1], eseq[2]);
1546 case 4:
1547 return ((evalf_funcp_4)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3]);
1548 case 5:
1549 return ((evalf_funcp_5)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4]);
1550 case 6:
1551 return ((evalf_funcp_6)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5]);
1552 case 7:
1553 return ((evalf_funcp_7)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6]);
1554 case 8:
1555 return ((evalf_funcp_8)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6], eseq[7]);
1556 case 9:
1557 return ((evalf_funcp_9)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6], eseq[7], eseq[8]);
1558 case 10:
1559 return ((evalf_funcp_10)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6], eseq[7], eseq[8], eseq[9]);
1560 case 11:
1561 return ((evalf_funcp_11)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6], eseq[7], eseq[8], eseq[9], eseq[10]);
1562 case 12:
1563 return ((evalf_funcp_12)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6], eseq[7], eseq[8], eseq[9], eseq[10], eseq[11]);
1564 case 13:
1565 return ((evalf_funcp_13)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6], eseq[7], eseq[8], eseq[9], eseq[10], eseq[11], eseq[12]);
1566 case 14:
1567 return ((evalf_funcp_14)(opt.evalf_f))(eseq[0], eseq[1], eseq[2], eseq[3], eseq[4], eseq[5], eseq[6], eseq[7], eseq[8], eseq[9], eseq[10], eseq[11], eseq[12], eseq[13]);
1568 // end of generated lines
1569 }
1570 throw(std::logic_error("function::evalf(): invalid nparams"));
1571}
1572
1577{
1578 // If this function is called then the list of arguments is non-empty
1579 // and the first argument is non-commutative, see function::return_type()
1580 return seq.begin()->eval_ncmul(v);
1581}
1582
1583unsigned function::calchash() const
1584{
1585 unsigned v = golden_ratio_hash(make_hash_seed(typeid(*this)) ^ serial);
1586 for (size_t i=0; i<nops(); i++) {
1587 v = rotate_left(v);
1588 v ^= this->op(i).gethash();
1589 }
1590
1593 hashvalue = v;
1594 }
1595 return v;
1596}
1597
1599{
1600 return function(serial, v);
1601}
1602
1604{
1605 return function(serial, std::move(v));
1606}
1607
1610ex function::series(const relational & r, int order, unsigned options) const
1611{
1614
1615 if (opt.series_f==nullptr) {
1616 return basic::series(r, order);
1617 }
1618 ex res;
1620 if (opt.series_use_exvector_args) {
1621 try {
1622 res = ((series_funcp_exvector)(opt.series_f))(seq, r, order, options);
1623 } catch (do_taylor) {
1624 res = basic::series(r, order, options);
1625 }
1626 return res;
1627 }
1628 switch (opt.nparams) {
1629 // the following lines have been generated for max. 14 parameters
1630 case 1:
1631 try {
1632 res = ((series_funcp_1)(opt.series_f))(seq[0], r, order, options);
1633 } catch (do_taylor) {
1634 res = basic::series(r, order, options);
1635 }
1636 return res;
1637 case 2:
1638 try {
1639 res = ((series_funcp_2)(opt.series_f))(seq[0], seq[1], r, order, options);
1640 } catch (do_taylor) {
1641 res = basic::series(r, order, options);
1642 }
1643 return res;
1644 case 3:
1645 try {
1646 res = ((series_funcp_3)(opt.series_f))(seq[0], seq[1], seq[2], r, order, options);
1647 } catch (do_taylor) {
1648 res = basic::series(r, order, options);
1649 }
1650 return res;
1651 case 4:
1652 try {
1653 res = ((series_funcp_4)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], r, order, options);
1654 } catch (do_taylor) {
1655 res = basic::series(r, order, options);
1656 }
1657 return res;
1658 case 5:
1659 try {
1660 res = ((series_funcp_5)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], r, order, options);
1661 } catch (do_taylor) {
1662 res = basic::series(r, order, options);
1663 }
1664 return res;
1665 case 6:
1666 try {
1667 res = ((series_funcp_6)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], r, order, options);
1668 } catch (do_taylor) {
1669 res = basic::series(r, order, options);
1670 }
1671 return res;
1672 case 7:
1673 try {
1674 res = ((series_funcp_7)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], r, order, options);
1675 } catch (do_taylor) {
1676 res = basic::series(r, order, options);
1677 }
1678 return res;
1679 case 8:
1680 try {
1681 res = ((series_funcp_8)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], r, order, options);
1682 } catch (do_taylor) {
1683 res = basic::series(r, order, options);
1684 }
1685 return res;
1686 case 9:
1687 try {
1688 res = ((series_funcp_9)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], r, order, options);
1689 } catch (do_taylor) {
1690 res = basic::series(r, order, options);
1691 }
1692 return res;
1693 case 10:
1694 try {
1695 res = ((series_funcp_10)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], r, order, options);
1696 } catch (do_taylor) {
1697 res = basic::series(r, order, options);
1698 }
1699 return res;
1700 case 11:
1701 try {
1702 res = ((series_funcp_11)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], r, order, options);
1703 } catch (do_taylor) {
1704 res = basic::series(r, order, options);
1705 }
1706 return res;
1707 case 12:
1708 try {
1709 res = ((series_funcp_12)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], r, order, options);
1710 } catch (do_taylor) {
1711 res = basic::series(r, order, options);
1712 }
1713 return res;
1714 case 13:
1715 try {
1716 res = ((series_funcp_13)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], r, order, options);
1717 } catch (do_taylor) {
1718 res = basic::series(r, order, options);
1719 }
1720 return res;
1721 case 14:
1722 try {
1723 res = ((series_funcp_14)(opt.series_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13], r, order, options);
1724 } catch (do_taylor) {
1725 res = basic::series(r, order, options);
1726 }
1727 return res;
1728 // end of generated lines
1729 }
1730 throw(std::logic_error("function::series(): invalid nparams"));
1731}
1732
1735{
1738
1739 if (opt.conjugate_f==nullptr) {
1740 return conjugate_function(*this).hold();
1741 }
1742
1744 return ((conjugate_funcp_exvector)(opt.conjugate_f))(seq);
1745 }
1746
1747 switch (opt.nparams) {
1748 // the following lines have been generated for max. 14 parameters
1749 case 1:
1750 return ((conjugate_funcp_1)(opt.conjugate_f))(seq[0]);
1751 case 2:
1752 return ((conjugate_funcp_2)(opt.conjugate_f))(seq[0], seq[1]);
1753 case 3:
1754 return ((conjugate_funcp_3)(opt.conjugate_f))(seq[0], seq[1], seq[2]);
1755 case 4:
1756 return ((conjugate_funcp_4)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3]);
1757 case 5:
1758 return ((conjugate_funcp_5)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4]);
1759 case 6:
1760 return ((conjugate_funcp_6)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5]);
1761 case 7:
1762 return ((conjugate_funcp_7)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6]);
1763 case 8:
1764 return ((conjugate_funcp_8)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7]);
1765 case 9:
1766 return ((conjugate_funcp_9)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8]);
1767 case 10:
1768 return ((conjugate_funcp_10)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9]);
1769 case 11:
1770 return ((conjugate_funcp_11)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10]);
1771 case 12:
1772 return ((conjugate_funcp_12)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11]);
1773 case 13:
1774 return ((conjugate_funcp_13)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12]);
1775 case 14:
1776 return ((conjugate_funcp_14)(opt.conjugate_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13]);
1777 // end of generated lines
1778 }
1779 throw(std::logic_error("function::conjugate(): invalid nparams"));
1780}
1781
1784{
1787
1788 if (opt.real_part_f==nullptr)
1789 return basic::real_part();
1790
1792 return ((real_part_funcp_exvector)(opt.real_part_f))(seq);
1793
1794 switch (opt.nparams) {
1795 // the following lines have been generated for max. 14 parameters
1796 case 1:
1797 return ((real_part_funcp_1)(opt.real_part_f))(seq[0]);
1798 case 2:
1799 return ((real_part_funcp_2)(opt.real_part_f))(seq[0], seq[1]);
1800 case 3:
1801 return ((real_part_funcp_3)(opt.real_part_f))(seq[0], seq[1], seq[2]);
1802 case 4:
1803 return ((real_part_funcp_4)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3]);
1804 case 5:
1805 return ((real_part_funcp_5)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4]);
1806 case 6:
1807 return ((real_part_funcp_6)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5]);
1808 case 7:
1809 return ((real_part_funcp_7)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6]);
1810 case 8:
1811 return ((real_part_funcp_8)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7]);
1812 case 9:
1813 return ((real_part_funcp_9)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8]);
1814 case 10:
1815 return ((real_part_funcp_10)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9]);
1816 case 11:
1817 return ((real_part_funcp_11)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10]);
1818 case 12:
1819 return ((real_part_funcp_12)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11]);
1820 case 13:
1821 return ((real_part_funcp_13)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12]);
1822 case 14:
1823 return ((real_part_funcp_14)(opt.real_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13]);
1824 // end of generated lines
1825 }
1826 throw(std::logic_error("function::real_part(): invalid nparams"));
1827}
1828
1831{
1834
1835 if (opt.imag_part_f==nullptr)
1836 return basic::imag_part();
1837
1839 return ((imag_part_funcp_exvector)(opt.imag_part_f))(seq);
1840
1841 switch (opt.nparams) {
1842 // the following lines have been generated for max. 14 parameters
1843 case 1:
1844 return ((imag_part_funcp_1)(opt.imag_part_f))(seq[0]);
1845 case 2:
1846 return ((imag_part_funcp_2)(opt.imag_part_f))(seq[0], seq[1]);
1847 case 3:
1848 return ((imag_part_funcp_3)(opt.imag_part_f))(seq[0], seq[1], seq[2]);
1849 case 4:
1850 return ((imag_part_funcp_4)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3]);
1851 case 5:
1852 return ((imag_part_funcp_5)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4]);
1853 case 6:
1854 return ((imag_part_funcp_6)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5]);
1855 case 7:
1856 return ((imag_part_funcp_7)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6]);
1857 case 8:
1858 return ((imag_part_funcp_8)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7]);
1859 case 9:
1860 return ((imag_part_funcp_9)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8]);
1861 case 10:
1862 return ((imag_part_funcp_10)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9]);
1863 case 11:
1864 return ((imag_part_funcp_11)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10]);
1865 case 12:
1866 return ((imag_part_funcp_12)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11]);
1867 case 13:
1868 return ((imag_part_funcp_13)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12]);
1869 case 14:
1870 return ((imag_part_funcp_14)(opt.imag_part_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13]);
1871 // end of generated lines
1872 }
1873 throw(std::logic_error("function::imag_part(): invalid nparams"));
1874}
1875
1877bool function::info(unsigned inf) const
1878{
1881
1882 if (opt.info_f==nullptr) {
1883 return basic::info(inf);
1884 }
1885
1886 if (opt.info_use_exvector_args) {
1887 return ((info_funcp_exvector)(opt.info_f))(seq, inf);
1888 }
1889
1890 switch (opt.nparams) {
1891 // the following lines have been generated for max. 14 parameters
1892 case 1:
1893 return ((info_funcp_1)(opt.info_f))(seq[0], inf);
1894 case 2:
1895 return ((info_funcp_2)(opt.info_f))(seq[0], seq[1], inf);
1896 case 3:
1897 return ((info_funcp_3)(opt.info_f))(seq[0], seq[1], seq[2], inf);
1898 case 4:
1899 return ((info_funcp_4)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], inf);
1900 case 5:
1901 return ((info_funcp_5)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], inf);
1902 case 6:
1903 return ((info_funcp_6)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], inf);
1904 case 7:
1905 return ((info_funcp_7)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], inf);
1906 case 8:
1907 return ((info_funcp_8)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], inf);
1908 case 9:
1909 return ((info_funcp_9)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], inf);
1910 case 10:
1911 return ((info_funcp_10)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], inf);
1912 case 11:
1913 return ((info_funcp_11)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], inf);
1914 case 12:
1915 return ((info_funcp_12)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], inf);
1916 case 13:
1917 return ((info_funcp_13)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], inf);
1918 case 14:
1919 return ((info_funcp_14)(opt.info_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13], inf);
1920 // end of generated lines
1921 }
1922 throw(std::logic_error("function::info(): invalid nparams"));
1923}
1924
1925// protected
1926
1931{
1932 ex result;
1933
1934 try {
1935 // Explicit derivation
1936 result = expl_derivative(s);
1937 } catch (...) {
1938 // Chain rule
1939 ex arg_diff;
1940 size_t num = seq.size();
1941 for (size_t i=0; i<num; i++) {
1942 arg_diff = seq[i].diff(s);
1943 // We apply the chain rule only when it makes sense. This is not
1944 // just for performance reasons but also to allow functions to
1945 // throw when differentiated with respect to one of its arguments
1946 // without running into trouble with our automatic full
1947 // differentiation:
1948 if (!arg_diff.is_zero())
1949 result += pderivative(i)*arg_diff;
1950 }
1951 }
1952 return result;
1953}
1954
1955int function::compare_same_type(const basic & other) const
1956{
1957 GINAC_ASSERT(is_a<function>(other));
1958 const function & o = static_cast<const function &>(other);
1959
1960 if (serial != o.serial)
1961 return serial < o.serial ? -1 : 1;
1962 else
1964}
1965
1966bool function::is_equal_same_type(const basic & other) const
1967{
1968 GINAC_ASSERT(is_a<function>(other));
1969 const function & o = static_cast<const function &>(other);
1970
1971 if (serial != o.serial)
1972 return false;
1973 else
1975}
1976
1977bool function::match_same_type(const basic & other) const
1978{
1979 GINAC_ASSERT(is_a<function>(other));
1980 const function & o = static_cast<const function &>(other);
1981
1982 return serial == o.serial;
1983}
1984
1986{
1989
1990 if (opt.use_return_type) {
1991 // Return type was explicitly specified
1992 return opt.return_type;
1993 } else {
1994 // Default behavior is to use the return type of the first
1995 // argument. Thus, exp() of a matrix behaves like a matrix, etc.
1996 if (seq.empty())
1998 else
1999 return seq.begin()->return_type();
2000 }
2001}
2002
2004{
2007
2008 if (opt.use_return_type) {
2009 // Return type was explicitly specified
2010 return opt.return_type_tinfo;
2011 } else {
2012 // Default behavior is to use the return type of the first
2013 // argument. Thus, exp() of a matrix behaves like a matrix, etc.
2014 if (seq.empty())
2015 return make_return_type_t<function>();
2016 else
2017 return seq.begin()->return_type_tinfo();
2018 }
2019}
2020
2022// new virtual functions which can be overridden by derived classes
2024
2025// none
2026
2028// non-virtual functions in this class
2030
2031// protected
2032
2033ex function::pderivative(unsigned diff_param) const // partial differentiation
2034{
2035 GINAC_ASSERT(serial<registered_functions().size());
2036 const function_options &opt = registered_functions()[serial];
2037
2038 if (opt.derivative_f) {
2039 // Invoke the defined derivative function.
2040 current_serial = serial;
2042 return ((derivative_funcp_exvector)(opt.derivative_f))(seq, diff_param);
2043 switch (opt.nparams) {
2044 // the following lines have been generated for max. 14 parameters
2045 case 1:
2046 return ((derivative_funcp_1)(opt.derivative_f))(seq[0], diff_param);
2047 case 2:
2048 return ((derivative_funcp_2)(opt.derivative_f))(seq[0], seq[1], diff_param);
2049 case 3:
2050 return ((derivative_funcp_3)(opt.derivative_f))(seq[0], seq[1], seq[2], diff_param);
2051 case 4:
2052 return ((derivative_funcp_4)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], diff_param);
2053 case 5:
2054 return ((derivative_funcp_5)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], diff_param);
2055 case 6:
2056 return ((derivative_funcp_6)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], diff_param);
2057 case 7:
2058 return ((derivative_funcp_7)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], diff_param);
2059 case 8:
2060 return ((derivative_funcp_8)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], diff_param);
2061 case 9:
2062 return ((derivative_funcp_9)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], diff_param);
2063 case 10:
2064 return ((derivative_funcp_10)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], diff_param);
2065 case 11:
2066 return ((derivative_funcp_11)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], diff_param);
2067 case 12:
2068 return ((derivative_funcp_12)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], diff_param);
2069 case 13:
2070 return ((derivative_funcp_13)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], diff_param);
2071 case 14:
2072 return ((derivative_funcp_14)(opt.derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13], diff_param);
2073 // end of generated lines
2074 }
2075 }
2076 // No derivative defined? Fall back to abstract derivative object.
2077 return fderivative(serial, diff_param, seq);
2078}
2079
2080ex function::expl_derivative(const symbol & s) const // explicit differentiation
2081{
2082 GINAC_ASSERT(serial<registered_functions().size());
2083 const function_options &opt = registered_functions()[serial];
2084
2085 if (opt.expl_derivative_f) {
2086 // Invoke the defined explicit derivative function.
2087 current_serial = serial;
2089 return ((expl_derivative_funcp_exvector)(opt.expl_derivative_f))(seq, s);
2090 switch (opt.nparams) {
2091 // the following lines have been generated for max. 14 parameters
2092 case 1:
2093 return ((expl_derivative_funcp_1)(opt.expl_derivative_f))(seq[0], s);
2094 case 2:
2095 return ((expl_derivative_funcp_2)(opt.expl_derivative_f))(seq[0], seq[1], s);
2096 case 3:
2097 return ((expl_derivative_funcp_3)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], s);
2098 case 4:
2099 return ((expl_derivative_funcp_4)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], s);
2100 case 5:
2101 return ((expl_derivative_funcp_5)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], s);
2102 case 6:
2103 return ((expl_derivative_funcp_6)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], s);
2104 case 7:
2105 return ((expl_derivative_funcp_7)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], s);
2106 case 8:
2107 return ((expl_derivative_funcp_8)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], s);
2108 case 9:
2109 return ((expl_derivative_funcp_9)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], s);
2110 case 10:
2111 return ((expl_derivative_funcp_10)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], s);
2112 case 11:
2113 return ((expl_derivative_funcp_11)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], s);
2114 case 12:
2115 return ((expl_derivative_funcp_12)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], s);
2116 case 13:
2117 return ((expl_derivative_funcp_13)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], s);
2118 case 14:
2119 return ((expl_derivative_funcp_14)(opt.expl_derivative_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13], s);
2120 // end of generated lines
2121 }
2122 }
2123 // There is no fallback for explicit derivative.
2124 throw(std::logic_error("function::expl_derivative(): explicit derivation is called, but no such function defined"));
2125}
2126
2127ex function::power(const ex & power_param) const // power of function
2128{
2129 GINAC_ASSERT(serial<registered_functions().size());
2130 const function_options &opt = registered_functions()[serial];
2131
2132 if (opt.power_f) {
2133 // Invoke the defined power function.
2134 current_serial = serial;
2136 return ((power_funcp_exvector)(opt.power_f))(seq, power_param);
2137 switch (opt.nparams) {
2138 // the following lines have been generated for max. 14 parameters
2139 case 1:
2140 return ((power_funcp_1)(opt.power_f))(seq[0], power_param);
2141 case 2:
2142 return ((power_funcp_2)(opt.power_f))(seq[0], seq[1], power_param);
2143 case 3:
2144 return ((power_funcp_3)(opt.power_f))(seq[0], seq[1], seq[2], power_param);
2145 case 4:
2146 return ((power_funcp_4)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], power_param);
2147 case 5:
2148 return ((power_funcp_5)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], power_param);
2149 case 6:
2150 return ((power_funcp_6)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], power_param);
2151 case 7:
2152 return ((power_funcp_7)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], power_param);
2153 case 8:
2154 return ((power_funcp_8)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], power_param);
2155 case 9:
2156 return ((power_funcp_9)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], power_param);
2157 case 10:
2158 return ((power_funcp_10)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], power_param);
2159 case 11:
2160 return ((power_funcp_11)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], power_param);
2161 case 12:
2162 return ((power_funcp_12)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], power_param);
2163 case 13:
2164 return ((power_funcp_13)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], power_param);
2165 case 14:
2166 return ((power_funcp_14)(opt.power_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13], power_param);
2167 // end of generated lines
2168 }
2169 }
2170 // No power function defined? Fall back to returning a power object.
2171 return dynallocate<GiNaC::power>(*this, power_param).setflag(status_flags::evaluated);
2172}
2173
2175{
2178
2179 if (opt.expand_f) {
2180 // Invoke the defined expand function.
2183 return ((expand_funcp_exvector)(opt.expand_f))(seq, options);
2184 switch (opt.nparams) {
2185 // the following lines have been generated for max. 14 parameters
2186 case 1:
2187 return ((expand_funcp_1)(opt.expand_f))(seq[0], options);
2188 case 2:
2189 return ((expand_funcp_2)(opt.expand_f))(seq[0], seq[1], options);
2190 case 3:
2191 return ((expand_funcp_3)(opt.expand_f))(seq[0], seq[1], seq[2], options);
2192 case 4:
2193 return ((expand_funcp_4)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], options);
2194 case 5:
2195 return ((expand_funcp_5)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], options);
2196 case 6:
2197 return ((expand_funcp_6)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], options);
2198 case 7:
2199 return ((expand_funcp_7)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], options);
2200 case 8:
2201 return ((expand_funcp_8)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], options);
2202 case 9:
2203 return ((expand_funcp_9)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], options);
2204 case 10:
2205 return ((expand_funcp_10)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], options);
2206 case 11:
2207 return ((expand_funcp_11)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], options);
2208 case 12:
2209 return ((expand_funcp_12)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], options);
2210 case 13:
2211 return ((expand_funcp_13)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], options);
2212 case 14:
2213 return ((expand_funcp_14)(opt.expand_f))(seq[0], seq[1], seq[2], seq[3], seq[4], seq[5], seq[6], seq[7], seq[8], seq[9], seq[10], seq[11], seq[12], seq[13], options);
2214 // end of generated lines
2215 }
2216 }
2217 // No expand function defined? Return the same function with expanded arguments (if required)
2219 return inherited::expand(options);
2220 else
2221 return (options == 0) ? setflag(status_flags::expanded) : *this;
2222}
2223
2224std::vector<function_options> & function::registered_functions()
2225{
2226 static std::vector<function_options> rf = std::vector<function_options>();
2227 return rf;
2228}
2229
2231{
2232 return remember_table::remember_tables()[this->serial].lookup_entry(*this,result);
2233}
2234
2235void function::store_remember_table(ex const & result) const
2236{
2237 remember_table::remember_tables()[this->serial].add_entry(*this,result);
2238}
2239
2240// public
2241
2243{
2244 size_t same_name = 0;
2245 for (auto & i : registered_functions()) {
2246 if (i.name==opt.name) {
2247 ++same_name;
2248 }
2249 }
2250 if (same_name>=opt.functions_with_same_name) {
2251 // we do not throw an exception here because this code is
2252 // usually executed before main(), so the exception could not
2253 // caught anyhow
2254 std::cerr << "WARNING: function name " << opt.name
2255 << " already in use!" << std::endl;
2256 }
2257 registered_functions().push_back(opt);
2258 if (opt.use_remember) {
2260 push_back(remember_table(opt.remember_size,
2262 opt.remember_strategy));
2263 } else {
2265 }
2266 return registered_functions().size()-1;
2267}
2268
2271unsigned function::find_function(const std::string &name, unsigned nparams)
2272{
2273 unsigned serial = 0;
2274 for (auto & it : function::registered_functions()) {
2275 if (it.get_name() == name && it.get_nparams() == nparams)
2276 return serial;
2277 ++serial;
2278 }
2279 throw (std::runtime_error("no function '" + name + "' with " + std::to_string(nparams) + " parameters defined"));
2280}
2281
2283std::string function::get_name() const
2284{
2286 return registered_functions()[serial].name;
2287}
2288
2289} // namespace GiNaC
2290
Archiving of GiNaC expressions.
#define GINAC_ASSERT(X)
Assertion macro for checking invariances.
Definition assertion.h:32
This class stores all properties needed to record/retrieve the state of one object of class basic (or...
Definition archive.h:48
This class is the ABC (abstract base class) of GiNaC's class hierarchy.
Definition basic.h:104
const basic & clearflag(unsigned f) const
Clear some status_flags.
Definition basic.h:290
virtual ex imag_part() const
Definition basic.cpp:680
const basic & setflag(unsigned f) const
Set some status_flags.
Definition basic.h:287
virtual bool info(unsigned inf) const
Information about the object.
Definition basic.cpp:221
unsigned hashvalue
hash value
Definition basic.h:302
unsigned flags
of type status_flags
Definition basic.h:301
const basic & hold() const
Stop further evaluation.
Definition basic.cpp:886
virtual ex series(const relational &r, int order, unsigned options=0) const
Default implementation of ex::series().
Definition pseries.cpp:610
virtual ex real_part() const
Definition basic.cpp:675
virtual int compare_same_type(const basic &other) const
Returns order relation between two objects of same type.
Definition basic.cpp:718
class_info * get_parent() const
Get pointer to class_info of parent class (or nullptr).
Definition class_info.h:49
Wrapper template for making GiNaC classes out of STL containers.
Definition container.h:72
bool is_equal_same_type(const basic &other) const override
Returns true if two objects of same type are equal.
Definition container.h:361
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:450
size_t nops() const override
Number of operands/members.
Definition container.h:117
ex op(size_t i) const override
Return operand/member at position i.
Definition container.h:294
unsigned precedence() const override
Return relative operator precedence (for parenthezing output).
Definition container.h:116
Exception class thrown by classes which provide their own series expansion to signal that ordinary Ta...
Definition function.h:667
Lightweight wrapper for GiNaC's symbolic objects.
Definition ex.h:72
unsigned gethash() const
Definition ex.h:233
const_iterator begin() const noexcept
Definition ex.h:662
ex diff(const symbol &s, unsigned nth=1) const
Compute partial derivative of an expression.
Definition ex.cpp:86
bool is_zero() const
Definition ex.h:213
@ expand_function_args
expands the arguments of functions
Definition flags.h:32
This class represents the (abstract) derivative of a symbolic function.
Definition fderivative.h:37
function_options & info_func(info_funcp_1 e)
Definition function.cpp:959
function_options & overloaded(unsigned o)
function_options & set_name(std::string const &n, std::string const &tn=std::string())
Definition function.cpp:101
function_options & set_symmetry(const symmetry &s)
expl_derivative_funcp expl_derivative_f
Definition function.h:629
std::vector< print_funcp > print_dispatch_table
Definition function.h:632
unsigned functions_with_same_name
Definition function.h:659
conjugate_funcp conjugate_f
Definition function.h:624
function_options & set_return_type(unsigned rt, const return_type_t *rtt=nullptr)
function_options & remember(unsigned size, unsigned assoc_size=0, unsigned strategy=remember_strategies::delete_never)
function_options & eval_func(eval_funcp_1 e)
Definition function.cpp:119
function_options & power_func(power_funcp_1 e)
Definition function.cpp:791
unsigned remember_assoc_size
Definition function.h:643
function_options & evalf_func(evalf_funcp_1 e)
Definition function.cpp:203
function_options & conjugate_func(conjugate_funcp_1 e)
Definition function.cpp:287
function_options & real_part_func(real_part_funcp_1 e)
Definition function.cpp:371
function_options & print_func(print_funcp_1 p)
Definition function.h:508
return_type_t return_type_tinfo
Definition function.h:639
void test_and_set_nparams(unsigned n)
imag_part_funcp imag_part_f
Definition function.h:626
void set_print_func(unsigned id, print_funcp f)
real_part_funcp real_part_f
Definition function.h:625
function_options & expand_func(expand_funcp_1 e)
Definition function.cpp:539
series_funcp series_f
Definition function.h:631
function_options & expl_derivative_func(expl_derivative_funcp_1 e)
Definition function.cpp:707
function_options & do_not_evalf_params()
bool expl_derivative_use_exvector_args
Definition function.h:653
function_options & latex_name(std::string const &tn)
Definition function.cpp:112
derivative_funcp derivative_f
Definition function.h:628
function_options & series_func(series_funcp_1 e)
Definition function.cpp:875
function_options & imag_part_func(imag_part_funcp_1 e)
Definition function.cpp:455
expand_funcp expand_f
Definition function.h:627
function_options & derivative_func(derivative_funcp_1 e)
Definition function.cpp:623
The class function is used to implement builtin functions like sin, cos... and user defined functions...
Definition function.h:673
bool match_same_type(const basic &other) const override
Returns true if the attributes of two objects are similar enough for a match.
unsigned calchash() const override
Compute the hash value of an object and if it makes sense to store it in the objects status_flags,...
return_type_t return_type_tinfo() const override
void store_remember_table(ex const &result) const
ex imag_part() const override
Implementation of ex::imag_part for functions.
ex evalf() const override
Evaluate object numerically.
ex eval_ncmul(const exvector &v) const override
This method is defined to be in line with behavior of function::return_type()
ex power(const ex &exp) const
ex derivative(const symbol &s) const override
Implementation of ex::diff() for functions.
ex thiscontainer(const exvector &v) const override
bool is_equal_same_type(const basic &other) const override
Returns true if two objects of same type are equal.
bool info(unsigned inf) const override
Implementation of ex::info for functions.
std::string get_name() const
Return the print name of the function.
static unsigned register_new(function_options const &opt)
unsigned serial
Definition function.h:750
bool lookup_remember_table(ex &result) const
static unsigned find_function(const std::string &name, unsigned nparams)
Find serial number of function by name and number of parameters.
ex series(const relational &r, int order, unsigned options=0) const override
Implementation of ex::series for functions.
static std::vector< function_options > & registered_functions()
ex eval() const override
Perform automatic non-interruptive term rewriting rules.
ex real_part() const override
Implementation of ex::real_part for functions.
static unsigned current_serial
This can be used as a hook for external applications.
Definition function.h:741
ex conjugate() const override
Implementation of ex::conjugate for functions.
ex expl_derivative(const symbol &s) const
void print(const print_context &c, unsigned level=0) const override
Output to stream.
void read_archive(const archive_node &n, lst &syms) override
Construct object from archive_node.
ex expand(unsigned options=0) const override
Expand expression, i.e.
unsigned precedence() const override
Return relative operator precedence (for parenthezing output).
Definition function.h:706
unsigned return_type() const override
function(unsigned ser)
void archive(archive_node &n) const override
Archive the object.
ex pderivative(unsigned diff_param) const
Base class for print_contexts.
Definition print.h:101
std::ostream & s
stream to output to
Definition print.h:107
Context for tree-like output for debugging.
Definition print.h:145
This class holds a relation consisting of two expressions and a logical relation between them.
Definition relational.h:34
The remember table is organized like an n-fold associative cache in a microprocessor.
Definition remember.h:82
static std::vector< remember_table > & remember_tables()
Definition remember.cpp:183
@ expanded
.expand(0) has already done its job (other expand() options ignore this flag)
Definition flags.h:203
@ evaluated
.eval() has already done its job
Definition flags.h:202
@ hash_calculated
.calchash() has already done its job
Definition flags.h:204
Basic CAS symbol.
Definition symbol.h:38
This class describes the symmetry of a group of indices.
Definition symmetry.h:38
Interface to GiNaC's light-weight expression handles.
unsigned options
Definition factor.cpp:2473
size_t n
Definition factor.cpp:1431
size_t c
Definition factor.cpp:756
size_t r
Definition factor.cpp:756
Interface to abstract derivatives of functions.
Interface to class of symbolic functions.
Type-specific hash seed.
Interface to GiNaC's initially known functions.
Definition of GiNaC's lst.
Definition add.cpp:35
ex(* evalf_funcp_3)(const ex &, const ex &, const ex &)
Definition function.h:167
ex(* eval_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:214
ex(* expand_funcp_4)(const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:183
ex(* conjugate_funcp_3)(const ex &, const ex &, const ex &)
Definition function.h:168
void(* print_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:200
ex(* power_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:198
ex(* series_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:211
void(* print_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:260
ex(* series_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:247
bool(* info_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:309
ex(* expl_derivative_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:281
ex(* power_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:210
ex(* expand_funcp_exvector)(const exvector &, unsigned)
Definition function.h:319
ex(* derivative_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:256
ex(* imag_part_funcp_1)(const ex &)
Definition function.h:146
ex(* real_part_funcp_4)(const ex &, const ex &, const ex &, const ex &)
Definition function.h:181
unsigned golden_ratio_hash(uintptr_t n)
Truncated multiplication with golden ratio, for computing hash values.
Definition utils.h:67
ex(* eval_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:262
ex(* derivative_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:292
ex(* series_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:223
bool(* info_funcp_3)(const ex &, const ex &, const ex &, unsigned)
Definition function.h:177
ex(* eval_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:226
bool(* info_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:201
ex(* eval_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:250
void(* print_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:212
ex(* expl_derivative_funcp_4)(const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:185
ex(* power_funcp_4)(const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:186
ex(* eval_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:190
ex(* conjugate_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:288
ex(* expand_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:231
ex(* conjugate_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:264
ex(* conjugate_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:216
ex(* power_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:306
ex(* evalf_funcp_1)(const ex &)
Definition function.h:143
ex(* imag_part_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:290
bool(* info_funcp_2)(const ex &, const ex &, unsigned)
Definition function.h:165
ex(* power_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:234
bool(* info_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:249
ex(* expl_derivative_funcp_1)(const ex &, const symbol &)
Definition function.h:149
void(* print_funcp)()
Definition function.h:138
ex(* conjugate_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:228
ex(* conjugate_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:192
ex(* eval_funcp_1)(const ex &)
Definition function.h:142
bool(* info_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:213
bool(* info_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:297
bool(* info_funcp_exvector)(const exvector &, unsigned)
Definition function.h:325
void(* print_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:224
ex(* evalf_funcp)()
Definition function.h:129
ex(* expl_derivative_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:305
ex(* imag_part_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:302
ex(* power_funcp_1)(const ex &, const ex &)
Definition function.h:150
ex(* evalf_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:191
ex(* eval_funcp_4)(const ex &, const ex &, const ex &, const ex &)
Definition function.h:178
ex(* expand_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:267
ex(* power_funcp_2)(const ex &, const ex &, const ex &)
Definition function.h:162
ex(* imag_part_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:218
ex(* imag_part_funcp)()
Definition function.h:132
ex(* expand_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:219
bool(* info_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:261
ex(* series_funcp_2)(const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:163
ex(* real_part_funcp_2)(const ex &, const ex &)
Definition function.h:157
ex(* real_part_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:301
ex(* series_funcp)()
Definition function.h:137
ex(* derivative_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:220
ex(* real_part_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:241
ex(* imag_part_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:194
ex(* eval_funcp_exvector)(const exvector &)
Definition function.h:314
bool(* info_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:225
ex(* expl_derivative_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:221
ex(* derivative_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:232
ex(* real_part_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:289
ex(* expl_derivative_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:233
ex(* real_part_funcp_exvector)(const exvector &)
Definition function.h:317
ex(* series_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:271
ex(* expl_derivative_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:197
bool(* info_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:237
ex(* series_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:259
ex(* imag_part_funcp_4)(const ex &, const ex &, const ex &, const ex &)
Definition function.h:182
ex(* eval_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:298
ex(* derivative_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:280
ex(* imag_part_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:254
ex(* evalf_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:299
ex(* real_part_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:217
ex(* real_part_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:265
ex(* derivative_funcp_3)(const ex &, const ex &, const ex &, unsigned)
Definition function.h:172
ex(* evalf_funcp_2)(const ex &, const ex &)
Definition function.h:155
ex(* series_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:283
ex(* conjugate_funcp_4)(const ex &, const ex &, const ex &, const ex &)
Definition function.h:180
ex(* expand_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:279
ex(* expand_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:303
ex(* expand_funcp_2)(const ex &, const ex &, unsigned)
Definition function.h:159
ex(* eval_funcp_3)(const ex &, const ex &, const ex &)
Definition function.h:166
ex(* expand_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:255
ex(* real_part_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:205
ex(* real_part_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:277
ex(* real_part_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:253
void(* print_funcp_exvector)(const exvector &, const print_context &)
Definition function.h:324
ex(* expl_derivative_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:269
ex(* evalf_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:275
ex(* derivative_funcp_exvector)(const exvector &, unsigned)
Definition function.h:320
ex(* evalf_funcp_4)(const ex &, const ex &, const ex &, const ex &)
Definition function.h:179
ex(* real_part_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:229
ex(* power_funcp)()
Definition function.h:136
ex(* evalf_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:239
void(* print_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:308
ex(* conjugate_funcp_2)(const ex &, const ex &)
Definition function.h:156
ex(* power_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:258
ex(* expl_derivative_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:209
ex(* imag_part_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:266
ex(* expl_derivative_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:257
ex(* power_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:222
ex(* expl_derivative_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:293
void(* print_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:296
ex(* power_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:270
bool(* info_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:285
ex(* expand_funcp)()
Definition function.h:133
ex(* series_funcp_1)(const ex &, const relational &, int, unsigned)
Definition function.h:151
void(* print_funcp_1)(const ex &, const print_context &)
Definition function.h:152
ex(* imag_part_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:206
ex(* derivative_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:304
ex(* imag_part_funcp_exvector)(const exvector &)
Definition function.h:318
bool(* info_funcp_4)(const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:189
bool(* info_funcp_1)(const ex &, unsigned)
Definition function.h:153
void(* print_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:236
ex(* eval_funcp_2)(const ex &, const ex &)
Definition function.h:154
ex(* expl_derivative_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const symbol &)
Definition function.h:245
ex(* derivative_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:208
ex(* series_funcp_3)(const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:175
ex(* conjugate_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:240
static unsigned make_hash_seed(const std::type_info &tinfo)
We need a hash function which gives different values for objects of different types.
Definition hash_seed.h:36
unsigned rotate_left(unsigned n)
Rotate bits of unsigned value by one bit to the left.
Definition utils.h:47
ex(* imag_part_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:242
void(* print_funcp_2)(const ex &, const ex &, const print_context &)
Definition function.h:164
ex(* expand_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:243
ex(* derivative_funcp_2)(const ex &, const ex &, unsigned)
Definition function.h:160
ex(* expand_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:291
ex(* conjugate_funcp_exvector)(const exvector &)
Definition function.h:316
ex(* series_funcp_4)(const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:187
ex(* real_part_funcp_1)(const ex &)
Definition function.h:145
ex(* evalf_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:251
ex(* conjugate_funcp_1)(const ex &)
Definition function.h:144
ex(* imag_part_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:278
ex(* expand_funcp_3)(const ex &, const ex &, const ex &, unsigned)
Definition function.h:171
ex(* series_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:235
ex(* evalf_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:203
ex(* conjugate_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:204
bool(* info_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:273
ex(* eval_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:238
void(* print_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:272
ex(* evalf_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:287
ex(* imag_part_funcp_3)(const ex &, const ex &, const ex &)
Definition function.h:170
ex(* imag_part_funcp_2)(const ex &, const ex &)
Definition function.h:158
ex(* evalf_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:263
bool(* info_funcp)()
Definition function.h:139
ex(* eval_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:286
ex(* series_funcp_exvector)(const exvector &, const relational &, int, unsigned)
Definition function.h:323
ex(* real_part_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:193
ex(* derivative_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:244
ex(* derivative_funcp)()
Definition function.h:134
int canonicalize(exvector::iterator v, const symmetry &symm)
Canonicalize the order of elements of an expression vector, according to the symmetry properties defi...
Definition symmetry.cpp:436
ex(* power_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:246
ex(* expl_derivative_funcp_exvector)(const exvector &, const symbol &)
Definition function.h:321
ex(* series_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:307
ex(* conjugate_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:276
ex(* evalf_funcp_exvector)(const exvector &)
Definition function.h:315
ex(* series_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:199
ex(* conjugate_funcp_14)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:300
ex(* conjugate_funcp_10)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:252
ex(* power_funcp_exvector)(const exvector &, const ex &)
Definition function.h:322
ex(* expl_derivative_funcp)()
Definition function.h:135
ex(* power_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:282
ex(* derivative_funcp_1)(const ex &, unsigned)
Definition function.h:148
ex(* expl_derivative_funcp_2)(const ex &, const ex &, const symbol &)
Definition function.h:161
ex(* eval_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:202
ex(* expand_funcp_1)(const ex &, unsigned)
Definition function.h:147
void(* print_funcp_3)(const ex &, const ex &, const ex &, const print_context &)
Definition function.h:176
ex(* derivative_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:196
void(* print_funcp_9)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:248
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:41
ex(* expand_funcp_6)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:207
void(* print_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:284
void(* print_funcp_4)(const ex &, const ex &, const ex &, const ex &, const print_context &)
Definition function.h:188
ex(* eval_funcp)()
Definition function.h:128
ex(* imag_part_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:230
ex(* eval_funcp_12)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:274
ex(* power_funcp_3)(const ex &, const ex &, const ex &, const ex &)
Definition function.h:174
ex(* expand_funcp_5)(const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:195
ex(* real_part_funcp_3)(const ex &, const ex &, const ex &)
Definition function.h:169
ex(* expl_derivative_funcp_3)(const ex &, const ex &, const ex &, const symbol &)
Definition function.h:173
const ex _ex0
Definition utils.cpp:368
std::vector< ex > exvector
Definition basic.h:47
ex(* derivative_funcp_11)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:268
ex(* real_part_funcp)()
Definition function.h:131
ex(* evalf_funcp_8)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:227
ex(* derivative_funcp_4)(const ex &, const ex &, const ex &, const ex &, unsigned)
Definition function.h:184
ex(* series_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const relational &, int, unsigned)
Definition function.h:295
ex(* evalf_funcp_7)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:215
ex(* conjugate_funcp)()
Definition function.h:130
ex(* power_funcp_13)(const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &, const ex &)
Definition function.h:294
Definition ex.h:987
Interface to GiNaC's overloaded operators.
Interface to GiNaC's symbolic exponentiation (basis^exponent).
Definition of helper classes for expression output.
#define GINAC_IMPLEMENT_REGISTERED_CLASS(classname, supername)
Macro for inclusion in the implementation of each registered class.
Definition registrar.h:178
Interface to helper classes for using the remember option in GiNaC functions.
To distinguish between different kinds of non-commutative objects.
Definition registrar.h:42
Interface to GiNaC's symmetry definitions.
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.