1dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// Ceres Solver - A fast non-linear least squares minimizer 2dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// Copyright 2010, 2011, 2012 Google Inc. All rights reserved. 3dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// http://code.google.com/p/ceres-solver/ 4dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// 5dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// Redistribution and use in source and binary forms, with or without 6dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// modification, are permitted provided that the following conditions are met: 7dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// 8dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// * Redistributions of source code must retain the above copyright notice, 9dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// this list of conditions and the following disclaimer. 10dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// * Redistributions in binary form must reproduce the above copyright notice, 11dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// this list of conditions and the following disclaimer in the documentation 12dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// and/or other materials provided with the distribution. 13dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// * Neither the name of Google Inc. nor the names of its contributors may be 14dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// used to endorse or promote products derived from this software without 15dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// specific prior written permission. 16dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// 17dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 21dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// POSSIBILITY OF SUCH DAMAGE. 28dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// 29dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com// Author: sameeragarwal@google.com (Sameer Agarwal) 30dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 31dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "ceres/graph_algorithms.h" 32dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 33dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include <algorithm> 34dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "gtest/gtest.h" 35dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "ceres/collections_port.h" 36dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "ceres/graph.h" 37dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "ceres/internal/port.h" 38dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "ceres/internal/scoped_ptr.h" 39dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 40dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comnamespace ceres { 41dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comnamespace internal { 42dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 43dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comTEST(IndependentSetOrdering, Chain) { 44dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Graph<int> graph; 45dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(0); 46dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(1); 47dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(2); 48dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(3); 49dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(4); 50dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 51dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 1); 52dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(1, 2); 53dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(2, 3); 54dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(3, 4); 55dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 56dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 0-1-2-3-4 57dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 0, 2, 4 should be in the independent set. 58dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com vector<int> ordering; 59dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int independent_set_size = IndependentSetOrdering(graph, &ordering); 60dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 61dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com sort(ordering.begin(), ordering.begin() + 3); 62dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com sort(ordering.begin() + 3, ordering.end()); 63dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 64dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(independent_set_size, 3); 65dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering.size(), 5); 66dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[0], 0); 67dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[1], 2); 68dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[2], 4); 69dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[3], 1); 70dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[4], 3); 71dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 72dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 73dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comTEST(IndependentSetOrdering, Star) { 74dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Graph<int> graph; 75dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(0); 76dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(1); 77dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(2); 78dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(3); 79dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(4); 80dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 81dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 1); 82dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 2); 83dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 3); 84dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 4); 85dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 86dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 1 87dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // | 88dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 4-0-2 89dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // | 90dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 3 91dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 1, 2, 3, 4 should be in the indepdendent set. 92dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com vector<int> ordering; 93dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int independent_set_size = IndependentSetOrdering(graph, &ordering); 94dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(independent_set_size, 4); 95dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering.size(), 5); 96dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[4], 0); 97dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com sort(ordering.begin(), ordering.begin() + 4); 98dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[0], 1); 99dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[1], 2); 100dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[2], 3); 101dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(ordering[3], 4); 102dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 103dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 104dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comTEST(Degree2MaximumSpanningForest, PreserveWeights) { 105dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Graph<int> graph; 106dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(0, 1.0); 107dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(1, 2.0); 108dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 1, 0.5); 109dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(1, 0, 0.5); 110dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 111dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com scoped_ptr<Graph<int> > forest(Degree2MaximumSpanningForest(graph)); 112dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 113dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const HashSet<int>& vertices = forest->vertices(); 114dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(vertices.size(), 2); 115dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(forest->VertexWeight(0), 1.0); 116dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(forest->VertexWeight(1), 2.0); 117dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(forest->Neighbors(0).size(), 1.0); 118dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(forest->EdgeWeight(0, 1), 0.5); 119dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 120dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 121dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comTEST(Degree2MaximumSpanningForest, StarGraph) { 122dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Graph<int> graph; 123dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(0); 124dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(1); 125dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(2); 126dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(3); 127dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(4); 128dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 129dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 1, 1.0); 130dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 2, 2.0); 131dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 3, 3.0); 132dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 4, 4.0); 133dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 134dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com scoped_ptr<Graph<int> > forest(Degree2MaximumSpanningForest(graph)); 135dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const HashSet<int>& vertices = forest->vertices(); 136dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(vertices.size(), 5); 137dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 138dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 139dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const HashSet<int>& neighbors = forest->Neighbors(0); 140dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(neighbors.size(), 2); 141dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_TRUE(neighbors.find(4) != neighbors.end()); 142dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_TRUE(neighbors.find(3) != neighbors.end()); 143dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 144dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 145dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 146dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const HashSet<int>& neighbors = forest->Neighbors(3); 147dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(neighbors.size(), 1); 148dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_TRUE(neighbors.find(0) != neighbors.end()); 149dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 150dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 151dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 152dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const HashSet<int>& neighbors = forest->Neighbors(4); 153dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(neighbors.size(), 1); 154dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_TRUE(neighbors.find(0) != neighbors.end()); 155dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 156dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 157dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 158dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const HashSet<int>& neighbors = forest->Neighbors(1); 159dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(neighbors.size(), 0); 160dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 161dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 162dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com { 163dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com const HashSet<int>& neighbors = forest->Neighbors(2); 164dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_EQ(neighbors.size(), 0); 165dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 166dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 167dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 168dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comTEST(VertexTotalOrdering, TotalOrdering) { 169dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Graph<int> graph; 170dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(0); 171dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(1); 172dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(2); 173dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(3); 174dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 175dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 0-1 176dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // | 177dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 2-3 178dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com // 0,1 and 2 have degree 1 and 3 has degree 2. 179dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 1, 1.0); 180dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(2, 3, 1.0); 181dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VertexTotalOrdering<int> less_than(graph); 182dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 183dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (int i = 0; i < 4; ++i) { 184dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_FALSE(less_than(i, i)) << "Failing vertex: " << i; 185dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (int j = 0; j < 4; ++j) { 186dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com if (i != j) { 187dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_TRUE(less_than(i, j) ^ less_than(j, i)) 188dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com << "Failing vertex pair: " << i << " " << j; 189dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 190dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 191dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 192dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 193dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com for (int i = 0; i < 3; ++i) { 194dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_TRUE(less_than(i, 3)); 195dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com EXPECT_FALSE(less_than(3, i)); 196dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } 197dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} 198dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 199dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 200dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comTEST(StableIndependentSet, BreakTies) { 201dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Graph<int> graph; 202dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(0); 203dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(1); 204dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(2); 205dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddVertex(3); 206dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 207dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 1); 208dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 2); 209dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(0, 3); 210dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(1, 2); 211dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(1, 3); 212dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com graph.AddEdge(2, 3); 213 214 // Since this is a completely connected graph, the independent set 215 // contains exactly one vertex. StableIndependentSetOrdering 216 // guarantees that it will always be the first vertex in the 217 // ordering vector. 218 { 219 vector<int> ordering; 220 ordering.push_back(0); 221 ordering.push_back(1); 222 ordering.push_back(2); 223 ordering.push_back(3); 224 const int independent_set_size = 225 StableIndependentSetOrdering(graph, &ordering); 226 EXPECT_EQ(independent_set_size, 1); 227 EXPECT_EQ(ordering[0], 0); 228 } 229 230 { 231 vector<int> ordering; 232 ordering.push_back(1); 233 ordering.push_back(0); 234 ordering.push_back(2); 235 ordering.push_back(3); 236 const int independent_set_size = 237 StableIndependentSetOrdering(graph, &ordering); 238 EXPECT_EQ(independent_set_size, 1); 239 EXPECT_EQ(ordering[0], 1); 240 } 241 242} 243} // namespace internal 244} // namespace ceres 245