QMCPACK
MinimizeOneDim.h File Reference
+ Include dependency graph for MinimizeOneDim.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  Bracket_min_t< T >
 

Functions

template<class F , typename T >
Bracket_min_t< T > bracket_minimum (const F &f, T initial_value, T bound_max=-1.0)
 
template<class F , typename T >
std::pair< T, T > find_minimum (const F &f, Bracket_min_t< T > &bracket)
 

Function Documentation

◆ bracket_minimum()

Bracket_min_t<T> bracket_minimum ( const F &  f,
initial_value,
bound_max = -1.0 
)

Definition at line 43 of file MinimizeOneDim.h.

Referenced by MinTest::find_bracket(), MinTest::find_bracket_bound(), MinTest::find_min(), qmcplusplus::minimizeForPhiAtZero(), and qmcplusplus::minimizeForRc().

44 {
45  T xa = initial_value;
46  T fa = f(xa);
47 
48  T xb = xa + 0.005;
49  T fb = f(xb);
50 
51  // swap a and b
52  if (fb > fa)
53  {
54  std::swap(xa, xb);
55  std::swap(fa, fb);
56  }
57 
58  bool check_bound = false;
59  if (bound_max > 0.0)
60  {
61  check_bound = true;
62  }
63  T best_val = xb;
64 
65  T delx = 1.61 * (xb - xa);
66  T xd = xb + delx;
67  T fd = f(xd);
68 
69  int cnt = 0;
70  while (fb > fd)
71  {
72  T xtmp = xb;
73  T ftmp = fb;
74  xb = xd;
75  fb = fd;
76  xa = xtmp;
77  fa = ftmp;
78  xd += delx;
79  if (check_bound && (xd < 0.0 || xd > bound_max))
80  {
81  // minimum occurs at the boundary of the range
82  return Bracket_min_t<T>(best_val, 0.0, 0.0, false);
83  }
84 
85 
86  fd = f(xd);
87 
88  if (cnt == 50)
89  {
90  delx *= 5;
91  }
92  if (cnt == 100)
93  {
94  delx *= 5;
95  }
96  if (cnt == 1000)
97  {
98  delx *= 5;
99  }
100  if (cnt == 10000)
101  {
102  delx *= 5;
103  }
104  cnt++;
105  if (cnt == 100000)
106  {
107  throw std::runtime_error("Failed to bracket minimum");
108  }
109  }
110  if (xa > xd)
111  std::swap(xa, xd);
112  return Bracket_min_t<T>(xa, xb, xd);
113 }

◆ find_minimum()

std::pair<T, T> find_minimum ( const F &  f,
Bracket_min_t< T > &  bracket 
)

Definition at line 120 of file MinimizeOneDim.h.

References Bracket_min_t< T >::a, qmcplusplus::abs(), Bracket_min_t< T >::b, Bracket_min_t< T >::c, and qmcplusplus::Units::charge::e.

Referenced by MinTest::find_min(), qmcplusplus::minimizeForPhiAtZero(), and qmcplusplus::minimizeForRc().

121 {
122  // assert(bracket.success == true);
123  T xa = bracket.a;
124  T xb = bracket.b;
125  T xd = bracket.c;
126  T fb = f(xb);
127  T xc = xb + 0.4 * (xd - xb);
128  T fc = f(xc);
129 
130  T tol = 1e-5;
131  while (std::abs(xa - xd) > tol * (std::abs(xb) + std::abs(xc)))
132  {
133  if (fb > fc)
134  {
135  xa = xb;
136  xb = xa + 0.4 * (xd - xa);
137  fb = f(xb);
138  xc = xa + 0.6 * (xd - xa);
139  fc = f(xc);
140  }
141  else
142  {
143  xd = xc;
144  xb = xa + 0.4 * (xd - xa);
145  fb = f(xb);
146  xc = xa + 0.6 * (xd - xa);
147  fc = f(xc);
148  }
149  }
150  T final_value;
151  T final_x;
152  if (fb < fc)
153  {
154  final_x = xb;
155  }
156  else
157  {
158  final_x = xc;
159  }
160  final_value = f(final_x);
161  return std::pair<T, T>(final_x, final_value);
162 }
MakeReturn< UnaryNode< FnFabs, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t abs(const Vector< T1, C1 > &l)