www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@xregnnet/evalbuild.m

    function Blk= evalbuild(nn,sysName,st)
%EVALBUILD Generate a SIMULINK block to simulate a neural network.
%
% Blk= evalbuild(nn,sysName,st)

%  Copyright 2000-2007 The MathWorks, Inc. and Ford Global Technologies, Inc.



%	Mark Beale, 11-31-97

net= nn.param;

% Input arguments and defaults
if nargin < 1, error(message('mbc:xregnnet:TooFewInputs')), end
if nargin < 3, st = -1; end

% Check ST
if (st <= 0) && (st ~= -1),
  error(message('mbc:xregnnet:InvalidArgument'))
end
if (st == -1) && (net.numInputDelays || net.numLayerDelays)
  error(message('mbc:xregnnet:InvalidArgument1'))
end
st = num2str(st);

% Neural Network Toolbox Simulink Block Library
neural

y = max(max(net.numInputs,net.numOutputs),1)*20 + 20;

% Sample Inputs
pos = y-net.numInputs*20-20;

% Network Block
netName = 'Neural Network';
Blk= genNetwork(net,y,netName,sysName,st);

close_system('neural');

%======================================================================
function Blk= genNetwork(net,y,netName,sysName,st)

% Network System
netNameL = [sysName '/' netName];

Blk=add_block('built-in/SubSystem',netNameL);
set_param(netNameL, ...
  'position',[160 y-10 220 y+max([net.numInputs,net.numOutputs,1])*40-10],...
  'BackgroundColor','lightblue')
  
% Layer2Layer
Layer2LayerInd = find(sum(net.layerConnect,1));
numLayer2Layers = length(Layer2LayerInd);

% Network Block Names
inputNames = cell(1,net.numInputs);
outputNames = cell(1,net.numOutputs);
fromNames = cell(1,net.numLayers);
toNames = cell(1,net.numLayers);
layerNames = cell(1,net.numLayers);
for i=1:net.numInputs, inputNames{i} = sprintf('p{%g}',i); end
for i=1:net.numOutputs, outputNames{i} = sprintf('y{%g}',i); end
for i=1:net.numLayers, fromNames{i} = sprintf(' a{%g} ',i); end
for i=1:net.numLayers, toNames{i} = sprintf('a{%g}',i); end
for i=1:net.numLayers, layerNames{i} = sprintf('Layer %g',i); end

% Network Blocks
for i=1:net.numInputs
  genNetworkInput(net,i,i,inputNames{i},netNameL,st);
end
for i=1:net.numOutputs
  genNetworkOutput(net,i,i+1+numLayer2Layers,outputNames{i},netNameL);
end
for k=1:numLayer2Layers
  i = Layer2LayerInd(k);
  genNetworkFrom(net,i,k+net.numInputs+1,fromNames{i},netNameL);
end
for k=1:numLayer2Layers
  i = Layer2LayerInd(k);
  genNetworkTo(net,i,k,toNames{i},netNameL);
end
layerPos = 40;
for i=1:net.numLayers
  layerPos = genNetworkLayer(net,i,layerNames{i},netNameL,inputNames,toNames,fromNames,layerPos,st);
end

% Network Block Connections
for i=1:net.numLayers
  inputInd = find(net.inputConnect(i,:));
  numInputs = length(inputInd);
  for j=1:numInputs
    add_line(netNameL,[inputNames{inputInd(j)} '/1'],[layerNames{i} '/' num2str(j)])
  end
end
for k=1:numLayer2Layers
  j = Layer2LayerInd(k);
  add_line(netNameL,[layerNames{j} '/1'],[toNames{j} '/1'])
  layerInd = find(net.layerConnect(:,j)');
  numLayers = length(layerInd);
  for m=1:numLayers
    i = layerInd(m);
    numInputs = length(find(net.inputConnect(i,:)));
	x = sum(net.layerConnect(i,1:j));
    add_line(netNameL,[fromNames{j} '/1'],[layerNames{i} '/' num2str(numInputs+x)])
  end
end
outputInd = find(net.outputConnect);
numOutputs = length(outputInd);
for i=1:numOutputs
  add_line(netNameL,[layerNames{outputInd(i)} '/1'],[outputNames{i} '/1'])
end

%======================================================================
function genNetworkInput(net,i,pos,inputName,netNameL,st)

  y = pos*40;
  inputNameL = [netNameL '/' inputName];
  add_block('built-in/Inport',inputNameL,...
    'port',sprintf('%g',i), ...
	'position',[40 y 60 y+20],...
	'portwidth',num2str(net.inputs{i}.size),...
	'sampletime',st,...
	'BackgroundColor','Magenta')

%======================================================================
function genNetworkOutput(net,i,pos,outputName,netNameL)

  outputInd = find(net.outputConnect);
  siz = net.outputs{outputInd(i)}.size;

  y = pos*40;
  outputNameL = [netNameL '/' outputName];
  add_block('built-in/Outport',outputNameL,...
    'port',sprintf('%g',i), ...
	'position',[380 y 400 y+20],...
	'BackgroundColor','Magenta',...
	'InitialOutput',mat2str(zeros(siz,1)))

%======================================================================
function genNetworkFrom(net,i,pos,fromName,netNameL)

  y = pos*40;
  fromNameL = [netNameL '/' fromName];
  add_block('built-in/From',fromNameL,...
    'gototag',sprintf('feedback%g',i), ...
	'position',[40 y 60 y+20],...
	'maskdisplay','plot(cos(0:.1:2*pi),sin(0:.1:2*pi))',...
	'MaskIconFrame','off',...
	'ForegroundColor','black')

%======================================================================
function genNetworkTo(net,i,pos,toName,netNameL)

  y = pos*40;
  toNameL = [netNameL '/' toName];
  add_block('built-in/Goto',toNameL,...
    'gototag',sprintf('feedback%g',i), ...
	'position',[380 y 400 y+20],...
	'maskdisplay','plot(cos(0:.1:2*pi),sin(0:.1:2*pi))',...
	'MaskIconFrame','off',...
	'ForegroundColor','black')

%======================================================================
function layerPos = genNetworkLayer(net,i,layerName,netNameL,inputName,toName,fromName,layerPos,st)

  % Useful constants
  inputInd = find(net.inputConnect(i,:));
  numInputs = length(inputInd);
  layerInd = find(net.layerConnect(i,:));
  numLayers = length(layerInd);
  hasBias = net.biasConnect(i);
  y = (numInputs+numLayers+hasBias)/2 * 40 + 30;
  dy = max(10,(numInputs+numLayers+hasBias)*5);

  % Layer System
  layerNameL = [netNameL '/' layerName];
  layerHeight = max(1,numInputs+numLayers)*20;
  add_block('built-in/SubSystem',layerNameL)
  set_param(layerNameL,...
	'position',[190 layerPos 250 layerPos+layerHeight],...
	'BackgroundColor','lightblue')
  
  % increase LayerPos
  layerPos = layerPos + layerHeight + 20;

  % Layer Block Names
  outputName = sprintf('a{%g}',i);
  transferName = net.layers{i}.transferFcn;
  netInputName = net.layers{i}.netInputFcn;
  for k=1:numInputs
    j = inputInd(k);
    IWName{k} = sprintf('IW{%g,%g}',i,j);
	IDName{k} = sprintf('Delays %g',k);
	PName{k} = inputName{j};
  end
  for k=1:numLayers
    j = layerInd(k);
    LWName{k} = sprintf('LW{%g,%g}',i,j);
	LDName{k} = sprintf('Delays %g',k+numInputs);
	AName{k} = sprintf('a{%g} ',j);
  end
  if hasBias
    bName = sprintf('b{%g}',i);
  end
    
  % Layer Blocks
  genLayerOutput(net,i,y,layerNameL,outputName);
  genLayerTransfer(y,layerNameL,transferName);
  genLayerNet(numInputs+numLayers+hasBias,y,dy,layerNameL,netInputName);
  for k=1:numInputs
    j = inputInd(k);
    genInputSignal(net,i,j,k,layerNameL,PName{k},st);
	genInputDelays(net,i,j,k,layerNameL,IDName{k},st);
    genInputWeight(net,i,j,k,layerNameL,IWName{k},st);
  end
  for k=1:numLayers
    j = layerInd(k);
    genLayerSignal(net,i,j,k+numInputs,layerNameL,AName{k},st);
	genLayerDelays(net,i,j,k+numInputs,layerNameL,LDName{k},st);
    genLayerWeight(net,i,j,k+numInputs,layerNameL,LWName{k},st);
  end
  if hasBias
   genLayerBias(net,i,numInputs+numLayers+1,layerNameL,bName);
  end
  
  % Layer Block Connections
  for j=1:numInputs
    add_line(layerNameL,[PName{j} '/1'],[IDName{j} '/1'])
    add_line(layerNameL,[IDName{j} '/1'],[IWName{j} '/1'])
    add_line(layerNameL,[IWName{j} '/1'],[netInputName '/' num2str(j)])
  end
  for j=1:numLayers
    add_line(layerNameL,[AName{j} '/1'],[LDName{j} '/1'])
    add_line(layerNameL,[LDName{j} '/1'],[LWName{j} '/1'])
    add_line(layerNameL,[LWName{j} '/1'],[netInputName '/' num2str(j+numInputs)])
  end
  if hasBias
    add_line(layerNameL,[bName '/1'],[netInputName '/' num2str(numInputs+numLayers+1)])
  end
  add_line(layerNameL,[netInputName '/1'],[transferName '/1'])
  add_line(layerNameL,[transferName '/1'],[outputName '/1'])

%======================================================================
function genLayerOutput(net,i,y,layerNameL,outputName)

  outputNameL = [layerNameL '/' outputName];
  add_block('built-in/Outport',outputNameL,...
    'port','1',...
    'position',[360 y-10 380 y+10],...
	'BackgroundColor','Magenta',...
	'InitialOutput',mat2str(zeros(net.layers{i}.size,1)))

%======================================================================
function genLayerTransfer(y,layerNameL,transferName)

  transferNameL = [layerNameL '/' transferName];
  transferBlock = ['neural/Transfer Functions/' transferName];
  add_block(transferBlock,transferNameL,...
    'position',[300 y-10 320 y+10],...
	'BackgroundColor','lightblue')

%======================================================================
function genLayerNet(numSignals,y,dy,layerNameL,netInputName)

  netInputNameL = [layerNameL '/' netInputName];
  netInputBlock = ['neural/Net Input Functions/' netInputName];
  add_block(netInputBlock,netInputNameL,...
    'inputs',num2str(numSignals),...
    'position',[240 y-dy 260 y+dy],...
	'BackgroundColor','lightblue')

%======================================================================
function genLayerBias(net,i,pos,layerNameL,bName)

    add_block('built-in/Constant',[layerNameL '/' bName],...
      'value',mat2str(net.b{i},100),...
      'position',[160 pos*40 200 pos*40+20],...
      'maskdisplay','disp(''bias'')',...
	  'BackgroundColor','lightblue')
	  
%======================================================================
function genInputSignal(net,i,j,pos,layerNameL,PName,st)

  % Input Signal
  add_block('built-in/Inport',[layerNameL '/' PName],...
    'port',sprintf('%g',pos),...
	'portwidth',num2str(net.inputs{j}.size),...
	'sampletime',st,...
    'position',[40 pos*40 60 pos*40+20],...
	'BackgroundColor','Magenta')

%======================================================================
function genInputDelays(net,i,j,pos,layerNameL,IDName,st)

  % System
  name = IDName;
  nameL = [layerNameL '/' name];
  add_block('built-in/SubSystem',nameL)
  set_param(nameL,...
	'position',[100 pos*40 120 pos*40+20],...
    'maskdisplay','disp(''TDL'')',...
	'BackgroundColor','lightblue');

  % Constants
  delays = net.inputWeights{i,j}.delays;
  numDelays = length(delays);
  maxDelay = delays(end);
  
  % Names
  PName = sprintf('p{%g}',i);
  for k=1:maxDelay
    DName{k} = sprintf('Delay %g',k);
  end
  MuxName = 'mux';
  PDName = sprintf('pd{%g,%g}',i,j);
  
  % Blocks
  y = numDelays*20;
  add_block('built-in/Inport',[nameL '/' PName],...
    'port',sprintf('%g',1),...
	'portwidth',num2str(net.inputs{j}.size),...
	'sampletime',st,...
    'position',[60 40 80 60],...
	'Orientation','down',...
	'NamePlacement','alternate',...
	'BackgroundColor','Magenta')
  for k=1:maxDelay
    add_block('built-in/TransportDelay',[nameL '/' DName{k}],...
	  'delaytime',st,...
      'position',[60 40+k*40 80 60+k*40],...
	  'BackgroundColor','lightblue',...
	  'Orientation','down',...
	  'NamePlacement','alternate')
  end
  add_block('built-in/Mux',[nameL '/' MuxName],...
    'inputs',num2str(numDelays),...
    'position',[200 40+y 240 60+y],...
	'BackgroundColor','lightblue')
  add_block('built-in/Outport',[nameL '/' PDName],...
    'port','1',...
    'position',[300 40+y 320 60+y],...
	'BackgroundColor','Magenta')
	
  % Connections
  for k=1:maxDelay
    if k == 1
	  add_line(nameL,[PName '/1'],[DName{k} '/1'])
	else
	  add_line(nameL,[DName{k-1} '/1'],[DName{k} '/1'])
	end
  end
  for k=1:numDelays
    if delays(k) == 0
	  add_line(nameL,[PName '/1'],[MuxName '/' num2str(k)])
	else
	  add_line(nameL,[DName{delays(k)} '/1'],[MuxName '/' num2str(k)])
	end
  end
  add_line(nameL,[MuxName '/1'],[PDName '/1'])

%======================================================================
function genInputWeight(net,i,j,pos,layerNameL,IWName,st)

  % System
  weightName = IWName;
  weightNameL = [layerNameL '/' weightName];
  add_block('built-in/SubSystem',weightNameL)
  set_param(weightNameL,...
	'position',[160 pos*40 200 pos*40+20],...
    'maskdisplay','disp(''weight'')',...
	'BackgroundColor','lightblue');

  % Names
  for k=1:net.layers{i}.size
    weightVectorName{k} = sprintf('IW{%g,%g}(%g,:)''',i,j,k);
    vectorOpName{k} = [net.inputWeights{i,j}.weightFcn num2str(k)];
  end
  muxName = 'Mux';
  outputName = ['iz{' num2str(i) ',' num2str(j) '}'];
  PName = sprintf('pd{%g,%g}',i,j);
  
  % Blocks
  y = net.layers{i}.size * 30 + 40;
  add_block('built-in/Inport',[weightNameL '/' PName],...
    'port',sprintf('%g',1),...
	'portwidth',num2str(net.inputWeights{i,j}.size(2)),...
	'sampletime',st,...
    'position',[40 y-10 60 y+10],...
	'BackgroundColor','Magenta')

  for k=1:net.layers{i}.size
    nameL = [weightNameL '/' vectorOpName{k}];
    block = ['neural/Weight Functions/' net.inputWeights{i,j}.weightFcn];
    add_block(block,nameL,...
      'position',[240 40+(k-1)*60 260 80+(k-1)*60],...
      'BackgroundColor','lightblue')
	  
    add_block('built-in/Constant',[weightNameL '/' weightVectorName{k}],...
      'value',mat2str(net.IW{i,j}(k,:)',100),...
      'position',[140 40+(k-1)*60 180 60+(k-1)*60],...
      'maskdisplay','disp(''weights'')',...
	  'BackgroundColor','lightblue')
  end

  add_block('built-in/Mux',[weightNameL '/' muxName],...
	'inputs',num2str(net.layers{i}.size),...
    'position',[340 y-10 380 y+10])

  outputNameL = [weightNameL '/' outputName];
  add_block('built-in/Outport',outputNameL,...
    'port','1',...
    'position',[420 y-10 440 y+10],...
	'BackgroundColor','Magenta')
	
  % Connections
  for k=1:net.layers{i}.size
    add_line(weightNameL,[weightVectorName{k} '/1'],[vectorOpName{k} '/1'])
    add_line(weightNameL,[PName '/1'],[vectorOpName{k} '/2'])
    add_line(weightNameL,[vectorOpName{k} '/1'],[muxName '/' num2str(k)])
  end
  add_line(weightNameL,[muxName '/1'],[outputName '/1'])

%======================================================================
function genLayerSignal(net,i,j,pos,layerNameL,AName,st)

  % Layer Signal
  add_block('built-in/Inport',[layerNameL '/' AName],...
    'port',sprintf('%g',pos),...
	'portwidth',num2str(net.layers{j}.size),...
	'sampletime',st,...
    'position',[40 pos*40 60 pos*40+20],...
	'BackgroundColor','Magenta')
 
%======================================================================
function genLayerDelays(net,i,j,pos,layerNameL,LDName,st)

  % System
  name = LDName;
  nameL = [layerNameL '/' name];
  add_block('built-in/SubSystem',nameL)
  set_param(nameL,...
	'position',[100 pos*40 120 pos*40+20],...
    'maskdisplay','disp(''TDL'')',...
	'BackgroundColor','lightblue');

  % Constants
  delays = net.layerWeights{i,j}.delays;
  numDelays = length(delays);
  maxDelay = delays(end);
  
  % Names
  PName = sprintf('p{%g}',i);
  for k=1:maxDelay
    DName{k} = sprintf('Delay %g',k);
  end
  MuxName = 'mux';
  ADName = sprintf('pd{%g,%g}',i,j);
  
  % Blocks
  y = numDelays*20;
  add_block('built-in/Inport',[nameL '/' PName],...
    'port',sprintf('%g',1),...
	'portwidth',num2str(net.layers{j}.size),...
	'sampletime',st,...
    'position',[60 40 80 60],...
	'Orientation','down',...
	'NamePlacement','alternate',...
	'BackgroundColor','Magenta')
  for k=1:maxDelay
    add_block('built-in/TransportDelay',[nameL '/' DName{k}],...
	  'delaytime',st,...
      'position',[60 40+k*40 80 60+k*40],...
	  'BackgroundColor','lightblue',...
	  'Orientation','down',...
	  'NamePlacement','alternate')
  end
  add_block('built-in/Mux',[nameL '/' MuxName],...
    'inputs',num2str(numDelays),...
    'position',[200 40+y 240 60+y],...
	'BackgroundColor','lightblue')
  add_block('built-in/Outport',[nameL '/' ADName],...
    'port','1',...
    'position',[300 40+y 320 60+y],...
	'BackgroundColor','Magenta')
	
  % Connections
  for k=1:maxDelay
    if k == 1
	  add_line(nameL,[PName '/1'],[DName{k} '/1'])
	else
	  add_line(nameL,[DName{k-1} '/1'],[DName{k} '/1'])
	end
  end
  for k=1:numDelays
    if delays(k) == 0
	  add_line(nameL,[PName '/1'],[MuxName '/' num2str(k)])
	else
	  add_line(nameL,[DName{k} '/1'],[MuxName '/' num2str(k)])
	end
  end
  add_line(nameL,[MuxName '/1'],[ADName '/1'])

%======================================================================
function genLayerWeight(net,i,j,pos,layerNameL,LWName,st)

  % System
  weightName = LWName;
  weightNameL = [layerNameL '/' weightName];
  add_block('built-in/SubSystem',weightNameL)
  set_param(weightNameL,...
	'position',[160 pos*40 200 pos*40+20],...
    'maskdisplay','disp(''weight'')',...
	'BackgroundColor','lightblue');

  % Names
  for k=1:net.layers{i}.size
    weightVectorName{k} = sprintf('IW{%g,%g}(%g,:)''',i,j,k);
    vectorOpName{k} = [net.layerWeights{i,j}.weightFcn num2str(k)];
  end
  muxName = 'Mux';
  outputName = ['lz{' num2str(i) ',' num2str(j) '}'];
  AName = sprintf('ad{%g,%g}',i,j);
  
  % Blocks
  y = net.layers{i}.size * 30 + 40;
  add_block('built-in/Inport',[weightNameL '/' AName],...
    'port',sprintf('%g',1),...
	'portwidth',num2str(net.layerWeights{i,j}.size(2)),...
	'sampletime',st,...
    'position',[40 y-10 60 y+10],...
	'BackgroundColor','Magenta')

  for k=1:net.layers{i}.size
    nameL = [weightNameL '/' vectorOpName{k}];
    block = ['neural/Weight Functions/' net.layerWeights{i,j}.weightFcn];
    add_block(block,nameL,...
      'position',[240 40+(k-1)*60 260 80+(k-1)*60],...
      'BackgroundColor','lightblue')
	  
    add_block('built-in/Constant',[weightNameL '/' weightVectorName{k}],...
      'value',mat2str(net.LW{i,j}(k,:)',100),...
      'position',[140 40+(k-1)*60 180 60+(k-1)*60],...
      'maskdisplay','disp(''weights'')',...
	  'BackgroundColor','lightblue')
  end

  add_block('built-in/Mux',[weightNameL '/' muxName],...
	'inputs',num2str(net.layers{i}.size),...
    'position',[340 y-10 380 y+10])

  outputNameL = [weightNameL '/' outputName];
  add_block('built-in/Outport',outputNameL,...
    'port','1',...
    'position',[420 y-10 440 y+10],...
	'BackgroundColor','Magenta')
	
  % Connections
  for k=1:net.layers{i}.size
    add_line(weightNameL,[weightVectorName{k} '/1'],[vectorOpName{k} '/1'])
    add_line(weightNameL,[AName '/1'],[vectorOpName{k} '/2'])
    add_line(weightNameL,[vectorOpName{k} '/1'],[muxName '/' num2str(k)])
  end
  add_line(weightNameL,[muxName '/1'],[outputName '/1'])

%======================================================================