private static PMOVE init_PMOVE(int m, int RN)
    {
        PMOVE p = new PMOVE();

        p.local_move  = m;
        p.global_move = -1;//will calculate later
        if (RN == 1)
        {
            p.global_move = m;
            if (m <= BOARDSIZE * BOARDSIZE / 2)
            {
                p.global_move = m - 1;
            }
        }
        return(p);
    }
    private static void add_new_patterns(ref Dictionary <int, Pattern> all_patterns, Pattern cur_pattern,
                                         int bn, ref List <Pattern> working_patterns)
    {
        int i, j, k;
        Dictionary <int, int> local_global = new Dictionary <int, int>();

        for (i = 0; i < cur_pattern.vc_WMs.Count; i++)
        {
            for (j = 1; j < cur_pattern.vc_WMs[i].Count; j++)
            {
                local_global[cur_pattern.vc_WMs[i][j].local_move] = cur_pattern.vc_WMs[i][j].global_move;
            }
        }
        if (cur_pattern.RN == 1)
        {
            for (i = 1; i <= BOARDSIZE * BOARDSIZE - 1; i++)
            {
                if (i <= mid_point)
                {
                    local_global[i] = i - 1;
                }
                else
                {
                    local_global[i] = i;
                }
            }
        }

        if (cur_pattern.vc_ND[bn] == 0)
        {
            return;                             //nothing to add
        }
        int ND = cur_pattern.vc_vc_PPs[bn].Count;

        for (i = 0; i < ND; i++)
        {
            int ch_id = cur_pattern.vc_vc_PPs[bn][i][0];
            Dictionary <int, int> ch_pa = new Dictionary <int, int>();
            for (j = 1; j < cur_pattern.vc_vc_PPs[bn][i].Count; j++)
            {
                int m = cur_pattern.vc_vc_PPs[bn][i][j];
                ch_pa[j] = local_global[m];
            }
            Pattern p = new Pattern(all_patterns[ch_id]);

            for (j = 0; j < p.vc_WMs.Count; j++)
            {
                int   l;
                PMOVE pmove;
                for (k = 1; k < p.vc_WMs[j].Count; k++)
                {
                    pmove = new PMOVE();

                    l = p.vc_WMs[j][k].local_move;
                    //p.vc_BM[j].global_move = ch_pa[l];
                    pmove.global_move = ch_pa[l];
                    pmove.local_move  = p.vc_WMs[j][k].local_move;
                    p.vc_WMs[j][k]    = pmove;
                }
                pmove             = new PMOVE();
                l                 = p.vc_BM[j].local_move;
                pmove.global_move = ch_pa[l];
                pmove.local_move  = p.vc_BM[j].local_move;
                //p.vc_BM[j].global_move = ch_pa[l];
                p.vc_BM[j] = pmove;
            }
            working_patterns.Add(p);
        }
    }