9#ifndef pRC_ALGORITHMS_OPTIMIZER_LBFGSB_H
10#define pRC_ALGORITHMS_OPTIMIZER_LBFGSB_H
30 template<
class LS = LineSearch::MoreThuente, Size M = 5>
34 static constexpr Size defaultMaxIterations()
39 template<
class X,
class G,
class L,
class U,
class T>
40 static constexpr auto projectedGradientConverged(
X const &
x,
G const &
g,
51 template<
class F,
class T>
52 static constexpr auto valueConverged(F
const &
f0, F
const &
f,
60 template<
class S,
class Y,
class STY,
class J,
class T>
109 template<
class X,
class G,
class LB,
class UB,
class T,
class S,
110 class Y,
class STY,
class J,
class C>
111 static constexpr auto computeGeneralizedCauchyPoint(
X const &
x,
116 using TX =
typename X::Type;
125 for(
Index i = 0;
i < X::size(); ++
i)
131 [&
t](
auto const i,
auto const j)
140 for(
Index m = 0; m < s.size(); ++m)
148 auto const mp = applyMiddleMatrix(
sTy,
j,
p, s.size());
155 while(
t[b] <=
zero())
179 auto const z =
xCP[b] -
x[b];
189 for(
Index m = 0; m < s.size(); ++m)
191 w0(m) =
y.front(m)[b];
195 auto wM = applyMiddleMatrix(
sTy,
j,
w, s.size());
226 template<
class X,
class CP,
class G,
class LB,
class UB,
class T,
227 class S,
class Y,
class STY,
class J,
class C>
228 static constexpr auto minimizeSubspace(
X const &
x,
CP &
xCP,
G const &
g,
230 S const &s,
Y const &
y,
STY const &
sTy,
J const &
j,
C const &c)
232 using TX =
typename X::Type;
235 Tensor const mc = applyMiddleMatrix(
sTy,
j, c, s.size());
236 for(
Index m = 0; m < s.size(); ++m)
238 r +=
y.front(m) *
mc(m);
239 r += s.front(m) *
theta *
mc(M + m);
244 for(
Index i = 0;
i < X::size(); ++
i)
259 for(
Index m = 0; m < s.size(); ++m)
269 for(
Index m = 0; m <
y.size(); ++m)
286 for(
Index m = 0; m <
zTy.size(); ++m)
288 for(
Index n = 0; n <
zTy.size(); ++n)
302 for(
Index m = 0; m <
zTy.size(); ++m)
304 for(
Index n = 0; n <
zTs.size(); ++n)
318 for(
Index m = 0; m < s.size(); ++m)
320 for(
Index n = 0; n < s.size(); ++n)
334 for(
Index m = 0; m <
zTy.size(); ++m)
338 for(
Index m = 0; m <
zTs.size(); ++m)
348 for(
Index m = 0; m <
zTy.size(); ++m)
401 template<
class X,
class P,
class LB,
class UB>
402 static constexpr auto getLineSearchParameters(
X const &
x,
P const &
p,
405 using TX =
typename X::Type;
409 for(
Index i = 0;
i < X::size(); ++
i)
468 return mMaxIterations;
471 template<
class XX,
class RX = RemoveReference<XX>,
472 class TX =
typename RX::Type,
class VX =
typename TX::Value,
473 If<IsTensorish<RX>> = 0,
474 class RXE = RemoveConstReference<ResultOf<Eval, XX>>,
class FF,
475 If<IsInvocable<FF, RXE const &, RXE &>> = 0,
476 If<IsFloat<ResultOf<FF, RXE const &, RXE &>>> = 0,
class FC,
477 If<IsInvocable<FC, RXE>> = 0,
478 class XL = decltype(unit<RX>(NumericLimits<VX>::lowest())),
479 class RL = RemoveReference<XL>,
class TL =
typename RL::Type,
480 class VL =
typename TL::Value, If<IsTensorish<RL>> = 0,
481 class XU = decltype(unit<RX>(NumericLimits<VX>::max())),
482 class RU = RemoveReference<XU>,
class TU =
typename RU::Type,
483 class VU =
typename TU::Value, If<IsTensorish<RU>> = 0,
484 class VT = Common<VX, VL, VU>,
485 If<All<IsFloat<VX>, IsFloat<VT>>> = 0,
486 If<IsSame<
typename RX::Dimension,
typename RL::Dimension,
487 typename RU::Dimension>> = 0,
488 If<IsSame<
typename RX::Sizes,
typename RL::Sizes,
489 typename RU::Sizes>> = 0,
490 If<IsInvocable<LS, RXE &, ResultOf<FF, RXE const &, RXE &> &, RXE &,
491 VX &, FF, RXE(RXE const &), RXE const &, VX, VX, VX>> = 0>
510 "L-BFGS-B: Initial parameters not in range "
578 if(valueConverged(
f0,
f, tolerance))
605 for(
Index n = 0; n <
y.size(); ++n)
641 LS const mLineSearch;
642 Size const mMaxIterations;
constexpr auto size() const
Definition deque.hpp:28
constexpr decltype(auto) front(Index const position=0) &&
Definition deque.hpp:33
constexpr auto pushBack(R const &element) &&
Definition deque.hpp:133
constexpr auto emplaceBack(Args &&...args) &&
Definition deque.hpp:163
constexpr LBFGSB(Size const maxIterations=defaultMaxIterations())
Definition lbfgsb.hpp:456
constexpr LBFGSB(LS const &lineSearch, Size const maxIterations=defaultMaxIterations())
Definition lbfgsb.hpp:449
constexpr auto & lineSearch() const
Definition lbfgsb.hpp:461
constexpr auto maxIterations() const
Definition lbfgsb.hpp:466
constexpr auto operator()(XX &&x0, FF &&function, FC &&callback, VT const &tolerance=NumericLimits< VT >::tolerance(), XL &&lowerBound=unit< RL >(NumericLimits< VL >::lowest()), XU &&upperBound=unit< RU >(NumericLimits< VU >::max())) const
Definition lbfgsb.hpp:492
Class storing tensors.
Definition tensor.hpp:44
static void info(Xs &&...args)
Definition log.hpp:27
static void error(Xs &&...args)
Definition log.hpp:14
static constexpr auto extractDiagonal(X &&a)
Extracts the diagonal of a Tensor.
Definition extract_diagonal.hpp:28
static constexpr X eval(X &&a)
Definition eval.hpp:11
static constexpr X min(X &&a)
Definition min.hpp:13
static constexpr auto diagonal(X &&a)
Transforms a Tensor into diagonal form.
Definition diagonal.hpp:26
static constexpr auto rcp(Complex< T > const &b)
Definition rcp.hpp:13
static constexpr auto cholesky(X &&a)
Definition cholesky.hpp:24
static constexpr auto zero()
Definition zero.hpp:12
std::size_t Size
Definition type_traits.hpp:20
Conditional< IsSatisfied<((Ns *... *1) *sizeof(T) > cHugepageSizeByte)>, HeapArray< T, Ns... >, StackArray< T, Ns... > > Array
Definition type_traits.hpp:60
static constexpr auto transpose(JacobiRotation< T > const &a)
Definition jacobi_rotation.hpp:319
static constexpr T where(TE const e, T &&a, T &&b)
Definition where.hpp:12
static constexpr void sort(C const &compare, T &a, Size const k=T::size(), Size const d=0)
Definition sort.hpp:15
static constexpr auto square(Complex< T > const &a)
Definition square.hpp:14
static constexpr auto strictlyLowerTriangular(X &&a)
Transforms a Tensor into strictly lower triangular form.
Definition strictly_lower_triangular.hpp:22
static constexpr auto delta(Complex< TA > const &a, Complex< TB > const &b)
Definition delta.hpp:12
static constexpr auto abs(Complex< T > const &a)
Definition abs.hpp:12
static constexpr Conditional< IsSatisfied< C >, RemoveConstReference< X >, X > copy(X &&a)
Definition copy.hpp:13
constexpr auto cDebugLevel
Definition config.hpp:46
std::is_reference< T > IsReference
Definition type_traits.hpp:47
static constexpr auto scalarProduct(Complex< TA > const &a, Complex< TB > const &b)
Definition scalar_product.hpp:13
Size Index
Definition type_traits.hpp:21
static constexpr auto identity()
Definition identity.hpp:12
static constexpr X max(X &&a)
Definition max.hpp:13