function compound_item = mttIdentifyDomainCovariables(item,domain,model)
domains = mttGetFieldNames(model,'domain') ;
domain_name = domain.source ;
domain_shortname = mttDetachText(domain_name,'/') ;
item_names = mttGetFieldNames(domain,'item') ;
number_of_bonds = mttGetFieldLength(item,'bond') ;
if number_of_bonds==0
compound_item.effort = {item.covar.effort} ;
compound_item.flow = {item.covar.flow} ;
compound_item.effort_default = {item.covar.effort_default} ;
compound_item.flow_default = {item.covar.flow_default} ;
else
counter = 0 ;
for k = 1:number_of_bonds
bond = item.bond(k) ;
[next_domain,next_item] = mttCutText(bond.domain,'::') ;
if isempty(next_item)
mttAssert(ismember(next_item,item_names),...
['Unrecognised reference "',next_item,'" in domain ',domain_shortname]) ;
next_item = bond.domain ;
dependent_item = getfield(domain,'item',next_item) ;
compound_domain = mttIdentifyDomainCovariables(dependent_item,domain,model) ;
else
mttAssert(ismember(next_domain,domains),...
['Unrecognised domain reference "',next_domain,'" in domain ',domain_shortname]) ;
next_domain_index = getfield(model,'domain',next_domain,'dom') ;
next_domain_item_reference = getfield(model,'domain',next_domain,'item') ;
mttAssert(isempty(next_domain_item_reference),...
['Constrained domain reference "',next_domain,'" in domain ',domain_shortname]) ;
actual_domain = model.dom(next_domain_index) ;
actual_domain_name = actual_domain.source ;
actual_domain_shortname = mttDetachText(actual_domain_name,'/') ;
actual_item_names = mttGetFieldNames(actual_domain,'item') ;
mttAssert(ismember(next_item,actual_item_names),...
['Unrecognised reference "',next_item,'" in domain ',actual_domain_shortname]) ;
dependent_item = getfield(actual_domain,'item',next_item) ;
mttAssert(~dependent_item.is_private,...
['No public cross-reference available for "',next_item,'" in domain ',actual_domain_shortname]) ;
compound_domain = mttIdentifyDomainCovariables(dependent_item,actual_domain,model) ;
end
for i = 1:length(compound_domain.effort)
counter = counter + 1 ;
if isempty(bond.name)
compound_effort{counter} = compound_domain.effort{i} ;
compound_flow{counter} = compound_domain.flow{i} ;
else
compound_effort{counter} = [bond.name,'.',compound_domain.effort{i}] ;
compound_flow{counter} = [bond.name,'.',compound_domain.flow{i}] ;
end
compound_effort_default{counter} = compound_domain.effort_default{i} ;
compound_flow_default{counter} = compound_domain.flow_default{i} ;
end
end
depth = length(compound_effort) ;
for n = 1:depth-1
mttAssert(~ismember(compound_effort{n},{compound_effort{n+1:depth}}),...
['Repeated effort variable "',compound_effort{n},'" in domain ',domain_shortname]) ;
mttAssert(~ismember(compound_flow{n},{compound_flow{n+1:depth}}),...
['Repeated flow variable "',compound_flow{n},'" in domain ',domain_shortname]) ;
end
for n = 1:depth
mttAssert(~ismember(compound_effort{n},{compound_flow{1:depth}}),...
['Ambiguous effort/flow variable "',compound_effort{n},'" in domain ',domain_shortname]) ;
mttAssert(~ismember(compound_flow{n},{compound_effort{1:depth}}),...
['Ambiguous flow/effort variable "',compound_flow{n},'" in domain ',domain_shortname]) ;
end
mttAssert(~ismember('flow',{compound_effort{1:depth}}),...
['Effort variable called "flow" in domain ',domain_shortname]) ;
mttAssert(~ismember('effort',{compound_flow{1:depth}}),...
['flow variable called "effort" in domain ',domain_shortname]) ;
compound_item.effort = compound_effort ;
compound_item.flow = compound_flow ;
compound_item.effort_default = compound_effort_default ;
compound_item.flow_default = compound_flow_default ;
end