/// <summary> /// Enumerates all possible sequences of alternatives /// </summary> /// <param name="obs">optional exploration observer</param> /// <returns>a concatenation of all possible sequences of exploration alternatives</returns> public IEnumerable <Alternative> Enumerate(IDSEObserver obs) { var enums = _tasks.Select(t => t.Alternatives.GetEnumerator()).ToArray(); bool emptyAlts = false; foreach (var iter in enums) { if (!iter.MoveNext()) { emptyAlts = true; break; } } if (emptyAlts) { yield break; } long progress = 0; bool end = false; do { if (obs != null) { obs.OnBeginFlow(enums.Select(iter => iter.Current), progress); } for (int i = 0; i < enums.Length; i++) { if (obs != null) { obs.OnBeginTask(_tasks[i], enums[i].Current, progress++); } yield return(enums[i].Current); } end = true; foreach (var iter in enums) { if (iter.MoveNext()) { end = false; break; } else { iter.Reset(); iter.MoveNext(); } } } while (!end); if (obs != null) { obs.OnEndOfDSE(); } }
/// <summary> /// Performs a design-space exploration /// </summary> /// <param name="obs">optional exploration observer</param> public void Explore(IDSEObserver obs = null) { if (obs != null) { long spaceSize = Enumerate(null).LongCount(); obs.NotifySpaceSize(spaceSize); } foreach (var alt in Enumerate(obs)) { alt.StepAction(); } }
/// <summary> /// Performs a design-space exploration /// </summary> /// <param name="obs">optional exploration observer</param> public void Explore(IDSEObserver obs = null) { if (obs != null) { long spaceSize = Enumerate(null).LongCount(); obs.NotifySpaceSize(spaceSize); } foreach (var alt in Enumerate(obs)) alt.StepAction(); }
/// <summary> /// Enumerates all possible sequences of alternatives /// </summary> /// <param name="obs">optional exploration observer</param> /// <returns>a concatenation of all possible sequences of exploration alternatives</returns> public IEnumerable<Alternative> Enumerate(IDSEObserver obs) { var enums = _tasks.Select(t => t.Alternatives.GetEnumerator()).ToArray(); bool emptyAlts = false; foreach (var iter in enums) { if (!iter.MoveNext()) { emptyAlts = true; break; } } if (emptyAlts) yield break; long progress = 0; bool end = false; do { if (obs != null) obs.OnBeginFlow(enums.Select(iter => iter.Current), progress); for (int i = 0; i < enums.Length; i++) { if (obs != null) obs.OnBeginTask(_tasks[i], enums[i].Current, progress++); yield return enums[i].Current; } end = true; foreach (var iter in enums) { if (iter.MoveNext()) { end = false; break; } else { iter.Reset(); iter.MoveNext(); } } } while (!end); if (obs != null) obs.OnEndOfDSE(); }