Skip to content

Commit

Permalink
[metrics] computeMetrics is mutating dataset
Browse files Browse the repository at this point in the history
keeping it for perf, adapting the state logic around that
fixes #148
  • Loading branch information
paulgirard committed Jun 12, 2024
1 parent 401e5af commit 904cbea
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 27 deletions.
8 changes: 6 additions & 2 deletions src/core/graph/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,14 +182,18 @@ export const filteredGraphAtom = derivedAtom(
(graphDataset, filteredGraphCache) => {
return last(filteredGraphCache)?.graph || graphDataset.fullGraph;
},
{ checkInput: false },
);
export const parentFilteredGraphAtom = derivedAtom(
[graphDatasetAtom, filteredGraphsAtom],
(graphDataset, filteredGraphCache) => {
return filteredGraphCache[filteredGraphCache.length - 2]?.graph || graphDataset.fullGraph;
},
{ checkInput: false },
);
export const visualGettersAtom = derivedAtom([graphDatasetAtom, appearanceAtom], getAllVisualGetters);
export const visualGettersAtom = derivedAtom([graphDatasetAtom, appearanceAtom], getAllVisualGetters, {
checkInput: false,
});
export const sigmaGraphAtom = derivedAtom(
[graphDatasetAtom, filteredGraphAtom, visualGettersAtom],
(dataset, filteredGraph, visualGetters, graph: SigmaGraph | undefined) => {
Expand All @@ -205,7 +209,7 @@ export const sigmaGraphAtom = derivedAtom(

return newGraph;
},
{ debounce: true },
{ debounce: true, checkInput: false },
);

export const graphDatasetActions = {
Expand Down
36 changes: 15 additions & 21 deletions src/core/metrics/index.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,34 @@
import { clone } from "lodash";

import { DatalessGraph, FieldModel, GraphDataset } from "../graph/types";
import { dataGraphToFullGraph, inferFieldType } from "../graph/utils";
import { Metric, MetricReport } from "./types";

/**
* computeMetric: compute a metric a mutate the graphdataset state directly for better performance
* @param metric metric object to apply
* @param params metric params from metric form
* @param attributeNames attribute⋅s where the result will be stored
* @param filteredGraph
* @param dataset
* @returns
*/
export function computeMetric(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
metric: Metric<any, any>,
params: Record<string, unknown>,
attributeNames: Record<string, string>,
filteredGraph: DatalessGraph,
dataset: GraphDataset,
): { dataset: GraphDataset; report: MetricReport } {
): { fieldModels: FieldModel[]; report: MetricReport } {
// get the full filtered graph
const graph = dataGraphToFullGraph(dataset, filteredGraph);

const scores = metric.fn(params, graph);
const report = {}; // TODO
const dataKey = metric.itemType === "nodes" ? "nodeData" : "edgeData";
const data = clone(dataset[dataKey]);

const fieldsKey = metric.itemType === "nodes" ? "nodeFields" : "edgeFields";
let fields = clone(dataset[fieldsKey]) as FieldModel[];
const data = dataset[dataKey];

const itemsCount = metric.itemType === "nodes" ? dataset.fullGraph.order : dataset.fullGraph.size;

const updatedFieldModels: FieldModel[] = [];
for (const score in scores) {
const values = scores[score];
const attributeName = attributeNames[score];
Expand All @@ -40,25 +44,15 @@ export function computeMetric(
let qualiQuanti = metric.outputs[score];
if (qualiQuanti === undefined) qualiQuanti = inferFieldType(Object.values(values), itemsCount);

const newFieldModel = {
updatedFieldModels.push({
id: attributeName,
itemType: metric.itemType,
...qualiQuanti,
};

if (fields.find((field) => field.id === attributeName)) {
fields = fields.map((field) => (field.id === attributeName ? newFieldModel : field));
} else {
fields = fields.concat(newFieldModel);
}
});
}

return {
report,
dataset: {
...dataset,
[dataKey]: data,
[fieldsKey]: fields,
},
fieldModels: updatedFieldModels,
};
}
17 changes: 13 additions & 4 deletions src/views/graphPage/StatisticsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export const MetricForm: FC<{ metric: Metric<any, any>; onClose: () => void }> =
const filteredGraph = useFilteredGraph();
const dataset = useGraphDataset();
const { nodeFields, edgeFields } = dataset;
const { setGraphDataset } = useGraphDatasetActions();
const { setFieldModel } = useGraphDatasetActions();
const fieldsIndex = keyBy(metric.itemType === "nodes" ? nodeFields : edgeFields, "id");
const [success, setSuccess] = useState<{ date: number; message: string } | null>(null);
// get metric config from the preference if it exists
Expand Down Expand Up @@ -129,8 +129,17 @@ export const MetricForm: FC<{ metric: Metric<any, any>; onClose: () => void }> =

const submit = useCallback(() => {
try {
const res = computeMetric(metric, metricConfig.parameters, metricConfig.attributeNames, filteredGraph, dataset);
setGraphDataset(res.dataset);
// compute the metric on the graph. This method mutates the state directly for performance reasons
const { fieldModels } = computeMetric(
metric,
metricConfig.parameters,
metricConfig.attributeNames,
filteredGraph,
dataset,
);
// TODO handle report
// update fieldModel
fieldModels.forEach(setFieldModel);
setSuccessMessage(
t("statistics.success", {
items: metric.itemType,
Expand All @@ -152,7 +161,7 @@ export const MetricForm: FC<{ metric: Metric<any, any>; onClose: () => void }> =
metricConfig.attributeNames,
filteredGraph,
dataset,
setGraphDataset,
setFieldModel,
setSuccessMessage,
t,
notify,
Expand Down

0 comments on commit 904cbea

Please sign in to comment.