Validation Helper
GitHub Link to Code.
Helper class for input validation in plots module.
Provides validation for plot parameters to ensure data consistency and proper error messages before plot generation.
- class mdxplain.plots.helper.validation_helper.ValidationHelper
Helper class for atomic input validation in plots.
Provides static methods for validating individual plot parameters. Each method validates ONE specific aspect and can be composed together.
Examples
>>> # Validate decomposition exists >>> decomp = ValidationHelper.validate_decomposition_exists( ... pipeline_data, "pca" ... )
>>> # Validate dimensions >>> ValidationHelper.validate_dimensions_list([0, 1], "pca", 10)
>>> # Validate clustering exists >>> cluster = ValidationHelper.validate_clustering_exists( ... pipeline_data, "dbscan" ... )
>>> # Validate trajectory selection >>> indices = ValidationHelper.validate_trajectory_selection( ... pipeline_data, "all" ... )
>>> # Validate dimension layout for grid >>> ValidationHelper.validate_dimensions_for_layout([0, 1, 2, 3])
- static validate_decomposition_exists(pipeline_data: PipelineData, decomposition_name: str)
Validate that decomposition exists in pipeline data.
Parameters
- pipeline_dataPipelineData
Pipeline data container
- decomposition_namestr
Name of decomposition to validate
Returns
- DecompositionData
Decomposition object if found
Raises
- ValueError
If decomposition not found
Examples
>>> decomp = ValidationHelper.validate_decomposition_exists( ... pipeline_data, "pca" ... )
- static validate_dimensions_list(dimensions: List[int], decomposition_name: str, n_components: int) None
Validate dimensions list format, type, range, and uniqueness.
Parameters
- dimensionsList[int]
Dimension indices to validate
- decomposition_namestr
Name of decomposition (for error messages)
- n_componentsint
Number of available components in decomposition
Returns
None
Raises
- ValueError
If dimensions empty, wrong type, out of range, or duplicates
Examples
>>> ValidationHelper.validate_dimensions_list([0, 1], "pca", 10) # OK >>> ValidationHelper.validate_dimensions_list([0, 15], "pca", 10) # ValueError
- static validate_show_centers_requirement(show_centers: bool, clustering_name: str | None) None
Validate show_centers requires clustering_name.
Parameters
- show_centersbool
Whether cluster centers should be shown
- clustering_nameOptional[str]
Name of clustering
Returns
None
Raises
- ValueError
If show_centers=True but clustering_name not specified
Examples
>>> ValidationHelper.validate_show_centers_requirement(True, "dbscan") # OK >>> ValidationHelper.validate_show_centers_requirement(True, None) # ValueError
- static validate_clustering_compatibility(pipeline_data: PipelineData, clustering_name: str, decomposition_name: str, n_frames_decomp: int) None
Validate clustering exists and matches decomposition frame count.
Parameters
- pipeline_dataPipelineData
Pipeline data container
- clustering_namestr
Name of clustering to validate
- decomposition_namestr
Name of decomposition (for error messages)
- n_frames_decompint
Number of frames in decomposition
Returns
None
Raises
- ValueError
If clustering not found or frame count mismatch
Examples
>>> ValidationHelper.validate_clustering_compatibility( ... pipeline_data, "dbscan", "pca", 1000 ... )
- static validate_clustering_exists(pipeline_data: PipelineData, clustering_name: str)
Validate that clustering exists in pipeline data.
Parameters
- pipeline_dataPipelineData
Pipeline data container
- clustering_namestr
Name of clustering to validate
Returns
- ClusterData
Clustering object if found
Raises
- ValueError
If clustering not found
Examples
>>> cluster = ValidationHelper.validate_clustering_exists( ... pipeline_data, "dbscan" ... )
- static validate_trajectory_selection(pipeline_data: PipelineData, traj_selection)
Validate trajectory selection and return indices.
Parameters
- pipeline_dataPipelineData
Pipeline data container
- traj_selectionint, str, list, or “all”
Trajectory selection to validate
Returns
- List[int]
List of trajectory indices
Raises
- ValueError
If no trajectories match selection
Examples
>>> indices = ValidationHelper.validate_trajectory_selection( ... pipeline_data, "all" ... ) >>> indices = ValidationHelper.validate_trajectory_selection( ... pipeline_data, [0, 1, 2] ... )
- static validate_dimensions_for_layout(dimensions: List[int]) None
Validate that dimensions list is suitable for grid layout.
For landscape plots, dimensions are paired consecutively. An even number of dimensions is required for proper grid layout.
Parameters
- dimensionsList[int]
Dimension indices to plot
Returns
- None
Raises ValueError if validation fails
Raises
- ValueError
If odd number of dimensions provided
Examples
>>> # Valid - even number >>> ValidationHelper.validate_dimensions_for_layout([0, 1, 2, 3])
>>> # Invalid - odd number >>> ValidationHelper.validate_dimensions_for_layout([0, 1, 2]) ValueError: Odd number of dimensions (3) provided. Landscape plots require consecutive dimension pairs. Please provide an even number of dimensions.
Notes
Dimensions are paired consecutively: [0,1,2,3] becomes [(0,1), (2,3)] for a 2x1 grid layout.
- static validate_feature_importance_exists(pipeline_data: PipelineData, fi_name: str)
Validate that feature importance analysis exists in pipeline data.
Parameters
- pipeline_dataPipelineData
Pipeline data container
- fi_namestr
Name of feature importance analysis to validate
Returns
- FeatureImportanceData
Feature importance data object if found
Raises
- ValueError
If feature importance analysis not found
Examples
>>> fi_data = ValidationHelper.validate_feature_importance_exists( ... pipeline_data, "tree_analysis" ... )
- static validate_positive_integer(value: int, param_name: str) None
Validate that parameter is a positive integer.
Parameters
- valueint
Value to validate
- param_namestr
Name of parameter for error messages
Returns
- None
Raises ValueError if validation fails
Raises
- ValueError
If value is not positive integer
Examples
>>> ValidationHelper.validate_positive_integer(10, "n_top") # OK >>> ValidationHelper.validate_positive_integer(0, "n_top") # ValueError >>> ValidationHelper.validate_positive_integer(-5, "n_top") # ValueError
- static validate_feature_selector_exists(pipeline_data: PipelineData, feature_selector_name: str)
Validate that feature selector exists in pipeline data.
Parameters
- pipeline_dataPipelineData
Pipeline data container
- feature_selector_namestr
Name of feature selector to validate
Returns
None
Raises
- ValueError
If feature selector not found
Examples
>>> ValidationHelper.validate_feature_selector_exists( ... pipeline_data, "my_selector" ... )
- static has_discrete_features(all_features: List[tuple], metadata_map: dict) bool
Check if any feature in the list is discrete.
Examines visualization metadata of all features to determine if at least one discrete feature is present. Used to adjust plot spacing for discrete feature labels.
Parameters
- all_featuresList[tuple]
List of (feature_type, feature_name) tuples
- metadata_mapdict
Nested dict structure: {feat_type: {feat_name: metadata}}
Returns
- bool
True if at least one discrete feature found, False otherwise
Examples
>>> features = [("distances", "ALA1-VAL2"), ("contacts", "GLU3-ARG4")] >>> metadata = { ... "distances": { ... "ALA1-VAL2": {"type_metadata": {"visualization": {"is_discrete": False}}} ... }, ... "contacts": { ... "GLU3-ARG4": {"type_metadata": {"visualization": {"is_discrete": True}}} ... } ... } >>> ValidationHelper.has_discrete_features(features, metadata) True
Notes
Returns False if no features provided or if visualization metadata is missing/incomplete for all features.