Skip to content
Snippets Groups Projects
Select Git revision
2 results Searching

DynamicModel.hh

Blame
  • ModelTree.cc 75.39 KiB
    /*
     * Copyright (C) 2003-2016 Dynare Team
     *
     * This file is part of Dynare.
     *
     * Dynare is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * Dynare is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
     */
    
    #include <cstdlib>
    #include <cassert>
    #include <cmath>
    #include <iostream>
    #include <fstream>
    
    #include "ModelTree.hh"
    #include "MinimumFeedbackSet.hh"
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/max_cardinality_matching.hpp>
    #include <boost/graph/strong_components.hpp>
    #include <boost/graph/topological_sort.hpp>
    
    using namespace boost;
    using namespace MFS;
    
    bool
    ModelTree::computeNormalization(const jacob_map_t &contemporaneous_jacobian, bool verbose)
    {
      const int n = equation_number();
    
      assert(n == symbol_table.endo_nbr());
    
      typedef adjacency_list<vecS, vecS, undirectedS> BipartiteGraph;
    
      /*
        Vertices 0 to n-1 are for endogenous (using type specific ID)
        Vertices n to 2*n-1 are for equations (using equation no.)
      */
      BipartiteGraph g(2 * n);
    
      // Fill in the graph
      set<pair<int, int> > endo;
    
      for (jacob_map_t::const_iterator it = contemporaneous_jacobian.begin(); it != contemporaneous_jacobian.end(); it++)
        add_edge(it->first.first + n, it->first.second, g);
    
      // Compute maximum cardinality matching
      vector<int> mate_map(2*n);
    
    #if 1
      bool check = checked_edmonds_maximum_cardinality_matching(g, &mate_map[0]);
    #else // Alternative way to compute normalization, by giving an initial matching using natural normalizations
      fill(mate_map.begin(), mate_map.end(), graph_traits<BipartiteGraph>::null_vertex());
    
      multimap<int, int> natural_endo2eqs;
      computeNormalizedEquations(natural_endo2eqs);
    
      for (int i = 0; i < symbol_table.endo_nbr(); i++)
        {
          if (natural_endo2eqs.count(i) == 0)