//---------------------------------------------------------------------------------------- public void Init(cControlReloj control, int nPly, color nColor) { int nCalculoDeHorizonte = cMotor.m_mapConfig["CONTROL_DE_HORIZONTE"].Get(); int nEmergencia = cMotor.m_mapConfig["CONTROL_DE_EMERGENCIA"].Get(); int nTiempoExtra = cMotor.m_mapConfig["TIEMPO_EXTRA"].Get(); int nTiempoMinimo = cMotor.m_mapConfig["TIEMPO_MINIMO"].Get(); int nJuegoLento = cMotor.m_mapConfig["TIEMPO_LENTO"].Get(); m_nFactorInestabilidad = 1; m_nTiempoDisponible = m_nTiempoMaximo = Math.Max(control.time[nColor], nTiempoMinimo); for (int i = 1; i <= (control.movestogo != 0 ? Math.Min(control.movestogo, 50) : 50); ++i) { int nTiempo = control.time[nColor] + control.inc[nColor] * (i - 1) - nEmergencia - nTiempoExtra * Math.Min(i, nCalculoDeHorizonte); nTiempo = Math.Max(nTiempo, 0); int t1 = nTiempoMinimo + TiempoRestante(nTiempo, i, nPly, nJuegoLento, TipoReloj.OPTIMO); int t2 = nTiempoMinimo + TiempoRestante(nTiempo, i, nPly, nJuegoLento, TipoReloj.MAXIMO); m_nTiempoDisponible = Math.Min(m_nTiempoDisponible, t1); m_nTiempoMaximo = Math.Min(m_nTiempoMaximo, t2); } if (cMotor.m_mapConfig["Ponder"].Get() != 0) m_nTiempoDisponible += m_nTiempoDisponible / 4; m_nTiempoDisponible = Math.Min(m_nTiempoDisponible, m_nTiempoMaximo); }
//--------------------------------------------------------------------------------------------- public static void Test() { cControlReloj limits = new cControlReloj(); List<string> posicionesFEN = new List<string>(); m_mapConfig["Hash"].setCurrentValue("128"); m_TablaHash.Clear(); m_mapConfig["Threads"].setCurrentValue("8"); //-- Tiempo en milisegundos limits.movetime = 1000 * 10; posicionesFEN.AddRange(Defaults); Int64 nodes = 0; Stack<cPosInfo> st = new Stack<cPosInfo>(); long elapsed = cReloj.Now(); for (int i = 0; i < posicionesFEN.Count; ++i) { cPosicion posicion = new cPosicion(posicionesFEN[i], m_mapConfig["UCI_Chess960"].Get() != 0 ? true : false, m_Threads.Principal()); m_Consola.Print(cTypes.LF + (i + 1).ToString() + "/" + posicionesFEN.Count.ToString() + ": ", AccionConsola.NADA); m_Consola.Print(posicionesFEN[i], AccionConsola.NADA); m_Consola.Print(cTypes.LF, AccionConsola.NADA); m_Threads.Analizando(posicion, limits, st); m_Threads.WaitAnalizando(); nodes += (Int64)cSearch.RootPos.GetNodos(); } elapsed = cReloj.Now() - elapsed + 1; m_Consola.Print(cTypes.LF + "===========================", AccionConsola.NADA); m_Consola.Print(cTypes.LF + "Tiempo transcurrido: " + elapsed.ToString(), AccionConsola.NADA); m_Consola.Print(cTypes.LF + "Nodos analizados : " + nodes.ToString(), AccionConsola.NADA); }
//--------------------------------------------------------------------------------- public static void GoUCI(cPosicion pos, Stack<string> lista_valores) { cControlReloj control = new cControlReloj(); string token = string.Empty; while (lista_valores.Count > 0) { token = lista_valores.Pop(); if (token == "searchmoves") while ((token = lista_valores.Pop()) != null) control.searchmoves.Add(cUci.GetFromUCI(pos, token)); else if (token == "wtime") control.time[cColor.BLANCO] = int.Parse(lista_valores.Pop()); else if (token == "btime") control.time[cColor.NEGRO] = int.Parse(lista_valores.Pop()); else if (token == "winc") control.inc[cColor.BLANCO] = int.Parse(lista_valores.Pop()); else if (token == "binc") control.inc[cColor.NEGRO] = int.Parse(lista_valores.Pop()); else if (token == "movestogo") control.movestogo = int.Parse(lista_valores.Pop()); else if (token == "depth") control.depth = int.Parse(lista_valores.Pop()); else if (token == "nodes") control.nodes = int.Parse(lista_valores.Pop()); else if (token == "movetime") control.movetime = int.Parse(lista_valores.Pop()); else if (token == "mate") control.mate = int.Parse(lista_valores.Pop()); else if (token == "infinite") control.infinite = 1; else if (token == "ponder") control.ponder = 1; } cMotor.m_Threads.Analizando(pos, control, SetupStates); }