## Gosl â Go scientific library

Gosl is a Go library to develop Artificial Intelligence and High-Performance Scientific Computations.

**NOTICE** 2020-02-14 Thank you, Contributors!!!

The library tries to be as general and as *easy* as possible. Gosl considers the use of both Go concurrency routines and parallel computing using the message passing interface (MPI). Gosl has several modules (sub-packages) for a variety of tasks in scientific computing, image analysis, and data post-processing.

Gosl includes high-performant linear algebra functions (wrapping MKL, OpenBLAS, LAPACK, SuiteSparse, UMFPACK...), fast Fourier transform algorithms (wrapping FFTW), numerical integration (wrapping QUADPACK), functions and structures for geometry calculations (e.g. 3D transfinite interpolation, grid search, octree...), random numbers generation (SFMT and DSFMT) and probability distributions, optimisation and graph algorithms, plotting and visualisation using the VTK, and much more.

Gosl has also solvers to (stiff or not) ordinary differential equations and several tools for 2D/3D mesh generation to assist on the development of solvers for partial differential equations.

We now give focus to Machine Learning (see `ml`

package) and Big Data (see `h5`

package). We are also planning wrappers to powerful tools such as CNTK, TensorFlow, and Hadoop. We have a wrapper to OpenCV in the works as well.

## Resources

## Installation

Gosl works on Windows, macOS, and Linux (Debian, Ubuntu).

For installation instructions, click on:

Alternatively, to use Docker, click on:

The Docker image contains Ubuntu and all the dependencies, including MPI and VTK.

`docker pull gosl/gosl`

## Usage

Type:

```
cd /tmp && mkdir -p try-gosl && cd try-gosl
go mod init try-gosl
```

Create the file `try-gosl/main.go`

:

```
package main
import (
"github.com/cpmech/gosl/fun"
"github.com/cpmech/gosl/io"
)
func main() {
i0 := fun.ModBesselI0(-10)
io.Pf("Modified Bessel I0(-10) = %g\n", i0)
}
```

Run:

`go run main.go`

Output:

```
Modified Bessel I0(-10) = 2815.716628466253
```

## Sub-packages

Gosl includes the following *sub-packages*:

- chk â Check code and unit test tools
- io â Input/output, read/write files, and print commands
- io/h5 â Read/write HDF5 (Big Data) files
- utl â Utilities. Lists. Dictionaries. Simple Numerics
- utl/al â Utilities. (Naive) Implementation of Classic algorithms and structures (e.g. Linked Lists)
- plt â Plotting and drawing (png and eps)
- mpi â Message Passing Interface for parallel computing
- la â Linear Algebra: vector, matrix, efficient sparse solvers, eigenvalues, decompositions, etc.
- la/mkl â Lower level linear algebra using Intel MKL
- la/oblas â Lower level linear algebra using OpenBLAS
- num/qpck â Go wrapper to QUADPACK for numerical integration
- num â Fundamental numerical methods such as root solvers, non-linear solvers, numerical derivatives and quadrature
- fun â Special functions, DFT, FFT, Bessel, elliptical integrals, orthogonal polynomials, interpolators
- fun/dbf â Database of functions of a scalar and a vector like f(t,{x}) (e.g. time-space)
- fun/fftw â Go wrapper to FFTW for fast Fourier Transforms
- gm â Geometry algorithms and structures
- gm/msh â Mesh structures and interpolation functions for FEA, including quadrature over polyhedra
- gm/tri â Mesh generation: triangles and Delaunay triangulation (wrapping Triangle)
- gm/rw â Mesh generation: read/write routines
- graph â Graph theory structures and algorithms
- opt â Numerical optimization: Interior Point, Conjugate Gradients, Powell, Grad Descent, more
- rnd â Random numbers and probability distributions
- rnd/dsfmt â Go wrapper to dSIMD-oriented Fast Mersenne Twister
- rnd/sfmt â Go wrapper to SIMD-oriented Fast Mersenne Twister
- vtk â 3D Visualisation with the VTK tool kit
- ode â Solvers for ordinary differential equations
- ml â Machine learning algorithms
- ml/imgd â Machine learning. Auxiliary functions for handling images
- pde â Solvers for partial differential equations (FDM, Spectral, FEM)
- tsr â Tensors, continuum mechanics, and tensor algebra (e.g. eigendyads)

We are currently working on the following additional packages:

- img - Image and machine learning algorithms for images
- img/ocv - Wrapper to OpenCV

## About the filenames

`t_something_test.go`

is a**unit test**. We have several of them! Some usage information can be learned from these files.`t_something_main.go`

is a test with a main function to be run with`go run ...`

or`mpirun -np ? go run ...`

(replace ? with the number of cpus).`t_b_something_test.go`

is a benchmark test. Run benchmarks with`go test -run=XXX -bench=.`

## Design strategies

Here, we call *structure* any *user-defined type*. These are simply Go `types`

defined as `struct`

. One may think of these *structures* as *classes*. Gosl has several global functions as well and tries to avoid complicated constructions.

An allocated structure (instance) is called an **object** and functions attached to this object are called **methods**. In Gosl, the variable holding the pointer to an object is always named **o** (lower case "o"). This variable is similar to the `self`

or `this`

keywords in other languages (Python, C++, respectively).

Functions that allocate a pointer to a structure are prefixed with `New`

; for instance: `NewIsoSurf`

. Some structures require an explicit call to another function to release allocated memory. Be aware of this requirement! In this case, the function is named `Free`

and appears in a few sub-packages that use CGO. Also, some objects may need to be initialized before use. In this case, functions named `Init`

have to be called.

The directories corresponding to each package have a README.md file that should help with understanding the library. Also, there are links to `pkg.go.dev`

where all functions, structures, and variables are well explained.

## Test coverage

We aim for a 100% test coverage! Despite trying our best to accomplish this goal, full coverage is difficult, in particular with (sub)packages that involve `Panic`

or `figure generation`

. Nonetheless, critical algorithms are completely tested.

We use the following `bash`

macro frequently to check our test coverage:

```
gocov() {
go test -coverprofile=/tmp/cv.out
go tool cover -html=/tmp/cv.out
}
```

### Some results from cover.run

- chk test coverage
- io test coverage
- utl test coverage
- utl/al test coverage
- fun/dbf test coverage
- gm/tri test coverage
- gm/rw test coverage
- rnd test coverage
- rnd/dsfmt test coverage
- rnd/sfmt test coverage

## Bibliography

The following works take advantage of Gosl:

- Pedroso DM, Bonyadi MR, Gallagher M (2017) Parallel evolutionary algorithm for single and multi-objective optimisation: differential evolution and constraints handling, Applied Soft Computing http://dx.doi.org/10.1016/j.asoc.2017.09.006 paper available here
- Pedroso DM (2017) FORM reliability analysis using a parallel evolutionary algorithm, Structural Safety 65:84-99 http://dx.doi.org/10.1016/j.strusafe.2017.01.001
- Pedroso DM, Zhang YP, Ehlers W (2017) Solution of liquid-gas-solid coupled equations for porous media considering dynamics and hysteretic retention behaviour, Journal of Engineering Mechanics 04017021 http://dx.doi.org/10.1061/(ASCE)EM.1943-7889.0001208
- Pedroso DM (2015) A solution to transient seepage in unsaturated porous media. Computer Methods in Applied Mechanics and Engineering, 285:791-816 http://dx.doi.org/10.1016/j.cma.2014.12.009
- Pedroso DM (2015) A consistent u-p formulation for porous media with hysteresis. Int. Journal for Numerical Methods in Engineering, 101(8):606-634 http://dx.doi.org/10.1002/nme.4808

## Authors and license

See the AUTHORS file.

Unless otherwise noted, the Gosl source files are distributed under the BSD-style license found in the LICENSE file.