**Project Description**
This project implements a Nonogram solver with options to solve sequentially, or in parallel. The program expects nonogram files to be formatted specifically. Please see puzzles_db for a set of correctly formatted puzzles. 

**To Compile Program**
To compile the program manuall you can run:
```
bash> ghc -O2 -threaded -rtsopts -o src/nonogramSolver -package split -package array -package containers -package directory -package filepath -i./src app/Main.hs
```
Aditionally, you can call stack build:
```
$ stack build
```

**To Run Program**
```
bash> ./nonogramSolver  --<option> <file-path>
```
```
$ stack exec nonogram-project-exe -- --<option> <file-path>
```

**Example Puzzle**
You can select from any puzzle in the puzzles_db folder as they are correctly formatted. 
```
bash> ./nonogramSolver  --<option> puzzles_db/medium/42.txt
```
```
$ stack exec nonogram-project-exe -- --<option> puzzles_db/medium/42.txt
```

**Program Options**
You can run the program with the following options which affect the parallelization of the solver: 
--sequential: All steps of the solver are executed sequentially without any parallelism.
--parallel-compute: Block placement computations are parallelized, but other operations remain sequential.
--parallel-generate:  Block generation (conversion to binary arrays) is parallelized, but other operations remain sequential.
--paralllel-compute-generate: Both block placement computations and block generation are parallelized.
--parallel-iterative-solve: The iterative solving step is parallelized, but block placement and generation remain sequential.
--fully-parallel: All major steps (block placement, block generation, and iterative solving) are parallelized.

**Testing**
To verify the correcteness of our solver we have implemented tests with the Haskell test. You can run them as follows:
```
$ stack test
```
