As we all know, XGBoost constructs trees based on gradient. I wonder how does XGBoost define gradient of MAE loss, as MAE itself is not differentiable.
After some digging of the source code, I found the implementation of MSE loss here. But I can't find any implementation of MAE loss. The original paper didn't discuss MAE loss either.