/*
DroidFish - An Android chess program.
Copyright (C) 2011-2014 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.tb;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.petero.droidfish.engine.EngineUtil;
/** */
public class RtbProbe {
static {
System.loadLibrary("rtb");
}
private String currTbPath = "";
private ConcurrentLinkedQueue<String> tbPathQueue = new ConcurrentLinkedQueue<String>();
RtbProbe() {
}
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.4s to increase probability that engine
// is initialized before TB.
try { Thread.sleep(400); } 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);
}
}
}
public final static int NOINFO = 1000;
/**
* Probe tablebases.
* @param squares Array of length 64, see Position class.
* @param wtm True if white to move.
* @param epSq En passant square, see Position class.
* @param castleMask Castle mask, see Position class.
* @param halfMoveClock half move clock, see Position class.
* @param fullMoveCounter Full move counter, see Position class.
* @param result Two element array. Set to [wdlScore, dtzScore].
* The wdl score is one of: 0: Draw
* 1: win for side to move
* -1: loss for side to move
* NOINFO: No info available
* The dtz score is one of: 0: Draw
* x>0: Win in x plies
* x<0: Loss in -x plies
* NOINFO: No info available
* @return True if success.
*/
public final native void probe(byte[] squares,
boolean wtm,
int epSq, int castleMask,
int halfMoveClock,
int fullMoveCounter,
int[] result);
private final native static boolean init(String tbPath);
}