Changelog
Source:NEWS.md
hypergraphs 0.7.2
- The package has no compiled code again:
hg_topics()computes its expected counts in R, with the same values as 0.7.1.
hypergraphs 0.7.1
Corrections from a function-by-function audit. Results change only where they were wrong; valid input that was handled correctly gives identical output.
Speed
-
hg_communities()is faster with identical results. IRMM builds each reweighting pass’s clique reduction as a sparse matrix (about 3 times faster onicsid_tribunals), and the AMI between runs computes the expected mutual information in one vectorised pass. Newparallelandn_coresarguments run the independent seeded runs withparallel::mclapply()(not on Windows); the fit is identical to the serial one. Onicsid_tribunals(441 arbitrators, 742 cases), 8 cores: Infomap 34 s to 11 s, IRMM 27 s to 3 s. -
hg_mmsbm()gainsparallelandn_cores: every start’s initial values are drawn first, in order, from one stream, then the EM fits run withparallel::mclapply(). Fits and the caller’s random stream are identical to the serial run.hg_topics()runs its parallel starts through the same helper, so a failed worker raiseshypergraphs_parallel_failedinstead of returning an error object as a start. -
hg_topics()andhg_topic_search()no longer exhaust memory on a large corpus. The expected counts are gathered in blocks of about 80 MB (identical values); a 6,630-document, 91,755-word corpus atk = 52allocated about 8 GB per step before. Topic quality keeps the document x word presence sparse and densifies only the top words (it was a dense 4.9 GB matrix on that corpus), and matching topics across starts is computed for all pairs at once (0.53 s to 0.005 s per comparison atk = 52, identical values). -
hg_cluster(algorithm = "symnmf")andhg_embed(method = "symnmf")run on a sparse hypergraph instead of refusing it withhypergraphs_dense_required: the dense similarity is built from the sparse Laplacian (up to 15,000 nodes; beyond thathypergraphs_sparse_too_large). On the corpus above, SymNMF graded memberships fork = 16take about a minute per start. -
hg_cluster(algorithm = "symnmf")gainsparallelandn_cores: every start’s initial factor is drawn first, so parallel starts give the serial result. - k-means in
hg_cluster()(spectral) andhg_cocluster()finishes a Hartigan-Wong start that stopped early (“Quick-TRANSfer stage steps exceeded” or the iteration limit) from the centres it reached, instead of comparing it unfinished and warning; when every start finishes the result is identical tostats::kmeans(). -
text_hypergraph()keeps a data column nameddoc,n_tokensorn_typesas metadatainput_doc,input_n_tokens,input_n_types, with ahypergraphs_renamed_columnwarning, instead of refusing the table. - Parallel runs on macOS: a forked worker the system kills (Apple’s Accelerate BLAS is not fork-safe) is rerun serially with a
hypergraphs_parallel_fallbackwarning, and the result is unchanged. -
hg_mmsbm()explains a collapsed membership: the rate of a hyperedge sums over its node pairs, so in hyperedges of three or more nodes the other members can explain it and a node’s activity goes to zero. The warning and the documentation say so, and point tohg_topics()for document mixtures, instead of suggesting more starts.
Package
- The package ships one vignette,
vignette("hypergraphs"). The text hypergraph guide, the COVID-19 topic walkthroughs, the text constructions and the document classification guide are articles on the package website, which keeps the source package small and its check short; the saved classification results moved with their article.hg_hypergat(),hg_neural()and the classification reader have runnable examples on the bundledforum_posts.
Construction and temporal hypergraphs
- Hyperedges are identified by their members. Two actor/session pairs whose pasted labels coincide (
a.b+c,a+b.c), a node nameda + bbeside the pair{a, b}, and two sequences sharing a list name were merged into one hyperedge. Sequence lists now need unique, non-empty names, and missing actor or session identifiers raisehypergraphs_bad_input. - Metadata columns named like a structural column (
edge,node,start,weight, …) no longer replace the selected structure; they are kept under a suffixed name. Edge attributes with missing values take the first non-missing value of the edge whatever the row order. - Membership weights must be finite, non-negative numbers; negative, infinite, factor and character weights raise
hypergraphs_bad_input. -
network_hypergraph()reorders a matrix whose column names are a permutation of its row names, and refuses differing, duplicated or missing labels. Column labels were previously overwritten, which moved edges. -
temporal_hypergraph()refuses clocks that fail to parse, infinite clocks and per-membership intervals that end before they start. ISO 8601 offsets (Z,+0200,+02:00) and fractional seconds are honoured, and trailing text is an error (hypergraphs_unparsed_time). An all-missingendcolumn means every membership is open. Open and closed memberships of one hyperedge are filtered by their own spells, so snapshots no longer depend on row order. -
hg_growth()andhg_snapshot()share one window boundary, the temporalsummary()counts distinct members, andhg_edges()and the readers of an empty snapshot return typed zero-row tables. - The canonical
nodeandhyperedgecolumns are detected without being named.knn_hypergraph()requires a wholekand finite embeddings. -
dual_hypergraph()is the transpose of the full incidence, isolated vertices and empty hyperedges included, and a sparse dual is a completenet_hg.hg_subset()keeps planted SBM blocks aligned with the kept nodes.summary()andhg_laplacian()accept sparse hypergraphs. -
plot(pieces = "row")places isolated nodes.
Measures, random models and null tests
- Sparse
hg_measures()equals the dense result (pairwise participation, isolate edge sizes, uniform density).hg_null_test(statistic = "density")uses the same density ashg_measures(). -
random_hypergraph(type = "sbm")and the configuration null drew from1:xwhen a candidate pool held one node, producing wrong edge sizes and invented memberships. Draws from larger pools are unchanged. -
hg_null_test()requires a wholen, and a statistic undefined on the input (avg_jaccardwith fewer than two hyperedges) isNAwith ahypergraphs_undefined_statisticwarning. - Clique eigenvector centrality is the Perron vector of each connected component; power iteration oscillated on bipartite clique expansions. Z- and H-eigenvector iterations that reach
max_iterwarn withhypergraphs_no_converge. Subhypergraph centrality is computed per node in log space, so isolated nodes are 0 rather than-Inf. A hypergraph of singleton hyperedges has zero clique, Z and H centrality. - Empty hyperedges contribute nothing to Laplacians, random walks and PageRank (they produced NaN).
hg_pagerank()refuses non-finite or conflictingpersonalizedweights and, atdamping = 1, disconnected input (hypergraphs_hypergraph_disconnected). - Assortativity is computed on centred scores, so near-regular hypergraphs of high degree are no longer reported as undefined.
-
hg_compare_communities()reportsNAagreement for fits sharing fewer than two nodes and scores each medoid on the projection its fit saved. Directed citation fits have anNAquality row.edge_sourceis deprecated there. Duplicated node or source assignments raisehypergraphs_bad_inputin every partition reader. -
hg_mmsbm()does not declare convergence while memberships collapse. - The cluster plot supports more than nine clusters (Okabe-Ito colours recycle with distinct shapes), and the agreement heatmap shows negative AMI and ARI on a diverging scale.
Memory networks and simplicial complexes
- Missing actions split a trajectory into contiguous runs. No transition crosses a gap and no state
NAis created;hon(),mogen(),markov_order()andhypa()accept sequences with gaps, andhg_bootstrap()resamples whole trajectories. A real state spelled"NA"is kept. - State labels containing
->or the internal separators raisehypergraphs_bad_input, since higher-order node names are built from them. -
hg_compare()averages over the rules whose context both groups observe and reports their number; with none the statistic and p-value areNA(hypergraphs_undefined_statistic). The global statistic of partially overlapping groups changes accordingly. - Window persistence (
hg_homology()onsimplicial(type = "window")) keeps essential classes essential, and every Betti row comes from the same Z/2 intervals.hg_wasserstein()treats a finite death at 0 as finite outside clique mode and computes large orders without overflow. -
simplicial(validate = TRUE)refuses an automatic shuffle count above 100,000 and asks for an explicitn_null. -
hg_bootstrap()with no rule abovemin_freqraiseshypergraphs_empty_result. HONEM variance and Infomap savings are 0 on zero spectra and zero code lengths. -
?memorystates thatorderis the number of conditioning states;?hg_bettistates that Betti numbers are computed over the rationals and differ fromhg_homology()on torsion.
Text hypergraphs and neural classifiers
-
clean_text()keeps alphanumeric tokens (covid19,p53,covid-19) intact and replaces invalid numeric entities with U+FFFD. -
hg_keywords()andhg_topic_quality()handle clusters without eligible words and one-word vocabularies; external keyword scores count distinct documents. -
text_hypergraph()refuses metadata columns nameddoc,n_tokensorn_types. -
hg_cocluster()checkskagainst the singular vectors available.topic_network()keeps isolated topics and treats constant topics as isolates (hypergraphs_constant_topics). - A topic model is checked against the documents, words and counts it was fitted on (
net_hg_topicsgains$corpus). KL-NMF ignores explicit sparse zeros.hg_membership()sums to one at coincident centres.hg_topic_sizes()refuses negative weights. - Label inputs of every classifier and topic reader refuse conflicting duplicates; an
NAlabel marks a node as unlabelled. Embedding and feature row names must be unique. -
hg_hypergat(min_count =)counts token occurrences, as documented, rather than sentences. -
hg_neural()restores an absent random seed, HNHN operators are normalised in log space, and the confusion table keeps a class named(unscored).
hypergraphs 0.6.10
- The result classes of the memory family drop the
honprefix left over from the package’s former name:net_hon_bootis nowhypergraphs_bootstrap,net_hon_boot_grouphypergraphs_bootstrap_group,net_hon_comparehypergraphs_comparison,net_hon_communitieshypergraphs_memory_communitiesandnet_hon_grouphypergraphs_memory_group. Code that tests these classes withinherits()needs the new names.hon()andhonem()keep their names (the published BuildHON and HONEM methods), andnet_honremains the Nestimate class thathon()returns. Printed headers read “Memory-network bootstrap” and “Memory-network comparison”.
hypergraphs 0.6.9
- The Argentina example article gains a storyline of the busiest arbitrators and restores the centrality, per-community modularity and growth tables of its first version.
- The repository now holds only package files; development notes and local tooling are kept out of it.
hypergraphs 0.6.8
- Test suite only: the regression test of default hull plots, whose baseline was recorded on macOS, is skipped on Linux and Windows, where the force-directed layout settles about 1e-4 away.
hypergraphs 0.6.7
-
hg_communities()on a memory network numbers communities of equal flow the same way on every platform: flows equal to 12 significant digits are ties, broken by the first node.
hypergraphs 0.6.6
-
window_hypergraph()gainscollapse:FALSEkeeps every window as its own hyperedge, in order, named by its positions ("1-3"), withsequence,startandendin the edge metadata. -
plot()on a hypergraph gainstype = "storyline"for hyperedges with an order (the stored order orsort_by), such as the windows of one sequence: codes become lines that the windows gather. -
plot()of a temporal hypergraph gainstype = "storyline"(Tanahashi and Ma 2012): thetopnodes with the most hyperedges (default 8) are lines from their first to their last hyperedge, hyperedges are columns in order of their start, and each column gathers the lines of its members. Lines are ordered by the barycentre rule (Sugiyama et al. 1981) over repeated sweeps, keeping the ordering with the fewest crossings.startandendlimit the period;edge_labelsandpoint_sizestyle it.spacing = "strength"brings neighbouring lines closer the more hyperedges their nodes share (a full row for none, 0.35 for the strongest tie in the plot, linear in between) without changing their order.width_by = "degree"widens each line with its node’s number of hyperedges in the period, with a width legend. Each line has an Okabe-Ito colour and a point shape, distinct for up to 72 lines, named in the legend.typeis now an explicit argument ofplot.net_temporal_hypergraph(), and an argument of one view given to another raiseshypergraphs_bad_input.
hypergraphs 0.6.5
- Requires Nestimate (>= 0.9.1), whose
prepare()takes thetimezoneargument the sequence input passes; with 0.8.5 the vignettes failed.
hypergraphs 0.6.4
-
plot()on a hypergraph gainstype = "incidence", the incidence matrix after UpSet (Lex et al. 2014): one row per node ordered by hyperdegree, one column per hyperedge, a bar joining each hyperedge’s members, hyperdegree bars beside the rows and size bars above the columns when sizes differ. It stays legible where hulls overlap. The newsort_byorders the columns ("size", an edge-metadata column such as a date, or one value per hyperedge; numbers largest first).color_by,labels,edge_labels,label_size,edge_label_sizeandlegend_titleapply; a hull-only argument raiseshypergraphs_bad_input. Counts sort largest first; dates, text and clock columns (start,end, …) in time order. -
plot()on a hypergraph sizes the node labels to the number of labelled nodes whenlabel_sizeis not given: 4.2 mm up to 12 labels, then shrinking with the square root of the count to 2.2 mm from 44 labels on (was a fixed 4.2 mm). An explicitlabel_sizeis used as given; an invalid one raiseshypergraphs_bad_input. -
plot()of a temporal hypergraph plots its snapshot as a hypergraph withplot.net_hg()(hulls, ortype = "incidence"), so the hyperedges are kept; it used to plot a pairwise projection throughcograph::splot().methodis deprecated (hypergraphs_deprecated);plot(pairwise_network(hg_snapshot(x, at)))plots the projection. -
hg_snapshot()keeps the data’s names for nodes and hyperedges, so a printed or plotted snapshot says “cases” and “arbitrator” instead of “edge” and “node”. -
hg_edge_centrality()andhg_motifs()on a temporal hypergraph report the snapshottimeas a date for a calendar hypergraph and as the number on the clock otherwise; it used to be a character label of the day offset ("3104"), also whenatwas given as dates. -
plot()on a hypergraph with repeated member sets acceptsnode_groups: grouping the nodes now draws every hyperedge, ascolor_bydoes, instead of failing on the node sizes of the distinct-set view. -
icsid_tribunals:respondentandsubjectare trimmed of the spaces the source archive pads some values with. “Argentine Republic” held 12 of Argentina’s 47 cases, so a filter on the clean name missed them; there are now 145 distinct respondents instead of 201. No other column changes. -
hg_subset(where =)raiseshypergraphs_bad_inputfor a value that no hyperedge takes, naming the closest values, instead of returning an empty hypergraph.
hypergraphs 0.6.3
plot()on a hypergraph gainsnode_groups: each node is coloured and shaped by its group, from a community fit (hg_communities(),hg_mmsbm(),hg_topics()) or any node/label table, so communities can be plotted over the hyperedges. The hulls turn grey unlesscolor_byis given.plot()withcolor_by = "size"lists only the sizes of the hyperedges it draws, and the curves of a distribution over calendar times are named by date.A clock column of a hyperedge (
start,end,time,session, …) is no longer chosen as the count that titles and colours the hulls; the decision figures of a temporal snapshot are readable again.hg_get()on a hypergraph has aweightcolumn only for a hypergraph of windows; other hypergraphs no longer print a column ofNA.An unknown
whatin any accessor or verb raiseshypergraphs_bad_inputnaming the available tables.hg_agreement()readshg_mmsbm()andhg_topics()fits and text hypergraphs directly, and a table keyed bydocneeds nonode =.hg_get()on a community fit gainsconverged,sort_byandtop.New article “Legal hypergraphs” on the tribunals of ICSID and the citations of the German Federal Constitutional Court, with hypergraph modularity.
New dataset
forum_posts: 360 simulated forum posts by 30 students whose sequence of topics has second-order memory, generated bydata-raw/forum_posts.R. It is the example corpus forhg_sequences().read_hif()andwrite_hif()are removed, and with them thejsonlitesuggestion. A hypergraph is exchanged with other packages as anetobjector acograph_network.hg_get()on a hypergraph no longer offerswhat = "node_data"or"incidence_data", which only a read HIF file filled.
hypergraphs 0.6.2
text_hypergraph()gainsseparator: a delimited field such as the author keywords of a bibliographic export is read as whole-phrase terms, each a hyperedge over the papers that carry it, the keyword incidence of co-word analysis (Callon et al. 1983). Terms are lowercased and trimmed of the punctuation exports leave at their edges.New
hg_dictionary()labels each node by the dictionary category whose terms it carries most (Grimmer & Stewart 2013); the result is thelabelsinput ofhg_classify()andhg_hypergat().Documents without a label are
split = "unlabelled"in anhg_classification, sohg_get(fit, split = "unlabelled")reads the classifier’s proposals.hg_get()on a text hypergraph gainsnode(documents by id or by a table with anodecolumn),sort_byandtop(vocabulary).hg_classify()andhg_hypergat()gainholdout: a share of the labels, drawn within each class withseed, is hidden, predicted and scored. The result is anhg_classificationthat prints the held-out accuracy and balanced accuracy (Brodersen et al. 2010).hg_get()reads its"predictions","accuracy","classes"and"confusion"tables, and filters the predictions withsplit,correct,node,sort_byandtop(per class).plot()draws the confusion table. Ahg_hypergat()result retains its trained network.hg_get()computes attention on request, andplot(type = "attention")shows its diagnostic weights.plot(type = "hyperedges")plots a document’s word hypergraph.labelsofhg_classify()andhg_hypergat(),clustersofhg_keywords(),topic_network()andhg_topic_sizes(), andgroupofhg_get(what = "prevalence")accept the name of a document column (labels = "subject").plot()on anhg_topics()model gainstype = "prevalence"withgroup, the prevalence of every topic in each group.hg_hypergat()now returns a reusable fitted classifier in every run.predict()classifies new documents using its trained network, frozen vocabulary and topic keywords; optional observed labels evaluate these predictions without updating the model.hg_get()reads predictions, evaluation, document text, training history and optional attention diagnostics.plot()shows confusion or training loss. The vocabulary is estimated from known labels only. Unscorable held-out and new labelled documents count as errors, and prediction preserves all new input rows.HyperGAT attention diagnostics include uniform normalization baselines and the fraction of words exclusive to each edge. Attention plots show the baseline alongside the learned weights. Attention is computed only when requested and is described as an internal weight, not a prediction explanation. Legacy
whatextraction remains available with a warning.hg_subset()gainscomponent = "largest", which keeps the largest connected component, the input that label spreading and spectral clustering need. A subset text hypergraph now carries a matching text layer, sohg_keywords()and the other text verbs work on it.stop_words_en()gainstype = "snowball", the 174-word Snowball English stop list with pronouns and contractions, for chat and other informal text.clean_text()repairs emoji and other characters garbled by a UTF-8-as-Windows-1252 export.Labels or groups that name documents
text_hypergraph()orhg_hypergat()dropped as empty are set aside with a warning inhg_keywords(),hg_topic_sizes(),topic_network(),hg_classify(),hg_neural()andhg_hypergat(), so the corpus table can be passed back whole; an id that never was a document is still an error.hg_get()on anhg_topics()model gainswhat = "prevalence"withgroup =: the mean share of each topic within each group of documents, the topic prevalence by covariate of Roberts et al. (2014).clean_text()gainsboilerplate = TRUE, which removes publisher names, company suffixes and the phrases of licence and rights notices wherever they occur in a text, so a classifier of bibliographic abstracts does not learn the publisher and the year from the notice.clean_text()removes the word “Copyright” together with the notice that follows it (“Copyright © 2020 Elsevier Ltd.” left “Copyright” behind).plot()on asimplicial()result gainstype =."simplices"(the default) draws the maximal simplices as before;"summary"draws the face counts, the Betti numbers and the simplicial degree, the summary figure of the complex.Input formats with their own vocabulary. Membership data name a
nodeand ahyperedge(orfromandto); event data name anactionwith itssessionandactor, as in the memory family;groupis always the comparison variable, as in Nestimate. Ingroup_hypergraph()andtemporal_hypergraph(),group =(the hyperedge column) is nowhyperedge =andby =is nowgroup =.hypergraph()recognises the format from the arguments:actionwithsession(oractor) gives one hyperedge per session,windowgives windows,nodewithhyperedgegives membership hyperedges.pairwise_network()builds the pairwise network of a hypergraph. It returns a network object (net_hg_pairwise, alsonetobjectandcograph_network) for every projection, chosen withtype = "clique"(default),"association"or"citation";plot()plots it through cograph,hg_get()returns its edges (what = "nodes"its nodes), andhypergraph()reads it as a network. It replaceshg_project()andhg_clique_expansion(), which are removed.The topic network is
topic_network(), a constructor likepairwise_network(). It replaceshg_network(), its name in 0.6.1, andhg_relations(), which are removed:hg_relations(hg, clusters)ishg_topic_network(hg, clusters = clusters).Constructors are bare nouns.
random_hypergraph(type = "uniform" | "regular" | "gnp" | "sbm")replaceshg_sample_uniform(),hg_sample_regular(),hg_sample_gnp()andhg_sample_sbm(), with the same models and the same seeded draws; its arguments are given by name.read_hif()andwrite_hif()replacehg_read_hif()andhg_write_hif().group_hypergraph(min_share =)keeps the frequent sets that reach a minimum support, the share of a group’s sets that contain them (Agrawal & Srikant 1994); withouttop, every such set is kept. It applies to data frames, clustered sequences and topic models, andprint()states the rule.plot()of a hypergraph packs disconnected pieces into one frame by default (pieces = "packed"), so each piece takes room in proportion to its size;pieces = "row"gives the former side-by-side frames.plot()of a hypergraph whose hyperedges repeat (the trials of an event log) draws its distinct sets, each coloured by its number of copies; a hypergraph of counted sets with one group is drawn as that group; a window hypergraph is coloured by its window counts.plot()of apairwise_network()uses a circle layout. None of these needs an argument.plot()of a hypergraph takes a numeric hyperedge attribute as its count only when the attribute varies between hyperedges; a constant one, such as the session number of the runs of one session, no longer colours and titles the hyperedges.color_by = "weight"colours the hyperedges of awindow_hypergraph()by their window counts.tutoring_eventsreplacesdebug_events. It holds every step of the tutoring data, 84,356 events from 13,309 problem steps (20,626 trials), with each event renamed to a word of the same meaning and similar events merged (19 events become 15).debug_eventsheld a random 4,000 steps under a coding-assistant vocabulary. Itsoutcomecolumn marks a stepcompleted(with a correct answer) orstopped(without one).hg_measures()builds the hyperedge-by-hyperedge overlap matrices only forwhat = "overlap". The node table and the summary of a hypergraph with 20,000 hyperedges took minutes or exhausted memory; they take under a second.hg_subset()keeps the window counts of awindow_hypergraph()aligned with the hyperedges it keeps; printing or plotting such a subset failed.hg_agreement()accepts a fit ofhg_communities()and compares its medoid partition.New vignette, Hypergraphs: observed groups, frequent sets, windows, projection, node measures, centrality, communities and null models on
debug_events.
hypergraphs 0.6.1
The package is renamed from hypernets to hypergraphs. Every verb keeps its name; condition classes and result classes change their prefix from
hypernets_tohypergraphs_(hypergraphs_bad_input,hypergraphs_result, …), so code that catches a condition by class changes with them.hypergraph()is the main constructor. It reads any input and calls the constructor of that kind of data, returning its result unchanged: a data frame of groups goes togroup_hypergraph()(withbyortop, the frequent sets), with a clock totemporal_hypergraph(), withwindow,steporactiontowindow_hypergraph(); a list of sequences towindow_hypergraph(); a network (matrix, sparse matrix,netobject,cograph_network) tonetwork_hypergraph(); a topic model or a clustering of sequences togroup_hypergraph(). The specific constructors remain.group_hypergraph(by =)counts frequent sets within groups. Withby, each value ofgroup(a trial, a session, a basket) is one set ofactorvalues, and thetopmost frequent sets within each value ofby(an outcome, a cluster) become hyperedges, read withhg_get(x, what = "sets")and drawn per value withplot(x, group = ), as for clustered sequences. The topic-combination route names its grouping columnbyas well. Givingtopwithoutbycounts the sets over all groups. New datasetdebug_events: 4,000 sessions with a coding assistant, one row per event, with runs (a stretch of a session between two verdicts) and a quick or slow group; real event sequences of another domain with every event renamed (data-raw/debug_events.R).plot()of a hypergraph colourscolor_by = "size"discretely, one Okabe-Ito colour per size; it was a continuous scale.network_hypergraph(type = "vr")raiseshypergraphs_bad_inputand points tosimplicial(type = "vr"); it raised a plain error that said the package builds no Vietoris-Rips complex.Communities of memory networks can be drawn over the transition network.
plot()of ahg_communities()result can draw the network as a transition network analysis plot (TNA styling throughcograph::overlay_communities()): arrows carry transition probabilities, node area follows flow, and every community is a blob around its nodes. Newtype = "network"draws the network of states, in which a shared state lies in two blobs;type = "states"now draws the memory nodes the same way, laid out by the walk’s transitions between them, in place of cograph’s group-ring layout. The default pebble view of the community hypergraph is unchanged, and the labels say “state” and “memory node” as the tables do.hg_network()replaceshg_relations()(kept as a deprecated alias that warns withhypergraphs_deprecatedand returns the identical result). Besides a partition (clusters =), it takes a topic model (topics =). Withoutthresholdtwo topics are linked by the correlation of their shares (stm’s simpletopicCorr(), equal on the local oracle); withthresholdthe weight is the number of documents in which both topics reach that share (Abuhay et al. 2017; Cassi et al. 2017), normalisable by the same similarity measures.group_hypergraph(topic_model, threshold =)builds the hypergraph of topic combinations: each document is the set of its topics at the threshold, and the most frequent sets become hyperedges, counted as for clustered sequences (hg_get(x, what = "sets")).by =counts them within a column of the documents table (a year, an author);min_sizeandtop = Infkeep the multi-topic sets and all of them. Hypergraphs of clustered sequences now print their source.hg_sequences(topics =)builds sequences from each document’s main topic, grouped by any column of the documents table.hg_markov_stability()reads only the possible transitions of a matrix when it checks irreducibility, so an unnormalised matrix warns once withnormalize = TRUE(it warned twice) and is refused without a warning withnormalize = FALSE(it warned that it was normalising).