Esempio n. 1
0
        /// See <see cref="IDiffService.SaveDataItemAsync(int, DiffItemSide, string)"/> for more information.
        public async Task <int> SaveDataItemAsync(int diffId, DiffItemSide itemSide, string encodedData)
        {
            // Assumption: We do not want to save invalid or empty data.
            if (!EncodingHelper.IsValidBase64Data(encodedData))
            {
                throw new ArgumentException("The input data is in incorrect format", nameof(encodedData));
            }

            DataItem item;
            bool     doDiffExists = await _differenceRepository.AnyAsync(d => d.Id == diffId);

            if (!doDiffExists)
            {
                item = DataItemFactory.CreateDataItem(itemSide, encodedData);
                Difference diff = DifferenceFactory.CreateDifference(diffId, item);
                await _differenceRepository.CreateAsync(diff);

                await _differenceRepository.SaveChangesAsync();
            }
            else
            {
                // Assumption: If an item on the same side already exists, the code throws an error.
                bool doItemExists = await _dataItemRepository.AnyAsync(di => di.DifferenceId == diffId && di.Side == itemSide);

                if (doItemExists)
                {
                    throw new InvalidOperationException($"Diff with ID {diffId} already contains {itemSide.ToString().ToLower()} data item.");
                }

                item = DataItemFactory.CreateDataItem(diffId, itemSide, encodedData);
                await _dataItemRepository.CreateAsync(item);

                await _dataItemRepository.SaveChangesAsync();
            }

            return(item.Id);
        }
Esempio n. 2
0
        /// <summary>
        /// Parser data.
        /// </summary>
        /// <param name="context"></param>
        public void ParseData(IParserContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (context.Header.MajorVersion != MajorVersion)
            {
                throw new InvalidFileVersionException(MajorVersion, context.Header.MajorVersion);
            }

            Context = context;

            Context.Header.DirectoryEntries.ForEach(
                entry =>
            {
                IAb1DataItem item = DataItemFactory.TryCreateDataItem(entry);
                if (item == null)
                {
                    return;
                }
                item.Accept(this);
            });
        }
Esempio n. 3
0
        static void Main()
        {
            Console.WriteLine("Создание нейронной сети...");

            DataItem data = DataItemFactory.GetNumericData();

            int inputCount  = data.Input.First().Length;
            var neuronCount = new[] { 10 };
            IActivationFunction function = new BipolarSigmoidFunction();
            double learningRate          = 0.1;
            double momentum = 0;

            int    maxEpochNumber = 1000000;
            double minErrorChange = 0.000001;
            double minError       = 0.001;

            var network = MultilayerNeuralNetwork.CreateNetwork(neuronCount, inputCount, function);

            network.Randomize();

            Console.WriteLine("Создание нейронной сети завершено.");

            var teacher = new PerceptronLearning(network)
            {
                LearningRate = learningRate
            };

            int    epochNumber = 1;
            double lastError   = double.MaxValue;
            double error;
            double errorChange;

            Console.WriteLine("Start learning...");

            do
            {
                DateTime dtStart = DateTime.Now;
                error = teacher.RunEpoch(data.Input, data.Output) / data.Input.Length;
                Console.WriteLine(
                    $"Epoch #{epochNumber} finished; " +
                    $"current error is {error}; " +
                    $"it takes: {(DateTime.Now - dtStart).Duration()}");

                errorChange = Math.Abs(lastError - error);
                lastError   = error;
                epochNumber++;
            }while (epochNumber < maxEpochNumber &&
                    error > minError &&
                    errorChange > minErrorChange);

            for (int i = 0; i < data.Input.Length; i++)
            {
                double[] outputs = network.Compute(data.Input[i]);
                string   strIn   = "";
                foreach (var input in data.Output[i])
                {
                    strIn += $"{input},";
                }
                string strOut = "";
                foreach (var output in outputs)
                {
                    strOut += $"{Math.Abs(output):0.00},";
                }

                Console.WriteLine($"{i}. Expected {strIn} Actual {strOut}");
            }
        }