public bool TryCollapse(WcfSuperPosition _superPosition) { //returns true if collapsed to 1 or less... //returns false if more options left var TC_relativex = _superPosition.x - superPosition.x; var TC_relativey = _superPosition.y - superPosition.y; var TC_relativez = _superPosition.z - superPosition.z; var foundAcceptableItem = false; foreach (var superPositionItem in _superPosition.slots.Where(x => !x.Collapsed).Select(x => x.item)) { if ( item.AcceptsInDirection(superPositionItem, TC_relativex, TC_relativey, TC_relativez) ) { foundAcceptableItem = true; break; } } if (!foundAcceptableItem) { collapsed = true; return(collapsed); } //check requirements are met if (!RequirementsMet()) { collapsed = true; return(collapsed); } return(collapsed); }
public bool?Collapse(WcfSuperPosition context) { RecordPreviousStatesTemp(); int remaining = 0; foreach (var slot in slots) { var remains = !slot.TryCollapse(context); if (remains) { remaining += 1; } } //var remaining = slots.Select(x => x.TryCollapse(context)).Where(x=>x==false).Count(); if (remaining == 0) { //undefined, we have no options left! return(null); } var justChanged = false; for (var i = 0; i < slots.Count; i++) { if (previousStatesTemp[i] != slots[i].Collapsed) { justChanged = true; break; } } //if (remaining > 0) return(justChanged); }
private int GetNeighborhoodEntropy(WcfSuperPosition superposition) { var neighborhood = GetSuperPositionNeighbors(superposition.x, superposition.y, superposition.z); neighborhood.Add(superposition); return(neighborhood.Sum(x => x.slots.Where(y => !y.Collapsed).Count())); }
public void PrintStatesToConsole2d() { return; //var updatedSuperPosition = SuperPositionsFlat.Where(x => x.hasUpdated); Console.WriteLine(""); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { WcfSuperPosition thisSuperPosition = SuperPositions[x, y, 0]; //var isUpdated = updatedSuperPosition.Any(usp => usp.x == thisSuperPosition.x && usp.y == thisSuperPosition.y && thisSuperPosition.z == 0); int numberOfPossibilities = thisSuperPosition.slots.Where(s => !s.Collapsed).Count(); //WcfCollapsableSlot firstOpenSlot = thisSuperPosition.slots.Where(s => !s.Collapsed).FirstOrDefault(); ConsoleColor color = ConsoleColor.White; //if ( thisSuperPosition.hasUpdated) // color = ConsoleColor.Cyan; //if ( thisSuperPosition.hasUpdated) // color = ConsoleColor.DarkMagenta; //should never happen? //if ( !thisSuperPosition.hasUpdated) // color = ConsoleColor.Yellow; if (numberOfPossibilities == 0) { Console.BackgroundColor = ConsoleColor.DarkRed; Console.ForegroundColor = color; Console.Write(" "); Console.ResetColor(); continue; } if (numberOfPossibilities == 1) { Console.BackgroundColor = ConsoleColor.DarkGreen; Console.ForegroundColor = color; Console.Write(thisSuperPosition.slots.Where(_x => !_x.Collapsed).First().item.Name); Console.ResetColor(); continue; } //Number of possibilities > 1 Console.ForegroundColor = color; Console.Write(numberOfPossibilities.ToString()); Console.ResetColor(); } Console.WriteLine(""); } //Console.WriteLine("Press Enter to continue."); //Console.ReadLine(); }
public bool handlePropagation(WcfSuperPosition previouslyCollapsed) { return(previouslyCollapsed.Propagate()); //section deprecated - operational but not optimal //var propagationResult = previouslyCollapsed.Propagate(); ////section depracted... super old ////if (propagationResult == false) ////{ //// SuperPositionsFlat.ForEach(sp => sp.RestorePreviousStates()); //// failures++; //// if (failures > 100) //// return false; ////} ////else ////{ //// failures = 0; ////} ////SuperPositionsFlat.ForEach(sp => sp.RecordPreviousStates()); //return propagationResult; }
public void Init(int _width, int _height, int _depth, IEnumerable <IOpinionatedItem> items) { width = _width; height = _height; depth = _depth; SuperPositions = new WcfSuperPosition[_width, _height, _depth]; SuperPositionsFlat = new List <WcfSuperPosition>(); for (int x = 0; x < _width; x++) { for (int y = 0; y < _height; y++) { for (int z = 0; z < _depth; z++) { SuperPositions[x, y, z] = new WcfSuperPosition(items, random, x, y, z, this); SuperPositionsFlat.Add(SuperPositions[x, y, z]); } } } var _influenceShape = new List <WcfVector>(); for (int x = -1; x < 2; x++) { for (int y = -1; y < 2; y++) { for (var z = -1; z < 2; z++) { if (!(x == 0 && y == 0 && z == 0)) { _influenceShape.Add(new WcfVector(x, y, z)); } } } } InfluenceShape = _influenceShape.ToArray(); //SuperPositionsFlat.ForEach(sp => sp.RecordPreviousStates()); }
public WcfCollapsableSlot(IOpinionatedItem _item, int _weight, WcfSuperPosition _superPosition) { weight = _weight; item = _item; superPosition = _superPosition; }