fpnla-examples-0.1: src/FPNLA/Operations/BLAS/Strategies/GEMM/DefSeq.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
module FPNLA.Operations.BLAS.Strategies.GEMM.DefSeq () where
import FPNLA.Matrix (MatrixVector,
elem_m, foldr_v,
generate_m,
generate_v)
import FPNLA.Operations.BLAS (GEMM (gemm))
import FPNLA.Operations.BLAS.Strategies.DataTypes (DefSeq)
import FPNLA.Operations.Parameters (Elt, blasResultM,
dimTrans_m,
elemTrans_m)
instance (Elt e, MatrixVector m v e) => GEMM DefSeq m v e where
gemm _ pmA pmB alpha beta mC
| p /= p' = error "gemm: incompatible ranges"
| otherwise = blasResultM . generate_m m n $ (\i j -> (alpha * matMultIJ i j) + beta * elem_m i j mC)
where
(m, p) = dimTrans_m pmA
(p',n) = dimTrans_m pmB
matMultIJ i j = foldr_v (+) 0 (generate_v p (\k -> (*) (elemTrans_m i k pmA) (elemTrans_m k j pmB)) :: v e)