Ranjan Maitra
2018-Mar-30 18:45 UTC
[R] getting all circular arrangements without accounting for order
Jeff, I wanted to let you know that your function is faster than generating the directional circular permutations and weeding. Here is the time for n = 10. I compared with just doing the permutations, there is no point in proceeding further with the weeding since it is slower at the start itself. system.time(directionless_circular_permutations(10)) user system elapsed 1.576 0.000 1.579 system.time(permutations(9,9)) user system elapsed 3.030 0.000 3.037 Repeats keep the values similar. All computations on a 10-core processor @3.1GHz with 20 threads (using only one thread) and running the Fedora 27 with 4.15.9 kernel. I have to say that I was surprised to see the difference at n = 10 itself. Thanks again! Best wishes, Ranjan On Thu, 29 Mar 2018 23:26:12 -0700 Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:> I don't know if this is more efficient than enumerating with distinct > directions and weeding... it seems kind of heavyweight to me: > > ####### > library(gtools) > directionless_circular_permutations <- function( n ) { > v <- seq.int( n-1 ) > ix <- combinations( n-1, 2 ) > jx <- permutations( n-3, n-3 ) > x <- lapply( seq.int( nrow( ix ) ) > , function( i ) { > cbind( ix[ i, 1 ] > , permutations( n-3 > , n-3 > , v[ -ix[ i, ] ] > ) > , ix[ i, 2 ] > ) > } > ) > cbind( do.call( rbind, x ), n ) > } > ####### > > For more speed, perhaps use Rcpp with [1]? > > [1] http://howardhinnant.github.io/combinations.html > > On Thu, 29 Mar 2018, Ranjan Maitra wrote: > > > Thanks! > > > > Yes, however, this seems a bit wasteful. Just wondering if there are > > other, more efficient options possible. > > > > Best wishes, > > Ranjan > > > > > > On Thu, 29 Mar 2018 22:20:19 -0400 Boris Steipe <boris.steipe at utoronto.ca> wrote: > > > >> If one is equal to the reverse of another, keep only one of the pair. > >> > >> B. > >> > >> > >> > >>> On Mar 29, 2018, at 9:48 PM, Ranjan Maitra <maitra at email.com> wrote: > >>> > >>> Dear friends, > >>> > >>> I would like to get all possible arrangements of n objects listed 1:n on a circle. > >>> > >>> Now this is easy to do in R. Keep the last spot fixed at n and fill in the rest using permuations(n-1, n-1) from the gtools package. > >>> > >>> However, what if clockwise or counterclockwise arrangements are the same? I know that half of the above (n - 1)! arrangements are redundant. > >>> > >>> Is there an easy way to list these (n-1)!/2 arrangements? > >>> > >>> I thought of only listing the first half from a call to permuations(n - 1, n - 1), but while this holds for n = 4, it does not for n = 5. So, I am wondering if there is another function or tweak which would easily do this. > >>> > >>> Many thanks in advance for any help. and best wishes, > >>> Ranjan > >>> > >>> ______________________________________________ > >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >>> https://stat.ethz.ch/mailman/listinfo/r-help > >>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > >>> and provide commented, minimal, self-contained, reproducible code. > >> > >> ______________________________________________ > >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >> https://stat.ethz.ch/mailman/listinfo/r-help > >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > >> and provide commented, minimal, self-contained, reproducible code. > >> > > > > > > -- > > Important Notice: This mailbox is ignored: e-mails are set to be deleted on receipt. Please respond to the mailing list if appropriate. For those needing to send personal or professional e-mail, please use appropriate addresses. > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code. > > > > --------------------------------------------------------------------------- > Jeff Newmiller The ..... ..... Go Live... > DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... > Live: OO#.. Dead: OO#.. Playing > Research Engineer (Solar/Batteries O.O#. #.O#. with > /Software/Embedded Controllers) .OO#. .OO#. rocks...1k > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Important Notice: This mailbox is ignored: e-mails are set to be deleted on receipt. Please respond to the mailing list if appropriate. For those needing to send personal or professional e-mail, please use appropriate addresses.
Jeff Newmiller
2018-Mar-30 20:49 UTC
[R] getting all circular arrangements without accounting for order
New function below is a bit faster due to more efficent memory handling. for-loop FTW! directionless_circular_permutations2 <- function( n ) { n1 <- n - 1L v <- seq.int( n1 ) ix <- combinations( n1, 2L ) jx <- permutations( n-3L, n-3L ) jxrows <- nrow( jx ) jxoffsets <- seq.int( jxrows ) result <- matrix( n, nrow = factorial( n1 )/2L, ncol = n ) k <- seq( 2L, n - 2L ) for ( i in seq.int( nrow( ix ) ) ) { result[ ( i - 1L ) * jxrows + jxoffsets, k ] <- matrix( v[ -ix[ i, ] ][ jx ], nrow = jxrows ) } result[ , 1L ] <- rep( ix[ , 1L ], each = jxrows ) result[ , n1 ] <- rep( ix[ , 2L ], each = jxrows ) result } On Fri, 30 Mar 2018, Ranjan Maitra wrote:> Jeff, > > I wanted to let you know that your function is faster than generating > the directional circular permutations and weeding. > > Here is the time for n = 10. I compared with just doing the > permutations, there is no point in proceeding further with the weeding > since it is slower at the start itself. > > > system.time(directionless_circular_permutations(10)) > user system elapsed > 1.576 0.000 1.579 > > system.time(permutations(9,9)) > user system elapsed > 3.030 0.000 3.037 > > Repeats keep the values similar. All computations on a 10-core processor > @3.1GHz with 20 threads (using only one thread) and running the Fedora > 27 with 4.15.9 kernel. > > I have to say that I was surprised to see the difference at n = 10 itself. > > Thanks again! > > Best wishes, > Ranjan > > On Thu, 29 Mar 2018 23:26:12 -0700 Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote: > >> I don't know if this is more efficient than enumerating with distinct >> directions and weeding... it seems kind of heavyweight to me: >> >> ####### >> library(gtools) >> directionless_circular_permutations <- function( n ) { >> v <- seq.int( n-1 ) >> ix <- combinations( n-1, 2 ) >> jx <- permutations( n-3, n-3 ) >> x <- lapply( seq.int( nrow( ix ) ) >> , function( i ) { >> cbind( ix[ i, 1 ] >> , permutations( n-3 >> , n-3 >> , v[ -ix[ i, ] ] >> ) >> , ix[ i, 2 ] >> ) >> } >> ) >> cbind( do.call( rbind, x ), n ) >> } >> ####### >> >> For more speed, perhaps use Rcpp with [1]? >> >> [1] http://howardhinnant.github.io/combinations.html >> >> On Thu, 29 Mar 2018, Ranjan Maitra wrote: >> >>> Thanks! >>> >>> Yes, however, this seems a bit wasteful. Just wondering if there are >>> other, more efficient options possible. >>> >>> Best wishes, >>> Ranjan >>> >>> >>> On Thu, 29 Mar 2018 22:20:19 -0400 Boris Steipe <boris.steipe at utoronto.ca> wrote: >>> >>>> If one is equal to the reverse of another, keep only one of the pair. >>>> >>>> B. >>>> >>>> >>>> >>>>> On Mar 29, 2018, at 9:48 PM, Ranjan Maitra <maitra at email.com> wrote: >>>>> >>>>> Dear friends, >>>>> >>>>> I would like to get all possible arrangements of n objects listed 1:n on a circle. >>>>> >>>>> Now this is easy to do in R. Keep the last spot fixed at n and fill in the rest using permuations(n-1, n-1) from the gtools package. >>>>> >>>>> However, what if clockwise or counterclockwise arrangements are the same? I know that half of the above (n - 1)! arrangements are redundant. >>>>> >>>>> Is there an easy way to list these (n-1)!/2 arrangements? >>>>> >>>>> I thought of only listing the first half from a call to permuations(n - 1, n - 1), but while this holds for n = 4, it does not for n = 5. So, I am wondering if there is another function or tweak which would easily do this. >>>>> >>>>> Many thanks in advance for any help. and best wishes, >>>>> Ranjan >>>>> >>>>> ______________________________________________ >>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>>> ______________________________________________ >>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>> >>> >>> -- >>> Important Notice: This mailbox is ignored: e-mails are set to be deleted on receipt. Please respond to the mailing list if appropriate. For those needing to send personal or professional e-mail, please use appropriate addresses. >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. >>> >> >> --------------------------------------------------------------------------- >> Jeff Newmiller The ..... ..... Go Live... >> DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... >> Live: OO#.. Dead: OO#.. Playing >> Research Engineer (Solar/Batteries O.O#. #.O#. with >> /Software/Embedded Controllers) .OO#. .OO#. rocks...1k >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > > > -- > Important Notice: This mailbox is ignored: e-mails are set to be deleted on receipt. Please respond to the mailing list if appropriate. For those needing to send personal or professional e-mail, please use appropriate addresses. > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >--------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k
Ranjan Maitra
2018-Mar-30 21:13 UTC
[R] getting all circular arrangements without accounting for order
Jeff, Thanks! This one is much faster, no doubt! system.time(directionless_circular_permutations2(12)) user system elapsed 5.331 0.745 6.089 system.time(directionless_circular_permutations(12)) user system elapsed 173.659 0.890 174.946 However, from n = 13, things start becoming slow. system.time(directionless_circular_permutations2(13)) user system elapsed 60.588 14.933 75.864 Perhaps the loop can be parallelized using doMC or doSNOW, etc. but most likely it is best to do a .Call or .C or Rcpp as you suggested earlier. This may be a consequence of the permutations function itself being slow. Thanks again! Ranjan On Fri, 30 Mar 2018 13:49:01 -0700 Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:> New function below is a bit faster due to more efficent memory handling. > > for-loop FTW! > > directionless_circular_permutations2 <- function( n ) { > n1 <- n - 1L > v <- seq.int( n1 ) > ix <- combinations( n1, 2L ) > jx <- permutations( n-3L, n-3L ) > jxrows <- nrow( jx ) > jxoffsets <- seq.int( jxrows ) > result <- matrix( n, nrow = factorial( n1 )/2L, ncol = n ) > k <- seq( 2L, n - 2L ) > for ( i in seq.int( nrow( ix ) ) ) { > result[ ( i - 1L ) * jxrows + jxoffsets, k ] <- > matrix( v[ -ix[ i, ] ][ jx ], nrow = jxrows ) > } > result[ , 1L ] <- rep( ix[ , 1L ], each = jxrows ) > result[ , n1 ] <- rep( ix[ , 2L ], each = jxrows ) > result > } > > > On Fri, 30 Mar 2018, Ranjan Maitra wrote: > > > Jeff, > > > > I wanted to let you know that your function is faster than generating > > the directional circular permutations and weeding. > > > > Here is the time for n = 10. I compared with just doing the > > permutations, there is no point in proceeding further with the weeding > > since it is slower at the start itself. > > > > > > system.time(directionless_circular_permutations(10)) > > user system elapsed > > 1.576 0.000 1.579 > > > > system.time(permutations(9,9)) > > user system elapsed > > 3.030 0.000 3.037 > > > > Repeats keep the values similar. All computations on a 10-core processor > > @3.1GHz with 20 threads (using only one thread) and running the Fedora > > 27 with 4.15.9 kernel. > > > > I have to say that I was surprised to see the difference at n = 10 itself. > > > > Thanks again! > > > > Best wishes, > > Ranjan > > > > On Thu, 29 Mar 2018 23:26:12 -0700 Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote: > > > >> I don't know if this is more efficient than enumerating with distinct > >> directions and weeding... it seems kind of heavyweight to me: > >> > >> ####### > >> library(gtools) > >> directionless_circular_permutations <- function( n ) { > >> v <- seq.int( n-1 ) > >> ix <- combinations( n-1, 2 ) > >> jx <- permutations( n-3, n-3 ) > >> x <- lapply( seq.int( nrow( ix ) ) > >> , function( i ) { > >> cbind( ix[ i, 1 ] > >> , permutations( n-3 > >> , n-3 > >> , v[ -ix[ i, ] ] > >> ) > >> , ix[ i, 2 ] > >> ) > >> } > >> ) > >> cbind( do.call( rbind, x ), n ) > >> } > >> ####### > >> > >> For more speed, perhaps use Rcpp with [1]? > >> > >> [1] http://howardhinnant.github.io/combinations.html > >> > >> On Thu, 29 Mar 2018, Ranjan Maitra wrote: > >> > >>> Thanks! > >>> > >>> Yes, however, this seems a bit wasteful. Just wondering if there are > >>> other, more efficient options possible. > >>> > >>> Best wishes, > >>> Ranjan > >>> > >>> > >>> On Thu, 29 Mar 2018 22:20:19 -0400 Boris Steipe <boris.steipe at utoronto.ca> wrote: > >>> > >>>> If one is equal to the reverse of another, keep only one of the pair. > >>>> > >>>> B. > >>>> > >>>> > >>>> > >>>>> On Mar 29, 2018, at 9:48 PM, Ranjan Maitra <maitra at email.com> wrote: > >>>>> > >>>>> Dear friends, > >>>>> > >>>>> I would like to get all possible arrangements of n objects listed 1:n on a circle. > >>>>> > >>>>> Now this is easy to do in R. Keep the last spot fixed at n and fill in the rest using permuations(n-1, n-1) from the gtools package. > >>>>> > >>>>> However, what if clockwise or counterclockwise arrangements are the same? I know that half of the above (n - 1)! arrangements are redundant. > >>>>> > >>>>> Is there an easy way to list these (n-1)!/2 arrangements? > >>>>> > >>>>> I thought of only listing the first half from a call to permuations(n - 1, n - 1), but while this holds for n = 4, it does not for n = 5. So, I am wondering if there is another function or tweak which would easily do this. > >>>>> > >>>>> Many thanks in advance for any help. and best wishes, > >>>>> Ranjan > >>>>> > >>>>> ______________________________________________ > >>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >>>>> https://stat.ethz.ch/mailman/listinfo/r-help > >>>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > >>>>> and provide commented, minimal, self-contained, reproducible code. > >>>> > >>>> ______________________________________________ > >>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >>>> https://stat.ethz.ch/mailman/listinfo/r-help > >>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > >>>> and provide commented, minimal, self-contained, reproducible code. > >>>> > >>> > >>> > >>> -- > >>> Important Notice: This mailbox is ignored: e-mails are set to be deleted on receipt. Please respond to the mailing list if appropriate. For those needing to send personal or professional e-mail, please use appropriate addresses. > >>> > >>> ______________________________________________ > >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >>> https://stat.ethz.ch/mailman/listinfo/r-help > >>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > >>> and provide commented, minimal, self-contained, reproducible code. > >>> > >> > >> --------------------------------------------------------------------------- > >> Jeff Newmiller The ..... ..... Go Live... > >> DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... > >> Live: OO#.. Dead: OO#.. Playing > >> Research Engineer (Solar/Batteries O.O#. #.O#. with > >> /Software/Embedded Controllers) .OO#. .OO#. rocks...1k > >> > >> ______________________________________________ > >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >> https://stat.ethz.ch/mailman/listinfo/r-help > >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > >> and provide commented, minimal, self-contained, reproducible code. > >> > > > > > > -- > > Important Notice: This mailbox is ignored: e-mails are set to be deleted on receipt. Please respond to the mailing list if appropriate. For those needing to send personal or professional e-mail, please use appropriate addresses. > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code. > > > > --------------------------------------------------------------------------- > Jeff Newmiller The ..... ..... Go Live... > DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... > Live: OO#.. Dead: OO#.. Playing > Research Engineer (Solar/Batteries O.O#. #.O#. with > /Software/Embedded Controllers) .OO#. .OO#. rocks...1k > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Important Notice: This mailbox is ignored: e-mails are set to be deleted on receipt. Please respond to the mailing list if appropriate. For those needing to send personal or professional e-mail, please use appropriate addresses.
Seemingly Similar Threads
- getting all circular arrangements without accounting for order
- getting all circular arrangements without accounting for order
- getting all circular arrangements without accounting for order
- getting all circular arrangements without accounting for order
- getting all circular arrangements without accounting for order