Code covered by the BSD License  

Highlights from
Supply Chain Risk Simulator (SCRS)

from Supply Chain Risk Simulator (SCRS) by Marco Anisetti
Supply Chain simulator for risk assessment and incentive schemes.

RDFtoMAT(RDF)
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;








Contact us at files@mathworks.com