44 #include <ilqgames/cost/weighted_convex_proximity_cost.h> 45 #include <ilqgames/utils/types.h> 47 #include <glog/logging.h> 51 float WeightedConvexProximityCost::Evaluate(
const VectorXf& input)
const {
52 const float dx = input(xidx1_) - input(xidx2_);
53 const float dy = input(yidx1_) - input(yidx2_);
55 input(vidx1_) * input(vidx1_) + input(vidx2_) * input(vidx2_);
57 if (dx * dx >= threshold_sq_ || dy * dy >= threshold_sq_)
return 0.0;
59 const float delta_x = (threshold_ - std::abs(dx));
60 const float delta_y = (threshold_ - std::abs(dy));
61 return 0.5 * weight_ * vv * std::min(delta_x * delta_x, delta_y * delta_y);
64 void WeightedConvexProximityCost::Quadraticize(
const VectorXf& input,
66 VectorXf* grad)
const {
71 CHECK_EQ(input.size(), hess->rows());
72 CHECK_EQ(input.size(), hess->cols());
73 CHECK_EQ(input.size(), grad->size());
76 const float dx = input(xidx1_) - input(xidx2_);
77 const float dy = input(yidx1_) - input(yidx2_);
79 input(vidx1_) * input(vidx1_) + input(vidx2_) * input(vidx2_);
81 if (dx * dx >= threshold_sq_ || dy * dy >= threshold_sq_)
return;
84 const float delta_x = threshold_ - std::abs(dx);
85 const float delta_y = threshold_ - std::abs(dy);
87 const bool is_x_active = delta_x * delta_x < delta_y * delta_y;
91 const float dx1 = -weight_ * delta_x * vv;
92 const float dv1 = -weight_ * input(vidx1_) * delta_x * delta_x;
93 const float dv2 = -weight_ * input(vidx2_) * delta_x * delta_x;
94 const float ddx1 = weight_;
95 const float ddv1 = weight_ * delta_x * delta_x;
96 const float ddv2 = ddv1;
97 const float dx1dv1 = -2.0 * weight_ * input(vidx1_) * sgn(dx);
98 const float dx1dv2 = -2.0 * weight_ * input(vidx2_) * sgn(dx);
101 (*hess)(xidx1_, xidx1_) += ddx1;
102 (*hess)(xidx1_, xidx2_) -= ddx1;
103 (*hess)(xidx2_, xidx1_) -= ddx1;
104 (*hess)(xidx2_, xidx2_) += ddx1;
105 (*hess)(xidx1_, vidx1_) += dx1dv1;
106 (*hess)(xidx1_, vidx2_) += dx1dv2;
107 (*hess)(xidx2_, vidx1_) -= dx1dv1;
108 (*hess)(xidx2_, vidx2_) -= dx1dv2;
109 (*hess)(vidx1_, xidx1_) += dx1dv1;
110 (*hess)(vidx1_, xidx2_) -= dx1dv1;
111 (*hess)(vidx1_, vidx1_) += ddv1;
112 (*hess)(vidx1_, vidx2_) += dv1dv2;
113 (*hess)(vidx2_, xidx1_) += dx1dv2;
114 (*hess)(vidx2_, xidx2_) -= dx1dv2;
115 (*hess)(vidx2_, vidx1_) += dv1dv2;
116 (*hess)(vidx2_, vidx2_) += ddv2;
119 (*grad)(xidx1_) += dx1;
120 (*grad)(xidx2_) -= dx1;
121 (*grad)(vidx1_) += dv1;
122 (*grad)(vidx2_) += dv2;
124 const float dy1 = -weight_ * delta_y * vv;
125 const float dv1 = -weight_ * input(vidx1_) * delta_y * delta_y;
126 const float dv2 = -weight_ * input(vidx2_) * delta_y * delta_y;
127 const float ddy1 = weight_;
128 const float ddv1 = weight_ * delta_y * delta_y;
129 const float ddv2 = ddv1;
130 const float dy1dv1 = -2.0 * weight_ * input(vidx1_) * sgn(dy);
131 const float dy1dv2 = -2.0 * weight_ * input(vidx2_) * sgn(dy);
134 (*hess)(yidx1_, yidx1_) += ddy1;
135 (*hess)(yidx1_, yidx2_) -= ddy1;
136 (*hess)(yidx2_, yidx1_) -= ddy1;
137 (*hess)(yidx2_, yidx2_) += ddy1;
138 (*hess)(yidx1_, vidx1_) += dy1dv1;
139 (*hess)(yidx1_, vidx2_) += dy1dv2;
140 (*hess)(yidx2_, vidx1_) -= dy1dv1;
141 (*hess)(yidx2_, vidx2_) -= dy1dv2;
142 (*hess)(vidx1_, yidx1_) += dy1dv1;
143 (*hess)(vidx1_, yidx2_) -= dy1dv1;
144 (*hess)(vidx1_, vidx1_) += ddv1;
145 (*hess)(vidx1_, vidx2_) += dv1dv2;
146 (*hess)(vidx2_, yidx1_) += dy1dv2;
147 (*hess)(vidx2_, yidx2_) -= dy1dv2;
148 (*hess)(vidx2_, vidx1_) += dv1dv2;
149 (*hess)(vidx2_, vidx2_) += ddv2;
152 (*grad)(yidx1_) += dy1;
153 (*grad)(yidx2_) -= dy1;
154 (*grad)(vidx1_) += dv1;
155 (*grad)(vidx2_) += dv2;