From cf1bca273800f36a6ab9f779b72ba107a6e3bb66 Mon Sep 17 00:00:00 2001 From: Ian Rees Date: Thu, 11 Jul 2024 20:48:44 -0700 Subject: [PATCH 1/4] [EXP] Route departure tables --- src/runtime/components/nw.ts | 90 ++++++ src/runtime/components/pages/route.vue | 2 + src/runtime/components/route-departures.vue | 318 ++++++++++++++++++++ 3 files changed, 410 insertions(+) create mode 100644 src/runtime/components/nw.ts create mode 100644 src/runtime/components/route-departures.vue diff --git a/src/runtime/components/nw.ts b/src/runtime/components/nw.ts new file mode 100644 index 0000000..be2ed24 --- /dev/null +++ b/src/runtime/components/nw.ts @@ -0,0 +1,90 @@ +// adapted from https://gist.github.com/shinout/f19da7720d130f3925ac +const UP = '1' +const LEFT = '2' +const UL = '4' + +interface Options { + G: number, + P: number, + M: number +} + +interface Matrix { + [key: number]: {[key: number]: number} +} + +interface Direc { + [key: number]: {[key: number]: Array} +} + +export function NeedlemanWunsch(s1: Array, s2: Array, op: Options): {a: Array, b: Array} { + op = op || {} + const G = op.G || 2 + const P = op.P || 1 + const M = op.M || -100 + const mat: Matrix = {} + const direc: Direc = {} + + // initialization + for (let i = 0; i < s1.length + 1; i++) { + mat[i] = { 0: 0 } + direc[i] = { 0: [] } + for (let j = 1; j < s2.length + 1; j++) { + mat[i][j] = (i === 0) + ? 0 + : (s1[i - 1] === s2[j - 1]) ? P : M + direc[i][j] = [] + } + } + + // calculate each value + for (let i = 0; i < s1.length + 1; i++) { + for (let j = 0; j < s2.length + 1; j++) { + const newval = (i === 0 || j === 0) + ? -G * (i + j) + : Math.max(mat[i - 1][j] - G, mat[i - 1][j - 1] + mat[i][j], mat[i][j - 1] - G) + + if (i > 0 && j > 0) { + if (newval === mat[i - 1][j] - G) { direc[i][j].push(UP) } + if (newval === mat[i][j - 1] - G) { direc[i][j].push(LEFT) } + if (newval === mat[i - 1][j - 1] + mat[i][j]) { direc[i][j].push(UL) } + } else { + direc[i][j].push((j === 0) ? UP : LEFT) + } + mat[i][j] = newval + } + } + + // get result + const chars = [new Array(), new Array()] + let I = s1.length + let J = s2.length + while (I > 0 || J > 0) { + switch (direc[I][J][0]) { + case UP: + I-- + chars[0].push(s1[I]) + chars[1].push('-') + break + case LEFT: + J-- + chars[0].push('-') + chars[1].push(s2[J]) + break + case UL: + I-- + J-- + chars[0].push(s1[I]) + chars[1].push(s2[J]) + break + default: break + } + } + return { + a: chars[0].reverse(), + b: chars[1].reverse() + } + // return chars.map(function(v) { + // return v.reverse() + // }) +} diff --git a/src/runtime/components/pages/route.vue b/src/runtime/components/pages/route.vue index b62cb29..602d282 100644 --- a/src/runtime/components/pages/route.vue +++ b/src/runtime/components/pages/route.vue @@ -30,6 +30,8 @@ + +
diff --git a/src/runtime/components/route-departures.vue b/src/runtime/components/route-departures.vue new file mode 100644 index 0000000..5db5a70 --- /dev/null +++ b/src/runtime/components/route-departures.vue @@ -0,0 +1,318 @@ + + + From 95b6c4790534c4e1d68491dcec414b955898d41f Mon Sep 17 00:00:00 2001 From: Ian Rees Date: Fri, 12 Jul 2024 22:14:35 -0700 Subject: [PATCH 2/4] WIP --- src/runtime/components/modal.vue | 4 +- src/runtime/components/nw.ts | 2 +- src/runtime/components/pages/route.vue | 5 +- .../components/route-departures-outer.vue | 213 ++++++++++++++++ .../components/route-departures-table.vue | 126 ++++++++++ ...ute-departures.vue => route-departures.ts} | 235 +++++++----------- src/runtime/plugins/filters-fn.ts | 4 + src/runtime/plugins/filters.ts | 4 + 8 files changed, 440 insertions(+), 153 deletions(-) create mode 100644 src/runtime/components/route-departures-outer.vue create mode 100644 src/runtime/components/route-departures-table.vue rename src/runtime/components/{route-departures.vue => route-departures.ts} (51%) diff --git a/src/runtime/components/modal.vue b/src/runtime/components/modal.vue index c3a838f..c327326 100644 --- a/src/runtime/components/modal.vue +++ b/src/runtime/components/modal.vue @@ -4,6 +4,7 @@ :active="modelValue" has-modal-card can-cancel + :fullscreen="fullscreen" @update:model-value="$emit('update:modelValue', $event)" @close="close" > @@ -34,7 +35,8 @@ export default { props: { text: { type: String, default: '+' }, title: { type: String, default: '' }, - modelValue: { type: Boolean } + modelValue: { type: Boolean }, + fullscreen: { type: Boolean } }, emits: ['input', 'update:modelValue'], data () { diff --git a/src/runtime/components/nw.ts b/src/runtime/components/nw.ts index be2ed24..e0501a0 100644 --- a/src/runtime/components/nw.ts +++ b/src/runtime/components/nw.ts @@ -21,7 +21,7 @@ export function NeedlemanWunsch(s1: Array, s2: Array, op: Option op = op || {} const G = op.G || 2 const P = op.P || 1 - const M = op.M || -100 + const M = op.M || 0.5 const mat: Matrix = {} const direc: Direc = {} diff --git a/src/runtime/components/pages/route.vue b/src/runtime/components/pages/route.vue index 602d282..caab8a6 100644 --- a/src/runtime/components/pages/route.vue +++ b/src/runtime/components/pages/route.vue @@ -30,8 +30,6 @@ - -
@@ -135,6 +133,9 @@ :animated="false" @update:model-value="setTab" > + + + diff --git a/src/runtime/components/route-departures-outer.vue b/src/runtime/components/route-departures-outer.vue new file mode 100644 index 0000000..1a86361 --- /dev/null +++ b/src/runtime/components/route-departures-outer.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/src/runtime/components/route-departures-table.vue b/src/runtime/components/route-departures-table.vue new file mode 100644 index 0000000..3542deb --- /dev/null +++ b/src/runtime/components/route-departures-table.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/runtime/components/route-departures.vue b/src/runtime/components/route-departures.ts similarity index 51% rename from src/runtime/components/route-departures.vue rename to src/runtime/components/route-departures.ts index 5db5a70..7163e81 100644 --- a/src/runtime/components/route-departures.vue +++ b/src/runtime/components/route-departures.ts @@ -1,139 +1,82 @@ - - - diff --git a/src/runtime/plugins/filters-fn.ts b/src/runtime/plugins/filters-fn.ts index aa6056b..e8747c7 100644 --- a/src/runtime/plugins/filters-fn.ts +++ b/src/runtime/plugins/filters-fn.ts @@ -158,6 +158,10 @@ export function reformatHMS(value: string): string { return formatHMS(parseHMS(value)) } +export function reformatHM(value: string): string { + return formatHM(parseHMS(value)) +} + export function round(value: number): string { return value.toFixed(2) } diff --git a/src/runtime/plugins/filters.ts b/src/runtime/plugins/filters.ts index 360e168..8207dc2 100644 --- a/src/runtime/plugins/filters.ts +++ b/src/runtime/plugins/filters.ts @@ -2,8 +2,10 @@ import { nameSort, fromNowDate, fromNow, + reformatHM, reformatHMS, parseHMS, + formatHM, formatHMS, shortenName, formatDate, @@ -29,8 +31,10 @@ export default defineNuxtPlugin((nuxtApp) => { sanitizeFilename, fromNowDate, fromNow, + reformatHM, reformatHMS, parseHMS, + formatHM, formatHMS, shortenName, formatDate, From 621d6f6f8f66c4943bd6e2e10d46ef09c32e08e7 Mon Sep 17 00:00:00 2001 From: Ian Rees Date: Fri, 12 Jul 2024 22:25:18 -0700 Subject: [PATCH 3/4] showRt --- src/runtime/components/route-departures-outer.vue | 7 +++++++ src/runtime/components/route-departures-table.vue | 9 +++------ src/runtime/components/route-departures.ts | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/runtime/components/route-departures-outer.vue b/src/runtime/components/route-departures-outer.vue index 1a86361..d11bcaa 100644 --- a/src/runtime/components/route-departures-outer.vue +++ b/src/runtime/components/route-departures-outer.vue @@ -39,6 +39,12 @@ Stop Pattern + + + + Show GTFS-RT + +
@@ -121,6 +127,7 @@ export default { groupByDirection: true, groupByHeadsign: false, groupByStopPattern: false, + showRt: true, error: '', serviceDate } diff --git a/src/runtime/components/route-departures-table.vue b/src/runtime/components/route-departures-table.vue index 3542deb..d075df0 100644 --- a/src/runtime/components/route-departures-table.vue +++ b/src/runtime/components/route-departures-table.vue @@ -29,18 +29,14 @@ …
-