%function [model,bond_not_failed,diagnostic] = mttUpdateBondCausality(...
% model,bond_number,effort_causality,flow_causality,uni_causality)
function [model,bond_not_failed] = mttUpdateBondCausality(...
model,bond_number,effort_causality,flow_causality,uni_causality)
if isempty(bond_number)
bond_not_failed = 1 ;
% diagnostic = [] ;
else
[model.bond(bond_number).effort,effort_ok] = ...
update_causality(model.bond(bond_number).effort,effort_causality) ;
[model.bond(bond_number).flow,flow_ok] = ...
update_causality(model.bond(bond_number).flow,flow_causality) ;
[model.bond(bond_number).unicausal,unicausal_ok] = ...
update_causality(model.bond(bond_number).unicausal,uni_causality) ;
[model.bond(bond_number),unicausal_checked] = ...
check_unicausal(model.bond(bond_number)) ;
bond_not_failed = effort_ok & flow_ok & unicausal_ok & unicausal_checked ;
% diagnostic = [effort_ok,flow_ok,unicausal_ok,unicausal_checked] ;
end
function [value,ok] = update_causality(value,new_value)
ok = 1 ;
if ~isempty(new_value)
if isempty(value)
value = new_value ;
else
ok = value==new_value ;
end
end
function [bond,ok] = check_unicausal(bond)
unicausal_defined = ~isempty(bond.unicausal) ;
effort_defined = ~isempty(bond.effort) ;
flow_defined = ~isempty(bond.flow) ;
ok = 1 ;
if unicausal_defined
switch bond.unicausal
case 0,
if effort_defined & flow_defined
ok = bond.effort==~bond.flow ;
elseif effort_defined & ~flow_defined
bond.flow = ~bond.effort ;
elseif flow_defined & ~effort_defined
bond.effort = ~bond.flow ;
end
case 1,
if effort_defined & flow_defined
ok = bond.effort==bond.flow ;
elseif effort_defined & ~flow_defined
bond.flow = bond.effort ;
elseif flow_defined & ~effort_defined
bond.effort = bond.flow ;
end
end
end