somtoolbox2/sompak_rb_control.m
4dbef185
 function varargout=sompak_rb_control(str)
 
 %SOMPAK_RB_CONTROL  An auxiliary function for SOMPAK_*_GUI functions.
 %
 % This is an auxiliary function for SOMPAK_GUI, SOMPAK_INIT_GUI, 
 % SOMPAK_SAMMON_GUI and SOMPAK_TRAIN_GUI functions. It controls the 
 % radio buttons in the GUIs.
 %  
 % See also SOMPAK_GUI, SOMPAK_INIT_GUI, SOMPAK_SAMMON_GUI, SOMPAK_TRAIN_GUI.
 
 % Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Parhankangas
 % Copyright (c) by Juha Parhankangas
 % http://www.cis.hut.fi/projects/somtoolbox/
 
 % Juha Parhankangas 050100
 
 data=get(gcf,'UserData');
 switch str
   case {'rand','linear'}
    h=cat(2,findobj(get(gcf,'Children'),'Tag','RANDOM'),...
 	   findobj(get(gcf,'Children'),'Tag','LINEAR'));
    set(h,'Value',0);
    set(gcbo,'Value',1);
    data.inittype=str;
   case {'bubble','gaussian'}
    h=cat(2,findobj(get(gcf,'Children'),'Tag','BUBBLE'),...
            findobj(get(gcf,'Children'),'Tag','GAUSSIAN'));
    set(h,'Value',0);
    set(gcbo,'Value',1);
    data.neigh=str;
   case {'hexa','rect'}
    h=cat(2,findobj(get(gcf,'Children'),'Tag','HEXA'),...
            findobj(get(gcf,'Children'),'Tag','RECT'));
    set(h,'Value',0);
    set(gcbo,'Value',1);
    data.topol=str;
   case {'out_ft'}
    value=get(gcbo,'Value');
    switch value
      case 1
       h=findobj(get(gcf,'Children'),'Tag','OUT_FILE');
       data.out_file_type='';
       set(h,'String','');
      case 2
       data.out_file_type='box';
      case 3
       data.out_file_type='pak';
    end
   case {'input_ft'}
    value=get(gcbo,'Value');
    switch value
      case 1
       data.input_file_type='';
      case 2
       data.input_file_type='box';
      case 3
       data.input_file_type='pak';
    end
   case {'map_ft'}
    value=get(gcbo,'Value');
    switch value
      case 1
       data.map_type='';
      case 2
       data.map_type='box';
      case 3
       data.map_type='pak';
    end
   case {'out_file'}
    if isempty(data.out_file_type)
      data.out_file='';
      h=findobj(get(gcf,'Children'),'Tag','OUT_FILE');
      set(h,'String','');
    else
      data.out_file=get(findobj(get(gcf,'Children'),'Tag','OUT_FILE'),'String');
      if isempty(data.out_file)
        h=findobj(get(gcf,'Children'),'Tag','OUT_FILE_TYPE');
        set(h,'Value',1);
      end
    end
 
   case {'out_var'}
    h=findobj(get(gcf,'Children'),'Tag','OUT_VAR');
    if ~isempty(get(h,'String'))
      data.out_var=get(h,'String');
    else
      data.out_var=[];
      set(h,'String','''ans''');
    end
   case {'xdim'}
    h=findobj(get(gcf,'Children'),'Tag','XDIM');
    data.xdim=str2num(get(h,'String'));
   case {'ydim'}
    h=findobj(get(gcf,'Children'),'Tag','YDIM');
    data.ydim=str2num(get(h,'String'));
   case {'radius'}
    h=findobj(get(gcf,'Children'),'Tag','RADIUS');
    data.radius=str2num(get(h,'String'));
   case {'data'}
    h=findobj(get(gcf,'Children'),'Tag','DATA');
    data.data=get(h,'String');
   case {'rlen'}
    h=findobj(get(gcf,'Children'),'Tag','RLEN');
    data.rlen=str2num(get(h,'String'));
   case {'alpha'}
    h=findobj(get(gcf,'Children'),'Tag','ALPHA');
    data.alpha=str2num(get(h,'String'));
   case {'map'}
    h=findobj(get(gcf,'Children'),'Tag','MAP');
    data.map=get(h,'String');
   case 'init_ok'
    if isempty(data.xdim) | ~is_positive_integer(data.xdim)
      errordlg('Argument ''xdim'' must be positive integer.');
      return;
    end
    if isempty(data.ydim) | ~is_positive_integer(data.ydim)
      errordlg('Argument ''ydim'' must be positive integer.');
      return;
    end
    if isempty(data.data)
      errordlg('Argument ''Workspace data'' must be a string.');
      return;
    end
 
    if isempty(data.input_file_type)
      sData=evalin('base',data.data);
    else 
      sData=data.data;
    end
    if isempty(data.out_file)
      if ~isempty(data.out_file_type)
        errordlg('Argument ''Output file'' is not defined.');
        return;
      end
      data.out_file=[];
    end
    answer=sompak_init(sData,...
                       data.input_file_type,...
                       data.inittype,...
                       data.out_file,...
                       data.out_file_type,...
                       data.xdim,...
                       data.ydim,...
                       data.topol,...
                       data.neigh);
    if any(strcmp(data.out_var,{'ans','''ans'''})) | isstr(answer)
      varargout{1}=answer; 
    else
      assignin('base',data.out_var,answer);
      disp(sprintf('Map is set to workspace as ''%s''.',data.out_var));
    end
    close(findobj(get(0,'Children'),'Tag','InitGUI'));
    return;
   case 'train_ok'
    if isempty(data.rlen) | ~is_positive_integer(data.rlen)
      errordlg('Argument ''Running Length'' must be positive integer.');
      return;
    end
    if isempty(data.alpha) | data.alpha <= 0
      errordlg('Argument ''Initial Alpha Value'' must be a positive float.');
      return;
    end
    if isempty(data.radius) | data.radius <= 0
      errordlg('Argument ''Neighborhood Radius'' must be a positive float.');
      return;
    end
    if isempty(data.data)
      errordlg('Argument ''Teaching Data'' must be a string.');
      return;
    end
    if isempty(data.input_file_type)
      sData=evalin('base',data.data);
    else 
      sData=data.data;
    end
    if isempty(data.out_file);
      data.outfile = [];
    end
    if isempty(data.map)
      errordlg('Argument ''Workspace Map'' must be a string.');
      return;
    end
    if isempty(data.map_type)
      sMap=evalin('base',data.map);
    else
      sMap=data.map;
    end
 
    answer=sompak_train(sMap,...
                        data.map_type,...
                        data.out_file,...
                        data.out_file_type,...
                        data.data,...
                        data.input_file_type,...
                        data.rlen,...
                        data.alpha,...
                        data.radius);
    if any(strcmp(data.out_var,{'''ans''','ans'})) | isstr(answer)
      varargout{1}=answer;
    else
      assignin('base',data.out_var,answer);
      disp(sprintf('Map is set to workspace as ''%s''.',data.out_var));
    end
    close(findobj(get(0,'Children'),'Tag','TrainGUI')); 
    return;
   case 'sammon_ok'
    if isempty(data.map)
     errordlg('Argument ''Workspace Map'' must be a string.');
     return;
    end
    if isempty(data.map_type)
      sMap=evalin('base',data.map);
    else
      sMap=data.map;
    end
    if isempty(data.out_file);
      data.outfile = [];
    end
    answer=sompak_sammon(sMap,...
                         data.map_type,...
                         data.out_file,...
                         data.out_file_type,...
                         data.rlen);
    if strcmp(data.out_var,'''ans''')|strcmp(data.out_var,'ans')|isstr(answer)
      varargout{1}=answer;
    else
      assignin('base',data.out_var,answer);
      disp(sprintf('Codebook is set to workspace as ''%s''.',data.out_var));
    end
    close(findobj(get(0,'Children'),'Tag','SammonGUI')); 
    return;
 end
 
 set(gcf,'UserData',data);
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 function bool = is_positive_integer(x)
 
 bool = ~isempty(x) & isreal(x) & all(size(x) == 1) & x > 0;
 if ~isempty(bool)
   if bool & x~=round(x)
     bool = 0;
   end
 else
   bool = 0;
 end
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%