[Agda] making a pair explodes

Sergei Meshveliani mechvel at botik.ru
Mon Apr 17 15:17:49 CEST 2017


On Mon, 2017-04-17 at 13:22 +0200, Andrea Vezzosi wrote:
> A couple of questions:
> 
> - Does it help if you provide the type signature for "rR∣?"  ?
> - What about doing putting the local definitions in a "where" clause
> rather than a "let"?


Great!  
Adding the type signature for rR∣? helps.
Under 3 Gb heap,  it takes 74 seconds to type-check.  

The type check cost reduces probably more than 100 times.

Thank you very much. 

I could suspect this effect with the type signature, but I have
forgotten to try it.
 
This is indeed a relief. 
Because during last four years this is the main example in my project
for dependent types in computer algebra. This example was tried two
years earlier; its type check has failed in the same way. 
Now it is time to revisit it. And it occurs that it is sufficient to add
a single type signature.

Can you, please, give a hint: how does this occur that without this
signature the checker spends this much computation? 

Further: the whole project needs the minimum of 10 Gb to check, and is
checked in 64 minutes. 
And it is highly desirable to reduce this to 7 Gb, or even better, to 
3 Gb.
And there are many places where I skip type signatures (in order to make
the code looking shorter).
Suppose that I add some type signatures to the modules that take most of
the cost to check. Does this worth trying? 

Thanks,

------
Sergei


> On Mon, Apr 17, 2017 at 1:00 PM, Sergei Meshveliani <mechvel at botik.ru> wrote:
> > Dear Agda developers,
> >
> > The following fragment shows a certain remarkable detail:
> >
> >   f :  (b : C) → IsPrime b → Domain _ _
> >   f b prime-b =
> >               let open ForPrime b prime-b using (rFoo; ...)
> >                   rIR   = proj₁ rFoo
> >                   _∣r?_ = proj₂ rFoo
> >                   rR    = Foo.ring rIR
> >                   rR∣?  = (rR , _∣r?_)    -- **
> >               in
> >               anything
> >
> > Here  ForPrime  is a paramtric module,  Foo is a record.
> > All the needed previous .agda files have been checked earlier,
> > within about  10 Gb heap and 50 minutes.
> > And checking this  f  explodes:  for  26 Gb  3 hours is not enough, so I
> > have interrupted it.
> >
> > I set `anything' there in order to see which part of let-in makes the
> > checker explode.
> >
> > And it occurs that commenting out the last line in let-in makes f
> > checked in a small time:
> >
> > Finished Foo
> > Total                      62,991ms
> > Miscellaneous                 360ms
> > Deserialization            53,299ms
> > Serialization               4,772ms (9,012ms)
> > Serialization.BinaryEncode  4,072ms
> > Serialization.Sort             88ms
> > Serialization.Compress         76ms
> > Import                        156ms
> > Typing                         84ms    (88ms)
> > DeadCode                       60ms
> > Scoping                        12ms
> > ModuleName                     12ms
> >
> >
> > So:  rR  and  _∣r?_  are checked in a small time,
> > while composing them into a pair gives explosion.
> >
> > I know about the effect of large terms being substituted into a
> > parametric module - the effect produced by a certain lack of data
> > sharing in the type representation.
> >
> > But: really only composing this pair must lead to this explosion?
> > Can you guess and tell what may be happening there?
> >
> > I can provide the full code.
> > But it is large, and needs about 10 Gb heap to type-check.
> >
> > Thanks,
> >
> > -------
> > Sergei
> >
> >
> > _______________________________________________
> > Agda mailing list
> > Agda at lists.chalmers.se
> > https://lists.chalmers.se/mailman/listinfo/agda
> 




More information about the Agda mailing list