def _fast_shake(self, x, normals, values, error):
<EOL>mask = (normals!=<NUM_LIT:0>).any(axis=<NUM_LIT:0>) > <NUM_LIT:0><EOL>normals = normals[:,mask]<EOL>U, S, Vt = np.linalg.svd(normals, full_matrices=False)<EOL>rcond = None<EOL>counter = <NUM_LIT:0><EOL>while True:<EOL><INDENT>if rcond is None:<EOL><INDENT>rcond = <NUM_LIT:0.0><EOL><DEDENT>elif rcond == <NUM_LIT:0.0>:<EOL><INDENT>rcond = self.rcond1<EOL><DEDENT>else:<EOL><INDENT>rcond *= <NUM_LIT:10><EOL><DEDENT>Sinv = (S**<NUM_LIT:2>+rcond)<EOL>if Sinv.max() == <NUM_LIT:0.0>:<EOL><INDENT>continue<EOL><DEDENT>Sinv = S/Sinv<EOL>dx = -np.dot(Vt.transpose(), np.dot(U.transpose(), values)*Sinv)<EOL>new_x = x.copy()<EOL>new_x[mask] += dx<EOL>new_normals, new_values, new_error = self._compute_equations(new_x)[:-<NUM_LIT:1>]<EOL>if new_error < <NUM_LIT>*error:<EOL><INDENT>return new_x, new_normals, new_values, new_error<EOL><DEDENT>elif abs(dx).sum() < self.threshold:<EOL><INDENT>break<EOL><DEDENT>elif counter > self.max_iter:<EOL><INDENT>raise ConstraintError('<STR_LIT>')<EOL><DEDENT>counter += <NUM_LIT:1><EOL><DEDENT>
Take an efficient (not always robust) step towards the constraints.

           Arguments:
            | ``x`` -- The unknowns.
            | ``normals`` -- A numpy array with the gradients of the active
                             constraints. Each row is one gradient.
            | ``values`` -- A numpy array with the values of the constraint
                            functions.
            | ``error`` -- The square root of the constraint cost function.