Evolution Functions

PNEvolveStep[rules_,net_,{rulenum_,location_,twist_},t_:1,of_:True]:=Module[{ans},SetOldestFirst[of];SetGraphRules[rules];SetGraph[net];ApplyGraphRule[t,rulenum/.x_Integer->x-1,location,twist/.x_Integer->x-1];GetGraph[]]
PNEvolveStep[rules_,net_]:=PNEvolveStep[rules,net,{First,First,First}]
PNEvolveStepRandom[rules_,net_]:=PNEvolveStep[rules,net,{Random,Random,Random}]
PNEvolveStepLocation[rules_,net_,i_]:=PNEvolveStep[rules,net,{First,i,First}]
PNEvolve[rule_,net_,t_,of_:True]:=PNEvolveStep[rule,net,{First,First,First},t,of]
PNEvolveList[rule_,net_,t_]:=NestList[PNEvolveStep[rule,#,{First,First,First},1,True]&,net,t]
PNEvolveRandom[rule_,net_,t_]:=PNEvolveStep[rule,net,{Random,Random,Random},t]
PNEvolveRandom[rule_,net_,t_,seed_]:=(SetRandomSeed[seed];PNEvolveStep[rule,net,{Random,Random,Random},t])
PNEvolveLocations[rules_,net_,verts_]:=(SetGraphRules[rules];SetGraph[net];Scan[ApplyGraphRule[1,First,#,First]&,verts];GetGraph[])
Given a list of locations {rule,node,twist}, returns {graph, {lhsgroups, rhsgroups}}
PNEvolveLocationsOldNew[rules_,net_,locs_]:=(SetGraphRules[rules];SetGraph[net];Module[{locations=Apply[First[FindGraphRule[1,##]]&,(#-{1,0,1})&/@locs,{1}],r,n,t,results={}},Scan[({r,n,t}=#;ApplyGraphRule[1,r-1,n,t-1];AppendTo[results,First/@Take[GetGraph[],-Length[rules[[r,2]]]]])&,locs];{GetGraph[],{Last/@locations,results}}])
Returns a list of locations {rule,node,twist} where the rules can apply
PNFindLocations[rules_,net_,n_:1]:=Module[{ans},SetGraphRules[rules];SetGraph[net];ans=(#+{1,0,1})&/@First/@FindGraphRule[n,First,First,First];ans]
Returns {graph, {lhsgroups, rhsgroups}}
PNEvolveStepInfo[rules_,net_]:=(SetOldestFirst[True];SetGraphRules[rules];SetGraph[net];PNEvolveLocationsOldNew[rules,net,PNFindLocations[rules,net]])
PNEvolveLocationsInfo[rules_,net_,locs_]:=(SetGraphRules[rules];SetGraph[net];PNEvolveLocationsOldNew[rules,net,locs])
Returns a list whose elements are of the form: {{pregraph, lhsgroups}, {postgraph, rhsgroups}}
PNEvolveListBeforeAfter[rules_,net_,t_]:=Rest[NestList[With[{u=PNEvolveStepInfo[rules,First[Last[#]]]},{{#[[2,1]],u[[2,1]]},{u[[1]],u[[2,2]]}}]&,{{},{net}},t]]
PNEvolveLocationsBeforeAfter[rules_,net_,locs_]:=Replace[PNEvolveLocationsInfo[rules,net],{gr_,{lhsg_,rhsg_}}->{{net,lhsg},{gr,rhsg}}]
PNEvolveLocationSequenceBeforeAfter[rules_,net_,locs_]:=Rest[FoldList[PNEvolveLocationsBeforeAfter[rules,First[Last[#]],{#2}]&,{{},{net}},locs]]

Non-interfering evolution

PNFindNoninterferingLocations[rules_,net_]:=Module[{ans},SetGraphRules[rules];SetGraph[net]; ans=(#+{1,0,1})&/@First/@Fold[If[Intersection[Union@@Last/@#1,Union[Flatten[{Last[#2],First/@(Last[#2]/.net)}]]]==={},Append[#1,#2],#1]&,{},FindGraphRule[All,First,First,First]];ans]
PNEvolveNIStep[rules_,net_]:=Module[{ans},SetOldestFirst[True];SetGraphRules[rules];SetGraph[net];Apply[Function[{rulenum,location,twist},ApplyGraphRule[1,rulenum/.x_Integer->x-1,location,twist/.x_Integer->x-1]],PNFindNoninterferingLocations[rules,net],{1}];GetGraph[]]
PNEvolveNIList[rules_,net_,t_]:=NestList[PNEvolveNIStep[rules,#]&,net,t]
PNEvolveNIStepInfo[rules_,net_]:=(SetOldestFirst[True];SetGraphRules[rules];SetGraph[net];PNEvolveLocationsOldNew[rules,net,PNFindNoninterferingLocations[rules,net]])
PNEvolveNIListBeforeAfter[rules_,net_,t_]:=Rest[NestList[With[{u=PNEvolveNIStepInfo[rules,First[Last[#]]]},{{#[[2,1]],u[[2,1]]},{u[[1]],u[[2,2]]}}]&,{{},{net}},t]]