diff options
Diffstat (limited to 'contrib/lua-torch/torch7/CmdLine.lua')
-rw-r--r-- | contrib/lua-torch/torch7/CmdLine.lua | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/contrib/lua-torch/torch7/CmdLine.lua b/contrib/lua-torch/torch7/CmdLine.lua new file mode 100644 index 000000000..643635069 --- /dev/null +++ b/contrib/lua-torch/torch7/CmdLine.lua @@ -0,0 +1,269 @@ +local CmdLine = torch.class('torch.CmdLine') + +local function strip(str) + return string.match(str, '%-*(.*)') +end + +local function pad(str, sz) + return str .. string.rep(' ', sz-#str) +end + +function CmdLine:error(msg) + print('') + io.stderr:write(msg) + print('') + self:help() + os.exit(1) +end + +function CmdLine:__readArgument__(params, arg, i, nArgument) + local argument = self.arguments[nArgument] + local value = arg[i] + + if nArgument > #self.arguments then + self:error('invalid argument: ' .. value) + end + if argument.type and type(value) ~= argument.type then + self:error('invalid argument type for argument ' .. argument.key .. ' (should be ' .. argument.type .. ')') + end + params[strip(argument.key)] = value + return 1 +end + +function CmdLine:__readOption__(params, arg, i) + local key = arg[i] + local option = self.options[key] + if not option then + self:error('unknown option ' .. key) + end + + if option.type and option.type == 'boolean' then + params[strip(key)] = not option.default + return 1 + else + local value = arg[i+1] + if not value then + self:error('missing argument for option ' .. key) + end + if not option.type or option.type == 'string' then + elseif option.type == 'number' then + value = tonumber(value) + else + self:error('unknown required option type ' .. option.type) + end + if not value then + self:error('invalid type for option ' .. key .. ' (should be ' .. option.type .. ')') + end + params[strip(key)] = value + return 2 + end +end + +function CmdLine:__init(argseparator_,keyseparator_) + self.argseparator = argseparator_ or ',' + self.keyseparator = keyseparator_ or '=' + self.options = {} + self.arguments = {} + self.helplines = {} + self.dateformat = nil + self.silentio = false +end + +function CmdLine:silent() + self.silentio = true +end + +function CmdLine:addTime(name, format) + format = format or '%Y-%m-%d %H:%M:%S' + if type(format) ~= 'string' then + error('Argument has to be string') + end + if name ~= nil then + name = '[' .. name .. ']: ' + else + name = '' + end + self.dateformat = format .. name +end + + +function CmdLine:argument(key, help, _type_) + table.insert(self.arguments, {key=key, help=help, type=_type_}) + table.insert(self.helplines, self.arguments[#self.arguments]) +end + +function CmdLine:option(key, default, help, _type_) + if default == nil then + error('option ' .. key .. ' has no default value') + end + _type_ = _type_ or type(default) + if type(default) ~= _type_ then + error('option ' .. key .. ' has wrong default type value') + end + self.options[key] = {key=key, default=default, help=help, type=_type_} + table.insert(self.helplines, self.options[key]) +end + +function CmdLine:default() + local params = {} + for option,v in pairs(self.options) do + params[strip(option)] = v.default + end + return params +end + +function CmdLine:parse(arg) + local i = 1 + local params = self:default() + + local nArgument = 0 + + while i <= #arg do + if arg[i] == '-help' or arg[i] == '-h' or arg[i] == '--help' then + self:help(arg) + os.exit(0) + end + + if self.options[arg[i]] then + i = i + self:__readOption__(params, arg, i) + else + nArgument = nArgument + 1 + i = i + self:__readArgument__(params, arg, i, nArgument) + end + end + + if nArgument ~= #self.arguments then + self:error('not enough arguments') + end + + return params +end + +function CmdLine:string(prefix, params, ignore) + local arguments = {} + local options = {} + prefix = prefix or '' + + for k,v in pairs(params) do + if ignore[k] then + print('-- ignore option ' .. k) + elseif self.options['-' .. k] then + if v ~= self.options['-' .. k].default or ignore[k] == false then + if type(v) == 'boolean' then + if v then + v = 't' + else + v = 'f' + end + end + table.insert(options, k .. self.keyseparator .. v) + print(k,v,self.options['-' .. k].default) + end + else + local narg + for i=1,#self.arguments do + if strip(self.arguments[i].key) == k then + narg = i + end + end + if narg then + arguments[narg] = k .. self.keyseparator .. v + else + print('WARNING: unknown option/argument: ' .. k .. ' IGNORING for DIRECTORY NAME') + end + end + end + table.sort(options) + local str = table.concat(arguments, self.argseparator) + if str == '' then + str = table.concat(options, self.argseparator) + else + str = str .. self.argseparator .. table.concat(options, self.argseparator) + end + if str == '' then + return prefix + else + return prefix .. self.argseparator .. str + end +end + +local oprint = nil +function CmdLine:log(file, params) + local f = (io.type(file) == 'file' and file) or io.open(file, 'w') + oprint = oprint or print -- get the current print function lazily + function print(...) + local n = select("#", ...) + local arg = {...} + if not self.silentio then + oprint(...) + end + local str = {} + if self.dateformat then + table.insert(str, os.date(self.dateformat)) + end + for i=1,n do + table.insert(str,tostring(arg[i])) + end + table.insert(str,'\n') + f:write(table.concat(str,' ')) + f:flush() + end + print('[program started on ' .. os.date() .. ']') + print('[command line arguments]') + if params then + for k,v in pairs(params) do + print(k,v) + end + end + print('[----------------------]') +end + +function CmdLine:text(txt) + txt = txt or '' + assert(type(txt) == 'string') + table.insert(self.helplines, txt) +end + +function CmdLine:help(arg) + io.write('Usage: ') + if arg then io.write(arg[0] .. ' ') end + io.write('[options]') + for i=1,#self.arguments do + io.write(' <' .. strip(self.arguments[i].key) .. '>') + end + io.write('\n') + + -- first pass to compute max length + local optsz = 0 + for _,option in ipairs(self.helplines) do + if type(option) == 'table' then + if option.default ~= nil then -- it is an option + if #option.key > optsz then + optsz = #option.key + end + else -- it is an argument + if #strip(option.key)+2 > optsz then + optsz = #strip(option.key)+2 + end + end + end + end + + -- second pass to print + for _,option in ipairs(self.helplines) do + if type(option) == 'table' then + io.write(' ') + if option.default ~= nil then -- it is an option + io.write(pad(option.key, optsz)) + if option.help then io.write(' ' .. option.help) end + io.write(' [' .. tostring(option.default) .. ']') + else -- it is an argument + io.write(pad('<' .. strip(option.key) .. '>', optsz)) + if option.help then io.write(' ' .. option.help) end + end + else + io.write(option) -- just some additional help + end + io.write('\n') + end +end |