1%% Complex Workflow Example
2% A workflow combining serial, parallel, and branching patterns.
6% A -> B -> [AND] | | [AND] -> F -> G
12% Copyright (c) 2012-2026, Imperial College London
19wf = Workflow(
'ComplexWorkflow');
22A = wf.addActivity(
'A', Exp.fitMean(0.5));
23B = wf.addActivity(
'B', Exp.fitMean(1.0));
24C = wf.addActivity(
'C', Exp.fitMean(2.0));
25D = wf.addActivity(
'D', Exp.fitMean(1.5));
26F = wf.addActivity(
'F', Exp.fitMean(1.0));
27G = wf.addActivity(
'G', Exp.fitMean(0.5));
30wf.addPrecedence(Workflow.Serial(A, B)); % A -> B
31wf.addPrecedence(Workflow.AndFork(B, {C, D})); % B forks to C and D
32wf.addPrecedence(Workflow.AndJoin({C, D}, F)); % C and D join to F
33wf.addPrecedence(Workflow.Serial(F, G)); % F -> G
35%% Convert to phase-type distribution
39fprintf(
'Complex Workflow: A -> B -> [C || D] -> F -> G\n');
40fprintf(
'Activity means: A=0.5, B=1.0, C=2.0, D=1.5, F=1.0, G=0.5\n');
42% Calculate expected max(C, D)
43lambda_C = 0.5; % rate
for mean 2.0
44lambda_D = 1/1.5; % rate
for mean 1.5
45expected_max = 2.0 + 1.5 - 1/(lambda_C + lambda_D);
46fprintf(
'Expected max(C,D) mean: %.4f\n', expected_max);
47fprintf(
'Expected total mean: %.4f\n', 0.5 + 1.0 + expected_max + 1.0 + 0.5);
48fprintf(
'Computed PH mean: %.4f\n', ph.getMean());
49fprintf(
'Number of phases: %d\n', size(ph.getSubgenerator(), 1));
51%% Sample from the distribution
53fprintf(
'\nSampling 1000000 workflow execution times...\n');
54samples = ph.sample(1000000);
55fprintf(
'Sample mean: %.4f\n', mean(samples));
56fprintf(
'Sample std: %.4f\n', std(samples));
57fprintf(
'Sample min: %.4f\n', min(samples));
58fprintf(
'Sample max: %.4f\n', max(samples));