@memberjunction/ng-core-entity-forms 6.2.1 → 6.3.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/README.md +5 -6
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js +3 -3
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +12 -0
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +293 -230
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +11 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +862 -812
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +2 -2
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +12 -0
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +821 -763
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +2 -2
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +10 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +700 -605
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +10 -0
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +223 -175
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +10 -0
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +502 -453
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Companies/company-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Companies/company-header.panel.js +3 -3
- package/dist/lib/custom/Companies/company-header.panel.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Conversations/conversation-header.panel.js +3 -3
- package/dist/lib/custom/Conversations/conversation-header.panel.js.map +1 -1
- package/dist/lib/custom/Employees/employee-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Employees/employee-header.panel.js +3 -3
- package/dist/lib/custom/Employees/employee-header.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +15 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +836 -801
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -2
- package/dist/lib/custom/Files/file-form.component.js +2 -2
- package/dist/lib/custom/Lists/list-form.component.d.ts +5 -0
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +355 -338
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-form.component.js +3 -3
- package/dist/lib/custom/MLModels/ml-model-form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +17 -35
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.js +55 -54
- package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +7 -99
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.js +124 -303
- package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +9 -0
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +493 -444
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +2 -2
- package/dist/lib/custom/Templates/template-param-dialog.component.js +2 -2
- package/dist/lib/custom/Templates/templates-form.component.d.ts +9 -0
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +118 -74
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +471 -451
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +312 -289
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +697 -677
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +453 -433
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/Users/user-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Users/user-header.panel.js +3 -3
- package/dist/lib/custom/Users/user-header.panel.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts +2 -2
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js +30 -13
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +23 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +276 -216
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +7 -1
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +32 -14
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +119 -95
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.js +124 -0
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.js +99 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.js +95 -0
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.js +60 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +124 -106
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.js +12 -4
- package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js +19 -11
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.js +62 -0
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -12
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.js +140 -0
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +69 -15
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js +31 -13
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.js +205 -0
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.js +173 -0
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js +46 -24
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js +22 -14
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.js +175 -0
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js +8 -6
- package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +44 -36
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js +54 -32
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +452 -443
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +27 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/feature-values/feature-values.panel.js +1 -1
- package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +2 -2
- package/dist/lib/shared/phone-hero.d.ts +17 -0
- package/dist/lib/shared/phone-hero.d.ts.map +1 -0
- package/dist/lib/shared/phone-hero.js +30 -0
- package/dist/lib/shared/phone-hero.js.map +1 -0
- package/dist/lib/shared/phone-sections-state.d.ts +28 -0
- package/dist/lib/shared/phone-sections-state.d.ts.map +1 -0
- package/dist/lib/shared/phone-sections-state.js +38 -0
- package/dist/lib/shared/phone-sections-state.js.map +1 -0
- package/package.json +50 -50
|
@@ -68,7 +68,7 @@ function MLModelFormComponentExtended_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
68
68
|
i0.ɵɵadvance();
|
|
69
69
|
i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext)("DefaultExpanded", true);
|
|
70
70
|
i0.ɵɵadvance(2);
|
|
71
|
-
i0.ɵɵproperty("
|
|
71
|
+
i0.ɵɵproperty("Model", ctx_r1.record)("Provider", ctx_r1.ProviderToUse)("CurrentUser", ctx_r1.ProviderToUse.CurrentUser ?? null);
|
|
72
72
|
i0.ɵɵadvance();
|
|
73
73
|
i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext);
|
|
74
74
|
i0.ɵɵadvance();
|
|
@@ -148,7 +148,7 @@ let MLModelFormComponentExtended = class MLModelFormComponentExtended extends MJ
|
|
|
148
148
|
]);
|
|
149
149
|
}
|
|
150
150
|
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMLModelFormComponentExtended_BaseFactory; return function MLModelFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMLModelFormComponentExtended_BaseFactory || (ɵMLModelFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MLModelFormComponentExtended)))(__ngFactoryType__ || MLModelFormComponentExtended); }; })(); }
|
|
151
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MLModelFormComponentExtended, selectors: [["mj-ml-model-form-extended"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Record", "FormComponent"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent"], ["Slot", "before-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "modelOverview", "SectionName", "Overview & Lifecycle", "Icon", "fa-solid fa-gauge-high", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded"], [1, "ml-model-form-content"], [3, "
|
|
151
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MLModelFormComponentExtended, selectors: [["mj-ml-model-form-extended"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Record", "FormComponent"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent"], ["Slot", "before-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "modelOverview", "SectionName", "Overview & Lifecycle", "Icon", "fa-solid fa-gauge-high", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded"], [1, "ml-model-form-content"], [3, "Model", "Provider", "CurrentUser"], ["SectionKey", "modelIdentityStatus", "SectionName", "Model Identity & Status", "Icon", "fa fa-tag", 3, "Form", "FormContext"], ["FieldName", "PipelineID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Version", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "AlgorithmID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ArtifactFileID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Lineage", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Status", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "schemaConfiguration", "SectionName", "Schema & Configuration", "Icon", "fa fa-sliders-h", 3, "Form", "FormContext"], ["FieldName", "FittedPreprocessing", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "FeatureSchema", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TargetVariable", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ProblemType", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "trainingPerformance", "SectionName", "Training & Performance", "Icon", "fa fa-chart-line", 3, "Form", "FormContext"], ["FieldName", "Metrics", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "HoldoutMetrics", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "FeatureImportance", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainedAt", "Type", "datepicker", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainingDurationSec", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainingRowCount", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "systemMetadata", "SectionName", "System Metadata", "Icon", "fa fa-cog", 3, "Form", "FormContext"], ["FieldName", "__mj_CreatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "__mj_UpdatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["Slot", "after-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "mJMLTrainingRuns", "SectionName", "ML Training Runs", "Icon", "fa-solid fa-flask", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["SectionKey", "mJMLModelScoringBindings", "SectionName", "ML Model Scoring Bindings", "Icon", "fa-solid fa-satellite-dish", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["Slot", "after-related", 3, "Entity", "Record", "FormComponent", "FormContext"], [3, "Navigate", "AfterDataLoad", "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"]], template: function MLModelFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
152
152
|
i0.ɵɵconditionalCreate(0, MLModelFormComponentExtended_Conditional_0_Template, 33, 113, "mj-record-form-container", 0);
|
|
153
153
|
} if (rf & 2) {
|
|
154
154
|
i0.ɵɵconditional(ctx.record ? 0 : -1);
|
|
@@ -160,7 +160,7 @@ MLModelFormComponentExtended = __decorate([
|
|
|
160
160
|
export { MLModelFormComponentExtended };
|
|
161
161
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MLModelFormComponentExtended, [{
|
|
162
162
|
type: Component,
|
|
163
|
-
args: [{ standalone: false, selector: 'mj-ml-model-form-extended', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [model]=\"record\"\n [provider]=\"ProviderToUse\"\n [currentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: [".ml-model-form-content {\n padding: 20px 24px;\n max-width: 1200px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n}\n"] }]
|
|
163
|
+
args: [{ standalone: false, selector: 'mj-ml-model-form-extended', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [Model]=\"record\"\n [Provider]=\"ProviderToUse\"\n [CurrentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: [".ml-model-form-content {\n padding: 20px 24px;\n max-width: 1200px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n}\n"] }]
|
|
164
164
|
}], null, null); })();
|
|
165
165
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MLModelFormComponentExtended, { className: "MLModelFormComponentExtended", filePath: "src/lib/custom/MLModels/ml-model-form.component.ts", lineNumber: 21 }); })();
|
|
166
166
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ml-model-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-form.component.ts","../../../../src/lib/custom/MLModels/ml-model-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { RegisterClass, RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormComponent, BaseFormPolicy, FormChromeContext, FormChromeSpec } from '@memberjunction/ng-base-forms';\nimport { MJMLModelFormComponent } from '../../generated/Entities/MJMLModel/mjmlmodel.form.component';\n\n/**\n * Custom form override for `MJ: ML Models` (priority 100).\n * Presents the ML Model in a left-nav experience with:\n * - Lead panel: \"Overview & Lifecycle\" (<ps-model-detail>)\n * - Details card: Model Identity & Status, Schema & Configuration, Training & Performance\n * - Related grids: ML Training Runs, ML Model Scoring Bindings\n * - More folder: System Metadata\n */\n@RegisterClass(BaseFormComponent, 'MJ: ML Models', 100)\n@Component({\n standalone: false,\n selector: 'mj-ml-model-form-extended',\n templateUrl: './ml-model-form.component.html',\n styleUrls: ['./ml-model-form.component.css'],\n})\nexport class MLModelFormComponentExtended extends MJMLModelFormComponent implements OnInit {\n override async ngOnInit() {\n await super.ngOnInit();\n this.initSections([\n { sectionKey: 'modelOverview', sectionName: 'Overview & Lifecycle', isExpanded: true },\n { sectionKey: 'modelIdentityStatus', sectionName: 'Model Identity & Status', isExpanded: true },\n { sectionKey: 'schemaConfiguration', sectionName: 'Schema & Configuration', isExpanded: true },\n { sectionKey: 'trainingPerformance', sectionName: 'Training & Performance', isExpanded: true },\n { sectionKey: 'systemMetadata', sectionName: 'System Metadata', isExpanded: false },\n { sectionKey: 'mJMLTrainingRuns', sectionName: 'ML Training Runs', isExpanded: false },\n { sectionKey: 'mJMLModelScoringBindings', sectionName: 'ML Model Scoring Bindings', isExpanded: false }\n ]);\n }\n}\n\n/**\n * Policy ensuring that the Overview & Lifecycle panel sits as the lead group\n * before the Details group on the left-nav rail.\n */\n@RegisterClassEx(BaseFormPolicy, { key: 'MJ: ML Models', metadata: { entity: 'MJ: ML Models' } })\nexport class MLModelFormPolicy extends BaseFormPolicy {\n public override DecorateChrome(spec: FormChromeSpec, _ctx: FormChromeContext): FormChromeSpec {\n const overview = spec.Groups.find(g => g.Key === 'modelOverview');\n if (overview) {\n overview.IsLead = true;\n const remaining = spec.Groups.filter(g => g.Key !== 'modelOverview');\n return {\n ...spec,\n Groups: [overview, ...remaining],\n };\n }\n return spec;\n }\n}\n\n/** Tree-shaking guard so the override and policy register with the ClassFactory. */\nexport function LoadMLModelFormComponentExtended(): void {\n void MLModelFormComponentExtended;\n void MLModelFormPolicy;\n}\n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [model]=\"record\"\n [provider]=\"ProviderToUse\"\n [currentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ml-model-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-form.component.ts","../../../../src/lib/custom/MLModels/ml-model-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { RegisterClass, RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormComponent, BaseFormPolicy, FormChromeContext, FormChromeSpec } from '@memberjunction/ng-base-forms';\nimport { MJMLModelFormComponent } from '../../generated/Entities/MJMLModel/mjmlmodel.form.component';\n\n/**\n * Custom form override for `MJ: ML Models` (priority 100).\n * Presents the ML Model in a left-nav experience with:\n * - Lead panel: \"Overview & Lifecycle\" (<ps-model-detail>)\n * - Details card: Model Identity & Status, Schema & Configuration, Training & Performance\n * - Related grids: ML Training Runs, ML Model Scoring Bindings\n * - More folder: System Metadata\n */\n@RegisterClass(BaseFormComponent, 'MJ: ML Models', 100)\n@Component({\n standalone: false,\n selector: 'mj-ml-model-form-extended',\n templateUrl: './ml-model-form.component.html',\n styleUrls: ['./ml-model-form.component.css'],\n})\nexport class MLModelFormComponentExtended extends MJMLModelFormComponent implements OnInit {\n override async ngOnInit() {\n await super.ngOnInit();\n this.initSections([\n { sectionKey: 'modelOverview', sectionName: 'Overview & Lifecycle', isExpanded: true },\n { sectionKey: 'modelIdentityStatus', sectionName: 'Model Identity & Status', isExpanded: true },\n { sectionKey: 'schemaConfiguration', sectionName: 'Schema & Configuration', isExpanded: true },\n { sectionKey: 'trainingPerformance', sectionName: 'Training & Performance', isExpanded: true },\n { sectionKey: 'systemMetadata', sectionName: 'System Metadata', isExpanded: false },\n { sectionKey: 'mJMLTrainingRuns', sectionName: 'ML Training Runs', isExpanded: false },\n { sectionKey: 'mJMLModelScoringBindings', sectionName: 'ML Model Scoring Bindings', isExpanded: false }\n ]);\n }\n}\n\n/**\n * Policy ensuring that the Overview & Lifecycle panel sits as the lead group\n * before the Details group on the left-nav rail.\n */\n@RegisterClassEx(BaseFormPolicy, { key: 'MJ: ML Models', metadata: { entity: 'MJ: ML Models' } })\nexport class MLModelFormPolicy extends BaseFormPolicy {\n public override DecorateChrome(spec: FormChromeSpec, _ctx: FormChromeContext): FormChromeSpec {\n const overview = spec.Groups.find(g => g.Key === 'modelOverview');\n if (overview) {\n overview.IsLead = true;\n const remaining = spec.Groups.filter(g => g.Key !== 'modelOverview');\n return {\n ...spec,\n Groups: [overview, ...remaining],\n };\n }\n return spec;\n }\n}\n\n/** Tree-shaking guard so the override and policy register with the ClassFactory. */\nexport function LoadMLModelFormComponentExtended(): void {\n void MLModelFormComponentExtended;\n void MLModelFormPolicy;\n}\n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [Model]=\"record\"\n [Provider]=\"ProviderToUse\"\n [CurrentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n"]}
|
|
@@ -10,7 +10,7 @@ export interface PSMetricDisplay {
|
|
|
10
10
|
value: string;
|
|
11
11
|
raw: number;
|
|
12
12
|
}
|
|
13
|
-
export type PSMetricKey = 'AUC' | 'Accuracy' | 'Precision' | 'Recall' | 'F1' | 'LogLoss' | 'R2' | 'RMSE' | 'MAE';
|
|
13
|
+
export type PSMetricKey = 'AUC' | 'Accuracy' | 'Precision' | 'Recall' | 'F1' | 'LogLoss' | 'MulticlassLogLoss' | 'Brier' | 'R2' | 'RMSE' | 'MAE' | 'PoissonDeviance' | 'TweedieDeviance' | 'MASE';
|
|
14
14
|
export type PSMetricMap = Partial<Record<PSMetricKey, number>>;
|
|
15
15
|
export declare const PS_KNOWN_METRIC_KEYS: readonly PSMetricKey[];
|
|
16
16
|
export declare const METRIC_LABELS: Record<PSMetricKey, string>;
|
|
@@ -22,61 +22,43 @@ export declare const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;
|
|
|
22
22
|
* keeps an `Is` prefix and sentence-cases snake_case names.
|
|
23
23
|
*/
|
|
24
24
|
export declare function HumanizeFeatureName(name: string): string;
|
|
25
|
-
/** @deprecated Use {@link HumanizeFeatureName}. */
|
|
26
|
-
export declare function humanizeFeatureName(name: string): string;
|
|
27
25
|
export declare function ParseMetrics(json: string | null | undefined): PSMetricMap;
|
|
28
|
-
/** @deprecated Use {@link ParseMetrics}. */
|
|
29
|
-
export declare function parseMetrics(json: string | null | undefined): PSMetricMap;
|
|
30
26
|
export declare function CanonicalMetricKey(rawKey: string): PSMetricKey | null;
|
|
31
|
-
/** @deprecated Use {@link CanonicalMetricKey}. */
|
|
32
|
-
export declare function canonicalMetricKey(rawKey: string): PSMetricKey | null;
|
|
33
27
|
export declare function FormatMetricValue(key: PSMetricKey | string, val: number): string;
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
export declare function PrimaryModelScore(model: {
|
|
37
|
-
Metrics?: string | null;
|
|
38
|
-
HoldoutMetrics?: string | null;
|
|
39
|
-
ProblemType?: string | null;
|
|
40
|
-
}): {
|
|
28
|
+
/** A model's score as the form shows it: the metric, its label and the value. */
|
|
29
|
+
type PSModelScore = {
|
|
41
30
|
key: PSMetricKey;
|
|
42
31
|
label: string;
|
|
43
32
|
value: number;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* The primary metric score of a model: holdout preferred, else training. R² first for a regression, AUC for a
|
|
36
|
+
* classification; failing those, the first metric the holdout stores, which a trained model's holdout lists first as the
|
|
37
|
+
* protocol's primary proper score (all a kept simple baseline or a forecast stores).
|
|
38
|
+
*/
|
|
39
|
+
export declare function PrimaryModelScore(model: {
|
|
47
40
|
Metrics?: string | null;
|
|
48
41
|
HoldoutMetrics?: string | null;
|
|
49
42
|
ProblemType?: string | null;
|
|
50
|
-
}):
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
}): PSModelScore | null;
|
|
44
|
+
/**
|
|
45
|
+
* Whether a model's train-side `Metrics` hold an inner cross-validation estimate rather than an in-sample score: true
|
|
46
|
+
* for a model trained under an Evaluation Protocol, whose lineage names the protocol (`evaluationProtocolId`).
|
|
47
|
+
*/
|
|
48
|
+
export declare function TrainScoreIsInnerCv(lineageJson: string | null | undefined): boolean;
|
|
55
49
|
export declare function MetricsToDisplay(metrics: PSMetricMap, options?: {
|
|
56
50
|
excludeAuc?: boolean;
|
|
57
51
|
}): PSMetricDisplay[];
|
|
58
|
-
/** @deprecated Use {@link MetricsToDisplay}. */
|
|
59
|
-
export declare function metricsToDisplay(metrics: PSMetricMap, options?: {
|
|
60
|
-
excludeAuc?: boolean;
|
|
61
|
-
}): PSMetricDisplay[];
|
|
62
52
|
export declare function ParseFeatureImportance(raw: string | null | undefined, topN?: number): PSFeatureBar[];
|
|
63
|
-
/** @deprecated Use {@link ParseFeatureImportance}. */
|
|
64
|
-
export declare function parseFeatureImportance(raw: string | null | undefined, topN?: number): PSFeatureBar[];
|
|
65
53
|
export declare function MaxFeatureImportance(raw: string | null | undefined): number | null;
|
|
66
|
-
/** @deprecated Use {@link MaxFeatureImportance}. */
|
|
67
|
-
export declare function maxFeatureImportance(raw: string | null | undefined): number | null;
|
|
68
54
|
export declare function OverfitGap(model: {
|
|
69
55
|
Metrics?: string | null;
|
|
70
56
|
HoldoutMetrics?: string | null;
|
|
71
57
|
}): number | null;
|
|
72
|
-
/** @deprecated Use {@link OverfitGap}. */
|
|
73
|
-
export declare function overfitGap(model: {
|
|
74
|
-
Metrics?: string | null;
|
|
75
|
-
HoldoutMetrics?: string | null;
|
|
76
|
-
}): number | null;
|
|
77
58
|
/** The importance a model view may show. */
|
|
78
59
|
export declare class ModelImportanceView {
|
|
79
60
|
/** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */
|
|
80
61
|
static DisplayedFeatureImportance(lineageJSON: string | null | undefined, raw: string | null | undefined, topN?: number): PSFeatureBar[];
|
|
81
62
|
}
|
|
63
|
+
export {};
|
|
82
64
|
//# sourceMappingURL=ml-model-view-models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ml-model-view-models.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GACnB,KAAK,GACL,UAAU,GACV,WAAW,GACX,QAAQ,GACR,IAAI,GACJ,SAAS,GACT,IAAI,GACJ,MAAM,GACN,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"ml-model-view-models.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GACnB,KAAK,GACL,UAAU,GACV,WAAW,GACX,QAAQ,GACR,IAAI,GACJ,SAAS,GACT,mBAAmB,GACnB,OAAO,GACP,IAAI,GACJ,MAAM,GACN,KAAK,GACL,iBAAiB,GACjB,iBAAiB,GACjB,MAAM,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/D,eAAO,MAAM,oBAAoB,EAAE,SAAS,WAAW,EAe7C,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAerD,CAAC;AA+BF,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAiBzE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAIrE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBhF;AAED,iFAAiF;AACjF,KAAK,YAAY,GAAG;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC9F,YAAY,GAAG,IAAI,CAOrB;AAgBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQnF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,eAAe,EAAE,CAehH;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,GAAE,MAAU,GAAG,YAAY,EAAE,CAyCvG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKlF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAU5G;AAED,4CAA4C;AAC5C,qBAAa,mBAAmB;IAC9B,0LAA0L;WAC5K,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,GAAE,MAAU,GAAG,YAAY,EAAE;CAGnJ"}
|
|
@@ -10,9 +10,14 @@ export const PS_KNOWN_METRIC_KEYS = [
|
|
|
10
10
|
'Recall',
|
|
11
11
|
'F1',
|
|
12
12
|
'LogLoss',
|
|
13
|
+
'MulticlassLogLoss',
|
|
14
|
+
'Brier',
|
|
13
15
|
'R2',
|
|
14
16
|
'RMSE',
|
|
15
17
|
'MAE',
|
|
18
|
+
'PoissonDeviance',
|
|
19
|
+
'TweedieDeviance',
|
|
20
|
+
'MASE',
|
|
16
21
|
];
|
|
17
22
|
export const METRIC_LABELS = {
|
|
18
23
|
AUC: 'AUC (ROC)',
|
|
@@ -21,9 +26,14 @@ export const METRIC_LABELS = {
|
|
|
21
26
|
Recall: 'Recall',
|
|
22
27
|
F1: 'F1 Score',
|
|
23
28
|
LogLoss: 'Log Loss',
|
|
29
|
+
MulticlassLogLoss: 'Multiclass Log Loss',
|
|
30
|
+
Brier: 'Brier Score',
|
|
24
31
|
R2: 'R² (Fit)',
|
|
25
32
|
RMSE: 'RMSE',
|
|
26
33
|
MAE: 'MAE',
|
|
34
|
+
PoissonDeviance: 'Poisson Deviance',
|
|
35
|
+
TweedieDeviance: 'Tweedie Deviance',
|
|
36
|
+
MASE: 'MASE',
|
|
27
37
|
};
|
|
28
38
|
const METRIC_ALIASES = {
|
|
29
39
|
auc: 'AUC',
|
|
@@ -41,6 +51,12 @@ const METRIC_ALIASES = {
|
|
|
41
51
|
logloss: 'LogLoss',
|
|
42
52
|
'log-loss': 'LogLoss',
|
|
43
53
|
log_loss: 'LogLoss',
|
|
54
|
+
'multiclass-log-loss': 'MulticlassLogLoss',
|
|
55
|
+
brier: 'Brier',
|
|
56
|
+
brier_score: 'Brier',
|
|
57
|
+
'poisson-deviance': 'PoissonDeviance',
|
|
58
|
+
'tweedie-deviance': 'TweedieDeviance',
|
|
59
|
+
mase: 'MASE',
|
|
44
60
|
r2: 'R2',
|
|
45
61
|
'r-squared': 'R2',
|
|
46
62
|
r_squared: 'R2',
|
|
@@ -64,10 +80,6 @@ export function HumanizeFeatureName(name) {
|
|
|
64
80
|
.trim()
|
|
65
81
|
.replace(/\b[a-z]/g, (c) => c.toUpperCase());
|
|
66
82
|
}
|
|
67
|
-
/** @deprecated Use {@link HumanizeFeatureName}. */
|
|
68
|
-
export function humanizeFeatureName(name) {
|
|
69
|
-
return HumanizeFeatureName(name);
|
|
70
|
-
}
|
|
71
83
|
export function ParseMetrics(json) {
|
|
72
84
|
if (!json)
|
|
73
85
|
return {};
|
|
@@ -91,20 +103,12 @@ export function ParseMetrics(json) {
|
|
|
91
103
|
}
|
|
92
104
|
return out;
|
|
93
105
|
}
|
|
94
|
-
/** @deprecated Use {@link ParseMetrics}. */
|
|
95
|
-
export function parseMetrics(json) {
|
|
96
|
-
return ParseMetrics(json);
|
|
97
|
-
}
|
|
98
106
|
export function CanonicalMetricKey(rawKey) {
|
|
99
107
|
const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);
|
|
100
108
|
if (exact)
|
|
101
109
|
return exact;
|
|
102
110
|
return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;
|
|
103
111
|
}
|
|
104
|
-
/** @deprecated Use {@link CanonicalMetricKey}. */
|
|
105
|
-
export function canonicalMetricKey(rawKey) {
|
|
106
|
-
return CanonicalMetricKey(rawKey);
|
|
107
|
-
}
|
|
108
112
|
export function FormatMetricValue(key, val) {
|
|
109
113
|
if (!Number.isFinite(val))
|
|
110
114
|
return '—';
|
|
@@ -117,44 +121,57 @@ export function FormatMetricValue(key, val) {
|
|
|
117
121
|
case 'R2':
|
|
118
122
|
return val.toFixed(3);
|
|
119
123
|
case 'LogLoss':
|
|
124
|
+
case 'MulticlassLogLoss':
|
|
125
|
+
case 'Brier':
|
|
120
126
|
case 'RMSE':
|
|
121
127
|
case 'MAE':
|
|
128
|
+
case 'PoissonDeviance':
|
|
129
|
+
case 'TweedieDeviance':
|
|
130
|
+
case 'MASE':
|
|
122
131
|
return val < 10 ? val.toFixed(3) : val.toLocaleString(undefined, { maximumFractionDigits: 2 });
|
|
123
132
|
default:
|
|
124
133
|
return val.toFixed(3);
|
|
125
134
|
}
|
|
126
135
|
}
|
|
127
|
-
/**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
136
|
+
/**
|
|
137
|
+
* The primary metric score of a model: holdout preferred, else training. R² first for a regression, AUC for a
|
|
138
|
+
* classification; failing those, the first metric the holdout stores, which a trained model's holdout lists first as the
|
|
139
|
+
* protocol's primary proper score (all a kept simple baseline or a forecast stores).
|
|
140
|
+
*/
|
|
131
141
|
export function PrimaryModelScore(model) {
|
|
132
|
-
const
|
|
142
|
+
const preferred = (model.ProblemType ?? '').toLowerCase() === 'regression'
|
|
143
|
+
? ['R2', 'RMSE', 'MAE', 'AUC', 'Accuracy', 'F1']
|
|
144
|
+
: ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'];
|
|
133
145
|
const holdout = ParseMetrics(model.HoldoutMetrics);
|
|
134
146
|
const train = ParseMetrics(model.Metrics);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
147
|
+
return preferredScore(holdout, preferred) || firstStoredScore(holdout) || preferredScore(train, preferred) || firstStoredScore(train);
|
|
148
|
+
}
|
|
149
|
+
/** The first of `keys` the map holds. */
|
|
150
|
+
function preferredScore(metrics, keys) {
|
|
151
|
+
const key = keys.find((k) => metrics[k] != null);
|
|
152
|
+
const value = key === undefined ? undefined : metrics[key];
|
|
153
|
+
return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };
|
|
154
|
+
}
|
|
155
|
+
/** The first metric the map holds, in the order the stored JSON lists them. */
|
|
156
|
+
function firstStoredScore(metrics) {
|
|
157
|
+
const key = Object.keys(metrics).map((k) => CanonicalMetricKey(k)).find((k) => k !== null);
|
|
158
|
+
const value = key === undefined ? undefined : metrics[key];
|
|
159
|
+
return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Whether a model's train-side `Metrics` hold an inner cross-validation estimate rather than an in-sample score: true
|
|
163
|
+
* for a model trained under an Evaluation Protocol, whose lineage names the protocol (`evaluationProtocolId`).
|
|
164
|
+
*/
|
|
165
|
+
export function TrainScoreIsInnerCv(lineageJson) {
|
|
166
|
+
if (!lineageJson)
|
|
167
|
+
return false;
|
|
168
|
+
try {
|
|
169
|
+
const parsed = JSON.parse(lineageJson);
|
|
170
|
+
return typeof parsed?.evaluationProtocolId === 'string' && parsed.evaluationProtocolId.length > 0;
|
|
148
171
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return { key: k, label: METRIC_LABELS[k], value: train[k] };
|
|
172
|
+
catch {
|
|
173
|
+
return false;
|
|
152
174
|
}
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
/** @deprecated Use {@link PrimaryModelScore}. */
|
|
156
|
-
export function primaryModelScore(model) {
|
|
157
|
-
return PrimaryModelScore(model);
|
|
158
175
|
}
|
|
159
176
|
export function MetricsToDisplay(metrics, options = {}) {
|
|
160
177
|
const out = [];
|
|
@@ -173,10 +190,6 @@ export function MetricsToDisplay(metrics, options = {}) {
|
|
|
173
190
|
}
|
|
174
191
|
return out;
|
|
175
192
|
}
|
|
176
|
-
/** @deprecated Use {@link MetricsToDisplay}. */
|
|
177
|
-
export function metricsToDisplay(metrics, options = {}) {
|
|
178
|
-
return MetricsToDisplay(metrics, options);
|
|
179
|
-
}
|
|
180
193
|
export function ParseFeatureImportance(raw, topN = 6) {
|
|
181
194
|
if (!raw)
|
|
182
195
|
return [];
|
|
@@ -218,10 +231,6 @@ export function ParseFeatureImportance(raw, topN = 6) {
|
|
|
218
231
|
warning: e.val >= PS_FEATURE_DOMINANCE_THRESHOLD,
|
|
219
232
|
}));
|
|
220
233
|
}
|
|
221
|
-
/** @deprecated Use {@link ParseFeatureImportance}. */
|
|
222
|
-
export function parseFeatureImportance(raw, topN = 6) {
|
|
223
|
-
return ParseFeatureImportance(raw, topN);
|
|
224
|
-
}
|
|
225
234
|
export function MaxFeatureImportance(raw) {
|
|
226
235
|
const bars = ParseFeatureImportance(raw, 1);
|
|
227
236
|
if (bars.length === 0)
|
|
@@ -229,10 +238,6 @@ export function MaxFeatureImportance(raw) {
|
|
|
229
238
|
const num = parseFloat(bars[0].value);
|
|
230
239
|
return Number.isFinite(num) ? num : null;
|
|
231
240
|
}
|
|
232
|
-
/** @deprecated Use {@link MaxFeatureImportance}. */
|
|
233
|
-
export function maxFeatureImportance(raw) {
|
|
234
|
-
return MaxFeatureImportance(raw);
|
|
235
|
-
}
|
|
236
241
|
export function OverfitGap(model) {
|
|
237
242
|
const train = ParseMetrics(model.Metrics);
|
|
238
243
|
const holdout = ParseMetrics(model.HoldoutMetrics);
|
|
@@ -244,10 +249,6 @@ export function OverfitGap(model) {
|
|
|
244
249
|
}
|
|
245
250
|
return null;
|
|
246
251
|
}
|
|
247
|
-
/** @deprecated Use {@link OverfitGap}. */
|
|
248
|
-
export function overfitGap(model) {
|
|
249
|
-
return OverfitGap(model);
|
|
250
|
-
}
|
|
251
252
|
/** The importance a model view may show. */
|
|
252
253
|
export class ModelImportanceView {
|
|
253
254
|
/** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ml-model-view-models.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure view-model functions and types for ML Model detail and metrics rendering.\n * Framework-free, deterministic calculations over plain model entity data.\n */\nimport { ImportanceDisplay } from '@memberjunction/predictive-studio-core';\n\nexport interface PSFeatureBar {\n name: string;\n value: string;\n pct: number;\n warning: boolean;\n}\n\nexport interface PSMetricDisplay {\n key: string;\n label: string;\n value: string;\n raw: number;\n}\n\nexport type PSMetricKey =\n | 'AUC'\n | 'Accuracy'\n | 'Precision'\n | 'Recall'\n | 'F1'\n | 'LogLoss'\n | 'R2'\n | 'RMSE'\n | 'MAE';\n\nexport type PSMetricMap = Partial<Record<PSMetricKey, number>>;\n\nexport const PS_KNOWN_METRIC_KEYS: readonly PSMetricKey[] = [\n 'AUC',\n 'Accuracy',\n 'Precision',\n 'Recall',\n 'F1',\n 'LogLoss',\n 'R2',\n 'RMSE',\n 'MAE',\n] as const;\n\nexport const METRIC_LABELS: Record<PSMetricKey, string> = {\n AUC: 'AUC (ROC)',\n Accuracy: 'Accuracy',\n Precision: 'Precision',\n Recall: 'Recall',\n F1: 'F1 Score',\n LogLoss: 'Log Loss',\n R2: 'R² (Fit)',\n RMSE: 'RMSE',\n MAE: 'MAE',\n};\n\nconst METRIC_ALIASES: Record<string, PSMetricKey> = {\n auc: 'AUC',\n 'roc-auc': 'AUC',\n roc_auc: 'AUC',\n acc: 'Accuracy',\n accuracy: 'Accuracy',\n prec: 'Precision',\n precision: 'Precision',\n rec: 'Recall',\n recall: 'Recall',\n f1: 'F1',\n 'f1-score': 'F1',\n f1_score: 'F1',\n logloss: 'LogLoss',\n 'log-loss': 'LogLoss',\n log_loss: 'LogLoss',\n r2: 'R2',\n 'r-squared': 'R2',\n r_squared: 'R2',\n rmse: 'RMSE',\n mae: 'MAE',\n};\n\nexport const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;\n\n/**\n * The ML Model form's label for a feature column: drops a leading `Is` before a capital, splits camelCase, turns `_`\n * into spaces and title-cases every word (`IsActive` → `Active`, `membership_type` → `Membership Type`). A published\n * export whose output is fixed; the dashboards' at-risk drivers use `AtRiskRules.HumanizeFeatureName` (predictive-studio-core), which\n * keeps an `Is` prefix and sentence-cases snake_case names.\n */\nexport function HumanizeFeatureName(name: string): string {\n if (!name) return '';\n return name\n .replace(/^Is([A-Z])/, '$1')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .trim()\n .replace(/\\b[a-z]/g, (c) => c.toUpperCase());\n}\n\n/** @deprecated Use {@link HumanizeFeatureName}. */\nexport function humanizeFeatureName(name: string): string {\n return HumanizeFeatureName(name);\n}\n\nexport function ParseMetrics(json: string | null | undefined): PSMetricMap {\n if (!json) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return {};\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n const out: PSMetricMap = {};\n for (const [rawKey, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = typeof rawVal === 'number' && Number.isFinite(rawVal) ? rawVal : null;\n if (value == null) continue;\n const canonical = CanonicalMetricKey(rawKey);\n if (canonical && out[canonical] == null) out[canonical] = value;\n }\n return out;\n}\n\n/** @deprecated Use {@link ParseMetrics}. */\nexport function parseMetrics(json: string | null | undefined): PSMetricMap {\n return ParseMetrics(json);\n}\n\nexport function CanonicalMetricKey(rawKey: string): PSMetricKey | null {\n const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);\n if (exact) return exact;\n return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;\n}\n\n/** @deprecated Use {@link CanonicalMetricKey}. */\nexport function canonicalMetricKey(rawKey: string): PSMetricKey | null {\n return CanonicalMetricKey(rawKey);\n}\n\nexport function FormatMetricValue(key: PSMetricKey | string, val: number): string {\n if (!Number.isFinite(val)) return '—';\n switch (key) {\n case 'AUC':\n case 'Accuracy':\n case 'Precision':\n case 'Recall':\n case 'F1':\n case 'R2':\n return val.toFixed(3);\n case 'LogLoss':\n case 'RMSE':\n case 'MAE':\n return val < 10 ? val.toFixed(3) : val.toLocaleString(undefined, { maximumFractionDigits: 2 });\n default:\n return val.toFixed(3);\n }\n}\n\n/** @deprecated Use {@link FormatMetricValue}. */\nexport function formatMetricValue(key: PSMetricKey | string, val: number): string {\n return FormatMetricValue(key, val);\n}\n\nexport function PrimaryModelScore(\n model: { Metrics?: string | null; HoldoutMetrics?: string | null; ProblemType?: string | null },\n): { key: PSMetricKey; label: string; value: number } | null {\n const isReg = (model.ProblemType ?? '').toLowerCase() === 'regression';\n const holdout = ParseMetrics(model.HoldoutMetrics);\n const train = ParseMetrics(model.Metrics);\n\n if (isReg) {\n for (const k of ['R2', 'RMSE', 'MAE'] as const) {\n if (holdout[k] != null) return { key: k, label: METRIC_LABELS[k], value: holdout[k]! };\n }\n for (const k of ['R2', 'RMSE', 'MAE'] as const) {\n if (train[k] != null) return { key: k, label: METRIC_LABELS[k], value: train[k]! };\n }\n }\n\n for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'] as const) {\n if (holdout[k] != null) return { key: k, label: METRIC_LABELS[k], value: holdout[k]! };\n }\n for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'] as const) {\n if (train[k] != null) return { key: k, label: METRIC_LABELS[k], value: train[k]! };\n }\n return null;\n}\n\n/** @deprecated Use {@link PrimaryModelScore}. */\nexport function primaryModelScore(\n model: { Metrics?: string | null; HoldoutMetrics?: string | null; ProblemType?: string | null },\n): { key: PSMetricKey; label: string; value: number } | null {\n return PrimaryModelScore(model);\n}\n\nexport function MetricsToDisplay(metrics: PSMetricMap, options: { excludeAuc?: boolean } = {}): PSMetricDisplay[] {\n const out: PSMetricDisplay[] = [];\n for (const k of PS_KNOWN_METRIC_KEYS) {\n if (options.excludeAuc && k === 'AUC') continue;\n const v = metrics[k];\n if (v != null) {\n out.push({\n key: k,\n label: METRIC_LABELS[k] ?? k,\n value: FormatMetricValue(k, v),\n raw: v,\n });\n }\n }\n return out;\n}\n\n/** @deprecated Use {@link MetricsToDisplay}. */\nexport function metricsToDisplay(metrics: PSMetricMap, options: { excludeAuc?: boolean } = {}): PSMetricDisplay[] {\n return MetricsToDisplay(metrics, options);\n}\n\nexport function ParseFeatureImportance(raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n if (!raw) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n\n const entries: { name: string; val: number }[] = [];\n\n if (Array.isArray(parsed)) {\n for (const item of parsed as Array<{ feature?: unknown; name?: unknown; importance?: unknown; weight?: unknown; value?: unknown }>) {\n const name = typeof item?.feature === 'string' ? item.feature : typeof item?.name === 'string' ? item.name : '';\n const rawVal = typeof item?.importance === 'number' ? item.importance : typeof item?.weight === 'number' ? item.weight : typeof item?.value === 'number' ? item.value : NaN;\n const val = Number(rawVal);\n if (name && Number.isFinite(val)) {\n entries.push({ name, val: Math.abs(val) });\n }\n }\n } else if (parsed && typeof parsed === 'object') {\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n const val = typeof v === 'number' && Number.isFinite(v) ? Math.abs(v) : NaN;\n if (k && Number.isFinite(val)) {\n entries.push({ name: k, val });\n }\n }\n }\n\n if (entries.length === 0) return [];\n\n entries.sort((a, b) => b.val - a.val);\n const sliced = entries.slice(0, topN);\n const max = sliced[0]?.val ?? 1;\n\n return sliced.map((e) => ({\n name: e.name,\n value: e.val < 1 ? e.val.toFixed(3) : e.val.toFixed(1),\n pct: max > 0 ? Math.round((e.val / max) * 100) : 0,\n warning: e.val >= PS_FEATURE_DOMINANCE_THRESHOLD,\n }));\n}\n\n/** @deprecated Use {@link ParseFeatureImportance}. */\nexport function parseFeatureImportance(raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n return ParseFeatureImportance(raw, topN);\n}\n\nexport function MaxFeatureImportance(raw: string | null | undefined): number | null {\n const bars = ParseFeatureImportance(raw, 1);\n if (bars.length === 0) return null;\n const num = parseFloat(bars[0].value);\n return Number.isFinite(num) ? num : null;\n}\n\n/** @deprecated Use {@link MaxFeatureImportance}. */\nexport function maxFeatureImportance(raw: string | null | undefined): number | null {\n return MaxFeatureImportance(raw);\n}\n\nexport function OverfitGap(model: { Metrics?: string | null; HoldoutMetrics?: string | null }): number | null {\n const train = ParseMetrics(model.Metrics);\n const holdout = ParseMetrics(model.HoldoutMetrics);\n if (train.AUC != null && holdout.AUC != null) {\n return train.AUC - holdout.AUC;\n }\n if (train.R2 != null && holdout.R2 != null) {\n return train.R2 - holdout.R2;\n }\n return null;\n}\n\n/** @deprecated Use {@link OverfitGap}. */\nexport function overfitGap(model: { Metrics?: string | null; HoldoutMetrics?: string | null }): number | null {\n return OverfitGap(model);\n}\n\n/** The importance a model view may show. */\nexport class ModelImportanceView {\n /** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */\n public static DisplayedFeatureImportance(lineageJSON: string | null | undefined, raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n return ImportanceDisplay.GlobalDriversShowable(lineageJSON) ? ParseFeatureImportance(raw, topN) : [];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ml-model-view-models.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure view-model functions and types for ML Model detail and metrics rendering.\n * Framework-free, deterministic calculations over plain model entity data.\n */\nimport { ImportanceDisplay } from '@memberjunction/predictive-studio-core';\n\nexport interface PSFeatureBar {\n name: string;\n value: string;\n pct: number;\n warning: boolean;\n}\n\nexport interface PSMetricDisplay {\n key: string;\n label: string;\n value: string;\n raw: number;\n}\n\nexport type PSMetricKey =\n | 'AUC'\n | 'Accuracy'\n | 'Precision'\n | 'Recall'\n | 'F1'\n | 'LogLoss'\n | 'MulticlassLogLoss'\n | 'Brier'\n | 'R2'\n | 'RMSE'\n | 'MAE'\n | 'PoissonDeviance'\n | 'TweedieDeviance'\n | 'MASE';\n\nexport type PSMetricMap = Partial<Record<PSMetricKey, number>>;\n\nexport const PS_KNOWN_METRIC_KEYS: readonly PSMetricKey[] = [\n 'AUC',\n 'Accuracy',\n 'Precision',\n 'Recall',\n 'F1',\n 'LogLoss',\n 'MulticlassLogLoss',\n 'Brier',\n 'R2',\n 'RMSE',\n 'MAE',\n 'PoissonDeviance',\n 'TweedieDeviance',\n 'MASE',\n] as const;\n\nexport const METRIC_LABELS: Record<PSMetricKey, string> = {\n AUC: 'AUC (ROC)',\n Accuracy: 'Accuracy',\n Precision: 'Precision',\n Recall: 'Recall',\n F1: 'F1 Score',\n LogLoss: 'Log Loss',\n MulticlassLogLoss: 'Multiclass Log Loss',\n Brier: 'Brier Score',\n R2: 'R² (Fit)',\n RMSE: 'RMSE',\n MAE: 'MAE',\n PoissonDeviance: 'Poisson Deviance',\n TweedieDeviance: 'Tweedie Deviance',\n MASE: 'MASE',\n};\n\nconst METRIC_ALIASES: Record<string, PSMetricKey> = {\n auc: 'AUC',\n 'roc-auc': 'AUC',\n roc_auc: 'AUC',\n acc: 'Accuracy',\n accuracy: 'Accuracy',\n prec: 'Precision',\n precision: 'Precision',\n rec: 'Recall',\n recall: 'Recall',\n f1: 'F1',\n 'f1-score': 'F1',\n f1_score: 'F1',\n logloss: 'LogLoss',\n 'log-loss': 'LogLoss',\n log_loss: 'LogLoss',\n 'multiclass-log-loss': 'MulticlassLogLoss',\n brier: 'Brier',\n brier_score: 'Brier',\n 'poisson-deviance': 'PoissonDeviance',\n 'tweedie-deviance': 'TweedieDeviance',\n mase: 'MASE',\n r2: 'R2',\n 'r-squared': 'R2',\n r_squared: 'R2',\n rmse: 'RMSE',\n mae: 'MAE',\n};\n\nexport const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;\n\n/**\n * The ML Model form's label for a feature column: drops a leading `Is` before a capital, splits camelCase, turns `_`\n * into spaces and title-cases every word (`IsActive` → `Active`, `membership_type` → `Membership Type`). A published\n * export whose output is fixed; the dashboards' at-risk drivers use `AtRiskRules.HumanizeFeatureName` (predictive-studio-core), which\n * keeps an `Is` prefix and sentence-cases snake_case names.\n */\nexport function HumanizeFeatureName(name: string): string {\n if (!name) return '';\n return name\n .replace(/^Is([A-Z])/, '$1')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .trim()\n .replace(/\\b[a-z]/g, (c) => c.toUpperCase());\n}\n\nexport function ParseMetrics(json: string | null | undefined): PSMetricMap {\n if (!json) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return {};\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n const out: PSMetricMap = {};\n for (const [rawKey, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = typeof rawVal === 'number' && Number.isFinite(rawVal) ? rawVal : null;\n if (value == null) continue;\n const canonical = CanonicalMetricKey(rawKey);\n if (canonical && out[canonical] == null) out[canonical] = value;\n }\n return out;\n}\n\nexport function CanonicalMetricKey(rawKey: string): PSMetricKey | null {\n const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);\n if (exact) return exact;\n return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;\n}\n\nexport function FormatMetricValue(key: PSMetricKey | string, val: number): string {\n if (!Number.isFinite(val)) return '—';\n switch (key) {\n case 'AUC':\n case 'Accuracy':\n case 'Precision':\n case 'Recall':\n case 'F1':\n case 'R2':\n return val.toFixed(3);\n case 'LogLoss':\n case 'MulticlassLogLoss':\n case 'Brier':\n case 'RMSE':\n case 'MAE':\n case 'PoissonDeviance':\n case 'TweedieDeviance':\n case 'MASE':\n return val < 10 ? val.toFixed(3) : val.toLocaleString(undefined, { maximumFractionDigits: 2 });\n default:\n return val.toFixed(3);\n }\n}\n\n/** A model's score as the form shows it: the metric, its label and the value. */\ntype PSModelScore = { key: PSMetricKey; label: string; value: number };\n\n/**\n * The primary metric score of a model: holdout preferred, else training. R² first for a regression, AUC for a\n * classification; failing those, the first metric the holdout stores, which a trained model's holdout lists first as the\n * protocol's primary proper score (all a kept simple baseline or a forecast stores).\n */\nexport function PrimaryModelScore(\n model: { Metrics?: string | null; HoldoutMetrics?: string | null; ProblemType?: string | null },\n): PSModelScore | null {\n const preferred: readonly PSMetricKey[] = (model.ProblemType ?? '').toLowerCase() === 'regression'\n ? ['R2', 'RMSE', 'MAE', 'AUC', 'Accuracy', 'F1']\n : ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'];\n const holdout = ParseMetrics(model.HoldoutMetrics);\n const train = ParseMetrics(model.Metrics);\n return preferredScore(holdout, preferred) || firstStoredScore(holdout) || preferredScore(train, preferred) || firstStoredScore(train);\n}\n\n/** The first of `keys` the map holds. */\nfunction preferredScore(metrics: PSMetricMap, keys: readonly PSMetricKey[]): PSModelScore | null {\n const key = keys.find((k) => metrics[k] != null);\n const value = key === undefined ? undefined : metrics[key];\n return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };\n}\n\n/** The first metric the map holds, in the order the stored JSON lists them. */\nfunction firstStoredScore(metrics: PSMetricMap): PSModelScore | null {\n const key = Object.keys(metrics).map((k) => CanonicalMetricKey(k)).find((k): k is PSMetricKey => k !== null);\n const value = key === undefined ? undefined : metrics[key];\n return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };\n}\n\n/**\n * Whether a model's train-side `Metrics` hold an inner cross-validation estimate rather than an in-sample score: true\n * for a model trained under an Evaluation Protocol, whose lineage names the protocol (`evaluationProtocolId`).\n */\nexport function TrainScoreIsInnerCv(lineageJson: string | null | undefined): boolean {\n if (!lineageJson) return false;\n try {\n const parsed: { evaluationProtocolId?: string | null } | null = JSON.parse(lineageJson);\n return typeof parsed?.evaluationProtocolId === 'string' && parsed.evaluationProtocolId.length > 0;\n } catch {\n return false;\n }\n}\n\nexport function MetricsToDisplay(metrics: PSMetricMap, options: { excludeAuc?: boolean } = {}): PSMetricDisplay[] {\n const out: PSMetricDisplay[] = [];\n for (const k of PS_KNOWN_METRIC_KEYS) {\n if (options.excludeAuc && k === 'AUC') continue;\n const v = metrics[k];\n if (v != null) {\n out.push({\n key: k,\n label: METRIC_LABELS[k] ?? k,\n value: FormatMetricValue(k, v),\n raw: v,\n });\n }\n }\n return out;\n}\n\nexport function ParseFeatureImportance(raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n if (!raw) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n\n const entries: { name: string; val: number }[] = [];\n\n if (Array.isArray(parsed)) {\n for (const item of parsed as Array<{ feature?: unknown; name?: unknown; importance?: unknown; weight?: unknown; value?: unknown }>) {\n const name = typeof item?.feature === 'string' ? item.feature : typeof item?.name === 'string' ? item.name : '';\n const rawVal = typeof item?.importance === 'number' ? item.importance : typeof item?.weight === 'number' ? item.weight : typeof item?.value === 'number' ? item.value : NaN;\n const val = Number(rawVal);\n if (name && Number.isFinite(val)) {\n entries.push({ name, val: Math.abs(val) });\n }\n }\n } else if (parsed && typeof parsed === 'object') {\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n const val = typeof v === 'number' && Number.isFinite(v) ? Math.abs(v) : NaN;\n if (k && Number.isFinite(val)) {\n entries.push({ name: k, val });\n }\n }\n }\n\n if (entries.length === 0) return [];\n\n entries.sort((a, b) => b.val - a.val);\n const sliced = entries.slice(0, topN);\n const max = sliced[0]?.val ?? 1;\n\n return sliced.map((e) => ({\n name: e.name,\n value: e.val < 1 ? e.val.toFixed(3) : e.val.toFixed(1),\n pct: max > 0 ? Math.round((e.val / max) * 100) : 0,\n warning: e.val >= PS_FEATURE_DOMINANCE_THRESHOLD,\n }));\n}\n\nexport function MaxFeatureImportance(raw: string | null | undefined): number | null {\n const bars = ParseFeatureImportance(raw, 1);\n if (bars.length === 0) return null;\n const num = parseFloat(bars[0].value);\n return Number.isFinite(num) ? num : null;\n}\n\nexport function OverfitGap(model: { Metrics?: string | null; HoldoutMetrics?: string | null }): number | null {\n const train = ParseMetrics(model.Metrics);\n const holdout = ParseMetrics(model.HoldoutMetrics);\n if (train.AUC != null && holdout.AUC != null) {\n return train.AUC - holdout.AUC;\n }\n if (train.R2 != null && holdout.R2 != null) {\n return train.R2 - holdout.R2;\n }\n return null;\n}\n\n/** The importance a model view may show. */\nexport class ModelImportanceView {\n /** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */\n public static DisplayedFeatureImportance(lineageJSON: string | null | undefined, raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n return ImportanceDisplay.GlobalDriversShowable(lineageJSON) ? ParseFeatureImportance(raw, topN) : [];\n }\n}\n"]}
|