packages feed

casadi-bindings-3.4.5.0: src/Casadi/Matrix.hs

{-# OPTIONS_GHC -Wall #-}

module Casadi.Matrix
       ( CMatrix(..), SMatrix(..)
       , vertslice, horzslice
       ) where

import qualified Data.Map as M
import qualified Data.Vector as V

import Casadi.Core.Classes.DM ( DM )
import Casadi.Core.Classes.Function ( Function )

import Casadi.GenericType ( GType )
import Casadi.Overloading ( Fmod, ArcTan2, SymOrd, Erf )
import Casadi.Sparsity ( Sparsity )
import Casadi.Slice ( Slice, slice )
import Casadi.Viewable ( Viewable )

-- TODO(greg): alphabetize this, it's getting too big to manage
-- | casadi matrix
class (Eq a, Show a, Floating a, Fmod a, ArcTan2 a, SymOrd a, Erf a, Viewable a)
      => CMatrix a where
  blocksplit :: a -> V.Vector Int -> V.Vector Int -> V.Vector (V.Vector a)
  blockcat :: V.Vector (V.Vector a) -> a
  vertsplit :: a -> V.Vector Int -> V.Vector a
  vertcat :: V.Vector a -> a
  horzsplit :: a -> V.Vector Int -> V.Vector a
  horzcat :: V.Vector a -> a
  veccat :: V.Vector a -> a
  size1 :: a -> Int
  size2 :: a -> Int
  numel :: a -> Int
  -- | matrix matrix product
  mtimes :: a -> a -> a
  -- | sumAll(x*y), x and y same dimension
  dot :: a -> a -> a
  sum1 :: a -> a
  sum2 :: a -> a
  sumSquare :: a -> a
  -- | transpose
  trans :: a -> a
  diag :: a -> a
  eye :: Int -> a
  ones :: (Int,Int) -> a
  zeros :: (Int,Int) -> a
  zerosSp :: Sparsity -> a
  solve :: a -> a -> String -> M.Map String GType -> a
  solve' :: a -> a -> a
  indexed :: a -> Slice -> Slice -> a
  sparsity :: a -> Sparsity
  getNZ :: a -> Slice -> a
  setNZ :: a -> a -> Slice -> IO ()
  inv :: a -> a
  invSkew :: a -> a
  pinv :: a -> a
  pinv' :: a -> String -> M.Map String GType -> a
  triu :: a -> a
  tril :: a -> a
  triu2symm :: a -> a
  tril2symm :: a -> a
  copy :: a -> IO a
  densify :: a -> a
  fromDM :: DM -> a
  fromDVector :: V.Vector Double -> a
  fromDouble :: Double -> a
  reshape :: a -> (Int, Int) -> a
  conditional :: a -> V.Vector a -> a -> a
  conditional' :: a -> V.Vector a -> a -> Bool -> a
  cmin :: a -> a -> a
  cmax :: a -> a -> a
  cand :: a -> a -> a
  cor :: a -> a -> a
  cnot :: a -> a
  nullspace :: a -> a
  norm1 :: a -> a
  norm2 :: a -> a
  normFro :: a -> a
  normInf :: a -> a

--  if_else ::
  -- TODO(greg): any and all, mac, repsum?
  repmat :: a -> (Int, Int) -> a
  printme :: a -> a -> a
  kron :: a -> a -> a
  mldivide :: a -> a -> a
  mrdivide :: a -> a -> a
  mpower :: a -> a -> a
--  matrix_expand :: a -> a -> a

  ceil' :: a -> a
  floor' :: a -> a


-- | symbolic matrix
class CMatrix a => SMatrix a where
  sym :: String -> Int -> Int -> IO a
  toFunction :: String -> V.Vector a -> V.Vector a -> M.Map String GType -> IO Function
  toFunction' :: String -> V.Vector (String, a) -> V.Vector (String, a) -> M.Map String GType -> IO Function
  -- | @gradient exp x@ is the gradient of exp w.r.t. x
  gradient :: a -> a -> a
  -- | @jacobian exp x@ is the jacobian of exp w.r.t. x
  jacobian :: a -> a -> a
  -- | @(hess, grad) = hessian exp args@
  hessian :: a -> a -> (a, a)
  jtimes :: a -> a -> a -> a
  forward :: V.Vector a -> V.Vector a -> V.Vector (V.Vector a) -> M.Map String GType -> V.Vector (V.Vector a)
  reverse :: V.Vector a -> V.Vector a -> V.Vector (V.Vector a) -> M.Map String GType -> V.Vector (V.Vector a)

  callSym :: Function -> V.Vector a -> V.Vector a
  callSym' :: Function -> M.Map String a -> M.Map String a


vertslice :: CMatrix a => a -> V.Vector Int -> V.Vector a
vertslice x vs = V.fromList (f (V.toList vs))
  where
    cols = size2 x
    hslice = slice 0 cols 1

    f (v0:v1:others) = indexed x (slice v0 v1 1) hslice : f (v1:others)
    f _ = []

horzslice :: CMatrix a => a -> V.Vector Int -> V.Vector a
horzslice x vs = V.fromList (f (V.toList vs))
  where
    rows = size1 x
    vslice = slice 0 rows 1

    f (v0:v1:others) = indexed x vslice (slice v0 v1 1) : f (v1:others)
    f _ = []