private static bool ConstraintCheck(ShapeNode shapeNode, GoalNode goalNode, object constraint, out object output) { output = null; var shape1 = shapeNode.ShapeSymbol; var goal = goalNode.Goal as EqGoal; Debug.Assert(shape1 != null); Debug.Assert(goal != null); var label = constraint as string; if (label != null) { var pt1 = shape1 as PointSymbol; if (pt1 != null) { if (LineAcronym.EqualGeneralFormLabels(label)) { var ls = LineBinaryRelation.Unify(pt1, goal); if (ls != null) { ls.OutputType = LineType.GeneralForm; output = ls; return(true); } } } } //TODO return(false); }
public void Test_CreateLine_2() { var pt1 = new Point(1.0, 2.0); var pt2 = new Point(1.0, 2.0); var ptSym1 = new PointSymbol(pt1); var ptSym2 = new PointSymbol(pt2); var lineSym = LineBinaryRelation.Unify(ptSym1, ptSym2); Assert.Null(lineSym); }
private static bool ConstraintCheck(GoalNode goalNode1, GoalNode goalNode2, object constraint, out object output) { Debug.Assert(constraint != null); var st = constraint as ShapeType?; var goal1 = goalNode1.Goal as EqGoal; var goal2 = goalNode2.Goal as EqGoal; Debug.Assert(goal1 != null); Debug.Assert(goal2 != null); output = null; if (st != null) { switch (st.Value) { case ShapeType.Line: output = LineBinaryRelation.Unify(goal1, goal2); break; } return(output != null); } var label = constraint as string; if (label != null) { //TODO if (LineAcronym.EqualGeneralFormLabels(label)) { output = LineBinaryRelation.Unify(goal1, goal2); var ls = output as LineSymbol; if (ls != null) { ls.OutputType = LineType.GeneralForm; TraceInstructionalDesign.FromLineSlopeIntercetpToLineGeneralForm(ls); return(true); } return(false); } if (LineAcronym.EqualSlopeInterceptFormLabels(label)) { output = LineBinaryRelation.Unify(goal1, goal2); var ls = output as LineSymbol; if (ls != null) { ls.OutputType = LineType.SlopeIntercept; return(true); } return(false); } } return(false); }
public void Test_CreateLine_TwoGoal_1() { var m = new Var('m'); var k = new Var('k'); var goal1 = new EqGoal(m, 2.0); var goal2 = new EqGoal(k, 1.0); var lineSym = LineBinaryRelation.Unify(goal1, goal2); Assert.NotNull(lineSym); Assert.True(lineSym.SymSlope.Equals("2")); Assert.True(lineSym.SymIntercept.Equals("1")); }
public void Test_CreateLine_4() { var pt1 = new Point(2.0, 1.0); var pt2 = new Point(2.0, 2.0); var ptSym1 = new PointSymbol(pt1); var ptSym2 = new PointSymbol(pt2); var lineSym = LineBinaryRelation.Unify(ptSym1, ptSym2) as LineSymbol; Assert.NotNull(lineSym); var line = lineSym.Shape as Line; Assert.NotNull(line); Assert.True(line.A.Equals(1.0)); Assert.True(line.B.Equals(0.0)); Assert.True(line.C.Equals(-2.0)); }
public static void FromPointsToMidPoint(PointSymbol ps1, PointSymbol ps2, PointSymbol midPoint) { //1. plot the ps1, ps2 and the line //2. generate x coordinate //3. generate y coordinate //4. generate point (x,y) string strategy; var ts00 = new TraceStep(null, ps1, null, PlottingRule.PlottingStrategy, PlottingRule.Plot(ps1)); var ts01 = new TraceStep(null, ps2, null, PlottingRule.PlottingStrategy, PlottingRule.Plot(ps2)); var ls = LineBinaryRelation.Unify(ps1, ps2) as LineSymbol; var ts02 = new TraceStep(null, ls, null, PlottingRule.PlottingStrategy, PlottingRule.Plot(ls)); strategy = "Plot the given two points and the connected line."; midPoint._innerLoop.Add(ts00); midPoint._innerLoop.Add(ts01); midPoint._innerLoop.Add(ts02); midPoint.GenerateATrace(strategy); //////////////////////////////////////////////// var xCoord = new Var("x"); var pt1 = ps1.Shape as Point; Debug.Assert(pt1 != null); var pt2 = ps2.Shape as Point; Debug.Assert(pt2 != null); var term1 = new Term(Expression.Add, new List <object>() { pt1.XCoordinate, pt2.XCoordinate }); var term2 = new Term(Expression.Divide, new List <object>() { term1, 2 }); var eq = new Equation(xCoord, term2); ///////////////////////////////////////////////// object obj; bool result = eq.IsEqGoal(out obj); EqGoal goal1 = null; if (result) { goal1 = obj as EqGoal; Debug.Assert(goal1 != null); Debug.Assert(goal1.Traces.Count == 1); var currentTrace = goal1.Traces.ToList()[0]; strategy = "Generate x coordinate of midpoint."; var newTrace = new Tuple <object, object>(strategy, currentTrace.Item2); midPoint.Traces.Add(newTrace); } ////////////////////////////////////////////////// var yCoord = new Var("y"); term1 = new Term(Expression.Add, new List <object>() { pt1.YCoordinate, pt2.YCoordinate }); term2 = new Term(Expression.Divide, new List <object>() { term1, 2 }); var eq1 = new Equation(yCoord, term2); result = eq1.IsEqGoal(out obj); EqGoal goal2 = null; if (result) { goal2 = obj as EqGoal; Debug.Assert(goal2 != null); Debug.Assert(goal2.Traces.Count == 1); var currentTrace1 = goal2.Traces.ToList()[0]; strategy = "Generate y coordinate of midpoint."; var newTrace = new Tuple <object, object>(strategy, currentTrace1.Item2); midPoint.Traces.Add(newTrace); } ////////////////////////////////////////////////////// var ps = new Point(xCoord, yCoord); var psym = new PointSymbol(ps); var mid = midPoint.Shape as Point; Debug.Assert(mid != null); var ps_inter1 = new Point(mid.XCoordinate, yCoord); var psym_inter1 = new PointSymbol(ps_inter1); var metaRule = "Consider substitute generate x coordinate into the point form."; var appliedRule = SubstitutionRule.ApplySubstitute(goal1, psym); var ts1 = new TraceStep(psym, psym_inter1, null, metaRule, appliedRule); metaRule = "Consider substitute generate y coordinate into the point form."; appliedRule = SubstitutionRule.ApplySubstitute(goal2, psym_inter1); var ts2 = new TraceStep(psym_inter1, midPoint, null, metaRule, appliedRule); strategy = "Generate point (x,y) by subsitute generated x and y."; midPoint._innerLoop.Add(ts1); midPoint._innerLoop.Add(ts2); midPoint.GenerateATrace(strategy); }
private static bool ConstraintCheck(PointSymbol pt1, PointSymbol pt2, string constraint1, ShapeType constraint2, out object output) { output = null; Debug.Assert(constraint1 != null); var label = constraint1 as string; char[] charr = label.ToCharArray(); if (charr.Length != 2) { return(false); } string str1 = label.ToCharArray()[0].ToString(CultureInfo.InvariantCulture); string str2 = label.ToCharArray()[1].ToString(CultureInfo.InvariantCulture); string label1 = pt1.Shape.Label; string label2 = pt2.Shape.Label; if (label1 == null || label2 == null) { if (constraint2 == ShapeType.LineSegment) { if (constraint1 == LineSegmentAcronym.GeneralForm) { output = LineSegBinaryRelation.Unify(pt1, pt2); if (output != null) { return(true); } output = LineSegmentGenerationRule.IdentityPoints; return(false); } if (constraint1 == LineAcronym.GeneralForm1) { output = LineBinaryRelation.Unify(pt1, pt2); if (output != null) { return(true); } output = LineGenerationRule.IdentityPoints; return(false); } } } bool condition1 = label1.Equals(str1) && label2.Equals(str2); bool condition2 = label1.Equals(str2) && label2.Equals(str1); if (condition1 || condition2) { if (constraint2 == ShapeType.Line) { output = LineBinaryRelation.Unify(pt1, pt2); if (output != null) { return(true); } output = LineGenerationRule.IdentityPoints; return(false); } if (constraint2 == ShapeType.LineSegment) { output = LineSegBinaryRelation.Unify(pt1, pt2); if (output != null) { return(true); } output = LineSegmentGenerationRule.IdentityPoints; return(false); } } return(false); }
private static bool ConstraintCheck(PointSymbol pt1, PointSymbol pt2, object constraint, out object output) { output = null; Debug.Assert(constraint != null); var shapeType = constraint as ShapeType?; if (shapeType != null) { #region ShapeType Constraint Solving if (shapeType == ShapeType.Line) { output = LineBinaryRelation.Unify(pt1, pt2); if (output != null) { return(true); } output = LineGenerationRule.IdentityPoints; return(false); } if (shapeType == ShapeType.LineSegment) { output = LineSegBinaryRelation.Unify(pt1, pt2); if (output != null) { return(true); } output = LineSegmentGenerationRule.IdentityPoints; return(false); } return(false); #endregion } var label = constraint as string; if (label != null) { #region Label Constraint Solving if (PointAcronym.MidPoint.Equals(label)) { //Point output = PointBinaryRelation.Unify(pt1, pt2); var ps = output as PointSymbol; if (ps != null) { return(true); } return(false); } #region Line Inference //Case 2 if (LineAcronym.EqualGeneralFormLabels(label)) { output = LineBinaryRelation.Unify(pt1, pt2); var ls = output as LineSymbol; if (ls != null) { ls.OutputType = LineType.GeneralForm; return(true); } return(false); } if (LineAcronym.EqualSlopeLabels(label)) { output = LineBinaryRelation.Unify(pt1, pt2); if (output == null) { return(false); } var lss = output as LineSymbol; //TraceInstructionalDesign.FromPointsToLine(lss); var output1 = lss.Unify(label); output = output1; return(true); } if (LineAcronym.EqualInterceptLabels(label)) { output = LineBinaryRelation.Unify(pt1, pt2); if (output == null) { return(false); } var lss = output as LineSymbol; //TraceInstructionalDesign.FromPointsToLine(lss); var output1 = lss.Unify(label); output = output1; return(true); } if (LineAcronym.EqualSlopeInterceptFormLabels(label)) { output = LineBinaryRelation.Unify(pt1, pt2); var ls = output as LineSymbol; if (ls != null) { ls.OutputType = LineType.SlopeIntercept; return(true); } return(false); } #endregion #region Line Segment Inference if (LineSegmentAcronym.EqualDistanceLabel(label)) { output = LineSegBinaryRelation.Unify(pt1, pt2); if (output == null) { return(false); } var lss = output as LineSegmentSymbol; var output1 = lss.Unify(label); output = output1; #region Embed Line Segment(obsolete) /* * Debug.Assert(lss != null); * if (lss.CachedSymbols.Count == 0) * { * output = output1; * var lst = new List<object>() * { * output, output1 * }; * * output = lst; * } * else * { * var goalLst = output1 as List<EqGoal>; * Debug.Assert(goalLst != null); * var lst = new List<object>(); * for (int i = 0; i < lss.CachedSymbols.Count; i++) * { * var cachedSS = lss.CachedSymbols.ToList()[i]; * lst.Add(cachedSS); * lst.Add(goalLst[i]); * } * output = lst; * }*/ #endregion return(true); } #endregion #region ambiguious inference //Case 1 char[] charr = label.ToCharArray(); if (charr.Length != 2) { return(false); } string str1 = label.ToCharArray()[0].ToString(CultureInfo.InvariantCulture); string str2 = label.ToCharArray()[1].ToString(CultureInfo.InvariantCulture); string label1 = pt1.Shape.Label; string label2 = pt2.Shape.Label; if (label1 == null || label2 == null) { return(false); } bool condition1 = label1.Equals(str1) && label2.Equals(str2); bool condition2 = label1.Equals(str2) && label2.Equals(str1); if (condition1 || condition2) { var supportTypes = new List <ShapeType> { ShapeType.Line, ShapeType.LineSegment }; output = supportTypes; return(false); } #endregion #endregion } var eqGoal = constraint as EqGoal; if (eqGoal != null) { var goalLabel = eqGoal.Lhs.ToString(); #region Line Segment Inference if (LineSegmentAcronym.EqualDistanceLabel(goalLabel)) { output = LineSegBinaryRelation.Unify(pt1, pt2); if (output == null) { return(false); } var lss = output as LineSegmentSymbol; //TraceInstructionalDesign.FromPointsToLineSegment(lss); output = lss.Unify(eqGoal); if (output == null) { return(false); } return(true); } if (LineAcronym.EqualSlopeLabels(goalLabel)) { output = LineBinaryRelation.Unify(pt1, pt2, eqGoal); if (output == null) { return(false); } return(true); } #endregion } return(false); }