@memberjunction/ng-dashboards 6.1.2 → 6.2.0-edge.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/dist/AI/components/vectors/vector-management-resource.component.d.ts +6 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +99 -45
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +4 -0
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +16 -6
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +4 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +14 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +2 -2
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
- package/dist/DevTools/graphql-console.component.js +2 -0
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +4 -12
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +39 -78
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +3 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +7 -6
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +3 -0
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +7 -6
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/at-risk.view-models.d.ts +41 -3
- package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +1 -1
- package/dist/PredictiveStudio/at-risk.view-models.js +99 -6
- package/dist/PredictiveStudio/at-risk.view-models.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-catalog.component.d.ts +4 -1
- package/dist/PredictiveStudio/components/ps-catalog.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-catalog.component.js +61 -37
- package/dist/PredictiveStudio/components/ps-catalog.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +12 -0
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +426 -184
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +84 -0
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +1397 -0
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +66 -34
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.js +2456 -743
- package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +194 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +1902 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-production.component.d.ts +17 -1
- package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-production.component.js +653 -372
- package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-registry.component.d.ts +21 -61
- package/dist/PredictiveStudio/components/ps-registry.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-registry.component.js +214 -681
- package/dist/PredictiveStudio/components/ps-registry.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +49 -0
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +658 -0
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +1 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +42 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js +90 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -0
- package/dist/PredictiveStudio/predictive-studio.view-models.d.ts +14 -2
- package/dist/PredictiveStudio/predictive-studio.view-models.d.ts.map +1 -1
- package/dist/PredictiveStudio/predictive-studio.view-models.js +41 -5
- package/dist/PredictiveStudio/predictive-studio.view-models.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts +9 -1
- package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-models-resource.component.js +178 -65
- package/dist/PredictiveStudio/resources/ps-models-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +9 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +307 -369
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-resource-base.js +1 -1
- package/dist/PredictiveStudio/resources/ps-resource-base.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts +17 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +309 -138
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +1 -0
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +6 -5
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/predictive-studio-dashboards.module.d.ts +10 -8
- package/dist/predictive-studio-dashboards.module.d.ts.map +1 -1
- package/dist/predictive-studio-dashboards.module.js +13 -3
- package/dist/predictive-studio-dashboards.module.js.map +1 -1
- package/package.json +64 -63
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps-experiments.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-experiments.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport {\n MJExperimentSessionEntity,\n PredictiveStudioControlExperimentSessionOperation,\n PredictiveStudioExperimentSessionAction,\n} from '@memberjunction/core-entities';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { PSIterationCard, PSLeaderboardEntry } from '../predictive-studio.types';\nimport {\n PSKanbanColumns,\n deriveLeaderboard,\n groupIterationsToKanban,\n} from '../predictive-studio.view-models';\nimport { PSConfirmModalComponent } from './ps-confirm-modal.component';\n\n/** A budget gauge derived from the session's budget JSON + actual iteration spend. */\ninterface BudgetGaugeVM {\n label: string;\n fillPct: number;\n centerText: string;\n value: string;\n cap: string;\n color: string;\n}\n\n/**\n * Experiments panel: a kanban of iteration cards in Running / Completed / Pruned columns, a leaderboard\n * strip ranked by score, and budget gauges — all live against `MJ: Experiment Sessions` + their\n * `MJ: Experiment Session Iterations`:\n *\n * - The **active session** is the first Running session, else the most-recently-created one.\n * - The **kanban** + **leaderboard** are derived from that session's iterations (grouped by status,\n * ranked by score) via the pure {@link groupIterationsToKanban} / {@link deriveLeaderboard} helpers.\n * - **Budget gauges** combine the session's budget JSON caps with actual iteration spend (compute\n * cost, iteration count).\n * - **Pause / Cancel** call the {@link PredictiveStudioControlExperimentSessionOperation} Remote Op\n * behind a confirmation; on success the engine refreshes.\n *\n * Empty state when there are no sessions. 100% entity-agnostic.\n */\n@Component({\n standalone: true,\n selector: 'ps-experiments',\n imports: [CommonModule, MJButtonDirective, PSConfirmModalComponent],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-experiments.component.css'],\n template: `\n <div class=\"ps-panel ps-experiments\" data-testid=\"ps-experiments-panel\">\n @if (!session) {\n <div class=\"ps-empty\" data-testid=\"ps-experiments-empty\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-flask\"></i></span>\n <h3>No experiment sessions yet</h3>\n <p>Launch an experiment to watch the Model Dev Agent search algorithms and feature sets in waves. Running and completed iterations will appear here with a live leaderboard.</p>\n </div>\n } @else {\n <!-- session header strip -->\n <div class=\"sess-head\">\n <div>\n <div class=\"ps-small ps-muted\">Experiment session</div>\n <h2>{{ session.Name }} <span class=\"ps-badge\" [class]=\"sessionBadgeClass\"><span class=\"ps-dot\" [style.background]=\"sessionDotColor\"></span> {{ session.Status }}</span></h2>\n </div>\n <span class=\"ps-spacer\"></span>\n <span class=\"ps-small ps-muted\">{{ iterationCountLabel }}</span>\n @if (canPause) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-experiments-pause\" (click)=\"requestControl('pause')\"><i class=\"fa-solid fa-pause\"></i> Pause</button>\n }\n @if (canResume) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-experiments-resume\" (click)=\"requestControl('resume')\"><i class=\"fa-solid fa-play\"></i> Resume</button>\n }\n @if (canCancel) {\n <button mjButton variant=\"danger\" size=\"sm\" data-testid=\"ps-experiments-cancel\" (click)=\"requestControl('cancel')\"><i class=\"fa-solid fa-stop\"></i> Cancel</button>\n }\n </div>\n\n <!-- Leaderboard strip -->\n <div class=\"ps-card\" data-testid=\"ps-experiments-leaderboard\">\n <div class=\"ps-card-body lead-strip\">\n <div class=\"lead-lbl\">\n <div class=\"t\"><i class=\"fa-solid fa-trophy\" style=\"color:var(--mj-status-warning)\"></i> Leaderboard</div>\n <div class=\"ps-small ps-muted\">{{ leaderboard.length }} scored · by metric</div>\n </div>\n @if (leaderboard.length === 0) {\n <span class=\"ps-small ps-muted\">No scored iterations yet.</span>\n }\n @for (lp of leaderboard; track lp.rank) {\n <div class=\"lp\" [class.best]=\"lp.best\" [class.pruned]=\"lp.pruned\">\n <span class=\"ps-rank\" [class.gold]=\"lp.best\">{{ lp.rank }}</span>\n <span class=\"algo-ic\" [style.background]=\"lp.algorithmColor\"><i [class]=\"lp.algorithmIcon\"></i></span>\n <div><div class=\"nm\">{{ lp.algorithm }}</div><div class=\"fs ps-muted ps-small\">{{ lp.features }}</div></div>\n <span class=\"auc\" [class.win]=\"lp.best\">{{ lp.auc | number: '1.3-3' }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Budget rail -->\n @if (budget.length > 0) {\n <div class=\"ps-card\">\n <div class=\"ps-card-body budget-rail\">\n @for (b of budget; track b.label) {\n <div class=\"bud\">\n <div class=\"ps-gauge\" [style.--ps-p]=\"b.fillPct\" [style.--ps-gauge-color]=\"b.color\">\n <span class=\"g-val\">{{ b.centerText }}</span>\n </div>\n <div style=\"flex:1\">\n <div class=\"ps-section-title\">{{ b.label }}</div>\n <div class=\"b-val\"><strong>{{ b.value }}</strong> <span class=\"ps-muted ps-small\">/ {{ b.cap }}</span></div>\n <div class=\"ps-bar\" style=\"margin-top:6px;max-width:150px\"><span [style.width.%]=\"b.fillPct\" [style.background]=\"b.color\"></span></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Kanban -->\n <div class=\"kanban\" data-testid=\"ps-experiments-kanban\">\n <div class=\"kcol run\" data-testid=\"ps-kanban-col-running\">\n <div class=\"kcol-head\"><i class=\"fa-solid fa-spinner\"></i><h3>Running</h3><span class=\"cnt\">{{ kanban.running.length }}</span></div>\n <div class=\"kbody\">\n @for (c of kanban.running; track c.iteration) {\n <ng-container [ngTemplateOutlet]=\"iterCard\" [ngTemplateOutletContext]=\"{ c: c }\"></ng-container>\n }\n @if (kanban.running.length === 0) { <span class=\"ps-small ps-muted\">No running iterations.</span> }\n </div>\n </div>\n <div class=\"kcol done\" data-testid=\"ps-kanban-col-completed\">\n <div class=\"kcol-head\"><i class=\"fa-solid fa-circle-check\"></i><h3>Completed</h3><span class=\"cnt\">{{ kanban.completed.length }}</span></div>\n <div class=\"kbody\">\n @for (c of kanban.completed; track c.iteration) {\n <ng-container [ngTemplateOutlet]=\"iterCard\" [ngTemplateOutletContext]=\"{ c: c }\"></ng-container>\n }\n @if (kanban.completed.length === 0) { <span class=\"ps-small ps-muted\">No completed iterations.</span> }\n </div>\n </div>\n <div class=\"kcol prune\" data-testid=\"ps-kanban-col-pruned\">\n <div class=\"kcol-head\"><i class=\"fa-solid fa-scissors\"></i><h3>Pruned</h3><span class=\"cnt\">{{ kanban.pruned.length }}</span></div>\n <div class=\"kbody\">\n @for (c of kanban.pruned; track c.iteration) {\n <ng-container [ngTemplateOutlet]=\"iterCard\" [ngTemplateOutletContext]=\"{ c: c }\"></ng-container>\n }\n @if (kanban.pruned.length === 0) { <span class=\"ps-small ps-muted\">Nothing pruned.</span> }\n </div>\n </div>\n </div>\n\n <ng-template #iterCard let-c=\"c\">\n <div class=\"icard\" [class.best]=\"c.status === 'Best'\" [class.running]=\"c.status === 'Running'\" [class.pruned]=\"c.status === 'Pruned'\">\n <div class=\"ic-top\">\n <span class=\"algo-ic\" [style.background]=\"c.algorithmColor\"><i [class]=\"c.algorithmIcon\"></i></span>\n <div><div class=\"nm\">{{ c.algorithm }}</div><div class=\"it ps-muted ps-small\">{{ c.iteration }}</div></div>\n <span class=\"ps-spacer\"></span>\n <span class=\"ps-badge\" [class]=\"statusBadgeClass(c.status)\">{{ statusLabel(c.status) }}</span>\n </div>\n <div class=\"feat-chips\">\n @for (f of c.features; track f) { <span class=\"ps-tag\">{{ f }}</span> }\n </div>\n @if (c.status === 'Running') {\n <div class=\"ic-prog\">\n <div class=\"ps-bar run\"><span [style.width.%]=\"c.progress\"></span></div>\n <div class=\"meta\"><span class=\"ps-muted ps-small\">{{ c.progressDetail }}</span></div>\n </div>\n } @else {\n <div class=\"ic-score\">\n <span class=\"v\" [class.green]=\"c.status === 'Best'\">{{ c.score | number: '1.3-3' }}</span>\n <span class=\"lbl ps-muted ps-small\">score · {{ c.scoreDelta }}</span>\n </div>\n }\n <div class=\"rationale\"><i class=\"fa-solid fa-robot\"></i><span class=\"ps-small\">{{ c.rationale }}</span></div>\n </div>\n </ng-template>\n }\n\n @if (pendingAction) {\n <ps-confirm-modal\n [title]=\"pendingTitle\"\n [icon]=\"pendingIcon\"\n [confirmIcon]=\"pendingIcon\"\n [confirmLabel]=\"pendingConfirmLabel\"\n [variant]=\"pendingAction === 'cancel' ? 'danger' : 'warn'\"\n [busy]=\"busy\"\n (confirmed)=\"confirmControl()\"\n (cancelled)=\"cancelControl()\">\n <div [innerHTML]=\"pendingMessage\"></div>\n </ps-confirm-modal>\n }\n </div>\n `,\n})\nexport class PSExperimentsComponent implements OnInit {\n @Input() engine!: PredictiveStudioEngine;\n /** Provider to route the control Remote Op + engine refresh through (multi-provider correctness). */\n @Input() provider: IMetadataProvider | null = null;\n /** Acting user for the engine refresh after a mutation. */\n @Input() currentUser: UserInfo | null = null;\n\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n\n /** The currently-displayed session ID (first Running, else most recent). */\n public sessionId = '';\n public kanban: PSKanbanColumns = { running: [], completed: [], pruned: [] };\n public leaderboard: PSLeaderboardEntry[] = [];\n public budget: BudgetGaugeVM[] = [];\n\n /** Pending control action awaiting confirmation (null when no modal is open). */\n public pendingAction: PredictiveStudioExperimentSessionAction | null = null;\n /** Remote Op in flight. */\n public busy = false;\n\n ngOnInit(): void {\n this.selectActiveSession();\n this.rebuild();\n }\n\n // ---- active session selection ----\n\n /** Pick the most relevant session to display: first Running, else the most-recently-created. */\n private selectActiveSession(): void {\n const sessions = this.engine?.Sessions ?? [];\n const running = sessions.find((s) => s.Status === 'Running');\n // Sessions are loaded OrderBy '__mj_CreatedAt DESC', so index 0 is the most recent.\n this.sessionId = (running ?? sessions[0])?.ID ?? '';\n }\n\n public get session(): MJExperimentSessionEntity | undefined {\n return this.engine?.Sessions.find((s) => UUIDsEqual(s.ID, this.sessionId));\n }\n\n public get iterationCountLabel(): string {\n const total = this.kanban.running.length + this.kanban.completed.length + this.kanban.pruned.length;\n return `${total} iteration${total === 1 ? '' : 's'}`;\n }\n\n // ---- derivations ----\n\n private rebuild(): void {\n if (!this.sessionId) {\n this.kanban = { running: [], completed: [], pruned: [] };\n this.leaderboard = [];\n this.budget = [];\n return;\n }\n const rows = this.engine.IterationRowsForSession(this.sessionId);\n this.kanban = groupIterationsToKanban(rows);\n this.leaderboard = deriveLeaderboard(rows);\n this.budget = this.buildBudget(rows);\n }\n\n /** Build the budget gauges from the session's budget JSON caps + actual iteration spend. */\n private buildBudget(rows: { ComputeCost: number | null }[]): BudgetGaugeVM[] {\n const session = this.session;\n if (!session) return [];\n const budgetJson = this.parseBudget(session.Budget);\n const gauges: BudgetGaugeVM[] = [];\n\n const spentCost = rows.reduce((sum, r) => sum + (r.ComputeCost ?? 0), 0);\n const maxCost = budgetJson.maxComputeCost;\n if (maxCost != null && maxCost > 0) {\n gauges.push(this.gauge('Compute cost', spentCost, maxCost, 'var(--ps-gauge-cost)', (v) => `$${v.toFixed(0)}`, `$${maxCost.toFixed(0)} cap`));\n }\n\n const iterations = rows.length;\n const maxIterations = budgetJson.maxIterations;\n if (maxIterations != null && maxIterations > 0) {\n gauges.push(this.gauge('Iterations', iterations, maxIterations, 'var(--ps-gauge-iterations)', (v) => `${v}`, `${maxIterations} trials`));\n }\n return gauges;\n }\n\n /** Construct a single gauge VM (fill clamped to 0..100). */\n private gauge(label: string, value: number, cap: number, color: string, fmt: (v: number) => string, capLabel: string): BudgetGaugeVM {\n const fillPct = Math.max(0, Math.min(100, Math.round((value / cap) * 100)));\n return { label, fillPct, centerText: `${fillPct}%`, value: fmt(value), cap: capLabel, color };\n }\n\n /** Tolerant parse of the session's budget JSON (accepts a few common key spellings). */\n private parseBudget(json: string | null): { maxComputeCost: number | null; maxIterations: number | null } {\n if (!json) return { maxComputeCost: null, maxIterations: null };\n try {\n const parsed = JSON.parse(json) as Record<string, unknown>;\n const num = (...keys: string[]): number | null => {\n for (const k of keys) {\n const v = parsed[k];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n }\n return null;\n };\n return {\n maxComputeCost: num('maxComputeCost', 'maxCost', 'computeBudget'),\n maxIterations: num('maxIterations', 'maxTrials', 'iterationBudget'),\n };\n } catch {\n return { maxComputeCost: null, maxIterations: null };\n }\n }\n\n // ---- session status chrome ----\n\n public get sessionBadgeClass(): string {\n switch (this.session?.Status) {\n case 'Running': return 'green';\n case 'Paused': return 'amber';\n case 'Cancelled': return 'red';\n case 'Completed': return 'blue';\n default: return 'gray';\n }\n }\n public get sessionDotColor(): string {\n switch (this.session?.Status) {\n case 'Running': return 'var(--mj-status-success)';\n case 'Paused': return 'var(--mj-status-warning)';\n case 'Cancelled': return 'var(--mj-status-error)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n public statusBadgeClass(status: PSIterationCard['status']): string {\n switch (status) {\n case 'Best': return 'green';\n case 'Completed': return 'gray';\n case 'AwaitingApproval': return 'amber';\n case 'Pruned': return 'red';\n case 'Running': return 'blue';\n }\n }\n\n public statusLabel(status: PSIterationCard['status']): string {\n switch (status) {\n case 'Best': return 'Best';\n case 'AwaitingApproval': return 'Awaiting approval';\n default: return status;\n }\n }\n\n // ---- control availability ----\n\n public get canPause(): boolean {\n return this.session?.Status === 'Running';\n }\n public get canResume(): boolean {\n return this.session?.Status === 'Paused';\n }\n public get canCancel(): boolean {\n const s = this.session?.Status;\n return s === 'Running' || s === 'Paused' || s === 'AwaitingApproval';\n }\n\n // ---- control flow (Remote Op) ----\n\n public requestControl(action: PredictiveStudioExperimentSessionAction): void {\n if (!this.session) return;\n this.pendingAction = action;\n }\n\n public cancelControl(): void {\n if (this.busy) return;\n this.pendingAction = null;\n }\n\n public get pendingTitle(): string {\n switch (this.pendingAction) {\n case 'pause': return 'Pause experiment';\n case 'resume': return 'Resume experiment';\n case 'cancel': return 'Cancel experiment';\n default: return '';\n }\n }\n public get pendingIcon(): string {\n switch (this.pendingAction) {\n case 'pause': return 'fa-solid fa-pause';\n case 'resume': return 'fa-solid fa-play';\n case 'cancel': return 'fa-solid fa-stop';\n default: return 'fa-solid fa-check';\n }\n }\n public get pendingConfirmLabel(): string {\n switch (this.pendingAction) {\n case 'pause': return 'Pause';\n case 'resume': return 'Resume';\n case 'cancel': return 'Cancel run';\n default: return 'Confirm';\n }\n }\n public get pendingMessage(): string {\n const name = escapeHtml(this.session?.Name ?? 'this session');\n switch (this.pendingAction) {\n case 'pause':\n return `Pause <strong>${name}</strong>? The orchestrator stops at the next wave checkpoint; in-flight iterations finish. You can resume later.`;\n case 'resume':\n return `Resume <strong>${name}</strong>? The orchestrator continues searching from where it paused.`;\n case 'cancel':\n return `Cancel <strong>${name}</strong>? This stops the search at the next checkpoint. Completed iterations and the leaderboard are kept, but the session cannot be resumed.`;\n default:\n return '';\n }\n }\n\n /** Run the control Remote Op, then refresh the engine + close on success. */\n public async confirmControl(): Promise<void> {\n if (!this.pendingAction || !this.session || this.busy) return;\n this.busy = true;\n const action = this.pendingAction;\n const sessionId = this.session.ID;\n const name = this.session.Name;\n try {\n const op = new PredictiveStudioControlExperimentSessionOperation();\n const result = await op.Execute(\n { sessionId, action },\n { provider: this.provider ?? undefined, user: this.currentUser ?? undefined },\n );\n if (result.Success) {\n this.notifications.CreateSimpleNotification(\n `${name} → ${result.Output?.status ?? action}`,\n 'success',\n 3500,\n );\n await this.refreshAfterMutation();\n this.pendingAction = null;\n } else {\n this.notifications.CreateSimpleNotification(\n result.ErrorMessage || `Could not ${action} ${name}.`,\n 'error',\n 5000,\n );\n }\n } catch (e) {\n this.notifications.CreateSimpleNotification(\n `${action} failed: ${e instanceof Error ? e.message : String(e)}`,\n 'error',\n 5000,\n );\n } finally {\n this.busy = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Force-refresh the engine's cached sessions/iterations, then rebuild. */\n private async refreshAfterMutation(): Promise<void> {\n await this.engine.Config(true, this.currentUser ?? undefined, this.provider ?? undefined);\n this.selectActiveSession();\n this.rebuild();\n this.cdr.detectChanges();\n }\n}\n\n/** Minimal HTML-escape for interpolating session names into the modal's innerHTML message. */\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ps-experiments.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-experiments.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, RunView, IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport {\n MJArtifactEntity,\n MJArtifactVersionEntity,\n MJExperimentSessionEntity,\n PredictiveStudioControlExperimentSessionOperation,\n PredictiveStudioExperimentSessionAction,\n} from '@memberjunction/core-entities';\nimport { type ModelingPlanSpec } from '@memberjunction/predictive-studio-core';\nimport { ArtifactsModule } from '@memberjunction/ng-artifacts';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { PSIterationCard, PSLeaderboardEntry } from '../predictive-studio.types';\nimport {\n PSKanbanColumns,\n deriveLeaderboard,\n groupIterationsToKanban,\n} from '../predictive-studio.view-models';\nimport { PSConfirmModalComponent } from './ps-confirm-modal.component';\nimport { PSRunExperimentModalComponent } from './ps-run-experiment-modal.component';\n\n/** A budget gauge derived from the session's budget JSON + actual iteration spend. */\ninterface BudgetGaugeVM {\n label: string;\n fillPct: number;\n centerText: string;\n value: string;\n cap: string;\n color: string;\n}\n\n/**\n * Experiments panel: a kanban of iteration cards in Running / Completed / Pruned columns, a leaderboard\n * strip ranked by score, and budget gauges — all live against `MJ: Experiment Sessions` + their\n * `MJ: Experiment Session Iterations`:\n *\n * - The **active session** is the first Running session, else the most-recently-created one.\n * - The **kanban** + **leaderboard** are derived from that session's iterations (grouped by status,\n * ranked by score) via the pure {@link groupIterationsToKanban} / {@link deriveLeaderboard} helpers.\n * - **Budget gauges** combine the session's budget JSON caps with actual iteration spend (compute\n * cost, iteration count).\n * - **Pause / Cancel** call the {@link PredictiveStudioControlExperimentSessionOperation} Remote Op\n * behind a confirmation; on success the engine refreshes.\n *\n * Empty state when there are no sessions. 100% entity-agnostic.\n */\n@Component({\n standalone: true,\n selector: 'ps-experiments',\n imports: [CommonModule, MJButtonDirective, PSConfirmModalComponent, PSRunExperimentModalComponent, ArtifactsModule],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-experiments.component.css'],\n template: `\n <div class=\"ps-panel ps-experiments\" data-testid=\"ps-experiments-panel\">\n @if (!session) {\n <div class=\"ps-empty\" data-testid=\"ps-experiments-empty\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-flask\"></i></span>\n <h3>No experiment sessions yet</h3>\n <p>Launch an experiment to watch the Model Dev Agent search algorithms and feature sets in waves, or configure a manual multi-algorithm tournament.</p>\n <div style=\"margin-top: 12px; display: flex; gap: 8px;\">\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-experiments-new-btn-empty\" (click)=\"openNewExperimentModal()\">\n <i class=\"fa-solid fa-flask\"></i> New Experiment\n </button>\n </div>\n </div>\n } @else {\n <!-- session header strip -->\n <div class=\"sess-head\">\n <div>\n <div class=\"ps-small ps-muted\" style=\"display: flex; align-items: center; gap: 8px;\">\n <span>Experiment session</span>\n @if (sessions.length > 1) {\n <span class=\"ps-muted\">· Switch:</span>\n <select class=\"mj-input\" style=\"padding: 2px 6px; font-size: 12px; height: 26px;\"\n [value]=\"sessionId\" (change)=\"selectSession($any($event.target).value)\">\n @for (s of sessions; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }} ({{ s.Status }})</option>\n }\n </select>\n }\n </div>\n <h2>{{ session.Name }} <span class=\"ps-badge\" [class]=\"sessionBadgeClass\"><span class=\"ps-dot\" [style.background]=\"sessionDotColor\"></span> {{ session.Status }}</span></h2>\n </div>\n <span class=\"ps-spacer\"></span>\n <span class=\"ps-small ps-muted\">{{ iterationCountLabel }}</span>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-experiments-view-artifact\" [disabled]=\"artifactLoading\" (click)=\"viewResultsArtifact()\">\n <i class=\"fa-solid fa-flask-vial\"></i> {{ artifactLoading ? 'Loading…' : 'View Results Artifact' }}\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-experiments-new-btn\" (click)=\"openNewExperimentModal()\">\n <i class=\"fa-solid fa-plus\"></i> New Experiment\n </button>\n @if (canPause) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-experiments-pause\" (click)=\"requestControl('pause')\"><i class=\"fa-solid fa-pause\"></i> Pause</button>\n }\n @if (canResume) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-experiments-resume\" (click)=\"requestControl('resume')\"><i class=\"fa-solid fa-play\"></i> Resume</button>\n }\n @if (canCancel) {\n <button mjButton variant=\"danger\" size=\"sm\" data-testid=\"ps-experiments-cancel\" (click)=\"requestControl('cancel')\"><i class=\"fa-solid fa-stop\"></i> Cancel</button>\n }\n </div>\n\n <!-- Leaderboard strip -->\n <div class=\"ps-card\" data-testid=\"ps-experiments-leaderboard\">\n <div class=\"ps-card-body lead-strip\">\n <div class=\"lead-lbl\">\n <div class=\"t\"><i class=\"fa-solid fa-trophy\" style=\"color:var(--mj-status-warning)\"></i> Leaderboard</div>\n <div class=\"ps-small ps-muted\">{{ leaderboard.length }} scored · by metric</div>\n </div>\n @if (leaderboard.length === 0) {\n <span class=\"ps-small ps-muted\">No scored iterations yet.</span>\n }\n @for (lp of leaderboard; track lp.rank) {\n <div class=\"lp\" [class.best]=\"lp.best\" [class.pruned]=\"lp.pruned\">\n <span class=\"ps-rank\" [class.gold]=\"lp.best\">{{ lp.rank }}</span>\n <span class=\"algo-ic\" [style.background]=\"lp.algorithmColor\"><i [class]=\"lp.algorithmIcon\"></i></span>\n <div><div class=\"nm\">{{ lp.algorithm }}</div><div class=\"fs ps-muted ps-small\">{{ lp.features }}</div></div>\n <span class=\"auc\" [class.win]=\"lp.best\">{{ lp.auc | number: '1.3-3' }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Budget rail -->\n @if (budget.length > 0) {\n <div class=\"ps-card\">\n <div class=\"ps-card-body budget-rail\">\n @for (b of budget; track b.label) {\n <div class=\"bud\">\n <div class=\"ps-gauge\" [style.--ps-p]=\"b.fillPct\" [style.--ps-gauge-color]=\"b.color\">\n <span class=\"g-val\">{{ b.centerText }}</span>\n </div>\n <div style=\"flex:1\">\n <div class=\"ps-section-title\">{{ b.label }}</div>\n <div class=\"b-val\"><strong>{{ b.value }}</strong> <span class=\"ps-muted ps-small\">/ {{ b.cap }}</span></div>\n <div class=\"ps-bar\" style=\"margin-top:6px;max-width:150px\"><span [style.width.%]=\"b.fillPct\" [style.background]=\"b.color\"></span></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Kanban -->\n <div class=\"kanban\" data-testid=\"ps-experiments-kanban\">\n <div class=\"kcol run\" data-testid=\"ps-kanban-col-running\">\n <div class=\"kcol-head\"><i class=\"fa-solid fa-spinner\"></i><h3>Running</h3><span class=\"cnt\">{{ kanban.running.length }}</span></div>\n <div class=\"kbody\">\n @for (c of kanban.running; track c.iteration) {\n <ng-container [ngTemplateOutlet]=\"iterCard\" [ngTemplateOutletContext]=\"{ c: c }\"></ng-container>\n }\n @if (kanban.running.length === 0) { <span class=\"ps-small ps-muted\">No running iterations.</span> }\n </div>\n </div>\n <div class=\"kcol done\" data-testid=\"ps-kanban-col-completed\">\n <div class=\"kcol-head\"><i class=\"fa-solid fa-circle-check\"></i><h3>Completed</h3><span class=\"cnt\">{{ kanban.completed.length }}</span></div>\n <div class=\"kbody\">\n @for (c of kanban.completed; track c.iteration) {\n <ng-container [ngTemplateOutlet]=\"iterCard\" [ngTemplateOutletContext]=\"{ c: c }\"></ng-container>\n }\n @if (kanban.completed.length === 0) { <span class=\"ps-small ps-muted\">No completed iterations.</span> }\n </div>\n </div>\n <div class=\"kcol prune\" data-testid=\"ps-kanban-col-pruned\">\n <div class=\"kcol-head\"><i class=\"fa-solid fa-scissors\"></i><h3>Pruned</h3><span class=\"cnt\">{{ kanban.pruned.length }}</span></div>\n <div class=\"kbody\">\n @for (c of kanban.pruned; track c.iteration) {\n <ng-container [ngTemplateOutlet]=\"iterCard\" [ngTemplateOutletContext]=\"{ c: c }\"></ng-container>\n }\n @if (kanban.pruned.length === 0) { <span class=\"ps-small ps-muted\">Nothing pruned.</span> }\n </div>\n </div>\n </div>\n\n <ng-template #iterCard let-c=\"c\">\n <div class=\"icard\" [class.best]=\"c.status === 'Best'\" [class.running]=\"c.status === 'Running'\" [class.pruned]=\"c.status === 'Pruned'\">\n <div class=\"ic-top\">\n <span class=\"algo-ic\" [style.background]=\"c.algorithmColor\"><i [class]=\"c.algorithmIcon\"></i></span>\n <div><div class=\"nm\">{{ c.algorithm }}</div><div class=\"it ps-muted ps-small\">{{ c.iteration }}</div></div>\n <span class=\"ps-spacer\"></span>\n <span class=\"ps-badge\" [class]=\"statusBadgeClass(c.status)\">{{ statusLabel(c.status) }}</span>\n </div>\n <div class=\"feat-chips\">\n @for (f of c.features; track f) { <span class=\"ps-tag\">{{ f }}</span> }\n </div>\n @if (c.status === 'Running') {\n <div class=\"ic-prog\">\n <div class=\"ps-bar run\"><span [style.width.%]=\"c.progress\"></span></div>\n <div class=\"meta\"><span class=\"ps-muted ps-small\">{{ c.progressDetail }}</span></div>\n </div>\n } @else {\n <div class=\"ic-score\">\n <span class=\"v\" [class.green]=\"c.status === 'Best'\">{{ c.score | number: '1.3-3' }}</span>\n <span class=\"lbl ps-muted ps-small\">score · {{ c.scoreDelta }}</span>\n </div>\n }\n <div class=\"rationale\"><i class=\"fa-solid fa-robot\"></i><span class=\"ps-small\">{{ c.rationale }}</span></div>\n </div>\n </ng-template>\n }\n\n @if (pendingAction) {\n <ps-confirm-modal\n [title]=\"pendingTitle\"\n [icon]=\"pendingIcon\"\n [confirmIcon]=\"pendingIcon\"\n [confirmLabel]=\"pendingConfirmLabel\"\n [variant]=\"pendingAction === 'cancel' ? 'danger' : 'warn'\"\n [busy]=\"busy\"\n (confirmed)=\"confirmControl()\"\n (cancelled)=\"cancelControl()\">\n <div [innerHTML]=\"pendingMessage\"></div>\n </ps-confirm-modal>\n }\n\n @if (showArtifactModal && activeArtifactId) {\n <div class=\"ps-modal-backdrop\" (click)=\"closeArtifactModal()\">\n <div class=\"ps-modal-dialog\" style=\"max-width: 960px; width: 92vw; height: 85vh; display: flex; flex-direction: column; padding: 0; overflow: hidden;\"\n (click)=\"$event.stopPropagation()\">\n <div style=\"flex: 1; min-height: 0; display: flex; flex-direction: column;\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser!\"\n [showCloseButton]=\"true\"\n (closed)=\"closeArtifactModal()\">\n </mj-artifact-viewer-panel>\n </div>\n </div>\n </div>\n }\n\n @if (showNewExperimentModal) {\n <ps-run-experiment-modal\n [engine]=\"engine\"\n [provider]=\"provider\"\n [currentUser]=\"currentUser\"\n (started)=\"onExperimentStarted($event)\"\n (closed)=\"closeNewExperimentModal()\">\n </ps-run-experiment-modal>\n }\n </div>\n `,\n})\nexport class PSExperimentsComponent implements OnInit {\n @Input() engine!: PredictiveStudioEngine;\n /** Provider to route the control Remote Op + engine refresh through (multi-provider correctness). */\n @Input() provider: IMetadataProvider | null = null;\n /** Acting user for the engine refresh after a mutation. */\n @Input() currentUser: UserInfo | null = null;\n\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n\n /** The currently-displayed session ID (first Running, else most recent). */\n public sessionId = '';\n public kanban: PSKanbanColumns = { running: [], completed: [], pruned: [] };\n public leaderboard: PSLeaderboardEntry[] = [];\n public budget: BudgetGaugeVM[] = [];\n\n /** Pending control action awaiting confirmation (null when no modal is open). */\n public pendingAction: PredictiveStudioExperimentSessionAction | null = null;\n /** Remote Op in flight. */\n public busy = false;\n\n public showNewExperimentModal = false;\n public showArtifactModal = false;\n public activeArtifactId: string | null = null;\n public artifactLoading = false;\n\n public get sessions(): MJExperimentSessionEntity[] {\n return this.engine?.Sessions ?? [];\n }\n\n public selectSession(id: string): void {\n this.sessionId = id;\n this.rebuild();\n this.cdr.detectChanges();\n }\n\n public openNewExperimentModal(): void {\n this.showNewExperimentModal = true;\n }\n\n public closeNewExperimentModal(): void {\n this.showNewExperimentModal = false;\n }\n\n public async onExperimentStarted(newSessionId: string): Promise<void> {\n this.closeNewExperimentModal();\n await this.engine.Config(true, this.currentUser ?? undefined, this.provider ?? undefined);\n this.sessionId = newSessionId;\n this.rebuild();\n this.cdr.detectChanges();\n }\n\n public closeArtifactModal(): void {\n this.showArtifactModal = false;\n this.activeArtifactId = null;\n }\n\n public async viewResultsArtifact(): Promise<void> {\n const s = this.session;\n if (!s || this.artifactLoading) return;\n\n this.artifactLoading = true;\n try {\n const p = this.provider ?? Metadata.Provider;\n const rv = new RunView();\n const res = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `Name LIKE '${s.Name}%' OR Comments LIKE '%${s.ID}%'`,\n ResultType: 'entity_object',\n }, this.currentUser ?? undefined);\n\n if (res.Success && res.Results && res.Results.length > 0) {\n this.activeArtifactId = res.Results[0].ID;\n this.showArtifactModal = true;\n return;\n }\n\n const art = await p.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser ?? undefined);\n art.Name = `${s.Name} — Results`;\n art.Description = `Modeling results, leaderboard, and winning model metrics for ${s.Name}.`;\n art.TypeID = 'D41AB707-58F1-4413-8725-9DF31C95F4C5';\n art.Comments = `Auto-generated for Experiment Session ${s.ID}`;\n const saved = await art.Save();\n if (!saved) {\n this.notifications.CreateSimpleNotification('Could not generate artifact record.', 'error', 5000);\n return;\n }\n\n const ver = await p.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions', this.currentUser ?? undefined);\n ver.ArtifactID = art.ID;\n ver.VersionNumber = 1;\n ver.Comments = 'Initial results artifact';\n\n const planSpec = this.parsePlanSpec(s.PlanSpec);\n const winningRow = this.leaderboard[0];\n const winningIteration = winningRow\n ? this.engine.IterationsForSession(s.ID).find((it) => this.engine.AlgorithmForIteration(it.ID) === winningRow.algorithm && it.Score === winningRow.auc)\n : undefined;\n const winningRun = winningIteration ? this.engine.TrainingRuns.find((r) => UUIDsEqual(r.ExperimentSessionIterationID, winningIteration.ID)) : undefined;\n const winningModelId = winningRun?.ResultingModelID ?? undefined;\n\n const payload = {\n Name: s.Name,\n Goal: s.Goal || planSpec?.Goal || 'Predictive modeling experiment',\n TargetMetric: planSpec?.TargetDefinition?.SuccessMetric || 'Score',\n Summary: `Experiment session completed with ${this.leaderboard.length} iterations. Winning algorithm: ${winningRow?.algorithm ?? 'None'}.`,\n Leaderboard: this.leaderboard.map((lb) => ({\n rank: lb.rank,\n algorithm: lb.algorithm,\n algorithmName: lb.algorithm,\n featureSet: lb.features,\n score: lb.auc,\n isWinner: lb.best,\n })),\n BestModelID: winningModelId,\n BestModel: winningModelId && winningRow ? { ID: winningModelId, Name: winningRow.algorithm } : undefined,\n Markdown: `## Experiment Session: ${s.Name}\\n\\n**Status:** ${s.Status}\\n**Goal:** ${s.Goal || 'N/A'}\\n\\n### Leaderboard\\n\\nRanked by metric:\\n` +\n this.leaderboard.map(l => `- **#${l.rank} ${l.algorithm}**: Score ${l.auc.toFixed(3)} (${l.features})`).join('\\n'),\n };\n\n ver.Content = JSON.stringify(payload);\n await ver.Save();\n\n this.activeArtifactId = art.ID;\n this.showArtifactModal = true;\n } catch (e) {\n this.notifications.CreateSimpleNotification(`Error: ${e instanceof Error ? e.message : String(e)}`, 'error', 5000);\n } finally {\n this.artifactLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private parsePlanSpec(raw: string | null): ModelingPlanSpec | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as ModelingPlanSpec;\n } catch {\n return null;\n }\n }\n\n ngOnInit(): void {\n this.selectActiveSession();\n this.rebuild();\n }\n\n // ---- active session selection ----\n\n /** Pick the most relevant session to display: first Running, else the most-recently-created. */\n private selectActiveSession(): void {\n const sessions = this.engine?.Sessions ?? [];\n const running = sessions.find((s) => s.Status === 'Running');\n // Sessions are loaded OrderBy '__mj_CreatedAt DESC', so index 0 is the most recent.\n this.sessionId = (running ?? sessions[0])?.ID ?? '';\n }\n\n public get session(): MJExperimentSessionEntity | undefined {\n return this.engine?.Sessions.find((s) => UUIDsEqual(s.ID, this.sessionId));\n }\n\n public get iterationCountLabel(): string {\n const total = this.kanban.running.length + this.kanban.completed.length + this.kanban.pruned.length;\n return `${total} iteration${total === 1 ? '' : 's'}`;\n }\n\n // ---- derivations ----\n\n private rebuild(): void {\n if (!this.sessionId) {\n this.kanban = { running: [], completed: [], pruned: [] };\n this.leaderboard = [];\n this.budget = [];\n return;\n }\n const rows = this.engine.IterationRowsForSession(this.sessionId);\n this.kanban = groupIterationsToKanban(rows);\n this.leaderboard = deriveLeaderboard(rows);\n this.budget = this.buildBudget(rows);\n }\n\n /** Build the budget gauges from the session's budget JSON caps + actual iteration spend. */\n private buildBudget(rows: { ComputeCost: number | null }[]): BudgetGaugeVM[] {\n const session = this.session;\n if (!session) return [];\n const budgetJson = this.parseBudget(session.Budget);\n const gauges: BudgetGaugeVM[] = [];\n\n const spentCost = rows.reduce((sum, r) => sum + (r.ComputeCost ?? 0), 0);\n const maxCost = budgetJson.maxComputeCost;\n if (maxCost != null && maxCost > 0) {\n gauges.push(this.gauge('Compute cost', spentCost, maxCost, 'var(--ps-gauge-cost)', (v) => `$${v.toFixed(0)}`, `$${maxCost.toFixed(0)} cap`));\n }\n\n const iterations = rows.length;\n const maxIterations = budgetJson.maxIterations;\n if (maxIterations != null && maxIterations > 0) {\n gauges.push(this.gauge('Iterations', iterations, maxIterations, 'var(--ps-gauge-iterations)', (v) => `${v}`, `${maxIterations} trials`));\n }\n return gauges;\n }\n\n /** Construct a single gauge VM (fill clamped to 0..100). */\n private gauge(label: string, value: number, cap: number, color: string, fmt: (v: number) => string, capLabel: string): BudgetGaugeVM {\n const fillPct = Math.max(0, Math.min(100, Math.round((value / cap) * 100)));\n return { label, fillPct, centerText: `${fillPct}%`, value: fmt(value), cap: capLabel, color };\n }\n\n /** Tolerant parse of the session's budget JSON (accepts a few common key spellings). */\n private parseBudget(json: string | null): { maxComputeCost: number | null; maxIterations: number | null } {\n if (!json) return { maxComputeCost: null, maxIterations: null };\n try {\n const parsed = JSON.parse(json) as Record<string, unknown>;\n const num = (...keys: string[]): number | null => {\n for (const k of keys) {\n const v = parsed[k];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n }\n return null;\n };\n return {\n maxComputeCost: num('maxComputeCost', 'maxCost', 'computeBudget'),\n maxIterations: num('maxIterations', 'maxTrials', 'iterationBudget'),\n };\n } catch {\n return { maxComputeCost: null, maxIterations: null };\n }\n }\n\n // ---- session status chrome ----\n\n public get sessionBadgeClass(): string {\n switch (this.session?.Status) {\n case 'Running': return 'green';\n case 'Paused': return 'amber';\n case 'Cancelled': return 'red';\n case 'Completed': return 'blue';\n default: return 'gray';\n }\n }\n public get sessionDotColor(): string {\n switch (this.session?.Status) {\n case 'Running': return 'var(--mj-status-success)';\n case 'Paused': return 'var(--mj-status-warning)';\n case 'Cancelled': return 'var(--mj-status-error)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n public statusBadgeClass(status: PSIterationCard['status']): string {\n switch (status) {\n case 'Best': return 'green';\n case 'Completed': return 'gray';\n case 'AwaitingApproval': return 'amber';\n case 'Pruned': return 'red';\n case 'Running': return 'blue';\n }\n }\n\n public statusLabel(status: PSIterationCard['status']): string {\n switch (status) {\n case 'Best': return 'Best';\n case 'AwaitingApproval': return 'Awaiting approval';\n default: return status;\n }\n }\n\n // ---- control availability ----\n\n public get canPause(): boolean {\n return this.session?.Status === 'Running';\n }\n public get canResume(): boolean {\n return this.session?.Status === 'Paused';\n }\n public get canCancel(): boolean {\n const s = this.session?.Status;\n return s === 'Running' || s === 'Paused' || s === 'AwaitingApproval';\n }\n\n // ---- control flow (Remote Op) ----\n\n public requestControl(action: PredictiveStudioExperimentSessionAction): void {\n if (!this.session) return;\n this.pendingAction = action;\n }\n\n public cancelControl(): void {\n if (this.busy) return;\n this.pendingAction = null;\n }\n\n public get pendingTitle(): string {\n switch (this.pendingAction) {\n case 'pause': return 'Pause experiment';\n case 'resume': return 'Resume experiment';\n case 'cancel': return 'Cancel experiment';\n default: return '';\n }\n }\n public get pendingIcon(): string {\n switch (this.pendingAction) {\n case 'pause': return 'fa-solid fa-pause';\n case 'resume': return 'fa-solid fa-play';\n case 'cancel': return 'fa-solid fa-stop';\n default: return 'fa-solid fa-check';\n }\n }\n public get pendingConfirmLabel(): string {\n switch (this.pendingAction) {\n case 'pause': return 'Pause';\n case 'resume': return 'Resume';\n case 'cancel': return 'Cancel run';\n default: return 'Confirm';\n }\n }\n public get pendingMessage(): string {\n const name = escapeHtml(this.session?.Name ?? 'this session');\n switch (this.pendingAction) {\n case 'pause':\n return `Pause <strong>${name}</strong>? The orchestrator stops at the next wave checkpoint; in-flight iterations finish. You can resume later.`;\n case 'resume':\n return `Resume <strong>${name}</strong>? The orchestrator continues searching from where it paused.`;\n case 'cancel':\n return `Cancel <strong>${name}</strong>? This stops the search at the next checkpoint. Completed iterations and the leaderboard are kept, but the session cannot be resumed.`;\n default:\n return '';\n }\n }\n\n /** Run the control Remote Op, then refresh the engine + close on success. */\n public async confirmControl(): Promise<void> {\n if (!this.pendingAction || !this.session || this.busy) return;\n this.busy = true;\n const action = this.pendingAction;\n const sessionId = this.session.ID;\n const name = this.session.Name;\n try {\n const op = new PredictiveStudioControlExperimentSessionOperation();\n const result = await op.Execute(\n { sessionId, action },\n { provider: this.provider ?? undefined, user: this.currentUser ?? undefined },\n );\n if (result.Success) {\n this.notifications.CreateSimpleNotification(\n `${name} → ${result.Output?.status ?? action}`,\n 'success',\n 3500,\n );\n await this.refreshAfterMutation();\n this.pendingAction = null;\n } else {\n this.notifications.CreateSimpleNotification(\n result.ErrorMessage || `Could not ${action} ${name}.`,\n 'error',\n 5000,\n );\n }\n } catch (e) {\n this.notifications.CreateSimpleNotification(\n `${action} failed: ${e instanceof Error ? e.message : String(e)}`,\n 'error',\n 5000,\n );\n } finally {\n this.busy = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Force-refresh the engine's cached sessions/iterations, then rebuild. */\n private async refreshAfterMutation(): Promise<void> {\n await this.engine.Config(true, this.currentUser ?? undefined, this.provider ?? undefined);\n this.selectActiveSession();\n this.rebuild();\n this.cdr.detectChanges();\n }\n}\n\n/** Minimal HTML-escape for interpolating session names into the modal's innerHTML message. */\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { IMetadataProvider, UserInfo, EntityInfo, EntityFieldInfo } from '@memberjunction/core';
|
|
3
|
+
import { MJMLTrainingPipelineEntity, MJMLAlgorithmEntity } from '@memberjunction/core-entities';
|
|
4
|
+
import { type ProblemType } from '@memberjunction/predictive-studio-core';
|
|
5
|
+
import { PredictiveStudioEngine } from '../engine/predictive-studio.engine';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export interface FieldSelectionItem {
|
|
8
|
+
field: EntityFieldInfo;
|
|
9
|
+
selected: boolean;
|
|
10
|
+
isDenyList: boolean;
|
|
11
|
+
isTarget: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type WizardStep = 'goal' | 'features' | 'preprocessing' | 'algorithm';
|
|
14
|
+
export declare class PSPipelineWizardComponent implements OnInit {
|
|
15
|
+
provider: IMetadataProvider | null;
|
|
16
|
+
currentUser: UserInfo | null;
|
|
17
|
+
engine: PredictiveStudioEngine | null;
|
|
18
|
+
initialAlgorithmName?: string;
|
|
19
|
+
initialAlgorithmId?: string;
|
|
20
|
+
cloneFromPipeline?: MJMLTrainingPipelineEntity;
|
|
21
|
+
set cloneFrom(p: MJMLTrainingPipelineEntity | null | undefined);
|
|
22
|
+
closed: EventEmitter<void>;
|
|
23
|
+
saved: EventEmitter<MJMLTrainingPipelineEntity>;
|
|
24
|
+
trainRequested: EventEmitter<MJMLTrainingPipelineEntity>;
|
|
25
|
+
private readonly cdr;
|
|
26
|
+
private readonly notifications;
|
|
27
|
+
currentStep: WizardStep;
|
|
28
|
+
busy: boolean;
|
|
29
|
+
isEditing: boolean;
|
|
30
|
+
pipelineName: string;
|
|
31
|
+
pipelineDescription: string;
|
|
32
|
+
selectedEntityId: string;
|
|
33
|
+
targetVariable: string;
|
|
34
|
+
problemType: ProblemType;
|
|
35
|
+
evaluationMetric: string;
|
|
36
|
+
asOfMode: 'none' | 'column' | 'offset';
|
|
37
|
+
asOfColumn: string;
|
|
38
|
+
asOfOffsetDays: number;
|
|
39
|
+
fieldItems: FieldSelectionItem[];
|
|
40
|
+
fieldSearchFilter: string;
|
|
41
|
+
dominanceThreshold: number;
|
|
42
|
+
categoricalEncoding: 'onehot' | 'none';
|
|
43
|
+
imputeStrategy: 'mean' | 'median' | 'mode' | 'constant';
|
|
44
|
+
standardizeStrategy: 'standard' | 'minmax' | 'none';
|
|
45
|
+
selectedAlgorithmId: string;
|
|
46
|
+
hyperparamEstimators: number;
|
|
47
|
+
hyperparamMaxDepth: number;
|
|
48
|
+
hyperparamLearningRate: number;
|
|
49
|
+
validationStrategyType: 'train_test_split' | 'kfold';
|
|
50
|
+
testSplitRatio: number;
|
|
51
|
+
kFolds: number;
|
|
52
|
+
ngOnInit(): void;
|
|
53
|
+
get availableEntities(): EntityInfo[];
|
|
54
|
+
get selectedEntity(): EntityInfo | null;
|
|
55
|
+
get availableFields(): EntityFieldInfo[];
|
|
56
|
+
get dateFields(): EntityFieldInfo[];
|
|
57
|
+
get availableMetrics(): string[];
|
|
58
|
+
get availableAlgorithms(): MJMLAlgorithmEntity[];
|
|
59
|
+
get filteredFieldItems(): FieldSelectionItem[];
|
|
60
|
+
get selectedFeaturesCount(): number;
|
|
61
|
+
get denyListCount(): number;
|
|
62
|
+
onEntitySelected(entityId: string): void;
|
|
63
|
+
onProblemTypeChange(): void;
|
|
64
|
+
onAlgorithmSelected(algoId: string): void;
|
|
65
|
+
toggleDenyList(item: FieldSelectionItem): void;
|
|
66
|
+
selectAllFields(val: boolean): void;
|
|
67
|
+
excludeAuditFields(): void;
|
|
68
|
+
isStepDone(step: WizardStep): boolean;
|
|
69
|
+
canProceed(): boolean;
|
|
70
|
+
canSave(): boolean;
|
|
71
|
+
goToStep(step: WizardStep): void;
|
|
72
|
+
nextStep(): void;
|
|
73
|
+
prevStep(): void;
|
|
74
|
+
cancel(): void;
|
|
75
|
+
onBackdropClick(event: MouseEvent): void;
|
|
76
|
+
saveDraft(): Promise<MJMLTrainingPipelineEntity | null>;
|
|
77
|
+
saveAndTrain(): Promise<void>;
|
|
78
|
+
private persistPipeline;
|
|
79
|
+
private initFromDefaults;
|
|
80
|
+
private populateFieldItems;
|
|
81
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PSPipelineWizardComponent, never>;
|
|
82
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PSPipelineWizardComponent, "ps-pipeline-wizard", never, { "provider": { "alias": "provider"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "engine": { "alias": "engine"; "required": false; }; "initialAlgorithmName": { "alias": "initialAlgorithmName"; "required": false; }; "initialAlgorithmId": { "alias": "initialAlgorithmId"; "required": false; }; "cloneFromPipeline": { "alias": "cloneFromPipeline"; "required": false; }; "cloneFrom": { "alias": "cloneFrom"; "required": false; }; }, { "closed": "closed"; "saved": "saved"; "trainRequested": "trainRequested"; }, never, never, true, never>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=ps-pipeline-wizard.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ps-pipeline-wizard.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-pipeline-wizard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EAEZ,MAAM,EAIP,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAY,MAAM,sBAAsB,CAAC;AAC1G,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;;AAE5E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,CAAC;AAE7E,qBAiWa,yBAA0B,YAAW,MAAM;IAC7C,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAC1C,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACpC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAQ;IAC7C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IACxD,IAAa,SAAS,CAAC,CAAC,EAAE,0BAA0B,GAAG,IAAI,GAAG,SAAS,EAEtE;IAES,MAAM,qBAA4B;IAClC,KAAK,2CAAkD;IACvD,cAAc,2CAAkD;IAE1E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAExD,WAAW,EAAE,UAAU,CAAU;IACjC,IAAI,UAAS;IACb,SAAS,UAAS;IAGlB,YAAY,SAAM;IAClB,mBAAmB,SAAM;IACzB,gBAAgB,SAAM;IACtB,cAAc,SAAM;IACpB,WAAW,EAAE,WAAW,CAAoB;IAC5C,gBAAgB,SAAS;IACzB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAU;IAChD,UAAU,SAAM;IAChB,cAAc,SAAM;IAGpB,UAAU,EAAE,kBAAkB,EAAE,CAAM;IACtC,iBAAiB,SAAM;IACvB,kBAAkB,SAA+B;IAGjD,mBAAmB,EAAE,QAAQ,GAAG,MAAM,CAAY;IAClD,cAAc,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAY;IACnE,mBAAmB,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAc;IAGjE,mBAAmB,SAAM;IACzB,oBAAoB,SAAO;IAC3B,kBAAkB,SAAK;IACvB,sBAAsB,SAAO;IAC7B,sBAAsB,EAAE,kBAAkB,GAAG,OAAO,CAAsB;IAC1E,cAAc,SAAO;IACrB,MAAM,SAAK;IAEX,QAAQ,IAAI,IAAI;IAIvB,IAAW,iBAAiB,IAAI,UAAU,EAAE,CAI3C;IAED,IAAW,cAAc,IAAI,UAAU,GAAG,IAAI,CAG7C;IAED,IAAW,eAAe,IAAI,eAAe,EAAE,CAE9C;IAED,IAAW,UAAU,IAAI,eAAe,EAAE,CAEzC;IAED,IAAW,gBAAgB,IAAI,MAAM,EAAE,CAKtC;IAED,IAAW,mBAAmB,IAAI,mBAAmB,EAAE,CAEtD;IAED,IAAW,kBAAkB,IAAI,kBAAkB,EAAE,CAIpD;IAED,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOxC,mBAAmB,IAAI,IAAI;IAK3B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKzC,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAQ9C,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IASnC,kBAAkB,IAAI,IAAI;IAgB1B,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAarC,UAAU,IAAI,OAAO;IAIrB,OAAO,IAAI,OAAO;IAUlB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKhC,QAAQ,IAAI,IAAI;IAOhB,QAAQ,IAAI,IAAI;IAOhB,MAAM,IAAI,IAAI;IAId,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAMlC,SAAS,IAAI,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IAIvD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAM5B,eAAe;IA6I7B,OAAO,CAAC,gBAAgB;IAoDxB,OAAO,CAAC,kBAAkB;yCAzZf,yBAAyB;2CAAzB,yBAAyB;CA+arC"}
|