diff options
author | bpodgursky <bpodgursky@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2009-10-15 00:42:07 +0000 |
---|---|---|
committer | bpodgursky <bpodgursky@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2009-10-15 00:42:07 +0000 |
commit | 27926fe3de408cb90048ce7507843fae88add755 (patch) | |
tree | 4de2331e6e193673fb7b41e856370781348367b8 | |
parent | 28560d4a95aeccc74b4b1668ff4830d09b3a1de4 (diff) | |
download | ATCD-27926fe3de408cb90048ce7507843fae88add755.tar.gz |
Thu Oct 15 00:40:20 UTC 2009 Ben Podgursky <bpodgursky@gmail.com>
-rw-r--r-- | C2W/C2W_Demo.cpp | 11 | ||||
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | Planner.cpp | 12 | ||||
-rw-r--r-- | Planner.h | 5 | ||||
-rw-r--r-- | SANet/SANet.cpp | 10 | ||||
-rw-r--r-- | SANet/SANetFileIn.cpp | 4 | ||||
-rw-r--r-- | SA_POP_Types.h | 10 | ||||
-rw-r--r-- | SA_PlanHeuristics.cpp | 34 | ||||
-rw-r--r-- | SA_SchedStrategy.cpp | 11 | ||||
-rw-r--r-- | SA_WorkingPlan.cpp | 52 | ||||
-rw-r--r-- | TaskMapFileIn.cpp | 20 | ||||
-rw-r--r-- | utils/PDDLtoSANetTranslator/PDDLParser/src/PDDLtoSAN.java | 168 | ||||
-rw-r--r-- | utils/PDDLtoSANetTranslator/PDDLParser/src/Translator/PDDL_Translator.java | 283 | ||||
-rw-r--r-- | utils/PDDLtoSANetTranslator/PDDLParser/src/pddl4j/ErrorManager.java | 1 |
14 files changed, 469 insertions, 178 deletions
diff --git a/C2W/C2W_Demo.cpp b/C2W/C2W_Demo.cpp index cf53993bb9a..fb9bbb70abb 100644 --- a/C2W/C2W_Demo.cpp +++ b/C2W/C2W_Demo.cpp @@ -201,7 +201,9 @@ int main (int argc, char* argv[]) tm_in.build_task_map (tm_filename, &builder); - } catch (std::string e) { + } + + catch (std::string e) { std::cerr << "ERROR while building task network and task map from files:"; std::cerr << std::endl; std::cerr << e; @@ -215,7 +217,7 @@ int main (int argc, char* argv[]) - try { + // try { planner = builder.get_planner (); //Set any probabilities not listed in the XML @@ -262,7 +264,9 @@ int main (int argc, char* argv[]) planner->plan (15, goal); - } catch (std::string e) { + //} + /* + catch (std::string e) { std::cerr << "ERROR while planning:" << std::endl; std::cerr << e; delete planner; @@ -270,6 +274,7 @@ int main (int argc, char* argv[]) std::cerr << "UNKNOWN ERROR while planning." << std::endl; delete planner; } + */ bool stop = false; while(!stop) diff --git a/ChangeLog b/ChangeLog index 764d7417046..641f0ffa5c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,34 @@ +Thu Oct 15 00:40:20 UTC 2009 Ben Podgursky <bpodgursky@gmail.com> + + * C2W/C2W_Demo.cpp: + + * Planner.h: + * Planner.cpp: + + * SANet/SANet.cpp: + * SANet/SANetFileIn.cpp: + + * SA_POP_Types.h: + * SA_PlanHeuristics.cpp: + * SA_SchedStrategy.cpp: + * SA_WorkingPlan.cpp: + * TaskMapFileIn.cpp: + + * utils/PDDLtoSANetTranslator/PDDLParser/src/PDDLtoSAN.java: + + * utils/PDDLtoSANetTranslator/PDDLParser/src/Translator/PDDL_Translator.java: + + * utils/PDDLtoSANetTranslator/PDDLParser/src/pddl4j/ErrorManager.java: + + Eliminated initial action + Sun Oct 4 19:44:35 UTC 2009 Ben Podgursky <bpodgursky@gmail.com> * SA_POP_Types.h: * SA_SchedStrategy.cpp: * SA_WorkingPlan.cpp: - Changed debug levels + Changed debug levels Fri Oct 2 23:31:27 UTC 2009 Ben Podgursky <bpodgursky@gmail.com> diff --git a/Planner.cpp b/Planner.cpp index 68adafd2b87..38b0e1f6337 100644 --- a/Planner.cpp +++ b/Planner.cpp @@ -50,9 +50,6 @@ cur_cmd_ (0) this->plan_.task_insts.clear (); this->plan_.threat_links.clear (); - //****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP****TEMP**** - this->init_added = false; - this->not_backtracking.decision_pt = -1; this->not_backtracking.seq_num = -1; this->not_backtracking.step = -1; @@ -365,6 +362,10 @@ const GoalMap& Planner::get_goals (void) // Get a task's name. std::string Planner::get_task_name (TaskID task_id) { + if(task_id == INIT_TASK_ID){ + return "init task"; + } + return this->sanet_->get_task_name (task_id); }; @@ -493,6 +494,11 @@ ResourceID resource_id) // Get all resources used by a task implementation. ResourceMap Planner::get_all_resources (TaskImplID impl_id) { + + if(impl_id == INIT_TASK_IMPL_ID){ + return SA_POP::ResourceMap(); + } + return this->task_map_->get_all_resources (impl_id); }; diff --git a/Planner.h b/Planner.h index 5f75fe82d6b..03efa10247a 100644 --- a/Planner.h +++ b/Planner.h @@ -40,11 +40,6 @@ namespace SA_POP { class Planner { public: - //KILL ME SOON - bool init_added; - - - /// Constructor. Planner (void); diff --git a/SANet/SANet.cpp b/SANet/SANet.cpp index 981ff8e4d49..174183fa444 100644 --- a/SANet/SANet.cpp +++ b/SANet/SANet.cpp @@ -407,16 +407,6 @@ void SANet::Network::update (int max_steps) } } - //Until the initial task is not a task, we need to ensure that it always has a higher - //utility than anything else so it is considered first as a way to satisfy a task. - double max_util = 0; - for(TaskNodeMap::iterator it = task_nodes_.begin(); it != task_nodes_.end(); it++){ - if(it->second->get_pos_util().utility > max_util){ - max_util = it->second->get_pos_util().utility; - } - } - task_nodes_.find(SA_POP::INIT_TASK_ID)->second->set_pos_util(max_util*2); - }; // Update a condition's current value (probability of being true). diff --git a/SANet/SANetFileIn.cpp b/SANet/SANetFileIn.cpp index a8c3c6da4a3..187d9f8a9fe 100644 --- a/SANet/SANetFileIn.cpp +++ b/SANet/SANetFileIn.cpp @@ -186,7 +186,7 @@ void SANetFileIn::build_net (std::string filename, SA_POP::Builder *builder) builder->add_task (nodeID, priorProb, name); } - builder->add_task(SA_POP::INIT_TASK_ID, .5, "initact"); + // builder->add_task(SA_POP::INIT_TASK_ID, .5, "initact"); // Get condition nodes. for (SANet::XML::Network::condNode_iterator iter = xml_net.begin_condNode (); @@ -208,7 +208,7 @@ void SANetFileIn::build_net (std::string filename, SA_POP::Builder *builder) else cond=::SA_POP::DATA; builder->add_cond (nodeID, utility, probTrue, name, cond); - builder->set_effect(SA_POP::INIT_TASK_ID, nodeID, "", (probTrue-.5)*2); +// builder->set_effect(SA_POP::INIT_TASK_ID, nodeID, "", (probTrue-.5)*2); } // Get precondition->task links. diff --git a/SA_POP_Types.h b/SA_POP_Types.h index 9d82845763e..acf1c3a4487 100644 --- a/SA_POP_Types.h +++ b/SA_POP_Types.h @@ -29,10 +29,10 @@ #include "ace/Log_Priority.h" #endif /* SA_POP_HAS_ACE */ -#define MAX_TASK_INSTS 8 + #define SA_POP_DEBUG_VERBOSE 1 #define SA_POP_DEBUG_NORMAL 5 -#define SA_POP_DEBUG_LOW 9 +#define SA_POP_DEBUG_MINIMAL 9 #define SA_POP_DEBUG_HIGH 10 #define _CRTDBG_MAP_ALLOC #if defined (SA_POP_HAS_ACE) @@ -152,6 +152,10 @@ namespace SA_POP { const TaskID INIT_TASK_ID = -5; + const TaskInstID INIT_TASK_INST_ID = -6; + + const int MAX_TASK_INSTS = 12; + /// Type of a task implementation id. /// (must be unique across all task implementations). typedef std::string TaskImplID; @@ -175,6 +179,8 @@ namespace SA_POP { TaskID task_id; }; + + const TaskImplID INIT_TASK_IMPL_ID = "init_impl"; ///List of TaskChoices diff --git a/SA_PlanHeuristics.cpp b/SA_PlanHeuristics.cpp index 11599e60b79..55cda30b758 100644 --- a/SA_PlanHeuristics.cpp +++ b/SA_PlanHeuristics.cpp @@ -187,6 +187,16 @@ TaskChoiceList SA_TaskStrategy::choose_task_fair (Condition open_cond) TaskChoiceList task_list; task_list.clear (); + //If init can handle it, put it on here first + if(this->planner_->get_cond_val(open_cond.id) == open_cond.value){ + TaskChoice init_choice; + init_choice.choice = REUSE_INST; + init_choice.task_id = INIT_TASK_ID; + init_choice.task_inst_id = INIT_TASK_INST_ID; + + task_list.push_back(init_choice); + } + std::vector<SortTaskByTime> tasks_with_existing_instances; for (std::multimap<EUCalc, TaskID>::reverse_iterator iter = task_map.rbegin (); @@ -202,9 +212,6 @@ TaskChoiceList SA_TaskStrategy::choose_task_fair (Condition open_cond) task_list.push_back(task_choice); - - - }else{ SortTaskByTime to_sort; @@ -223,9 +230,9 @@ TaskChoiceList SA_TaskStrategy::choose_task_fair (Condition open_cond) to_sort.note_instance(it->second); } - if(!(iter->second == INIT_TASK_ID && this->planner_->init_added)){ + // if(!(iter->second == INIT_TASK_ID && this->planner_->init_added)){ tasks_with_existing_instances.push_back(to_sort); - } + // } } } @@ -257,9 +264,9 @@ TaskChoiceList SA_TaskStrategy::choose_task (Condition open_cond) { TaskSet tasks = this->planner_->get_satisfying_tasks (open_cond); - if(this->planner_->init_added){ - tasks.erase(INIT_TASK_ID); - } +// if(this->planner_->init_added){ +// tasks.erase(INIT_TASK_ID); +// } // Add tasks to map with EU (to sort). std::multimap<EUCalc, TaskID> task_map; @@ -285,6 +292,17 @@ TaskChoiceList SA_TaskStrategy::choose_task (Condition open_cond) TaskChoiceList task_list; task_list.clear (); + //If init can handle it, put it on here first + if(this->planner_->get_cond_val(open_cond.id) == open_cond.value){ + TaskChoice init_choice; + init_choice.choice = REUSE_INST; + init_choice.task_id = INIT_TASK_ID; + init_choice.task_inst_id = INIT_TASK_INST_ID; + + task_list.push_back(init_choice); + } + + for (std::multimap<EUCalc, TaskID>::reverse_iterator iter = task_map.rbegin (); iter != task_map.rend (); iter++) { diff --git a/SA_SchedStrategy.cpp b/SA_SchedStrategy.cpp index 6000ab3845e..d975bb145c5 100644 --- a/SA_SchedStrategy.cpp +++ b/SA_SchedStrategy.cpp @@ -207,8 +207,15 @@ bool SA_SchedStrategy::satisfy_full_sched () TaskInstEndTimeSet new_execute; new_execute.inst = prev_it->first; - new_execute.end_time = current_execution_time + this->planner_->get_impl(working_plan_tmp->get_impl_id(prev_it->first)) - ->get_duration(); + + + if(prev_it->first == INIT_TASK_INST_ID){ + new_execute.end_time = current_execution_time + 0; + }else{ + new_execute.end_time = current_execution_time + this->planner_->get_impl(working_plan_tmp->get_impl_id(prev_it->first)) + ->get_duration(); + } + executing_tasks.push_back(new_execute); befores.erase(prev_it); } diff --git a/SA_WorkingPlan.cpp b/SA_WorkingPlan.cpp index 8fa2d3e3cc6..b619a1e6d0f 100644 --- a/SA_WorkingPlan.cpp +++ b/SA_WorkingPlan.cpp @@ -70,6 +70,9 @@ add_threats_cmd_ (0) this->precedence_graph_.insert(std::make_pair(SIMUL,temp)); this->precedence_graph_.insert(std::make_pair(UNRANKED,temp)); + this->init_start.insert(std::make_pair(-6, (TimeWindow)std::make_pair(NULL_TIME, NULL_TIME))); + this->init_end.insert(std::make_pair(-6, (TimeWindow)std::make_pair(NULL_TIME, NULL_TIME))); + for(int i = 0; i < 2; i++){ this->init_start.insert(std::make_pair(i,(TimeWindow)std::make_pair(NULL_TIME,NULL_TIME))); this->init_end.insert(std::make_pair(i,(TimeWindow)std::make_pair(NULL_TIME,NULL_TIME))); @@ -80,6 +83,9 @@ add_threats_cmd_ (0) this->no_link.first = -4; this->no_link.second = -4; + this->task_impls_.insert(std::pair<TaskInstID, TaskImplID>(INIT_TASK_INST_ID, INIT_TASK_IMPL_ID)); + this->task_insts_.insert(std::pair<TaskInstID, TaskID>(INIT_TASK_INST_ID, INIT_TASK_ID)); + }; // Destructor. @@ -292,6 +298,10 @@ const TaskInstSet *SA_WorkingPlan::get_prec_set (TaskInstID task_inst, Precedenc // Get task id of a task instance. TaskID SA_WorkingPlan::get_task_from_inst (TaskInstID inst_id) { + if(inst_id == INIT_TASK_INST_ID){ + return INIT_TASK_ID; + } + InstToTaskMap::iterator iter = this->task_insts_.find (inst_id); if (iter == this->task_insts_.end ()) @@ -347,7 +357,7 @@ void SA_WorkingPlan::generate_all_threats(void) debug_text <<" Task (" <<threat_possibility_taskid << ")"<< ": Inst (" <<iterator->first << ")" << std::endl; } debug_text<<std::endl; - SA_POP_DEBUG_STR (SA_POP_DEBUG_LOW, debug_text.str ()); + SA_POP_DEBUG_STR (SA_POP_DEBUG_MINIMAL, debug_text.str ()); debug_text.str(""); debug_text << "SA_WorkingPlan::generate_all_threats: All Causal Threats: " << std::endl; @@ -356,6 +366,11 @@ void SA_WorkingPlan::generate_all_threats(void) for(InstToTaskMap::iterator iterator = this->task_insts_.begin(); iterator != this->task_insts_.end(); iterator++){ TaskInstID threat_possibility = iterator->first; TaskID threat_possibility_taskid = iterator->second; + + if(threat_possibility_taskid == INIT_TASK_ID){ + continue; + } + CondSet set = this->planner_->get_effects(threat_possibility_taskid); //Iterate through the effects of each task instance @@ -375,7 +390,13 @@ void SA_WorkingPlan::generate_all_threats(void) TaskID threatened_task = this->task_insts_.find(causal_threatened.first)->second; SANet::LinkWeight threat_effect = this->planner_->get_link(threat_possibility_taskid, condition.id); - SANet::LinkWeight causal_effect = this->planner_->get_link(threatened_task, causal_threatened.cond.id); + + SANet::LinkWeight causal_effect; + if(threatened_task == INIT_TASK_ID){ + causal_effect = 2*(this->planner_->get_cond_val(causal_threatened.cond.id)-.5); + }else{ + causal_effect = this->planner_->get_link(threatened_task, causal_threatened.cond.id); + } if((threat_effect > 0 && causal_effect < 0 )|| (threat_effect < 0 && causal_effect > 0)){ @@ -600,13 +621,14 @@ void SA_WorkingPlan::execute (SA_AddTaskCmd *cmd) } else if(task_choice.choice == NEW_INST){ - if(task == INIT_TASK_ID && this->planner_->init_added) - { - throw "Reached SA_WorkingPlan::execute (SA_AddTaskCmd *cmd) for Special Initial Action after it was already existing instance tried"; - } + // if(task == INIT_TASK_ID && this->planner_->init_added) + // { + // throw "Reached SA_WorkingPlan::execute (SA_AddTaskCmd *cmd) for Special Initial Action after it was already existing instance tried"; + // } if(task == INIT_TASK_ID){ - this->planner_->init_added = true; + // this->planner_->init_added = true; + bool asdf_problem = true; } task_inst = this->get_next_inst_id (); @@ -769,10 +791,6 @@ void SA_WorkingPlan::undo (SA_AddTaskCmd *cmd) if(cmd->last_task_choice_.choice == NEW_INST){ - if(cmd->last_task_ == INIT_TASK_ID){ - planner_->init_added = false; - } - this->task_insts_.erase (this->task_insts_.find(cmd->last_task_inst_)); }else{ this->reused_insts_.erase(this->reused_insts_.find(cmd->last_task_inst_)); @@ -874,6 +892,11 @@ bool SA_WorkingPlan::execute (SA_AssocTaskImplCmd *cmd) } + + if(cmd->task_inst_ == INIT_TASK_INST_ID){ + this->durations.insert(std::make_pair(cmd->task_inst_, 1)); + } + // Update last implementation to this one and remove it from command. cmd->last_impl_ = cmd->impls_.front (); cmd->impls_.pop_front (); @@ -957,7 +980,7 @@ bool SA_WorkingPlan::execute (SA_ResolveCLThreatCmd * cmd) Condition condition = cmd->condition; - if(task_insts_.find(cmd->second)->second == INIT_TASK_ID){ + if(cmd->second == INIT_TASK_INST_ID){ debug_text << "SA_WorkingPlan::execute (SA_ResolveCLThreatCmd * cmd): Cannot schedule before initial task"<<std::endl; SA_POP_DEBUG_STR (SA_POP_DEBUG_NORMAL, debug_text.str ()); @@ -1608,8 +1631,8 @@ bool SA_WorkingPlan::init_prec_insert(TaskInstID task_inst, SA_AssocTaskImplCmd this->precedence_graph_.find(SIMUL)->second.insert(std::make_pair(task_inst,temp)); - if(init_start.size() <= task_inst){ - for(int i = init_start.size(); i < 100+task_inst; i++){ + if(init_start.size()-1 <= task_inst){ + for(int i = init_start.size()-1; i < 100+task_inst; i++){ this->init_start.insert(std::make_pair(i,(TimeWindow)std::make_pair(NULL_TIME,NULL_TIME))); this->init_end.insert(std::make_pair(i,(TimeWindow)std::make_pair(NULL_TIME,NULL_TIME))); } @@ -2039,6 +2062,7 @@ TaskInstSet SA_WorkingPlan::get_all_insts() /// Check if the instance id already exists and is being reused. bool SA_WorkingPlan::inst_exists (TaskInstID task_inst) { + if(this->task_impls_.find(task_inst)!=this->task_impls_.end()) return true; else return false; } diff --git a/TaskMapFileIn.cpp b/TaskMapFileIn.cpp index 583a95c4551..22ac5a51626 100644 --- a/TaskMapFileIn.cpp +++ b/TaskMapFileIn.cpp @@ -99,15 +99,15 @@ void TaskMapFileIn::build_task_map (std::string filename, Builder *builder) builder->add_task_impl (impl); } - ImplParamSet init_params; - ImplParam init_param; - init_param.id = "test_param1"; - init_param.kind = "test_kind1"; - init_param.value = "test_param_value1"; - init_params.insert (init_param); + // ImplParamSet init_params; + // ImplParam init_param; + // init_param.id = "test_param1"; + // init_param.kind = "test_kind1"; + // init_param.value = "test_param_value1"; + // init_params.insert (init_param); - TaskImpl* initimpl = new TaskImpl ("initact_impl", init_params); - builder->add_task_impl (initimpl); + // TaskImpl* initimpl = new TaskImpl ("initact_impl", init_params); + // builder->add_task_impl (initimpl); // Get resources. for (SA_POP::XML::TaskMap::resource_iterator res_iter = @@ -141,7 +141,7 @@ void TaskMapFileIn::build_task_map (std::string filename, Builder *builder) builder->add_resource (resource); - builder->assoc_impl_with_resource ("initact_impl", resourceID, 1); +// builder->assoc_impl_with_resource ("initact_impl", resourceID, 1); } // Get task to implementation associations. @@ -164,7 +164,7 @@ void TaskMapFileIn::build_task_map (std::string filename, Builder *builder) builder->assoc_task_with_impl (taskID, implID, duration); } - builder->assoc_task_with_impl (INIT_TASK_ID, "initact_impl", 1); + // builder->assoc_task_with_impl (INIT_TASK_ID, "initact_impl", 1); // Get task implementation to resource associations. for (SA_POP::XML::TaskMap::implToResource_iterator iassocr_iter = diff --git a/utils/PDDLtoSANetTranslator/PDDLParser/src/PDDLtoSAN.java b/utils/PDDLtoSANetTranslator/PDDLParser/src/PDDLtoSAN.java index 7ed80fbefe8..341b4162ac9 100644 --- a/utils/PDDLtoSANetTranslator/PDDLParser/src/PDDLtoSAN.java +++ b/utils/PDDLtoSANetTranslator/PDDLParser/src/PDDLtoSAN.java @@ -1,8 +1,18 @@ import java.io.File; import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.Properties; +import java.util.Scanner; import Translator.PDDL_Translator; +import Translator.StatisticsCompilation; +import Translator.StatisticsReport; import pddl4j.Domain; import pddl4j.ErrorManager; @@ -32,15 +42,12 @@ public class PDDLtoSAN { // int cond_combine = new Integer(args[3]); // String output_name = args[4]; - String domain_path = "hanoi.pddl"; - String problem_path = "hanoi-pb1.pddl"; - boolean include_init = false; - int cond_combine = 4; - String output_name = "ferry-orig-pruned"; +// String domain_path = "TPP-domain.pddl"; +// String problem_path = "tpp-p08.pddl"; +// boolean include_init = false; +// int cond_combine = 2; +// String output_name = "ferry-orig-pruned"; - Domain domain = null; - Problem problem = null; - Properties options = new Properties(); options.put("source", Source.V3_0); options.put(RequireKey.STRIPS, true); @@ -49,51 +56,122 @@ public class PDDLtoSAN { options.put(RequireKey.NEGATIVE_PRECONDITIONS, true); options.put(RequireKey.DISJUNCTIVE_PRECONDITIONS, true); options.put(RequireKey.CONDITIONAL_EFFECTS, true); - // options.put(RequireKey.EXISTENTIAL_PRECONDITIONS, true); - // options.put(RequireKey.UNIVERSAL_PRECONDITIONS, true); - - Parser parser = new Parser(options); - - File domain_file = new File(domain_path); - File problem_file = new File(problem_path); + + Map<String, List<String>> domains_to_problems = read_input_file(args[0]); + + // List<StatisticsReport> info_sets = new LinkedList<StatisticsReport>(); + + StatisticsCompilation all_stat_compl = new StatisticsCompilation(); + + for(String domain_path: domains_to_problems.keySet()){ + + StatisticsCompilation stat_compl = new StatisticsCompilation(); + + Domain domain = null; + File domain_file = new File(domain_path); + Parser parser = new Parser(options); + + try { + domain = parser.parse(domain_file); + } catch (FileNotFoundException e) { + System.out.println("Error: domain file "+domain_file+" not found"); + System.exit(0); + } + + for(String problem_path: domains_to_problems.get(domain_path)){ + File problem_file = new File(problem_path); + Problem problem = null; + Parser problem_parser = new Parser(options); + + try { + problem = problem_parser.parse(problem_file); + } catch (FileNotFoundException e) { + System.out.println("Error: problem file "+problem_file+" not found"); + System.exit(0); + } + + PDDLObject obj = problem_parser.link(domain, problem); + ErrorManager mgr = parser.getErrorManager(); + + if (mgr.contains(Message.ERROR)) { + mgr.print(Message.ALL); + mgr.clear(); + System.exit(0); + } + else { + mgr.print(Message.WARNING); + mgr.clear(); + + System.out.println(); + System.out.println("Translating: "+ problem_file+ " " + domain_file); + System.out.println(); + + PDDL_Translator n = new PDDL_Translator(obj, 1, false); + + System.out.println("Done translating"); + System.out.println(" SAN number of conditions: "+ n.getConditonNodeCount()); + System.out.println(" SAN number of actions: " + n.getActionNodeCount()); - try { - domain = parser.parse(domain_file); - } catch (FileNotFoundException e) { - System.out.println("Error: domain file "+domain_file+" not found"); - System.exit(0); + stat_compl.all_reports.add(n.getStatReport()); + all_stat_compl.all_reports.add(n.getStatReport()); + + // n.printSAN(); + // n.write_SAN_to_xml(domain.getDomainName()+"_"+problem.getProblemName()+"-san.xml"); + // n.write_TM_to_xml(domain.getDomainName()+"_"+problem.getProblemName()+"-tm.xml"); + // n.write_goals_to_file(domain.getDomainName()+"_"+problem.getProblemName()+"-goals"); + } + } + + try { + FileWriter fileout = new FileWriter(new File(domain_path+args[1])); + fileout.write(stat_compl.toString()); + fileout.close(); + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + FileWriter fileout; try { - problem = parser.parse(problem_file); - } catch (FileNotFoundException e) { - System.out.println("Error: problem file "+problem_file+" not found"); - System.exit(0); - } + fileout = new FileWriter(new File(args[1])); + fileout.write(all_stat_compl.toString()); + fileout.close(); - PDDLObject obj = parser.link(domain, problem); - - ErrorManager mgr = parser.getErrorManager(); - - if (mgr.contains(Message.ERROR)) { - mgr.print(Message.ALL); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } - else { - mgr.print(Message.WARNING); + + // System.out.println(stat_compl.toString()); + } - System.out.println(); - System.out.println("Translating:"); + public static Map<String, List<String>> read_input_file(String filename){ + //TODO make this work properly + Map<String, List<String>> to_ret = new LinkedHashMap<String, List<String>>(); + Scanner scan = null; + try { + scan = new Scanner(new FileReader(new File(filename))); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + while(scan.hasNext()){ + String domain_name = scan.next(); - PDDL_Translator n = new PDDL_Translator(obj, cond_combine, include_init); + String next = scan.next(); + List<String> problems = new LinkedList<String>(); - System.out.println("Done translating"); - System.out.println(" SAN number of conditions: "+ n.getConditonNodeCount()); - System.out.println(" SAN number of actions: " + n.getActionNodeCount()); - - n.printSAN(); - n.write_SAN_to_xml(output_name+"-san.xml"); - n.write_TM_to_xml(output_name+"-tm.xml"); - n.write_goals_to_file(output_name+"-goals"); + while(!next.equals("END")){ + problems.add(next); + next = scan.next(); + } + to_ret.put(domain_name, problems); } + + return to_ret; } -} +}
\ No newline at end of file diff --git a/utils/PDDLtoSANetTranslator/PDDLParser/src/Translator/PDDL_Translator.java b/utils/PDDLtoSANetTranslator/PDDLParser/src/Translator/PDDL_Translator.java index 05192efcf31..5fd7e8a9099 100644 --- a/utils/PDDLtoSANetTranslator/PDDLParser/src/Translator/PDDL_Translator.java +++ b/utils/PDDLtoSANetTranslator/PDDLParser/src/Translator/PDDL_Translator.java @@ -53,6 +53,8 @@ import javax.xml.transform.stream.*; public class PDDL_Translator { + + StatisticsReport stat_report; Map<String, CondNode> condition_nodes = new LinkedHashMap<String, CondNode>(); Map<String, TaskNode> task_nodes= new LinkedHashMap<String, TaskNode>(); @@ -85,6 +87,8 @@ public class PDDL_Translator { */ public PDDL_Translator(PDDLObject pddl_object, int condition_combine_levels, boolean use_initial_action){ + stat_report = new StatisticsReport(pddl_object.getDomainName(), pddl_object.getProblemName()); + long start_time = new Date().getTime(); init_act_visible = use_initial_action; @@ -140,13 +144,9 @@ public class PDDL_Translator { //Add the initial action in as an anchor--otherwise it would seem that none //of the conditions can come true setup_initial_action(init_act); - - System.out.println(); - System.out.println("Initial Network Statistics: "); - System.out.println(); - calculateNetworkStatistics(); - System.out.println(); - + + calculateNetworkStatistics("before_impossibility_removal"); + System.out.println("Before optimizing: "+ this.task_nodes.size()+" tasks "+ this.condition_nodes.size()+" conditions"); System.out.println("Elapsed: "+ (new Date().getTime()-start_time)); @@ -159,29 +159,22 @@ public class PDDL_Translator { //Basically cut down through the tasks and conditions and only take the relevant //ones - keep_looping = eliminate_irreleevant_tasks_and_conditions()||keep_looping; + // keep_looping = eliminate_irreleevant_tasks_and_conditions()||keep_looping; //Get rid of tasks that take plan backwards and where getting there //helps nothing else - // keep_looping = eliminate_dominated_tasks()||keep_looping; + //////////// keep_looping = eliminate_dominated_tasks()||keep_looping; } while(keep_looping); //Go through and look to see if any conditions can be replaced by a set of other //conditions //TODO maybe try something like a kmap here? - System.out.println(); - System.out.println("Network Statistics Before Condition Combining: "); - System.out.println(); - calculateNetworkStatistics(); - System.out.println(); - - combine_conditions(condition_combine_levels); + + calculateNetworkStatistics("before_cond_combining"); + + // combine_conditions(condition_combine_levels); - System.out.println(); - System.out.println("Network Statistics After Condition Combining: "); - System.out.println(); - calculateNetworkStatistics(); - System.out.println(); + // calculateNetworkStatistics("after_cond_combining"); System.out.println("End elapsed: "+ (new Date().getTime()-start_time)); @@ -192,11 +185,13 @@ public class PDDL_Translator { record_task_impls(); } - private void calculateNetworkStatistics(){ - - System.out.println("Number of conditions: "+this.condition_nodes.size()); - System.out.println("Number of tasks: "+ this.task_nodes.size()); + private void calculateNetworkStatistics(String label){ + System.out.println(); + System.out.println("Network stats at: "+label); + System.out.println(" Number of conditions: "+this.condition_nodes.size()); + System.out.println(" Number of tasks: "+ this.task_nodes.size()); + System.out.println(); int total_precond_links = 0; int num_sat_links = 0; @@ -205,10 +200,15 @@ public class PDDL_Translator { int total_effect_links = 0; - int[] effects_per_cond = new int[condition_nodes.size()]; - int[] preconds_per_cond = new int[condition_nodes.size()]; - int[] effects_per_task = new int[task_nodes.size()-1]; - int[] preconds_per_task = new int[task_nodes.size()-1]; +// int[] effects_per_cond = new int[condition_nodes.size()]; +// int[] preconds_per_cond = new int[condition_nodes.size()]; +// int[] effects_per_task = new int[task_nodes.size()-1]; +// int[] preconds_per_task = new int[task_nodes.size()-1]; + + List<Integer> effects_per_cond = new LinkedList<Integer>(); + List<Integer> preconds_per_cond = new LinkedList<Integer>(); + List<Integer> effects_per_task = new LinkedList<Integer>(); + List<Integer> preconds_per_task = new LinkedList<Integer>(); List<Integer> ways_to_sat_each_precond = new LinkedList<Integer>(); List<Integer> threats_to_each_precond = new LinkedList<Integer>(); @@ -221,7 +221,7 @@ public class PDDL_Translator { for(EffectLink el: cnd.getAffectedBy()){ - if(el.getTaskID().equals("20")){ + if(el.action.getName().equals("initact")){ continue; } @@ -252,9 +252,8 @@ public class PDDL_Translator { total_precond_links++; } - preconds_per_cond[count] = cnd.getPreconditionTo().size(); - - effects_per_cond[count] = cnd.getAffectedBy().size(); + preconds_per_cond.add(cnd.getPreconditionTo().size()); + effects_per_cond.add(cnd.getAffectedBy().size()); count++; } @@ -266,48 +265,185 @@ public class PDDL_Translator { continue; } - effects_per_task[count] = tnd.get_negative_effect_links().size()+tnd.get_positive_effect_links().size(); - preconds_per_task[count] = tnd.get_positive_precondition_links().size()+tnd.get_negative_precondition_links().size(); + effects_per_task.add(tnd.get_negative_effect_links().size()+tnd.get_positive_effect_links().size()); + preconds_per_task.add(tnd.get_positive_precondition_links().size()+tnd.get_negative_precondition_links().size()); count++; } - double avg_effect_each_cond = total_effect_links/(double)condition_nodes.size(); - double avg_precond_each_cond = total_precond_links/(double)condition_nodes.size(); - double avg_effect_each_act = total_effect_links/(double)task_nodes.size(); - double avg_precond_each_act = total_effect_links/(double)task_nodes.size(); - double avg_ways_to_sat_precond = num_sat_links/(double)total_precond_links; - double avg_threats_per_precond = num_threat_links/(double)total_precond_links; - - double stdev_effects_per_cond = get_std_dev(avg_effect_each_cond, effects_per_cond); - double stdev_precond_per_cond = get_std_dev(avg_precond_each_cond, preconds_per_cond); - double stdev_effects_per_task = get_std_dev(avg_effect_each_act, effects_per_task); - double stdev_precond_per_task = get_std_dev(avg_precond_each_act, preconds_per_task); - double stdev_ways_to_sat_precond = get_std_dev(avg_ways_to_sat_precond, ways_to_sat_each_precond); - double stdev_threats_pre_precond = get_std_dev(avg_threats_per_precond, threats_to_each_precond); - - System.out.println("Avg effects per cond: "+ avg_effect_each_cond); - System.out.println(" std dev: "+stdev_effects_per_cond); - System.out.println("Avg precond per cond:" + avg_precond_each_cond); - System.out.println(" std dev: "+stdev_precond_per_cond); - System.out.println("Avg effects per act: " + avg_effect_each_act); - System.out.println(" std dev: "+stdev_effects_per_task); - System.out.println("Avg precond per act: " + avg_precond_each_act); - System.out.println(" std dev: "+stdev_precond_per_task); - System.out.println("Avg ways to satisfy precond: "+ avg_ways_to_sat_precond); - System.out.println(" std dev: "+stdev_ways_to_sat_precond); - System.out.println("Avg threats to precond: "+avg_threats_per_precond); - System.out.println(" std dev: "+stdev_threats_pre_precond); - - //*Num conds STD - //*Num actions STD - //*Average effects to each cond STD - //*Average precond each cond STD - //*average effects each task STD - //*average precond each task STD - - //Average #ways to satisfy each precond - //diameter! + InfoSet info_set = new InfoSet(); + + info_set.total_tasks = this.task_nodes.size() - 1; + info_set.total_conds = this.condition_nodes.size(); + info_set.total_preconds = this.precondition_links.size(); + info_set.total_effects = this.effect_links.size(); + + info_set.effects_per_cond = effects_per_cond; + info_set.preconds_per_cond = preconds_per_cond; + info_set.effects_per_act = effects_per_task; + info_set.preconds_per_act = preconds_per_task; + info_set.satisfiers_per_precond = ways_to_sat_each_precond; + info_set.threats_per_precond = threats_to_each_precond; + + info_set.avg_effects_per_cond = total_effect_links/(double)condition_nodes.size(); + info_set.avg_preconds_per_cond = total_precond_links/(double)condition_nodes.size(); + info_set.avg_effects_per_act = total_effect_links/(double)task_nodes.size(); + info_set.avg_preconds_per_act = total_effect_links/(double)task_nodes.size(); + info_set.avg_satisfiers_per_precond = num_sat_links/(double)total_precond_links; + info_set.avg_threats_per_precond = num_threat_links/(double)total_precond_links; + + info_set.std_dev_effects_per_cond = get_std_dev(info_set.avg_effects_per_cond, effects_per_cond); + info_set.std_dev_preconds_per_cond = get_std_dev(info_set.avg_preconds_per_cond, preconds_per_cond); + info_set.std_dev_effects_per_act = get_std_dev(info_set.avg_effects_per_act, effects_per_task); + info_set.std_dev_preconds_per_act = get_std_dev(info_set.avg_preconds_per_act, preconds_per_task); + info_set.std_dev_satisfiers_per_precond = get_std_dev(info_set.avg_satisfiers_per_precond , ways_to_sat_each_precond); + info_set.std_dev_threats_per_precond = get_std_dev(info_set.avg_threats_per_precond, threats_to_each_precond); + + //Find the probability that an arbitrary precondition has an effect opposite it + + double precond_with_negation = 0; + for(PrecondLink el: this.precondition_links){ + TaskNode tnd = el.action; + + List<EffectLink> all_effects = new LinkedList<EffectLink>(tnd.get_negative_effect_links()); + all_effects.addAll(tnd.get_positive_effect_links()); + + for(EffectLink elk: all_effects){ + if(elk.effect == el.precondition && el.getRequiredState() != (elk.getWeight() == 1)){ + precond_with_negation++; + break; + } + } + } + + info_set.reverse_link_prob = precond_with_negation/this.precondition_links.size(); + // System.out.println(info_set.reverse_link_prob); + + //TODO generate reverse link prob + //TODO generate clustering coeff + //TODO diameter! + // if(!label.equals("before_impossibility_removal")){ + + System.out.println("Generating simplified graph"); + Map<String, SimpleNode> simple_graph = generate_simplified_graph(); + System.out.println("Done generating simplified graph"); + + + List<Double> connectednesses = new LinkedList<Double>(); + + for(SimpleNode sn: simple_graph.values()){ + double connected = 0; + + for(SimpleNode sn_child: sn.neigbors){ + for(SimpleNode sn_child_check: sn.neigbors){ + if(sn_child == sn_child_check){ + continue; + } + if(sn_child.neigbors.contains(sn_child_check)){ + connected++; + } + } + } + // System.out.println("Connected: "+connected); + // System.out.println("Neighbors: "+sn.neigbors.size()); + // if(sn.neigbors.size() > 1) + connectednesses.add((connected)/(sn.neigbors.size()*(sn.neigbors.size()-1))); + // System.out.println((connected)/(sn.neigbors.size()*(sn.neigbors.size()-1))); + } + + double sum = 0; + + for(Double d: connectednesses){ + sum+=d; + } + info_set.clustering_coeff = sum/connectednesses.size(); + // } + + stat_report.reports.put(label, info_set); + } + + public StatisticsReport getStatReport(){ + return stat_report; + } + + private Map<String, SimpleNode> generate_simplified_graph(){ + Map<String, SimpleNode> node_name_to_simple = new LinkedHashMap<String, SimpleNode>(); + + for(String tn: this.task_nodes.keySet()){ + + if(tn.equals("initact")){ + continue; + } + + node_name_to_simple.put(task_nodes.get(tn).getName(), new SimpleNode(tn)); + } + + for(TaskNode tn: this.task_nodes.values()){ + + if(tn.getName().equals("initact")){ + continue; + } + + List<EffectLink> all_effects = new LinkedList<EffectLink>(tn.get_negative_effect_links()); + all_effects.addAll(tn.get_positive_effect_links()); + + for(EffectLink elk: all_effects){ + CondNode condition = elk.effect; + + //All precond from cond + for(PrecondLink pl: condition.getPreconditionTo()){ + TaskNode tn2 = pl.action; + if(tn2 == tn || tn2.getName().equals("initact")){ + continue; + } + + + SimpleNode.connect(node_name_to_simple.get(tn.getName()), node_name_to_simple.get(tn2.getName())); + } + + //All effect from cond + for(EffectLink el: condition.getAffectedBy()){ + TaskNode tn2 = el.action; + if(tn2 == tn || tn2.getName().equals("initact")){ + continue; + } + + // System.out.println(tn2.getNodeID()); + // System.out.println(tn.getName()); + // System.out.println(tn2.getName()); + SimpleNode.connect(node_name_to_simple.get(tn.getName()), node_name_to_simple.get(tn2.getName())); + } + } + + List<PrecondLink> all_preconds = new LinkedList<PrecondLink>(tn.get_negative_precondition_links()); + all_preconds.addAll(tn.get_positive_precondition_links()); + + for(PrecondLink plk: all_preconds){ + CondNode condition = plk.precondition; + + //All precond from cond + for(PrecondLink pl: condition.getPreconditionTo()){ + TaskNode tn2 = pl.action; + if(tn2 == tn || tn2.getName().equals("initact")){ + continue; + } + + SimpleNode.connect(node_name_to_simple.get(tn.getName()), node_name_to_simple.get(tn2.getName())); + } + + //All effect from cond + for(EffectLink el: condition.getAffectedBy()){ + TaskNode tn2 = el.action; + if(tn2 == tn || tn2.getName().equals("initact")){ + continue; + } + + SimpleNode.connect(node_name_to_simple.get(tn.getName()), node_name_to_simple.get(tn2.getName())); + } + } + } + + return node_name_to_simple; } private double get_std_dev(double mean, int[] data){ @@ -425,6 +561,7 @@ public class PDDL_Translator { long intv2 = new Date().getTime(); } + private boolean combine_conditions_aux(List<CondNode> fixed_cnds, int still_to_fix){ if(still_to_fix != 0){ for(CondNode cn: this.condition_nodes.values()){ @@ -2277,7 +2414,7 @@ public class PDDL_Translator { for(TaskNode a: task_nodes.values()){ - if(!init_act_visible && a.getNodeID().equals("20")){ + if(!init_act_visible && a.getName().equals("initact")){ continue; } @@ -2386,7 +2523,7 @@ public class PDDL_Translator { for(EffectLink l: effect_links){ - if(!init_act_visible && l.action.getNodeID().equals("20")){ + if(!init_act_visible && l.action.getName().equals("initact")){ continue; } diff --git a/utils/PDDLtoSANetTranslator/PDDLParser/src/pddl4j/ErrorManager.java b/utils/PDDLtoSANetTranslator/PDDLParser/src/pddl4j/ErrorManager.java index c1e4fcd48a0..e19794961a1 100644 --- a/utils/PDDLtoSANetTranslator/PDDLParser/src/pddl4j/ErrorManager.java +++ b/utils/PDDLtoSANetTranslator/PDDLParser/src/pddl4j/ErrorManager.java @@ -245,6 +245,7 @@ public class ErrorManager { */ public void clear() { this.msg.clear(); + // this.tMsg.clear(); } /** |