removed old graphs
[p2pool.git] / p2pool / util / vector.py
1 from __future__ import absolute_import, division
2
3 import math
4
5 class Vector(tuple):
6     for name, operator in [("neg", "-%s"), ("pos", "+%s"), ("abs", "abs(%s)")]:
7         exec("def __%s__(self): return Vector(%s for x in self)" % (name, operator % "x"))
8     
9     for name, operator in [
10         ("add", "%s+%s"), ("sub", "%s-%s"), ("mul", "%s*%s"), ("truediv", "%s/%s"), ("floordiv", "%s//%s"),
11         ("call", "%s(%s)"),
12     ]:
13         exec("""def __%s__(self, other):
14         try:
15             return %s(%s for x, y in zip(self, other))
16         except:
17             return Vector(%s for x in self)""" % (name, "sum" if name == "mul" else "Vector", operator % ("x", "y"), operator % ("x", "other")))
18         exec("""def __r%s__(self, other):
19         try:
20             return %s(%s for x, y in zip(self, other))
21         except:
22             return Vector(%s for x in self)""" % (name, "sum" if name == "mul" else "Vector", operator % ("y", "x"), operator % ("other", "x")))
23     
24     def __mod__((x, y, z), (X, Y, Z)):
25         return Vector([y*Z-z*Y, z*X-x*Z, x*Y-y*X])
26     
27     def __rmod__((X, Y, Z), (x, y, z)):
28         return Vector([y*Z-z*Y, z*X-x*Z, x*Y-y*X])
29     
30     def __repr__(self):
31         return 'v%s' % tuple.__repr__(self)
32     
33     def __getitem__(self, item):
34         if isinstance(item, slice):
35             return Vector(tuple.__getitem__(self, item))
36         else:
37             return tuple.__getitem__(self, item)
38     
39     def __getslice__(self, i, j):
40         return self.__getitem__(slice(i, j))
41     
42     def mag(self):
43         return math.sqrt(self*self)
44     
45     def unit(self):
46         m = self.mag()
47         if m == 0:
48             return self
49         return (1/m)*self
50     
51     @property
52     def rounded(self):
53         return Vector(int(x + .5) for x in self)
54     
55     @property
56     def truncated(self):
57         return Vector(int(x) for x in self)
58
59 def v(*args):
60     return Vector(args)