[Agda] type check cost for `open'

Sergei Meshveliani mechvel at botik.ru
Sat Aug 15 20:46:08 CEST 2015


People,

I have a problem of the  type check cost for the `open' declaration.

The project consists of about 20 files:

  Foo1.agda ... Foo18, OverIntegralRing-0.agda, OverIntegralRing-1.agda.

It is for               Agda 2.4.2.3.
The machine is of       16 Gb RAM,  3 GHz.
Type checking is under  -M13G -H13G

(-A1G does not effect essentially).

The first 19 files are type-checked in 1-2 hours,
and I take this as "Anyway, it is done. let us type-check the next and
see".
 
OverIntegralRing-0.agdai  has  12 Mb size.
Other .agdai files have         4 Mb on average.

There arises a question of type-checking  OverIntegralRing-1.agda.
This file is as follows:


************************************** OverIntegralRing-1.agda **
open import Level using ...
...
open import Relation.Binary using ...
...
open import Data.Nat using (ℕ; suc)

-- of DoCon-A --
open import Structures0 using (module Magma; module UpMagma)
...
open import Structures3 using (module IntegralRing; UpIntegralRing; 
                                                module UpIntegralRing) 
open import Factorization.FtMonoid using 
                                   (module OfCancellativeCommMonoid)
import OverIntegralRing-0   --
 
-------------------------------------------------------------
module OverIntegralRing-1 {α α=} (upIR : UpIntegralRing α α=)
                   (_∣?_ : let Mg = UpIntegralRing.*magma upIR
                           in  Decidable₂ $ Magma._∣_ Mg 
                   )
  where
  open UpIntegralRing upIR using (...)
                renaming (Carrier to C; *upCommutativeMonoid to *upCMon)
  open IsEquivalence isEquivalence using () 
                  renaming (refl to ≈refl; sym to ≈sym; trans to ≈trans)
  open EqR setoid renaming (_≈⟨_⟩_ to _≈[_]_)
  open UpMagma *upMagma using (_∣_; _∤_; ∣cong₁; ∣cong₂; ∤cong₁)
                                                renaming (_~asd_ to _~_)
  open UpMonoid *upMonoid using (_^_; ^1=id; ∣trans)
  open CommutativeSemigroup *commutativeSemigroup using (bothFactors∣)
  open MonoidLemmata *upMonoid     using (^cong₁; x∣x; x^2≈xx)
  open RingLemmata   upRing        using (0*; ∣nonzero→≉0)
  open Ring1Lemmata  upRingWithOne using (∣1→≉0; 0^suc) 

{- -- expensive 
  open OverIntegralRing-0 upIR _∣?_ using                       
       (_∣'?_; *cancel-nz; *cMon-NZ; *upCMon-NZ; IsPrime; prime→≉0; 
        Factorization; IsPrime-nz→IsPrime; IsPrime→IsPrime-nz)
-}
*******************************************************************

And that is all:  
only open several modules imported from previous files.

1. It is type-checked in  41 sec,  with  .agdai  of ~ 900 Kb
   (the smallest .agdai).


2. Uncomment the last `open'.
Then  30 min  is not enough to type-check. Many Gb are allocated.

Giving  14 Gb  leads to swapping, this slows down the process greatly
(I expect that on a 32 Gb machine and under -M24G it will type-check in 
1 minute).

I need to program several functions in this environment.
But this very environment fails to type check on a 16 Gb machine.

The are two functions set under  NO_TERMINATION_CHECK
-- this pragma will be removed after certain `panic' is fixed in Agda.
Probably, this pragma does not increase the type check cost
(can it?).

Is something wrong in the Agda implementation approach?
(a real sharing, the normal form interpreter ... I do not know).

Regards,

------
Sergei



More information about the Agda mailing list