Safe Haskell | None |
---|---|
Language | Haskell2010 |
Marshal a limited subset of J arrays into Repa arrays.
Tutorial
Suppose we wish to perform linear regression. In J we could do:
xs := 1 2 3 ys := 2 4 6 reg_result =: ys %. xs ^/ i.2
To do this with Haskell data:
do jenv <-jinit
libLinux
let hsArr0 = R.fromListUnboxed (R.ix1 3) [1.0,2.0,3.0] hsArr1 = R.fromListUnboxed (R.ix1 3) [2.0,4.0,6.0] jArr0 =JDoubleArr
$ R.copyS $ R.map (realToFrac :: Double -> CDouble) hsArr0 jArr1 =JDoubleArr
$ R.copyS $ R.map (realToFrac :: Double -> CDouble) hsArr1setJData
jenv "xs" jArr0setJData
jenv "ys" jArr1bsDispatch
jenv "reg_result =: ys %. xs ^/ i.2"JDoubleArr
res <-getJData
jenv "reg_result" R.toList res
There are three steps to do the calculation, plus one to get a J environment.
- Use
jinit
with the appropriate file path for your platform - Marshal Haskell values and send them to the J environment. To do so, we
use
setJData
, which takes aJData
containing a repa array or a string. - Perform calculations within the J environment. Here, we use
bsDispatch
to compute some results and assign them within J - Marshal J values back to Haskell. We use
getJData
again.
Since marshaling data between J and Haskell is expensive, it's best to do as much computation as possible in J.
FFI
If you want to marshal data yourself, say to use a Vector
, look at JEnv
.
Synopsis
- data JEnv = JEnv {}
- jinit :: RawFilePath -> IO JEnv
- libLinux :: RawFilePath
- libMac :: JVersion -> RawFilePath
- bsDispatch :: JEnv -> ByteString -> IO ()
- bsOut :: JEnv -> IO ByteString
- type JVersion = [Int]
- data JData sh
- getJData :: Shape sh => JEnv -> ByteString -> IO (JData sh)
- setJData :: Shape sh => JEnv -> ByteString -> JData sh -> IO CInt
- data J
- type JDoType = Ptr J -> CString -> IO CInt
- type JGetMType = Ptr J -> CString -> Ptr CLLong -> Ptr CLLong -> Ptr (Ptr CLLong) -> Ptr (Ptr CChar) -> IO CInt
- type JGetRType = Ptr J -> IO CString
- type JSetAType = Ptr J -> CLLong -> CString -> CLLong -> Ptr () -> IO CInt
Environment
:: RawFilePath | Path to J library |
-> IO JEnv |
Get a J environment
Passing the resultant JEnv
between threads can cause unexpected bugs.
libLinux :: RawFilePath Source #
Expected RawFilePath
to the library on a Linux machine.
libMac :: JVersion -> RawFilePath Source #
Expected RawFilePath
to the library on Mac.
bsDispatch :: JEnv -> ByteString -> IO () Source #
Send some J code to the environment.
Repa
J data backed by repa array
:: Shape sh | |
=> JEnv | |
-> ByteString | Name of the value in question |
-> IO (JData sh) |
\( O(n) \) in the array size
\( O(n) \) in the array size