|
|
Line 1: |
Line 1: |
| {{headerQuasiAI|subcat=quasiAI}}
| | <div style="background:#555; border:1px outset azure; padding:0 1em; width:auto; font-name: arial; "> |
| {{headerQATcode|—Category Pairs Expansion }}
| | {{editTemplate|HeaderQATcode}} |
| __TOC__
| | <font style="font-name: arial; color:skyblue; font-size:1.7em;"> |
| | | The QAT Code {{{1}}} |
| <b><big>The 'pair' is combined data values as a token, combined from two channels of time-synchronized data measurements</big></b>
| | </font> |
| | | ---- |
| | | <font style="font-name: arial; color:skyblue; font-size:1.3em;"> |
| == PairsExport ==
| | [[ QAT Code: The Pairs Expansion Method | Pairs Expansion ]] <small><small><sub>if</sub></small></small> |
| <pre style="background:#202; color:lime; border:3px outset black; padding:0 1em; width:auto; overflow:scroll; height:500px; margin:0 3em; font:normal 14px monospace;"> | | [[ QAT Code: The Visual Scatter Method | Visual Scatter ]] <small><small><sub>next</sub></small></small> |
| | | [[ QAT Code: The Visual Gather Method | Visual Gather ]] <small><small><sub>for</sub></small></small> |
| Public Function PairsExport() As Boolean
| | [[ QAT Code: Bracketing Methods | Bracketing Clusters ]] <small><small><sub>wend</sub></small></small> |
| Dim oFile As clsFile
| | [[ QAT Code: Browsing Event Chemistry | Event Chemistry ]] <small><small><sub>wend</sub></small></small> |
| Dim ndx As Long
| | </font> |
| Dim strField() As String 'array
| | </div> |
| Dim colAtoms As Collection
| |
| Dim colLinks As Collection
| |
| Dim strPaired As String
| |
| Dim strJoin As String
| |
| Dim varX As Variant
| |
|
| |
| ' Atom format (Paired)
| |
| ' FirName Tab SecName1 Tab SecName2 Tab ... SecNameX
| |
|
| |
| On Error GoTo Trap
| |
|
| |
| mbooCancel = False
| |
|
| |
| Set colAtoms = New Collection
| |
| Set colLinks = New Collection
| |
|
| |
| With New clsStopWatch
| |
| If mbooMartPulled Then
| |
| .Reset ' Start timer
| |
| RaiseEvent Progress("Pairs Export beginning...")
| |
| ' Enumerate through all Mart array row elements
| |
| ' and construct the Atoms.
| |
| For ndx = 1 To Me.MartCount - 1
| |
| DoEvents 'allowing update of cancellation flag during loop
| |
| If Not mbooCancel Then
| |
| ' Split the outer Mart-array row element into an inner field-array
| |
| strField() = Split(mstrMartArray(ndx), vbTab)
| |
|
| |
| ' Add a new firName to colAtoms
| |
| MergeSecNameByFirName colAtoms, strField(0), strField(1)
| |
|
| |
| If ndx Mod 100 = 0 Then
| |
| RaiseEvent Progress("Assembling atoms: record " & CStr(ndx))
| |
| End If
| |
| Else
| |
| Exit Function
| |
| End If 'Not mbooCancelPairs
| |
| Next
| |
|
| |
| ' Enumerate through all Mart array row elements
| |
| ' and construct the Links.
| |
| For ndx = 1 To Me.MartCount - 1
| |
| DoEvents 'allowing update of cancellation flag during loop
| |
| If Not mbooCancel Then
| |
| ' Split the outer Mart-array row element into an inner field-array
| |
| strField() = Split(mstrMartArray(ndx), vbTab)
| |
|
| |
| ' Add a new SecName to colLinks (notice the parameters are switched)
| |
| MergeSecNameByFirName colLinks, strField(1), strField(0) ' sort when complete
| |
| | |
| If ndx Mod 100 = 0 Then RaiseEvent Progress("Assembling links: record " & CStr(ndx) & "+")
| |
| Else
| |
| Exit Function
| |
| End If 'Not mbooCancelPairs
| |
| Next
| |
|
| |
| ' Output the Links as tabular data
| |
| ndx = 0
| |
| ReDim mstrLinksArray(colLinks.Count - 1)
| |
|
| |
| ' Copy the collection object
| |
| ' into the module links array
| |
| ndx = 0
| |
| For Each varX In colLinks
| |
| mstrLinksArray(ndx) = varX
| |
| ndx = ndx + 1
| |
| Next
| |
|
| |
| ' Sort the new Links array, purely for human-readability, as order is irrelavant.
| |
| QuickSortVariants mstrLinksArray, 0, UBound(mstrLinksArray), 0, UBound(mstrLinksArray)
| |
|
| |
| ' Store the array as a CR delimited
| |
| ' tabular file named Links.txt
| |
| With New clsFile
| |
| .Save Join(mstrLinksArray, vbCrLf), DataFolder & "\Links.txt"
| |
| End With
| |
| RaiseEvent CommandResponse(CStr(ndx) & " Link saved as tabular data to file " & DataFolder & "\Links.txt")
| |
|
| |
| ' Create the paired combinatorics
| |
|
| |
| ' Enumerate atomics, creating a tabulation
| |
| ' by string-concatenation of any new combinatrics
| |
| ' joined from the array returned by the
| |
| ' transform method producing combinatorics.
| |
| ndx = 0
| |
| For Each varX In colAtoms
| |
| strJoin = Join(Combinatorics(varX), vbCrLf)
| |
| If Len(strJoin) Then
| |
| If Len(strPaired) = 0 Then
| |
| strPaired = strJoin
| |
| Else
| |
| strPaired = strPaired & vbCrLf & strJoin
| |
| End If
| |
| End If
| |
| | |
| If ndx Mod 10 = 0 Then RaiseEvent Progress("Combining atom " & CStr(ndx) & "...")
| |
| ndx = ndx + 1
| |
| Next
| |
|
| |
| ' Store the Pairs tabular string data as a string array
| |
| mstrPairsArray = Split(strPaired, vbCrLf)
| |
|
| |
| ' Sort the new Pairs array
| |
| QuickSortVariants mstrPairsArray, 0, UBound(mstrPairsArray), 0, UBound(mstrPairsArray)
| |
| RaiseEvent CommandResponse("Pairs sorted")
| |
|
| |
| ' Transform the array, now sorted
| |
| ' to a string for storage to file
| |
| strPaired = Join(mstrPairsArray, vbCrLf)
| |
|
| |
| ' Save the Pairs array to file
| |
| Set oFile = New clsFile
| |
| oFile.Filespec = DataFolder & "\Paired.txt"
| |
| If oFile.Save(Join(mstrPairsArray, vbCrLf)) Then
| |
|
| |
| mbooPairsExported = True
| |
| PairsExport = mbooPairsExported
| |
| RaiseEvent CommandResponse("Pairs saved as " & DataFolder & "\Paired.txt")
| |
|
| |
| RaiseEvent CommandResponse("Combinatoric-pairs Export complete (Process time: " & CStr(.Elapsed / 1000) & ")")
| |
|
| |
| End If
| |
| Else 'mbooMartPulled
| |
| RaiseEvent CommandResponse("Unable to Export combinatoric-pairs because the Mart Columns have not been pulled")
| |
| End If 'mbooMartPulled
| |
| End With 'New clsStopWatch
| |
|
| |
| Exit Function
| |
| ExitPoint:
| |
| Set colAtoms = Nothing
| |
| Set colLinks = Nothing
| |
| Exit Function
| |
| | |
| Trap:
| |
| RaiseEvent CommandResponse("Error in clsWhse.PairsExport: " & Err.description)
| |
| Resume ExitPoint
| |
| Resume
| |
| End Function
| |
| | |
| </pre> | |
| | |
| == Combinatorics ==
| |
| <pre style="background:#202; color:lime; border:3px outset black; padding:0 1em; width:auto; overflow:scroll; height:500px; margin:0 3em; font:normal 14px monospace;">
| |
| | |
| Public Function Combinatorics(ByVal TabularString As String) As String()
| |
|
| |
| ' Return a string array loaded with all the combinations of SecNames
| |
| ' in TabularString, ignoring the first tabular string entry, which is an Atom FirstName
| |
| Dim maxName As Long
| |
| Dim maxNdx As Long
| |
| Dim moduloNdx As Long
| |
| Dim strCombinations() As String 'array
| |
| Dim strNames() As String 'array
| |
| Dim ndxCombination As Long
| |
| Dim j, k, intLast As Integer
| |
|
| |
| On Error Resume Next
| |
|
| |
| ' TabularString format (Paired)
| |
| ' FirName Tab SecName1 Tab SecName2 Tab SecName3...
| |
|
| |
| With New clsStopWatch
| |
| .Reset
| |
|
| |
| modMain.TrimTrailingCharacters TabularString, vbTab
| |
|
| |
| strNames = Split(TabularString, vbTab)
| |
| 'Note: the first array element is a firstName, not to be combined
| |
|
| |
| maxName = UBound(strNames)
| |
| maxNdx = maxName
| |
|
| |
| If maxName > 1 Then ' 0,1 and 2 elements -- 0= FirName; 1,2= Secnames
| |
|
| |
| ' Redim to something larger than typically expected
| |
| ' Redim again later to size used after loading array
| |
| ReDim strCombinations(maxName * maxName)
| |
|
| |
| 'Debug.Print vbCrLf & "Combining FirName: " & strNames(0)
| |
|
| |
| If mbooCancel Then Exit Function
| |
|
| |
| If maxName > 1 Then ' very key factor
| |
| ' Key factor: if maxName is larger than two (larger than 1 for zero-based array elements)
| |
| ' then at least a pair of mart rows matching columns A-Names
| |
| ' are sharing a B-Name
| |
| For k = 1 To maxName - 1 ' Start with element 1 of the zero-based strNames() array.
| |
| DoEvents
| |
|
| |
| For j = 1 To (maxName - k)
| |
| ' Check array size and redim if more elements are needed
| |
| If ndxCombination > maxNdx Then
| |
| maxNdx = maxNdx + 1000
| |
| ReDim Preserve strCombinations(maxNdx)
| |
| 'Debug.Print "maxNdx: " & maxNdx
| |
| End If
| |
|
| |
| ' Add the combination to the output array
| |
| strCombinations(ndxCombination) = strNames(k) & "**" & strNames(k + j)
| |
|
| |
| 'Debug.Print "(" & CStr(k) & ")-(" & CStr(k + j) & ") = " & strCombinations(ndxCombination)
| |
| ndxCombination = ndxCombination + 1
| |
| If moduloNdx Mod 5 = 0 Then
| |
| RaiseEvent Progress("Expanding combinatorics: " & CStr(moduloNdx))
| |
| DoEvents
| |
| If mbooCancel Then Exit Function
| |
| End If
| |
| Next
| |
| moduloNdx = moduloNdx + 1
| |
| Next
| |
|
| |
| ' Redim the combinations array to the size used
| |
| ReDim Preserve strCombinations(ndxCombination - 1)
| |
|
| |
| ' Return the array
| |
| Combinatorics = strCombinations
| |
|
| |
| End If 'maxName
| |
| Else
| |
| 'Debug.Print vbCrLf & "Skipping"
| |
| End If
| |
| End With 'New clsStopWatch
| |
|
| |
| End Function
| |
| | |
| </pre> | |
| | |
| == ExpandPairs ==
| |
| | |
| === Working loop of the combinatorial expantion ===
| |
| <pre style="background:#202; color:lime; border:3px outset black; padding:0 1em; width:auto; overflow:scroll; height:500px; margin:0 3em; font:normal 14px monospace;"> | |
| ' Create the paired-combinations of Atoms sharing Links.
| |
| ' Enumerate atoms, creating a tabulation by string-concatenation
| |
| ' of any new combinatrics joined from the array returned by the
| |
| ' transform method producing combinatorics.
| |
| | |
| RaiseEvent Progress("Pairs combination-expansion beginning...")
| |
| | |
| ndx = 0
| |
| For Each varX In mtWh.colAtomsKeychain
| |
| strJoin = Join(Combinatorics(varX), "**")
| |
| If Len(strJoin) Then
| |
| strPairs = Join(Array(strPairs, strJoin), Me.DataDelimRow) ' future: this needs checked for delay
| |
| End If
| |
| If ndx Mod 2 = 0 Then
| |
| RaiseEvent Progress("Expanding - (" & CStr(ndx) & ")...")
| |
| DoEvents
| |
| End If
| |
| ndx = ndx + 1
| |
| Next
| |
| | |
| RaiseEvent Console("Pairs expanded. [" & CStr(.Elapsed) & " msec]")
| |
| </pre> | |
| | |
| | |
| === The ExpandPairs() function containing the working loop above ===
| |
| <pre style="background:#202; color:lime; border:3px outset black; padding:0 1em; width:auto; overflow:scroll; height:500px; margin:0 3em; font:normal 14px monospace;"> | |
| | |
| Public Function ExpandPairs() As Boolean
| |
| ' Create the pair-combinations of all the Atoms that DO HAVE shared conjectural-regularity. | |
|
| |
| Dim ndx As Long
| |
| Dim strField() As String 'array
| |
| Dim strPairs As String
| |
| Dim strJoin As String
| |
| Dim varX As Variant
| |
|
| |
| ' Pairs format (Sorted):
| |
| ' Atom1 ** Atom2 CR Atom3 ** Atom 4 CR, ...
| |
|
| |
| On Error GoTo trap
| |
|
| |
| If mtWh.State >= enumWhStates.ExtractedKeychains Then
| |
| Set mtWh.colPairs = New Collection
| |
| With New clsStopWatch
| |
| If mtWh.State >= Loaded Then
| |
| ' Create the paired-combinations of Atoms sharing Links.
| |
|
| |
| ' Enumerate atoms, creating a tabulation by string-concatenation
| |
| ' of any new combinatrics joined from the array returned by the
| |
| ' transform method producing combinatorics.
| |
| RaiseEvent Progress("Pairs combination-expansion beginning...")
| |
| ndx = 0
| |
| For Each varX In mtWh.colAtomsKeychain
| |
| strJoin = Join(Combinatorics(varX), "**")
| |
| If Len(strJoin) Then
| |
| strPairs = Join(Array(strPairs, strJoin), Me.DataDelimRow) ' future: this needs checked for delay
| |
| End If
| |
| If ndx Mod 2 = 0 Then
| |
| RaiseEvent Progress("Expanding - (" & CStr(ndx) & ")...")
| |
| DoEvents
| |
| End If
| |
| ndx = ndx + 1
| |
| Next
| |
| RaiseEvent Console("Pairs expanded. [" & CStr(.Elapsed) & " msec]")
| |
|
| |
| .Reset ' timer
| |
|
| |
| ' Store the Pairs tabular string data as a string array.
| |
| mtWh.Pairs = Split(strPairs, Me.DataDelimRow)
| |
| mtWh.PairsCount = UBound(mtWh.Pairs) + 1
| |
|
| |
| ' Sort the new Pairs array.
| |
| QuickSortVariants mtWh.Pairs, 1, UBound(mtWh.Pairs), 1, UBound(mtWh.Pairs)
| |
| RaiseEvent Console(CStr(mtWh.PairsCount) & " Pairs sorted. [" & CStr(.Elapsed) & " msec]")
| |
| RaiseEvent Progress("")
| |
|
| |
| mtWh.State = enumWhStates.ExpandedPairs
| |
| ExpandPairs = True
| |
| RaiseEvent Console(CStr(mtWh.PairsCount) & " Pairs expanded. [" & CStr(.Elapsed) & " msec]")
| |
|
| |
| End If
| |
| End With
| |
| Else
| |
| RaiseEvent Console("clsWhse.ExpandPairs: Failure: The Atoms Keychain has not been extracted.")
| |
|
| |
| End If ' mtWh.State >= enumWhStates.ExtractedKeychains | |
|
| |
| Exit Function
| |
| ExitPoint:
| |
| RaiseEvent Progress("")
| |
| Exit Function
| |
| | |
| trap:
| |
| RaiseEvent Console("clsWhse.ExpandPairs: " & Err.Source & " Error(" & CStr(Err.Number) & "): '" & CStr(Err.Description) & "'")
| |
| Resume ExitPoint
| |
| Resume
| |
| End Function
| |
| | |
| </pre> | |