/// <summary> /// Constructor to create a store of specified maximum size. /// </summary> /// <param name="maxNodes"></param> /// <param name="priorMoves"></param> public MCTSNodeStore(int maxNodes, PositionWithHistory priorMoves = null) { if (priorMoves == null) { priorMoves = PositionWithHistory.StartPosition; } MaxNodes = maxNodes; int allocNodes = maxNodes; Nodes = new MCTSNodeStructStorage(allocNodes, null, MCTSParamsFixed.STORAGE_USE_INCREMENTAL_ALLOC, MCTSParamsFixed.STORAGE_LARGE_PAGES, MCTSParamsFixed.STORAGE_USE_EXISTING_SHARED_MEM); long reserveChildren = maxNodes * (long)AVG_CHILDREN_PER_NODE; Children = new MCTSNodeStructChildStorage(this, reserveChildren); // Save a copy of the prior moves Nodes.PriorMoves = new PositionWithHistory(priorMoves); CeresEnvironment.LogInfo("NodeStore", "Init", $"MCTSNodeStore created with max {maxNodes} nodes, max {reserveChildren} children"); MCTSNodeStruct.ValidateMCTSNodeStruct(); RootIndex = new MCTSNodeStructIndex(1); }
private bool disposedValue = false; // To detect redundant calls /// <summary> /// Disposes of the store, releasing all nodes and children. /// </summary> /// <param name="disposing"></param> protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // TODO: dispose managed state (managed objects). } Nodes?.Deallocate(); Nodes = null; Children?.Deallocate(); Children = null; disposedValue = true; } }