validmind 2.13.9__tar.gz → 2.13.12__tar.gz

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.
Files changed (378) hide show
  1. {validmind-2.13.9 → validmind-2.13.12}/.gitignore +0 -4
  2. {validmind-2.13.9 → validmind-2.13.12}/PKG-INFO +6 -4
  3. {validmind-2.13.9 → validmind-2.13.12}/pyproject.toml +7 -3
  4. validmind-2.13.12/validmind/__version__.py +1 -0
  5. {validmind-2.13.9 → validmind-2.13.12}/validmind/ai/utils.py +5 -2
  6. {validmind-2.13.9 → validmind-2.13.12}/validmind/api_client.py +50 -10
  7. {validmind-2.13.9 → validmind-2.13.12}/validmind/client.py +8 -2
  8. {validmind-2.13.9 → validmind-2.13.12}/validmind/client_config.py +4 -0
  9. {validmind-2.13.9 → validmind-2.13.12}/validmind/experimental/agents.py +3 -1
  10. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +11 -9
  11. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesMissingValues.py +14 -8
  12. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/RegressionResidualsPlot.py +42 -7
  13. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +26 -16
  14. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +19 -18
  15. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/output.py +3 -0
  16. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/run.py +5 -2
  17. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/GiniCoefficient.py +5 -1
  18. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/model.py +4 -2
  19. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/result.py +42 -12
  20. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/utils.py +13 -3
  21. validmind-2.13.9/validmind/__version__.py +0 -1
  22. {validmind-2.13.9 → validmind-2.13.12}/LICENSE +0 -0
  23. {validmind-2.13.9 → validmind-2.13.12}/README.pypi.md +0 -0
  24. {validmind-2.13.9 → validmind-2.13.12}/validmind/__init__.py +0 -0
  25. {validmind-2.13.9 → validmind-2.13.12}/validmind/ai/test_descriptions.py +0 -0
  26. {validmind-2.13.9 → validmind-2.13.12}/validmind/credentials_store.py +0 -0
  27. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/__init__.py +0 -0
  28. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/__init__.py +0 -0
  29. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/config.json +0 -0
  30. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/customer_churn.py +0 -0
  31. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
  32. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
  33. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/taiwan_credit.py +0 -0
  34. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/cluster/digits.py +0 -0
  35. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/__init__.py +0 -0
  36. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/datasets/lending_club_biased.csv.gz +0 -0
  37. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
  38. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/lending_club.py +0 -0
  39. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/lending_club_bias.py +0 -0
  40. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/__init__.py +0 -0
  41. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/agent_dataset.py +0 -0
  42. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/__init__.py +0 -0
  43. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv +0 -0
  44. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_2.csv +0 -0
  45. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_3.csv +0 -0
  46. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_4.csv +0 -0
  47. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_5.csv +0 -0
  48. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/rfp.py +0 -0
  49. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/__init__.py +0 -0
  50. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/cnn_dailymail.py +0 -0
  51. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
  52. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +0 -0
  53. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +0 -0
  54. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +0 -0
  55. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
  56. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/__init__.py +0 -0
  57. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/california_housing.py +0 -0
  58. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/california_housing.csv +0 -0
  59. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
  60. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
  61. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
  62. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
  63. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
  64. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
  65. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
  66. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
  67. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
  68. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
  69. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
  70. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
  71. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
  72. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
  73. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
  74. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
  75. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
  76. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/leanding_club_loan_rates.csv +0 -0
  77. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/fred.py +0 -0
  78. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/fred_timeseries.py +0 -0
  79. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/generate_california_housing_csv.py +0 -0
  80. {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/lending_club.py +0 -0
  81. {validmind-2.13.9 → validmind-2.13.12}/validmind/errors.py +0 -0
  82. {validmind-2.13.9 → validmind-2.13.12}/validmind/experimental/__init__.py +0 -0
  83. {validmind-2.13.9 → validmind-2.13.12}/validmind/html_templates/__init__.py +0 -0
  84. {validmind-2.13.9 → validmind-2.13.12}/validmind/html_templates/content_blocks.py +0 -0
  85. {validmind-2.13.9 → validmind-2.13.12}/validmind/input_registry.py +0 -0
  86. {validmind-2.13.9 → validmind-2.13.12}/validmind/logging.py +0 -0
  87. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/__init__.py +0 -0
  88. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/foundation.py +0 -0
  89. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/function.py +0 -0
  90. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/huggingface.py +0 -0
  91. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/metadata.py +0 -0
  92. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/pipeline.py +0 -0
  93. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/pytorch.py +0 -0
  94. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/r_model.py +0 -0
  95. {validmind-2.13.9 → validmind-2.13.12}/validmind/models/sklearn.py +0 -0
  96. {validmind-2.13.9 → validmind-2.13.12}/validmind/oidc_device.py +0 -0
  97. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/__init__.py +0 -0
  98. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/AbsoluteError.py +0 -0
  99. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/BrierScore.py +0 -0
  100. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/CalibrationError.py +0 -0
  101. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/ClassBalance.py +0 -0
  102. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/Confidence.py +0 -0
  103. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/Correctness.py +0 -0
  104. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/LogLoss.py +0 -0
  105. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/OutlierScore.py +0 -0
  106. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/ProbabilityError.py +0 -0
  107. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/Uncertainty.py +0 -0
  108. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/__init__.py +0 -0
  109. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/AnswerRelevancy.py +0 -0
  110. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ArgumentCorrectness.py +0 -0
  111. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Bias.py +0 -0
  112. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ContextualPrecision.py +0 -0
  113. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ContextualRecall.py +0 -0
  114. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ContextualRelevancy.py +0 -0
  115. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Faithfulness.py +0 -0
  116. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/GEval.py +0 -0
  117. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Hallucination.py +0 -0
  118. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/PlanAdherence.py +0 -0
  119. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/PlanQuality.py +0 -0
  120. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Summarization.py +0 -0
  121. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/TaskCompletion.py +0 -0
  122. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ToolCorrectness.py +0 -0
  123. {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/__init__.py +0 -0
  124. {validmind-2.13.9 → validmind-2.13.12}/validmind/template.py +0 -0
  125. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/__init__.py +0 -0
  126. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/classifier.py +0 -0
  127. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/cluster.py +0 -0
  128. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/embeddings.py +0 -0
  129. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/llm.py +0 -0
  130. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/nlp.py +0 -0
  131. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/parameters_optimization.py +0 -0
  132. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/regression.py +0 -0
  133. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/statsmodels_timeseries.py +0 -0
  134. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/summarization.py +0 -0
  135. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/tabular_datasets.py +0 -0
  136. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/text_data.py +0 -0
  137. {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/time_series.py +0 -0
  138. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/__init__.py +0 -0
  139. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/__types__.py +0 -0
  140. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/_store.py +0 -0
  141. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/comparison.py +0 -0
  142. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ACFandPACFPlot.py +0 -0
  143. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ADF.py +0 -0
  144. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/AutoAR.py +0 -0
  145. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/AutoMA.py +0 -0
  146. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/AutoStationarity.py +0 -0
  147. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/BivariateScatterPlots.py +0 -0
  148. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/BoxPierce.py +0 -0
  149. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
  150. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ClassImbalance.py +0 -0
  151. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DatasetDescription.py +0 -0
  152. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DatasetSplit.py +0 -0
  153. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DescriptiveStatistics.py +0 -0
  154. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DickeyFullerGLS.py +0 -0
  155. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/Duplicates.py +0 -0
  156. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
  157. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +0 -0
  158. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/HighCardinality.py +0 -0
  159. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/HighPearsonCorrelation.py +0 -0
  160. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/IQROutliersBarPlot.py +0 -0
  161. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/IQROutliersTable.py +0 -0
  162. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/IsolationForestOutliers.py +0 -0
  163. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/JarqueBera.py +0 -0
  164. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/KPSS.py +0 -0
  165. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/LJungBox.py +0 -0
  166. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/MissingValues.py +0 -0
  167. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/MissingValuesBarPlot.py +0 -0
  168. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/MutualInformation.py +0 -0
  169. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +0 -0
  170. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/PhillipsPerronArch.py +0 -0
  171. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesCombination.py +0 -0
  172. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesDescription.py +0 -0
  173. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesDisparity.py +0 -0
  174. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +0 -0
  175. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/RollingStatsPlot.py +0 -0
  176. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/RunsTest.py +0 -0
  177. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ScatterPlot.py +0 -0
  178. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ScoreBandDefaultRates.py +0 -0
  179. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/SeasonalDecompose.py +0 -0
  180. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ShapiroWilk.py +0 -0
  181. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/Skewness.py +0 -0
  182. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/SpreadPlot.py +0 -0
  183. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +0 -0
  184. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularDateTimeHistograms.py +0 -0
  185. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
  186. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
  187. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TargetRateBarPlots.py +0 -0
  188. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesDescription.py +0 -0
  189. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +0 -0
  190. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesFrequency.py +0 -0
  191. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
  192. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
  193. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesOutliers.py +0 -0
  194. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
  195. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/UniqueRows.py +0 -0
  196. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/WOEBinPlots.py +0 -0
  197. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/WOEBinTable.py +0 -0
  198. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ZivotAndrewsArch.py +0 -0
  199. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/__init__.py +0 -0
  200. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/CommonWords.py +0 -0
  201. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Hashtags.py +0 -0
  202. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/LanguageDetection.py +0 -0
  203. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Mentions.py +0 -0
  204. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +0 -0
  205. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Punctuations.py +0 -0
  206. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Sentiment.py +0 -0
  207. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/StopWords.py +0 -0
  208. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/TextDescription.py +0 -0
  209. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Toxicity.py +0 -0
  210. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/__init__.py +0 -0
  211. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/decorator.py +0 -0
  212. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/load.py +0 -0
  213. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/BertScore.py +0 -0
  214. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/BleuScore.py +0 -0
  215. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ClusterSizeDistribution.py +0 -0
  216. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ContextualRecall.py +0 -0
  217. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/FeaturesAUC.py +0 -0
  218. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/MeteorScore.py +0 -0
  219. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ModelMetadata.py +0 -0
  220. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ModelPredictionResiduals.py +0 -0
  221. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/RegardScore.py +0 -0
  222. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/RougeScore.py +0 -0
  223. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +0 -0
  224. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +0 -0
  225. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +0 -0
  226. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TokenDisparity.py +0 -0
  227. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ToxicityScore.py +0 -0
  228. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/__init__.py +0 -0
  229. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +0 -0
  230. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +0 -0
  231. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +0 -0
  232. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +0 -0
  233. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +0 -0
  234. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +0 -0
  235. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +0 -0
  236. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +0 -0
  237. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +0 -0
  238. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +0 -0
  239. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +0 -0
  240. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +0 -0
  241. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +0 -0
  242. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +0 -0
  243. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/utils.py +0 -0
  244. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/AnswerCorrectness.py +0 -0
  245. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/AspectCritic.py +0 -0
  246. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextEntityRecall.py +0 -0
  247. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextPrecision.py +0 -0
  248. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +0 -0
  249. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextRecall.py +0 -0
  250. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/Faithfulness.py +0 -0
  251. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/NoiseSensitivity.py +0 -0
  252. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ResponseRelevancy.py +0 -0
  253. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/SemanticSimilarity.py +0 -0
  254. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/utils.py +0 -0
  255. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +0 -0
  256. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +0 -0
  257. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/CalibrationCurve.py +0 -0
  258. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +0 -0
  259. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +0 -0
  260. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +0 -0
  261. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +0 -0
  262. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/CompletenessScore.py +0 -0
  263. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/FeatureImportance.py +0 -0
  264. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +0 -0
  265. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +0 -0
  266. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +0 -0
  267. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +0 -0
  268. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +0 -0
  269. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +0 -0
  270. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +0 -0
  271. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ModelParameters.py +0 -0
  272. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +0 -0
  273. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +0 -0
  274. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +0 -0
  275. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +0 -0
  276. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +0 -0
  277. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ROCCurve.py +0 -0
  278. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionErrors.py +0 -0
  279. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +0 -0
  280. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionPerformance.py +0 -0
  281. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +0 -0
  282. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +0 -0
  283. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +0 -0
  284. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +0 -0
  285. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +0 -0
  286. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +0 -0
  287. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +0 -0
  288. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/VMeasure.py +0 -0
  289. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +0 -0
  290. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
  291. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/_diagnosis_metrics.py +0 -0
  292. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/_multiclass_proba.py +0 -0
  293. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
  294. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +0 -0
  295. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +0 -0
  296. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/GINITable.py +0 -0
  297. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +0 -0
  298. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
  299. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +0 -0
  300. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +0 -0
  301. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +0 -0
  302. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +0 -0
  303. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +0 -0
  304. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +0 -0
  305. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +0 -0
  306. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +0 -0
  307. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -0
  308. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
  309. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
  310. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +0 -0
  311. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +0 -0
  312. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +0 -0
  313. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +0 -0
  314. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +0 -0
  315. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +0 -0
  316. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/FeatureDrift.py +0 -0
  317. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +0 -0
  318. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +0 -0
  319. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +0 -0
  320. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +0 -0
  321. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ROCCurveDrift.py +0 -0
  322. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +0 -0
  323. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +0 -0
  324. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/BoxPlot.py +0 -0
  325. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/CorrelationHeatmap.py +0 -0
  326. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/HistogramPlot.py +0 -0
  327. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/ViolinPlot.py +0 -0
  328. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/__init__.py +0 -0
  329. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Bias.py +0 -0
  330. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Clarity.py +0 -0
  331. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Conciseness.py +0 -0
  332. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Delimitation.py +0 -0
  333. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/NegativeInstruction.py +0 -0
  334. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Robustness.py +0 -0
  335. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Specificity.py +0 -0
  336. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/__init__.py +0 -0
  337. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/ai_powered_test.py +0 -0
  338. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/CorrelationAnalysis.py +0 -0
  339. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/DescriptiveStats.py +0 -0
  340. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/NormalityTests.py +0 -0
  341. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/OutlierDetection.py +0 -0
  342. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/__init__.py +0 -0
  343. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/test_providers.py +0 -0
  344. {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/utils.py +0 -0
  345. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/__init__.py +0 -0
  346. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/Accuracy.py +0 -0
  347. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/F1.py +0 -0
  348. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/Precision.py +0 -0
  349. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/ROC_AUC.py +0 -0
  350. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/Recall.py +0 -0
  351. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/AdjustedRSquaredScore.py +0 -0
  352. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/HuberLoss.py +0 -0
  353. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +0 -0
  354. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanAbsoluteError.py +0 -0
  355. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +0 -0
  356. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanBiasDeviation.py +0 -0
  357. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanSquaredError.py +0 -0
  358. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/QuantileLoss.py +0 -0
  359. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/RSquaredScore.py +0 -0
  360. {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/RootMeanSquaredError.py +0 -0
  361. {validmind-2.13.9 → validmind-2.13.12}/validmind/utils.py +0 -0
  362. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/__init__.py +0 -0
  363. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/dataset/__init__.py +0 -0
  364. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/dataset/dataset.py +0 -0
  365. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/dataset/utils.py +0 -0
  366. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/figure.py +0 -0
  367. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/html_progress.py +0 -0
  368. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/html_renderer.py +0 -0
  369. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/input.py +0 -0
  370. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/__init__.py +0 -0
  371. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/pii_filter.py +0 -0
  372. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/result.jinja +0 -0
  373. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/__init__.py +0 -0
  374. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/runner.py +0 -0
  375. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/summary.py +0 -0
  376. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/test.py +0 -0
  377. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/test_suite.py +0 -0
  378. {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/text_generation_summary.py +0 -0
@@ -189,12 +189,8 @@ lending_club_loan_data_*.csv
189
189
 
190
190
  # Pickle files
191
191
  *.pkl
192
- # Sample application scorecard model for validation notebook — do not remove!
193
- !notebooks/use_cases/validation/xgb_model_champion.pkl
194
192
  # Sample logistic regression model for validation series — do not remove!
195
193
  !notebooks/tutorials/validation/lr_model_champion.pkl
196
- # Sample XGBoost model for validation quickstart — do not remove!
197
- !notebooks/quickstart/xgboost_model_champion.pkl
198
194
 
199
195
  notebooks/llm/datasets/*.jsonl
200
196
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: validmind
3
- Version: 2.13.9
3
+ Version: 2.13.12
4
4
  Summary: ValidMind Library
5
5
  Author-email: Andres Rodriguez <andres@validmind.ai>, Juan Martinez <juan@validmind.ai>, Anil Sorathiya <anil@validmind.ai>, Luis Pallares <luis@validmind.ai>, John Walz <john@validmind.ai>
6
6
  License: DUAL LICENSE NOTICE
@@ -735,6 +735,7 @@ Requires-Dist: pyarrow<23,>=22; (python_version >= '3.14') and extra == 'all'
735
735
  Requires-Dist: pycocoevalcap; extra == 'all'
736
736
  Requires-Dist: ragas<=0.2.7,>=0.2.3; extra == 'all'
737
737
  Requires-Dist: rouge>=1; extra == 'all'
738
+ Requires-Dist: scikit-learn<1.8; extra == 'all'
738
739
  Requires-Dist: scipy; extra == 'all'
739
740
  Requires-Dist: scorecardpy==0.1.9.6; extra == 'all'
740
741
  Requires-Dist: sentencepiece<0.3.0,>=0.2.0; extra == 'all'
@@ -744,7 +745,7 @@ Requires-Dist: statsmodels<0.15.0,>=0.14.2; extra == 'all'
744
745
  Requires-Dist: textblob<0.19.0,>=0.18.0.post0; extra == 'all'
745
746
  Requires-Dist: torch>=2.0.0; extra == 'all'
746
747
  Requires-Dist: transformers<5.0.0,>=4.32.0; extra == 'all'
747
- Requires-Dist: xgboost<3,>=1.5.2; extra == 'all'
748
+ Requires-Dist: xgboost<3.1,>=1.5.2; extra == 'all'
748
749
  Provides-Extra: credit-risk
749
750
  Requires-Dist: scorecardpy==0.1.9.6; extra == 'credit-risk'
750
751
  Requires-Dist: setuptools<82; extra == 'credit-risk'
@@ -802,7 +803,8 @@ Requires-Dist: arch>=7.0.0; extra == 'stats'
802
803
  Requires-Dist: scipy; extra == 'stats'
803
804
  Requires-Dist: statsmodels<0.15.0,>=0.14.2; extra == 'stats'
804
805
  Provides-Extra: xgboost
805
- Requires-Dist: xgboost<3,>=1.5.2; extra == 'xgboost'
806
+ Requires-Dist: scikit-learn<1.8; extra == 'xgboost'
807
+ Requires-Dist: xgboost<3.1,>=1.5.2; extra == 'xgboost'
806
808
  Description-Content-Type: text/markdown
807
809
 
808
810
  # ValidMind Library
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "validmind"
3
- version = "2.13.9"
3
+ version = "2.13.12"
4
4
  description = "ValidMind Library"
5
5
  readme = "README.pypi.md"
6
6
  requires-python = ">=3.9,<3.15"
@@ -40,7 +40,8 @@ dependencies = [
40
40
  [project.optional-dependencies]
41
41
  all = [
42
42
  "torch (>=2.0.0)",
43
- "xgboost (>=1.5.2,<3)",
43
+ "xgboost (>=1.5.2,<3.1)",
44
+ "scikit-learn (<1.8)",
44
45
  "transformers (>=4.32.0,<5.0.0)",
45
46
  "pycocoevalcap",
46
47
  "ragas (>=0.2.3,<=0.2.7)",
@@ -108,7 +109,10 @@ nlp = [
108
109
  ]
109
110
  pytorch = ["torch (>=2.0.0)"]
110
111
  stats = ["scipy", "statsmodels (>=0.14.2,<0.15.0)", "arch (>=7.0.0)"]
111
- xgboost = ["xgboost (>=1.5.2,<3)"]
112
+ xgboost = [
113
+ "xgboost (>=1.5.2,<3.1)",
114
+ "scikit-learn (<1.8)",
115
+ ]
112
116
  explainability = [
113
117
  "shap (>=0.46.0)",
114
118
  "numba (>=0.65.1) ; python_version >= '3.14'",
@@ -0,0 +1 @@
1
+ __version__ = "2.13.12"
@@ -8,7 +8,7 @@ import os
8
8
  from openai import AzureOpenAI, OpenAI
9
9
 
10
10
  from ..logging import get_logger
11
- from ..utils import md_to_html
11
+ from ..utils import is_html, md_to_html
12
12
 
13
13
  logger = get_logger(__name__)
14
14
 
@@ -38,6 +38,7 @@ class DescriptionFuture:
38
38
 
39
39
  def __init__(self, future):
40
40
  self._future = future
41
+ self.markdown_source = None
41
42
 
42
43
  def get_description(self):
43
44
  if isinstance(self._future, tuple):
@@ -46,7 +47,9 @@ class DescriptionFuture:
46
47
  # This will block until the future is completed
47
48
  description = self._future.result()
48
49
 
49
- return md_to_html(description[0], mathml=True), description[1]
50
+ source, was_generated = description
51
+ self.markdown_source = source if not is_html(source) else None
52
+ return md_to_html(source, mathml=True), was_generated
50
53
 
51
54
 
52
55
  def _get_google_api_key():
@@ -588,6 +588,7 @@ async def alog_metadata(
588
588
  text: Optional[str] = None,
589
589
  _json: Optional[Dict[str, Any]] = None,
590
590
  section_id: Optional[str] = None,
591
+ text_format: Optional[str] = None,
591
592
  ) -> Dict[str, Any]:
592
593
  """Logs free-form metadata to ValidMind API.
593
594
 
@@ -597,6 +598,9 @@ async def alog_metadata(
597
598
  _json (dict, optional): Free-form key-value pairs to assign to the metadata. Defaults to None.
598
599
  section_id (str, optional): Section ID to append the text block to when the
599
600
  content ID does not already exist.
601
+ text_format (str, optional): Format of ``text``. Markdown is sent as-is when
602
+ the backend advertises support so conversion happens after the request
603
+ passes through the WAF. Older backends receive locally converted HTML.
600
604
 
601
605
  Raises:
602
606
  Exception: If the API call fails.
@@ -604,11 +608,17 @@ async def alog_metadata(
604
608
  Returns:
605
609
  dict: The response from the API.
606
610
  """
611
+ if text_format == "markdown" and not client_config.supports_log_metadata_markdown():
612
+ text = md_to_html(text, mathml=True)
613
+ text_format = None
614
+
607
615
  metadata_dict = {"content_id": content_id}
608
616
  if text is not None:
609
617
  metadata_dict["text"] = text
610
618
  if _json is not None:
611
619
  metadata_dict["json"] = _json
620
+ if text_format is not None:
621
+ metadata_dict["text_format"] = text_format
612
622
 
613
623
  request_params = {}
614
624
  if section_id:
@@ -808,11 +818,18 @@ def generate_qualitative_text(text_generation_data: Dict[str, Any]) -> Dict[str,
808
818
  return r.json()
809
819
 
810
820
 
811
- def _normalize_logged_text(text: str, field_name: str) -> str:
812
- """Validate text content and convert Markdown to HTML when needed."""
821
+ def _validate_logged_text(text: str, field_name: str) -> str:
822
+ """Validate text accepted by log_text."""
813
823
  if not isinstance(text, str) or not text:
814
824
  raise ValueError(f"`{field_name}` must be a non-empty string")
815
825
 
826
+ return text
827
+
828
+
829
+ def _normalize_logged_text(text: str, field_name: str) -> str:
830
+ """Validate text content and convert Markdown to HTML for local rendering."""
831
+ text = _validate_logged_text(text, field_name)
832
+
816
833
  if not is_html(text):
817
834
  return md_to_html(text, mathml=True)
818
835
 
@@ -828,7 +845,7 @@ def _validate_manual_log_text_args(
828
845
  if context is not None:
829
846
  raise ValueError("`context` is only supported when `text` is omitted")
830
847
 
831
- return _normalize_logged_text(text, "text")
848
+ return _validate_logged_text(text, "text")
832
849
 
833
850
 
834
851
  def _build_log_text_generation_request(
@@ -860,13 +877,13 @@ def _build_log_text_generation_request(
860
877
  return request_data
861
878
 
862
879
 
863
- def _generate_log_text(
880
+ def _generate_log_text_source(
864
881
  content_id: str,
865
882
  prompt: Optional[str],
866
883
  context: Optional[Dict[str, Any]],
867
884
  section_id: Optional[str] = None,
868
885
  ) -> str:
869
- """Generate text for log_text and normalize it to HTML."""
886
+ """Generate and validate source text without converting it to HTML."""
870
887
  request_data = _build_log_text_generation_request(
871
888
  content_id,
872
889
  prompt,
@@ -874,6 +891,22 @@ def _generate_log_text(
874
891
  section_id=section_id,
875
892
  )
876
893
  generated_text = generate_qualitative_text(request_data)["content"]
894
+ return _validate_logged_text(generated_text, "generated text")
895
+
896
+
897
+ def _generate_log_text(
898
+ content_id: str,
899
+ prompt: Optional[str],
900
+ context: Optional[Dict[str, Any]],
901
+ section_id: Optional[str] = None,
902
+ ) -> str:
903
+ """Generate text and normalize it to HTML for local result rendering."""
904
+ generated_text = _generate_log_text_source(
905
+ content_id,
906
+ prompt,
907
+ context,
908
+ section_id=section_id,
909
+ )
877
910
  return _normalize_logged_text(generated_text, "generated text")
878
911
 
879
912
 
@@ -902,14 +935,21 @@ async def alog_text(
902
935
  if text is not None:
903
936
  text = _validate_manual_log_text_args(text, prompt, context)
904
937
  else:
905
- text = _generate_log_text(
938
+ text = _generate_log_text_source(
906
939
  content_id,
907
940
  prompt,
908
941
  context,
909
942
  section_id=section_id,
910
943
  )
911
944
 
912
- return await alog_metadata(content_id, text, _json, section_id=section_id)
945
+ text_format = None if is_html(text) else "markdown"
946
+ return await alog_metadata(
947
+ content_id,
948
+ text,
949
+ _json,
950
+ section_id=section_id,
951
+ text_format=text_format,
952
+ )
913
953
 
914
954
 
915
955
  def log_text(
@@ -924,9 +964,9 @@ def log_text(
924
964
 
925
965
  Args:
926
966
  content_id (str): Unique content identifier for the text.
927
- text (str, optional): The text to log. Will be converted to HTML with
928
- MathML support when Markdown is provided. If omitted, text is
929
- generated using the qualitative text generation backend.
967
+ text (str, optional): The text to log. Markdown is sent to the backend for
968
+ HTML and math conversion. If omitted, text is generated using the
969
+ qualitative text generation backend.
930
970
  prompt (str, optional): Custom prompt used for AI-assisted text
931
971
  generation. Only supported when `text` is omitted.
932
972
  context (dict, optional): Context object for AI-assisted text
@@ -38,7 +38,7 @@ from .template import preview_template as _preview_template
38
38
  from .test_suites import get_by_id as get_test_suite_by_id
39
39
  from .tests.run import _get_run_metadata
40
40
  from .utils import display as vm_display
41
- from .utils import get_dataset_info, get_model_info
41
+ from .utils import get_dataset_info, get_model_info, is_html
42
42
  from .vm_models import TestSuite, TestSuiteRunner
43
43
  from .vm_models.dataset import DataFrameDataset, PolarsDataset, TorchDataset, VMDataset
44
44
  from .vm_models.html_progress import HTMLLabel, HTMLProgressBar
@@ -479,9 +479,12 @@ def run_text_generation(
479
479
  A TextGenerationResult containing the generated text.
480
480
  """
481
481
  start_time = time.perf_counter()
482
- description = api_client._generate_log_text(
482
+ description_source = api_client._generate_log_text_source(
483
483
  content_id, prompt, context, section_id=section_id
484
484
  )
485
+ description = api_client._normalize_logged_text(
486
+ description_source, "generated text"
487
+ )
485
488
  metadata = _get_run_metadata(duration_seconds=time.perf_counter() - start_time)
486
489
  result = TextGenerationResult(
487
490
  result_id=content_id,
@@ -494,6 +497,9 @@ def run_text_generation(
494
497
  section_id=section_id,
495
498
  context=context,
496
499
  _was_description_generated=True,
500
+ _description_source=(
501
+ description_source if not is_html(description_source) else None
502
+ ),
497
503
  )
498
504
 
499
505
  if show:
@@ -39,6 +39,10 @@ class ClientConfig:
39
39
  """Returns True if the client can generate LLM-based test descriptions."""
40
40
  return self.feature_flags.get("llm_test_descriptions", True)
41
41
 
42
+ def supports_log_metadata_markdown(self):
43
+ """Return whether the backend converts Markdown logged as metadata."""
44
+ return self.feature_flags.get("log_metadata_markdown", False)
45
+
42
46
 
43
47
  client_config = ClientConfig(
44
48
  model=None,
@@ -54,7 +54,8 @@ def run_task(
54
54
  else:
55
55
  raise ValueError(f"Unsupported task: {task}")
56
56
 
57
- if not is_html(generated_text):
57
+ description_source = generated_text if not is_html(generated_text) else None
58
+ if description_source is not None:
58
59
  generated_text = md_to_html(generated_text, mathml=True)
59
60
 
60
61
  # Create a test result with the generated text
@@ -68,6 +69,7 @@ def run_task(
68
69
  section_id=input.get("section_id"),
69
70
  context=input.get("context"),
70
71
  _was_description_generated=True,
72
+ _description_source=description_source,
71
73
  )
72
74
  if show:
73
75
  result.show()
@@ -6,7 +6,6 @@ from typing import Tuple
6
6
 
7
7
  import numpy as np
8
8
  import pandas as pd
9
- import plotly.figure_factory as ff
10
9
  import plotly.graph_objects as go
11
10
 
12
11
  from validmind import RawData, tags, tasks
@@ -86,13 +85,15 @@ def LaggedCorrelationHeatmap(
86
85
  index=dataset.feature_columns,
87
86
  )
88
87
 
89
- fig = ff.create_annotated_heatmap(
90
- z=correlation_df.values,
91
- x=list(correlation_df.columns),
92
- y=list(correlation_df.index),
93
- colorscale=COOLWARM,
94
- annotation_text=correlation_df.round(2).values,
95
- showscale=True,
88
+ fig = go.Figure(
89
+ go.Heatmap(
90
+ z=correlation_df.values,
91
+ x=list(correlation_df.columns),
92
+ y=list(correlation_df.index),
93
+ colorscale=COOLWARM,
94
+ showscale=True,
95
+ texttemplate="%{z:.2f}",
96
+ )
96
97
  )
97
98
  fig.update_layout(
98
99
  title={
@@ -103,7 +104,8 @@ def LaggedCorrelationHeatmap(
103
104
  "yanchor": "top",
104
105
  },
105
106
  font=dict(size=14),
106
- xaxis_title="Lags",
107
+ xaxis=dict(title="Lags", side="top", dtick=1),
108
+ yaxis=dict(dtick=1),
107
109
  )
108
110
 
109
111
  return fig, RawData(correlation_matrix=correlation_df, dataset=dataset.input_id)
@@ -6,7 +6,6 @@ from typing import Any, Dict, List, Tuple
6
6
 
7
7
  import pandas as pd
8
8
  import plotly.express as px
9
- import plotly.figure_factory as ff
10
9
  import plotly.graph_objects as go
11
10
 
12
11
  from validmind import RawData, tags, tasks
@@ -94,16 +93,23 @@ def TimeSeriesMissingValues(
94
93
  z = missing_mask.T.astype(int).values
95
94
  x = missing_mask.index.tolist()
96
95
  y = missing_mask.columns.tolist()
97
- heatmap = ff.create_annotated_heatmap(
98
- z=z,
99
- x=x,
100
- y=y,
101
- colorscale="Reds",
102
- showscale=False,
96
+ heatmap = go.Figure(
97
+ go.Heatmap(
98
+ z=z,
99
+ x=x,
100
+ y=y,
101
+ colorscale="Reds",
102
+ showscale=False,
103
+ texttemplate="%{z}",
104
+ )
103
105
  )
104
106
 
105
107
  # Update the layout after creation
106
- heatmap.update_layout(title="Missing Values Heatmap")
108
+ heatmap.update_layout(
109
+ title="Missing Values Heatmap",
110
+ xaxis=dict(side="top", dtick=1),
111
+ yaxis=dict(dtick=1),
112
+ )
107
113
 
108
114
  return (
109
115
  [
@@ -5,12 +5,29 @@
5
5
  from typing import Tuple
6
6
 
7
7
  import numpy as np
8
- import plotly.figure_factory as ff
9
8
  import plotly.graph_objects as go
10
9
 
11
10
  from validmind import RawData, tags, tasks
11
+ from validmind.errors import MissingDependencyError
12
12
  from validmind.vm_models import VMDataset, VMModel
13
13
 
14
+ # The first colour in Plotly's default distplot palette, kept so the ported figure
15
+ # matches what `ff.create_distplot` produced.
16
+ KDE_COLOR = "rgb(31, 119, 180)"
17
+
18
+ try:
19
+ from scipy.stats import gaussian_kde
20
+ except ImportError as e:
21
+ if "scipy" in str(e):
22
+ raise MissingDependencyError(
23
+ "Missing required package `scipy` for RegressionResidualsPlot. "
24
+ "Please run `pip install validmind[stats]` to use statistical tests",
25
+ required_dependencies=["scipy"],
26
+ extra="stats",
27
+ ) from e
28
+
29
+ raise e
30
+
14
31
 
15
32
  @tags("model_performance", "visualization")
16
33
  @tasks("regression")
@@ -65,12 +82,30 @@ def RegressionResidualsPlot(
65
82
 
66
83
  # Residuals plot
67
84
  residuals = y_true.flatten() - y_pred.flatten()
68
- fig = ff.create_distplot(
69
- hist_data=[residuals],
70
- group_labels=["Residuals"],
71
- bin_size=[bin_size],
72
- show_hist=True,
73
- show_rug=False,
85
+ # A 500-point KDE across the data range, which is what `ff.create_distplot`
86
+ # computed internally with scipy before Plotly 7 removed it.
87
+ curve_x = np.linspace(residuals.min(), residuals.max(), 500, endpoint=False)
88
+ curve_y = gaussian_kde(residuals)(curve_x)
89
+ fig = go.Figure(
90
+ data=[
91
+ go.Histogram(
92
+ x=residuals,
93
+ histnorm="probability density",
94
+ autobinx=False,
95
+ xbins=dict(start=residuals.min(), end=residuals.max(), size=bin_size),
96
+ name="Residuals",
97
+ marker=dict(color=KDE_COLOR),
98
+ opacity=0.7,
99
+ ),
100
+ go.Scatter(
101
+ x=curve_x,
102
+ y=curve_y,
103
+ mode="lines",
104
+ name="Residuals",
105
+ showlegend=False,
106
+ marker=dict(color=KDE_COLOR),
107
+ ),
108
+ ]
74
109
  )
75
110
  fig.update_layout(
76
111
  title="Distribution of Residuals",
@@ -6,7 +6,6 @@
6
6
  from typing import Tuple
7
7
 
8
8
  import numpy as np
9
- import plotly.figure_factory as ff
10
9
  import plotly.graph_objects as go
11
10
  from sklearn.metrics import confusion_matrix
12
11
 
@@ -42,9 +41,9 @@ def ConfusionMatrix(
42
41
  The mechanism used involves taking the predicted results (`y_test_predict`) from the classification model and
43
42
  comparing them against the actual values (`y_test_true`). A confusion matrix is built using the unique labels
44
43
  extracted from `y_test_true`, employing scikit-learn's metrics. The matrix is then visually rendered with the help
45
- of Plotly's `create_annotated_heatmap` function. A heatmap is created which provides a two-dimensional graphical
46
- representation of the model's performance, showcasing distributions of True Positives (TP), True Negatives (TN),
47
- False Positives (FP), and False Negatives (FN).
44
+ of a Plotly heatmap. A heatmap is created which provides a two-dimensional graphical representation of the
45
+ model's performance, showcasing distributions of True Positives (TP), True Negatives (TN), False Positives (FP),
46
+ and False Negatives (FN).
48
47
 
49
48
  ### Signs of High Risk
50
49
 
@@ -110,21 +109,32 @@ def ConfusionMatrix(
110
109
  ],
111
110
  ]
112
111
 
113
- fig = ff.create_annotated_heatmap(
114
- z=cm,
115
- colorscale="Blues",
116
- x=labels,
117
- y=labels,
118
- annotation_text=text,
112
+ if text is None:
113
+ text = cm.astype(str)
114
+
115
+ fig = go.Figure(
116
+ go.Heatmap(
117
+ z=cm,
118
+ x=labels,
119
+ y=labels,
120
+ colorscale="Blues",
121
+ showscale=False,
122
+ text=text,
123
+ texttemplate="%{text}",
124
+ # Heatmap text auto-shrinks to fit the cell; pin it to the layout font
125
+ # size so the cells read the same as the old annotation-based figure.
126
+ textfont=dict(size=12),
127
+ hovertemplate=(
128
+ "True Label:%{y}<br>Predicted Label:%{x}<br>Count:%{z}<extra></extra>"
129
+ ),
130
+ )
119
131
  )
120
132
 
121
- fig["data"][0][
122
- "hovertemplate"
123
- ] = "True Label:%{y}<br>Predicted Label:%{x}<br>Count:%{z}<extra></extra>"
124
-
125
133
  fig.update_layout(
126
- xaxis=dict(title="Predicted label"),
127
- yaxis=dict(title="True label"),
134
+ # `side="top"` and `dtick=1` keep the axis placement and per-class ticks that
135
+ # `ff.create_annotated_heatmap` used to apply for us.
136
+ xaxis=dict(title="Predicted label", side="top", dtick=1),
137
+ yaxis=dict(title="True label", dtick=1),
128
138
  autosize=False,
129
139
  width=600,
130
140
  height=600,
@@ -4,8 +4,8 @@
4
4
 
5
5
  from typing import Dict, List, Tuple
6
6
 
7
+ import numpy as np
7
8
  import pandas as pd
8
- import plotly.figure_factory as ff
9
9
  import plotly.graph_objects as go
10
10
 
11
11
  from validmind import RawData, tags, tasks
@@ -13,7 +13,7 @@ from validmind.errors import MissingDependencyError
13
13
  from validmind.vm_models import VMDataset, VMModel
14
14
 
15
15
  try:
16
- from scipy.stats import kurtosis, skew
16
+ from scipy.stats import gaussian_kde, kurtosis, skew
17
17
  except ImportError as e:
18
18
  if "scipy" in str(e):
19
19
  raise MissingDependencyError(
@@ -26,6 +26,17 @@ except ImportError as e:
26
26
  raise e
27
27
 
28
28
 
29
+ def _kde_curve(values):
30
+ """A 500-point KDE across the data range.
31
+
32
+ This is what `ff.create_distplot(..., show_hist=False)` computed internally
33
+ before Plotly 7 removed the Figure Factory functions.
34
+ """
35
+ x = np.linspace(values.min(), values.max(), 500, endpoint=False)
36
+
37
+ return x, gaussian_kde(values)(x)
38
+
39
+
29
40
  @tags("visualization")
30
41
  @tasks("monitoring")
31
42
  def TargetPredictionDistributionPlot(
@@ -110,18 +121,8 @@ def TargetPredictionDistributionPlot(
110
121
  moments = moments.set_index("Statistic", drop=False)
111
122
 
112
123
  # Create KDE for both distributions
113
- ref_kde = ff.create_distplot(
114
- [pred_ref["Reference Prediction"].values],
115
- ["Reference"],
116
- show_hist=False,
117
- show_rug=False,
118
- )
119
- monitor_kde = ff.create_distplot(
120
- [pred_monitor["Monitoring Prediction"].values],
121
- ["Monitoring"],
122
- show_hist=False,
123
- show_rug=False,
124
- )
124
+ ref_x, ref_y = _kde_curve(pred_ref["Reference Prediction"].values)
125
+ monitor_x, monitor_y = _kde_curve(pred_monitor["Monitoring Prediction"].values)
125
126
 
126
127
  # Create new figure
127
128
  fig = go.Figure()
@@ -129,8 +130,8 @@ def TargetPredictionDistributionPlot(
129
130
  # Add reference distribution
130
131
  fig.add_trace(
131
132
  go.Scatter(
132
- x=ref_kde.data[0].x,
133
- y=ref_kde.data[0].y,
133
+ x=ref_x,
134
+ y=ref_y,
134
135
  fill="tozeroy",
135
136
  name="Reference Prediction",
136
137
  line=dict(color="blue", width=2),
@@ -141,8 +142,8 @@ def TargetPredictionDistributionPlot(
141
142
  # Add monitoring distribution
142
143
  fig.add_trace(
143
144
  go.Scatter(
144
- x=monitor_kde.data[0].x,
145
- y=monitor_kde.data[0].y,
145
+ x=monitor_x,
146
+ y=monitor_y,
146
147
  fill="tozeroy",
147
148
  name="Monitor Prediction",
148
149
  line=dict(color="red", width=2),
@@ -184,7 +184,10 @@ class StringOutputHandler(OutputHandler):
184
184
 
185
185
  def process(self, item: Any, result: TestResult) -> None:
186
186
  if not is_html(item):
187
+ result._description_source = item
187
188
  item = md_to_html(item, mathml=True)
189
+ else:
190
+ result._description_source = None
188
191
 
189
192
  result.description = item
190
193
 
@@ -16,7 +16,7 @@ from validmind.ai.test_descriptions import get_result_description
16
16
  from validmind.errors import MissingRequiredTestInputError
17
17
  from validmind.input_registry import input_registry
18
18
  from validmind.logging import get_logger
19
- from validmind.utils import test_id_to_name
19
+ from validmind.utils import is_html, test_id_to_name
20
20
  from validmind.vm_models.input import VMInput
21
21
  from validmind.vm_models.result import TestResult
22
22
 
@@ -451,7 +451,7 @@ def run_test( # noqa: C901
451
451
  result = post_process_fn(result)
452
452
 
453
453
  if not result.description:
454
- result.description = get_result_description(
454
+ description = get_result_description(
455
455
  test_id=test_id,
456
456
  test_description=result.doc,
457
457
  tables=result.tables,
@@ -463,6 +463,9 @@ def run_test( # noqa: C901
463
463
  additional_context=additional_context,
464
464
  params=result.params,
465
465
  )
466
+ result.description = description
467
+ if isinstance(description, str) and result.doc and not is_html(result.doc):
468
+ result._description_source = result.doc
466
469
 
467
470
  if show:
468
471
  result.show()
@@ -7,6 +7,10 @@ import numpy as np
7
7
  from validmind import tags, tasks
8
8
  from validmind.vm_models import VMDataset, VMModel
9
9
 
10
+ # NumPy 2 removed `np.trapz` in favour of `np.trapezoid`; the library supports both
11
+ # (numpy<2 below Python 3.14, numpy>=2.3 from 3.14 on).
12
+ _trapezoid = getattr(np, "trapezoid", None) or np.trapz
13
+
10
14
 
11
15
  @tags("regression")
12
16
  @tasks("regression")
@@ -29,7 +33,7 @@ def GiniCoefficient(dataset: VMDataset, model: VMModel) -> float:
29
33
  cumsum_pred_norm = cumsum_pred / np.max(cumsum_pred)
30
34
 
31
35
  # Compute area under the Lorenz curve
32
- area_lorenz = np.trapz(cumsum_pred_norm, x=cumsum_true_norm)
36
+ area_lorenz = _trapezoid(cumsum_pred_norm, x=cumsum_true_norm)
33
37
 
34
38
  # Compute Gini coefficient
35
39
  return 1 - 2 * area_lorenz