DPL11/27/2015 CS 551/651: Radiosity David Luebke [email protected].
Animation CS 551 / 651
description
Transcript of Animation CS 551 / 651
AnimationCS 551 / 651
Rigid-body SimulationRigid-body SimulationMirtich PaperMirtich Paper
Rigid-body SimulationRigid-body SimulationMirtich PaperMirtich Paper
Mirtich, 2000
Timewarp Rigid Body Simulation
Presented at SIGGRAPH 2000Presented at SIGGRAPH 2000
Brian MirtichBrian Mirtich
• MERL, A Mitsubishi Electric Research Lab MERL, A Mitsubishi Electric Research Lab (Cambridge, MA)(Cambridge, MA)
Presented at SIGGRAPH 2000Presented at SIGGRAPH 2000
Brian MirtichBrian Mirtich
• MERL, A Mitsubishi Electric Research Lab MERL, A Mitsubishi Electric Research Lab (Cambridge, MA)(Cambridge, MA)
What stages are in a simulation?
• IntegrationIntegration
• Collision checking (impacts)Collision checking (impacts)
• Force computationForce computation
• Constraints (non penetration)Constraints (non penetration)
• ControlControl
– What is this?What is this?
• IntegrationIntegration
• Collision checking (impacts)Collision checking (impacts)
• Force computationForce computation
• Constraints (non penetration)Constraints (non penetration)
• ControlControl
– What is this?What is this?
How much time do they take?
What’s so slow?What’s so slow?
Why do multibodies exacerbate this?Why do multibodies exacerbate this?
What’s so slow?What’s so slow?
Why do multibodies exacerbate this?Why do multibodies exacerbate this?
Big Idea
Simulations are slowSimulations are slow
• What part is so slow???What part is so slow???
Simulations are discontinuousSimulations are discontinuous
• What’s the source of discontinuities?What’s the source of discontinuities?
– Collisions, contacts, rollingCollisions, contacts, rolling sliding, etc. sliding, etc.
But not discontinuities are unpredictable and only But not discontinuities are unpredictable and only affect parts of simulationaffect parts of simulation
Simulations are slowSimulations are slow
• What part is so slow???What part is so slow???
Simulations are discontinuousSimulations are discontinuous
• What’s the source of discontinuities?What’s the source of discontinuities?
– Collisions, contacts, rollingCollisions, contacts, rolling sliding, etc. sliding, etc.
But not discontinuities are unpredictable and only But not discontinuities are unpredictable and only affect parts of simulationaffect parts of simulation
A simple game of Pong
What goes on in this sim?What goes on in this sim?
• IntegrationIntegration
–
• Collision checkingCollision checking
• Collision resolutionCollision resolution
–
Would this scale well if balls didn’t collide with Would this scale well if balls didn’t collide with each other?each other?
What goes on in this sim?What goes on in this sim?
• IntegrationIntegration
–
• Collision checkingCollision checking
• Collision resolutionCollision resolution
–
Would this scale well if balls didn’t collide with Would this scale well if balls didn’t collide with each other?each other?
General rigid body simulator
• Nontrivial geometriesNontrivial geometries
• All pairs can potentially collideAll pairs can potentially collide
• Second-order physics equations of motionSecond-order physics equations of motion
• Could be deployed on multiprocessor (simulation farm)Could be deployed on multiprocessor (simulation farm)
• Nontrivial geometriesNontrivial geometries
• All pairs can potentially collideAll pairs can potentially collide
• Second-order physics equations of motionSecond-order physics equations of motion
• Could be deployed on multiprocessor (simulation farm)Could be deployed on multiprocessor (simulation farm)
Discontinuities
When do they occur?When do they occur?
• When the state or equations of motion changeWhen the state or equations of motion change
– CollisionsCollisions
– New contactsNew contacts
– Changing from rolling to sliding dynamicsChanging from rolling to sliding dynamics
When do they occur?When do they occur?
• When the state or equations of motion changeWhen the state or equations of motion change
– CollisionsCollisions
– New contactsNew contacts
– Changing from rolling to sliding dynamicsChanging from rolling to sliding dynamics
Discontinuities
From From §2.1 §2.1 Root finding method localizes the Root finding method localizes the exact moment of a discontinuityexact moment of a discontinuity
• What is a root?What is a root?
• How do we find the roots?How do we find the roots?
From From §2.1 §2.1 Root finding method localizes the Root finding method localizes the exact moment of a discontinuityexact moment of a discontinuity
• What is a root?What is a root?
• How do we find the roots?How do we find the roots?
Newton-Raphson
Find the zero of an equation (where it Find the zero of an equation (where it crosses the x-axis)crosses the x-axis)
– If pIf pnn is close to p is close to pn-1n-1
then return pthen return pnn
• else set pelse set pn-1n-1 = p = pnn and repeat and repeat
Find the zero of an equation (where it Find the zero of an equation (where it crosses the x-axis)crosses the x-axis)
– If pIf pnn is close to p is close to pn-1n-1
then return pthen return pnn
• else set pelse set pn-1n-1 = p = pnn and repeat and repeat
Newton-Raphson
Why setWhy set
• y-intercept equation of line: y = mx + by-intercept equation of line: y = mx + b
• let y-intercept, b = f (plet y-intercept, b = f (pn-1n-1))
• let slope, m = f’(plet slope, m = f’(pn-1n-1))
• we want to find x-value where y-value = 0we want to find x-value where y-value = 0
– let y = 0let y = 0
• 0 = f’(p0 = f’(pn-1n-1) * x + f(p) * x + f(pn-1n-1))
– solve for x: -f(psolve for x: -f(pn-1n-1) / f’(p) / f’(pn-1n-1))
Why setWhy set
• y-intercept equation of line: y = mx + by-intercept equation of line: y = mx + b
• let y-intercept, b = f (plet y-intercept, b = f (pn-1n-1))
• let slope, m = f’(plet slope, m = f’(pn-1n-1))
• we want to find x-value where y-value = 0we want to find x-value where y-value = 0
– let y = 0let y = 0
• 0 = f’(p0 = f’(pn-1n-1) * x + f(p) * x + f(pn-1n-1))
– solve for x: -f(psolve for x: -f(pn-1n-1) / f’(p) / f’(pn-1n-1))
Newton-Raphson
Be aware that Newton-Raphson could set pBe aware that Newton-Raphson could set pnn
to a value not defined by curveto a value not defined by curve
f’(pf’(pn-1n-1) could be 0 (cannot divide by 0)) could be 0 (cannot divide by 0)
Be aware that Newton-Raphson could set pBe aware that Newton-Raphson could set pnn
to a value not defined by curveto a value not defined by curve
f’(pf’(pn-1n-1) could be 0 (cannot divide by 0)) could be 0 (cannot divide by 0)
Discontinuities
What trouble do they cause?What trouble do they cause?
• Integrator must be stopped and restarted with new Integrator must be stopped and restarted with new state, forces, or equationsstate, forces, or equations
• Main control loop constantly checking for Main control loop constantly checking for discontinuities so appropriate handling takes placediscontinuities so appropriate handling takes place
Two common methodsTwo common methods
• Retroactive detection and conservative Retroactive detection and conservative advancementadvancement
What trouble do they cause?What trouble do they cause?
• Integrator must be stopped and restarted with new Integrator must be stopped and restarted with new state, forces, or equationsstate, forces, or equations
• Main control loop constantly checking for Main control loop constantly checking for discontinuities so appropriate handling takes placediscontinuities so appropriate handling takes place
Two common methodsTwo common methods
• Retroactive detection and conservative Retroactive detection and conservative advancementadvancement
A general simulation problem
§3 references DES, Discrete Event §3 references DES, Discrete Event SimulationsSimulations
• Much more than graphics simulations encounter Much more than graphics simulations encounter these challengesthese challenges
• Many simulations are represented as DES and thus Many simulations are represented as DES and thus this technology is relevantthis technology is relevant
§3 references DES, Discrete Event §3 references DES, Discrete Event SimulationsSimulations
• Much more than graphics simulations encounter Much more than graphics simulations encounter these challengesthese challenges
• Many simulations are represented as DES and thus Many simulations are represented as DES and thus this technology is relevantthis technology is relevant
Retroactive Detection
Catch discontinuities after the happenCatch discontinuities after the happen
• Detect when two objects go through one anotherDetect when two objects go through one another
• Use root finding to detect exact time of impactUse root finding to detect exact time of impact
Roll back the clock to time of impactRoll back the clock to time of impact
• All objects or just some?All objects or just some?
Continue simulation only up to impact Continue simulation only up to impact
Catch discontinuities after the happenCatch discontinuities after the happen
• Detect when two objects go through one anotherDetect when two objects go through one another
• Use root finding to detect exact time of impactUse root finding to detect exact time of impact
Roll back the clock to time of impactRoll back the clock to time of impact
• All objects or just some?All objects or just some?
Continue simulation only up to impact Continue simulation only up to impact
Retroactive Detection
What’s bad about this algorithm?What’s bad about this algorithm?
• You’re repeating workYou’re repeating work
– Simulate, back up, simulate againSimulate, back up, simulate again
• Additional collisions may be encountered during subsequent Additional collisions may be encountered during subsequent smaller simulation timesteps (and others won’t take place after smaller simulation timesteps (and others won’t take place after all)all)
• Synchronization requires repeated simulation of all objects if Synchronization requires repeated simulation of all objects if they are involved in collision or notthey are involved in collision or not
Doesn’t scale well in number of discontinuitiesDoesn’t scale well in number of discontinuities
What’s bad about this algorithm?What’s bad about this algorithm?
• You’re repeating workYou’re repeating work
– Simulate, back up, simulate againSimulate, back up, simulate again
• Additional collisions may be encountered during subsequent Additional collisions may be encountered during subsequent smaller simulation timesteps (and others won’t take place after smaller simulation timesteps (and others won’t take place after all)all)
• Synchronization requires repeated simulation of all objects if Synchronization requires repeated simulation of all objects if they are involved in collision or notthey are involved in collision or not
Doesn’t scale well in number of discontinuitiesDoesn’t scale well in number of discontinuities
Conservative Advancement
Don’t simulate past discontinuitiesDon’t simulate past discontinuities
• Heuristics predict future discontinuities and impending Heuristics predict future discontinuities and impending events are stored in a priority queueevents are stored in a priority queue
Upon approaching time of event in priority Upon approaching time of event in priority queue, take small steps queue, take small steps
Don’t simulate past discontinuitiesDon’t simulate past discontinuities
• Heuristics predict future discontinuities and impending Heuristics predict future discontinuities and impending events are stored in a priority queueevents are stored in a priority queue
Upon approaching time of event in priority Upon approaching time of event in priority queue, take small steps queue, take small steps
Conservative Advancement
What’s bad about this method?What’s bad about this method?
• Conservative, but slow as number of discontinuities Conservative, but slow as number of discontinuities increasesincreases
– All simulated objects move forward at small All simulated objects move forward at small timesteptimestep
• Difficult to compute tight bounds on discontinuitiesDifficult to compute tight bounds on discontinuities
What’s bad about this method?What’s bad about this method?
• Conservative, but slow as number of discontinuities Conservative, but slow as number of discontinuities increasesincreases
– All simulated objects move forward at small All simulated objects move forward at small timesteptimestep
• Difficult to compute tight bounds on discontinuitiesDifficult to compute tight bounds on discontinuities
Timewarp Algorithm
Derived from a 1985 paper by David Derived from a 1985 paper by David JeffersonJefferson
• Be optimisticBe optimistic
– Each object simulates as quickly as possibleEach object simulates as quickly as possible
• Be responsiveBe responsive
– If an object is informed of an event in the past, it If an object is informed of an event in the past, it must reset its state to that previous timemust reset its state to that previous time
Derived from a 1985 paper by David Derived from a 1985 paper by David JeffersonJefferson
• Be optimisticBe optimistic
– Each object simulates as quickly as possibleEach object simulates as quickly as possible
• Be responsiveBe responsive
– If an object is informed of an event in the past, it If an object is informed of an event in the past, it must reset its state to that previous timemust reset its state to that previous time
What is STATE?
What is the state in the rigid body sims?What is the state in the rigid body sims?What is the state in the rigid body sims?What is the state in the rigid body sims?
Timewarp
Multiple processesMultiple processes
• Each models part of the systemEach models part of the system
• Each has its own “time” called Local Virtual Time (LVT)Each has its own “time” called Local Virtual Time (LVT)
• Process clocks are not synchronizedProcess clocks are not synchronized
Multiple processesMultiple processes
• Each models part of the systemEach models part of the system
• Each has its own “time” called Local Virtual Time (LVT)Each has its own “time” called Local Virtual Time (LVT)
• Process clocks are not synchronizedProcess clocks are not synchronized
Timewarp
Message PassingMessage Passing
• When a process experiences an eventWhen a process experiences an event
– message is sent to all processes with timestamp = LVT of message is sent to all processes with timestamp = LVT of sending processsending process
• When a process receives a messageWhen a process receives a message
– If (message time > recipient’s LVT)If (message time > recipient’s LVT)
² Message is placed on time-based queueMessage is placed on time-based queue
² Process will advance clock to next event on queueProcess will advance clock to next event on queue
– What if (message time < recipient’s LVT)?What if (message time < recipient’s LVT)?
Message PassingMessage Passing
• When a process experiences an eventWhen a process experiences an event
– message is sent to all processes with timestamp = LVT of message is sent to all processes with timestamp = LVT of sending processsending process
• When a process receives a messageWhen a process receives a message
– If (message time > recipient’s LVT)If (message time > recipient’s LVT)
² Message is placed on time-based queueMessage is placed on time-based queue
² Process will advance clock to next event on queueProcess will advance clock to next event on queue
– What if (message time < recipient’s LVT)?What if (message time < recipient’s LVT)?
Rollback
Occurs when a recipient has simulated Occurs when a recipient has simulated “past” the time at which another process “past” the time at which another process has generated an eventhas generated an event
• Go back in time (how?)Go back in time (how?)
• Put all processed events back on queuePut all processed events back on queue
• ““unsend” events sent to other processesunsend” events sent to other processes
– For each message sent, an antimessage is stored For each message sent, an antimessage is stored on a queue that can be easily flushedon a queue that can be easily flushed
Occurs when a recipient has simulated Occurs when a recipient has simulated “past” the time at which another process “past” the time at which another process has generated an eventhas generated an event
• Go back in time (how?)Go back in time (how?)
• Put all processed events back on queuePut all processed events back on queue
• ““unsend” events sent to other processesunsend” events sent to other processes
– For each message sent, an antimessage is stored For each message sent, an antimessage is stored on a queue that can be easily flushedon a queue that can be easily flushed
Rollback
OverheadOverhead• Keeping track of previous statesKeeping track of previous states
• Keeping track of processed eventsKeeping track of processed events
• Keeping track of submitted eventsKeeping track of submitted events
Global Virtual Time (GVT)Global Virtual Time (GVT)• The minimum of all LVTs and safe times (why?)The minimum of all LVTs and safe times (why?)
– All states before GVT can be purgedAll states before GVT can be purged
• Monotonically increasingMonotonically increasing
OverheadOverhead• Keeping track of previous statesKeeping track of previous states
• Keeping track of processed eventsKeeping track of processed events
• Keeping track of submitted eventsKeeping track of submitted events
Global Virtual Time (GVT)Global Virtual Time (GVT)• The minimum of all LVTs and safe times (why?)The minimum of all LVTs and safe times (why?)
– All states before GVT can be purgedAll states before GVT can be purged
• Monotonically increasingMonotonically increasing
Timewarp for rigid body sim
• Every simulated body is a processEvery simulated body is a process
• The state = position & velocityThe state = position & velocity
• Global event queue stores all bodies’ eventsGlobal event queue stores all bodies’ events
– Event = timestamp and list of affected bodiesEvent = timestamp and list of affected bodies
• Main loopMain loop
– Pull front item from event queuePull front item from event queue
– Simulate affected bodies to that timeSimulate affected bodies to that time
This can be put on a uniprocessorThis can be put on a uniprocessor
• Every simulated body is a processEvery simulated body is a process
• The state = position & velocityThe state = position & velocity
• Global event queue stores all bodies’ eventsGlobal event queue stores all bodies’ events
– Event = timestamp and list of affected bodiesEvent = timestamp and list of affected bodies
• Main loopMain loop
– Pull front item from event queuePull front item from event queue
– Simulate affected bodies to that timeSimulate affected bodies to that time
This can be put on a uniprocessorThis can be put on a uniprocessor
Types of events
Collision CheckCollision Check• Between pairs of bodiesBetween pairs of bodies
Group CheckGroup Check• Collision check for contacting bodiesCollision check for contacting bodies
• Splitting groups of bodies when no longer contactingSplitting groups of bodies when no longer contacting
RedrawRedraw• At every new rendered frame, copy positions to bufferAt every new rendered frame, copy positions to buffer
CallbackCallback• User-defined functions to be executedUser-defined functions to be executed
Collision CheckCollision Check• Between pairs of bodiesBetween pairs of bodies
Group CheckGroup Check• Collision check for contacting bodiesCollision check for contacting bodies
• Splitting groups of bodies when no longer contactingSplitting groups of bodies when no longer contacting
RedrawRedraw• At every new rendered frame, copy positions to bufferAt every new rendered frame, copy positions to buffer
CallbackCallback• User-defined functions to be executedUser-defined functions to be executed
Collisions
Safe-timeSafe-time
• Each body keeps track of the last time it was known Each body keeps track of the last time it was known not to be in collision with other bodiesnot to be in collision with other bodies
• This helps limit how far a body must roll back upon This helps limit how far a body must roll back upon detection of a collisiondetection of a collision
• Safe-time is included in collision/group check eventsSafe-time is included in collision/group check events
• Upon collision checking, safe-time is updatedUpon collision checking, safe-time is updated
Safe-timeSafe-time
• Each body keeps track of the last time it was known Each body keeps track of the last time it was known not to be in collision with other bodiesnot to be in collision with other bodies
• This helps limit how far a body must roll back upon This helps limit how far a body must roll back upon detection of a collisiondetection of a collision
• Safe-time is included in collision/group check eventsSafe-time is included in collision/group check events
• Upon collision checking, safe-time is updatedUpon collision checking, safe-time is updated
Collisions (A collides with B)
• Vertical connections join post-collision statesVertical connections join post-collision states
• Gray states are new states after A-B collision check Gray states are new states after A-B collision check eventevent
• Vertical connections join post-collision statesVertical connections join post-collision states
• Gray states are new states after A-B collision check Gray states are new states after A-B collision check eventevent
Collision (between A and B)
Multibodies
Jointed (articulated) bodies like a humanJointed (articulated) bodies like a human
All bodies must be treated in unisonAll bodies must be treated in unison
Easily integrated into their systemEasily integrated into their system
Jointed (articulated) bodies like a humanJointed (articulated) bodies like a human
All bodies must be treated in unisonAll bodies must be treated in unison
Easily integrated into their systemEasily integrated into their system
Contact Groups
Bodies in persistent contactBodies in persistent contact
• Simulated as a unitSimulated as a unit
• Membership of group is dynamicMembership of group is dynamic
• Complicated state keeping so, Complicated state keeping so, upon rollback, a body can be upon rollback, a body can be detached from its group and detached from its group and simulatedsimulated
Bodies in persistent contactBodies in persistent contact
• Simulated as a unitSimulated as a unit
• Membership of group is dynamicMembership of group is dynamic
• Complicated state keeping so, Complicated state keeping so, upon rollback, a body can be upon rollback, a body can be detached from its group and detached from its group and simulatedsimulated
Collision checks
Active PairsActive Pairs
• The set of all bodies that must be checked for The set of all bodies that must be checked for potential collisionspotential collisions
– We want to keep this set smallWe want to keep this set small
Active PairsActive Pairs
• The set of all bodies that must be checked for The set of all bodies that must be checked for potential collisionspotential collisions
– We want to keep this set smallWe want to keep this set small
Active Pairs
Looking for collisionsLooking for collisions• Each body has an Each body has an axis-alignedaxis-aligned bounding box bounding box
• For each timestep between GVT and LVTFor each timestep between GVT and LVT
– Record location of bounding boxRecord location of bounding box
• Compute bounding box (swept volume) of all Compute bounding box (swept volume) of all bounding boxes over timebounding boxes over time
– Using six heaps for max/min {x, y, z}Using six heaps for max/min {x, y, z}
– GVT increment causes volume to shrinkGVT increment causes volume to shrink
Looking for collisionsLooking for collisions• Each body has an Each body has an axis-alignedaxis-aligned bounding box bounding box
• For each timestep between GVT and LVTFor each timestep between GVT and LVT
– Record location of bounding boxRecord location of bounding box
• Compute bounding box (swept volume) of all Compute bounding box (swept volume) of all bounding boxes over timebounding boxes over time
– Using six heaps for max/min {x, y, z}Using six heaps for max/min {x, y, z}
– GVT increment causes volume to shrinkGVT increment causes volume to shrink
Looking for collisions
If swept volumes do not intersectIf swept volumes do not intersect
• Collision free between [GVT, tCollision free between [GVT, tminmin (A, B)] (A, B)]
– Depending on LVT of A and BDepending on LVT of A and B
• A and B not an active pairA and B not an active pair
If swept volumes do not intersectIf swept volumes do not intersect
• Collision free between [GVT, tCollision free between [GVT, tminmin (A, B)] (A, B)]
– Depending on LVT of A and BDepending on LVT of A and B
• A and B not an active pairA and B not an active pair
Looking for collisions
If newest timestep for B causes overlapping If newest timestep for B causes overlapping swept volume with Aswept volume with A
• Collision check at time tCollision check at time tminmin (A, B) (A, B)
– B, before integration (last known free time)B, before integration (last known free time)
• Rollback will resolve collisionsRollback will resolve collisions
If newest timestep for B causes overlapping If newest timestep for B causes overlapping swept volume with Aswept volume with A
• Collision check at time tCollision check at time tminmin (A, B) (A, B)
– B, before integration (last known free time)B, before integration (last known free time)
• Rollback will resolve collisionsRollback will resolve collisions
Results
ApplicationsApplications
• Atoms: 200 spheres and 100 water molecules in Atoms: 200 spheres and 100 water molecules in divided boxdivided box
• Cars: 4 multibody vehicles and 400 pendulaCars: 4 multibody vehicles and 400 pendula
• Robots: 20 eight-link manipulators throwing blocksRobots: 20 eight-link manipulators throwing blocks
• Avalanche: 300 rocks tumbling down mountainsideAvalanche: 300 rocks tumbling down mountainside
ApplicationsApplications
• Atoms: 200 spheres and 100 water molecules in Atoms: 200 spheres and 100 water molecules in divided boxdivided box
• Cars: 4 multibody vehicles and 400 pendulaCars: 4 multibody vehicles and 400 pendula
• Robots: 20 eight-link manipulators throwing blocksRobots: 20 eight-link manipulators throwing blocks
• Avalanche: 300 rocks tumbling down mountainsideAvalanche: 300 rocks tumbling down mountainside
Results
• Note average integration step vs. time between discontinuitiesNote average integration step vs. time between discontinuities
– Look at cars vs. robotsLook at cars vs. robots
• Note average integration step vs. time between discontinuitiesNote average integration step vs. time between discontinuities
– Look at cars vs. robotsLook at cars vs. robots
Results
Atoms for 2 secondsAtoms for 2 seconds
• Average integration stepAverage integration step
– Conservative Conservative advancement advancement slows downslows down
Atoms for 2 secondsAtoms for 2 seconds
• Average integration stepAverage integration step
– Conservative Conservative advancement advancement slows downslows down
Results
Atoms for 2 secondsAtoms for 2 seconds
• Total “work done” per Total “work done” per simulated objectsimulated object
– Retroactive detection Retroactive detection repeats a lot of workrepeats a lot of work
Atoms for 2 secondsAtoms for 2 seconds
• Total “work done” per Total “work done” per simulated objectsimulated object
– Retroactive detection Retroactive detection repeats a lot of workrepeats a lot of work
Results
Total timeTotal time
• 100 atoms100 atoms
– RD-1/30 = 0.142, TW = 0.147, CA = 1.15RD-1/30 = 0.142, TW = 0.147, CA = 1.15
• 200 atoms200 atoms
– RD -1/30 = 2.61, TW = .388, CA = 4.74RD -1/30 = 2.61, TW = .388, CA = 4.74
Total timeTotal time
• 100 atoms100 atoms
– RD-1/30 = 0.142, TW = 0.147, CA = 1.15RD-1/30 = 0.142, TW = 0.147, CA = 1.15
• 200 atoms200 atoms
– RD -1/30 = 2.61, TW = .388, CA = 4.74RD -1/30 = 2.61, TW = .388, CA = 4.74
Discussion
§4.2 – If rollback time is between safe time §4.2 – If rollback time is between safe time and current time, nothing is done…and current time, nothing is done…
Jefferson proved this was what?Jefferson proved this was what?
Figure 2Figure 2
No global stateNo global state
§4.2 – If rollback time is between safe time §4.2 – If rollback time is between safe time and current time, nothing is done…and current time, nothing is done…
Jefferson proved this was what?Jefferson proved this was what?
Figure 2Figure 2
No global stateNo global state