1 function sim_data = vi_detailed_simulation(model,model_data)
2 %
function sim_data = vi_detailed_simulation(model,model_data)
4 %
function performing a detailed simulation of a vi-model (see
5 % elastic_rope_model) via
"quadprog".
7 % Generated fields of sim_data:
8 % U: primal solution vector
9 % L: Lagrange multiplier vector
13 if ~isfield(model,
'use_PDASS')
19 model.decomp_mode = 0;
20 [A,B,f,g] = model.operators(model,model_data);
27 options.MaxIter = 1000; % required for large bases...
28 options.Display = 'off';
29 sim_data.U = quadprog(A,-f,B',g,[],[],[],[],[],options);
32 sim_data.L = max(0, B\(f - A*sim_data.U) );
34 [sim_data.U,sim_data.L] = pdass(A, B, f, g);
41 %Primal-Dual-Active-Set_Strategy. Taken from Juliens RBVI Code
42 function [U,Lambda] = pdass(A, B, f, g)
55 Act_set = index(Lambda+c*(B'*U-g)> 0); %vorher: ohne c
56 Inact_set = index(Lambda+c*(B'*U-g)<=0); %vorher: ohne c
57 %----Active points----
58 U(Act_set) = -g(Act_set) ;
59 Lambda(Inact_set) = 0 ;
60 %---Inactive points---
61 M = [A(:,Inact_set) , B(:,Act_set)];
64 var = M\(f-A(:,Act_set)*Bg(Act_set)); ... % var = inv(M)*(f-A(:,Act_set)*Bg(Act_set)); ...
66 var = M\f; %var = inv(M)*f;
68 U(Inact_set) = var(1:length(Inact_set) );
69 Lambda(Act_set) = var(length(Inact_set)+1:end);
70 %---------------------
71 err1 = norm(A*U+B*Lambda-f);
72 err2 = norm(Lambda-max(0,Lambda+c*(B'*U-g)));
77 error('PDASS did not converge within 1000 steps. Please Check');