Skip to content

Commit 1c8fb8d

Browse files
authored
Merge pull request #2431 from AllenInstitute/feature/2431-remove-support-for-unpacked-experiments
Cache fixes, speedups and tests and removal of support for unpacked experiments
2 parents abc0f93 + aee15f3 commit 1c8fb8d

File tree

5 files changed

+217
-19
lines changed

5 files changed

+217
-19
lines changed

Packages/MIES/MIES_AnalysisBrowser.ipf

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ static Function/S AB_GetRowHash(WAVE/T list, variable row)
618618
return WaveHash(rowWave, 4)
619619
End
620620

621-
/// @brief Load waves from a packed/unpacked experiment file
621+
/// @brief Load waves from a packed experiment file
622622
///
623623
/// This function is special as it does change the CDF!
624624
///
@@ -661,12 +661,8 @@ static Function AB_LoadDataWrapper(DFREF tmpDFR, string expFilePath, string data
661661
baseFolder = GetFolder(expFilePath)
662662
extension = GetFileSuffix(expFilePath)
663663

664-
/// @todo this is not 100% correct as users might choose a different name for the unpacked experiment folder
665-
if(!cmpstr(extension, "uxp"))
666-
expFileOrFolder = baseFolder + fileNameWOExtension + " Folder"
667-
else
668-
expFileOrFolder = expFilePath
669-
endif
664+
ASSERT(cmpstr(extension, "uxp"), "No support for unpacked experiments")
665+
expFileOrFolder = expFilePath
670666

671667
DFREF savedDF = GetDataFolderDFR()
672668
SetDataFolder tmpDFR

Packages/MIES/MIES_Cache.ipf

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -583,15 +583,15 @@ threadsafe static Function CA_GetCacheIndex(WAVE keys, string key)
583583

584584
variable numFilledRows
585585

586-
numFilledRows = GetNumberFromWaveNote(keys, NOTE_INDEX) - 1
586+
numFilledRows = GetNumberFromWaveNote(keys, NOTE_INDEX)
587587

588588
ASSERT_TS(!isEmpty(key), "Cache key can not be empty")
589589

590590
if(numFilledRows <= 0)
591591
return NaN
592592
endif
593593

594-
FindValue/TXOP=4/TEXT=key/RMD=[0, numFilledRows] keys
594+
FindValue/TXOP=(1 + 4)/TEXT=key/RMD=[0, numFilledRows] keys
595595

596596
return (V_Value == -1) ? NaN : V_Value
597597
End
@@ -633,16 +633,7 @@ threadsafe Function/WAVE CA_TryFetchingEntryFromCache(string key, [variable opti
633633

634634
ASSERT_TS(index < DimSize(values, ROWS), "Invalid index")
635635
WAVE/Z cache = values[index]
636-
637-
if(!WaveExists(cache))
638-
#ifdef CACHE_DEBUGGING
639-
DEBUGPRINT_TS("Could not find a valid wave for key=", str = key)
640-
#endif // CACHE_DEBUGGING
641-
// invalidate cache entry due to non existent wave,
642-
// this can happen for unpacked experiments which don't store free waves
643-
keys[index] = ""
644-
return $""
645-
endif
636+
ASSERT_TS(WaveExists(cache), "Invalid cache entry due to non existent wave")
646637

647638
WAVE stats = GetCacheStatsWave()
648639
stats[index][%Hits] += 1

Packages/tests/Basic/UTF_Basic_Includes.ipf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "UTF_AnalysisFunctionParameters"
1313
#include "UTF_AnalysisFunctionPrototypes"
1414
#include "UTF_AsynFrameworkTest"
15+
#include "UTF_Cache"
1516
#include "UTF_Configuration"
1617
#include "UTF_DAEphyswoHardware"
1718
#include "UTF_Debugging"

Packages/tests/Basic/UTF_Cache.ipf

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
#pragma TextEncoding="UTF-8"
2+
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
3+
#pragma rtFunctionErrors=1
4+
#pragma ModuleName=CacheTest
5+
6+
static Function CheckCacheWaves(variable idx)
7+
8+
CHECK_GE_VAR(idx, 0)
9+
CHECK(IsFinite(idx))
10+
CHECK(IsInteger(idx))
11+
12+
WAVE keys = GetCacheKeyWave()
13+
CHECK_EQUAL_VAR(GetNumberFromWaveNote(keys, NOTE_INDEX), idx)
14+
15+
WAVE values = GetCacheValueWave()
16+
CHECK_EQUAL_VAR(GetNumberFromWaveNote(values, NOTE_INDEX), idx)
17+
18+
WAVE stats = GetCacheStatsWave()
19+
CHECK_EQUAL_VAR(GetNumberFromWaveNote(stats, NOTE_INDEX), idx)
20+
End
21+
22+
static Function NoMatchWhenEmpty()
23+
24+
string key = "abcd"
25+
26+
WAVE/Z result = CA_TryFetchingEntryFromCache(key)
27+
CHECK_WAVE(result, NULL_WAVE)
28+
End
29+
30+
static Function AssertOnEmptyKey()
31+
32+
try
33+
CA_StoreEntryIntoCache("", {0})
34+
FAIL()
35+
catch
36+
CHECK_NO_RTE()
37+
endtry
38+
39+
try
40+
CA_TryFetchingEntryFromCache("")
41+
FAIL()
42+
catch
43+
CHECK_NO_RTE()
44+
endtry
45+
46+
try
47+
CA_DeleteCacheEntry("")
48+
FAIL()
49+
catch
50+
CHECK_NO_RTE()
51+
endtry
52+
End
53+
54+
static Function TestAddFetch()
55+
56+
string key = "abcd"
57+
58+
Make/FREE val = p
59+
60+
CheckCacheWaves(0)
61+
CA_StoreEntryIntoCache(key, val)
62+
CheckCacheWaves(1)
63+
64+
WAVE/Z result = CA_TryFetchingEntryFromCache(key)
65+
CHECK_WAVE(result, NUMERIC_WAVE)
66+
CHECK_EQUAL_WAVES(result, val)
67+
// returned wave is a copy by default
68+
CHECK(!WaveRefsEqual(result, val))
69+
70+
// and now we overwrite it
71+
Make/FREE valOv = p^2
72+
CA_StoreEntryIntoCache(key, valOv)
73+
CheckCacheWaves(1)
74+
75+
WAVE/Z result = CA_TryFetchingEntryFromCache(key)
76+
CHECK_WAVE(result, NUMERIC_WAVE)
77+
CHECK_EQUAL_WAVES(result, valOv)
78+
CHECK(!WaveRefsEqual(result, valOv))
79+
End
80+
81+
static Function TestAddFetchNoDuplicate()
82+
83+
string key = "abcd"
84+
85+
Make/FREE val = p
86+
87+
// but we can also request the wave itself
88+
CA_StoreEntryIntoCache(key, val, options = CA_OPTS_NO_DUPLICATE)
89+
90+
WAVE/Z result = CA_TryFetchingEntryFromCache(key, options = CA_OPTS_NO_DUPLICATE)
91+
CHECK_WAVE(result, NUMERIC_WAVE)
92+
CHECK_EQUAL_WAVES(result, val)
93+
CHECK(WaveRefsEqual(result, val))
94+
End
95+
96+
static Function TestAddFetchWaveRefWave()
97+
98+
string key = "abcd"
99+
100+
Make/FREE val = p
101+
Make/FREE/WAVE cont = {val}
102+
103+
CA_StoreEntryIntoCache(key, cont)
104+
105+
WAVE/Z/WAVE resultCont = CA_TryFetchingEntryFromCache(key)
106+
CHECK_WAVE(resultCont, WAVE_WAVE)
107+
WAVE/Z result = resultCont[0]
108+
CHECK_EQUAL_WAVES(result, val)
109+
// returned wave is a copy by default
110+
CHECK(!WaveRefsEqual(result, val))
111+
End
112+
113+
static Function TestAddFetchWaveRefWaveNoDuplicate()
114+
115+
string key = "abcd"
116+
117+
Make/FREE val = p
118+
Make/FREE/WAVE cont = {val}
119+
120+
CA_StoreEntryIntoCache(key, cont, options = CA_OPTS_NO_DUPLICATE)
121+
122+
WAVE/Z/WAVE resultCont = CA_TryFetchingEntryFromCache(key, options = CA_OPTS_NO_DUPLICATE)
123+
CHECK(WaveRefsEqual(resultCont, cont))
124+
CHECK_WAVE(resultCont, WAVE_WAVE)
125+
WAVE/Z result = resultCont[0]
126+
CHECK_EQUAL_WAVES(result, val)
127+
CHECK(WaveRefsEqual(result, val))
128+
End
129+
130+
static Function KeyIsCaseSensitive()
131+
132+
string key = "abcd"
133+
134+
Make/FREE val = p
135+
136+
CA_StoreEntryIntoCache(key, val)
137+
WAVE/Z result = CA_TryFetchingEntryFromCache(UpperStr(key))
138+
CHECK_WAVE(result, NULL_WAVE)
139+
End
140+
141+
static Function DeletingEntriesWorks()
142+
143+
variable ret
144+
string key = "abcd"
145+
146+
Make/FREE val = p
147+
148+
CheckCacheWaves(0)
149+
CA_StoreEntryIntoCache(key, val)
150+
CheckCacheWaves(1)
151+
152+
ret = CA_DeleteCacheEntry(key)
153+
CHECK_EQUAL_VAR(ret, 1)
154+
// NOTE_INDEX is not touched
155+
CheckCacheWaves(1)
156+
157+
WAVE/Z result = CA_TryFetchingEntryFromCache(key)
158+
CHECK_WAVE(result, NULL_WAVE)
159+
160+
// entry is no more
161+
ret = CA_DeleteCacheEntry(key)
162+
CHECK_EQUAL_VAR(ret, 0)
163+
End
164+
165+
static Function FlushingCacheRemovesEntries()
166+
167+
variable ret
168+
string key = "abcd"
169+
170+
Make/FREE val = p
171+
172+
CA_StoreEntryIntoCache(key, val)
173+
174+
CA_FlushCache()
175+
WAVE/Z result = CA_TryFetchingEntryFromCache(key)
176+
CHECK_WAVE(result, NULL_WAVE)
177+
End
178+
179+
static Function StatisticsWork()
180+
181+
variable ret, ref
182+
string key, hist
183+
184+
key = "abcd"
185+
186+
Make/FREE val = p
187+
CA_StoreEntryIntoCache(key, val)
188+
189+
WAVE stats = GetCacheStatsWave()
190+
CHECK_EQUAL_VAR(DimSize(stats, COLS), 4)
191+
192+
CHECK_EQUAL_VAR(stats[0][%Hits], 0)
193+
CHECK_EQUAL_VAR(stats[0][%Misses], 1)
194+
CHECK_GT_VAR(stats[0][%ModificationTimestamp], 0)
195+
CHECK_EQUAL_VAR(stats[0][%Size], 1160)
196+
197+
WAVE/Z result = CA_TryFetchingEntryFromCache(key)
198+
CHECK_WAVE(result, NUMERIC_WAVE)
199+
200+
CHECK_EQUAL_VAR(stats[0][%Hits], 1)
201+
CHECK_EQUAL_VAR(stats[0][%Misses], 1)
202+
CHECK_GT_VAR(stats[0][%ModificationTimestamp], 0)
203+
CHECK_EQUAL_VAR(stats[0][%Size], 1160)
204+
205+
ref = CaptureHistoryStart()
206+
CA_OutputCacheStatistics()
207+
hist = CaptureHistory(ref, 1)
208+
CHECK_PROPER_STR(hist)
209+
End

Packages/tests/UTF_HelperFunctions.ipf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,6 +1825,7 @@ static Function/S GetDefaultTestSuitesForExperiment()
18251825
list = AddListItem("UTF_AnalysisFunctionParameters.ipf", list, ";", Inf)
18261826
list = AddListItem("UTF_AnalysisFunctionPrototypes.ipf", list, ";", Inf)
18271827
list = AddListItem("UTF_AsynFrameworkTest.ipf", list, ";", Inf)
1828+
list = AddListItem("UTF_Cache.ipf", list, ";", Inf)
18281829
list = AddListItem("UTF_Debugging.ipf", list, ";", Inf)
18291830
list = AddListItem("UTF_Configuration.ipf", list, ";", Inf)
18301831
list = AddListItem("UTF_DAEphyswoHardware.ipf", list, ";", Inf)

0 commit comments

Comments
 (0)