@@ -1898,6 +1898,90 @@ fn rs_m_separated(
18981898 . unwrap_or_else ( |e| throw_r_error ( e) )
18991899}
19001900
1901+ #[ extendr]
1902+ fn rs_not_m_separated_for_all_subsets (
1903+ mut session : ExternalPtr < GraphSession > ,
1904+ node_a : i32 ,
1905+ node_b : i32 ,
1906+ other_nodes : Integers ,
1907+ cond_vars : Integers ,
1908+ ) -> bool {
1909+ let a = rint_to_u32 ( Rint :: from ( node_a) , "node_a" ) ;
1910+ let b = rint_to_u32 ( Rint :: from ( node_b) , "node_b" ) ;
1911+
1912+ if a >= session. as_ref ( ) . n ( ) {
1913+ throw_r_error ( format ! ( "Index {} is out of bounds" , a) ) ;
1914+ }
1915+ if b >= session. as_ref ( ) . n ( ) {
1916+ throw_r_error ( format ! ( "Index {} is out of bounds" , b) ) ;
1917+ }
1918+
1919+ let mut z_base: Vec < u32 > = cond_vars
1920+ . iter ( )
1921+ . map ( |ri| rint_to_u32 ( ri, "cond_vars" ) )
1922+ . collect ( ) ;
1923+ let other_u: Vec < u32 > = other_nodes
1924+ . iter ( )
1925+ . map ( |ri| rint_to_u32 ( ri, "other_nodes" ) )
1926+ . collect ( ) ;
1927+
1928+ for & i in & z_base {
1929+ if i >= session. as_ref ( ) . n ( ) {
1930+ throw_r_error ( format ! ( "Index {} is out of bounds" , i) ) ;
1931+ }
1932+ }
1933+ for & i in & other_u {
1934+ if i >= session. as_ref ( ) . n ( ) {
1935+ throw_r_error ( format ! ( "Index {} is out of bounds" , i) ) ;
1936+ }
1937+ }
1938+
1939+ if session
1940+ . as_mut ( )
1941+ . m_separated ( & [ a] , & [ b] , & z_base)
1942+ . unwrap_or_else ( |e| throw_r_error ( e) )
1943+ {
1944+ return false ;
1945+ }
1946+
1947+ let m = other_u. len ( ) ;
1948+ if m == 0 {
1949+ return true ;
1950+ }
1951+
1952+ for k in ( 1 ..=m) . rev ( ) {
1953+ let mut idx: Vec < usize > = ( 0 ..k) . collect ( ) ;
1954+ loop {
1955+ z_base. truncate ( cond_vars. len ( ) ) ;
1956+ for & ii in & idx {
1957+ z_base. push ( other_u[ ii] ) ;
1958+ }
1959+
1960+ if session
1961+ . as_mut ( )
1962+ . m_separated ( & [ a] , & [ b] , & z_base)
1963+ . unwrap_or_else ( |e| throw_r_error ( e) )
1964+ {
1965+ return false ;
1966+ }
1967+
1968+ let mut i = k;
1969+ while i > 0 && idx[ i - 1 ] == i - 1 + ( m - k) {
1970+ i -= 1 ;
1971+ }
1972+ if i == 0 {
1973+ break ;
1974+ }
1975+ idx[ i - 1 ] += 1 ;
1976+ for j in i..k {
1977+ idx[ j] = idx[ j - 1 ] + 1 ;
1978+ }
1979+ }
1980+ }
1981+
1982+ true
1983+ }
1984+
19011985#[ extendr]
19021986fn rs_adjustment_set_parents (
19031987 mut session : ExternalPtr < GraphSession > ,
@@ -2086,6 +2170,7 @@ extendr_module! {
20862170 fn rs_d_separated;
20872171 fn rs_minimal_d_separator;
20882172 fn rs_m_separated;
2173+ fn rs_not_m_separated_for_all_subsets;
20892174 fn rs_adjustment_set_parents;
20902175 fn rs_adjustment_set_backdoor;
20912176 fn rs_adjustment_set_optimal;
0 commit comments