Skip to content

Commit 9d7ccdd

Browse files
committed
✨ support edge distance for graph utils
1 parent 7a73d4c commit 9d7ccdd

File tree

8 files changed

+84
-56
lines changed

8 files changed

+84
-56
lines changed

jest.config.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ module.exports = {
55
bail: 1,
66
modulePaths: ["<rootDir>/src"],
77
testPathIgnorePatterns: ["<rootDir>/node_modules"],
8-
globals: {
9-
"ts-jest": {
10-
diagnostics: false,
11-
isolatedModules: false,
12-
include: [],
13-
},
8+
transform: {
9+
"^.+\\.tsx?$": [
10+
"ts-jest",
11+
{
12+
diagnostics: false,
13+
isolatedModules: false,
14+
include: [],
15+
},
16+
],
1417
},
1518
};

src/graph/__snapshots__/floyd-warshal.spec.ts.snap

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,58 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`success topo - t1 1`] = `
4-
Array [
5-
Object {
4+
[
5+
{
66
"child": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
77
"distance": 0,
88
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
99
},
10-
Object {
10+
{
1111
"child": "57fea751-6c21-4eb1-9262-ea97ff45553c",
1212
"distance": 1,
1313
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
1414
},
15-
Object {
15+
{
1616
"child": "f03626f2-1852-45b8-b6ad-b59bde38b3fd",
1717
"distance": 1,
1818
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
1919
},
20-
Object {
20+
{
2121
"child": "322c07a4-06ce-4766-964c-2ccc7d977cbc",
2222
"distance": 2,
2323
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
2424
},
25-
Object {
25+
{
2626
"child": "9c550989-3e19-4cf5-ab28-b8e0881e2dac",
2727
"distance": 0,
2828
"parent": "9c550989-3e19-4cf5-ab28-b8e0881e2dac",
2929
},
30-
Object {
30+
{
3131
"child": "5c1a9dca-f58a-4f49-9909-576c48ab20c1",
3232
"distance": 1,
3333
"parent": "9c550989-3e19-4cf5-ab28-b8e0881e2dac",
3434
},
35-
Object {
35+
{
3636
"child": "57fea751-6c21-4eb1-9262-ea97ff45553c",
3737
"distance": 0,
3838
"parent": "57fea751-6c21-4eb1-9262-ea97ff45553c",
3939
},
40-
Object {
40+
{
4141
"child": "322c07a4-06ce-4766-964c-2ccc7d977cbc",
4242
"distance": 1,
4343
"parent": "57fea751-6c21-4eb1-9262-ea97ff45553c",
4444
},
45-
Object {
45+
{
4646
"child": "f03626f2-1852-45b8-b6ad-b59bde38b3fd",
4747
"distance": 0,
4848
"parent": "f03626f2-1852-45b8-b6ad-b59bde38b3fd",
4949
},
50-
Object {
50+
{
5151
"child": "5c1a9dca-f58a-4f49-9909-576c48ab20c1",
5252
"distance": 0,
5353
"parent": "5c1a9dca-f58a-4f49-9909-576c48ab20c1",
5454
},
55-
Object {
55+
{
5656
"child": "322c07a4-06ce-4766-964c-2ccc7d977cbc",
5757
"distance": 0,
5858
"parent": "322c07a4-06ce-4766-964c-2ccc7d977cbc",
@@ -61,43 +61,43 @@ Array [
6161
`;
6262

6363
exports[`success topo - t2 1`] = `
64-
Array [
65-
Object {
64+
[
65+
{
6666
"child": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
6767
"distance": 0,
6868
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
6969
},
70-
Object {
70+
{
7171
"child": "57fea751-6c21-4eb1-9262-ea97ff45553c",
72-
"distance": 1,
72+
"distance": 2,
7373
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
7474
},
75-
Object {
75+
{
7676
"child": "f03626f2-1852-45b8-b6ad-b59bde38b3fd",
77-
"distance": 1,
77+
"distance": 2,
7878
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
7979
},
80-
Object {
80+
{
8181
"child": "322c07a4-06ce-4766-964c-2ccc7d977cbc",
82-
"distance": 2,
82+
"distance": 4,
8383
"parent": "5ab489c9-824c-4f2b-a021-54dedd2db6bd",
8484
},
85-
Object {
85+
{
8686
"child": "57fea751-6c21-4eb1-9262-ea97ff45553c",
8787
"distance": 0,
8888
"parent": "57fea751-6c21-4eb1-9262-ea97ff45553c",
8989
},
90-
Object {
90+
{
9191
"child": "322c07a4-06ce-4766-964c-2ccc7d977cbc",
92-
"distance": 1,
92+
"distance": 2,
9393
"parent": "57fea751-6c21-4eb1-9262-ea97ff45553c",
9494
},
95-
Object {
95+
{
9696
"child": "f03626f2-1852-45b8-b6ad-b59bde38b3fd",
9797
"distance": 0,
9898
"parent": "f03626f2-1852-45b8-b6ad-b59bde38b3fd",
9999
},
100-
Object {
100+
{
101101
"child": "322c07a4-06ce-4766-964c-2ccc7d977cbc",
102102
"distance": 0,
103103
"parent": "322c07a4-06ce-4766-964c-2ccc7d977cbc",

src/graph/detect-cycle.spec.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,69 @@
11
import { isThereCycleInDG } from "./detect-cycle";
22

3-
const t1: [string, string][] = [
3+
const t1: [string, string, number][] = [
44
[
55
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
66
"57fea751-6c21-4eb1-9262-ea97ff45553c",
7+
1
78
],
89
[
910
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
1011
"f03626f2-1852-45b8-b6ad-b59bde38b3fd",
12+
1
1113
],
1214
[
1315
"9c550989-3e19-4cf5-ab28-b8e0881e2dac",
1416
"5c1a9dca-f58a-4f49-9909-576c48ab20c1",
17+
1
1518
],
1619
[
1720
"57fea751-6c21-4eb1-9262-ea97ff45553c",
1821
"322c07a4-06ce-4766-964c-2ccc7d977cbc",
22+
1
1923
],
2024
];
2125

2226
test("no cycle in dag - t1", () => {
2327
expect(isThereCycleInDG(t1)).toBe(false);
2428
});
2529

26-
const t2: [string, string][] = [
30+
const t2: [string, string, number][] = [
2731
[
2832
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
2933
"57fea751-6c21-4eb1-9262-ea97ff45553c",
34+
2
3035
],
3136
[
3237
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
3338
"f03626f2-1852-45b8-b6ad-b59bde38b3fd",
39+
2
3440
],
3541
[
3642
"57fea751-6c21-4eb1-9262-ea97ff45553c",
3743
"322c07a4-06ce-4766-964c-2ccc7d977cbc",
44+
2
3845
],
3946
];
4047

4148
test("no cycle in dag - t2", () => {
4249
expect(isThereCycleInDG(t2)).toBe(false);
4350
});
4451

45-
const t3: [string, string][] = [
52+
const t3: [string, string, number][] = [
4653
[
4754
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
4855
"57fea751-6c21-4eb1-9262-ea97ff45553c",
56+
3
4957
],
5058
[
5159
"57fea751-6c21-4eb1-9262-ea97ff45553c",
5260
"f03626f2-1852-45b8-b6ad-b59bde38b3fd",
61+
3
5362
],
5463
[
5564
"f03626f2-1852-45b8-b6ad-b59bde38b3fd",
5665
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
66+
3
5767
],
5868
];
5969

src/graph/floyd-warshal.spec.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,47 @@
11
import { buildDAGTransitiveClosure } from "./floyd-warshal";
22

3-
const t1: [string, string][] = [
3+
const t1: [string, string, number][] = [
44
[
55
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
66
"57fea751-6c21-4eb1-9262-ea97ff45553c",
7+
1,
78
],
89
[
910
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
1011
"f03626f2-1852-45b8-b6ad-b59bde38b3fd",
12+
1,
1113
],
1214
[
1315
"9c550989-3e19-4cf5-ab28-b8e0881e2dac",
1416
"5c1a9dca-f58a-4f49-9909-576c48ab20c1",
17+
1,
1518
],
1619
[
1720
"57fea751-6c21-4eb1-9262-ea97ff45553c",
1821
"322c07a4-06ce-4766-964c-2ccc7d977cbc",
22+
1,
1923
],
2024
];
2125

2226
test("success topo - t1", () => {
2327
expect(buildDAGTransitiveClosure(t1)).toMatchSnapshot();
2428
});
2529

26-
const t2: [string, string][] = [
30+
const t2: [string, string, number][] = [
2731
[
2832
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
2933
"57fea751-6c21-4eb1-9262-ea97ff45553c",
34+
2,
3035
],
3136
[
3237
"5ab489c9-824c-4f2b-a021-54dedd2db6bd",
3338
"f03626f2-1852-45b8-b6ad-b59bde38b3fd",
39+
2,
3440
],
3541
[
3642
"57fea751-6c21-4eb1-9262-ea97ff45553c",
3743
"322c07a4-06ce-4766-964c-2ccc7d977cbc",
44+
2,
3845
],
3946
];
4047

src/graph/floyd-warshal.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export function buildDAGTransitiveClosure<T>(
1313
const indexedEdges = edges.map((e) => {
1414
const from = nodeIndex.get(e[0])!;
1515
const to = nodeIndex.get(e[1])!;
16-
return [from, to] as [number, number];
16+
return [from, to, e[2]] as [number, number, number];
1717
});
1818

1919
const dm = buildDMUsingFloydWarshal(nodes.length, indexedEdges);
@@ -22,8 +22,11 @@ export function buildDAGTransitiveClosure<T>(
2222

2323
// build Distance Matrix using Floyd Warshal
2424
// https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
25-
// N - number of nodes/vertexes, edges - array of [from, to]
26-
export function buildDMUsingFloydWarshal(N: number, edges: [number, number][]) {
25+
// N - number of nodes/vertexes, edges - array of [from, to, distance]
26+
export function buildDMUsingFloydWarshal(
27+
N: number,
28+
edges: [number, number, number][]
29+
) {
2730
const dm: number[][] = [];
2831
for (let i = 0; i < N; i++) {
2932
const row: number[] = [];
@@ -33,8 +36,8 @@ export function buildDMUsingFloydWarshal(N: number, edges: [number, number][]) {
3336
}
3437
}
3538

36-
for (const [from, to] of edges) {
37-
dm[from][to] = 1;
39+
for (const [from, to, distance] of edges) {
40+
dm[from][to] = distance;
3841
}
3942
for (let i = 0; i < N; i++) {
4043
dm[i][i] = 0;

src/graph/interfaces.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// DG - Directed Graph
22
// DAG - Directed Acyclic Graph
33

4-
// [parent, child]
5-
export type Edge<T> = [T, T];
4+
// [parent, child, distance]
5+
export type Edge<T> = [T, T, number];
66

77
export type TransitiveClosure<T> = {
88
parent: T;

0 commit comments

Comments
 (0)