protected IEnumerator <T> optimize_trajectory(NextTrajectory next, TrajectoryPredicate is_better, TrajectoryPredicate not_found)
        {
            T   current = null;
            T   best    = null;
            var maxI    = GLB.TRJ.MaxIterations;
            var frameI  = GLB.TRJ.PerFrameIterations;

            do
            {
//				if(best != null && !string.IsNullOrEmpty(TCAGui.StatusMessage)) //debug
//				{ yield return null; continue; }
                current = next(current, best);
                if (best == null || is_better(current, best))
                {
                    best = current;
                }
                frameI--; maxI--;
                if (frameI <= 0)
                {
//					clear_nodes(); //debug
//					add_node(current.ManeuverDeltaV, current.StartUT);//debug
//					var lnd = current as LandingTrajectory;//debug
//					if(lnd != null) add_node(lnd.BrakeDeltaV, lnd.BrakeStartUT);//debug
//					Status("Push to continue");//debug
                    yield return(null);

                    frameI = GLB.TRJ.PerFrameIterations;
                }
            } while(not_found(current, best) && maxI > 0);
//			Log("Best trajectory:\n{0}", best);//debug
//			clear_nodes();//debug
            yield return(best);
        }
 public virtual void Setup(NextTrajectory next, TrajectoryPredicate is_better, TrajectoryPredicate not_found)
 {
     Trajectory = null;
     optimizer  = optimize_trajectory(next, is_better, not_found);
 }