Wells Fargo: Outperforming, Defying Analyst Downgrades, Three 11% - 14% Trades
by Double Dividend StocksSummary
- WFC and the banking sector have outperformed the market over the past month and quarter, despite a raft of analyst downgrades.
- Three high-yield trades for WFC are detailed, with yields of 11.5% to 14% annualized.
- Analyst price targets, earnings estimate revisions, valuations, and earnings also are detailed.
Whoever said the market has to make sense? With interest rates declining in 2019, aided by the Fed making three rate cuts, the general consensus has been that banks' earnings would move lower. Additionally, you wouldn't have guessed that scandal-plagued Wells Fargo (WFC) would have outperformed the market over the past month and quarter.
Looking at the earnings estimates revisions for the big four money center banks - Wells Fargo, JPMorgan Chase (JPM), Bank Of America, (BAC), and Citigroup (C) - would bear this out - they've all received mostly downward revisions from analysts:
But looking at the price performance for WFC and the big banks, using the First Trust Nasdaq Bank ETF (FTXO) as a proxy, defies that downward trend. WFC is up more than 23% for the quarter and 10% for the month, vs. an 8.8% quarterly gain and a 4.4% monthly gain for the S&P 500, and also is beating FTXO.
Looking back further shows FTXO roughly in line with the market in 2019, while WFC has had a respectable 17.66% price gain. Both of them, however, have trailed the market by a wide berth over the past year:
FTXO top holdings include JPM, C, WFC, and BAC, in addition to other large US banks:
Indeed, this outperformance doesn't stop with just the big bank sub sector - regional banks also have joined in the fun, with various ETFs such as the iShares U.S. Regional Banks ETF (IAT), posting gains of ~7% to ~8.6% over the past trading month and ~12% to 17% over the past trading quarter.
IAT also outperformed the market in 2019, up 24.55%, with the SPDR S&P Regional Banking ETF (KRE), close behind, up ~21%. Just like the big banks, though, all of these regional bank ETFs have lagged the market over the past year:
Analyst's Price Targets:
WFC's price performance has outrun analysts' low and average price targets - it's currently ~27% above the lowest target of $42.00 and is 4.65% above the average $50.92 price target.
Valuations:
WFC has a higher yield of 3.83% vs. its sector median of 2.52%. Its trailing and forward P/E''s are both a bit lower than the median, while its price/book of 1.34X is slightly higher. Its price/sales ratio also is lower than average.
Earnings:
It looks like investors believe that WFC's new CEO, Charlie Scharf, who was appointed in late September, can repair the damage and put all of the scandals and fines circling around the troubled mega bank in the past. WFC's troubles already have claimed two CEOs thus far. Mr. Scharf, who previously served as CEO of Bank of New York Mellon, started in his new role on 10/21/19.
WFC's Q3 '19 revenue was up slightly, at $22B, whereas its non-interest expense jumped to $15.2B, up $1.4B vs. Q3 '18, mainly due to higher operating losses from higher litigation accruals, as well as higher salaries, commissions and incentive compensation expense.
Net interest income fell $1B, due to WFC's net interest margin sliding from 2.94% down to 2.66%. A few bright spots were: A 6% decline in net charge-offs, with a lower net charge-off rate of .27%. Average deposits were up $25B, while average loans were up $10.3B vs. Q3 '18.
WFC also had a Tier 1 ratio of 11.6%, down from 11.9%, but still above the regulatory 9% rate and WFC's target ratio of 10%. They bought back 159M shares in Q3 - the share count is 9% lower than in Q3 '18. WFC's big buyback program has probably lent a great deal of support to its share price in 2019.
(Source: WFC site)
Dividends:
At $53.29, WFC yields ~3.83% and has the highest yield among the big four US banks. It usually goes ex-dividend in a Feb/May/Aug./Nov. schedule and pays in the following months, although its Q1 ex-dividend may fall at the end of January 2020.
Although it has the highest yield, WFC's 45.31% dividend payout ratio is the highest among the big four banks, and its five-year dividend growth rate of 7.36% is by far the lowest.
Options:
So, if you're looking for a piece of the WFC "action," but you're leery of its current price, which is above analysts' average price target of $50.92, you may want to look at selling cash secured puts below WFC's price/share.
Here are two cash secured put trades for WFC which offered attractive put option premiums.
You can see additional details for these trades and other option-selling trades on our Covered Calls and Cash Secured Puts tables.
WFC's January '20 $52.50 put strike pays $1.31, for a 14% annualized yield. The breakeven is $51.19, which is just slightly higher than the $50.92 target price. With WFC going ex-dividend in late January/early February, having the shares assigned in mid January would set you up for the next quarterly dividend. Your forward dividend yield at $51.19 would be 4%.
If you're looking for a lower breakeven, you can go further out in time.
WFC's April '20 $52.50 put strike pays $2.55, five times the $.51 quarterly dividend. The annualized yield of 11.51% and a $49.95 breakeven, which is ~2% below the $50.92 average target price:
If you're more bullish, but you want to hedge your bet somewhat, this March 2020 covered call trade offers an 11.8% static yield. The March $55.00 call strike pays $1.70 over 3X WFC's quarterly $.51 dividend.
All tables furnished by DoubleDividendStocks.com, unless otherwise noted.
Disclaimer: This article was written for informational purposes only, and is not intended as personal investment advice. Please practice due diligence before investing in any investment vehicle mentioned in this article.
Our Marketplace service, Hidden Dividend Stocks Plus, focuses on undercovered, undervalued income vehicles, and special high yield situations.
We scour the US and world markets to find solid income opportunities with dividend yields ranging from 5% to 10%-plus, backed by strong earnings.
We publish exclusive articles each week with investing ideas for the HDS+ site that you won't see anywhere else.
Find out now how our portfolio is beating the market since its inception. There's currently a 20% discount for new members.
Disclosure: I/we have no positions in any stocks mentioned, and no plans to initiate any positions within the next 72 hours. I wrote this article myself, and it expresses my own opinions. I am not receiving compensation for it (other than from Seeking Alpha). I have no business relationship with any company whose stock is mentioned in this article.
Additional disclosure: Our DoubleDividendStocks.com service features options selling for dividend stocks.
It's a separate service from our Seeking Alpha Hidden Dividend Stocks Plus service.


Yoda Translator
Construct Sentences that Master Yoda will approve of!
Example: You must control the Force and not go to the Dark Side.
Translate


MOVIEFLIX
Sign In
Forgot your password?
Remember me on this device
Submit
Login with facebook
Not memeber yet?
Signup


Scrum
Scrum — a lightweight product delivery framework that has conquered and revolutionised our work processes since its inception in 1995. It has been governed by a thin document, the Scrum Guide, last updated in 2017, that describes how Scrum works. Just like various creative processes made by humans, such as writing poetry or composing music, the rules of Scrum are simple but it is difficult to master. Teams that use the framework to deliver customer value, usually employ a full time Scrum Master who helps facilitate Scrum events, coaches the team to improve and helps them work towards becoming a self-organising team.


Progress in this course(100%) Progress in this Specialisation capstone(20%) Progress in Life Goals (67%)
Enjoyed a lot. Had tremondous Fun and Masti with Friends


Adding Docker to a Ruby gem
As a maintainer of a few Ruby gems, I have to decide what is accepted and what gets rejected into the gems. The other day someone submitted a pull request to add a Dockerfile to DatabaseCleaner
I thought it was a good idea, because the current version of DatabaseCleaner requires you to have Postgres, MySQL, Redis, and Mongo up and running before you run rake
.
Here are the steps:
Download the Docker Toolbox, a 176+ MB package.
Install the package, which will expand to 400+ MB in your filesystem.
In the terminal:
docker-machine start default
Then within your project:
docker-compose up
(before this I had to runeval "$(docker-machine env default)"
because of this issue). Get ready to wait for a few minutes while it sets up your virtual machine.Finally:
docker-compose run --rm gem
Supposedly these steps should start the required services and run the build. I was expecting to watch it pass, but this is what I saw:
Installing mongo_ext 0.19.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
/usr/local/rvm/rubies/ruby-2.2.2/bin/ruby -r ./siteconf20151224-6-fhvc98.rb extconf.rb
checking for asprintf()... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/usr/local/rvm/rubies/ruby-2.2.2/bin/$(RUBY_BASE_NAME)
If I were to add this contribution, I'd make sure that the CONTRIBUTE.markdown
lists Docker as an option to run the specs, not as the default.


1AI
Mission
Community
team
IPStack
Entrepreneurs
Entrepreneurs can use 1AI network to pitch projects to investors from different parts of the world in the community of 1AI network and locate talents from every corner of the world. Using 1AI’s patent pending AI match engine, entrepreneurs are no longer limited by geographical boundaries and human resource efficiencies.
Talents
Talents from around the world can use 1AI network to participate in IP-backed projects in need of their expertise/talents. Talents who have their own careers can contribute to IP-backed projects in their spare time and enjoy the bounties of gig economy.
Investors
Investors worldwide can use 1AI network to invest in IP-backed projects. Investors can receive pitches from numerous startup founders with wide range of IP-backed technology and/or business ideas from around the world to invest and participate in their success.
IP Holders
IP holders, such as universities or research institutions, can use 1AI network to broadcast their patented or patent pending technologies to entrepreneurs throughout the world in the 1AI community, improving the possibility of successful commercialization of their technologies while allowing entrepreneurs to develop, investors to invest in, and talents from around the world to contribute to projects backed by cutting edge research and innovation from world-class researchers.


|
Prismic.io PHP kit
3.0.0
|
Public Member Functions | |
| getUrl ($linkResolver=null) | |
| Public Member Functions inherited from Prismic\Fragment\FragmentInterface | |
| asText () | |
| asHtml ($linkResolver) | |
This interface embodies any link. LinkInterface objects can be found in two occasions: as the "$link" variable of a HyperlinkSpan object (which happens when the link is a hyperlink in a StructuredText fragment), or the LinkInterface can also be its own fragment (e.g. for a "related" fragment, that links to a related document).
Its known implementations are DocumentLink, WebLink, and also FileLink and ImageLink (united as "MediaLink" in former versions of the kit).
| Prismic\Fragment\Link\LinkInterface::getUrl | ( | $linkResolver = null | ) |
Returns the URL we're linking to. The linkResolver will be needed in case the link is a document link. Read more about the link resolver at the very end of prismic.io's documentation.
| \Prismic\LinkResolver | $linkResolver | the link resolver (read prismic.io's API documentation to learn more) |
Implemented in Prismic\Fragment\Link\DocumentLink, Prismic\Fragment\Link\FileLink, and Prismic\Fragment\Link\WebLink.


|
motley-php
Useful PHP utility classes and programs
|
Tests the Motley::UnitTestSupport class. More...
Public Member Functions | |
| testInvokeFunction () | |
| Test invokeFunction. More... | |
| testCaptureHandler () | |
| Test the capture error handler. More... | |
| testRecursiveDirectoryDelete () | |
| Test the temporary dir/file routines. More... | |
Protected Member Functions | |
| tearDown () | |
| A unit test tear-down function to clean up possible test error handlers. More... | |
Protected Attributes | |
| $lastUnit = null | |
| Last interesting UnitTestSupport instance. More... | |
Tests the Motley::UnitTestSupport class.
Definition at line 17 of file UnitTestSupportTest.php.
|
protected |
A unit test tear-down function to clean up possible test error handlers.
Definition at line 23 of file UnitTestSupportTest.php.
References Motley\UnitTestSupport\$captureHandlerSet.
| Motley\Test\UnitTestSupportTest::testInvokeFunction | ( | ) |
Test invokeFunction.
Definition at line 36 of file UnitTestSupportTest.php.
References Motley\UnitTestSupport\invokeFunction(), Motley\Test\ZzzSampleClass\PRIFUN, Motley\Test\ZzzSampleClass\PROFUN, Motley\Test\ZzzSampleClass\PUBFUN, Motley\Test\ZzzSampleClass\STAPRIFUN, Motley\Test\ZzzSampleClass\STAPROFUN, and Motley\Test\ZzzSampleClass\STAPUBFUN.
| Motley\Test\UnitTestSupportTest::testCaptureHandler | ( | ) |
Test the capture error handler.
Definition at line 53 of file UnitTestSupportTest.php.
References Motley\UnitTestSupport\clearCapturedErrors(), Motley\UnitTestSupport\disengageCaptureHandler(), Motley\UnitTestSupport\engageCaptureHandler(), Motley\UnitTestSupport\ERRSTR, and Motley\UnitTestSupport\getCapturedErrors().
| Motley\Test\UnitTestSupportTest::testRecursiveDirectoryDelete | ( | ) |
Test the temporary dir/file routines.
Definition at line 81 of file UnitTestSupportTest.php.
|
protected |
Last interesting UnitTestSupport instance.
Definition at line 19 of file UnitTestSupportTest.php.


404 Not Found
Return to home page
JavaScript is disabled or not supported by your browser, some features may not work. Ensure JavaScript is enabled and your browser is up to date


---
layout: post
title: 'Mobile 2.0: Carlos Domingo, Director, Internet and Multimedia Lab, Telefonica'
date: 2009-06-19 00:00:00
categories: business mobile
---
Mobile 2.0, Carlos Domingo, Director, Internet and Multimedia Lab, Telefonica: Open with care or care to open?
Revenue growth in traditional broadband and mobile is diminishing. New revenue sources are being collaborated over and fought over. Telcos can't capture any of the new growth using traditional methods.
The industry used to be a chess game (controlled and predictable). Now it's poker (living with uncertainty, requiring investment to see what happens next).
To get there we need a number of things:
- Open conversations with customers, "get naked"; be transparent on tariffs, billing, claims; have 2-way communication with customers; speak their language or risk a disconnect with them.
- Establish open innovation networks, work out how to collaborate with small companies, universities and large corps. For Telefonica they invested in Kyte, Loomia, Eventful, FestureTek and Amobee.
- Open innovation doesn't mean killing internal R&D. Get ideas from across the organisation.
- Open networks: become an open service platform to reach a long tail of developers. Telcos own lots of unique/useful assets: service delivery, call control, device access, infrastructure, SMS, QoS, identity, charging, location. Network resources are not the only interesting thing for developers. Knowing a customers social context is useful - imagine an API to tell you programatically if a customer is working or is at home.
- One API; we've loads of standardised APIs: OneAPI, Bondi, W3C, device/OS, network-specific.
But it's not enough to standardise: we need to be making money.


@linksVending()
Where should we send your receipt?
(and maybe a sweet discount!)


SOME MOTHER'S SON A film review by James Berardinelli Copyright 1996 James Berardinelli
RATING (0 TO 10): 8.0 Alternative Scale: ***1/2 out of ****
Ireland, 1996 U.S. Release Date: 12/27/96 (limited) Running Length: 1:52 MPAA Classification: R (Profanity, violence, mature themes) Theatrical Aspect Ratio: 1.85:1
Cast: Helen Mirren, Fionnula Flanagan, Aidan Gillen, David O'Hara, John Lynch, Ciaran Hinds, Geraldine O'Rawe, Grainne Delany Director: Terry George Producers: Jim Sheridan, Arthur Lappin, and Edward Burke Screenplay: Jim Sheridan and Terry George Cinematography: Geoffrey Simpson Music: Bill Whelan U.S. Distributor: Columbia Pictures
In 1979, when Margaret Thatcher assumed the role of England's Prime Minister, one of her stated aims was to crush the IRA and its associated "terrorism." Her "Northern Ireland Solution", as it became known, included three principles: Isolation, Criminalization, and Demoralization. Those members of the IRA captured for terrorist acts were to be treated as criminals, not soldiers. Prisons were to be used to break morale, not create martyrs.
On March 1, 1981, IRA prisoner Bobby Sands began a hunger strike which would earn him world-wide notoriety. Sands laid out five demands that, if met by the British government, would end the strike. Chief among these was the requirement that imprisoned IRA members would be recognized as "prisoners of war" (not common criminals), and, as such, would be allowed to wear their own clothing (instead of prison uniforms). Thatcher's government refused to negotiate, even when, on April 9, Sands was elected as the Member of Parliament from Fermanagh and South Tyrone. 66 days after it began, Sands' protest ended with his death. Others followed his example, and, by the time the strike ended on October 3, ten of the more than 300 IRA prisoners in Long Kesh prison's H-Blocks had perished.
The story of Sands' hunger strike forms the background of Terry George's directorial debut, SOME MOTHER'S SON. However, while there is a great deal of information in the film about Sinn Fein, the IRA, and the political situation in Ireland during the early 1980s (some of which is fictionalized), this is principally a tale of sacrifice and family relationships. It's about a mother being forced to confront the very real fear that her son may die for convictions that she does not share, and that it could ultimately be her responsibility to choose life or death for him.
The character of Gerard Quigley (Aidan Gillen) does not, nor ever did, exist, but George, along with co-writer Jim Sheridan (IN THE NAME OF THE FATHER), uses him as a focal point for SOME MOTHER'S SON's narrative. He is typical of young IRA members: firm in his beliefs, staunch in his hatred of the British, and willing to die for his convictions. He looks upon Bobby Sands (played by John Lynch) as a Messiah-like figure, and is willing to follow him to the grave.
The real star of the film, however, is Helen Mirren, who gives a stirring performance as Gerard's torn mother, Kathleen. A widowed schoolteacher trying to raise a family of three, Kathleen despises the violent tactics employed by the IRA, and is shocked to learn that her oldest son is a member of the organization. SOME MOTHER'S SON explores Kathleen's difficulties in coming to terms with Gerard's beliefs. And, although she refuses to be "a stooge for violence", Kathleen fights for her son with every ounce of strength, effectively helping the IRA. From her perspective, she walks a precarious moral tightrope. Once the hunger strikes begin, Kathleen recognizes that an agonizing dilemma awaits. If Gerard loses consciousness, it will be up to her (as his next-of-kin) to decide whether or not he is given food. If she agrees to have him fed intravenously, she violates his convictions. On the other hand, in the words of a British official, "Surely no mother would allow her son to die."
Mirren is given fine support by Fionnula Flanagan, who plays Annie Higgins, the mother of hunger striker Frank Higgins (David O'Hara). Unlike Kathleen, Annie is pro-IRA, but, despite their differing political views, the two become close compatriots through the shared bond of their sons' ordeals. Ciaran Hinds (last seen as the dashing Captain Wentworth in PERSUASION) plays Sinn Fein spokesman Danny Boyle (presumably a fictional representation of Gerry Adams).
Production values in SOME MOTHER'S SON are top-notch. There is a real sense of time and place, from the close, claustrophobic insides of Long Kesh prison to the streets of nearby Belfast. Cinematographer Geoffrey Simpson (SHINE) manages the difficult task of capturing the film's personal moments as effectively as the more epic ones (such as the funeral procession for Bobby Sands, which drew 100,000 mourners). Bill Whelan's forceful, energetic score is one of the best of the year.
Make no mistake: while the core story of SOME MOTHER'S SON is universal in theme and deeply personal in scope, the narrative nevertheless shows evidence of a pro-Republican bias. Although the movie is arguably more balanced than Sheridan's powerful and riveting IN THE NAME OF THE FATHER, the British still come off as faceless villains. Margaret Thatcher's mouthpiece is a caricature of vicious, heartless cliches. For those with an interest in the ongoing conflict in Northern Ireland, SOME MOTHER'S SON makes an excellent companion piece to Neil Jordan's MICHAEL COLLINS. But, regardless of your political leanings, Terry George's picture is well worth seeing because of its intelligence and emotional depth, not to mention Helen Mirren's Oscar-caliber performance.
- James Berardinelli e-mail<EMAIL_ADDRESS>ReelViews web site: http://www.cybernex.net/~berardin
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


To view this video please enable JavaScript, and consider upgrading to a web browser that supports HTML5 video


---
layout: post
title: Vim Emacs Regex Smackdown
tags: vim emacs
category: Vim
description: Using vim regular expressions to to a tricky translation from org-mode to html.
---
So, I was trying to convert an orgmode file to html. There is an orgmode-export-as-html function, but it was choking on something, so I needed to do the conversion by hand. I tried many, many times to convert the file with emacs regular expressions, but was unsuccessful. The difficulty was the orgmode headlines, which look like this:
{% highlight bash %}
*** Use the sort function
{% endhighlight %}
I wanted to simply transform this into
{% highlight bash %}
Vim Regexp
I was finally able to match the headline in vim with the following regular expression:
{% highlight bash %}
\*\*\* \(\(w*\).*\)
{% endhighlight %}
The literal asterisks had to be matched with \*.
Next, to match to the end of the line I used: \(\(w*\).*\)
\( \) creates a matching group, which can be used later in the replacement string with \1 or \2 etc.
Also \(w*\).* matches 1 or more words
Vim Substitution Expression
{% highlight bash %}
%s/\*\*\* \(\(w*\).*\)/ The % matches the entire file
The \1 matches the first matching group in the search string
That is, \1 will match everything on the line after the 3 literal asterisks.
Testing Matching String
Its easy to test a regular expression in vim.  Click 'n' to jump to the next match.
Getting back to previous substitution
Vim has a cool, intuitive way to explore your command history. In command mode, type ":" as for typing an ex command, and then press the up arrow to scroll up to through your command history. This is really handy for using previous, complex regular expressions.


Universal Attractor - Revival Project
v0.7 Beta 20.41
A game created by Aarex, revived by usavictor and Nyan Cat.  UPDATED VERSION IS
HERE.
Play
|
How to play
|
Change log
|
Discord
Credits
Hevipelle - Inspiration, forced prestige (supernova) & break limit
Orteil - Prestige
Omsi - Infinity notation & grammatical improvements
FrostBite5 - More grammatical improvements
PigOlympus & Omsi - Color notation
CatIsFluffy - His notation
Patashu - break_infinity.js
Special thanks for helping this game
Slabdrill
IkerStreamer
FrostBite5
CatIsFluffy


vignettes/intro_to_r5r.Rmd
intro_to_r5r.Rmd
Abstract
r5r
is an R package for rapid realistic routing on multimodal transport networks (walk, bike, public transport and car) using R5. The package allows users to generate detailed routing analysis or calculate travel time matrices using seamless parallel computing on top of the R5 Java machine https://github.com/conveyal/r5
r5r is an R package for rapid realistic routing on multimodal transport networks (walk, bike, public transport and car). It provides a simple and friendly interface to R5, a really fast and open source routing engine based in Java
developed by Conveyal. R5 stands for Rapid Realistic Routing on Real-world and Reimagined networks.
To use r5r
, you need to have Java SE Development Kit 11 installed on your computer. No worries, you don’t have to pay for it. The jdk 11 is freely available from the options below:
You can install r5r
from CRAN, or the development version from github.
# CRAN
install.packages('r5r')
# github
devtools::install_github("ipeaGIT/r5r", subdir = "r-package")
Before we start, we need to increase the memory available to Java. This is necessary because, by default, R
allocates only 512MB of memory for Java processes, which is not enough for large queries using r5r
. To increase available memory to 2GB, for example, we need to set the java.parameters
option at the beginning of the script, as follows:
options(java.parameters = "-Xmx2G")
Note: It’s very important to allocate enough memory before attaching r5r
or any other Java-based package, since rJava
starts a Java Virtual Machine only once for each R session. It might be useful to restart your R session and execute the code above right after, if you notice that you haven’t succeeded in your previous attempts.
Then we can load the packages used in this vignette:
library(r5r)
library(sf)
library(data.table)
library(ggplot2)
library(mapview)
mapviewOptions(platform = 'leafgl')
The r5r
package has 3 fundamental functions.
setup_r5()
to initialize an instance of r5r
, that also builds a routable transport network given an Open Street Map street network and public transport feeds in GTFS format;
travel_time_matrix()
for fast computation of travel time estimates between origin/destination pairs;
detailed_itineraries()
to get detailed information on one or multiple alternative routes between origin/destination pairs.
Let’s have a quick look at how these functions work using a sample data set.
To illustrate functionality, the package includes a small sample data for the city of Porto Alegre (Brazil). It includes four files:
.pbf
format (mandatory);GTFS.zip
format;.csv
format, containing the names and spatial coordinates of 15 places within Porto Alegre;.csv
file, which can be used as origin/destination pairs in a travel time matrix calculation.
data_path <- system.file("extdata/poa", package = "r5r")
list.files(data_path)
#> [1] "poa.zip" "poa_hexgrid.csv"
#> [3] "poa_osm.pbf" "poa_points_of_interest.csv"
The points of interest data can be seen below. In this example, we will be looking at transport alternatives between some of those places.
poi <- fread(file.path(data_path, "poa_points_of_interest.csv"))
head(poi)
#> id lat lon
#> 1: public_market -30.02756 -51.22781
#> 2: bus_central_station -30.02329 -51.21886
#> 3: gasometer_museum -30.03404 -51.24095
#> 4: santa_casa_hospital -30.03043 -51.22240
#> 5: townhall -30.02800 -51.22865
#> 6: piratini_palace -30.03363 -51.23068
The data with origin destination pairs is shown below. In this example, we will be building a travel time matrix between ten random points in this data set.
points <- fread(file.path(data_path, "poa_hexgrid.csv"))
points <- points[ c(sample(1:nrow(points), 10, replace=TRUE)), ]
head(points)
#> id lon lat population schools
#> 1: 89a9012b30bffff -51.15066 -30.09193 99 0
#> 2: 89a9012aac7ffff -51.23500 -30.07088 470 0
#> 3: 89a90128a57ffff -51.20862 -30.02042 509 0
#> 4: 89a9012818bffff -51.21647 -30.06414 483 1
#> 5: 89a9012ae33ffff -51.24460 -30.08253 290 0
#> 6: 89a9012b35bffff -51.14161 -30.09408 56 0
setup_r5()
The first step is to build the multimodal transport network used for routing in R5. This is done with the setup_r5
function. This function does two things: (1) downloads/updates a compiled JAR file of R5 and stores it locally in the r5r
package directory for future use; and (2) combines the osm.pbf and gtfs.zip data sets to build a routable network object.
# Indicate the path where OSM and GTFS data are stored
r5r_core <- setup_r5(data_path = data_path, verbose = FALSE)
For fast routing analysis, r5r currently has two core functions: travel_time_matrix
and detailed_itineraries
.
The travel_time_matrix
function is a really simple and fast function to compute travel time estimates between one or multiple origin/destination pairs. The origin/destination input can be either a spatial sf POINT
object, or a data.frame
containing the columns id, lon, lat
. The function also receives as inputs the max walking distance, in meters, and the max trip duration, in minutes. Resulting travel times are also output in minutes.
# set inputs
mode <- c("WALK", "TRANSIT")
max_walk_dist <- 5000
max_trip_duration <- 120
departure_datetime <- as.POSIXct("13-05-2019 14:00:00",
format = "%d-%m-%Y %H:%M:%S")
# calculate a travel time matrix
ttm <- travel_time_matrix(r5r_core = r5r_core,
origins = points,
destinations = points,
mode = mode,
departure_datetime = departure_datetime,
max_walk_dist = max_walk_dist,
max_trip_duration = max_trip_duration,
verbose = FALSE)
head(ttm)
Most routing packages only return the fastest route. A key advantage of the detailed_itineraries
function is that is allows for fast routing analysis while providing multiple alternative routes between origin/destination pairs. The output also brings detailed information for each route alternative at the trip segment level, including the transport mode, waiting times, travel time and distance of each trip segment.
In this example below, we want to know some alternative routes between one origin/destination pair only.
# set inputs
origins <- poi[10,]
destinations <- poi[12,]
mode <- c("WALK", "TRANSIT")
max_walk_dist <- 10000
departure_datetime <- as.POSIXct("13-05-2019 14:00:00",
format = "%d-%m-%Y %H:%M:%S")
# calculate detailed itineraries
dit <- detailed_itineraries(r5r_core = r5r_core,
origins = origins,
destinations = destinations,
mode = mode,
departure_datetime = departure_datetime,
max_walk_dist = max_walk_dist,
shortest_path = FALSE,
verbose = FALSE)
head(dit)
The output is a data.frame sf
object, so we can easily visualize the results.
Static visualization with ggplot2
package: To provide a geographic context for the visualization of the results in ggplot2
, you can also use the street_network_to_sf
function to extract the OSM street network used in the routing.
# extract OSM network
street_net <- street_network_to_sf(r5r_core)
# plot
ggplot() +
geom_sf(data = street_net$edges, color='gray85') +
geom_sf(data = dit, aes(color=mode)) +
facet_wrap(.~option) +
theme_void()
Interactive visualization with mapview
:
mapview(dit, zcol = 'option')
r5r
objects are still allocated to any amount of memory previously set after they are done with their calculations. In order to remove an existing r5r
object and reallocate the memory it had been using, we use the stop_r5
function followed by a call to Java’s garbage collector, as follows:
If you have any suggestions or want to report an error, please visit the package GitHub page.


Manchester City fans react to Kingsley Coman reports
by Tom ProcterSome Manchester City fans have reacted to reports the club could consider replacing Leroy Sane with Kingsley Coman.
Sky Sports report the Citizens are eyeing the Frenchman in case Sane departs for Bayern Munich next summer ‘as expected’.
The injured 23-year-old’s current deal runs out in the summer of 2021, and the club appear to have had difficulty tieing him down to a new contract.
Sane has regularly been linked with a move to German champions Bayern, after failing to nail down a regular starting role under Pep Guardiola at the Etihad Stadium.
Coman has been with Bayern since 2015, spending two seasons on loan at the Allianz before making a €28 million / £24 million permanent move from Juventus in 2017 (Goal).
The star has won league titles in France, Italy and Germany, and also has several domestic cups to his name.
For Bayern so far, he has scored 28 goals in 139 appearances.
City fans react
Sane is hugely popular with the City fans, and so many were less than keen about the idea of him being replaced by Coman, who has a slightly concerning record with injuries:
Have something to tell us about this article?
Let us know


Many Feared Dead As Herdsmen Attack Adamawa
by Olugbenga IgeSuspected herdsmen have killed an unspecified number of people in a fresh attack on a village in Adamawa State, Concise News reports.
It was gathered that the gunmen attacked Shuws-Kala’a village in Hong LGA on Saturday, destroying valuable properties and human lives.
A resident, Sani Ahmed, revealed that the herdsmen have constantly troubled the area since the start of the harvest season.
“This morning the herdsmen attacked and robbed a man who went to the farm to bring home his harvest,” he said.
“He returned and had barely informed the community of what happened to him when we saw them coming from all areas.
“Our local vigilante guys quickly mobilized and put up resistance and were able to repel them.
“Yes, there are casualties on both sides, but I cannot ascertain whether there were fatalities.”


Next: Lists as Sets, Previous: Conses as Lists, Up: Conses as Lists
An association list is a list of conses representing an association of keys with values, where the car of each cons is the key and the cdr is the value associated with that key.
| acons | assoc-if | pairlis | rassoc-if |
| assoc | assoc-if-not | rassoc | rassoc-if-not |
Figure 14–4: Some defined names related to assocation lists.


The Akan people of Ghana frequently name their children after the day of the week they were born and the order in which they were born. These "day names" have further meanings concerning the soul and character of the person. Middle names have considerably more variety and can refer to their birth order, twin status, or an ancestor's middle name. This naming tradition is shared throughout West Africa and the African diaspora. Most Ghanaians have at least one name from this system, even if they also have an English or Christian name. Notable figures with day names include Ghana's first president Kwame Nkrumah and former United Nations Secretary-General.
Curious? I know right 😎
Would you like to know your Akan Name?
Fill in the form below 🖌


Half Life: Alyx announced by Valve as flagship VR title
by Aran SuddiIt was earlier this year when Valve properly entered the VR market itself through its own headset Valve Index, and it marked a sign of things to come. Valve confirmed it would be working on its own VR titles, and the company has made its first announcement regarding those games. This is a big one as for the first time in years a new Half Life game is coming.
Half Life: Alyx has been confirmed as one of Valve’s VR flagship titles.
What do we know about the game’s story? Not much though going by the name it’s likely players will be taking on the role of Alyx Vance, an ally of Gordon Freeman and member of the resistance against the Combine. Apparently, Half-Life: Alyx will be a prequel of sorts instead of a continuation of the story, so this isn’t Half-Life 3. However, that doesn’t mean Valve isn’t working on Half-Life 3. Valve has stated there will be a full reveal of Half-Life: Alyx on Thursday at 10am PT which will be 6pm GMT.
Source: Twitter/ArsTechnica


© 2013, NVIDIA CORPORATION. All rights reserved.
Code and text by Sean Baxter, NVIDIA Research.
(Click here for license. Click here for contact information.)
A high-throughput mergesort that is perfectly load-balanced over all threads. Develops partitioning and scheduling functions that are used throughout these pages. This mergesort is the basis for high-performance segmented and locality sorts that work with structured data (i.e. non-uniformly random).
Sort Keys benchmark from benchmarksort/benchmarksort.cu
Sort keys demonstration from tests/demo.cu
void DemoSortKeys(CudaContext& context) { printf("\n\nSORT KEYS DEMONSTRATION:\n\n"); // Use CudaContext::GenRandom to generate 100 random integers between 0 and // 199. int N = 100; MGPU_MEM(int) data = context.GenRandom<int>(N, 0, 99); printf("Input:\n"); PrintArray(*data, "%4d", 10); // Mergesort keys. MergesortKeys(data->get(), N, mgpu::less<int>(), context); printf("\nSorted output:\n"); PrintArray(*data, "%4d", 10); }
SORT KEYS DEMONSTRATION: Input: 0: 5 95 68 53 4 87 7 93 52 66 10: 9 28 81 6 81 23 72 70 14 19 20: 65 42 51 93 97 14 64 64 80 47 30: 45 43 43 24 82 50 8 90 13 7 40: 17 71 39 61 83 18 80 39 6 27 50: 39 85 52 90 41 61 65 18 62 51 60: 29 82 43 35 1 81 98 29 16 17 70: 10 49 37 19 19 86 48 20 33 61 80: 95 87 92 39 5 94 73 16 26 97 90: 42 56 54 59 94 13 41 56 98 55 Sorted output: 0: 1 4 5 5 6 6 7 7 8 9 10: 10 13 13 14 14 16 16 17 17 18 20: 18 19 19 19 20 23 24 26 27 28 30: 29 29 33 35 37 39 39 39 39 41 40: 41 42 42 43 43 43 45 47 48 49 50: 50 51 51 52 52 53 54 55 56 56 60: 59 61 61 61 62 64 64 65 65 66 70: 68 70 71 72 73 80 80 81 81 81 80: 82 82 83 85 86 87 87 90 90 92 90: 93 93 94 94 95 95 97 97 98 98
Sort Pairs benchmark from benchmarksort/benchmarksort.cu
Sort pairs demonstration from tests/demo.cu
void DemoSortPairs(CudaContext& context) { printf("\n\nSORT PAIRS DEMONSTRATION:\n\n"); // Use CudaContext::GenRandom to generate 100 random integers between 0 and // 99. int N = 100; MGPU_MEM(int) keys = context.GenRandom<int>(N, 0, 99); MGPU_MEM(int) vals = context.FillAscending<int>(N, 0, 1); printf("Input keys:\n"); PrintArray(*keys, "%4d", 10); // Mergesort pairs. MergesortPairs(keys->get(), vals->get(), N, mgpu::less<int>(), context); printf("\nSorted keys:\n"); PrintArray(*keys, "%4d", 10); printf("\nSorted values:\n"); PrintArray(*vals, "%4d", 10); }
Input: 0: 30 31 70 12 66 73 53 24 69 82 10: 66 18 17 31 12 88 99 67 17 73 20: 3 6 56 13 88 8 66 0 19 45 30: 36 63 46 52 98 49 15 33 85 25 40: 64 23 37 17 19 59 42 72 48 87 50: 12 70 58 23 22 47 38 1 58 74 60: 25 65 29 7 61 47 26 99 82 53 70: 98 89 73 77 34 20 58 90 10 37 80: 90 84 87 32 81 32 26 65 59 58 90: 2 4 42 76 31 49 16 48 17 42 Sorted keys: 0: 0 1 2 3 4 6 7 8 10 12 10: 12 12 13 15 16 17 17 17 17 18 20: 19 19 20 22 23 23 24 25 25 26 30: 26 29 30 31 31 31 32 32 33 34 40: 36 37 37 38 42 42 42 45 46 47 50: 47 48 48 49 49 52 53 53 56 58 60: 58 58 58 59 59 61 63 64 65 65 70: 66 66 66 67 69 70 70 72 73 73 80: 73 74 76 77 81 82 82 84 85 87 90: 87 88 88 89 90 90 98 98 99 99 Sorted values: 0: 27 57 90 20 91 21 63 25 78 3 10: 14 50 23 36 96 12 18 43 98 11 20: 28 44 75 54 41 53 7 39 60 66 30: 86 62 0 1 13 94 83 85 37 74 40: 30 42 79 56 46 92 99 29 32 55 50: 65 48 97 35 95 33 6 69 22 52 60: 58 76 89 45 88 64 31 40 61 87 70: 4 10 26 17 8 2 51 47 5 19 80: 72 59 93 73 84 9 68 81 38 49 90: 82 15 24 71 77 80 34 70 16 67
//////////////////////////////////////////////////////////////////////////////// // kernels/mergesort.cuh // MergesortKeys sorts data_global using comparator Comp. // If !comp(b, a), then a comes before b in the output. The data is sorted // in-place. template<typename T, typename Comp> MGPU_HOST void MergesortKeys(T* data_global, int count, Comp comp, CudaContext& context); // MergesortKeys specialized with Comp = mgpu::less<T>. template<typename T> MGPU_HOST void MergesortKeys(T* data_global, int count, CudaContext& context); // MergesortPairs sorts data by key, copying data. This corresponds to // sort_by_key in Thrust. template<typename KeyType, typename ValType, typename Comp> MGPU_HOST void MergesortPairs(KeyType* keys_global, ValType* values_global, int count, Comp comp, CudaContext& context); // MergesortPairs specialized with Comp = mgpu::less<KeyType>. template<typename KeyType, typename ValType> MGPU_HOST void MergesortPairs(KeyType* keys_global, ValType* values_global, int count, CudaContext& context); // MergesortIndices is like MergesortPairs where values_global is treated as // if initialized with integers (0 ... count - 1). template<typename KeyType, typename Comp> MGPU_HOST void MergesortIndices(KeyType* keys_global, int* values_global, int count, Comp comp, CudaContext& context); // MergesortIndices specialized with Comp = mgpu::less<KeyType>. template<typename KeyType> MGPU_HOST void MergesortIndices(KeyType* keys_global, int* values_global, int count, CudaContext& context);
Mergesort recursively merges sorted lists until the sequence is fully sorted.
Input array is treated as sequence of sorted lists of length 1: 13 90 83 12 96 91 22 63 30 9 54 27 18 54 99 95 Merge adjacent pairs of length-1 lists into sequence of length-2 lists: 13 90 12 83 91 96 22 63 9 30 27 54 18 54 95 99 Merge adjacent pairs of length-2 lists into sequence of length-4 lists: 12 13 83 90 22 63 91 96 9 27 30 54 18 54 95 99 Merge adjacent pairs of length-4 lists into sequence of length-8 lists: 12 13 22 63 83 90 91 96 9 18 27 30 54 54 95 99 Merge adjacent pairs of length-8 lists into final length-16 output: 9 12 13 18 22 27 30 54 54 63 83 90 91 95 96 99
Although mergesort takes one unsorted array as in input, thematically it is the same as the functions that make up the bulk of MGPU: take two sorted inputs and emit one sorted output. This is clear if treat consecutive input elements as two sorted lists of length 1. Mergesort is type of multi-pass vectorized merge: the first iteration executes N / 2 merges with inputs of length 1; the second iteration executes N / 4 merges with inputs of length 2; etc.
The number of batched merge passes is log(N) and the work per pass is N. This O(N log N) work-efficiency hurts mergesort's scalability compared to radix sort. This mergesort implementation runs at about half the throughput on large arrays with 32-bit keys as the fastest GPU radix sorts. But it still clocks about 100x faster than calling std::stable_sort on an i7 Sandy Bridge. If the sort is truly on a critical path, it may be worth pulling a radix sort from B40C/FastSortSm20. Otherwise you can get by just fine with this very hackable mergesort, or use one of MGPU's higher-performance derivative sorts (segmented sort or locality sort).
O(N log N) complexity aside, mergesort has some notable advantages over radix sort:
Mergesort is a comparison sort. While radix sort requires types to have the same lexicographical order as integers, limiting practical use to numeric types like ints and floats, mergesort accepts a user-defined comparator function. This allows mergesort to efficiently handle types like strings by calling strcmp
from the comparator.
Mergesort scales better as keys get larger. Radix sort's work-efficiency is O(k N), where k is the key size in bits. Mergesort's complexity is only dependent on the number of input elements.
Mergesort provides extremely fast CTA-level blocksorts. On small inputs (like data mapped into an individual tile) the O(log N) penalty is on order with radix sort's O(k) penalty. Mergesort's simpler, faster inner loop allows blocksorts that are more flexible, easier to maintain, and often quicker than radix blocksorts.
Mergesort makes data progressively more sorted, never less. Even when launched on fully-sorted inputs, LSB radix sort randomly scatters data each pass, only putting the data into sorted order during the final pass. On fully sorted inputs, mergesort simply copies the data log(N) times. This pass-to-pass coherence allows detection of sorted intervals and early-exits to reduce unnecessary work. The O(N log N) complexity is only for uniform random inputs—data with exploitable structure can be sorted with far fewer comparisons. The next page builds special-case mergesorts that detect input structure and early-exit out of unnecessary operations.
Mergesort on GPU runs best when written in two distinct stages:
A blocksort kernel sorts random inputs into tile-length sorted lists, communicating with low-latency, high-bandwidth shared memory .The CTA blocksort forms a convenient re-usable component for MGPU's customers.
Multiple launches of MGPU Merge iteratively merge sorted lists, starting with the output of 1, communicating between passes with high-latency, high-capacity DRAM.
Mergesort merge pass with coop = 2
Mergesort merge pass with coop = 4
Both the blocksort and global merge passes follow the structure illustrated above. Pairs of threads (or CTAs for the global merge passes) cooperatively merge two VT-length lists (or two NV-length lists) into one list. This phase is noted coop = 2
, for 2 threads cooperating on each pair of input lists. During the coop = 4
pass, 4 threads cooperatively merge two lists into one; during coop = 8
, 8 threads cooperatively merge two lists; and so on. Although there are many sorted lists in the data, threads cooperatively merge from only two of them at a time.
The figure at the top shows 16 sorted lists (each segment along the top and right of a square is a list). Two threads cooperate to merge each pair of lists (a square) into a single list (a segment) for the coop = 4
pass. Threads 0 and 1 merge the top and right segments of the first pair in coop = 2
into the top segment of the first pair in coop = 4
; threads 2 and 3 merge the top and right segments of the second pair in coop = 2
into the right segment of the first pair in coop = 4
; etc. This process continues until only a single sorted list remains.
For each global merge pass, a call to MergePathPartitions
partitions the input arrays into tile-sized chunks. ComputeMergeRange
is invoked early in KernelMerge
to identify the intervals of the input to load. We then hand the intra-CTA merging to DeviceMerge
, developed in the previous page.
MGPU's blocksort loads VT values per thread over NT threads per CTA. Merging requires dynamic indexing, which means shared memory. The first few rounds of merges can be replaced by an in-register sorting network. Batcher's odd-even mergesort sorts inputs in O(n log2 n time) using only comparisons and swaps. The odd-even transposition sort takes O(n2) comparisons but adds stability. These sorting networks are relatively inefficient, but expose great amounts of immediate parallelism, making them effective tools for sorting small inputs.
Although MGPU includes an implementation for Batcher's odd-even mergesort (in sortnetwork.cuh), the slower odd-even transposition sort is preferred, because it is stable. It takes more comparisons to sort a thread using this network, but the cost is small compared to the cost of the many recursive merge passes that follow.
13 90 83 12 96 91 22 63 30 9 54 27 18 54 99 95 (13 90) (12 83) (91 96) (22 63) ( 9 30) (27 54) (18 54) (95 99) (12 90) (83 91) (22 96) ( 9 63) (27 30) (18 54) (54 95) (12 13) (83 90) (22 91) ( 9 96) (27 63) (18 30) (54 54) (95 99) (13 83) (22 90) ( 9 91) (27 96) (18 63) (30 54) (54 95) (12 13) (22 83) ( 9 90) (27 91) (18 96) (30 63) (54 54) (95 99) (13 22) ( 9 83) (27 90) (18 91) (30 96) (54 63) (54 95) (12 13) ( 9 22) (27 83) (18 90) (30 91) (54 96) (54 63) (95 99) ( 9 13) (22 27) (18 83) (30 90) (54 91) (54 96) (63 95) ( 9 12) (13 22) (18 27) (30 83) (54 90) (54 91) (63 96) (95 99) (12 13) (18 22) (27 30) (54 83) (54 90) (63 91) (95 96) ( 9 12) (13 18) (22 27) (30 54) (54 83) (63 90) (91 95) (96 99) (12 13) (18 22) (27 30) (54 54) (63 83) (90 91) (95 96) ( 9 12) (13 18) (22 27) (30 54) (54 63) (83 90) (91 95) (96 99) (12 13) (18 22) (27 30) (54 54) (63 83) (90 91) (95 96) ( 9 12) (13 18) (22 27) (30 54) (54 63) (83 90) (91 95) (96 99) (12 13) (18 22) (27 30) (54 54) (63 83) (90 91) (95 96) 9 12 13 18 22 27 30 54 54 63 83 90 91 95 96 99
Sorting an array of N inputs needs N transposition passes. Stability is gained by only comparing pairs of neighboring elements, and only exchanging when the element on the right is smaller. 16 inputs are sorted in this illustration. Pairs starting at offset 0 are compared and swapped on even passes; pairs starting at offset 1 are compared and swapped on odd passes. Items in the same pair are drawn in the same color - observe that the second pair of values (83, 12) are swapped into (12, 83) during the first pass. The small 9 that starts in the middle is moved peristaltically to the front of the array.
We get the problem started by loading and transposing VT elements per thread into register, so that each thread has items VT * tid + i in register. Each thread calls OddEvenTransposeSort
to sort its own set of elements in register. This phase of the blocksort uses no shared memory and has high ILP (all of the compare-and-swaps in each row can be performed in parallel).
include/device/sortnetwork.cuh
template<int VT, typename T, typename V, typename Comp> MGPU_DEVICE void OddEvenTransposeSort(T* keys, V* values, Comp comp) { #pragma unroll for(int level = 0; level < VT; ++level) { #pragma unroll for(int i = 1 & level; i < VT - 1; i += 2) { if(comp(keys[i + 1], keys[i])) { mgpu::swap(keys[i], keys[i + 1]); mgpu::swap(values[i], values[i + 1]); } } } }
Odd-even transposition sort has two nested loops: the outer iterates over the number of inputs (each row in the figure); the inner iterates over the number of pairs, as shown above. Unfortunately CUDA's #pragma unroll
feature still has some kinks, and the compiler currently fails to unroll all the static indexing when the function is written this way. Spills result.
include/device/sortnetwork.cuh
template<int I, int VT> struct OddEvenTransposeSortT { // Sort segments marked by head flags. If the head flag between i and i + 1 // is set (so that (2<< i) & flags is true), the values belong to different // segments and are not swapped. template<typename K, typename V, typename Comp> static MGPU_DEVICE void Sort(K* keys, V* values, int flags, Comp comp) { #pragma unroll for(int i = 1 & I; i < VT - 1; i += 2) if((0 == ((2<< i) & flags)) && comp(keys[i + 1], keys[i])) { mgpu::swap(keys[i], keys[i + 1]); mgpu::swap(values[i], values[i + 1]); } OddEvenTransposeSortT<I + 1, VT>::Sort(keys, values, flags, comp); } }; template<int I> struct OddEvenTransposeSortT<I, I> { template<typename K, typename V, typename Comp> static MGPU_DEVICE void Sort(K* keys, V* values, int flags, Comp comp) { } }; template<int VT, typename K, typename V, typename Comp> MGPU_DEVICE void OddEvenTransposeSort(K* keys, V* values, Comp comp) { OddEvenTransposeSortT<0, VT>::Sort(keys, values, 0, comp); } template<int VT, typename K, typename V, typename Comp> MGPU_DEVICE void OddEvenTransposeSortFlags(K* keys, V* values, int flags, Comp comp) { OddEvenTransposeSortT<0, VT>::Sort(keys, values, flags, comp); }
We bend to pragmatism and write the code like this. Template loop unrolling replaces the #pragma unroll
nesting, allowing the sorting network to compile correctly. This implementation takes a bitfield of segment head flags to support the segmented sort (we'll revisit this part on the next page). For standard mergesort, the bitfield is always 0 and the associated logic is eliminated by the compiler.
template<int NT, int VT, bool HasValues, typename KeyType, typename ValType, typename Comp> MGPU_DEVICE void CTAMergesort(KeyType threadKeys[VT], ValType threadValues[VT], KeyType* keys_shared, ValType* values_shared, int count, int tid, Comp comp) { // Stable sort the keys in the thread. if(VT * tid < count) OddEvenTransposeSort<VT>(threadKeys, threadValues, comp); // Store the locally sorted keys into shared memory. DeviceThreadToShared<VT>(threadKeys, tid, keys_shared); // Recursively merge lists until the entire CTA is sorted. DeviceBlocksortLoop<NT, VT, HasValues>(threadValues, keys_shared, values_shared, tid, count, comp); }
CTAMergesort
is a reusable block-level mergesort. MGPU uses this function for the locality sort function in addition to standard mergesort. If the user wants to only sort keys, set HasValues
to false and ValType
to int. Use this function by passing unsorted keys and values in thread order (i.e. VT * tid + i) through register. On return, the same register arrays contain fully-sorted data. Shared memory is also filled with the sorted keys, making coalesced stores back to global memory convenient.
When sorting a partial tile, pad out the last valid thread (the last thread in the CTA with with in-range values) with copies of the largest key in that thread. The actual mergesort can handle partial blocks just fine: this padding helps keep the sorting network simple. (We only specialize the sorting network for one size, VT.)
After running the intra-thread sorting network we need to recursively merge sorted lists. Start with pairs of threads cooperating on one destination. Call this pass coop = 2
, because two threads cooperate on each output list. As the list size doubles, so does the number of cooperating threads per list. We loop until only a single sorted list remains.
template<int NT, int VT, bool HasValues, typename KeyType, typename ValType, typename Comp> MGPU_DEVICE void CTABlocksortLoop(ValType threadValues[VT], KeyType* keys_shared, ValType* values_shared, int tid, int count, Comp comp) { #pragma unroll for(int coop = 2; coop <= NT; coop *= 2) { int indices[VT]; KeyType keys[VT]; CTABlocksortPass<NT, VT>(keys_shared, tid, count, coop, keys, indices, comp); if(HasValues) { // Exchange the values through shared memory. DeviceThreadToShared<VT>(threadValues, tid, values_shared); DeviceGather<NT, VT>(NT * VT, values_shared, indices, tid, threadValues); } // Store results in shared memory in sorted order. DeviceThreadToShared<VT>(keys, tid, keys_shared); } }
CTABlocksortLoop
is called with keys sorted into VT-length lists in shared memory. Values are passed in thread order in register (threadValues
). Log(NT) loop iterations are made. CTABlocksortPass
returns merged keys and indices in register. With the merged keys in safely in register, the function writes back the new lists with DDeviceThreadToShared
. It gathers them back into register with DeviceGather
.
Note that we only have the input or output data staged in shared memory at any one time, not both. MGPU Mergesort is fast because it intelligently manages occupancy this way.
template<int NT, int VT, typename T, typename Comp> MGPU_DEVICE void CTABlocksortPass(T* keys_shared, int tid, int count, int coop, T* keys, int* indices, Comp comp) { int list = ~(coop - 1) & tid; int diag = min(count, VT * ((coop - 1) & tid)); int start = VT * list; int a0 = min(count, start); int b0 = min(count, start + VT * (coop / 2)); int b1 = min(count, start + VT * coop); int p = MergePath<MgpuBoundsLower>(keys_shared + a0, b0 - a0, keys_shared + b0, b1 - b0, diag, comp); SerialMerge<VT, true>(keys_shared, a0 + p, b0, b0 + diag - p, b1, keys, indices, comp); }
Locating each thread's pair of source lists, destination list, and position within the output is the first task of the vectorized merge function CTABlocksortPass
. ~(coop - 1) & tid
masks out the bits that position each thread's cross-diagonal within the destination list. This expression serves as a scaled destination list index and is mulitplied by VT to target the start of the A list in shared memory. The expression VT * ((coop - 1) & tid
) locates each thread's cross-diagonal in the local coordinate system of the output list.
NT = 8, VT = 7, count = 49 (full tile) tid coop = 2 coop = 4 coop = 8 0: A=( 0, 7),B=( 7, 14),d= 0 A=( 0, 14),B=(14, 28),d= 0 A=( 0, 28),B=(28, 56),d= 0 1: A=( 0, 7),B=( 7, 14),d= 7 A=( 0, 14),B=(14, 28),d= 7 A=( 0, 28),B=(28, 56),d= 7 2: A=(14, 21),B=(21, 28),d= 0 A=( 0, 14),B=(14, 28),d=14 A=( 0, 28),B=(28, 56),d=14 3: A=(14, 21),B=(21, 28),d= 7 A=( 0, 14),B=(14, 28),d=21 A=( 0, 28),B=(28, 56),d=21 4: A=(28, 35),B=(35, 42),d= 0 A=(28, 42),B=(42, 56),d= 0 A=( 0, 28),B=(28, 56),d=28 5: A=(28, 35),B=(35, 42),d= 7 A=(28, 42),B=(42, 56),d= 7 A=( 0, 28),B=(28, 56),d=35 6: A=(42, 49),B=(49, 56),d= 0 A=(28, 42),B=(42, 56),d=14 A=( 0, 28),B=(28, 56),d=42 7: A=(42, 49),B=(49, 56),d= 7 A=(28, 42),B=(42, 56),d=21 A=( 0, 28),B=(28, 56),d=49
These intervals illustrate all blocksort passes for a full tile with 8 threads and 7 values per thread. You can work them out using the bit-twiddling described above. The length of the cross-diagonal in a Merge Path search is constrained by the length of the shorter of the two input arrays. The cross-diagonal length doubles each iteration: 7, 14, 28... Correspondingly the depth (and cost) of the binary search increments as we progress in the mergesort: 3, 4, 5... This simple iterative approach to blocksort perfectly load balances scheduling and merging work over the CTA.
After the blocksort we have NV-length lists sorted in global memory. We recursively run a merge on pairs of lists until the entire array is sorted. Just like the CTA mergesort uses code from our CTA-level merge, the global mergesort uses code from the global merge.
// Returns (offset of a, offset of b, length of list). MGPU_HOST_DEVICE int3 FindMergesortFrame(int coop, int block, int nv) { // coop is the number of CTAs or threads cooperating to merge two lists into // one. We round block down to the first CTA's ID that is working on this // merge. int start = ~(coop - 1) & block; int size = nv * (coop>> 1); return make_int3(nv * start, nv * start + size, size); } // Returns (a0, a1, b0, b1) into mergesort input lists between mp0 and mp1. MGPU_HOST_DEVICE int4 FindMergesortInterval(int3 frame, int coop, int block, int nv, int count, int mp0, int mp1) { // Locate diag from the start of the A sublist. int diag = nv * block - frame.x; int a0 = frame.x + mp0; int a1 = min(count, frame.x + mp1); int b0 = min(count, frame.y + diag - mp0); int b1 = min(count, frame.y + diag + nv - mp1); // The end partition of the last block for each merge operation is computed // and stored as the begin partition for the subsequent merge. i.e. it is // the same partition but in the wrong coordinate system, so its 0 when it // should be listSize. Correct that by checking if this is the last block // in this merge operation. if(coop - 1 == ((coop - 1) & block)) { a1 = min(count, frame.x + frame.z); b1 = min(count, frame.y + frame.z); } return make_int4(a0, a1, b0, b1); }
For clarity and maintainability, we factor out mergesort's list-making logic into FindMergesortFrame
and FindMergesortInterval
. The former finds the start of the A list by masking out the bits below coop
and multiplying by the grain size (either NV, or VT, depending on context). The latter function uses the intersections of the cross-diagonals with the Merge Path to calculate a CTA's or thread's input range within the provided A and B lists.
MGPU_HOST_DEVICE int4 ComputeMergeRange(int aCount, int bCount, int block, int coop, int NV, const int* mp_global) { // Load the merge paths computed by the partitioning kernel. int mp0 = mp_global[block]; int mp1 = mp_global[block + 1]; int gid = NV * block; // Compute the ranges of the sources in global memory. int4 range; if(coop) { int3 frame = FindMergesortFrame(coop, block, NV); range = FindMergesortInterval(frame, coop, block, NV, aCount, mp0, mp1); } else { range.x = mp0; // a0 range.y = mp1; // a1 range.z = gid - range.x; // b0 range.w = min(aCount + bCount, gid + NV) - range.y; // b1 } return range; }
ComputeMergeRange
is the range-calculating entry point for merge, mergesort, segmented and locality sorts. This is called at the top of those respective kernels, and the A and B input-list intervals are loaded into shared memory. This unified function reduces the number of kernels needed to support this diversity of functionality.
template<typename Tuning, bool HasValues, bool MergeSort, typename KeysIt1, typename KeysIt2, typename KeysIt3, typename ValsIt1, typename ValsIt2, typename ValsIt3, typename Comp> MGPU_LAUNCH_BOUNDS void KernelMerge(KeysIt1 aKeys_global, ValsIt1 aVals_global, int aCount, KeysIt2 bKeys_global, ValsIt2 bVals_global, int bCount, const int* mp_global, int coop, KeysIt3 keys_global, ValsIt3 vals_global, Comp comp) { typedef MGPU_LAUNCH_PARAMS Params; typedef typename std::iterator_traits<KeysIt1>::value_type KeyType; typedef typename std::iterator_traits<ValsIt1>::value_type ValType; const int NT = Params::NT; const int VT = Params::VT; const int NV = NT * VT; union Shared { KeyType keys[NT * (VT + 1)]; int indices[NV]; }; __shared__ Shared shared; int tid = threadIdx.x; int block = blockIdx.x; int4 range = ComputeMergeRange(aCount, bCount, block, coop, NT * VT, mp_global); DeviceMerge<NT, VT, HasValues>(aKeys_global, aVals_global, bKeys_global, bVals_global, tid, block, range, shared.keys, shared.indices, keys_global, vals_global, comp); }
KernelMerge
is called by both the Merge and Mergesort host functions. Mergesort is considerably more involved, but this complexity has been factored out into ComputeMergeRange
, allowing the heavy lifting for both functions to be defined by DeviceMerge
. Note that the keys and indices are unioned in shared memory, so as to not waste resources. This is an idiom used throughput Modern GPU, and an important one to follow if your goal is high throughput.
template<int NT, MgpuBounds Bounds, typename It1, typename It2, typename Comp> __global__ void KernelMergePartition(It1 a_global, int aCount, It2 b_global, int bCount, int nv, int coop, int* mp_global, int numSearches, Comp comp) { int partition = NT * blockIdx.x + threadIdx.x; if(partition < numSearches) { int a0 = 0, b0 = 0; int gid = nv * partition; if(coop) { int3 frame = FindMergesortFrame(coop, partition, nv); a0 = frame.x; b0 = min(aCount, frame.y); bCount = min(aCount, frame.y + frame.z) - b0; aCount = min(aCount, frame.x + frame.z) - a0; // Put the cross-diagonal into the coordinate system of the input // lists. gid -= a0; } int mp = MergePath<Bounds>(a_global + a0, aCount, b_global + b0, bCount, min(gid, aCount + bCount), comp); mp_global[partition] = mp; } } template<MgpuBounds Bounds, typename It1, typename It2, typename Comp> MGPU_MEM(int) MergePathPartitions(It1 a_global, int aCount, It2 b_global, int bCount, int nv, int coop, Comp comp, CudaContext& context) { const int NT = 64; int numPartitions = MGPU_DIV_UP(aCount + bCount, nv); int numPartitionBlocks = MGPU_DIV_UP(numPartitions + 1, NT); MGPU_MEM(int) partitionsDevice = context.Malloc<int>(numPartitions + 1); KernelMergePartition<T, Bounds> <<<numPartitionBlocks, NT, 0, context.Stream()>>>(a_global, aCount, b_global, bCount, nv, coop, partitionsDevice->get(), numPartitions + 1, comp); return partitionsDevice; }
KernelMergePartition
performs coarse-granularity partitioning for both MGPU Merge and Mergesort. It fills out the mp_global
Merge Path/cross-diagonal intersections that are consumed by ComputeMergeRange
. This is a simple and efficient division of labor—coarse-grained scheduling is achieved by first calling MergePathPartitions
to fill out mp_global
, which is subsequently provided to ComputeMergeRange
in an algorithm's kernel.
The MergePathPartitions
function is central to the MGPU library. The argument nv
is the granularity of the partition and typically is set to the number of values per CTA, NV
, a product of LaunchBoxVT
parameters VT and NT, and a template argument for most of MGPU's kernels. coop
is the number of CTAs cooperating to merge pairs of sorted lists in the mergesort routine—this is non-zero for all other functions (like merge, vectorized sorted search, etc.).
The list of callers of MergePathPartitions
is extensive:
Bulk Insert. Bulk Remove uses a standard binary search for global partitioning.
Vectorized sorted search calls both the lower- and upper-bound specializations of MergePathPartitions
.
Load-balancing search calls the upper-bound function and only specializes on integer types. Additionally, all load-balancing search clients use MergePathPartitions indirectly:
Other methods don't call MergePathPartitions
, but still opt into this two-phase scheduling and sequential-work approach:
The high-performance segmented and locality sorts of the next section fuse coarse-grained partitioning with work queueing, exploiting the sortedness of inputs to reduce processing.
MGPU Multisets introduce a new partitioning search called Balanced Path which incorporates duplicate ranking into key ordering. Four serial set functions, modeled after SerialMerge
, perform C++-style set intersection, union, difference, and symmetric difference.
Mergesort is a multi-pass, out-of-place algorithm. The blocksort reduces global memory traffic by sorting blocks of NV elements locally, performing key exchange through low-latency shared memory. Subsequent global merge passes recursively doubles the length of sorted lists, from NV to 2*NV to 4*NV, etc., until the input is fully sorted.
template<typename T, typename Comp> MGPU_HOST void MergesortKeys(T* data_global, int count, Comp comp, CudaContext& context) { const int NT = 256; const int VT = 7; typedef LaunchBoxVT<NT, VT> Tuning; int2 launch = Tuning::GetLaunchParams(context); const int NV = launch.x * launch.y; int numBlocks = MGPU_DIV_UP(count, NV); int numPasses = FindLog2(numBlocks, true); MGPU_MEM(T) destDevice = context.Malloc<T>(count); T* source = data_global; T* dest = destDevice->get(); KernelBlocksort<Tuning, false> <<<numBlocks, launch.x, 0, context.Stream()>>>(source, (const int*)0, count, (1 & numPasses) ? dest : source, (int*)0, comp); if(1 & numPasses) std::swap(source, dest); for(int pass = 0; pass < numPasses; ++pass) { int coop = 2<< pass; MGPU_MEM(int) partitionsDevice = MergePathPartitions<MgpuBoundsLower>( source, count, source, 0, NV, coop, comp, context); KernelMerge<Tuning, false, true> <<<numBlocks, launch.x, 0, context.Stream()>>>(source, (const int*)0, count, source, (const int*)0, 0, partitionsDevice->get(), coop, dest, (int*)0, comp); std::swap(dest, source); } }
We allocate a temporary buffer to ping-pong mergesort passes. The number of global passes is the ceil of log2 of the tile count. As the user expects results sorted in-place in data_global
, we blocksort into data_global
if numPasses
is even and blocksort into the temporary if numPasses
is odd. This way, sorted data always lands in data_global
after the final merge pass without requiring an additional copy.
The mergesort host function has the same macro structure as CTABlocksortLoop
: it loops from coop = 2
to coop = numBlocks
(NT in blocksort). MergePathPartitions
searches global memory to find the intersection of cross-diagonals and Merge Paths, as identified by the utility function FindMergesortFrame
.
Idiomatic GPU codes often have this coarse-grained/fine-grained paired structure: coarse-grained partitioning and scheduling operates on the full input in global memory; fine-grained partitioning and scheduling operates on local tiles in shared memory. This simple two-level hierarchy has algorithmic benefits: the bulk of partitioning operations are run over small, constant-sized blocks, helping amortize the cost of global partitioning. We also see architecutral benefits: performing most data movement within CTAs rather than between them reduces latency and improves the throughput of kernels.


Control the Magic!
show news Hide news Turn off Show Tasks Hide Tasks Reboot Show Train Hide Train Sleep Wake up
Show Hide Next article previous article
Show Hide
Left Right


Search
Preparing search index...
The search index is not available
RGAC
Options
All
Public
Public/Protected
All
Inherited
Externals
Menu
Globals
MatchDto
Interface MatchDto
Hierarchy
MatchDto
Implemented by
Match
Index
Properties
game
Creation
game
Duration
game
Id
game
Mode
game
Type
game
Version
map
Id
participant
Identities
participants
queue
Id
season
Id
teams
Properties
game
Creation
game
Creation
:
number
game
Duration
game
Duration
:
number
game
Id
game
Id
:
number
game
Mode
game
Mode
:
GameMode
game
Type
game
Type
:
GameType
game
Version
game
Version
:
string
map
Id
map
Id
:
Map
participant
Identities
participant
Identities
:
ParticipantIdentityDto
[]
participants
participants
:
ParticipantDto
[]
queue
Id
queue
Id
:
GameQueue
season
Id
season
Id
:
Season
teams
teams
:
TeamStatsDto
[]
Globals
Match
Dto
game
Creation
game
Duration
game
Id
game
Mode
game
Type
game
Version
map
Id
participant
Identities
participants
queue
Id
season
Id
teams
Generated using
TypeDoc


这个题总感觉有点小错误，因为一个可以放的位置可以放，也可以不放，但是这样是WA的。。。。。
| Don’t Get Rooked |
In chess, the rook is a piece that can move any number of
squares vertically or horizontally. In this problem we will
consider small chess boards (at most 4
contain walls through which rooks cannot move. The goal is to place
as many rooks on a board as possible so that no two can capture
each other. A configuration of rooks is legal
provided that no two rooks are on the same horizontal row or
vertical column unless there is at least one wall separating
them.
The following image shows five pictures of the same board. The
first picture is the empty board, the second and third pictures
show legal configurations, and the fourth and fifth pictures show
illegal configurations. For this board, the maximum number of rooks
in a legal configuration is 5; the second picture shows one way to
do it, but there are several other ways.
Your task is to write a program that, given a description of a
board, calculates the maximum number of rooks that can be placed on
the board in a legal configuration.
Input
The input file contains one or more board descriptions, followed by
a line containing the number 0 that signals the end of the file.
Each board description begins with a line containing a positive
integer n that is the size of the board;
n will be at most 4. The next n lines
each describe one row of the board, with a `.‘ indicating
an open space and an uppercase `X‘ indicating a wall.
There are no spaces in the input file.
Output
For each test case, output one line containing the maximum number
of rooks that can be placed on the board in a legal configuration.
Sample
Input
4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
1
.
1
X
2
X.
.X
0
Sample
Output
5
1
5
2
4
1
0
2


"The technology is my passion", "I love to develop" and things like these can be said by anyone. But just few of them are really going deeper into a technology, to understand really how it does work.
This is how I am: analysing the requirements, searching the best technology to achieve the objective, studying and finally implementing a high-quality solution.
In my philosophy these steps are all equally important. If you don't understand the problem, you are not able to recognise the best technology to solve it. If you don't find the technology, the solution will be wrong and the quality poor.
Of course everything done in strong collaboration with all other team members, because every question and point of view is interesting and gives a bit of improvement.
Keeping this in mind, I am always available to learn something, to try alternative solutions, to suggest something different.
Experience
since Apr 2019
Swissblock Technologies
Zug | Switzerland
Software engineer
I am responsible for the entire cloud infrastructure, deployed on Kubernetes inside the Google Cloud Platform (GCP), including all deployed systems: monitoring (e.g. Prometheus and Grafana), logging (e.g. EFK stack), databases (e.g. Apache Cassandra), brokers (e.g. Apache Kafka), security (e.g. Vault), networking (e.g. Calico) others.
I am also responsible of a development domain, mainly written in Golang.
I work constantly keeping in mind DevOps principles and best practices, without losing sight of the business goal.
since Jun 2018
MB SOLID Consulting
Zurich | Switzerland
Freelance Cloud Solution Architect
I help my customers building innovative cloud-native solutions, well integrated with existing legacy.
I also advocate cloud-native technologies during meetups, conferences and local techy groups.
Dec 2016 > May 2018
foryouandyourcustomers AG
Zurich | Switzerland
Software Architect and Developer
I work in close contact with customers satisfying their business requirements and realizing new technical commerce solutions.
I keep also myself up to date on new technologies such as new architectures (microservices) and containerization.
Oct 2015 > Nov 2016
webtiser AG
Zurich | Switzerland
Technical Team Leader
My tasks go from approaching the most difficult issues in a project, identifying best technical and architectural solutions, being up-to-date on new hybris features and other technologies, up to mentoring and leading other developers.
Mar 2014 > Sep 2015
A.S. Watson Group Europe
Milan | Italy
hybris Senior Analyst and Developer
My tasks go from approaching problems, identifying technical solutions, up to develop them.
I design and develop new complex features of project, starting from back-end arriving to expose functionalities on front-end.
These features are both commercial and technical. I am also working on Index Engine optimization and deploying new releases.
Mar 2012 > Feb 2014
Techedge Group S.p.A.
Milan | Italy
hybris Consultant and Developer
My tasks go from analyzing all the business requirements, up to the technical development of both the architectural system and the infrastructural one.
I work on both back-end and front-end sides, dealing with development of new modules for the communication with other third-party platforms, process management of checkout flow,
catalog management and automation build process.
Certifications
Technology stack
Inspiring books
Soft skills
Excellent willing and enthusiasm to know and explore new technologies.
Ability to relate effectively to colleagues and customers, to work in team, in environments where the communication is essential.
Organisational and managerial skills, not only professionally but also personally. Increased abilities to manage multiple tasks and persons.
Leadership and decision-making capacity in critical situations. Expertise in various fields of Computer Sciences: software design, development, reverse engineering, dev ops. These knowledges have been extended also in personal experience on different projects.
Education
2009 > 2011
Università degli Studi di Milano-Bicocca
Master degree in Computer Science
2005 > 2009
Università degli Studi di Milano-Bicocca
Bachelor degree in Computer Science
2000 > 2005
Liceo Scientifico M. G. Agnesi
Scientific High School Diploma
Language skills
| Written | Verbal | |
|---|---|---|
| ITALIAN | Mother tongue | Mother tongue |
| ENGLISH | Professional user | Professional user |
| GERMAN | Professional user | Professional user |
| SPANISH | Basic user | Basic user |
Personal
Date of birth
GitHub
Area
Interests
27th January 1986
<EMAIL_ADDRESS>bygui86
matteobaiguini
Matteo_Baiguini
Zurich, Switzerland
Travel, photography, sports, technologies, cinema


org.dsngroup.broke
Classes
BrokeWordCount
BrokeWordCount.WordWithCount
MultiClient
MultiClient.PublishClient
MultiClient.SubscribeClient
SamplePublish
SampleSubscribe


Bafana Bafana Beats Sudan In Afcon Qualifiers
by SW EditorBafana Bafana beat Sudan 1-0 in their 2021 Africa Cup of Nations Group C qualifier on Sunday.
Thapelo Morena had the first chance on goal for Bafana but his short-range effort just went wide. In the fourth minute, France-based striker Lebo Mothiba had a chance to opening the scoring but his miss also went wide of goal.
Thulani Serero then tried his chances from outside the box but his long-range effort failed to hit the target. A chance was then created for Mothiba again but he failed to convert from close range.
With frustrating growing from the crowd, Mothiba used fancy footwork to create space for himself within the box; but he took one touch too many as he was eventually crowded out of taking a shot at the target.
In the 20th minute, there was a penalty appeal from Serero, who claimed the ball touched a Sudanese player’s arm in the box, but the referee waved it away.
Having absorbed the early pressure, they showed attacking intent through captain, Ramadan Shareif, who attempted a bicycle kick but Ronwen Williams saved comfortably.
Kamohelo Mokotjo then tried to score from outside the box but his effort is also easily saved by Ali Aboeshren as the game reached the half-hour mark with no goals.
After good footwork from Mothiba again in the 40th minute, Lebogang Phiri had a chance to score – but his effort was blocked by a defender.
Just before halftime, Dean Furman looked to get his name on the score sheet but his long-range effort went wide.
Phiri would eventually make the breakthrough on the stroke of halftime as his left-footed strike broke the deadlock for his first goal in Bafana colours.
Bafana started the second-half stronger with Morena passing in the box but it was cut out before Mothiba could reach it.
In the 66th minute goal scorer Phiri was stretchered off and was replaced by Lebogang Manyama.
Ntseki then went for an all-out attack, as he brought on striker Bradley Grobler and Kermit Erasmus for Mothiba and Serero, respectively.
Grobler then looked like he had doubled Bafana’s lead but his shot in the box was ruled offside. In the end, a solitary goal was all that was needed as SA claimed a 1-0 win for their first victory in Afcon qualifiers.


| "name" |
String |
The player's last name. |
| "ss" |
Array(3) |
Serve Stats. Three numbers, indicating (1) First serve percentage; (2) First serve points won percentage; (3) Second serve points won percentage. |
| "sbd" |
Array(3) |
Serve Box Deuce. Three numbers, indicating percentage of serves aimed wide, central, or down-the-T. Absolute numbers can also be used. |
| "sbdwl" |
Array(6) |
Serve Box Deuce Win-Loss. Six numbers: the absolute number of points for wide serve win/loss, body serve win/loss, T serve win/loss. |
| "sbda" |
Array(3) |
Serve Box Deuce Aces. Three numbers: aces hit on wide, body, T serves on the deuce court. |
| "sba" |
Array(3) |
Serve Box Ad. Same format as sbd. The order here continues from left to right, i.e. T-serves, body serves, wide serves. |
| "sbawl" |
Array(6) |
Serve Box Ad Win-Loss. Same format as sbdwl. Ordered from T to wide, win-loss-win-loss-win-loss. |
| "sbaa" |
Array(3) |
Serve Box Ad Aces. Same format as sbda. Aces hit on T, body, wide serves on the Ad court. |
| "rs" |
Array(2) |
Return Stats. Two numbers: first is percent of returns in play, second is percent of return points won. |
| "rz" |
Array(9) |
Return Zones. Nine numbers indicating zones on the court where returns are hit to. The first three are shallow returns (inside service box), left middle and right. Then mid-depth returns, left middle and right. Then deep returns (last quarter of the court), left middle and right. Absolute numbers or percentages can be used. |
| "gz" |
Array(3) |
Groundstroke Zones. Three numbers, indicating percentage of groundstrokes aimed to the right/forehand corner (assuming righties), middle 40%, and left/backhand corner. Absolute numbers of shots also work. |
| "np" |
Array(2) |
Net Points. Two numbers, net points won, and total net points played. |


[§577E-5] Meetings. The meetings of the commission shall be subject to the requirements of chapter 92. [L 2003, c 156, pt of §2; am L 2005, c 148, §2; ree L 2006, c 232, pt of §1; am L 2007, c 190, §1]


@*
* Copyright 2023 HM Revenue & Customs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*@
@import models._
@import config.ApplicationConfig
@import views.html.helper.form
@import views.ViewUtils.titleBuilder
@this(atedMain: atedMain,
govukBackLink : GovukBackLink,
formHelper: FormWithCSRF,
govukButton: GovukButton)
@(backLink: Option[String])(implicit request: Request[_], authContext: AtedSubscriptionAuthData, messages: Messages, appConfig: ApplicationConfig)
@backLinkHtml = {
@if(backLink.isDefined) {
@govukBackLink(BackLink(
href = backLink.get,
content = Text("Back")
))
}
}
@atedMain(title = titleBuilder(messages("ated.nonUKReg.declaration.title"))) {
@backLinkHtml
@messages("ated.nonUKReg.declaration.header")
@messages("ated.nonUKReg.declaration.before-declaration-text")
@messages("ated.nonUKReg.declaration.i-confirm.text")
@formHelper(action = controllers.nonUKReg.routes.DeclarationController.submit) { @govukButton(Button( content = Text(messages("ated.confirm-and-register")), attributes = Map("id" -> "submit", "type" -> "submit") )) } }


Check out what's included with your
Prime membership.
After your free trial Prime is just $12.99/month.
Cancel anytime. See more plans
Ship
Stream
Shop
Read
More
Stay on top of the
hottest music
These songs and artists are the cream of the this month's crop of
new music. Check out the latest from Taylor Swift, Old Dominion,
Kesha, and Brett Young.


The Cell (2000) Rating: 3.5 stars out of 5.0 stars
See this review as it was intended at: http://www.jaxfilmjournal.com/
Cast: Jennifer Lopez, Vince Vaughn, Vincent D'Onofrio, Marianne Jean-Baptiste, Jake Weber, Dylan Baker, Patrick Bauchau, Gerry Becker, James Gammon, Catherine Sutherland, Jake Thomas, Pruitt Taylor Vince Written by: Mark Protosevich Directed by: Tarsem Singh
Catherine Deane (Jennifer Lopez) is a psychologist who has been hired to participate in a project where she can enter the minds of comatose victims and try to interact with their subconscious in an attempt to wake them up. She has been experiencing moderate success with a young boy in a coma, but the boy's parents aren't happy with the apparent lack of progress and the toll of her job is having adverse affects on her regular life. As if trying to assure the boy's parents wasn't hard enough on her, a new development arises that furthers the strain on Deane's mental faculties.
A vicious serial killer named Carl Stargher (Vincent D'Onofrio) has been kidnapping women, locking them in an automated cell that drowns them slowly in a matter of days, then soaking the corpses in bleach to turn them into life-sized dolls. Just after kidnapping his latest victim and locking her in the cell, Stargher has a traumatic experience that triggers a schizophrenic virus in his brain and causes him to sink in an eternal catatonia. The police, led by FBI agent Peter Novak (Vince Vaughn) are able to locate Stargher by some clues he left while dumping his previous victim's body, but they feel all hope is lost for his current victim due to his vegetative state. In a last ditch attempt, they ask Deane and the scientists that created the project to undergo the frightening task of entering Stargher's mind to try and find the location of the victim locked in the deadly cell... a cell which will completely fill with water in the next 40 hours!
Initial reports about this film described it as a cross between The Silence of the Lambs and The Matrix. While it does share some characteristics with both films (particularly the first forty minutes, which seem almost like a condensed version of Lambs), The Cell also seems to contain elements of Dreamscape and Brainstorm. The buzz around this project is that first-time feature film director Tarsem Singh (who won many awards for his video of R.E.M.'s "Losing My Religion") wanted a script that he could fashion images out of instead of a cohesive story, and a good portion of this film supports that theory.
Despite the borrowed elements from the aforementioned films and a script that contains several logically questionable moments, The Cell does feature some remarkable imagery. All of the sequences where we delve into someone's mind are incredibly beautiful (including the dank mind of Stargher, whose thoughts are reminiscent of an H.R. Giger painting come to life mixed with a Tool music video), proving that Singh is as adept at filming strange and wonderful images as his acclaim would lead us to believe. The first sequence that takes place in Stargher's mind is by far the best, featuring one of the most ingenious traps I've ever seen in a film (involving a horse, which no one seeing this film will probably forget), a zoo-like display of Stargher's victims which are animated like marionettes, and Stargher himself in a giant purple cape that spans the walls of his mental throne room. If the film had continued within this dirty monstrous world I would have deemed the film brilliant, but alas, the sequences only become more silly as they go along (despite a painful nipple ring removal later in the film).
The cast is basically just an excuse for there to be some moderate plot semblance during the parade of images, but at least Vincent D'Onofrio turns in his usual bizarre and psychotic performance (magnified by ten, thanks to the environment in which the film has been placed). In my opinion, D'Onofrio was one of the best creepy actors I have ever seen in a film, but his film choices as of late have been so completely awful (i.e.- The Newton Boys, Feeling Minnesota, The Thirteenth Floor, and The Velocity of Gary) that I have begun to rethink my initial assessment of him. The character of Stargher is an excellent role for him though, and will probably lead to a bit of typecasting for him.
Detractors of violence and disturbing images will want to stay far away from this film, as it contains heavy doses of both. Besides the nipple ring removal I mention above, there is also Stargher's penchant for hanging suspended off of the floor by the rings that pierce his back and legs (prior to his catatonia and capture) which will have audiences recoiling. A sequence where Catherine enters Stargher's mind and finds him recreating the disemboweling of his first victim is also pretty disquieting. One moment also features a character having his intestines slowly removed from his body by an old fashioned hand cranked spit-like device.
As a narrative film, The Cell is sorely lacking. As a collection of images though, The Cell is extremely well done. Although the latter sequences in the film contain fewer disturbing imagery than the first half, Singh has done what he supposedly set out to do: make a film solely for the purpose of stringing some remarkable images together. Unfortunately, a well-written script should have been considered too, because without it The Cell just seems like any other music video we could see on MTV (provided, of course, that MTV allowed for the use of graphic violence and language in music videos).
Reviewed by Brian Matherly -<EMAIL_ADDRESS>AOL Instant Messenger: Widescreen25 The Jacksonville Film Journal - http://www.jaxfilmjournal.com/ -- Chuck Dowling Editor - The Jacksonville Film Journal http://www.jaxfilmjournal.com/
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


This is a paragraph with a link.
This is strong text.
This is emphasized text.
This is small text.
This is an inline quote
.
Aligned to the left.
Centered.
Aligned to the right.
Unordered list:
Ordered list:
Inline code:
git checkout -b dev
Block code:
Function.prototype.method = function(name, func) { this.prototype[name] = func; return this; };
An hr line:
And blockquote:
I would rather be without a state than without a voice. Edward Snowden
Grid system in total has 4 columns. You can use col-1
, col-2
, col-3
and col-4
, but
the sum cannot exceed 4. Always insert col-*
inside row
. You can also use col-offset-*
.
I'm col-1
.
I'm col-3
.
I'm col-2
.
I'm col-1
.
I'm col-1
.
I'm col-2
with col-offset-1
.
Image cannot exceed 100% of its parent (then max-width
is applied). You can insert images in 3 ways:
Use class float-left
or float-right
.
Hi, I'm a text with floated image.
You can also insert videos in your presentation. Remember about right format to support your browser. You can apply same rules for videos as for images.
You've already seen title, section and standard slide. There is also a special slide that you can use to insert important information, joke, question or just to break the flow a bit.
There is Config
variable inside index.html
file. You can edit it to set up some global settings for presentation.


 We use AREPO (Springel 2010) to run the simulation and Matplotlib to create the picture. Click here for more details.
Email yingtianchen.physics__at__gmail__dot__com
Adress 5 Yiheyuan Road, Peking University, Haidian District, Beijing 100871, China
Sitemap ORCID GitHub LinkedIn
Last Modified on Feb. 2020, from © Copyrights Kelvin. All Rights Reserved.


Try and reach the element(s) below using just your keyboard. If you can't, use your mouse.
tabindex
is an interesting attribute. It can be applied to any HTML element (but really shouldn't) in order to allow that element to be focusable and to be abletabindex
comes in a few flavors per the MDN:
tabindex="0"
- this element is focusable and reachable via sequential keyboard navigation, but its relative order is defined by DOM and whatever else is focusable around it.
tabindex="1", tabindex="2", tabindex="3", etc...
- this element is focusable and reachable via sequential keyboard navigation, but its relative order is defined by the increasing order of tabindex
values.
tabindex="-1"
- this element is focusable but NOT reachable via sequential keyboard navigation. This is primarily used when you need to have a non-standard element be focusable for the purposes of Javascript.
tabindex
of 0
. They include: button
, a
, input
, option
, select
and textarea
.tabindex="-1"
or even tabindex="0"
MIGHT be
warrented, but rarely, and there's pretty much never a good reason to use tabindex="positive integer"
. So if you find yourself doing it, stop and think; do you really want to disrupt the actual flow of the DOM?


About Riley
Riley is an IT Professional, a Web Programmer, and a Theatrical Electrician.
Skills and Certifications
- Cisco Certified Entry Network Technician (Verification Avaliable Upon Request)
- SonicWALL and Baracuda Networks
- Windows Server Administration
- General Linux System Administration
- Theatrical Lighting Setup and Teardown
- Ruby on Rails, PHP, HTML, and CSS


I worked with Halfloves, a band based in Iowa City, to create a website in anticipation for their upcoming album. The responsive website incorporates Halfloves' album artwork to ensure consistency in branding.
In fall 2015, I coordinated an online exchange through the International Writing Program that brought together 32 indigenous writers and photographers living in Australia and the United States. The participants created fiction, nonfiction, poetry, and photography centered on the theme of "narrative witness." In spring 2016, I created an online publication utilizing Squarespace to showcase the collected work.
This website was designed for an assignment in MCAD's branding course. Check out my process book!
This old version of my portfolio demonstrates my beginning-level understanding of JavaScript and jQuery.
During my first semester in MCAD's IDM program, I recreated the first season of Serial Podcast's website. The experience was a great introduction to building websites off of a design mockup.
I designed and built this website during my first semester in MCAD's IDM program. Check out these pages: homepage, creative spaces, and the short story "Spring Snow."


So you want to create a template for Barley? Great! Barley templates use nothing more than HTML, CSS and JavaScript. No need to learn any new languages or how a conditional works, just design a static site and we’ll do our best to figure out the rest for you.
There is only one required file to get you up and running, an index.html file. That is the bare minimum to create a Barley template. But we're guessing you are going to want more than just a single page. Each HTML file you add to your site becomes a page on your site. So about.html becomes yoursite.com/about
We've reserved a few HTML filenames for special purposes. You'll find those below.
Although the following folder structure is not required we recommend you following this recommended folder structure. This allows us to help you debug issues when support is needed.
Below is a sample template structure that could be replicated for your own template. If you would like to take a look at some our Barley template files, you can do so by reviewing some of the templates we've open sourced on GitHub.
| Filename | Description |
|---|---|
| index.html | The main page of your template. |
| about.html | An about page for your site. /about/ |
| 404.html | If someone ends up at the wrong URL, this page loads. |
| favicon.ico | Your site's favicon. How about a kitty? Meow! |
Your site is in no way limited to the above. But this is a great place to start. What's next? How about adding a blog to your site, or using Barley to manage new pages, or changing advanced settings?
Barley supports UTF-8. We save all data using this content-type. To ensure that your site is also UTF-8 compatible we ask that you include the following meta tag in-between your opening <head> and closing </head> tags.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
Start Free Trial


Understanding the rate of change of ice shelf thinning and the processes governing change is critical for understanding mass balance and hence the Antarctic ice sheet contribution to sea level rise. Over the period 2003–2008 (~5 years), the Totten Glacier Ice Shelf (TIS) was observed 1 to be lowering at ~0.41 m yr −1. However, extending the observational satellite record to encompass the period 1994–2012 (~18 years) 2 showed that the thickness of the TIS was subject to large periodic 3–4 year fluctuations of approximately ±40 m with almost no net thickness change (within the error bars) over the 18 year period. Further, interannual variation has been detected in surface velocity 3– 5 and the grounding line location is showing change 6. It is not clear how much of the observed temporal change in TIS is as a result of internal glacier-ice shelf dynamics or is in response to variability in ocean-driven basal melting. We have chosen to characterise the part of melt rate variability that arises in response to variability intrinsic to the ocean. This study serves as a necessary basis for understanding and quantifying what fraction of the observed variations in melt rate are independent of natural fluctuations in the climate modes and trends arising from anthropogenic forcing.
Basal melting thermodynamically couples the ocean to the ice shelf system. As a result, ice shelf thickness responds to variability in the nearby ocean system. This variability could be externally forced, for example, by climate change, interannual and multidecadal climate modes, the annual cycle, or tides. In addition, variability could also be generated by the non-linear intrinsic ocean response to forcing, as opposed to the deterministic response from interannual atmospheric forcing. Low-frequency intrinsic ocean variability results from non-linear interactions within the ocean and in response to stochastic-to-seasonal timescale changes in atmospheric forcing 7– 15, in line with the paradigm of Stochastic Climate Models 16, 17. As a result, the ice sheet will exhibit a combined response to both intrinsic and externally forced climate variability.
Observations of basal melting and ice shelf change generally consist of short records which limit the ability to distinguish intrinsic from forced variability. Advances have been made in identifying the ice shelf response to observed low-frequency internal variations in the Southern Hemisphere climate. For example, El Niño-Southern Oscillation (ENSO) has been suggested to drive stronger cross-shelf transport of oceanic heat leading to a lowering of Amundsen Sea ice shelves 18. Conversely, atmospheric hindcast models for 1979–2015 have suggested that ENSO has a statistically non-significant impact on the westerly winds which drive stronger cross-shelf transport 19. This highlights the complex impact that low-frequency climate variations have on ice shelf mass loss. It also emphasises the importance of ensuring that correlations and trends are statistically significant, particularly given the short satellite record relative to the timescale of climate variations like ENSO.
Ocean models can be used to simulate and quantify variability beneath ice shelves. Idealised coupled ice sheet-ocean models subject to periodic variability in oceanic heat content have indicated the ice sheet response is dependent on the forcing periodicity in relation to the ice shelf residence time 20. However, the origin of this periodic forcing and the response of a realistic ice shelf is uncertain.
In this work, we present simulations of the response of basal melting beneath TIS to intrinsic ocean variability (model domain shown in Fig. 1a). We use lateral boundary conditions that contain only intrinsic ocean variability and repeated normal-year atmospheric forcing (Coordinated Ocean ice Reference Experiment version 1; COREv1) 21 to quantify the interannual intrinsic variability that impacts basal melting. Non-linear ocean processes and the response to rapid wind changes produces a significant degree of intrinsic variability in water properties on the continental shelf and thus basal melting beneath TIS. Further simulations compare the basal melt response from only intrinsic variability to the full climate response from 1949 to 2007 (Coordinated Ocean ice Reference Experiment version 2; COREv2) 22 and show that intrinsic ocean variability can produce a similar magnitude response to the interannual climate forcing. These results demonstrate the need to account for the contribution of intrinsic ocean processes in order to correctly detect and attribute ice shelf change.
Modelled TIS basal melting. a Domain and model bathymetry with TIS outlined orange. b Area average melt rate for COREv1 repeated normal-year forcing and COREv2 interannual forcing for 1949–2007. Raw data (light coloured lines) is smoothed with a 1.5-yr filter