public void CheckMultiplyScalar <M> () where M : struct, IMat <M, float> { var prop = from mat in Prop.Choose <M> () from scalar in Prop.Choose <float> () let mult = mat.Multiply(scalar) let multdiv = mult.Multiply(1 / scalar) select new { mat, scalar, mult, multdiv }; prop.Label("{0}: (mat * scalar) * (1 / scalar) = mat", typeof(M).Name) .Check(p => Mat.ApproxEquals(p.mat, p.multdiv)); }
public void CheckInverse <M> () where M : struct, ISquareMat <M, float> { var prop = from mat in Prop.Choose <M> () let inv = Mat.Inverse(mat) let mat_inv = mat.Multiply(inv) let ident = Mat.Identity <M> () select new { mat, inv, mat_inv, ident }; prop.Label("{0}: mat * mat^-1 = I", typeof(M).Name) .Check(p => Mat.ApproxEquals(p.mat_inv, p.ident, 0.1f)); }
public void CheckMultiplyMatrices <M> () where M : struct, ISquareMat <M, float> { var prop = from mat1 in Prop.Choose <M> () from mat2 in Prop.Choose <M> () from mat3 in Prop.Choose <M> () let ident = Mat.Identity <M> () let mult_mat1_ident = mat1.Multiply(ident) let mult_mat12 = mat1.Multiply(mat2) let mult_mat12_3 = mult_mat12.Multiply(mat3) let mult_mat23 = mat2.Multiply(mat3) let mult_mat1_23 = mat1.Multiply(mult_mat23) select new { mat1, mat2, ident, mult_mat1_ident, mult_mat12, mult_mat12_3, mult_mat23, mult_mat1_23 }; prop.Label("{0}: mat * I = mat", typeof(M).Name) .Check(p => p.mult_mat1_ident.Equals(p.mat1)); prop.Label("{0}: (mat1 * mat2) * mat3 = mat1 * (mat2 * mat3)", typeof(M).Name) .Check(p => Mat.ApproxEquals(p.mult_mat12_3, p.mult_mat1_23, 0.001f)); }