Changes in version 1.9.0 released on 11 Jul 2026
New features
-
visped()SVG output:visped()now writes SVG files whenfileends in.svg; other file names continue to use PDF output by default. -
visped()custom labels: Added alabelvarargument to display labels from either a user-selected pedigree column or a row-aligned character vector. Compact full-sib family nodes continue to show family size. -
visped()symbol schemes: Added ashapebyargument for choosing how node shapes are encoded. The defaultshapeby = "sex"uses circles for females, squares for males, diamonds for unknown sex, and hexagons for monoecious individuals. Setshapeby = "role"to keep the legacy role-based symbol scheme in which real individuals are circles and compact full-sib family summaries are rectangles. -
Matrix-free relationship products: Added
pedprod()to compute , , , and directly from a complete pedigree. The implementation uses the factorization and avoids materializing the dense additive relationship matrix. -
visped()custom generation labels:genlabnow also accepts an unnamed character vector, assigning one user-provided label to each displayed generation from top to bottom. The existing logical values retain their behavior:TRUEdraws the defaultG1,G2, … labels andFALSEomits them.
Improvements
-
Matrix-free
pedrel()summaries:pedrel()now computes grouped mean relationships and coancestries from batched products. It traces the union of selected ancestors once and no longer constructs or scans a dense relationship matrix for each group. -
Large-group support in
pedrel(): The former dense and compact matrix size guards are no longer needed. The development-onlyforce,max_dense, andmax_compactno-op arguments were removed before release, whilecompactremains as a backward-compatible no-op argument.StatusandMessagecontinue to identify groups skipped because fewer than two individuals were selected or groups that failed during tracing. -
Matrix-free coancestry analyses:
pedne(method = "coancestry")now obtains sampled pair relationships from batched products instead of constructing a dense triangular relationship matrix.pediv()reuses the same products for and founder genome equivalents, whilepedhalflife()requests only the statistic it needs. -
Matrix-free grouped heatmaps:
vismat(tidyped_object, by = ...)now computes grouped additive relationships as without first constructing the full individual-level relationship matrix. -
Clearer compact full-sib family summaries in
visped(): Compact full-sib family labels now use the explicitFS×Nform instead of a bare number, avoiding confusion with an individual ID. Compact family summaries use a green-grey fill with a darker frame, while unknown-sex individuals use a neutral-grey fill with a grey frame.
Bug fixes
-
Selfing in
Ainv: Corrected the sire-dam diagonal cross-term in Henderson’s inverse construction when the sire and dam are the same individual.pedmat(method = "Ainv")now remains the numerical inverse ofAfor pedigrees created withselfing = TRUE.
Documentation
-
Plant pedigree example in
tidy-pedigreevignette: Added section 3.9 demonstratingselfing = TRUEfor monoecious species, including sex inference, inbreeding coefficients under self-fertilization, and thesummary()output for plant pedigrees. -
Plant pedigree visualization in
draw-pedigreevignette: Added section 1.1.3 showing a multi-generation self-pollinating pedigree withvisped(). Monoecious individuals are drawn as hexagons with teal edges, selfing edges are shown in teal, and inbreeding coefficients are displayed withshowf = TRUE.
Changes in version 1.8.0 released on 25 Mar 2026
Performance
-
Inbreeding calculation: Replaced the Meuwissen and Luo (1992) linear path-trace algorithm in
cpp_calculate_inbreeding()with the Sargolzaei and Iwaisaki (2005) LAP (Longest Ancestral Path) bucket method. At N = 1,000,000, the C++ kernel completes in about 0.15 s (previously about 15 s), and the fullinbreed()call returns in about 0.40 s. The implementation uses O(1) ancestor retrieval via bucket pop, O(1) duplicate suppression via theL[k] == 0check, and O(m_i) path-coefficient reset. Results are numerically identical to the previous implementation (maximum difference < 2e-15). -
tidyped()candidate tracing: When the input is already atidypedobject andcandis specified, the fast path now uses three C++ BFS functions (cpp_trace_ancestors(),cpp_trace_descendants(), andcpp_topo_order()) instead of rebuilding anigraphobject. At N = 1,000,000 with 200 candidates, elapsed time drops from about 0.91 s to about 0.056 s. The fast path now also applies sibling and mate generation alignment forgenmethod = "bottom", matching the output of the full path. -
pedgenint()generation-interval lookup: Replaced the character-keydata.tablejoin used to look up each individual’s generation number with a pre-computed integer index array. Benchmark on a representative dataset: 4.24 s to 0.49 s. -
pedmat(sparse = TRUE)matrix coercion: The conversion from a dense numeric matrix to aMatrix::dgeMatrixnow bypasses the S4 dispatch overhead ofas(mat, "dgeMatrix")via a directmethods::new()call backed by a package-level class cache. Benchmark on a representative subpedigree: 1.24 s to 0.60 s. -
pedrel(compact = TRUE)safety guard: Added an early error when the number of reference individuals exceeds 200,000 in compact mode, preventing unintended O(N^2) matrix allocation.
Bug fixes
-
tidyped()fast path withaddnum = FALSEandcand: When the inputtidypedobject was created withaddnum = FALSE, passingcandcould raise"None of the specified candidates were found in the pedigree."because the fast-path BFS looked upped_dt$IndNum, which wasNULL. The fix temporarily adds integer index columns for the BFS and removes them from the output whenaddnum = FALSE. -
pediv()andpedne()coancestry outputs whenECGwas not pre-computed: Internalmerge(..., by = "Ind", all.x = TRUE)calls sorted output alphabetically byInd, breaking theIndNum == row-indexinvariant used by the fast-path BFS intidyped(). This could produce incorrectfg,MeanCoan, andNeCoancestryvalues, such asfgnear 240 instead of about 19. Fixed by restoringIndNumorder immediately after the merge. -
summary_pedmat()density for denseMatrixsubclasses:summary_pedmat()reportedDensity = 100%for allA,D, andAAmatrices returned asMatrix::dgeMatrixobjects. It now usesMatrix::nnzero() / (nrow * ncol)for allMatrixsubclasses, giving the correct fill ratio for bothdgeMatrixanddgCMatrix.
Documentation
-
Inbreeding references: Updated
inbreed()and vignette references to cite Sargolzaei and Iwaisaki (2005) instead of Meuwissen and Luo (1992).
Internal changes
-
align_bottom_generations()helper: Consolidated the sibling and mate generation-alignment block previously duplicated between the main and fast paths oftidyped()into a single internal helper. - C++11 compatibility: Replaced two C++17 structured-binding usages in the BFS functions with explicit C++11 equivalents for compatibility with GCC 8.
-
methodsdependency: Listed themethodspackage underImportsinDESCRIPTION, as required whenmethods::getClass()andmethods::new()are called at runtime.
Changes in version 1.7.0 released on 23 Mar 2026
New features
-
pediv()retained genetic diversity (GeneDiv):pediv()$summarygains aGeneDiv = 1 - MeanCoancolumn, the pedigree-based retained genetic diversity of the reference population. Values lie in , with larger values indicating more diversity retained relative to an unrelated base population.print.pediv()displays it alongsidefgandMeanCoan. -
vismat()large-pedigree representative view: When the original pedigree has more than 5,000 individuals,vismat()no longer attempts a full N × N matrix expansion. It uses the compact K × K representative-individual matrix directly and adds sibling-count labels of the formID (×n)to each axis tick. Whencompact = TRUEandbyis supplied, group means are computed algebraically from the K × K matrix without expanding to N × N.
Internal changes
-
vismat()threshold constants: Hardcoded values controlling large-pedigree behavior (5000,2000, and50) were refactored into named constants (VISMAT_EXPAND_MAX,VISMAT_LABEL_MAX, andVISMAT_WARN_THRESHOLD) at the top ofR/vismat.R.
Changes in version 1.6.2 released on 23 Mar 2026
New features
-
pedrel()coancestry scale: Added ascaleparameter topedrel()supporting"relationship"(default, returns mean ) and"coancestry"(returns corrected mean coancestry ). The coancestry scale uses the diagonal-corrected formula of Caballero and Toro (2000), accounting for self-coancestry within the reference group.
API changes
-
vispstat()internal-only backend:vispstat()is now the internal backend forplot.pedstats(). Users should call the standard S3 method withplot(stats_obj).
Bug fixes
-
Spurious subsetting warnings: Internal group-by slicing in
pedrel(),pedne(),pediv(),pedhalflife(), andpedgenint()no longer triggers false-positive[.tidyped]warnings when the subset is only used for ID extraction. -
Internal class-restoration messages:
pedrel(compact = TRUE)no longer emits class-restoration messages caused by early-return branches incompact_ped_for_matrix(). Those branches now preserve thetidypedclass by returningdata.table::copy(ped). -
vispstat()cleanup: Removed dead-code variables and added unit tests for thegenintbranch ofvispstat().
Documentation
-
vispstat()generation-interval documentation: Updated the text to describe mean values accurately and remove the misleading “mean +/- SD” claim. -
pedigree-analysis.Rmdsection 9: Split the “Average Relationship Trends withpedrel()” section into two subsections covering bothscaleoptions. Added the Caballero and Toro (2000) diagonal-corrected coancestry formula, a workedscale = "coancestry"example, and guidance on choosing a scale. -
relationship-matrix.Rmdupdates: Added a compact-to-vismat()direct path, expanded the visualization examples, and replaced incorrect performance thresholds with a reference table.
Changes in version 1.6.1 released on 21 Mar 2026
Improvements
-
Diversity notation: Output columns in
pedhalflife()$timeseriesare now lowercase (fe,fa,fg,lnfe,lnfa,lnfg,lnfafe, andlnfgfa) to match population genetics notation. -
plot.pedhalflife()log view: Intype = "log"mode, the plot includes an OLS regression line for total diversity decay () and a vertical reference line for the diversity half-life . -
Time-unit labeling:
plot.pedhalflife()andprint.pedhalflife()now use the name of thetimevarcolumn, such asGenorYear, for axis and summary labels.
Changes in version 1.6.0 released on 20 Mar 2026
New features
-
Information-theoretic diversity half-life (
pedhalflife()): Addedpedhalflife()to track , , and across time points and fit a log-linear decay model for the rate of genetic diversity loss. The total loss rate is decomposed into foundation bottleneck (), breeding bottleneck (), and genetic drift (). The diversity half-life is reported in units of thetimevarcolumn. S3print()andplot()methods are provided, with both log-scale (type = "log") and raw-scale (type = "raw") views.
Changes in version 1.5.0 released on 20 Mar 2026
New features
-
Shannon-entropy effective founders and ancestors (
feH,faH):pedcontrib()andpediv()now compute two additional diversity statistics based on the Hill number of order (Shannon entropy):feH, the effective number of founders under equal entropy weighting, andfaH, the effective number of ancestors under equal entropy weighting. They satisfy and , respectively. Both are computed as and complement the classical quadratic () effective numbers and (Lacy 1989; Boichard et al. 1997).
Changes in version 1.4.1 released on 15 Mar 2026
Bug fixes
-
Fail-fast incomplete-pedigree analysis:
inbreed()and other completeness-sensitive analysis functions now error on row-truncated subsets with missing parent records. This prevents incorrect results, such as zero inbreeding, caused by calculating on partial ancestry data.
Changes in version 1.4.0 released on 15 Mar 2026
New features
-
tidypedclass redesign: Refined the internaltidypedclass architecture around a clearer metadata contract and safer S3/data.table interaction model for repeated downstream analysis and extension. -
Safer
tidypedworkflows: Addedis_tidyped(),pedmeta(),has_inbreeding(), andhas_candidates()to make class checks and metadata inspection explicit. -
Fast candidate tracing from existing
tidypedobjects:tidyped()now uses a fast path when the input is already a validtidypedobject andcandis supplied, avoiding repeated global validation and preprocessing. -
Workflow coverage and developer documentation: Added a workflow vignette, a
tidypedstructure and extension vignette, and regression tests covering safe subsetting,:=by-reference behavior, and split workflow semantics.
Bug fixes
-
By-reference mutation for
tidyped: Replaced class and metadata attachment paths withdata.table::setattr()so subsequent:=operations keep true by-reference behavior instead of writing into shallow copies. -
Safe row subsetting: Added
[.tidypedinterception so incomplete subsets degrade to plaindata.tableobjects with a warning, while complete subsets preservetidypedstructure and rebuild pedigree indices. -
Class recovery: Core analysis entry points now cooperate with
ensure_tidyped()andvalidate_tidyped()to recover validtidypedobjects after common class-dropping operations.
Changes in version 1.3.5 released on 14 Mar 2026
New features
-
S3 class protection: Added
as_tidyped()and an internalensure_tidyped()mechanism to handle cases where R operations such asmerge(),rbind(), anddplyrverbs strip the custom S3 class fromdata.tableobjects. Major analysis functions can restore the class when the underlying data structure is still valid and inform the user.
Bug fixes
-
Analysis entry points: Updated core analysis functions, including
pedstats(),pedne(),pediv(), andpedrel(), to use the class-recovery logic.
Changes in version 1.3.4 released on 14 Mar 2026
Bug fixes
-
data.tablereturn visibility: Functions returningdata.tableortidypedobjects now explicitly return with[]so results auto-print in the R console and knitted documents after internaldata.tableoperations such as:=andset*. Affected functions includedpedancestry(),pedpartial(),pedne(),pedrel(), andtidyped(). -
Side-effect prevention: Updated
calc_ne_demographic()to operate on a copy of the input pedigree instead of modifying the user’s data by reference.
Changes in version 1.3.3 released on 14 Mar 2026
Bug fixes
-
Vignette API synchronization: Replaced outdated
pedinbreed_class()calls in the pedigree analysis vignette with the currentpedfclass()interface and aligned examples with the currentreference,foundervar, andcycleargument names.
Documentation
-
pedigree-analysis.Rmdrewrite: Reorganized the main pedigree analysis vignette into thematic sections covering pedigree overview, pedigree completeness (pedecg()), generation intervals (pedgenint()), subpopulation structure (pedsubpop()), diversity indicators (pediv()), effective population size (pedne()), average relationship trends (pedrel()), inbreeding classification (pedfclass()), and ancestry / partial inbreeding diagnostics. -
Theory expansion: Added formulas, interpretation notes, and breeding-use explanations for Equivalent Complete Generations (ECG), generation intervals, effective numbers of founders / ancestors / founder genomes (
f_e,f_a,f_g), three effective population size definitions (N_eby demographic, inbreeding, and coancestry methods), and average additive relationship (MeanRel). - Reference update: Expanded the vignette bibliography to include Wright (1922, 1931), Lacy (1989), Boichard et al. (1997), Caballero and Toro (2000), Cervantes et al. (2011), and Gutierrez et al. (2008, 2009).
Internal changes
-
Analysis regression coverage: Added unit tests verifying that
pedancestry()proportions sum to 1 in a multi-line admixture pedigree and thatpedrel()returns identical results betweencompact = TRUEandcompact = FALSEon the same pedigree.
Changes in version 1.3.2 released on 13 Mar 2026
New features
-
Core analysis examples: Added
@examplestopedne(),pedecg(), andpedsubpop(). -
Pedigree connectivity analysis (
pedsubpop()): Enhancedpedsubpop()to distinguish pedigree splitting viasplitped()from grouping and summary analysis. It now reports counts of total individuals, sires, dams, and founders within subgroups or connected components.
API changes
-
pedfclass()rename: Renamedpedinbreedclass()topedfclass()to align with the package naming guide and provide a shorter API. -
pedfclass()output refinement: Renamed the returned class column fromF_ClasstoFClassand added user-defined inbreeding class breakpoints throughbreaksandlabels. -
pedgenint()parameter rename: Renamedcycle_lengthtocycle. -
pedgenint()andpedstats()unitparameter: Removed"gen"fromunitoptions. Theunitparameter now accepts"year","month","day", or"hour". -
pedgenint()timevardefinition: Clarifiedtimevaras a birth-date column. Numeric year inputs are converted toDatevalues using"YYYY-07-01"with an informational message. Character date strings are parsed withas.POSIXct(..., tz = "UTC").
Improvements
-
pedsubpop()documentation: Refined internal documentation to clarify its use cases alongsidesplitped(). -
.parse_to_numeric_time()rewrite: Rewrote the internal time parser to handleDate,POSIXct, character date strings, and numeric years.POSIXctconversions now usetz = "UTC"to avoid DST-related artifacts.
Bug fixes
-
vispstat()pathway filter: Fixed an issue where the generation-interval bar chart could drop pathways because of an overly broadfactor()filter. The filter now uses explicit%in% c("SS", "SD", "DS", "DD")subsetting.
Changes in version 1.3.1 released on 12 Mar 2026
New features
-
Selfing support in
tidyped(): Added theselfingargument to support plant and aquaculture pedigrees where an individual can appear as both sire and dam, resolving sex-conflict errors for biologically valid selfing pedigrees (#10). -
pedrel()ancestral tracing:pedrel()now uses full ancestral tracing viatidyped(ped, cand = ...)when calculating subgroup relationships, avoiding underestimation caused by ancestor truncation in deep-inbred populations.
API changes
-
pedancestry()parameter rename: Renamedlabelvartofoundervarandlabelstotarget_labelsto make the ancestry-tracing interface more explicit. Old argument names are no longer supported because the function was still under active development. -
pedecg()parameter cleanup: Removed the short-livedreferenceargument, which only filtered rows after a full ECG pass and did not define a reference population or prune the pedigree before calculation.
Improvements
-
Academic nomenclature alignment: Updated documentation for
pedrel()andpedne()to distinguish additive genetic relationship () from coancestry ().pedrel()now states that it returns , andpedne()documents that its"coancestry"method is based on . -
Monoecious individuals: Individuals acting as both parents are identified as
"monoecious"in theSexcolumn. -
visped()monoecious styling:visped()uses teal (#26a69a) for"monoecious"individuals. - Role-specific pedigree edges: Pedigree edges are colored by the parent’s role in each mating (sire, dam, or selfing) rather than invariant node sex.
-
tidypedsummary methods:summary()andprint()methods fortidypedobjects now report the count and percentage of monoecious individuals. -
pedancestry()initialization: Optimized initialization on large pedigrees by using vectorized matrix indexing, reducing overhead for pedigrees with more than 25,000 nodes.
Bug fixes
-
pedrel()deep-inbreeding regression coverage: Added a unit test verifying relationship calculation in deep-inbreeding scenarios, including Gen 4 relationships reaching 1.0.
Changes in version 1.3.0 released on 10 Mar 2026
New features
-
Founder genome equivalents (
fg): Integrated calculation of founder genome equivalents intopediv(). The implementation evaluates mean coancestry with diagonal intra-cohort correction through adaptive scaling, keeping computational costs linear relative to the reference cohort size. -
Reproducible parameter inference: Added a
seedargument topedne()andpediv()for reproducible sampling in effective population size andfgcalculations that use Monte Carlo approximations.
Changes in version 1.2.3 released on 08 Mar 2026
Bug fixes
-
Trace edge highlighting in
visped(): Fixed incorrect edge highlighting when usingtrace = "all". When a node was highlighted as both an ancestor and a parent of descendants, cross-path edges could be highlighted incorrectly. The fix separates upward and downward trace paths and usestrace_edgesto control highlighted edges. -
Focal-node upward edge in
trace = "down": Fixed an issue where the focal node’s upward connection to its parents’ family node was highlighted when tracing downward only. Individual-to-family edges are now highlighted only when the individual appears as a child in the traced path.
Changes in version 1.2.2 released on 08 Mar 2026
New features
-
Unified diversity analysis (
pediv()): Addedpediv()as a single entry point that aggregates founder contributions (f_e), ancestor contributions (f_a), and threeN_eestimates (coancestry, inbreeding, and demographic) into apedivS3 object. Aprint.pediv()method provides a formatted summary table. -
complex_peddataset: Addedcomplex_ped, a multi-generation pedigree dataset for testing deeper ancestry tracing and cross-generation diversity analyses.
API changes
-
Reference-population parameter rename: Standardized the reference population parameter name across relevant analysis functions:
pedne(..., reference = NULL),pedcontrib(..., reference = NULL), andpedrel(..., reference = NULL). These previously usedcand. Oldcandarguments are no longer supported in those functions.
Documentation
-
pedigree-analysis.Rmdrewrite: Restructured the pedigree analysis vignette with expanded theory explanations forf_e,f_a, andN_e, updated examples usingpediv()andreference, and additional interpretation for breeding decisions. -
Workspace organization: Moved development-only files (
MACOS_OPENMP_FIX.md,manuscript.md, and analysis scripts) intosandbox/, with corresponding.gitignoreand.Rbuildignorerules.
Changes in version 1.2.1 released on 07 Mar 2026
New features
-
Ancestral analysis (
pedcontrib()): Added algorithms for assessing genetic diversity through gene-origin probabilities.pedcontrib()computes effective number of founders (f_e) through recursive gene derivation and effective number of ancestors (f_a) through Boichard’s iterative algorithm. -
Missing-parent conservation in
pedcontrib(): Single missing parents are augmented with temporary phantom parents before processing so probability mass is conserved for half-founder records. -
Ancestry proportions (
pedancestry()): Addedpedancestry()to trace line origins and monitor surviving gene proportions from specified historic founder lines or strains to descendants. -
Partial inbreeding (
pedpartial()): Addedpedpartial()to decompose the overall inbreeding coefficient into fractions attributed to targeted ancestors, following Meuwissen and Luo (1992). -
half_founder_peddataset: Addedhalf_founder_ped, an ENDOG-derived dataset containing records with a single known parent for testing phantom-parent corrections.
Performance
-
Peeling core engine: Rebuilt the C++ array engine backing the
f_aandf_ecalculations. The bounded O(K × N) array-state implementation avoids excessive latency on deep pedigrees with more than 180,000 nodes.
Documentation
-
Reference index: Expanded
_pkgdown.ymlmappings to expose pedigree statistical functions such aspedancestry(),pedcontrib(),pedpartial(), andpedecg()in the reference documentation. -
Analysis vignette: Updated
vignettes/pedigree-analysis.Rmdwith Boichard-style genetic bottleneck interpretations (f_eversusf_a) and examples for targeted lineage flow.
Changes in version 1.2.0 released on 04 Mar 2026
New features
-
Effective population size methods in
pedne(): Expandedpedne()to support three methods for estimatingN_e:"coancestry"based on the rate of coancestry (),"inbreeding"based on the individual rate of inbreeding (), and"demographic"based on the numbers of breeding males () and females (). The coancestry method is now the default and may provide earlier signals of diversity loss in selected populations than inbreeding-based estimates. -
Parallel and sampled coancestry estimation: Added OpenMP multi-threading for the
method = "coancestry"path viancores, and addednsamplesfor sampled estimation on large pedigrees.
Changes in version 1.1.1 released on 02 Mar 2026
New features
-
pedgenint()sex-independent pathways: AddedSO(sire-to-offspring) andDO(dam-to-offspring) generation intervals alongside the standard four pathways. These pathways support settings such as aquaculture or early-stage screening where offspring sex may be unknown.
API changes
-
pedne()interface standardization: Renamedtimevartobyandcohorttocand; removed unused or misleading parameters (unit,cycle_length, andmaxgen). Oldtimevarandcohortarguments are retained with deprecation warnings. -
vismat()parameter alignment: Renamedgroupingtobyfor grouping consistency. The oldgroupingargument is retained with a deprecation warning.
Bug fixes
-
pedrel()correctness: Fixed an error where mean average relatedness was calculated by summing the full relationship matrix, including traced ancestors, and dividing by only the target subgroup size. The function now subsets the relationship matrix and handlesNUsed < 2. Output columnsNandMeanRelwere replaced withNTotal,NUsed, andMeanRel. -
pedgenint()aggregation:pedgenint()now outputs the appropriate unweighted mixture standard deviation for generation intervals alongside the unweighted four-pathway average. -
pedgenint()sample size: Fixed underestimation of theAveragepathwayNby evaluating all parent-offspring pairs throughcalc_all_pathway(). -
pedcontrib()effective numbers: Standardized effective founder (Ne_f) and effective ancestor (Ne_a) calculations so they use the full untruncated cohort before reporting the top-ranked rows. The result list now includes total and reported count variables. -
pedcontrib()deep-pedigree latency: Replaced a string-named-vector backward pass with a pure integer-indexed backward pass for large and deep pedigrees, including cases with more than 200,000 records. -
pedpartial()andpedancestry()input compatibility: Missing numeric identifier columns in incoming pedigrees, such as objects created withaddnum = FALSE, no longer breakpedpartial()orpedancestry(). The pedigree propagation loop inpedancestry()was also simplified to use direct vector lookup. -
pedne()performance bottleneck: Removed obsolete O(N^2) individual traversal incalc_ancestral_f(), using the direct formula by Gutierrez et al.
Changes in version 1.1.0 released on 01 Mar 2026
New features
-
Pedigree analysis module: Added pedigree analysis and population-genetics functions:
pedstats()for summary and demographic statistics;pedrel()for average relatedness within groups;pedgenint()for sire-sire, sire-dam, dam-sire, dam-dam, and overall generation intervals;pedcontrib()for founder and ancestor genetic contributions;pedancestry()for ancestral-lineage proportions; andpedpartial()for partial inbreeding attributed to specified ancestors. -
Pedigree analysis visualization: Added
vispstat()for plotting generation-interval bar charts and depth-related distributions such as Equivalent Complete Generations.
Changes in version 1.0.1 released on 31 Jan 2026
CRAN release: 2026-02-23
Bug fixes
-
Compact matrix correctness: Fixed incorrect
A,D, andAArelationship values incompact = TRUEmode for parent-offspring and avuncular pairs caused by merging parent individuals with their non-parent siblings. - Pedigree compression strategy: Updated compaction logic to preserve the genetic identity of any individual that appears as a sire or dam, ensuring parents have unique entries in the relationship matrix.
-
Sibling row and column expansion: Fixed
expand_pedmat()so sibling off-diagonal elements are calculated from parent kinship rather than by duplicating representative diagonal values. -
Generation alignment: Fixed
tidyped(..., genmethod = "bottom")so sibling consistency is prioritized over mate alignment, ensuring full siblings are aligned to the same generation. -
visped()edge highlighting: Fixed edge highlighting so relationship edges are only emphasized whentraceis used. - Shared-parent and shared-child paths: Corrected edge highlighting for cases where a parent has multiple families or a family has multiple children.
-
visped()layout withshowf = TRUE: Fixed a layout optimization failure by using immutable individual IDs.
Changes in version 1.0.0 released on 24 Jan 2026
Breaking changes
-
Matrix API names: Renamed
pedmatrix()topedmat(),expand_pedmatrix()toexpand_pedmat(), andsummary_pedmatrix()tosummary_pedmat(). Legacy function names were removed. -
pedmat()default method: Changed the defaultmethodofpedmat()from"f"to"A". -
Thread argument name: Standardized
n_threadstothreadsacross functions.
New features
-
Family assignment and summary:
tidyped()now assigns aFamilycolumn identifying full-sib groups.summary.tidyped()reports family counts, sizes, largest families, and offspring summaries. -
Pedigree splitting (
splitped()): Addedsplitped()to detect disconnected pedigree components, exclude isolated individuals, and return re-indexedtidypedobjects for separate analysis or visualization. -
Relationship matrix support:
pedmat()supports additive (A,Ainv), dominance (D,Dinv), and additive-by-additive epistatic (AA,AAinv) relationship matrices. -
Relationship matrix visualization (
vismat()): Addedvismat()for heatmaps and histograms ofpedmatobjects,tidypedobjects, and standard matrices. Heatmaps can be annotated with family groups when a pedigree is provided.
Changes in version 0.7.3 released on 13 Jan 2026
Breaking changes
-
pedmatrix()return value and method selection:pedmatrix()now requires a singlemethodvalue, such asmethod = "A". It returns the requested matrix or vector directly instead of a named list. Requesting multiple methods in one call now raises an error; use repeated calls for multiple outputs.
New features
-
Rcpp relationship calculations: Added
pedmatrix()with Rcpp implementations for the additive relationship matrix (A), sparse inverse additive matrix (Ainv) using Henderson’s rules, dominance matrix (D), and inbreeding coefficients (f) using the Meuwissen and Luo (1992) path-tracing algorithm.
Improvements
-
Default inbreeding backend:
inbreed()now uses the native Rcpp implementation by default, movingnadivtoSuggests. - Documentation and website: Updated package documentation and vignettes. The package website is available at https://luansheng.github.io/visPedigree/.
Changes in version 0.7.2 released on 12 Jan 2026
New features
-
Flexible generation assignment: Added the
genmethodparameter totidyped(). Users can choose"top"(top-aligned, default) or"bottom"(bottom-aligned) generation inference. The"top"method aligns founders at generation 1; the"bottom"method aligns terminal nodes at the bottom for visualization of unrelated introduced parents.
Improvements
-
Default generation assignment: Changed the default generation assignment method to
"top". - Pkgdown website: Generated and published the package website at https://luansheng.github.io/visPedigree/.
- Automated documentation deployment: Added a GitHub Actions workflow for documentation updates and GitHub Pages deployment.
Changes in version 0.7.1 released on 11 Jan 2026
CRAN release: 2026-01-21
Improvements
-
User feedback: Standardized filtering notifications. The message
"Note: Removed N isolated individuals..."now appears consistently for all pedigree sizes when Gen 0 individuals are present. -
Trace semantics: Corrected
trace = "all"intidyped()andvisped()so it returns the union of ancestors and descendants ("up"plus"down") instead of the entire connected component.
Performance
-
Large-pedigree
visped()rendering: Optimizedvisped()for large pedigrees through attribute handling and vectorized rendering, reducing repeatedigraphattribute lookups for 100,000+ individuals. -
Vectorized tracing: Refactored
trace_ped_candidates()intidyped()to use vectorizedigraph::neighborhood()calls. In one benchmark, 37,000 candidates in a 178,000-individual pedigree were traced in about 1.2 s. -
Early isolated-individual filtering: Implemented early filtering of isolated Gen 0 individuals in
prepare_ped_graph()to streamline graph conversion and layout.
Changes in version 0.7.0 released on 10 Jan 2026
Breaking changes
-
Graph-based
tidyped()core: Reimplemented the pedigree tidying engine around a directed acyclic graph representation, with cycle detection and generation inference based on topological sorting. -
Modular
visped()architecture: Split the previous monolithicvisped.Rimplementation intovisped_layout.R,visped_graph.R,visped_style.R, andvisped_render.R.
New features
-
visped()layout parameters: Addedpagewidthto control PDF page width andsymbolsizeto scale node sizes relative to label dimensions. -
Two-pass rendering: Added a two-pass strategy in
plot_ped_igraph()so edges connect at node centers in vector PDF outputs. -
Highlight tracing: Added ancestry and descendant highlighting through the
traceparameter invisped().
Changes in version 0.6.2 released on 01 Jan 2026
New features
-
summary.tidyped(): Added asummary()method fortidypedobjects to report counts of individuals, founders, sex distribution, and related pedigree statistics.
Changes in version 0.6.0 released on 28 Dec 2025
New features
-
Strict
tidypedS3 class structure: Added thenew_tidyped()constructor andvalidate_tidyped()validator fortidypedobjects.
Changes in version 0.5.0 released on 26 Dec 2025
New features
-
visped()highlighting: Added thehighlightparameter tovisped()for highlighting specific individuals with a character vector of IDs or a list of custom colors. -
visped()inbreeding display: Added theshowfparameter tovisped()to display inbreeding coefficients on the pedigree graph. -
tidyped()inbreeding calculation: Added theinbreedparameter totidyped()to calculate inbreeding coefficients usingnadiv. -
Standalone
inbreed(): Refactoredinbreed()as a standalone tool that operates ontidypedobjects.
Performance
-
repeloverlap(): Optimizedrepeloverlap()withdata.table.
Bug fixes
-
visped()compact-highlight-showf crash: Fixed a crash when combiningcompact = TRUE,highlight, andshowf = TRUEby refactoringped2igraph()to delay label modification until after layout calculation. - Documentation grammar: Fixed grammar and phrasing across function documentation for CRAN compliance.
-
R CMD checknotes: Fixeddata.tablenon-standard evaluation notes by addingR/globals.R.
Changes in version 0.2.5 released on 25 Feb 2020
Bug fixes
-
trace = "all"intidyped(): Fixed cases wheretidyped()did not work withtrace = "all"(issue comment).
