Hi,

consider WebOfTrust as a graph, consisting of:
- The set of Identities, the vertexes of the graph.
- The set of Score values, the edges of the graph. For each pair of 
OwnIdentity & Identity, such an edge exists. This mail assumes N to be the 
number of those edges.

Currently, a single WOT instance fetches all new trust lists which each of the 
known identities publishes. A new trust list is published whenever someone 
changes a trust value or adds a new identity, etc. So there are MANY trust 
lists published every day.

For each fetched trust list, a score re-computation happens.
The score re-computation is effectively a graph algorithm.
Where N being the number of Score values, it does an amount of O(N) db4o-
queries of the type: getScore(Identity truster, Identity target)

Obviously, such a query is theoretically executable in a time of O(1) by using
a Hashtable<OwnIdentity truster, Hashtable<Identity target, Score score>>.

HOWEVER, db4o does NOT execute it in O(1). It takes an average of O(N), where 
N is the number of Score objects!!! [1]
Therefore, the old implementation of the Score computation algorithm has
an average runtime of O(N^2 * ...) which is VERY bad, N^2 grows insanely fast.

Now the good news is:
I have implemented a branch [2] which DOES reduce the average time of those 
O(N) queries to O(1). It does this by creating a composite primary key (ID) for 
each Score object:
We construct a String ID which is equal to "ID of the truster concatenated 
with the ID of the trustee". We create a db4o index upon those composite IDs.

Now the getScore(Identity truster, Identity target) query does not have 2 
field-value constraints anymore, there is only 1. Therefore, due to the index, 
that query executes in O(1).

We also do this for Trust-queries. This effectively should make WOT usable 
again.

The branch is already fully implemented and I'm doing a test run right now.
The topic of the mail says "almost" done because I have not written code to 
upgrade old databases yet. This is a simple task however, maybe 30 lines of 
code, and I will definitely do it with then next week.

So we can see an optimized WOT build in two weeks I hope.

Greetings, and THANKS FOR YOUR EPIC PATIENCE WITH ME,
        xor


[1] I've written a db4o performance test which proves my theory that queries 
which constrain upon two indexed fields take an average execution time of O(N).
I will publish the test in my next flog update.
[2] https://github.com/freenet/plugin-WoT-staging/tree/o1-trust-score-queries
Especially check out those commits:
https://github.com/freenet/plugin-WoT-staging/commit/c11b3873d8577daf2d405e9819fab184ecffee65
https://github.com/freenet/plugin-WoT-staging/commit/f872741e777e1c1a020f0ef1422b2d0421fe4ad2

Reply via email to