Loading isis/src/control/apps/cnetwinnow/cnetwinnow.cpp +0 −17 Original line number Diff line number Diff line Loading @@ -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++) { Loading isis/src/control/objs/ControlNet/ControlNet.cpp +108 −65 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <QPair> #include <QScopedPointer> #include <QSet> #include <QStringList> #include <QTime> #include <QVector> Loading Loading @@ -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; } Loading Loading @@ -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 * Loading isis/src/control/objs/ControlNet/ControlNet.h +14 −11 Original line number Diff line number Diff line Loading @@ -48,7 +48,6 @@ namespace Isis { class Camera; class ControlMeasure; class ControlPoint; class ControlCubeGraphNode; class Distance; class Progress; class Pvl; Loading Loading @@ -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 Loading @@ -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); Loading @@ -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, Loading Loading @@ -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; Loading @@ -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; Loading isis/src/control/objs/ControlNet/ControlNet.truth +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 *************** Loading Loading @@ -334,7 +341,7 @@ Read/Write of binary files OK. BRAVO CHARLIE DELTA DELTA [p0] --------- ALPHA [p0] ALPHA ----[p0]---- DELTA Testing getEdgeCount: 1 Loading isis/src/control/objs/ControlNet/unitTest.cpp +23 −9 Original line number Diff line number Diff line Loading @@ -5,9 +5,11 @@ #include <sstream> #include <ctime> #include <QHash> #include <QList> #include <QSet> #include <QString> #include <QStringList> #include <QVector> #include "ControlMeasure.h" Loading Loading @@ -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 Loading
isis/src/control/apps/cnetwinnow/cnetwinnow.cpp +0 −17 Original line number Diff line number Diff line Loading @@ -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++) { Loading
isis/src/control/objs/ControlNet/ControlNet.cpp +108 −65 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <QPair> #include <QScopedPointer> #include <QSet> #include <QStringList> #include <QTime> #include <QVector> Loading Loading @@ -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; } Loading Loading @@ -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 * Loading
isis/src/control/objs/ControlNet/ControlNet.h +14 −11 Original line number Diff line number Diff line Loading @@ -48,7 +48,6 @@ namespace Isis { class Camera; class ControlMeasure; class ControlPoint; class ControlCubeGraphNode; class Distance; class Progress; class Pvl; Loading Loading @@ -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 Loading @@ -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); Loading @@ -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, Loading Loading @@ -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; Loading @@ -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; Loading
isis/src/control/objs/ControlNet/ControlNet.truth +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 *************** Loading Loading @@ -334,7 +341,7 @@ Read/Write of binary files OK. BRAVO CHARLIE DELTA DELTA [p0] --------- ALPHA [p0] ALPHA ----[p0]---- DELTA Testing getEdgeCount: 1 Loading
isis/src/control/objs/ControlNet/unitTest.cpp +23 −9 Original line number Diff line number Diff line Loading @@ -5,9 +5,11 @@ #include <sstream> #include <ctime> #include <QHash> #include <QList> #include <QSet> #include <QString> #include <QStringList> #include <QVector> #include "ControlMeasure.h" Loading Loading @@ -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