This is an automated email from the ASF dual-hosted git repository.

davin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/daffodil-vscode.git


The following commit(s) were added to refs/heads/main by this push:
     new 845cbf9  profile graph can be in linear or log scale
845cbf9 is described below

commit 845cbf980839e3b5a85d227ad186332e27feb032
Author: Davin Shearer <[email protected]>
AuthorDate: Thu Aug 10 12:56:39 2023 -0400

    profile graph can be in linear or log scale
---
 src/dataEditor/dataEditorClient.ts                 |  5 +-
 .../DataMetrics/ByteFrequencyGraph.svelte          | 84 ++++++++++++++++------
 src/svelte/src/utilities/display.ts                |  7 +-
 3 files changed, 68 insertions(+), 28 deletions(-)

diff --git a/src/dataEditor/dataEditorClient.ts 
b/src/dataEditor/dataEditorClient.ts
index 1ca350d..9121ca1 100644
--- a/src/dataEditor/dataEditorClient.ts
+++ b/src/dataEditor/dataEditorClient.ts
@@ -121,7 +121,7 @@ class HeartbeatInfo implements IHeartbeatInfo {
 let activeSessions: string[] = []
 let checkpointPath: string = ''
 let client: EditorClient
-let getHeartbeatIntervalId: NodeJS.Timeout | undefined = undefined
+let getHeartbeatIntervalId: NodeJS.Timeout | number | undefined = undefined
 let heartbeatInfo: IHeartbeatInfo = new HeartbeatInfo()
 let omegaEditPort: number = 0
 
@@ -153,7 +153,8 @@ export class DataEditorClient implements vscode.Disposable {
   private omegaSessionId = ''
   private contentType = ''
   private fileSize = 0
-  private sendHeartbeatIntervalId: NodeJS.Timeout | undefined = undefined
+  private sendHeartbeatIntervalId: NodeJS.Timeout | number | undefined =
+    undefined
 
   constructor(
     protected context: vscode.ExtensionContext,
diff --git a/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte 
b/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
index cbbaa92..da7046a 100644
--- a/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
+++ b/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
@@ -46,14 +46,16 @@ limitations under the License.
   let variance: number = 0
   let stdDev: number = 0
   let numAscii: number = 0
-  let isEditing = ''
-  let statusMessage = ''
-  let warningMessage = ''
-  let errorMessage = ''
+  let numDistinct: number = 0
+  let fieldBeingEdited: string = ''
+  let statusMessage: string = ''
+  let warningMessage: string = ''
+  let errorMessage: string = ''
   let statusMessageTimeout: NodeJS.Timeout | null = null
   let warningMessageTimeout: NodeJS.Timeout | null = null
   let errorMessageTimeout: NodeJS.Timeout | null = null
-  let asciiOverlay = true
+  let asciiOverlay: boolean = true
+  let logScale: boolean = false
 
   $: {
     sum = byteProfile.reduce((a, b) => a + b, 0)
@@ -64,6 +66,7 @@ limitations under the License.
     let squareDiffs = byteProfile.map((value) => Math.pow(value - mean, 2))
     variance = squareDiffs.reduce((a, b) => a + b, 0) / squareDiffs.length
     stdDev = Math.sqrt(variance)
+    numDistinct = byteProfile.filter((value) => value > 0).length
 
     colorScaleData = byteProfile.map((value) => {
       if (value < mean - stdDev) return 'low'
@@ -71,7 +74,12 @@ limitations under the License.
       return 'average'
     })
 
-    scaledData = byteProfile.map((d) => Math.round((d / maxFrequency) * 300)) 
// 300 is the max height of the chart
+    scaledData = byteProfile.map((d) => {
+      // Note: 300 is the max height of the chart. byteFrequency values are >= 
0.
+      return logScale
+        ? Math.round((Math.log2(d + 1) / Math.log2(maxFrequency + 1)) * 300) 
// adding 1 to prevent log(0)
+        : Math.round((d / maxFrequency) * 300)
+    })
   }
 
   function setStatusMessage(msg: string, timeout: number = 5000) {
@@ -233,11 +241,11 @@ limitations under the License.
       default:
         break
     }
-    isEditing = ''
+    fieldBeingEdited = ''
     requestSessionProfile(startOffset, length)
   }
   function handleBlur() {
-    isEditing = ''
+    fieldBeingEdited = ''
   }
 
   onMount(() => {
@@ -297,6 +305,18 @@ limitations under the License.
   </div>
   <hr />
   <div>
+    <div class="input-container">
+      <label for="scale"
+        >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scale:
+        <span
+          id="scale"
+          class="editable"
+          on:click={() => {
+            logScale = !logScale
+          }}>{logScale ? 'Logarithmic' : 'Linear'}</span
+        >
+      </label>
+    </div>
     <div class="input-container">
       <label for="ascii-overlay-toggle"
         >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Overlay:
@@ -310,13 +330,15 @@ limitations under the License.
         >
       </label>
     </div>
-    {#if isEditing === 'startOffset'}
+    {#if fieldBeingEdited === 'startOffset'}
       <div class="input-container">
         <label for="start-offset-input" class="label"
           >Start Offset:
           <Input
             id="start-offset-input"
-            placeholder={startOffset.toString($addressRadix)}
+            placeholder="{startOffset.toString($addressRadix)} ({radixToString(
+              $addressRadix
+            )})"
             value={startOffset.toString($addressRadix)}
             on:inputEnter={handleInputEnter}
             on:inputFocusOut={handleBlur}
@@ -329,23 +351,27 @@ limitations under the License.
       <!-- svelte-ignore a11y-click-events-have-key-events -->
       <div
         on:click={() => {
-          isEditing = 'startOffset'
+          fieldBeingEdited = 'startOffset'
         }}
       >
         <label for="start-offset"
           >Start Offset: <span id="start-offset" class="editable"
-            >{startOffset.toString($addressRadix)}</span
+            >{startOffset.toString($addressRadix)} ({radixToString(
+              $addressRadix
+            )})</span
           ></label
         >
       </div>
     {/if}
-    {#if isEditing === 'endOffset'}
+    {#if fieldBeingEdited === 'endOffset'}
       <div class="input-container">
         <label for="end-offset-input" class="label"
           >&nbsp;&nbsp;End Offset:
           <Input
             id="end-offset-input"
-            placeholder={endOffset.toString($addressRadix)}
+            placeholder="{endOffset.toString($addressRadix)} ({radixToString(
+              $addressRadix
+            )})"
             value={endOffset.toString($addressRadix)}
             on:inputEnter={handleInputEnter}
             on:inputFocusOut={handleBlur}
@@ -358,23 +384,27 @@ limitations under the License.
       <!-- svelte-ignore a11y-click-events-have-key-events -->
       <div
         on:click={() => {
-          isEditing = 'endOffset'
+          fieldBeingEdited = 'endOffset'
         }}
       >
         <label for="end-offset"
           >&nbsp;&nbsp;End Offset: <span id="end-offset" class="editable"
-            >{endOffset.toString($addressRadix)}</span
+            >{endOffset.toString($addressRadix)} ({radixToString(
+              $addressRadix
+            )})</span
           ></label
         >
       </div>
     {/if}
-    {#if isEditing === 'length'}
+    {#if fieldBeingEdited === 'length'}
       <div class="input-container">
         <label for="length-input" class="label"
           >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length:
           <Input
             id="length-input"
-            placeholder={length.toString($addressRadix)}
+            placeholder="{length.toString($addressRadix)} ({radixToString(
+              $addressRadix
+            )})"
             value={length.toString($addressRadix)}
             on:inputEnter={handleInputEnter}
             on:inputFocusOut={handleBlur}
@@ -387,13 +417,16 @@ limitations under the License.
       <!-- svelte-ignore a11y-click-events-have-key-events -->
       <div
         on:click={() => {
-          isEditing = 'length'
+          fieldBeingEdited = 'length'
         }}
       >
         <label for="length"
           >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length: <span
             id="length"
-            class="editable">{length.toString($addressRadix)}</span
+            class="editable"
+            >{length.toString($addressRadix)} ({radixToString(
+              $addressRadix
+            )})</span
           ></label
         >
       </div>
@@ -403,7 +436,9 @@ limitations under the License.
   <div class="stats">
     <label for="computed-size"
       >&nbsp;Max Offset: <span id="computed-size" class="nowrap"
-        >{viewport.offsetMax}</span
+        >{viewport.offsetMax.toString($addressRadix)} ({radixToString(
+          $addressRadix
+        )})</span
       ></label
     >
     <label for="min-frequency"
@@ -435,6 +470,11 @@ limitations under the License.
       >&nbsp;Byte Count: <span id="byte-count" class="nowrap">{sum}</span
       ></label
     >
+    <label for="distinct-count"
+      >&nbsp;&nbsp;&nbsp;Distinct: <span id="distinct-count" class="nowrap"
+        >{numDistinct}</span
+      ></label
+    >
     <label for="ascii-count"
       >ASCII Count: <span id="ascii-count" class="nowrap">{numAscii}</span
       ></label
@@ -555,7 +595,7 @@ limitations under the License.
     color: black;
     border: 1px solid blue;
     pointer-events: none;
-    opacity: 0.75;
+    opacity: 0.95;
     font-size: smaller;
   }
 
diff --git a/src/svelte/src/utilities/display.ts 
b/src/svelte/src/utilities/display.ts
index 0e2c14f..939b447 100644
--- a/src/svelte/src/utilities/display.ts
+++ b/src/svelte/src/utilities/display.ts
@@ -58,15 +58,14 @@ export function radixBytePad(radix: RadixValues): number {
 export function radixToString(radix: RadixValues): string {
   switch (radix) {
     case 2:
-      return 'binary'
+      return 'bin'
     case 8:
-      return 'octal'
+      return 'oct'
     case 10:
-      return 'decimal'
+      return 'dec'
     case 16:
       return 'hex'
   }
-  return 'binary'
 }
 
 export function byteDivWidthFromRadix(radix: RadixValues): ByteDivWidth {

Reply via email to