Fix LinearityValidator for vertical lines

The recent changes to switch the linearity validator to use X vs Y
fitting, caused a regression for vertical lines.  The fitting
becomes unstable for vertical/near-vertical lines and the
validator ends up returning false negatives.

This CL fixes it, by fitting in both X vs Y and in Y vs X, then
checking to see which one fit better and using that value.

BUG=chromium:567221
TEST=manually tested, I drew many lines of various types and the
results looked correct on all of them.

Change-Id: I216d5c0ec0a09a757c462debe37a6da3d5312da3
Signed-off-by: Charlie Mooney <charliemooney@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/317673
Reviewed-by: Shyh-In Hwang <josephsih@chromium.org>
diff --git a/tests/validator/validators.py b/tests/validator/validators.py
index 722eced..3494012 100644
--- a/tests/validator/validators.py
+++ b/tests/validator/validators.py
@@ -476,8 +476,15 @@
       ys_mm = [BaseValidator._device.PxToMm_Y(finger.y) for finger in path]
       times = [finger.syn_time for finger in path]
 
-      max_err_mm, rms_err_mm = self._ErrorsForSingleAxis(xs_mm, ys_mm)
-      global_max_err_mm = max(global_max_err_mm, max_err_mm)
+      # Linear fitting becomes numerically unstable when lines approach
+      # vertical.  To combat this, we fit in both x vs y as well was y vs x
+      # and then select whichever fits better (less error) as the correct
+      # fit.
+      max_xy_err_mm, rms_xy_err_mm = self._ErrorsForSingleAxis(xs_mm, ys_mm)
+      max_yx_err_mm, rms_yx_err_mm = self._ErrorsForSingleAxis(ys_mm, xs_mm)
+      err_mm = min(max_xy_err_mm, max_yx_err_mm)
+
+      global_max_err_mm = max(global_max_err_mm, err_mm)
 
     result = Result()
     result.name = self.name