Example #1
0
        /// <summary>
        /// Algoritmas leidžiantis surasti binarinius vektorius surikiuotas nuo mažiausio iki didžiausio.
        /// </summary>
        /// <param name="length"></param>
        /// <returns>Sąrašas binarinių vektorių</returns>
        public static List <int[]> GenerateOrderedBinaryVectors(int length)
        {
            var ordered      = new List <int[]>();
            var combinations = Math.Pow(2, length);

            if (combinations == 1)
            {
                return(new List <int[]>());
            }

            for (var i = 0; i < combinations; i++)
            {
                var binaryString    = Convert.ToString(i, 2).PadLeft(length, '0');
                var binaryStringArr = ConversionService.ConvertBinaryStringToVector(binaryString);
                ordered.Add(binaryStringArr);
                // comb = 4
                // 000
                // 001
                // 010
                // 011
                // 100
            }

            return(ordered);
        }
        public void DecodesCorrectly(int m, int r, string encodedVector, string expectedDecodedVector)
        {
            // Arrange.
            var generatorMatrix = MatrixHelper.CreateGeneratorMatrix(m, r);
            var initialVector   = ConversionService.ConvertBinaryStringToVector(encodedVector);

            // Act.
            var decoded             = Decoder.DecodeVector(initialVector, generatorMatrix, m, r);
            var actualDecodedVector = string.Join("", decoded);

            // Assert.
            Assert.AreEqual(expectedDecodedVector, actualDecodedVector);
        }
        /// <summary>
        /// Vektoriaus apdorojimas
        /// </summary>
        /// <param name="r"></param>
        /// <param name="m"></param>
        /// <param name="q"></param>
        /// <param name="matrix"></param>
        /// <param name="expectedLength"></param>
        private static void HandleVector(int r, int m, double q, Matrix matrix, int expectedLength)
        {
            Console.WriteLine($"Please enter binary vector of length {expectedLength}");
            string binaryString;

            do
            {
                binaryString = Console.ReadLine();
                if (binaryString.Length == expectedLength)
                {
                    continue;
                }
                Console.WriteLine($"Input is not equal to expected length of {expectedLength}");
            } while (binaryString.Length != expectedLength);

            // Binarinė simbolių eilutė konvertuojama į vektorių.
            var initialVector = ConversionService.ConvertBinaryStringToVector(binaryString);

            Console.WriteLine("Input vector: ".PadRight(20) + string.Join(",", initialVector));

            // Vektorio kodavimas
            var encodedVector = Encoder.EncodeVector(initialVector, matrix);

            Console.WriteLine("Encoded vector: ".PadRight(20) + string.Join(",", encodedVector));

            // Siuntimas kanalu
            var distortedVector = Channel.Send(encodedVector, q);

            // Klaidingų pozicijų gavimas
            var errornousPositions = Channel.GetErrornousPositions(encodedVector, distortedVector);

            Console.WriteLine("Distorted vector: ".PadRight(20) + string.Join(",", distortedVector));
            var errornousPositionsString = Enumerable.Repeat(" ", distortedVector.Length).ToArray();

            for (var i = 0; i < errornousPositions.Count; i++)
            {
                errornousPositionsString[errornousPositions[i]] = "^";
            }
            Console.WriteLine(" ".PadRight(20) + string.Join(" ", errornousPositionsString));
            Console.WriteLine("Error positions: ".PadRight(20) + string.Join(",", errornousPositions));
            Console.WriteLine("Errors count: ".PadRight(20) + string.Join(",", errornousPositions.Count));

            // Pasirinktų pozicijų pakeitimas
            Console.WriteLine("Do you want to modify distorted vector? Press 'Y' for YES, any key - NO");
            if (Console.ReadLine().Equals("Y", StringComparison.InvariantCultureIgnoreCase))
            {
                Console.WriteLine("Select positions you want to reverse. Example: 2, 4, 8");
                var positionsToReverse = new List <int>();
                var userPositionInput  = Console.ReadLine().Split(",");
                foreach (var pos in userPositionInput)
                {
                    if (int.TryParse(pos, out var vectorIndex) && vectorIndex < distortedVector.Length)
                    {
                        positionsToReverse.Add(vectorIndex);
                    }
                }

                distortedVector = Channel.FixDistortedVector(distortedVector, positionsToReverse);
                Console.WriteLine("Encoded vector: ".PadRight(20) + string.Join(",", encodedVector));
                Console.WriteLine("Distorted vector: ".PadRight(20) + string.Join(",", distortedVector));

                errornousPositions = Channel.GetErrornousPositions(encodedVector, distortedVector);
                Console.WriteLine("Errors count: ".PadRight(20) + string.Join(",", errornousPositions.Count));
            }

            // Vektorio dekodavimas
            var decodedVector = Decoder.DecodeVector(distortedVector, matrix, m, r);

            Console.WriteLine("Decoded vector: ".PadRight(20) + string.Join(",", decodedVector));

            errornousPositions = Channel.GetErrornousPositions(initialVector, decodedVector);
            if (errornousPositions.Count == 0)
            {
                Console.WriteLine("--------------------");
                Console.WriteLine("Decoded succesfully!");
                Console.WriteLine("--------------------");
            }
            else
            {
                Console.WriteLine("--------------------");
                Console.WriteLine("Decoded with errors.");
                Console.WriteLine("--------------------");
            }
        }