public static Clusterer CreateClusterer(CancellationToken cancellationToken, ClusteringSpec clusteringSpec, ReportResults reportResults) { var pivotedPropertySet = new PivotedProperties(reportResults.ItemProperties); pivotedPropertySet = pivotedPropertySet.ChangeSeriesGroups(pivotedPropertySet.CreateSeriesGroups()).ReorderItemProperties(); var clusteredProperties = ClusteredProperties.FromClusteringSpec(clusteringSpec, pivotedPropertySet); if (!clusteredProperties.RowValues.Any() && !clusteredProperties.ColumnValues.Any()) { clusteringSpec = ClusteringSpec.GetDefaultClusteringSpec(cancellationToken, reportResults, pivotedPropertySet); if (clusteringSpec == null) { return(null); } clusteredProperties = ClusteredProperties.FromClusteringSpec(clusteringSpec, pivotedPropertySet); } return(new Clusterer(cancellationToken, reportResults.RowItems, clusteredProperties, ClusterMetricType.FromName(clusteringSpec.DistanceMetric) ?? ClusterMetricType.DEFAULT)); }
public static ClusteredProperties FromClusteringSpec(ClusteringSpec clusteringSpec, PivotedProperties pivotedProperties) { var allRoles = clusteringSpec.ToValueTransformDictionary(); var rowTransforms = new Dictionary <string, ClusterRole.Transform>(); var rowHeaders = new List <DataPropertyDescriptor>(); foreach (var property in pivotedProperties.UngroupedProperties) { var columnRef = ClusteringSpec.ColumnRef.FromPropertyDescriptor(property); if (columnRef != null && allRoles.TryGetValue(columnRef, out ClusterRole role)) { if (role == ClusterRole.ROWHEADER) { rowHeaders.Add(property); } else if (role is ClusterRole.Transform transform) { rowTransforms.Add(property.Name, transform); } } } var columnRoles = new Dictionary <object, ClusterRole>(); foreach (var group in pivotedProperties.SeriesGroups) { foreach (var series in group.SeriesList) { var columnRef = ToColumnRef(series); if (columnRef != null && allRoles.TryGetValue(columnRef, out ClusterRole role)) { if (role == ClusterRole.COLUMNHEADER || role is ClusterRole.Transform) { columnRoles.Add(series.SeriesId, role); } } } } return(new ClusteredProperties(pivotedProperties, rowHeaders, rowTransforms, columnRoles)); }
public static ClusteringSpec ReadXml(XmlReader reader) { var xElement = (XElement)XNode.ReadFrom(reader); var values = new List <ValueSpec>(); foreach (var elValue in xElement.Elements(EL_VALUE)) { var role = elValue.Attribute(ATTR_ROLE)?.Value; if (role == null) { continue; } ColumnRef columnRef = null; var columnid = elValue.Attribute(ATTR_COLUMN_ID)?.Value; if (columnid != null) { columnRef = new ColumnRef(new ColumnId(columnid)); } else { columnRef = new ColumnRef(PropertyPath.Parse(elValue.Attribute(ATTR_PROPERTY_PATH)?.Value)); } values.Add(new ValueSpec(columnRef, role)); } var spec = new ClusteringSpec(values); var attrDistanceMetric = xElement.Attribute(ATTR_DISTANCE_METRIC); if (attrDistanceMetric != null) { spec = spec.ChangeDistanceMetric(attrDistanceMetric.Value); } return(spec); }
public static ReportResults PerformClustering(CancellationToken cancellationToken, ClusteringSpec clusteringSpec, ReportResults reportResults) { return(CreateClusterer(cancellationToken, clusteringSpec, reportResults)?.GetClusteredResults()); }
protected bool Equals(ClusteringSpec other) { return(Equals(Values, other.Values) && DistanceMetric == other.DistanceMetric); }