public synchronized Term getBlobs() {
   Term result = PrologEmptyList.instance;
   for (int n = blobRectangles.length - 1; n >= 0; n--) {
     Term prologIdentifier = new PrologInteger(blobIdentifiers[n]);
     int[] rectangle = blobRectangles[n];
     Term prologX = new PrologInteger(StrictMath.round((rectangle[0] + rectangle[1]) / 2));
     Term prologY = new PrologInteger(StrictMath.round((rectangle[2] + rectangle[3]) / 2));
     Term prologWidth = new PrologInteger(rectangle[1] - rectangle[0]);
     Term prologHeight = new PrologInteger(rectangle[3] - rectangle[2]);
     Term prologBlob =
         new PrologSet(
             -SymbolCodes.symbolCode_E_identifier,
             prologIdentifier,
             new PrologSet(
                 -SymbolCodes.symbolCode_E_x,
                 prologX,
                 new PrologSet(
                     -SymbolCodes.symbolCode_E_y,
                     prologY,
                     new PrologSet(
                         -SymbolCodes.symbolCode_E_width,
                         prologWidth,
                         new PrologSet(
                             -SymbolCodes.symbolCode_E_height,
                             prologHeight,
                             PrologEmptySet.instance)))));
     result = new PrologList(prologBlob, result);
   }
   ;
   return result;
 }
 public synchronized Term getConnectedGraphs() {
   ConnectedGraph[] graphs = formAndGetConnectedGraphs();
   Term list1 = PrologEmptyList.instance;
   for (int n = graphs.length - 1; n >= 0; n--) {
     ConnectedGraph graph = graphs[n];
     ArrayList<ConnectedSegment> connectedSegments = graph.connectedSegments;
     int numberOfSegments = connectedSegments.size();
     if (numberOfSegments <= 0) {
       continue;
     }
     ;
     Term list2 = PrologEmptyList.instance;
     for (int k = numberOfSegments - 1; k >= 0; k--) {
       ConnectedSegment connectedSegment = connectedSegments.get(k);
       int connectedSegmentNumber = connectedSegments.indexOf(connectedSegment);
       TrackSegment trackSegment = connectedSegment.trackSegment;
       Term prologOriginEdges =
           collectOriginEdges(connectedSegment, connectedSegmentNumber, connectedSegments);
       Term prologBrachEdges =
           collectBranchEdges(connectedSegment, connectedSegmentNumber, connectedSegments);
       Term prologIdentifier = new PrologInteger(trackSegment.owner);
       long beginningTime = trackSegment.beginningTime;
       int[][] rectangles = trackSegment.rectangles;
       int[] firstRectangle = rectangles[0];
       long frameNumber1 = beginningTime + firstRectangle[0];
       long x1 = StrictMath.round((firstRectangle[1] + firstRectangle[2]) / 2.0);
       long y1 = StrictMath.round((firstRectangle[3] + firstRectangle[4]) / 2.0);
       int[] lastRectangle = rectangles[rectangles.length - 1];
       long frameNumber2 = beginningTime + lastRectangle[0];
       long x2 = StrictMath.round((lastRectangle[1] + lastRectangle[2]) / 2.0);
       long y2 = StrictMath.round((lastRectangle[3] + lastRectangle[4]) / 2.0);
       Term prologSegment =
           assembleTrackSegment(frameNumber1, x1, y1, frameNumber2, x2, y2, trackSegment);
       Term prologEdge =
           new PrologSet(
               -SymbolCodes.symbolCode_E_inputs,
               prologOriginEdges,
               new PrologSet(
                   -SymbolCodes.symbolCode_E_outputs,
                   prologBrachEdges,
                   new PrologSet(
                       -SymbolCodes.symbolCode_E_identifier, prologIdentifier, prologSegment)));
       list2 = new PrologList(prologEdge, list2);
     }
     ;
     list1 = new PrologList(list2, list1);
   }
   ;
   return list1;
 }
 public synchronized Term getTracks() {
   Set<BigInteger> trackIdentifiers = tracks.keySet();
   Iterator<BigInteger> trackIdentifiersIterator = trackIdentifiers.iterator();
   Term list1 = PrologEmptyList.instance;
   while (trackIdentifiersIterator.hasNext()) {
     BigInteger blobIdentifier = trackIdentifiersIterator.next();
     StableTrack track = tracks.get(blobIdentifier);
     Term prologIdentifier = new PrologInteger(blobIdentifier);
     ArrayList<TrackSegment> segmentList = track.getTrackSegments();
     ListIterator<TrackSegment> segmentListIterator = segmentList.listIterator(segmentList.size());
     Term list2 = PrologEmptyList.instance;
     while (segmentListIterator.hasPrevious()) {
       TrackSegment segment = segmentListIterator.previous();
       int[][] rectangles = segment.rectangles;
       if (rectangles.length <= 0) {
         continue;
       }
       ;
       long beginningTime = segment.beginningTime;
       int[] firstRectangle = rectangles[0];
       long frameNumber1 = beginningTime + firstRectangle[0];
       long x1 = StrictMath.round((firstRectangle[1] + firstRectangle[2]) / 2.0);
       long y1 = StrictMath.round((firstRectangle[3] + firstRectangle[4]) / 2.0);
       int[] lastRectangle = rectangles[rectangles.length - 1];
       long frameNumber2 = beginningTime + lastRectangle[0];
       long x2 = StrictMath.round((lastRectangle[1] + lastRectangle[2]) / 2.0);
       long y2 = StrictMath.round((lastRectangle[3] + lastRectangle[4]) / 2.0);
       Term prologSegment =
           assembleTrackSegment(frameNumber1, x1, y1, frameNumber2, x2, y2, segment);
       list2 = new PrologList(prologSegment, list2);
     }
     ;
     Term prologTrack =
         new PrologSet(
             -SymbolCodes.symbolCode_E_identifier,
             prologIdentifier,
             new PrologSet(-SymbolCodes.symbolCode_E_segments, list2, PrologEmptySet.instance));
     list1 = new PrologList(prologTrack, list1);
   }
   ;
   return list1;
 }
 protected Term formTrackOfBlob(TrackSegment segment) {
   long beginningTime = segment.beginningTime;
   int[][] rectangles = segment.rectangles;
   double[] windowedR2ReferentValues = segment.getWindowedR2ReferentValues();
   Term list3 = PrologEmptyList.instance;
   for (int n = rectangles.length - 1; n >= 0; n--) {
     int[] currentRectangle = rectangles[n];
     long currentForegroundArea = segment.foregroundAreaValues[n];
     double currentCharacteristicLength = segment.characteristicLengthValues[n];
     long currentContourLength = segment.contourLengthValues[n];
     double currentR2 = windowedR2ReferentValues[n];
     double currentVelocity = segment.velocityValues[n];
     Term prologFrameN = new PrologInteger(beginningTime + currentRectangle[0]);
     Term prologXn =
         new PrologInteger(StrictMath.round((currentRectangle[1] + currentRectangle[2]) / 2.0));
     Term prologYn =
         new PrologInteger(StrictMath.round((currentRectangle[3] + currentRectangle[4]) / 2.0));
     Term prologWidthN = new PrologInteger(currentRectangle[2] - currentRectangle[1]);
     Term prologHeightN = new PrologInteger(currentRectangle[4] - currentRectangle[3]);
     Term prologForegroundAreaN = new PrologInteger(currentForegroundArea);
     Term prologCharacteristicLengthN = new PrologReal(currentCharacteristicLength);
     Term prologContourLengthN = new PrologInteger(currentContourLength);
     Term prologR2N = new PrologReal(currentR2);
     Term prologVelocityN = new PrologReal(currentVelocity);
     Term prologRectangle =
         new PrologSet(
             -SymbolCodes.symbolCode_E_frame,
             prologFrameN,
             new PrologSet(
                 -SymbolCodes.symbolCode_E_x,
                 prologXn,
                 new PrologSet(
                     -SymbolCodes.symbolCode_E_y,
                     prologYn,
                     new PrologSet(
                         -SymbolCodes.symbolCode_E_width,
                         prologWidthN,
                         new PrologSet(
                             -SymbolCodes.symbolCode_E_height,
                             prologHeightN,
                             new PrologSet(
                                 -SymbolCodes.symbolCode_E_foreground_area,
                                 prologForegroundAreaN,
                                 new PrologSet(
                                     -SymbolCodes.symbolCode_E_characteristic_length,
                                     prologCharacteristicLengthN,
                                     new PrologSet(
                                         -SymbolCodes.symbolCode_E_contour_length,
                                         prologContourLengthN,
                                         new PrologSet(
                                             -SymbolCodes.symbolCode_E_r2,
                                             prologR2N,
                                             new PrologSet(
                                                 -SymbolCodes.symbolCode_E_velocity,
                                                 prologVelocityN,
                                                 PrologEmptySet.instance))))))))));
     list3 = new PrologList(prologRectangle, list3);
   }
   ;
   return list3;
 }