packages feed

dynobud-1.8.0.0: src/Dyno/Solvers.hs

{-# OPTIONS_GHC -Wall #-}

module Dyno.Solvers ( Solver(options, functionOptions, functionCall)
                    , Opt(..)
                    , ipoptSolver, snoptSolver, worhpSolver
                    , getSolverInternal
                    ) where

import Casadi.MXFunction ( MXFunction )
import Casadi.Option ( Opt(..) )

import Dyno.SolverInternal ( SolverInternal(..) )

data Solver =
  Solver
  { options :: [(String,Opt)]
  , functionOptions :: [(String, Opt)]
  , functionCall :: MXFunction -> IO ()
  , solverInternal :: SolverInternal
  }

-- | get the read-only part
getSolverInternal :: Solver -> SolverInternal
getSolverInternal = solverInternal

snoptSolver :: Solver
snoptSolver =
  Solver
  { options = []
  , functionOptions = []
  , functionCall = const (return ())
  , solverInternal =
       SolverInternal
       { solverName = "snopt"
       , defaultSolverOptions =
             [ -- ("_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")
             ]
       , solverInterruptCode = -2
       , successCodes = ["1"]
       }
  }

ipoptSolver :: Solver
ipoptSolver =
  Solver
  { options = []
  , functionOptions = []
  , functionCall = const (return ())
  , solverInternal =
       SolverInternal
       { solverName = "ipopt"
       , defaultSolverOptions =
             [ ("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")
             ]
       , solverInterruptCode = 1
       , successCodes = ["Solve_Succeeded", "Solved_To_Acceptable_Level"]
       }
  }

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







--_sqpSolver :: Solver
--_sqpSolver =
--  Solver
--  { solverName = "sqpmethod"
--  , defaultOptions = [ ("qp_solver", Opt "nlp")
--                     , ("qp_solver_options"
--                       , Opt [ ( "nlp_solver", Opt "ipopt")
--                             , ( "nlp_solver_options"
--                               , Opt [ ("tol", Opt (1e-12 :: Double))
--                                     , ("linear_solver", Opt "ma86")
--                                     , ("ma86_order", Opt "metis")
--                                     , ("print_level", Opt (0 :: Int))
--                                     , ("print_time", Opt False)
--                                     ]
--                               )
--                             ]
--                       )
--                     ]
--  , options = []
--  , solverInterruptCode = 1
--  , successCodes = [""]
--  , functionOptions = []
--  , functionCall = const (return ())
--  }
--