Skip to content

Commit 421a26e

Browse files
committed
add_hyperedge and bind in bulk
1 parent 11cd6c3 commit 421a26e

2 files changed

Lines changed: 394 additions & 5 deletions

File tree

include/hgl/hypergraph.hpp

Lines changed: 219 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,94 @@ class hypergraph final {
312312
};
313313
}
314314

315+
hyperedge_type add_hyperedge(const traits::c_forward_range_of<id_type> auto& vertex_id_rng)
316+
requires std::same_as<directional_tag, undirected_t>
317+
{
318+
auto he = this->add_hyperedge();
319+
this->bind(vertex_id_rng, he.id());
320+
return he;
321+
}
322+
323+
gl_attr_force_inline hyperedge_type
324+
add_hyperedge(const traits::c_forward_range_of<vertex_type> auto& vertex_rng)
325+
requires std::same_as<directional_tag, undirected_t>
326+
{
327+
return this->add_hyperedge(vertex_rng | std::views::transform(&vertex_type::id));
328+
}
329+
330+
hyperedge_type add_hyperedge_with(
331+
const traits::c_forward_range_of<id_type> auto& vertex_id_rng,
332+
hyperedge_properties_type properties
333+
)
334+
requires(std::same_as<directional_tag, undirected_t> and traits::c_non_empty_properties<hyperedge_properties_type>)
335+
{
336+
auto he = this->add_hyperedge_with(std::move(properties));
337+
this->bind(vertex_id_rng, he.id());
338+
return he;
339+
}
340+
341+
gl_attr_force_inline hyperedge_type add_hyperedge_with(
342+
const traits::c_forward_range_of<vertex_type> auto& vertex_rng,
343+
hyperedge_properties_type properties
344+
)
345+
requires(std::same_as<directional_tag, undirected_t> and traits::c_non_empty_properties<hyperedge_properties_type>)
346+
{
347+
return this->add_hyperedge_with(
348+
vertex_rng | std::views::transform(&vertex_type::id), std::move(properties)
349+
);
350+
}
351+
352+
hyperedge_type add_hyperedge(
353+
const traits::c_forward_range_of<id_type> auto& tail_id_rng,
354+
const traits::c_forward_range_of<id_type> auto& head_id_rng
355+
)
356+
requires std::same_as<directional_tag, bf_directed_t>
357+
{
358+
auto he = this->add_hyperedge();
359+
this->bind_tail(tail_id_rng, he.id());
360+
this->bind_head(head_id_rng, he.id());
361+
return he;
362+
}
363+
364+
gl_attr_force_inline hyperedge_type add_hyperedge(
365+
const traits::c_forward_range_of<vertex_type> auto& tail_rng,
366+
const traits::c_forward_range_of<vertex_type> auto& head_rng
367+
)
368+
requires std::same_as<directional_tag, bf_directed_t>
369+
{
370+
return this->add_hyperedge(
371+
tail_rng | std::views::transform(&vertex_type::id),
372+
head_rng | std::views::transform(&vertex_type::id)
373+
);
374+
}
375+
376+
hyperedge_type add_hyperedge_with(
377+
const traits::c_forward_range_of<id_type> auto& tail_id_rng,
378+
const traits::c_forward_range_of<id_type> auto& head_id_rng,
379+
hyperedge_properties_type properties
380+
)
381+
requires(std::same_as<directional_tag, bf_directed_t> and traits::c_non_empty_properties<hyperedge_properties_type>)
382+
{
383+
auto he = this->add_hyperedge_with(std::move(properties));
384+
this->bind_tail(tail_id_rng, he.id());
385+
this->bind_head(head_id_rng, he.id());
386+
return he;
387+
}
388+
389+
gl_attr_force_inline hyperedge_type add_hyperedge_with(
390+
const traits::c_forward_range_of<vertex_type> auto& tail_rng,
391+
const traits::c_forward_range_of<vertex_type> auto& head_rng,
392+
hyperedge_properties_type properties
393+
)
394+
requires(std::same_as<directional_tag, bf_directed_t> and traits::c_non_empty_properties<hyperedge_properties_type>)
395+
{
396+
return this->add_hyperedge_with(
397+
tail_rng | std::views::transform(&vertex_type::id),
398+
head_rng | std::views::transform(&vertex_type::id),
399+
std::move(properties)
400+
);
401+
}
402+
315403
void add_hyperedges(const size_type n) {
316404
this->_impl.add_hyperedges(n);
317405
this->_n_hyperedges += n;
@@ -406,6 +494,104 @@ class hypergraph final {
406494
this->bind(vertex.id(), hyperedge.id());
407495
}
408496

497+
void bind(
498+
const traits::c_forward_range_of<id_type> auto& vertex_id_rng, const id_type hyperedge_id
499+
)
500+
requires std::same_as<directional_tag, undirected_t>
501+
{
502+
this->_verify_hyperedge_id(hyperedge_id);
503+
for (const auto vertex_id : vertex_id_rng) {
504+
this->_verify_vertex_id(vertex_id);
505+
this->_impl.bind(vertex_id, hyperedge_id);
506+
}
507+
}
508+
509+
gl_attr_force_inline void bind(
510+
const traits::c_forward_range_of<vertex_type> auto& vertex_rng,
511+
const hyperedge_type& hyperedge
512+
)
513+
requires std::same_as<directional_tag, undirected_t>
514+
{
515+
this->bind(vertex_rng | std::views::transform(&vertex_type::id), hyperedge.id());
516+
}
517+
518+
void bind(
519+
const id_type vertex_id, const traits::c_forward_range_of<id_type> auto& hyperedge_id_rng
520+
)
521+
requires std::same_as<directional_tag, undirected_t>
522+
{
523+
this->_verify_vertex_id(vertex_id);
524+
for (const auto hyperedge_id : hyperedge_id_rng) {
525+
this->_verify_hyperedge_id(hyperedge_id);
526+
this->_impl.bind(vertex_id, hyperedge_id);
527+
}
528+
}
529+
530+
gl_attr_force_inline void bind(
531+
const vertex_type& vertex,
532+
const traits::c_forward_range_of<hyperedge_type> auto& hyperedge_rng
533+
)
534+
requires std::same_as<directional_tag, undirected_t>
535+
{
536+
this->bind(vertex.id(), hyperedge_rng | std::views::transform(&hyperedge_type::id));
537+
}
538+
539+
void bind_tail(const id_type vertex_id, const id_type hyperedge_id)
540+
requires std::same_as<directional_tag, bf_directed_t>
541+
{
542+
this->_verify_vertex_id(vertex_id);
543+
this->_verify_hyperedge_id(hyperedge_id);
544+
this->_impl.bind_tail(vertex_id, hyperedge_id);
545+
}
546+
547+
gl_attr_force_inline void bind_tail(const vertex_type& vertex, const hyperedge_type& hyperedge)
548+
requires std::same_as<directional_tag, bf_directed_t>
549+
{
550+
this->bind_tail(vertex.id(), hyperedge.id());
551+
}
552+
553+
void bind_tail(
554+
const traits::c_forward_range_of<id_type> auto& vertex_id_rng, const id_type hyperedge_id
555+
)
556+
requires std::same_as<directional_tag, bf_directed_t>
557+
{
558+
this->_verify_hyperedge_id(hyperedge_id);
559+
for (const auto vertex_id : vertex_id_rng) {
560+
this->_verify_vertex_id(vertex_id);
561+
this->_impl.bind_tail(vertex_id, hyperedge_id);
562+
}
563+
}
564+
565+
gl_attr_force_inline void bind_tail(
566+
const traits::c_forward_range_of<vertex_type> auto& vertex_rng,
567+
const hyperedge_type& hyperedge
568+
)
569+
requires std::same_as<directional_tag, bf_directed_t>
570+
{
571+
this->bind_tail(vertex_rng | std::views::transform(&vertex_type::id), hyperedge.id());
572+
}
573+
574+
void bind_tail(
575+
const id_type vertex_id, const traits::c_forward_range_of<id_type> auto& hyperedge_id_rng
576+
)
577+
requires std::same_as<directional_tag, bf_directed_t>
578+
{
579+
this->_verify_vertex_id(vertex_id);
580+
for (const auto hyperedge_id : hyperedge_id_rng) {
581+
this->_verify_hyperedge_id(hyperedge_id);
582+
this->_impl.bind_tail(vertex_id, hyperedge_id);
583+
}
584+
}
585+
586+
gl_attr_force_inline void bind_tail(
587+
const vertex_type& vertex,
588+
const traits::c_forward_range_of<hyperedge_type> auto& hyperedge_rng
589+
)
590+
requires std::same_as<directional_tag, bf_directed_t>
591+
{
592+
this->bind_tail(vertex.id(), hyperedge_rng | std::views::transform(&hyperedge_type::id));
593+
}
594+
409595
void bind_head(const id_type vertex_id, const id_type hyperedge_id)
410596
requires std::same_as<directional_tag, bf_directed_t>
411597
{
@@ -420,18 +606,46 @@ class hypergraph final {
420606
this->bind_head(vertex.id(), hyperedge.id());
421607
}
422608

423-
void bind_tail(const id_type vertex_id, const id_type hyperedge_id)
609+
void bind_head(
610+
const traits::c_forward_range_of<id_type> auto& vertex_id_rng, const id_type hyperedge_id
611+
)
424612
requires std::same_as<directional_tag, bf_directed_t>
425613
{
426-
this->_verify_vertex_id(vertex_id);
427614
this->_verify_hyperedge_id(hyperedge_id);
428-
this->_impl.bind_tail(vertex_id, hyperedge_id);
615+
for (const auto vertex_id : vertex_id_rng) {
616+
this->_verify_vertex_id(vertex_id);
617+
this->_impl.bind_head(vertex_id, hyperedge_id);
618+
}
429619
}
430620

431-
gl_attr_force_inline void bind_tail(const vertex_type& vertex, const hyperedge_type& hyperedge)
621+
gl_attr_force_inline void bind_head(
622+
const traits::c_forward_range_of<vertex_type> auto& vertex_rng,
623+
const hyperedge_type& hyperedge
624+
)
432625
requires std::same_as<directional_tag, bf_directed_t>
433626
{
434-
this->bind_tail(vertex.id(), hyperedge.id());
627+
this->bind_head(vertex_rng | std::views::transform(&vertex_type::id), hyperedge.id());
628+
}
629+
630+
void bind_head(
631+
const id_type vertex_id, const traits::c_forward_range_of<id_type> auto& hyperedge_id_rng
632+
)
633+
requires std::same_as<directional_tag, bf_directed_t>
634+
{
635+
this->_verify_vertex_id(vertex_id);
636+
for (const auto hyperedge_id : hyperedge_id_rng) {
637+
this->_verify_hyperedge_id(hyperedge_id);
638+
this->_impl.bind_head(vertex_id, hyperedge_id);
639+
}
640+
}
641+
642+
gl_attr_force_inline void bind_head(
643+
const vertex_type& vertex,
644+
const traits::c_forward_range_of<hyperedge_type> auto& hyperedge_rng
645+
)
646+
requires std::same_as<directional_tag, bf_directed_t>
647+
{
648+
this->bind_head(vertex.id(), hyperedge_rng | std::views::transform(&hyperedge_type::id));
435649
}
436650

437651
void unbind(const id_type vertex_id, const id_type hyperedge_id) {

0 commit comments

Comments
 (0)