Skip to content

Instantly share code, notes, and snippets.

@jonaprieto
Last active March 19, 2021 22:46
Show Gist options
  • Save jonaprieto/401c83b5bc53689a28271cc58cf5d339 to your computer and use it in GitHub Desktop.
Save jonaprieto/401c83b5bc53689a28271cc58cf5d339 to your computer and use it in GitHub Desktop.
MoA

\tableofcontents

Intro

Imports

{-# OPTIONS --with-K --exact-split #-}
module content where

open import Data.Vec
  hiding ( take ; drop )

open import Data.Nat
open import Data.Nat.Properties 
open import Data.Product
import Data.Fin


import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl; trans; sym; cong; cong-app; subst)
open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; step-≡; _∎)

Machinery

$$ a = ⟨2 3 ⟩ [1, 2, 3, 4, 5, 6] $$

\begin{align*} ⟨5, 6 ⟩ &: \mathsf{shape}(2)\ ⟨6,7,4 ⟩ &: \mathsf{shape}(3) \end{align*}

module MoA where
  variable
    E : Set

Vectors

  take-vec : ∀ {l}{A : Set}
    → (n : ℕ)
    → (v : Vec A l)
    → (p : n ≤ l)
    → Vec A n
  take-vec zero _ _ = []
  take-vec (suc n) (x ∷ xs) (s≤s p) = x ∷ take-vec n xs p

  drop-vec : ∀ {l : ℕ}{A : Set}
    → (n : ℕ)
    → (v : Vec A l)
    → (p : n ≤ l)
    → Vec A (l - n)
  drop-vec zero v _ = v
  drop-vec (suc n) (x ∷ xs) (s≤s p) = drop-vec n xs p

Shapes

  Shape : ℕ → Set
  Shape = Vec ℕ

  take-shape : ∀ {d}
    → (n : ℕ)
    → (s : Shape (1 + d)) 
    → (p : n ≤ head s)
    → Shape (1 + d)
  take-shape n s  p = n ∷ tail s

  drop-shape : ∀ {d}
    → (n : ℕ)
    → (s : Shape (1 + d)) 
    → (p : n ≤ head s)
    → Shape (1 + d)
  drop-shape zero s p = s
  drop-shape (suc n) (x ∷ xs) p
    = drop-shape n (x ∷ xs) (≤-trans (n≤1+n n) p)

  ∏ : ∀ {d} → Shape d → ℕ
  ∏  s = foldr _ _*_ 1 s

  ex1 = 5 ∷ 6 ∷ [] 
  ex2 = 6 ∷ 7 ∷ 4 ∷ [] 

Arrays

  module Arrays (A : Set) where

    record Array {d : ℕ} (s : Shape d) : Set
      where
      constructor mkarr
      field 
        vec : Vec A (∏ s)

    dim : ∀ {d}{s} → Array {d} s → ℕ
    dim {d = d} _ = d

    ρ : ∀ {d}{s} → Array {d} s → Shape d
    ρ {s = s} _ = s
    
    elems : ∀ {d}{s} → Array {d} s → Vec A (∏ s)
    elems a = Array.vec a

    shape-elim
      : ∀ {d : ℕ}
      → (P : Shape d → Set)
      → ((p : 0 ≡ d) → P (subst Shape p []) )
      → (∀ {n} e s  → (p : (1 + n ≡ d)) →  P (subst Shape p (e ∷ s)))
      → (∀ s → P s)
    shape-elim P base-case cons-case []      = base-case refl
    shape-elim P base-case cons-case (x ∷ s) = cons-case x s refl

    pi-hd-tl 
      : ∀ {d : ℕ} (s : Shape (1 + d))
      → ∏ s ≡ ((head s) * ∏ (tail s))
    pi-hd-tl (x ∷ xs) = refl

    reshape
      : ∀ {d₁ d₂ : ℕ} {s₁ : Shape d₁}
      → (a : Array s₁) 
      → (s₂ : Shape d₂)
      → (p : ∏ s₁ ≡ ∏ s₂)
      → Array s₂
    reshape (mkarr vec) s₂ p = mkarr (subst (Vec A) p vec)

    -- Take from the head of the array.
    take : ∀ {d : ℕ}{s : Shape (1 + d)}
      → (n : ℕ)
      → (p : n ≤ head s)
      → Array s
      → Array (take-shape n s p)
    take {s = x ∷ s} n p (mkarr v) = mkarr (take-vec (n * ∏ s) v helper)
      where
      open Data.Nat.Properties
      helper : n * ∏ s ≤ x * ∏ s
      helper = *-monoˡ-≤ (∏ s) p

    drop : ∀ {d : ℕ}{s : Shape (1 + d)}
      → (n : ℕ)
      → Array s
      → (p : n ≤ head s)
      → Array (drop-shape n s p)
    drop {s = s} zero a _ = a
    drop {s = x ∷ s} (suc n) a p 
      = drop {s = x ∷ s} n a ((≤-trans (n≤1+n n) p))
  module Indexing where
    open Data.Fin hiding (_+_)

    -- This definition doesn't match with the paper.
    ψ : ∀ {k : ℕ}
      → {s : Shape (1 + k)}
      → (idx : Fin (head s))
      → Array s
      → Array (tail s)
    ψ {s = s@(_ ∷ _)} zero  a   
      = reshape (take 1 (s≤s z≤n) a) (tail s) (+-identityʳ (∏ (tail s)))
    ψ {s = s@(_ ∷ _)} (suc pp) a 
      = ψ zero (drop 1 a (s≤s z≤n))

    expand-d-shape
      : ∀ {d} (s : Shape d)
      → (axis : Fin (1 + d))
      → Shape (1 + d)
    expand-d-shape s zero = 1 ∷ s
    expand-d-shape {d = .(suc _)} (s₀ ∷ s) (suc axis) 
      = s₀ ∷  expand-d-shape s axis

    pi-expand-s-pi-s
      : ∀ {d} (s : Shape d)
      → (axis : Fin (1 + d))
      → ∏ (expand-d-shape s axis) ≡ ∏ s
    pi-expand-s-pi-s [] zero = refl
    pi-expand-s-pi-s (x ∷ s) zero = +-identityʳ (x * ∏ s)
    pi-expand-s-pi-s (x ∷ s) (suc axis) 
      = cong (x *_) (pi-expand-s-pi-s s axis)
name: moa
include: .
depend: standard-library
Display the source blob
Display the rendered blob
Raw
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment