/// <summary> /// Compute the probability that a given set of substrokes has the given type. /// </summary> /// <param name="substrokes"></param> /// <param name="type"></param> /// <param name="featureSketch"></param> /// <returns>a pair containing the recognition probability and the orientation</returns> private RecognitionResult computeRecognitionProbabilityForTextOrWire(SubstrokeCollection substrokes, ShapeType type, FeatureSketch featureSketch) { double probability = 0; double orientation = 0; PhantomShape shape = new PhantomShape(); shape.AddSubstrokes(substrokes); if (LogicDomain.IsWire(type)) { // the probability it is a wire is defined as // (# substrokes classified as wires) / (total # substrokes) int numSubstrokes = substrokes.Count; int numWireSubstrokes = 0; foreach (Substroke substroke in substrokes) { if (_classifications[substroke] == LogicDomain.WIRE_CLASS) { numWireSubstrokes++; } } probability = (double)numWireSubstrokes / numSubstrokes; return(new RecognitionResult(LogicDomain.WIRE, probability, orientation)); } else if (LogicDomain.IsText(type)) { // the probability it is text is defined as // (# substrokes classified as text) / (total # substrokes) int numSubstrokes = substrokes.Count; int numTextSubstrokes = 0; foreach (Substroke substroke in substrokes) { if (_classifications[substroke] == LogicDomain.TEXT_CLASS) { numTextSubstrokes++; } } probability = (double)numTextSubstrokes / numSubstrokes; return(new TextRecognitionResult(probability, _textRecognizer.read(shape))); } return(null); }
/// <summary> /// Checks whether the sketch is valid, and returns a bool indicating this. /// Adds any errors it comes across to the _parseErrors list. /// /// Looks for: /// * Basic consistency via sketch.CheckConsistency /// * Gates connected to only wires /// * Wires not connected to wires /// * Text connected to at most one wire /// </summary> /// <param name="sketch">The sketch to check the validity of</param> /// <returns>A bool, which is true if the sketch is valid</returns> private bool CheckSketch(Sketch.Sketch sketch) { bool valid = true; // Check basic sketch consistency, will (rightly) throw an exception if it finds something wrong. // Eventually we should not need this, for the sketch should always pass this, but it's a useful check for now. sketch.CheckConsistency(); foreach (Sketch.Shape shape in sketch.Shapes) { #region Gate Checks if (LogicDomain.IsGate(shape.Type)) { // Each gate should be connected to only wires foreach (Sketch.Shape connected in shape.ConnectedShapes) { if (!LogicDomain.IsWire(connected.Type)) { valid = false; _parseErrors.Add(new ParseError("Gate " + shape.Name + " is connected to something that is not a wire, " + connected.Name + "of type " + connected.Type.Name, "This gate is connected to something that is not a wire. Draw wires between them or group them together.", shape)); } } } #endregion #region Wire Checks else if (LogicDomain.IsWire(shape.Type)) { // Wires shouldn't be connected to other wires foreach (Sketch.Shape connected in shape.ConnectedShapes) { if (shape != connected && LogicDomain.IsWire(connected.Type)) { valid = false; _parseErrors.Add(new ParseError("Wire " + shape.Name + " is connected to another wire, " + connected.Name, "This wire is connected to another wire. Try grouping these wires together.", shape)); } } } #endregion #region Input/Output Checks else if (LogicDomain.IsText(shape.Type)) { // Text should only be connected to wires, if anything. foreach (Sketch.Shape wire in shape.ConnectedShapes) { if (!LogicDomain.IsWire(wire.Type)) { valid = false; _parseErrors.Add(new ParseError("Text " + shape.Name + " should only be connected to a wire, but is connected to a " + wire.Type.Name + ".", shape.Name + " should only be connected to a wire, but is connected to a " + wire.Type.Name + ".", shape)); } } } #endregion } return(valid); }