/*
 
    Protector -- a UCI chess engine
 
 
 
    Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com)
 
 
 
    This program is free software: you can redistribute it and/or modify
 
    it under the terms of the GNU General Public License as published by
 
    the Free Software Foundation, either version 3 of the License, or
 
    (at your option) any later version.
 
 
 
    This program is distributed in the hope that it will be useful,
 
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
    GNU General Public License for more details.
 
 
 
    You should have received a copy of the GNU General Public License
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 
*/
 
 
 
#ifndef _coordination_h_
 
#define _coordination_h_
 
 
 
#include "position.h"
 
#include "movegeneration.h"
 
 
 
typedef enum
 
{
 
   TASKTYPE_BEST_MOVE,
 
   TASKTYPE_TEST_BEST_MOVE,
 
   TASKTYPE_MATE_IN_N,
 
   TASKTYPE_TEST_MATE_IN_N
 
} TaskType;
 
 
 
typedef struct
 
{
 
   TaskType type;               /* the type of task to be performed */
 
   Variation *variation;        /* the variation to be examined */
 
   int numberOfMoves;           /* mateproblems: the number of moves */
 
   Movelist solutions;          /* mateproblems: the known solutions */
 
 
 
   Movelist calculatedSolutions;        /* the calculated solutions */
 
   Move bestMove;               /* the calculated best move */
 
 
 
   UINT64 nodes;                /* the number of nodes calculated */
 
} SearchTask;
 
 
 
/**
 
 * Set the number of threads to be used.
 
 *
 
 * @var numThreads the number of threads to be used
 
 * @return the effective number of threads that will be used
 
 */
 
int setNumberOfThreads(int numThreads);
 
int getNumberOfThreads();
 
 
 
/**
 
 * Set the size of the hashtable.
 
 *
 
 * @var size the size of the hashtable in MB
 
 */
 
void setHashtableSizeInMb(unsigned int size);
 
 
 
/**
 
 * Lock out either the gui or the search thread.
 
 */
 
void getGuiSearchMutex(void);
 
 
 
/**
 
 * Release the gui/search thread lock.
 
 */
 
void releaseGuiSearchMutex(void);
 
 
 
/**
 
 * Schedule the specified task as the next task to be calculated.
 
 */
 
void scheduleTask(SearchTask * task);
 
 
 
/**
 
 * Start the timer of the specified task.
 
 */
 
void startTimerThread(SearchTask * task);
 
 
 
/**
 
 * Get the elapsed time of the current search.
 
 */
 
long getElapsedTime();
 
 
 
/**
 
 * Get the hashtable shared by the search threads.
 
 */
 
Hashtable *getSharedHashtable();
 
 
 
/**
 
 * Signal an abortion of the current search and copy 
 
 * the current variation to 'variation'.
 
 */
 
void prepareSearchAbort(void);
 
 
 
/**
 
 * Unset the ponder mode for the current search.
 
 */
 
void unsetPonderMode(void);
 
 
 
/**
 
 * Wait for the current search to terminate.
 
 */
 
void waitForSearchTermination(void);
 
 
 
/**
 
 * Set the timelimits for the current search task.
 
 */
 
void setTimeLimit(unsigned long timeTarget, unsigned long timeLimit);
 
 
 
/**
 
 * Schedule the specified task as the next task to be calculated.
 
 * Then wait until the task is completed.
 
 */
 
void completeTask(SearchTask * task);
 
 
 
/**
 
 * Get the variation object of the current search task.
 
 */
 
Variation *getCurrentVariation(void);
 
 
 
/**
 
 * Get the number of nodes calculated by all active threads.
 
 */
 
UINT64 getNodeCount(void);
 
 
 
/**
 
 * Initialize this module.
 
 *
 
 * @return 0 if no errors occurred.
 
 */
 
int initializeModuleCoordination(void);
 
 
 
/**
 
 * Test this module.
 
 *
 
 * @return 0 if all tests succeed.
 
 */
 
int testModuleCoordination(void);
 
 
 
#endif