/*
GtbProbe - Java interface to Gaviota endgame tablebases.
Copyright (C) 2011-2012 Peter Ă–sterlund, peterosterlund2@gmail.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/>.
*/
package org.petero.droidfish.gtb;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.petero.droidfish.engine.EngineUtil;
/** Interface to native gtb probing code. */
class GtbProbe {
static {
System.loadLibrary("gtb");
}
private String currTbPath = "";
private ConcurrentLinkedQueue<String> tbPathQueue = new ConcurrentLinkedQueue<String>();
GtbProbe() {
}
public final void setPath(String tbPath, boolean forceReload) {
if (forceReload || !tbPathQueue.isEmpty() || !currTbPath.equals(tbPath)) {
tbPathQueue.add(tbPath);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Sleep 0.5s to increase probability that engine
// is initialized before TB.
try { Thread.sleep(500); } catch (InterruptedException e) { }
initIfNeeded();
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
}
public final synchronized void initIfNeeded() {
String path = tbPathQueue.poll();
while (!tbPathQueue.isEmpty())
path = tbPathQueue.poll();
if (path != null) {
currTbPath = path;
synchronized (EngineUtil.nativeLock) {
init(currTbPath);
}
}
}
final static int NOPIECE = 0;
final static int PAWN = 1;
final static int KNIGHT = 2;
final static int BISHOP = 3;
final static int ROOK = 4;
final static int QUEEN = 5;
final static int KING = 6;
final static int NOSQUARE = 64;
// Castle masks
final static int H1_CASTLE = 8;
final static int A1_CASTLE = 4;
final static int H8_CASTLE = 2;
final static int A8_CASTLE = 1;
// tbinfo values
final static int DRAW = 0;
final static int WMATE = 1;
final static int BMATE = 2;
final static int FORBID = 3;
final static int UNKNOWN = 7;
/**
* Probe table bases.
* @param wtm True if white to move.
* @param epSq En passant square, or NOSQUARE.
* @param castleMask Castle mask.
* @param whiteSquares Array of squares occupied by white pieces, terminated with NOSQUARE.
* @param blackSquares Array of squares occupied by black pieces, terminated with NOSQUARE.
* @param whitePieces Array of white pieces, terminated with NOPIECE.
* @param blackPieces Array of black pieces, terminated with NOPIECE.
* @param result Two element array. Set to [tbinfo, plies].
* @return True if success.
*/
public final native boolean probeHard(boolean wtm, int epSq,
int castleMask,
int[] whiteSquares,
int[] blackSquares,
byte[] whitePieces,
byte[] blackPieces,
int[] result);
private final native static boolean init(String tbPath);
}