1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// Copyright (C) 2016 EDF
// All Rights Reserved
// This code is published under the GNU Lesser General Public License (GNU LGPL)
#ifndef OPTIMIZERNOREGRESSIONDPBASE_H
#define OPTIMIZERNOREGRESSIONDPBASE_H
#include <Eigen/Dense>
#include "StOpt/core/utils/StateWithStocks.h"
#include "StOpt/core/grids/SpaceGrid.h"
#include "StOpt/regression/BaseRegression.h"
#include "StOpt/regression/GridAndRegressedValue.h"
#include "StOpt/dp/SimulatorDPBase.h"
#include "StOpt/dp/OptimizerBaseInterp.h"
/** \file OptimizerNoRegressionDPBase.h
* \brief Define an abstract class for Dynamic Programming problems solve by Monte Carlo but without regression method
* to compute conditional expectation.
* \author Xavier Warin
*/
namespace StOpt
{
/// \class OptimizerNoRegressionDPBase OptimizerNoRegressionDPBase.h
/// Base class for optimizer for Dynamic Programming solved without regression method to compute conditional expectation.
class OptimizerNoRegressionDPBase : public OptimizerBaseInterp
{
public :
OptimizerNoRegressionDPBase() {}
virtual ~OptimizerNoRegressionDPBase() {}
/// \brief defines the diffusion cone for parallelism
/// \param p_regionByProcessor region (min max) treated by the processor for the different regimes treated
/// \return returns in each dimension the min max values in the stock that can be reached from the grid p_gridByProcessor for each regime
virtual std::vector< std::array< double, 2> > getCone(const std::vector< std::array< double, 2> > &p_regionByProcessor) const = 0;
/// \brief defines the dimension to split for MPI parallelism
/// For each dimension return true is the direction can be split
virtual Eigen::Array< bool, Eigen::Dynamic, 1> getDimensionToSplit() const = 0 ;
/// \brief defines a step in optimization
/// \param p_stock coordinates of the stock point to treat
/// \param p_valNext Optimized values at next time step for each regime
/// \param p_regressorCur Regressor at the current date
/// \return a pair :
/// - for each regimes (column) gives the solution for each particle (row)
/// - for each control (column) gives the optimal control for each particle (rows)
/// .
virtual std::pair< Eigen::ArrayXXd, Eigen::ArrayXXd> stepOptimize(const Eigen::ArrayXd &p_stock,
const std::vector< GridAndRegressedValue > &p_valNext,
std::shared_ptr< BaseRegression > p_regressorCur) const = 0;
/// \brief Defines a step in simulation using interpolation in controls
/// \param p_grid grid at arrival step after command
/// \param p_control defines the controls
/// \param p_state defines the state value (modified)
/// \param p_phiInOut defines the value function (modified): size number of functions to follow
virtual void stepSimulateControl(const std::shared_ptr< StOpt::SpaceGrid> &p_grid, const std::vector< StOpt::GridAndRegressedValue > &p_control,
StOpt::StateWithStocks &p_state,
Eigen::Ref<Eigen::ArrayXd> p_phiInOut) const = 0 ;
/// \brief Get the number of regimes allowed for the asset to be reached at the current time step
/// If \f$ t \f$ is the current time, and $\f$ dt \f$ the resolution step, this is the number of regime allowed on \f$[ t- dt, t[\f$
virtual int getNbRegime() const = 0 ;
/// \brief get the simulator back
virtual std::shared_ptr< StOpt::SimulatorDPBase > getSimulator() const = 0;
/// \brief get back the dimension of the control
virtual int getNbControl() const = 0 ;
/// \brief get size of the function to follow in simulation
virtual int getSimuFuncSize() const = 0;
};
}
#endif /* OPTIMIZERDPBASE_H */
|