Hi,

maybe this is a bug, maybe combining "algebraic" and "no_pattern" is just not allowed. Here is the program:

#include <iostream>
#include <ginac.h>
using namespace GiNaC;

int main() {
    symbol x("x");
    symbol y("y");
    symbol A("A");
    ex w(wild());

    exmap repl;
    repl[w] = A;
    ex expr(x/y + w);
    
    ex result = expr.subs(repl, subs_options::algebraic | subs_options::no_pattern);

    std::cout << "Result: " << result << std::endl;

   return 0;
}

Expected output: x/y + A

Actual output: A/y + A

Apparently mul::algebraic_subs_mul() does not honour the no_pattern flag.

----------------

The practical reason why this problem arose is to achieve algebraic substitution in sums:

#include <iostream>
#include <ginac.h>
using namespace GiNaC;

int main() {
    symbol x("x");
    symbol y("y");
    symbol z("z");
    symbol A("A");
    symbol B("B");
    ex w(wild());

    exmap repl;
    repl[x + y + w] = A/B + w;
    
    ex expr = x + y + z;

    // Try to substitute x+y with A/B
    ex result = expr.subs(repl, subs_options::algebraic);

    std::cout << "Result: " << result << std::endl;
    
    return 0;
}

Expected output: A/B + z

Actual output: z/B + z

BTW, I noticed that expairseq::match() can do algebraic matching in sums. Why can it not be implemented for add::subs(), too?

Regards,

Jan