Skip to content

Commit 77f8b72

Browse files
committed
added functions to process the logs
1 parent f89474c commit 77f8b72

4 files changed

Lines changed: 163 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Discrete event simulation library, inspired by GPSS and SimPy.
33

44
## Usage
55
```js
6-
import { Process, Sim, uniformInt, varExpo } from "https://deno.land/x/[email protected].5/mod.ts";
6+
import { Process, Sim, uniformInt, varExpo } from "https://deno.land/x/[email protected].6/mod.ts";
77

88
const sim = new Sim();
99

mod.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ export {
2626
writeResultsSync,
2727
} from "./src/sim.ts";
2828

29+
export {
30+
eCDF,
31+
normalize,
32+
accumulate,
33+
asKeyVal,
34+
queueLengthHistogram,
35+
usageHistogram,
36+
} from "./src/logs.ts";
37+
2938
export {
3039
queueLengthDistribution,
3140
queueLengthEvolution,

src/logs.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { ResourceUsageLog } from "./sim.ts";
2+
3+
export function eCDF(eDist: number[], id?: string): {key:number, val:number}[] {
4+
return asKeyVal(accumulate(normalize(eDist)), id);
5+
}
6+
7+
export function normalize(x: number[]): number[] {
8+
const total = x.reduce((p, c) => p + c, 0);
9+
if(total === 0) throw "Cannot normalize if the sum is zero";
10+
return x.map(v => v / total);
11+
}
12+
13+
export function accumulate(x: number[]): number[] {
14+
let prev = 0;
15+
return x.map(x => {
16+
prev += x;
17+
return prev;
18+
});
19+
}
20+
21+
export function asKeyVal(x: number[], id?: string): {key:number, val:number, id?: string}[] {
22+
return x.map((val, key) => (id === undefined ? {key, val} : {key, val, id}));
23+
}
24+
25+
export function queueLengthHistogram(log: ResourceUsageLog[], from: number = 0): number[] {
26+
const moves: {t:number, v:number}[] = [];
27+
for(const ru of log){
28+
moves.push({t:ru.rT, v:1});
29+
if(ru.xqT !== undefined) moves.push({t:ru.xqT, v:-1});
30+
}
31+
return _composeMoves(moves, from);
32+
}
33+
34+
export function usageHistogram(log: ResourceUsageLog[], from: number = 0): number[] {
35+
const moves: {t:number, v:number}[] = [];
36+
for(const ru of log){
37+
if(ru.xqT !== undefined && ru.av !== undefined) moves.push({t:ru.xqT, v:ru.cap});
38+
if(ru.lT !== undefined) moves.push({t:ru.lT, v:-(ru.fr ?? 0)});
39+
}
40+
return _composeMoves(moves, from);
41+
}
42+
43+
export function _composeMoves(moves: {t:number, v:number}[], from: number) {
44+
const cumul: number[] = [];
45+
moves.sort((a,b) => a.t - b.t);
46+
let ct = 0, cv = 0;
47+
for(const {t, v} of moves){
48+
if(t > from){
49+
const time = t - Math.max(ct, from);
50+
while(cumul.length <= cv) cumul.push(0);
51+
cumul[cv] += time;
52+
}
53+
ct = t; cv += v;
54+
}
55+
return cumul;
56+
}

test/log.test.ts

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { assertEquals } from "https://deno.land/[email protected]/assert/mod.ts";
2+
//import { ResourceUsageLog } from "../src/sim.ts";
3+
import { _composeMoves, accumulate, asKeyVal, normalize, queueLengthHistogram, usageHistogram } from "../src/logs.ts";
4+
5+
Deno.test("asKey works", () => {
6+
const actual = asKeyVal([1, 2, 3, 4]);
7+
const expected = [{key:0, val:1}, {key:1, val:2}, {key:2, val:3}, {key:3, val:4}];
8+
assertEquals(actual, expected);
9+
});
10+
11+
Deno.test("normalize works", () => {
12+
const actual = normalize([1, 2, 3, 4]);
13+
const expected = [0.1, 0.2, 0.3, 0.4];
14+
assertEquals(actual, expected);
15+
});
16+
17+
Deno.test("accumulate works", () => {
18+
const actual = accumulate([1, 2, 3, 4]);
19+
const expected = [1, 3, 6, 10];
20+
assertEquals(actual, expected);
21+
});
22+
23+
Deno.test("queueLengthHistogram", () => {
24+
const input = [
25+
{pid:1, rid:1, pri:1, rT:0, cap:4, xqT:2},
26+
{pid:2, rid:1, pri:1, rT:1, cap:2},
27+
];
28+
const actual = queueLengthHistogram(input);
29+
const expected: number[] = [0, 1, 1];
30+
assertEquals(actual, expected);
31+
});
32+
33+
Deno.test("usageHistogram", () => {
34+
const input = [
35+
{pid:1, rid:1, pri:1, rT:0, cap:4, xqT:2, av:10, lT:4, fr:4},
36+
{pid:2, rid:1, pri:1, rT:1, cap:3, xqT:2.5, av:6, lT:3.5, fr:3},
37+
];
38+
const actual = usageHistogram(input);
39+
const expected: number[] = [2, 0, 0, 0, 1, 0, 0, 1];
40+
assertEquals(actual, expected);
41+
});
42+
43+
Deno.test("_composeMoves simple cases", () => {
44+
assertEquals(_composeMoves([
45+
{t:0, v:1}, {t:1, v:-1},
46+
], 0), [0, 1]);
47+
assertEquals(_composeMoves([
48+
{t:0, v:1}, {t:1, v:-1},
49+
{t:2, v:1}, {t:3, v:-1},
50+
], 0), [1, 2]);
51+
});
52+
53+
Deno.test("_composeMoves simple cases, with from", () => {
54+
assertEquals(_composeMoves([
55+
{t:0, v:1}, {t:1, v:-1},
56+
], 0.5), [0, 0.5]);
57+
assertEquals(_composeMoves([
58+
{t:0, v:1}, {t:1, v:-1},
59+
{t:2, v:1}, {t:3, v:-1},
60+
], 2), [0, 1]);
61+
});
62+
63+
Deno.test("_composeMoves overlap", () => {
64+
assertEquals(_composeMoves([
65+
{t:0, v:1}, {t:2, v:-1},
66+
{t:1, v:1}, {t:4, v:-1},
67+
], 0), [0, 3, 1]);
68+
assertEquals(_composeMoves([
69+
{t:1, v:1}, {t:4, v:-1},
70+
{t:2, v:1}, {t:4, v:-1},
71+
{t:3, v:1}, {t:4, v:-1},
72+
], 0), [1, 1, 1, 1]);
73+
// same as previous, but shuffled
74+
assertEquals(_composeMoves([
75+
{t:4, v:-1}, {t:4, v:-1},
76+
{t:4, v:-1},{t:3, v:1},
77+
{t:2, v:1}, {t:1, v:1},
78+
], 0), [1, 1, 1, 1]);
79+
});
80+
81+
Deno.test("_composeMoves overlap, with from", () => {
82+
assertEquals(_composeMoves([
83+
{t:0, v:1}, {t:2, v:-1},
84+
{t:1, v:1}, {t:4, v:-1},
85+
], 1.5), [0, 2, 0.5]);
86+
assertEquals(_composeMoves([
87+
{t:1, v:1}, {t:4, v:-1},
88+
{t:2, v:1}, {t:4, v:-1},
89+
{t:3, v:1}, {t:4, v:-1},
90+
], 1.5), [0, 0.5, 1, 1]);
91+
// same as previous, but shuffled
92+
assertEquals(_composeMoves([
93+
{t:4, v:-1}, {t:4, v:-1},
94+
{t:4, v:-1},{t:3, v:1},
95+
{t:2, v:1}, {t:1, v:1},
96+
], 1.5), [0, 0.5, 1, 1]);
97+
});

0 commit comments

Comments
 (0)