On Saturday 26 July 2008 11:48, batosai at freenetproject.org wrote:
> Author: batosai
> Date: 2008-07-26 10:48:02 +0000 (Sat, 26 Jul 2008)
> New Revision: 21418
>
> Modified:
> trunk/apps/WoT/src/plugins/WoT/Identity.java
> trunk/apps/WoT/src/plugins/WoT/Score.java
> trunk/apps/WoT/src/plugins/WoT/WoT.java
> Log:
> Complete rewrite of the WoT's calculating system.
> It is now able to handle any type of trust creation/modification and
capacity lost for identities that have negative score or that are marked down
by the tree owner.
>
> Modified: trunk/apps/WoT/src/plugins/WoT/Identity.java
> ===================================================================
> --- trunk/apps/WoT/src/plugins/WoT/Identity.java 2008-07-26 06:23:42 UTC
(rev 21417)
> +++ trunk/apps/WoT/src/plugins/WoT/Identity.java 2008-07-26 10:48:02 UTC
(rev 21418)
> @@ -96,7 +96,7 @@
> return score.next();
> }
> else {
> - return new Score(treeOwner, this, 0, -1);
> + return new Score(treeOwner, this, 0, -1, 0);
> }
> }
>
>
> Modified: trunk/apps/WoT/src/plugins/WoT/Score.java
> ===================================================================
> --- trunk/apps/WoT/src/plugins/WoT/Score.java 2008-07-26 06:23:42 UTC (rev
21417)
> +++ trunk/apps/WoT/src/plugins/WoT/Score.java 2008-07-26 10:48:02 UTC (rev
21418)
> @@ -11,30 +11,23 @@
> */
> public class Score {
>
> - // Capacity is the maximum amount of points an identity can give to an
other by trusting it.
> - public final static int capacities[] = {
> - 100,// Rank 0 : Own identities
> - 40, // Rank 1 : Identities directly trusted by
> ownIdenties
> - 16, // Rank 2 : Identities trusted by rank 1 identities
> - 6, // So on...
> - 2,
> - 1 // Every identity above rank 5 can give 1 point
> - }; // Identities with negative score have zero
> capacity
> -
> private OwnIdentity treeOwner;
> private Identity target;
> private int score;
> private int rank;
> + private int capacity;
>
> - public Score (OwnIdentity treeOwner, Identity target, int score, int
> rank)
{
> +
> + public Score (OwnIdentity treeOwner, Identity target, int score, int
> rank,
int capacity) {
> this.treeOwner = treeOwner;
> this.target = target;
> this.score = score;
> this.rank = rank;
> + this.capacity = capacity;
> }
>
> public String toString() {
> - return getTarget() + " now has " + getScore() + " points in " +
getTreeOwner() + "'s trust tree (rank " + getRank() + ")";
> + return getTarget() + " has " + getScore() + " points in " +
getTreeOwner() + "'s trust tree (rank : " + getRank() + ", capacity : " +
getCapacity() + ")";
> }
>
> public OwnIdentity getTreeOwner() {
> @@ -68,22 +61,12 @@
> public void setRank(int rank) {
> this.rank = rank;
> }
> -
> +
> public int getCapacity() {
> - if(getScore() > 0 && getRank() >= 0)
> - return capacities[getRank()];
> - else
> - return 0;
> + return capacity;
> }
> -
> - public int getCapacity(int rank) {
> - if(rank != -1)
> - return capacities[rank];
> - else
> - return 0;
> +
> + public void setCapacity(int capacity) {
> + this.capacity = capacity;
> }
> -
> - public int getTrusteesRank() {
> - return (getRank() == -1) ? -1 : getRank() + 1;
> - }
> }
>
> Modified: trunk/apps/WoT/src/plugins/WoT/WoT.java
> ===================================================================
> --- trunk/apps/WoT/src/plugins/WoT/WoT.java 2008-07-26 06:23:42 UTC (rev
21417)
> +++ trunk/apps/WoT/src/plugins/WoT/WoT.java 2008-07-26 10:48:02 UTC (rev
21418)
> @@ -5,20 +5,13 @@
> */
> package plugins.WoT;
>
> -import java.io.IOException;
> -import java.net.UnknownHostException;
> import java.util.Date;
>
> -import javax.xml.parsers.ParserConfigurationException;
> -import javax.xml.transform.TransformerException;
> -
> -import net.pterodactylus.fcp.ClientHello;
> import net.pterodactylus.fcp.FcpConnection;
>
> import com.db4o.Db4o;
> import com.db4o.ObjectContainer;
> import com.db4o.ObjectSet;
> -import com.db4o.query.Query;
>
> /**
> * The Web of Trust
> @@ -28,6 +21,16 @@
> */
> public class WoT {
>
> + // Capacity is the maximum amount of points an identity can give to an
other by trusting it.
> + public final static int capacities[] = {
> + 100,// Rank 0 : Own identities
> + 40, // Rank 1 : Identities directly trusted by
> ownIdenties
> + 16, // Rank 2 : Identities trusted by rank 1 identities
> + 6, // So on...
> + 2,
> + 1 // Every identity above rank 5 can give 1 point
> + }; // Identities with negative score have zero
> capacity
> +
> ObjectContainer db;
>
> /**
> @@ -41,68 +44,105 @@
>
> public void setTrust(Trust newTrust) {
>
> - System.out.println(newTrust);
> + boolean changedTrustValue = false;
> + boolean changedComment = false;
>
> - // We fetch the old trust relationship, or create one if there
> wasn't
> - Trust oldTrust = new Trust(newTrust.getTruster(),
> newTrust.getTrustee(),
0);
> - ObjectSet<Trust> trustResult = db.queryByExample(oldTrust);
> - if(trustResult.size() == 1) oldTrust = trustResult.next();
> + System.out.println("*****" + newTrust);
>
> - // We have to process every trust tree
> - ObjectSet<OwnIdentity> ownIdentites =
db.queryByExample(OwnIdentity.class);
> - while(ownIdentites.hasNext()) {
> -
> - OwnIdentity ownIdentity = ownIdentites.next();
> - Score trusterScore =
> newTrust.getTruster().getScore(ownIdentity, db);
> - Score trusteeScore =
> newTrust.getTrustee().getScore(ownIdentity, db);
> + ObjectSet<Trust> trustResult = db.queryByExample(new
Trust(newTrust.getTruster(), newTrust.getTrustee(), 0));
> + if(trustResult.size() != 0) {
> + Trust oldTrust = trustResult.next();
> + if(oldTrust.getValue() != newTrust.getValue()) {
> + changedTrustValue = true;
> + oldTrust.setValue(newTrust.getValue());
> + }
> + if(oldTrust.getComment() != newTrust.getComment()) {
> + changedComment = true;
> + oldTrust.setComment(newTrust.getComment());
> + }
> + if(changedComment || changedTrustValue)
> db.store(oldTrust);
> + }
> + else {
> + db.store(newTrust);
> + changedTrustValue = true;
> + }
>
> - trusteeScore.setScore(trusteeScore.getScore() -
> (oldTrust.getValue() *
trusterScore.getCapacity() / 100));
> - trusteeScore.setScore(trusteeScore.getScore() +
> (newTrust.getValue() *
trusterScore.getCapacity() / 100));
> + if(changedTrustValue) {
> + ObjectSet<OwnIdentity> ownIdentites =
db.queryByExample(OwnIdentity.class);
> + while(ownIdentites.hasNext()) {
> + updateScore(ownIdentites.next(),
> newTrust.getTrustee());
> + }
> + }
> + }
> +
> + /**
> + * Computes an id's score in a particular trust tree.
> + * @param treeOwner The owner of the trust tree
> + * @param identity The identity you want to update the score
> + */
> + private void updateScore(OwnIdentity treeOwner, Identity identity) {
> +
> + Score score;
> +
> + int oldCapacity = 0;
> + int newScore = 0;
> + int newRank = -1;
> + int newCapacity = 0;
> + boolean hasNegativeTrust = false;
> +
> +
> + ObjectSet<Score> scoreResult = db.queryByExample(new
> Score(treeOwner,
identity, 0, 0, 0));
> + if(scoreResult.hasNext()) {
> + score = scoreResult.next();
> + oldCapacity = score.getCapacity();
> + }
> + else score = new Score(treeOwner, identity, 0, -1, 0);
> +
> + ObjectSet<Trust> trustResult = db.queryByExample(new
> Trust(treeOwner,
identity, 0));
> + if(trustResult.hasNext()) {
> + Trust trust = trustResult.next();
> + if(trust.getValue() <= 0) hasNegativeTrust = true;
> + }
> +
> + ObjectSet<Trust> trusters = db.queryByExample(new Trust(null,
> identity,
0));
> + while(trusters.hasNext()) {
>
> - db.store(trusteeScore);
> -
> - System.out.println(trusteeScore);
> + Trust trusterTrust = trusters.next();
>
> - //TODO Handle the case when the score becomes negative
> (zero capacity)
> + System.out.println("**"+trusterTrust);
>
> - updateCapacity(trusteeScore,
> trusterScore.getTrusteesRank());
> + Score trusterScore;
>
> + ObjectSet<Score> trustersScore = db.queryByExample(new
> Score(treeOwner,
trusterTrust.getTruster(), 0, 0, 0));
> + if(trustersScore.hasNext()) trusterScore =
> trustersScore.next();
> + else trusterScore = new Score(treeOwner,
> trusterTrust.getTruster(),
0, -1, 0);
> +
> + System.out.println("*"+trusterScore);
> +
> + if(trusterScore.getCapacity() > 0) {
> + newScore += trusterScore.getCapacity() *
> trusterTrust.getValue() / 100;
> + if(newRank == -1 || newRank >
> trusterScore.getRank())
> + newRank = trusterScore.getRank();
Surely this should be || newRank < trusterScore.getRank()? Larger numbers =
less trusted, right?
Does the code correctly handle rank upgrades? Downgrades?
> + }
> }
>
> - db.delete(oldTrust);
> - db.store(newTrust);
> - }
> + if(newRank != -1) newRank++; // We don't want to give the
> trustee the
same rank as the truster, right ?
> + if((newScore > 0) && !hasNegativeTrust) newCapacity =
capacities[newRank];
>
> - public void updateCapacity(Score identityScore, int newRank) {
> -
> - if(newRank < identityScore.getRank() || identityScore.getRank()
> < 0) {
> -
> - System.out.println(identityScore.getTarget() + " has
> been promoted to
rank " + newRank + "\n");
> -
> - int oldRank = identityScore.getRank();
> - identityScore.setRank(newRank);
> - db.store(identityScore);
> -
> - ObjectSet<Trust> trustList = db.queryByExample(new
Trust(identityScore.getTarget(), null, 0));
> - while(trustList.hasNext()) {
> - Trust trust = trustList.next();
> - Score trusteeScore =
trust.getTrustee().getScore(identityScore.getTreeOwner(), db);
> -
> - trusteeScore.setScore(trusteeScore.getScore() -
> (trust.getValue() *
identityScore.getCapacity(oldRank) / 100));
> - trusteeScore.setScore(trusteeScore.getScore() +
> (trust.getValue() *
identityScore.getCapacity() / 100));
> -
> - db.store(trusteeScore);
> -
> - System.out.println(identityScore.getTarget() +
> "'s trustee " +
trusteeScore);
> -
> - updateCapacity(trusteeScore,
> identityScore.getTrusteesRank()); //
Recurse through the Trust Tree to update ranks and recalculate scores.
> -
> + score.setScore(newScore);
> + score.setRank(newRank);
> + score.setCapacity(newCapacity);
> + db.store(score);
> +
> + System.out.println(score);
> +
> + if(oldCapacity != newCapacity) {
> + ObjectSet<Trust> trustees = db.queryByExample(new
> Trust(identity, null,
0));
> + while(trustees.hasNext()) {
> + Trust trustee = trustees.next();
> + updateScore(treeOwner,trustee.getTrustee());
> }
> }
> - else {
> - // Nothing to do
> - System.out.println(identityScore.getTarget() + "
> already is at rank " +
identityScore.getRank() + "\n");
> - }
> }
>
> /**
> @@ -131,7 +171,7 @@
> while (result.hasNext()) { db.delete(result.next()); }
>
> OwnIdentity root = new OwnIdentity("root", "root", new
> Date(), new
Date(), 0, true);
> - Score initScore = new Score(root,root,100,0);
> + Score initScore = new Score(root,root,100,0,100);
> Identity a = new Identity("a", new Date(), 0, true);
> Identity b = new Identity("b", new Date(), 0, true);
> Identity c = new Identity("c", new Date(), 0, true);
> @@ -147,7 +187,7 @@
> wot.setTrust(new Trust(b, c, 50, "Like him"));
> wot.setTrust(new Trust(a, b, 100, "He's my brother"));
> wot.setTrust(new Trust(root, b, 30, "Looks like a nice
> guy"));
> - wot.setTrust(new Trust(root, b, 60, "In fact, he is
> !"));
> + wot.setTrust(new Trust(root, b, -100, "That was a trap
> !"));
>
> System.out.println("\n***** Trust objects in the
> database :");
> ObjectSet<Trust> trustList =
> db.queryByExample(Trust.class);
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20080805/14d13704/attachment.pgp>