/// <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("--------------------"); } }