From 4a4e1396852607d88af1928649086366e3b69d46 Mon Sep 17 00:00:00 2001 From: Brady James Garvin <bgarvin@cse.unl.edu> Date: Wed, 16 Oct 2019 10:31:42 -0500 Subject: [PATCH] Updated lab for 2019. --- .eslintrc | 3 +++ js/distances.js | 25 ++++++++++++++++++++----- js/graphs.js | 4 +--- js/queue.js | 4 +--- js/searches.js | 11 ++++++----- js/stack.js | 4 +--- js/topological_sort.js | 27 +++++++++++++++++++++++---- unit_tests/test_distances.js | 7 +++++-- unit_tests/test_topological_sort.js | 7 +++++-- unit_tests/unit_tests.html | 12 ++---------- 10 files changed, 67 insertions(+), 37 deletions(-) diff --git a/.eslintrc b/.eslintrc index ec0d68b..15eefba 100755 --- a/.eslintrc +++ b/.eslintrc @@ -4,6 +4,9 @@ "browser": true, "jquery": true, }, + "parserOptions": { + "sourceType": "module", + }, "rules": { "no-await-in-loop": "warn", "no-compare-neg-zero": "warn", diff --git a/js/distances.js b/js/distances.js index 1b848a5..d42907a 100644 --- a/js/distances.js +++ b/js/distances.js @@ -1,7 +1,22 @@ -/* exported getDistances */ -/* globals BasicQueue */ +import {BasicQueue} from './queue.js'; -function getDistances(graph, source) { - const result = new Map(); - return result; // stub +export function getDistances(graph, source) { + // TODO: This code has been copied from searches.js, but still needs to be modified. + const backpointers = new Map(); + const worklist = new BasicQueue(); + worklist.insert([undefined, source]); + while (worklist.size > 0) { + const [from, to] = worklist.remove(); + if (backpointers.has(to)) { + continue; + } + backpointers.set(to, from); + if (to === destination) { + break; + } + for (const neighbor of graph.getNeighbors(to)) { + worklist.insert([to, neighbor]); + } + } + return backpointers; } diff --git a/js/graphs.js b/js/graphs.js index 2a8b3c0..892575f 100644 --- a/js/graphs.js +++ b/js/graphs.js @@ -1,6 +1,4 @@ -/* exported Graph */ - -class Graph { +export class Graph { constructor() { this.neighbors = new Map(); } diff --git a/js/queue.js b/js/queue.js index 8b05cce..9f45117 100644 --- a/js/queue.js +++ b/js/queue.js @@ -1,6 +1,4 @@ -/* exported BasicQueue */ - -class BasicQueue { +export class BasicQueue { constructor() { this.elements = []; this.head = 0; diff --git a/js/searches.js b/js/searches.js index ce19294..5d63265 100644 --- a/js/searches.js +++ b/js/searches.js @@ -1,7 +1,8 @@ -/* exported dfs bfs fullDFS */ -/* globals BasicStack BasicQueue */ +import './utility.js'; +import {BasicStack} from './stack.js'; +import {BasicQueue} from './queue.js'; -function dfs(graph, source, destination) { +export function dfs(graph, source, destination) { const backpointers = new Map(); const worklist = new BasicStack(); worklist.insert([undefined, source]); @@ -25,7 +26,7 @@ function dfs(graph, source, destination) { return path.reverse(); } -function bfs(graph, source, destination) { +export function bfs(graph, source, destination) { const backpointers = new Map(); const worklist = new BasicQueue(); worklist.insert([undefined, source]); @@ -49,7 +50,7 @@ function bfs(graph, source, destination) { return path.reverse(); } -function fullDFS(graph) { +export function fullDFS(graph) { const backpointers = new Map(); for (const source of graph.vertices) { if (!backpointers.has(source)) { diff --git a/js/stack.js b/js/stack.js index e5612f2..f87a910 100644 --- a/js/stack.js +++ b/js/stack.js @@ -1,6 +1,4 @@ -/* exported BasicStack */ - -class BasicStack { +export class BasicStack { constructor() { this.elements = []; } diff --git a/js/topological_sort.js b/js/topological_sort.js index a35147b..3b8f1bf 100644 --- a/js/topological_sort.js +++ b/js/topological_sort.js @@ -1,5 +1,5 @@ -/* exported topologicalSort */ -/* globals BasicStack */ +import './utility.js'; +import {BasicStack} from './stack.js'; class Finish { constructor(vertex) { @@ -7,7 +7,26 @@ class Finish { } } -function topologicalSort(graph) { +export function topologicalSort(graph) { const result = []; - return result; // stub + // TODO: This code has been copied from searches.js, but still needs to be modified. + const backpointers = new Map(); + for (const source of graph.vertices) { + if (!backpointers.has(source)) { + const worklist = new BasicStack(); + worklist.insert([undefined, source]); + while (worklist.size > 0) { + const workitem = worklist.remove(); + const [from, to] = workitem; + if (backpointers.has(to)) { + continue; + } + backpointers.set(to, from); + for (const neighbor of graph.getNeighbors(to)) { + worklist.insert([to, neighbor]); + } + } + } + } + return result; } diff --git a/unit_tests/test_distances.js b/unit_tests/test_distances.js index bf4b05a..71545ef 100644 --- a/unit_tests/test_distances.js +++ b/unit_tests/test_distances.js @@ -1,5 +1,8 @@ -QUnit.module('distances.js'); -/* globals QUnit Graph getDistances */ +import {Graph} from '../js/graphs.js'; +import {getDistances} from '../js/distances.js'; + +/* globals QUnit */ +QUnit.module('test_distances.js'); /* eslint-disable no-magic-numbers */ QUnit.test('measure distances in random undirected graph #0', (assert) => { diff --git a/unit_tests/test_topological_sort.js b/unit_tests/test_topological_sort.js index 2c35574..d9788a1 100644 --- a/unit_tests/test_topological_sort.js +++ b/unit_tests/test_topological_sort.js @@ -1,5 +1,8 @@ -QUnit.module('topological_sort.js'); -/* globals QUnit Graph topologicalSort */ +import {Graph} from '../js/graphs.js'; +import {topologicalSort} from '../js/topological_sort.js'; + +/* globals QUnit */ +QUnit.module('test_topological_sort.js'); /* eslint-disable no-magic-numbers */ QUnit.test('topologically sort random directed graph #0', (assert) => { diff --git a/unit_tests/unit_tests.html b/unit_tests/unit_tests.html index e69abb6..c9d2d74 100644 --- a/unit_tests/unit_tests.html +++ b/unit_tests/unit_tests.html @@ -13,16 +13,8 @@ <script src="../libraries/qunit/qunit.js"></script> <script src="overrides.js"></script> - <script src="../js/utility.js"></script> - <script src="../js/stack.js"></script> - <script src="../js/queue.js"></script> - <script src="../js/graphs.js"></script> - - <script src="../js/distances.js"></script> - <script src="test_distances.js"></script> - - <script src="../js/topological_sort.js"></script> - <script src="test_topological_sort.js"></script> + <script type="module" src="test_distances.js"></script> + <script type="module" src="test_topological_sort.js"></script> </body> </html> -- GitLab