Safe Haskell | None |
---|

This module contains "low-level higher order functions" for manipulating algebraic homomorphisms. You probably want to use the `HomTrainer`

type-class rather than using these functions directly.

- parallel :: (Semigroup model, NFData model, Partitionable container, PartitionableConstraint container datapoint) => (container datapoint -> model) -> container datapoint -> model
- online :: Semigroup model => (datapoint -> model) -> model -> datapoint -> model
- offline :: Monoid model => (model -> datapoint -> model) -> datapoint -> model
- batch :: (Monoid model, Functor container, FunctorConstraint container model, FunctorConstraint container datapoint, Foldable container, FoldableConstraint container model) => (datapoint -> model) -> container datapoint -> model
- unbatch :: ([datapoint] -> model) -> datapoint -> model
- semigroup :: (model -> datapoint -> model) -> (model -> datapoint) -> model -> model -> model
- reduce :: (Semigroup sg, Foldable container, FoldableConstraint container sg, FoldableConstraint container [sg]) => container sg -> sg

# Parallelism

:: (Semigroup model, NFData model, Partitionable container, PartitionableConstraint container datapoint) | |

=> (container datapoint -> model) | sequential batch trainer |

-> container datapoint -> model | parallel batch trainer |

Parallelizes any batch trainer to run over multiple processors on a single machine. The function automatically detects the number of available processors and parallelizes the function accordingly. This requires the use of unsafePerformIO, however, the result should still be safe.

# Manipulating homomorphisms

:: Semigroup model | |

=> (datapoint -> model) | singleton trainer |

-> model -> datapoint -> model | online trainer |

Converts a batch trainer into an online trainer. The input function should be a semigroup homomorphism.

:: Monoid model | |

=> (model -> datapoint -> model) | online singleton trainer |

-> datapoint -> model | singleton trainer |

The inverse of `online`

. Converts an online trainer into a batch trainer.

:: (Monoid model, Functor container, FunctorConstraint container model, FunctorConstraint container datapoint, Foldable container, FoldableConstraint container model) | |

=> (datapoint -> model) | singleton trainer |

-> container datapoint -> model | batch trainer |

Converts a singleton trainer into a batch trainer, which is also a semigroup homomorphism.

:: ([datapoint] -> model) | batch trainer |

-> datapoint -> model | singleton trainer |

Inverse of `unbatch`

. Converts a semigroup homomorphism into a singleton trainer.

:: (model -> datapoint -> model) | online trainer |

-> (model -> datapoint) | pseudo inverse |

-> model -> model -> model | The semigroup operation |

Normally we would define our semigroup operation explicitly. However, it is possible to generate one from an online trainer and a pseudo inverse.

# Helper functions

reduce :: (Semigroup sg, Foldable container, FoldableConstraint container sg, FoldableConstraint container [sg]) => container sg -> sgSource

Like fold, but (i) only for use on the semigroup operation (<>) and (ii) uses the fan-in reduction strategy which is more efficient when the semigroup operation takes nonconstant time depending on the size of the data structures being reduced.