/// <summary> /// Run on all precedents and search first closing /// </summary> /// <param name="workingSignatura"></param> /// <returns> verification status of trained classificator</returns> public override VerificationStatus Classiffy(ElastogramSignatura workingSignatura) { if (Precedents.Count == 0) { return(VerificationStatus.NotCalculated); } return ((from precedent in Precedents where IsSignatureCloseness(precedent, workingSignatura) select precedent.Answer). DefaultIfEmpty(VerificationStatus.NotCalculated).First()); }
/// <summary> /// Check out a couple of signatures to closeness /// </summary> /// <param name="firstSign"></param> /// <param name="secondSign"></param> /// <returns></returns> public bool IsSignatureCloseness(ElastogramSignatura firstSign, ElastogramSignatura secondSign) { List <double> firstNormalizedSign = firstSign.NormalizedSignatura; List <double> secondNormalizedSign = secondSign.NormalizedSignatura; for (int i = 0; i < ElastogramSignatura.Size; i++) { if (Math.Abs(firstNormalizedSign[i] - secondNormalizedSign[i]) >= SignatureRadiuses[i]) { return(false); } } return(true); }
public override VerificationStatus Classiffy(ElastogramSignatura workingSignatura) { int area = (int)workingSignatura.Area; double leftAngle = workingSignatura.LeftAngle; double rightAngle = workingSignatura.RightAngle; double fibroAngle = workingSignatura.FibroAngle; double rSquareLeft = workingSignatura.RSquareLeft; double rSquareRight = workingSignatura.RSquareRight; double aLeft = workingSignatura.RelativeEstimationLeft; double aRight = workingSignatura.RelativeEstimationRight; if (area < 4000) { return(VerificationStatus.Uncertain); } if (area < 6000) { if ((Math.Abs(leftAngle - fibroAngle) < VeryStrongAngleDif) && (Math.Abs(leftAngle - rightAngle) < VeryStrongAngleDif) && (leftAngle > 0) && IsGoodApproximation(leftAngle, rSquareLeft, aLeft) && IsGoodApproximation(rightAngle, rSquareRight, aRight)) { return(VerificationStatus.Correct); } return(VerificationStatus.Uncertain); } if (area < 8000) { if (!IsGoodApproximation(leftAngle, rSquareLeft, aLeft) || !IsGoodApproximation(rightAngle, rSquareRight, aRight)) { return(VerificationStatus.Uncertain); } if ((Math.Abs(leftAngle - fibroAngle) < WeakAngleDif) && (Math.Abs(leftAngle - rightAngle) < WeakAngleDif) && (leftAngle > 0)) { return(VerificationStatus.Correct); } return(VerificationStatus.Incorrect); } if (area < 10000) { if (!IsGoodApproximation(leftAngle, rSquareLeft, aLeft) || !IsGoodApproximation(rightAngle, rSquareRight, aRight)) { return(VerificationStatus.Uncertain); } if ((Math.Abs(leftAngle - fibroAngle) < MeanAngleDif) && (Math.Abs(leftAngle - rightAngle) < MeanAngleDif) && (leftAngle > 0)) { return(VerificationStatus.Correct); } return(VerificationStatus.Incorrect); } if (area < 13500) { if (!IsGoodApproximation(leftAngle, rSquareLeft, aLeft) || !IsGoodApproximation(rightAngle, rSquareRight, aRight)) { return(VerificationStatus.Uncertain); } if ((Math.Abs(leftAngle - fibroAngle) < StrongAngleDif) && (Math.Abs(leftAngle - rightAngle) < StrongAngleDif) && (leftAngle > 0)) { return(VerificationStatus.Correct); } return(VerificationStatus.Incorrect); } if (area < 21000) { if (IsGoodApproximation(leftAngle, rSquareLeft, aLeft) && IsGoodApproximation(rightAngle, rSquareRight, aRight)) { return(VerificationStatus.Incorrect); } return(VerificationStatus.Uncertain); } return(VerificationStatus.Uncertain); }