testmodels.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from mongoengine import Document, EmbeddedDocument
  2. from mongoengine.fields import *
  3. class Dim(EmbeddedDocument):
  4. x = IntField()
  5. y = IntField()
  6. z = IntField()
  7. class Result(EmbeddedDocument):
  8. originalSize = EmbeddedDocumentField(Dim)
  9. subvolumeSize = EmbeddedDocumentField(Dim)
  10. durationInSec = FloatField()
  11. duration_copy_in_sec = FloatField()
  12. point = EmbeddedDocumentField(Dim)
  13. itemsize = IntField()
  14. @property
  15. def get_copy_throughput(self):
  16. number_of_items = self.itemsize
  17. number_of_items *= self.subvolumeSize.x
  18. number_of_items *= self.subvolumeSize.y
  19. number_of_items *= self.subvolumeSize.z
  20. return number_of_items / self.duration_copy_in_sec / 1024 / 1024
  21. class TestRun(Document):
  22. name = StringField()
  23. volumeId = StringField()
  24. results = ListField(EmbeddedDocumentField(Result))
  25. created = DateTimeField()
  26. meta = { "db_alias": "test_results" }
  27. def addTestResult(self, originalShape, subvolumeShape, subvolumePoint, durationInSec, duration_copy_in_sec, dtype):
  28. result = Result()
  29. inputSize = Dim()
  30. inputSize.z, inputSize.y, inputSize.x = originalShape
  31. result.originalSize = inputSize
  32. subvolumeSize = Dim()
  33. subvolumeSize.z, subvolumeSize.y, subvolumeSize.x = subvolumeShape
  34. result.subvolumeSize = subvolumeSize
  35. point = Dim()
  36. point.x, point.y, point.z = subvolumePoint
  37. result.point = point
  38. result.durationInSec = durationInSec
  39. result.duration_copy_in_sec = duration_copy_in_sec
  40. result.itemsize = dtype.itemsize
  41. TestRun.objects(id=self.id).update_one(push__results=result)
  42. @property
  43. def get_average(self):
  44. if len(self.results) is 0:
  45. return 0
  46. average = 0
  47. for result in self.results:
  48. average += result.durationInSec
  49. return average / len(self.results)
  50. @property
  51. def get_copy_throughput_average(self):
  52. if len(self.results) is 0:
  53. return 0
  54. average = 0
  55. for result in self.results:
  56. average += result.get_copy_throughput
  57. return average / len(self.results)