From 60e8db5ac4827ccacc500e90180bd4e92fa654aa Mon Sep 17 00:00:00 2001 From: vasiloglou Date: Sat, 12 Apr 2008 22:01:38 +0000 Subject: [PATCH] Seems to compile , I have to remove from svn at some point th dual_manifold_objective{_impl}.h --- .../contrib/nvasil/dual_manifold/build.py | 8 +++ .../dual_manifold/dual_manifold_engine.h | 10 ++- .../dual_manifold/dual_manifold_engine_impl.h | 15 ++-- .../dual_manifold_engine_test.cc | 71 +++++++++++++++++++ .../dual_manifold_objective_impl.h | 12 ++-- .../mvu_dot_prod_objective_impl.h | 13 ++-- 6 files changed, 108 insertions(+), 21 deletions(-) create mode 100644 fastlib2/contrib/nvasil/dual_manifold/build.py create mode 100644 fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine_test.cc diff --git a/fastlib2/contrib/nvasil/dual_manifold/build.py b/fastlib2/contrib/nvasil/dual_manifold/build.py new file mode 100644 index 0000000000..a3c9918ae3 --- /dev/null +++ b/fastlib2/contrib/nvasil/dual_manifold/build.py @@ -0,0 +1,8 @@ +librule(name="dual_manifold", + headers=["dual_manifold_engine.h", "dual_manifold_engine_impl.h", + "mvu_dot_prod_objective.h", "mvu_dot_prod_objective_impl.h"], + deplibs=["fastlib:fastlib", "contrib/nvasil/l_bfgs:l_bfgs"]) + +binrule(name="test", + sources=["dual_manifold_engine_test.cc"], + deplibs=[":dual_manifold", "fastlib:fastlib"]) diff --git a/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine.h b/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine.h index db645358ce..016512cbd9 100644 --- a/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine.h +++ b/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine.h @@ -18,7 +18,6 @@ #ifndef DUAL_MANIFOLD_ENGINE_ #define DUAL_MANIFOLD_ENGINE_ -#include "dual_manifold_objective.h" #include "../l_bfgs/l_bfgs.h" #include "../l_bfgs/optimization_utils.h" /** @@ -58,14 +57,13 @@ class DualManifoldEngine { double norm_grad_tolerance_; index_t iterations_; index_t max_iterations_; - datanode *module; + double desired_error_; + datanode *module_; - - LBfgs lbfgs1_; - LBfgs lbfgs2_; + LBfgs l_bfgs1_; + LBfgs l_bfgs2_; OptimizedFunction optimized_function1_; OptimizedFunction optimized_function2_; - }; #include "dual_manifold_engine_impl.h" diff --git a/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine_impl.h b/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine_impl.h index c3f6a7ca03..67e91c1a2d 100644 --- a/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine_impl.h +++ b/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_engine_impl.h @@ -17,15 +17,15 @@ */ template -DualManifoldEngine::Init(datanode *module, +void DualManifoldEngine::Init(datanode *module, // index pairs to consider from the matrix (row,column) pairs ArrayList > &pairs_to_consider, // The values of the (row, column) values, also known as the dot products ArrayList &dot_prod_values) { module_=module; - l_bfg1_.Init(&optimized_function1_, fx_param_node(module_, "l_bfgs")); - l_bfg2_.Init(&optimized_function2_, fx_param_node(module_, "l_bfgs")); + l_bfgs1_.Init(&optimized_function1_, fx_param_node(module_, "l_bfgs")); + l_bfgs2_.Init(&optimized_function2_, fx_param_node(module_, "l_bfgs")); optimized_function1_.Init(fx_param_node(module_, "opt1"), l_bfgs1_.coordinates(), @@ -41,13 +41,20 @@ DualManifoldEngine::Init(datanode *module, } +template +void DualManifoldEngine::Destruct() { + +} + template void DualManifoldEngine::ComputeLocalOptimum() { for(index_t i=0; i +#include "fastlib/fastlib.h" +#include "dual_manifold_engine.h" +#include "mvu_dot_prod_objective.h" +#include "errno.h" + +class DualManifoldEngineTest { + public: + void Init() { + std::string filename="/net/hg200/nvasil/dataset/ml-data_0/u.data"; + FILE *fp=fopen(filename.c_str(), "r"); + if (fp==NULL) { + FATAL("Unable to open file %s, error %s\n", filename.c_str(), + strerror(errno)); + } + ArrayList > pairs_to_consider; + pairs_to_consider.Init(); + ArrayList dot_prods; + dot_prods.Init(); + while (!feof(fp)) { + index_t user_id; + index_t movie_id; + double rating; + fscanf(fp, "%i %i %lg", &user_id, &movie_id, &rating); + pairs_to_consider.PushBackCopy(std::make_pair(user_id, movie_id)); + dot_prods.PushBackCopy(rating); + } + fclose(fp); + engine_.Init(NULL, pairs_to_consider, dot_prods); + } + void Destruct() { + engine_.Destruct(); + } + void Test1() { + NOTIFY("Testing Test1.."); + Init(); + Test1(); + Destruct(); + NOTIFY("Test1 passed!!"); + } + void TestAll() { + Test1(); + } + + private: + DualManifoldEngine engine_; +}; + +int main(int argc, char * argv[]) { + fx_init(argc, argv); + DualManifoldEngineTest test; + test.TestAll(); + fx_done(); +} diff --git a/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_objective_impl.h b/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_objective_impl.h index 8acbf2012f..269b8bd21d 100644 --- a/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_objective_impl.h +++ b/fastlib2/contrib/nvasil/dual_manifold/dual_manifold_objective_impl.h @@ -16,13 +16,13 @@ * ===================================================================================== */ -void DualMaxVarianc::Init(datanode *module, Matrix *other_part, - ArrayList > pairs_to_consider, - ArrayList *dot_prod_values) { - other_part_=other_part; +void DualMaxVariance::Init(datanode *module, Matrix *other_part, + ArrayList > &pairs_to_consider, + ArrayList &dot_prod_values) { + auxiliary_mat__=other_part; module_=module; - pairs_to_consider_=pairs_to_consider; - dot_prod_values_=dot_prod_values; + pairs_to_consider_.Copy(pairs_to_consider); + dot_prod_values_.Copy(dot_prod_values); eq_lagrange_mult_.Init(pairs_to_consider_.size()); eq_lagrange_mult_.SetAll(1.0); } diff --git a/fastlib2/contrib/nvasil/dual_manifold/mvu_dot_prod_objective_impl.h b/fastlib2/contrib/nvasil/dual_manifold/mvu_dot_prod_objective_impl.h index 532fe8e25e..1417392089 100644 --- a/fastlib2/contrib/nvasil/dual_manifold/mvu_dot_prod_objective_impl.h +++ b/fastlib2/contrib/nvasil/dual_manifold/mvu_dot_prod_objective_impl.h @@ -24,8 +24,8 @@ void MVUDotProdObjective::Init(datanode *module, module_=module; auxiliary_mat_=coordinates; - pairs_to_consider_.Copy(pairs_to_consider); - dot_prod_values_.Copy(dot_prod_values); + pairs_to_consider_.InitCopy(pairs_to_consider); + dot_prod_values_.InitCopy(dot_prod_values); eq_lagrange_mult_.Init(dot_prod_values.size()); eq_lagrange_mult_.SetAll(0.0); num_of_constraints_=dot_prod_values_.size(); @@ -37,7 +37,7 @@ void MVUDotProdObjective::ComputeGradient(Matrix &coordinates, Matrix *gradient) la::Scale(-1.0, gradient); index_t dimension=auxiliary_mat_->n_rows(); Vector constant; - for (index_t i=0; iGetColumnPtr(ind1); @@ -62,6 +62,7 @@ void MVUDotProdObjective::ComputeObjective(Matrix &coordinates, double *objectiv } void MVUDotProdObjective::ComputeFeasibilityError(Matrix &coordinates, double *error) { + index_t dimension = coordinates.n_rows(); *error=0; for(index_t i=0; iGetColumnPtr(ind1); @@ -86,6 +88,7 @@ double MVUDotProdObjective::ComputeLagrangian(Matrix &coordinates) { double diff=dot_prod-dot_prod_values_[i]; lagrangian+= -eq_lagrange_mult_[i]*diff + sigma_*diff*diff; } + return lagrangian; } void MVUDotProdObjective::UpdateLagrangeMult(Matrix &coordinates) {