On Monday, 16 September 2013 20:09:52 UTC+2, Aaron Meurer wrote:
>
> On Mon, Sep 16, 2013 at 5:56 AM, Moritz Beber 
> <moritz...@gmail.com<javascript:>> 
> wrote: 
> > Dear all, 
> > 
> > My question basically has two parts: 
> > 
> > 1.) I have a number of (a few thousand) logical expressions each 
> consisting 
> > of a handful of symbols (in total there are several thousand symbols as 
> > well). Currently, I generate a dictionary (let's call it 'big_dict') 
> with 
> > the symbols and their truth values. Then I loop through each expression 
> and 
> > evaluate it by calling expr.subs(big_dict). This is painfully slow. I 
> looked 
> > through the source code for 'subs' a little and saw that it roughly 
> > translates the dict into an iterable of old, new pairs which it then 
> loops 
> > through in order to apply replacements. Is there a more efficient way? I 
> > guess what I could code but actually expect an evaluation of a boolean 
> > expressions to do is: using the symbols in it, extract the values and 
> solve. 
>
> You can try using xreplace, or (I belive) subs(simultaneous=True), 
> which should only walk the expression tree once. 
>
xreplace was the best option, indeed. Here are some timings that might be 
informative:

In [4]:

from sympy.abc import a, b, c, x, y, z

In [5]:

expr = sympy.sympify("a & b")

In [6]:

variables = dict(zip(range(100), range(100)))

variables[a] = True

variables[b] = False

In [7]:

%timeit expr.subs(variables)

100 loops, best of 3: 2.22 ms per loop

In [9]:

%timeit expr.subs(variables, simultaneous=True)

100 loops, best of 3: 3.12 ms per loop

In [10]:

%timeit expr.subs([(var, variables[var]) for var in expr.args])

10000 loops, best of 3: 58.2 µs per loop

In [11]:

%timeit expr.subs([(var, variables[var]) for var in expr.args], 
simultaneous=True)

1000 loops, best of 3: 957 µs per loop

In [13]:

%timeit expr.xreplace([(var, variables[var]) for var in expr.args])

10000 loops, best of 3: 91.7 µs per loop

In [8]:

%timeit expr.xreplace(variables)

10000 loops, best of 3: 37.2 µs per loop

 

>
> > 
> > 2.) Since I have many such expressions, am I missing a way to solve the 
> > whole system? 
>
> I'm not clear what you mean by "solve", but look at simplify_logic() 
> and satisfiable(). 
>
Sorry for being unclear. By 'solve' I meant evaluate the expressions as 
above with actual truth values. I can't help but thinking, "if only this 
were linear algebra" since I basically have a matrix with expressions and 
involved symbols and then want to find the result of applying a vector with 
a certain conditions. I just don't know if there is a representation that 
would allow me to map one onto the other. Either way, I'm happy with the 
xreplace.

>
> Aaron Meurer 
>
> > 
> > Thank you for your insights, 
> > Moritz 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "sympy" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to sympy+un...@googlegroups.com <javascript:>. 
> > To post to this group, send email to sy...@googlegroups.com<javascript:>. 
>
> > Visit this group at http://groups.google.com/group/sympy. 
> > For more options, visit https://groups.google.com/groups/opt_out. 
>

Cheers,
Moritz 

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to