class KnapsackSolver::CliOptionChecker

This class checks command line arguments provided to the knapsack_solver binary.

Public Class Methods

check(opts, args) click to toggle source

Checks command-line options, their arguments and positional arguments provided to the CLI.

@param opts [Hash] parsed command-line options @param args [Array<String>] command-line positional arguments

# File lib/knapsack_solver/cli_option_checker.rb, line 12
def self.check(opts, args)
  if !opts[:branch_and_bound] && !opts[:dynamic_programming] &&
     !opts[:fptas] && !opts[:heuristic]
    raise StandardError, 'At least one method of solving must be requested'
  end
  check_fptas_options(opts)
  check_directories(opts)
  check_positional_arguments(args)
end
check_directories(opts) click to toggle source

Checks directory for result and statistic output logs, and directory for graph files.

@param opts [Hash] parsed command-line options

# File lib/knapsack_solver/cli_option_checker.rb, line 51
def self.check_directories(opts)
  check_output_directory(opts[:output_dir]) if opts[:output_dir]
  check_output_directory(opts[:graphs_dir]) if opts[:graphs_dir]
end
check_fptas_options(opts) click to toggle source

Checks command-line options and arguments used by FPTAS solving method.

@param opts [Hash] parsed command-line options

# File lib/knapsack_solver/cli_option_checker.rb, line 25
def self.check_fptas_options(opts)
  return if !opts[:fptas] && !opts.key?(:fptas_epsilon)
  check_incomplete_fptas_options(opts)
  eps = opts[:fptas_epsilon].to_f
  return unless eps <= 0 || eps >= 1 || eps.to_s != opts[:fptas_epsilon]
  raise StandardError,
        'FPTAS epsilon must be number from range (0,1)'
end
check_incomplete_fptas_options(opts) click to toggle source

Checks command-line options and arguments used by FPTAS solving method. Recignizes cases when mandatory FPTAS epsilon constant is missing or when it the constant is provided and FPTAS method is not requested.

@param opts [Hash] parsed command-line options

# File lib/knapsack_solver/cli_option_checker.rb, line 40
def self.check_incomplete_fptas_options(opts)
  raise StandardError, 'Missing FPTAS epsilon constant' if opts[:fptas] && !opts.key?(:fptas_epsilon)
  return unless !opts[:fptas] && opts.key?(:fptas_epsilon)
  raise StandardError,
        'epsilon constant must not be provided when FPTAS is not selected'
end
check_input_file(path) click to toggle source

Checks if an input file exist and is readable.

@param path [Path] path to input regular file

# File lib/knapsack_solver/cli_option_checker.rb, line 77
def self.check_input_file(path)
  raise StandardError, "File '#{path}' does not exists" unless File.exist?(path)
  raise StandardError, "'#{path}' is not a regular file" unless File.file?(path)
  raise StandardError, "File '#{path}' is not readable" unless File.readable?(path)
end
check_output_directory(path) click to toggle source

Checks if an output directory exist and is writable.

@param path [Path] path to output directory

# File lib/knapsack_solver/cli_option_checker.rb, line 68
def self.check_output_directory(path)
  raise StandardError, "Directory '#{path}' does not exists" unless File.exist?(path)
  raise StandardError, "'#{path}' is not a directory" unless File.directory?(path)
  raise StandardError, "Directory '#{path}' is not writable" unless File.writable?(path)
end
check_positional_arguments(args) click to toggle source

Checks if at least one dataset input file was provided and if the input files are readable.

@param args [Array<String>] positional arguments provided to the CLI

# File lib/knapsack_solver/cli_option_checker.rb, line 60
def self.check_positional_arguments(args)
  raise StandardError, 'Missing datset file(s)' if args.empty?
  args.each { |f| check_input_file(f) }
end