From f9154ab425d5d5914ae6c408b783928388e98b35 Mon Sep 17 00:00:00 2001
From: David Sehnal <david.sehnal@gmail.com>
Date: Sun, 12 Nov 2017 00:51:02 +0100
Subject: [PATCH] more chunker updates

---
 src/mol-util/computation.ts | 20 +++++++++++++++++---
 src/script.ts               |  2 +-
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/mol-util/computation.ts b/src/mol-util/computation.ts
index 81f92920a..3d956de70 100644
--- a/src/mol-util/computation.ts
+++ b/src/mol-util/computation.ts
@@ -221,7 +221,10 @@ class ChunkerImpl implements Computation.Chunker {
     private updater: Computation.Context['update'];
 
     private computeChunkSize(delta: number) {
-        if (!delta) return this.nextChunkSize;
+        if (!delta) {
+            this.processedSinceUpdate = 0;
+            return this.nextChunkSize;
+        }
         const rate = (this.context as ObservableContext).updateRate || DefaulUpdateRateMs;
         const ret = Math.round(this.processedSinceUpdate * rate / delta + 1);
         this.processedSinceUpdate = 0;
@@ -241,23 +244,34 @@ class ChunkerImpl implements Computation.Chunker {
 
     async process(nextChunk: (size: number) => number, update: (updater: Computation.Context['update']) => Promise<void> | void, nextChunkSize?: number) {
         if (typeof nextChunkSize !== 'undefined') this.setNextChunkSize(nextChunkSize);
+        this.processedSinceUpdate = 0;
 
         // track time for the actual computation and exclude the "update time"
         let chunkStart = Computation.now();
         let lastChunkSize: number;
+        let chunkCount = 0;
+        let totalSize = 0;
+        let updateCount = 0;
         while ((lastChunkSize = nextChunk(this.getNextChunkSize())) > 0) {
+            chunkCount++;
             this.processedSinceUpdate += lastChunkSize;
+            totalSize += lastChunkSize;
             if (this.context.requiresUpdate) {
                 let time = Computation.now();
                 await update(this.updater);
-                this.nextChunkSize = this.computeChunkSize(time - chunkStart);
+                this.nextChunkSize = updateCount > 0
+                    ? Math.round((totalSize + this.computeChunkSize(time - chunkStart)) / (chunkCount + 1))
+                    : this.computeChunkSize(time - chunkStart)
+                updateCount++;
                 chunkStart = Computation.now();
             }
         }
         if (this.context.requiresUpdate) {
             let time = Computation.now();
             await update(this.updater);
-            this.nextChunkSize = this.computeChunkSize(time - chunkStart);
+            this.nextChunkSize = updateCount > 0
+                ? Math.round((totalSize + this.computeChunkSize(time - chunkStart)) / (chunkCount + 1))
+                : this.computeChunkSize(time - chunkStart)
         }
     }
 
diff --git a/src/script.ts b/src/script.ts
index 03ac84b99..de1047e64 100644
--- a/src/script.ts
+++ b/src/script.ts
@@ -148,7 +148,7 @@ async function runCIF(input: string | Uint8Array) {
 export async function _cif() {
     let path = `./examples/1grm_updated.cif`;
     // path = '../test/3j3q.cif'  // lets have a relative path for big test files
-    //path = 'e:/test/quick/3j3q_updated.cif';
+    // path = 'e:/test/quick/3j3q_updated.cif';
     const input = await readFileAsync(path, 'utf8')
     console.log('------------------');
     console.log('Text CIF:');
-- 
GitLab