/// <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);
        }
Пример #3
0
        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);
        }