[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29126] branches/soc-2010-rohith291991: MI Solver Updated.

Rohith B V rohith291991 at gmail.com
Tue Jun 1 16:18:46 CEST 2010


Revision: 29126
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29126
Author:   rohith291991
Date:     2010-06-01 16:18:46 +0200 (Tue, 01 Jun 2010)

Log Message:
-----------
MI Solver Updated. Does not Compile. May contain some unneeded code.

Modified Paths:
--------------
    branches/soc-2010-rohith291991/intern/comiso/Examples/quadratic_solver/main.cc
    branches/soc-2010-rohith291991/intern/comiso/Solver/ConstrainedSolver.hh
    branches/soc-2010-rohith291991/intern/comiso/Solver/ConstrainedSolverT.cc
    branches/soc-2010-rohith291991/intern/comiso/Solver/MISolver.cc
    branches/soc-2010-rohith291991/intern/comiso/Solver/MISolver.hh

Added Paths:
-----------
    branches/soc-2010-rohith291991/extern/Eigen2/common.h
    branches/soc-2010-rohith291991/extern/Eigen2/constraint.cc
    branches/soc-2010-rohith291991/intern/comiso/Solver/constraint.cc

Added: branches/soc-2010-rohith291991/extern/Eigen2/common.h
===================================================================
--- branches/soc-2010-rohith291991/extern/Eigen2/common.h	                        (rev 0)
+++ branches/soc-2010-rohith291991/extern/Eigen2/common.h	2010-06-01 14:18:46 UTC (rev 29126)
@@ -0,0 +1,12 @@
+#include "Eigen/Core"
+#include "Eigen/Sparse"
+
+using namespace Eigen;
+
+// ----- Space for other typedefs as needed -----
+
+typedef SparseMatrix<double,ColMajor> SparseXdc;
+typedef SparseMatrix<double,RowMajor> SparseXdr;
+
+bool choleskySolve(SparseXd A, VectorXd b, VectorXd& x);
+bool MISolve(SparseXd A, VectorXd b, VectorXd& x, SparseXd constraints,std::vector<int> roundIndices,int maxIter=10000, double precision=1e-7);

Added: branches/soc-2010-rohith291991/extern/Eigen2/constraint.cc
===================================================================
--- branches/soc-2010-rohith291991/extern/Eigen2/constraint.cc	                        (rev 0)
+++ branches/soc-2010-rohith291991/extern/Eigen2/constraint.cc	2010-06-01 14:18:46 UTC (rev 29126)
@@ -0,0 +1,912 @@
+/*===========================================================================*\
+ *                                                                           *
+ *                               CoMISo                                      *
+ *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *
+ *                           www.rwth-graphics.de                            *
+ *                                                                           *
+ *---------------------------------------------------------------------------* 
+ *  This file is part of CoMISo.                                             *
+ *                                                                           *
+ *  CoMISo 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.                                      *
+ *                                                                           *
+ *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *
+ *                                                                           *
+\*===========================================================================*/ 
+
+#define ACG_CONSTRAINEDSOLVER_C
+//== INCLUDES =================================================================
+
+#include <float.h>
+#include "StopWatch.hh"
+#include "common.h"
+
+
+//== IMPLEMENTATION ==========================================================
+
+
+namespace ACG{
+
+void solve(SparseXd& _constraints, SparseXd& _B, VectorXd _x ,VectorXd _idx_to_round,
+		   double _reg_factor,
+		   bool _show_miso_settings,
+		   bool _show_timings )
+{
+  int nrows = B.rows();
+  int ncols = B.cols()
+  int ncons = constraints.rows();
+
+
+  if( _show_timings) std::cerr << __FUNCTION__ << "\n Initial dimension: " << nrows << " x " << ncols << ", number of constraints: " << ncons << std::endl;
+ 
+  // StopWatch for Timings
+  ACG::StopWatch sw, sw2; sw.start(); sw2.start();
+
+  // c_elim[i] = index of variable which is eliminated in condition i
+  // or -1 if condition is invalid
+  std::vector<int> c_elim( ncons);
+
+  // apply sparse gauss elimination to make subsequent _constraints independent
+
+  //TODO
+  make_constraints_independent( _constraints, _idx_to_round, c_elim);
+  double time_gauss = sw.stop()/1000.0; sw.start();
+
+  // eliminate conditions and return column matrix Bcol
+  SparseXd Bcol( nrows, ncols);
+
+  // reindexing vector
+  std::vector<int>  new_idx;
+
+
+  //TODO
+  eliminate_constraints( _constraints, _B, _idx_to_round, c_elim, new_idx, Bcol);
+
+  double time_eliminate = sw.stop()/1000.0; sw.start();
+
+  if( _show_timings) std::cerr << "Eliminated dimension: " << Bcol.rows() << " x " << Bcol.cols() << std::endl;
+
+  // setup and solve system
+  //TODO
+  double time_setup = setup_and_solve_system( Bcol, _x, _idx_to_round, _reg_factor, _show_miso_settings);
+
+  //  double time_setup_solve = sw.stop()/1000.0; sw.start();
+  
+  // restore eliminated vars to fulfill the given conditions
+  //TODO
+  restore_eliminated_vars( _constraints, _x, c_elim, new_idx);
+
+  double time_resubstitute = sw.stop()/1000.0; sw.start();
+
+  //  double time_total = sw2.stop()/1000.0;
+
+  if( _show_timings) std::cerr << "Timings: \n\t" <<
+    "Gauss Elimination  " << time_gauss          << " s\n\t" <<
+    "System Elimination " << time_eliminate      << " s\n\t" <<
+    "Setup              " << time_setup          << " s\n\t" <<
+   // "Setup + Mi-Solver  " << time_setup_solve    << " s\n\t" <<
+    "Resubstitution     " << time_resubstitute   << " s\n\t" << std::endl << std::endl;
+    //"Total              " << time_total          << std::endl;
+}
+
+
+//-----------------------------------------------------------------------------
+
+
+
+void solve(
+    SparseXd& _constraints,
+    SparseXd& _A, 
+    VectorXd&  _x,
+    VectorXd&  _rhs,
+    VectorXi& _idx_to_round,
+    double    _reg_factor,
+    bool      _show_miso_settings, 
+    bool      _show_timings )
+{
+  int nrows = _A.rows();
+  int ncols = _A.cols();
+  int ncons = _constraints.rows();
+
+  if( _show_timings) std::cerr << __FUNCTION__ << "\n Initital dimension: " << nrows << " x " << ncols << ", number of constraints: " << ncons << std::endl;
+
+  // StopWatch for Timings
+  ACG::StopWatch sw, sw2; sw.start(); sw2.start();
+
+  // c_elim[i] = index of variable which is eliminated in condition i
+  // or -1 if condition is invalid
+  std::vector<int> c_elim( ncons);
+
+  // apply sparse gauss elimination to make subsequent _conditions independent
+  //TODO
+  make_constraints_independent( _constraints, _idx_to_round, c_elim);
+
+  double time_gauss = sw.stop()/1000.0; sw.start();
+
+  // re-indexing vector
+  std::vector<int>  new_idx;
+
+  gmm::csc_matrix< double > Acsc;
+
+  //TODO
+  eliminate_constraints( _constraints, _A, _x, _rhs, _idx_to_round, c_elim, new_idx, Acsc);
+
+  double time_eliminate = sw.stop()/1000.0;
+
+  if( _show_timings) std::cerr << "Eliminated dimension: " << Acsc.nr << " x " << Acsc.nc << std::endl;
+
+  // create MISO solver
+  ACG::MISolver miso;
+  // show options dialog
+  if( _show_miso_settings)
+    miso.show_options_dialog();
+
+  sw.start();
+  miso.solve( Acsc, _x, _rhs, _idx_to_round);
+  double time_miso = sw.stop()/1000.0; sw.start();
+
+  // restore eliminated vars to fulfill the given conditions
+  //TODO
+  restore_eliminated_vars( _constraints, _x, c_elim, new_idx);
+
+  double time_resubstitute = sw.stop()/1000.0; sw.start();
+  double time_total = time_gauss + time_eliminate + time_miso + time_resubstitute;
+  if( _show_timings) std::cerr << "Timings: \n\t" <<
+    "\tGauss Elimination  " << time_gauss          << " s\n\t" <<
+    "\tSystem Elimination " << time_eliminate      << " s\n\t" <<
+    "\tMi-Solver          " << time_miso           << " s\n\t" <<
+    "\tResubstitution     " << time_resubstitute   << " s\n\t" << 
+    "\tTotal              " << time_total          << std::endl << std::endl;
+}
+
+
+//-----------------------------------------------------------------------------
+
+
+void 
+make_constraints_independent(
+    SparseXd&    _constraints,
+		VectorXi&         _idx_to_round,
+		std::vector<int>& _c_elim)
+{
+  ACG::StopWatch sw;
+  // number of variables
+  int n_vars = _constraints.cols();
+
+  // TODO Check: HZ added 14.08.09 
+  _c_elim.clear();
+  _c_elim.resize( gmm::mat_nrows(_constraints), -1);
+
+  // build round map
+  std::vector<bool> roundmap( n_vars, false);
+
+  for(unsigned int i=0; i<_idx_to_round.size(); ++i)
+    roundmap[_idx_to_round[i]] = true;
+
+  // copy constraints into column matrix (for faster update via iterators)
+  //---------------XXXX Changes XXXX
+  //typedef gmm::wsvector <double>      CVector;
+  //typedef gmm::col_matrix< CVector > CMatrix;
+  
+  SparseXd constraints_c;
+  
+  //half modified
+  gmm::resize(constraints_c, _constraints.rows(), _constraints.cols());
+  gmm::copy(_constraints, constraints_c);
+
+  // for all conditions
+  for(unsigned int i=0; i<_constraints.rows(); ++i)
+  {
+    // get elimination variable
+    int elim_j = -1;
+
+    // iterate over current row, until variable found
+    // first search for real valued variable
+    // if not found for integers with value +-1
+    // and finally take the smallest integer variable
+
+
+	//------------ TODO: change this part later---------------
+    typedef typename gmm::linalg_traits<RMatrixT>::const_sub_row_type CRowT;
+    typedef typename gmm::linalg_traits<RMatrixT>::sub_row_type       RowT;
+    typedef typename gmm::linalg_traits<CRowT>::const_iterator        RIter;
+
+    // get current condition row
+    CRowT row       = gmm::mat_const_row( _constraints, i);
+    RIter row_it    = gmm::vect_const_begin( row);
+    RIter row_end   = gmm::vect_const_end( row);
+    double elim_val = FLT_MAX;
+
+    for(; row_it != row_end; ++row_it)
+    {
+      int cur_j = row_it.index();
+      // do not use the constant part
+      if(  cur_j != n_vars - 1 )
+      {
+        // found real valued var? -> finished
+        if( !roundmap[ cur_j ])
+        {
+          elim_j = cur_j;
+          break;
+        }
+        else
+          // store smallest integer
+          if( fabs(*row_it) < elim_val)
+          {
+            elim_j   = cur_j;
+            elim_val = fabs(*row_it);
+          }
+      }
+    }
+
+    // store result
+    _c_elim[i] = elim_j;
+    // error check result
+    if( elim_j == -1)
+    {
+      // redundant or incompatible?
+      if( fabs(gmm::mat_const_row(_constraints, i)[n_vars-1]) > 1e-6 )
+        std::cerr << "Warning: incompatible condition:\n";
+      else
+        std::cerr << "Warning: redundant condition:\n";
+    }
+    else

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list