dynobud-1.3.0.0: src/Dyno/DirectCollocation.hs
{-# OPTIONS_GHC -Wall #-}
{-# Language ScopedTypeVariables #-}
module Dyno.DirectCollocation
( CollTraj(..)
, CollProblem(..)
, makeCollProblem
, solveOcp
) where
import Data.Proxy
import Data.Vector ( Vector )
import Dyno.View.View ( J, jfill )
import Dyno.Vectorize ( Vectorize )
import Dyno.Ocp ( OcpPhase )
import Dyno.NlpUtils ( solveNlp )
import Dyno.Solvers ( Solver )
import Dyno.Nlp ( Nlp(..) )
import Dyno.DirectCollocation.Formulate ( CollProblem(..), makeCollProblem )
import Dyno.DirectCollocation.Types ( CollTraj(..) )
import Dyno.DirectCollocation.Dynamic ( DynPlotPoints )
import Dyno.DirectCollocation.Quadratures ( QuadratureRoots )
import qualified Dyno.TypeVecs as TV
solveOcp ::
forall x z u p r o c h q .
(Vectorize x, Vectorize z, Vectorize u, Vectorize p,
Vectorize r, Vectorize o, Vectorize c, Vectorize h, Vectorize q)
=> QuadratureRoots -> Solver -> Int -> Int -> Maybe (DynPlotPoints Double -> IO Bool)
-> OcpPhase x z u p r o c h q
-> IO (Either String String)
solveOcp roots solverStuff n deg cb0 ocp =
TV.reifyDim n $ \(Proxy :: Proxy n) ->
TV.reifyDim deg $ \(Proxy :: Proxy deg) -> do
let guess :: J (CollTraj x z u p n deg) (Vector Double)
guess = jfill 1
cp <- makeCollProblem roots ocp
let nlp = cpNlp cp
toPlotPoints = cpPlotPoints cp
--_ <- solveNlp solverStuff (nlp {nlpX0 = guess}) (fmap (. ctToDynamic) cb)
let cb = case cb0 of
Nothing -> Nothing
Just cb' -> Just $ \x -> toPlotPoints x >>= cb'
(res, _) <- solveNlp solverStuff (nlp {nlpX0 = guess}) cb
return res