Skip to content

Commit d495fe8

Browse files
authored
Remove checkpoints from experiment collection (#3639)
1 parent 4127ace commit d495fe8

File tree

16 files changed

+72
-2656
lines changed

16 files changed

+72
-2656
lines changed

extension/src/experiments/columns/collect/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
import { standardizePath } from '../../../fileSystem/path'
1717
import { timestampColumn } from '../constants'
1818
import { sortCollectedArray } from '../../../util/array'
19+
import { isCheckpoint } from '../../model/collect'
1920

2021
const collectFromExperiment = (
2122
acc: ColumnAccumulator,
@@ -34,7 +35,10 @@ const collectFromCommit = (
3435
) => {
3536
const { baseline, ...rest } = commit
3637
collectFromExperiment(acc, baseline)
37-
for (const experiment of Object.values(rest)) {
38+
for (const [sha, experiment] of Object.entries(rest)) {
39+
if (isCheckpoint(experiment.data?.checkpoint_tip, sha)) {
40+
continue
41+
}
3842
collectFromExperiment(acc, experiment)
3943
}
4044
}

extension/src/experiments/model/accumulator.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { Experiment, isRunning, RunningExperiment } from '../webview/contract'
44
export class ExperimentsAccumulator {
55
public workspace = {} as Experiment
66
public commits: Experiment[] = []
7-
public checkpointsByTip: Map<string, Experiment[]> = new Map()
87
public experimentsByCommit: Map<string, Experiment[]> = new Map()
98
public runningExperiments: RunningExperiment[]
109

extension/src/experiments/model/collect.test.ts

Lines changed: 2 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import { collectExperiments } from './collect'
2-
import { Experiment } from '../webview/contract'
3-
import modifiedFixture from '../../test/fixtures/expShow/modified/output'
42
import { EXPERIMENT_WORKSPACE_ID } from '../../cli/dvc/contract'
53
import { COMMITS_SEPARATOR } from '../../cli/git/constants'
64

@@ -92,10 +90,8 @@ describe('collectExperiments', () => {
9290
`a123\nJohn Smith\n3 days ago\nrefNames:tag: v.1.1\nmessage:add new feature${COMMITS_SEPARATOR}b123\nrenovate[bot]\n5 weeks ago\nrefNames:\nmessage:update various dependencies\n* update dvc\n* update dvclive`
9391
)
9492
const [branch1, branch2] = commits
95-
expect(branch1.displayNameOrParent).toStrictEqual('add new feature')
96-
expect(branch2.displayNameOrParent).toStrictEqual(
97-
'update various dependencies ...'
98-
)
93+
expect(branch1.displayName).toStrictEqual('add new feature')
94+
expect(branch2.displayName).toStrictEqual('update various dependencies ...')
9995
expect(branch1.commit).toStrictEqual({
10096
author: 'John Smith',
10197
date: '3 days ago',
@@ -137,96 +133,4 @@ describe('collectExperiments', () => {
137133
)
138134
expect(experimentsByCommit.size).toStrictEqual(1)
139135
})
140-
141-
it('should find three checkpoints on the tip', () => {
142-
const { checkpointsByTip } = collectExperiments(
143-
repoWithNestedCheckpoints,
144-
false,
145-
''
146-
)
147-
const checkpoints = checkpointsByTip.get('tip1') as Experiment[]
148-
149-
expect(checkpoints?.length).toStrictEqual(3)
150-
})
151-
152-
it('should find checkpoints in the correct order', () => {
153-
const { checkpointsByTip } = collectExperiments(
154-
repoWithNestedCheckpoints,
155-
false,
156-
''
157-
)
158-
const checkpoints = checkpointsByTip.get('tip1') as Experiment[]
159-
const [tip1cp1, tip1cp2, tip1cp3] = checkpoints
160-
expect(tip1cp1.id).toStrictEqual('tip1cp1')
161-
expect(tip1cp2.id).toStrictEqual('tip1cp2')
162-
expect(tip1cp3.id).toStrictEqual('tip1cp3')
163-
})
164-
165-
it('should handle the continuation of a modified checkpoint', () => {
166-
const { checkpointsByTip } = collectExperiments(modifiedFixture, false, '')
167-
168-
const modifiedCheckpointTip = checkpointsByTip
169-
.get('exp-01b3a')
170-
?.filter(checkpoint => checkpoint.displayNameOrParent?.includes('('))
171-
172-
expect(modifiedCheckpointTip).toHaveLength(1)
173-
expect(modifiedCheckpointTip?.[0].displayNameOrParent).toStrictEqual(
174-
'(3b0c6ac)'
175-
)
176-
expect(modifiedCheckpointTip?.[0].label).toStrictEqual('7e3cb21')
177-
178-
const modifiedCheckpoint = checkpointsByTip
179-
.get('exp-9bc1b')
180-
?.filter(checkpoint => checkpoint.displayNameOrParent?.includes('('))
181-
182-
expect(modifiedCheckpoint).toHaveLength(1)
183-
expect(modifiedCheckpoint?.[0].displayNameOrParent).toStrictEqual(
184-
'(df39067)'
185-
)
186-
expect(modifiedCheckpoint?.[0].label).toStrictEqual('98cb38c')
187-
188-
for (const checkpoints of checkpointsByTip.values()) {
189-
const continuationCheckpoints = checkpoints.filter(checkpoint => {
190-
const { label, displayNameOrParent } = checkpoint
191-
return (
192-
displayNameOrParent?.includes('(') &&
193-
!(label === '7e3cb21' && displayNameOrParent === '(3b0c6ac)') &&
194-
!(label === '98cb38c' && displayNameOrParent === '(df39067)')
195-
)
196-
})
197-
expect(continuationCheckpoints).toHaveLength(0)
198-
}
199-
})
200-
201-
it('should handle a checkpoint tip not having a name', () => {
202-
const checkpointTipWithoutAName = '3fceabdcef3c7b97c7779f8ae0c69a5542eefaf5'
203-
204-
const repoWithNestedCheckpoints = {
205-
[EXPERIMENT_WORKSPACE_ID]: { baseline: {} },
206-
branchA: {
207-
baseline: { data: {} },
208-
[checkpointTipWithoutAName]: {
209-
data: { checkpoint_tip: checkpointTipWithoutAName }
210-
},
211-
tip1cp1: {
212-
data: { checkpoint_tip: checkpointTipWithoutAName }
213-
},
214-
tip1cp2: {
215-
data: { checkpoint_tip: checkpointTipWithoutAName }
216-
},
217-
tip1cp3: {
218-
data: { checkpoint_tip: checkpointTipWithoutAName }
219-
}
220-
}
221-
}
222-
const acc = collectExperiments(repoWithNestedCheckpoints, false, '')
223-
224-
const { experimentsByCommit, checkpointsByTip } = acc
225-
const [experiment] = experimentsByCommit.get('branchA') || []
226-
227-
expect(experiment.id).toStrictEqual(checkpointTipWithoutAName)
228-
expect(
229-
checkpointsByTip.get(checkpointTipWithoutAName)?.length
230-
).toStrictEqual(3)
231-
})
232136
})

extension/src/experiments/model/collect.ts

Lines changed: 24 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -68,68 +68,21 @@ const getExperimentId = (
6868
return name || sha
6969
}
7070

71-
const getDisplayNameOrParent = (
71+
const getDisplayName = (
7272
sha: string,
73-
commitSha: string,
7473
experimentsObject: { [sha: string]: ExperimentFieldsOrError }
7574
): string | undefined => {
7675
const experiment = experimentsObject[sha]?.data
7776
if (!experiment) {
7877
return
7978
}
8079

81-
const {
82-
checkpoint_parent: checkpointParent,
83-
checkpoint_tip: checkpointTip,
84-
name
85-
} = experiment
86-
if (
87-
checkpointParent &&
88-
commitSha !== checkpointParent &&
89-
experimentsObject[checkpointParent]?.data?.checkpoint_tip !== checkpointTip
90-
) {
91-
return `(${shortenForLabel(checkpointParent)})`
92-
}
80+
const { name } = experiment
9381
if (name) {
9482
return `[${name}]`
9583
}
9684
}
9785

98-
const getLogicalGroupName = (
99-
sha: string,
100-
commitSha: string,
101-
experimentsObject: { [sha: string]: ExperimentFieldsOrError }
102-
): string | undefined => {
103-
const experiment = experimentsObject[sha]?.data
104-
105-
const { checkpoint_tip: checkpointTip = undefined, name = undefined } =
106-
experiment || {}
107-
108-
if (name) {
109-
return `[${name}]`
110-
}
111-
112-
return (
113-
getDisplayNameOrParent(sha, commitSha, experimentsObject) ||
114-
(checkpointTip && checkpointTip !== sha
115-
? getLogicalGroupName(checkpointTip, commitSha, experimentsObject)
116-
: undefined)
117-
)
118-
}
119-
120-
const getCheckpointTipId = (
121-
checkpointTip: string | undefined,
122-
experimentsObject: ExperimentsObject
123-
): string | undefined => {
124-
if (!checkpointTip) {
125-
return
126-
}
127-
128-
const tip = experimentsObject[checkpointTip]?.data
129-
130-
return tip?.name || checkpointTip
131-
}
132-
13386
const transformColumns = (
13487
experiment: Experiment,
13588
experimentFields: ExperimentFields,
@@ -167,8 +120,7 @@ const transformExperimentData = (
167120
experimentFieldsOrError: ExperimentFieldsOrError,
168121
label: string | undefined,
169122
sha?: string,
170-
displayNameOrParent?: string,
171-
logicalGroupName?: string,
123+
displayName?: string,
172124
commit?: Experiment
173125
): Experiment => {
174126
const data = experimentFieldsOrError.data || {}
@@ -181,12 +133,12 @@ const transformExperimentData = (
181133
...omit(data, Object.values(ColumnType))
182134
} as Experiment
183135

184-
if (displayNameOrParent) {
185-
experiment.displayNameOrParent = displayNameOrParent
136+
if (displayName) {
137+
experiment.displayName = displayName
186138
}
187139

188-
if (logicalGroupName) {
189-
experiment.logicalGroupName = logicalGroupName
140+
if (experiment.name && displayName) {
141+
experiment.logicalGroupName = displayName
190142
}
191143

192144
if (sha) {
@@ -206,37 +158,28 @@ const transformExperimentOrCheckpointData = (
206158
sha: string,
207159
experimentData: ExperimentFieldsOrError,
208160
experimentsObject: ExperimentsObject,
209-
commitSha: string,
210161
commit: Experiment
211-
): {
212-
checkpointTipId?: string
213-
experiment: Experiment | undefined
214-
} => {
162+
): Experiment | undefined => {
215163
const experimentFields = experimentData.data
216164
if (!experimentFields) {
217165
const error = experimentData?.error?.msg
218-
return { experiment: { error, id: sha, label: shortenForLabel(sha) } }
166+
return { error, id: sha, label: shortenForLabel(sha) }
219167
}
220168

221-
const checkpointTipId = getCheckpointTipId(
222-
experimentFields.checkpoint_tip,
223-
experimentsObject
224-
)
169+
if (isCheckpoint(experimentFields.checkpoint_tip, sha)) {
170+
return
171+
}
225172

226173
const id = getExperimentId(sha, experimentFields)
227174

228-
return {
229-
checkpointTipId,
230-
experiment: transformExperimentData(
231-
id,
232-
experimentData,
233-
shortenForLabel(sha),
234-
sha,
235-
getDisplayNameOrParent(sha, commitSha, experimentsObject),
236-
getLogicalGroupName(sha, commitSha, experimentsObject),
237-
commit
238-
)
239-
}
175+
return transformExperimentData(
176+
id,
177+
experimentData,
178+
shortenForLabel(sha),
179+
sha,
180+
getDisplayName(sha, experimentsObject),
181+
commit
182+
)
240183
}
241184

242185
const collectHasRunningExperiment = (
@@ -249,44 +192,25 @@ const collectHasRunningExperiment = (
249192
}
250193
}
251194

252-
const collectExperimentOrCheckpoint = (
253-
acc: ExperimentsAccumulator,
254-
experiment: Experiment,
255-
commitName: string,
256-
checkpointTipId: string | undefined
257-
) => {
258-
const { checkpoint_tip: checkpointTip, sha } = experiment
259-
if (isCheckpoint(checkpointTip, sha as string)) {
260-
if (!checkpointTipId) {
261-
return
262-
}
263-
addToMapArray(acc.checkpointsByTip, checkpointTipId, experiment)
264-
return
265-
}
266-
addToMapArray(acc.experimentsByCommit, commitName, experiment)
267-
}
268-
269195
const collectFromExperimentsObject = (
270196
acc: ExperimentsAccumulator,
271197
experimentsObject: ExperimentsObject,
272-
commitSha: string,
273198
commit: Experiment
274199
) => {
275200
const commitName = commit.label
276201

277202
for (const [sha, experimentData] of Object.entries(experimentsObject)) {
278-
const { checkpointTipId, experiment } = transformExperimentOrCheckpointData(
203+
const experiment = transformExperimentOrCheckpointData(
279204
sha,
280205
experimentData,
281206
experimentsObject,
282-
commitSha,
283207
commit
284208
)
285209
if (!experiment) {
286210
continue
287211
}
288212

289-
collectExperimentOrCheckpoint(acc, experiment, commitName, checkpointTipId)
213+
addToMapArray(acc.experimentsByCommit, commitName, experiment)
290214
collectHasRunningExperiment(acc, experiment)
291215
}
292216
}
@@ -308,7 +232,7 @@ const collectFromCommits = (
308232
const commit = transformExperimentData(name, baseline, label, sha)
309233

310234
if (commit) {
311-
collectFromExperimentsObject(acc, experimentsObject, sha, commit)
235+
collectFromExperimentsObject(acc, experimentsObject, commit)
312236
collectHasRunningExperiment(acc, commit)
313237

314238
acc.commits.push(commit)
@@ -371,9 +295,7 @@ const addDataToCommits = (
371295
return commits.map(commit => {
372296
const { sha } = commit
373297
if (sha && commitMessages[sha]) {
374-
commit.displayNameOrParent = formatCommitMessage(
375-
commitMessages[sha].message
376-
)
298+
commit.displayName = formatCommitMessage(commitMessages[sha].message)
377299
commit.commit = commitMessages[sha]
378300
}
379301
return commit

0 commit comments

Comments
 (0)