diff --git a/README.md b/README.md index 1b66419..93af01f 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,182 @@ # MuRiT -Copyright © 2022 Michael Bleher, ... +Copyright © 2022 Michael Bleher ## Description -MuRiT is a standalone program that determines a Vietoris-Rips transformation for multifiltered flag complex. -It's relevance stems from the fact that it can be used as a Ripser add-on to calculate persistent homology of the flag complex along any totally ordered subfiltration. +`MuRiT` is a standalone program that provides Vietoris-Rips transformations for multifiltered flag complexes. -The main features of MuRiT +It is build with the main goal of providing a `Ripser` add-on to calculate persistent homology of flag complexes along any totally ordered subfiltration of interest. +Thus, `MuRiT` allows an easy exploration of multi-persistence properties for filtered metric spaces, e.g. timeseries data. -- fully parallelized and memory-efficient + +The main features of `MuRiT` are + +- easy exploration of multi-persistence for filtered metric spaces +- optimized for use as `Ripser` add-on (integrated call to local instance of `Ripser`) +- fully parallelized and memory-efficient creation of the distance matrix of a Vietoris-Rips transformation - standalone exectubales for all major platforms - open source go code -- optimized for use as Ripser add-on, integrated call to local instance of Ripser -Input formats currently supported by MuRiT -- comma-separated edge annotation file & subfiltration -- comma-separated lower-triangular distance matrix, point annotation file, & subfiltration +## Setup +### Installation +We provide executables for major platforms and architectures as releases, no installation is required for those. +Just download the executable that fits your setup. + +If your platform and architecture is not provided, please see below. + +### Build and Modify +`MuRiT` is written in go, so it can be easily modified and run directly from source. +For this you only need [a recent go installation](https://go.dev/) and a copy of this repository. + +To run `MuRiT` from source use +``` +go run main.go [--options] +``` + +For help in building your own executables, [see here](https://go.dev/doc/tutorial/compile-install). + +### Contribute +We envision a broad interaction with the research community. +If you have a special use-case for `MuRiT` that isn't covered by the current implementation or have an idea for additional features, get in touch or submit your pull requests. -## Releases -latest: v0.4 -## Build or Modify -MuRiT is written in go, so it can be run directly from source if you have installed go. -This is the best way to go about modifying it to your own needs. +## Using `MuRiT` +`MuRiT` expects as input -If you want to build your own executables, see here. +- a comma-separated lower-triangular distance matrix, +- a pointwise annotation file, +- and a one-dimensional subfiltration $(VR_0, i_0, j_0, ...)-- ... --(VR_n, i_n, j_n, ...)$. -## Options -MuRiT offers several run-time options. +It's output is + +- either the distance matrix of a Vietoris-Rips Transformation of the flag complex +- or the persistent homology of the flag complex along the chosen subfiltration. + +A call to `MuRiT` looks as follows ``` --debug - show messages for debugging purposes? --dist_file string - distance file name --fltr_file string - filtration file name. Each row gives filtration value of corresponding data point. - Format i,j,k,... (interpreted with lexicraphical order) --help - Get help message --ripser - run ripser? --save_aux - save auxiliary metric? --sub_fltr string - sub-filtration along which to compute 1d persistence. - Format: [VR_0, i_0, j_0, k_0,...]-- ... --(VR_n, i_n, j_n, k_n,...) --threads string - number of threads --verbose - show status messages? +murit --dist [filename] --pt_fltr [filename] --sub_fltr (VR_0, i_0, j_0, ...)-- ... --(VR_n, i_n, j_n, ...) [--options] ``` +*Note: MuRiT relies on the standard partial order on $\mathbb{R}^n$ for some $n$. Make sure you have translated* + +### List of Command Line Arguments + +##### `--dist` + +file name of lower-triangular distance matrix. + + +##### `--pt_fltr` + +file name of pointwise filtration annotation. + + file content: on row 'i' a comma-separated list of minimal filtration values for data point 'i'. + example file: + + + (0,0,1) // minimum of point 1 + (1,1,1) // minimum of point 2 + ... + +##### `--sub_fltr` + + command line input of sub-filtration along which to compute 1d persistence. + + example: + (VR_0, i_0, j_0, k_0,...)-- ... --(VR_n, i_n, j_n, k_n,...) + +##### `--threads` +number of threads (default: runtime.NumCPU()) +##### `--verbose` +Show status messages (default: false) +##### `--help` +Show help message +##### `--ripser` +run ripser on auxiliary distance matrix (default: false). +Requires a local ripser installation in PATH + +Further Ripser options +- `--dim` compute persistent homology up to dimension k (default: 1). +- `--threshold` compute persistent homology up to threshold t (in auxiliary distance matrix, default: enclosing radius). +- `--modulus` compute homology with coefficients in the prime field Z/pZ (default: 2). +- `--ratio` only show persistence pairs with death/birth ratio > r + + +## Example + +_The distance matrix and filtration file for the following example is provided in `examples/diamonds.*`_ + +Consider the metric space of a diamond consisting of four points with side length $1$ and diagonal length $2$. +Assume that for each point there is additional information about time $t$ at which the point entered the data set (say in seconds), and some threshold height $h$ above which it could be observed. + +The following list of filtration tuples $(t, h)$ for each of the four points is provided in `examples/diamonds.fltr`. +``` +(0,0) +(1.2,0) +(1.6,1) +(3.1,1) +``` +This means that the first point was observed from the beginning and already at lowest height, while the second point only appears after 1.2 seconds and also at lowest height, et cetera. + +Running `MuRiT` on this data produces the distance matrix of a Vietoris-Rips transformation +``` +$ murit --dist examples/diamond.dist --pt_fltr examples/diamond.fltr --verbose +Read pointwise annotation file +Build subfiltration +[[0 0 0] [1 0 0] [1 1.2 0] [1 1.6 1] [1 2 1]] +Build auxiliary Distance Matrix +3 +4,5 +5,5,5 +``` +_Note: If no subfiltration is specified, `MuRiT` will build some auxiliary initial subfiltration from information in the filtration annotation. We made use of this behaviour in this example._ + +If we add the `--ripser` flag, the distance matrix is automatically handed over to `Ripser` to calculate persistent homology along the one-dimensional subfiltration. +``` +$ murit --dist examples/diamond.dist --pt_fltr examples/diamond.fltr --verbose --ripser +Read pointwise annotation file +Build subfiltration +[[0 0 0] [1 0 0] [1 1.2 0] [1 1.6 1] [1 2 1]] +Build auxiliary Distance Matrix +--- +Run Ripser +value range: [3,5] +distance matrix with 4 points, using threshold at enclosing radius 5 +persistent homology intervals in dim 1: + +``` +Note that we do not find non-trivial homology in this example. +This makes sense, because the last point enters the filtration only at the last step in the one-dimensional subfiltration. +Only from that point on we might expect to see the cycle around the diamond. + +Adding two further filtration steps $[2,2,1]--[2.1,2,1]$ at higher Vietoris-Rips parameters to the automatically generated subfiltration, we get: +``` +$ murit --dist examples/diamond.dist --pt_fltr examples/diamond.fltr --verbose --ripser --sub_fltr [0,0,0]--[1,0,0]--[1,1,0]--[1,2,0]--[1,2,1]--[2,2,1]--[2.1,2,1] +Read pointwise annotation file +Read subfiltration +[[0 0 0] [1 0 0] [1 1 0] [1 2 0] [1 2 1] [2 2 1] [2.1 2 1]] +Build auxiliary Distance Matrix +--- +Run Ripser +value range: [4,6] +distance matrix with 4 points, using threshold at enclosing radius 6 +persistent homology intervals in dim 1: + [ [1 2 1] , [2 2 1] ): +{[0,2] (5), [1,3] (5), [2,3] (5), [0,1] (4)} +{[0,2] (5), [1,3] (5), [2,3] (5), [0,1] (4)} +``` +Indeed we find that there is a homology class in dimension one, which is born at filtration value $[1,2,1]$, i.e. once the fourth point has been observed. +The homology class dies at filtration value $[2,2,1]$, which is when the diagonals are added to the Vietoris-Rips complex. + + +_Note: By using the `--ripser` flag, the result is automatically converted back to the subfiltration values._ + + ## Citing -TBA + +Maximilian Neumann, Michael Bleher, Lukas Hahn, Samuel Braun, +Holger Obermaier, Mehmet Soysal, René Caspart, and Andreas Ott (2022). +"MuRiT: efficient computation of the multiparameter +persistent homology of multifltered fag complexes via +Vietoris-Rips transformations". *(to appear)* diff --git a/examples/min_test.dist b/examples/diamond.dist similarity index 100% rename from examples/min_test.dist rename to examples/diamond.dist diff --git a/examples/diamond.fltr b/examples/diamond.fltr new file mode 100644 index 0000000..9b8e2ca --- /dev/null +++ b/examples/diamond.fltr @@ -0,0 +1,4 @@ +(0,0) +(1.2,0) +(1.6,1) +(2,1) diff --git a/examples/extract_annotation_from_ids.py b/examples/extract_annotation_from_ids.py deleted file mode 100644 index 0903f47..0000000 --- a/examples/extract_annotation_from_ids.py +++ /dev/null @@ -1,8 +0,0 @@ -import datetime - -with open('test.ids') as f: - lines = f.readlines() - for row in lines: - date = row.split('|')[2] - filtrationstep = (datetime.datetime.strptime(date, "%Y-%m-%d")-datetime.datetime(2019,12,30)).days - print(filtrationstep) diff --git a/examples/min_test.fltr b/examples/min_test.fltr deleted file mode 100644 index 04a7561..0000000 --- a/examples/min_test.fltr +++ /dev/null @@ -1,4 +0,0 @@ -0 -1.4 -1.1 -1.3 diff --git a/examples/test.fltr b/examples/test.fltr index b8ba7fc..a8c8428 100644 --- a/examples/test.fltr +++ b/examples/test.fltr @@ -1,307 +1,307 @@ 0 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -609 -610 -610 -610 -610 -610 -610 -610 -610 -610 -610 -610 -610 -610 -610 -611 -611 -611 -611 -611 -611 -611 -611 -611 -611 -611 -611 -611 -611 -611 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -612 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -613 -614 -614 -614 -614 -614 -615 -615 -615 -615 -615 -615 -615 -615 -615 -615 -615 -616 -616 -616 -616 -616 -616 -616 -616 -616 -616 -616 -616 -616 -616 -616 -616 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -617 -618 -618 -618 -618 -618 -618 -618 -618 -618 -618 -618 -618 -619 -619 -619 -619 -619 -619 -619 -619 -619 -619 -619 -619 -619 -619 -620 -620 -620 -620 -620 -620 -620 -620 -620 -620 -621 -621 -621 -621 -621 -621 -621 -621 -621 -622 -622 -622 -622 -622 -622 -622 -623 -623 -623 -623 -623 -623 -623 -623 -623 -623 -623 -623 -624 -624 -624 -624 -624 -624 -624 -625 -625 -625 -625 -625 -625 -626 -626 -626 -626 -626 -626 -626 -626 -626 -626 -626 -627 -627 -627 -627 -627 -627 -627 -627 -627 -627 -628 -628 -628 -628 -629 -630 -630 -630 -630 -631 -631 -631 -631 -631 -631 -631 -631 -632 -632 -632 -632 -632 -632 -632 -632 -632 -633 -633 -633 -633 -633 -633 -633 -633 -633 -633 -633 -634 -634 -634 -634 -634 -634 -635 -635 -635 -636 -636 -636 -637 -637 -637 -637 -637 -637 -638 -638 -638 -638 -638 -638 -638 -638 -639 -639 -639 -639 -639 -640 -640 +2 +5 +5 +5 +5 +7 +8 +9 +9 +9 +9 +9 +9 +9 +9 +9 +9 +9 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +17 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +19 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +21 +21 +21 +21 +21 +21 +21 +21 +21 +22 +22 +22 +22 +22 +22 +22 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +23 +24 +24 +24 +24 +24 +24 +24 +25 +25 +25 +25 +25 +25 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +27 +27 +27 +27 +27 +27 +27 +27 +27 +27 +28 +28 +28 +28 +29 +30 +30 +30 +30 +31 +31 +31 +31 +31 +31 +31 +31 +32 +32 +32 +32 +32 +32 +32 +32 +32 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +33 +34 +34 +34 +34 +34 +34 +35 +35 +35 +3 +3 +3 +37 +37 +37 +37 +37 +37 +38 +38 +38 +38 +38 +38 +38 +38 +39 +39 +39 +39 +39 +40 +40 diff --git a/examples/test.ids b/examples/test.ids deleted file mode 100644 index 11e1d26..0000000 --- a/examples/test.ids +++ /dev/null @@ -1,307 +0,0 @@ -hCoV-19/Wuhan/WIV04/2019|EPI_ISL_402124|2019-12-30|China -hCoV-19/Japan/PG-115886/2021|EPI_ISL_4648951|2021-08-30|Asia -hCoV-19/Netherlands/FL-RIVM-57082/2021|EPI_ISL_4399740|2021-08-30|Europe -hCoV-19/Italy/VEN-UniVR-197/2021|EPI_ISL_4816926|2021-08-30|Europe -hCoV-19/Netherlands/ZH-RIVM-57522/2021|EPI_ISL_4401345|2021-08-30|Europe -hCoV-19/Switzerland/BE-SRO-500002_7751/2021|EPI_ISL_4412975|2021-08-30|Europe -hCoV-19/England/PLYM-1D23A18/2021|EPI_ISL_4016887|2021-08-30|Europe -hCoV-19/England/PLYM-1D103C8/2021|EPI_ISL_4014320|2021-08-30|Europe -hCoV-19/Switzerland/BE-SRO-500002_7960/2021|EPI_ISL_4412990|2021-08-30|Europe -hCoV-19/England/MILK-1D12FC2/2021|EPI_ISL_3991957|2021-08-30|Europe -hCoV-19/USA/LA-EVTL5004/2021|EPI_ISL_4254086|2021-08-30|NorthAmerica -hCoV-19/Canada/BC-BCCDC-187939/2021|EPI_ISL_4828331|2021-08-30|NorthAmerica -hCoV-19/USA/CA-CDC-LC0269480/2021|EPI_ISL_4538420|2021-08-30|NorthAmerica -hCoV-19/USA/FL-CDC-LC0241103/2021|EPI_ISL_4333000|2021-08-30|NorthAmerica -hCoV-19/USA/FL-CDC-LC0242673/2021|EPI_ISL_4334182|2021-08-30|NorthAmerica -hCoV-19/USA/KY-CDC-LC0253965/2021|EPI_ISL_4477466|2021-08-30|NorthAmerica -hCoV-19/USA/SD-CDC-4281291-001/2021|EPI_ISL_4702512|2021-08-30|NorthAmerica -hCoV-19/USA/AZ-CDC-LC0275898/2021|EPI_ISL_4809091|2021-08-30|NorthAmerica -hCoV-19/USA/SC-CDC-LC0243499/2021|EPI_ISL_4334270|2021-08-30|NorthAmerica -hCoV-19/England/ALDP-1D3606B/2021|EPI_ISL_4011577|2021-08-31|Europe -hCoV-19/England/MILK-1D290C5/2021|EPI_ISL_4017674|2021-08-31|Europe -hCoV-19/England/PLYM-1D39B58/2021|EPI_ISL_4013753|2021-08-31|Europe -hCoV-19/Scotland/QEUH-1D3AF88/2021|EPI_ISL_4069091|2021-08-31|Europe -hCoV-19/England/ALDP-1D2A1B2/2021|EPI_ISL_4017209|2021-08-31|Europe -hCoV-19/Netherlands/GL-RIVM-57828/2021|EPI_ISL_4402036|2021-08-31|Europe -hCoV-19/USA/AR-CDC-QDX28318731/2021|EPI_ISL_4248902|2021-08-31|NorthAmerica -hCoV-19/USA/KY-CDC-LC0269161/2021|EPI_ISL_4538554|2021-08-31|NorthAmerica -hCoV-19/USA/VA-CDC-LC0243216/2021|EPI_ISL_4334508|2021-08-31|NorthAmerica -hCoV-19/USA/FL-CDC-ASC210097695/2021|EPI_ISL_4377982|2021-08-31|NorthAmerica -hCoV-19/USA/AZ-CDC-ASC210126005/2021|EPI_ISL_4382075|2021-08-31|NorthAmerica -hCoV-19/USA/TN-CDC-ASC210124951/2021|EPI_ISL_4391889|2021-08-31|NorthAmerica -hCoV-19/USA/TX-CDC-ASC210125201/2021|EPI_ISL_4386148|2021-08-31|NorthAmerica -hCoV-19/USA/TN-CDC-ASC210180157/2021|EPI_ISL_4540243|2021-08-31|NorthAmerica -hCoV-19/Germany/RP-RKI-I-224236/2021|EPI_ISL_4043601|2021-09-01|Europe -hCoV-19/England/ALDP-1D525D3/2021|EPI_ISL_4086360|2021-09-01|Europe -hCoV-19/Wales/PHWC-PDIN63/2021|EPI_ISL_4532679|2021-09-01|Europe -hCoV-19/Germany/BW-RKI-I-224644/2021|EPI_ISL_4043999|2021-09-01|Europe -hCoV-19/Germany/HH-RKI-I-224748/2021|EPI_ISL_4044101|2021-09-01|Europe -hCoV-19/USA/IN-CDC-QDX28468679/2021|EPI_ISL_4466715|2021-09-01|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_A6QBCKAI3EQMYPFX/2021|EPI_ISL_4094015|2021-09-01|NorthAmerica -hCoV-19/USA/PA-CDC-LC0269259/2021|EPI_ISL_4538743|2021-09-01|NorthAmerica -hCoV-19/USA/GA-CDC-LC0255759/2021|EPI_ISL_4479367|2021-09-01|NorthAmerica -hCoV-19/USA/AZ-CDC-LC0284231/2021|EPI_ISL_4809753|2021-09-01|NorthAmerica -hCoV-19/USA/TX-CDC-ASC210181269/2021|EPI_ISL_4554814|2021-09-01|NorthAmerica -hCoV-19/USA/WY-WYPHL-21070026/2021|EPI_ISL_4198525|2021-09-01|NorthAmerica -hCoV-19/USA/GA-CDC-LC0262766/2021|EPI_ISL_4478581|2021-09-01|NorthAmerica -hCoV-19/Mexico/NLE_InDRE_FB38718_S7105/2021|EPI_ISL_4603065|2021-09-01|NorthAmerica -hCoV-19/USA/NY-MEDDAC_FD_081/2021|EPI_ISL_4926483|2021-09-01|NorthAmerica -hCoV-19/England/QEUH-1D62D14/2021|EPI_ISL_4045707|2021-09-02|Europe -hCoV-19/Denmark/DCGC-168848/2021|EPI_ISL_4008418|2021-09-02|Europe -hCoV-19/England/MILK-1D544F2/2021|EPI_ISL_4046649|2021-09-02|Europe -hCoV-19/Denmark/DCGC-168792/2021|EPI_ISL_4008277|2021-09-02|Europe -hCoV-19/Germany/BY-RKI-I-228790/2021|EPI_ISL_4223811|2021-09-02|Europe -hCoV-19/Germany/BY-RKI-I-229100/2021|EPI_ISL_4224112|2021-09-02|Europe -hCoV-19/England/BRBR-1D666E8/2021|EPI_ISL_4088634|2021-09-02|Europe -hCoV-19/England/LSPA-1D8FE2D/2021|EPI_ISL_4087697|2021-09-02|Europe -hCoV-19/Norway/OUS-13657/2021|EPI_ISL_4472222|2021-09-02|Europe -hCoV-19/Scotland/QEUH-1D58E87/2021|EPI_ISL_4066469|2021-09-02|Europe -hCoV-19/Wales/PHWC-PDXHOE/2021|EPI_ISL_4319036|2021-09-02|Europe -hCoV-19/Ireland/D-NVRL-S21IRL00235614/2021|EPI_ISL_4780534|2021-09-02|Europe -hCoV-19/England/MILK-1DA6224/2021|EPI_ISL_4099552|2021-09-02|Europe -hCoV-19/Norway/19034/2021|EPI_ISL_4398264|2021-09-02|Europe -hCoV-19/Germany/BW-RKI-I-224770/2021|EPI_ISL_4044122|2021-09-02|Europe -hCoV-19/USA/MD-CDC-LC0245488/2021|EPI_ISL_4337071|2021-09-02|NorthAmerica -hCoV-19/USA/NC-CDC-LC0254969/2021|EPI_ISL_4481830|2021-09-02|NorthAmerica -hCoV-19/USA/FL-BPHL-7808/2021|EPI_ISL_4549668|2021-09-02|NorthAmerica -hCoV-19/USA/NY-PRL-2021_0905_00A10/2021|EPI_ISL_4106614|2021-09-02|NorthAmerica -hCoV-19/USA/MO-CDC-ASC210100019/2021|EPI_ISL_4379581|2021-09-02|NorthAmerica -hCoV-19/USA/IA-CDC-ASC210101643/2021|EPI_ISL_4390749|2021-09-02|NorthAmerica -hCoV-19/USA/TN-CDC-LC0256175/2021|EPI_ISL_4482077|2021-09-02|NorthAmerica -hCoV-19/USA/OK-CDC-ASC210100395/2021|EPI_ISL_4494781|2021-09-02|NorthAmerica -hCoV-19/Malaysia/C19UMB270/2021|EPI_ISL_4731229|2021-09-03|Asia -hCoV-19/Norway/OUS-13766/2021|EPI_ISL_4472292|2021-09-03|Europe -hCoV-19/Spain/CL-COV13896/2021|EPI_ISL_4506409|2021-09-03|Europe -hCoV-19/Turkey/HSGM-E2884/2021|EPI_ISL_4265284|2021-09-03|Europe -hCoV-19/Wales/PHWC-PDQ6KI/2021|EPI_ISL_4314011|2021-09-03|Europe -hCoV-19/England/NEWC-1D941B3/2021|EPI_ISL_4101116|2021-09-03|Europe -hCoV-19/England/PLYM-1D6B355/2021|EPI_ISL_4068598|2021-09-03|Europe -hCoV-19/Turkey/HSGM-E2610/2021|EPI_ISL_4090510|2021-09-03|Europe -hCoV-19/Scotland/QEUH-1D78531/2021|EPI_ISL_4146838|2021-09-03|Europe -hCoV-19/Germany/NW-RKI-I-229526/2021|EPI_ISL_4224515|2021-09-03|Europe -hCoV-19/England/HSLL-1D7F5FE/2021|EPI_ISL_4086673|2021-09-03|Europe -hCoV-19/USA/FL-CDC-LC0254257/2021|EPI_ISL_4482546|2021-09-03|NorthAmerica -hCoV-19/USA/VT-CDCBI-CRSP_A7PUB2RDXFJJJZWT/2021|EPI_ISL_4096215|2021-09-03|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_3WDFXJLTJPJDWBFH/2021|EPI_ISL_4093808|2021-09-03|NorthAmerica -hCoV-19/Canada/AB-ABPHL-32176/2021|EPI_ISL_4560722|2021-09-03|NorthAmerica -hCoV-19/USA/MN-CDC-ASC210104212/2021|EPI_ISL_4376358|2021-09-03|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_JZWDSIV4GZOEDBU6/2021|EPI_ISL_4094926|2021-09-03|NorthAmerica -hCoV-19/USA/IN-CDC-LC0279400/2021|EPI_ISL_4811081|2021-09-03|NorthAmerica -hCoV-19/England/ALDP-1D9B84E/2021|EPI_ISL_4098584|2021-09-04|Europe -hCoV-19/Germany/NW-RKI-I-228723/2021|EPI_ISL_4223749|2021-09-04|Europe -hCoV-19/USA/CO-CDPHE-2101765862/2021|EPI_ISL_4927401|2021-09-04|NorthAmerica -hCoV-19/USA/CA-CDC-QDX28426842/2021|EPI_ISL_4466281|2021-09-04|NorthAmerica -hCoV-19/Brazil/SP-SEQ01942/2021|EPI_ISL_4273414|2021-09-04|SouthAmerica -hCoV-19/England/MILK-1DA48AC/2021|EPI_ISL_4099203|2021-09-05|Europe -hCoV-19/USA/WI-CDC-ASC210128863/2021|EPI_ISL_4909537|2021-09-05|NorthAmerica -hCoV-19/USA/NY-CDC-LC0256499/2021|EPI_ISL_4483785|2021-09-05|NorthAmerica -hCoV-19/Canada/AB-ABPHL-31984/2021|EPI_ISL_4560513|2021-09-05|NorthAmerica -hCoV-19/USA/TN-CDC-ASC210130035/2021|EPI_ISL_4915264|2021-09-05|NorthAmerica -hCoV-19/USA/MI-CDC-ASC210130738/2021|EPI_ISL_4535394|2021-09-05|NorthAmerica -hCoV-19/USA/TN-CDC-ASC210125359/2021|EPI_ISL_4391155|2021-09-05|NorthAmerica -hCoV-19/USA/TX-CDC-QDX28468164/2021|EPI_ISL_4466900|2021-09-05|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_K54SB5UPYVPVAAGK/2021|EPI_ISL_4286072|2021-09-05|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_MM6Y64OTDQN3HBHD/2021|EPI_ISL_4286229|2021-09-05|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_J2GBQONSSICIOWCR/2021|EPI_ISL_4285982|2021-09-05|NorthAmerica -hCoV-19/Germany/BW-RKI-I-238567/2021|EPI_ISL_4231959|2021-09-06|Europe -hCoV-19/Germany/BE-RKI-I-239922/2021|EPI_ISL_4437777|2021-09-06|Europe -hCoV-19/England/NEWC-1DB137E/2021|EPI_ISL_4144932|2021-09-06|Europe -hCoV-19/England/MILK-1DBCDEE/2021|EPI_ISL_4144553|2021-09-06|Europe -hCoV-19/Germany/NI-RKI-I-230885/2021|EPI_ISL_4225770|2021-09-06|Europe -hCoV-19/Norway/OUS-13829/2021|EPI_ISL_4472313|2021-09-06|Europe -hCoV-19/England/ALDP-1DC5553/2021|EPI_ISL_4190442|2021-09-06|Europe -hCoV-19/England/MILK-1DCC282/2021|EPI_ISL_4192354|2021-09-06|Europe -hCoV-19/England/ALDP-1DC1821/2021|EPI_ISL_4144486|2021-09-06|Europe -hCoV-19/England/NEWC-1DB75BE/2021|EPI_ISL_4144617|2021-09-06|Europe -hCoV-19/England/ALDP-1DD8520/2021|EPI_ISL_4189280|2021-09-06|Europe -hCoV-19/Germany/NI-RKI-I-244007/2021|EPI_ISL_4440881|2021-09-06|Europe -hCoV-19/USA/WA-UW-21090625745/2021|EPI_ISL_4569037|2021-09-06|NorthAmerica -hCoV-19/USA/DC-DFS-PHL-01611/2021|EPI_ISL_4643831|2021-09-06|NorthAmerica -hCoV-19/Canada/BC-BCCDC-190975/2021|EPI_ISL_4838942|2021-09-06|NorthAmerica -hCoV-19/USA/FL-CDC-QDX28549868/2021|EPI_ISL_4458579|2021-09-06|NorthAmerica -hCoV-19/Germany/SN-RKI-I-243960/2021|EPI_ISL_4440836|2021-09-07|Europe -hCoV-19/France/PDL-IPP26641/2021|EPI_ISL_4461806|2021-09-07|Europe -hCoV-19/Sweden/10116774/2021|EPI_ISL_4335926|2021-09-07|Europe -hCoV-19/England/MILK-1DCFFF1/2021|EPI_ISL_4191345|2021-09-07|Europe -hCoV-19/France/ARA-HCL021162207201/2021|EPI_ISL_4605633|2021-09-07|Europe -hCoV-19/Wales/PHWC-PDZONY/2021|EPI_ISL_4803154|2021-09-07|Europe -hCoV-19/England/ALDP-1E2C173/2021|EPI_ISL_4287760|2021-09-07|Europe -hCoV-19/USA/TN-CDC-ASC210132084/2021|EPI_ISL_4911678|2021-09-07|NorthAmerica -hCoV-19/USA/LA-CDC-LC0264854/2021|EPI_ISL_4485374|2021-09-07|NorthAmerica -hCoV-19/USA/FL-CDC-ASC210136678/2021|EPI_ISL_4916381|2021-09-07|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_2GYCCBDY62TCF2ZD/2021|EPI_ISL_4285078|2021-09-07|NorthAmerica -hCoV-19/Canada/AB-ABPHL-33297/2021|EPI_ISL_4561949|2021-09-07|NorthAmerica -hCoV-19/USA/UT-UPHL-210914424377/2021|EPI_ISL_4204771|2021-09-07|NorthAmerica -hCoV-19/USA/KS-CDC-ASC210132997/2021|EPI_ISL_4540451|2021-09-07|NorthAmerica -hCoV-19/USA/FL-CDC-ASC210134895/2021|EPI_ISL_4495959|2021-09-07|NorthAmerica -hCoV-19/USA/TX-CDC-ASC210131155/2021|EPI_ISL_4387976|2021-09-07|NorthAmerica -hCoV-19/USA/OH-CDC-ASC210135668/2021|EPI_ISL_4912890|2021-09-07|NorthAmerica -hCoV-19/USA/VA-CDC-LC0266781/2021|EPI_ISL_4537060|2021-09-07|NorthAmerica -hCoV-19/Germany/BY-RKI-I-271873/2021|EPI_ISL_4937672|2021-09-08|Europe -hCoV-19/Germany/NW-RKI-I-235748/2021|EPI_ISL_4229283|2021-09-08|Europe -hCoV-19/England/NORT-YYRJUE/2021|EPI_ISL_4528794|2021-09-08|Europe -hCoV-19/England/MILK-1DE9164/2021|EPI_ISL_4213894|2021-09-08|Europe -hCoV-19/Germany/NW-RKI-I-237292/2021|EPI_ISL_4230759|2021-09-08|Europe -hCoV-19/Denmark/DCGC-173556/2021|EPI_ISL_4447912|2021-09-08|Europe -hCoV-19/USA/TN-CDC-ASC210135951/2021|EPI_ISL_4911351|2021-09-08|NorthAmerica -hCoV-19/Canada/BC-BCCDC-197401/2021|EPI_ISL_4846515|2021-09-08|NorthAmerica -hCoV-19/USA/AL-CDC-LC0272071/2021|EPI_ISL_4813581|2021-09-08|NorthAmerica -hCoV-19/USA/WA-CDC-LC0273756/2021|EPI_ISL_4813559|2021-09-08|NorthAmerica -hCoV-19/USA/GA-CDC-LC0274531/2021|EPI_ISL_4813800|2021-09-08|NorthAmerica -hCoV-19/USA/FL-CDC-LC0264483/2021|EPI_ISL_4486965|2021-09-08|NorthAmerica -hCoV-19/Cambodia/772656/2021|EPI_ISL_4259943|2021-09-09|Asia -hCoV-19/Denmark/DCGC-171422/2021|EPI_ISL_4200308|2021-09-09|Europe -hCoV-19/England/MILK-1DEF7E4/2021|EPI_ISL_4214901|2021-09-09|Europe -hCoV-19/England/MILK-1DFE64F/2021|EPI_ISL_4249512|2021-09-09|Europe -hCoV-19/Ireland/D-NVRL-M37IRL75279/2021|EPI_ISL_4782245|2021-09-09|Europe -hCoV-19/Ireland/G-NVRL-G21IRL83198/2021|EPI_ISL_4505164|2021-09-09|Europe -hCoV-19/Germany/NW-RKI-I-244008/2021|EPI_ISL_4440882|2021-09-09|Europe -hCoV-19/England/MILK-1E430B5/2021|EPI_ISL_4527018|2021-09-09|Europe -hCoV-19/USA/ND-NDDH-4422/2021|EPI_ISL_4822585|2021-09-09|NorthAmerica -hCoV-19/USA/AL-CDC-LC0272515/2021|EPI_ISL_4814431|2021-09-09|NorthAmerica -hCoV-19/USA/MS-SRL_330739650/2021|EPI_ISL_4928104|2021-09-09|NorthAmerica -hCoV-19/USA/AZ-CDC-ASC210080626/2021|EPI_ISL_4916776|2021-09-09|NorthAmerica -hCoV-19/USA/MO-CDC-QDX28740620/2021|EPI_ISL_4825617|2021-09-09|NorthAmerica -hCoV-19/USA/ND-NDDH-4428/2021|EPI_ISL_4822601|2021-09-09|NorthAmerica -hCoV-19/England/ALDP-1E2CC09/2021|EPI_ISL_4290325|2021-09-10|Europe -hCoV-19/Sweden/20746846P/2021|EPI_ISL_4337630|2021-09-10|Europe -hCoV-19/Turkey/HSGM-E6257/2021|EPI_ISL_4892515|2021-09-10|Europe -hCoV-19/Germany/BY-RKI-I-246485/2021|EPI_ISL_4442913|2021-09-10|Europe -hCoV-19/England/ALDP-1E2D8F5/2021|EPI_ISL_4287661|2021-09-10|Europe -hCoV-19/England/ALDP-1E4D15E/2021|EPI_ISL_4323949|2021-09-10|Europe -hCoV-19/England/ALDP-1E2757C/2021|EPI_ISL_4263331|2021-09-10|Europe -hCoV-19/Scotland/QEUH-1E15CF4/2021|EPI_ISL_4265778|2021-09-10|Europe -hCoV-19/Turkey/HSGM-E6456/2021|EPI_ISL_4892307|2021-09-10|Europe -hCoV-19/Switzerland/GE-HUG-35375640/2021|EPI_ISL_4508114|2021-09-10|Europe -hCoV-19/Norway/21534/2021|EPI_ISL_4876173|2021-09-11|Europe -hCoV-19/England/MILK-1E13B71/2021|EPI_ISL_4355173|2021-09-11|Europe -hCoV-19/Switzerland/SO-ETHZ-34074060/2021|EPI_ISL_4907650|2021-09-11|Europe -hCoV-19/England/ALDP-1E4E4FA/2021|EPI_ISL_4323820|2021-09-11|Europe -hCoV-19/Ireland/DL-NVRL-M37IRL88258/2021|EPI_ISL_4548164|2021-09-11|Europe -hCoV-19/England/ALDP-1E3EA64/2021|EPI_ISL_4325802|2021-09-11|Europe -hCoV-19/England/NEWC-1E251E3/2021|EPI_ISL_4291038|2021-09-11|Europe -hCoV-19/USA/NJ-CDC-QDX28696787/2021|EPI_ISL_4566463|2021-09-11|NorthAmerica -hCoV-19/USA/CT-CDC-LC0272714/2021|EPI_ISL_4815684|2021-09-11|NorthAmerica -hCoV-19/Switzerland/LU-UHB-43062408/2021|EPI_ISL_4571417|2021-09-12|Europe -hCoV-19/Wales/PHWC-PD3O6D/2021|EPI_ISL_4788500|2021-09-12|Europe -hCoV-19/Switzerland/VD-CHUV-GEN7091/2021|EPI_ISL_4632132|2021-09-12|Europe -hCoV-19/Wales/PHWC-PD4KYR/2021|EPI_ISL_4791947|2021-09-12|Europe -hCoV-19/England/HSLL-1E5C453/2021|EPI_ISL_4323705|2021-09-12|Europe -hCoV-19/Netherlands/FL-RIVM-60727/2021|EPI_ISL_4840906|2021-09-12|Europe -hCoV-19/Ireland/G-NVRL-M37IRL91413/2021|EPI_ISL_4783211|2021-09-12|Europe -hCoV-19/Belgium/ULG-20357/2021|EPI_ISL_4740572|2021-09-13|Europe -hCoV-19/Germany/BY-RKI-I-249233/2021|EPI_ISL_4445966|2021-09-13|Europe -hCoV-19/Germany/SH-RKI-I-261716/2021|EPI_ISL_4618979|2021-09-13|Europe -hCoV-19/Wales/PHWC-PD3GOJ/2021|EPI_ISL_4787533|2021-09-13|Europe -hCoV-19/Sweden/20758898P/2021|EPI_ISL_4864998|2021-09-13|Europe -hCoV-19/USA/IL-CDC-LC0281666/2021|EPI_ISL_4816105|2021-09-13|NorthAmerica -hCoV-19/USA/UT-UPHL-210928918510/9/13/21|EPI_ISL_4891125|2021-09-13|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_RYM2CO6DYJ7TYPFF/2021|EPI_ISL_4488486|2021-09-13|NorthAmerica -hCoV-19/USA/CT-JAX-11556846/2021|EPI_ISL_4417548|2021-09-13|NorthAmerica -hCoV-19/USA/GA-CDC-LC0272118/2021|EPI_ISL_4816588|2021-09-13|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_FPQAM7MWH2DBP4FU/2021|EPI_ISL_4487377|2021-09-13|NorthAmerica -hCoV-19/USA/PA-Jefferson_20210914_20_35/2021|EPI_ISL_4730946|2021-09-13|NorthAmerica -hCoV-19/England/MILK-1E6D45F/2021|EPI_ISL_4322338|2021-09-14|Europe -hCoV-19/Scotland/QEUH-1E64C6F/2021|EPI_ISL_4408239|2021-09-14|Europe -hCoV-19/England/NEWC-1E6C56C/2021|EPI_ISL_4352715|2021-09-14|Europe -hCoV-19/England/PLYM-1E74394/2021|EPI_ISL_4353084|2021-09-14|Europe -hCoV-19/Ireland/DL-NVRL-M38IRL16595/2021|EPI_ISL_4781999|2021-09-14|Europe -hCoV-19/USA/AZ-ASU15127/2021|EPI_ISL_4469363|2021-09-14|NorthAmerica -hCoV-19/USA/DC-CDC-LC0278290/2021|EPI_ISL_4818686|2021-09-14|NorthAmerica -hCoV-19/Germany/BY-RKI-I-251474/2021|EPI_ISL_4608820|2021-09-15|Europe -hCoV-19/England/ALDP-1E84EBE/2021|EPI_ISL_4349363|2021-09-15|Europe -hCoV-19/Wales/PHWC-PD45C5/2021|EPI_ISL_4790195|2021-09-15|Europe -hCoV-19/England/QEUH-1E96314/2021|EPI_ISL_4349778|2021-09-15|Europe -hCoV-19/Scotland/QEUH-1E7FEB6/2021|EPI_ISL_4406315|2021-09-15|Europe -hCoV-19/Italy/SIC-CQRC-2450878-2043/2021|EPI_ISL_4628130|2021-09-15|Europe -hCoV-19/Sweden/20771824P/2021|EPI_ISL_4866635|2021-09-16|Europe -hCoV-19/Netherlands/NB-PAMM-I16-0498/2021|EPI_ISL_4558553|2021-09-16|Europe -hCoV-19/Scotland/QEUH-1E9FB13/2021|EPI_ISL_4404849|2021-09-16|Europe -hCoV-19/Germany/SH-RKI-I-260460/2021|EPI_ISL_4616734|2021-09-16|Europe -hCoV-19/England/ALDP-1EAE829/2021|EPI_ISL_4477472|2021-09-16|Europe -hCoV-19/England/ALDP-1EC042D/2021|EPI_ISL_4478909|2021-09-16|Europe -hCoV-19/England/QEUH-1EC7A06/2021|EPI_ISL_4501459|2021-09-16|Europe -hCoV-19/England/MILK-1E95078/2021|EPI_ISL_4349909|2021-09-16|Europe -hCoV-19/USA/MA-CDCBI-CRSP_36QMM736QPOP42O5/2021|EPI_ISL_4516379|2021-09-16|NorthAmerica -hCoV-19/USA/CT-Yale-10539/2021|EPI_ISL_4950070|2021-09-16|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_3IYREWWSILDT26TX/2021|EPI_ISL_4516397|2021-09-16|NorthAmerica -hCoV-19/Germany/NW-RKI-I-256355/2021|EPI_ISL_4613107|2021-09-17|Europe -hCoV-19/England/BRBR-1EBBE72/2021|EPI_ISL_4477457|2021-09-17|Europe -hCoV-19/England/MILK-1EB7CA9/2021|EPI_ISL_4451171|2021-09-17|Europe -hCoV-19/England/MILK-1EAB4CE/2021|EPI_ISL_4452505|2021-09-17|Europe -hCoV-19/Norway/20863/2021|EPI_ISL_4740044|2021-09-17|Europe -hCoV-19/England/ALDP-1EF06F1/2021|EPI_ISL_4521498|2021-09-17|Europe -hCoV-19/England/MILK-1EA923F/2021|EPI_ISL_4452552|2021-09-17|Europe -hCoV-19/USA/WY-WYPHL-21081574/2021|EPI_ISL_4956161|2021-09-17|NorthAmerica -hCoV-19/USA/CA-ASU15542/2021|EPI_ISL_4513288|2021-09-17|NorthAmerica -hCoV-19/USA/ND-CDC-IBX173181893552/2021|EPI_ISL_4808599|2021-09-17|NorthAmerica -hCoV-19/England/ALDP-1EEDDB6/2021|EPI_ISL_4523553|2021-09-18|Europe -hCoV-19/England/QEUH-1ED3A34/2021|EPI_ISL_4502984|2021-09-18|Europe -hCoV-19/England/BRBR-1EBE3AD/2021|EPI_ISL_4478975|2021-09-18|Europe -hCoV-19/England/BRBR-1EC84BC/2021|EPI_ISL_4502268|2021-09-18|Europe -hCoV-19/England/BRBR-1EFA888/2021|EPI_ISL_4527571|2021-09-19|Europe -hCoV-19/Portugal/PT17699/2021|EPI_ISL_4796498|2021-09-20|Europe -hCoV-19/Belgium/UZA-UA-CV2214234457/2021|EPI_ISL_4576797|2021-09-20|Europe -hCoV-19/USA/MA-CDCBI-CRSP_VIIDWSH7X7WA77KA/2021|EPI_ISL_4628608|2021-09-20|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_KYQO5LPDGIM2T2QO/2021|EPI_ISL_4628386|2021-09-20|NorthAmerica -hCoV-19/Germany/NW-RKI-I-259784/2021|EPI_ISL_4615820|2021-09-21|Europe -hCoV-19/Portugal/PT17720/2021|EPI_ISL_4796567|2021-09-21|Europe -hCoV-19/England/NEWC-1F04F85/2021|EPI_ISL_4588812|2021-09-21|Europe -hCoV-19/England/ALDP-1F24AE8/2021|EPI_ISL_4590914|2021-09-21|Europe -hCoV-19/England/MILK-1F294F4/2021|EPI_ISL_4594463|2021-09-21|Europe -hCoV-19/Scotland/NEWC-1F0CE35/2021|EPI_ISL_4736469|2021-09-21|Europe -hCoV-19/Sweden/20794827P/2021|EPI_ISL_4856528|2021-09-21|Europe -hCoV-19/USA/WY-WYPHL-21083651/2021|EPI_ISL_4920028|2021-09-21|NorthAmerica -hCoV-19/England/BRBR-1F20F0B/2021|EPI_ISL_4590041|2021-09-22|Europe -hCoV-19/England/ALDP-1F27BF1/2021|EPI_ISL_4594271|2021-09-22|Europe -hCoV-19/England/QEUH-1F2E2B9/2021|EPI_ISL_4579669|2021-09-22|Europe -hCoV-19/Denmark/DCGC-176646/2021|EPI_ISL_4643294|2021-09-22|Europe -hCoV-19/England/PLYM-1F2E92D/2021|EPI_ISL_4752231|2021-09-22|Europe -hCoV-19/Germany/BY-RKI-I-263980/2021|EPI_ISL_4928780|2021-09-22|Europe -hCoV-19/Wales/PHWC-PDHG9F/2021|EPI_ISL_4799709|2021-09-22|Europe -hCoV-19/England/MILK-1F4063D/2021|EPI_ISL_4585555|2021-09-22|Europe -hCoV-19/USA/MD-MDH-4982/2021|EPI_ISL_4929668|2021-09-22|NorthAmerica -hCoV-19/England/ALDP-1F51156/2021|EPI_ISL_4680040|2021-09-23|Europe -hCoV-19/England/ALDP-1F61117/2021|EPI_ISL_4669731|2021-09-23|Europe -hCoV-19/England/NEWC-1F5C4BC/2021|EPI_ISL_4674244|2021-09-23|Europe -hCoV-19/Scotland/QEUH-1F5E71B/2021|EPI_ISL_4671168|2021-09-23|Europe -hCoV-19/England/ALDP-1F60FA5/2021|EPI_ISL_4669537|2021-09-23|Europe -hCoV-19/England/ALDP-1F5BF70/2021|EPI_ISL_4672563|2021-09-23|Europe -hCoV-19/England/ALDP-1F516B1/2021|EPI_ISL_4680042|2021-09-23|Europe -hCoV-19/USA/MA-NEIDL-01421/2021|EPI_ISL_4882391|2021-09-23|NorthAmerica -hCoV-19/USA/NY-PRL-2021_0924_00B24/2021|EPI_ISL_4760629|2021-09-23|NorthAmerica -hCoV-19/USA/MN-CDC-IBX603674338139/2021|EPI_ISL_4823314|2021-09-23|NorthAmerica -hCoV-19/USA/MA-CDCBI-CRSP_5LNICT3DP57TEPMW/2021|EPI_ISL_4728991|2021-09-23|NorthAmerica -hCoV-19/Germany/TH-RKI-I-267789/2021|EPI_ISL_4933973|2021-09-24|Europe -hCoV-19/England/ALDP-1F631E8/2021|EPI_ISL_4735401|2021-09-24|Europe -hCoV-19/England/MILK-1F576BB/2021|EPI_ISL_4672420|2021-09-24|Europe -hCoV-19/England/MILK-1F70D7B/2021|EPI_ISL_4735190|2021-09-24|Europe -hCoV-19/England/BRBR-1F5AADA/2021|EPI_ISL_4619702|2021-09-24|Europe -hCoV-19/Germany/BW-RKI-I-265541/2021|EPI_ISL_4931206|2021-09-24|Europe -hCoV-19/England/ALDP-1F87281/2021|EPI_ISL_4751133|2021-09-25|Europe -hCoV-19/Germany/BW-RKI-I-265494/2021|EPI_ISL_4931157|2021-09-25|Europe -hCoV-19/USA/VT-CDCBI-CRSP_COC5K6W5KBYXIOI4/2021|EPI_ISL_4759074|2021-09-25|NorthAmerica -hCoV-19/England/PLYM-1F8855A/2021|EPI_ISL_4754746|2021-09-26|Europe -hCoV-19/England/ALDP-1FA4AC2/2021|EPI_ISL_4750891|2021-09-26|Europe -hCoV-19/England/PLYM-1F8AE11/2021|EPI_ISL_4753420|2021-09-26|Europe -hCoV-19/Singapore/6194/2021|EPI_ISL_4762355|2021-09-27|Asia -hCoV-19/England/MILK-1F9598B/2021|EPI_ISL_4755722|2021-09-27|Europe -hCoV-19/England/MILK-1FA3735/2021|EPI_ISL_4873868|2021-09-27|Europe -hCoV-19/England/ALDP-1FA825D/2021|EPI_ISL_4764025|2021-09-27|Europe -hCoV-19/England/HSLL-1FB5EFF/2021|EPI_ISL_4871932|2021-09-27|Europe -hCoV-19/England/MILK-1FB1136/2021|EPI_ISL_4764942|2021-09-27|Europe -hCoV-19/Belgium/UZA-UA-CV1012754061/2021|EPI_ISL_4820504|2021-09-28|Europe -hCoV-19/England/ALDP-1FD6696/2021|EPI_ISL_4899763|2021-09-28|Europe -hCoV-19/England/NEWC-1FC66E4/2021|EPI_ISL_4867007|2021-09-28|Europe -hCoV-19/England/MILK-1FBCFD7/2021|EPI_ISL_4864510|2021-09-28|Europe -hCoV-19/England/PLYM-1FCE50D/2021|EPI_ISL_4851788|2021-09-28|Europe -hCoV-19/England/MILK-1FACD2B/2021|EPI_ISL_4765965|2021-09-28|Europe -hCoV-19/England/MILK-1FB2302/2021|EPI_ISL_4870857|2021-09-28|Europe -hCoV-19/Scotland/QEUH-1FC7DC0/2021|EPI_ISL_4900895|2021-09-28|Europe -hCoV-19/England/PLYM-1FE8057/2021|EPI_ISL_4893981|2021-09-29|Europe -hCoV-19/Germany/NW-RKI-I-271223/2021|EPI_ISL_4937039|2021-09-29|Europe -hCoV-19/England/NEWC-1FC15A0/2021|EPI_ISL_4855577|2021-09-29|Europe -hCoV-19/England/NEWC-1FC0AEE/2021|EPI_ISL_4863564|2021-09-29|Europe -hCoV-19/USA/CA-SLOPH-C211001-30/2021|EPI_ISL_4910410|2021-09-29|NorthAmerica -hCoV-19/Germany/NW-RKI-I-272254/2021|EPI_ISL_4938046|2021-09-30|Europe -hCoV-19/Denmark/DCGC-179236/2021|EPI_ISL_4942912|2021-09-30|Europe diff --git a/examples/test2.dist b/examples/test2.dist deleted file mode 100644 index 387e751..0000000 --- a/examples/test2.dist +++ /dev/null @@ -1,10 +0,0 @@ -4 -7,5 -6,4,5 -5,3,4,3 -7,5,6,5,4 -5,3,6,5,4,6 -5,3,2,3,2,4,4 -5,3,4,3,2,4,4,2 -5,3,4,3,2,4,4,2,2 -4,2,5,4,3,5,3,3,3,3 diff --git a/examples/test2.fltr b/examples/test2.fltr deleted file mode 100644 index f46345b..0000000 --- a/examples/test2.fltr +++ /dev/null @@ -1,11 +0,0 @@ -0 -100 -200 -200 -200 -300 -300 -400 -500 -600 -600 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b751982 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module murit + +go 1.18 diff --git a/murit.go b/main.go similarity index 62% rename from murit.go rename to main.go index 0bb1e69..cca47fc 100644 --- a/murit.go +++ b/main.go @@ -16,6 +16,9 @@ import ( "time" ) + +// define two kinds of structs for handling input of parallelized workers + type workload struct { i int text string @@ -27,7 +30,7 @@ type args struct{ } -// lexicographical comparisons of lists (of integers) +// implementation of standard partial order on R^n func leq(poset_element1 []float64, poset_element2 []float64) bool { var L int if len(poset_element1) <= len(poset_element2) { @@ -35,14 +38,15 @@ func leq(poset_element1 []float64, poset_element2 []float64) bool { } else { L = len(poset_element2) } - for a:= 0; a poset_element2[a]) { + for i:= 0; i poset_element2[i]) { return false } } return true } +// implementation of equality check on R^n func equal(poset_element1 []float64, poset_element2 []float64) bool { var L int if len(poset_element1) <= len(poset_element2) { @@ -50,8 +54,8 @@ func equal(poset_element1 []float64, poset_element2 []float64) bool { } else { L = len(poset_element2) } - for a:= 0; a r") + + + // define custom flag.Usage() to be printed upon -help call. + flag.Usage = func() { + flagSet := flag.CommandLine + aux_description = `Usage: +murit --dist --pt_fltr --sub_fltr (VR_0, i_0, j_0, ...)-- ... --(VR_n, i_n, j_n, ...) [--options] +` + fmt.Printf(aux_description) + fmt.Printf("\nCommand Line Arguments\n") + arguments := []string{"dist", "pt_fltr", "sub_fltr", "threads", "verbose", "help", "ripser"} + for _, name := range arguments { + flag := flagSet.Lookup(name) + fmt.Printf("-%s\n", flag.Name) + fmt.Printf(" %s\n", flag.Usage) + } + ripser_arguments := []string{"dim", "threshold", "modulus", "ratio"} + for _, name := range ripser_arguments { + flag := flagSet.Lookup(name) + fmt.Printf(" -%s\n", flag.Name) + fmt.Printf(" %s\n", flag.Usage) + } + } - flag.BoolVar(&ripser, "ripser", false, "run ripser?") - flag.BoolVar(&verbose, "verbose", false, "show status messages?") - flag.BoolVar(&help, "help", false, "Get help message") + // Parse flag.Parse() // print help message if help { - flag.PrintDefaults() + flag.Usage() return } @@ -211,9 +282,8 @@ func main() { } - if verbose {fmt.Println("---")} // Read filtration file - if verbose {fmt.Println("Read point annotation file")} + if verbose {fmt.Println("Read pointwise annotation file")} fltr_file, err := os.Open(fltr_file_name) if err != nil { log.Fatalf("Failed to open file '%s': %v", fltr_file_name, err) @@ -224,6 +294,7 @@ func main() { for fltr_scanner.Scan() { var row []float64 for _, v := range strings.Split(fltr_scanner.Text(),",") { + v = strings.Trim(v, " ()") s, err := strconv.ParseFloat(v,64) if err != nil { log.Fatalf("Filtration parse error: %v", err) @@ -237,10 +308,10 @@ func main() { // Read sub filtration from command line OR create default sub filtration - if verbose {fmt.Println("Read subfiltration")} var sub_fltr [][]float64 if sub_fltr_input != "" { // Parse sub filtration from command line input + if verbose {fmt.Println("Read subfiltration")} for _, p := range strings.Split(sub_fltr_input,"--"){ var point []float64 for _, q := range strings.Split(strings.Trim(p, " []"),","){ @@ -258,10 +329,9 @@ func main() { log.Fatalf("Invalid sub-filtration: sub_fltr[%v] = %v !<= %v = sub_fltr[%v]", i, sub_fltr[i], sub_fltr[j], j) } } - // Set filename of auxiliary distance matrix in dependence of sub_fltr - aux_file_name = filepath.Dir(dist_file_name)+"/"+hash(sub_fltr_input)+".aux" } else { // Extract a valid sub filtration from the filtration file (traverse through list once and successively add larger elements) + if verbose {fmt.Println("Build subfiltration")} sub_fltr = append(sub_fltr, append([]float64{0}, fltr_list[0]...)) for _, x := range fltr_list { x = append([]float64{1}, x...) @@ -269,15 +339,20 @@ func main() { sub_fltr = append(sub_fltr, x) } } - aux_file_name = filepath.Dir(dist_file_name)+"/"+strconv.FormatInt(time.Now().UTC().UnixNano(), 10)+".aux" } if verbose {fmt.Println(sub_fltr)} + // + // Prepare Input and Communication Channels + // - //// Prepare input and communication channels - if verbose {fmt.Println("Building auxiliary Distance Matrix")} + if verbose {fmt.Println("Build auxiliary Distance Matrix")} + // For future development: + // Set filename of auxiliary distance matrix in dependence of sub_fltr + // aux_file_name = filepath.Dir(dist_file_name)+"/"+hash(sub_fltr_input)+".aux" + aux_file_name = filepath.Dir(dist_file_name)+"/"+strconv.FormatInt(time.Now().UTC().UnixNano(), 10)+".aux" // Concatenate background information from above for workers b := args{sub_fltr, fltr_list} @@ -287,7 +362,7 @@ func main() { if err != nil { log.Fatalf("Failed to open file '%s': %v", dist_file_name, err) } - defer in_file.Close() // defer closing of in_file (MB: defers until main is closed, I think) + defer in_file.Close() // defer closing of in_file until main() is closed // Initialize communication channels var numThreads int @@ -321,7 +396,9 @@ func main() { } - //// Parallel execution + // + // Parallel Execution + // // Start reader go reader(in_file, toWorker) @@ -335,17 +412,40 @@ func main() { writer(toWriter, out_writer) - //// Run ripser on auxiliary distance matrix and translate result + + // + // Calculate Persistent Homology with Ripser + // + + // Run ripser on auxiliary distance matrix var ripser_output []byte if ripser { if verbose {fmt.Println("---")} if verbose {fmt.Println("Run Ripser")} - ripser_cmd := exec.Command("ripser", "--format", "lower-distance", aux_file_name) + + ripser_arguments := []string{"--format", "lower-distance"} + if ripser_dim != ""{ + ripser_arguments = append(ripser_arguments, "--dim", ripser_dim) + } + if ripser_threshold != ""{ + ripser_arguments = append(ripser_arguments, "--threshold", ripser_threshold) + } + if ripser_modulus != ""{ + ripser_arguments = append(ripser_arguments, "--modulus", ripser_modulus) + } + if ripser_ratio != ""{ + ripser_arguments = append(ripser_arguments, "--ratio", ripser_ratio) + } + ripser_arguments = append(ripser_arguments, aux_file_name) + + ripser_cmd := exec.Command("ripser", ripser_arguments...) + var err error ripser_output, err = ripser_cmd.CombinedOutput() if err != nil { log.Fatalf("Failed to run command: %v\nCommand output: %s", err, string(ripser_output)) } + } err = os.Remove(aux_file_name) @@ -374,12 +474,14 @@ func main() { if err != nil { log.Fatalf("parsing error: %v", err) } + //adjust from one- to zero-indexing birth = birth-1 death, err := strconv.Atoi(x[1]) if err != nil { log.Fatalf("parsing error: %v", err) } + //adjust from one- to zero-indexing death = death-1 fmt.Println(" [", sub_fltr[birth], ",", sub_fltr[death], "):")