static void Main(string[] args)
        {
            var input1 = new Neural(new List <ISinapse <double> >(), (x, y) => 0);
            var input2 = new Neural(new List <ISinapse <double> >(), (x, y) => 1);

            var i1ToH1 = new Sinapse();
            var i2ToH1 = new Sinapse();

            Func <double, double, double> sum = (x, y) => x + y;

            var h1 = new Neural(new List <ISinapse <double> >()
            {
                i1ToH1, i2ToH1
            }, sum);

            i1ToH1.Next     = h1;
            i2ToH1.Next     = h1;
            i1ToH1.Weight   = 0.45;
            i2ToH1.Weight   = -0.12;
            i1ToH1.Previous = input1;
            i2ToH1.Previous = input2;


            var i1ToH2 = new Sinapse();
            var i2ToH2 = new Sinapse();


            var h2 = new Neural(new List <ISinapse <double> >()
            {
                i1ToH2, i2ToH2
            }, sum);

            i1ToH2.Next     = h2;
            i2ToH2.Next     = h2;
            i1ToH2.Weight   = 0.78;
            i2ToH2.Weight   = 0.13;
            i1ToH2.Previous = input1;
            i2ToH2.Previous = input2;


            var h1ToO1 = new Sinapse();
            var h2ToO1 = new Sinapse();


            var o1 = new Neural(new List <ISinapse <double> > {
                h1ToO1, h2ToO1
            }, sum);

            h1ToO1.Previous = h1;
            h1ToO1.Weight   = 1.5;
            h2ToO1.Previous = h2;
            h2ToO1.Weight   = -2.3;
            h1ToO1.Next     = o1;
            h2ToO1.Next     = o1;

            var res   = o1.Calculate();
            var error = GetError(res, 1);

            Console.WriteLine($"result = {res} error = {error}");
        }
        private void getSamples()
        {
            try
            {
                Result = string.Empty;
                List <Neural> firstMGroup  = neurals.Where(ne => ne.W == T).ToList();
                List <Neural> secondMGroup = neurals.Where(ne => ne.W > (double)T / 2 && ne.W < T).ToList();
                List <Neural> thirdMGroup  = neurals.Where(ne => ne.W == (double)T / 2).ToList();
                List <Neural> fourthMGroup = neurals.Where(ne => ne.W < (double)T / 2).ToList();

                List <Neural> firstMGroupStar  = neurals.Where(ne => ne.W == T - 1).ToList();
                List <Neural> secondMGroupStar = neurals.Where(ne => ne.W > (double)(T - 1) / 2 && ne.W < T - 1).ToList();
                List <Neural> thirdMGroupStar  = neurals.Where(ne => ne.W == (double)(T - 1) / 2).ToList();
                List <Neural> fourthMGroupStar = neurals.Where(ne => ne.W < (double)(T - 1) / 2).ToList();

                List <List <Neural> > result = new List <List <Neural> >();
                //bool usedAllFourth = false;

                //1 group
                firstMGroup.ForEach(m => result.Add(new List <Neural> {
                    m
                }));

                //2 group
                //int fourthCounter = 0;
                if (fourthMGroup.Count == 0)
                {
                    secondMGroup.ForEach(m => result.Add(new List <Neural> {
                        m
                    }));
                }
                else
                {
                    foreach (var m in secondMGroup)
                    {
                        result.Add(new List <Neural> {
                            m, fourthMGroup.FirstOrDefault(f => f.W + m.W == T)
                        });
                    }
                }

                //3 group
                if (thirdMGroup.Count % 2 == 0)
                {
                    for (int i = 0; i < thirdMGroup.Count; i += 2)
                    {
                        result.Add(new List <Neural> {
                            thirdMGroup[i], thirdMGroup[i + 1]
                        });
                    }
                }
                else
                {
                    for (int i = 0; i < thirdMGroup.Count - 1; i += 2)
                    {
                        result.Add(new List <Neural> {
                            thirdMGroup[i], thirdMGroup[i + 1]
                        });
                    }
                    var temp = new List <Neural> {
                        thirdMGroup[thirdMGroup.Count - 1]
                    };
                    if (fourthMGroup.Any())
                    {
                        Neural t = fourthMGroup.FirstOrDefault(f => f.W + thirdMGroup[thirdMGroup.Count - 1].W == T);
                        if (t != null)
                        {
                            temp.Add(t);
                        }
                        else
                        {
                            int i = 0;
                            while (temp.Sum(te => te.W) != T)
                            {
                                temp.Add(fourthMGroup[i++]);
                            }
                        }
                    }

                    result.Add(temp);
                }

                //4 group

                List <Neural> neuralsForCheck = new List <Neural>();
                foreach (var res in result)
                {
                    neuralsForCheck.AddRange(res);
                }
                var fourthMGroupCopy = fourthMGroup.Where(g => !neuralsForCheck.Select(s => s.Number).Contains(g.Number)).ToList();
                for (int i = 0; i < fourthMGroupCopy.Count; i++)
                {
                    int           res  = fourthMGroupCopy[i].W;
                    List <Neural> temp = new List <Neural> {
                        fourthMGroupCopy[i]
                    };
                    if (res == T)
                    {
                        result.Add(temp);
                        break;
                    }

                    Neural t = fourthMGroup.FirstOrDefault(g => (g.W + res) == T && g.Number != fourthMGroupCopy[i].Number);
                    if (t != null)
                    {
                        temp.Add(t);
                    }

                    temp.Add(fourthMGroup.FirstOrDefault(g => g.Number != fourthMGroupCopy[i].Number));
                    res += fourthMGroup.FirstOrDefault(g => g.Number != fourthMGroupCopy[i].Number).W;
                    if (res == T)
                    {
                        result.Add(temp);
                        break;
                    }
                    List <Neural> tempNeurals = new List <Neural>();
                    tempNeurals.AddRange(firstMGroup);
                    tempNeurals.AddRange(secondMGroup);
                    tempNeurals.AddRange(thirdMGroup);
                    tempNeurals.AddRange(fourthMGroup);

                    foreach (var tempNeural in tempNeurals)
                    {
                        int a = res + tempNeural.W;
                        if (a == T)
                        {
                            temp.Add(tempNeural);
                            result.Add(temp);
                            break;
                        }
                    }
                }



                //STAR
                List <List <Neural> > result2 = new List <List <Neural> >();
                //1 group
                firstMGroupStar.ForEach(m => result2.Add(new List <Neural> {
                    m
                }));

                //2 group
                //int fourthCounter = 0;
                if (fourthMGroupStar.Count == 0)
                {
                    secondMGroupStar.ForEach(m => result2.Add(new List <Neural> {
                        m
                    }));
                }
                else
                {
                    foreach (var m in secondMGroupStar)
                    {
                        result2.Add(new List <Neural> {
                            m, fourthMGroupStar.FirstOrDefault(f => f.W + m.W == T - 1)
                        });
                    }
                }

                //3 group
                if (thirdMGroupStar.Count % 2 == 0)
                {
                    for (int i = 0; i < thirdMGroupStar.Count; i += 2)
                    {
                        result2.Add(new List <Neural> {
                            thirdMGroupStar[i], thirdMGroupStar[i + 1]
                        });
                    }
                }
                else
                {
                    for (int i = 0; i < thirdMGroupStar.Count - 1; i += 2)
                    {
                        result2.Add(new List <Neural> {
                            thirdMGroupStar[i], thirdMGroupStar[i + 1]
                        });
                    }
                    var temp = new List <Neural> {
                        thirdMGroupStar[thirdMGroupStar.Count - 1]
                    };
                    if (fourthMGroupStar.Any())
                    {
                        Neural t = fourthMGroupStar.FirstOrDefault(f => f.W + thirdMGroupStar[thirdMGroupStar.Count - 1].W == T - 1);
                        if (t != null)
                        {
                            temp.Add(t);
                        }
                        else
                        {
                            int i = 0;
                            while (temp.Sum(te => te.W) != T - 1)
                            {
                                temp.Add(fourthMGroup[i++]);
                            }
                        }
                    }

                    result2.Add(temp);
                }

                //4 group

                neuralsForCheck = new List <Neural>();
                foreach (var res in result2)
                {
                    neuralsForCheck.AddRange(res);
                }
                fourthMGroupCopy = fourthMGroupStar.Where(g => !neuralsForCheck.Select(s => s.Number).Contains(g.Number)).ToList();
                for (int i = 0; i < fourthMGroupCopy.Count; i++)
                {
                    int           res  = fourthMGroupCopy[i].W;
                    List <Neural> temp = new List <Neural> {
                        fourthMGroupCopy[i]
                    };
                    if (res == T - 1)
                    {
                        result2.Add(temp);
                        break;
                    }

                    Neural t = fourthMGroupStar.FirstOrDefault(g => (g.W + res) == T - 1 && g.Number != fourthMGroupCopy[i].Number);
                    if (t != null)
                    {
                        temp.Add(t);
                    }

                    temp.Add(fourthMGroupStar.FirstOrDefault(g => g.Number != fourthMGroupCopy[i].Number));
                    res += fourthMGroupStar.FirstOrDefault(g => g.Number != fourthMGroupCopy[i].Number).W;
                    if (res == T - 1)
                    {
                        result2.Add(temp);
                        break;
                    }
                    List <Neural> tempNeurals = new List <Neural>();
                    tempNeurals.AddRange(firstMGroupStar);
                    tempNeurals.AddRange(secondMGroupStar);
                    tempNeurals.AddRange(thirdMGroupStar);
                    tempNeurals.AddRange(fourthMGroupStar);

                    foreach (var tempNeural in tempNeurals)
                    {
                        int a = res + tempNeural.W;
                        if (a == T - 1)
                        {
                            temp.Add(tempNeural);
                            result2.Add(temp);
                            break;
                        }
                    }
                }
                //checkForTable(result, result2);

                //checkForCapacity(secondMGroup, fourthMGroup, firstMGroup.Count, thirdMGroup.Count, result);
                //checkForCapacity2(secondMGroupStar, fourthMGroupStar, firstMGroupStar.Count, thirdMGroupStar.Count, result2);

                //string s = string.Empty;
                //foreach (var res in result)
                //{
                //    int temp = res.Sum(r => r.W * Convert.ToInt32(r.X));
                //    s += (temp == T) + Environment.NewLine;
                //}
                ////MessageBox.Show(s);
                //Result += s + Environment.NewLine;

                //s = string.Empty;
                //foreach (var res in result2)
                //{
                //    int temp = res.Sum(r => r.W * Convert.ToInt32(r.X));
                //    s += (temp == T - 1) + Environment.NewLine;
                //}
                ////MessageBox.Show(s);
                //Result += s + Environment.NewLine;

                foreach (var res in result)
                {
                    for (int i = 1; i <= N; i++)
                    {
                        if (!res.Select(r => r.Number).Contains(i))
                        {
                            Result += string.Format("¬X{0} ", i);
                        }
                        else
                        {
                            Result += string.Format("X{0} ", i);
                        }
                    }
                    Result += Environment.NewLine;
                }
                Result += Environment.NewLine;
                foreach (var res in result2)
                {
                    for (int i = 1; i <= N; i++)
                    {
                        if (!res.Select(r => r.Number).Contains(i))
                        {
                            Result += string.Format("¬X{0} ", i);
                        }
                        else
                        {
                            Result += string.Format("X{0} ", i);
                        }
                    }
                    Result += Environment.NewLine;
                }

                OnPropertyChanged("Result");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                throw;
            }
        }