packages feed

casadi-bindings-2.4.1.2: src/Casadi/CMatrix.hs

{-# OPTIONS_GHC -Wall #-}

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

import qualified Data.Vector as V
import Data.Map ( Map )

import Casadi.Core.Classes.DMatrix ( DMatrix )
import Casadi.Core.Classes.GenericType ( GenericType )

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

class (Eq a, Show a, Floating a, Fmod a, ArcTan2 a, SymOrd a, Erf a, Viewable a)
      => CMatrix a where
  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
  mm :: a -> a -> a
  -- | sumAll(x*y), x and y same dimension
  innerProd :: a -> a -> a
  sumCols :: a -> a
  sumRows :: 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 -> Map String GenericType -> a
  solve' :: a -> a -> a
  indexed :: a -> Slice -> Slice -> a
  sparsity :: a -> Sparsity
  getNZ :: a -> Slice -> a
  setNZ :: a -> a -> Slice -> IO ()
  triu :: a -> a
  tril :: a -> a
  triu2symm :: a -> a
  tril2symm :: a -> a
  copy :: a -> IO a
  densify :: a -> a
  fromDMatrix :: DMatrix -> a
  fromDVector :: V.Vector Double -> a
  fromDouble :: Double -> a
  allocEmpty :: IO a
{-# DEPRECATED solve' "use the new solve, this one is going away" #-}


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 _ = []