Unverified Commit f908083e authored by Jesse Mapel's avatar Jesse Mapel Committed by GitHub
Browse files

Merge pull request #216 from jessemapel/cneteditor

Replaced cneteditor's usage of ControlCubeGraphNodes with serial numbers References #5434
parents b070a180 55c8863e
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
@@ -322,23 +322,6 @@ void IsisMain() {
    if (net.GetSerialConnections().size() > numInitialIslands) islandFlag = false; //test failed
    else islandFlag = true; //test passed

    //Check to see if the network has split
      //this simplifies to making sure that all cubes observing the ControlPoint that had some or
      //all of it's measures ignored are still connected
    /* //Travis Addair informed me that this method only checks 1 step conections
    // thus it was effectively only enforcing that the last tie between pairs
    // of images not be ingorned
    QList<ControlMeasure *> ptMeas = suspectMeasures[i]->Parent()->getMeasures();
    const ControlCubeGraphNode *node0 = net.getGraphNode(ptMeas[0]->GetCubeSerialNumber());
    islandFlag = true;  //assuming the best, and then verify
    for (int j=1; j<ptMeas.size(); j++) {
      //check each subsequent node for conection to the first
      if ( !node0->isConnected(net.getGraphNode(ptMeas[j]->GetCubeSerialNumber()))) {
        islandFlag = false; //test failed
        break;
      }
    }*/

    //again we will temporarily be setting the measure back to unignored
      //this will change when the expected ControlNet::isCriticalMeasure(...) method is written
    for (int j=0;j<measGroup.size();j++) {
+108 −65
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <QPair>
#include <QScopedPointer>
#include <QSet>
#include <QStringList>
#include <QTime>
#include <QVector>

@@ -411,41 +412,57 @@ namespace Isis {
  QString ControlNet::GraphToString() const {
    QString graphString;

    typedef boost::graph_traits<Network>::edge_iterator edge_iter;
    edge_iter ei, ei_end;
    QStringList images = GetCubeSerials();
    images.sort();

    for (tie(ei, ei_end) = edges(m_controlGraph); ei != ei_end; ++ei) {
      ImageVertex sourceImage = source(*ei, m_controlGraph);
      ImageVertex targetImage = target(*ei, m_controlGraph);
      if (sourceImage != targetImage) {
        graphString.append(m_controlGraph[sourceImage].serial);
        graphString.append( " [" );
        QList<ControlPoint*> sourcePoints = m_controlGraph[sourceImage].measures.keys(); 
        for (int i=0; i < sourcePoints.size(); i++) {
          if (i>0) {
            graphString.append(", "); 
    QHash<QString, QStringList> imagePointIds;

    foreach(QString imageSerial, images) {
      QList<ControlPoint *> imagePoints = m_controlGraph[m_vertexMap[imageSerial]].measures.keys();
      QStringList pointIds;
      foreach(ControlPoint *point, imagePoints) {
        pointIds.append(point->GetId());
      }
      pointIds.sort();
      imagePointIds.insert(imageSerial, pointIds);
    }
          graphString.append(sourcePoints[i]->GetId()); 

    foreach(QString imageSerial, images) {
      QStringList adjacentImages = getAdjacentImages(imageSerial);
      adjacentImages.sort();
      foreach(QString adjacentSerial, adjacentImages) {
        if (QString::compare(adjacentSerial, imageSerial) < 0) {
          continue;
        }
       // graphString.append(QString::number(m_controlGraph[sourceImage].measures.size())); 
        graphString.append("] --------- ");
        graphString.append(m_controlGraph[targetImage].serial);
        graphString.append(" [");

        QList<ControlPoint*> targetPoints = m_controlGraph[targetImage].measures.keys(); 
        for (int i=0; i < targetPoints.size(); i++) {
          if (i>0) {
            graphString.append(", "); 
        QStringList commonPoints;
        QList<QString>::const_iterator imageIt = imagePointIds[imageSerial].cbegin();
        QList<QString>::const_iterator adjacentIt = imagePointIds[adjacentSerial].cbegin();
        while (imageIt != imagePointIds[imageSerial].cend() &&
               adjacentIt != imagePointIds[adjacentSerial].cend()) {
          int stringDiff = QString::compare(*imageIt, *adjacentIt);
          if (stringDiff < 0) {
            imageIt++;
          }
          else if(stringDiff == 0) {
            commonPoints.append(*imageIt);
            imageIt++;
            adjacentIt++;
          }
          else {
            adjacentIt++;
          }
          graphString.append(targetPoints[i]->GetId()); 
        }

//        graphString.append(QString::number(m_controlGraph[targetImage].measures.size()));  
        graphString.append("]");// edge strength: [");
    //    graphString.append(QString::number(m_controlGraph[*ei].strength));
        graphString.append(imageSerial);
        graphString.append(" ----[");
        graphString.append(commonPoints.join(","));
        graphString.append("]---- ");
        graphString.append(adjacentSerial);
        graphString.append("\n");
      }
    }

    return graphString;
   }

@@ -860,6 +877,32 @@ namespace Isis {
  }


  /**
   * Get all images connected to a given image by common control points.
   *
   * @param serialNumber the serial number of the image to find images adjacent to.
   *
   * @returns @b QList<QString> The serial numbers of all adjacent images.
   */
  QList< QString > ControlNet::getAdjacentImages(QString serialNumber) const {
    if (!ValidateSerialNumber(serialNumber)) {
      QString msg = "Cube Serial Number [" + serialNumber + "] not found in "
          "the network";
      throw IException(IException::Programmer, msg, _FILEINFO_);
    }

    QList< QString > adjacentSerials;

    AdjacencyIterator adjIt, adjEnd;
    boost::tie(adjIt, adjEnd) = boost::adjacent_vertices(m_vertexMap[serialNumber], m_controlGraph);
    for( ; adjIt != adjEnd; adjIt++) {
      adjacentSerials.append(m_controlGraph[*adjIt].serial);
    }

    return adjacentSerials;
  }


  /**
   * Get all the measures pertaining to a given cube serial number
   *
+14 −11
Original line number Diff line number Diff line
@@ -48,7 +48,6 @@ namespace Isis {
  class Camera;
  class ControlMeasure;
  class ControlPoint;
  class ControlCubeGraphNode;
  class Distance;
  class Progress;
  class Pvl;
@@ -230,6 +229,9 @@ namespace Isis {
   *                           group to set radii values to those ingested from the versioner
   *                           if they exist. Otherwise, we call SetTarget with the targetname.
   *                           Fixes #5361.
   *   @history 2018-06-06 Jesse Mapel - Added a method to get all adjacent images to ControlNet.
   *                           Previously this functionality was only available through the
   *                           ControlCubeGraphNode class. References #5434.
   */
  class ControlNet : public QObject {
      Q_OBJECT
@@ -239,10 +241,6 @@ namespace Isis {

    public:

      QList< ControlCubeGraphNode * > GetCubeGraphNodes() { 
        QList<ControlCubeGraphNode *> lst;
        return lst;} ; // TEMPORARY DELETE

      ControlNet();
      ControlNet(const ControlNet &other);
      ControlNet(const QString &filename, Progress *progress = 0);
@@ -265,6 +263,7 @@ namespace Isis {
      QString GraphToString() const;
      QList< QList< QString > > GetSerialConnections() const;
      int getEdgeCount() const;
      QList< QString > getAdjacentImages(QString serialNumber) const;
      QList< ControlMeasure * > GetMeasuresInCube(QString serialNumber);
      QList< ControlMeasure * > GetValidMeasuresInCube(QString serialNumber);
      QList< ControlMeasure * > sortedMeasureList(double(ControlMeasure::*statFunc)() const,
@@ -374,8 +373,6 @@ namespace Isis {
      //! hash ControlPoints by ControlPoint Id
      QHash< QString, ControlPoint * > * points;

      //! hash ControlCubeGraphNodes by CubeSerialNumber

      // structs and typedefs for the boost graph
      struct Image {
        QString serial;
@@ -386,12 +383,18 @@ namespace Isis {
        int strength = 0;
      };

      typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, Image, Connection> Network;
      typedef boost::adjacency_list<boost::setS,
                                    boost::listS,
                                    boost::undirectedS,
                                    Image,
                                    Connection> Network;
      typedef Network::vertex_descriptor ImageVertex;
      typedef Network::edge_descriptor ImageConnection;
      typedef std::map<ImageVertex, size_t> VertexIndexMap;
      typedef boost::associative_property_map<VertexIndexMap> VertexIndexMapAdaptor;
      typedef Network::out_edge_iterator ConnectionIterator;
      typedef boost::graph_traits<Network>::adjacency_iterator AdjacencyIterator;

      QHash<QString, ImageVertex> m_vertexMap; //!< The SN -> vertex hash for the boost graph
      Network m_controlGraph; //!< The boost graph
      QStringList *pointIds;
+28 −21
Original line number Diff line number Diff line
UnitTest for ControlNet ....

******* test cube connection graph ************
ALPHA [p0] --------- BRAVO [p0]
ALPHA ----[p0]---- BRAVO

ALPHA [p0] --------- BRAVO [p0]
ALPHA ----[p0]---- BRAVO

ALPHA [p0] --------- BRAVO [p0]
ALPHA ----[p0]---- BRAVO

testing measure addition to point already in network...
ALPHA [p1, p0] --------- BRAVO [p0]
ALPHA ----[p0]---- BRAVO

ALPHA [p1, p0] --------- BRAVO [p1, p0]
ALPHA ----[p0,p1]---- BRAVO

ALPHA [p1, p0] --------- BRAVO [p1, p0]
CHARLIE [p1] --------- ALPHA [p1, p0]
CHARLIE [p1] --------- BRAVO [p1, p0]
ALPHA ----[p0,p1]---- BRAVO
ALPHA ----[p1]---- CHARLIE
BRAVO ----[p1]---- CHARLIE

testing setting point to ignored.......................
ALPHA [p1, p0] --------- BRAVO [p1, p0]
ALPHA ----[p0,p1]---- BRAVO

ALPHA [p1, p0] --------- BRAVO [p1, p0]
ALPHA [p1, p0] --------- CHARLIE [p1]
CHARLIE [p1] --------- BRAVO [p1, p0]
ALPHA ----[p0,p1]---- BRAVO
ALPHA ----[p1]---- CHARLIE
BRAVO ----[p1]---- CHARLIE

testing measure deletion & addition....................
ALPHA [p1, p0] --------- BRAVO [p1]
ALPHA [p1, p0] --------- CHARLIE [p1]
CHARLIE [p1] --------- BRAVO [p1]
ALPHA ----[p1]---- BRAVO
ALPHA ----[p1]---- CHARLIE
BRAVO ----[p1]---- CHARLIE

ALPHA [p1, p0] --------- BRAVO [p1]
ALPHA [p1, p0] --------- CHARLIE [p1]
CHARLIE [p1] --------- BRAVO [p1]
DELTA [p0] --------- ALPHA [p1, p0]
ALPHA ----[p1]---- BRAVO
ALPHA ----[p1]---- CHARLIE
ALPHA ----[p0]---- DELTA
BRAVO ----[p1]---- CHARLIE

testing FindClosest....................
Closest Point ID: p1

testing getAdjacentImages....................
Adjacent Images: 
  BRAVO
  CHARLIE
  DELTA

testing point deletion.................................
DELTA [p0] --------- ALPHA [p0]
ALPHA ----[p0]---- DELTA

******* Done testing cube graph ***************

@@ -334,7 +341,7 @@ Read/Write of binary files OK.
    BRAVO
    CHARLIE
    DELTA
DELTA [p0] --------- ALPHA [p0]
ALPHA ----[p0]---- DELTA


Testing getEdgeCount: 1
+23 −9
Original line number Diff line number Diff line
@@ -5,9 +5,11 @@
#include <sstream>
#include <ctime>

#include <QHash>
#include <QList>
#include <QSet>
#include <QString>
#include <QStringList>
#include <QVector>

#include "ControlMeasure.h"
@@ -223,7 +225,19 @@ int main() {
  p0m0->SetCoordinate(1.0, 2.0);

  ControlPoint *closestPoint = net.FindClosest("ALPHA", 1.0,1.0);
  cout << "Closest Point ID: " << closestPoint->GetId() << endl; 
  cout << "Closest Point ID: " << closestPoint->GetId() << endl << endl;

  // test getAdjacentImages()
  cout << "testing getAdjacentImages....................\n";

  QStringList adjacentSerials = net.getAdjacentImages("ALPHA");
  // We cannot gaurantee order on this list, so sort it for testing purposes
  adjacentSerials.sort();
  cout << "Adjacent Images: " << endl;
  foreach(QString serial, adjacentSerials) {
    cout << "  " << serial << endl;
  }
  cout << endl;

  // test point deletion
  cout << "testing point deletion.................................\n";
Loading