Take a look at Tinkerpop's blueprints for a well tested Java API and Archimedes for simple graph operations in Clojure. http://www.tinkerpop.com/ https://github.com/clojurewerkz/archimedes
As far as the suggested protocols go, I would suggest doing something useful with them before opening it up to the community for comments. There's not much there to discuss in terms of merits or anything else. -Zack On Monday, June 17, 2013 4:14:34 PM UTC-4, dgrnbrg wrote: > > I think that there's already a project working on this called Loom. The > furthest-developed fork is here: https://github.com/aysylu/loom which > appears to have protocols for graphs, bindings to Titanium (the > Clojurewerkz graph DB library), visualization support, and implementations > of several algorithms. > > Maybe there's a way to incorporate these projects? > > On Monday, June 17, 2013 3:38:45 PM UTC-4, Stephen Kockentiedt wrote: >> >> Hello, >> >> I want to create a graph API similar to what core.matrix is for matrices. >> I have created some protocols which every graph implementation has to >> satisfy and a prototype implementation. Now I want your feedback on these >> protocols. Which functions do you want to see which aren't there? Which >> functions should be changed? Are there problems with the general design? >> Have you any other feedback? >> >> Here are the protocol definitions: >> >> (defprotocol PGraph >> "Minimal functionality of a graph." >> (directed? [g] >> "Returns true if the graph is directed and false if the >> graph is undirected. If it is undirected, all functions >> taking two nodes must be commutative with regard to >> these nodes.") >> (nodes [g] >> "Returns a set or sequence of all nodes of the graph. May >> not contain duplicates.") >> (has-edge? [g n1 n2] >> "Returns true if the graph g has an edge from node n1 >> to node n2.") >> (direct-successors [g n] >> "Returns a set or sequence of all nodes n2 for which >> (has-edge? g n n2) returns true. May not contain >> duplicates.")) >> >> (defprotocol PPredecessorGraph >> "Optional functionality of a graph which can give a >> list of all direct predecessors of a node." >> (direct-predecessors [g n] >> "Returns a set or sequence of all nodes n2 for which >> (has-edge? g n2 n) returns true. May not contain >> duplicates.")) >> >> (defprotocol PEditableGraph >> "Minimal functionality of an editable graph." >> (mutable? [g] >> "Returns true if the graph is mutated in place. >> If true is returned, the other functions change >> the graph passed as the first argument and return >> the same graph object. If false is returned, the >> functions return a new graph and the old graph is >> unchaged.") >> (add-node [g n] >> "Adds the node n to the graph g. If it already >> contained n, the graph will not be changed.") >> (remove-node [g n] >> "Removes the node n from the graph g. If it did >> not contain n, the graph will not be changed.") >> (add-edge [g n1 n2] >> "Adds an edge from node n1 to node n2 to the graph g. >> If one or both of the nodes is not present it will >> be added to the graph. If the edge was already present, >> the graph will not be changed.") >> (remove-edge [g n1 n2] >> "Removes the edge from node n1 to the node n2 from >> the graph g. If it did not contain the edge, the graph >> will not be changed.")) >> >> (defprotocol PWeightedGraph >> "Functionality of a graph whose edges can be weighted." >> (edge-weight [g n1 n2] >> "Returns the weight of the edge from node n1 to >> node n2.")) >> >> (defprotocol PEditableWeightedGraph >> "Functionality of a weighted graph whose weights can be >> changed." >> (update-edge-weight [g n1 n2 f] >> "Updates the weight of the edge from node n1 to node n2, >> where f is a function taking the old value and returning >> the new one. If the graph did not contain the edge, it >> will be created.")) >> >> (defprotocol PNodeDataGraph >> "Functionality of a graph which stores data with its >> nodes." >> (node-data [g n] >> "Returns the data of the node n.")) >> >> (defprotocol PEditableNodeDataGraph >> "Functionality of a graph which stores editable data >> with its nodes." >> (update-node-data [g n f] >> "Updates the data of the node n, where f is a function >> taking the old value and returning the new one. If the >> graph did not contain the node, it will be added.")) >> >> (defprotocol PEdgeDataGraph >> "Functionality of a graph which stores data with its edges." >> (edge-data [g n1 n2] >> "Returns the data of the edge from node n1 to node n2.")) >> >> (defprotocol PEditableEdgeDataGraph >> "Functionality of a graph which stores editable data >> with its edges." >> (update-edge-data [g n1 n2 f] >> "Changes the data of the edge from node n1 to n2, where >> f is a function taking the old value and returning the >> new one. If the graph did not contain the edge, it will >> be added.")) >> > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.