packages feed

dynobud-1.3.0.0: src/Dyno/Solvers.hs

{-# OPTIONS_GHC -Wall #-}

module Dyno.Solvers ( Solver(..)
                    , Opt(..)
                    , ipoptSolver, snoptSolver, worhpSolver
                    ) where

import Casadi.Core.Classes.Function ( Function )
import Casadi.Option ( Opt(..) )

data Solver =
  Solver
  { solverName :: String
  , defaultOptions :: [(String,Opt)]
  , options :: [(String,Opt)]
  , solverInterruptCode :: Int
  , successCodes :: [String]
  , functionOptions :: [(String, Opt)]
  , functionCall :: Function -> IO ()
  }

snoptSolver :: Solver
snoptSolver =
  Solver
  { solverName = "snopt"
  , defaultOptions = [ -- ("_iprint", Opt (0::Int))
--                       , ("_isumm", Opt (6::Int))
--                       , ("_scale_option", Opt (0::Int))
--                       , ("_major_iteration_limit", Opt (3 :: Int))
--                       , ("_minor_iteration_limit", Opt (2000 :: Int))
--                       , ("_verify_level", Opt (2 :: Int))
--                       , ("_optimality_tolerance", Opt (1e-1 :: Double))
--                       , ("_feasibility_tolerance", Opt (1e-1 :: Double))
--                       , ("detect_linear", Opt False)
--                       , ("monitor", Opt (V.fromList ["setup_nlp"]) )
--                       , ("_start", Opt "Warm")
                     ]
  , options = []
  , solverInterruptCode = -2
  , successCodes = ["1"]
  , functionOptions = []
  , functionCall = const (return ())
  }

ipoptSolver :: Solver
ipoptSolver =
  Solver
  { solverName = "ipopt"
  , defaultOptions = [ ("max_iter", Opt (3000 :: Int))
                     , ("tol", Opt (1e-9 :: Double))
--                     , ("hessian_approximation", Opt "limited-memory")
--                     , ("expand", Opt True)
--                     , ("linear_solver", Opt "ma27")
--                     , ("linear_solver", Opt "ma57")
--                     , ("linear_solver", Opt "ma86")
--                     , ("linear_solver", Opt "ma97")
--                     , ("fixed_variable_treatment", Opt "make_constraint") -- causes segfaults?
--                     , ("fixed_variable_treatment", Opt "make_parameter")
                     ]
  , options = []
  , solverInterruptCode = 1
  , successCodes = ["Solve_Succeeded", "Solved_To_Acceptable_Level"]
  , functionOptions = []
  , functionCall = const (return ())
  }

worhpSolver :: Solver
worhpSolver =
  Solver
  { solverName = "worhp"
  , defaultOptions = []
  , options = []
  , solverInterruptCode = 1
  , successCodes = [ "OptimalSolution"
                   , "LowPassFilterOptimal"
                   ]
  , functionOptions = []
  , functionCall = const (return ())
  }