function [SuppliersStruct,funzione ] = RDFtoMAT(RDF)
% trasforma l'RDF nella struttura matlab da usare SCRS
%trovo tutti gli attori e li metto in una struttura confomre
elem.uid='';
elem.layer='';
elem.ProdCap='';
elem.StorCap='';
elem.Demand=0;
elem.UnitProdCost='';
elem.UnitStorCost='';
elem.BatchPol='';
elem.Name='';
elem.LeadTime='';
elem.Piece=struct('nome','','supp',[]);
elem.MaskShapley='';
elem.Product='';
elem.Suppliers=[];
elem.UnitFixedCost='';
% Stringhe da cercare
attori_str='a:elementary_actor';
link_str='a:value_exchange';
int_str='a:value_interface';
port_str='a:value_port';
off_str='a:value_offering';
or_str='a:e3value_OR';
and_str='a:e3value_AND';
%Carico tutti gli attori dalla struttura RDF
Figli =RDF(2).Children;
Attori=[];
Link=[];
Port=[];
Inter=[];
Offer=[];
Or_pieces=[];
And_pieces=[];
indexA=[];
indexL=[];
indexPort=[];
indexVoff=[];
indexVint=[];
indexOr=[];
indexAnd=[];
for i=1:1:length(Figli);
switch (Figli(i).Name)
case attori_str
indexA=[indexA,i];
case link_str
indexL=[indexL,i];
case int_str
indexVint=[indexVint,i];
case port_str
indexPort=[indexPort,i];
case off_str
indexVoff=[indexVoff,i];
case or_str
indexOr=[indexOr,i];
case and_str
indexAnd=[indexAnd,i];
end
end
if (isempty(indexA))
disp('non ci sono attori')
end
Attori=Figli(indexA);
Link=Figli(indexL);
Port=Figli(indexPort);
Inter=Figli(indexVint);
Offer=Figli(indexVoff);
Or_pieces=Figli(indexOr);
And_pieces=Figli(indexAnd);
disp('Loading Actors Attributes...')
for i=1:1:length(Attori);
%tiro fuori il nome e l'uid
for j=1:1:length(Attori(i).Attributes)
if strcmp(Attori(i).Attributes(j).Name,'a:e3_has_name')
elem(i).Name=char(Attori(i).Attributes(j).Value);
end
if strcmp(Attori(i).Attributes(j).Name,'a:e3_has_uid')
elem(i).uid=char(Attori(i).Attributes(j).Value);
end
end
%attributi
for j=1:1:length(Attori(i).Children)
if strcmp(Attori(i).Children(j).Name,'a:e3_has_formula')
data=Attori(i).Children(j).Data;
[str, remain] = strtok(data,'=');
%SHIPPING_COSTS
switch upper(str)
case 'HOLDING_COSTS'
elem(i).StorCost=str2num(remain(2:end));
case 'PRODUCTION_CAPACITY'
elem(i).ProdCap=str2num(remain(2:end));
case 'PRODUCTION_COSTS'
elem(i).UnitProdCost=str2num(remain(2:end));
case 'LAYER'
elem(i).layer=str2num(remain(2:end));
case 'LEAD_TIME'
elem(i).LeadTime=str2num(remain(2:end));
case 'PRODUCT_CODE'
elem(i).Product=remain(2:end);
case 'UNIT_FIXED_COST'
elem(i).UnitFixedCost=str2num(remain(2:end));
end
end
end
elem(i).Piece=struct('nome','','supp',[]);
end
disp('Start Linking...')
VE=[];
for i=1:1:length(Link);
%Figli per trovare le porte coinvolte
Vin=[];
Vout=[];
for j=1:1:length(Link(i).Children)
if strcmp(Link(i).Children(j).Name,'a:ve_has_in_po')
attr=Link(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
Vin=str2num(remain(2:end));
end
if strcmp(Link(i).Children(j).Name,'a:ve_has_out_po')
attr=Link(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
Vout=str2num(remain(2:end));
end
end
VE=[VE;Vin,Vout];
end
PO=[];
Puid=[];
for i=1:1:length(Port);
for j=1:1:length(Port(i).Attributes)
if strcmp(Port(i).Attributes(j).Name,'a:e3_has_uid')
Puid=str2num(char(Port(i).Attributes(j).Value));
end
end
%Figli per trovare il Value object coinvolto
Pobject=[];
for j=1:1:length(Port(i).Children)
if strcmp(Port(i).Children(j).Name,'a:vp_in_vo')
attr=Port(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
Pobject=str2num(remain(2:end));
end
end
PO=[PO;Puid,Pobject];
end
VO=[];
Vuid=[];
for i=1:1:length(Offer);
for j=1:1:length(Offer(i).Attributes)
if strcmp(Offer(i).Attributes(j).Name,'a:e3_has_uid')
Vuid=str2num(char(Offer(i).Attributes(j).Value));
end
end
%Figli per trovare il Value object coinvolto
Vobject=[];
for j=1:1:length(Offer(i).Children)
if strcmp(Offer(i).Children(j).Name,'a:vo_in_vi')
attr=Offer(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
Vobject=str2num(remain(2:end));
end
end
VO=[VO;Vuid,Vobject];
end
VI=[];
Viuid=[];
for i=1:1:length(Inter);
for j=1:1:length(Inter(i).Attributes)
if strcmp(Inter(i).Attributes(j).Name,'a:e3_has_uid')
Viuid=str2num(char(Inter(i).Attributes(j).Value));
end
end
%Figli per trovare il Value object coinvolto
Viobject=[];
Vidownce=0;
Viupce=0;
salta=0;
for j=1:1:length(Inter(i).Children)
if strcmp(Inter(i).Children(j).Name,'a:vi_assigned_to_ac')
attr=Inter(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
Viobject=str2num(remain(2:end));
end
if strcmp(Inter(i).Children(j).Name,'a:de_up_ce')
attr=Inter(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
Viupce=str2num(remain(2:end));
end
if strcmp(Inter(i).Children(j).Name,'a:de_down_ce')
attr=Inter(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
Vidownce=str2num(remain(2:end));
end
if strcmp(Inter(i).Children(j).Name,'a:vi_assigned_to_ms')
salta=1;
end
end
if (salta==0)
VI=[VI;Viuid,Viobject,Viupce,Vidownce];
end
end
VOR=[];
VORuid=[];
for i=1:1:length(Or_pieces);
for j=1:1:length(Or_pieces(i).Attributes)
if strcmp(Or_pieces(i).Attributes(j).Name,'a:e3_has_uid')
VORuid=str2num(char(Or_pieces(i).Attributes(j).Value));
end
end
%Figli per trovare il Value object coinvolto
VORobject=[];
VORobject_up=[];
for j=1:1:length(Or_pieces(i).Children)
if strcmp(Or_pieces(i).Children(j).Name,'a:de_down_ce')
attr=Or_pieces(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
VORobject=[VORobject,str2num(remain(2:end))];
end
if strcmp(Or_pieces(i).Children(j).Name,'a:de_up_ce')
attr=Or_pieces(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
VORobject_up=[VORobject_up,str2num(remain(2:end))];
end
end
VOR(i).uid=VORuid;
VOR(i).ce=VORobject;
VOR(i).cein=VORobject_up;
end
VAND=[];
VANDuid=[];
for i=1:1:length(And_pieces);
for j=1:1:length(And_pieces(i).Attributes)
if strcmp(And_pieces(i).Attributes(j).Name,'a:e3_has_uid')
VANDuid=str2num(char(And_pieces(i).Attributes(j).Value));
end
end
%Figli per trovare L'or object coinvolto
VANDobject=[];
for j=1:1:length(And_pieces(i).Children)
if strcmp(And_pieces(i).Children(j).Name,'a:de_down_ce')
attr=And_pieces(i).Children(j).Attributes(1).Value;
[str, remain] = strtok(attr,'#');
VANDobject=[VANDobject,str2num(remain(2:end))];
end
end
VAND(i).uid=VANDuid;
VAND(i).ce=VANDobject;
end
% genero usa struttura apposta che mi gestisca i sottopezzi guardando AND e
% OR
P_AND_OR=VAND;
for i=1:1:length(VAND);
P_AND_OR(i).ORind=[];
for j=1:1:length(VAND(i).ce)
for k=1:1:length(VOR)
if (VOR(k).cein==VAND(i).ce(j))
P_AND_OR(i).ORind=[P_AND_OR(i).ORind,k];
end
end
end
end
disp('Step1: Completed...')
% trovo i collegamenti tra oggetti.
objectLink=[];
for i=1:1:length(VE);
obj1pieces=0;
obj2pieces=0;
obj1Port=0;
obj2Port=0;
% 1 and
% 2 or
obj1=VI(find(VI(:,1)==VO(find(VO(:,1)== PO(find(PO(:,1)==VE(i,1)),2)),2)),2);
obj2=VI(find(VI(:,1)==VO(find(VO(:,1)== PO(find(PO(:,1)==VE(i,2)),2)),2)),2);
if (isempty(obj1)|isempty(obj2))
%dovrebbe essere il mercato
continue;
end
obj1VI=VI(find(VI(:,1)==VO(find(VO(:,1)== PO(find(PO(:,1)==VE(i,1)),2)),2)),1);
% questo solo down magari serve anche l'up
obj1ce= VI(find(VI(:,1)==VO(find(VO(:,1)== PO(find(PO(:,1)==VE(i,1)),2)),2)),3);
% rilevo di che pezzo fa parte guardando P_AND_OR
if not(obj1ce==0) %esiste un down ce
for j=1:1:length(P_AND_OR)
% controllo quelli direttamente collegati all'and
if not(isempty(find(P_AND_OR(j).ce==obj1ce)))
%questo equivale a dire che sottoparte
obj1pieces=P_AND_OR(j).uid;
%salvo nell'or l'attore a cui appartiene
P_AND_OR(j).actor=obj1;
obj1Port=1;
else
%guardo se son collegati ad uno degli or che ci sono
if not(isempty(P_AND_OR(j).ORind))
for k=1:1:length(P_AND_OR(j).ORind)
if not(isempty(find(VOR(P_AND_OR(j).ORind(k)).ce==obj1ce)))
%questo equivale a dire che sottoparte
obj1pieces=VOR(P_AND_OR(j).ORind(k)).uid;
%salvo nell'or l'attore a cui appartiene
P_AND_OR(j).actor=obj1;
obj1Port=2;
end
end
end
end
end
end
obj2VI=VI(find(VI(:,1)==VO(find(VO(:,1)== PO(find(PO(:,1)==VE(i,2)),2)),2)),1);
obj2ce=VI(find(VI(:,1)==VO(find(VO(:,1)== PO(find(PO(:,1)==VE(i,2)),2)),2)),3);
if not(obj2ce==0) %esiste un down ce
for j=1:1:length(P_AND_OR)
% controllo quelli direttamente collegati all'and
if not(isempty(find(P_AND_OR(j).ce==obj2ce)))
%questo equivale a dire che sottoparte
obj2pieces=P_AND_OR(j).uid;
%salvo nell'or l'attore a cui appartiene
P_AND_OR(j).actor=obj2;
obj2Port=1;
else
%guardo se son collegati ad uno degli or che ci sono
if not(isempty(P_AND_OR(j).ORind))
for k=1:1:length(P_AND_OR(j).ORind)
if not(isempty(find(VOR(P_AND_OR(j).ORind(k)).ce==obj2ce)))
%questo equivale a dire che sottoparte
obj2pieces=VOR(P_AND_OR(j).ORind(k)).uid;
%salvo nell'or l'attore a cui appartiene
P_AND_OR(j).actor=obj2;
obj2Port=2;
end
end
end
end
end
end
objectLink= [objectLink; obj1,obj2,obj1pieces,obj2pieces,obj1Port,obj2Port];
end
% tolgo i doppioni da objectLink
for i=1:1:length(objectLink)
if (objectLink(i,1)==0)
% eliminato
continue;
else
%cerco il suo doppio e lo tolgo
index=ismember(objectLink(:,1:2), [objectLink(i,2),objectLink(i,1)], 'rows');
objectLink(find(index),1)=0;
end
end
objectLink=objectLink(find(not(objectLink(:,1)==0)),:);
% dove trovo lo 0 inverto
for i=1:1:length(objectLink)
if (objectLink(i,3)==0)
aux= objectLink(i,2);
objectLink(i,2)=objectLink(i,1);
objectLink(i,1)=aux;
objectLink(i,3)=objectLink(i,4);
objectLink(i,4)=0;
objectLink(i,5)=objectLink(i,5)+objectLink(i,6);
end
end
%objectLinkUniq = unique(objectLink(:,1:2), 'rows')
disp('Step2: Completed...')
%Creo il link effettivo tra gli attori
% duplicato va reso singolo, lo faccio mentre eseguo il riempimento degli
% elem
% va rivisto perch devo spezzare quando c' l'AND
% per come ho fatto vedo solo attraverso cosa passo
objectLink=objectLink(:,1:5);
for i=1:1:length(objectLink)
for j=1:1:length(elem)
if (str2num(elem(j).uid)==objectLink(i,1))
% dove avr 0 come nome sono link o duplicati o semplici rimandi
% la struttura la sistemo dopo
%se il pezzo lo stesso devo accodare a supp altrimenti devo
%mettere un nuovo pieces.
if isempty(elem(j).Piece(1).nome)
elem(j).Piece(1).nome=num2str(objectLink(i,3));
elem(j).Piece(1).supp=[objectLink(i,2)];
else
trovato=0;
for k=1:1:length(elem(j).Piece)
% se la porta un or allora cerco se c' e lo
% aggiungo altrimenti un and e va messo per i fatti
% suoi in pi
if (objectLink(i,5)==2)
if strcmp(elem(j).Piece(k).nome,num2str(objectLink(i,3)))
%ho trovato lo stesso pezzo quindi devo aggiungere il link e basta
elem(j).Piece(k).supp=[elem(j).Piece(k).supp,objectLink(i,2)];
trovato=1;
break;
end
end
end
if (trovato==0)
%allora un pezzo nuovo da inserire in coda a Piece
aux_elem.nome=num2str(objectLink(i,3));
aux_elem.supp=[objectLink(i,2)];
elem(j).Piece=[elem(j).Piece,aux_elem];
end
end
% trovato l'elemento basta
break;
end
end
end
disp('Step3: Completed...')
disp('Step4: Concluding conversion...')
% Ordino elem per livelli e creo una struttura a parte
elemindex=[];
for i=1:1:length(elem)
elemindex(i,1)=elem(i).layer;
end
[aux,order]=sort(elemindex);
elem=elem(order);
%estraggo gli uid da quello ordinato per avere i riferimenti
elem_uid=[];
for i=1:1:length(elem)
elem_uid(i,1)=str2num(elem(i).uid);
end
%adesso questa la struttura ufficiale devo associare usando questi
%indici al posto di uid.
% sistemo i Piece per farli puntare ad elem
% metto anche la maskera che serve per calcolare il valore della catena
% usando gli and e or derivanti da piece.
MaskShapleyZero=zeros(1,length(elem));
for i=1:1:length(elem)
for j=1:1:length(elem(i).Piece)
for k=1:1:length(elem(i).Piece(j).supp)
elem(i).Piece(j).supp(k)=find(elem_uid==elem(i).Piece(j).supp(k));
% segno chi sono i suppliers a cui fa riferimento nell'or
% indicando quindi anche il pezzo
elem(elem(i).Piece(j).supp(k)).Suppliers=[elem(elem(i).Piece(j).supp(k)).Suppliers,i,j];
end
end
elem(i).MaskShapley=MaskShapleyZero;
elem(i).MaskShapley(i)=1;
elem(i).Demand=0;
end
% se ho pi piece significa che sono in and, se ho pi supp sotto un pezzo
% allora sono in or
% adesso devo seguire la rete per definire una funzione logica che mi
% permetta di valutare il valore della rete data una maskera di presenza o
% meno e che valuti pure il numero di prodotti generati
% per questo motivo un or diventa un + e un and diventa un min
% cos per i binari funziona anche se or di 1 e 1 far 2, ma va bene
% comunque
[fine, funzione] = DefineSubPieces(elem,1,[]);
disp('Conversion completed')
SuppliersStruct=elem;