← 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:51:25PM +0200, Martin Sandve Alnæs wrote:
> 2008/9/6 Anders Logg <logg@xxxxxxxxx>:
> > On Sat, Sep 06, 2008 at 01:30:04PM +0200, Martin Sandve Alnæs wrote:
> >> 2008/9/6 Anders Logg <logg@xxxxxxxxx>:
> >> > 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
> >> >
> >>
> >> Two questions.
> >>
> >> Why all the analysis? Isn't the "original" state of the form enough?
> >> With UFL I'd probably just do repr(form) + str(_metadata).
> >> But maybe there are some transformations that makes
> >> the comparison more robust, e.g. renumbering of objects
> >> like Function and BasisFunction.
> >
> > I need to extract the elements for inclusion in the signature and they
> > are not available in str(form). It could be added to a .signature()
> > function in the form objects.
> >
> >> You're using a checksum as the returned signature.
> >> Why not just return s?
> >
> > It's too long and it won't work as a class name or file name. FFC uses
> > the signature as the name of the ufc:: classes it generates.
> >
> >> Currently, Instant computes its own checksum of the given signature,
> >> which it uses for the module name in the disk cache.
> >> Either we can require the signature given to Instant to be
> >> a checksum already (or at least a valid part of a filename),
> >> and skip the checksum computation in Instant, or you can
> >> drop this checksum computation and just pass s to Instant.
> >
> > That would be good. I'd prefer that Instant assumed it gets a hash
> > since FFC needs to generate a name for the ufc:: classes.
> 
> Ok. I forgot I also do that in SFC now (in the upcoming UFL-based version).
> 
> Even better: Instant can check the signature string and take the
> checksum of it if it doesn't meet certain requirements like being a
> valid filename and shorter than some constant limit.

Sounds good.

-- 
Anders

Attachment: signature.asc
Description: Digital signature


References