dep_selector 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,6 +29,8 @@
29
29
  #include <iostream>
30
30
  #include <vector>
31
31
 
32
+
33
+ //#define MEMORY_DEBUG
32
34
  //#define DEBUG
33
35
  //#define USE_DUMB_BRANCHING
34
36
  #define VECTOR_CONSTRAIN
@@ -39,6 +41,64 @@ const int VersionProblem::MIN_TRUST_LEVEL = 0;
39
41
  const int VersionProblem::MAX_TRUST_LEVEL = 10;
40
42
  const int VersionProblem::MAX_PREFERRED_WEIGHT = 10;
41
43
 
44
+ VersionProblemPool::VersionProblemPool() : elems()
45
+ { }
46
+
47
+ VersionProblemPool::~VersionProblemPool()
48
+ {
49
+ DeleteAll();
50
+ }
51
+ void VersionProblemPool::Add(VersionProblem * vp)
52
+ {
53
+ vp->pool = this;
54
+ #ifdef MEMORY_DEBUG
55
+ std::cout << "Pool add\t" << vp << std::endl << std::flush;
56
+ #endif // MEMORY_DEBUG
57
+ elems.insert(vp);
58
+ }
59
+ void VersionProblemPool::Delete(VersionProblem *vp)
60
+ {
61
+ if (vp->pool != 0)
62
+ {
63
+ #ifdef MEMORY_DEBUG
64
+ std::cout << "Pool del\t" << vp << std::endl << std::flush;
65
+ #endif // MEMORY_DEBUG
66
+ elems.erase(vp);
67
+ vp->pool = 0;
68
+ }
69
+ }
70
+ void VersionProblemPool::ShowAll()
71
+ {
72
+ std::cout << "ShowAll =====================================================" << std::endl << std::flush;
73
+ std::set<VersionProblem *>::iterator i;
74
+ for(i = elems.begin(); i != elems.end(); i++) {
75
+ #ifdef MEMORY_DEBUG
76
+ std::cout << "ShowAll has\t\t\t" << *i << std::endl << std::flush;
77
+ #endif // MEMORY_DEBUG
78
+ }
79
+ std::cout << "ShowAll =====================================================" << std::endl << std::flush;
80
+ }
81
+
82
+ void VersionProblemPool::DeleteAll()
83
+ {
84
+ #ifdef MEMORY_DEBUG
85
+ ShowAll();
86
+ #endif
87
+ std::set<VersionProblem *>::iterator i;
88
+ for(i = elems.begin(); i != elems.end(); i++) {
89
+ VersionProblem *vp = *i;
90
+ vp->pool = 0;
91
+ delete *i;
92
+ }
93
+ elems.clear();
94
+ #ifdef MEMORY_DEBUG
95
+ std::cout << "DeleteAll ===================================================" << std::endl << std::flush;
96
+ #endif
97
+ }
98
+
99
+
100
+
101
+
42
102
  VersionProblem::VersionProblem(int packageCount, bool dumpStats)
43
103
  : size(packageCount), version_constraint_count(0), dump_stats(dumpStats),
44
104
  finalized(false), cur_package(0), package_versions(*this, packageCount),
@@ -51,7 +111,8 @@ VersionProblem::VersionProblem(int packageCount, bool dumpStats)
51
111
  // These domains could be narrowed a bit; check later
52
112
  total_preferred_at_latest(*this, -packageCount*MAX_PREFERRED_WEIGHT, packageCount*MAX_PREFERRED_WEIGHT),
53
113
  total_not_preferred_at_latest(*this, -packageCount, packageCount),
54
- preferred_at_latest_weights(new int[packageCount])
114
+ preferred_at_latest_weights(new int[packageCount]),
115
+ pool(0)
55
116
  {
56
117
  for (int i = 0; i < packageCount; i++)
57
118
  {
@@ -59,6 +120,7 @@ VersionProblem::VersionProblem(int packageCount, bool dumpStats)
59
120
  is_required[i] = 0;
60
121
  is_suspicious[i] = 0;
61
122
  }
123
+ // std::cout << "C VersionProblem(int,bool)\t" << this << std::endl << std::flush;
62
124
  }
63
125
 
64
126
  VersionProblem::VersionProblem(bool share, VersionProblem & s)
@@ -72,7 +134,8 @@ VersionProblem::VersionProblem(bool share, VersionProblem & s)
72
134
  at_latest(s.at_latest),
73
135
  total_preferred_at_latest(s.total_preferred_at_latest),
74
136
  total_not_preferred_at_latest(s.total_preferred_at_latest),
75
- preferred_at_latest_weights(NULL)
137
+ preferred_at_latest_weights(NULL),
138
+ pool(s.pool)
76
139
  {
77
140
  package_versions.update(*this, share, s.package_versions);
78
141
  disabled_package_variables.update(*this, share, s.disabled_package_variables);
@@ -83,6 +146,11 @@ VersionProblem::VersionProblem(bool share, VersionProblem & s)
83
146
  at_latest.update(*this, share, s.at_latest);
84
147
  total_preferred_at_latest.update(*this, share, s.total_preferred_at_latest);
85
148
  total_not_preferred_at_latest.update(*this, share, s.total_not_preferred_at_latest);
149
+
150
+ pool->Add(this);
151
+ #ifdef MEMORY_DEBUG
152
+ std::cout << "C VersionProblem(bool, VP)\t" << this << std::endl << std::flush;
153
+ #endif
86
154
  }
87
155
 
88
156
  // Support for gecode
@@ -96,6 +164,12 @@ VersionProblem::~VersionProblem()
96
164
  delete[] preferred_at_latest_weights;
97
165
  delete[] is_required;
98
166
  delete[] is_suspicious;
167
+ if (pool!= 0) {
168
+ pool->Delete(this);
169
+ }
170
+ #ifdef MEMORY_DEBUG
171
+ std::cout << "D VersionProblem\t\t" << this << std::endl << std::flush;
172
+ #endif
99
173
  }
100
174
 
101
175
  int VersionProblem::Size()
@@ -478,59 +552,84 @@ void VersionProblem::ConstrainVectorLessThanBest(IntVarArgs & current, IntVarArg
478
552
  rel(*this, borrow[current.size()], IRT_EQ, 1);
479
553
  }
480
554
 
481
- VersionProblem * VersionProblem::Solve(VersionProblem * problem)
555
+ VersionProblem * VersionProblem::InnerSolve(VersionProblem * problem, int &itercount)
482
556
  {
483
- problem->Finalize();
484
- problem->status();
485
- #ifdef DEBUG
486
- std::cout << "Before solve" << std::endl;
487
- problem->Print(std::cout);
488
- #endif //DEBUG
489
- int i = 0;
490
-
491
- Gecode::Support::Timer timer;
492
- VersionProblem *best_solution = NULL;
493
- timer.start();
557
+ Gecode::Support::Timer timer;
558
+ timer.start();
494
559
 
495
- Restart<VersionProblem> solver(problem);
496
- best_solution = NULL;
497
-
498
- while (VersionProblem *solution = solver.next())
560
+ #ifdef MEMORY_DEBUG
561
+ std::cout << "Creating solver" << std::endl << std::flush;
562
+ #endif
563
+ VersionProblem *best_solution = NULL;
564
+ Restart<VersionProblem> solver(problem);
565
+
566
+ #ifdef MEMORY_DEBUG
567
+ std::cout << "Starting Solve" << std::endl << std::flush;
568
+ #endif
569
+
570
+ while (VersionProblem *solution = solver.next())
499
571
  {
500
- if (best_solution != NULL)
572
+ #ifdef MEMORY_DEBUG
573
+ std::cout << "Solver Next " << solution << std::endl << std::flush;
574
+ #endif
575
+ if (best_solution != NULL)
501
576
  {
502
- delete best_solution;
577
+ delete best_solution;
503
578
  }
504
- best_solution = solution;
505
- ++i;
579
+ best_solution = solution;
580
+ ++itercount;
506
581
  #ifdef DEBUG
507
- std::cout << "Trial Solution #" << i << "===============================" << std::endl;
508
- const Search::Statistics & stats = solver.statistics();
509
- std::cout << "Solver stats: Prop:" << stats.propagate << " Fail:" << stats.fail << " Node:" << stats.node;
510
- std::cout << " Depth:" << stats.depth << " memory:" << stats.memory << std::endl;
511
- solution->Print(std::cout);
512
- #endif //DEBUG
513
- }
582
+ std::cout << "Trial Solution #" << itercount << "===============================" << std::endl;
583
+ const Search::Statistics & stats = solver.statistics();
584
+ std::cout << "Solver stats: Prop:" << stats.propagate << " Fail:" << stats.fail << " Node:" << stats.node;
585
+ std::cout << " Depth:" << stats.depth << " memory:" << stats.memory << std::endl;
586
+ solution->Print(std::cout);
587
+ #endif //DEBUG
588
+ }
514
589
 
515
- double elapsed_time = timer.stop();
516
-
517
- if (problem->dump_stats) {
518
- std::cerr << "dep_selector solve: ";
519
- std::cerr << (best_solution ? "SOLVED" : "FAILED") << " ";
520
- std::cerr << problem->size << " packages, " << problem->version_constraint_count << " constraints, ";
521
- std::cerr << "Time: " << elapsed_time << "ms ";
522
- const Search::Statistics & final_stats = solver.statistics();
523
- std::cerr << "Stats: " << i << " steps, " << final_stats.memory << " bytes, ";
524
- std::cerr << final_stats.propagate << " props, " << final_stats.node << " nodes, " << final_stats.depth << " depth ";
525
- std::cerr << std::endl << std::flush;
526
- }
590
+ double elapsed_time = timer.stop();
591
+
592
+ if (problem->dump_stats) {
593
+ std::cerr << "dep_selector solve: ";
594
+ std::cerr << (best_solution ? "SOLVED" : "FAILED") << " ";
595
+ std::cerr << problem->size << " packages, " << problem->version_constraint_count << " constraints, ";
596
+ std::cerr << "Time: " << elapsed_time << "ms ";
597
+ const Search::Statistics & final_stats = solver.statistics();
598
+ std::cerr << "Stats: " << itercount << " steps, ";
599
+ std::cerr << final_stats.memory << " bytes, ";
600
+ std::cerr << final_stats.propagate << " props, " << final_stats.node << " nodes, " << final_stats.depth << " depth ";
601
+ std::cerr << std::endl << std::flush;
602
+ }
603
+
604
+ return best_solution;
605
+ }
527
606
 
528
- #ifdef DEBUG_LITE
529
- std::cout << "Solution completed: " << (best_solution ? "Found solution" : "No solution found") << std::endl;
530
- std::cout << "Solution consumed: " << elapsed_time << " ms " << i << " steps" << std::endl;
531
- std::cout << "======================================================================" << std::endl;
532
- std::cout.flush();
533
- #endif // DEBUG_LITE
607
+ VersionProblem * VersionProblem::Solve(VersionProblem * problem)
608
+ {
609
+
610
+ problem->Finalize();
611
+ problem->status();
612
+
613
+ VersionProblemPool *pool = new VersionProblemPool();
614
+ problem->pool = pool;
615
+
616
+ #ifdef DEBUG
617
+ std::cout << "Before solve" << std::endl;
618
+ problem->Print(std::cout);
619
+ #endif //DEB UG
620
+ int itercount = 0;
621
+
622
+ VersionProblem *best_solution = InnerSolve(problem, itercount);
623
+
624
+ #ifdef MEMORY_DEBUG
625
+ std::cout << "Solver Best Solution " << best_solution << std::endl << std::flush;
626
+ #endif
627
+
628
+ pool->Delete(best_solution);
629
+ problem->pool = 0;
630
+
631
+ pool->DeleteAll();
632
+ delete pool;
534
633
 
535
634
  return best_solution;
536
635
  }
@@ -23,6 +23,7 @@
23
23
  #include "dep_selector_to_gecode_interface.h"
24
24
  #include <iostream>
25
25
  #include <vector>
26
+ #include <set>
26
27
 
27
28
  #include <gecode/driver.hh>
28
29
  #include <gecode/int.hh>
@@ -40,6 +41,19 @@ using namespace Gecode;
40
41
  // Add optimization functions
41
42
  // Allow non-contiguous ranges in package dependencies.
42
43
 
44
+ // TODO: Add locking
45
+ struct VersionProblemPool
46
+ {
47
+ std::set<VersionProblem *> elems;
48
+ VersionProblemPool();
49
+ ~VersionProblemPool();
50
+ void Add(VersionProblem * vp);
51
+ void Delete(VersionProblem *vp);
52
+ void ShowAll();
53
+ void DeleteAll();
54
+ };
55
+
56
+
43
57
  class VersionProblem : public Space
44
58
  {
45
59
  public:
@@ -90,6 +104,7 @@ public:
90
104
  void Print(std::ostream &out);
91
105
  void PrintPackageVar(std::ostream & out, int packageId) ;
92
106
 
107
+ static VersionProblem *InnerSolve(VersionProblem * problem, int & itercount);
93
108
  static VersionProblem *Solve(VersionProblem *problem);
94
109
 
95
110
 
@@ -117,10 +132,14 @@ public:
117
132
  int * is_required;
118
133
  int * is_suspicious;
119
134
 
135
+ VersionProblemPool *pool;
136
+
120
137
  bool CheckPackageId(int id);
121
138
  void AddPackagesPreferredToBeAtLatestObjectiveFunction(const VersionProblem & best_known_solution);
122
139
  void ConstrainVectorLessThanBest(IntVarArgs & current, IntVarArgs & best);
123
140
  void BuildCostVector(IntVarArgs & costVector) const;
141
+
142
+ friend class VersionProblemPool;
124
143
  };
125
144
 
126
145
  template<class T> void PrintVarAligned(const char * message, T & var);
@@ -25,7 +25,7 @@ require 'mkmf'
25
25
 
26
26
  $LIBS << " -lstdc++"
27
27
 
28
- #$CFLAGS << "-g"
28
+ $CFLAGS << "-g"
29
29
 
30
30
  gecode_installed =
31
31
  have_library('gecodesearch') &&
@@ -1,3 +1,3 @@
1
1
  module DepSelector
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
metadata CHANGED
@@ -1,8 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dep_selector
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.0.4
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 5
9
+ version: 0.0.5
6
10
  platform: ruby
7
11
  authors:
8
12
  - Christopher Walters
@@ -11,7 +15,7 @@ autorequire:
11
15
  bindir: bin
12
16
  cert_chain: []
13
17
 
14
- date: 2011-03-30 00:00:00 -07:00
18
+ date: 2011-04-01 00:00:00 -07:00
15
19
  default_executable:
16
20
  dependencies: []
17
21
 
@@ -49,7 +53,7 @@ files:
49
53
  - ext/dep_gecode/dep_selector_to_gecode_interface.cpp
50
54
  - ext/dep_gecode/extconf.rb
51
55
  - ext/dep_gecode/lib/dep_selector_to_gecode.rb
52
- has_rdoc: true
56
+ has_rdoc: false
53
57
  homepage: http://github.com/algorist/dep_selector
54
58
  licenses:
55
59
  - Apache v2
@@ -59,22 +63,24 @@ rdoc_options: []
59
63
  require_paths:
60
64
  - lib
61
65
  required_ruby_version: !ruby/object:Gem::Requirement
62
- none: false
63
66
  requirements:
64
67
  - - ">="
65
68
  - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
66
71
  version: "0"
67
72
  required_rubygems_version: !ruby/object:Gem::Requirement
68
- none: false
69
73
  requirements:
70
74
  - - ">="
71
75
  - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
72
78
  version: "0"
73
79
  requirements:
74
80
  - gecode, version 3.5 or greater
75
81
  - g++
76
82
  rubyforge_project:
77
- rubygems_version: 1.6.2
83
+ rubygems_version: 1.3.6
78
84
  signing_key:
79
85
  specification_version: 3
80
86
  summary: Given packages, versions, and a dependency graph, find a valid assignment of package versions