function [y,out,w,Model,Opt_Criterion,Opt_MSE,Opt_Comp]=Asmod(InpPat,TarPat,order) diary on; [n_pat,n_inp]=size(InpPat); % create initial model x_min=min(InpPat); x_max=max(InpPat)+10*eps*ones(1,n_inp); for i=1:n_inp [Knots,n_Knots,n_fun,w,a_w]=create_B_spline(x_min(i),x_max(i),0,order(i)); Sub_Model(i)=struct('Knots',Knots,'n_Knots',n_Knots,'n_fun',n_fun,'w',w,'a_w',a_w,'x_min',x_min(i),'x_max',x_max(i),... 'order',order(i),'int_knots',0,'var',i); end Opt_Model(1)=struct('n_s_m',n_inp,'crit',0,'Sub_Model',Sub_Model); Ini_Model=Opt_Model(1); %Determine the criterion for the current model [Opt_Criterion(1),Opt_MSE(1),Opt_Comp(1),Ini_Model]=evaluate_model(InpPat,TarPat,Ini_Model); disp(['Initial ',' Criterion ',num2str(Opt_Criterion(1)),' MSE ', num2str(Opt_MSE(1)),' Comp ',num2str(Opt_Comp(1))]); disp([]); iter=1; term_criterion=0; total_n_cand=0; while ~term_criterion disp(['Iteration ',num2str(iter)]); disp(['-----------------------------------------------------------------------------------------------------']); Cand_models=[]; Cand_Criterion=[]; Cand_MSE=[]; Cand_Comp=[]; %generate candidate models if iter==1 [n_cand,Cand_models]=ref_step(Ini_Model,InpPat,order); else [n_cand,Cand_models]=ref_step(Opt_Model(iter-1),InpPat,order); end total_n_cand=total_n_cand+n_cand; %Determine the criterion for the candidate models for i=1:n_cand [cand_Criterion(i),cand_MSE(i),cand_Comp(i),cand_models(i)]=evaluate_model(InpPat,TarPat,Cand_models(i)); disp(['Candidate ', num2str(i),' number of sub_modules ', num2str(cand_models(i).n_s_m), ' Criterion ',... num2str(cand_Criterion(i)),' MSE ', num2str(cand_MSE(i)),' Comp ',num2str(cand_Comp(i))]); for j=1:cand_models(i).n_s_m disp([' Sub-module ' num2str(j) ' :variables ' num2str(cand_models(i).Sub_Model(j).var)]); end end % Determine the best candidate model best=find(min(cand_Criterion)==cand_Criterion); if length(best)>1 b=best(1); clear best; best=b; end % Compute termination criterion if iter~=1 term_criterion=Opt_Model(iter-1).crit<=cand_models(best).crit; end if (term_criterion) | (mod(iter,5)==0) [n_c,C_models]=pru_step(Opt_Model(iter-1),InpPat); %Determine the criterion for the candidate models for i=1:n_c [c_Criterion(i),c_MSE(i),c_Comp(i),c_models(i)]=evaluate_model(InpPat,TarPat,C_models(i)); disp(['Candidate ', num2str(i),' number of sub_modules ', num2str(c_models(i).n_s_m), ' Criterion ',... num2str(c_Criterion(i)),' MSE ', num2str(c_MSE(i)),' Comp ',num2str(c_Comp(i))]); for j=1:c_models(i).n_s_m disp([' Sub-module ' num2str(j) ' :variables ' num2str(c_models(i).Sub_Model(j).var)]); end end % Determine the best candidate model Best=find(min(c_Criterion)==c_Criterion); if length(Best)>1 B=Best(1); clear Best; Best=B; end if c_Criterion(Best)