← Back to team overview

ufl team mailing list archive

Re: [HG UFL] Added __hash__ to Form, and caching of hash, repr and str so they are only

 

On Sat, Sep 06, 2008 at 01:02:29PM +0200, Martin Sandve Alnæs wrote:
> 2008/9/6 Anders Logg <logg@xxxxxxxxx>:
> > On Fri, Sep 05, 2008 at 10:58:08AM +0200, UFL wrote:
> >> One or more new changesets pushed to the primary ufl repository.
> >> A short summary of the last three changesets is included below.
> >>
> >> changeset:   224:4df4ffa5de1be81ed07fdea22569beb39e2e75f0
> >> tag:         tip
> >> user:        "Martin Sandve Alnæs <martinal@xxxxxxxxx>"
> >> date:        Fri Sep 05 10:58:06 2008 +0200
> >> files:       ufl/form.py
> >> description:
> >> Added __hash__ to Form, and caching of hash, repr and str so they are only
> >> computed the first time str(form), repr(form) or hash(form) is called.
> >
> > Very nice. I have the same thing in FFC (JITObject) which wraps a form
> > and remembers the signature for later reuse.
> >
> > One thing is that JITObject also includes the compiler flags
> > (quadrature or tensor representation etc) in the signature. Would it
> > be possible to add a mechanism like this to a Form so that it would
> > already be included in the signature? It would amount to attaching
> > a signature (for something else like compiler flags) to a Form that
> > gets included in the signature for the Form itself.
> >
> 
> Done.

Nice!

> I guess adding a variable "_metadata" to Form which
> UFL doesn't really care about doesn't hurt anyone.
> But I guess the __hash__ would need to include _metadata
> as well? What have you done about that?

I just include str(_metadata) in the string that generates the
signature. Here's the code for signature() in JITObject:

    def signature(self):
        "Return signature"

        # Check if we have computed the signature before
        if not self._signature is None:
            return self._signature

        # Compute signature
        self.form_data = analyze.analyze(algebra.Form(self.form), simplify_form=False)
        form_signature = str(self.form)
        element_signature = ";".join([element.signature() for element in self.form_data.elements])
        options_signature = str(self.options)
        s = ";".join([form_signature, element_signature, options_signature])
        self._signature = "form_" + sha1(s).hexdigest()
        
        return self._signature

-- 
Anders

Attachment: signature.asc
Description: Digital signature


Follow ups

References