path_biosynthesis(), path_biosynthesis_virtual(), trace_biosynthesis(), and trace_biosynthesis_virtual() now return one edge per substrate-product transition with a shared schema: logical vertex target; scalar edge enzyme; list-valued edge enzymes; logical edge is_virtual; and integer edge step. Replace uses of parallel enzyme edges or concrete_enzymes with the enzymes list attribute. (#49)path_biosynthesis(), path_biosynthesis_virtual(), trace_biosynthesis(), and trace_biosynthesis_virtual() now error unless all supplied glycans use the same concrete or generic monosaccharide type and the same intact or topological structure level; standardize inputs with glyrepr::convert_to_generic() or glyrepr::remove_linkages(), and replace mixed-residue, partial, or missing structures before tracing. (#48)abstract_enzymes() provides 12 simplified N-glycan enzymes, including bisecting-GlcNAc activity GnTIII and a three-step glucose-removal enzyme, as glyenzy_abstract_enzyme objects for explicit use in reactions and biosynthesis tracing. Individual activities are available by name through enzyme(), and homogeneous abstract collections can be supplied by name or object to enzymes arguments; concrete and abstract enzymes cannot be mixed in one collection. Trimming and core transferases use concrete enzyme rules; terminal transferases retain the corresponding N-glycan rejects. These enzymes remain separate from the ordinary database and all default enzyme selections. (#50)normalize_n_glycan() standardizes selected Gal and Neu5Ac distributions on simple three- and four-antennary topological N-glycans while preserving core fucose and bisecting GlcNAc. (#51)enzymes edge attribute. (#49)path_biosynthesis() and trace_biosynthesis() now require glycans with matching monosaccharide types and structure levels; convert incompatible inputs before searching. (#48)path_biosynthesis() and trace_biosynthesis() search faster with a native breadth-first search engine, including for sulfated, generic, and topological glycans and enzymes that specify glycan types. Custom enzymes and filters retain their R callbacks. Building from source now requires a C++17 compiler. (#52)apply_enzyme() no longer accepts structure_level = "basic"; calls now error during argument validation. Use structure_level = "topological" to remove linkages while preserving concrete residue identities, and convert residues separately with glyrepr::convert_to_generic() when generic output is required.glycan_type compatibility metadata for N-glycans, O-glycans, and glycolipids. Enzyme actions and biosynthesis searches use this metadata to avoid applying class-specific enzymes to incompatible glycan structures. (#45)UGCG, UGT8, B4GALT5, B4GALT6, and ST3GAL5, complete ganglioside rules for B3GALT4, B4GALNT1, and ST8SIA1, and corrected rules for ST6GALNAC3 and ST8SIA5. Glycolipid rules model carbohydrate headgroups with ceramide omitted. (#42)enzymes_from_rnaseq() selects built-in enzymes whose genes meet a configurable mean TPM threshold, using the GlycoMaple cutoff of TPM = 1 by default. (#43)product_substrate_ratio() calculates glycosyltransferase and sulfotransferase product-to-substrate motif quantification ratios from glycomics or site-specific glycoproteomics data, using lenient motif matching for partial or reduced structures. (#44)apply_enzyme() with structure_level = "topological" now removes linkages while preserving residue identities; structure_level = "basic" is no longer supported.find_enzyme() now batches product-motif matching across built-in enzyme rules, substantially improving performance while preserving special-case, substituent, requirement, and glycan-type handling. (#47)path_biosynthesis() and trace_biosynthesis() now handle input vectors containing mixed generic and concrete residues element-wise and use lenient matching when needed.autoplot() now accepts the four glydraw 0.8.0 orientation values: "left", "right", "up", and "down".trace_biosynthesis() now infers max_steps from the largest target glycan when it is NULL, using its monosaccharide and substituent count plus 4 for N-glycans and minus 1 otherwise; explicit limits remain supported. (#40)trace_biosynthesis() now returns a single-vertex target network when the target is already the selected starting glycan and no enzymatic steps are required. (#39)glyenzy_biosynthesis_network objects that preserve their igraph interface and support collision-aware plot() and ggplot2::autoplot() layered DAG layouts with glycan nodes and labeled concrete or virtual enzyme edges. (#35, #36)trace_biosynthesis() and trace_biosynthesis_virtual() now mark target glycans with a logical target vertex attribute; autoplot() highlights them by default in multi-target networks, with explicit control through highlight_target. (#37, #38)path_biosynthesis() and trace_biosynthesis() no longer support paucimannose N-glycans; use glyenzy 0.6.3 if you need to analyze those structures. (#25)ST) with 12 human N- and O-glycan enzymes, sulfate-aware inference and biosynthesis, and virtual sulfation steps. (#20, #33)path_biosynthesis() and trace_biosynthesis() gain max_virtual_steps to bridge a bounded number of unsupported, target-directed transitions before resuming concrete enzyme tracing; fallback edges are marked by is_virtual. (#32)trace_biosynthesis_virtual() and path_biosynthesis_virtual() build enzyme-agnostic networks by trimming targets backward; annotate_enzymes = TRUE adds exact rule-matched candidates in concrete_enzymes. (#22, #28, #30)path_biosynthesis() and trace_biosynthesis() now scale better to large and multi-target searches by keeping intermediates as graphs, sharing prepared graph and rule work, vectorizing and batching frontier matching, caching graph products, pruning irreversible pre-MGAT2 decorations and occupied acceptor carbons, prioritizing inclusive targets, and using one multi-target reachability traversal. (#26, #29, #34)apply_enzyme(), have_enzyme(), count_enzyme(), and biosynthesis-path helpers now work with glymotif 0.17.0 and later.glyrepr 0.13.0 or later for compatibility with refreshed glycan structure data (#24).method = "path" to have_enzyme(), count_enzyme(), match_enzyme(), and find_enzyme() for biosynthesis-derived enzyme inference. (#19)glyrepr. (f0e42b2)match_enzyme() to ignore enzyme reject motifs when reporting matched residues, consistent with have_enzyme() and count_enzyme(). (0f18c74)all_enzymes() to db_enzymes()create_enzyme() to make_enzyme()get_involved_enzymes() to find_enzyme()is_synthesized_by() to have_enzyme()count_enzyme_steps() to count_enzyme()find_synthesis_path() to path_biosynthesis()rebuild_biosynthesis() to trace_biosynthesis()spawn_glycans() to grow_glycans()spawn_glycans_step() to grow_glycans_step()match_enzyme() to identify the residues added by a glycosyltransferase. (#3)view_enzyme() to visualize residues added by an enzyme on a glycan cartoon. (#4)rejects field in enzyme rules: each reject must contain the acceptor motif.rejects handling in apply_enzyme() (and callers) to evaluate rejects per match rather than per glycan, improving accuracy for glycans with multiple acceptor matches.rejects_alignment field from enzyme_rule objects; acceptor_alignment is reused for reject checks.make_enzyme(), enabling programmatic construction of custom enzymes.grow_glycans() now shows live glycan counts in the progress bar.grow_glycans().trace_biosynthesis() now supports many new glycan types, including O-Man, O-GlcNAc, O-Fuc, and O-Glc.path_biosynthesis() and trace_biosynthesis() has been optimized for large glycans.glymotif (>= 0.10.0) to ensure compatibility with recent changes in package igraph v2.2.0.glymotif v0.7.0 and glyrepr v0.7.0.return parameter from path_biosynthesis() and trace_biosynthesis(). Now they always return all possible paths.trace_biosynthesis() now supports multiple target glycans. The resulting graph contains all given target glycans and intermediate glycans.path_biosynthesis() and trace_biosynthesis() to include some important notes.path_biosynthesis() and trace_biosynthesis() that glycan structure strings other than IUPAC-condensed format cannot be parsed.apply_enzyme() to stop using internal glymotif functions to avoid fragile dependency.glyrepr v0.7.0.First release of glyenzy!