From 08bcf39fe705d37464dc01e6bbfd82d7f6dfa866 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan.bastani@ens.fr>
Date: Mon, 2 Apr 2012 17:54:05 +0200
Subject: [PATCH] estimation: clear subsamples substructure whenever a
 subsamples statement is encountered

---
 matlab/global_initialization.m | 10 ++++-----
 preprocessor/ComputingTasks.cc | 40 ++++++++++++++++++++++++++++++++--
 preprocessor/ComputingTasks.hh |  4 +++-
 preprocessor/ParsingDriver.cc  |  2 +-
 4 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m
index bfb969ffb5..192abf40ae 100644
--- a/matlab/global_initialization.m
+++ b/matlab/global_initialization.m
@@ -246,12 +246,12 @@ options_.timeless = 0;
 
 % estimation
 estimation_info.empty_prior = struct(...
-    'domain', {}, 'interval', {}, 'mean', {}, ...
-    'median', {}, 'mode', {}, 'shape', {}, ...
-    'shift', {}, 'stdev', {}, 'truncate', {}, 'variance', {});
+    'domain', [], 'interval', [], 'mean', [], ...
+    'median', [], 'mode', [], 'shape', [], ...
+    'shift', [], 'stdev', [], 'truncate', [], 'variance', []);
 estimation_info.empty_options = struct(...
-    'bounds',{}, 'init', {}, 'jscale', {});
-estimation_info.subsamples.range = struct('date1', {}, 'date2', {});
+    'bounds',[], 'init', [], 'jscale', []);
+estimation_info.subsamples.range = struct('date1', [], 'date2', []);
 estimation_info.parameter.prior = estimation_info.empty_prior;
 estimation_info.parameter.subsample_prior = estimation_info.empty_prior;
 estimation_info.parameter.options = estimation_info.empty_options;
diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc
index 9ede60828d..7950c410eb 100644
--- a/preprocessor/ComputingTasks.cc
+++ b/preprocessor/ComputingTasks.cc
@@ -1632,10 +1632,12 @@ EstimationDataStatement::writeOutput(ostream &output, const string &basename) co
 
 SubsamplesStatement::SubsamplesStatement(const string &name1_arg,
                                          const string &name2_arg,
-                                         const subsample_declaration_map_t subsample_declaration_map_arg) :
+                                         const subsample_declaration_map_t subsample_declaration_map_arg,
+                                         const SymbolTable &symbol_table_arg) :
   name1(name1_arg),
   name2(name2_arg),
-  subsample_declaration_map(subsample_declaration_map_arg)
+  subsample_declaration_map(subsample_declaration_map_arg),
+  symbol_table(symbol_table_arg)
 {
 }
 
@@ -1664,6 +1666,40 @@ SubsamplesStatement::writeOutput(ostream &output, const string &basename) const
            << it->second.first << "';" << endl
            << "estimation_info.subsamples(subsamples_indx).range(" << map_indx << ").date2 = '"
            << it->second.second << "';" << endl;
+
+  // Initialize associated subsample substructures in estimation_info
+  const SymbolType symb_type = symbol_table.getType(name1);
+  string lhs_field;
+  if (symb_type == eParameter)
+    lhs_field = "parameter";
+  else if (symb_type == eExogenous || symb_type == eExogenousDet)
+    lhs_field = "structural_innovation";
+  else
+    lhs_field = "measurement_error";
+
+  output << "eifind = get_new_or_existing_ei_index('" << lhs_field;
+
+  if (!name2.empty())
+    output << "_corr";
+  output << "_prior_index', '"
+         << name1 << "', '";
+  if (!name2.empty())
+    output << name2;
+  output << "');" << endl;
+
+  lhs_field = "estimation_info." + lhs_field;
+  if (!name2.empty())
+    lhs_field += "_corr";
+  output << lhs_field << "_prior_index(eifind) = {'" << name1;
+  if (!name2.empty())
+    output << ":" << name2;
+  output << "'};" << endl;
+
+  output << lhs_field << "(eifind).subsample_prior = estimation_info.empty_prior;" << endl
+         << lhs_field << "(eifind).subsample_prior(1:" << subsample_declaration_map.size()
+         << ") = estimation_info.empty_prior;" << endl
+         << lhs_field << "(eifind).range_index = estimation_info.subsamples(subsamples_indx).range_index;"
+         << endl;
 }
 
 SubsamplesEqualStatement::SubsamplesEqualStatement(const string &to_name1_arg,
diff --git a/preprocessor/ComputingTasks.hh b/preprocessor/ComputingTasks.hh
index 3e048f7a0c..f3cfeb07cf 100644
--- a/preprocessor/ComputingTasks.hh
+++ b/preprocessor/ComputingTasks.hh
@@ -588,10 +588,12 @@ private:
   const string name1;
   const string name2;
   const subsample_declaration_map_t subsample_declaration_map;
+  const SymbolTable symbol_table;
 public:
   SubsamplesStatement(const string &name1_arg,
                       const string &name2_arg,
-                      const subsample_declaration_map_t subsample_declaration_map_arg);
+                      const subsample_declaration_map_t subsample_declaration_map_arg,
+                      const SymbolTable &symbol_table_arg);
   virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc
index 4f95a9c2b2..4adbfdef82 100644
--- a/preprocessor/ParsingDriver.cc
+++ b/preprocessor/ParsingDriver.cc
@@ -1242,7 +1242,7 @@ ParsingDriver::set_subsamples(string *name1, string *name2)
   if (!name2->empty())
     check_symbol_existence(*name2);
 
-  mod_file->addStatement(new SubsamplesStatement(*name1, *name2, subsample_declaration_map));
+  mod_file->addStatement(new SubsamplesStatement(*name1, *name2, subsample_declaration_map, mod_file->symbol_table));
   subsample_declarations[make_pair(*name1, *name2)] = subsample_declaration_map;
   subsample_declaration_map.clear();
   delete name1;
-- 
GitLab