aboutsummaryrefslogtreecommitdiff
path: root/lib/knapsack_solver/cli.rb
blob: 716fb0826b46149368eda729a92167c65522dd34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
require 'knapsack_solver/solver'
require 'knapsack_solver/version'
require 'knapsack_solver/cli_option_parser'
require 'knapsack_solver/output_printer'
require 'knapsack_solver/graph_printer'

module KnapsackSolver
  # This class implements a command-line interface for the 0/1 knapsack
  # problem solver.
  class CLI
    # Suffix of a text file which will containg results of dataset solving
    # (price, knapsack things presence, cpu time, wall clock time,
    # relative_error).
    RESULTS_FILNEMAE_SUFFIX = '.results'.freeze

    # Suffix of a text file which will containg statistic data (average price,
    # execution times, relative error)
    STATS_FILNEMAE_SUFFIX = '.stats'.freeze

    # Processes command-line arguments. If no option is given, converts arabic
    # number to roman number and prints it to stdout.
    #
    # @param args [Array] the command-line arguments
    def self.run(args)
      options = CliOptionParser.parse(args)
      return if options.nil?
      datasets = args.each_with_object([]) do |file, sets|
        sets << Dataset.parse(File.new(file))
      end
      s = Solver.new(options, datasets)
      results = s.run
      print_results(results, s.stats(results), options, args)
    end

    # Prints output of datasets solving. Results and statistics are printed to
    # stdout or to a text files. Graphs of statistic values can be created.
    #
    # @param results [Hash] results of dataset solvings
    # @param stats [Hash] statistics from the results of dataset solvings
    # @param options [Hash] Command-line line options supplied to the CLI
    # @param args [Array] array of the positional command-line arguments
    def self.print_results(results, stats, options, args)
      OutputPrinter.new(args, RESULTS_FILNEMAE_SUFFIX, results).print(options[:output_dir])
      OutputPrinter.new(args, STATS_FILNEMAE_SUFFIX, stats).print(options[:output_dir])
      return unless options[:graphs_dir]
      GraphPrinter.new(args, stats, options[:graphs_dir]).print
    end
  end
end