public static bool ParseCommandLine(string[] args)
{
for (int i = 0; i < args.Length; i++)
{
string arg = args[i];
if (arg[0] == '-' || arg[0] == '/')
{
string option = arg.TrimStart('/', '-').ToLower();
string param = string.Empty;
int sepIndex = option.IndexOf(':');
if (sepIndex > 0)
{
param = option.Substring(sepIndex + 1);
option = option.Substring(0, sepIndex);
}
else if (sepIndex == 0)
{
PrintZingerHelp(arg, "Malformed option");
return false;
}
switch (option)
{
case "?":
case "h":
{
PrintZingerHelp(null, null);
Environment.Exit((int)ZingerResult.Success);
break;
}
case "fbound":
ZingerConfiguration.zBoundedSearch.FinalExecutionCutOff = int.Parse(param);
break;
case "ibound":
ZingerConfiguration.zBoundedSearch.IterativeIncrement = int.Parse(param);
break;
case "p":
if (param.Length == 0)
{
ZingerConfiguration.DegreeOfParallelism = Environment.ProcessorCount;
}
else
{
ZingerConfiguration.DegreeOfParallelism = int.Parse(param);
}
break;
case "m":
case "multiple":
ZingerConfiguration.StopOnError = false;
break;
case "s":
case "stats":
ZingerConfiguration.PrintStats = true;
break;
case "et":
ZingerConfiguration.EnableTrace = true;
ZingerConfiguration.traceLogFile = param;
break;
case "entirezingtrace":
ZingerConfiguration.DetailedZingTrace = true;
break;
case "ct":
ZingerConfiguration.CompactTraces = true;
break;
case "frontiertodisk":
ZingerConfiguration.FrontierToDisk = true;
break;
case "co":
ZingerConfiguration.NonChooseProbability = double.Parse(param);
break;
case "maxmemory":
ZingerConfiguration.MaxMemoryConsumption = double.Parse(param);
break;
case "maxdfsstack":
ZingerConfiguration.BoundDFSStackLength = int.Parse(param);
break;
case "pb":
ZingerConfiguration.DoPreemptionBounding = true;
break;
case "randomsample":
{
if (param.Length != 0)
{
string pattern = @"(\d+,\d+)";
Match result = Regex.Match(param, pattern);
if (result.Success)
{
ZingerConfiguration.MaxSchedulesPerIteration = int.Parse(result.Value.Split(',').ElementAt(0));
ZingerConfiguration.MaxDepthPerSchedule = int.Parse(result.Value.Split(',').ElementAt(1));
}
else
{
PrintZingerHelp(option, String.Format("Invalid parameter passed with randomsample, expecting (int,int)"));
return false;
}
}
ZingerConfiguration.DoRandomSampling = true;
}
break;
case "depthb":
{
ZingerConfiguration.DoDelayBounding = false;
break;
}
case "sched":
{
try
{
ZingerConfiguration.DoDelayBounding = true;
if (!File.Exists(param))
{
PrintZingerHelp(option, string.Format("File {0} not found", param));
return false;
}
var schedAssembly = Assembly.LoadFrom(param);
if (schedAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerDelayingScheduler")).Count() != 1)
{
ZingerUtilities.PrintErrorMessage(String.Format("Zing Scheduler {0}: Should have (only one) class inheriting the base class ZingerDelayingScheduler", Path.GetFileName(param)));
return false;
}
if (schedAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerSchedulerState")).Count() != 1)
{
ZingerUtilities.PrintErrorMessage(String.Format("Zing Scheduler {0}: Should have (only one) class inheriting the base class IZingerSchedulerState", Path.GetFileName(param)));
return false;
}
// get class name
string schedClassName = schedAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerDelayingScheduler")).First().FullName;
var schedStateClassName = schedAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerSchedulerState")).First().FullName;
var schedClassType = schedAssembly.GetType(schedClassName);
var schedStateClassType = schedAssembly.GetType(schedStateClassName);
ZingerConfiguration.ZExternalScheduler.zDelaySched = Activator.CreateInstance(schedClassType) as ZingerDelayingScheduler;
ZingerConfiguration.ZExternalScheduler.zSchedState = Activator.CreateInstance(schedStateClassType) as ZingerSchedulerState;
}
catch (Exception e)
{
ZingerUtilities.PrintErrorMessage(String.Format("Passed scheduler dll {0} implementing delaying scheduler is Invalid", Path.GetFileName(param)));
ZingerUtilities.PrintErrorMessage(e.Message);
return false;
}
}
break;
case "timeout":
if (param.Length != 0)
{
ZingerConfiguration.Timeout = int.Parse(param);
}
break;
case "bc":
ZingerConfiguration.BoundChoices = true;
ZingerConfiguration.zBoundedSearch.FinalChoiceCutOff = int.Parse(param);
break;
case "ndfsliveness":
ZingerConfiguration.DoNDFSLiveness = true;
break;
case "randomliveness":
ZingerConfiguration.DoLivenessSampling = true;
if (param.Length != 0)
{
string pattern = @"(\d+,\d+)";
Match result = Regex.Match(param, pattern);
if (result.Success)
{
ZingerConfiguration.MaxSchedulesPerIteration = int.Parse(result.Value.Split(',').ElementAt(0));
ZingerConfiguration.MaxDepthPerSchedule = int.Parse(result.Value.Split(',').ElementAt(1));
}
else
{
PrintZingerHelp(option, String.Format("Invalid parameter passed with randomliveness, expecting (int,int)"));
return false;
}
}
break;
case "plugin":
{
if (ZingerConfiguration.DronacharyaEnabled)
{
PrintZingerHelp(option, String.Format("Dronacharya and plugin cannot be enabled together"));
}
try
{
//check if the file exists
if (!File.Exists(param))
{
PrintZingerHelp(option, String.Format("File {0} not found", param));
}
var pluginAssembly = Assembly.LoadFrom(param);
if (pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginInterface")).Count() != 1)
{
ZingerUtilities.PrintErrorMessage(String.Format("Zing plugin {0}: Should have (only one) class inheriting the base class ZingerPluginInterface", param));
return false;
}
if (pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginState")).Count() != 1)
{
ZingerUtilities.PrintErrorMessage(String.Format("Zing plugin {0}: Should have (only one) class inheriting the base class ZingerPluginState", param));
return false;
}
// get class name
string pluginClassName = pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginInterface")).First().FullName;
var pluginStateClassName = pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginState")).First().FullName;
var pluginClassType = pluginAssembly.GetType(pluginClassName);
var pluginStateClassType = pluginAssembly.GetType(pluginStateClassName);
ZingerConfiguration.ZPlugin = new ZingerExternalPlugin();
ZingerConfiguration.ZPlugin.zPlugin = Activator.CreateInstance(pluginClassType) as ZingerPluginInterface;
ZingerConfiguration.ZPlugin.zPluginState = Activator.CreateInstance(pluginStateClassType) as ZingerPluginState;
ZingerConfiguration.IsPluginEnabled = true;
}
catch (Exception e)
{
ZingerUtilities.PrintErrorMessage(String.Format("Passed dll {0} implementing plugin is Invalid", Path.GetFileName(param)));
ZingerUtilities.PrintErrorMessage(e.Message);
return false;
}
}
break;
case "dronacharya":
{
if (ZingerConfiguration.IsPluginEnabled)
{
PrintZingerHelp(option, String.Format("Dronacharya and plugin cannot be enabled together"));
}
ZingerConfiguration.DronacharyaEnabled = true;
ZingerConfiguration.ZDronacharya = new ZingDronacharya(param);
var pluginDll = ZingerConfiguration.ZDronacharya.DronaConfiguration.motionPlannerPluginPath;
try
{
//check if the file exists
if (!File.Exists(pluginDll))
{
PrintZingerHelp(option, String.Format("File {0} not found", pluginDll));
}
var pluginAssembly = Assembly.LoadFrom(pluginDll);
if (pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginInterface")).Count() != 1)
{
ZingerUtilities.PrintErrorMessage(String.Format("Zing plugin {0}: Should have (only one) class inheriting the base class ZingerPluginInterface", pluginDll));
return false;
}
if (pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginState")).Count() != 1)
{
ZingerUtilities.PrintErrorMessage(String.Format("Zing plugin {0}: Should have (only one) class inheriting the base class ZingerPluginState", pluginDll));
return false;
}
// get class name
string pluginClassName = pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginInterface")).First().FullName;
var pluginStateClassName = pluginAssembly.GetTypes().Where(t => (t.BaseType.Name == "ZingerPluginState")).First().FullName;
var pluginClassType = pluginAssembly.GetType(pluginClassName);
var pluginStateClassType = pluginAssembly.GetType(pluginStateClassName);
ZingerConfiguration.ZPlugin = new ZingerExternalPlugin();
ZingerConfiguration.ZPlugin.zPlugin = Activator.CreateInstance(pluginClassType) as ZingerPluginInterface;
ZingerConfiguration.ZPlugin.zPluginState = Activator.CreateInstance(pluginStateClassType) as ZingerPluginState;
}
catch (Exception e)
{
ZingerUtilities.PrintErrorMessage(String.Format("Passed dll {0} implementing plugin is Invalid", Path.GetFileName(param)));
ZingerUtilities.PrintErrorMessage(e.Message);
return false;
}
}
break;
case "dronaworker":
ZingerConfiguration.IsDronaMain = false;
break;
default:
PrintZingerHelp(arg, "Invalid Option");
return false;
}
}
else
{
if (ZingerConfiguration.ZingModelFile != "")
{
PrintZingerHelp(arg, "Only one Zing model may be referenced");
return false;
}
if (!File.Exists(arg))
{
PrintZingerHelp(arg, "Can't find Zing Assembly");
return false;
}
ZingerConfiguration.ZingModelFile = arg;
}
}
if (ZingerConfiguration.ZingModelFile == "")
{
PrintZingerHelp(null, "No Zing Model Specified");
return false;
}
return true;
}