No BSD License  

Highlights from
MatPlanWDM v0.5

image thumbnail
from MatPlanWDM v0.5 by Pablo Pavon MariƱo
Educational network planning tool for the RWA problem in WDM networks (MILP and heuristic based)

io_writeXML(metadata, phys, netState, XMLfilename, DTDpathname)
%%%COMMENTS:
%The function writes a XML file.
%INPUT arguments:
    %1)metadata: struct with metadata info.
    %2)phys: struct with phys info.
    %3)netState: struct with netState info.
    %4)XMLfilename: Filename or full pathname where the XML file will be 
    %  stored.
    %5)DTDpathname: Pathname where the "DOCTYPE.dtd" is stored. 
    %The "DOCTYPE.dtd" is the DTD (Document Type Definition) file used for
    %validating the XML file.
    %NOTE: This info is necessary to write the DOC TYPE declaration in the XML
    %file

function io_writeXML(metadata, phys, netState, XMLfilename, DTDpathname)

import org.apache.xerces.dom.CoreDocumentImpl;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import java.io.FileOutputStream;
import java.io.File;

%1. --------- DOM DEFINITION AND ROOT NODE SETUP ------------------------
% We Create the Document Object Model
DOMnode = CoreDocumentImpl();
% Create a document type node and add it to the document.
DocType = DOMnode.createDocumentType('DOCTYPE', [], DTDpathname );
DOMnode.appendChild(DocType);
% We Create the Root Node and add it to the document.
docRootNode=DOMnode.createElement('network');
DOMnode.appendChild(docRootNode);

%NETWORK METADATA 
%We add the metadata as attributes in the root node
docRootNode.setAttribute('title', metadata.title);
docRootNode.setAttribute('author', metadata.author);
docRootNode.setAttribute('date', metadata.date);
docRootNode.setAttribute('multihourPlanning', metadata.multihourPlanning);
docRootNode.setAttribute('planningAlgorithmFile', metadata.planningAlgorithmFile);
docRootNode.setAttribute('planningAlgorithmParametersString', metadata.planningAlgorithmParametersString);
docRootNode.setAttribute('flowGeneratorFile', metadata.flowGeneratorFile);
docRootNode.setAttribute('flowGeneratorParametersString', metadata.flowGeneratorParametersString);
docRootNode.setAttribute('trafficMatrixFile', metadata.trafficMatrixFile);
docRootNode.setAttribute('description', metadata.description);

%2. -------- NETWORK LAYER NODES DEFINITION --------------
%We estimate if netState is empty (and therefore, the later 'trafficDemand' and 'virtualTopology' are not necessary)
netStateIsEmpty = 0;
namesOfNetStateFields = fieldnames(netState);
for index = 1:length(namesOfNetStateFields),
    if isempty(getfield(netState,namesOfNetStateFields{index})), netStateIsEmpty = 1; , break, end
end

if netStateIsEmpty == 0, 
    %2.1) %%%%%%%%%%%%%%%% TRAFFIC DEMAND LAYER (OPTIONAL) %%%%%%%%%%%%%%%%
    %We write the info about the TRAFFIC DEMAND layer

    layerElement = DOMnode.createElement('layer');
    layerElement.setAttribute('id', 'trafficDemand');

    %We create the traffic flow demands:
    numberOfFlows = size(netState.flowTable,1);
    for flowID = 1:numberOfFlows
        flowElement = DOMnode.createElement('flow'); 
        flowElement.setAttribute('id',num2str(flowID));
        flowElement.setAttribute('serialNumber',num2str(netState.flowTable(flowID,1)))
        flowElement.setAttribute('origNodeId',num2str(netState.flowTable(flowID,2)));
        flowElement.setAttribute('destNodeId',num2str(netState.flowTable(flowID,3)));
        flowElement.setAttribute('flowAverageRateDemand',num2str(netState.flowTable(flowID,4)));
        if netState.flowTable(flowID,5) ~= -1, flowElement.setAttribute('flowPriority',num2str(netState.flowTable(flowID,5))), end
        if netState.flowTable(flowID,6) ~= -1, flowElement.setAttribute('flowInitTime',num2str(netState.flowTable(flowID,6))), end
        if netState.flowTable(flowID,7) ~= -1, flowElement.setAttribute('flowDuration',num2str(netState.flowTable(flowID,7))), end

        %We compute the routing of the current lightpath
        routingElement = DOMnode.createElement('flowRouting');
        lpIDsOfThisFlow = find(netState.flowRoutingMatrix (flowID,:)~=0);
        for thisLP = lpIDsOfThisFlow,
            lightpathElement = DOMnode.createElement('lightpathInFlow');
            lightpathElement.setAttribute('id',num2str(thisLP));
            lightpathElement.setAttribute('averageRate',num2str(netState.flowRoutingMatrix(flowID,thisLP)));
            routingElement.appendChild(lightpathElement);  
        end
        flowElement.appendChild(routingElement);

        layerElement.appendChild(flowElement);
    end

    docRootNode.appendChild(layerElement);


    %2.2) %%%%%%%%%%%%%%%% VIRTUAL TOPOLOGY LAYER (OPTIONAL) %%%%%%%%%%%%%%%%
    % We write the info about the virtual topology layer
    layerElement = DOMnode.createElement('layer');
    layerElement.setAttribute('id', 'virtualTopology');

    %We create the lightpaths:
    numberOfLightpaths = size(netState.lightpathTable,1);
    for lpID = 1:numberOfLightpaths
        lightpathElement = DOMnode.createElement('lightpath'); 
        lightpathElement.setAttribute('id',num2str(lpID));
        lightpathElement.setAttribute('serialNumber',num2str(netState.lightpathTable(lpID,1)))
        lightpathElement.setAttribute('origNodeId',num2str(netState.lightpathTable(lpID,2)));
        lightpathElement.setAttribute('destNodeId',num2str(netState.lightpathTable(lpID,3)));

        %We compute the routing of the current lightpath
        routingElement = DOMnode.createElement('lightpathRouting');
        linkIDsOfThisLP = find(netState.lightpathRoutingMatrix (lpID,:)~=0);
        for thisFibre = linkIDsOfThisLP,
            fibreElement = DOMnode.createElement('fibreInLightpath');
            fibreElement.setAttribute('id',num2str(thisFibre));
            fibreElement.setAttribute('wavelengthId',num2str(netState.lightpathRoutingMatrix(lpID,thisFibre)));
            routingElement.appendChild(fibreElement);  
        end
        lightpathElement.appendChild(routingElement);

        layerElement.appendChild(lightpathElement);
    end

    docRootNode.appendChild(layerElement);
end

%2.3) %%%%%%%%%%%%%%%% PHYSICAL TOPOLOGY LAYER (MANDATORY) %%%%%%%%%%%%%%%%
%We write the info about the physical topology layer
layerElement = DOMnode.createElement('layer');
layerElement.setAttribute('id', 'physicalTopology');

%We obtain the next data
numberOfNodes = phys.N;
numberOfLinks = phys.M;
numberOfLevels = size(phys.levelMatrix,1);

%We create the nodes:
for nodeID = 1:numberOfNodes,
    nodeElement = DOMnode.createElement('node'); 
    nodeElement.setAttribute('id', num2str(nodeID));
    nodeElement.setAttribute('nodeName', phys.nodeName{nodeID});
    nodeElement.setAttribute('xCoord',num2str(phys.nodesPlaceMatrix(nodeID,1)));
    nodeElement.setAttribute('yCoord',num2str(phys.nodesPlaceMatrix(nodeID,2)));
    nodeElement.setAttribute('nodePopulation',num2str(phys.nodePopulation(nodeID)));
    nodeElement.setAttribute('nodeTimezone',num2str(phys.nodeTimezone(nodeID)));
    nodeElement.setAttribute('nodeLevel',num2str(phys.nodeLevel(nodeID)));
    
    eoTxElement = DOMnode.createElement('eoTransmitter');
    eoTxElement.setAttribute('number',num2str(phys.numberTxPerNode(nodeID)));
    nodeElement.appendChild(eoTxElement);
    
    oeRxElement = DOMnode.createElement('oeReceiver');
    oeRxElement.setAttribute('number',num2str(phys.numberRxPerNode(nodeID)));
    nodeElement.appendChild(oeRxElement);
    
    wcElement = DOMnode.createElement('wc');
    wcElement.setAttribute('number',num2str(phys.numberTWCPerNode(nodeID)));
    nodeElement.appendChild(wcElement);
    
    layerElement.appendChild(nodeElement);
end

%We create the links:
for linkID = 1:numberOfLinks,
    fibreElement = DOMnode.createElement('fibre');
    fibreElement.setAttribute('id',num2str(linkID));
    fibreElement.setAttribute('origNodeId',num2str(phys.linkTable(linkID,1)));
    fibreElement.setAttribute('destNodeId',num2str(phys.linkTable(linkID,2)));
    fibreElement.setAttribute('linkLengthInKm',num2str(phys.linkLengthInKm(linkID)));
    fibreElement.setAttribute('numberWavelengths',num2str(phys.numberWavelengthPerFiber(linkID)));
    
    layerElement.appendChild(fibreElement);  
end

%We create the levels:
levelMatrixElement = DOMnode.createElement('levelInformationMatrix');
for levelIDOrig = 1:numberOfLevels,
    for levelIDDest = 1:numberOfLevels,
        factorElement = DOMnode.createElement('factor');
        factorElement.setAttribute('idOrig',num2str(levelIDOrig));
        factorElement.setAttribute('idDest',num2str(levelIDDest));
        factorElement.setAttribute('value',num2str(phys.levelMatrix(levelIDOrig,levelIDDest)));
    
        levelMatrixElement.appendChild(factorElement);      
    end
end
layerElement.appendChild(levelMatrixElement);
    
lightpathCapacityElement = DOMnode.createElement('lightpathCapacity');
lightpathCapacityElement.setAttribute('value',num2str(phys.lightpathCapacity));
layerElement.appendChild(lightpathCapacityElement);

docRootNode.appendChild(layerElement);
    

%3. -------- XML WRITING --------------
%We write the XML file with the info in the DOM
format = OutputFormat(DOMnode);
% to generate a file output use fileoutputstream instead of system.out
serializer = XMLSerializer(FileOutputStream(File(XMLfilename)), format);
serializer.serialize(DOMnode);






Contact us at files@mathworks.com