Re: [Edusig] Reversing dictionaries, closures, permutations etc.
On Friday 23 January 2004 07:50 pm, Kirby Urner wrote:
What I'm thinking about in this thread is a way to define functions and inverse functions in a namespace, then pass them to a class P so that operator overloading will allow:
I have to confess that you lost me somewhere below this point (I'll reread it until I get it), but this is the sort of thing UserDict is for, right? I know Zope subclasses it to get the PersistentMapping class  it gives you the basic dictionary interface, which you can then build on. Cheers, Terry  Terry Hancock ( hancock at anansispaceworks.com ) Anansi Spaceworks http://www.anansispaceworks.com
What I'm thinking about in this thread is a way to define functions and inverse functions in a namespace, then pass them to a class P so that operator overloading will allow:
I have to confess that you lost me somewhere below this point (I'll reread it until I get it), but this is the sort of thing UserDict is for, right? I know Zope subclasses it to get the PersistentMapping class  it gives you the basic dictionary interface, which you can then build on.
Cheers, Terry
The way I factored it, I wanted the Pclass to accept /any/ pair of functions f, invf, where invf is the inverse of f. If f is based on a dictionary lookup (e.g. a permutations), then invf could be defined using a dictionary inverter (example in previous post). But f might just be an algebraic rule, e.g.:
def f(x): return 2.0 * x
def invf(x): return x / 2.0
p1 = P(f,invf) # < wrapping in Pclass to get operator overloading
p1(4) # < using __call__ 8.0
p2 = ~p1 # < using __invert__ p2(8.0) 4.0
p3 = (p2 * p1 * ~p2) # < using __mul__ to call self.compose() p3(10) 20.0
map((p1 * ~p1), [4,3,9,10,0.5,9.1]) < ditto [4.0, 3.0, 9.0, 10.0, 0.5, 9.0999999999999996]
The last command reminds us that f(decimal)>binary does not itself have an exact inverse function in the floating point numbers. Kirby
participants (2)

Kirby Urner

Terry Hancock