"Ghosts of Mars"
It's 175 years into the future and Mars is colonized by over ½ million Earthlings. To ensure order on the pioneer planet terrestrial laws apply and are enforced vigorously by the MPF (Mars Police Force). When an unmanned trained arrives from a far flung mining station, the only one aboard, handcuffed, is Lt. Melanie Ballard (Natasha Henstridge), and she has a horrifying story to tell her superiors in John Carpenter's "Ghosts of Mars."
The lieutenant was second in command on a team sent to bring in James "Desolation" Williams (Ice Cube), the red planet's most notorious criminal. Desolation is being held at Shining Canyon mining station, but when the cops arrive, they find the place deserted except for those held in the fortified confines of the local jail. Commander Helena Braddock (Pam Grier) splits up her crew, sending Ballard and two troopers, Kincaid and Descanso (Clea Duvall and Liam Waite), to locate Williams. Braddock and smart-mouthed Sergeant Jericho (Jason Statham) reconnoiter the compound and find some of the colony's inhabitants - headless corpses hung upside down in a gruesome, ritualistic display.
The cause of the slaughter is soon apparent when Braddock spots the remaining miners, possessed by some force that has rendered them inhuman. Self-mutilation is the norm for these creatures, led by a Marilyn Manson wannabee, Big Daddy Mars (Richard Cetrone), and the creepy critters are out for blood. The beleaguered cops and the few still-human survivors of the colony must battle the vicious monster of Mars until the train that took them into Shining Canyon returns.
"Ghost of Mars" is meat and potatoes filmmaking. John Carpenter is known, of late, for some truly hack work, like "Escape from LA" and the presumptuously titles "John Carpenter's Vampires." With "Ghosts" the helmer works from a script co-written with Larry Sulkis and tells a fairly conventional cops against the bad guys. Setting it on Mars gives it ready-made sci-fi status, but it is, still, a routine survival story.
Natasha Henstridge is not bad as the veteran Mars copper. She is too pretty and well made up for the character and is too Hollywood looking, but she acquits herself with the physical moves required. Ice Cube has done the same sullen tough guy character too many times and, while likable in a punch-you-in-the-face way, it's a carbon copy perf we've seen before. Jason Statham, with his Cockney accent and insouciant ways, makes himself notable and should get more work after "Ghosts of Mars." Blaxploitation icon Pam Grier is, sadly, used up very quickly and loses her head early on. Almost everyone else is alien fodder, including the aliens.
Techs aren't as cheesy as in "Escape from LA," but there is an artificiality to the whole thing that never lets you forget you are watching a movie.  The last moments of the end of the film give rise to the possibility of a sequel, if the box office numbers are good. I give it a C.
For more Reeling reviews visit www.reelingreiews.com
<EMAIL_ADDRESS><EMAIL_ADDRESS>========== X-RAMR-ID: 29354 X-Language: en X-RT-ReviewID: 246486 X-RT-TitleID: 1109551 X-RT-SourceID: 386 X-RT-AuthorID: 1488 X-RT-RatingText: C
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


module type S ={
..}
type key
type t +'a
key
to type 'a
.let empty : t 'a
let is_empty : t 'a => bool
let cardinal : t 'a => int
let add : key => 'a => t 'a => t 'a
add x y m
returns a map containing the same bindings as
m
, plus a binding of x
to y
. If x
was already bound
in m
, its previous binding disappears.let update : key => key => 'a => t 'a => t 'a
update k1 k2 v2 m
replace the previous binding of k1
in m
by
k2
associated to v2
.
This is equivalent to add k2 v2 (remove k1) m
, but more efficient
in the case where k1
and k2
have the same key ordering.Not_found
if k1
is not bound in m
.let find : key => t 'a => 'a
find x m
returns the current binding of x
in m
,
or raises Not_found
if no such binding exists.let remove : key => t 'a => t 'a
remove x m
returns a map containing the same bindings as
m
, except for x
which is unbound in the returned map.let modify : key => ('a => 'a) => t 'a => t 'a
modify k f m
replaces the previous binding for k
with f
applied to
that value. If k
is unbound in m
or Not_found
is raised during the
search, Not_found
is raised.Not_found
if k
is unbound in m
(or f
raises Not_found
)let modify_def : 'a => key => ('a => 'a) => t 'a => t 'a
modify_def v0 k f m
replaces the previous binding for k
with f
applied to that value. If k
is unbound in m
or
Not_found
is raised during the search, f v0
is
inserted (as if the value found were v0
).let modify_opt : key => (option 'a => option 'a) => t 'a => t 'a
modify_opt k f m
allows to modify the binding for k
in m
or absence thereof.let extract : key => t 'a => ('a, t 'a)
extract k m
removes the current binding of k
from m
,
returning the value k
was bound to and the updated m
.let pop : t 'a => (((key, 'a)), t 'a)
pop m
returns a binding from m
and m
without that
binding.Not_found
if m
is emptylet mem : key => t 'a => bool
mem x m
returns true
if m
contains a binding for x
,
and false
otherwise.let iter : (key => 'a => unit) => t 'a => unit
iter f m
applies f
to all bindings in map m
.
f
receives the key as first argument, and the associated value
as second argument. The bindings are passed to f
in increasing
order with respect to the ordering over the type of the keys.
Only current bindings are presented to f
:
bindings hidden by more recent bindings are not passed to f
.let map : ('a => 'b) => t 'a => t 'b
map f m
returns a map with same domain as m
, where the
associated value a
of all bindings of m
has been
replaced by the result of the application of f
to a
.
The bindings are passed to f
in increasing order
with respect to the ordering over the type of the keys.let mapi : (key => 'a => 'b) => t 'a => t 'b
Map.S.map
, but the function receives as arguments both the
key and the associated value for each binding of the map.let fold : (key => 'a => 'b => 'b) => t 'a => 'b => 'b
fold f m a
computes (f kN dN ... (f k1 d1 (f k0 d0 a))...)
,
where k0,k1..kN
are the keys of all bindings in m
(in increasing order), and d1 ... dN
are the associated data.let filterv : ('a => bool) => t 'a => t 'a
filterv f m
returns a map where only the values a
of m
such that f a = true
remain. The bindings are passed to f
in increasing order with respect to the ordering over the
type of the keys.let filter : (key => 'a => bool) => t 'a => t 'a
filter f m
returns a map where only the key, values pairs
key
, a
of m
such that f key a = true
remain. The
bindings are passed to f
in increasing order with respect
to the ordering over the type of the keys.let filter_map : (key => 'a => option 'b) => t 'a => t 'b
filter_map f m
combines the features of filter
and
map
.  It returns the map of
pairs keyi
,bi
such as f keyi ai = Some bi
(when f
returns
None
, the corresponding element of m
is discarded).let compare : ('a => 'a => int) => t 'a => t 'a => int
let equal : ('a => 'a => bool) => t 'a => t 'a => bool
equal cmp m1 m2
tests whether the maps m1
and m2
are
equal, that is, contain equal keys and associate them with
equal data. cmp
is the equality predicate used to compare
the data associated with the keys.let keys : t 'a => BatEnum.t key
let values : t 'a => BatEnum.t 'a
let min_binding : t 'a => (key, 'a)
key,value
) pair with the smallest keylet pop_min_binding : t 'a => (((key, 'a)), t 'a)
key,value
) pair with the smallest key
along with the rest of the maplet max_binding : t 'a => (key, 'a)
(key,value)
pair with the largest keylet pop_max_binding : t 'a => (((key, 'a)), t 'a)
key,value
) pair with the largest key
along with the rest of the maplet choose : t 'a => (key, 'a)
Not_found
if
the map is empty. Which binding is chosen is unspecified,
but equal bindings will be chosen for equal maps.let split : key => t 'a => (t 'a, option 'a, t 'a)
split x m
returns a triple (l, data, r)
, where
l
is the map with all the bindings of m
whose key
is strictly less than x
;
r
is the map with all the bindings of m
whose key
is strictly greater than x
;
data
is None
if m
contains no binding for x
,
or Some v
if m
binds v
to x
.let partition : (key => 'a => bool) =>
t 'a => (t 'a, t 'a)
partition p m
returns a pair of maps (m1, m2)
, where
m1
contains all the bindings of s
that satisfy the
predicate p
, and m2
is the map with all the bindings of
s
that do not satisfy p
.let singleton : key => 'a => t 'a
singleton x y
returns the one-element map that contains a binding y
for x
.let bindings : t 'a => list (key, 'a)
Added for compatibility with stdlib 3.12
let enum : t 'a => BatEnum.t (key, 'a)
Ord.compare
, where Ord
is the argument given to
Map.Make
.let backwards : t 'a => BatEnum.t (key, 'a)
Ord.compare
, where Ord
is the argument given to
Map.Make
.let of_enum : BatEnum.t (key, 'a) => t 'a
let for_all : (key => 'a => bool) => t 'a => bool
for_all p m
checks if all the bindings of the map
satisfy the predicate p
.let exists : (key => 'a => bool) => t 'a => bool
exists p m
checks if at least one binding of the map
satisfy the predicate p
.let merge : (key => option 'a => option 'b => option 'c) =>
t 'a => t 'b => t 'c
merge f m1 m2
computes a map whose keys is a subset of keys of m1
and of m2
. The presence of each such binding, and the corresponding
value, is determined with the function f
.let print : first::string? =>
last::string? =>
sep::string? =>
kvsep::string? =>
(BatInnerIO.output 'a => key => unit) =>
(BatInnerIO.output 'a => 'c => unit) =>
BatInnerIO.output 'a => t 'c => unit
Map.Make
.Map.Make
.Map.Make
.Map
with functions
behaving slightly differently but having the same name. This is by design:
the functions meant to override the corresponding functions of Map
.module Exceptionless:{
..}
Map
without exceptions.
module Infix:{
..}
BatMap
module Labels:{
..}
Map
with labels.


◄ India ►
Individual results
| Year | Contestant | Rank | Award |
|---|---|---|---|
| 2023 | Mehul Borad | 25 | Gold Medal |
| 2023 | Aditya | 28 | Gold Medal |
| 2023 | Dhruv Shah | 36 | Gold Medal |
| 2023 | Raghav Goyal | 46 | Silver Medal |
| 2023 | Rhythm Kedia | 52 | Silver Medal |
| 2022 | Deevyanshu Malu | 20 | Gold Medal |
| 2022 | Anilesh Bansal | 40 | Silver Medal |
| 2022 | Abhijeet Anand | 53 | Silver Medal |
| 2022 | Dheeraj Kurukunda | 54 | Silver Medal |
| 2022 | Harsh Jakhar | 57 | Silver Medal |
| 2019 | Nishant Abhangi | 9 | Gold Medal |
| 2019 | Archit Bubna | 22 | Gold Medal |
| 2019 | Dhruv Arora | 35 | Silver Medal |
| 2019 | Harshvardhan Agarwal | 41 | Silver Medal |
| 2019 | Kaustubh Dighe | 69 | Silver Medal |
| 2018 | Pawan Goyal | 7 | Gold Medal |
| 2018 | Lay Jain | 12 | Gold Medal |
| 2018 | Siddharth Tiwary | 20 | Gold Medal |
| 2018 | Bhaskar Gupta | 25 | Gold Medal |
| 2018 | Nishant Abhangi | 40 | Gold Medal |
| 2017 | Ameya Patwardhan | ≥1 | Gold Medal |
| 2017 | Ananye Agarwal | ≥1 | Gold Medal |
| 2017 | Debaditya Pramanik | ≥1 | Gold Medal |
| 2017 | Lay Jain | ≥1 | Gold Medal |
| 2017 | Pawan Goyal | ≥65 | Silver Medal |
| 2016 | Gowtham Amirthya S. N. | 33 | Gold Medal |
| 2016 | Debaditya Pramanik | 37 | Gold Medal |
| 2016 | Preey Shah | 43 | Gold Medal |
| 2016 | Manan Bhatia | 52 | Silver Medal |
| 2016 | Divyansh Garg | 63 | Silver Medal |
| 2015 | Gowtham Amirthya Neppoleon | 47 | Silver Medal |
| 2015 | Sri Eswar Sai Prakash Reddy Pabatireddy | 63 | Silver Medal |
| 2015 | Sheshansh Agrawal | 66 | Silver Medal |
| 2015 | Anuj Shripad Apte | 98 | Silver Medal |
| 2015 | Arindam Sonali Amar Bhattacharya | 139 | Bronze Medal |
| 2014 | Aniket Bajpai | 19 | Gold Medal |
| 2014 | Chitraang Murdia | 22 | Gold Medal |
| 2014 | Rupanshu Ganvir | 52 | Silver Medal |
| 2014 | Gurkirat Singh Bajwa | 102 | Silver Medal |
| 2014 | Vidya Sagar Naidu Bure | 125 | Silver Medal |
| 2013 | Prafulla Susil Dhariwal | 36 | Gold Medal |
| 2013 | Shouvanik Chakrabarti | 45 | Silver Medal |
| 2013 | Abhijit Lavania | 46 | Silver Medal |
| 2013 | Yash Gupta | 47 | Silver Medal |
| 2013 | Abhishek Anand | 48 | Silver Medal |
| 2012 | Rahul Trivedi | 15 | Gold Medal |
| 2012 | Bijoy Singh Kochar | 47 | Silver Medal |
| 2012 | Jeevana Priya Inala | 48 | Silver Medal |
| 2012 | Kunal Singhal | 54 | Silver Medal |
| 2012 | Pulkit Tandon | 142 | Bronze Medal |
| 2011 | Sumegha Garg | 11 | Gold Medal |
| 2011 | Sai Kiran Burle | 30 | Gold Medal |
| 2011 | Shubham Mehta | 44 | Gold Medal |
| 2011 | Prudhvi Tej Immadi | 60 | Silver Medal |
| 2011 | Nisheeth Lahoti | 83 | Silver Medal |
| 2010 | Aakanksha Sarda | 12 | Gold Medal |
| 2010 | Vipul Singh | 41 | Silver Medal |
| 2010 | Shivam Handa | 53 | Silver Medal |
| 2010 | Mehul Kumar Sharma | 60 | Silver Medal |
| 2010 | Sanchar Sharma | 155 | Bronze Medal |
| 2009 | Gopi Sivakanth | 9 | Gold Medal |
| 2009 | Nitin Jain | 10 | Gold Medal |
| 2009 | Priyank Parikh | 35 | Gold Medal |
| 2009 | Shubham Tulsiani | 41 | Gold Medal |
| 2009 | Vinit Atal | 49 | Silver Medal |
| 2008 | Shitikanth | 18 | Gold Medal |
| 2008 | Nishant Totla | 23 | Gold Medal |
| 2008 | Garvit Juniwal | 25 | Gold Medal |
| 2008 | Kunal Shah | 34 | Gold Medal |
| 2008 | Saurabh Goyal | 55 | Silver Medal |
| 2007 | Rohit Singh | 17 | Gold Medal |
| 2007 | Raman M. Sharma | 20 | Gold Medal |
| 2007 | Harsh H. Pareek | 48 | Silver Medal |
| 2007 | Pratyush S. Pandey | 69 | Silver Medal |
| 2007 | Vivek U. C. Lohani | 139 | Honourable Mention |
| 2006 | Tikekar Mehul | 25 | Gold Medal |
| 2006 | Mahajan Raghu | 34 | Gold Medal |
| 2006 | Harish Ravi | 96 | Bronze Medal |
| 2006 | Jha Divyanshu | 103 | Bronze Medal |
| 2006 | Rambhia Neha | 127 | Bronze Medal |
| 2005 | Piyush Srivastava | 12 | Gold Medal |
| 2005 | Sameer Madan | 34 | Gold Medal |
| 2005 | Tejaswi Venumadhav Nerella | 49 | Silver Medal |
| 2005 | Hema Chandra Prakash Movva | 66 | Silver Medal |
| 2005 | Arjun Radhakrishna | 103 | Bronze Medal |
| 2004 | Shubham Mittal | ≥2 | Gold Medal |
| 2004 | Ajit Kumar Nema | ≥32 | Silver Medal |
| 2004 | Kartik Mohta | ≥32 | Silver Medal |
| 2004 | Ankur Goel | ≥67 | Bronze Medal |
| 2004 | Avin Mittal | ≥67 | Bronze Medal |
| 2003 | Yashodhan Kanoria | 2 | Gold Medal |
| 2003 | Shaleen Harlalka | 20 | Gold Medal |
| 2003 | Shashank Dwivedi | 84 | Bronze Medal |
| 2003 | Divjyot Sethi | 114 | Honourable Mention |
| 2003 | Alekh Agarwal | 123 | Honourable Mention |
| 2002 | Ravishankar Sundararaman | 11 | Gold Medal |
| 2002 | Shanthanu Bhardwaj | 45 | Silver Medal |
| 2002 | Sundeep Balaji | 53 | Silver Medal |
| 2002 | Kushal Mukherjee | 55 | Silver Medal |
| 2002 | Hirakendu Das | 71 | Silver Medal |
| 2001 | Nandan Dixit | 4 | Gold Medal |
| 2001 | Parag Agarwal | 15 | Gold Medal |
| 2001 | Arvind Thiagarajan | 21 | Gold Medal |
| 2001 | Naresh Satyan | 23 | Silver Medal |
| 2001 | S. Vijay Kumar | 38 | Silver Medal |
| 2000 | M Arvind | 7 | Gold Medal |
| 2000 | Navneet Loiwal | 8 | Gold Medal |
| 2000 | Nipun Kwatra | 27 | Bronze Medal |
| 2000 | Abhineet Sawa | 32 | Bronze Medal |
| 2000 | V Srikanth | 79 | Honourable Mention |
| 1999 | Mayank Rawat | 33 | Silver Medal |
| 1999 | Sandeep Bala | 45 | Silver Medal |
| 1999 | Amit Agarwal | 60 | Silver Medal |
| 1999 | Harsha Venkatesh Madhyastha | 99 | Silver Medal |
| 1999 | Suvrat Raju | 103 | Bronze Medal |
| 1998 | Kumar Abhishek | 13 | Silver Medal |
| 1998 | Bhat Vijay | 48 | Bronze Medal |
| 1998 | Thomas Dilys | 76 | Honourable Mention |
| 1998 | Bansal Shivi | 78 | Honourable Mention |
| 1998 | Guha Saikat | 113 | Honourable Mention |
Results may be incomplete or incorrect.
Please send the relevant information to the webmaster:
<EMAIL_ADDRESS>If you are a participant you can send a personal page URL to be attached to your name.
If you are a participant you can send a personal page URL to be attached to your name.


More Pain In Sight For Helmerich & Payne
by Robert & Sam KovacsSummary
- Helmerich & Payne has vastly underperformed the energy sector, which itself has underperformed all other sectors.
- Its massive dividend yield can seem attractive given its 46 year history of paying dividends.
- Yet I am not comfortable buying the stock, as it is likely that the price will decline more from current levels.
Written by Robert Kovacs
Introduction
The energy sector has been in a lot of pain for a while now. While The S&P 500 (SPY) is up over 15% in the past 12 months, the SPDR Select Energy Fund (XLE) is down 13%. However the XLE ETF is market cap weighted. This undermines the true performance of energy stocks, by highlighting those with the highest market cap. During the past 12 months the median energy stock has lost 33% of its value. Helmerich & Payne (HP) has done even worse, losing 40% of its value.
Source: mad-dividends.com
The sector has been the ugly duckling in the market, and HP has been among the ugliest.
Source: Open Domain
Helmerich & Payne is currently trading at $38.41 and yields 7.39%. My M.A.D Assessment gives HP a Dividend Strength score of 47 and a Stock Strength score of 82.
The company has been paying dividends for 46 years, which might lead investors to be attracted by the massive dividend yield.
Yet I believe that it would be a mistake to chase yield given the likelihood for further declines in price. I therefore believe dividend investors should avoid Helmerich & Payne at current prices.
Source: mad-dividends.com
I will first walk through HP’s dividend profile before considering the likelihood of capital appreciation from the current price.
Dividend Strength
Strong dividend stocks are stocks which pay a safe dividend while offering a good combination of dividend yield and dividend growth potential. With super high yielding stocks like HP, dividend growth becomes a secondary consideration, even an afterthought. The focus when looking at such stocks’ dividends should be on safety. Even without dividend growth, a 7% yield will compound nicely, yet a dividend cut would be disastrous for your income, and likely for the stock price.
Dividend Safety
Helmerich & Payne generated negative earnings during the past 12 months, which is a first red flag. During the past 5 years HP’s earnings payout has swung from positive to negative. If we tally up the dividends paid in the past 20 quarters and compare them to earnings, we realize that the amount paid in dividends amounts to 220% of earnings. That definitely isn’t sustainable.
HP pays 36% of its operating cashflow as a dividend, which is better than 37% of dividend stocks. This level of dividend payout would be manageable if it went hand in hand with positive free cashflow.
And at a first glance this would seem possible. HP pays 83% of its free cashflow as a dividend, which is better than 27% of dividend stocks. Yet, just like with earnings, HP’s free cashflows have been extremely volatile during the past 5 years. While the firm paid $13.98 in dividends per share, it only generated $10.25 in free cashflow. It follows that of the dividends received $3.73 worth came from deteriorating the balance sheet in one way or another.
| 30/09/2015 | 30/09/2016 | 30/09/2017 | 30/09/2018 | 30/09/2019 | |
| Dividends | $2.7600 | $2.7700 | $2.8000 | $2.8100 | $2.8400 |
| Net Income | $3.87 | $-0.54 | $-1.20 | $4.37 | $-0.34 |
| Payout Ratio | 72% | -513% | -234% | 65% | -836% |
| Cash From Operations | $13.16 | $6.97 | $3.28 | $4.99 | $7.89 |
| Payout Ratio | 21% | 40% | 86% | 57% | 36% |
| Free Cash Flow | $2.50 | $4.38 | $-0.55 | $0.49 | $3.43 |
| Payout Ratio | 110% | 64% | -500% | 562% | 83% |
Source: mad-dividends.com
These numbers don’t make HP’s payout look super safe. Yet the company has been paying dividends for the past 46 years without ever cutting them. Maybe they deserve the benefit of the doubt. Maybe management’s commitment to the dividend will push them to maintain it regardless of the cost on the business. Management reiterated in the latest earnings call that the company expected to “maintain our long practice of returning capital to shareholders through our dividend”. They also stated that they expect 2020 free cashflow to be sufficient to cover the dividend.
So maybe HP deserves the benefit of the doubt. Cutting the dividend after nearly half a century would be viewed as an extremely bearish signal by the market. It would also take HP another half century to build their reputation back to where it is.
Therefore, I expect management to go to extreme lengths to maintain its dividend and expect them to find a way to manage small increases every few quarters. This doesn’t mean that the dividend is sustainable. As it currently is, it is weakening the company, and a portion of the dividends received in the past 5 years should be viewed as a return of capital and not a return on capital. Yet, I still think a cut is unlikely given the trade-off between cutting the dividend and filling the gap between dividends and FCF with cheap debt or cash on hand. The likelihood of a cut decreases even more when you consider that FCF for fiscal 2019 has been enough to cover the dividend and that management expect this to continue.
Therefore, while I don’t believe that HP’s dividend is sustainable in the long term at current oil prices, I believe it would take a more extreme scenario than a 130% free cashflow payout over 5 years to get management to cut it. That being said, there is no real room for dividend hikes.
Dividend Potential
Helmerich & Payne Inc. has a dividend yield of 7.39% which is better than 91% of dividend stocks. The stock is in the worst position it has been in the entire business cycle. Never has it yielded this much in the past 10 years. It would seem that investors are totally spooked.
Source: mad-dividends.com
Dividend growth is irrelevant when you get a 7.39% yield. Or should I say, dividend growth is irrelevant if your time horizon is 10 years or less.
To understand this nuance, check out these two simulations below.
This first chart shows the expected dividends by investing $10,000 in a stock, which, like HP, yields 7.39%. The assumption is that dividends are reinvested at that constant yield.
Source: mad-dividends.com
As you see, your initial position generates a constant $739 each year (in orange), but as you reinvest all dividends, that amount compounds over time. Within 10 years you could expect to receive $1,454 in dividends, and within 20 years: $2,862 per year.
Now let’s perform the same simulation, but with a different stock: Exxon (XOM). XOM currently yields 5.38%, and has been growing its dividend around 5% per year. If we project this level of dividend growth into the future, here is what would happen:
Within 10 years you’d receive $1,421 in dividends. Within 20 years, you’d receive $3,729 in dividends.
Source: mad-dividends.com
So if you’re looking to maximize your dividend income 10 years from now, finding a safe 7% yielder with no growth might be just as good as finding a dividend stock which yields 5% and is able to increase its dividend by 60% over a 10 year period.
Source: mad-dividends.com
Yet, HP has somewhat grown its dividend, although infrequently since 2015.
This can be explained by the fact that during the last 3 years, the company’s revenues have been climbing back up since the massive revenue cut in 2016, but without coming close to prior levels.
Source: mad-dividends.com
With a cheap barrel, HP remains challenged. During the last quarter, the amount of rigs in operation declined as demand from its Exploration and Production clients went down. Management has yet to identify a bottom in rig count, and this puts a lot of pressure on HP’s margins. The firm hasn’t been able to consistently generate positive earnings since 2015. This worries investors, and places a large question mark over the future of the dividend.
If the firm can’t improve fundamentals, how will it increase its dividend in the future, or even maintain it forever without damaging the firm’s financial stability?
Dividend Summary
HP has a dividend strength score of 47 / 100. The dividend is stretched. As long as a supply glut remains in the oil market, it will be tough for HP to generate enough cashflow to confidently cover the dividend. Yet management is committed to it. I believe that regardless of what happens, it will likely maintain it for at least the next year. It is hard to see a clear direction much farther than that given the volatility in the underlying business.
HP involves a level of risk with which I likely will not be comfortable.
Stock Strength
But what about the price? Has it reached a bottom? Is the stock likely of going back up in the next 12 months? To answer those questions, I will turn to four fundamental factors: value, momentum, financial strength and earnings quality. By combining them I get a metric which I call stock strength, which measures the extent at which the company is likely of beating the broad market over upcoming quarters.
Value
- HP has a negative P/E
- P/S of 1.49x
- P/CFO of 4.87x
- Dividend yield of 7.39%
- Buyback yield of 0.51%
- Shareholder yield of 7.9%.
According to these values, HP is more undervalued than 78% of stocks, yet HP still trades at multiples of sales and cashflow higher than the median energy stock, which trade at 1.1x sales and 3.8x operating cashflow.
All of the energy sector is trading at low multiples right now. The question isn’t so much whether HP is undervalued, but whether the sector at large is headed for lower earnings, sales and cashflows or whether a turnaround is in sight, in which case the whole sector would get a significant kick.
I believe valuations have probably been dragged lower than they should have. But that doesn’t mean they can’t go lower. While energy stocks look cheap, I’d stay away from those with the absolute worse momentum, and favor those with positive momentum.
In early October, I recommended buying Valero (VLO), which was poised for an increase in price. It’s up 15% since then.
Market beating returns can be found in this sector, but one must tread lightly.
Value Score: 78 / 100
Momentum
Helmerich & Payne trades at $38.41 and is down -3.57% these last 3 months, -30.77% these last 6 months & -40.32% these last 12 months.
Source: mad-dividends.com
This gives it better momentum than 16% of stocks, which is appalling, and implies that the market expects it to continue doing badly. If management can’t stabilize the rig count, and if cashflow deteriorates, the price will most certainly continue to underperform.
I avoid the 3 worst deciles of stocks based on Momentum score. It’s just too easy to get burned trying to pick a bottom.
Momentum score: 16 / 100
Financial Strength
HP has a gearing ratio of 0.5, which is better than 81% of stocks. The company’s liabilities have changed by 0% over the course of the last 12 months. The company’s operating cashflow can cover 46.8% of liabilities. This makes HP more financially sound than 97% of U.S. listed stocks. This is probably where HP shines among its peers. It is very well capitalized, and generates huge amounts of cashflow relative to its liabilities. This allows it to navigate these times of turmoil, and gives it some leeway if it needs more capital to fund its dividend in upcoming years.
Financial Strength Score: 97/100
Earnings Quality
HP has a Total Accruals to Assets ratio of -22.5%, which is better than 82% of companies. It depreciates 122.8% of it’s capital expenditure each year, which is better than 53% of stocks. Finally each dollar of assets generates $0.5 in revenue, which is better than 48% of stocks. This makes HP’s earnings quality better than 75% of stocks. Once again, HP’s accounting choices are better than a lot of stocks, and if the firm can find a way to operate above breakeven, the stock could once again thrive.
Earnings Quality Score: 75 / 100
Stock Strength Summary
When combining the different factors of the stocks profile, we get a stock strength score of 82 / 100 which suggests that HP has everything it needs to see through the trouble the whole sector has been facing. However, if investor sentiment should be followed (and it usually should), HP will be facing more losses in the next few months.
Conclusion
With a dividend strength score of 47 & a stock strength of 82, Helmerich & Payne is a risky choice for dividend investors. There is a lot of risk around the sector, and the stock could go down more from here in upcoming months. It would take nerves of steel to invest at the current prices.I’m personally not content with the stocks risk profile, and cannot invest in the stock at current prices, despite the lure of a large dividend and low price.
At the top of this article, there is an orange “follow” button; if you liked my analysis, then you should click it to receive notifications the next time we publish articles on interesting dividend stocks.
Disclosure: I am/we are long VLO, XOM. 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.


| Date |
Fight Title |
Location |
|
Oct062018
|
KSW 45 - The Return to Wembley
|
Wembley, London, Greater London, England |
|
Jun092018
|
KSW 44 - The Game
|
Ergo Arena, Gdansk, Poland |
|
Apr142018
|
KSW 43 - Soldic vs. Du Plessis
|
Centennial Hall, Wroclaw, Poland |
|
Mar032018
|
KSW 42 - Khalidov vs. Narkun
|
Atlas Arena, Lodz, Poland |
|
Dec232017
|
KSW 41 - Mankowski vs. Soldic
|
Katowice, Poland |
|
Oct222017
|
KSW 40 - Dublin
|
3Arena, Dublin, Leinster, Ireland |
|
May272017
|
KSW 39 - Colosseum
|
PGE Narodowy Stadium, Warsaw, Poland |
|
Apr072017
|
KSW 38 - Live in Studio
|
Warsaw, Poland |
|
Dec032016
|
KSW 37 - Circus of Pain
|
Tauron Arena, Krakow, Lesser Poland, Poland |
|
Oct012016
|
KSW 36 - Materla vs. Palhares
|
CRS Hall, Zielona Gora, Lubusz Voivodeship, Poland |
|
May272016
|
KSW 35 - Khalidov vs. Karaoglu
|
Ergo Arena, Gdansk/Sopot, Poland |
|
Mar052016
|
KSW 34 - New Order
|
Torwar Hall, Warsaw, Poland |
|
Nov282015
|
KSW 33 - Materla vs. Khalidov
|
Tauron Arena, Krakow, Poland |
|
Oct312015
|
KSW 32 - Road to Wembley
|
Wembley Arena, London, Greater London, England |
|
May232015
|
KSW 31 - Materla vs. Drwal
|
Ergo Arena, Gdansk, Pomeranian Voivodeship, Poland |
|
Feb212015
|
KSW 30 - Genesis
|
Arena Poznan, Poznan, Greater Poland Voivodeship, Poland |
|
Dec062014
|
KSW 29 - Reload
|
Krakow Arena, Krakow, Poland |
|
Oct042014
|
KSW 28 - Fighters' Den
|
Municipal Hall, Szczecin, Poland |
|
May172014
|
KSW 27 - Cage Time
|
Ergo Arena, Gdansk, Poland |
|
Mar222014
|
KSW 26 - Materla vs. Silva
|
Torwar Hall, Warsaw, Poland |
|
Dec072013
|
KSW 25 - Khalidov vs. Sakurai
|
Centennial Hall, Wroclaw, Poland |
|
Sep282013
|
KSW 24 - Clash of the Giants
|
Atlas Arena, Lodz, Poland |
|
Jun082013
|
KSW 23 - Khalidov vs. Manhoef
|
Ergo Arena, Gdansk, Poland |
|
Mar162013
|
KSW 22 - Pride Time
|
Torwar Hall, Warsaw, Poland |
|
Dec012012
|
KSW 21 - Final Resolution
|
Torwar, Warsaw, Poland |
|
Sep152012
|
KSW 20 - Fighting Symphony
|
Ergo Arena, Gdansk, Poland |
|
May122012
|
KSW 19 - Pudzianowski vs. Sapp
|
Atlas Arena, Lodz, Poland |
|
Feb252012
|
KSW 18 - Unfinished Sympathy
|
Orlen Arena, Plock, Masovian Voivodeship, Poland |
|
Nov262011
|
KSW 17 - Revenge
|
Atlas Arena, Lodz, Poland |
|
May212011
|
KSW 16 - Konfrontacja
|
Ergo Arena, Gdansk, Pomeranian Voivodeship, Poland |
|
Mar192011
|
KSW 15 - Konfrontacja
|
Torwar Hall
Warsaw, Masovian Voivodeship, Poland |
|
Jan292011
|
KSW Extra 2 - President Cup
|
Municipal Sports and Entertainment Center, Elk, Warmian-Masurian Voivodeship, Poland |
|
Oct092010
|
KSW - Fight Club 1
|
Ryn Castle, Ryn, Warmian-Masurian Voivodeship, Poland |
|
Sep182010
|
KSW 14 - Judgment Day
|
Atlas Arena, Lodz, Poland |
|
May072010
|
KSW 13 - Kumite
|
Spodek, Katowice, Silesian Voivodeship, Poland |
|
Apr012010
|
KSW - KSW Elimination
|
CWKS Legia Boxing Club, Warsaw, Masovian Voivodeship, Poland |
|
Dec112009
|
KSW 12 - Najman vs. Pudzianowski
|
Torwar, Warsaw, Masovian Voivodeship, Poland |
|
May152009
|
KSW 11 - Konfrontacja
|
Torwar Hall, Warsaw, Masovian Voivodeship, Poland |
|
Dec122008
|
KSW 10 - Dekalog
|
Torwar Hall, Warsaw, Masovian Voivodeship, Poland |
|
Sep132008
|
KSW - Extra
|
Centrum Hall, Dabrowa Gornicza, Silesian Voivodeship, Poland |
|
May092008
|
KSW 9 - Konfrontacja
|
Torwar Hall, Warsaw, Masovian Voivodeship, Poland |
|
Mar292008
|
KSW - Elimination 2
|
Centennial Hall, Wroclaw, Lower Silesian Voivodeship, Poland |
|
Nov102007
|
KSW 8 - Konfrontacja
|
Torwar Hall, Warsaw, Masovian Voivodeship, Poland |
|
Sep152007
|
KSW - Elimination
|
Orbita Hall
Wroclaw, Lower Silesian Voivodeship, Poland |
|
Jun022007
|
KSW 7 - Konfrontacja
|
Torwar Hall, Warsaw, Masovian Voivodeship, Poland |
|
Oct142006
|
KSW 6 - Konfrontacja
|
Torwar Hall, Warsaw, Masovian Voivodeship, Poland |
|
Jun032006
|
KSW 5 - Konfrontacja
|
Marriott Hotel, Warsaw, Masovian Voivodeship, Poland |
|
Sep102005
|
KSW 4 - Konfrontacja
|
Marriott Hotel, Warsaw, Masovian Voivodeship, Poland |
|
Jan152005
|
KSW 3 - Konfrontacja
|
Marriott Hotel, Warsaw, Masovian Voivodeship, Poland |
|
Oct072004
|
KSW 2 - Konfrontacja
|
Marriott Hotel, Warsaw, Masovian Voivodeship, Poland |
|
Feb272004
|
KSW 1 - Konfrontacja
|
Marriott Hotel, Warsaw, Masovian Voivodeship, Poland |


Image Reconstruction¶
We demonstrate an application of our method in recovering an original image from a noisy image. We use MNIST images of handwritten digits to illustrate this idea.
[1]:
import numpy as np
import matplotlib.pyplot as plt
import emachine as EM
import itertools
[2]:
np.random.seed(0)
We first select a real image from a testing set of MNIST data.
[3]:
s0 = np.loadtxt('../MNIST_data/mnist_test.csv',delimiter=',')
seq = s0[:,1:]
label = s0[:,0]
# select only 1 digit
digit = 8
seq1 = seq[label == digit]
print(digit,seq1.shape)
# convert to binary
seq1 = np.sign(seq1-1.5)
# select only one test sample to consider
t = 2
seq1 = seq1[t]
8 (974, 784)
Suppose the image has n_hidden
missing pixels. We set their values to be zero.
[4]:
# select hidden pixels
n_hidden = 90
hidden = np.random.choice(np.arange(28*28),n_hidden,replace=False)
# set value at hidden position to be zero
seq_hidden = seq1.copy()
seq_hidden[hidden] = 0.
We plot the original image and the noisy image.
[5]:
nx,ny = 2,1
fig, ax = plt.subplots(ny,nx,figsize=(nx*3,ny*2.8))
ax[0].imshow(seq1.reshape(28,28),interpolation='nearest')
ax[1].imshow(seq_hidden.reshape(28,28),interpolation='nearest')
ax[0].set_title('original image')
ax[1].set_title('noisy image')
for i in range(nx):
ax[i].set_axis_off()
plt.tight_layout(h_pad=0.7, w_pad=1.5)
#plt.savefig('fig_hidden.pdf', format='pdf', dpi=100)
We aim to reconstruct the missing pixels, and recover the original image. We use images of the same digit from the MNIST training set. Because of the limitation of sample size (n_seq = 5851), compared with number of variables (n_var = 28 x 28 = 784 pixels), we first identify “conserved” pixels that have common values for more than 80% of the training samples.
We then find conserved and active pixels from training data.
[6]:
# load train data
s0_train = np.loadtxt('../MNIST_data/mnist_train.csv',delimiter=',')
seq_train = s0_train[:,1:]
label_train = s0_train[:,0]
# select only 1 digit
seq1_train = seq_train[label_train == digit] #digit = 8
# convert to binary
seq1_train = np.sign(seq1_train-1.5)
print(seq1_train.shape)
(5851, 784)
[7]:
# find conserved pixels from traing data
n,m = seq1_train.shape
frequency = [(seq1_train[:,i] == -1).sum()/float(n) for i in range(m)]
cols_pos = [i for i in range(m) if frequency[i] < 0.2] # 80% positive
cols_neg = [i for i in range(m) if frequency[i] > 0.8] # 80% negative
cols_conserved = cols_pos + cols_neg
# active pixels
cols_active = np.delete(np.arange(0,m),cols_conserved)
print(len(cols_pos),len(cols_neg),len(cols_conserved),len(cols_active))
49 513 562 222
In this case, there are 562 conserved pixels in total, including 49 positive pixels and 513 negative pixels. There are 222 active pixels.
To reconstruct the value of conserved hidden pixels (of the test image), we simply set the value of conserved hidden pixels of the test image as the value of corresponding pixels in the training data.
[8]:
hidden_conserved = np.intersect1d(hidden,cols_conserved)
hidden_active = np.intersect1d(hidden,cols_active)
n_hidden_conserved = len(hidden_conserved)
n_hidden_active = len(hidden_active)
print('n_hidden_active:',len(hidden_active))
## recover hidden
seq_recover = seq_hidden.copy()
hidden_neg = np.intersect1d(hidden_conserved,cols_neg)
hidden_pos = np.intersect1d(hidden_conserved,cols_pos)
seq_recover[hidden_neg] = -1.
seq_recover[hidden_pos] = 1.
n_hidden_active: 26
Now, there are n_hidden_active
(i.e., 26 in this example) hidden pixels that we need to find the values of. We will apply our Erasure Machine to find the pixel bias and interactions between 222 active pixels.
We find pixel bias and interactions of active pixels (from training data).
[9]:
seq_train_active = seq1_train[:,cols_active]
print((seq_train_active.shape))
ops = EM.operators(seq_train_active)
print(ops.shape)
eps_list = np.linspace(0.92,0.98,5)
E_eps = np.zeros(len(eps_list))
w_eps = np.zeros((len(eps_list),ops.shape[1]))
for i,eps in enumerate(eps_list):
w_eps[i,:],E_eps[i] = EM.fit(ops,eps=eps,max_iter=100)
print(eps,E_eps[i])
ieps = np.argmax(E_eps)
print('optimal eps:',eps_list[ieps])
w = w_eps[ieps]
#np.savetxt('w.dat',w,fmt='%f')
(5851, 222)
(5851, 24753)
0.92 -711.6255597866084
0.935 -705.7689428451328
0.95 -706.8546800350513
0.965 -719.9330903444665
0.98 -767.5753296194733
optimal eps: 0.935
We then apply these to the test image and select the best active hidden pixel vector. This step requires a large computer memory and we perform this procedure by using a computing server.
[ ]:
# consider every possibilities of configurations of the active hidden pixels
seq_all = np.asarray(list(itertools.product([1.0, -1.0], repeat=n_hidden_active)))
n_possibles = seq_all.shape[0]
print('number of possible configs:',n_possibles)
active_hidden_indices = np.intersect1d(cols_active,hidden_active,
return_indices=True)[1]
seq_active = seq1[cols_active]
seq_active_possibles = np.tile(seq_active,(n_possibles,1))
seq_active_possibles[:,active_hidden_indices] = seq_all
# calculate energy of each possible configuration
npart = 128 # devide into npart because of PC memory limitation
ns = int(n_possibles/npart)
energy = np.full(n_possibles,100000.)
for i in range(npart):
i1 = int(i*ns)
i2 = int((i+1)*ns)
if i%5 == 0: print('ipart:',i)
ops = EM.operators(seq_active_possibles[i1:i2])
energy[i1:i2] = -ops.dot(w)
# select the best sequence that maximize probability
seq_recover[hidden_active] = seq_all[np.argmin(energy)]
We load the computed result from the code above.
[12]:
seq_recover = np.loadtxt('seq_recover_90.dat')
We plot the image we recovered.
[14]:
nx,ny = 3,1
nfig = nx*ny
fig, ax = plt.subplots(ny,nx,figsize=(nx*2.0,ny*2.6))
ax[0].imshow(seq1.reshape(28,28),interpolation='nearest')
ax[1].imshow(seq_hidden.reshape(28,28),interpolation='nearest')
ax[2].imshow(seq_recover.reshape(28,28),interpolation='nearest')
ax[0].set_title('original image')
ax[1].set_title('noisy image')
ax[2].set_title('recovered image')
for i in range(nx):
ax[i].set_axis_off()
label = ['(a)','(b)','(c)','(d)','(e)','(g)','(d)','(h)']
xlabel = np.full(nfig,0.0)
ylabel = np.full(nfig,1.1)
k = 0
for i in range(nx):
ax[i].text(xlabel[k],ylabel[k],label[k],transform=ax[i].transAxes,
va='top',ha='right',fontsize=13)
k += 1
plt.tight_layout(h_pad=0.0, w_pad=0.5)
#plt.savefig('fig.pdf', format='pdf', dpi=100)
The recovered image looks like the original image.
[ ]:


Netizens Are Left Confused With THIS Girl's Unnatural Long And Thin Legs, Can You Guess Why?
This girl's unnatural long and thin legs have created a stir on social media and it is viral now.
The optical illusion has now become a thing on the internet which keeps netizens baffled. Now, the image of a girl is the latest optical illusion and it is keeping the internet busy. In the photo, the girl can be seen standing in a field and her legs look unnaturally long and thin. The picture has been shared on Facebook and Reddit and it has created a stir on social media. The picture has left many confused.
Take a look at the picture here:
At first glance, the little girl’s leg seems unbelievable thin and long. However, if you look closely it is actually an optical illusion created by a transparent popcorn packet that she is holding in her hands. The colour of the popcorn packet gets camouflage with the background and creates an illusion.
One user commented, “Took me a while to notice what’s going on here.” While the other tweeted, “Ohh….I was very confused Thank god…to comment section.”
Another user commented, “Oh my goodness, I was thinking she is so thin…… and her boot came off…… took me a good two minutes, LOL.”
Check out the Twitter reactions:
A few days back, an optical illusion video of a woman moving her hands that it appeared as if the palm of her one hand is passing through the other.
For breaking news and live news updates, like us on Facebook or follow us on Twitter and Instagram. Read more on Buzz Latest News on India.com.
Story Timeline
- 28 Nov 2019 TikTok Claims Another Life As Coimbatore Youth Drowns While Filming Viral Video
- 28 Nov 2019 Watch: Commuters Enjoy Thanksgiving Feast Inside Moving Train in New York, Video Goes Viral
Comments - Join the Discussion


|
XLabs
Cross-platform reusable C# libraries
|
Interface IMediaPicker More...
Public Member Functions | |
| Task< MediaFile > | SelectPhotoAsync (CameraMediaStorageOptions options) |
| Select a picture from library. More... | |
| Task< MediaFile > | TakePhotoAsync (CameraMediaStorageOptions options) |
| Takes the picture. More... | |
| Task< MediaFile > | SelectVideoAsync (VideoMediaStorageOptions options) |
| Selects the video asynchronous. More... | |
| Task< MediaFile > | TakeVideoAsync (VideoMediaStorageOptions options) |
| Takes the video asynchronous. More... | |
Properties | |
| bool | IsCameraAvailable [get] |
| Gets a value indicating whether this instance is camera available. More... | |
| bool | IsPhotosSupported [get] |
| Gets a value indicating whether this instance is photos supported. More... | |
| bool | IsVideosSupported [get] |
| Gets a value indicating whether this instance is videos supported. More... | |
| EventHandler< MediaPickerArgs > | OnMediaSelected [get, set] |
| Event the fires when media has been selected More... | |
| EventHandler< MediaPickerErrorArgs > | OnError [get, set] |
| Gets or sets the on error. More... | |
Interface IMediaPicker
| Task<MediaFile> XLabs.Platform.Services.Media.IMediaPicker.SelectPhotoAsync | ( | CameraMediaStorageOptions | options | ) |
Select a picture from library.
| options | The storage options. |
Implemented in XLabs.Platform.Services.Media.MediaPicker, XLabs.Platform.Services.Media.MediaPicker, and XLabs.Platform.Services.Media.MediaPicker.
| Task<MediaFile> XLabs.Platform.Services.Media.IMediaPicker.SelectVideoAsync | ( | VideoMediaStorageOptions | options | ) |
Selects the video asynchronous.
| options | The options. |
Implemented in XLabs.Platform.Services.Media.MediaPicker, XLabs.Platform.Services.Media.MediaPicker, and XLabs.Platform.Services.Media.MediaPicker.
| Task<MediaFile> XLabs.Platform.Services.Media.IMediaPicker.TakePhotoAsync | ( | CameraMediaStorageOptions | options | ) |
Takes the picture.
| options | The storage options. |
Implemented in XLabs.Platform.Services.Media.MediaPicker, XLabs.Platform.Services.Media.MediaPicker, and XLabs.Platform.Services.Media.MediaPicker.
| Task<MediaFile> XLabs.Platform.Services.Media.IMediaPicker.TakeVideoAsync | ( | VideoMediaStorageOptions | options | ) |
Takes the video asynchronous.
| options | The options. |
Implemented in XLabs.Platform.Services.Media.MediaPicker, XLabs.Platform.Services.Media.MediaPicker, and XLabs.Platform.Services.Media.MediaPicker.
|
get |
Gets a value indicating whether this instance is camera available.
true
if this instance is camera available; otherwise, false
.
|
get |
Gets a value indicating whether this instance is photos supported.
true
if this instance is photos supported; otherwise, false
.
|
get |
Gets a value indicating whether this instance is videos supported.
true
if this instance is videos supported; otherwise, false
.
|
getset |
Gets or sets the on error.
The on error.
|
getset |
Event the fires when media has been selected
The on photo selected.


Submit a post to the Steem blockchain
Username:
Posting private key:
Parent Author:
Parent Post Permalink:
Comment body:
Content of the comment


MyCakeNBake offer creatively designed edible custom cookie arrangements, cookie gift baskets, cookie cakes, cookie bouquets & gourmet cookies. MyCakeNBake prepare fresh mouth watering cookies for any beautiful occasion in your life
MycakeNbake present a wide range of Chocolates Bouquet especially for Rose Day , Birthday's & Valentine Day.These Chocolate Bouquet are made from premium quality MycakeNbake can persionalize as per your requirement along with our creativity.
 MyCakeNBake have the capability of taking any amount of order and promise you to deliver as per your requirement and satisfaction.
{{x.cakeName}}


User guide
Joda-Beans is a small library that adds properties to the Java programming language. It consists of these main parts:
- a set of interfaces and classes that define a property
- a source code generator
- serialization and deserialization via JSON, XML and MsgPack binary
- integration with other technologies
The main rationale for the project is to raise the abstraction level of Java development. Most mainstream languages have some kind of support for properties, unfortunately Java does not. The benefits of the Joda-Beans approach mostly apply when using the code generator:
- easy to write common utilities acting on arbitrary beans without using reflection
- no need to manually write getters, setters, equals, hashCode, toString
- simple way to create immutable beans
- effective and simple round-trip serialization and deserialization
Bean and Property model
The Joda-Bean API is based around a model of properties in the Java programming language.
All beans implement the Bean interface. This defines a minimal API for all beans, providing the ability to obtain the property names and a named property. The interface also provides access to the meta-bean.
The MetaBean interface defines the meta-bean. The “meta” name indicates that this is a higher level description of the bean itself. In fact, the meta-bean is the equivalent to java.lang.Class for beans - there is only one meta-bean object for all instances of the bean. The meta-bean API provides access to the name of the bean, it’s type, a builder and the meta-properties.
The MetaProperty interface is the main definition of a property. It is at the “meta” level, describing the property without holding a references to any specific instance of a bean. As such, it is effectively the equivalent to java.lang.reflect.Field for a single property on a bean - there is only one meta-property object for all instances of the property. The meta-property API provides access to the name of the property, it’s type, any declared annotations and whether it is read-write or read-only. It also include methods to get and set the value, which require the bean to be passed in just like java.lang.reflect.Field.
Bean person = new Person(); MetaProperty<String> surnameMetaProperty = bean.metaBean().metaProperty("surname"); String surname = surnameMetaProperty.get(person);
The bean itself also provides access to instances of the Property interface for each property. Each property object is a simple combination of the bean and the meta-property. This means that there are simple methods to get and set the value of the property which directly affect the underlying bean. The property also provides methods to get the property name, the underlying bean and the meta-property.
Bean person = new Person(); Property<String> surnameProperty = bean.property("surname"); String surname = surnameProperty.get();
Use in an application
Applications can use Joda-Beans properties in many ways, revolving around passing a single property of an object to another method. For example, it would be possible to write a validating method that checked the validity of a single property, but perhaps registered errors on the underlying bean.
Use in a framework
Joda-Beans is designed to work well with frameworks which need dynamic access to the properties of a bean. It is recommended when working with a framework to primarily use the meta-bean and associated meta-properties. This is because they tend to be singletons and more efficient than using the property objects. The meta-property API is also more comprehensive than the property API.
Beans are normal Java objects and can be created from scratch using constructors. Frameworks may wish to use the BeanBuilder interface which provides a standard way to build the bean. The builder is obtained from the meta-bean. Each property is then set before calling build.
A selection of utilities is available on JodaBeanUtils. This includes the ability to lookup a meta-bean from a java.lang.Class, access to the Joda-Convert string converter and methods to extract the types of lists and maps using reflection on generics.
The access to the field-level annotations provided by the meta-property is also useful to framework writers.
Joda-Convert integration
A Joda-Beans meta-property provides the ability to set a property from a string. The conversion between the string and the type of the property, such as int or URI, is handled by Joda-Convert. The converter can be customised, and is exposed by JodaBeanUtils.
When iterating over a bean object graph, being able to determine which objects are “leaves”, the simple types that have a direct string representation, is a very useful ability.
Finding the generic type parameters of a property
The Java bytecode format contains more details about generic types than is often realised. The JodaBeanUtils methods collectionType(), mapKeyType() and mapValueType() allow the generic parameter type of a property to be extracted. Thus an application can tell that a property is of type List<String>, not just List.
Iterating over a bean object graph
The JodaBeanUtils class contains the method beanIterator(). This provides a simple mechanism to iterate over all the beans within a bean.
The iteration is depth-first, and handles collections, and collections within collections. Note however that there is no protection against cycles in the object graph, thus the method is only fully safe when using immutable beans.
for (Bean bean : JodaBeanUtils.beanIterator(rootBean)) { // perform logic on each bean in the object graph }
Code generation
It is entirely possible to write a Joda-Bean by hand - the design utilises simple Java interfaces. Most users choose to code generate beans however. For information on code generation, see the code generation user guide.
Serialization
One of the benefits of a bean and property system is that serialization code becomes much simpler. For information on serialization in XML, JSON and binary, see the serialization user guide.
Integration
Joda-Beans has been integrated with Freemarker, MongoDB and Kryo. The integration support classes are included in the jar file but only work when the optional dependency is present. Note that it is entirely valid to use Joda-Beans without additional jar file dependencies apart from Joda-Convert.
The beans are also widely use in the Strata market risk project.


{% load staticfiles %} {% load bootstrap3 %}
Apollo
{% block extra_head %}{% endblock %}
Toggle navigation
Apollo
{% if user.is_authenticated %}
Backbone Data
Terms of Services
Equipment
Services
Price Lists
All User Models
All Businesses
All Stations
Account
Manage E-mail
Change Password
Toggle Staff Privilege
Sign Out
My Activity
{% else %}
Home
Idea Details
Contact
Sign In
Sign Up
{% endif %}
{% if user.is_staff %}
You are currently using Apollo with staff privileges. Please be courteous to other users. You may revert back to regular user permissions by clicking
Account › Toggle Staff Privilege
.
{% endif %} {% bootstrap_messages %} {% block content %}{% endblock %}
{% block extra_body %}{% endblock %}


Sends data to an extension in your Transmitter.
The values change depending on which extension you use.
If you select manual in the extension field, you can send a JSON string directly to the Transmitter.
| Box Name | Type | Description |
|---|---|---|
| Extension | String | Name of the extension. |
| Various values | Any | These change depending on the specific extension. |


Before Change
downconv = nn.Conv2d(input_nc, inner_nc, kernel_size=4,
stride=2, padding=1)
downrelu = nn.LeakyReLU(0.2, True)
downnorm = norm_layer(inner_nc, affine=True)
uprelu = nn.ReLU(True)
upnorm = norm_layer(outer_nc, affine=True)
After Change
else:
// shift triple differs in here. It is `*3` not `*2`.
down = [downconv]
upconv = InceptionUp(inner_nc, outer_nc)
// shift should be placed after uprelu
// NB: innerCos are placed before shift. So need to add the latent gredient to
// to former part.
if shift_layer:
up = [upconv, upnorm]
model = down + [submodule] + up
else:
up = [upconv, upnorm]
if use_dropout:
model = down + [submodule] + up + [nn.Dropout(0.5)]
else:


Buttons
Use Bootstrap’s custom button styles for actions in forms, dialogs, and more with support for multiple sizes, states, and more.
With angled image on right
PremiumCopy:
Use Bootstrap’s custom button styles for actions in forms, dialogs, and more with support for multiple sizes, states, and more.
Copy:


We recommend you use Google Chrome.
Close


@* * 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 play.api.data.Field @this() @(field: Field, label: String, isPageHeading: Boolean, formHint: Option[String] = None)(implicit messages: Messages) @fieldError = @{ field.error } @getLabelClass(isPageHeading: Boolean) = @{ if(isPageHeading) "govuk-label govuk-label--l" else "govuk-label" } @inputLabel(isPageHeading: Boolean) = { }


This is a sample site where you can view the images you have entered in the previous page via their url.


Miaooo is an Applicant Tracking Systems (ATS).It provide online recruitment management and analyse for recruiter、HR manager and job seeker.
登录
注册企业账号
copyright by @喵招HR.


Apple TV+ series ‘Truth Be Told’ gets its own featurette ahead of debut
by Evan SelleckThe upcoming series Truth Be Told for Apple TV+ gets its own featurette ahead of its debut in early December.
Apple shared the featurette on its official Apple TV YouTube channel today. It comes in at just over three minutes in length, and, like the other behind-the-scenes videos we’ve seen for other Apple TV+ shows, we get to watch as members of the cast and crew introduce the new series.
Here’s Apple’s description of the upcoming series:
When new evidence compels podcaster Poppy Parnell (Octavia Spencer) to reopen the murder case that made her a national sensation, she comes face to face with Warren Cave (Aaron Paul), the man she may have mistakenly helped to put behind bars. Her investigation navigates urgent concerns about privacy, media and race.
Truth Be Told stars Octavia Spencer (Hidden Figures, Ma), Aaron Paul (Breaking Bad), Mekhi Phifer (8 Mile), Lizzy Caplan (Castle Rock, Mean Girls), Elizabeth Perkins (Big), and many others. The series was created by Nichelle Tramble Spellman.
Here’s the featurette:
Truth Be Told will premiere on Friday, December 6. Are you looking forward to checking it out?


UKCloud Limited (“UKC”) and Virtual Infrastructure Group Limited (“VIG”) (together “the Companies”) – in Compulsory Liquidation
On 25 October 2022, the Companies were placed into Liquidation with the Official Receiver appointed as Liquidator and J Robinson and A M Hudson simultaneously appointed as Special Managers to manage the liquidation process on behalf of the Official Receiver.
Further information regarding the Liquidations can be found here: https://www.gov.uk/government/news/virtual-infrastructure-group-limited-and-ukcloud-limited-information-for-creditors-and-interested-parties
Contact details:
For any general queries relating to the Liquidations please email<EMAIL_ADDRESS>For customer related queries please email<EMAIL_ADDRESS>For supplier related queries please email<EMAIL_ADDRESS>How to move resources between OpenStack regions
Overview
This article provides examples of how to move OpenStack resources (for example, instance images and volumes) between the different independent regions currently offered by UKCloud to help ensure the highest level of application resilience and availability.
Intended audience
Anyone responsible for the design and implementation of applications and services deployed on UKCloud for OpenStack, and should be familiar with using the OpenStack dashboard and API/CLI.
Background
UKCloud's OpenStack service has been engineered specifically for today's modern, digital, cloud based applications. Unlike our VMware service, OpenStack expects applications to be designed with resilience engineered at the application level, rather than relying upon the underlying cloud infrastructure. To cater for this, our OpenStack service offers the following two resiliency concepts:
Regions - Where applications are served from a choice of multiple regions (for example, data centres) with each region having independent, isolated control (for example, dashboard, API), data (for example, compute workloads) and storage (for example, persistent block volumes) planes. Engineering your applications to span multiple regions offers the greatest level of resilience, however requires effort from a design and implementation perspective.
Zones - Where applications are served from a single region (for example, data centre) and share a single control plane and resilient storage, however the data plane (for example, compute workloads) can be placed within different fault tolerant failure domains. Zones offer a lower level of resilience when compared to regions, however they require the least effort to utilise.
UKCloud strongly recommends engineering across multiple regions for any production workloads.
OpenStack regions & zones
The following table outlines the regions and zones that are currently available on the OpenStack service:
| Site | Region | Zone |
|---|---|---|
| Farnborough | 00006 (frn00006.cni.ukcloud.com) | 00021-1 |
| 00021-2 | ||
| Corsham 2 | 00005 (cor00005-2.cni.ukcloud.com) | 00026-1 |
| 00026-2 |
Details correct at date of publication. Current details can be found in the UKCloud Knowledge Centre.
Migrating instances between regions
UKCloud has deliberately engineered its regions to be fully independent to allow a high level of isolation and customer control as to which resources and data is shared/distributed. As a result, the only way to share instances between regions is to export them from the current region, then import them into the new region.
The following provides a code example of how to achieve this export and import of an image using the OpenStack CLI:
To identify the id of the source instance:
Source the originating region's
cred rc
fileEnter the following command:
openstack server list
Note the
ID
of your source instance as shown in the resulting output.To create the image of the source instance, enter the following command:
openstack server image create --name <name-for-image> <id-of-server>
Note the
id
shown in the resulting output.To check image has finished creating, enter the following command:
openstack image show <id-of-image>
Once complete, the
status
field should show asactive
.To download source image snapshot, enter the following command:
openstack image save <id-of-image-to-download> --file <output-location>
If the image size is greater than the memory of the local host, the following may be required:
glance image-download --file <output-location> --progress <id-of-image-to-download>
Note
As glance CLI commands don't work with SSO accounts, you'll need a keystone user to run this command. Contact UKCloud Support to request a keystone account, if necessary.
To upload source image to the target region:
Source the target region's
cred rc
fileEnter the following command:
openstack image create --file <path-to-file-to-upload> --disk-format qcow2 --container-format bare <name-for-upload>
You can now start the migrated instance from file you've just uploaded.
Migrating volumes between regions
As with instances, volumes have been engineered to be fully independent across regions. For moving volumes two options are available.
Option 1 - Direct transfer between instances
Once instances have been migrated (see above) and are running, data can be copied directly between the instances.
To achieve this across different regions, the use of a VPN may be required. Details on how to deploy a VPN within the OpenStack platform can be found in Blueprint: Configuring IPsec VPN in UKCloud for OpenStack.
Option 2 - Export and import of existing volumes
Detach the volume to be migrated from all instances to ensure all writes are completed.
a. To show a list of all volumes in your project:
Source the originating region's
cred rc
fileEnter the following command:
openstack volume list
If your source volume shows as being
Attached to
in the resulting output then note theID
of your source volume and proceed to step 1b, otherwise note theID
of your source volume and proceed to step 2.
b. To detach your source volume from an instance, enter the following command:
openstack server remove volume <id-of-server> <id-of-volume>
Double check the volume has been detached by running the command in step 1a.
Upload the source volume to the OpenStack Glance image repository using the following command:
openstack image create --volume <id-of-volume> <name-for-image>
Download the source volume image to your local device using the following command:
openstack image save <id-of-image-to-download> --file <output-location>
If the image size is greater than the memory of the local host, the following may be required:
glance image-download --file <output-location> --progress <id-of-image-to-download>
Note
As glance CLI commands don't work with SSO accounts, you'll need a keystone user to run this command. Contact UKCloud Support to request a keystone account, if necessary.
To upload the source volume image to the target region:
Source the target region's
cred rc
fileEnter the following command:
openstack image create --file <path-to-file-to-upload> --disk-format raw --container-format bare <name-for-upload>
To create a new volume in the target region based upon the original source volume, enter the following command:
openstack volume create --image <id-of-image> --size <size-of-volume-to-create> --type <TIER1/TIER2> <name-for-volume>
Next steps
You can find more information about UKCloud's sites, regions and zones in the following Knowledge Centre articles:
You can find full details for the OpenStack command-line interface (OpenStack CLI) at:
Feedback
If you find a problem with this article, click Improve this Doc to make the change yourself or raise an issue in GitHub. If you have an idea for how we could improve any of our services, send an email to feedback@ukcloud.com.


This software is build on my own interest towards deep learning computer vision. Anyone who wishes to use this project should obtain permission from me(Yaswanth Sai Palaghat).


Preparation time
less than 30 mins
Cooking time
30 mins to 1 hour
Serves
Serves 4
This is a more sophisticated version of salmon en croute with a rich langoustine sauce to serve alongside.
For the tart, preheat the oven to 200C/400F/Gas 6.
Roll the pastry out on a floured work surface to a 3mm/⅛in thickness. Cut out a 30cm x 10cm/12in x 4in rectangle and a 37.5cm x 15cm/15in x 6in rectangle.
Trim the salmon into a 27.5cm x 7.5cm/11in x 3in rectangle
Roughly chop the salmon trimmings (about 175g/6oz). Blend the salmon trimmings and egg whites to a purée in a food processor. Add the cream, salt and freshly ground black pepper and blend together until smooth.
Place the smaller piece of pastry onto a baking tray and spread over the salmon purée. Cover with the langoustines and season with salt and freshly ground black pepper.
Arrange the spinach leaves on top, then the piece of salmon. Cover with the larger piece of the pastry and crimp the edges. Trim the edges and brush with the beaten egg yolks. Score the pastry with a table knife.
Bake in the oven for 30-35 minutes, or until the pastry is cooked through and golden-brown. Set aside to rest for five minutes.
Meanwhile, for the sauce, heat a frying pan until hot and add the butter, onion, carrots, fennel and thyme and cook for 2-3 minutes, or until just softened but not coloured.
Add the langoustine shells, cayenne and tomato purée and cook for a further minute. Add the white wine and continue to cook until the volume of the liquid is reduced by half.
Add the fish stock, bring to the boil, then reduce the heat and simmer for 15 minutes.
Blend the sauce in a blender until smooth, then pass through a sieve into a saucepan. Return the sauce to a simmer, add the cream and cook for a further minute. Season, to taste, with salt, lemon juice and freshly ground black pepper.
To serve, carve the tart into slices and spoon over the sauce.


Satellite Viewer is a realtime simulation of all tracked artificial satellites currently in Earth orbit. Orbital TLE information is obtained daily from Celestrak and processed for display. The resulting data is also publicly available here and is updated each night at midnight, UTC.
This is built as a WebGL experiment using Three.js and is expected to work in the latest versions of Google Chrome, Firefox, & Internet Explorer 11.


Case Title
Activated charcoal wolf locavore yuccie. Paleo pork belly readymade, chia direct trade ethical narwhal man braid post-ironic pickled iceland.


|
School Name
|
Sponsor Priority
(1 - 100)
|
Sponsor Period
|
Edit
|
Remove
|
|---|---|---|---|---|
| {{school.name}} | {{school.priority}} | {{school.start_date | date:"MM/dd/yyyy"}} - {{school.end_date | date:"MM/dd/yyyy"}} |
|
|
| {{school.name}} | {{school.priority}} | {{school.start_date | date:"MM/dd/yyyy"}} - {{school.end_date | date:"MM/dd/yyyy"}} |
|
|


In order to find the perfect destination, please tell use a little bit about yourself and your preferences:
Congratulations! You picked "TROPICAL" destinations are your perfect vacation choice! Tropical destinations offer a chance to rest and recouparate in paradise! Tropical destinations include places like Hawaii, the Bahamas, the Caribbean, and the Maldives islands! Tropical destinations are best for those who like sun, surf, and beaches. These are perfect destinations for honeymooners, too! Click here for more...
Congratulations! You picked "METROPOLITAN" destinations are your perfect vacation choice! Metropolitan destinations offer a chance to see the sights, hear the sounds, and enjoy the BIG CITY! Metropolitan destinations include places like New York City, London, Tokyo, and Sydney! Metropolitan destinations are best for those who like bright lights, hustle and bustle, museums, and shopping. These are perfect destinations for Urbanites! Click here for more...
Congratulations! You picked "SCENIC" destinations are your perfect vacation choice! Scenic destinations offer a chance to see the world! Scenic destinations include places like Madrid, Amsterdam, and Rome! Scenic destinations are best for those who like traveling to new places. These are perfect destinations for travel bugs! Click here for more...
Congratulations! You picked "RUSTIC" destinations are your perfect vacation choice! Rustic destinations offer a chance to relax in a tranquil setting! Rustic destinations include places like the mountains and countrysides! Rustic destinations are best for those who like peace and quiet. These are perfect destinations for weekend warriors, too! Click here for more...


devito.ir.iet package¶
Submodules¶
devito.ir.iet.analysis module¶
A collection of algorithms to analyze and decorate Iteration
in an
Iteration/Expression tree. Decoration comes in the form of IterationProperty
objects, attached to Iterations in the Iteration/Expression tree. The algorithms
perform actual data dependence analysis.
devito.ir.iet.nodes module¶
The Iteration/Expression Tree (IET) hierarchy.
-
class
devito.ir.iet.nodes.
Node
[source]¶ Bases:
devito.tools.abc.Signer
-
args
¶ Arguments used to construct the Node.
-
args_frozen
¶ Arguments used to construct the Node that cannot be traversed.
-
ccode
¶ Generate C code.
This is a shorthand for
from devito.ir.iet import CGen CGen().visit(self)
-
children
¶ Return the traversable children.
-
is_Block
= False¶
-
is_Call
= False¶
-
is_Callable
= False¶
-
is_Element
= False¶
-
is_Expression
= False¶
-
is_ExpressionBundle
= False¶ _traversable
. The traversable fields of the Node; that is, fields walked over by aVisitor
. All arguments in __init__ whose name appears in this list are treated as traversable fields.
-
is_ForeignExpression
= False¶
-
is_HaloSpot
= False¶
-
is_Increment
= False¶
-
is_Iteration
= False¶
-
is_IterationFold
= False¶
-
is_List
= False¶
-
is_Node
= True¶
-
is_Section
= False¶
-
view
¶ Generate a representation of the Iteration/Expression tree rooted in
self
.
-
-
class
devito.ir.iet.nodes.
Block
(header=None, body=None, footer=None)[source]¶ Bases:
devito.ir.iet.nodes.Node
A sequence of nodes, wrapped in a block {…}.
-
is_Block
= True¶
-
-
class
devito.ir.iet.nodes.
Denormals
(header=None, body=None, footer=None)[source]¶ Bases:
devito.ir.iet.nodes.List
Macros to make sure denormal numbers are flushed in hardware.
-
class
devito.ir.iet.nodes.
Expression
(expr)[source]¶ Bases:
devito.ir.iet.nodes.Node
A node encapsulating a SymPy equation.
-
defines
¶ Return any symbols an
Expression
may define.
-
dimensions
¶
-
dtype
¶
-
free_symbols
¶ Return all
Symbol
objects used by thisExpression
.
-
is_Expression
= True¶
-
is_scalar
¶ Return True if a scalar expression, False otherwise.
-
is_scalar_assign
¶ Return True if a scalar, non-increment expression
-
is_tensor
¶ Return True if a tensor expression, False otherwise.
-
output
¶ Return the symbol written by this Expression.
-
write
¶ Return the function written by this Expression.
-
-
class
devito.ir.iet.nodes.
Element
(element)[source]¶ Bases:
devito.ir.iet.nodes.Node
A generic node in an Iteration/Expression tree. Can be a comment, a statement, …
-
is_Element
= True¶
-
-
class
devito.ir.iet.nodes.
Callable
(name, body, retval, parameters=None, prefix=('static', 'inline'))[source]¶ Bases:
devito.ir.iet.nodes.Node
A node representing a callable function.
Parameters: - name – The name of the callable.
- body – A
Node
or an iterable ofNode
objects representing the body of the callable. - retval – The type of the value returned by the callable.
- parameters – An iterable of
AbstractFunction`s in input to the callable, or ``None`
if the callable takes no parameter. - prefix – An iterable of qualifiers to prepend to the callable declaration. The default value is (‘static’, ‘inline’).
-
is_Callable
= True¶
-
class
devito.ir.iet.nodes.
Call
(name, params=None)[source]¶ Bases:
devito.ir.iet.nodes.Node
A function call.
-
is_Call
= True¶
-
-
class
devito.ir.iet.nodes.
Conditional
(condition, then_body, else_body=None)[source]¶ Bases:
devito.ir.iet.nodes.Node
A node to express if-then-else blocks.
Parameters: -
is_Conditional
= True¶
-
-
class
devito.ir.iet.nodes.
Iteration
(nodes, dimension, limits, index=None, offsets=None, direction=None, properties=None, pragmas=None, uindices=None)[source]¶ Bases:
devito.ir.iet.nodes.Node
Implement a for-loop over nodes.
Parameters: - nodes – Single or list of
Node
objects defining the loop body. - dimension –
Dimension
object over which to iterate. - limits – Limits for the iteration space, either the loop size or a tuple of the form (start, finish, stepping).
- index – Symbol to be used as iteration variable.
- offsets – A 2-tuple of start and end offsets to honour in the loop.
- direction – The
IterationDirection
of the Iteration. Defaults toForward
. - properties – A bag of
IterationProperty
objects, decorating the Iteration (sequential, parallel, vectorizable, …). - pragmas – A bag of pragmas attached to this Iteration.
- uindices – a bag of
DerivedDimension`s with ``dimension`
as root parent, representing additional Iteration variables with unbounded extreme (hence the “unbounded indices”, shortened as “uindices”).
-
bounds
(start=None, finish=None)[source]¶ Return the start and end points of the Iteration if the limits are available (either statically known or provided through
start
/finish
).None
is used as a placeholder in the returned 2-tuple if a limit is unknown.
-
dimensions
¶ Return all
Dimension
objects used in the Iteration header.
-
end
(finish=None)[source]¶ Return the end point of the Iteration if the upper limit is known,
None
otherwise.
-
extent
(start=None, finish=None)[source]¶ Return the number of iterations executed if the limits are known,
None
otherwise.
-
functions
¶ Return all
Function
objects used in the Iteration header.
-
is_Affine
¶
-
is_Elementizable
¶
-
is_Iteration
= True¶
-
is_Parallel
¶
-
is_ParallelAtomic
¶
-
is_ParallelRelaxed
¶
-
is_Remainder
¶
-
is_Sequential
¶
-
is_Vectorizable
¶
-
is_Wrappable
¶
-
retag
(tag_value=None)[source]¶ Create a new Iteration object which is identical to
self
, except for the tag. If provided,tag_value
is used as new tag; otherwise, an internally generated tag is used.
-
start
(start=None)[source]¶ Return the start point of the Iteration if the lower limit is known,
None
otherwise.
-
symbolic_bounds
¶ Return a 2-tuple representing the symbolic bounds of the object.
-
symbolic_end
¶ Return the symbolic end of the Iteration.
-
symbolic_extent
¶ Return the symbolic extent of the Iteration.
-
symbolic_incr
¶ Return the symbolic increment of the Iteration.
-
symbolic_start
¶ Return the symbolic start of the Iteration.
-
tag
¶
- nodes – Single or list of
-
class
devito.ir.iet.nodes.
List
(header=None, body=None, footer=None)[source]¶ Bases:
devito.ir.iet.nodes.Block
A sequence of nodes.
-
is_List
= True¶
-
-
class
devito.ir.iet.nodes.
LocalExpression
(expr)[source]¶ Bases:
devito.ir.iet.nodes.Expression
A node encapsulating a SymPy equation which also defines its LHS.
-
defines
¶ Return any symbols an
LocalExpression
may define.
-
-
class
devito.ir.iet.nodes.
TimedList
(timer, lname, body)[source]¶ Bases:
devito.ir.iet.nodes.List
Wrap a Node with C-level timers.
-
name
¶
-
timer
¶
-
-
class
devito.ir.iet.nodes.
MetaCall
(root, local)¶ Bases:
tuple
Metadata for
Callable`s. ``root`
is a pointer to the callable Iteration/Expression tree.local
is a boolean indicating whether the definition of the callable is known or not.-
local
¶ Alias for field number 1
-
root
¶ Alias for field number 0
-
-
class
devito.ir.iet.nodes.
ArrayCast
(function)[source]¶ Bases:
devito.ir.iet.nodes.Node
A node encapsulating a cast of a raw C pointer to a multi-dimensional array.
-
class
devito.ir.iet.nodes.
ForeignExpression
(expr, dtype, **kwargs)[source]¶ Bases:
devito.ir.iet.nodes.Expression
A node representing a SymPy
FunctionFromPointer
expression.-
dtype
¶
-
is_ForeignExpression
= True¶
-
is_Increment
¶ bool(x) -> bool
Returns True when the argument x is true, False otherwise. The builtins True and False are the only two instances of the class bool. The class bool is a subclass of the class int, and cannot be subclassed.
-
is_scalar
¶ Return True if a scalar expression, False otherwise.
-
is_tensor
¶ Return True if a tensor expression, False otherwise.
-
output
¶ Return the symbol written by this Expression.
-
write
¶ Return the function written by this Expression.
-
-
class
devito.ir.iet.nodes.
Section
(name, body=None)[source]¶ Bases:
devito.ir.iet.nodes.List
A sequence of nodes.
Functionally, a
Section
is identical to aList
; that is, they generate the same code (i.e., theirbody
). However, a Section should be used to define sub-trees that, for some reasons, have a relevance within the IET (e.g., groups of statements that logically represent the same computation unit).-
is_Sequence
= True¶
-
roots
¶
-
-
class
devito.ir.iet.nodes.
HaloSpot
(halo_scheme, body=None, properties=None)[source]¶ Bases:
devito.ir.iet.nodes.List
-
fmapper
¶
-
is_HaloSpot
= True¶
-
is_Redundant
¶
-
mask
¶
-
-
class
devito.ir.iet.nodes.
IterationTree
[source]¶ Bases:
tuple
Represent a sequence of nested :class:`Iteration`s.
-
inner
¶
-
root
¶
-
-
class
devito.ir.iet.nodes.
ExpressionBundle
(shape, ops, traffic, body=None)[source]¶ Bases:
devito.ir.iet.nodes.List
A sequence of :class:`Expression`s.
-
exprs
¶
-
is_ExpressionBundle
= True¶
-
-
class
devito.ir.iet.nodes.
Increment
(expr)[source]¶ Bases:
devito.ir.iet.nodes.Expression
A node representing a += increment.
-
is_Increment
= True¶
-
devito.ir.iet.properties module¶
-
devito.ir.iet.properties.
AFFINE
= affine¶ All
Indexed`s' access functions using the Iteration dimension ``d`
are affine ind
. Further, the Iteration does not contain any Indexed varying ind
used to indirectly access some other Indexed.
-
devito.ir.iet.properties.
ELEMENTAL
= elemental¶ The Iteration can be pulled out to an elemental function.
-
class
devito.ir.iet.properties.
HaloSpotProperty
(name, val=None)[source]¶ Bases:
devito.tools.abc.Tag
A
HaloSpot
decorator.
-
class
devito.ir.iet.properties.
IterationProperty
(name, val=None)[source]¶ Bases:
devito.tools.abc.Tag
An
Iteration
decorator.
-
devito.ir.iet.properties.
PARALLEL
= parallel¶ The Iteration can be executed in parallel w/o need for synchronization.
-
devito.ir.iet.properties.
PARALLEL_IF_ATOMIC
= parallel_if_atomic¶ The Iteration can be executed in parallel as long as all increments are guaranteed to be atomic.
-
devito.ir.iet.properties.
REDUNDANT
= redundant¶ The HaloSpot is redundant given that some other HaloSpots already take care of updating the data accessed in the sub-tree.
-
devito.ir.iet.properties.
REMAINDER
= remainder¶ The Iteration implements a remainder/peeler loop.
-
devito.ir.iet.properties.
SEQUENTIAL
= sequential¶ The Iteration is inherently serial, i.e., its iterations cannot run in parallel.
-
devito.ir.iet.properties.
VECTOR
= vector-dim¶ The Iteration can be SIMD-vectorized.
-
devito.ir.iet.properties.
WRAPPABLE
= wrappable¶ The Iteration implements modulo buffered iteration and its expressions are so that one or more buffer slots can be dropped without affecting correctness. For example, u[t+1, …] = f(u[t, …], u[t-1, …]) –> u[t-1, …] = f(u[t, …], u[t-1, …]).
devito.ir.iet.scheduler module¶
-
devito.ir.iet.scheduler.
iet_build
(stree)[source]¶ Create an Iteration/Expression tree (IET) from a
ScheduleTree
. The nodes in the returned IET are decorated with properties deriving from data dependence analysis.
-
devito.ir.iet.scheduler.
iet_insert_C_decls
(iet, func_table=None)[source]¶ Given an Iteration/Expression tree
iet
, build a new tree with the necessary symbol declarations. Declarations are placed as close as possible to the first symbol use.Parameters: - iet – The input Iteration/Expression tree.
- func_table – (Optional) a mapper from callable names within
iet
to :class:`Callable`s.
devito.ir.iet.utils module¶
-
devito.ir.iet.utils.
filter_iterations
(tree, key=<function <lambda>>, stop=<function <lambda>>)[source]¶ Given an iterable of
Iteration
objects, return a new list containing all items such thatkey(o)
is True.This function accepts an optional argument
stop
. This may be either a lambda function, specifying a stop criterium, or any of the following special keywords:* 'any': Return as soon as ``key(o)`` is False and at least one item has been collected. * 'asap': Return as soon as at least one item has been collected and all items for which ``key(o)`` is False have been encountered.
It is useful to specify a
stop
criterium when one is searching the first Iteration in an Iteration/Expression tree for which a given property does not hold.
-
devito.ir.iet.utils.
retrieve_iteration_tree
(node, mode='normal')[source]¶ Return a list of all
Iteration
sub-trees rooted innode
. For example, given the Iteration tree:Iteration i expr0 Iteration j Iteraion k expr1 Iteration p expr2
Return the list:
[(Iteration i, Iteration j, Iteration k), (Iteration i, Iteration p)]
Parameters: - node – The searched Iteration/Expression tree.
- mode – Accepted values are ‘normal’ (default) and ‘superset’, in which case iteration trees that are subset of larger iteration trees are dropped.
devito.ir.iet.visitors module¶
Visitor hierarchy to inspect and/or create IETs.
The main Visitor class is adapted from https://github.com/coneoproject/COFFEE.
-
class
devito.ir.iet.visitors.
FindNodes
(match, mode='type')[source]¶ Bases:
devito.ir.iet.visitors.Visitor
-
classmethod
default_retval
()[source]¶ A method that returns an object to use to populate return values.
If your visitor combines values in a tree-walk, it may be useful to provide a object to combine the results into.
default_retval()
may be defined by the visitor to be called to provide an empty object of appropriate type.
-
rules
= {'scope': <function FindNodes.<lambda> at 0x1142eca60>, 'type': <function FindNodes.<lambda> at 0x1142ec9d8>}¶
-
classmethod
-
class
devito.ir.iet.visitors.
FindSections
[source]¶ Bases:
devito.ir.iet.visitors.Visitor
-
classmethod
default_retval
()[source]¶ A method that returns an object to use to populate return values.
If your visitor combines values in a tree-walk, it may be useful to provide a object to combine the results into.
default_retval()
may be defined by the visitor to be called to provide an empty object of appropriate type.
-
visit_Call
(o, ret=None, queue=None)¶
-
visit_Element
(o, ret=None, queue=None)¶
-
classmethod
-
class
devito.ir.iet.visitors.
FindSymbols
(mode='symbolics')[source]¶ Bases:
devito.ir.iet.visitors.Visitor
-
classmethod
default_retval
()[source]¶ A method that returns an object to use to populate return values.
If your visitor combines values in a tree-walk, it may be useful to provide a object to combine the results into.
default_retval()
may be defined by the visitor to be called to provide an empty object of appropriate type.
-
rules
= {'defines': <function FindSymbols.<lambda> at 0x1142ec6a8>, 'free-symbols': <function FindSymbols.<lambda> at 0x1142ec620>, 'symbolics': <function FindSymbols.<lambda> at 0x1142ec598>}¶
-
visit_ArrayCast
(o)¶
-
visit_Block
(o)¶
-
visit_Call
(o)¶
-
visit_Conditional
(o)¶
-
classmethod
-
class
devito.ir.iet.visitors.
MapExpressions
[source]¶ Bases:
devito.ir.iet.visitors.FindSections
Map
Expression
andCall
objects in the Iteration/Expression tree to their respective section.-
visit_Element
(o, ret=None, queue=None)¶
-
visit_Expression
(o, ret=None, queue=None)¶
-
-
class
devito.ir.iet.visitors.
IsPerfectIteration
[source]¶ Bases:
devito.ir.iet.visitors.Visitor
Return True if an
Iteration
defines a perfect loop nest, False otherwise.
-
class
devito.ir.iet.visitors.
XSubs
(mapper=None, replacer=None)[source]¶ Bases:
devito.ir.iet.visitors.Transformer
Transformer
that performs substitutions onExpression`s in a given tree, akin to SymPy's ``subs`
.Parameters: - mapper – (Optional) dictionary defining the substitutions.
- replacer – (Optional) a function to perform the substitution. Defaults
to SymPy’s
subs
.
-
class
devito.ir.iet.visitors.
CGen
[source]¶ Bases:
devito.ir.iet.visitors.Visitor
Return a representation of the Iteration/Expression tree as a :module:`cgen` tree.
-
class
devito.ir.iet.visitors.
Transformer
(mapper={}, nested=False)[source]¶ Bases:
devito.ir.iet.visitors.Visitor
Given an Iteration/Expression tree T and a mapper from nodes in T to a set of new nodes L, M : N –> L, build a new Iteration/Expression tree T’ where a node
n
in N is replaced withM[n]
.In the special case in which
M[n]
is None,n
is dropped from T’.In the special case in which
M[n]
is an iterable of nodes,n
is “extended” by pre-pending to its body the nodes inM[n]
.-
visit_list
(o, **kwargs)¶
-
-
class
devito.ir.iet.visitors.
FindAdjacent
(match)[source]¶ Bases:
devito.ir.iet.visitors.Visitor
-
classmethod
default_retval
()[source]¶ A method that returns an object to use to populate return values.
If your visitor combines values in a tree-walk, it may be useful to provide a object to combine the results into.
default_retval()
may be defined by the visitor to be called to provide an empty object of appropriate type.
-
classmethod
-
class
devito.ir.iet.visitors.
MapIteration
[source]¶ Bases:
devito.ir.iet.visitors.FindSections
Map each
Iteration
object in the Iteration/Expression tree to the enclosedExpression
andCall
objects.-
visit_Element
(o, ret=None, queue=None)¶
-
visit_Expression
(o, ret=None, queue=None)¶
-


Updating IHaskell to a Newer GHC
As the current maintainer of IHaskell, I see myself as having one primary responsibility: keeping it up-to-date with newer GHC releases. The chain of events that led to me becoming a maintainer started with the then-latest version of IHaskell not having support for GHC 8.0, and I still remember how frustrated I felt when dealing with this limitation.
Since then I’ve had the opportunity to add GHC 8.2, 8.4, 8.6, 8.8, 8.10, and now 9.0 support, but because I only have to do this every 6 months or so (at the earliest) I promptly forget the details of this work afterwards and have to spelunk through old, often heavily amended, commits to rediscover what past me (who is notoriously bad at documentation) did.
At the time of writing, GHC 9.2 is expected to be released soon and I don’t want to forget everything I’ve just (re)learned when that happens. Additionally, it is conceivable that at some point someone other than me would like to take a crack at updating IHaskell to the newest version of GHC. This blog post details the steps I took to make these tasks easier in the future.
Building IHaskell’s dependencies
I should start by saying that my current approach relies heavily on Nix and the
infrastructure available in nixpkgs
. If
you don’t want to use Nix for whatever reason the general ideas might still
translate to whatever method you use instead but the details will almost
certainly vary widely.
The objective of this first step is to get us to the point where all of
IHaskell’s dependencies are building, so that we can then focus on
ghc-parser
, ipython-kernel
, and ihaskell
exclusively.
I start with a version of Nixpkgs that has the necessary GHC version and
package overrides to minimise work. As of this writing, the Nixpkgs maintainers
base the Haskell package set they use on Stackage
Nightlies with overrides added from
head.hackage
. Updates seem to
go into the
haskell-updates
branch first and are then periodically merged into master
. I started with
this
commit
but it had issues with building alex
that I sent pull requests for to
Nixpkgs and to the
project. In the meantime it’s very
easy to make any required changes to a fork or a local copy of Nixpkgs. I start
by copying release.nix
from the IHaskell project root and changing the
reference to Nixpkgs:
Changing Nixpkgs
let
nixpkgs-src = builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/tarball/8795d39ce70f04e3fd609422d522e5b2594f3a70";
sha256 = "01w7q0nqydippj0ygbg77byb770snhc5rnqzc6isws58642l8z4s";
};
in
{ compiler ? "ghc901"
, jupyterlabAppDir ? null
, nixpkgs ? import nixpkgs-src {}
, packages ? (_: [])
, pythonPackages ? (_: [])
, rtsopts ? "-M3g -N2"
, systemPackages ? (_: [])
}:
Then it’s possible to build this and see how many packages need changes:
$ nix-build release-9.0.nix --keep-going 2>&1 | wc -l
Fixing the affected packages might involve patching, jailbreaking it so that its dependency bounds are relaxed, using a newer version that is not included in the package set by default, or any number of other changes. Here’s what I ended up with this time:
Package set overrides
-md5 = nixpkgs.haskell.lib.doJailbreak super.cryptohash-md5;
cryptohash-sha1 = nixpkgs.haskell.lib.doJailbreak super.cryptohash-sha1;
cryptohash
basement = super.basement_0_0_12;
foundation = super.foundation_0_0_26_1;(nixpkgs.fetchpatch {
memory = nixpkgs.haskell.lib.appendPatch super.memory url = "https://gitlab.haskell.org/ghc/head.hackage/-/raw/c89c1e27af8f180b3be476e102147557f922b224/patches/memory-0.15.0.patch";
sha256 = "0mkjbrzi05h1xds8rf5wfky176hrl03q0d7ipklp9x4ls3yyqj5x";
});
(nixpkgs.fetchpatch {
cryptonite = nixpkgs.haskell.lib.appendPatch super.cryptonite url = "https://gitlab.haskell.org/ghc/head.hackage/-/raw/6a65307bbdc73c5eb4165a67ee97c7b9faa818e1/patches/cryptonite-0.28.patch";
sha256 = "1wq9hw16qj2yqy7lyqbi7106lhk199hvnkj5xr7h0ip854gjsr5j";
});
"profunctors" profunctors-src {}; # `profunctors-src` is defined above
profunctors = self.callCabal2nix -traversable = nixpkgs.haskell.lib.dontCheck super.mono-traversable; mono
After every few changes, I like to rerun nix-build
and watch the number go
down. It’s also possible to build an individual package, e.g. to build
foundation
(and any dependencies) one would run
$ nix-build release-9.0.nix -A passthru.haskellPackages.foundation
This is what the final release-9.0.nix
looked
like.
Eventually only ghc-parser
, maybe ipython-kernel
, and ihaskell
should fail to
build.
Updating ghc-parser
ghc-parser
has the fewest dependencies of the three packages we are changing
so it makes sense to start there. I’m relatively low-tech as far as development
workflow goes and I prefer ghcid
and a text editor, mostly because I haven’t
yet figured out how to get anything more advanced to work. To get ghcid
running, assuming you have it installed globally like I do, you relax the
version bounds in ghc-parser.cabal
and run
$ nix-shell release-9.0.nix -A passthru.haskellPackages.ghc-parser.env
$ cd ghc-parser
$ runhaskell Setup.hs configure
$ ghcid -c runhaskell Setup.hs repl lib:ghc-parser
Most of the compilation errors are related to this GHC module
restructuring that started
in GHC 8.10 and continued in GHC 9.0. If I had kept better notes from last time
I would have looked at
ghc-api-compat
which offers
a compatibility shim and whose
.cabal
file makes translating between old and new module names very easy. Instead
I ended up looking at the GHC 9.0 API
Haddocks
and the GHC 8.10 API
Haddocks. As an aside, I am
irritated that the most recently released GHC API documentation isn’t available
on Hackage. I also like to have a local checkout of the GHC source so that
I can look at the code across different commits if required.
These are the changes I needed to make to
ghc-parser
.
Updating ipython-kernel
ipython-kernel
doesn’t depend on the GHC API directly, so changes to it are
usually related to breaking API changes in other dependencies. In this case, no
changes were required!
Updating ihaskell
This is usually the most involved package to update, as its operation is intimately tied with the details of the GHC API. Most of the changes required were for three reasons:
The aforementioned module hierarchy change
Changing the terminology from “packages” to “units” as described in this commit
Removing specialised
gcatch
,gtry
, etc. functions in favour of the more general versions inexceptions
, as detailed in this section of the release notes
As before, it’s possible to get ghcid
running with
$ nix-shell release-9.0.nix -A passthru.haskellPackages.ghc-parser.env
$ runhaskell Setup.hs configure --enable-tests
$ ghcid -c runhaskell Setup.hs repl lib:ihaskell
After getting everything compiling, I like to build the ihaskell
package by
running
$ nix-build release-9.0.nix -A passthru.haskellPackages.ihaskell
because this sets up the test environment correctly (i.e. putting the built
ihaskell
executable in the $PATH
) before running tests, although course you
could do this manually. This usually catches any issues that have slipped
through and small formatting changes in GHC output across
versions.
Here are the changes I made to
ihaskell
.
Acceptance testing
Since IHaskell bridges the Jupyter and GHC ecosystems, we have an acceptance
test that essentially runs an IHaskell notebook through
nbconvert
and ensures that the
output is identical to the input. Because GHC output (amongst other things)
differs across GHC versions, this acceptance test was frequently broken and/or
a bad indicator of whether any changes were correct. Recently James
Brock simplified and greatly improved the
acceptance test to be more reliable. Unfortunately the latest releases of
Jupyter now include additional metadata with each response including the time
of reply, which cannot be expected to be the same across runs. In the past it’s
been possible to filter the offending fields out using grep -e
but a more
sophisticated approach was required this time so I took the opportunity to
learn a little more about jq
and used that
instead. This new approach should also be more flexible and better at
accommodating future output changes.
Here are the changes I made to the acceptance tests.
Using the updated IHaskell
We’re done! I like to quickly try out a new notebook, as a quick test that everything works as expected (and also for the novelty of being the first person to try IHaskell on the newest GHC). To do this, I run
$ nix-build release-9.0.nix
$ result/bin/jupyter-notebook