Example #1
0
        public static void Main()
        {
            var cb = ChessBoardInstances.Get(0);

            MainEngine.MaxDepth             = MaxPly;
            UciOut.NoOutput                 = true;
            EngineConstants.Power2TtEntries = 2;
            TtUtil.Init(false);
            long totalNodesSearched = 0;

            var epdStrings = BestMoveTest.GetEpdStrings("Resources/WAC-201.epd");

            for (var index = 0; index < NumberOfPositions; index++)
            {
                Console.WriteLine(index);
                var epdString = epdStrings[index + 20];
                Statistics.Reset();
                var epd = new Epd(epdString);
                ChessBoardUtil.SetFen(epd.GetFen(), cb);
                SearchUtil.Start(cb);
                totalNodesSearched += ChessBoardUtil.CalculateTotalMoveCount();
            }

            Console.WriteLine("Total   " + totalNodesSearched);
            Console.WriteLine("Average " + totalNodesSearched / NumberOfPositions);
        }
Example #2
0
        public static void Start(ChessBoard cb)
        {
            NegamaxUtil.IsRunning = true;
            cb.MoveCount          = 0;

            if (UciOptions.ThreadCount == 1)
            {
                new SearchThread(0).Call();
            }
            else
            {
                var tasks = new List <Task>();
                for (var i = 0; i < UciOptions.ThreadCount; i++)
                {
                    if (i > 0)
                    {
                        ChessBoardUtil.Copy(cb, ChessBoardInstances.Get(i));
                    }

                    var i1 = i;
                    var t  = new Task(() => new SearchThread(i1).Call());
                    tasks.Add(t);
                }

                try
                {
                    tasks.ForEach(task => task.Start());
                    Task.WaitAll(tasks.ToArray());
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
        }
        public static void Main()
        {
            var fens = Tuner.LoadFens("d:\\backup\\chess\\epds\\quiet-labeled.epd", true, false);

            Console.WriteLine(fens.Count + " fens found");

            var cb         = ChessBoardInstances.Get(0);
            var threadData = ThreadData.GetInstance(0);

            foreach (var(key, value) in fens)
            {
                ChessBoardUtil.SetFen(key, cb);
                var error = Math.Pow(value - ErrorCalculator.CalculateSigmoid(EvalUtil.CalculateScore(cb, threadData)),
                                     2);

                for (var i = 0; i < LargestError.Length; i++)
                {
                    if (!(error > LargestError[i]))
                    {
                        continue;
                    }
                    LargestError[i]    = error;
                    LargestErrorFen[i] = key;
                    break;
                }
            }

            for (var i = 0; i < LargestError.Length; i++)
            {
                Console.WriteLine($"{LargestErrorFen[i],60} -> {LargestError[i]}");
            }
        }
Example #4
0
        public static async Task Main()
        {
            // read all fens, including score
            var fens = Tuner.LoadFens("d:\\backup\\chess\\epds\\quiet-labeled.epd", true, false);

            Console.WriteLine("Fens found : " + fens.Count);

            // init workers
            ChessBoardInstances.Init(NumberOfThreads);
            ThreadData.InitInstances(NumberOfThreads);
            for (var i = 0; i < NumberOfThreads; i++)
            {
                Workers[i] = new ErrorCalculator(ChessBoardInstances.Get(i), ThreadData.GetInstance(i));
            }

            // add fens to workers
            var workerIndex = 0;

            foreach (var(key, value) in fens)
            {
                Workers[workerIndex].AddFenWithScore(key, value);
                workerIndex = workerIndex == NumberOfThreads - 1 ? 0 : workerIndex + 1;
            }

            // get tuned values
            var tuningObjects = Tuner.GetTuningObjects();

            // tune
            await Eval(tuningObjects);

            Console.WriteLine("Done");
        }
Example #5
0
        public static void Main()
        {
            var cb = ChessBoardInstances.Get(0);

            ChessBoardUtil.SetFen("1r1q1rk1/2p1npb1/b3p1p1/p5N1/1ppPB2R/P1N1P1P1/1P2QPP1/2K4R w - - 0 20 ", cb);
            EvalUtil.CalculateScore(cb, ThreadData.GetInstance(0));
        }
Example #6
0
            public void Run()
            {
                var threadData = ThreadData.GetInstance(_threadNumber);
                var cb         = ChessBoardInstances.Get(_threadNumber);

                ChessBoardUtil.SetFen(ChessConstants.FenStart, cb);
                Perft(cb, threadData, Depth);
            }
Example #7
0
        public static void Main()
        {
            Thread.CurrentThread.Name = "Chess22kDotNet-main";
            _cb         = ChessBoardInstances.Get(0);
            _threadData = ThreadData.GetInstance(0);

            Start();
        }
Example #8
0
 public static void SetThreadCount(int threadCount)
 {
     if (threadCount == ThreadCount)
     {
         return;
     }
     ThreadCount = threadCount;
     ChessBoardInstances.Init(threadCount);
     ThreadData.InitInstances(threadCount);
 }
Example #9
0
        public static void Main()
        {
            var cb = ChessBoardInstances.Get(0);

            ChessBoardUtil.SetFen(FenStandardMiddlegame, cb);
            TimeUtil.SetSimpleTimeWindow(5000);
            TtUtil.Init(false);
            SearchUtil.Start(cb);
            Statistics.Print();
        }
Example #10
0
        public static void Main()
        {
            var cb = ChessBoardInstances.Get(0);

            // read all fens, including score
            var fens = Tuner.LoadFens("d:\\backup\\chess\\epds\\violent.epd", false, true);

            Console.WriteLine("Fens found : " + fens.Count);

            // NegamaxUtil.isRunning = true;
            EngineConstants.Power2TtEntries = 1;
            TtUtil.Init(false);

            double totalPositions = 0;
            double sameScore      = 0;
            long   totalError     = 0;
            var    watch          = new Stopwatch();

            watch.Start();
            foreach (var entry in fens)
            {
                ChessBoardUtil.SetFen(entry.Key, cb);
                if (cb.CheckingPieces == 0)
                {
                    continue;
                }

                totalPositions++;
                var searchScore = NegamaxUtil.CalculateBestMove(cb, ThreadData, 0, 1, Util.ShortMin, Util.ShortMax, 0);
                TtUtil.ClearValues();
                var qScore = QuiescenceUtil.CalculateBestMove(cb, ThreadData, Util.ShortMin, Util.ShortMax);

                if (searchScore == qScore)
                {
                    sameScore++;
                }
                else
                {
                    var error = searchScore - qScore;
                    // if (error > 500) {
                    // System.out.println(searchScore + " " + qScore);
                    // QuiescenceUtil.calculateBestMove(cb, threadData, Util.SHORT_MIN, Util.SHORT_MAX);
                    // }

                    totalError += error;
                }
            }

            var averageError = (int)(totalError / (totalPositions - sameScore));

            Console.WriteLine($"{sameScore / totalPositions:f4} {averageError}");
            Console.WriteLine("msec: " + watch.ElapsedMilliseconds);
        }
Example #11
0
        public static void Main()
        {
            var cb = ChessBoardInstances.Get(0);

            // read all fens, including score
            var fens = Tuner.LoadFens("d:\\backup\\chess\\epds\\violent.epd", false, true);

            Console.WriteLine("Fens found : " + fens.Count);

            double sameScore    = 0;
            double totalAttacks = 0;
            var    start        = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

            foreach (var entry in fens)
            {
                ChessBoardUtil.SetFen(entry.Key, cb);
                _threadData.StartPly();
                MoveGenerator.GenerateAttacks(_threadData, cb);
                while (_threadData.HasNext())
                {
                    var move = _threadData.Next();
                    if (!cb.IsLegal(move))
                    {
                        continue;
                    }

                    totalAttacks++;
                    var seeScore      = SeeUtil.GetSeeCaptureScore(cb, move);
                    var materialScore = EvalUtil.CalculateMaterialScore(cb);
                    var qScore        = ChessConstants.ColorFactor[cb.ColorToMoveInverse] * materialScore -
                                        CalculateQScore(cb, move, true);
                    if (seeScore == qScore)
                    {
                        sameScore++;
                    }

                    // else {
                    // seeScore = SEEUtil.getSeeCaptureScore(cb, move);
                    // qScore = ChessConstants.COLOR_FACTOR[cb.colorToMoveInverse] * materialScore - calculateQScore(cb,
                    // move, true);
                    // }
                }

                _threadData.EndPly();
            }

            Console.WriteLine($"{sameScore:f0} {totalAttacks:f0} = {sameScore / totalAttacks:f4}");
            Console.WriteLine("msec: " + (DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - start));
        }
Example #12
0
            public void Run()
            {
                Console.WriteLine("Start " + _name);

                var cb         = ChessBoardInstances.Get(_threadNumber);
                var threadData = ThreadData.GetInstance(_threadNumber);

                foreach (var position in _positions)
                {
                    ChessBoardUtil.SetFen(position.Fen, cb);
                    Assert.IsTrue(position.MoveCount == perft(cb, threadData, position.Depth));
                }

                Console.WriteLine("Done " + _name);
            }
Example #13
0
        private static void DoTest(IReadOnlyCollection <string> epdStrings)
        {
            var correctCounter = 0;

            foreach (var epdString in epdStrings)
            {
                var epd = new Epd(epdString);
                var cb  = ChessBoardInstances.Get(0);
                ChessBoardUtil.SetFen(epd.GetFen(), cb);

                TimeUtil.Reset();
                TimeUtil.SetSimpleTimeWindow(5000);
                SearchUtil.Start(cb);

                var bestMove = new MoveWrapper(ThreadData.GetBestMove());
                if (epd.IsBestMove)
                {
                    if (epd.MoveEquals(bestMove))
                    {
                        Console.WriteLine(epd.GetId() + " BM OK");
                        correctCounter++;
                        _positionTestOk++;
                    }
                    else
                    {
                        Console.WriteLine(epd.GetId() + " BM NOK " + bestMove + " - " + epd);
                        _positionTestNok++;
                    }
                }
                else
                {
                    if (epd.MoveEquals(bestMove))
                    {
                        Console.WriteLine(epd.GetId() + " AM NOK " + epd);
                        _positionTestNok++;
                    }
                    else
                    {
                        Console.WriteLine(epd.GetId() + " AM OK");
                        correctCounter++;
                        _positionTestOk++;
                    }
                }
            }

            Console.WriteLine(correctCounter + "/" + epdStrings.Count);
        }
Example #14
0
        public static void Main()
        {
            var fens = Tuner.LoadFens("d:\\backup\\chess\\epds\\quiet-labeled.epd", true, false);

            Console.WriteLine(fens.Count + " fens found");

            var cb = ChessBoardInstances.Get(0);

            foreach (var entry in fens)
            {
                ChessBoardUtil.SetFen(entry.Key, cb);
                PieceCounts[BitOperations.PopCount((ulong)cb.AllPieces)]++;
            }

            for (var i = 0; i < 33; i++)
            {
                Console.WriteLine(i + " " + PieceCounts[i]);
            }
        }
Example #15
0
        public static void Main()
        {
            // read all fens, including score
            var fens = Tuner.LoadFens("d:\\backup\\chess\\epds\\quiet-labeled.epd", true, true);

            Console.WriteLine("Fens found : " + fens.Count);

            var tested = 0;
            var ok     = 0;
            var nok    = 0;

            foreach (var(fen, score) in fens)
            {
                var cb = ChessBoardInstances.Get(0);
                ChessBoardUtil.SetFen(fen, cb);
                if (BitOperations.PopCount((ulong)cb.AllPieces) > 3)
                {
                    continue;
                }

                if (cb.Pieces[ChessConstants.White][ChessConstants.Pawn] == 0 &&
                    cb.Pieces[ChessConstants.Black][ChessConstants.Pawn] == 0)
                {
                    continue;
                }

                tested++;
                if (KpkBitbase.IsDraw(cb) == (score == 0.5))
                {
                    ok++;
                }
                else
                {
                    nok++;
                }
            }

            Console.WriteLine();
            Console.WriteLine("Tested " + tested);
            Console.WriteLine("OK " + ok);
            Console.WriteLine("NOK " + nok);
        }
Example #16
0
        public static void Main()
        {
            ChessBoardInstances.Init(32);
            ThreadData.InitInstances(32);
            var stopwatch = new Stopwatch();

            foreach (var run in Runs)
            {
                stopwatch.Restart();
                Console.WriteLine("Starting " + run + " thread(s)");
                var tasks = new List <Task>();
                for (var i = 0; i < run; i++)
                {
                    var i1 = i;
                    tasks.Add(Task.Run(() => new PerftThread(i1).Run()));
                }

                Task.WaitAll(tasks.ToArray());
                Console.WriteLine(stopwatch.ElapsedMilliseconds);
            }
        }
Example #17
0
 private static void SetOption(string optionName, string optionValue)
 {
     // setoption name Hash value 128
     if (optionName.ToLower().Equals("hash"))
     {
         var value = int.Parse(optionValue);
         TtUtil.SetSizeMb(value);
     }
     else if (optionName.ToLower().Equals("threads"))
     {
         UciOptions.SetThreadCount(int.Parse(optionValue));
         _cb         = ChessBoardInstances.Get(0);
         _threadData = ThreadData.GetInstance(0);
     }
     else if (optionName.ToLower().Equals("ponder"))
     {
         UciOptions.SetPonder(bool.Parse(optionValue));
     }
     else
     {
         Console.WriteLine("Unknown option: " + optionName);
     }
 }
Example #18
0
        public static async Task Main()
        {
            if (!EngineConstants.GenerateBrPromotions)
            {
                Console.WriteLine("Generation of underpromotions is disabled!");
            }

            ChessBoardInstances.Init(8);
            ThreadData.InitInstances(8);

            var threadNr = 0;
            var kiwi     = new PerftWorker("Kiwi-pete", threadNr++);

            kiwi.AddPosition("r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -", 4085603, 4);

            var ep = new PerftWorker("EP", threadNr++);

            ep.AddPosition("3k4/3p4/8/K1P4r/8/8/8/8 b - - 0 1", 20757544, 7);
            ep.AddPosition("8/8/4k3/8/2p5/8/B2P2K1/8 w - - 0 1", 14047573, 7);
            ep.AddPosition("8/8/1k6/2b5/2pP4/8/5K2/8 b - d3 0 1", 21190412, 7);

            var castling = new PerftWorker("Castling", threadNr++);

            castling.AddPosition("5k2/8/8/8/8/8/8/4K2R w K - 0 1", 661072, 6);
            castling.AddPosition("3k4/8/8/8/8/8/8/R3K3 w Q - 0 1", 803711, 6);
            castling.AddPosition("r3k2r/1b4bq/8/8/8/8/7B/R3K2R w KQkq - 0 1", 1274206, 4);
            castling.AddPosition("r3k2r/8/3Q4/8/8/5q2/8/R3K2R b KQkq - 0 1", 1720476, 4);

            var promotion = new PerftWorker("Promotion", threadNr++);

            promotion.AddPosition("2K2r2/4P3/8/8/8/8/8/3k4 w - - 0 1", 60651209, 7);
            promotion.AddPosition("4k3/1P6/8/8/8/8/K7/8 w - - 0 1", 3742283, 7);
            promotion.AddPosition("8/P1k5/K7/8/8/8/8/8 w - - 0 1", 1555980, 7);

            var mate = new PerftWorker("Stalemate and Checkmate", threadNr++);

            mate.AddPosition("8/8/1P2K3/8/2n5/1q6/8/5k2 b - - 0 1", 6334638, 6);
            mate.AddPosition("K1k5/8/P7/8/8/8/8/8 w - - 0 1", 15453, 7);
            mate.AddPosition("8/k1P5/8/1K6/8/8/8/8 w - - 0 1", 2518905, 8);
            mate.AddPosition("8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1", 3114998, 6);

            var perft = new PerftWorker("Perft", threadNr);

            perft.AddPosition(ChessConstants.FenStart, 4865609, 5);

            var kiwiTask      = Task.Run(() => kiwi.Run());
            var epTask        = Task.Run(() => ep.Run());
            var castlingTask  = Task.Run(() => castling.Run());
            var promotionTask = Task.Run(() => promotion.Run());
            var mateTask      = Task.Run(() => mate.Run());
            var perftTask     = Task.Run(() => perft.Run());

            await kiwiTask;
            await epTask;
            await castlingTask;
            await promotionTask;
            await mateTask;
            await perftTask;

            Console.WriteLine();
            Console.WriteLine("Done");
        }
Example #19
0
        public static void Main()
        {
            var fens = Tuner.LoadFens("d:\\backup\\chess\\epds\\quiet-labeled.epd", true, false);

            Console.WriteLine(fens.Count + " fens found");

            var kpk   = new ErrorCount("KPK ");
            var kbnk  = new ErrorCount("KBNK");
            var kbpk  = new ErrorCount("KBPK");
            var krkp  = new ErrorCount("KRKP");
            var kqkp  = new ErrorCount("KQKP");
            var krkb  = new ErrorCount("KRKB");
            var krkn  = new ErrorCount("KRKN");
            var kbpkp = new ErrorCount("KBPKP");
            var krbkb = new ErrorCount("KRBKB");
            var krbkr = new ErrorCount("KRBKR");

            var cb         = ChessBoardInstances.Get(0);
            var threadData = ThreadData.GetInstance(0);

            foreach (var(key, value) in fens)
            {
                ChessBoardUtil.SetFen(key, cb);

                var error = Math.Pow(
                    value - ErrorCalculator.CalculateSigmoid(ChessConstants.ColorFactor[cb.ColorToMove] *
                                                             EvalUtil.CalculateScore(cb, threadData)),
                    2);
                if (MaterialUtil.IsKbnk(cb.MaterialKey))
                {
                    kbnk.AddError(error);
                }
                else if (MaterialUtil.IsKqkp(cb.MaterialKey))
                {
                    kqkp.AddError(error);
                }
                else if (MaterialUtil.IsKrkp(cb.MaterialKey))
                {
                    krkp.AddError(error);
                }
                else if (MaterialUtil.IsKrkb(cb.MaterialKey))
                {
                    krkb.AddError(error);
                }
                else if (MaterialUtil.IsKrkn(cb.MaterialKey))
                {
                    krkn.AddError(error);
                }
                else if (MaterialUtil.IsKpk(cb.MaterialKey))
                {
                    krkn.AddError(error);
                }
                else if (MaterialUtil.IsKbpk(cb.MaterialKey))
                {
                    kbpk.AddError(error);
                }
                else if (MaterialUtil.IsKbpkp(cb.MaterialKey))
                {
                    kbpkp.AddError(error);
                }
                else if (MaterialUtil.IsKrbkb(cb.MaterialKey))
                {
                    krbkb.AddError(error);
                }
                else if (MaterialUtil.IsKrbkr(cb.MaterialKey))
                {
                    krbkr.AddError(error);
                }
            }

            kpk.Print();
            kbnk.Print();
            krkp.Print();
            kqkp.Print();
            krkb.Print();
            krkn.Print();
            krbkb.Print();
            krbkr.Print();
            kbpk.Print();
            kbpkp.Print();
        }