module Algebra.MatrixData.Structures where open import Level using (Level; _⊔_) open import Function open import Algebra open import Data.Product using (_,_) open import Data.Nat as ℕ using (ℕ; zero; suc) open import Data.Fin using (Fin; _≟_) open import Data.Vec open import Data.Vec.Relation.Unary.All as VAll using (All) import Algebra.MatrixData.Base as MBase open import Relation.Binary open import Relation.Nullary open import Algebra.BigOpsData private variable a ℓ : Level B : Set ℓ m n p k : ℕ module MAddition (_+_ : Op₂ B) where infixl 6 _+ᴹ_ open MBase public _+ᴹ_ : Op₂ (Matrix B m n) _+ᴹ_ = zipWith $ zipWith _+_ module MMonoid (rawMonoid : RawMonoid a ℓ) where infix 4 _≈ᴹ_ open RawMonoid rawMonoid renaming (Carrier to A) open MAddition _∙_ public open SumRawMonoid rawMonoid 0ᴹ : Matrix A m n 0ᴹ = replicate _ (replicate _ ε) _≈ᴹ_ : Rel (Matrix A m n) _ M ≈ᴹ N = All (λ (xs , ys) → All (λ (x , y) → x ≈ y) (zip xs ys)) (zip M N) module MRing {a} {ℓ} (rawRing : RawRing a ℓ) where infixl 7 _*ᴹ_ open RawRing rawRing renaming (Carrier to A) open SumRawRing rawRing public open MMonoid +-rawMonoid public private variable xs xs‵ ys zs : Matrix A m n private add0ₗ : Matrix A n m → Matrix A n (suc m) add0ₗ [] = [] add0ₗ (x ∷ xs) = (0# ∷ x) ∷ add0ₗ xs 1ᴹ : Matrix A n n 1ᴹ {zero} = [] 1ᴹ {suc n} = (1# ∷ replicate _ 0#) ∷ (add0ₗ 1ᴹ) _*ᴹ_ : Matrix A n m → Matrix A m p → Matrix A n p _*ᴹ_ {n} {m} {p} M N = map (λ row → map (λ column → ∑ (zipWith _*_ row column)) (transpose N)) M _*ᴹⱽ_ : ∀ {m n} → Matrix A n m → Vec A _ → Vec A n A *ᴹⱽ x = m→v (A *ᴹ transpose [ x ])