Newer
Older
using System;
Marco Zimmer
committed
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
Marco Zimmer
committed
using static CommunicationEvents;
/// <summary>
/// Solution of a <see cref="Stage"/>
/// </summary>
Marco Zimmer
committed
public class SolutionOrganizer : FactOrganizer
{
/// @{ <summary> adds to the end of the file name of a </summary>
Marco Zimmer
committed
private const string
/// <summary> SolutionFile (stores <see cref="SolutionOrganizer">this</see>) </summary>
Marco Zimmer
committed
endingSol = "_sol",
/// <summary> ValidationFile (stores <see cref="ValidationSet"/>) </summary>
Marco Zimmer
committed
endingVal = "_val";
/// @}
Marco Zimmer
committed
/// <summary>
/// \copydoc FactOrganizer.hierState
/// Additional value for <see cref="ValidationSet"/>
/// </summary>
Marco Zimmer
committed
private static List<Directories>
hierVal = new List<Directories> { Directories.ValidationSets };
/// <summary>
/// A collection of constrains of which *all* have to be <see langword="true"/>
/// <seealso cref="SubSolution"/>
/// <seealso cref="FactOrganizer.DynamiclySolved(SolutionOrganizer, out List<List<string>>, out List<List<string>>)"/>
/// </summary>
/// <summary>
/// Sits at the heart, but represents only a part of the whole Solution.
/// </summary>
public class SubSolution
// needs to be public for JSONWriter
{
/// <summary>
/// entails <b>{<see cref="FactOrganizer.FactDict">SolutionOrganizer.FacDict.Values</see>}</b> <br/>
/// <see cref="FactOrganizer.FactDict">SolutionFacts</see> to relate from.
/// </summary>
public HashSet<string> MasterIDs = new HashSet<string>();
/// <summary>
/// entails <b>{[],[0, <see cref="SolutionOrganizer.ValidationSet"/><c>.IndexOf(<see cref="SubSolution">this</see>)</c> - 2]}</b> <br/>
/// Marks LevelFacts (<see cref="StageStatic.stage.factState"/>) found as solution (<see cref="FactOrganizer.DynamiclySolved(SolutionOrganizer, out List<List<string>>, out List<List<string>>)"/>)
/// in a previous entry of <see cref="SolutionOrganizer.ValidationSet"/><br/>
/// to relate from *in addition* to <see cref="MasterIDs"/> <br/>
/// or _none_ if <c>empty</c>
/// </summary>
public List<int> SolutionIndex = new List<int>();
/// <summary>
/// entails <b>{[],[0, <see cref="SolutionOrganizer.ValidationSet"/><c>.IndexOf(<see cref="SubSolution">this</see>)</c> - 2]}</b> <br/>
/// Marks LevelFacts (<see cref="StageStatic.stage.factState"/>) found as solution (<see cref="FactOrganizer.DynamiclySolved(SolutionOrganizer, out List<List<string>>, out List<List<string>>)"/>)
/// in a previous entry of <see cref="SolutionOrganizer.ValidationSet"/><br/>
/// to relate to *instead of* all LevelFacts (<see cref="StageStatic.stage.factState"/>) <br/>
/// or _none_ if <c>empty</c>
/// </summary>
Marco Zimmer
committed
public List<int> RelationIndex = new List<int>();
/// <summary>
/// Comparer defining relation between <see cref="FactOrganizer.FactDict">SolutionFacts</see> and LevelFacts (<see cref="StageStatic.stage.factState"/>)
/// </summary>
[JsonIgnore]
public FactComparer Comparer = new FactEquivalentsComparer();
/// <summary>
/// Enables (especially <see cref="JsonConverter"/>) to read and set <see cref="Comparer"/> by its <c>string</c> representation.
/// </summary>
public string ComparerString
{
get { return Comparer.ToString(); }
set {
// Select and create FactComparer by name
var typ = fact_comparer.First(t => t.Name == value);
Comparer = Activator.CreateInstance(typ) as FactComparer;
}
}
/// <summary>
/// Collection of <c>string</c> representations of *all* available <see cref="FactComparer"/> to choose from.
/// </summary>
[JsonIgnore]
public static readonly IEnumerable<Type> fact_comparer = Assembly.GetExecutingAssembly().GetTypes().Where(typeof(FactComparer).IsAssignableFrom);
/// <summary>
/// Only used by <see cref="JsonConverter"/> to initiate empty instance.
/// </summary>
/// <summary>
/// Standard Constructor
/// </summary>
/// <param name="MasterIDs">sets <see cref="MasterIDs"/> iff not <see langword="null"/></param>
/// <param name="SolutionIndex">sets <see cref="SolutionIndex"/> iff not <see langword="null"/></param>
/// <param name="RelationIndex">sets <see cref="RelationIndex"/> iff not <see langword="null"/></param>
/// <param name="Comparer">sets <see cref="Comparer"/> iff not <see langword="null"/></param>
Marco Zimmer
committed
public SubSolution(HashSet<string> MasterIDs, List<int> SolutionIndex, List<int> RelationIndex, FactComparer Comparer)
{
if (MasterIDs != null)
this.MasterIDs = MasterIDs;
if (SolutionIndex != null)
this.SolutionIndex = SolutionIndex;
Marco Zimmer
committed
if (RelationIndex != null)
this.RelationIndex = RelationIndex;
if (Comparer != null)
this.Comparer = Comparer;
}
/// <summary>
/// <see langword="true"/> if there is no solution to be deducted.
/// </summary>
/// <returns><c>MasterIDs.Count == 0 && SolutionIndex.Count == 0;</c></returns>
public bool IsEmpty()
{
return MasterIDs.Count == 0 && SolutionIndex.Count == 0;
}
Marco Zimmer
committed
Marco Zimmer
committed
/// \copydoc FactOrganizer.FactOrganizer()
public SolutionOrganizer(): base()
{
ValidationSet = new List<SubSolution>();
}
/// \copydoc FactOrganizer.FactOrganizer(bool)
Marco Zimmer
committed
public SolutionOrganizer(bool invoke = false): base(invoke)
{
Marco Zimmer
committed
}
/*
Marco Zimmer
committed
public List<Fact> getMasterFactsByIndex (int i)
{
return ValidationSet[i].MasterIDs.Select(id => this[id]).ToList();
}
*/
Marco Zimmer
committed
/// @{
/// TODO? move to interface?
/// TODO: document
public new void store(string name, List<Directories> hierarchie = null, bool use_install_folder = false, bool overwrite = true)
Marco Zimmer
committed
{
hierarchie ??= new List<Directories>();
hierarchie.AddRange(hierVal.AsEnumerable());
Marco Zimmer
committed
string path_o = path;
path = CreatePathToFile(out bool exists, name + endingVal, "JSON", hierarchie, use_install_folder);
hierarchie.RemoveRange(hierarchie.Count - hierVal.Count, hierVal.Count);
if (exists && !overwrite)
{
Marco Zimmer
committed
path = path_o;
Marco Zimmer
committed
JSONManager.WriteToJsonFile(path, this);
path = path_o;
Marco Zimmer
committed
}
public static bool load(ref SolutionOrganizer set, bool draw, string name, List<Directories> hierarchie = null, bool use_install_folder = false)
Marco Zimmer
committed
{
hierarchie ??= new List<Directories>();
hierarchie.AddRange(hierVal.AsEnumerable());
string path = CreatePathToFile(out bool loadable, name + endingVal, "JSON", hierarchie, use_install_folder);
Marco Zimmer
committed
hierarchie.RemoveRange(hierarchie.Count - hierVal.Count, hierVal.Count);
Marco Zimmer
committed
if (!loadable)
return false;
Marco Zimmer
committed
SolutionOrganizer JsonTmp = JSONManager.ReadFromJsonFile <SolutionOrganizer> (path);
set = ReInitializeFactOrganizer<SolutionOrganizer>(JsonTmp, draw, out Dictionary<string, string> old_to_new);
Marco Zimmer
committed
set.path = path;
Marco Zimmer
committed
Marco Zimmer
committed
foreach (var element in JsonTmp.ValidationSet)
Marco Zimmer
committed
{
element.MasterIDs = new HashSet<string>(element.MasterIDs.Select(k => old_to_new[k]));
Marco Zimmer
committed
}
return true;
}
Marco Zimmer
committed
public new void delete()
{
Marco Zimmer
committed
if (System.IO.File.Exists(path))
System.IO.File.Delete(path);
Marco Zimmer
committed
}
/// @}