Hello, Reidel, As far as I can remember from my projects, subclassing may need re-implementation some technical methods, e.g. compare_same_type(), is_equal(), etc. You may also need a custom subs() for your subclass. Best wishes, Vladimir -- Vladimir V. Kisil http://www1.maths.leeds.ac.uk/~kisilv/ Book: Geometry of Mobius Maps https://doi.org/10.1142/p835 Soft: Geometry of cycles http://moebinv.sourceforge.net/ Jupyter notebooks: https://github.com/vvkisil?tab=repositories
On Thu, 9 Feb 2023 06:08:13 +0100, Marko Riedel <riedelmo@mathematik.uni-stuttgart.de> said:
MR> Greetings to all. MR> I have been subclassing "symbol" for my project, where I need to MR> attach an integer value to a symbol. I am not sure this is the MR> best way to go about it but I would like to try. Everything MR> works so far but now I have moved on to substituting variables MR> in polynomials. Here is my sample program. MR> #include <iostream> #include <ginac/ginac.h> MR> #include "cindsymbol.h" #include "util.h" MR> using namespace std; using namespace GiNaC; MR> int main() { cindsymbol R = cindsymbol("R",0), G = MR> cindsymbol("G",0), B = cindsymbol("B",0), X = cindsymbol("X",0); MR> ex pl = X + pow(X, 3) + R + G + B; MR> cout << R << G << B << " " << pl << endl; cout << pl.subs({X}, MR> {pow(X,4)}) << endl; MR> return 0; } MR> The output of this program is as follows (the print functions MR> from the subclass are being invoked correctly and do not print MR> the zero value): MR> RGB X+R+G+B+X^3 4*X^4+X^12 MR> Obviously GiNaC thinks that R=X, B=X and G=X. How do I get this MR> comparison to work? Do I need to override some function in my MR> subclass? The function "cindsymbol" goes as follows (copied MR> from the tutorial): MR> static map<string, cindsymbol> directory; MR> cindsymbol cindsym(const std::string & initname, unsigned cl) { MR> std::string key = initname + "|" + std::to_string(cl); MR> map<std::string, cindsymbol>::iterator it = directory.find(key); MR> if (it != directory.end()) return it->second; else{ MR> std::pair<std::string, cindsymbol> ent = make_pair(key, MR> cindsymbol(initname, cl)); return MR> directory.insert(ent).first->second; } } MR> Can you advise me here? Thanks! MR> Best regards, MR> Marko Riedel MR> _______________________________________________ GiNaC-list MR> mailing list GiNaC-list@ginac.de MR> https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.ginac.de%2Fmailman%2Flistinfo%2Fginac-list&data=05%7C01%7CV.Kisil%40leeds.ac.uk%7Cf9281b2ab31d4ed0e94408db0a5ba9db%7Cbdeaeda8c81d45ce863e5232a535b7cb%7C1%7C0%7C638115161033613772%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=WPVPtJSJ3PtVNqmEf%2FYmd0vY5XkXFdBhMY79y138vYY%3D&reserved=0