Benchmark.h
1 /*********************************************************************
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2010, Rice University
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the name of the Rice University nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *********************************************************************/
34 
35 /* Author: Ioan Sucan */
36 
37 #ifndef OMPL_TOOLS_BENCHMARK_BENCHMARK_
38 #define OMPL_TOOLS_BENCHMARK_BENCHMARK_
39 
40 #include "ompl/geometric/SimpleSetup.h"
41 #include "ompl/control/SimpleSetup.h"
42 
43 namespace ompl
44 {
45  namespace tools
46  {
48  class Benchmark
49  {
50  public:
51 
56  struct Status
57  {
58  Status()
59  {
60  running = false;
61  activeRun = 0;
62  progressPercentage = 0.0;
63  }
64 
66  bool running;
67 
69  std::string activePlanner;
70 
72  unsigned int activeRun;
73 
76  };
77 
80  typedef std::map<std::string, std::string> RunProperties;
81 
82  typedef std::vector<std::map<std::string, std::string> > RunProgressData;
83 
85  typedef std::function<void(const base::PlannerPtr&)> PreSetupEvent;
86 
88  typedef std::function<void(const base::PlannerPtr&, RunProperties&)> PostSetupEvent;
89 
92  {
94  std::string name;
95 
97  std::vector<RunProperties> runs;
98 
101  std::vector<std::string> progressPropertyNames;
102 
105  std::vector<RunProgressData> runsProgressData;
106 
109 
110  bool operator==(const PlannerExperiment& p) const
111  {
112  return name==p.name && runs==p.runs && common==p.common;
113  }
114  };
115 
118  {
120  std::string name;
121 
123  std::vector<PlannerExperiment> planners;
124 
126  double maxTime;
127 
129  double maxMem;
130 
132  unsigned int runCount;
133 
136 
139 
141  std::string setupInfo;
142 
144  boost::uint32_t seed;
145 
147  std::string host;
148 
150  std::string cpuInfo;
151 
153  std::map<std::string, std::string> parameters;
154  };
155 
157  struct Request
158  {
160  Request(double maxTime = 5.0, double maxMem = 4096.0,
161  unsigned int runCount = 100,
162  double timeBetweenUpdates = 0.05,
163  bool displayProgress = true,
164  bool saveConsoleOutput = true, bool useThreads = true,
165  bool simplify = true)
171  {
172  }
173 
175  double maxTime;
176 
178  double maxMem;
179 
181  unsigned int runCount;
182 
185 
188 
191 
194 
196  bool simplify;
197  };
198 
200  Benchmark(geometric::SimpleSetup &setup, const std::string &name = std::string()) : gsetup_(&setup), csetup_(nullptr)
201  {
202  exp_.name = name;
203  }
204 
206  Benchmark(control::SimpleSetup &setup, const std::string &name = std::string()) : gsetup_(nullptr), csetup_(&setup)
207  {
208  exp_.name = name;
209  }
210 
211  virtual ~Benchmark()
212  {
213  }
214 
218  void addExperimentParameter(const std::string& name, const std::string& type, const std::string& value)
219  {
220  exp_.parameters[name + " " + type] = value;
221  }
222 
224  const std::map<std::string, std::string>& getExperimentParameters() const
225  {
226  return exp_.parameters;
227  }
228 
230  std::size_t numExperimentParameters() const
231  {
232  return exp_.parameters.size();
233  }
234 
236  void setExperimentName(const std::string &name)
237  {
238  exp_.name = name;
239  }
240 
242  const std::string& getExperimentName() const
243  {
244  return exp_.name;
245  }
246 
248  void addPlanner(const base::PlannerPtr &planner)
249  {
250  if (planner && planner->getSpaceInformation().get() !=
252  throw Exception("Planner instance does not match space information");
253  planners_.push_back(planner);
254  }
255 
258  {
260  }
261 
264  {
265  planners_.clear();
266  }
267 
270  {
271  plannerSwitch_ = event;
272  }
273 
275  void setPreRunEvent(const PreSetupEvent &event)
276  {
277  preRun_ = event;
278  }
279 
281  void setPostRunEvent(const PostSetupEvent &event)
282  {
283  postRun_ = event;
284  }
285 
297  virtual void benchmark(const Request &req);
298 
300  const Status& getStatus() const
301  {
302  return status_;
303  }
304 
310  {
311  return exp_;
312  }
313 
315  virtual bool saveResultsToStream(std::ostream &out = std::cout) const;
316 
318  bool saveResultsToFile(const char *filename) const;
319 
321  bool saveResultsToFile() const;
322 
323  protected:
324 
327 
330 
332  std::vector<base::PlannerPtr> planners_;
333 
336 
339 
342 
345 
348 
349  };
350  }
351 }
352 #endif
bool running
Flag indicating whether benchmarking is running.
Definition: Benchmark.h:66
double maxTime
The maximum allowed time for planner computation during the experiment (seconds)
Definition: Benchmark.h:126
control::SimpleSetup * csetup_
The instance of the problem to benchmark (if planning with controls)
Definition: Benchmark.h:329
unsigned int activeRun
The number of the run currently being executed.
Definition: Benchmark.h:72
std::vector< base::PlannerPtr > planners_
The set of planners to be tested.
Definition: Benchmark.h:332
std::vector< std::string > progressPropertyNames
Definition: Benchmark.h:101
boost::uint32_t seed
The random seed that was used at the start of the benchmark program.
Definition: Benchmark.h:144
const std::string & getExperimentName() const
Get the name of the experiment.
Definition: Benchmark.h:242
unsigned int runCount
The number of runs to execute for each planner.
Definition: Benchmark.h:132
double totalDuration
The amount of time spent to collect the information in this structure (seconds)
Definition: Benchmark.h:138
std::map< std::string, std::string > parameters
Additional, experiment specific parameters. This is optional.
Definition: Benchmark.h:153
Create the set of classes typically needed to solve a control problem.
Definition: SimpleSetup.h:64
std::vector< PlannerExperiment > planners
The collected experimental data; each element of the array (an experiment) corresponds to a planner...
Definition: Benchmark.h:123
double maxMem
the maximum amount of memory a planner is allowed to use (MB); 4096.0 by default
Definition: Benchmark.h:178
double timeBetweenUpdates
When collecting time-varying data from a planner during its execution, the planner's progress will be...
Definition: Benchmark.h:184
void addPlanner(const base::PlannerPtr &planner)
Add a planner to use.
Definition: Benchmark.h:248
bool saveResultsToFile() const
Save the results of the benchmark to a file. The name of the file is the current date and time...
Definition: Benchmark.cpp:245
std::string name
The name of the planner.
Definition: Benchmark.h:94
std::map< std::string, std::string > RunProperties
The data collected from a run of a planner is stored as key-value pairs.
Definition: Benchmark.h:80
const CompleteExperiment & getRecordedExperimentData() const
Return all the experiment data that would be written to the results file. The data should not be chan...
Definition: Benchmark.h:309
void setExperimentName(const std::string &name)
Set the name of the experiment.
Definition: Benchmark.h:236
Benchmark a set of planners on a problem instance.
Definition: Benchmark.h:48
std::size_t numExperimentParameters() const
Return the number of optional benchmark parameters.
Definition: Benchmark.h:230
Benchmark(control::SimpleSetup &setup, const std::string &name=std::string())
Constructor needs the SimpleSetup instance needed for planning. Optionally, the experiment name (name...
Definition: Benchmark.h:206
bool displayProgress
flag indicating whether progress is to be displayed or not; true by default
Definition: Benchmark.h:187
RunProperties common
Some common properties for all the runs.
Definition: Benchmark.h:108
unsigned int runCount
the number of times to run each planner; 100 by default
Definition: Benchmark.h:181
time::point startTime
The point in time when the experiment was started.
Definition: Benchmark.h:135
const SpaceInformationPtr & getSpaceInformation() const
Get the current instance of the space information.
Definition: SimpleSetup.h:81
bool saveConsoleOutput
flag indicating whether console output is saved (in an automatically generated filename); true by def...
Definition: Benchmark.h:190
bool useThreads
flag indicating whether planner runs should be run in a separate thread. It is advisable to set this ...
Definition: Benchmark.h:193
void addPlannerAllocator(const base::PlannerAllocator &pa)
Add a planner allocator to use.
Definition: Benchmark.h:257
std::function< void(const base::PlannerPtr &)> PreSetupEvent
Signature of function that can be called before a planner execution is started.
Definition: Benchmark.h:85
geometric::SimpleSetup * gsetup_
The instance of the problem to benchmark (if geometric planning)
Definition: Benchmark.h:326
Create the set of classes typically needed to solve a geometric problem.
Definition: SimpleSetup.h:65
std::function< PlannerPtr(const SpaceInformationPtr &)> PlannerAllocator
Definition of a function that can allocate a planner.
Definition: Planner.h:423
Benchmark(geometric::SimpleSetup &setup, const std::string &name=std::string())
Constructor needs the SimpleSetup instance needed for planning. Optionally, the experiment name (name...
Definition: Benchmark.h:200
A shared pointer wrapper for ompl::base::Planner.
Request(double maxTime=5.0, double maxMem=4096.0, unsigned int runCount=100, double timeBetweenUpdates=0.05, bool displayProgress=true, bool saveConsoleOutput=true, bool useThreads=true, bool simplify=true)
Constructor that provides default values for all members.
Definition: Benchmark.h:160
std::vector< RunProperties > runs
Data collected for each run.
Definition: Benchmark.h:97
const Status & getStatus() const
Get the status of the benchmarking code. This function can be called in a separate thread to check ho...
Definition: Benchmark.h:300
std::vector< RunProgressData > runsProgressData
Definition: Benchmark.h:105
const std::map< std::string, std::string > & getExperimentParameters() const
Get all optional benchmark parameters. The map key is 'name type'.
Definition: Benchmark.h:224
double maxTime
the maximum amount of time a planner is allowed to run (seconds); 5.0 by default
Definition: Benchmark.h:175
void addExperimentParameter(const std::string &name, const std::string &type, const std::string &value)
Add an optional parameter's information to the benchmark output. Useful for aggregating results over ...
Definition: Benchmark.h:218
This structure contains information about the activity of a benchmark instance. If the instance is ru...
Definition: Benchmark.h:56
double maxMem
The maximum allowed memory for planner computation during the experiment (MB)
Definition: Benchmark.h:129
PostSetupEvent postRun_
Event to be called after the run of a planner.
Definition: Benchmark.h:347
void setPreRunEvent(const PreSetupEvent &event)
Set the event to be called before the run of a planner.
Definition: Benchmark.h:275
void clearPlanners()
Clear the set of planners to be benchmarked.
Definition: Benchmark.h:263
PreSetupEvent plannerSwitch_
Event to be called when the evaluated planner is switched.
Definition: Benchmark.h:341
The exception type for ompl.
Definition: Exception.h:47
The data collected after running a planner multiple times.
Definition: Benchmark.h:91
const base::SpaceInformationPtr & getSpaceInformation() const
Get the current instance of the space information.
Definition: SimpleSetup.h:82
std::function< void(const base::PlannerPtr &, RunProperties &)> PostSetupEvent
Signature of function that can be called after a planner execution is completed.
Definition: Benchmark.h:88
PreSetupEvent preRun_
Event to be called before the run of a planner.
Definition: Benchmark.h:344
Representation of a benchmark request.
Definition: Benchmark.h:157
void setPlannerSwitchEvent(const PreSetupEvent &event)
Set the event to be called before any runs of a particular planner (when the planner is switched) ...
Definition: Benchmark.h:269
bool simplify
flag indicating whether simplification should be applied to path; true by default ...
Definition: Benchmark.h:196
std::string host
Hostname that identifies the machine the benchmark ran on.
Definition: Benchmark.h:147
virtual bool saveResultsToStream(std::ostream &out=std::cout) const
Save the results of the benchmark to a stream.
Definition: Benchmark.cpp:251
std::string setupInfo
The output of SimpleSetup::print() before the experiment was started.
Definition: Benchmark.h:141
std::chrono::system_clock::time_point point
Representation of a point in time.
Definition: Time.h:66
std::string name
The name of the experiment.
Definition: Benchmark.h:120
double progressPercentage
Total progress (0 to 100)
Definition: Benchmark.h:75
Status status_
The current status of this benchmarking instance.
Definition: Benchmark.h:338
void setPostRunEvent(const PostSetupEvent &event)
Set the event to be called after the run of a planner.
Definition: Benchmark.h:281
CompleteExperiment exp_
The collected experimental data (for all planners)
Definition: Benchmark.h:335
This structure holds experimental data for a set of planners.
Definition: Benchmark.h:117
std::string cpuInfo
Information about the CPU of the machine the benchmark ran on.
Definition: Benchmark.h:150
std::string activePlanner
The name of the planner currently being tested.
Definition: Benchmark.h:69
virtual void benchmark(const Request &req)
Benchmark the added planners on the defined problem. Repeated calls clear previously gathered data...
Definition: Benchmark.cpp:386