ffc team mailing list archive
-
ffc team
-
Mailing list archive
-
Message #04157
Re: [Ufl] [Bug 769811] [NEW] JIT cache problem with id(form)
On Tuesday April 26 2011 08:46:26 Garth N. Wells wrote:
> On 26/04/11 16:39, Johan Hake wrote:
> > On Tuesday April 26 2011 08:33:11 Garth N. Wells wrote:
> >> On 26/04/11 16:31, Johan Hake wrote:
> >>> On Tuesday April 26 2011 08:16:29 Garth N. Wells wrote:
> >>>> On 26/04/11 16:07, Anders Logg wrote:
> >>>>> On Tue, Apr 26, 2011 at 03:59:52PM +0100, Garth N. Wells wrote:
> >>>>>> On 26/04/11 15:55, Anders Logg wrote:
> >>>>>>> On Tue, Apr 26, 2011 at 03:45:22PM +0100, Garth N. Wells wrote:
> >>>>>>>> On 26/04/11 13:51, Anders Logg wrote:
> >>>>>>>>> On Tue, Apr 26, 2011 at 02:00:50PM +0200, Anders Logg wrote:
> >>>>>>>>>> It feels good that you trust me enough to handle it. ;-)
> >>>>>>>>>>
> >>>>>>>>>> Will add it sometime this afternoon and then we can revisit the
> >>>>>>>>>> JIT compiler caching.
> >>>>>>>>>
> >>>>>>>>> I'm getting confused here... Looking at preprocess.py in UFL, I
> >>>>>>>>> see
> >>>
> >>> this:
> >>>>>>>> It is confusing. Does the function 'preprocess' do anything that
> >>>>>>>> the old FormData class didn't? It would be easier to follow if
> >>>>>>>> Form just had a member function form_data() that computes and
> >>>>>>>> stores data (like it used to), or if Form had a 'preprocess'
> >>>>>>>> function. Having the function preprocess return a new form is
> >>>>>>>> really confusing.
> >>>>>>>
> >>>>>>> I don't find that particularly confusing. It's the same as
> >>>>>>>
> >>>>>>> refined_mesh = refine(mesh)
> >>>>>>
> >>>>>> Which is the whole problem. By creating a new object, FormData is
> >>>>>> thrown away. The preprocessing should just compute some more data,
> >>>>>> just like we *don't* do
> >>>>>>
> >>>>>> initialised_mesh = mesh.init(0)
> >>>>>>
> >>>>>> What was wrong with Martin's original design that necessitated the
> >>>>>> change?
> >>>>>
> >>>>> As I explained, I thought it was better to have an explicit call to
> >>>>> preprocess since that makes it clear that one makes a call to a
> >>>>> function which may take some time to execute (instead of just calling
> >>>>> a member function which seems to just return some data).
> >>>>>
> >>>>> But as I say above: I added the caching back at some point (maybe
> >>>>> even the day after I removed it 2 years ago) so we don't need to
> >>>>> discuss why I removed it (as I realized myself I shouldn't have
> >>>>> removed it and added it back a long time ago).
> >>>>>
> >>>>> What has me confused now is that the caching seems to be in place but
> >>>>> we still need the extra caching in FFC/DOLFIN and I don't see why.
> >>>>
> >>>> Because preprocess returns a new form, e.g. define a form
> >>>>
> >>>> a = u*v*dx
> >>>> jit(a)
> >>>>
> >>>> Inside jit,
> >>>>
> >>>> a.form_data() is None:
> >>>> b = preprocess(a) # b now has data attached, but a doesn't
> >>>>
> >>>> else:
> >>>> b = a
> >>>>
> >>>> Now 'b' has been preprocessed, and has form data attached, but 'a'
> >>>> doesn't. Calling 'jit(a)' again, the code will never enter the 'else'
> >>>> part of the clause because 'a' never gets any form data. Johan has
> >>>> added some code FFC that attaches the form data of 'b' to 'a', but it
> >>>> is a bit clumsy.
> >>>
> >>> No, it was already attached. I just made ffc use it.
> >>
> >> Didn't you add the line
> >>
> >> form._form_data = preprocessed_form.form_data()
> >
> > No, I added:
> bzr says that you did ;).
Well, then I did! I just got confused of looking at the patch.
> I'd take credit for it because it adds the
> missing data to the original form.
I bet you do!
Johan
> Garth
>
> > preprocessed_form = form.form_data()._form
> >
> > I think the thing here is that form_data has always had a preprocessed
> > form. Someone (lets not point fingers!) thought that was too much magic
> > and added an
> >
> > explicit need to call:
> > form = preprocess(form)
> >
> > in jit_compiler(). This made the design more complicated and also
> > introduced a cirucular dependency, as the return preprocessed form need
> > to know of its form_data, but the form_data already had a reference to
> > the preprocessed form. The latter is what I used in the one line I
> > altered.
> >
> > Johan
> >
> >> ?
> >>
> >> Garth
> >>
> >>>> Better would be
> >>>>
> >>>> a.preprocess()
> >>>>
> >>>> or
> >>>>
> >>>> a.form_data()
> >>>
> >>> As already mentioned in a previous email, I suggest we only call
> >>> form_data(). This will return the form_data. The preprocessed form is
> >>> attached to the form_data and this is what is passed to the code
> >>> generator. I am pretty sure this is what was there from the beginning.
> >>>
> >>> It is confusing to call:
> >>> form = preprocess(form)
> >>>
> >>> as the preprocessed form was never ment to be doing anything but being
> >>> passed to the code generator, AFAIK.
> >>>
> >>> Johan
> >>>
> >>>> Garth
> >>>>
> >>>>> --
> >>>>> Anders
> >>>>>
> >>>>>> Garth
> >>>>>>
> >>>>>>>> Garth
> >>>>>>>>
> >>>>>>>>> def preprocess(form, object_names={}, common_cell=None):
> >>>>>>>>> ...
> >>>>>>>>>
> >>>>>>>>> # Check that form is not already preprocessed
> >>>>>>>>>
> >>>>>>>>> if form.form_data() is not None:
> >>>>>>>>> debug("Form is already preprocessed. Not updating form
> >>>>>>>>> data.") return form
> >>>>>>>>>
> >>>>>>>>> ...
> >>>>>>>>>
> >>>>>>>>> # Attach form data to form
> >>>>>>>>> form._form_data = form_data
> >>>>>>>>>
> >>>>>>>>> # Attach preprocessed form to form data
> >>>>>>>>> form_data._form = form
> >>>>>>>>>
> >>>>>>>>> And when I look at the blamelist (bzr annotate), it looks like I
> >>>>>>>>> added those lines, so I must have come to my senses and added it
> >>>>>>>>> back at some point (way back). So in conclusion, calling
> >>>>>>>>> preprocess() should not taking any time.
> >>>>>>>>>
> >>>>>>>>> What am I missing?
> >>>>
> >>>> _______________________________________________
> >>>> Mailing list: https://launchpad.net/~ffc
> >>>> Post to : ffc@xxxxxxxxxxxxxxxxxxx
> >>>> Unsubscribe : https://launchpad.net/~ffc
> >>>> More help : https://help.launchpad.net/ListHelp
>
> _______________________________________________
> Mailing list: https://launchpad.net/~ffc
> Post to : ffc@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~ffc
> More help : https://help.launchpad.net/ListHelp
References