DiSMEC++
margin_losses.h
Go to the documentation of this file.
1 // Copyright (c) 2021, Aalto University, developed by Erik Schultheis
2 // All rights reserved.
3 //
4 // SPDX-License-Identifier: MIT
5 
6 #ifndef DISMEC_SRC_OBJECTIVE_MARGIN_LOSSES_H
7 #define DISMEC_SRC_OBJECTIVE_MARGIN_LOSSES_H
8 
9 #include "config.h"
10 #include <cmath>
11 
12 // The structs defined here are used in a template.
13 
14 namespace dismec::objective {
15  struct SquaredHingePhi {
16  [[nodiscard]] real_t value(real_t margin) const {
17  real_t value = std::max(real_t{0}, real_t{1.0} - margin);
18  return value * value;
19  }
20 
21  [[nodiscard]] real_t grad(real_t margin) const {
22  real_t value = std::max(real_t{0}, real_t{1.0} - margin);
23  return -real_t{2} * value;
24  }
25 
26  [[nodiscard]] real_t quad(real_t margin) const {
27  real_t value = real_t{1.0} - margin;
28  return value > 0 ? real_t{2} : real_t{0};
29  }
30  };
31 
32  struct HuberPhi {
33  [[nodiscard]] real_t value(real_t margin) const {
34  real_t value = std::max(real_t{0}, real_t{1.0} - margin);
35  if(value > Epsilon) return value - Epsilon/2;
36  return real_t{0.5} * value*value / Epsilon;
37  }
38 
39  [[nodiscard]] real_t grad(real_t margin) const {
40  real_t value = std::max(real_t{0}, real_t{1} - margin);
41  if(value > Epsilon) {
42  return -real_t{1};
43  } else if(value == real_t{0}) {
44  return real_t{0};
45  } else {
46  return -value / Epsilon;
47  }
48  }
49 
50  [[nodiscard]] real_t quad(real_t margin) const {
51  real_t value = std::max(real_t{0}, real_t{1.0} - margin);
52  if(value > Epsilon) return real_t{1.0} / value;
53  if(value == 0) return real_t{0};
54  return real_t{1} / Epsilon;
55  }
56 
58  };
59 
60  struct LogisticPhi {
61  [[nodiscard]] real_t value(real_t margin) const {
62  real_t exp_part = std::exp(-margin);
63  if(std::isfinite(exp_part)) {
64  return std::log1p(exp_part);
65  } else {
66  return -margin;
67  }
68  }
69 
70  [[nodiscard]] real_t grad(real_t margin) const {
71  real_t exp_part = std::exp(margin);
72  if(std::isfinite(exp_part)) {
73  return -real_t{1} / (real_t{1} + exp_part);
74  } else {
75  return 0;
76  }
77  }
78 
79  [[nodiscard]] real_t quad(real_t margin) const {
80  real_t exp_part = std::exp(margin);
81  if(std::isfinite(exp_part)) {
82  return exp_part / std::pow(1 + exp_part, real_t{2});
83  } else {
84  return 0;
85  }
86  }
87  };
88 }
89 
90 #endif //DISMEC_SRC_OBJECTIVE_MARGIN_LOSSES_H
Defines configuration variables.
float real_t
The default type for floating point values.
Definition: config.h:17
real_t value(real_t margin) const
Definition: margin_losses.h:33
real_t grad(real_t margin) const
Definition: margin_losses.h:39
real_t quad(real_t margin) const
Definition: margin_losses.h:50
real_t grad(real_t margin) const
Definition: margin_losses.h:70
real_t quad(real_t margin) const
Definition: margin_losses.h:79
real_t value(real_t margin) const
Definition: margin_losses.h:61
real_t quad(real_t margin) const
Definition: margin_losses.h:26
real_t value(real_t margin) const
Definition: margin_losses.h:16
real_t grad(real_t margin) const
Definition: margin_losses.h:21