summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
1e742b6)
At the moment the "parallel" test graph just uses the default cost of 1
for all the links between the two nodes. This patch changes that so that
the links have cost 2, except (optionally) one with cost 1. This provides
a useful test for the Dijkstra's algorithm implementation to ensure that
it picks the correct link for the shortest path.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
12 files changed:
trivial_graph_init(&tg);
test_adjacency("trivial", &tg.sg, trivial_adjacency);
trivial_graph_init(&tg);
test_adjacency("trivial", &tg.sg, trivial_adjacency);
- parallel_graph_init(&pg, 3);
+ parallel_graph_init(&pg, 3, 0);
test_adjacency("parallel nlinks 3", &pg.sg,
parallel_adjacency_nlinks3);
test_adjacency("parallel nlinks 3", &pg.sg,
parallel_adjacency_nlinks3);
trivial_graph_init(&tg);
test_bfs(&tg.sg, 1, 1);
trivial_graph_init(&tg);
test_bfs(&tg.sg, 1, 1);
- parallel_graph_init(&pg, 3);
+ parallel_graph_init(&pg, 3, 0);
test_bfs(&pg.sg, 1, 1, 2);
full_graph_init(&fg, 5);
test_bfs(&pg.sg, 1, 1, 2);
full_graph_init(&fg, 5);
trivial_graph_init(&tg);
test_dfs(&tg.sg, 1, 1);
trivial_graph_init(&tg);
test_dfs(&tg.sg, 1, 1);
- parallel_graph_init(&pg, 3);
+ parallel_graph_init(&pg, 3, 0);
test_dfs(&pg.sg, 1, 1, 2);
full_graph_init(&fg, 5);
test_dfs(&pg.sg, 1, 1, 2);
full_graph_init(&fg, 5);
struct parallel_graph pg;
aga_icost_t cost;
struct aga_node *node;
struct parallel_graph pg;
aga_icost_t cost;
struct aga_node *node;
- parallel_graph_init(&pg, 3);
+ parallel_graph_init(&pg, 3, 0);
ok1(aga_dijkstra_start(&pg.sg.g, &pg.sg.nodes[1]) == 0);
ok1(aga_dijkstra_step(&pg.sg.g) == &pg.sg.nodes[1]);
ok1(aga_dijkstra_start(&pg.sg.g, &pg.sg.nodes[1]) == 0);
ok1(aga_dijkstra_step(&pg.sg.g) == &pg.sg.nodes[1]);
ok1(aga_dijkstra_path(&pg.sg.g, &pg.sg.nodes[1], &cost, NULL, NULL));
ok1(cost == 0);
ok1(aga_dijkstra_path(&pg.sg.g, &pg.sg.nodes[2], &cost, &node, NULL));
ok1(aga_dijkstra_path(&pg.sg.g, &pg.sg.nodes[1], &cost, NULL, NULL));
ok1(cost == 0);
ok1(aga_dijkstra_path(&pg.sg.g, &pg.sg.nodes[2], &cost, &node, NULL));
ok1(node == &pg.sg.nodes[1]);
aga_finish(&pg.sg.g);
ok1(node == &pg.sg.nodes[1]);
aga_finish(&pg.sg.g);
ok1(cost == 0);
ok1(!aga_dijkstra_path(&pg.sg.g, &pg.sg.nodes[1], NULL, NULL, NULL));
aga_finish(&pg.sg.g);
ok1(cost == 0);
ok1(!aga_dijkstra_path(&pg.sg.g, &pg.sg.nodes[1], NULL, NULL, NULL));
aga_finish(&pg.sg.g);
+
+
+ parallel_graph_init(&pg, 3, 2);
+ ok1(aga_dijkstra_start(&pg.sg.g, &pg.sg.nodes[1]) == 0);
+ ok1(aga_dijkstra_path(&pg.sg.g, &pg.sg.nodes[2], &cost, &node, &edge));
+ ok1(cost == 1);
+ ok1(node == &pg.sg.nodes[1]);
+ ok1(ptr2int(edge) == 2);
+ aga_finish(&pg.sg.g);
+ FULL_LEN * (1 + FULL_LEN*4)
+ CHAIN_LEN * (1 + CHAIN_LEN*2)
+ 12 + 32);
+ FULL_LEN * (1 + FULL_LEN*4)
+ CHAIN_LEN * (1 + CHAIN_LEN*2)
+ 12 + 32);
assert(n == &pg->sg.nodes[1]);
ei->to = &pg->sg.nodes[2];
assert(n == &pg->sg.nodes[1]);
ei->to = &pg->sg.nodes[2];
+ if (ptr2int(edge) == pg->cheaplink)
+ ei->icost = 1;
+ else
+ ei->icost = 2;
-void parallel_graph_init(struct parallel_graph *pg, int nlinks)
+void parallel_graph_init(struct parallel_graph *pg, int nlinks, int cheaplink)
+ pg->cheaplink = cheaplink;
simple_graph_init(&pg->sg, parallel_first_edge, parallel_next_edge,
parallel_edge_info);
simple_graph_init(&pg->sg, parallel_first_edge, parallel_next_edge,
parallel_edge_info);
*/
struct parallel_graph {
int nlinks;
*/
struct parallel_graph {
int nlinks;
struct simple_graph sg;
};
struct simple_graph sg;
};
-void parallel_graph_init(struct parallel_graph *pg, int nlinks);
+void parallel_graph_init(struct parallel_graph *pg, int nlinks, int cheaplink);
static const struct adjacency_list parallel_adjacency_nlinks3[] = {
{1, {2, 2, 2}},
{2, {}},
static const struct adjacency_list parallel_adjacency_nlinks3[] = {
{1, {2, 2, 2}},
{2, {}},
trivial_graphr_init(&tgr);
test_adjacency("trivial", &tgr.gr, trivial_adjacencyr);
trivial_graphr_init(&tgr);
test_adjacency("trivial", &tgr.gr, trivial_adjacencyr);
- parallel_graphr_init(&pgr, 3);
+ parallel_graphr_init(&pgr, 3, 0);
test_adjacency("parallel nlinks 3", &pgr.gr,
parallel_adjacencyr_nlinks3);
test_adjacency("parallel nlinks 3", &pgr.gr,
parallel_adjacencyr_nlinks3);
trivial_graphr_init(&tgr);
test_bfs(&tgr.gr, 1, 1);
trivial_graphr_init(&tgr);
test_bfs(&tgr.gr, 1, 1);
- parallel_graphr_init(&pgr, 3);
+ parallel_graphr_init(&pgr, 3, 0);
test_bfs(&pgr.gr, 1, 1, 2);
full_graphr_init(&fgr, 5);
test_bfs(&pgr.gr, 1, 1, 2);
full_graphr_init(&fgr, 5);
trivial_graphr_init(&tgr);
test_dfs(&tgr.gr, 1, 1);
trivial_graphr_init(&tgr);
test_dfs(&tgr.gr, 1, 1);
- parallel_graphr_init(&pgr, 3);
+ parallel_graphr_init(&pgr, 3, 0);
test_dfs(&pgr.gr, 1, 1, 2);
full_graphr_init(&fgr, 5);
test_dfs(&pgr.gr, 1, 1, 2);
full_graphr_init(&fgr, 5);
struct parallel_graphr pgr;
struct agar_state *sr;
aga_icost_t cost;
struct parallel_graphr pgr;
struct agar_state *sr;
aga_icost_t cost;
+ const void *node, *edge;
- parallel_graphr_init(&pgr, 3);
+ parallel_graphr_init(&pgr, 3, 0);
ok1(sr = agar_dijkstra_new(NULL, &pgr.gr, int2ptr(1)));
ok1(agar_dijkstra_step(sr, &node));
ok1(sr = agar_dijkstra_new(NULL, &pgr.gr, int2ptr(1)));
ok1(agar_dijkstra_step(sr, &node));
ok1(agar_dijkstra_path(sr, int2ptr(1), &cost, NULL, NULL));
ok1(cost == 0);
ok1(agar_dijkstra_path(sr, int2ptr(2), &cost, &node, NULL));
ok1(agar_dijkstra_path(sr, int2ptr(1), &cost, NULL, NULL));
ok1(cost == 0);
ok1(agar_dijkstra_path(sr, int2ptr(2), &cost, &node, NULL));
ok1(node == int2ptr(1));
tal_free(sr);
ok1(node == int2ptr(1));
tal_free(sr);
ok1(cost == 0);
ok1(!agar_dijkstra_path(sr, int2ptr(1), NULL, NULL, NULL));
tal_free(sr);
ok1(cost == 0);
ok1(!agar_dijkstra_path(sr, int2ptr(1), NULL, NULL, NULL));
tal_free(sr);
+
+ parallel_graphr_init(&pgr, 3, 2);
+ ok1(sr = agar_dijkstra_new(NULL, &pgr.gr, int2ptr(1)));
+ ok1(agar_dijkstra_path(sr, int2ptr(2), &cost, &node, &edge));
+ ok1(cost == 1);
+ ok1(ptr2int(node) == 1);
+ ok1(ptr2int(edge) == 2);
+ tal_free(sr);
+ FULL_LEN * (FULL_LEN*4 - 1)
+ CHAIN_LEN * (1 + CHAIN_LEN*2)
+ 12 + 32);
+ FULL_LEN * (FULL_LEN*4 - 1)
+ CHAIN_LEN * (1 + CHAIN_LEN*2)
+ 12 + 32);
const void *nr, const void *edge,
struct agar_edge_info *eir)
{
const void *nr, const void *edge,
struct agar_edge_info *eir)
{
+ const struct parallel_graphr *pgr
+ = container_of(gr, struct parallel_graphr, gr);
assert(ptr2int(nr) == 1);
eir->to = int2ptr(2);
assert(ptr2int(nr) == 1);
eir->to = int2ptr(2);
+ if (ptr2int(edge) == pgr->cheaplink)
+ eir->icost = 1;
+ else
+ eir->icost = 2;
-void parallel_graphr_init(struct parallel_graphr *pgr, int nlinks)
+void parallel_graphr_init(struct parallel_graphr *pgr, int nlinks,
+ int cheaplink)
+ pgr->cheaplink = cheaplink;
agar_init_graph(&pgr->gr, parallel_first_edge_r, parallel_next_edge_r,
parallel_edge_info_r);
agar_init_graph(&pgr->gr, parallel_first_edge_r, parallel_next_edge_r,
parallel_edge_info_r);
*/
struct parallel_graphr {
int nlinks;
*/
struct parallel_graphr {
int nlinks;
-void parallel_graphr_init(struct parallel_graphr *pgr, int nlinks);
+void parallel_graphr_init(struct parallel_graphr *pgr, int nlinks,
+ int cheaplink);
static const struct adjacency_listr parallel_adjacencyr_nlinks3[] = {
{1, {2, 2, 2}},
{2, {}},
static const struct adjacency_listr parallel_adjacencyr_nlinks3[] = {
{1, {2, 2, 2}},
{2, {}},