1 #ifndef STAN_MATH_FWD_SCAL_FUN_FMIN_HPP
2 #define STAN_MATH_FWD_SCAL_FUN_FMIN_HPP
3 
4 #include <stan/math/fwd/core.hpp>
5 #include <stan/math/prim/scal/fun/constants.hpp>
6 #include <stan/math/prim/scal/fun/fmin.hpp>
7 #include <stan/math/prim/scal/fun/is_nan.hpp>
8 #include <stan/math/prim/scal/meta/likely.hpp>
9 
10 namespace stan {
11 namespace math {
12 
13 template <typename T>
fmin(const fvar<T> & x1,const fvar<T> & x2)14 inline fvar<T> fmin(const fvar<T>& x1, const fvar<T>& x2) {
15   if (unlikely(is_nan(x1.val_))) {
16     if (is_nan(x2.val_))
17       return fvar<T>(fmin(x1.val_, x2.val_), NOT_A_NUMBER);
18     else
19       return fvar<T>(x2.val_, x2.d_);
20   } else if (unlikely(is_nan(x2.val_))) {
21     return fvar<T>(x1.val_, x1.d_);
22   } else if (x1.val_ < x2.val_) {
23     return fvar<T>(x1.val_, x1.d_);
24   } else if (x1.val_ == x2.val_) {
25     return fvar<T>(x1.val_, NOT_A_NUMBER);
26   } else {
27     return fvar<T>(x2.val_, x2.d_);
28   }
29 }
30 
31 template <typename T>
fmin(double x1,const fvar<T> & x2)32 inline fvar<T> fmin(double x1, const fvar<T>& x2) {
33   if (unlikely(is_nan(x1))) {
34     if (is_nan(x2.val_))
35       return fvar<T>(fmin(x1, x2.val_), NOT_A_NUMBER);
36     else
37       return fvar<T>(x2.val_, x2.d_);
38   } else if (unlikely(is_nan(x2.val_))) {
39     return fvar<T>(x1, 0.0);
40   } else if (x1 < x2.val_) {
41     return fvar<T>(x1, 0.0);
42   } else if (x1 == x2.val_) {
43     return fvar<T>(x2.val_, NOT_A_NUMBER);
44   } else {
45     return fvar<T>(x2.val_, x2.d_);
46   }
47 }
48 
49 template <typename T>
fmin(const fvar<T> & x1,double x2)50 inline fvar<T> fmin(const fvar<T>& x1, double x2) {
51   if (unlikely(is_nan(x1.val_))) {
52     if (is_nan(x2))
53       return fvar<T>(fmin(x1.val_, x2), NOT_A_NUMBER);
54     else
55       return fvar<T>(x2, 0.0);
56   } else if (unlikely(is_nan(x2))) {
57     return fvar<T>(x1.val_, x1.d_);
58   } else if (x1.val_ < x2) {
59     return fvar<T>(x1.val_, x1.d_);
60   } else if (x1.val_ == x2) {
61     return fvar<T>(x1.val_, NOT_A_NUMBER);
62   } else {
63     return fvar<T>(x2, 0.0);
64   }
65 }
66 
67 }  // namespace math
68 }  // namespace stan
69 #endif
70