/// <summary> /// Load precalcuation table for fast calculation. /// If not called by user, will be called automatically as soon as /// it is necessary (which may slow-down the very first calculation). /// </summary> public static void LoadLut() { string path = GetLutPath(); BdsVersion assemblyVersion = new BdsVersion(Assembly.GetExecutingAssembly()); using (BinaryReader r = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) { BdsVersion fileVersion = new BdsVersion(); fileVersion.Read(r); if (assemblyVersion.Major != fileVersion.Major || assemblyVersion.Minor != fileVersion.Minor || assemblyVersion.Revision != fileVersion.Revision) { throw new ApplicationException( String.Format("Wrong file version: expected: {0:x8}, was: {1:x8}, file: {2}", assemblyVersion, fileVersion, path)); } int count = r.ReadInt32(); _lut = new Precalculated[count]; for (int i = 0; i < count; ++i) { _lut[i].Read(r); } } }
public static Result CalculateFast(HePocketKind p1, HePocketKind p2) { if (_lut == null) { LoadLut(); } Precalculated key = new Precalculated(); bool reverse = p1 > p2; if (reverse) { key.PocketKind1 = (byte)p2; key.PocketKind2 = (byte)p1; } else { key.PocketKind1 = (byte)p1; key.PocketKind2 = (byte)p2; } int i = Array.BinarySearch(_lut, key, _precalculatedComparer); Result r = new Result { Count = _lut[i].Count }; if (reverse) { r.Equity = 1 - _lut[i].Equity; } else { r.Equity = _lut[i].Equity; } return(r); }
public static void Precalculate() { DateTime startTime = DateTime.Now; string lutPath = GetLutPath(); if (File.Exists(lutPath)) { // Do not ovewriting an existing file to save time. Console.WriteLine("LUT file {0} already exist, exiting. Delete the file to recalculate.", lutPath); return; } Precalculated[] precalcArray = new Precalculated[HePocket.Count * (HePocket.Count + 1) / 2]; int i = 0; Console.WriteLine("Calculating for"); for (int pk1 = 0; pk1 < HePocket.Count; pk1++) { Console.Write(" {0}", (HePocketKind)pk1); for (int pk2 = pk1; pk2 < HePocket.Count; pk2++) { Result r = Calculate((HePocketKind)pk1, (HePocketKind)pk2); precalcArray[i].PocketKind1 = (byte)pk1; precalcArray[i].PocketKind2 = (byte)pk2; precalcArray[i].Count = (byte)r.Count; precalcArray[i].Equity = r.Equity; ++i; } } Console.WriteLine(); BdsVersion assemblyVersion = new BdsVersion(Assembly.GetExecutingAssembly()); BdsVersion fileVersion = new BdsVersion(); fileVersion.Major = assemblyVersion.Major; fileVersion.Minor = assemblyVersion.Minor; fileVersion.Revision = assemblyVersion.Revision; fileVersion.ScmInfo = assemblyVersion.ScmInfo; fileVersion.Description = "HE heads-up pocket equity LUT."; string dir = Path.GetDirectoryName(lutPath); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } using (BinaryWriter wr = new BinaryWriter(File.Open(lutPath, FileMode.Create))) { fileVersion.Write(wr); wr.Write(precalcArray.Length); for (i = 0; i < precalcArray.Length; ++i) { precalcArray[i].Write(wr); } } Console.WriteLine("Calculated in {0} s", (DateTime.Now - startTime).TotalSeconds); }