{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
module Algorithms.Geometry.LinearProgramming.Types where
import Control.Lens
import Data.Geometry.HalfSpace
import Data.Geometry.HalfLine
import Data.Geometry.Point
import Data.Geometry.Vector
data LPSolution d r = NoSolution
| Single !(Point d r)
| UnBounded (HalfLine d r)
makePrisms ''LPSolution
deriving instance (Arity d, Show r) => Show (LPSolution d r)
deriving instance (Arity d, Eq r, Fractional r) => Eq (LPSolution d r)
data LinearProgram d r = LinearProgram { _objective :: !(Vector d r)
, _constraints :: [HalfSpace d r]
}
makeLenses ''LinearProgram
deriving instance Arity d => Functor (LinearProgram d)
deriving instance (Arity d, Show r) => Show (LinearProgram d r)
deriving instance (Arity d, Fractional r, Eq r) => Eq (LinearProgram d r)