Programs and Functions in DNA-Based Data Storage
By dividing the data into blocks and mapping it to multiple nucleic acid molecule sequences, the problem of low data storage efficiency in the prior art is solved, and efficient data storage and retrieval is achieved.
Patent Information
- Application Number
- JP2022568555
- Authority / Receiving Office
- JP · JP
- Patent Type
- Patents
- Current Assignee / Owner
- Priority Date
- 2021-03-24
- Filing Date
- 2021-05-11
- Publication Date
- 2025-04-21
- Estimated Expiration
- 2041-05-11
AI Technical Summary
In the prior art, when storing data in nucleic acid molecules, the stability of the gene combination corrector is poor, resulting in poor stability of the gene combination corrector and it is difficult to achieve efficient and economical mercury removal.
Efficient data storage and retrieval is achieved by dividing the data into blocks and assigning each block to multiple nucleic acid molecules, and using symbol sequences and coding schemes to map symbol sequences to multiple nucleic acid molecules.
It realizes efficient storage and retrieval of large-scale data sets, reduces the problem of poor stability of gene combination correctors, and improves the efficiency and reliability of data storage.
Smart Images

Figure 0007665655000003 
Figure 0007665655000004 
Figure 0007665655000005
Abstract
Description
[Technical field]
[0001] REFERENCE TO RELATED APPLICATIONS This application claims priority to and the benefit of U.S. Provisional Patent Application No. 63 / 023,071, entitled "BRANCHING PROGRAMS IN DNA-BASED DATA STORAGE," filed May 11, 2020, U.S. Provisional Patent Application No. 63 / 023,342, entitled "BRANCHING PROGRAMS IN DNA-BASED DATA STORAGE," filed May 12, 2020, U.S. Provisional Patent Application No. 63 / 066,628, entitled "PROGRAMS AND FUNCTIONS IN DNA-BASED DATA STORAGE," filed August 17, 2020, and U.S. Provisional Patent Application No. 63 / 165,559, entitled "PROGRAMS AND FUNCTIONS IN DNA-BASED DATA STORAGE," filed March 24, 2021. The entire contents of the above-referenced applications are incorporated herein by reference. [Background technology]
[0002] background Nucleic acid digital data storage is a stable method for encoding and storing information for long periods of time, and data is stored at higher densities than magnetic tape or hard drive storage systems. In addition, digital data stored in nucleic acid molecules stored in low temperature and dry conditions can be retrieved after as many as 60,000 years or more.
[0003] One way to access digital data stored in nucleic acid molecules is to sequence them. Thus, nucleic acid digital data storage may be an ideal method for storing data that is not accessed frequently, but may contain large amounts of information to be stored or archived over long periods of time.
[0004] Existing methods of storing data in nucleic acid molecules rely on encoding digital information (e.g., binary code) into nucleic acid sequences base by base, such that the relationship between bases in the sequence is directly converted into digital information (e.g., binary code). However, such de novo base by base nucleic acid synthesis is error-prone and expensive. Furthermore, when data is encoded at single-base resolution, certain functions cannot be performed on the data stored by such existing methods of nucleic acid digital data storage without first converting the entire set of molecules into digital information. For example, such functions include basic operations that are commonly performed when data is stored on disk, such as logic functions, addition, subtraction, and query searches that include whether a particular query pattern occurs in a data set, the number of occurrences, and the location of each occurrence. Summary of the Invention [Means for solving the problem]
[0005] Abstract The systems, devices and methods described herein generally relate to methods for encoding data into nucleic acids. Encoding schemes, data structures, access methods, computer programs, and chemical implementations thereof are provided herein. These techniques allow for the encoding of larger data sets and computer computations on such data sets than conventional nucleic acid-based data storage techniques.
[0006] In a first aspect, a method for storing digital information in a nucleic acid molecule is provided herein, the method comprising the steps of partitioning identifier nucleic acid sequences into blocks, each identifier nucleic acid sequence comprising a component nucleic acid sequence, at least a portion of which is configured to bind to one or more probes, assigning a symbol string to one of the blocks, mapping the symbol string to a plurality of identifier nucleic acid sequences within the block, and constructing individual identifier nucleic acid molecules of the plurality of identifier nucleic acid sequences.
[0007] In some implementations, the mapping is done using a codebook that maps words to codewords, each of which includes one or more symbols of a symbol string, and each of which includes one or more of the identifier nucleic acid sequences to which the symbol string is mapped. There may be a fixed number of codewords per block. The range of identifiers encoding the gth instance of a block is the codeword instance (g-1). * c+1~g * We can calculate c as the encoding range.
[0008] In some implementations, a block is accessible by an accessing program. A block is associated with a location, which may include information for accessing the block. A block may contain information about the location of another block. A block may represent a node in a graph. The graph may be a tree. For example, the tree may be a suffix tree or a B-tree. A block may be an element of an inverted index. Multiple blocks form a linked list, in which a first block may point to a second block to accommodate large strings.
[0009] In some implementations, the identifier nucleic acid sequences of each block exclusively share the same component nucleic acid sequences within a specified set of key layers. The key layers may encode a data object. The data object may be a native key. The native key may be configured such that each symbol corresponds to a component nucleic acid sequence of the corresponding key layer. Range queries across several keys sharing a common symbol value in a specified set of positions may be performed by accessing all identifiers that contain their corresponding components. Queries for all keys that satisfy a finite automaton or regular expression may be performed by the accessing program.
[0010] In some implementations, the method further includes storing a value in the associated block of each key. The value may be obtained using its corresponding key. The key may be a function of the value of the key. For example, the key is a hash, bloom filter, structure array, classifier, signature, record, or fingerprint derived from its corresponding value. The access program may be designed to access all keys similar to or sharing a common symbolic value with the query key derived from the reference value.
[0011] In some implementations, the count of the number of keys is determined by measuring the DNA concentration. The DNA concentration can be measured by qPCR assay, plate reader assay, fluorimetry or spectrophotometry. The DNA concentration can be normalized by a standard to determine the number of identifier sequences in the sample. The relative number of keys containing a particular symbol can be determined by performing qPCR with a probe for the corresponding component.
[0012] In some implementations, an identifier sequence is created for the reference key. The identifier sequence can be used as a hybridization probe in a hybridization reaction to search for all similar keys. The temperature or pH of the hybridization reaction can be used to control the stringency of the similarity search.
[0013] In a second aspect, a method for manipulating digital information stored in nucleic acid molecules is provided herein, the method comprising: (a) obtaining a first pool of identifier nucleic acid molecules, the pool having a powder, liquid, or solid form, each identifier nucleic acid molecule of the first pool comprising a component nucleic acid molecule, at least a portion of which is configured to bind to one or more probes, the identifier nucleic acid molecule representing an input string; (b) screening the identifier nucleic acid molecules of the first pool by targeting at least one of the component nucleic acid molecules with the probe to create an intermediate pool comprising a subset of identifier nucleic acid molecules from the first pool, the intermediate pool representing the result of an if-then-else operation performed on the input string; and (c) repeating step (b), the intermediate pool replacing the first pool in all subsequent steps, until a final pool of identifier nucleic acid molecules representing at least a portion of the output string is created.
[0014] In some implementations, each identifier nucleic acid molecule of the first pool comprises a distinct component nucleic acid sequence from each of the M strata, each strata comprising a set of component nucleic acid sequences. Each identifier nucleic acid molecule may represent a data object. The component nucleic acid sequences of the identifier nucleic acid molecule may represent operands of the data object.
[0015] In some implementations, the probe comprises an identifier nucleic acid molecule in a pool comprising specific component nucleic acid molecules. In some implementations, the probe is a polymerase chain reaction (PCR) primer and the if-then-else operation is performed by PCR. In some implementations, the probe is an affinity tagged oligonucleotide and the if-then-else operation is performed by an affinity pull-down assay.
[0016] In some implementations, two or more if-then-else operations are performed in parallel on one or more pools of identifier nucleic acid molecules. In some implementations, the method further comprises splitting at least one of the first pool, the intermediate pool, or the final pool into at least two overlapping pools. The method may comprise replicating at least one of the first pool, the intermediate pool, or the final pool before splitting. For example, the replicating step is performed by polymerase chain reaction (PCR). The method may comprise combining at least two intermediate pools of identifier nucleic acid molecules to form a new intermediate pool of identifier nucleic acid molecules or a second pool of identifier nucleic acid molecules.
[0017] In some implementations, the repetition of the if-then-else operations of (b) in (c) represents the execution of a graph program, the output of which places identifier nucleic acid molecules representing the data objects into a final pool representing at least a portion of an output string. The graph program may represent a function on the data objects. In some implementations, at least a portion of the output string is an output of the function on the data objects. The final pool into which the identifier nucleic acid molecules are placed may determine the output of the function for the corresponding data object according to the graph program.
[0018] In a third aspect, a method for storing numerical data in a nucleic acid is provided herein, the method comprising: determining an expected copy count of an identifier nucleic acid sequence based on the numerical data and a proportionality constant; and generating a sample containing an actual number of identifier nucleic acid molecules each having the identifier nucleic acid sequence, the actual number approximating the expected copy count.
[0019] In some implementations, the numerical data is a number, and the expected copy count is proportional to the number. At least a portion of each identifier nucleic acid molecule may be configured to bind to one or more probes. The method may further include inputting the sample into an operation to produce an output sample. In some implementations, the operation includes multiplying the number by a power of two by performing a polymerase chain reaction (PCR) with primers that bind to common regions at the edges of the identifier nucleic acid sequences to form an output sample containing a PCR product. For example, the power of two corresponds to a number of PCR cycles. In some implementations, the operation includes multiplying the number by a decimal by performing an aliquot to isolate a fractional volume of the sample to form an output sample. In some implementations, the operation includes adding the number as a first number to a second number in the second input sample by a mixing operation that combines the sample with a second input sample to form an output sample. The method may further include inputting the output sample into a second operation.
[0020] In some implementations, the number is a first element of the vector. In some implementations, the method further comprises determining a second expected copy count of the identifier nucleic acid sequence based on a second element of the vector and a proportionality constant, and generating a second sample containing a second actual number of identifier nucleic acid molecules each having the identifier nucleic acid sequence, the second actual number approximating the second expected copy count. The method may further comprise performing a linear function on the vector by at least one of PCR, aliquoting, and mixing. This may involve converting the binary vector to a unary value in the output sample by performing the linear function. The linear function may be a scoring function. For example, the scoring function computes a higher output value for the target vector than for the non-target vector, whereby the copy count of the identifier sequence corresponding to the target vector is enriched in the output sample. The identifier sequence corresponding to the target vector may be determined by sequencing the output sample.
[0021] In some implementations, the double-stranded DNA selection operation is used to form a new output sample in which the identifier sequences corresponding to the target vector are further enriched in the output sample, thereby increasing the copy count ratio between the two identifier sequences in the output sample. The operation or its repeated application may correspond to an activation function or a quadratic function in a neural network. The output sample may be allowed to equilibrate before the double-stranded DNA selection operation. The method may involve changing the temperature or adding a cofactor to the output sample before the double-stranded DNA selection operation. The double-stranded DNA selection operation may involve at least one of chromatography, gel electrophoresis, mass spectrometry, flow cytometry, fluorescence activated sorting, membrane capture, silica column capture, silica bead capture, or affinity capture.
[0022] In some implementations, the vector is a compressed representation of a larger data object, where the compressed representation is a hash, Bloom filter, signature, structure array, or fingerprint of the larger data object. The larger data object can be obtained using the corresponding identifier nucleic acid sequence as a key.
[0023] In a fourth aspect, a method for preparing a plurality of nucleic acid libraries encoding a dataset is provided herein. The method includes the steps of: providing a dataset including at least one data object, each data object having an object rank and including at least one byte value; dividing each data object into a plurality of parts, each part of each data object being ranked such that each part of each data object includes (1) a respective byte value of at least one byte value from the corresponding data object of the part, and (2) a part rank indicating a position of each byte value of the at least one byte value of the corresponding data object of the part; and mapping the dataset to a plurality of nucleic acid libraries having solid, liquid, or powder form, each nucleic acid library having a library rank and including a plurality of nucleic acid molecules encoding parts having the same part rank from different data objects, the same part rank corresponding to the respective library rank, each nucleic acid molecule including a key encoding the respective object rank and an operand encoding the respective byte value.
[0024] In some implementations, each nucleic acid molecule includes L components, each component selected from C possible components of a distinct layer of the L layers, M of the L components encode a key, and N of the L components encode an operand, such that M+N≦L. Byte values of the portions encoded by each nucleic acid molecule may be stored in the operands of the nucleic acid molecule. In some implementations, each portion contains K bytes or less, each data object contains at most T bytes of values, and each data object is divided into at most P=[T / K] portions, where K may be any value less than L×[log2C] / 8. In some implementations, the dataset is encoded using W nucleic acid libraries, each library contains nucleic acid molecules each having an identifier rank of 1,...,R, and the dataset includes D data objects, where R≧D. The jth portion of the P portions of the rth data object of the D data objects is in the jth library, in the interval [C N r,C N (r+1)-1] is encoded in the operand of the nucleic acid molecule.
[0025] In a fifth aspect, there is provided herein a method of obtaining a subset of data objects of a dataset encoded in a plurality of nucleic acid libraries according to the method of the fourth aspect, the method comprising the steps of providing a target nucleic acid library and a query nucleic acid library, each library containing nucleic acid molecules each comprising a key and an operand, extracting the key from the nucleic acid molecules of the query nucleic acid library, matching nucleic acid molecules in the target nucleic acid library with keys that match the keys extracted from the query nucleic acid library, and selecting and outputting the matched nucleic acid molecules.
[0026] In some implementations, the extracting step includes converting each nucleic acid molecule of the query nucleic acid library to a single-stranded nucleic acid molecule, and the matching step includes hybridizing a nucleic acid molecule in the target nucleic acid library to a complementary single-stranded key. The selecting step can involve providing an enzyme that selectively degrades single-stranded nucleic acids. For example, the enzyme is P1.
[0027] In some implementations, the extracting step comprises digesting each nucleic acid molecule in the query nucleic acid library with a sequence-specific enzyme that recognizes a particular sequence found in each nucleic acid molecule. The extracting step may further comprise size-selecting keys that are present in double-stranded form.
[0028] In some implementations, the extracting step includes introducing a nick between the key and the operand of each nucleic acid molecule using a sequence-specific nicking enzyme, incorporating a labeled nucleotide at the nick, and capturing the labeled nucleotide to maintain the key in single-stranded form. The labeled nucleotide may include a biotin label, and the capturing step may include affinity capture with streptavidin-coated beads.
[0029] In some implementations, the extracting step includes selectively amplifying and purifying via PCR the keys from the query nucleic acid library, where the keys are flanked by universal sequences that act as primer binding sites for the PCR.
[0030] In some implementations, the matching step involves converting the target nucleic acid library and the extracted keys to single-stranded form and hybridizing the single-stranded extracted keys to complementary keys in the target nucleic acid library. The selecting step may involve selectively degrading the remaining single-stranded molecules. The selecting step may alternatively involve gel electrophoresis.
[0031] In some implementations, the query nucleic acid library encodes a first set of portions of the dataset and the target nucleic acid library encodes a second set of portions of the dataset, in which case the extracting step acts as a first if-then-else operation on the dataset, and the matching step and the selecting and outputting steps act as a second if-then-else operation on the dataset.
[0032] In some aspects, provided herein is a system configured to perform any of the methods described herein. The system may be a printer-finisher system configured to distribute DNA components to discrete locations (e.g., reaction compartments) on a substrate, distribute reagents that provide optimal conditions for ligation reactions, and pool all DNA identifiers that make up a library. The system may store and manipulate (e.g., via automated liquid handling) nucleic acid molecules in containers. The system may distribute probes in the compartments or containers to access a subset of the nucleic acid molecules. The system may be configured to aliquot and replicate the pool of nucleic acid molecules.
[0033] In some aspects, a composition is provided herein that comprises a nucleic acid molecule that represents digital information according to any of the methods described herein. The composition comprises an identifier nucleic acid molecule that is composed of component nucleic acid molecules. The identifier nucleic acid molecules can be collected into a pool and mapped to digital information. For example, the presence of the identifier indicates a particular bit or symbol value in the string, and the absence of the identifier indicates another bit or symbol value in the string.
[0034] The above and other objects and advantages will become apparent from the following detailed description considered in conjunction with the accompanying drawings, in which like reference characters refer to like parts throughout. [Brief description of the drawings]
[0035] [Figure 1]1A and 1B show schematic diagrams of "data at address" encoding using identifiers (eg, nucleic acid molecules) according to an example implementation.
[0036] [Diagram 2] 2A and 2B show a schematic diagram of encoding digital information with an identifier according to an example implementation.
[0037] [Diagram 3] FIG. 3 illustrates a "product scheme" method for constructing an identifier by combinatorially assembling distinct components, according to an example implementation.
[0038] [Figure 4] FIG. 4 shows a schematic diagram of using overlap extension polymerase chain reaction to construct identifiers from components, according to an exemplary implementation.
[0039] [Diagram 5] FIG. 5 shows a schematic of using cohesive end ligation to construct identifiers from components, according to an exemplary implementation.
[0040] [Figure 6] 6A and 6B show a schematic of using recombinase assembly to construct an identifier from components, according to an example implementation.
[0041] [Figure 7] FIG. 7 shows a schematic of using template-directed ligation to construct identifiers from components, according to an exemplary implementation.
[0042] [Figure 8A] 8A-8C show schematic diagrams for accessing a portion of the information stored in a nucleic acid sequence by using a probe to access a particular identifier, according to an example implementation. [Figure 8B]8A-8C show schematic diagrams for accessing a portion of the information stored in a nucleic acid sequence by using a probe to access a particular identifier, according to an example implementation. [Figure 8C] 8A-8C show schematic diagrams for accessing a portion of the information stored in a nucleic acid sequence by using a probe to access a particular identifier, according to an example implementation.
[0043] [Figure 9] FIG. 9 illustrates a combination space of ordered identifiers according to an exemplary implementation.
[0044] [Figure 10] FIG. 10 illustrates the conversion of a digital string into a pool of identifiers using a codebook, according to an exemplary implementation.
[0045] [Figure 11] FIG. 11 illustrates encoding of data across blocks and containers according to an example implementation.
[0046] [Figure 12] FIG. 12 illustrates storage of native key-value pairs using identifiers according to an example implementation.
[0047] [Figure 13-1] 13A-13C illustrate compilation of an if-then-else program using identifiers according to an example implementation. [Figure 13-2] 13A-13C illustrate compilation of an if-then-else program using identifiers according to an example implementation.
[0048] [Figure 14-1] 14A-14F illustrate the execution of an if-then-else program using an identifier, according to an example implementation. [Figure 14-2]14A-14F illustrate the execution of an if-then-else program using an identifier, according to an example implementation. [Figure 14-3] 14A-14F illustrate the execution of an if-then-else program using an identifier, according to an example implementation.
[0049] [Figure 15] FIG. 15 illustrates a copy of an identifier and encoding of the value using a protocol for computation using a value encoded with an identifier, according to an example implementation.
[0050] [Figure 16] FIG. 16 illustrates an exemplary protocol for performing a computation on a numerical value encoded with an identifier, according to an exemplary implementation.
[0051] [Figure 17] 17A-17B are plots of Equation 7 for different domains according to an example implementation.
[0052] [Figure 18] FIG. 18 illustrates a workflow for longitudinal encoding of a data set across a strip library, according to an example implementation.
[0053] [Figure 19-1] 19A-19B show a workflow for filtering a target library according to an exemplary implementation. [Figure 19-2] 19A-19B show a workflow for filtering a target library according to an exemplary implementation.
[0054] [Figure 20] FIG. 20 illustrates a workflow for running a program on a longitudinally encoded dataset, according to an example implementation.
[0055] [Figure 21] FIG. 21 shows a flowchart illustrating a method for encoding digital information in a nucleic acid molecule using partitions, according to an exemplary implementation.
[0056] [Figure 22] FIG. 22 shows a flowchart illustrating a method for manipulating digital information stored in nucleic acid molecules, according to an exemplary implementation.
[0057] [Diagram 23] FIG. 23 shows a flowchart illustrating a method for storing numerical data in nucleic acids, according to an example implementation.
[0058] [Figure 24] FIG. 24 shows a flowchart illustrating a method for preparing a plurality of nucleic acid libraries encoding a dataset, according to an exemplary implementation. DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS
[0059] Detailed Description To provide an overall understanding of the systems, methods, and devices described herein, certain exemplary embodiments are described. Although the embodiments and features described herein are specifically described for use in the context of a particular encoding scheme utilizing nucleic acid molecules, it should be understood that a method, technique, or scheme may be applied to other applications for nucleic acid-based data storage or other chemically-based systems.
[0060] The base-by-base synthesis of nucleic acid to encode digital information can be costly and time-consuming, since it generally requires de novo base-by-base synthesis (e.g., phosphoramidite synthesis) of distinguishable nucleic acid sequences for every new information storage request.The present disclosure relates to a system and method that does not rely on base-by-base or de novo synthesis, but instead encodes digital information into a plurality of identifiers, including a combinatorial sequence of components, or nucleic acid sequences (or component nucleic acid sequences).In this way, the system and method of the present disclosure improves the efficiency and commercial viability of digital information storage.
[0061] The present disclosure describes a method for producing a first set of distinct nucleic acid sequences (or components) for a first request for information storage, and then reusing the same nucleic acid sequences (or components) for subsequent requests for information storage. These approaches can significantly reduce the cost of DNA-based information storage by reducing the role of de novo synthesis of nucleic acid sequences in the process of encoding and writing information into DNA.
[0062] Furthermore, unlike implementations of base-by-base synthesis, such as phosphoramidite chemistry-based or template-free polymerase-based nucleic acid extension, which may use cyclic delivery of each base to each extended nucleic acid, the systems and methods of the present disclosure involve writing information into DNA using identifier construction from components, which is a highly parallelizable process that does not necessarily use cyclic nucleic acid extension.Thus, the present disclosure increases the speed of writing digital information into DNA compared to other methods. Various systems and methods for writing digital information to nucleic acid molecules are described in U.S. Patent No. 10,650,312, filed December 21, 2017, entitled "NUCLEIC ACID-BASED DATA STORAGE," which describes encoding digital information into DNA; U.S. Application No. 16 / 461,774, filed May 16, 2019, and published as U.S. Publication No. 2019 / 0362814, entitled "SYSTEMS FOR NUCLEIC ACID-BASED DATA STORAGE," which describes encoding methods for DNA-based data storage; and U.S. Application No. 17 / 012,909, filed September 4, 2020, and published as U.S. Publication No. 2021 / 0079382, entitled "CHEMICAL METHODS FOR NUCLEIC ACID-BASED DATA STORAGE," which describes encoding methods for DNA-based data storage. No. 16 / 414,758, filed May 16, 2019 and published as U.S. Publication No. 2020 / 0193301, entitled "COMPOSITIONS AND METHODS FOR NUCLEIC ACID-BASED DATA STORAGE," which describes coding schemes, compartments, and logic gates; U.S. Application No. 16 / 414,752, filed May 16, 2019 and published as U.S. Publication No. 2019 / 0351673, entitled "PRINTER-FINISHER SYSTEM FOR DATA STORAGE IN DNA," which describes assemblies for producing encoded nucleic acid libraries; U.S. Application No. 16 / 532, filed August 5, 2019 and published as U.S. Publication No. 2020 / 0185057, entitled "COMPOSITIONS AND METHODS FOR NUCLEIC ACID-BASED DATA STORAGE," which describes coding schemes, compartments, and logic gates;No. 077, entitled "SYSTEMS AND METHODS FOR STORING AND READING NUCLEIC ACID-BASED DATA WITH ERROR PROTECTION," which describes data structures and error protection and correction, and U.S. Application No. 16 / 872,129, filed May 11, 2020, and published as U.S. Publication No. 2020 / 0357483, entitled "DATA STRUCTURES AND OPERATIONS FOR SEARCHING, COMPUTING, AND INDEXING IN DNA-BASED DATA STORAGE," which describes advanced data structures and protocols for accessing, ranking, counting, searching, and retrieving operations, each of which is hereby incorporated by reference in its entirety.
[0063] The following description begins with an overview of various systems and methods for encoding data into nucleic acid molecules, and describes various writing and archiving systems configured to print and store nucleic acid molecules encoding digital data, as described in relation to Figures 1-8. The conversion of bits into ordered nucleic acid molecules is described in relation to Figures 9 and 10. The encoded information can be allocated into data structures to facilitate access and reading of the information, as described in relation to Figures 11 and 21. The ordered nucleic acid molecules may be structured with native key-value pairs to encode metadata of the data structures or encoded data sets, as described in relation to Figures 12 and 21. Nucleic acids so encoded are particularly useful for large-scale computation using graph programs or if-then-else operations, as described in relation to Figures 13A-14F and 22.
[0064] Nucleic acids are also advantageous for physical storage of numerical values by approximation using copy counts of nucleic acid sequences, as described in connection with Figures 15-17B and 23. Another encoding scheme involves splitting a data object into multiple parts, the byte values of each part being encoded by distinct "striped libraries", as described in connection with Figures 18 and 24. The striped libraries can be "filtered" to obtain target sequences, as described in connection with Figures 19A-19B and 24. Striped libraries can also be used for computational calculations using if-then-else operations, as described in connection with Figures 20 and 24.
[0065] In general, the present disclosure encodes data (represented by a string of bits of one or zero, or by a string of symbols, each symbol selected from a set of three or more symbol values) into a set of identifier nucleic acid sequences (or identifier sequences), with each unique identifier sequence having a corresponding bit or symbol in the string. The identifier sequence encodes the position of that bit or symbol in the string, its value, or both the position and value. One way to implement the systems and methods of the present disclosure is to create each identifier nucleic acid molecule (or identifier molecule) represented by an identifier sequence by ligating pre-made DNA component molecules (represented by component sequences) in an ordered fashion based on defined layers, as described in connection with FIGS. 1-8. Specifically, component sequences from different layers are combinatorially combined across layers (e.g., one component sequence is selected per layer) and concatenated (e.g., ligated) to form an identifier sequence that maps one-to-one with each symbol or bit in the string.
[0066] In general, the component nucleic acid sequences are configured to bind to one or more probes that can be used to select all identifiers that make up the sequence. For example, the components may comprise a target sequence of 20 bases, and the probes may comprise complementary 20-base oligonucleotides for binding to the target sequence. As described in this disclosure, the composition of identifier nucleic acid sequences from each component, each capable of binding to a unique probe, provides beneficial features with respect to accessing and manipulating stored data. Although the methods of generating identifiers presented herein are specifically configured to generate identifiers that include components, it should be understood that such identifier nucleic acid molecules may be formed through several alternative methods. For example, identifier nucleic acid sequences can be created using de novo synthesis to generate nucleic acid sequences 100 bases in length, where each identifier includes five components, each of 20 bases. If all combinations of bases are available for synthesis, there can be up to 420 possible sequences for each component.
[0067] The term "symbol," as used herein, generally refers to a representation of a unit of digital information. Digital information may be divided or converted into strings of symbols. In one example, a symbol may be a bit, and a bit may have a value of "0" or "1."
[0068] The term "distinguishable" or "unique" as used herein generally refers to an object that can be distinguished from other objects in a group. For example, a distinguishable or unique nucleic acid sequence may be a nucleic acid sequence that does not have the same sequence as any other nucleic acid sequence. A distinguishable or unique nucleic acid molecule may not have the same sequence as any other nucleic acid molecule. A distinguishable or unique nucleic acid sequence or molecule may share a region of similarity with another nucleic acid sequence or molecule.
[0069] The term "component" as used herein generally refers to a nucleic acid sequence or a nucleic acid molecule. A component may comprise a distinct sequence. A component may also be linked or assembled with one or more other components to generate other nucleic acid sequences or molecules.
[0070] The term "stratum" as used herein generally refers to a group or pool of components. Each stratum may contain a set of distinguishable components such that the components in one stratum differ from the components in another stratum. Components from one or more stratums may be assembled to generate one or more identifiers.
[0071] The term "identifier" as used herein generally refers to a nucleic acid molecule or sequence that represents the position and value of a bit string within a larger bit string. More generally, an identifier may refer to any object that represents or corresponds to a symbol in a symbol string. In some implementations, an identifier may include one or more concatenated components.
[0072] The term "combinatorial space," as used herein, generally refers to the set of all possible distinct identifiers that can be generated from a starting set of objects, such as components, and an allowable set of rules for how to modify those objects to form identifiers. The size of the combinatorial space of identifiers created by assembling or linking components can depend on the number of layers of components, the number of components in each layer, and the particular assembly method used to generate the identifiers.
[0073] The term "identifier rank," as used herein, generally refers to a relationship that defines the ordering of identifiers within a set.
[0074] The term "identifier library," as used herein, generally refers to a collection of identifiers that correspond to symbols in a string of symbols representing digital information. In some implementations, the absence of a given identifier in an identifier library can indicate a symbol value at a particular location. One or more identifier libraries can be combined in a pool, group, or set of identifiers (e.g., having a solid, liquid, or powder form). Each identifier library may also include a unique barcode that identifies the identifier library.
[0075] The term "probe" as used herein generally refers to a substance that binds to a target sequence on an identifier nucleic acid molecule. The target sequence may be a portion of a moiety. A probe may comprise a sequence that matches or is a complement of the target sequence of the probe. A probe may further be used to isolate all identifier nucleic acid molecules that make up said target sequence. For example, a probe may be a primer for a PCR reaction that enriches all identifier nucleic acid molecules that make up a target sequence. Alternatively, a probe may contain an affinity tagged oligonucleotide molecule that can be used to select all identifier nucleic acid molecules that have a sequence that corresponds to the oligonucleotide. A probe may be used for negative selection. For example, an affinity tagged probe can be used to remove all identifiers that contain a particular target sequence. Alternatively, a probe may contain an active nuclease, such as Cas9, that cleaves or digests all identifiers that contain a particular target sequence.
[0076] The term "nucleic acid" as used herein generally refers to deoxyribonucleic acid (DNA), ribonucleic acid (RNA), or variants thereof. Nucleic acids may include one or more subunits selected from adenosine (A), cytosine (C), guanine (G), thymine (T) and uracil (U), or variants thereof. Nucleotides may include A, C, G, T, or U, or variants thereof. Nucleotides may include any subunit that can be incorporated into a growing nucleic acid chain. Such subunits may be A, C, G, T, or U, or any other subunit that may be specific to one of more complementary A, C, G, T, or U, or may be complementary to a purine (i.e., A or G, or variants thereof) or pyrimidine (i.e., C, T, or U, or variants thereof). In some examples, nucleic acids may be single-stranded or double-stranded, and in some cases, the nucleic acid molecule is circular.
[0077] The term "nucleic acid molecule" or "nucleic acid sequence" as used herein generally refers to a polymeric form of nucleotides, or polynucleotides, which may have various lengths, either deoxyribonucleotides (DNA) or ribonucleotides (RNA) or their analogs. The term "nucleic acid sequence" refers to an alphabetical representation of a polynucleotide that specifies the order of nucleotides, and the term "nucleic acid molecule" refers to a physical example of the polynucleotide itself. This alphabetical representation can be entered into a database in a computer having a central processing unit and used to encode digital information, to map the nucleic acid sequence or nucleic acid molecule to symbols or bits. A nucleic acid sequence or oligonucleotide may also contain one or more non-standard nucleotides, nucleotide analogs and / or modified nucleotides.
[0078] "Oligonucleotide," as used herein, generally refers to a single-stranded nucleic acid sequence, typically composed of a specific sequence of the four nucleotide bases adenine (A), cytosine (C), guanine (G) and thymine (T), or, if the polynucleotide is RNA, adenine (A), cytosine (C), guanine (G) and uracil (U).
[0079] Examples of modified nucleotides include diaminopurine, 5-fluorouracil, 5-bromouracil, 5-chlorouracil, 5-iodouracil, hypoxanthine, xanthine, 4-acetylcytosine, 5-(carboxyhydroxymethyl)uracil, 5-carboxymethylaminomethyl-2-thiouridine, 5-carboxymethylaminomethyluracil, dihydrouracil, beta-D-galactosylqueosine, inosine, N6-isopentenyladenine, 1-methylguanine, 1-methylinosine, 2,2-dimethylguanine, 2-methyladenine, 2-methylguanine, 3-methylcytosine, 5-methylcytosine, N6-adenine, 7-methylguanine, 5-methylaminomethyluracil, uracil-5-oxyacetic acid(v), 5-methyl-2-thiouracil, 3-(3-amino-3-N-2-carboxypropyl)uracil, (acp3)w, 2,6-diaminopurine, and the like. Nucleic acid molecules may be modified at the base moiety (e.g., at one or more atoms normally available to form hydrogen bonds with a complementary nucleotide and / or at one or more atoms normally unavailable to form hydrogen bonds with a complementary nucleotide), at the sugar moiety, or at the phosphate backbone. Nucleic acid molecules may contain amine-modifying groups such as aminoallyl-dUTP (aa-dUTP) and aminohexhylacrylamide-dCTP (aha-dCTP) to allow for covalent attachment of amine-reactive moieties such as N-hydroxysuccinimide ester (NHS).
[0080] The term "primer," as used herein, generally refers to a nucleic acid strand that serves as a starting point for nucleic acid synthesis, such as in polymerase chain reaction (PCR). In one example, during replication of a DNA sample, an enzyme that catalyzes replication initiates replication at the 3' end of a primer bound to the DNA sample and copies the opposite strand.
[0081] The term "polymerase" or "polymerase enzyme" as used herein generally refers to any enzyme that can catalyze a polymerase reaction. Examples of polymerases include, but are not limited to, nucleic acid polymerases. Polymerases can be naturally occurring or synthetic. An example of a polymerase is Φ29 polymerase or its derivatives. In some cases, a transcriptase or ligase (i.e., an enzyme that catalyzes the formation of bonds) is used in conjunction with or as a substitute for a polymerase to construct new nucleic acid sequences. Examples of polymerases include DNA polymerase, RNA polymerase, thermostable polymerase, wild-type polymerase, modified polymerase, E. coli DNA polymerase I, T7 DNA polymerase, bacteriophage T4 DNA polymerase Φ29 (phi 29) DNA polymerase, Taq polymerase, Tth polymerase, Tli polymerase, Pfu polymerase, Pwo polymerase, VENT polymerase, DEEPVENT polymerase, Ex-Taq polymerase, LA-Taw polymerase, Sso polymerase, Poc polymerase, Pab polymerase, Mth polymerase, ES4 polymerase, Tru polymerase, Tac polymerase, Tne polymerase, Tma polymerase, Tca polymerase, Tih polymerase, Tfi polymerase, Platinum Examples of such polymerases include Taq polymerase, Tbr polymerase, Tfl polymerase, Pfutubo polymerase, Pyrobest polymerase, KOD polymerase, Bst polymerase, Sac polymerase, Klenow fragment polymerase having 3' to 5' exonuclease activity, and variants, modified products and derivatives thereof.
[0082] Digital information, such as computer data, in the form of a binary code may include an array or string of symbols. A binary code may, for example, encode or represent text or computer processor instructions using a binary system having two binary symbols called bits, usually 0 and 1. Digital information may be represented in the form of a non-binary code, which may include an array of non-binary symbols. Each encoded symbol may be reassigned to a unique bit string (or "byte"), and the unique bit string or byte may be arranged into a byte string or byte stream. The bit value for a given bit may be one of two symbols (e.g., 0 or 1). A byte may contain a string of N bits, for a total of 2 N For example, a byte containing 8 bits can have a total of 2 8 Or 256 possible unique byte values may result, where each of the 256 bytes may correspond to one of the 256 possible distinct symbols, characters, or instructions that may be encoded in the byte. Raw data (e.g., text files and computer instructions) may be represented as a string of bytes or a stream of bytes. Zip files, or compressed data files that contain raw data, may also be stored in a byte stream, and these files may be stored in compressed form as a byte stream and then restored to raw data before being read by a computer.
[0083] It should be understood that the terms "index" and "position" are used interchangeably in this disclosure, and that both terms are used to refer to a particular element or entity of an ordered collection, such as a list or a string. For example, an index or position may be used to designate an element in an array, vector, string, or data structure. The index / position notation uses a numbering scheme that assigns a nominal number to each entry / entity. Examples of this disclosure often use a starting index / position of 0, known in the art as zero-based numbering. The first position (also referred to as the zeroth position) of an array / string is represented by 0 for computer calculations involving that particular position. A set of length n would have a numbering scheme of 0, 1, ..., n-1. It should be understood that other numbering schemes may be used in the systems and methods described herein. For example, the numbering scheme may start at 1 and continue to n for a set of length n.
[0084] This disclosure describes the methods in relation to the figures of this application. It should be understood that these methods, including computational steps, are configured to be performed in DNA. The methods and systems of this disclosure can be used to encode computer data or information with multiple identifiers, each of which can represent one or more bits of primary information. In some examples, the methods and systems of this disclosure encode data or information using identifiers, each of which represents two bits of primary information. Writing digital data to nucleic acids
[0085] Identifiers (nucleic acid molecules) have a nucleic acid sequence that can be used to encode digital information, such as a string of symbols. Identifiers are formed by assembling components (nucleic acid molecules). The components may be configured to bind to a probe (as explained above), and components so configured are "addressable components." All components described herein may be addressable components.
[0086] In some embodiments, the identifier may be composed of only addressable components. The addressable components may be assembled to form the identifier, or they may be introduced into the identifier sequence by subtraction or substitution techniques. Alternatively, the addressable components may be introduced into the nucleic acid identifier by de novo synthesis. Different writing methods differ in speed and cost. They may also differ in the number of possible components that can be introduced into the identifier.
[0087] 1A / 1B and 2A / 2B show examples of how identifiers with components encode digital information using a "data at address" encoding scheme (also referred to herein as "length-wise encoding"), whereby a data object such as a "byte value" is encoded along with the identifier.
[0088] 1A and 1B diagrammatically illustrate an example of a method, referred to as "data at address," for encoding digital data in objects or identifiers (e.g., nucleic acid molecules) according to an exemplary implementation. FIG. 1A illustrates encoding a bitstream into an identifier library, where each identifier is constructed by concatenating or assembling a single component that specifies an identifier rank and a single component that specifies a byte value. In general, the data at address method uses identifiers that modularly encode information by including two objects: a "byte value object" (or "data object"), which is one object that identifies a byte value, and a "rank object" (or "address object"), which is one object that identifies the identifier rank (or relative position of the byte in the original bitstream). FIG. 1B illustrates an example of a data at address method, where each rank object is combinatorially constructed from a set of components, and where each byte value object can be combinatorially constructed from a set of components. Such combinatorial construction of rank objects and byte value objects allows more information to be written into an identifier than if the objects were created from only a single component (e.g., FIG. 1A).
[0089] 2A and 2B show schematic diagrams of another example of a method for encoding digital information in an object or identifier (e.g., a nucleic acid sequence). FIG. 2A shows encoding of a bit stream into an identifier library, where the identifier is constructed from a single component that specifies an identifier rank corresponding to its position in the bit stream. The presence of an identifier at a particular rank (or address) specifies a bit value of 1, and the absence of an identifier at a particular rank (or address) specifies a bit value of 0. This type of encoding uses identifiers that simply encode the rank (relative position of the bit in the original bit stream), and the presence or absence of these identifiers in the identifier library can be used to encode bit values of 1 or 0, respectively. Reading and decoding the information can include identifying identifiers present in the identifier library, assigning bit values of 1 to their corresponding ranks, and assigning bit values of 0 elsewhere. In this example, the presence of an identifier encodes a bit of 1 and the absence of an identifier encodes a bit of zero, but it will be understood that it is possible for the presence of an identifier to encode a bit of zero and the absence of an identifier to encode a bit of 1 without departing from the scope of this disclosure.
[0090] FIG. 2B is similar to FIG. 2A, but in the example encoding method of FIG. 2B, each identifier is combinatorially constructed from a set of components, and thus each possible combinatorial construction specifies a rank. Such combinatorial construction allows more information to be written into the identifier than if the identifier were created from only a single component (e.g., FIG. 2A). For example, as depicted in FIG. 2B, 10 addresses corresponding to a bit string of length N=10 are represented using a component set of 5 distinct components. The 5 distinct components are assembled in a combinatorial manner to generate 10 distinct identifiers, each containing 2 of the 5 components. The 10 distinct identifiers each have a rank (or address) corresponding to the position of the bit in the bit stream. The identifier library may include a subset of these 10 possible identifiers that correspond to positions of bit value 1 and exclude a subset of these 10 possible identifiers that correspond to positions of bit value 0 in a bit stream of length 10.
[0091] Figure 3 shows an example of a method, called a "product scheme," for constructing an identifier (e.g., a nucleic acid molecule) by combinatorially assembling distinct components (e.g., nucleic acid sequences) from each layer in a fixed order, according to an exemplary implementation. The top part of Figure 3 depicts the architecture of an identifier constructed using a product scheme. An identifier can be constructed by combining a single component from each layer in a fixed order. For M layers, each with N components, N M There are 27 possible identifiers. The bottom part of Figure 3 shows an example of a combinatorial space of identifiers that can be constructed using a product scheme. In one example, the combinatorial space can be generated from three layers, each containing three distinguishable components. These components can be combined such that one component from each layer can be combined in a fixed order. The total combinatorial space for this assembly method can contain 27 possible identifiers.
[0092] Figures 4-7 show chemical methods (see Figure 3) for implementing the product scheme. The methods depicted in Figures 4-7 may be used with any other method for assembling two or more distinguishable components in a fixed order, for example to produce any one or more identifiers in an identifier library. These methods are described in U.S. Patent No. 10,650,312, entitled "NUCLEIC ACID-BASED DATA STORAGE," filed December 21, 2017, which is incorporated by reference in its entirety. Identifiers may be constructed using any of the implementation methods described in Figures 4-7 at any time in the methods or systems disclosed herein. In some examples, all or a portion of the combinatorial space of possible identifiers may be constructed prior to encoding or writing digital information, and thus the writing process may include mechanically selecting and pooling identifiers (which encode the information) from an already existing set. In other examples, identifiers may be constructed at a point that may be after one or more steps of the data encoding or writing process have occurred (i.e., while the information is being written).
[0093] Enzymatic reactions may be used to assemble components from different layers or sets. Because components (e.g., nucleic acid sequences) of each layer have specific hybridization or binding regions to components of adjacent layers, assembly may occur in a one-pot reaction. For example, a nucleic acid sequence (e.g., component) X1 from layer X, a nucleic acid sequence Y1 from layer Y, and a nucleic acid sequence Z1 from layer Z may form an assembled nucleic acid molecule (e.g., identifier) X1Y1Z1. Additionally, by including multiple nucleic acid sequences from each layer, multiple nucleic acid molecules (e.g., identifiers) may be assembled in a single reaction. This single reaction may involve self-assembly of components into identifiers.
[0094] The identifiers may be constructed according to a product scheme using overlap extension polymerase chain reaction (OEPCR) according to an exemplary implementation, as shown in Figure 4. Each component in each layer may comprise a double-stranded or single-stranded nucleic acid sequence with a common hybridization region at its sequence end that may be homologous and / or complementary to a common hybridization region at the sequence end of a component in an adjacent layer (as depicted in Figure 4). Thus, all components and necessary reagents for forming the multiple identifiers may be deposited in the reaction compartment at the same time, and the hybridization regions of each component allow them to self-assemble into the desired unique identifier molecule, since the order of the components to be assembled is controlled by the design of the hybridization regions.
[0095] Identifiers may be assembled according to a product scheme using sticky end ligation, as shown in FIG. 5, according to an exemplary implementation. Distinguishable identifiers may be assembled using three layers, each containing a double-stranded component (e.g., double-stranded DNA (dsDNA)) with a single-stranded 3' overhang. Sticky ends for sticky end ligation may be generated by treating the components of each layer with a restriction endonuclease. In some implementations, components of multiple layers may be generated from a single "parent" set of components.
[0096] Identifiers may be assembled according to a product scheme using site-specific recombination as shown in Figures 6A and 6B according to an exemplary implementation. Identifiers may be constructed by assembling components from three different layers. Components in layer X (or layer 1) may include double-stranded molecules with an attBx recombinase site on one side of the molecule, components from layer Y (or layer 2) may include double-stranded molecules with an attPx recombinase site on one side and an attBy recombinase site on the other side, and components in layer Z (or layer 3) may include double-stranded molecules with an attPx recombinase site on one side of the molecule and an attBy recombinase site on the other side. yThe attB and attP sites in a pair may comprise recombinase sites. The attB and attP sites in a pair are capable of recombining in the presence of their respective corresponding recombinase enzymes, as indicated by their subscripts. One component from each layer may be combined such that one component from layer X is associated with one component from layer Y, and one component from layer Y is associated with one component from layer Z. Thus, all components and necessary reagents to form the multiple identifiers may be deposited into the reaction compartment at the same time, and the recombinase sites of each component will enable them to self-assemble into the desired unique identifier molecule, with the order of the components assembled being controlled by the design of the recombinase sites.
[0097] Identifiers may be constructed according to a product scheme using template-directed ligation (TDL), as shown in FIG. 7, according to an exemplary implementation. Template-directed ligation utilizes single-stranded nucleic acid sequences, referred to as "templates" or "staples," to facilitate ordered ligation of components to form identifiers. The template hybridizes simultaneously to components from each adjacent layer, keeping the components adjacent to each other (3' ends abutting 5' ends) while ligase ligates them. Thus, all components and necessary reagents to form multiple identifiers may be deposited into the reaction compartment at the same time, and the order of the components assembled is controlled by the template design, allowing the hybridization regions of each component to self-assemble into the desired unique identifier molecule.
[0098] 8A-8C show examples of using probes to access a designated subset of identifiers in an identifier library. FIG. 8A shows an example of a method for using polymerase chain reaction, affinity tagged probes and degradation targeted probes to access identifiers containing designated components. For PCR-based access, a pool of identifiers (e.g., an identifier library) can include identifiers with a common sequence at each end, a variable sequence at each end, or one of a common sequence or a variable sequence at each end. The common or variable sequence may be a primer binding site. One or more primers may bind to the common or variable regions at the edges of the identifiers. Identifiers to which the primers are bound can be amplified by PCR. Amplified identifiers can significantly outnumber non-amplified identifiers. During readout, the amplified identifiers can be identified. Identifiers from an identifier library can contain a sequence at one or both of its ends that is distinguishable from the library, thus allowing selective access to a single library from a pool or group of more than one identifier library.
[0099] In the case of affinity tag-based access, a process sometimes called nucleic acid capture, the components that make up the identifiers in the pool may share complementarity with one or more probes. The one or more probes may bind or hybridize to the identifiers to be accessed. The probes may include affinity tags. The affinity tags may bind to the beads to generate a complex that includes the beads, at least one probe, and at least one identifier. The beads may be magnetic, and together with a magnet, the beads may collect and isolate the identifiers to be accessed. Before reading, the identifiers may be removed from the beads under denaturing conditions. Alternatively or additionally, the beads may collect non-targeted identifiers and sequester them away from the remainder of the pool, which may be washed and transferred to a separate vessel and read. The affinity tags may be bound to a column. The identifiers to be accessed may be bound to a column for capture. The identifiers bound to the column may then be eluted or denatured from the column before reading. Alternatively, the non-targeted identifiers may be selectively targeted to the column, while the targeted identifiers may flow through the column. Accessing the targeted identifiers may involve applying one or more probes simultaneously to the pool of identifiers, or may involve applying one or more probes sequentially to the pool of identifiers.
[0100] In the case of degradation-based access, the components that make up the identifiers in the pool may share complementarity with one or more degradation targeting probes. The probes can bind or hybridize to distinguishable components of the identifiers. The probes can be targeted by degradative enzymes, such as endonucleases. In one example, one or more identifier libraries can be combined. A set of probes can hybridize to one of the identifier libraries. The set of probes can include RNA, which can induce a Cas9 enzyme. The Cas9 enzyme can be introduced into one or more identifier libraries. The identifiers hybridized to the probes can be degraded by the Cas9 enzyme. The identifiers that are to be accessed may not be degraded by the degradative enzyme. In another example, the identifiers can be single-stranded, and the identifier library can be combined with a single-strand specific endonuclease, such as S1 nuclease, that selectively degrades the identifiers that are not to be accessed. The identifiers that are to be accessed can be hybridized to a complementary set of identifiers to protect them from degradation by the single-strand specific endonuclease. The identifier to be accessed can be separated from the degradation products by size selection, such as size-selective chromatography (e.g., agarose gel electrophoresis). Alternatively, or in addition, the non-degraded identifier can be selectively amplified (e.g., using PCR), so that the degradation products are not amplified. The non-degraded identifier can be amplified using primers that hybridize to each end of the non-degraded identifier, and therefore do not hybridize to each end of the degraded or cleaved identifier.
[0101] FIG. 8B shows an example of a method for performing an "OR" or "AND" operation using polymerase chain reaction to access identifiers containing multiple components. In one example, if two forward primers bind to distinct sets of identifiers at the left end, OR amplification of the junction of these sets of identifiers can be achieved by using the two forward primers together in a multiplex PCR reaction with a reverse primer that binds to all of the identifiers at the right end. In another example, if one forward primer binds to a set of identifiers at the left end and one reverse primer binds to a set of identifiers at the right end, AND amplification of the intersection of these two sets of identifiers can be achieved by using the forward and reverse primers together as a primer pair in a PCR reaction. This process can be repeated in a sequential manner (e.g., nested PCR) to access identifier subpools that have any number of components in common.
[0102] Since the primers are designed to bind to components in an iterative manner from each edge inwards, the identifiers may become shorter with each iteration of PCR-based access on the identifier library. For example, the identifier library may comprise identifiers of the form ABCDEFG, where A, B, C, D, E, F and G are layers. When amplified with primers that bind to specific components, e.g., A1 and G1 in layers A and G, respectively, the amplified portion of the identifier library may take the form A1-BCDEF-G1. When further amplified with primers that bind to specific components, e.g., B1 and F1 in layers B and F, respectively, the amplified portion of the identifier library may take the form B1-CDE-F1, where it can be assumed that these shortened amplified sequences correspond to the complete identifier further including component A1 at the layer A position and G1 at the layer G position.
[0103] 8C shows an example of a method for using affinity tags to perform an "OR" or "AND" operation to access identifiers containing multiple components. In one example, if affinity probe "P1" captures all identifiers with component "C1" and another affinity probe "P2" captures all identifiers with component "C2", then P1 and P2 can be used simultaneously to capture the set of all identifiers with C1 or C2 (corresponding to an OR operation). In another example, using the same components and probes, P1 and P2 can be used sequentially to capture the set of all identifiers with C1 and C2 (corresponding to an AND operation). Encoding Data Structures into Nucleic Acids Converting bits to identifiers
[0104] Each identifier in the combinatorial space can have a fixed number of N components, each of which comes from a distinct layer in the set of N layers and is one of several possible sets of components in the layer. Each component has coordinates (j,X j ), where j is the layer indicator and X j is the label of the component in that layer. For the scheme with N layers, j is an element of the set {1, 2, ..., N}, and X j is the set {1,2,...,M j}, and M j is the number of components in layer j. A logical order can be defined for the layers, and also for each component within each layer. This labeling can be used to define a logical ordering of all possible identifiers in the combination space. For example, the identifiers can be sorted first according to the order of components in layer 1, then according to the order of components in layer 2, etc., as shown by way of example in FIG. 9.
[0105] Figure 9 shows a tree diagram of the combinatorial space of 16 identifiers, each constructed from four components from four layers, with each layer containing two components. Thus, each component has coordinates (j,X j), j is an element of the set {1,2,3,4}, and X j is an element of the set {1,2}. Thus, all 16 identifiers are logically ordered according to the order of the components within each layer.
[0106] The logical ordering of identifiers can further be used to allocate and order digital information. Digital information can be encoded in the nucleic acids that make up each identifier, or as the presence or absence of the identifier itself. For example, a codebook can be created that encodes 4 bits of information for each consecutive grouping of 4 identifiers. In this example, the codebook can map each possible string of 4 bits to a unique combination of the 4 identifiers (since there are 16 possible combinations of 4 identifiers, a maximum of log2(16)=4 bits of data can be stored). As another example, a codebook can be created that encodes 6 bits of data for each consecutive grouping of 8 identifiers. In this example, the codebook can map each possible string of 6 bits to 4 unique subsets of the 8 identifiers (since there are 8choose4=70 such subsets, a maximum of floor(log2(70))=6 bits of data can be stored). These combinations of identifiers may be referred to as codewords, and the data they encode may be referred to as words. Words adjacent in the data may be stored in adjacent codewords between the logically ordered identifiers.
[0107] Figure 10 shows an example of converting a 12-bit digital string into a pool of identifiers using a codebook that maps 6-bit words into codewords consisting of 8choose4 identifiers (four identifiers selected from groups of 8). The codewords can be symbolically represented as bit strings, where every bit position corresponds to one ordered identifier, with a bit value of "0" representing the absence of the corresponding identifier in the codeword and a bit value of "1" representing the presence of the corresponding identifier in the codeword. Allocating and accessing information blocks
[0108] Prior to encoding into codewords, the ordered identifiers can be partitioned into blocks, with each block containing multiple codewords. If multiple physical containers, such as test tubes or PCR tubes, are used to store the nucleic acids, the same identifier space can be used to partition multiple blocks, but in separate containers. Figure 11 shows an example of how a space of 32 identifiers and two containers (1108) can be used to partition 4 blocks of data (1106), with each block capable of storing two codewords (1104), each of which encodes 6 bits of data (1102). Blocks can be used to organize data into interpretable units. For example, a single codeword may return a binary sequence that is not even sufficient to decode a single symbol of the encoded data (e.g., if the word size is 6 bits and the symbol size is 8 bits), but a block may contain enough codewords to decode an independent piece of original information, and may even have included metadata regarding things like error protection and fixity. In the example of Figure 11 above, each block was used to store each symbol of the input text string. But more generally, blocks can be used to store numbers, strings, arrays, data objects, data files, etc. Blocks can be of any size and can be arbitrarily assigned to data and identifiers, but when allocated effectively, they can be used as a powerful tool to query related information without having to read back the entire archive.
[0109] For example, one may choose to partition the identifier space into contiguous blocks of c codewords of fixed size. In this way, the range of identifiers encoding the gth instance of a block is the range of codeword instances (g-1). * c+1~g *c can be inferred as a range encoding the components. These particular identifiers can then be easily accessed through a chemical access program that accesses only those identifiers that share a specified set of components in common. Those access programs work by using probes to selectively target and then enrich or select identifiers with said specified set of components, for example, using primers and PCR or affinity tagged oligonucleotides and affinity pull-down assays. The probes can be applied in a series of selection reactions, as in FIG. 8C, each reaction targeting an individual component. The output from one reaction can be used as input to another reaction. Since the identifiers can be ordered by their components (as shown in FIG. 9), and blocks can be represented by contiguous ranges of the ordered identifiers, identifiers that make up a block are more likely to share a common component than if they were heterogeneous. This reduces the complexity of the access program required to obtain such identifiers. The reduced complexity can be further improved if blocks are assigned to ranges of identifiers that form subtrees of the logical tree used to order the identifiers. Or in other words, if blocks are assigned to ranges of identifiers that exclusively share a common set of components. In Figure 11, each block can be accessed using a probe that targets a component in the first layer, because each block (in each vessel) exclusively has a different component in the first layer. Data Structures and Pattern Searching
[0110] A fixed length block has a finite storage capacity, but the information contained in the block can refer to a subsequent block or blocks from which additional data is received. In this way, a linked list can be implemented in a block of identifiers. Furthermore, the blocks can represent a tree or a graph. The structure of a tree or graph can be made implicit by defining blocks that belong to different nodes of the tree or graph. For example, the first block can be reserved for the root node in a B-tree, the second and third blocks for second level nodes, etc. The value of each node can be coded in the block. And in this way, a path in the tree can be followed to satisfy a query by accessing a block, decoding its node information, and using said information to calculate the successor block to access and decode (the successor node to go to). Alternatively, the tree may have no defined structure, except for the block corresponding to the starting node. From this block and each block thereafter, the location of all blocks coding the neighboring node can be coded in each node along with that information.
[0111] This structure can be used to create a tree, e.g., a suffix tree. A suffix tree can be used to look for patterns in a string of data. In a suffix tree, blocks are constructed to represent the nodes of the suffix tree. A suffix tree is a tree where every path from a root node to a leaf represents a suffix of a string of symbols S. The edges of the tree represent the subsequences of symbols that make up each path. A suffix tree can be represented in an identifier nucleic acid library where every block corresponds to a node in the suffix tree and contains information about its daughter nodes. For example, the information about the daughter nodes includes the subsequences of symbols that make up the edges to each daughter node and the location of each block that contains those daughter nodes. The root node can be a defined block, such as the first block. Querying for the membership, count, or location of a pattern involves following a path along the suffix tree by accessing an identifier for the block corresponding to the root node, decoding the information contained therein, determining the location of the next block based on the information contained therein and the query pattern, and continuing this process until no downstream blocks (or nodes) remain that satisfy the corresponding query, or until a leaf node is reached. In the former case, the query pattern is not present in the string S. In the latter case, the block corresponding to the leaf node can be configured to contain the count or location of the query pattern.
[0112] Other techniques for finding patterns include the FM index technique and the inverted index, each with a block-based implementation using identifier nucleic acids. In an inverted index, there may be one block for each possible subsequence of fixed length across the symbol alphabet that constitutes the symbol string S. Each block may contain information about the starting position of the corresponding subsequence in S. The block ID may correspond to the subsequence or may correspond to the position of the subsequence after sorting, such that the position of a block corresponding to a subsequence can be determined without additional information. A query pattern may be mapped to a subsequence of the inverted index that contains it, and the block may be accessed and decoded. The position information contained therein may be used to determine the count and position of the query pattern in S. An inverted index need not be limited to subsequences of fixed length. For example, it may be used to represent the position of words within a document or across multiple documents.
[0113] Suitable data structures and search methods, such as the FM indexing technique, are described in U.S. Application No. 16 / 532,077, filed August 5, 2019, and published as U.S. Publication No. 2020 / 0185057, entitled "SYSTEMS AND METHODS FOR STORING AND READING NUCLEIC ACID-BASED DATA WITH ERROR PROTECTION" (which describes data structures and error protection and correction), and U.S. Application No. 16 / 872,129, filed May 11, 2020, and published as U.S. Publication No. 2020 / 0357483, entitled "DATA STRUCTURES AND OPERATIONS FOR SEARCHING, COMPUTING, AND INDEXING IN DNA-BASED DATA STORAGE" (which describes advanced data structures and protocols for accessing, ranking, counting, searching, and retrieval operations), each of which is hereby incorporated by reference in its entirety. A native key-value store with parallel queries
[0114] In some embodiments, the information needed to access a desired block may be natively configured for a data object, so that the block's container and access protocol needed to obtain it can be inferred directly from the data object without the need to access additional blocks. A data object may be referred to as a native key, and the information contained in the corresponding block may be referred to as a value, and the combination may be referred to as a native key-value (nkv) pair. In other words, a native key is information encoded by an identifier array that can be used to access the identifier array. In contrast, a value in this context is additional data that is associated with a key and can be accessed using the key.
[0115] Figure 12 shows an example of how to configure an identifier to store nkv pairs. In this example, a particular layer of addressable components in the identifier is dedicated to storing keys, and the remainder of the identifier is dedicated to storing values. The keys are stored in an identifier array that contains component arrays from each "key layer" (1202 in Figure 12). For example, if there are eight key layers, all of which contain two possible components, then two 8 There are possible keys. In other words, each key encodes 8 bits. As another example, if there are 16 key tiers with 256 components each, each key encodes log2(256 16 ) = 128 bits. The key values are contained in a block of identifiers with corresponding components in each key layer. For example, if there are 16 possible identifiers with associated keys, the values may be stored across two 8choose4 codewords, each encoding 6 bits, totaling a 12-bit value. In the example of Figure 12, there are two key layers 1202, each identifier with a 2-bit key, and the remaining two layers 1204 have 4-bit values that, together with each other, produce a native key-value pair as the identifier 1206.
[0116] The native key may be constructed to be a string of symbols, one position for each key layer and one symbol value for each component in each key layer. For example, if there are eight key layers, each containing two components, the native key may be a string of 8 bits. As another example, if there are 16 key layers, each consisting of 256 components, the native key may be a string of 16 ASCII characters. Each symbol in the native key is an operand, since it maps to an addressable component. Formulating queries across multiple keys may be specified as regular expressions composed of logical ANDs and ORs, and primitive match component operators organized in the form of a directed acyclic graph (DAG), an access program. The access program specifies the order in which chemical reactions are performed across the various vessels containing the identifiers. For example, a range query may be performed for all keys containing a particular symbol value in the second and fourth positions by performing a series of two probe-base reactions, one to select the corresponding component in the second key layer and one to select the corresponding component in the fourth key layer. The identifier blocks accessed contain only values associated with valid native keys. In this way, a native key-value store can be constructed where query operations can be performed on all keys simultaneously without requiring additional index information.
[0117] This method may be particularly useful for storing high-dimensional native keys, where common queries may be organized as symbol selection operations. Such queries over such keys are difficult to satisfy in conventional media, because the high-dimensionality of the keys makes indexing impractical. However, with identifier nucleic acids constructed as described above, queries may be fast and inexpensive. Such methods may be useful, for example, when the key is a Bloom filter, a fingerprint, a hash, or a structured array of corresponding data objects, and the query is one of symbol selection, or similarity or membership to a reference object.
[0118] In one embodiment, the native keys can be records in a data table, the key layers can correspond to columns in the table, and each layer's components can correspond to a particular column value. The records can be queried using SQL-type commands and compiled into an access program that is executed in the DNA to select all identifier sequences that contain a specified set of components. In some cases, the identifier sequences can be composed of only the key layers. In some applications, the query can involve counting the number of native keys that meet a certain property. The count can be done by sequencing, but can also be done more natively using mass readout methods such as fluorescence or absorption. For example, the total amount of identifier molecules in a sample can be determined by performing qPCR with common edge primers, or by using spectrophotometry, fluorimetry, gel electrophoresis, or plate reader assays. Since the expected number of identifier molecules per identifier sequence should be uniform, the mass readout can be normalized by a standard sample (e.g., a sample composed of a known number of identifier sequences) to determine the number (or count) of unique identifier sequences, which can then be used to calculate the count of the number of native keys.
[0119] In some embodiments, absolute counting may not be the objective, but instead relative counting may be desired. For example, qPCR using component-specific primers (or probes) can be performed to determine the relative proportion of identifier sequences in a sample that contain a particular component. This proportion may be relative to the entire population of identifier sequences in the sample, or to another subpopulation of identifier sequences that contain a different component. This type of data may be particularly useful when the native key is a record, and the corresponding identifier sequence components correspond to field values that contain the record. A quick and effective form of query can then be performed to determine the number of records that contain data value x. Or, as another more complex example, the proportion of records that contain data value x that contain data value y. For example, what proportion of all car accidents that occurred in 1998 occurred in September. High-volume readout methods for absolute and relative counting may be faster and less expensive than DNA sequencing.
[0120] Since native DNA keys, e.g., records, may contain components that represent data values, it follows that native keys that are semantically similar (sharing common data) will also be similar in sequence. Such a property may be useful for performing similarity queries. For example, a query may be specified to find all records in a database that are similar to a reference record. The reference record may be converted to its corresponding identifier sequence and used as a probe in an identifier library to find all similar identifier sequences (corresponding to similar records). The reference identifier sequence may contain an affinity tag (e.g., biotin) so that the sequence (and its binding partner) can be retrieved by an affinity pull-down assay (e.g., with immobilized streptavidin). A reference identifier sequence is more likely to bind to other identifier sequences that share more common sequences. The stringency of this binding, and therefore the stringency of a similarity query, can be controlled using additives such as temperature and salt. Elevated temperature increases the stringency, making it less likely that less similar identifier sequences will be returned by the query. The retrieved identifier sequences can be sequenced to determine their identity. Alternatively, the obtained identifier sequences can be counted using the bulk readout methods described above. Although such native similarity searches may be less accurate than traditional methods, they may be much faster and less expensive, especially for databases with large keys.
[0121] More broadly, any finite automaton computation can be performed on the native key using the access program. This is because finite automata can be expressed as regular expressions, and regular expressions can be turned into logical operators with the query systematization of the present invention. In general, the native key symbols can correspond to operands, and any logic can be performed on those operands using the access program. In one embodiment, the native key symbols can correspond to numbers, and arithmetic can be performed on those numbers using the access program. For example, two 8-bit numbers that make up the native key can be multiplied, and the key can be selected such that the product is between 412 and 500. This type of computation allows for the use of finite automata to query the native key, but is not limited to this application, nor is it limited to Boolean output. In the following sections, a broader framework for multi-output computation on data objects consisting of operands is presented. Computing with Graph Programs (If-Then-Else)
[0122] The identifier library can be used to perform a computation in parallel across multiple data objects in a dataset. The computation uses a specified set of derivation rules to derive an output that is related to a given input. The set of all correctly related input-output pairs may be defined by some function, say f, that maps, say, X and Y to their respective correct outputs, say Z and W. In this way, the computation implements the function f, and derives an output equal to f(X,Y) if and only if, given some input (X,Y).
[0123] 13A-13C show how such a given function f can be transformed into a set of rules suitable for implementation as a computation by a computer using an identifier library. In the example shown in FIGS. 13A-13C, the function f takes two 2-bit natural numbers X and Y and outputs their sum. The 2-bit natural numbers are 0, 1, 2, and 3. Since the sum of two such numbers cannot exceed 6, the output of f produces at most only 3 bits, which is enough bits to encode the largest possible sum of 6. The table in FIG. 13A shows the complete definition of f, and for any pair of 2-bit numbers shown in the top two rows labeled "Input", the row labeled "Output" lists the output of bit value f that correctly represents the addition operation. The three output bits are called the low bit, the high bit, and the carry bit, and are abbreviated as outputs L, H, and C, respectively.
[0124] To convert this tabular specification of f into a rule set suitable for DNA computation, a directed graph program is constructed that dictates the chemical operations to be performed on the identifiers. Knuth's "The Art of Computer Programming Volume 4A: Combinatorial Algorithms Part 1," hereby incorporated by reference in its entirety, provides the theoretical details of directed graph programs, but here the process is adapted for the disclosed nucleic acid-based approach. The nodes in this graph are identifier libraries, and the arrows emanating from the nodes represent operations to be performed on the libraries. Each node is initially labeled with a bit string, and later labeled with an input symbol during the process. Each arrow is initially labeled with the input of the function, and later labeled with an alphabetic symbol. The graph program is constructed in two steps.
[0125] Figure 13B shows the result of the first step, called factorization. In this step, a graph is constructed for each of f's outputs C, H, and L. To construct the graph, the bit string that represents the output in the function specification is taken and a node is created in the graph labeled by that bit string. For every node in the graph, including the first node described in the previous sentence, the steps given below are followed to construct the complete graph. If a node is labeled by a bit string w that can be factorized and rewritten as w = uv (where u and v are the bit strings themselves with half the length of w), two new nodes are created in the graph labeled with the bit strings u and v, respectively. An arrow to w or u is labeled x i =0 is added, and the arrow from w to v is labeled x i = 1, where i is the number of times this rule has been applied, and x i is the i-th input bit accepted by function f. The example shown uses a binary alphabet, so the indicator sequence must be of length 2^n for some natural number n. However, the construction described can be extended to any k-ary alphabet. In the k-ary case, the indicator is split into k parts and k arrows are appended, one for each possible symbol in the alphabet, x i There are two caveats to the node creation rules: if a node labeled with u or v already exists in the graph, it is reused instead of creating multiple nodes with the same label (this is called the "reuse rule"); if a new node is labeled with w=uv, such that u=v, then we do not label the node with w, but instead try to create a node labeled u, which is the square root of w (this is called the "square" rule).
[0126] In FIG. 13B, consider the graph for output L, for example. Label 0101101001011010 is factored into two new nodes labeled 01011010 01011010. Since this is the first application of the node creation rule, the arrow is labeled X1 as shown. However, 0101101001011010=(0101101) 2 Note that this new node falls under the "square" rule, since 0101101. Therefore, we do not create that node, but instead create a "square root" node labeled 0101101. The root node is shown for pedagogical clarity and to prevent confusion in this special case where the "square" rule prevents the creation of a root node at all.
[0127] The rules are reapplied to new node 01011010, as well as the two new nodes 0101 and 1010. However, the first new node 0101 is factored into 01 and 01, so we apply the "square" rule and create a node labeled 01 instead. Because this is a third level node creation, the arrow is labeled X3 as shown. Similar rules are applied to the node labeled 1010 to arrive at the final graph for output L. Using the same set of rules, graphs are constructed for all three outputs C, H, and L, as shown in FIG. 13B. Note that the three separate graphs are shown for educational reasons, and the three graphs may be merged to share reusable nodes and minimize the size of the program.
[0128] Figure 13C shows the result of the second step in creating a graph program. In this step, the nodes and arrows are relabeled for simplicity. Each node is labeled with an incoming indicator on its outgoing arrow. Each outgoing arrow is relabeled with one of the possible values it can take from the symbol alphabet. In this example, there are only two possible values, so dashed arrows are used to represent the X i =0 arrow and use a solid arrow to indicate X i= 1 arrow. All nodes except those labeled with 0 and 1 are marked with X i , which corresponds to the ith bit of the input to the function f. Thus, the node labeled X1 corresponds to a test of the input bit X1. If this bit value is 0 in a given input instance, then a dashed arrow leaving the node is followed to reach a new test. If the input bit value X1 is 1 in a given input instance, then a solid arrow leaving the node is followed to reach a different test node. This process continues until a special 0 or 1 node is reached, indicated by its square in FIG. 13C. These nodes encode the output of a computation by the computer, and if a particular input, when tested through the graph program as described above, leads to a 0 node, it means that the output derived from that input instance is 0. Similarly, if the input leads to a 1 node, it means that the output derived from that input instance is 1. Thus, for any input X1X2Y1Y2, the graph program of outputs C, H, L derives a well-defined 0 or 1 output. Collectively, these graph programs implement the summation function specified in Figure 13A.
[0129] 14A-14F show how computations can be performed on a data set using the graph program constructed in FIGS. 13A-13C. FIG. 14A shows a schematic diagram of an identifier constructed via concatenation of components. In this example, the identifier comprises five components, each component selected from a separate layer. To enable computations with such identifiers, in this example, one or more layers with data are defined as operands for computations. In this abstract example, the operand portions of the identifier, called operand registers, are defined as O1-O2. n Additional layers may encode data values that are not part of the computation by the computer but that are associated with the operand registers for other reasons. These additional layers are collectively called value registers, denoted V1 through V mThe operands and additional data values, and the allocation of layers to each, may be arbitrarily selected by the programmer. For example, the 2-bit input numbers X1X2 and Y1Y2 described in Figures 13A-13C may be stored in identifiers as operands of an addition calculation, and the ranks of pairs of 2-bit numbers in a data set may be stored in value registers. An identifier array of this structure is one type of nkv as defined above, where the operands are native key symbols that form the native key, the operand registers consist of key layers, and the additional layers store associated values. In general, the value registers may store any kind of data. In the example of Figure 14, the value register stores ranks. In another embodiment, the value registers may store compressed or hashed representations of the operands. In another embodiment, the value registers may store keys that are later used to access more data.
[0130] FIG. 14B shows a schematic of the chemical technique used as the basis for the computation. This chemical technique is referred to herein as an "if-then-else" (ITE) gate. This gate takes an identifier library as input and produces one or more identifier libraries as output. An ITE gate is defined by a parameter t, called the "test layer," which defines the layer that is examined by the gate. The possible components L that occur at layer t are t The set of n t Set of Collectibles L j t ,j=0,...,n t -1 (the union is L t (Into disjoint sets that form a set.) For each set in the collection, an output library is created and labeled with that set.
[0131] An ITE gate works as follows: the gate is given an input library of identifiers, which are tested by the gate by examining the components in layer t of each identifier. If a component in layer t of identifiers is c, and c is a member of a set L, then j t If an identifier is defined by the programmer to be a member of L j t In this way, an ITE gate testing layer t sorts identifiers in the input library into an output library based on the components in that layer t. FIG. 14B shows an example where an ITE gate tests layer 1 and sorts identifiers into a library based on whether the identifier has a 0 in layer 1. In this example, assuming there are three possible components in layer 1, {0,1,2}, the output library is 0 1={0} and L 1 1=labeled as {1,2}.
[0132] FIG. 14C shows an exemplary data set used in computation. Following the exemplary functions described in FIGS. 13A-13C, in this example the data set comprises a pair of two-bit natural numbers X and Y arranged in a given order represented by their respective ranks in the data set. As described above, each data object in the data set is mapped to one or more identifiers. In this example, the pair of natural numbers X and Y is mapped to an operand register of identifiers, and the rank of the data object is mapped to a value register of identifiers. In this example, each input bit is mapped to a layer of identifiers, where each layer can have exactly two possible components representing a binary alphabet. FIG. 14D shows an identifier library created from the data set shown in FIG. 14C. Without loss of generality, in this example, the value register is assumed to contain a single final layer of identifiers, where the layer has sufficient cardinality to encode the rank of any object in the data set.
[0133] FIG. 14E shows how the graph program constructed in FIGS. 13A-13C may be combined with the ITE gates described in FIG. 14B to construct an ITE gate graph program for performing parallel summation on the exemplary data set shown in FIG. 14C. Each node of the graph program is implemented as an ITE gate, except for nodes labeled with 0 or 1. The test stratum of a gate is set to the stratum of the operand register that contains the input bit that labels that node. For example, in the graph program for output C in FIG. 14E, the first ITE gate tests for stratum 0, since stratum 0 holds bit X1 of the input, as indicated by the label of this node. The next two ITE gates test stratum 1 of the identifier, since stratum 1 holds bit X2 of the input, as indicated by the labels of those two nodes, and so on. In this example, the test stratum always contains exactly two possible components labeled 0 and 1, and thus always L. 0 t ={0} and L 1 t It is assumed that there are exactly two output libraries, labeled {0} = {1}. For brevity, we will not write the labels, but will adopt the convention described above and use a dotted arrow to point to output library {0} and a solid arrow to point to output library {1}. If a node in the graph program has more than one incoming arrow, the ITE gate implementing the node will have more than one input library. In this case, we assume that the input libraries are pooled to form a single input library containing the union of identifiers present in all input libraries. Nodes labeled with 0 or 1 (rather than input bits) are output nodes, i.e., the computation by the computer ends when all ITE gates have processed the input libraries presented to them and produced their output libraries, resulting in the output library represented by the output node. In this example, there are two output nodes, and therefore two output libraries, representing the two output symbols 0 and 1.
[0134] The computation proceeds as follows: Consider a graph program constructed to compute the output L of FIG. 14E. The identifier library shown in FIG. 14D is fed to the first ITE gate of this program. The gate labeled by X2 tests layer 1 of each identifier in the input library in parallel and sorts them into two output libraries {0} and {1} defined by the components present in layer 1. In this exemplary data set, three identifiers (with values 0, 2, and 4) contain component 0 in layer 1, and four identifiers (with values 1, 3, 5, and 6) contain component 1. The ITE gate therefore sorts these identifiers into the two output libraries produced by the first ITE gate as shown in FIG. 14E. These output libraries then become the input libraries to the next ITE gate. The next set of ITE gates is labeled Y2 and therefore tests layer 3. Of the identifiers with values 0, 2, and 4, only the identifier with value 0 has component 0 in the test layer. It is therefore sorted into the output library labeled 0. Of the identifiers with values 1, 3, 5, and 6, the identifiers with values 3, 5, and 6 have component 1 in the test layer. These identifiers are classified into output library 0 by the other ITE gate. As a result, output library 0 contains identifiers with values 0, 3, 5, and 6. By a similar series of steps, the output library labeled 1 contains identifiers with values 1, 2, and 4. Figure 14E shows the output libraries constructed by each of the three graph programs for each output of the function f specified in Figure 13A. Because the graph programs were constructed by factoring the specification of function f, the identifiers classified into each output class (0 or 1) correctly implement the definition of f.
[0135] From the output libraries constructed by the three graph programs shown in FIG. 14E, the output of the function f for each data object in the data set, i.e., the sum of a pair of 2-bit natural numbers, can be extracted. The output of the function f for any input includes three bits: a carry bit, a high bit, and a low bit. The low bit output for this exemplary data set is extracted as follows: The output node of the graph program for output L contains two output libraries labeled 0 and 1. The output library labeled 0 contains identifiers whose low bit output must be 0, as defined by the graph program. Similarly, the output library labeled 1 contains identifiers whose low bit output must be 1. To report the output, the value registers of the identifiers in the two libraries are read. This may be done using standard nucleic acid sequencing chemistry. For each value found in output library 1, an output of 1 is reported as the low bit output. This is shown as a "1" entry in the L row of the table of output L shown in FIG. 14F. The remaining values should therefore be in the other output library, and so for those values the low bit output is filled in to be 0. In this way all three output bits corresponding to all data objects in the data set can be obtained. The outputs so extracted for each pair of 2-bit numbers, when checked against the specification of f, indicate that the program has correctly computed the sum of the numbers. In this way any function may be implemented using the identifier library and the graph program. Data storage and computation by manipulating copy number
[0136] Above, we present a strategy for storing data using identifier sequence and computing on data by manipulating the presence or absence of identifier sequence.Alternatively or in addition to this method of data storage and computing, data can also be stored as the number of molecules or copy number of a particular identifier sequence in an identifier library.For example, the entire identifier sequence can correspond to a key, and the value of the key can correspond to the copy count of the identifier sequence in one or more identifier libraries.
[0137] Copy counts can be difficult to control and can be inherently inaccurate depending on the methods used to encode, manipulate, and measure them. To get around these limitations, data values can be encoded using expected copy counts (ECCs) instead of actual copy counts, and accept that the representation is approximate or ambiguous. Copy counts are discrete, but ECCs are continuous, thus allowing more values to be represented within a range of copy counts. Analog mappings can be defined such that numeric data values are represented by proportional ECCs. For example, if the proportionality constant is 100, then the value 2 will be represented by an ECC of 200, the value 2.5 will be represented by an ECC of 250, the value 2.755 will be represented by an ECC of 275.5, and so on. Such encoding schemes are referred to as "analog encoding."
[0138] A benefit of analog encoding is that it allows computation with native sample operations such as mixing, aliquoting, and PCR. Table 1 provides an overview of such sample operations and their logic. Mixing two samples s1 and s2 performs an addition where the two numbers being added are the respective numerical values of the identifier sequences in both samples. Aliquoting from sample s1 performs a multiplication by less than one (a "decimal"), where the decimal corresponds to the fractional volume of the aliquot (the volume of the aliquot divided by the volume of sample s1 from which the aliquot was derived). PCR performs a multiplication by a power of two, where the power of two corresponds to the number of PCR cycles. For example, one PCR cycle corresponds to multiplying by 2, two PCR cycles corresponds to multiplying by 4, three PCR cycles corresponds to multiplying by 8, and so on. Figure 16 demonstrates examples of logical operations performed on the analog encoded data stored by the identifier sequences across two samples s1 and s2.
[0139] [Table 1]
[0140] For samples containing multiple identifier sequences, the logic performed by the sample operations is performed in parallel for all identifier sequences. Additionally, the sample operations described above are configurable, as they take samples as inputs and produce samples as outputs that can be further manipulated. For example, multiplication by any positive number can be accomplished by running the PCR for y cycles and aliquoting fraction volumes z. This means that any positive number can be multiplied by z·2 for some fraction z and some integer y. y For this reason, any linear function with positive coefficients can be expressed by composing these sample runs.
[0141] In one embodiment, a vector x=[x1, x2, ..., xN By computing each multiplication term with the combined aliquot PCR runs for each sample, and then adding the terms by mixing all the output samples together, we can encode the linear function (or linear combination) c1x1+c2x x +...+c N x N can be applied to vectors.
[0142] FIG. 15 illustrates various protocols for performing the operations of Table 1 on two exemplary samples, s1 and s2. s1 encodes the number 4 using four identifiers and s2 encodes the number 3 using three identifiers. The first protocol involves performing two cycles of PCR on sample s1 to produce an output sample with a number of 16 represented by 16 identifiers. The output is determined by the logic of the number 4 multiplied by the power of two over the two cycles of PCR. The second protocol involves taking a half aliquot of sample s1 and producing an output sample with a number of 2. This follows the logic of dividing the number 4 of s1 by 2 due to the splitting into half aliquots of the sample. The third protocol involves mixing samples s1 and s2 to produce an output sample with a number of 7. Mixing represents the addition of the numbers encoded according to this scheme, so logically the output is the sum of the values of samples s1 and s2. The fourth protocol in Figure 15 shows an example of a linear function performed on the data encoded in the identifier sequences across two samples, s1 and s2. The linear function is the mix, PCR, and combination of aliquots of both samples.
[0143] Not only can each multiplication term and each addition in the linear function be done in parallel, but the function itself is done on multiple vectors simultaneously if there are multiple identifier sequences in the sample, each encoding its own vector. For example, with 1 trillion identifier sequences, up to 1 trillion vectors can be encoded. If each vector is 100 elements, this can be encoded across 100 samples. Figure 16 shows an example of a linear function being done on 9 vectors in parallel. Each vector is 3 elements, and each element is stored in a different sample. In this example, the data is first binary encoded by the presence or absence of each identifier sequence in each sample. Figure 16 demonstrates a linear function that converts binary data across three input samples to an analog or unary value in a single output sample. This function treats the data in sample s3 as the least significant binary digit, the data in sample s2 as the nearest binary digit, and the data in sample s1 as the most significant binary digit, thus adding the data in sample s3 to 2× the data in sample s2, which is then added to 4× the data in sample s1. As a sample operation, the protocol for this logic looks like this: mix(mix(pcr(s1,2),pcr(s2,1)),s3). For example, the binary number 111 stored in the first identifier array is converted to an analog value of 7, the binary number 110 stored in the second identifier array is converted to an analog value of 6, the binary number 011 stored in the third identifier array is converted to an analog value of 3, and so on. As depicted at the bottom of FIG. 16, the data in the samples can be abstracted as a matrix where every row is a vector encoded by an identifier array, and every column is the data encoded in the sample by that identifier array. Similarly, the coefficients of the linear function can be represented as a column vector that is multiplied with the matrix. The column vector has values 4 (representing 2 cycles of PCR applied to sample s1), 2 (representing 1 cycle of PCR applied to sample s2), and 1 (representing sample s3). The column output vector is encoded into the output samples. Although not shown, multiple linear functions can be performed on the sample data to produce multiple output samples. This is equivalent to multiplying two matrices to create the output matrix.
[0144] The method of digital to analog conversion shown in FIG. 16 is applicable to digital data stored in any form (e.g., not only base 2, but also base 3, base 4, decimal, etc.). Using this strategy, data can be digitally encoded and then converted to an analog encoding (expected copy count representation) for computation and readout by a computer. For example, the number x i B i1 b i2 b i3 Consider a 3-element vector [x1,x2,x3] of 3-bit numbers represented by: This can be represented by a binary coded (presence or absence) identifier sequence spanning 9 samples. The first 3 samples represent the first element, the second 3 samples represent the second element, the third 3 samples represent the third element, and so on. Then, a linear function c1x1+c2x x + Compile c3x3 to find the binary representation of the linear function c1(4b 11 +2b 12 +b 13 )+c2(4b 21 +2b 22 +b 23 )+c3(4b 31 +2b 32 +b 33 ), which will then be executed as a protocol involving sample operations on the sample containing the binary data.
[0145] The above sample manipulations cannot be done with linear functions that have negative coefficients. If the data is expressed in binary, the terms with negative coefficients in the linear functions are expressed as: -c i x i =c i (1-x i )-c i can be converted to terms with positive coefficients using (1-x i ) is x' i which is equivalent to x i where x is a bit i, which is the complement of . It follows that negative terms in a linear function (for binary data) can be converted to positive terms by using the complement of the binary digits in that term. For example, c1x1-c2x2-c3x3 can be converted to c1x1+c2x'2+c3x'3-(c1+c2). It follows that any mixed-sign linear function can be converted to a positive-sign linear function minus a constant. In order to perform this linear function transformation on a binary data set (without prior knowledge of which terms in the linear function will be negative), the complement of the data must be stored along with the original data. In other words, for each sample created with the presence of a set of identifier sequences A and the absence of another set of identifier sequences B, a complement sample s' must also be created that contains the presence of the set of identifier sequences in set B and the absence of the identifier sequences in set A. Once the linear function is in a form with positive-sign terms, it can be implemented using the sample manipulations described above (see Table 1 and Figures 15-16). The constant term does not depend on the data, so it can be subtracted from the results after they are read out of the DNA form, but for some applications the constant term may not even be involved. For example, if a linear function is the scoring function, the constant does not affect the rank order of the results. For example, if there are a trillion vectors and a linear function is designed to score those vectors according to a trained model, the constant term does not affect which vectors score higher than others.
[0146] The linear function applied to the data can be a model designed to identify target vectors with certain properties. For example, the linear function can be designed to transform target vectors into high scores and non-target vectors into low scores. Since the scores are represented by the ECC, discriminating sequences encoding higher scores will be more abundant in the output sample than discriminating sequences encoding lower scores, and thus random sampling from the output sample by DNA sequencing is more likely to return identifier sequences represented by vectors with higher scores in the model. The vectors themselves can be compressed representations of larger data objects stored elsewhere. For example, they can be hashes, bloom filters, signatures, fingerprints, or structure arrays derived from the original data objects. The original data objects corresponding to the high-scoring vectors can be retrieved using the associated identifier sequences (or derivatives thereof) as a key.
[0147] Because the operations described herein perform linear functions, they may be limited in their ability to enrich target identifier sequences (representing target data objects) over non-target identifier sequences. Subsequent application of a non-linear function, such as an activation function, may further enrich the target sequences. This is similar to how neural networks work to create complex behaviors, such as classification. Generally, in neural networks, a layer of "neurons" calculates a weighted sum of the inputs (corresponding to a linear function), and then the values (weighted sums of each neuron in the layer) are added together after applying a non-linear function to each value. Non-linear functions in this context are called activation functions because they "activate" signals from certain neurons. Non-linearity is crucial for activation, as it effectively suppresses signals from neurons with output values below a certain threshold.
[0148] The formation of double-stranded DNA from complementary single strands is a dimerization process and therefore has a supralinear dependence on the concentration of DNA molecules. Equations 1-8 provide a model for the dimerization of single-stranded DNA (species Z) to form double-stranded DNA (species Y). The kinetics of mass action are used to derive the concentration of double-stranded DNA at steady state ([Y]) as a function of the total amount of DNA [X].
[0149] Equation 1 describes the equilibrium reaction of dimerization, which is governed by the rate of double-stranded DNA degradation to single strands (δ) and the rate of duplexing (α). Equation 2 describes the rate of change of the concentration of double-stranded DNA [Y] based on the kinetics of Equation 1. At steady state, Equation 2 is equal to zero as shown. At steady state, solving Equation 2 for the concentration of double-stranded DNA [Y] gives Equation 3. The parameter K is the ratio of the rate of double-stranded DNA degradation to single strands (δ) to the rate of duplexing (α) (essentially K=δ / α). The total amount of DNA [X] is equal to the amount of single-stranded DNA [Z] plus the amount of double-stranded DNA [Y], as shown in Equation 4. Substituting Equation 4 into Equation 3 for [Z] gives Equation 5. Expanding Equation 5 gives the standard quadratic form of the quadratic equation, Equation 6, which can be solved for [Y] to give Equation 7. Equation 7 has two solutions, but one solution has [Y]>[X], which is not possible, so only one feasible solution is shown in Equation 7.
number
[0150] Equation 7 is non-linear and has different behaviors in different situations. When [X] > K, [Y] is approximately linear with respect to [X]. When the total amount of DNA [X] is much smaller than the rate constant K ([X] << K), [Y] is quadratic in [X], and Equation 7 can be approximated by Equation 8 using a quadratic approximation. Figures 17A and 17B support this approximation with a plot of the relationship between [Y] and [X] described by Equation 7 (Figure 17A) and an additional enlarged plot of the situation where [X] << K (approximated as the range of 0 to 0.1 for [X]) (Figure 17B), where quadratic behavior in [X] is observed.
[0151] This non-linearity can be utilized to increase the copy number difference between identifier sequences in a sample. Similar to the activation function in a neural network, it preferentially enriches identifier sequences with higher copy numbers, thereby effectively suppressing identifier sequences with lower copy numbers. This in turn increases the likelihood that identifier sequences with higher copy numbers will be sequenced when the sequencing process covers only a small sample size of the total sample. The non-linear function can also be applied iteratively. Literature (such as Livni, R. et al. ”On the Computational Efficiency of Training Neural Networks”, arXiv:1410.1141 [cs.LG], which is incorporated herein by reference in its entirety) shows that quadratic equations such as those demonstrated in Equation 7 can be effectively used as activation functions within a neural network when applied iteratively. A neural network model can be trained using the quadratic approximation from Equation 8 or the entire exact equation. This model can then be applied to the data stored in the DNA using the operations described above.
[0152] In order to faithfully utilize the non-linear relationship of Equation 7, it is necessary to perform a sample operation to selectively extract double-stranded DNA from the sample. In one embodiment, this may be achieved using a chromatography strategy such as gel electrophoresis. In another implementation, this may be achieved using mass spectrometry. In another implementation, this may be achieved by flow cytometry or another fluorescence sorting technique using a dye specific to double-stranded DNA. In another implementation, this may be achieved by membrane capture or affinity capture techniques, such as using silica beads or columns. Prior to the selection of double-stranded DNA, the sample must be given time to equilibrate (reach a steady state) according to the model assumptions of Equations 1-8. The non-linear situation is caused by [X] << K, which can be forced by diluting the sample to reduce [X]. Alternatively, K can be increased, for example, by raising the temperature of the sample or adding a substance that interferes with duplex formation. Encoding by lengthwise striping
[0153] In FIGS. 1A-1B, a scheme called "data at an address" was described, but here it is referred to as "lengthwise encoding" for encoding data objects such as "byte values" along an identifier. In this section, the lengthwise encoding scheme is extended to enable encoding data objects containing multiple byte values along an identifier into multiple identifier libraries, which is referred to here as lengthwise striping. In this specification, a method for obtaining a portion of the data object encoded lengthwise from a target library given a portion of the data object in a query library, and a method for using a data set encoded lengthwise for computer calculations within the "graph program" described above are provided. Together, these aspects enable computer calculations on larger data objects using the graph program by eliminating the limitation on the length of computable data objects that was previously determined by the lengthwise data encoding capacity of one identifier.
[0154] In this section, an identifier as described in connection with FIG. 12 encodes a key for distinguishing between data objects and a layer that encodes operands that make up the data objects. The identifier may comprise a total of L layers, where M of the layers are assigned to the key and N of the layers are assigned to the data, with M + N ≤ L. Building on the previous explanation of the encoding of byte values along the identifier (see U.S. Patent No. 10,650,312, filed December 21, 2017, titled "NUCLEIC ACID-BASED DATA STORAGE", which is incorporated by reference in its entirety), in this section, a data object comprising a plurality of byte values is first divided into P parts, each part containing no more than K byte values. The positive integer K is selected as follows. If the identifier includes N operand layers, each layer containing one of C possible components, any value ≤ L·[log2C] / 8 may be selected as K. Assuming a data set comprising D data objects, each of length at most T bytes, in some embodiments, each data object is divided into at most P = [T / K] parts. (If a data object contains fewer than P parts, the end of the object may be indicated by encoding a special delimiter such as "-".) The set of the i-th parts of each data object is called the i-th stripe of the data set, and any subset of one stripe, a sub-stripe. In some embodiments, the data set comprises P identifier libraries L1,...,L, each containing identifiers of rank 1,...,R (R ≥ D) P is used and encoded as follows. The j-th part (0 < j ≤ P) of the r-th data object is at an interval [C N r,C NThe data object is lengthwise encoded into an identifier operand register of rank [r+1, (r+1)-1]. A data object so encoded is said to be lengthwise striped across P identifier libraries, with each library encoding one of the P stripes of the data set.
[0155] FIG. 18 shows an exemplary workflow for longitudinal encoding of a dataset according to the rules described above. The dataset (A) contains three data objects (D=3), each with an object rank (0, 1, or 2) and at most three bytes (T=3). Data object 0 has two bytes (0, 1), data object 1 has three bytes (0, 1, 2), and data object 2 has one byte (0). The data objects are split into three parts (P=3), each part containing a one-byte value (K=1) (P=[T / K]=[3 / 1]=3). The identifier data map (B) shows how the identifiers used to chemically encode this dataset each contain an operand and a key. For each individual identifier, the key encodes the object rank (0, 1, or 2) of the respective data object, and the operand encodes the bit value of a given part of the respective data object. The stripe library (C) is the identifiers grouped according to the part rank, i.e., the position of the part (and therefore the corresponding byte value) in the data object. In this example of FIG. 18, the first stripe library L0 includes three identifiers encoding the first part of each data object. The second stripe library L1 includes three identifiers encoding the second part of each data object. The third data object does not have a byte value in the second part, so the special delimiter "-" is shown in the operand. In some implementations, the identifier has a specific concatenation of components encoding this special delimiter, but alternatively, the identifier with the special delimiter may be omitted from the library such that its absence in the library represents a missing byte value for the corresponding part of the corresponding data object. The third stripe library L2 includes three identifiers encoding the third part of each data object, where the identifiers of the first and third data objects do not have a byte value, so their operands indicate the special delimiter. Length Filtering
[0156] This aspect allows retrieving any substripe of any subset of data objects given any query substripe of the desired subset. An example of this retrieval method is shown in Figures 19A-19B. A data set of D data objects is encoded by lengthwise striping across P identifier libraries. Each identifier is composed of M key layers and N operand layers, as described above. Suppose we are given a query substripe X containing the i-th portion of some subset S of data objects ⊆ {1,...,D}, and we wish to retrieve substripe Y containing the j-th portion of the same subset S of data objects. This retrieval operation, referred to herein as filtering, involves two steps: 1. Key extraction: The key layer of each identifier in a query X is isolated from the identifier's operand layer. 2. Key match: A target library L whose key layer matches the key layer isolated from X j An identifier from is selected and output as substripe Y.
[0157] In some implementations, key extraction is performed by first converting each identifier in X to single-stranded form. Nucleic acids corresponding to all possible components that may appear in the key layer are obtained in single-stranded form complementary to that of X and hybridized to the single-stranded form of X. This ensures that the key layer is double-stranded while the operand layer is in single-stranded form. This mixture is exposed to a single-stranded DNA-degrading nuclease such as P1 (as shown in FIG. 19A). This degrades the operand layer and maintains the key layer of substripe X in double-stranded form.
[0158] In some implementations, key extraction is performed by digesting each identifier in X with a restriction endonuclease that recognizes a specific sequence found in all identifiers between the key layer and the operand layer, followed by size selection to maintain the key layer of substripe X in double-stranded form.
[0159] In some implementations, key extraction is performed by introducing a nick between the key layer and the operand layer with a sequence-specific nicking enzyme, incorporating a labeled nucleotide with DNA polymerase I at the nick site, melting the strands to produce single-stranded DNA, and performing affinity capture on the labeled nucleotide to maintain the key layer of substripe X in single-stranded form. In one implementation, labeling can be affinity capture performed with biotin and streptavidin coated beads.
[0160] In some implementations, key extraction is performed by selectively amplifying and purifying the key layer, where the identifier is designed such that the key layer is flanked by universal sequences that act as primer binding sites for PCR. The amplified DNA is purified to remove the operand sequences, such that the key layer of substripe X is maintained in double-stranded form.
[0161] In some implementations, the key match is first j and converting the extracted keys to complementary single-stranded form. Nucleic acids corresponding to all possible components that may appear in the operand layer of the target library are obtained in single-stranded form complementary to those of the target library and hybridized to the complementary single-stranded target library along with the single-stranded key. This ensures that identifiers in the target library whose key layer matches one of the extracted keys will be in double-stranded form, whereas identifiers whose key layer does not match any of the extracted keys will be in partially single-stranded form. The key layer will be partially or completely single-stranded. This mixture is exposed to a single-stranded nucleic acid degrading nuclease such as P1, which degrades the key layer of the unmatched identifiers in the target library, leaving only the matching identifiers in their full-length double-stranded form (as shown in Figure 19A). These identifiers may be further selected for their full length using gel electrophoresis. Together, these chemical operations implement the filtering operation described above (as shown in the workflow of Figure 19B).
[0162] In some implementations, the key match is performed by binding an affinity group to the extracted key layer, where the key layer is complementary to a matching key layer in the target library, such that molecules in the target library hybridize to the key molecules, which can be indirectly captured using affinity methods that target those key molecules.
[0163] The complete workflow shown in FIG. 19B involves applying a Filter 1 operator to Library A, which contains five identifiers. Each identifier in Library A contains four components selected from four layers. The Filter operator represents a query. The Filter 1 operator selects one component in the first two layers and any component form from the last two layers. Running Filter 1 on Library A using any of the mechanisms described herein results in identifiers that do not pass Filter 1 and identifiers that pass Filter 1. To obtain operators for Filter 2, a preparation step is performed to extract and keep the components of the last two layers of identifiers that pass Filter 1. Library B is provided, containing three identifiers, each with four components selected from the four layers. The Filter 2 operator obtained in the preparation step is applied to Library B to obtain identifiers that pass Filter 2 and identifiers that are rejected by Filter 2. A graph program for lengthwise encoded data sets
[0164] The graph programming model described above (see Figs. 13A-14F) can be used to compute on lengthwise striped input libraries. A graph program is a network of if-then-else (ITE) gates, where each ITE gate takes a library of identifiers as input and produces a set of identifier libraries as output. Previously, graph programs performed parallel computations on lengthwise encoded data, which was limited to a single input identifier library. The above described aspects allow a graph program to take multiple stripes as input and perform parallel computations on lengthwise striped data. Consider the example shown in Figs. 13A-14F. To illustrate computations with lengthwise striped inputs, one of the three graph programs described in Figs. 13-14, called "output L", is expanded in Fig. 20. Fig. 20 shows the previously described data set (A), which includes two integer operands X and Y. In this example, the data set is striped lengthwise across two identifier libraries L1 and L2, with operand X stored in L1 and operand Y stored in L2 (identifier library B). The first ITE gate (C in FIG. 20) operates on a portion of the X operand (X2) and therefore takes stripe L1 as input. As previously explained, the gate produces two output libraries, one where X2=0 and another where X2=1. Because this is a lengthwise striped data set, these libraries cannot act as inputs to the next ITE gate. Instead, they are used as query stripes to obtain the required input stripes for the next ITE gate. The next layer of ITE gates operates on operand Y (Y2), so stripe L2 is used as the target library for retrieval at the next ITE gate.Using these query and target libraries, the output library from the first ITE gate is transformed into an input library for the next layer of ITE gates. In this way, the graph program can use the lengthwise striped data set for computation. In combination, the first ITE gate (filter on operand X2 of stripe L1) and the second ITE gate (filter on operand Y2 using the operator from the filtered stripe L1) produce an output library representing the output L, where key ranks 1, 2, and 4 have value 1, and key ranks 0, 3, 5, and 6 have value 0, according to the output of FIG. 13C. implementation
[0165] Below, example implementations of the various aspects described above are provided. Compartments of information stored in nucleic acids
[0166] As discussed above, information stored in nucleic acids may be partitioned to make said information easier to access and read. FIG. 21 is a flow chart illustrating a method 2100 for storing digital information in a nucleic acid molecule using partitions. Method 2100 includes steps 2102, 2104, 2106, and 2108. Step 2102 involves partitioning the identifier nucleic acid sequences into blocks. Each identifier nucleic acid sequence includes a component nucleic acid sequence, at least a portion of which is configured to bind to one or more probes. Step 2104 involves allocating a symbol string to one of the blocks. Step 2106 involves mapping the symbol string to the plurality of identifier nucleic acid sequences in the block. Step 2108 involves constructing individual identifier nucleic acid molecules of the plurality of identifier nucleic acid sequences (i.e., the constructed identifier nucleic acid molecule has sequences from the plurality of identifier nucleic acid sequences).
[0167] As previously described, the mapping (in step 2108) may be done using a codebook that maps words (portions of digital information to be encoded, such as strings) to codewords (groups of identifier nucleic acid sequences). Each block contains one or more codewords. In some implementations, there is a fixed number of codewords per block. For example, the range of identifiers encoding the gth instance of a block is the codeword instance (g-1). * c+1~g * We can calculate c as the encoding range.
[0168] In some implementations, a block is accessible by an accessing program such as those described above. In some implementations, a block is associated with a location, the location including information for accessing the block. In some implementations, a block contains information about the location of another block.
[0169] In some implementations, a block represents a node in a graph. The graph may be a tree, such as a suffix tree or a B-tree. In some implementations, a block is an element of an inverted index. In some implementations, multiple blocks form a linked list in which a first block points to a second block to accommodate large strings that are mapped to at least the first and second blocks.
[0170] In some implementations, the identifier sequences of each block share the same component sequence within a set of key layers. The key layers may store data objects such as native keys (as described above). The native keys may be configured to include one or more symbols, each corresponding to a component sequence of a corresponding key layer. The method may further include performing a range query across several keys sharing a common symbol value in a set of positions by accessing all identifier molecules containing their corresponding component sequences. A query for all keys satisfying a finite automaton or regular expression may be performed by the accessing program.
[0171] The method may further include storing a value in the identifier array of the block associated with each key. The value may be obtained by accessing the corresponding key. The key may be a function of the value. The key may be a hash (e.g., a hash value resulting from applying a hash function to the value), a Bloom filter, a structure array, a classifier, a signature, a record, or a fingerprint derived from the corresponding value. The access program may be designed to access all keys that are similar to or share a common symbolic value with a query key. The query key may be derived from a reference value.
[0172] The count of the number of keys (e.g., across all blocks or identifier molecules) may be determined by measuring DNA concentration. For example, DNA concentration may be measured by fluorescence (e.g., qPCR, plate reader assay, Qubit fluorometer) or by absorbance (e.g., spectrophotometric assay). The measured DNA concentration may be normalized by a standard to determine the number of identifier sequences in the sample. The relative number of keys containing a particular symbol may be determined by performing qPCR with a probe for the key layer component corresponding to that particular symbol.
[0173] In some implementations, the method further comprises creating an identifier sequence for the reference key. The reference key may be used to perform the query. The identifier sequence may be used as a hybridization probe in a hybridization reaction to search or extract all similar or identical keys. The conditions of the hybridization reaction, such as pH and temperature, may be used to control the stringency of the search or extraction. For example, adjusting the temperature allows control of how similar a key must be to the reference key to be accepted. Manipulation of information stored in nucleic acids
[0174] As discussed above, information stored in nucleic acids may be used for computation by applying if-then-else (ITE) gates to select certain values, symbols, or sequences. FIG. 22 shows a flow chart illustrating a method 2200 for manipulating digital information stored in nucleic acid molecules. Method 2200 includes steps 2202, 2204, and 2206. Step 2202 involves obtaining a first pool of identifier molecules (nucleic acids). The pool has a powder, liquid, or solid form. Each identifier molecule of the first pool includes a component molecule, at least a portion of which is configured to bind to one or more probes. The identifier molecules represent one or more input strings. Step 2204 screens the identifier nucleic acid molecules of the first pool by targeting at least one of the component nucleic acid molecules with a probe to create an intermediate pool that includes a subset of identifier nucleic acid molecules from said first pool. The intermediate pool represents the result of the if-then-else operation performed on the input strings. Step 2204 results in the creation of an intermediate pool having a subset of identifier molecules from said first pool. Step 2206 involves repeating step 2204 such that the intermediate pool replaces the first pool (subject to if-then-else operations) in all subsequent steps until a final pool of identifier molecules has been created, the final pool representing at least a portion of the output string.
[0175] In some implementations, each identifier molecule of the first pool comprises a distinguishable component sequence from each of the M strata, each stratum comprising a set of component sequences.
[0176] In some implementations, the identifier molecule represents a data object. The component molecules of the identifier molecule may represent operands of the data object. In some implementations, the if-then-else operation includes using a probe pool of identifier molecules having the same specific component molecule as a probe, for example, to select identifier molecules of the first pool having the same specific component molecule. For example, the identifier molecules of the probe pool are single-stranded and hybridize, at least in part, to single-stranded identifier molecules of the first pool containing the same specific component molecule. In some implementations, the probe is a PCR primer and the if-then-else operation is performed by PCR. In some implementations, the probe is an affinity-tagged oligonucleotide and the if-then-else operation is performed by an affinity pull-down assay.
[0177] In some implementations, two or more if-then-else operations are performed in parallel on one or more pools of identifier molecules. In some implementations, method 2200 further includes splitting at least one of the first pool, the intermediate pool, or the final pool into at least two overlapping pools. At least one of the first pool, the intermediate pool, or the final pool may be replicated (e.g., by PCR) prior to splitting. Method 2200 may further include combining at least two intermediate pools of identifier molecules to form a new intermediate pool of identifier molecules or a second pool of identifier molecules.
[0178] In some implementations, the if-then-else operation (or its repeated application via step 2206) represents the execution of a graph program, the output of which places an identifier molecule representing a data object into a final pool representing at least a portion of an output string (e.g., the output identifier represents one bit of the output string). The graph program may represent a function on the data object. At least a portion of the output string may be the output of the function on the data object. In some implementations, the final pool into which the identifier molecule is placed determines the output of the function for the corresponding data object encoded by the identifier molecule according to the graph program. Storing Numerical Data in Nucleic Acids
[0179] As discussed above, the numerical data may be stored in the identifier molecule by generating an expected copy count. FIG. 23 shows a flow chart illustrating a method 2300 for storing numerical data in a nucleic acid. The method 2300 includes steps 2302 and 2304. Step 2302 involves determining an expected copy count of the identifier nucleic acid sequence based on the numerical data and a proportionality constant. Step 2304 involves generating a sample containing an actual number of identifier nucleic acid molecules each having the identifier nucleic acid sequence, the actual number approximating the expected copy count. The numerical data may be a number, and the expected copy count is proportional to the number according to the proportionality constant. At least a portion of each identifier nucleic acid molecule may be configured to bind to one or more probes.
[0180] Method 2300 may further include inputting the sample into an operation to produce an output sample. For example, the operation may involve multiplying the number by a power of two by performing a polymerase chain reaction (PCR) with primers that bind to common regions of the edges of the identifier nucleic acid sequences to form an output sample containing the PCR product. The power of two may correspond to the number of PCR cycles performed. The operation may involve adding the number as the first number to a second number in the second input sample by a mixing operation that combines the sample with a second input sample to form an output sample. The output sample may be an input to a second operation.
[0181] In some implementations, the number is the first element of a vector. Method 2300 may further comprise determining a second expected copy count of the identifier nucleic acid sequence based on the second element of the vector and a proportionality constant. Method 2300 may then further comprise generating a second sample containing a second actual number of identifier nucleic acid molecules each having the identifier nucleic acid sequence, where the second actual number approximates the second expected copy count.
[0182] The method 2300 may further include performing a linear function on the vector by at least one of PCR, aliquoting, and mixing. The linear function may be used to convert the binary vector into a unary value in the output sample. The linear function may be a scoring function. For example, the scoring function may compute a higher output value for the target vector than for the non-target vector, such that the copy count of the identifier sequence corresponding to the target vector is enriched in the output sample. The identifier sequence corresponding to the target vector may be determined by sequencing the output sample. The double-stranded DNA selection operation may be used to form a new output sample in which the identifier sequence corresponding to the target vector is further enriched in the output sample, thereby increasing the copy count ratio between the two identifier sequences in the output sample. The operation (or repeated application thereof) may correspond to an activation function or a quadratic function in a neural network. In some implementations, the output sample is allowed to equilibrate before the double-stranded DNA selection operation. Also, the temperature may be changed or a cofactor may be added to the output sample before the operation. Manipulation may be by at least one of chromatography, gel electrophoresis, mass spectrometry, flow cytometry, fluorescence activated sorting, membrane capture, silica column capture, silica bead capture, or affinity capture.
[0183] In some implementations, a vector is a compressed representation of a larger data object (larger than a vector). The compressed representation may be a hash, a Bloom filter, a signature, a structure array, or a fingerprint of the larger data object. The larger data object may be obtained using the corresponding identifier nucleic acid sequence as a key. Preparation of striped library encoding dataset
[0184] As discussed above, a dataset may be encoded by splitting into portions and encoding the portions across a striped library. FIG. 24 shows a flow chart illustrating a method 2400 for preparing a plurality of nucleic acid libraries encoding a dataset. Method 2400 includes steps 2402, 2404, and 2406. Step 2402 involves providing a dataset including at least one data object, each data object having an object rank and including at least one byte value. Step 2404 involves splitting each data object into a plurality of portions. The plurality of portions are ranked such that each portion of each data object includes (1) a byte value of at least one byte value from the portion's corresponding data object, and (2) a portion rank indicating a position of the byte value of the at least one byte value of the portion's corresponding data object. Step 2406 involves mapping the dataset to a plurality of nucleic acid libraries having solid, liquid, or powder form. Each nucleic acid library has a library rank and includes a plurality of nucleic acid molecules encoding portions having the same portion rank from different data objects. The same partial rank of multiple nucleic acid molecules of a given library corresponds to a respective library rank of the given library, and each nucleic acid molecule includes a key encoding a respective object rank and an operand encoding a respective byte value.
[0185] In some implementations, each nucleic acid molecule includes L components, each component selected from C possible components of a distinct one of the L layers, where M of the L components encode a key and N of the L components encode an operand, such that the sum of M and N is less than or equal to L. Byte values of the portions encoded by each nucleic acid molecule may be stored in the nucleic acid molecule's operand. In some implementations, each portion contains K bytes or less of value, and each data object contains at most T bytes of value, such that each data object is divided into at most P portions, where P=[T / K]. K may be any value less than L×[log2C] / 8.
[0186] In some implementations, the dataset is encoded using W nucleic acid libraries, each library containing nucleic acid molecules with identifier ranks of 1, ..., R. The dataset includes D data objects, such that R is greater than or equal to D. The jth of the P portions of the rth data object of the D data objects is located in the jth library within the interval [C N r,C N (r+1)−1] may be the rule that is encoded into the operand of a nucleic acid molecule of rank within the range
[0187] Also provided herein is a method of obtaining a subset of data objects of a dataset encoded in a plurality of nucleic acid libraries according to method 2400. The method includes providing a target nucleic acid library and a query nucleic acid library, each including a nucleic acid molecule, each including a key and an operand. The method then involves extracting a key from a nucleic acid molecule of the query nucleic acid library. The method then involves matching nucleic acid molecules in the target nucleic acid library that have a key that matches the key extracted from the query nucleic acid library. Finally, the method involves selecting and outputting the matched nucleic acid molecules.
[0188] The extracting step may include converting each nucleic acid molecule of the query library to a single-stranded molecule, and the matching may include hybridizing a nucleic acid molecule in the target library to a complementary single-stranded key. The selecting step may include providing an enzyme that selectively degrades single-stranded nucleic acids after hybridization. For example, the enzyme may be P1.
[0189] The extraction step may include digesting each nucleic acid molecule in the query library with a sequence-specific enzyme that recognizes a particular sequence found in each nucleic acid molecule. This extraction may further include size-selecting keys that are present in double-stranded form.
[0190] The extraction step may include introducing a nick between the key and the operand of each nucleic acid molecule using a sequence-specific nicking enzyme, incorporating a labeled nucleotide at the nick, and capturing the labeled nucleotide to maintain the key in single-stranded form. For example, the labeled nucleotide has a biotin label and the capturing step involves affinity capture with streptavidin-coated beads.
[0191] The extraction step may involve selectively amplifying and purifying via PCR keys from the query library, where the keys are flanked by universal sequences that act as primer binding sites for the PCR.
[0192] The matching step may involve converting the target library and the extracted keys to single-stranded form and hybridizing the single-stranded extracted keys to complementary keys in the target library. The selecting step may involve gel electrophoresis.
[0193] In some implementations, the query library encodes a first set of portions of the dataset and the target library encodes a second set of portions of the dataset (e.g., according to method 2400 of FIG. 24). The extract step may act as a first if-then-else operation on the dataset, and the matching step and the selection / output step act as a second if-then-else operation on the dataset.
[0194] The foregoing merely illustrates the principles of the present disclosure, and the apparatus may be practiced with other than the described embodiments, which are presented by way of example and not by way of limitation. It should be understood that while the apparatus disclosed herein is shown for use in nucleic acid-based data storage, it may be applied to applications involving data archiving and storage or chemical data science.
[0195] After considering this disclosure, variations and modifications will occur to those skilled in the art. The disclosed features may be implemented in any combination and subcombination (including multiple subordinate combinations and subcombinations) with one or more other features described herein. The various features described or illustrated above, including components thereof, may be combined or integrated into other systems. Furthermore, certain features may be omitted or not implemented.
[0196] The systems and methods described may be implemented locally in a printer-finisher system, such as those described in U.S. Application No. 16 / 414,752, entitled "PRINTER-FINISHER SYSTEM FOR DATA STORAGE IN DNA," filed May 16, 2019 and published as U.S. Publication No. 2019 / 0351673, which is hereby incorporated by reference in its entirety. The printer-finisher system may include a data processing device. The systems and methods described herein may be implemented remotely on a separate data processing device. The separate data processing device may be directly or indirectly connected to the printer-finisher system through a cloud application. The printer-finisher system may communicate in real time (or near real time) with the separate data processing device.
[0197] In general, embodiments of the subject matter and functional operations described herein, including the structures disclosed herein and their structural equivalents, can be implemented in digital electronic circuitry, or in computer software, firmware, or hardware, or one or more combinations thereof. Embodiments of the subject matter described herein can be implemented as one or more computer program products, i.e., one or more modules of computer program instructions encoded on a computer-readable medium for execution by or to control the operation of a data processing apparatus. The computer-readable medium can be a machine-readable storage device, a machine-readable storage substrate, a memory device, a composition of matter affecting a machine-readable propagating signal, or one or more combinations thereof. The term "data processing apparatus" encompasses any apparatus, device, or machine for processing data, including, by way of example, a programmable processor, a computer, or multiple processors or computers. In addition to hardware, an apparatus can include code that creates an execution environment for a subject computer program, such as code that constitutes a processor firmware, a protocol stack, a database management system, an operating system, or one or more combinations thereof. A propagated signal is an artificially generated signal, such as a machine-generated electrical, optical, or electromagnetic signal that is generated to encode information for transmission to an appropriate receiver device.
[0198] A computer program (also known as a program, software, software application, script, or code) can be written in any form of programming language, including compiled or interpreted languages, and can be arranged in any form, including as a stand-alone program or as modules, components, subroutines, or other units suitable for use in a computing environment. A computer program may correspond to a file in a file system. A program can be stored in part of a file that holds other programs or data (e.g., one or more scripts stored in a markup language document), in a single file dedicated to the program in question, or in multiple associated files (e.g., files storing one or more modules, subprograms, or portions of code). A computer program can be arranged to run on one computer, or on multiple computers located at one site or distributed at multiple sites and interconnected by a communication network.
[0199] The processes and logic flows described herein may be performed by one or more programmable processors executing one or more computer programs to perform functions by manipulating input data and generating output. The processes and logic flows may also be performed by, and an apparatus may be implemented as, special purpose logic circuitry, such as an FPGA (field programmable gate array) or an ASIC (application specific integrated circuit).
[0200] Processors suitable for executing computer programs include, by way of example, both general and special purpose microprocessors, including any one or more processors of any kind of digital computer. Typically, a processor receives instructions and data from a read-only memory or a random access memory, or both. The essential elements of a computer are a processor for executing instructions and one or more memory devices for storing instructions and data. Typically, a computer also includes one or more mass storage devices, such as magnetic, magneto-optical, or optical disks, for storing data, or is operatively coupled to receive data from or transfer data to, or both. However, a computer need not have such devices.
[0201] Examples of changes, substitutions, and alterations can be determined by one skilled in the art and can be made without departing from the scope of the information disclosed herein. All references cited herein are incorporated by reference in their entirety and made a part of this specification.
Claims
1. 1. A method for manipulating digital information stored in a nucleic acid molecule, comprising: (a) obtaining a first pool of identifier nucleic acid molecules, said pool having a powder, liquid, or solid form, each identifier nucleic acid molecule of said first pool comprising a component nucleic acid molecule, at least a portion of which is configured to bind to one or more probes, said identifier nucleic acid molecule representing an input string; (b) screening the identifier nucleic acid molecules of the first pool by targeting at least one of the component nucleic acid molecules with a probe to create an intermediate pool comprising a subset of identifier nucleic acid molecules from the first pool, the intermediate pool representing the result of an if-then-else operation performed on the input string; (c) repeating step (b), wherein said intermediate pool replaces said first pool in all subsequent steps until a final pool of identifier nucleic acid molecules representing at least a portion of the output string is produced.
2. 2. The method of claim 1 , wherein each identifier nucleic acid molecule of the first pool comprises a distinguishable component nucleic acid sequence from each of M strata, each strata comprising a set of component nucleic acid sequences.
3. The method of claim 1 or 2, wherein each identifier nucleic acid molecule represents a data object.
4. The method of claim 3 , wherein component nucleic acid sequences of the identifier nucleic acid molecule represent operands of the data object.
5. The method of claim 1 , wherein the probe comprises an identifier nucleic acid molecule within a pool comprising specific component nucleic acid molecules.
6. The method according to any one of claims 1 to 4, wherein the probes are polymerase chain reaction (PCR) primers and the if-then-else operation is carried out by PCR.
7. The method of any one of claims 1 to 4, wherein the probe is an affinity tagged oligonucleotide and the if-then-else operation is performed by an affinity pull-down assay.
8. 8. The method of claim 1 , wherein two or more screening steps are performed in parallel on one or more pools of identifier nucleic acid molecules.
9. 9. The method of any one of claims 1 to 8, further comprising splitting at least one of the first pool, the intermediate pool, or the final pool into at least two overlapping pools.
10. 10. The method of claim 9, further comprising replicating the at least one of the first pool, the intermediate pool, or the final pool prior to splitting.
11. The method of claim 10, wherein the replicating step is performed by polymerase chain reaction (PCR).
12. 12. The method of any one of claims 1 to 11, further comprising combining at least two intermediate pools of identifier nucleic acid molecules to form a new intermediate pool of identifier nucleic acid molecules or a second pool of identifier nucleic acid molecules.
13. 13. The method of claim 1, wherein the repetition of step (b) in (c) represents the execution of a graph program, the output of which places identifier nucleic acid molecules representing data objects into the final pool representing the at least a portion of the output string.
14. The method of claim 13 , wherein the graph program represents a function on the data object.
15. The method of claim 14 , wherein the at least a portion of the output string is an output of the function on the data object.
16. 16. The method of claim 15, wherein the final pool into which identifier nucleic acid molecules are placed determines the output of the function for a corresponding data object according to the graph program.
Citation Information
Patent Citations
Systems for nucleic acid-based data storage
JP2020507168A
Nucleic acid-based data storage
JP2020515243A
JPP6786144B
Compositions and methods for nucleic acid-based data storage
WO2019222561A1