public Conditional Copy(DFG <Block> dfg, Dictionary <DFG <Block>, DFG <Block> > knownDFGCopys) { VariableBlock copyDeciding = null; if (DecidingBlock != null) { copyDeciding = (VariableBlock)dfg.Nodes.Single(x => DecidingBlock.OutputVariable == x.value.OutputVariable).value; } DFG <Block> copyGuarded = null; if (GuardedDFG != null && knownDFGCopys.ContainsKey(GuardedDFG)) { copyGuarded = knownDFGCopys[GuardedDFG]; } else if (GuardedDFG != null) { copyGuarded = GuardedDFG.Copy(); knownDFGCopys.Add(GuardedDFG, copyGuarded); } DFG <Block> copyNext = null; if (NextDFG != null && knownDFGCopys.ContainsKey(NextDFG)) { copyNext = knownDFGCopys[NextDFG]; } else if (NextDFG != null) { copyNext = NextDFG.Copy(); knownDFGCopys.Add(NextDFG, copyNext); } return(new Conditional(copyDeciding, copyGuarded, copyNext)); }