Ejemplo n.º 1
0
    internal static void setup_pieces_pawn_dtz(DTZEntry_pawn ptr, byte[] data, ulong[] tb_size, int f)
    {
        int i;
        int j;
        int order;
        int order2;

        j      = 1 + (ptr.pawns[1] > 0);
        order  = data[0] & 0x0f;
        order2 = ptr.pawns[1] != 0 ? (data[1] & 0x0f) : 0x0f;
        for (i = 0; i < ptr.num; i++)
        {
            ptr.file[f].pieces[i] = (byte)(data[i + j] & 0x0f);
        }
        GlobalMembersTbcore.set_norm_pawn((TBEntry_pawn)ptr, ptr.file[f].norm, ptr.file[f].pieces);
        tb_size[0] = GlobalMembersTbcore.calc_factors_pawn(ptr.file[f].factor, ptr.num, order, order2, ptr.file[f].norm, f);
    }
Ejemplo n.º 2
0
    internal static void free_dtz_entry(TBEntry entry)
    {
        GlobalMembersTbcore.unmap_file(ref entry.data, entry.mapping);
        if (entry.has_pawns == 0)
        {
            DTZEntry_piece ptr = (DTZEntry_piece)entry;
//C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#:
            free(ptr.precomp);
        }
        else
        {
            DTZEntry_pawn ptr = (DTZEntry_pawn)entry;
            int           f;
            for (f = 0; f < 4; f++)
            {
//C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#:
                free(ptr.file[f].precomp);
            }
        }
//C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#:
        free(entry);
    }
Ejemplo n.º 3
0
    internal static int init_table_dtz(TBEntry entry)
    {
        byte[] data = (byte)entry.data;
//C++ TO C# CONVERTER TODO TASK: C# does not have an equivalent for pointers to value types:
//ORIGINAL LINE: byte *next;
        byte next;
        int  f;
        int  s;

        ulong[] tb_size = new ulong[4];
        ulong[] size    = new ulong[4 * 3];

        if (!data)
        {
            return(0);
        }

        if (data[0] != DTZ_MAGIC[0] || data[1] != DTZ_MAGIC[1] || data[2] != DTZ_MAGIC[2] || data[3] != DTZ_MAGIC[3])
        {
            Console.Write("Corrupted table.\n");
            return(0);
        }

        int files = (data[4] & 0x02) != 0 ? 4 : 1;

        data += 5;

        if (entry.has_pawns == 0)
        {
            DTZEntry_piece ptr = (DTZEntry_piece)entry;
            GlobalMembersTbcore.setup_pieces_piece_dtz(ptr, data, tb_size[0]);
            data += ptr.num + 1;
            data += ((ushort)data) & 0x01;

            ptr.precomp = GlobalMembersTbcore.setup_pairs(data, tb_size[0], size[0], next, ref (ptr.flags), 0);
            data        = next;

            ptr.map = data;
            if ((ptr.flags & 2) != 0)
            {
                int i;
                for (i = 0; i < 4; i++)
                {
                    ptr.map_idx[i] = (ushort)(data + 1 - ptr.map);
                    data          += 1 + data[0];
                }
                data += ((ushort)data) & 0x01;
            }

            ptr.precomp.indextable = (string)data;
            data += size[0];

            ptr.precomp.sizetable = (ushort)data;
            data += size[1];

            data             = (byte)((((ushort)data) + 0x3f) & ~0x3f);
            ptr.precomp.data = data;
            data            += size[2];
        }
        else
        {
            DTZEntry_pawn ptr = (DTZEntry_pawn)entry;
            s = 1 + (ptr.pawns[1] > 0);
            for (f = 0; f < 4; f++)
            {
                GlobalMembersTbcore.setup_pieces_pawn_dtz(ptr, data, tb_size[f], f);
                data += ptr.num + s;
            }
            data += ((ushort)data) & 0x01;

            for (f = 0; f < files; f++)
            {
                ptr.file[f].precomp = GlobalMembersTbcore.setup_pairs(data, tb_size[f], size[3 * f], next, ref (ptr.flags[f]), 0);
                data = next;
            }

            ptr.map = data;
            for (f = 0; f < files; f++)
            {
                if ((ptr.flags[f] & 2) != 0)
                {
                    int i;
                    for (i = 0; i < 4; i++)
                    {
                        ptr.map_idx[f, i] = (ushort)(data + 1 - ptr.map);
                        data += 1 + data[0];
                    }
                }
            }
            data += ((ushort)data) & 0x01;

            for (f = 0; f < files; f++)
            {
                ptr.file[f].precomp.indextable = (string)data;
                data += size[3 * f];
            }

            for (f = 0; f < files; f++)
            {
                ptr.file[f].precomp.sizetable = (ushort)data;
                data += size[3 * f + 1];
            }

            for (f = 0; f < files; f++)
            {
                data = (byte)((((ushort)data) + 0x3f) & ~0x3f);
                ptr.file[f].precomp.data = data;
                data += size[3 * f + 2];
            }
        }

        return(1);
    }
Ejemplo n.º 4
0
    internal static int probe_dtz_table(Position pos, int wdl, ref int success)
    {
        TBEntry ptr;
        ulong   idx;
        int     i;
        int     res;

        int[] p = new int[DefineConstants.TBPIECES];

        // Obtain the position's material signature key.
        ulong key = pos.material_key();

        if (GlobalMembersTbcore.DTZ_table[0].key1 != key && GlobalMembersTbcore.DTZ_table[0].key2 != key)
        {
            for (i = 1; i < DefineConstants.DTZ_ENTRIES; i++)
            {
                if (GlobalMembersTbcore.DTZ_table[i].key1 == key)
                {
                    break;
                }
            }
            if (i < DefineConstants.DTZ_ENTRIES)
            {
                DTZTableEntry table_entry = GlobalMembersTbcore.DTZ_table[i];
                for (; i > 0; i--)
                {
                    GlobalMembersTbcore.DTZ_table[i] = GlobalMembersTbcore.DTZ_table[i - 1];
                }
                GlobalMembersTbcore.DTZ_table[0] = table_entry;
            }
            else
            {
                TBHashEntry[] ptr2 = GlobalMembersTbcore.TB_hash[key >> (64 - DefineConstants.TBHASHBITS)];
                for (i = 0; i < DefineConstants.HSHMAX; i++)
                {
                    if (ptr2[i].key == key)
                    {
                        break;
                    }
                }
                if (i == DefineConstants.HSHMAX)
                {
                    success = 0;
                    return(0);
                }
                ptr = ptr2[i].ptr;
                string str    = new string(new char[16]);
                int    mirror = (ptr.key != key);
                GlobalMembersTbprobe.prt_str(pos, str, mirror);
                if (GlobalMembersTbcore.DTZ_table[DefineConstants.DTZ_ENTRIES - 1].entry != null)
                {
                    GlobalMembersTbcore.free_dtz_entry(GlobalMembersTbcore.DTZ_table[DefineConstants.DTZ_ENTRIES - 1].entry);
                }
                for (i = DefineConstants.DTZ_ENTRIES - 1; i > 0; i--)
                {
                    GlobalMembersTbcore.DTZ_table[i] = GlobalMembersTbcore.DTZ_table[i - 1];
                }
                GlobalMembersTbcore.load_dtz_table(ref str, GlobalMembersTbprobe.calc_key(pos, mirror), GlobalMembersTbprobe.calc_key(pos, mirror == 0));
            }
        }

        ptr = GlobalMembersTbcore.DTZ_table[0].entry;
        if (ptr == null)
        {
            success = 0;
            return(0);
        }

        int bside;
        int mirror;
        int cmirror;

        if (ptr.symmetric == 0)
        {
            if (key != ptr.key)
            {
                cmirror = 8;
                mirror  = 0x38;
                bside   = (pos.side_to_move() == Color.WHITE);
            }
            else
            {
                cmirror = mirror = 0;
                bside   = !(pos.side_to_move() == Color.WHITE);
            }
        }
        else
        {
            cmirror = (int)pos.side_to_move() == ((int)Color.WHITE) != 0 ? 0 : 8;
            mirror  = (int)pos.side_to_move() == ((int)Color.WHITE) != 0 ? 0 : 0x38;
            bside   = 0;
        }

        if (ptr.has_pawns == 0)
        {
            DTZEntry_piece entry = (DTZEntry_piece)ptr;
            if ((entry.flags & 1) != bside && entry.symmetric == 0)
            {
                success = -1;
                return(0);
            }
            byte[] pc = entry.pieces;
            for (i = 0; i < entry.num;)
            {
                uint GlobalMembersBitboard.long bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), (PieceType)(pc[i] & 0x07));
                do
                {
                    p[i++] = (int)GlobalMembersBitboard.pop_lsb(ref bb);
                } while (bb);
            }
            idx = GlobalMembersTbcore.encode_piece((TBEntry_piece)entry, entry.norm, p, entry.factor);
            res = GlobalMembersTbcore.decompress_pairs(entry.precomp, idx);

            if ((entry.flags & 2) != 0)
            {
                res = entry.map[entry.map_idx[GlobalMembersTbcore.wdl_to_map[wdl + 2]] + res];
            }

            if (!(entry.flags & GlobalMembersTbcore.pa_flags[wdl + 2]) || (wdl & 1))
            {
                res *= 2;
            }
        }
        else
        {
            DTZEntry_pawn entry = (DTZEntry_pawn)ptr;
            int           k     = entry.file[0].pieces[0] ^ cmirror;
            uint GlobalMembersBitboard.long bb = pos.pieces((Color)(k >> 3), (PieceType)(k & 0x07));
            i = 0;
            do
            {
                p[i++] = (int)GlobalMembersBitboard.pop_lsb(ref bb) ^ mirror;
            } while (bb);
            int f = GlobalMembersTbcore.pawn_file((TBEntry_pawn)entry, p);
            if ((entry.flags[f] & 1) != bside)
            {
                success = -1;
                return(0);
            }
            byte[] pc = entry.file[f].pieces;
            for (; i < entry.num;)
            {
                bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), (PieceType)(pc[i] & 0x07));
                do
                {
                    p[i++] = (int)GlobalMembersBitboard.pop_lsb(ref bb) ^ mirror;
                } while (bb);
            }
            idx = GlobalMembersTbcore.encode_pawn((TBEntry_pawn)entry, entry.file[f].norm, p, entry.file[f].factor);
            res = GlobalMembersTbcore.decompress_pairs(entry.file[f].precomp, idx);

            if ((entry.flags[f] & 2) != 0)
            {
                res = entry.map[entry.map_idx[f, GlobalMembersTbcore.wdl_to_map[wdl + 2]] + res];
            }

            if (!(entry.flags[f] & GlobalMembersTbcore.pa_flags[wdl + 2]) || (wdl & 1))
            {
                res *= 2;
            }
        }

        return(res);
    }