1
// Ceres Solver - A fast non-linear least squares minimizer
2
// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
3
// http://code.google.com/p/ceres-solver/
5
// Redistribution and use in source and binary forms, with or without
6
// modification, are permitted provided that the following conditions are met:
8
// * Redistributions of source code must retain the above copyright notice,
9
// this list of conditions and the following disclaimer.
10
// * Redistributions in binary form must reproduce the above copyright notice,
11
// this list of conditions and the following disclaimer in the documentation
12
// and/or other materials provided with the distribution.
13
// * Neither the name of Google Inc. nor the names of its contributors may be
14
// used to endorse or promote products derived from this software without
15
// specific prior written permission.
17
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
// POSSIBILITY OF SUCH DAMAGE.
29
// Author: sameeragarwal@google.com (Sameer Agarwal)
31
#include "ceres/graph.h"
33
#include "gtest/gtest.h"
34
#include "ceres/collections_port.h"
35
#include "ceres/internal/scoped_ptr.h"
40
TEST(Graph, EmptyGraph) {
42
EXPECT_EQ(graph.vertices().size(), 0);
45
TEST(Graph, AddVertexAndEdge) {
47
graph.AddVertex(0, 1.0);
48
graph.AddVertex(1, 2.0);
49
graph.AddEdge(0, 1, 0.5);
51
const HashSet<int>& vertices = graph.vertices();
52
EXPECT_EQ(vertices.size(), 2);
53
EXPECT_EQ(graph.VertexWeight(0), 1.0);
54
EXPECT_EQ(graph.VertexWeight(1), 2.0);
55
EXPECT_EQ(graph.Neighbors(0).size(), 1);
56
EXPECT_EQ(graph.Neighbors(1).size(), 1);
57
EXPECT_EQ(graph.EdgeWeight(0, 1), 0.5);
58
EXPECT_EQ(graph.EdgeWeight(1, 0), 0.5);
61
TEST(Graph, AddVertexIdempotence) {
63
graph.AddVertex(0, 1.0);
64
graph.AddVertex(1, 2.0);
65
graph.AddEdge(0, 1, 0.5);
67
const HashSet<int>& vertices = graph.vertices();
69
EXPECT_EQ(vertices.size(), 2);
71
// Try adding the vertex again with a new weight.
72
graph.AddVertex(0, 3.0);
73
EXPECT_EQ(vertices.size(), 2);
75
// The vertex weight is reset.
76
EXPECT_EQ(graph.VertexWeight(0), 3.0);
78
// Rest of the graph remains the same.
79
EXPECT_EQ(graph.VertexWeight(1), 2.0);
80
EXPECT_EQ(graph.Neighbors(0).size(), 1);
81
EXPECT_EQ(graph.Neighbors(1).size(), 1);
82
EXPECT_EQ(graph.EdgeWeight(0, 1), 0.5);
83
EXPECT_EQ(graph.EdgeWeight(1, 0), 0.5);
86
TEST(Graph, DieOnNonExistentVertex) {
88
graph.AddVertex(0, 1.0);
89
graph.AddVertex(1, 2.0);
90
graph.AddEdge(0, 1, 0.5);
92
EXPECT_DEATH(graph.VertexWeight(2), "key not found");
93
EXPECT_DEATH(graph.Neighbors(2), "key not found");
96
TEST(Graph, NonExistentEdge) {
98
graph.AddVertex(0, 1.0);
99
graph.AddVertex(1, 2.0);
100
graph.AddEdge(0, 1, 0.5);
102
// Default value for non-existent edges is 0.
103
EXPECT_EQ(graph.EdgeWeight(2, 3), 0);
106
} // namespace internal