{"version":3,"file":"store-BPUIE6In.js","sources":["../../src/board/smooth.ts","../../src/board/store.ts"],"sourcesContent":["import type { LineSmoothDict, LineSmoothFunc, LineSmoothInfo } from '@/types/board/charts/line'\n\n// Time Weighted EMA\nconst twe: LineSmoothFunc = (data, value, detail, container) => {\n // 基础smoothingWeight\n const smoothingWeight = Math.min(Math.sqrt(value || 0), 0.999)\n // debias: 去偏见\n let debiasWeight = 0\n let lastY = data.metrics.length > 0 ? 0 : NaN\n const metrics = data.metrics\n metrics.forEach((metric, index) => {\n const prevX = index > 0 ? index - 1 : 0\n // VIEWPORT_SCALE scales the result to the chart's x-axis range\n const changeInX = metrics[index].index - metrics[prevX].index\n const smoothingWeightAdj = Math.pow(smoothingWeight, changeInX)\n lastY = lastY * smoothingWeightAdj + metrics[index].data\n debiasWeight = debiasWeight * smoothingWeightAdj + 1\n container.push({\n data: lastY / debiasWeight,\n index: metric.index,\n detail,\n _last: metric._last\n })\n })\n}\n\n// average 平滑\nconst ra: LineSmoothFunc = (data, value, detail, container) => {\n // 理论上的窗口大小\n const w = Math.floor(value / 2)\n let floorX, ceilX, nowIndex\n let sum = 0\n const metrics = data.metrics\n metrics.forEach((metric, index) => {\n floorX = index - w\n ceilX = index + w\n sum = 0\n for (let i = floorX; i <= ceilX; i++) {\n nowIndex = Math.min(Math.max(i, 0), metrics.length - 1)\n sum += metrics[nowIndex].data\n }\n container.push({\n data: sum / (ceilX - floorX + 1),\n index: metric.index,\n _last: metric._last,\n detail\n })\n })\n}\n\n// 根号2π\nconst sqrt2PI = Math.sqrt(2 * Math.PI)\n\n/**\n * 高斯函数\n * @param x 因变量\n * @param stdDev 标准差\n */\nconst gaussian = (x: number, stdDev: number) => {\n return Math.exp(-0.5 * Math.pow(x / stdDev, 2)) / (stdDev * sqrt2PI)\n}\n\n// 高斯平滑函数\nconst gs: LineSmoothFunc = (data, value, detail, container) => {\n // 在代码中正负无穷似乎在大数据上影响算法速度,但是高斯函数在-5到5区间上进行积分似乎已经达到0.99以上,考虑使用此区间即可\n const range = 6\n // 对于每一个值,计算高斯函数的值,只采用-3到3的区间\n let sum = 0\n let weightSum = 0\n const metrics = data.metrics\n metrics.forEach((metric, index) => {\n sum = 0\n weightSum = 0\n for (let i = -range; i <= range; i++) {\n if (index + i >= 0 && index + i < metrics.length) {\n sum += metrics[index + i].data * gaussian(i, value)\n weightSum += gaussian(i, value)\n }\n }\n container.push({\n data: sum / weightSum,\n index: metric.index,\n _last: metric._last,\n detail\n })\n })\n}\n\n// 检查是否是平滑状态\nexport function checkIsSmoothing(smooth?: LineSmoothInfo): LineSmoothInfo | null {\n if (!smooth) return null\n if (smooth.detail.type === 'NULL') return null\n if (smooth.value === smooth.detail.range?.[0]) return null\n return smooth\n}\n\nconst smooth: LineSmoothDict = {\n NULL: {\n type: 'NULL',\n name: 'No Smoothing'\n },\n TWE: {\n type: 'TWE',\n name: 'Time Weighted EMA',\n range: [0, 0.99],\n step: 0.01,\n func: twe\n },\n RA: {\n type: 'RA',\n name: 'Running Average',\n range: [1, 100],\n step: 1,\n func: ra\n },\n GS: {\n type: 'GS',\n name: 'Gaussian Smoothing',\n range: [1, 100],\n step: 1,\n func: gs\n }\n}\n\nexport default smooth\n","import { defineStore } from 'pinia'\nimport { computed, ref, shallowRef } from 'vue'\nimport type { LineHoverInfo, LineSmoothInfo, LineThickInfo } from '@/types/board/charts/line'\nimport type { ChartPuzzleModalInfo } from '@/types/board/charts'\nimport type { MediaPlayInfo } from '@/types/board/charts/media'\nimport smooth from '@/board/smooth'\nimport type { Chart, ChartResizeInfo } from '@/types/board/chart'\nimport type { Section } from '@/types/board/section'\nimport type { AddSectionParams, ColumnId, MoveChartParams, SectionType } from '@/types/section'\nimport type { ExperimentConfig } from '@/types/exp'\n\nexport const useBoardStore = defineStore('board', () => {\n // 当前折线图全局平滑,默认不平滑\n const $smooth = shallowRef({ detail: smooth.TWE, value: 0 })\n // 当前折线图全局hover信息\n const $hover = shallowRef(null)\n // 当前折线图全局粗细信息\n const $thick = shallowRef(null)\n // 当前/上一次 模态框信息\n const $modal = shallowRef(null)\n // 当前播放的媒体资源信息\n const $play = shallowRef(null)\n // 更改大小\n const $resize = shallowRef(null)\n\n // 判断是否在交互中\n const interacting = computed(() => !!$hover.value || !!$modal.value || !!$play.value || !!$resize.value)\n // 侧边栏是否打开\n // TODO 后续换成更细粒度的字符串状态,因为侧边栏有多种状态\n const sidebarOpen = ref(false)\n // ---------------------------------- action ----------------------------------\n /**\n * 关闭模态框,可用 $onAction 监听此函数的调用\n * 这用于在模态框内部关闭模态框——即使这个函数不做任何事情\n */\n const closeModal = () => {}\n\n /**\n * 更新section配置,外部通过 $onAction 监听此函数的调用,获取事件和参数\n */\n const updateSection = (...args: [section: Partial
]) => {\n // 仅仅为了让eslint满意\n void args\n }\n\n /**\n * 移动图表,外部通过 $onAction 监听此函数的调用,获取事件和参数\n */\n const moveChart = (...args: [params: MoveChartParams]) => {\n // 仅仅为了让eslint满意\n void args\n }\n\n /**\n * 下载csv文件\n */\n const downloadCsv = (...args: [chart: Chart, columnIds: ColumnId[]]) => {\n // 仅仅为了让eslint满意\n void args\n }\n\n /**\n * 更新实验配置\n */\n const updateExpConfig = (...args: [config: Partial]) => {\n void args\n }\n\n /**\n * 添加一个新的section\n * @params type section的类型,主要是为了处理PINNED和HIDDEN类型的section的一些特殊情况吗,传入undefined或者其他类型代表不做特殊处理\n * @params params section的参数,与接口有关\n */\n const addSection = (...args: [type: SectionType | undefined, params: AddSectionParams]) => {\n void args\n }\n /**\n * 删除一个section\n */\n const deleteSection = (...args: [index: Section['index']]) => {\n void args\n }\n\n // 清空board状态\n const $reset = () => {\n console.log('Reset board states')\n sidebarOpen.value = false\n $smooth.value = { detail: smooth.TWE, value: 0 }\n $hover.value = null\n $thick.value = null\n $modal.value = null\n $play.value = null\n }\n\n return {\n $smooth,\n $hover,\n $thick,\n $modal,\n $play,\n $resize,\n interacting,\n sidebarOpen,\n $reset,\n closeModal,\n updateSection,\n moveChart,\n downloadCsv,\n updateExpConfig,\n addSection,\n deleteSection\n }\n})\n"],"names":["sqrt2PI","Math","sqrt","PI","gaussian","x","stdDev","exp","pow","checkIsSmoothing","smooth","detail","type","value","range","NULL","name","TWE","step","func","data","container","smoothingWeight","min","debiasWeight","lastY","metrics","length","NaN","forEach","metric","index","prevX","changeInX","smoothingWeightAdj","push","_last","RA","w","floor","floorX","ceilX","nowIndex","sum","i","max","GS","weightSum","useBoardStore","defineStore","$smooth","shallowRef","$hover","$thick","$modal","$play","$resize","interacting","computed","sidebarOpen","ref","$reset","closeModal","updateSection","args","moveChart","downloadCsv","updateExpConfig","addSection","deleteSection"],"mappings":"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"}