mirror of
https://github.com/peterosterlund2/droidfish.git
synced 2024-11-23 11:31:33 +01:00
Use embedded net when UCI option EvalFile has default value
This commit is contained in:
parent
1a9a3627b6
commit
bec49dc5a7
BIN
DroidFishApp/src/main/assets/nn-82215d0fd0df.nnue
Normal file
BIN
DroidFishApp/src/main/assets/nn-82215d0fd0df.nnue
Normal file
Binary file not shown.
|
@ -180,14 +180,17 @@ public class ExternalEngine extends UCIEngineBase {
|
||||||
if (files == null)
|
if (files == null)
|
||||||
return;
|
return;
|
||||||
for (File f : files) {
|
for (File f : files) {
|
||||||
if (!f.getCanonicalPath().equals(exePath))
|
if (!f.getCanonicalPath().equals(exePath) && !keepExeDirFile(f))
|
||||||
f.delete();
|
f.delete();
|
||||||
}
|
}
|
||||||
new File(context.getFilesDir(), "engine.exe").delete();
|
|
||||||
} catch (IOException ignore) {
|
} catch (IOException ignore) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean keepExeDirFile(File f) {
|
||||||
|
return InternalStockFish.keepExeDirFile(f);
|
||||||
|
}
|
||||||
|
|
||||||
private int hashMB = -1;
|
private int hashMB = -1;
|
||||||
private String gaviotaTbPath = "";
|
private String gaviotaTbPath = "";
|
||||||
private String syzygyPath = "";
|
private String syzygyPath = "";
|
||||||
|
@ -292,9 +295,6 @@ public class ExternalEngine extends UCIEngineBase {
|
||||||
new File(internalSFPath()).delete();
|
new File(internalSFPath()).delete();
|
||||||
if (to.exists() && (from.length() == to.length()) && (from.lastModified() == to.lastModified()))
|
if (to.exists() && (from.length() == to.length()) && (from.lastModified() == to.lastModified()))
|
||||||
return to.getAbsolutePath();
|
return to.getAbsolutePath();
|
||||||
if (to.exists())
|
|
||||||
to.delete();
|
|
||||||
to.createNewFile();
|
|
||||||
try (FileInputStream fis = new FileInputStream(from);
|
try (FileInputStream fis = new FileInputStream(from);
|
||||||
FileChannel inFC = fis.getChannel();
|
FileChannel inFC = fis.getChannel();
|
||||||
FileOutputStream fos = new FileOutputStream(to);
|
FileOutputStream fos = new FileOutputStream(to);
|
||||||
|
|
|
@ -32,8 +32,13 @@ import java.util.Locale;
|
||||||
|
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
|
||||||
|
import org.petero.droidfish.EngineOptions;
|
||||||
|
|
||||||
/** Stockfish engine running as process, started from assets resource. */
|
/** Stockfish engine running as process, started from assets resource. */
|
||||||
public class InternalStockFish extends ExternalEngine {
|
public class InternalStockFish extends ExternalEngine {
|
||||||
|
private static final String defaultNet = "nn-82215d0fd0df.nnue";
|
||||||
|
private static final String netOption = "evalfile";
|
||||||
|
private File defaultNetFile; // To get the full path of the copied default network file
|
||||||
|
|
||||||
public InternalStockFish(Report report, String workDir) {
|
public InternalStockFish(Report report, String workDir) {
|
||||||
super("", workDir, report);
|
super("", workDir, report);
|
||||||
|
@ -106,15 +111,30 @@ public class InternalStockFish extends ExternalEngine {
|
||||||
// on the assumption that it will reduce memory wear.
|
// on the assumption that it will reduce memory wear.
|
||||||
long oldCSum = readCheckSum(new File(internalSFPath()));
|
long oldCSum = readCheckSum(new File(internalSFPath()));
|
||||||
long newCSum = computeAssetsCheckSum(sfExe);
|
long newCSum = computeAssetsCheckSum(sfExe);
|
||||||
if (oldCSum == newCSum)
|
if (oldCSum != newCSum) {
|
||||||
return to.getAbsolutePath();
|
copyAssetFile(sfExe, to);
|
||||||
|
writeCheckSum(new File(internalSFPath()), newCSum);
|
||||||
|
}
|
||||||
|
copyNetFile(exeDir);
|
||||||
|
return to.getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
if (to.exists())
|
/** Copy the Stockfish default network file to "exeDir" if it is not already there. */
|
||||||
to.delete();
|
private void copyNetFile(File exeDir) throws IOException {
|
||||||
to.createNewFile();
|
defaultNetFile = new File(exeDir, defaultNet);
|
||||||
|
if (defaultNetFile.exists())
|
||||||
|
return;
|
||||||
|
File tmpFile = new File(exeDir, defaultNet + ".tmp");
|
||||||
|
copyAssetFile(defaultNet, tmpFile);
|
||||||
|
if (!tmpFile.renameTo(defaultNetFile))
|
||||||
|
throw new IOException("Rename failed");
|
||||||
|
}
|
||||||
|
|
||||||
try (InputStream is = context.getAssets().open(sfExe);
|
/** Copy a file resource from the AssetManager to the file system,
|
||||||
OutputStream os = new FileOutputStream(to)) {
|
* so it can be used by native code like the Stockfish engine. */
|
||||||
|
private void copyAssetFile(String assetName, File targetFile) throws IOException {
|
||||||
|
try (InputStream is = context.getAssets().open(assetName);
|
||||||
|
OutputStream os = new FileOutputStream(targetFile)) {
|
||||||
byte[] buf = new byte[8192];
|
byte[] buf = new byte[8192];
|
||||||
while (true) {
|
while (true) {
|
||||||
int len = is.read(buf);
|
int len = is.read(buf);
|
||||||
|
@ -123,8 +143,34 @@ public class InternalStockFish extends ExternalEngine {
|
||||||
os.write(buf, 0, len);
|
os.write(buf, 0, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
writeCheckSum(new File(internalSFPath()), newCSum);
|
/** Return true if file "f" should be kept in the exeDir directory.
|
||||||
return to.getAbsolutePath();
|
* It would be inefficient to remove the network file every time
|
||||||
|
* an engine different from Stockfish is used, so this is a static
|
||||||
|
* check performed for all engines. */
|
||||||
|
public static boolean keepExeDirFile(File f) {
|
||||||
|
return defaultNet.equals(f.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initOptions(EngineOptions engineOptions) {
|
||||||
|
super.initOptions(engineOptions);
|
||||||
|
UCIOptions.OptionBase opt = getUCIOptions().getOption(netOption);
|
||||||
|
if (opt != null)
|
||||||
|
setOption(netOption, opt.getStringValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Handles setting the EvalFile UCI option to a full path if needed,
|
||||||
|
* pointing to the network file embedded in DroidFish. */
|
||||||
|
@Override
|
||||||
|
public boolean setOption(String name, String value) {
|
||||||
|
if (name.toLowerCase(Locale.US).equals(netOption) && defaultNet.equals(value)) {
|
||||||
|
getUCIOptions().getOption(name).setFromString(value);
|
||||||
|
value = defaultNetFile.getAbsolutePath();
|
||||||
|
writeLineToEngine(String.format(Locale.US, "setoption name %s value %s", name, value));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.setOption(name, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,7 +290,7 @@ public abstract class UCIEngineBase implements UCIEngine {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean setOption(String name, String value) {
|
public boolean setOption(String name, String value) {
|
||||||
if (!options.contains(name))
|
if (!options.contains(name))
|
||||||
return false;
|
return false;
|
||||||
UCIOptions.OptionBase o = options.getOption(name);
|
UCIOptions.OptionBase o = options.getOption(name);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user