public static IEnumerable <R> Start <R>(this IPendulum <R> p)
 {
     while (!p.Ranking.IsOptimized())
     {
         yield return(p.GetExec().Execute());
     }
 }
        public static R Execute <R>(this IPendulum <R> p)
        {
            p.Modifications.MapModifications();

            var optimized = p.Ranking.IsOptimized();
            var constrain = p.Constrains.TestConstrains();

            var rng    = new Random();
            var mods   = p.Modifications.GetModificationCount();
            var modNum = 0;

            p.Ranking.Reset();

            while (p.Ranking.HasStepsLeft())
            {
                // Bruteforce-like Strategy
                p.Modifications.PerformModification(modNum);

                p.GetExec().Result = p.GetExec().Execute();
                p.Ranking.Evaluate();

                optimized = p.Ranking.IsOptimized();
                constrain = p.Constrains.TestConstrains();

                if (optimized && constrain)
                {
                    break;
                }

                if (!constrain)
                {
                    modNum = rng.Next(0, mods);
                }
            }

            p.OnDoneActions.ForEach(x => x());

            return(default(R));
        }