1%% Parallel Workflow Example (AND-fork/join)
2% A workflow with parallel activities that synchronize.
9% Copyright (c) 2012-2026, Imperial College London
16wf = Workflow(
'ParallelWorkflow');
19A = wf.addActivity(
'A', Exp.fitMean(1.0));
20B = wf.addActivity(
'B', Exp.fitMean(2.0));
21C = wf.addActivity(
'C', Exp.fitMean(3.0));
22D = wf.addActivity(
'D', Exp.fitMean(0.5));
25wf.addPrecedence(Workflow.AndFork(A, {B, C}));
26wf.addPrecedence(Workflow.AndJoin({B, C}, D));
28%% Convert to phase-type distribution
32fprintf(
'Parallel Workflow: A -> [B || C] -> D\n');
33fprintf(
'Activity means: A=1.0, B=2.0, C=3.0, D=0.5\n');
35% Expected max of two exponentials: E[max(X,Y)] = 1/λ1 + 1/λ2 - 1/(λ1+λ2)
36lambda_B = 0.5; % rate
for mean 2.0
37lambda_C = 1/3; % rate
for mean 3.0
38expected_max = 2.0 + 3.0 - 1/(lambda_B + lambda_C);
39fprintf(
'Expected max(B,C) mean: %.4f\n', expected_max);
40fprintf(
'Expected total mean: %.4f\n', 1.0 + expected_max + 0.5);
41fprintf(
'Computed PH mean: %.4f\n', ph.getMean());
42fprintf(
'Number of phases: %d\n', size(ph.getSubgenerator(), 1));