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