function next_next = mttIdentifyUndercausalBonds(model,branch,next)
is_root_model = (nargin==1) ;
if is_root_model
mttNotify('...following bonds are under-causal:') ;
mttWriteNewLine ;
branch = mttDetachText(model.source,'/') ;
next = 0 ;
end
number_of_bonds = mttGetFieldLength(model,'bond') ;
for i = 1:number_of_bonds
if isempty(model.bond(i).effort) | isempty(model.bond(i).flow)
origin = model.bond(i).from.obj ;
port = model.bond(i).from.interface ;
if isfield(model.obj,origin)
origin_class = getfield(model,'obj',origin,'class') ;
switch origin_class
case {'0','1'},
bond_origin = [origin_class,':',origin] ;
otherwise,
origin_port = getfield(model,'obj',origin,'interface',{port},'name') ;
bond_origin = [origin_class,':',origin,'[',origin_port,']'] ;
end
else
bond_origin = ['SS:',origin] ;
end
target = model.bond(i).to.obj ;
port = model.bond(i).to.interface ;
if isfield(model.obj,target)
target_class = getfield(model,'obj',target,'class') ;
switch target_class
case {'0','1'},
bond_target = [target_class,':',target] ;
otherwise,
target_port = getfield(model,'obj',target,'interface',{port},'name') ;
bond_target = [target_class,':',target,'[',target_port,']'] ;
end
else
bond_target = ['SS:',target] ;
end
next = next + 1 ;
descriptor = [' ',num2str(next),': ',branch,'(',num2str(i),') from: ',...
bond_origin,' to: ',bond_target] ;
mttNotify(descriptor) ;
mttWriteNewLine ;
end
end
next_next = next ;
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 isfield(object,'obj')
next_branch = [branch,'/',object_name] ;
next_next = mttIdentifyUndercausalBonds(object,next_branch,next) ;
next = next_next ;
end
end