function model = mttMeasureCausalCompletion(model)
number_of_bonds = mttGetFieldLength(model,'bond') ;
for i = 1:number_of_bonds
effort_defined(i) = ~isempty(model.bond(i).effort) ;
flow_defined(i) = ~isempty(model.bond(i).flow) ;
end
partly_defined = effort_defined|flow_defined ;
fully_defined = effort_defined&flow_defined ;
causal_completion.bonds = number_of_bonds ;
causal_completion.flows = sum(flow_defined) ;
causal_completion.efforts = sum(effort_defined) ;
causal_completion.assignments = sum(partly_defined) ;
unicausal_bonds = 0 ;
causal_bond = model.bond(fully_defined) ;
for i = 1:length(causal_bond)
if causal_bond(i).effort==causal_bond(i).flow
unicausal_bonds = unicausal_bonds + 1 ;
end
end
causal_completion.unicausal = unicausal_bonds ;
causal_completion.is_unicausal = causal_completion.assignments==causal_completion.unicausal ;
causal_completion.is_causal = (causal_completion.efforts==causal_completion.bonds) ...
& (causal_completion.flows==causal_completion.bonds) ;
object_names = mttGetFieldNames(model,'obj') ;
number_of_objects = length(object_names) ;
for i = 1:number_of_objects
object_name = object_names{i} ;
object = getfield(model,'obj',object_name) ;
if ~isempty(object.abg)
object = mttMeasureCausalCompletion(object) ;
causal_completion.bonds = causal_completion.bonds + object.causal_completion.bonds ;
causal_completion.flows = causal_completion.flows + object.causal_completion.flows ;
causal_completion.efforts = causal_completion.efforts + object.causal_completion.efforts ;
causal_completion.assignments = causal_completion.assignments + object.causal_completion.assignments ;
causal_completion.unicausal = causal_completion.unicausal + object.causal_completion.unicausal ;
causal_completion.is_unicausal = causal_completion.is_unicausal & object.causal_completion.is_unicausal ;
causal_completion.is_causal = causal_completion.is_causal & object.causal_completion.is_causal ;
end
end
model.causal_completion = causal_completion ;