diff --git a/parmorceauxMax-git/Dynamics_Model.m b/parmorceauxMax-git/Dynamics_Model.m
index 7b2cab869c161c70c46b5e89fb693c135afa5fd7..9ba2a4d16eda2a7e0846af657202756b2758300b 100644
--- a/parmorceauxMax-git/Dynamics_Model.m
+++ b/parmorceauxMax-git/Dynamics_Model.m
@@ -43,10 +43,10 @@ classdef Dynamics_Model < matlab.mixin.Copyable %handle
                 obj.marginal_X_Yi(:,:,i) = flipdim(structure.P_Yi_knowing_X(:,:,i),1);
             end
         end
-        function initialise(obj, initial_X, alpha_ini, sigma_estimation, sigma_test)
-            obj.T = [];
+        function initialise(obj, initial_X, alpha_ini, sigma_estimation, sigma_test,y,t)
+            obj.T = t;%[];
             obj.X = [];
-            obj.Y = [];
+            obj.Y = y;
             obj.current_alpha = alpha_ini;
             
             obj.initial_estimate_X = initial_X;
@@ -127,23 +127,23 @@ classdef Dynamics_Model < matlab.mixin.Copyable %handle
             obj.X = new_X_variable;
         end
         function spread_X(obj)
-            N = size(obj.X,1);
-            
-            if N ==1
-                obj.X = 0;
-                obj.current_alpha = obj.alpha_initial;
-            
-                obj.plot_estimated_X()
-                obj.compute_loglikelihood_dynamics(1:N)
-                return
-            elseif N == 2
-                obj.X = [0 1];
-                obj.current_alpha = 1;
-            
-                obj.plot_estimated_X()
-                obj.compute_loglikelihood_dynamics(1:N)
-                return
-            end
+            N = 25;
+            
+%             if N ==1
+%                 obj.X = 0;
+%                 obj.current_alpha = obj.alpha_initial;
+%             
+%                 obj.plot_estimated_X()
+%                 obj.compute_loglikelihood_dynamics(1:N)
+%                 return
+%             elseif N == 2
+%                 obj.X = [0 1];
+%                 obj.current_alpha = 1;
+%             
+%                 obj.plot_estimated_X()
+%                 obj.compute_loglikelihood_dynamics(1:N)
+%                 return
+%             end
             
             %%% estimation initiale de X
             X_tmp = 0:1/(N-1):1;
diff --git a/parmorceauxMax-git/Dynamics_Model_Periodic.m b/parmorceauxMax-git/Dynamics_Model_Periodic.m
new file mode 100644
index 0000000000000000000000000000000000000000..a889bc270aa75c38855cd52edb4d9671ed1fb0cf
--- /dev/null
+++ b/parmorceauxMax-git/Dynamics_Model_Periodic.m
@@ -0,0 +1,14 @@
+classdef Dynamics_Model_Periodic < Dynamics_Model
+    
+    methods
+        function obj = Dynamics_Model_Periodic(filename_interpolant, display_screen)
+            obj = obj@Dynamics_Model(filename_interpolant, display_screen);
+        end
+        function X = normalise_X(obj, X)
+            X = mod(X, 1);
+        end
+        function periodic = is_periodic(obj)
+            periodic = 1;
+        end
+    end
+end
\ No newline at end of file
diff --git a/parmorceauxMax-git/Interface.m b/parmorceauxMax-git/Interface.m
index 0830dc2f6bb353d7821819f32c915e59316893c3..7b08017629297d4388848160100dcf95d328c7a1 100644
--- a/parmorceauxMax-git/Interface.m
+++ b/parmorceauxMax-git/Interface.m
@@ -11,7 +11,7 @@ classdef Interface < handle
         loglikelihood
         
         %% modèle statistique
-        interpolant_filenames
+        interpolant_filename
         
         %% morceaux courants (cad non finis) A, B1, B2 et C
         dynamics_models
@@ -39,9 +39,9 @@ classdef Interface < handle
         
     end
     methods
-        function obj = Interface(interpolant_filenames, display_screen)
+        function obj = Interface(interpolant_filename, display_screen)
             
-            obj.interpolant_filenames = interpolant_filenames;
+            obj.interpolant_filename = interpolant_filename;
             
             obj.transition = [  0.5 0.5 0 0;   % départ de A
                                 0 1/3 1/3 1/3; % départ de B1
@@ -58,9 +58,9 @@ classdef Interface < handle
             obj.first_frame_of_models = [1 NaN NaN NaN]; % frame où chaque modèle commence
             
             if obj.display_screen == -1
-                obj.dynamics_models{1} = Dynamics_Model(obj.interpolant_filenames{1}, obj.display_screen);
+                obj.dynamics_models = Dynamics_Model(obj.interpolant_filename, obj.display_screen);
             else
-                obj.dynamics_models{1} = Dynamics_Model(obj.interpolant_filenames{1}, obj.display_screen+1);
+                obj.dynamics_models = Dynamics_Model(obj.interpolant_filename, obj.display_screen+1);
             end
             
             obj.proba_morceaux = [1 0 0 0]; % proba des modèles A, B1, B2, et C
@@ -80,42 +80,42 @@ classdef Interface < handle
             obj.proba_morceaux_finis = {[], [], [], []};
             
             obj.read_data(filename);
-            obj.N = size(obj.T,1);
+            obj.N = 25;
             
-            obj.dynamics_models{1}.initialise(0, initial_alphas(1), sigma_estimation, sigma_test);
+            obj.dynamics_models.initialise(0, initial_alphas, sigma_estimation, sigma_test,obj.Y,obj.T);
             %ligne 14
-            for frame=1:obj.N
-                obj.process_frame(frame);
-                
-                if obj.display_screen ~= -1
-                    for model=1:4
-                        if obj.proba_morceaux(model) == 0 || isnan(obj.proba_morceaux(model))
-                            continue
-                        end
-                        obj.dynamics_models{model}.plot_estimated_X();
-                    end
-                end
-            end
-            
-            
-            %% choix de la meilleure sequence (peut être pour plus tard: toujours choisir la séquence qui se termine sur le modèle C ?)
-            [max_proba, indice] = max(obj.proba_morceaux);
-            obj.meilleure_sequence = obj.model_indexes{indice}
-            obj.meilleure_sequence_models = [obj.morceaux_finis{indice} obj.dynamics_models{indice}];
-            
-            %% calcul les scores pour les frames du dernier morceau
-            % mise à jour des x pour bien les étaler
-            obj.meilleure_sequence_models(end).spread_X();
-            new_scores = obj.meilleure_sequence_models(end).compute_loglikelihood_dynamics([1:obj.N-obj.first_frame_of_models(indice)+1]);
-            obj.loglikelihood = [obj.scores_finis{indice} new_scores];
-            
-            %% à faire : afficher la séquence des modèles et la séquence de scores comme dans plot
-            close all
-            for i=1:length(obj.meilleure_sequence_models)
-                obj.meilleure_sequence_models(i).plot_estimated_X();
-            end
+           % for frame=1:25
+%                 obj.process_frame(frame);
+            obj.dynamics_models.spread_X();
+%                 if obj.display_screen ~= -1
+%                     for model=1:4
+%                         if obj.proba_morceaux(model) == 0 || isnan(obj.proba_morceaux(model))
+%                             continue
+%                         end
+%                         obj.dynamics_models{model}.plot_estimated_X();
+%                     end
+%                 end
+            %end
+            
+            
+%             %% choix de la meilleure sequence (peut être pour plus tard: toujours choisir la séquence qui se termine sur le modèle C ?)
+%             [max_proba, indice] = max(obj.proba_morceaux);
+%             obj.meilleure_sequence = obj.model_indexes{indice}
+%             obj.meilleure_sequence_models = [obj.morceaux_finis{indice} obj.dynamics_models{indice}];
+            
+%             %% calcul les scores pour les frames du dernier morceau
+%             % mise à jour des x pour bien les étaler
+%             obj.meilleure_sequence_models(end).spread_X();
+%             new_scores = obj.meilleure_sequence_models(end).compute_loglikelihood_dynamics([1:obj.N-obj.first_frame_of_models(indice)+1]);
+%             obj.loglikelihood = [obj.scores_finis{indice} new_scores];
+%             
+%             %% à faire : afficher la séquence des modèles et la séquence de scores comme dans plot
+%             close all
+%             for i=1:length(obj.meilleure_sequence_models)
+%                 obj.meilleure_sequence_models(i).plot_estimated_X();
+%             end
 %%%         save plot
-     
+           % obj.dynamics_models.plot_estimated_X( filename(end-9:end-4) );
         end
         function read_data(obj, filename)
             obj.Y =load(filename);
diff --git a/parmorceauxMax-git/Interface_Periodic.m b/parmorceauxMax-git/Interface_Periodic.m
new file mode 100644
index 0000000000000000000000000000000000000000..34b433dd3ceaaf8dc9d7429ae14a7efa5f8902cb
--- /dev/null
+++ b/parmorceauxMax-git/Interface_Periodic.m
@@ -0,0 +1,75 @@
+classdef Interface_Periodic < Interface
+    methods
+        function obj = Interface_Periodic(filename_interpolant, display_screen)
+            obj = obj@Interface(filename_interpolant, display_screen);
+            
+            if display_screen == -1
+                obj.dynamics_model = Dynamics_Model_Periodic(filename_interpolant, display_screen);
+            else
+                obj.dynamics_model = Dynamics_Model_Periodic(filename_interpolant, display_screen+2);
+            end
+        end
+        function initialise(obj, initial_alpha, sigma_estimation, sigma_test, possible_local_minimum)
+            if possible_local_minimum && obj.N > 15
+                if obj.display_screen ~= -1
+                    figure(obj.display_screen)
+                    clf(obj.display_screen)
+                end
+                
+                % choose the most likely initial X
+                llh_X = [0,0,0,0];
+                
+                % start from 0
+                obj.dynamics_model.initialise(0, initial_alpha, sigma_estimation, sigma_test);
+                
+                for i=1:15
+                    obj.dynamics_model.process_new_frame(obj.Y(i,:), obj.T(i));
+                end
+                
+                llhs = obj.dynamics_model.compute_loglikelihood_dynamics_forced(1:15);
+                llh_X(1) = sum( llhs(isfinite(llhs)) );
+                
+                
+                % start from 0.25
+                obj.dynamics_model.initialise(0.25, initial_alpha, sigma_estimation, sigma_test);
+                
+                for i=1:15
+                    obj.dynamics_model.process_new_frame(obj.Y(i,:), obj.T(i));
+                end
+                
+                llhs = obj.dynamics_model.compute_loglikelihood_dynamics_forced(1:15);
+                llh_X(2) = sum( llhs(isfinite(llhs)) );
+                
+                % start from 0.5
+                obj.dynamics_model.initialise(0.5, initial_alpha, sigma_estimation, sigma_test);
+                
+                for i=1:15
+                    obj.dynamics_model.process_new_frame(obj.Y(i,:), obj.T(i));
+                end
+                
+                llhs = obj.dynamics_model.compute_loglikelihood_dynamics_forced(1:15);
+                llh_X(3) = sum( llhs(isfinite(llhs)) );
+                
+                % start from 0.75
+                obj.dynamics_model.initialise(0.75, initial_alpha, sigma_estimation, sigma_test);
+                
+                for i=1:15
+                    obj.dynamics_model.process_new_frame(obj.Y(i,:), obj.T(i));
+                end
+                
+                llhs = obj.dynamics_model.compute_loglikelihood_dynamics_forced(1:15);
+                llh_X(4) = sum( llhs(isfinite(llhs)) );
+                
+                % choose best
+                [~, ind] = max(llh_X);
+                x = [0,0.25,0.5,0.75];
+                x_ini = x(ind);
+                
+                obj.dynamics_model.initialise(x_ini, initial_alpha, sigma_estimation, sigma_test);
+           else
+                %default
+                obj.dynamics_model.initialise(0, initial_alpha, sigma_estimation, sigma_test);
+           end
+        end
+    end
+end
diff --git a/parmorceauxMax-git/LLLDyn.mat b/parmorceauxMax-git/LLLDyn.mat
index bba22b4155d4d68a789f14e26f04a82873d4724d..2caa01daae799272179217cadf2cfb19896d6f1f 100644
Binary files a/parmorceauxMax-git/LLLDyn.mat and b/parmorceauxMax-git/LLLDyn.mat differ
diff --git a/parmorceauxMax-git/LLLDynWin.mat b/parmorceauxMax-git/LLLDynWin.mat
index 5d004d9e8ca1cfd716ee19db05c43f0eefdad855..c571685938af3fd0253b837e5582cdf6ccd2d1ae 100644
Binary files a/parmorceauxMax-git/LLLDynWin.mat and b/parmorceauxMax-git/LLLDynWin.mat differ
diff --git a/parmorceauxMax-git/LLLDynpt01.txt b/parmorceauxMax-git/LLLDynpt01.txt
index 05de59ed0963fd0a0cd119f733731eb36a92b7c9..f04a6944d9c08cda0d9ce923794ba5c59549d81f 100644
--- a/parmorceauxMax-git/LLLDynpt01.txt
+++ b/parmorceauxMax-git/LLLDynpt01.txt
@@ -1 +1 @@
--172.39,-116.98,-71.582,-38.764,-18.573,-5.4306,-0.69024,0.53016,0.35935,0.31116,-0.79147,-0.47832,-206.87,-50.969,-59.614,-36.728,-30.269,-19.26,-28.638,-39.032,-46.913,-51.738,-39.432,-28.361,-22.284
+5.9873,5.6745,5.5114,5.481,5.3392,5.081,4.8459,4.894,4.6757,4.3968,4.2441,5.7873,5.7273,5.6833,5.638,5.6051,5.6948,5.759,5.7286,5.4084,5.3468,5.2907,5.5845,5.642,5.8658
diff --git a/parmorceauxMax-git/example_test_models.m b/parmorceauxMax-git/example_test_models.m
index a95df1c20238e3c53825a9ae92d73d4a229605c4..22b3930c8550970960e7b37d2d3a4513651e015a 100644
--- a/parmorceauxMax-git/example_test_models.m
+++ b/parmorceauxMax-git/example_test_models.m
@@ -3,25 +3,25 @@
 %for initial_alpha=0.035:0.001:0.043%0.035:0.001:0.045%0.01:0.01:0.1%0.05:0.05
     %% liste of testing data
     liste = dir(['HTN*.txt']);
-    save testtest1.mat
-    save testtest2.mat
-    save LLLDynWin.mat
-    save LLLDyn.mat
+%    save testtest1.mat
+ %   save testtest2.mat
+%    save LLLDynWin.mat
+%    save LLLDyn.mat
     %% initialisation
     % set display to -1 to disable
-    display = 1;%1(ancienne version)%7;%-1
-    interface = Interface({'interpolants_A', 'interpolants_B1', 'interpolants_B2', 'interpolants_C'}, display);
+    display = 7;%1(ancienne version)%7;%-1
+    interface = Interface('interpolants', display);%_Periodic
     % set initial_alpha = -1 to have it estimated automatically
-    initial_alpha =0.037% 0.038 %0.04;%0.05 %0.025;(0.039)
+    initial_alpha =1/24%0.037% 0.038 %0.04;%0.05 %0.025;(0.039)
     sigma_estimation = 7e-3;
     sigma_test = 1e-3;
     threshold_dynamics = -0.7;
     %% testing
-    J=[5]%[8,29,42,45,46]%J=[1,3,6,11,13,16,21,24,25,26,27,29];
+    %J=[39]%[8,29,42,45,46]%J=[1,3,6,11,13,16,21,24,25,26,27,29];
    
-    for i=1:length(J)%length(J)%length(liste)
-        filename=strcat(liste(J(i)).name)%liste(i).name%liste(J(i)).name
-        interface.process_new_sequence(filename, [initial_alpha*2.1 initial_alpha*2 initial_alpha*1.5 initial_alpha*2.4], sigma_estimation, sigma_test, threshold_dynamics);
+    for i=1:length(liste)%length(J)%length(liste)
+        filename=strcat(liste(i).name)%liste(i).name%liste(J(i)).name
+        interface.process_new_sequence(filename, initial_alpha, sigma_estimation, sigma_test, threshold_dynamics);
         %j'essaie de "save" les meilleurs sequences
         testtest1=interface.meilleure_sequence
         if (i==1)
@@ -44,23 +44,24 @@
 %             LLLDynWin=[LLLDynWin;testtest1];
 %             LLLDyn=[LLLDyn;testtest2];
 %         end
-        
+     i   
     end
     %figure()
     %plot([1:25],LLLDynWin)
-    figure()
-    plot([1:25],LLLDyn)
+    %figure()
+    %plot()
+   % plot([1:25],LLLDyn)
     %
     
-    for i=1:length(liste)%length(J)%length(liste)
-        if (i < 10)
-            name = strcat('0',int2str(i));
-        else
-            name = int2str(i);
-        end
-        
-        dlmwrite(strcat('LLLDynpt',name,'.txt'),LLLDyn(i,:));
-    end   
+%     for i=1:length(liste)%length(J)%length(liste)
+%         if (i < 10)
+%             name = strcat('0',int2str(i));
+%         else
+%             name = int2str(i);
+%         end
+%         
+%         dlmwrite(strcat('LLLDynpt',name,'.txt'),LLLDyn(i,:));
+%     end   
     %[f_mesure,m_seuil]=find_seuil_score()
     %if f_mesure>F_Mesure
         %F_Mesure=f_mesure
diff --git a/parmorceauxMax-git/testtest1.mat b/parmorceauxMax-git/testtest1.mat
index bc06a160e346b49e4124d754d041ec13ba4e57b6..aee5240ea80b412e185c43d445d6805d04a578e0 100644
Binary files a/parmorceauxMax-git/testtest1.mat and b/parmorceauxMax-git/testtest1.mat differ
diff --git a/parmorceauxMax-git/testtest2.mat b/parmorceauxMax-git/testtest2.mat
index 2d90b483a9dd15fd9b8a4ed106e8a1a9cba73360..6d38594173af745c20e8c8c7461adafa22008085 100644
Binary files a/parmorceauxMax-git/testtest2.mat and b/parmorceauxMax-git/testtest2.mat differ