# HNumeric

![Travis](https://travis-ci.org/Axect/HNumeric.svg?branch=master)

## Packages

* HNum.Vector : Contain vector, matrix, linear algebra
* HNum.Stats  : Contain statistical functions
* HNum.CSV    : CSV Tools for HNum (Contain DataFrame)
* HNum.F      : Functional Programming Tools for HNum

## Installation

### 1. Cabal Install

```sh
cabal update
cabal install HNumeric
```

That's all!

### 2. Import to Stack project

If you use this package to your own project, then you should change `stack.yaml` and `package.yaml`

#### 1) Change `stack.yaml`

```yaml
# In stack.yaml
extra-deps:
  - git: https://github.com/Axect/HNumeric.git
    commit: [Latest Commit]
  - normaldistribution-1.1.0.3
  - random-1.1
```

* Replace [Latest Commit] with latest commit in [HNumeric Commit](https://github.com/Axect/HNumeric/commits/master)

#### 2) Change `package.yaml`

```yaml
# In package.yaml
dependecies:
- base
- HNumeric
- normaldistribution
- random
```

Then enjoy!

## Documentation

Documentation is prepared on authorea

[HNumeric Documentation](https://www.authorea.com/users/223838/articles/307659-hnumeric-documentation)

## Usage

### Import Module

* HNum.Vector
* HNum.Stats
* HNum.CSV
* HNum.F

### Basic Vector Usage

```haskell
-- HNumeric-0.3.0.0 Documentation

let a = vector [1,2,3] -- Vector declaration
let b = Vector [4,5,6] -- small v and large V are same (for convenient)

-- Print Vector
print a

-- You can (+1) by fmap (Vector is functor)
(+1) <$> a 

-- Or MATLAB-like operator (.+, .-, .*, ./, .^)
a .+ 1 -- do not 1 .+ a (. means position of vector)

-- You can make list from vector
toList a -- [1, 2, 3]

-- You can make vector from list
fromList [1,2,3] -- Vector [1,2,3]

-- You can add (subtract, multiply, divide) vectors
a + b -- Vector [5,7,9]

-- Also dot product is here.
a .*. b -- 1*4 + 2*5 + 3*6 = 32

-- Declare Matrix (Syntactic Sugar)
let c = matrix [[1,2],[3,4]]

-- or Declare using R Syntax
let d = Matrix {val = Vector [5,6,7,8], row = 2, col = 2, byRow = True}

-- Determinant
det c

-- Inverse
inv c

-- Transpose
transpose c

-- Matrix ops with Constant (+, -, *, /, ^)
c .+ 1 -- Matrix [[2,3],[4,5]]

-- Matrix ops with Matrix (+, -)
c + c -- Matrix [[2,4],[6,8]]

-- Matrix Multiplication
c %*% d

-- Matrix - Inverse Multiplication
c %/% d

-- Vector Concatenate
hcat a b -- Vector [1,2,3,4,5,6]
vcat a b -- Matrix [[1,2,3],[4,5,6]]

-- Matrix Concatenate
hcat c d -- Matrix [[1,2,5,6],[3,4,7,8]]
vcat c d -- Matrix [[1,2],[3,4],[5,6],[7,8]]

-- Insert Vector to Matrix
vector [1, 2] .: c -- Matrix [[1,2],[1,2],[3,4]]
```

### Basic Stats Usage

```haskell
-- Sample Vector (import Vector)
v = vector [1..10]
w = vector [10, 9 .. 1]

-- Mean
mean v

-- Var
var v

-- Std
std v

-- Cov Matrix
cov v w

-- Only Cov
cov' v w

-- Linear Fit
(intercept, slope) = lm v w -- (11.0, -1.0) -- (Intercept, Slope)

-- Linear Fit function
lineFit (intercept, slope) (Vector [1 .. 20])

-- RSS
rss v w

-- RSE
rse v w
```

### DONE

* Effective Matrix Structure (R-like Structure)
* Divide and Conquer Matrix Multiplication, Determinant, Inverse
* Module CSV with DataFrame (read / write)
* FuncTools

### TODO (2018.06.13)

* DSL Documentation by LaTeX (Developing)
* More Statistical Tools
