static PointProjectionSolver TryCycle(PointProjectionSolver solver, List <PPath> cycle) { var pr = new Projection(solver.Graph, solver.AllSegments, solver.SegmentFamilies, cycle[0].length, cycle[1].length); pr.Stages.Push(Projector.CreateInitialProjection(cycle, pr)); //Console.WriteLine(string.Join(" ||| ", cycle)); // Visualize(solver, pr, cycleCounter.ToString()); var res = TryHordEdges(solver, pr); if (res != null) { return(res); } var squashes = Projector.FindSquashPoint(pr); foreach (var sq in squashes) { var o = TrySquashPoint(solver, pr, sq); if (o != null) { return(o); } } return(null); }
static PointProjectionSolver TrySquashPoint(PointProjectionSolver solver, Projection pr, ProjectionStage stage) { pr.Stages.Push(stage); var res = TryHordEdges(solver, pr); if (res == null) { pr.Stages.Pop(); } return(res); }
public static bool EvaluateProjection(PointProjectionSolver solver, Projection pr) { if (!pr.IsCompleteProjection()) { return(false); } solver.ProjectionScheme = pr; solver.Projection = GenerateOutGraph(solver.ProjectionScheme, false); var solution = SolutionSpecBuilder.BuildSolutionByGraph(solver.Projection); return(solution.AreFacetsValid(pr.SideY * pr.SideX)); }
public static void Visualize(PointProjectionSolver solver, Projection p = null, string name = "") { if (p == null) { p = solver.ProjectionScheme; } var gr = GenerateOutGraph(p, true); var viz = new GraphVisualizer <PointProjectionSolver.ProjectedEdgeInfo, PointProjectionSolver.ProjectedNodeInfo>(); viz.GetX = z => z.Data.Projection.X; viz.GetY = z => z.Data.Projection.Y; // viz.NodeCaption = z => z.Data.Original.Data.Location.ToString(); viz.Window(500, gr, name); }
public static PointProjectionSolver CreateSolver(ProblemSpec spec) { // spec = spec.MoveToOrigin(); var solver = new PointProjectionSolver { spec = spec }; var r = Pathfinder.MakeSegmentsWithIntersections(spec.Segments); solver.vectors = r.Item2; solver.SegmentFamilies = r.Item1; solver.AllSegments = r.Item1.SelectMany(z => z.Segments).ToList(); solver.Graph = Pathfinder.BuildGraph(solver.AllSegments, solver.vectors); return(solver); }
static PointProjectionSolver TryHordEdges(PointProjectionSolver solver, Projection pr) { while (true) { // Visualize(solver, pr); if (EvaluateProjection(solver, pr)) { return(solver); } var hordEdgeStage = Projector.AddVeryGoodEdges(pr); if (hordEdgeStage != null) { pr.Stages.Push(hordEdgeStage); continue; } else { break; } } return(null); }
public static PointProjectionSolver Solve(PointProjectionSolver solver, Rational otherSide, double metricaBorder = 0, bool usePerimeterFinder = true) { IEnumerable <List <PPath> > cycles; if (usePerimeterFinder) { var pathLengths = new [] { 1, otherSide, 1, otherSide }; var wayFinder = new WayFinder(solver.Graph, pathLengths.Distinct().ToList()); cycles = new PerimeterFinder(wayFinder, pathLengths).Find(); } else { var originality = metricaBorder; var pathes = Pathfinder.FindAllPathes(solver.Graph, 1, originality); var ps1 = pathes.ToList(); var ps2 = otherSide == 1 ? ps1.ToList() : Pathfinder.FindAllPathes(solver.Graph, otherSide, originality).ToList(); cycles = Pathfinder.FindAllCycles(ps1, ps2); } //var cs = cycles.ToList(); cycleCounter = -1; foreach (var c in cycles) { cycleCounter++; var res = TryCycle(solver, c); if (res != null) { return(res); } } return(null); }