From: Thomas Walker Lynch Date: Fri, 8 Nov 2024 16:02:26 +0000 (+0000) Subject: .gitignore was missing in scratchpad, now added X-Git-Url: https://git.reasoningtechnology.com/style/static/gitweb.css?a=commitdiff_plain;h=22af20169edff28bbb1dd12e1d5917ed2bef9adc;p=Ariadne .gitignore was missing in scratchpad, now added --- diff --git a/developer/javac/#Ariadne_GraphDirectedAcyclic.java# b/developer/javac/#Ariadne_GraphDirectedAcyclic.java# new file mode 100644 index 0000000..26d01b2 --- /dev/null +++ b/developer/javac/#Ariadne_GraphDirectedAcyclic.java# @@ -0,0 +1,214 @@ +xopackage com.ReasoningTechnology.Ariadne; + +import java.util.HashMap; +import java.util.Map; +import java.util.List; +import java.util.ArrayList; + +public class Ariadne_GraphDirectedAcyclic extends Ariadne_Graph { + + /*-------------------------------------------------------------------------------- + Constructors + */ + + public Ariadne_GraphDirectedAcyclic(Map node_map, Ariadne_ProductionList recognizer_f_list, Ariadne_LabelList root_node_list, int max_depth, boolean verbose) { + super(node_map, recognizer_f_list); + Ariadne_TokenSet cycle_detection_result = graph_mark_cycles(root_node_list, max_depth, verbose); + } + + public Ariadne_GraphDirectedAcyclic(Map node_map, Ariadne_ProductionList recognizer_f_list, Ariadne_LabelList root_node_list) { + super(node_map, recognizer_f_list); + Ariadne_TokenSet cycle_detection_result = graph_mark_cycles(root_node_list); + } + + /*-------------------------------------------------------------------------------- + Instance Data Extension + */ + + private static boolean debug = true; + + /*-------------------------------------------------------------------------------- + Interface + */ + + private List path_find_cycle(Ariadne_LabelList path) { + if (path.size() <= 1) return null; + + int rightmost_index = path.size() - 1; + Ariadne_Label rightmost_node_label = path.get(rightmost_index); + + int cycle_leftmost_index = path.indexOf(rightmost_node_label); + Boolean has_cycle = cycle_leftmost_index < rightmost_index; + if (!has_cycle) return null; + + List result = new ArrayList<>(); + result.add(cycle_leftmost_index); + result.add(rightmost_index); + return result; + } + + private boolean graph_descend_cycle_case(Ariadne_LabelList left_path, List path_stack, boolean verbose) { + + List cycle_index_interval = path_find_cycle(left_path); + if (cycle_index_interval == null) { + return false; + } + + int cycle_i0 = cycle_index_interval.get(0); + int cycle_n = cycle_index_interval.get(1); + + if (verbose) Ariadne_Util.print_list( + "Found cycle:", + left_path.subList(cycle_i0, cycle_n + 1) + ); + + Ariadne_LabelList undefined_node_list = new Ariadne_LabelList(); + for (int i = cycle_i0; i <= cycle_n; i++) { + Ariadne_Label node_label = left_path.get(i); + Ariadne_Node node = super.lookup(node_label); + if (node != null) { + node.mark(new Ariadne_Token("cycle_member")); + } else { + undefined_node_list.add(node_label); + } + } + + if (verbose) Ariadne_Util.print_list( + "Each undefined node could not be marked as a cycle member:", + undefined_node_list + ); + + path_stack.subList(cycle_i0 + 1, cycle_n + 1).clear(); + + return true; + } + + private static Ariadne_TokenSet graph_descend_set = new Ariadne_TokenSet() {{ + add(new Ariadne_Token("empty_path_stack")); + add(new Ariadne_Token("cycle_found")); + add(new Ariadne_Token("undefined_node")); + add(new Ariadne_Token("leaf")); + add(new Ariadne_Token("max_depth_reached")); + }}; + + private Ariadne_TokenSet graph_descend(List path_stack, int max_depth, boolean verbose) { + Ariadne_TokenSet ret_value = new Ariadne_TokenSet(); + + if (path_stack.isEmpty()) { + ret_value.add(new Ariadne_Token("empty_path_stack")); + return ret_value; + } + + Ariadne_LabelList left_path = new Ariadne_LabelList(); + for (Ariadne_LabelList neighbor_list : path_stack) { + left_path.add(neighbor_list.get(0)); + } + + do { + + if (graph_descend_cycle_case(left_path, path_stack, verbose)) { + ret_value.add(new Ariadne_Token("cycle_found")); + return ret_value; + } + + Ariadne_Label it_node_label = path_stack.get(path_stack.size() - 1).get(0); + Ariadne_Node it_node = super.lookup(it_node_label); + if (it_node == null) { + ret_value.add(new Ariadne_Token("undefined_node")); + return ret_value; + } + + Ariadne_LabelList neighbor_list = it_node.neighbor_LabelList(); + if (neighbor_list.isEmpty()) { + ret_value.add(new Ariadne_Token("leaf")); + return ret_value; + } + + path_stack.add(new Ariadne_LabelList(neighbor_list)); + Ariadne_Label it_next_label = neighbor_list.get(0); + left_path.add(it_next_label); + + if (max_depth > 0) { + max_depth--; + if (max_depth == 0) { + if (verbose) { + Ariadne_Util.print_list("GraphDirectedAcyclic.GraphDescend:: max_depth reached, ending descent:", path_stack); + } + ret_value.add(new Ariadne_Token("max_depth_reached")); + return ret_value; + } + } + + } while (true); + } + + public static Ariadne_TokenSet graph_mark_cycles_set = new Ariadne_TokenSet() {{ + add(new Ariadne_Token("empty_root_label_list")); + add(new Ariadne_Token("cycle_exists")); + add(new Ariadne_Token("undefined_node_exists")); + add(new Ariadne_Token("bad_descent_termination")); + add(new Ariadne_Token("max_depth_reached")); + }}; + + public Ariadne_TokenSet graph_mark_cycles(Ariadne_LabelList root_node_LabelList, int max_depth, boolean verbose) { + Ariadne_TokenSet ret_value = new Ariadne_TokenSet(); + boolean exists_malformed = false; + Ariadne_TokenSet result; + + if (root_node_LabelList.isEmpty()) { + ret_value.add(new Ariadne_Token("empty_root_label_list")); + return ret_value; + } + + List path_stack = new ArrayList<>(); + path_stack.add(new Ariadne_LabelList(root_node_LabelList)); + + do { + result = graph_descend(path_stack, max_depth, verbose); + if (result.contains(new Ariadne_Token("cycle_found"))) ret_value.add(new Ariadne_Token("cycle_exists")); + if (result.contains(new Ariadne_Token("undefined_node"))) ret_value.add(new Ariadne_Token("undefined_node_exists")); + if (result.contains(new Ariadne_Token("max_depth_reached"))) ret_value.add(new Ariadne_Token("max_depth_reached")); + if (!result.contains(new Ariadne_Token("leaf")) && !result.contains(new Ariadne_Token("cycle_found"))) ret_value.add(new Ariadne_Token("bad_descent_termination")); + + Ariadne_LabelList top_list = path_stack.get(path_stack.size() - 1); + top_list.remove(0); + if (top_list.isEmpty()) path_stack.remove(path_stack.size() - 1); + + } while (!path_stack.isEmpty()); + + if (verbose) { + if (ret_value.contains("bad_descent_termination")) { + System.out.println("GraphDirectedAcyclic.graph_mark_cycles:: terminated with unexpected condition."); + } + if (ret_value.contains("cycle_exists")) { + System.out.println("GraphDirectedAcyclic.graph_mark_cycles:: One or more cycles detected."); + } + if (ret_value.contains("undefined_node_exists")) { + System.out.println("GraphDirectedAcyclic.graph_mark_cycles:: Undefined nodes exist."); + } + } + + return ret_value; + } + + public Ariadne_TokenSet graph_mark_cycles(Ariadne_LabelList root_node_LabelList) { + return graph_mark_cycles(root_node_LabelList, this.debug ? 40 : -1, this.debug); + } + + @Override + public Ariadne_Node lookup(Ariadne_Label node_label, boolean verbose) { + Ariadne_Node node = super.lookup(node_label, verbose); + if (node != null && node.has_mark(new Ariadne_Token("cycle_member"))) { + if (verbose) { + System.out.println("GraphDirectedAcyclic.lookup:: Node is part of a cycle, not returned: " + node_label); + } + return null; + } + return node; + } + + public Ariadne_Node lookup(Ariadne_Label node_label) { + return lookup(node_label, this.debug); + } + +} diff --git a/developer/scratchpad/.gitignore b/developer/scratchpad/.gitignore new file mode 100644 index 0000000..120f485 --- /dev/null +++ b/developer/scratchpad/.gitignore @@ -0,0 +1,2 @@ +* +!/.gitignore diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_File.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_File.class deleted file mode 100644 index 4b98d49..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_File.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Graph.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Graph.class deleted file mode 100644 index 62d3324..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Graph.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic$1.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic$1.class deleted file mode 100644 index 93f660e..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic$1.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic$2.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic$2.class deleted file mode 100644 index 44ebef8..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic$2.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic.class deleted file mode 100644 index ea91787..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_GraphDirectedAcyclic.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Label.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Label.class deleted file mode 100644 index 21983fd..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Label.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_LabelList.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_LabelList.class deleted file mode 100644 index 079acaf..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_LabelList.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Node.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Node.class deleted file mode 100644 index e03285e..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Node.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_NodeList.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_NodeList.class deleted file mode 100644 index f7d264b..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_NodeList.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Production.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Production.class deleted file mode 100644 index 776a9af..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Production.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_ProductionList.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_ProductionList.class deleted file mode 100644 index c02c0d1..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_ProductionList.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Token.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Token.class deleted file mode 100644 index 7924271..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Token.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_TokenSet.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_TokenSet.class deleted file mode 100644 index c623bdc..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_TokenSet.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Util.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Util.class deleted file mode 100644 index cd8d2d7..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Ariadne_Util.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.class deleted file mode 100644 index ff433cb..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.java b/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.java deleted file mode 100644 index 825b499..0000000 --- a/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.ReasoningTechnology.Ariadne; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Ariadne_File { - static boolean debug = false; - - public static Map unpack_file_path(String file_fp) { - if (debug) System.out.println("unpack_file_path::file_fp: " + file_fp); - - // Use java.io.File explicitly to avoid conflict with the custom Ariadne_File class - java.io.File file = new java.io.File(file_fp); - String parent_dp = (file.getParent() != null) ? file.getParent() : ""; - - if (!parent_dp.isEmpty() && !parent_dp.endsWith(java.io.File.separator)) { - parent_dp += java.io.File.separator; - } - - String file_fn = file.getName(); - String file_fn_base = file_fn; - String file_fn_ext = ""; - - int last_index = file_fn.lastIndexOf('.'); - if (last_index > 0) { - file_fn_base = file_fn.substring(0, last_index); - if (last_index + 1 < file_fn.length()) { - file_fn_ext = file_fn.substring(last_index + 1); - } - } - - Map ret_val = new HashMap<>(); - ret_val.put("dp", parent_dp); - ret_val.put("fn", file_fn); - ret_val.put("fn_base", file_fn_base); - ret_val.put("fn_ext", file_fn_ext); - - if (debug) System.out.println("unpack_file_path::ret_val: " + ret_val); - - return ret_val; - } - - public static boolean file_exists_q(String fp_string) { - Path fp_object = Paths.get(fp_string); - return Files.exists(fp_object); - } - - /* - Given a target_fp and a list of dependency_fp. - - Returns false if the target is newer than all dependencies or if a file is missing; - otherwise, returns true. - */ - public static boolean newer_than_all(String target_fp_string, List dependency_fp_list) throws IOException { - Path target_fp_object = Paths.get(target_fp_string); - if (!Files.exists(target_fp_object)) return false; - - long target_last_modified_time = Files.getLastModifiedTime(target_fp_object).toMillis(); - - return dependency_fp_list.stream().allMatch(dependency_fp -> { - try { - Path dependency_fp_object = Paths.get(dependency_fp); - if (!Files.exists(dependency_fp_object)) return false; - long dependency_last_modified_time = Files.getLastModifiedTime(dependency_fp_object).toMillis(); - return target_last_modified_time > dependency_last_modified_time; - } catch (IOException e) { - return false; - } - }); - } -} diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.class deleted file mode 100644 index 36d6001..0000000 Binary files a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.class and /dev/null differ diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.java b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.java deleted file mode 100644 index d50c429..0000000 --- a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.ReasoningTechnology.Ariadne; - -import java.util.HashMap; -import java.util.Map; - -public class Graph{ - - /*-------------------------------------------------------------------------------- - constructors - */ - - public Graph(Map