From: <jen...@us...> - 2009-01-11 19:24:47
|
Revision: 1575 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=1575&view=rev Author: jenslehmann Date: 2009-01-11 19:24:30 +0000 (Sun, 11 Jan 2009) Log Message: ----------- made trains example a bit more OWL like Modified Paths: -------------- trunk/examples/trains/trains_owl.conf trunk/src/dl-learner/org/dllearner/algorithms/refexamples/ExampleBasedNode.java trunk/src/dl-learner/org/dllearner/scripts/evaluation/ELOperatorBenchmark.java Added Paths: ----------- trunk/examples/trains/trains2.owl trunk/resources/architecture_large.png Added: trunk/examples/trains/trains2.owl =================================================================== --- trunk/examples/trains/trains2.owl (rev 0) +++ trunk/examples/trains/trains2.owl 2009-01-11 19:24:30 UTC (rev 1575) @@ -0,0 +1,741 @@ +<?xml version="1.0"?> + + +<!DOCTYPE rdf:RDF [ + <!ENTITY foo "http://example.com/foo#" > + <!ENTITY trains "http://example.com/trains#" > + <!ENTITY owl "http://www.w3.org/2002/07/owl#" > + <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > + <!ENTITY owl2xml "http://www.w3.org/2006/12/owl2-xml#" > + <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > + <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" > +]> + + +<rdf:RDF xmlns="http://example.com/trains#" + xml:base="http://example.com/trains" + xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" + xmlns:owl2xml="http://www.w3.org/2006/12/owl2-xml#" + xmlns:owl="http://www.w3.org/2002/07/owl#" + xmlns:xsd="http://www.w3.org/2001/XMLSchema#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:foo="http://example.com/foo#" + xmlns:trains="http://example.com/trains#"> + <owl:Ontology rdf:about=""/> + + + + <!-- + /////////////////////////////////////////////////////////////////////////////////////// + // + // Object Properties + // + /////////////////////////////////////////////////////////////////////////////////////// + --> + + + + + <!-- http://example.com/trains#hasCar --> + + <owl:ObjectProperty rdf:about="#hasCar"> + <rdfs:range rdf:resource="#Car"/> + <rdfs:domain rdf:resource="#Train"/> + </owl:ObjectProperty> + + + + <!-- http://example.com/trains#hasShape --> + + <owl:ObjectProperty rdf:about="#hasShape"/> + + + + <!-- http://example.com/trains#load --> + + <owl:ObjectProperty rdf:about="#load"/> + + + + <!-- http://example.com/trains#loadCount --> + + <owl:ObjectProperty rdf:about="#loadCount"/> + + + + <!-- http://example.com/trains#wheels --> + + <owl:ObjectProperty rdf:about="#wheels"/> + + + + <!-- + /////////////////////////////////////////////////////////////////////////////////////// + // + // Classes + // + /////////////////////////////////////////////////////////////////////////////////////// + --> + + + + + <!-- http://example.com/trains#Car --> + + <owl:Class rdf:about="#Car"/> + + + + <!-- http://example.com/trains#ClosedCar --> + + <owl:Class rdf:about="#ClosedCar"> + <rdfs:subClassOf rdf:resource="#Car"/> + <owl:disjointWith rdf:resource="#OpenCar"/> + </owl:Class> + + + + <!-- http://example.com/trains#DoubleCar --> + + <owl:Class rdf:about="#DoubleCar"> + <rdfs:subClassOf rdf:resource="#Car"/> + </owl:Class> + + + + <!-- http://example.com/trains#JaggedCar --> + + <owl:Class rdf:about="#JaggedCar"> + <rdfs:subClassOf rdf:resource="#Car"/> + </owl:Class> + + + + <!-- http://example.com/trains#LongCar --> + + <owl:Class rdf:about="#LongCar"> + <rdfs:subClassOf rdf:resource="#Car"/> + <owl:disjointWith rdf:resource="#ShortCar"/> + </owl:Class> + + + + <!-- http://example.com/trains#OpenCar --> + + <owl:Class rdf:about="#OpenCar"> + <rdfs:subClassOf rdf:resource="#Car"/> + </owl:Class> + + + + <!-- http://example.com/trains#Shape --> + + <owl:Class rdf:about="#Shape"/> + + + + <!-- http://example.com/trains#ShortCar --> + + <owl:Class rdf:about="#ShortCar"> + <rdfs:subClassOf rdf:resource="#Car"/> + </owl:Class> + + + + <!-- http://example.com/trains#Train --> + + <owl:Class rdf:about="#Train"/> + + + + <!-- http://www.w3.org/2002/07/owl#Thing --> + + <owl:Class rdf:about="&owl;Thing"/> + + + + <!-- + /////////////////////////////////////////////////////////////////////////////////////// + // + // Individuals + // + /////////////////////////////////////////////////////////////////////////////////////// + --> + + + + + <!-- http://example.com/trains#car_101 --> + + <ShortCar rdf:about="#car_101"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#OpenCar"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </ShortCar> + + + + <!-- http://example.com/trains#car_102 --> + + <LongCar rdf:about="#car_102"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#OpenCar"/> + <load rdf:resource="#rectangle"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + <loadCount rdf:resource="#two"/> + </LongCar> + + + + <!-- http://example.com/trains#car_11 --> + + <LongCar rdf:about="#car_11"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#OpenCar"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#rectangle"/> + <loadCount rdf:resource="#three"/> + <wheels rdf:resource="#two"/> + </LongCar> + + + + <!-- http://example.com/trains#car_12 --> + + <Car rdf:about="#car_12"> + <rdf:type rdf:resource="#ClosedCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + </Car> + + + + <!-- http://example.com/trains#car_13 --> + + <Car rdf:about="#car_13"> + <rdf:type rdf:resource="#LongCar"/> + <rdf:type rdf:resource="#OpenCar"/> + <load rdf:resource="#hexagon"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#three"/> + </Car> + + + + <!-- http://example.com/trains#car_14 --> + + <OpenCar rdf:about="#car_14"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ShortCar"/> + <load rdf:resource="#circle"/> + <load rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </OpenCar> + + + + <!-- http://example.com/trains#car_21 --> + + <Car rdf:about="#car_21"> + <rdf:type rdf:resource="#OpenCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </Car> + + + + <!-- http://example.com/trains#car_22 --> + + <ShortCar rdf:about="#car_22"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#OpenCar"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </ShortCar> + + + + <!-- http://example.com/trains#car_23 --> + + <Car rdf:about="#car_23"> + <rdf:type rdf:resource="#ClosedCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <load rdf:resource="#circle"/> + <hasShape rdf:resource="#rectangle"/> + <loadCount rdf:resource="#two"/> + <wheels rdf:resource="#two"/> + </Car> + + + + <!-- http://example.com/trains#car_31 --> + + <ShortCar rdf:about="#car_31"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#OpenCar"/> + <load rdf:resource="#circle"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </ShortCar> + + + + <!-- http://example.com/trains#car_32 --> + + <ShortCar rdf:about="#car_32"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ClosedCar"/> + <hasShape rdf:resource="#hexagon"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + </ShortCar> + + + + <!-- http://example.com/trains#car_33 --> + + <ClosedCar rdf:about="#car_33"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#LongCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#three"/> + <load rdf:resource="#triangle"/> + </ClosedCar> + + + + <!-- http://example.com/trains#car_41 --> + + <Car rdf:about="#car_41"> + <rdf:type rdf:resource="#OpenCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </Car> + + + + <!-- http://example.com/trains#car_42 --> + + <DoubleCar rdf:about="#car_42"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#OpenCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + </DoubleCar> + + + + <!-- http://example.com/trains#car_43 --> + + <ClosedCar rdf:about="#car_43"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ShortCar"/> + <hasShape rdf:resource="#elipse"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </ClosedCar> + + + + <!-- http://example.com/trains#car_44 --> + + <Car rdf:about="#car_44"> + <rdf:type rdf:resource="#OpenCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </Car> + + + + <!-- http://example.com/trains#car_51 --> + + <Car rdf:about="#car_51"> + <rdf:type rdf:resource="#DoubleCar"/> + <rdf:type rdf:resource="#OpenCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + </Car> + + + + <!-- http://example.com/trains#car_52 --> + + <ClosedCar rdf:about="#car_52"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#rectangle"/> + <wheels rdf:resource="#three"/> + </ClosedCar> + + + + <!-- http://example.com/trains#car_53 --> + + <ShortCar rdf:about="#car_53"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ClosedCar"/> + <load rdf:resource="#circle"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </ShortCar> + + + + <!-- http://example.com/trains#car_61 --> + + <LongCar rdf:about="#car_61"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ClosedCar"/> + <load rdf:resource="#circle"/> + <hasShape rdf:resource="#rectangle"/> + <loadCount rdf:resource="#three"/> + <wheels rdf:resource="#two"/> + </LongCar> + + + + <!-- http://example.com/trains#car_62 --> + + <Car rdf:about="#car_62"> + <rdf:type rdf:resource="#OpenCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + </Car> + + + + <!-- http://example.com/trains#car_71 --> + + <ShortCar rdf:about="#car_71"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#DoubleCar"/> + <rdf:type rdf:resource="#OpenCar"/> + <load rdf:resource="#circle"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </ShortCar> + + + + <!-- http://example.com/trains#car_72 --> + + <OpenCar rdf:about="#car_72"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ShortCar"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#triangle"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </OpenCar> + + + + <!-- http://example.com/trains#car_73 --> + + <Car rdf:about="#car_73"> + <rdf:type rdf:resource="#JaggedCar"/> + <rdf:type rdf:resource="#LongCar"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + <loadCount rdf:resource="#zero"/> + </Car> + + + + <!-- http://example.com/trains#car_81 --> + + <LongCar rdf:about="#car_81"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ClosedCar"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#rectangle"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#three"/> + </LongCar> + + + + <!-- http://example.com/trains#car_82 --> + + <OpenCar rdf:about="#car_82"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ShortCar"/> + <load rdf:resource="#circle"/> + <loadCount rdf:resource="#one"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </OpenCar> + + + + <!-- http://example.com/trains#car_91 --> + + <OpenCar rdf:about="#car_91"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#ShortCar"/> + <load rdf:resource="#circle"/> + <loadCount rdf:resource="#one"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </OpenCar> + + + + <!-- http://example.com/trains#car_92 --> + + <Car rdf:about="#car_92"> + <rdf:type rdf:resource="#JaggedCar"/> + <rdf:type rdf:resource="#LongCar"/> + <loadCount rdf:resource="#one"/> + <hasShape rdf:resource="#rectangle"/> + <load rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </Car> + + + + <!-- http://example.com/trains#car_93 --> + + <ShortCar rdf:about="#car_93"> + <rdf:type rdf:resource="#Car"/> + <rdf:type rdf:resource="#OpenCar"/> + <loadCount rdf:resource="#one"/> + <load rdf:resource="#rectangle"/> + <hasShape rdf:resource="#rectangle"/> + <wheels rdf:resource="#two"/> + </ShortCar> + + + + <!-- http://example.com/trains#car_94 --> + + <Car rdf:about="#car_94"> + <rdf:type rdf:resource="#OpenCar"/> + <rdf:type rdf:resource="#ShortCar"/> + <load rdf:resource="#circle"/> + <loadCount rdf:resource="#one"/> + <wheels rdf:resource="#two"/> + <hasShape rdf:resource="#u_shaped"/> + </Car> + + + + <!-- http://example.com/trains#circle --> + + <Shape rdf:about="#circle"/> + + + + <!-- http://example.com/trains#east1 --> + + <Train rdf:about="#east1"> + <hasCar rdf:resource="#car_11"/> + <hasCar rdf:resource="#car_12"/> + <hasCar rdf:resource="#car_13"/> + <hasCar rdf:resource="#car_14"/> + </Train> + + + + <!-- http://example.com/trains#east2 --> + + <Train rdf:about="#east2"> + <hasCar rdf:resource="#car_21"/> + <hasCar rdf:resource="#car_22"/> + <hasCar rdf:resource="#car_23"/> + </Train> + + + + <!-- http://example.com/trains#east3 --> + + <Train rdf:about="#east3"> + <hasCar rdf:resource="#car_31"/> + <hasCar rdf:resource="#car_32"/> + <hasCar rdf:resource="#car_33"/> + </Train> + + + + <!-- http://example.com/trains#east4 --> + + <Train rdf:about="#east4"> + <hasCar rdf:resource="#car_41"/> + <hasCar rdf:resource="#car_42"/> + <hasCar rdf:resource="#car_43"/> + <hasCar rdf:resource="#car_44"/> + </Train> + + + + <!-- http://example.com/trains#east5 --> + + <Train rdf:about="#east5"> + <hasCar rdf:resource="#car_51"/> + <hasCar rdf:resource="#car_52"/> + <hasCar rdf:resource="#car_53"/> + </Train> + + + + <!-- http://example.com/trains#elipse --> + + <Shape rdf:about="#elipse"/> + + + + <!-- http://example.com/trains#hexagon --> + + <Shape rdf:about="#hexagon"/> + + + + <!-- http://example.com/trains#one --> + + <owl:Thing rdf:about="#one"/> + + + + <!-- http://example.com/trains#rectangle --> + + <Shape rdf:about="#rectangle"/> + + + + <!-- http://example.com/trains#three --> + + <owl:Thing rdf:about="#three"/> + + + + <!-- http://example.com/trains#triangle --> + + <Shape rdf:about="#triangle"/> + + + + <!-- http://example.com/trains#two --> + + <owl:Thing rdf:about="#two"/> + + + + <!-- http://example.com/trains#u_shaped --> + + <Shape rdf:about="#u_shaped"/> + + + + <!-- http://example.com/trains#west10 --> + + <Train rdf:about="#west10"> + <hasCar rdf:resource="#car_101"/> + <hasCar rdf:resource="#car_102"/> + </Train> + + + + <!-- http://example.com/trains#west6 --> + + <Train rdf:about="#west6"> + <hasCar rdf:resource="#car_61"/> + <hasCar rdf:resource="#car_62"/> + </Train> + + + + <!-- http://example.com/trains#west7 --> + + <Train rdf:about="#west7"> + <hasCar rdf:resource="#car_71"/> + <hasCar rdf:resource="#car_72"/> + <hasCar rdf:resource="#car_73"/> + </Train> + + + + <!-- http://example.com/trains#west8 --> + + <Train rdf:about="#west8"> + <hasCar rdf:resource="#car_81"/> + <hasCar rdf:resource="#car_82"/> + </Train> + + + + <!-- http://example.com/trains#west9 --> + + <Train rdf:about="#west9"> + <hasCar rdf:resource="#car_91"/> + <hasCar rdf:resource="#car_92"/> + <hasCar rdf:resource="#car_93"/> + <hasCar rdf:resource="#car_94"/> + </Train> + + + + <!-- http://example.com/trains#zero --> + + <owl:Thing rdf:about="#zero"/> + + + + <!-- + /////////////////////////////////////////////////////////////////////////////////////// + // + // General axioms + // + /////////////////////////////////////////////////////////////////////////////////////// + --> + + <rdf:Description> + <rdf:type rdf:resource="&owl;AllDisjointClasses"/> + <owl:members rdf:parseType="Collection"> + <rdf:Description rdf:about="#Car"/> + <rdf:Description rdf:about="#Shape"/> + <rdf:Description rdf:about="#Train"/> + </owl:members> + </rdf:Description> +</rdf:RDF> + + + +<!-- Generated by the OWL API (version 2.2.1.962) http://owlapi.sourceforge.net --> + Modified: trunk/examples/trains/trains_owl.conf =================================================================== --- trunk/examples/trains/trains_owl.conf 2009-01-11 11:53:29 UTC (rev 1574) +++ trunk/examples/trains/trains_owl.conf 2009-01-11 19:24:30 UTC (rev 1575) @@ -5,20 +5,20 @@ * Copyright (C) 2007, Jens Lehmann */ -hidePrefix = "http://example.com/foo#"; +hidePrefix = "http://example.com/trains#"; /*Background knowledge*/ -import("trains.owl"); +import("trains2.owl"); /*Examples*/ -+"http://example.com/foo#east1" -+"http://example.com/foo#east2" -+"http://example.com/foo#east3" -+"http://example.com/foo#east4" -+"http://example.com/foo#east5" --"http://example.com/foo#west6" --"http://example.com/foo#west7" --"http://example.com/foo#west8" --"http://example.com/foo#west9" --"http://example.com/foo#west10" ++"http://example.com/trains#east1" ++"http://example.com/trains#east2" ++"http://example.com/trains#east3" ++"http://example.com/trains#east4" ++"http://example.com/trains#east5" +-"http://example.com/trains#west6" +-"http://example.com/trains#west7" +-"http://example.com/trains#west8" +-"http://example.com/trains#west9" +-"http://example.com/trains#west10" Added: trunk/resources/architecture_large.png =================================================================== (Binary files differ) Property changes on: trunk/resources/architecture_large.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/src/dl-learner/org/dllearner/algorithms/refexamples/ExampleBasedNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/algorithms/refexamples/ExampleBasedNode.java 2009-01-11 11:53:29 UTC (rev 1574) +++ trunk/src/dl-learner/org/dllearner/algorithms/refexamples/ExampleBasedNode.java 2009-01-11 19:24:30 UTC (rev 1575) @@ -183,7 +183,7 @@ } public String getShortDescriptionHTML(int nrOfPositiveExamples, int nrOfNegativeExamples, String baseURI) { - String ret = "<html> " + concept.toString(baseURI,null) + " <i>["; + String ret = "<html><nobr> " + concept.toString(baseURI,null) + " <i>["; if(isTooWeak) ret += "q:tw"; @@ -202,7 +202,7 @@ ret += " ("+qualityEvaluationMethod+"), he:" + horizontalExpansion; ret += " c:" + children.size() + "]"; - return ret + "</i></html>"; + return ret + "</i></nobr></html>"; } //TODO integrate this method with the one above Modified: trunk/src/dl-learner/org/dllearner/scripts/evaluation/ELOperatorBenchmark.java =================================================================== --- trunk/src/dl-learner/org/dllearner/scripts/evaluation/ELOperatorBenchmark.java 2009-01-11 11:53:29 UTC (rev 1574) +++ trunk/src/dl-learner/org/dllearner/scripts/evaluation/ELOperatorBenchmark.java 2009-01-11 19:24:30 UTC (rev 1575) @@ -71,7 +71,7 @@ new File(dir).mkdir(); String example = "/home/jl/promotion/ontologien/galen2.owl"; - testOntology(dir, example, 100, 15); + testOntology(dir, example, 100, 17); System.exit(0); /* TEST ON ARTIFICIAL ONTOLOGIES This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |