velo-plot 1.12.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/{index.core-xiNcuFfJ.js → ChartCore-DQ691eXH.js} +1807 -1287
- package/dist/ChartCore-DQ691eXH.js.map +1 -0
- package/dist/assets/downsample.worker-C70QJ04y.js +2 -0
- package/dist/assets/downsample.worker-C70QJ04y.js.map +1 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js +2 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -0
- package/dist/core/OverlayRenderer.d.ts +2 -0
- package/dist/core/chart/ChartAlerts.d.ts +42 -0
- package/dist/core/chart/ChartCore.d.ts +20 -1
- package/dist/core/chart/ChartRenderLoop.d.ts +4 -2
- package/dist/core/chart/ChartRenderer.d.ts +3 -2
- package/dist/core/chart/candlestickMarkers.d.ts +23 -0
- package/dist/core/chart/exporter/SVGExporter.d.ts +7 -2
- package/dist/core/chart/heikinAshi.d.ts +10 -0
- package/dist/core/chart/series/types.d.ts +2 -2
- package/dist/core/chart/types.d.ts +9 -0
- package/dist/core/indicator/addIndicator.d.ts +36 -0
- package/dist/core/indicator/index.d.ts +2 -0
- package/dist/core/indicator/indicatorPresets.d.ts +37 -0
- package/dist/core/render/pixelSnap.d.ts +8 -0
- package/dist/core/series/Series.d.ts +3 -0
- package/dist/core/stacked/index.d.ts +3 -1
- package/dist/core/stacked/paneResize.d.ts +15 -18
- package/dist/core/stacked/stackExport.d.ts +18 -0
- package/dist/core/stacked/types.d.ts +42 -5
- package/dist/core/time/TimeScale.d.ts +31 -0
- package/dist/createStackedChart-BPooTQ9z.js +1164 -0
- package/dist/createStackedChart-BPooTQ9z.js.map +1 -0
- package/dist/gpu/adapter/gpuRenderer.d.ts +21 -0
- package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +2 -1
- package/dist/gpuRenderer-BpaMYz-k.js +1848 -0
- package/dist/gpuRenderer-BpaMYz-k.js.map +1 -0
- package/dist/index-CUGS98p4.js +277 -0
- package/dist/index-CUGS98p4.js.map +1 -0
- package/dist/index-D7dTq6VB.js +503 -0
- package/dist/index-D7dTq6VB.js.map +1 -0
- package/dist/{index-Ce2JgkH_.js → index-DoYxf1cV.js} +86 -43
- package/dist/{index-Ce2JgkH_.js.map → index-DoYxf1cV.js.map} +1 -1
- package/dist/index.core-BtGFYMOu.js +167 -0
- package/dist/index.core-BtGFYMOu.js.map +1 -0
- package/dist/index.d.ts +12 -4
- package/dist/indicators--eJGmVox.js +302 -0
- package/dist/indicators--eJGmVox.js.map +1 -0
- package/dist/math-Ddm2EZjj.js +85 -0
- package/dist/math-Ddm2EZjj.js.map +1 -0
- package/dist/plugins/analysis.js +543 -818
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/anomaly-detection.d.ts +1 -0
- package/dist/plugins/anomaly-detection.js +221 -0
- package/dist/plugins/anomaly-detection.js.map +1 -0
- package/dist/plugins/broken-axis.d.ts +3 -0
- package/dist/plugins/broken-axis.js +262 -0
- package/dist/plugins/broken-axis.js.map +1 -0
- package/dist/plugins/caching.d.ts +3 -0
- package/dist/plugins/caching.js +187 -0
- package/dist/plugins/caching.js.map +1 -0
- package/dist/plugins/data-transform.d.ts +3 -0
- package/dist/plugins/data-transform.js +146 -0
- package/dist/plugins/data-transform.js.map +1 -0
- package/dist/plugins/debug.js +12 -11
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/drawing-tools/index.d.ts +16 -0
- package/dist/plugins/forecasting.d.ts +1 -0
- package/dist/plugins/forecasting.js +236 -0
- package/dist/plugins/forecasting.js.map +1 -0
- package/dist/plugins/gpu.js +202 -1895
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/keyboard/index.d.ts +1 -7
- package/dist/plugins/keyboard.js +1 -1
- package/dist/plugins/latex.d.ts +1 -0
- package/dist/plugins/latex.js +454 -0
- package/dist/plugins/latex.js.map +1 -0
- package/dist/plugins/lazy-load/types.d.ts +7 -0
- package/dist/plugins/lazy-load.d.ts +3 -0
- package/dist/plugins/lazy-load.js +212 -0
- package/dist/plugins/lazy-load.js.map +1 -0
- package/dist/plugins/ml-integration.d.ts +3 -0
- package/dist/plugins/ml-integration.js +355 -0
- package/dist/plugins/ml-integration.js.map +1 -0
- package/dist/plugins/offscreen.d.ts +3 -0
- package/dist/plugins/offscreen.js +169 -0
- package/dist/plugins/offscreen.js.map +1 -0
- package/dist/plugins/pattern-recognition.d.ts +3 -0
- package/dist/plugins/pattern-recognition.js +690 -0
- package/dist/plugins/pattern-recognition.js.map +1 -0
- package/dist/plugins/radar.d.ts +3 -0
- package/dist/plugins/radar.js +103 -0
- package/dist/plugins/radar.js.map +1 -0
- package/dist/plugins/regression.d.ts +3 -0
- package/dist/plugins/regression.js +634 -0
- package/dist/plugins/regression.js.map +1 -0
- package/dist/plugins/replay/index.d.ts +19 -0
- package/dist/plugins/roi.d.ts +1 -0
- package/dist/plugins/roi.js +223 -0
- package/dist/plugins/roi.js.map +1 -0
- package/dist/plugins/snapshot/types.d.ts +1 -1
- package/dist/plugins/snapshot.d.ts +3 -0
- package/dist/plugins/snapshot.js +90 -0
- package/dist/plugins/snapshot.js.map +1 -0
- package/dist/plugins/sync/index.d.ts +2 -1
- package/dist/plugins/sync.js +13 -269
- package/dist/plugins/sync.js.map +1 -1
- package/dist/plugins/video-recorder.d.ts +3 -0
- package/dist/plugins/video-recorder.js +104 -0
- package/dist/plugins/video-recorder.js.map +1 -0
- package/dist/plugins/virtualization/types.d.ts +12 -0
- package/dist/plugins/virtualization.d.ts +3 -0
- package/dist/plugins/virtualization.js +6 -0
- package/dist/plugins/virtualization.js.map +1 -0
- package/dist/pool-15HMCNv8.js +88 -0
- package/dist/pool-15HMCNv8.js.map +1 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +31 -0
- package/dist/react.js.map +1 -0
- package/dist/renderer/CandlestickRenderer.d.ts +1 -1
- package/dist/renderer/ChartSeriesRenderer.d.ts +6 -0
- package/dist/renderer/GpuChartRenderer.d.ts +23 -0
- package/dist/renderer/index.d.ts +3 -0
- package/dist/renderer/spike/WebGLGridSpike.d.ts +40 -0
- package/dist/testing/baselines/v1.15.0.json.d.ts +51 -0
- package/dist/testing/gridSpikeBenchmark.d.ts +49 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/rendererBenchmark.d.ts +13 -0
- package/dist/testing/stage1BrowserBench.d.ts +42 -0
- package/dist/types.d.ts +21 -1
- package/dist/utils-BK5UUXxj.js +172 -0
- package/dist/utils-BK5UUXxj.js.map +1 -0
- package/dist/velo-plot.full.js +1382 -5932
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +26 -25
- package/dist/velo-plot.js.map +1 -1
- package/dist/workers/downsample.d.ts +38 -0
- package/dist/workers/downsampleAsync.d.ts +6 -0
- package/dist/workers/indicator.worker.d.ts +32 -0
- package/dist/workers/indicatorsAsync.d.ts +26 -0
- package/dist/workers/pool.d.ts +36 -0
- package/package.json +19 -2
- package/dist/core/OverlayRenderer.test.d.ts +0 -1
- package/dist/core/chart/ChartScaling.test.d.ts +0 -1
- package/dist/core/chart/NavigationUtils.test.d.ts +0 -1
- package/dist/core/format/axisFormat.test.d.ts +0 -1
- package/dist/core/indicator/buildIndicatorSeries.test.d.ts +0 -1
- package/dist/core/series/SeriesBounds.test.d.ts +0 -1
- package/dist/core/stacked/createStackedChart.test.d.ts +0 -1
- package/dist/core/stacked/paneAxis.test.d.ts +0 -1
- package/dist/core/stacked/paneResize.test.d.ts +0 -1
- package/dist/core/sync/index.test.d.ts +0 -1
- package/dist/index.core-xiNcuFfJ.js.map +0 -1
- package/dist/plugins/tools/tooltip/format.test.d.ts +0 -1
- package/dist/utils-Dbro9-qM.js +0 -254
- package/dist/utils-Dbro9-qM.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-recognition.js","sources":["../../src/plugins/pattern-recognition/patterns.ts","../../src/plugins/pattern-recognition/index.ts"],"sourcesContent":["/**\n * Pattern Recognition Plugin - Pattern Definitions\n * \n * Implements common technical analysis patterns for financial and scientific data.\n * Includes head-shoulders, double tops/bottoms, triangles, and more.\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type {\n PatternDefinition,\n PatternType,\n PatternPoint,\n PatternValidationResult,\n PatternSegment,\n PatternMeasurements\n} from './types';\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction findPeaksAndValleys(points: PatternPoint[]): { peaks: PatternPoint[], valleys: PatternPoint[] } {\n const peaks: PatternPoint[] = [];\n const valleys: PatternPoint[] = [];\n \n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n const next = points[i + 1];\n \n // Peak detection\n if (curr.y > prev.y && curr.y > next.y) {\n peaks.push({ ...curr, type: 'peak' });\n }\n // Valley detection\n else if (curr.y < prev.y && curr.y < next.y) {\n valleys.push({ ...curr, type: 'valley' });\n }\n }\n \n return { peaks, valleys };\n}\n\nfunction calculateSlope(p1: PatternPoint, p2: PatternPoint): number {\n return (p2.y - p1.y) / (p2.x - p1.x);\n}\n\nfunction calculatePatternMeasurements(points: PatternPoint[]): PatternMeasurements {\n const yValues = points.map(p => p.y);\n const xValues = points.map(p => p.x);\n \n const height = Math.max(...yValues) - Math.min(...yValues);\n const width = Math.max(...xValues) - Math.min(...xValues);\n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n return {\n height,\n width,\n slope,\n volumeProfile: {\n increasing: 0.4, // Mock values\n decreasing: 0.3,\n neutral: 0.3\n },\n breakoutTarget: Math.max(...yValues) + height * 0.8,\n stopLoss: Math.min(...yValues) - height * 0.2\n };\n}\n\n// ============================================\n// Head and Shoulders Pattern\n// ============================================\n\nfunction validateHeadShoulders(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for head-shoulders pattern'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n // Need at least 3 peaks and 2 valleys for head-shoulders\n if (peaks.length < 3 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n // Find left shoulder, head, and right shoulder\n const leftShoulder = peaks[0];\n const head = peaks[1];\n const rightShoulder = peaks[2];\n \n // Find the valleys between shoulders and head\n const leftValley = valleys[0];\n const rightValley = valleys[1];\n \n // Validate pattern structure\n const headHigherThanShoulders = head.y > leftShoulder.y && head.y > rightShoulder.y;\n const shouldersApproximatelyEqual = Math.abs(leftShoulder.y - rightShoulder.y) / leftShoulder.y < 0.1;\n const valleyBelowShoulders = leftValley.y < leftShoulder.y && rightValley.y < rightShoulder.y;\n \n if (!headHigherThanShoulders || !shouldersApproximatelyEqual || !valleyBelowShoulders) {\n return { \n valid: false, \n confidence: 0, \n segments: [], \n keyPoints: [], \n errors: ['Invalid head-shoulders structure'] \n };\n }\n \n // Create segments\n const segments: PatternSegment[] = [\n { start: leftShoulder, end: leftValley, type: 'resistance', strength: 0.8 },\n { start: leftValley, end: head, type: 'support', strength: 0.7 },\n { start: head, end: rightValley, type: 'resistance', strength: 0.8 },\n { start: rightValley, end: rightShoulder, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [leftShoulder, leftValley, head, rightValley, rightShoulder];\n const measurements = calculatePatternMeasurements(points);\n \n // Calculate confidence based on pattern symmetry\n const shoulderSymmetry = 1 - Math.abs(leftShoulder.y - rightShoulder.y) / head.y;\n const valleySymmetry = 1 - Math.abs(leftValley.y - rightValley.y) / head.y;\n const confidence = (shoulderSymmetry + valleySymmetry) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Double Top/Bottom Pattern\n// ============================================\n\nfunction validateDoubleTop(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double top'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (peaks.length < 2 || valleys.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstTop = peaks[0];\n const secondTop = peaks[1];\n const valley = valleys[0];\n \n // Validate double top structure\n const topsApproximatelyEqual = Math.abs(firstTop.y - secondTop.y) / firstTop.y < 0.05;\n const valleyBelowTops = valley.y < firstTop.y && valley.y < secondTop.y;\n const significantDrop = (firstTop.y - valley.y) / firstTop.y > 0.1;\n \n if (!topsApproximatelyEqual || !valleyBelowTops || !significantDrop) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double top structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstTop, end: valley, type: 'resistance', strength: 0.9 },\n { start: valley, end: secondTop, type: 'support', strength: 0.8 },\n { start: firstTop, end: secondTop, type: 'resistance', strength: 0.9 }\n ];\n \n const keyPoints = [firstTop, valley, secondTop];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on top equality and depth of valley\n const topEquality = 1 - Math.abs(firstTop.y - secondTop.y) / firstTop.y;\n const depthRatio = (firstTop.y - valley.y) / firstTop.y;\n const confidence = (topEquality + Math.min(depthRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\nfunction validateDoubleBottom(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double bottom'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (valleys.length < 2 || peaks.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstBottom = valleys[0];\n const secondBottom = valleys[1];\n const peak = peaks[0];\n \n // Validate double bottom structure\n const bottomsApproximatelyEqual = Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y < 0.05;\n const peakAboveBottoms = peak.y > firstBottom.y && peak.y > secondBottom.y;\n const significantRise = (peak.y - firstBottom.y) / firstBottom.y > 0.1;\n \n if (!bottomsApproximatelyEqual || !peakAboveBottoms || !significantRise) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double bottom structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstBottom, end: peak, type: 'support', strength: 0.9 },\n { start: peak, end: secondBottom, type: 'resistance', strength: 0.8 },\n { start: firstBottom, end: secondBottom, type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [firstBottom, peak, secondBottom];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on bottom equality and height of peak\n const bottomEquality = 1 - Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y;\n const heightRatio = (peak.y - firstBottom.y) / firstBottom.y;\n const confidence = (bottomEquality + Math.min(heightRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Triangle Patterns\n// ============================================\n\nfunction validateAscendingTriangle(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for ascending triangle'] };\n }\n \n // Find horizontal resistance line and ascending support line\n const yValues = points.map(p => p.y);\n const resistanceLevel = Math.max(...yValues);\n const resistancePoints = points.filter(p => Math.abs(p.y - resistanceLevel) / resistanceLevel < 0.02);\n \n if (resistancePoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient resistance points'] };\n }\n \n // Check for ascending support (higher lows)\n const lows = points.filter((p, i) => i === 0 || p.y < points[i - 1].y);\n if (lows.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient low points'] };\n }\n \n const firstLow = lows[0];\n const lastLow = lows[lows.length - 1];\n const supportSlope = calculateSlope(firstLow, lastLow);\n \n // Support should be ascending (positive slope)\n if (supportSlope <= 0) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Support not ascending'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.8 },\n { start: firstLow, end: lastLow, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [...resistancePoints.slice(0, 2), firstLow, lastLow];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on horizontal resistance and ascending support\n const resistanceFlatness = 1 - Math.abs(resistancePoints[0].y - resistancePoints[resistancePoints.length - 1].y) / resistanceLevel;\n const supportAscending = Math.min(supportSlope / 0.01, 1); // Normalize slope\n const confidence = (resistanceFlatness + supportAscending) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Pattern Definitions Registry\n// ============================================\n\nexport const BUILTIN_PATTERNS: Record<PatternType, PatternDefinition> = {\n 'head-shoulders': {\n id: 'head-shoulders',\n type: 'head-shoulders',\n name: 'Head and Shoulders',\n description: 'Bearish reversal pattern with three peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: validateHeadShoulders\n },\n \n 'inverse-head-shoulders': {\n id: 'inverse-head-shoulders',\n type: 'inverse-head-shoulders',\n name: 'Inverse Head and Shoulders',\n description: 'Bullish reversal pattern with three valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n // Invert points and validate as regular head-shoulders\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateHeadShoulders(invertedPoints);\n return result;\n }\n },\n \n 'double-top': {\n id: 'double-top',\n type: 'double-top',\n name: 'Double Top',\n description: 'Bearish reversal pattern with two equal peaks',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleTop\n },\n \n 'double-bottom': {\n id: 'double-bottom',\n type: 'double-bottom',\n name: 'Double Bottom',\n description: 'Bullish reversal pattern with two equal valleys',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleBottom\n },\n \n 'triple-top': {\n id: 'triple-top',\n type: 'triple-top',\n name: 'Triple Top',\n description: 'Bearish reversal pattern with three equal peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks } = findPeaksAndValleys(points);\n if (peaks.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Need at least 3 peaks'] };\n }\n \n const peak1 = peaks[0].y;\n const peak2 = peaks[1].y;\n const peak3 = peaks[2].y;\n \n const tolerance = 0.05;\n const peaksEqual = Math.abs(peak1 - peak2) / peak1 < tolerance && Math.abs(peak2 - peak3) / peak2 < tolerance;\n \n if (!peaksEqual) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Peaks not equal'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[1], type: 'resistance', strength: 0.8 },\n { start: peaks[1], end: peaks[2], type: 'resistance', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[1], peaks[2]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'triple-bottom': {\n id: 'triple-bottom',\n type: 'triple-bottom',\n name: 'Triple Bottom',\n description: 'Bullish reversal pattern with three equal valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n return BUILTIN_PATTERNS['triple-top'].validator(invertedPoints);\n }\n },\n \n 'ascending-triangle': {\n id: 'ascending-triangle',\n type: 'ascending-triangle',\n name: 'Ascending Triangle',\n description: 'Continuation pattern with horizontal resistance and ascending support',\n minPoints: 4,\n maxPoints: 8,\n validator: validateAscendingTriangle\n },\n \n 'descending-triangle': {\n id: 'descending-triangle',\n type: 'descending-triangle',\n name: 'Descending Triangle',\n description: 'Continuation pattern with horizontal support and descending resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as ascending triangle\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateAscendingTriangle(invertedPoints);\n return result;\n }\n },\n \n 'symmetrical-triangle': {\n id: 'symmetrical-triangle',\n type: 'symmetrical-triangle',\n name: 'Symmetrical Triangle',\n description: 'Continuation pattern with converging support and resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified validation for symmetrical triangle\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n // Check for converging trendlines\n const firstHalf = points.slice(0, Math.floor(points.length / 2));\n const secondHalf = points.slice(Math.floor(points.length / 2));\n \n const firstSlope = calculateSlope(firstHalf[0], firstHalf[firstHalf.length - 1]);\n const secondSlope = calculateSlope(secondHalf[0], secondHalf[secondHalf.length - 1]);\n \n // Slopes should be converging (opposite signs)\n const converging = (firstSlope > 0 && secondSlope < 0) || (firstSlope < 0 && secondSlope > 0);\n \n if (!converging) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Lines not converging'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstHalf[0], end: firstHalf[firstHalf.length - 1], type: 'trendline', strength: 0.7 },\n { start: secondHalf[0], end: secondHalf[secondHalf.length - 1], type: 'trendline', strength: 0.7 }\n ];\n \n const keyPoints = [firstHalf[0], firstHalf[firstHalf.length - 1], secondHalf[0], secondHalf[secondHalf.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.7,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'rising-wedge': {\n id: 'rising-wedge',\n type: 'rising-wedge',\n name: 'Rising Wedge',\n description: 'Bearish reversal pattern with two converging upward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified rising wedge validation\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n if (peaks.length < 2 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const peakSlope = calculateSlope(peaks[0], peaks[peaks.length - 1]);\n const valleySlope = calculateSlope(valleys[0], valleys[valleys.length - 1]);\n \n // Both lines should be rising but converging (valley slope > peak slope)\n const wedgePattern = peakSlope > 0 && valleySlope > 0 && valleySlope > peakSlope;\n \n if (!wedgePattern) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not a rising wedge pattern'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[peaks.length - 1], type: 'resistance', strength: 0.8 },\n { start: valleys[0], end: valleys[valleys.length - 1], type: 'support', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[peaks.length - 1], valleys[0], valleys[valleys.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.75,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'falling-wedge': {\n id: 'falling-wedge',\n type: 'falling-wedge',\n name: 'Falling Wedge',\n description: 'Bullish reversal pattern with two converging downward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as rising wedge\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = BUILTIN_PATTERNS['rising-wedge'].validator(invertedPoints);\n return result;\n }\n },\n \n 'rectangle': {\n id: 'rectangle',\n type: 'rectangle',\n name: 'Rectangle',\n description: 'Continuation pattern with horizontal support and resistance',\n minPoints: 4,\n maxPoints: 10,\n validator: (points) => {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const yValues = points.map(p => p.y);\n const resistance = Math.max(...yValues);\n const support = Math.min(...yValues);\n \n // Check for relatively flat top and bottom\n const resistancePoints = points.filter(p => Math.abs(p.y - resistance) / resistance < 0.05);\n const supportPoints = points.filter(p => Math.abs(p.y - support) / support < 0.05);\n \n if (resistancePoints.length < 2 || supportPoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient horizontal lines'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.9 },\n { start: supportPoints[0], end: supportPoints[supportPoints.length - 1], type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [resistancePoints[0], resistancePoints[resistancePoints.length - 1], supportPoints[0], supportPoints[supportPoints.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'flag': {\n id: 'flag',\n type: 'flag',\n name: 'Flag',\n description: 'Short-term continuation pattern after strong move',\n minPoints: 3,\n maxPoints: 6,\n validator: (points) => {\n // Simplified flag validation\n if (points.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n // Flag should be relatively horizontal (small slope)\n const horizontal = Math.abs(slope) < 0.01;\n \n if (!horizontal) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not horizontal enough'] };\n }\n \n const segments: PatternSegment[] = [\n { start: points[0], end: points[points.length - 1], type: 'trendline', strength: 0.6 }\n ];\n \n const keyPoints = [points[0], points[points.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.6,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'pennant': {\n id: 'pennant',\n type: 'pennant',\n name: 'Pennant',\n description: 'Short-term continuation pattern with converging lines',\n minPoints: 3,\n maxPoints: 5,\n validator: (points) => {\n // Similar to symmetrical triangle but smaller\n return BUILTIN_PATTERNS['symmetrical-triangle'].validator(points);\n }\n },\n \n 'custom': {\n id: 'custom',\n type: 'custom',\n name: 'Custom Pattern',\n description: 'User-defined pattern',\n minPoints: 3,\n validator: (_points) => {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Custom pattern not implemented'] };\n }\n }\n};","/**\n * Pattern Recognition Plugin - Main Implementation\n * \n * Provides technical pattern recognition for financial and scientific data.\n * Supports common chart patterns and custom pattern definitions.\n * \n * @example\n * ```typescript\n * import { PluginPatternRecognition } from 'velo-plot/plugins/pattern-recognition';\n * \n * chart.use(PluginPatternRecognition({\n * defaultParameters: {\n * minConfidence: 0.7,\n * patternTypes: ['head-shoulders', 'double-top', 'ascending-triangle'],\n * sensitivity: 0.5\n * },\n * enableRealtime: true,\n * visualization: {\n * showPatterns: true,\n * showLabels: true,\n * colorScheme: {\n * 'head-shoulders': '#ff6b6b',\n * 'double-top': '#4ecdc4',\n * 'ascending-triangle': '#45b7d1'\n * }\n * }\n * }));\n * \n * // Detect patterns\n * const result = await chart.patterns.detectPatterns('series1', dataPoints);\n * console.log(`Found ${result.matches.length} patterns`);\n * \n * // Enable real-time detection\n * chart.patterns.enableRealtimeDetection('series1');\n * ```\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n BeforeRenderEvent,\n DataUpdateEvent\n} from '../types';\n\nimport type {\n PluginPatternRecognitionConfig,\n PatternRecognitionAPI,\n PatternDetectionResult,\n PatternMatch,\n PatternPoint,\n PatternDetectionParameters,\n PatternType,\n CustomPatternConfig,\n PatternDefinition,\n PatternValidationResult,\n PatternDetectedEvent\n} from './types';\n\nimport { BUILTIN_PATTERNS } from './patterns';\n\n// ============================================\n// Plugin Manifest\n// ============================================\n\nconst manifestPatternRecognition: PluginManifest = {\n name: 'pattern-recognition',\n version: '1.0.0',\n description: 'Technical pattern recognition for financial and scientific data',\n author: 'Sci Plot Team',\n provides: ['patterns', 'technical-analysis', 'chart-patterns']\n};\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_CONFIG: Required<PluginPatternRecognitionConfig> = {\n defaultParameters: {\n minConfidence: 0.7,\n maxPatterns: 10,\n patternTypes: ['head-shoulders', 'double-top', 'double-bottom', 'ascending-triangle', 'descending-triangle'],\n sensitivity: 0.5,\n minPatternSize: 5,\n maxPatternSize: 50,\n overlapTolerance: 0.3,\n enableVolumeConfirmation: false,\n enableTrendConfirmation: true\n },\n customPatterns: [],\n enableRealtime: false,\n debounceTime: 500,\n maxStoredPatterns: 100,\n visualization: {\n showPatterns: true,\n showLabels: true,\n showTargets: true,\n colorScheme: {\n 'head-shoulders': '#ff6b6b',\n 'inverse-head-shoulders': '#4ecdc4',\n 'double-top': '#ff9f43',\n 'double-bottom': '#00d2d3',\n 'triple-top': '#ff6b6b',\n 'triple-bottom': '#4ecdc4',\n 'ascending-triangle': '#45b7d1',\n 'descending-triangle': '#f39c12',\n 'symmetrical-triangle': '#9b59b6',\n 'rising-wedge': '#e74c3c',\n 'falling-wedge': '#27ae60',\n 'rectangle': '#34495e',\n 'flag': '#f1c40f',\n 'pennant': '#e67e22',\n 'custom': '#95a5a6'\n },\n opacity: 0.7,\n lineWidth: 2\n },\n notifications: {\n enableAlerts: false,\n minAlertConfidence: 0.8,\n alertTypes: ['head-shoulders', 'double-top', 'double-bottom']\n }\n};\n\n// ============================================\n// Pattern Recognition Plugin Implementation\n// ============================================\n\nexport function PluginPatternRecognition(\n userConfig: Partial<PluginPatternRecognitionConfig> = {}\n): ChartPlugin<PluginPatternRecognitionConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n // Pattern storage\n const patternMatches = new Map<string, PatternMatch[]>();\n const registeredPatterns = new Map<PatternType, PatternDefinition>(Object.entries(BUILTIN_PATTERNS) as [PatternType, PatternDefinition][]);\n const realtimeSeries = new Set<string>();\n const debounceTimers = new Map<string, any>();\n \n // ============================================\n // Pattern Detection Engine\n // ============================================\n \n async function detectPatterns(\n seriesId: string, \n dataPoints: PatternPoint[], \n parameters?: Partial<PatternDetectionParameters>\n ): Promise<PatternDetectionResult> {\n const params = { ...config.defaultParameters, ...parameters };\n const startTime = performance.now();\n \n const matches: PatternMatch[] = [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n // Preprocess data - find peaks and valleys\n const processedPoints = preprocessData(dataPoints, params.sensitivity);\n \n // Check each pattern type\n for (const patternType of params.patternTypes) {\n const pattern = registeredPatterns.get(patternType);\n if (!pattern) continue;\n \n // Slide window through data\n for (let i = params.minPatternSize; i <= Math.min(processedPoints.length, params.maxPatternSize); i++) {\n const window = processedPoints.slice(Math.max(0, i - params.maxPatternSize), i);\n \n if (window.length < pattern.minPoints) continue;\n if (pattern.maxPoints && window.length > pattern.maxPoints) continue;\n \n // Validate pattern\n const validation = pattern.validator(window);\n \n if (validation.valid && validation.confidence >= params.minConfidence) {\n const match: PatternMatch = {\n pattern,\n confidence: validation.confidence,\n location: {\n startIndex: Math.max(0, i - params.maxPatternSize),\n endIndex: i,\n startPoint: window[0],\n endPoint: window[window.length - 1]\n },\n validation,\n timestamp: Date.now(),\n seriesId\n };\n \n // Check for overlaps\n if (!hasSignificantOverlap(match, matches, params.overlapTolerance)) {\n matches.push(match);\n patternsByType[patternType] = (patternsByType[patternType] || 0) + 1;\n \n // Limit number of patterns\n if (matches.length >= params.maxPatterns!) {\n break;\n }\n }\n }\n }\n \n if (matches.length >= params.maxPatterns!) {\n break;\n }\n }\n \n // Sort by confidence\n matches.sort((a, b) => b.confidence - a.confidence);\n \n // Store matches\n patternMatches.set(seriesId, matches);\n \n const detectionTime = performance.now() - startTime;\n \n // Emit events for high-confidence patterns\n for (const match of matches) {\n if (match.confidence >= config.notifications.minAlertConfidence &&\n config.notifications.alertTypes.includes(match.pattern.type)) {\n ctx?.events.emit('pattern:detected', {\n match,\n seriesId,\n timestamp: Date.now()\n } as PatternDetectedEvent);\n }\n }\n \n const result: PatternDetectionResult = {\n matches,\n summary: {\n totalPatterns: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionTime\n },\n processedPoints: processedPoints.length,\n parameters: params\n };\n \n ctx?.log.info(`Pattern detection completed for ${seriesId}: ${matches.length} patterns found`);\n \n return result;\n }\n \n function preprocessData(dataPoints: PatternPoint[], sensitivity: number): PatternPoint[] {\n return dataPoints.filter((point, index) => {\n if (index === 0 || index === dataPoints.length - 1) return true;\n \n const prev = dataPoints[index - 1];\n \n const priceChange = Math.abs(point.y - prev.y) / prev.y;\n return priceChange >= sensitivity * 0.01;\n });\n }\n \n function hasSignificantOverlap(newMatch: PatternMatch, existingMatches: PatternMatch[], tolerance: number): boolean {\n for (const existing of existingMatches) {\n const overlapStart = Math.max(newMatch.location.startIndex, existing.location.startIndex);\n const overlapEnd = Math.min(newMatch.location.endIndex, existing.location.endIndex);\n const overlapSize = overlapEnd - overlapStart;\n \n const newMatchSize = newMatch.location.endIndex - newMatch.location.startIndex;\n const existingMatchSize = existing.location.endIndex - existing.location.startIndex;\n \n const overlapRatio = overlapSize / Math.min(newMatchSize, existingMatchSize);\n \n if (overlapRatio > tolerance) {\n return true;\n }\n }\n return false;\n }\n \n // ============================================\n // Custom Pattern Registration\n // ============================================\n \n function registerCustomPattern(customConfig: CustomPatternConfig): void {\n const pattern: PatternDefinition = {\n id: customConfig.id,\n type: 'custom',\n name: customConfig.name,\n minPoints: customConfig.pointSequence.length,\n maxPoints: customConfig.pointSequence.length,\n validator: (points) => validateCustomPattern(points, customConfig)\n };\n \n registeredPatterns.set('custom', pattern);\n ctx?.log.info(`Custom pattern registered: ${customConfig.id}`);\n }\n \n function validateCustomPattern(points: PatternPoint[], config: CustomPatternConfig): PatternValidationResult {\n if (points.length < config.pointSequence.length) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n let confidence = 1.0;\n const errors: string[] = [];\n \n for (let i = 0; i < config.pointSequence.length; i++) {\n const sequencePoint = config.pointSequence[i];\n const actualPoint = points[i];\n \n if (sequencePoint.constraints) {\n const constraints = sequencePoint.constraints;\n \n if (constraints.higherThanPrevious && i > 0) {\n if (actualPoint.y <= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not higher than previous`);\n }\n }\n \n if (constraints.lowerThanPrevious && i > 0) {\n if (actualPoint.y >= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not lower than previous`);\n }\n }\n \n if (constraints.withinRange) {\n const [min, max] = constraints.withinRange;\n if (actualPoint.y < min || actualPoint.y > max) {\n confidence *= 0.7;\n errors.push(`Point ${i} not within range [${min}, ${max}]`);\n }\n }\n }\n }\n \n return {\n valid: confidence >= 0.5,\n confidence,\n segments: [],\n keyPoints: points,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n \n // ============================================\n // API Implementation\n // ============================================\n \n const api: PatternRecognitionAPI & Record<string, unknown> = {\n detectPatterns,\n \n registerCustomPattern,\n \n getRegisteredPatterns(): PatternDefinition[] {\n return Array.from(registeredPatterns.values());\n },\n \n getPatternMatches(seriesId: string): PatternMatch[] {\n return patternMatches.get(seriesId) || [];\n },\n \n clearPatternMatches(seriesId: string): void {\n patternMatches.delete(seriesId);\n ctx?.log.info(`Pattern matches cleared for series: ${seriesId}`);\n },\n \n enableRealtimeDetection(seriesId: string, parameters?: Partial<PatternDetectionParameters>): void {\n realtimeSeries.add(seriesId);\n \n const chart = ctx?.chart;\n if (chart) {\n const targetSeries = chart.getSeries(seriesId);\n if (targetSeries) {\n const data = targetSeries.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points, parameters);\n }\n }\n }\n \n ctx?.log.info(`Real-time pattern detection enabled for series: ${seriesId}`);\n },\n \n disableRealtimeDetection(seriesId: string): void {\n realtimeSeries.delete(seriesId);\n \n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n debounceTimers.delete(seriesId);\n }\n \n ctx?.log.info(`Real-time pattern detection disabled for series: ${seriesId}`);\n },\n \n getStatistics(seriesId?: string) {\n if (seriesId) {\n const matches = patternMatches.get(seriesId) || [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n for (const match of matches) {\n patternsByType[match.pattern.type] = (patternsByType[match.pattern.type] || 0) + 1;\n }\n \n return {\n totalDetections: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionRate: matches.length / 100\n };\n } else {\n let totalDetections = 0;\n const allPatternsByType: Record<PatternType, number> = {} as any;\n const allConfidences: number[] = [];\n \n for (const matches of patternMatches.values()) {\n totalDetections += matches.length;\n allConfidences.push(...matches.map(m => m.confidence));\n \n for (const match of matches) {\n allPatternsByType[match.pattern.type] = (allPatternsByType[match.pattern.type] || 0) + 1;\n }\n }\n \n return {\n totalDetections,\n patternsByType: allPatternsByType,\n averageConfidence: allConfidences.length > 0 ? allConfidences.reduce((sum, c) => sum + c, 0) / allConfidences.length : 0,\n detectionRate: totalDetections / 100\n };\n }\n },\n \n updateConfig: (newConfig: Partial<PluginPatternRecognitionConfig>) => {\n Object.assign(config, newConfig);\n },\n \n getConfig: () => ({ ...config }),\n \n visualizePatterns(seriesId: string, showTypes?: PatternType[]): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n const filteredMatches = showTypes ? matches.filter(m => showTypes.includes(m.pattern.type)) : matches;\n \n api.hidePatterns(seriesId);\n \n for (const match of filteredMatches) {\n const color = config.visualization.colorScheme[match.pattern.type] || '#666666';\n \n for (const segment of match.validation.segments) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n \n chart.addSeries({\n id: lineId,\n type: 'line',\n data: {\n x: new Float32Array([segment.start.x, segment.end.x]),\n y: new Float32Array([segment.start.y, segment.end.y])\n },\n style: {\n color,\n width: config.visualization.lineWidth,\n opacity: config.visualization.opacity,\n lineDash: [5, 5]\n }\n });\n }\n \n if (config.visualization.showLabels) {\n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n const centerX = (match.location.startPoint.x + match.location.endPoint.x) / 2;\n const centerY = (match.location.startPoint.y + match.location.endPoint.y) / 2;\n \n chart.addAnnotation({\n id: labelId,\n type: 'text',\n text: match.pattern.name,\n x: centerX,\n y: centerY,\n style: {\n color,\n fontSize: 12,\n backgroundColor: 'rgba(255, 255, 255, 0.8)'\n }\n } as any);\n }\n }\n },\n \n hidePatterns(seriesId: string): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n \n for (const match of matches) {\n for (let i = 0; i < match.validation.segments.length; i++) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getSeries(lineId)) {\n chart.removeSeries(lineId);\n }\n }\n \n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getAnnotation(labelId)) {\n chart.removeAnnotation(labelId);\n }\n }\n }\n };\n \n // ============================================\n // Event Handlers\n // ============================================\n \n function handleDataUpdate(context: PluginContext, event: DataUpdateEvent): void {\n if (!config.enableRealtime) return;\n \n const { seriesId } = event;\n \n if (realtimeSeries.has(seriesId)) {\n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n }\n \n const newTimer = setTimeout(() => {\n const chart = context.chart;\n if (chart) {\n const series = chart.getSeries(seriesId);\n if (series) {\n const data = series.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points);\n \n if (config.visualization.showPatterns) {\n api.visualizePatterns(seriesId);\n }\n }\n }\n }\n }, config.debounceTime);\n \n debounceTimers.set(seriesId, newTimer);\n }\n }\n \n // ============================================\n // Plugin Definition\n // ============================================\n \n return {\n manifest: manifestPatternRecognition,\n \n onInit(context: PluginContext) {\n ctx = context;\n \n if (config.customPatterns) {\n for (const customPattern of config.customPatterns) {\n registerCustomPattern(customPattern);\n }\n }\n \n ctx.log.info(`Pattern Recognition plugin initialized with ${registeredPatterns.size} patterns`);\n },\n \n onConfigChange(_context: PluginContext, _newConfig: PluginPatternRecognitionConfig) {\n // Handle config changes\n },\n \n onBeforeRender(_context: PluginContext, _event: BeforeRenderEvent) {\n // Handle pre-render tasks if needed\n },\n \n onDataUpdate: handleDataUpdate,\n \n onDestroy(_context: PluginContext) {\n for (const timer of debounceTimers.values()) {\n clearTimeout(timer);\n }\n debounceTimers.clear();\n \n patternMatches.clear();\n realtimeSeries.clear();\n registeredPatterns.clear();\n },\n \n api\n };\n}\n\nexport default PluginPatternRecognition;\n\nexport type {\n PatternType,\n PatternDefinition,\n PatternPoint,\n PatternSegment,\n PatternValidationResult,\n PatternMeasurements,\n PatternMatch,\n PatternDetectionResult,\n PatternDetectionParameters,\n CustomPatternConfig,\n PluginPatternRecognitionConfig,\n PatternDetectedEvent,\n PatternCompletedEvent,\n PatternFailedEvent,\n PatternRecognitionAPI\n} from './types';\n"],"names":["findPeaksAndValleys","points","peaks","valleys","i","prev","curr","next","calculateSlope","p1","p2","calculatePatternMeasurements","yValues","p","xValues","height","width","slope","validateHeadShoulders","leftShoulder","head","rightShoulder","leftValley","rightValley","headHigherThanShoulders","shouldersApproximatelyEqual","valleyBelowShoulders","segments","keyPoints","measurements","shoulderSymmetry","valleySymmetry","validateDoubleTop","firstTop","secondTop","valley","topsApproximatelyEqual","valleyBelowTops","significantDrop","topEquality","depthRatio","validateDoubleBottom","firstBottom","secondBottom","peak","bottomsApproximatelyEqual","peakAboveBottoms","significantRise","bottomEquality","heightRatio","validateAscendingTriangle","resistanceLevel","resistancePoints","lows","firstLow","lastLow","supportSlope","resistanceFlatness","supportAscending","BUILTIN_PATTERNS","invertedPoints","peak1","peak2","peak3","tolerance","firstHalf","secondHalf","firstSlope","secondSlope","peakSlope","valleySlope","resistance","support","supportPoints","_points","manifestPatternRecognition","DEFAULT_CONFIG","PluginPatternRecognition","userConfig","config","ctx","patternMatches","registeredPatterns","realtimeSeries","debounceTimers","detectPatterns","seriesId","dataPoints","parameters","params","startTime","matches","patternsByType","processedPoints","preprocessData","patternType","pattern","window","validation","match","hasSignificantOverlap","a","b","detectionTime","result","sum","m","sensitivity","point","index","newMatch","existingMatches","existing","overlapStart","overlapSize","newMatchSize","existingMatchSize","registerCustomPattern","customConfig","validateCustomPattern","confidence","errors","sequencePoint","actualPoint","constraints","min","max","api","chart","targetSeries","data","x","timer","totalDetections","allPatternsByType","allConfidences","newConfig","showTypes","filteredMatches","color","segment","lineId","labelId","centerX","centerY","handleDataUpdate","context","event","newTimer","series","customPattern","_context","_newConfig","_event"],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const D = {
|
|
2
|
+
name: "velo-plot-radar",
|
|
3
|
+
version: "1.0.0",
|
|
4
|
+
description: "Advanced Radar/Spider Charts for velo-plot",
|
|
5
|
+
provides: ["radar", "spider-chart"],
|
|
6
|
+
tags: ["radar", "visualization", "comparison"]
|
|
7
|
+
}, k = {
|
|
8
|
+
categories: [],
|
|
9
|
+
maxValue: 100,
|
|
10
|
+
minValue: 0,
|
|
11
|
+
gridLevels: 5,
|
|
12
|
+
showLabels: !0,
|
|
13
|
+
labelStyle: {
|
|
14
|
+
fontSize: 12,
|
|
15
|
+
color: "#94a3b8",
|
|
16
|
+
fontFamily: "Inter, system-ui, sans-serif"
|
|
17
|
+
},
|
|
18
|
+
gridStyle: {
|
|
19
|
+
color: "rgba(255, 255, 255, 0.1)",
|
|
20
|
+
width: 1,
|
|
21
|
+
lineDash: []
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
function C(L = {}) {
|
|
25
|
+
const i = { ...k, ...L };
|
|
26
|
+
let a = null;
|
|
27
|
+
const p = /* @__PURE__ */ new Map();
|
|
28
|
+
function T(o) {
|
|
29
|
+
var v, M, y, x, P, R;
|
|
30
|
+
const { render: h } = o, { ctx2d: e, plotArea: d } = h;
|
|
31
|
+
if (!e) return;
|
|
32
|
+
const f = d.x + d.width / 2, g = d.y + d.height / 2, u = Math.min(d.width, d.height) / 2 * 0.8, S = i.categories.length;
|
|
33
|
+
if (S === 0) return;
|
|
34
|
+
const b = 2 * Math.PI / S;
|
|
35
|
+
e.save(), e.strokeStyle = ((v = i.gridStyle) == null ? void 0 : v.color) || "rgba(255, 255, 255, 0.1)", e.lineWidth = ((M = i.gridStyle) == null ? void 0 : M.width) || 1, (y = i.gridStyle) != null && y.lineDash && i.gridStyle.lineDash.length > 0 && e.setLineDash(i.gridStyle.lineDash);
|
|
36
|
+
for (let s = 1; s <= i.gridLevels; s++) {
|
|
37
|
+
const r = s / i.gridLevels * u;
|
|
38
|
+
e.beginPath();
|
|
39
|
+
for (let t = 0; t < S; t++) {
|
|
40
|
+
const l = t * b - Math.PI / 2, n = f + r * Math.cos(l), c = g + r * Math.sin(l);
|
|
41
|
+
t === 0 ? e.moveTo(n, c) : e.lineTo(n, c);
|
|
42
|
+
}
|
|
43
|
+
e.closePath(), e.stroke();
|
|
44
|
+
}
|
|
45
|
+
e.setLineDash([]);
|
|
46
|
+
for (let s = 0; s < S; s++) {
|
|
47
|
+
const r = s * b - Math.PI / 2, t = f + u * Math.cos(r), l = g + u * Math.sin(r);
|
|
48
|
+
if (e.beginPath(), e.moveTo(f, g), e.lineTo(t, l), e.stroke(), i.showLabels) {
|
|
49
|
+
const n = u + 25, c = f + n * Math.cos(r), m = g + n * Math.sin(r);
|
|
50
|
+
e.fillStyle = ((x = i.labelStyle) == null ? void 0 : x.color) || "#94a3b8", e.font = `${((P = i.labelStyle) == null ? void 0 : P.fontSize) || 12}px ${((R = i.labelStyle) == null ? void 0 : R.fontFamily) || "sans-serif"}`, e.textAlign = Math.abs(Math.cos(r)) < 0.1 ? "center" : Math.cos(r) > 0 ? "left" : "right", e.textBaseline = Math.abs(Math.sin(r)) < 0.1 ? "middle" : Math.sin(r) > 0 ? "top" : "bottom", e.fillText(i.categories[s], c, m);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
p.forEach((s) => {
|
|
54
|
+
const { points: r, style: t } = s;
|
|
55
|
+
if (r.length === 0) return;
|
|
56
|
+
const l = [];
|
|
57
|
+
i.categories.forEach((n, c) => {
|
|
58
|
+
const m = r.find((A) => A.category === n), w = (m ? m.value : 0) / i.maxValue * u, I = c * b - Math.PI / 2;
|
|
59
|
+
l.push({
|
|
60
|
+
x: f + w * Math.cos(I),
|
|
61
|
+
y: g + w * Math.sin(I)
|
|
62
|
+
});
|
|
63
|
+
}), e.beginPath(), l.forEach((n, c) => {
|
|
64
|
+
c === 0 ? e.moveTo(n.x, n.y) : e.lineTo(n.x, n.y);
|
|
65
|
+
}), e.closePath(), e.fillStyle = (t == null ? void 0 : t.fillColor) || (t != null && t.color ? `${t.color}33` : "rgba(0, 242, 255, 0.2)"), e.fill(), e.strokeStyle = (t == null ? void 0 : t.color) || "#00f2ff", e.lineWidth = (t == null ? void 0 : t.width) || 2, e.globalAlpha = (t == null ? void 0 : t.opacity) || 1, e.stroke(), ((t == null ? void 0 : t.pointSize) || 0) > 0 && (e.fillStyle = (t == null ? void 0 : t.color) || "#00f2ff", l.forEach((n) => {
|
|
66
|
+
e.beginPath(), e.arc(n.x, n.y, t.pointSize / 2, 0, Math.PI * 2), e.fill();
|
|
67
|
+
}));
|
|
68
|
+
}), e.restore();
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
manifest: D,
|
|
72
|
+
onInit(o) {
|
|
73
|
+
a = o, a.chart.updateXAxis({ visible: !1, min: -1.2, max: 1.2 }), a.chart.updateYAxis("default", { visible: !1, min: -1.2, max: 1.2 });
|
|
74
|
+
},
|
|
75
|
+
onRenderOverlay(o, h) {
|
|
76
|
+
T(o);
|
|
77
|
+
},
|
|
78
|
+
api: {
|
|
79
|
+
addSeries(o) {
|
|
80
|
+
return p.set(o.id, o), a == null || a.requestRender(), o.id;
|
|
81
|
+
},
|
|
82
|
+
removeSeries(o) {
|
|
83
|
+
const h = p.delete(o);
|
|
84
|
+
return h && (a == null || a.requestRender()), h;
|
|
85
|
+
},
|
|
86
|
+
updateSeries(o, h) {
|
|
87
|
+
const e = p.get(o);
|
|
88
|
+
return e ? (e.points = h, a == null || a.requestRender(), !0) : !1;
|
|
89
|
+
},
|
|
90
|
+
setCategories(o) {
|
|
91
|
+
i.categories = o, a == null || a.requestRender();
|
|
92
|
+
},
|
|
93
|
+
setMaxValue(o) {
|
|
94
|
+
i.maxValue = o, a == null || a.requestRender();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export {
|
|
100
|
+
C as PluginRadar,
|
|
101
|
+
C as default
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=radar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radar.js","sources":["../../src/plugins/radar/index.ts"],"sourcesContent":["import type { \n PluginRadarConfig, \n RadarAPI, \n RadarSeriesData, \n RadarPoint \n} from './types';\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n AfterRenderEvent\n} from '../types';\n\nconst manifestRadar: PluginManifest = {\n name: \"velo-plot-radar\",\n version: \"1.0.0\",\n description: \"Advanced Radar/Spider Charts for velo-plot\",\n provides: [\"radar\", \"spider-chart\"],\n tags: [\"radar\", \"visualization\", \"comparison\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginRadarConfig> = {\n categories: [],\n maxValue: 100,\n minValue: 0,\n gridLevels: 5,\n showLabels: true,\n labelStyle: {\n fontSize: 12,\n color: '#94a3b8',\n fontFamily: 'Inter, system-ui, sans-serif'\n },\n gridStyle: {\n color: 'rgba(255, 255, 255, 0.1)',\n width: 1,\n lineDash: []\n }\n};\n\nexport function PluginRadar(\n userConfig: Partial<PluginRadarConfig> = {}\n): ChartPlugin<PluginRadarConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n const radarSeries = new Map<string, RadarSeriesData>();\n\n // ============================================\n // Drawing Logic\n // ============================================\n\n function drawRadar(pCtx: PluginContext) {\n const { render } = pCtx;\n const { ctx2d, plotArea } = render;\n\n if (!ctx2d) return;\n\n const centerX = plotArea.x + plotArea.width / 2;\n const centerY = plotArea.y + plotArea.height / 2;\n const maxRadiusPixels = Math.min(plotArea.width, plotArea.height) / 2 * 0.8;\n const numCategories = config.categories.length;\n \n if (numCategories === 0) return;\n const angleStep = (2 * Math.PI) / numCategories;\n\n ctx2d.save();\n \n // 1. Draw Grid (Levels)\n ctx2d.strokeStyle = config.gridStyle?.color || 'rgba(255, 255, 255, 0.1)';\n ctx2d.lineWidth = config.gridStyle?.width || 1;\n if (config.gridStyle?.lineDash && config.gridStyle.lineDash.length > 0) {\n ctx2d.setLineDash(config.gridStyle.lineDash);\n }\n\n for (let level = 1; level <= config.gridLevels; level++) {\n const radius = (level / config.gridLevels) * maxRadiusPixels;\n ctx2d.beginPath();\n for (let i = 0; i < numCategories; i++) {\n const angle = i * angleStep - Math.PI / 2;\n const px = centerX + radius * Math.cos(angle);\n const py = centerY + radius * Math.sin(angle);\n if (i === 0) ctx2d.moveTo(px, py);\n else ctx2d.lineTo(px, py);\n }\n ctx2d.closePath();\n ctx2d.stroke();\n }\n\n // 2. Draw Spokes and Labels\n ctx2d.setLineDash([]);\n for (let i = 0; i < numCategories; i++) {\n const angle = i * angleStep - Math.PI / 2;\n const px = centerX + maxRadiusPixels * Math.cos(angle);\n const py = centerY + maxRadiusPixels * Math.sin(angle);\n \n ctx2d.beginPath();\n ctx2d.moveTo(centerX, centerY);\n ctx2d.lineTo(px, py);\n ctx2d.stroke();\n\n if (config.showLabels) {\n const labelRadius = maxRadiusPixels + 25;\n const lx = centerX + labelRadius * Math.cos(angle);\n const ly = centerY + labelRadius * Math.sin(angle);\n \n ctx2d.fillStyle = config.labelStyle?.color || '#94a3b8';\n ctx2d.font = `${config.labelStyle?.fontSize || 12}px ${config.labelStyle?.fontFamily || 'sans-serif'}`;\n ctx2d.textAlign = Math.abs(Math.cos(angle)) < 0.1 ? \"center\" : (Math.cos(angle) > 0 ? \"left\" : \"right\");\n ctx2d.textBaseline = Math.abs(Math.sin(angle)) < 0.1 ? \"middle\" : (Math.sin(angle) > 0 ? \"top\" : \"bottom\");\n ctx2d.fillText(config.categories[i], lx, ly);\n }\n }\n\n // 3. Draw Radar Series\n radarSeries.forEach((series) => {\n const { points, style } = series;\n if (points.length === 0) return;\n\n const pathPoints: { x: number, y: number }[] = [];\n \n config.categories.forEach((cat, idx) => {\n const point = points.find(p => p.category === cat);\n const val = point ? point.value : 0;\n const radius = (val / config.maxValue) * maxRadiusPixels;\n const angle = idx * angleStep - Math.PI / 2;\n \n pathPoints.push({\n x: centerX + radius * Math.cos(angle),\n y: centerY + radius * Math.sin(angle)\n });\n });\n\n ctx2d.beginPath();\n pathPoints.forEach((p, i) => {\n if (i === 0) ctx2d.moveTo(p.x, p.y);\n else ctx2d.lineTo(p.x, p.y);\n });\n ctx2d.closePath();\n \n ctx2d.fillStyle = style?.fillColor || (style?.color ? `${style.color}33` : 'rgba(0, 242, 255, 0.2)');\n ctx2d.fill();\n \n ctx2d.strokeStyle = style?.color || '#00f2ff';\n ctx2d.lineWidth = style?.width || 2;\n ctx2d.globalAlpha = style?.opacity || 1;\n ctx2d.stroke();\n\n if ((style?.pointSize || 0) > 0) {\n ctx2d.fillStyle = style?.color || '#00f2ff';\n pathPoints.forEach(p => {\n ctx2d.beginPath();\n ctx2d.arc(p.x, p.y, style!.pointSize! / 2, 0, Math.PI * 2);\n ctx2d.fill();\n });\n }\n });\n\n ctx2d.restore();\n }\n\n // ============================================\n // Plugin API\n // ============================================\n\n const api: RadarAPI & Record<string, unknown> = {\n addSeries(data: RadarSeriesData) {\n radarSeries.set(data.id, data);\n ctx?.requestRender();\n return data.id;\n },\n removeSeries(id: string) {\n const res = radarSeries.delete(id);\n if (res) ctx?.requestRender();\n return res;\n },\n updateSeries(id: string, points: RadarPoint[]) {\n const series = radarSeries.get(id);\n if (series) {\n series.points = points;\n ctx?.requestRender();\n return true;\n }\n return false;\n },\n setCategories(categories: string[]) {\n config.categories = categories;\n ctx?.requestRender();\n },\n setMaxValue(value: number) {\n config.maxValue = value;\n ctx?.requestRender();\n }\n };\n\n return {\n manifest: manifestRadar,\n\n onInit(c: PluginContext) {\n ctx = c;\n // Setup the chart for Radar (centered origin, fixed bounds)\n ctx.chart.updateXAxis({ visible: false, min: -1.2, max: 1.2 });\n ctx.chart.updateYAxis('default', { visible: false, min: -1.2, max: 1.2 });\n },\n\n onRenderOverlay(pCtx: PluginContext, _event: AfterRenderEvent) {\n drawRadar(pCtx);\n },\n\n api\n };\n}\n\nexport default PluginRadar;\n\nexport type { \n PluginRadarConfig, \n RadarAPI, \n RadarSeriesData, \n RadarPoint \n} from './types';\n"],"names":["manifestRadar","DEFAULT_CONFIG","PluginRadar","userConfig","config","ctx","radarSeries","drawRadar","pCtx","_a","_b","_c","_d","_e","_f","render","ctx2d","plotArea","centerX","centerY","maxRadiusPixels","numCategories","angleStep","level","radius","i","angle","px","py","labelRadius","lx","ly","series","points","style","pathPoints","cat","idx","point","p","c","_event","data","id","res","categories","value"],"mappings":"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"}
|