Some Code

In[]:=
getBranchEventsList[rules_,initialCondition_,stepCount_Integer]:=Module[{initialCausalGraph,branchingEvents,branchEventsWithDuplication},​​initialCausalGraph=SimpleGraph[ResourceFunction["SubstitutionSystemCausalGraph"][rules,initialCondition,stepCount]];​​branchingEvents=VertexList[initialCausalGraph][[Position[VertexOutDegree[initialCausalGraph],_?(#≥2&)][[All,1]]]];​​branchEventsWithDuplication={};​​(branchEventsWithDuplication=Join[branchEventsWithDuplication,Subsets[Rest[VertexOutComponent[initialCausalGraph,{#},1]],{2}]])&/@branchingEvents;​​DeleteDuplicates[branchEventsWithDuplication]]
In[]:=
getNewBranchEventsList[rules_,initialCondition_,stepCount_Integer]:=Module[{branchEvents,oldBranchEvents},​​If[stepCount>0,​​branchEvents=Sort/@getBranchEventsList[rules,initialCondition,stepCount];​​oldBranchEvents=Sort/@getBranchEventsList[rules,initialCondition,stepCount-1];​​Complement[branchEvents,oldBranchEvents],​​{}]]
In[]:=
getCausalConnectionsList[rules_,initialCondition_,stepCount_Integer]:=Module[{branchEventsList,newBranchEventsList,combinedBranchEventsList,finalCausalGraph,terminalEvents},​​branchEventsList=If[stepCount>0,​​getBranchEventsList[rules,initialCondition,stepCount-1],​​{}];​​newBranchEventsList=getNewBranchEventsList[rules,initialCondition,stepCount];​​combinedBranchEventsList=Union[branchEventsList,newBranchEventsList];​​finalCausalGraph=SimpleGraph[ResourceFunction["SubstitutionSystemCausalGraph"][rules,initialCondition,stepCount]];​​terminalEvents=VertexList[finalCausalGraph][[Position[VertexOutDegree[finalCausalGraph],0][[All,1]]]];​​With[{terminalEvent=#},​​(branchEventsList=Select[branchEventsList,!SubsetQ[VertexOutComponent[ReverseGraph[finalCausalGraph],terminalEvent],#]&])]&/@terminalEvents;​​<|"Connected"Complement[combinedBranchEventsList,Union[branchEventsList,newBranchEventsList]],"Disconnected"Union[branchEventsList,newBranchEventsList]|>]
In[]:=
causallyConnectedQ[rules_,initialCondition_,stepCount_Integer]:=Module[{disconnectedEventsList,connectedEventsList},​​disconnectedEventsList=Sort/@getCausalConnectionsList[rules,initialCondition,Ceiling[stepCount/2]]["Disconnected"];​​connectedEventsList=Sort/@getCausalConnectionsList[rules,initialCondition,stepCount]["Connected"];​​Length[Complement[disconnectedEventsList,connectedEventsList]]0]
In[]:=
getEventHorizons[rules_,initialCondition_,stepCount_Integer]:=Module[{disconnectedEventsList,connectedEventsList},​​disconnectedEventsList=Sort/@getCausalConnectionsList[rules,initialCondition,Ceiling[stepCount/2]]["Disconnected"];​​connectedEventsList=Sort/@getCausalConnectionsList[rules,initialCondition,stepCount]["Connected"];​​Complement[disconnectedEventsList,connectedEventsList]]
In[]:=
getWolframModelBranchEventsList[rules_,initialCondition_,stepCount_Integer]:=Module[{initialCausalGraph,branchingEvents,branchEventsWithDuplication},​​initialCausalGraph=SimpleGraph[ResourceFunction["WolframModel"][rules,initialCondition,stepCount,"CausalGraph"]];​​branchingEvents=VertexList[initialCausalGraph][[Position[VertexOutDegree[initialCausalGraph],_?(#≥2&)][[All,1]]]];​​branchEventsWithDuplication={};​​(branchEventsWithDuplication=Join[branchEventsWithDuplication,Subsets[Rest[VertexOutComponent[initialCausalGraph,{#},1]],{2}]])&/@branchingEvents;​​DeleteDuplicates[branchEventsWithDuplication]]
In[]:=
getWolframModelNewBranchEventsList[rules_,initialCondition_,stepCount_Integer]:=Module[{branchEvents,oldBranchEvents},​​If[stepCount>0,​​branchEvents=Sort/@getWolframModelBranchEventsList[rules,initialCondition,stepCount];​​oldBranchEvents=Sort/@getWolframModelBranchEventsList[rules,initialCondition,stepCount-1];​​Complement[branchEvents,oldBranchEvents],​​{}]]
In[]:=
getWolframModelCausalConnectionsList[rules_,initialCondition_,stepCount_Integer]:=Module[{branchEventsList,newBranchEventsList,combinedBranchEventsList,finalCausalGraph,terminalEvents},​​branchEventsList=If[stepCount>0,​​getWolframModelBranchEventsList[rules,initialCondition,stepCount-1],​​{}];​​newBranchEventsList=getWolframModelNewBranchEventsList[rules,initialCondition,stepCount];​​combinedBranchEventsList=Union[branchEventsList,newBranchEventsList];​​finalCausalGraph=SimpleGraph[ResourceFunction["WolframModel"][rules,initialCondition,stepCount,"CausalGraph"]];​​terminalEvents=VertexList[finalCausalGraph][[Position[VertexOutDegree[finalCausalGraph],0][[All,1]]]];​​With[{terminalEvent=#},​​(branchEventsList=Select[branchEventsList,!SubsetQ[VertexOutComponent[ReverseGraph[finalCausalGraph],terminalEvent],#]&])]&/@terminalEvents;​​<|"Connected"Complement[combinedBranchEventsList,Union[branchEventsList,newBranchEventsList]],"Disconnected"Union[branchEventsList,newBranchEventsList]|>]

Substitution System Example

Wolfram Model Example