------------------------------------------------------------------------
-- |
-- Module      :  Data.Datamining.Clustering.SGM
-- Copyright   :  (c) 2012-2021 Amy de Buitléir
-- License     :  BSD-style
-- Maintainer  :  amy@nualeargais.ie
-- Stability   :  experimental
-- Portability :  portable
--
-- A Self-generating Model (SGM). An SGM maps input patterns
-- onto a set, where each element in the set is a model of the input
-- data. An SGM is like a Kohonen Self-organising Map (SOM), except:
--
-- * Instead of a grid, it uses a simple set of unconnected models.
--   Since the models are unconnected, only the model that best matches
--   the input is ever updated. This makes it faster, however,
--   topological relationships within the input data are not preserved.
-- * New models are created on-the-fly when no existing model is
--   similar enough to an input pattern. If the SGM is at capacity,
--   the least useful model will be deleted.
--
-- This implementation supports the use of non-numeric patterns.
--
-- In layman's terms, a SGM can be useful when you you want to build
-- a set of models on some data. A tutorial is available at
-- <https://github.com/mhwombat/som/wiki>.
--
-- References:
--
-- * Amy de Buitléir, Mark Daly, and Michael Russell.
--   The Self-generating Model: an Adaptation of the Self-organizing Map
--   for Intelligent Agents and Data Mining.
--   In: Artificial Life and Intelligent Agents: Second International
--   Symposium, ALIA 2016, Birmingham, UK, June 14-15, 2016,
--   Revised Selected Papers.
--   Ed. by Peter R. Lewis et al. Springer International Publishing,
--   2018, pp. 59–72.
--   Available at http://amydebuitleir.eu/publications/.
--
-- * Amy de Buitléir, Michael Russell, and Mark Daly.
--   Wains: A pattern-seeking artificial life species.
--   Artificial Life, (18)4:399–423, 2012.
--   Available at http://amydebuitleir.eu/publications/.
--
-- * Kohonen, T. (1982). Self-organized formation of topologically
--   correct feature maps. Biological Cybernetics, 43 (1), 59–69.
------------------------------------------------------------------------

module Data.Datamining.Clustering.SGM
  (
    -- * Construction
    SGM(..),
    makeSGM,
    -- * Deconstruction
    time,
    isEmpty,
    numModels,
    modelMap,
    counterMap,
    modelAt,
    -- models,
    -- counters,
    -- * Learning and classification
    exponential,
    classify,
    trainAndClassify,
    train,
    trainBatch
  ) where

import           Data.Datamining.Clustering.SGMInternal