-
Notifications
You must be signed in to change notification settings - Fork 7
Description
In conversation with @molpopgen, it could be useful to support a method for slicing an existing graph at a given time, which will return a top half describing the demography up to that slice point, and a bottom half with the remainder that ignores the demographic events above the slice. This came up because, for example, we want to be able to simulate the top half with msprime and then add selected mutations to only the bottom half (e.g. drop a sweeping mutation at a time after the slice event using fwdpy11), in effect to "precapitate" using the faster neutral simulator.
In practice this could be a bit tricky. Below is a simple example of what we have in mind - slice the original model, returning two new graphs. The more ancient slice would just cut and reset times. The bottom slice would have demographic events and migrations from the slice to time zero, and above the slice time we would just add epochs to existing demes extending into the past.
Original graph:
description: pre-sliced demography
time_units: generations
demes:
- name: ancestral
epochs:
- {start_size: 100, end_time: 150}
- {start_size: 200, end_time: 100}
- name: deme1
ancestors: [ancestral]
epochs:
- {start_size: 50, end_size: 200, end_time: 0}
- name: deme2
ancestors: [ancestral]
epochs:
- {start_size: 75, end_time: 20}
- {start_size: 300, end_time: 0}
migrations:
- demes: [deme1, deme2]
rate: 1e-2Top slice:
description: after slicing original graph at time 50 (above slice)
time_units: generations
demes:
- name: ancestral
epochs:
- {start_size: 100, end_time: 100}
- {start_size: 200, end_time: 50}
- name: deme1
description: need to get size at slice time for epochs with changing size
ancestors: [ancestral]
epochs:
- {start_size: 50, end_size: 100, end_time: 0}
- name: deme2
ancestors: [ancestral]
epochs:
- {start_size: 75, end_time: 0}
migrations:
- demes: [deme1, deme2]
rate: 1e-2Bottom slice:
description: after slicing original graph at time 50 (below slice)
time_units: generations
demes:
- name: deme1
epochs:
- {start_size: 100, end_time: 50}
- {start_size: 100, end_size: 200, end_time: 0}
- name: deme2
epochs:
- {start_size: 75, end_time: 50}
- {start_size: 75, end_time: 20}
- {start_size: 300, end_time: 0}
migrations:
- demes: [deme1, deme2]
rate: 1e-2
start_time: 50Illustration using demesdraw (not deme widths are not to scale between panels):

Some issues/questions:
- What do people think? This would be useful for some simulation settings - is it worth it?
- How would we handle slices that occur at the same exact time as existing discrete demographic events?
- There would be corner cases where we need to ensure that epoch time spans do not equal zero.