You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2008/06/01 20:05:15 UTC

svn commit: r662257 - in /maven/sandbox/trunk/mercury: ./ lib/ src/main/java/org/apache/maven/mercury/metadata/ src/test/java/org/apache/maven/mercury/metadata/sat/

Author: jvanzyl
Date: Sun Jun  1 11:05:15 2008
New Revision: 662257

URL: http://svn.apache.org/viewvc?rev=662257&view=rev
Log:
MARTIFACT-20: Starting out use the SAT solver to resolve version ranges
Submitted by: Oleg Gusakov


Added:
    maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/
    maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/SatFeedTest.java   (with props)
Modified:
    maven/sandbox/trunk/mercury/lib/install.sh
    maven/sandbox/trunk/mercury/pom.xml
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java

Modified: maven/sandbox/trunk/mercury/lib/install.sh
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/lib/install.sh?rev=662257&r1=662256&r2=662257&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/lib/install.sh (original)
+++ maven/sandbox/trunk/mercury/lib/install.sh Sun Jun  1 11:05:15 2008
@@ -1,2 +1,2 @@
 mvn install:install-file -Dfile=org.sat4j.core.jar -DgroupId=org.sat4j -Dpackaging=jar -DartifactId=org.sat4j.core -Dversion=2.0.0.v20080430 -DgeneratePom=true -DgenerateChecksum=true
-mvn install:install-file -Dfile=org.sat4j.core.jar -DgroupId=org.sat4j -Dpackaging=jar -DartifactId=org.sat4j.pb -Dversion=2.0.0.v20080430 -DgeneratePom=true -DgenerateChecksum=true
+mvn install:install-file -Dfile=org.sat4j.pb.jar -DgroupId=org.sat4j -Dpackaging=jar -DartifactId=org.sat4j.pb -Dversion=2.0.0.v20080430 -DgeneratePom=true -DgenerateChecksum=true

Modified: maven/sandbox/trunk/mercury/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/pom.xml?rev=662257&r1=662256&r2=662257&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/pom.xml (original)
+++ maven/sandbox/trunk/mercury/pom.xml Sun Jun  1 11:05:15 2008
@@ -75,6 +75,7 @@
           </execution>
         </executions>
       </plugin>      
+      <!--
       <plugin>
         <groupId>com.google.code.maven-license-plugin</groupId>
         <artifactId>maven-license-plugin</artifactId>
@@ -89,6 +90,7 @@
           <useDefaultMapping>true</useDefaultMapping>
         </configuration>
       </plugin>
+      -->
     </plugins>
   </build>
   <dependencies>

Modified: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java?rev=662257&r1=662256&r2=662257&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java (original)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java Sun Jun  1 11:05:15 2008
@@ -51,6 +51,42 @@
     /** error message  */
     private String error;
 
+    //------------------------------------------------------------------
+    /**
+     * group:artifact:version:classifier:packaging
+     */
+    public ArtifactMetadata( String name )
+    {
+      if( name == null )
+        return;
+      
+      String [] tokens = name.split(":");
+      
+      if( tokens == null || tokens.length < 1 )
+        return;
+ 
+      int count = tokens.length;
+      
+    this.groupId = nullify( tokens[0] );
+
+    if( count > 1 )
+      this.artifactId = nullify( tokens[1] );
+    
+    if( count > 2 )
+      this.version = nullify( tokens[2] );
+    
+    if( count > 3 )
+      this.classifier = nullify( tokens[3] );
+    
+    if( count > 4 )
+      this.type = nullify( tokens[4] );
+    }
+    private static final String nullify( String s )
+    {
+      if( s == null || s.length() < 1 )
+        return null;
+      return s;
+    }
     public ArtifactMetadata( String groupId, String name, String version )
     {
         this( groupId, name, version, null );

Modified: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java?rev=662257&r1=662256&r2=662257&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java (original)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeNode.java Sun Jun  1 11:05:15 2008
@@ -11,35 +11,55 @@
 
 public class MetadataTreeNode
 {
-    ArtifactMetadata md; // this node
+  ArtifactMetadata md; // this node
 
-    MetadataTreeNode parent; // papa
+  MetadataTreeNode parent; // papa
 
-    /** default # of children. Used for tree creation optimization only */
-    int nChildren = 8;
+  /** default # of children. Used for tree creation optimization only */
+  int nChildren = 8;
 
-    MetadataTreeNode[] children; // of cause
-
-    public int getNChildren()
-	{
-		return nChildren;
-	}
+  MetadataTreeNode[] children; // of cause
 
+  //------------------------------------------------------------------------
+  public int countNodes()
+  {
+    return countNodes(this);
+  }
+  //------------------------------------------------------------------------
+  public int countNodes( MetadataTreeNode node )
+  {
+    int res = 1;
+    
+    if( children != null && children.length > 0)
+    {
+      for( MetadataTreeNode child : children )
+      {
+        res += countNodes( child );
+      }
+    }
+    
+    return res;
+  }
+  //------------------------------------------------------------------------
+  public int getNChildren()
+  {
+    return nChildren;
+  }
+  //------------------------------------------------------------------------
 	public void setNChildren(int children)
 	{
 		nChildren = children;
 	}
-
 	//------------------------------------------------------------------------
-    public MetadataTreeNode()
-    {
-    }
-    //------------------------------------------------------------------------
-    public MetadataTreeNode( ArtifactMetadata md,
+  public MetadataTreeNode()
+  {
+  }
+  //------------------------------------------------------------------------
+  public MetadataTreeNode( ArtifactMetadata md,
                              MetadataTreeNode parent,
                              boolean resolved,
                              ArtifactScopeEnum scope )
-    {
+  {
         if ( md != null )
         {
             md.setArtifactScope( ArtifactScopeEnum.checkScope(scope) );

Added: maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/SatFeedTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/SatFeedTest.java?rev=662257&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/SatFeedTest.java (added)
+++ maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/SatFeedTest.java Sun Jun  1 11:05:15 2008
@@ -0,0 +1,217 @@
+package org.apache.maven.mercury.metadata.sat;
+
+import java.math.BigInteger;
+
+import junit.framework.TestCase;
+
+import org.sat4j.core.Vec;
+import org.sat4j.core.VecInt;
+import org.sat4j.pb.IPBSolver;
+import org.sat4j.pb.SolverFactory;
+import org.sat4j.specs.ContradictionException;
+import org.sat4j.specs.TimeoutException;
+
+/**
+ * @author <a href="oleg@codehaus.org">Oleg Gusakov</a>
+ */
+public class SatFeedTest
+extends TestCase
+{
+  IPBSolver pbSolver;
+  
+  int [][] svars = new int [][]
+  { 
+            { 1 }
+          , { 2 }
+  };
+  BigInteger [] scoeffs = new BigInteger [] { BigInteger.ONE };
+  
+  int [][] vars = new int [][]
+  { 
+          { 1, 2, 3 }
+        , { 1, 2, 4 }
+        , { 2, 3, 4 }
+  };
+  BigInteger [] coeffs = new BigInteger [] { BigInteger.ONE, BigInteger.ONE, BigInteger.ONE };
+  //---------------------------------------------------------------
+  @Override
+  protected void setUp() throws Exception
+  {
+    super.setUp();
+    pbSolver = SolverFactory.newEclipseP2(); //.newDefault();
+    pbSolver.setTimeout( 60 );
+//    int [] explainVars = new int [] { 0, 1, 2, 3 };
+//    pbSolver.setListOfVariablesForExplanation( new VecInt(explainVars) );
+  }
+  //---------------------------------------------------------------
+  private void showRes( String msg )
+  {
+
+    System.out.println("\n----  "+msg+"  -------------" );
+    int [] m = pbSolver.model();
+
+    if( m != null )
+    {
+      for( int i=1; i<=pbSolver.nVars(); i++ )
+        System.out.print(" x"+i+"="+pbSolver.model(i) );
+
+      System.out.print( "\nModel: " );
+      for( int i=0; i<m.length; i++ )
+        System.out.print(" "+m[i]);
+    }
+    else
+      System.out.print(" null model :(");
+    
+    System.out.println("\n----------------------------");
+  }
+  //---------------------------------------------------------------
+  public void testSimpleFeed()
+  throws ContradictionException, TimeoutException
+  {
+    String title = "x1 is true";
+    pbSolver.newVar(2);
+    // x1 >= 1
+    pbSolver.addPseudoBoolean(
+        new VecInt(svars[0])
+      , new Vec<BigInteger>( scoeffs )
+      , true, new BigInteger("1") 
+      );
+    // x2 < 1
+    pbSolver.addPseudoBoolean(
+        new VecInt(svars[1])
+      , new Vec<BigInteger>( scoeffs )
+      , false, new BigInteger("1") 
+      );
+    
+    boolean satisfiable = pbSolver.isSatisfiable();
+    assert satisfiable : "Cannot find a solution to "+title+" problem";
+    showRes( title );
+  }
+  //---------------------------------------------------------------
+  public void testFeed()
+  throws ContradictionException, TimeoutException
+  {
+    String title = "4 var system";
+    pbSolver.newVar(4);
+    // x1 + x2 + x3 >= 2
+    pbSolver.addPseudoBoolean(
+        new VecInt(vars[0])
+      , new Vec<BigInteger>( coeffs )
+      , true, new BigInteger("2") 
+      );
+    // x1 + x2 + x4 >= 2
+    pbSolver.addPseudoBoolean(
+        new VecInt(vars[1])
+      , new Vec<BigInteger>( coeffs )
+      , true, new BigInteger("2") 
+      );
+    // x2 + x3 + x4 < 2
+    pbSolver.addPseudoBoolean(
+        new VecInt(vars[2])
+      , new Vec<BigInteger>( coeffs )
+      , false, new BigInteger("2") 
+      );
+
+    boolean satisfiable = pbSolver.isSatisfiable();
+    assert satisfiable : "Cannot find a solution to "+title+" problem";
+    showRes( title );
+  }
+  //---------------------------------------------------------------
+  public void testEqalityFeed()
+  throws ContradictionException, TimeoutException
+  {
+    String title = "Equality";
+    pbSolver.newVar(2);
+    // atleast( 1, {x1,x2} )
+    // x1+x2 >= 1 
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2 )
+      , SatHelper.getBigOnes(2)
+      , true, new BigInteger("1") 
+      );
+    // atmost( 1 ,{x1,x2} )
+    // (1-x1) + (1-x2)  >= (2-1)=1
+    // 2-x1-x2 >= 1
+    // -x1-x2 >= -1
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2 )
+      , SatHelper.getBigOnes( 2, true )
+      , true, new BigInteger("-1")
+      );
+    
+    boolean satisfiable = pbSolver.isSatisfiable();
+    assert satisfiable : "Cannot find a solution to "+title+" problem";
+    showRes( title );
+  }
+  //---------------------------------------------------------------
+  public void testEqality3Feed()
+  throws ContradictionException, TimeoutException
+  {
+    String title = "Equality 3 vars";
+    pbSolver.newVar(3);
+    // atleast( 1, {x1,x2,x3} )
+    // x1+x2 >= 1 
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2, 3 )
+      , SatHelper.getBigOnes(3)
+      , true, new BigInteger("1") 
+      );
+    // atmost( 1 ,{x1,x2} )
+    // (1-x1) + (1-x2)  >= (2-1)=1
+    // 2-x1-x2 >= 1
+    // -x1-x2 >= -1
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2, 3 )
+      , SatHelper.getBigOnes( 3, true )
+      , true, new BigInteger("-1")
+      );
+    
+    boolean satisfiable = pbSolver.isSatisfiable();
+    assert satisfiable : "Cannot find a solution to "+title+" problem";
+    showRes( title );
+  }
+  //---------------------------------------------------------------
+  public void testEqality4Feed()
+  throws ContradictionException, TimeoutException
+  {
+    String title = "Equality 4 vars";
+    pbSolver.newVar(4);
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2, 3, 4 )
+      , SatHelper.getBigOnes(4)
+      , true, new BigInteger("1") 
+      );
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2, 3, 4 )
+      , SatHelper.getBigOnes( 4, true )
+      , true, new BigInteger("-1")
+      );
+    
+    boolean satisfiable = pbSolver.isSatisfiable();
+    assert satisfiable : "Cannot find a solution to "+title+" problem";
+    showRes( title );
+  }
+  //---------------------------------------------------------------
+  public void testEqalityRealFeed()
+  throws ContradictionException, TimeoutException
+  {
+    String title = "Equality Real problem";
+    pbSolver.newVar(4);
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2, 3, 4 )
+      , SatHelper.getBigOnes(4)
+      , true, new BigInteger("1") 
+      );
+    pbSolver.addPseudoBoolean(
+        SatHelper.getSmallOnes( 1, 2, 3, 4 )
+      , SatHelper.getBigOnes( 4, true )
+      , true, new BigInteger("-1")
+      );
+    
+    boolean satisfiable = pbSolver.isSatisfiable();
+    assert satisfiable : "Cannot find a solution to "+title+" problem";
+    showRes( title );
+  }
+  //---------------------------------------------------------------
+  //---------------------------------------------------------------
+}

Propchange: maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/SatFeedTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/sat/SatFeedTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"