text:
Get Government & Politics updates in your inbox!
Stay up-to-date on the latest in local and national government and political topics with our newsletter.
Vaccine mandate has the potential to worsen staffing shortages at Wyoming health care facilities
alert top story
Victoria Eavis
IV bags hang in the hallways of the ICU at Wyoming Medical Center in Casper. The U.S. Supreme Court left in place a federal order that will require workers at most health care facilities to be vaccinated against COVID-19.
Cayla Nimmo file, Star-Tribune
A vaccine mandate for health care facilities that receive federal funding will remain in place, the U.S. Supreme Court ruled Thursday, a decision that observers say has the potential to worsen existing staffing shortages at facilities across the state.
The Biden administration's mandate applies to health care facilities that receive money from the Centers for Medicare and Medicaid Services. The mandate allows for medical and religious exemptions, and it's unclear whether health workers who refuse to be vaccinated will lose their jobs.
Nonetheless, Thursday's 5-4 ruling is expected to be felt across the state.
All of the state's 38 nursing homes and 28 hospitals take federal money, according to Eric Boley, president of the Wyoming Hospital Association. The state's own facilities — Wyoming State Hospital, Wyoming Life Resource Center and the Wyoming Retirement Center — will also be affected.
Wyoming has the second-lowest vaccination rate in the nation, trailed only by Idaho.
"We're already short-staffed, and we can't afford to lose more employees at this point," Boley said. "Pick any place in the state and there will be shortages."
While Boley acknowledged that vaccines are the best defense against the virus, he believes the mandates should not be carried out by the federal government. Instead, they should be handled on a more "local or regional basis."
The Supreme Court decision comes at a time when COVID-19 hospitalizations are down in the state, but that doesn't mean the state's hospitals aren't still at risk of being overwhelmed.
"We have enough beds, but we don't have enough staff to staff them," Boley said.
As Wyoming begins the third year of the pandemic, part of the staffing shortages are due to burnout, Boley said. The virus had increased demand for services, and its politicization means workers sometimes bear the brunt of bad feelings.
"They've been looked at as heroes, and now they're being viewed as villains," Boley said.
In a statement, Gov. Mark Gordon briefly acknowledged the potential harms if health workers leave their jobs rather than be vaccinated.
"It is disappointing that the Court did not reach a similar conclusion on the CMS vaccine mandate," Gordon said. "I continue to maintain that healthcare workers should not be forced to choose between vaccination and termination. We are still in the process of evaluating the impacts of this ruling on Wyoming's healthcare workforce."
How health care providers proceed in Wyoming remains to be seen. A handful of hospitals already have their own vaccine requirements for staff. That includes the four operated by Banner Health, which oversees the state's largest, Wyoming Medical Center.
Cheyenne Regional Medical Center, on the other hand, has a looser policy. Currently, Cheyenne Regional requires that staff be vaccinated, but allows those who are unvaccinated against the virus to be tested regularly. That policy will not be admissible under the federal mandate.
"With what these folks have faced, it's a tough situation to say, 'You can't stay in this industry' when they've dedicated their whole lives to it," Boley said.
At the same time that the court allowed the mandate for health care facilities to move forward, the justices blocked the vaccine mandate for some companies.
Worker mandate rejected
The mandate would have applied to companies that employ over 100 workers, amounting to more than 80 million people nationwide. If workers declined to be vaccinated, they would have been required to submit to masking and weekly testing.
"OSHA has never before imposed such a mandate. Nor has Congress. Indeed, although Congress has enacted significant legislation addressing the COVID–19 pandemic, it has declined to enact any measure similar to what OSHA has promulgated here," the conservative justices wrote in an unsigned opinion.
Wyoming's top politicians celebrated the news.
"This is a huge win," Sen. Cynthia Lummis said in a tweet. "The federal government has no place making far-reaching mandates that put an undue burden on businesses across Wyoming."
Gordon has been outspokenly against both mandates and vowed that the Attorney General would fight them in court.
"We are delighted that the Supreme Court ruled favorably on our petition regarding OSHA's authority. This is a victory for Wyoming businesses and their workers," Gordon said in a statement Thursday. "The court rightfully recognized this action by the Biden Administration for what it was — a blatant example of federal overreach."
In the fall, the Wyoming Legislature even went as far as to convene a special session in an attempt to fight back against the vaccine mandate for workers. In the end, they did not pass any laws, but they did allocate $4 million for the state to fight the mandates in court.
"Stopping this massive government overreach is a victory for all Americans who value the Constitution and their personal freedoms," Sen. John Barrasso, a longtime physician, said in a statement.
Follow state politics reporter Victoria Eavis on Twitter @Victoria_Eavis
Gov. Mark Gordon
Cynthia Lummis
John Barrasso
Covid 19; Corona Virus; Corona; Virus; Triage; Healthcare; Clinic
Eric Boley
State politics reporter
Follow Victoria Eavis
SCOTUS blocks vaccine mandate for business, allows mandate for some healthcare facilities
All branches of the Wyoming government have been focused on fighting both mandates for the last few months.
Surges, variants did little to change demand for COVID-19 vaccine in Wyoming
Vaccination numbers fell considerably in Wyoming after President Biden announced his worker vaccine mandate.
What comes next in NY's investigation of Trump
NY AG alleges evidence of fraud at Trump business
NASA's Curiosity Rover may have been finding traces of alien life on Mars all along


Experience the unique character of Amlach with a stay in a vacation home rental. You'll find plenty to explore during your stay in the area. Many of our vacation rentals offer full kitchens, spacious living quarters and sometimes even a hot tub—perfect for a relaxing getaway.
Where to stay around Amlach?
Our 2019 property listings offer a large selection of 174 vacation rentals near Amlach. From 22 Houses to 133 Condos/Apartments, find a unique house rental for you to enjoy a memorable stay with your family and friends. The best places to stay near Amlach for a holiday or a weekend are on HomeAway.
Can I rent Houses in Amlach?
Can I find a vacation rental with pool in Amlach?
Yes, you can select your preferred vacation rental with pool among our 40 vacation rentals with pool available in Amlach. Please use our search bar to access the selection of vacation rentals available.


Free to download A.C. Siena vector logo in .EPS vector format. Browse to see more A.C. Siena related vector logos. Download A.C. Siena vector logo in .EPS format, and open with Adobe Illustrator or Adobe PhotoShop or CorelDRAW.
Associazione Calcio Siena (often referred to as 'Robur' or simply 'Siena') is an Italian football club based in Siena. They currently play in Serie B, as they were relegated from Serie A in the 2012-13 season.
Siena play their home games at the Stadio Artemio Franchi. The ground's capacity is only 15,725 and is located in Siena itself, whereas its more famous namesake is located in Florence. In March 2011, A.C. Siena announced plans to move to a new stadium at Isola d'Arbia, at the southern end of the city. The 20,000 seat stadium features a unique below-ground design and was awarded an MIPIM AR Future Projects Award for 2011.


Do Orange Blue Ice Crew members get to meet/hang out with the team/players?Absolutely not. As with most professional teams across the various leagues there are very strict rules and regulations prohibiting fraternization with the team, players, coaches, and officials. There is a zero tolerance policy in place.
cheap moncler The aquarium is open from 9 5 each day and admission is anywhere from $15 22 for the museum only. You could choose to do the IMAX movie for a little extra. Kids under 3 are free. I know this is really lengthy, but I am in desperate need of help, my self esteem is shot, and I am paralyzed with fear. I don know what to do. I wrote enough to set up the scenario and my history for you, to give you a better picture cheap moncler.


text:
Q: When an idempotent element is irreducible Let $R$ be a commutative ring with 1, and $e^2=e$ be an idempotent element of $R$. Recall that an irreducible idempotent is an idempotent $a$ for which $Ra $ is a simple $R$-module.

Question: Is the following true: An  idempotent element $e$ of $R$ is irreducible if and only if the ring $Re $ is a field?

A: Yes, suppose that $e$ is an irreducible idempotent. We are going to show that $Re$ is a field with neutral $e$. Let $x$ a non zero element of $R$
 The submodule of $Re$ generated by $xe$ is $Re$. So there exists $y$ such that $yxe=e=yexe$. We deduce that the inverse of $xe$ is $ye$.

redpajama_set_name: RedPajamaStackExchange


text:
Get your Guide now!
5 Step Guide to Maintaining Sales During COVID-19
I'll also keep you in the loop about resource updates, events, and my next course launch.
We won't send spam. Unsubscribe at any time.
ABOUT PRIVATE COACHING CORPORATE TRAINING ONLINE LEARNING RESOURCES BLOG CONTACT
Hands-On Marketing; The Small Business-Owner's Guide to Advertising & Branding
All too often I hear the phrase "when it comes to advertising, I throw stuff at the wall and see what sticks."
I know there's a better way.
But most of the advertising resources available are written for big brands with big budgets. What's more, they're focused solely on online strategies. So, I wrote a book that covers what any small business owner needs to know to navigate their advertising and branding.
I like to think of it as the confused business owner's guide to advertising - with purpose.
It's an information manual and workbook designed to help you figure out which tools to choose to get the job done for your business. We cover the online and traditional advertising options you have available and even include an Action Plan that will guide you through creating a customized strategy for your business. There are lots of real-life examples and stories too, giving you the inspiration you need to tell your story proudly, whether you are brand new to the business, or a seasoned veteran.
Available on Amazon and at Saskatoon bookstores including Indigo, Coles, McNally Robinson, and SaskMade Marketplace.
Sales & marketing focused coaching & training to give your business or career a boost.
"Your greatness is limited only by the investment you make in yourself." - Grant Cardone
© 2023 Boost Strategic Coaching
Terms Privacy Boost Coaching

redpajama_set_name: RedPajamaCommonCrawl


As part of an investigation into the online book selling habits of Robert D'Angelo, a man who has been indicted on tax evasion and mail fraud charges, the FBI was seeking to force Amazon to hand over the records of nearly 24,000 books the man had sold through the site over the past four years, including the names of thousands of buyers.
Luckily for its customers' peace of mind, Amazon has managed to halt this particular probe in court after US Magistrate Judge Stephen Crocker ruled customers have a First Amendment right to keep their reading habits from the government and that allowing such a request to go forward could scare people away from e-commerce overall.
Amazon instead offered to inform its customers of the FBI's request and let them decide if they wanted to help the authorities. The real kicker though, is that the FBI rejected this offer after they found the information they needed sitting on one of D'Angelo's seized computers, leading Judge Crocker to criticize them for not discovering such alternatives before pushing at Amazon.


As a business professional, you need a constant supply of information to achieve success. You must stay aware of trends and issues and keep up with rapid economic and technological changes to become and stay competitive. Your "Knowledge Network" or what I call the Information component of your Network consists of your most knowledgeable sources, the people who can provide you with the knowledge and expertise you need to run a successful operation.
You may have discovered already that it is next to impossible to keep up with all this information on your own. There is simply too much of it, and your own inclinations and time limitations steer you toward some kinds of knowledge and cause you to neglect others. You may be strong in marketing and business planning but weak in personnel and legal matters.
Fortunately, the knowledge you lack is always someone else's specialty, so you can turn to others for help. This is what you are preparing to do when you set up your Network's Information component – a web of contacts who know and understand what you must do to achieve success in your profession or business, who have the experience to help you achieve your goals.
There are usually at least a few people who can help you deal with certain issues or special problems that you may encounter in the business or profession you are in or are interested in entering. In lieu of specific knowledge, you must know in advance whom to contact and where to go to get the information you need. What sorts of people should you include in your Information Network?
There are some real advantages to seeking out people who have the same interests and goals as you and who are trying to achieve the same thing you want to achieve. They are collecting the type of information you need, and vice versa; partnering with them can help you both get it faster by dividing the research effort.
As a rule, your best information sources will be people who are doing successfully what you want to do (perhaps in a different location or serving a different clientele). They will be aware of current trends and issues in your field and may have already faced some of the challenges you are now facing. Try to identify and speak with three to five individuals who fit this category. They will have current directories, manuals, and information about upcoming events related to your profession, as well as relationships with vendors you may need to hire.
Find out why these people are no longer in the profession. What happened to their business? What are they doing now? Did they make the right decision to leave the profession? Talk with people who were successful and people who were not. Depending on the industry and the length of time the person has been aware away from it, this information may be valuable in helping you plan.
People who write or produce books, articles, audiotapes, and videotapes on your profession are key subject experts. They usually have broad or deep knowledge about procedures, systems, technologies, tactics, and developments in your field. A few tips from these individuals could save you money and time.
People who regulate, audit, or monitor professionals in your field can certainly tell you stories about the legal, procedural, and operational pitfalls that you might run into, and probably know how to survive them. You may even discover legal loopholes that can make life and business easier.
The wonderful thing about trainers is that they specialize in imparting knowledge. They help people understand the basics; they introduce new technologies, procedures, and techniques. Try to gain access to their training materials; if necessary, sign up for training sessions.
Professionals use advisors and consultants to help them solve problems that they find difficult to handle alone or to deal with impending change. Some consultants are generalists, others, specialists. Most are skilled in assessing problems.
People who are active members of trade, business, and professional organizations are prolific sources of information. Their membership gives them access to directories, newsletters, seminars, presentations, calendars of events, and more. By networking, they stay in touch with industry issues and trends. Spending time with them will help you discover new ways to do things.
Using the Information Network Component Tool located here: http://www.bni.com/bbr/InformationNetworkComponentTool.PDF, first write the names of people you know, or know of, who fit each category. Write as many names as you can think of before you do anything else; try to name at least three people in each category. If necessary, you can use a name in more than one category, but it's better to come up with as many individuals as possible. Remember, it's information you're after, and more people means more information. Once you've written down as many names as you can think of, go back and fill in the contact information for each one.
When you've completed as much of this as you can, start connecting with these people to enhance and improve your Knowledge Network. As you do this, your Network and the information you need to build your business will expand and grow.


later i learned that you can (kind of) fake the effect of the liquid center if you add a lindt lindor praline to the center pre or post baking! my love of vanilla and white chocolate was enough to give me the idea for these hidden suprise cupcakes (well, not so much of a surprise now anymore, duh).
disclaimer: you need a distinctive sweet tooth for these, but hey, comes in handy on some days? besides, the hummingbird bakery recipe for cupcakes and frosting are definitely worth the "perfect" and "best in class" predicate (yet again).
preheat the oven to 375 f / 190 c and line a muffin tray with cupcake liners. in a large bowl, combine flour, sugar, baking powder, salt and vanilla. mix well with a handmixer until the texture is crumbly and sandy. stir together egg and milk and add to the mixture bit by bit. mix until incorporated and the batter is smooth. fill into the prepared liners (3/4 full). bake for 20 to 25 minutes or until the cakes are slightly golden or until a skewer inserted comes out clean. let the cupcakes cool a little, then cut an x shape into each on the top. insert a lindor truffle into each cake, so that it almost hides on the top of the cupcake. let cool completely on a wire rack.
in the meantime, prepare the frosting. combine the confectioners' sugar and butter in a bowl with a stand mixer. add the vanilla and milk spoon by spoon and mix for about 5 minutes until the frosting is fluffy and light and creamy. add a drop or two of pink food coloring for a blush pink effect. fill the frosting into a pipe with a round nozzle and decorate cupcakes. place a blackberry on top of each.
note: do not refrigerate as the lovely lindor core will harden.
thank you micha! they're actually "nuts and apéro" bowls for parties (chuckle). but i thought why not use them as liners? they're much more solid and less "transparent" than your average liners.
i don't recall where i bought them but it was on some or other swiss bake- and gastronomy supplies online shop. good luck!


Finally got some time to head down to six pipes today.
Alot of people fishing. And i wasn't really sure where to cast the traps. So i threw at the side that's closer to the sailing centre side. Was actually thinking of throwing at the big drain further in.. but decided to stick to the outside la. any brothers throw at the big drain before?
Got a big flower crab too! but it somehow escaped my storage net!
conclusion: good place to crab! better than kelong walk in my opinion. will make a mental note to go there when the tide is just rising next time!
I'd never expect six pipes to be one of the better crabbing spots and you've caught a mud crab there. Nice work there. You have to step firmly on its shell so it doesn't slip and get a chance to snip you. If it's not scuttling away, just wait a little bit while the atmosphere tires the crab out.
Nice catch there law !
How does the crab taste like ? is it good ?


text:
Today's Globe Politics Opinion Magazine Education Science NECN Special reports Obituaries
Traffic | Weather
Home > News > Boston Globe > Opinion > Op-ed
CATHY YOUNG
GOP's `Christian nation'
By Cathy Young, Globe Columnist | July 12, 2004
AFTER A SHORT respite from the fight over the Pledge of Allegiance, the Republican Party has once again thrown itself into the fray over issues of church and state. This time it's the Republican Party of Texas, President Bush's home state, which has approved a plank in its platform affirming that "the United States of America is a Christian nation."
The plank, which also pooh-poohs "the myth of the separation of church and state," has elicited protests from Jewish groups. So far, however, it has not been rejected by the national Republican Party. This is in contrast to a similar flap in 1992: A statement by then-Mississippi Governor Kirk Fordice at a Republican governors' convention that "the United States is a Christian nation" was met with rebukes from leading Republicans, and Fordice eventually had to apologize.
True, the Texas Republican Party's plank also includes the "Judeo-Christian" formula that the national Republican leadership defended in 1992 ("our nation was founded on fundamental Judeo-Christian principles based on the Holy Bible"). But the affirmation of Christianity as the core of the American spirit rings far louder than the small nod to the Jewish heritage.
Some conservatives in the media have not merely refused to criticize the "Christian nation" plank but rallied to its defense. Interviewing Texas Republican Party chairwoman Tina Berkiser, the Fox News Channel's Bill O'Reilly described the plank as "largely symbolic" response to secularist activists and judges who would throw God out of the public square. On another Fox News show, "Hannity & Colmes," guest host Mike Gallagher suggested that objections to the plank stemmed from anti-Christian "bigotry."
Secularist bigotry does exist. It can be found in policies that forbid any mention of faith in student graduation speeches in public schools, in campaigns to get Christmas decorations off public property, or in the recent successful push by the American Civil Liberties Union to remove a tiny cross from the Los Angeles County seal. But it is hardly bigoted to see the "Christian nation" plank as an affirmation of Christian supremacy, relegating non-Christians (if only in a "symbolic" way) to second-class status.
On "Hannity & Colmes," Gallagher asserted that the plank was a simple statement of a numerical fact. "If a neighborhood had 82 percent of the population that was Italian or a town had 82 percent of the population that was Polish, we'd call those communities Italian or Polish towns. So why do liberals have such a knee-jerk reaction when anybody dares to suggest that with 82 percent of the population being Christian -- we are, in fact, a Christian nation?"
Well, for one, if a town council passed a resolution affirming that it was an Italian or Polish town, there'd be a strong reaction, too. Such a resolution would be perceived as a clear statement that members of other ethnic groups are not welcome.
If we're going by the numbers, why not have a party platform asserting that the United States is "a white nation"? After all, 77 percent of Americans are white.
As for the plank's historical aspects, few would dispute that Christianity has played a central role in American history and culture. But the foundation of the American political system rests at least in equal measure on the secular philosophy of the Enlightenment.
On "Hannity & Colmes," the Rev. Jerry Falwell, the prominent evangelical leader, asserted that it is precisely because America is a Christian nation that Jewish, Muslim, Hindu, or atheist Americans enjoy the freedom they do. That statement, however, reeks of ignorance: Plenty of Christian nations have had a sad record of religious intolerance and persecution. America's religious freedom is the product of a unique blend of Judeo-Christian and Enlightenment values; as Susan Jacoby documents in her recent book, "Freethinkers: A History of American Secularism," tension between these two strands of our culture has persisted throughout our history.
Numerically, the United States is a predominantly Christian nation. That's a factual statement -- just like the statement that historically, Christianity has been a major force in our public life. But to call the United States a "Christian nation" is an assertion of ideology, not fact -- particularly coming from the same corner as efforts to legislate religious beliefs about homosexuality or abortion.
The Republican Party's apparent embrace of such attitudes is troubling. It lends credence to the notion that our war against radical Islamic terrorism is a religious war. And it alienates many Americans who support the Republican values of limited government and strong defense but also regard the separation of church and state as a bedrock American principle, not a "myth."
Cathy Young is a contributing editor at Reason magazine. Her column appears regularly in the Globe.
50% off Globe home delivery. Order today!
PRINTER FRIENDLY E-MAIL TO A FRIEND
TOP E-MAILED ARTICLES
SEARCH GLOBE ARCHIVES
Today (free)
Yesterday (free)
feedback | help | site map | globe archives | rss
© 2004 The New York Times Company


This is a 1.5 kilowatt Variable Frequency Drive (VFD or Inverter) that accepts 220v single or three phase. The inverter max frequency is 400Hz . The inverter comes with an instruction manual.
Note: connecting the inverter to mains power will require wiring of the plug to the inverter. We recommend seeking a licensed electrician for this part of the wiring.


text:
bandali's master of mathematics
I graduated from the University of Waterloo with the degree of Master of Mathematics in Computer Science in Spring 2020. My research at the Waterloo Formal Methods group focused on formal logic, model checking, and verification; under supervision of Prof. Nancy Day.
A Comprehensive Study of Declarative Modelling Languages
Jump to: thesis | presentation | models
Reference version: pdf | bib
LaTeX sources: tar.gz | zip
Declarative behavioural modelling is a powerful modelling paradigm that enables users to model system functionality abstractly and formally. An abstract model is a concise and compact representation of key characteristics of a system, and enables the stakeholders to reason about the correctness of the system in the early stages of development.
There are many different declarative languages and they have greatly varying constructs for representing a transition system, and they sometimes differ in rather subtle ways. In this thesis, we compare seven formal declarative modelling languages B, Event-B, Alloy, Dash, TLA+, PlusCal, and AsmetaL on several criteria. We classify these criteria under three main categories: structuring transition systems (control modelling), data descriptions in transition systems (data modelling), and modularity aspects of modelling. We developed this comparison by completing a set of case studies across the data- vs. control-oriented spectrum in all of the above languages.
Structurally, a transition system is comprised of a snapshot declaration and snapshot space, initialization, and a transition relation, which is potentially composed of individual transitions. We meticulously outline the differences between the languages with respect to how the modeller would express each of the above components of a transition system in each language, and include discussions regarding stuttering and inconsistencies in the transition relation. Data-related aspects of a formal model include use of basic and composite datatypes, well-formedness and typechecking, and separation of name spaces with respect to global and local variables. Modularity criteria includes subtransition systems and data decomposition. We employ a series of small and concise exemplars we have devised to highlight these differences in each language. To help modellers answer the important question of which declarative modelling language may be most suited for modelling their system, we present recommendations based on our observations about the differentiating characteristics of each of these languages.
This thesis is free software: you can redistribute it and/or modify
This thesis is distributed in the hope that it will be useful,
along with this thesis.  If not, see <https://www.gnu.org/licenses/>.
A copy of the GNU General Public License is available from the COPYING file included in both of the LaTeX source archives linked above, and also the COPYING.GPL file on this site.
Reference version: pdf (coming soon)
LaTeX sources: tar.gz | zip (coming soon)
This is the presentation I delivered to my supervisor and the second readers of my thesis on 30 June 2020, as announced on the Cheriton School of Computer Science website.
Reference version: tar.gz | zip (coming soon)
Copyright © 2020 bandali. This work is licensed under GNU GPLv3+.


text:
OPINION: The Corporate Takeover of Ukrainian Agriculture
By Frederic Mousseau
At the same time as the United States, Canada and the European Union announced a set of new sanctions against Russia in mid-December last year, Ukraine received 350 million dollars in U.S. military aid, coming on top of a one billion dollar aid package approved by the U.S. Congress in March 2014.
Kenya's Economy Sees Growth at Top But No 'Trickle-Down'
By Miriam Gathigah
David Kamau is a small-scale maize farmer in Nyeri, Central Kenya, some 153 kms from the capital Nairobi. He recently diversified into carrot farming but is still not making a profit.
Ebola Outbreak Affects Key Development Areas in Sierra Leone
By Lansana Fofana
The outbreak of the deadly Ebola epidemic in Sierra Leone has badly affected the West African country's move towards meeting key development goals.
Ethiopia Moves in Right Direction with Climate Change Response But Challenges Remain
By James Hassam
Ethiopia is widely regarded as an African success story when it comes to economic growth. According to the International Monetary Fund, the country's economy is growing by seven percent annually. But there are concerns that climate change could jeopardise this growth.
Family Farming – A Way of Life
By Gloria Schiavi
It does not make the headlines, but 2014 is the International Year of Family Farming (IYFF) and family farming will be centre-stage at this year's World Food Day on Oct. 16 at the Food and Agriculture Organisation of the United Nations (FAO).
A Billion Tons of Food Wasted Yearly While Millions Still Go Hungry
By A. D. McKenzie
In his parody of the Michael Jackson hit "Beat It", the American satirist and singer Weird Al Yankovic has a parent urging his son to eat the food on his plate, warning that "other kids are starving in Japan".
The Time Has Come for Agroecology
By Geneviève Lavoie-Mathieu
"It is time for a new agricultural model that ensures that enough quality food is produced where it is most needed, that preserves nature and that delivers ecosystem services of local and global relevance" – in a word, it is time for agroecology.
The Good – and the Bad – News on World Hunger
By Phil Harris
The number of hungry people in the world has declined by over 100 million in the last decade and over 200 million since 1990-92, but 805 million people around the world still go hungry every day, according to the latest UN estimates.
Organic Farming Taking Off in Poland … Slowly
By Claudia Ciobanu
Polish farmer Slawek Dobrodziej has probably the world's strangest triathlon training regime: he swims across the lake at the back of his house, then runs across his some 11 hectares of land to check the state of the crops, and at the end of the day bikes close to 40 kilometres to and back from a nearby town for some shopping.
What Do the World Bank and IMF Have to Do With the Ukraine Conflict?
Mostly unreported as the Ukraine conflict captures headlines, international financing has played a significant role in the current conflict in Ukraine.
The 'Global' Land Rush
By Anuradha Mittal
The first years of the twenty-first century will be remembered for a global land rush of nearly unprecedented scale.
Analysis: Ten Reasons for Saying 'No' to the North Over Trade
By Ravi Kanth Devarakonda and Phil Harris
India's decisive stand last week not to adopt the protocol of amendment of the trade facilitation agreement (TFA) unless credible rules were in place for the development issues of the South was met with "astonishment" and "dismay" by trade diplomats from the North, who described New Delhi's as "hostage-taking" and "suicidal".
India Stands Firm on Protecting Food Security of South at WTO
By Ravi Kanth Devarakonda
The failure of the two major players in global trade negotiations to bridge their differences has put paid to the adoption of the protocol of amendment for implementation of the contested Trade Facilitation Agreement (TFA) for the time being.
Land Grabbing – A New Political Strategy for Arab Countries
By Mona Alami
Food price rises as far back as 2008 are believed to be the partial culprits behind the instability plaguing Arab countries and they have become increasingly aware of the importance of securing food needs through an international strategy of land grabs which are often detrimental to local populations.
Trade Facilitation Will Support African Industrialisation
By Roberto Azevêdo
In the 1960s, there were high hopes for the development of the newly-independent sub-Saharan African countries but these hopes were quickly dashed following a series of shocks which began in the mid-70s, with the first oil price spikes, followed by a severe decline in growth and increase in poverty in the 80s and early 90s.
Drought and Misuse Behind Lebanon's Water Scarcity
By Oriol Andrés Gallart
In front of Osman Bin Affan Mosque, in a central but narrow street of Beirut, several tank trucks are being filled with large amounts of water. The mosque has its own well, which allows it to pump water directly from the aquifers that cross the Lebanese underground. Once filled, the trucks will start going through the city to supply hundreds of homes and shops.
South Stymies North in Global Trade Talks
A group of developing countries brought a tectonic shift at the World Trade Organization on Friday by turning the tables against the industrialised countries, when they offered a positive trade agenda to expeditiously arrive at a permanent solution for food security and other development issues, before adopting the protocol of amendment of the contested Trade Facilitation Agreement.
Fish Before Fields to Improve Egypt's Food Production
By Cam McGrath
Less than four percent of Egypt's land mass is suitable for agriculture, and most of it confined to the densely populated Nile River Valley and Delta. With the nation's population of 85 million expected to double by 2050, government officials are grappling with ways of ensuring food security and raising nutritional standards.
Positive Outlook For Agricultural Prices But Not For World's Poorest
The official outlook for agriculture up to 2023 carries optimistic forecasts for agricultural productivity and commodity prices but it is unlikely that the benefits will be shared by the world's poorest.
Food Insecurity a New Threat for Lebanon's Syrian Refugees
A declining economy and a severe drought have raised concerns in Lebanon over food security as the country faces one of its worst refugee crises, resulting from the nearby Syria war, and it is these refugees and impoverished Lebanese border populations that are most vulnerable to this new threat.
Fragility of WTO's Bali Package Exposed
The "fragility" of the World Trade Organization's 'Bali package' was brought into the open at the weekend meeting in Sydney, Australia, of trade ministers from the world's 20 major economies (G20).
Agricultural Research
Caribbean Climate Wire
Combating Desertification and Drought
Integration and Development Brazilian-style
Parliamentarians Against Hunger
Right To Food
Today's Menu: Pesticide Salad, Leaded Fish with Plastic, Chemical Fruit
Baher Kamal | Environment | Global
Let's Talk About Sex – and Why Power Matters
Dr. Natalia Kanem | Global
Avoiding the Mistakes of the Asian Green Revolution in Africa
Isaiah Esipisu | Water & Sanitation | Africa
How NGOs in Rich Countries Control their Counterparts in Poor Countries..and Why they Refuse to Resolve it
Paul Okumu | Civil Society | Global
The Fight to End Violence Against Women in the Asia-Pacific Region
Caley Pigliucci | Asia-Pacific
Want to Inspire More People to Act on Climate Change? Broaden the Framing
Esther Ngumbi | Climate Change | Global
How Governments Still Allow Violence Against Children
Tamara Tutnjevic Gorman | Global
Facebook and Friends Threaten to Libralize the World
Anis Chowdhury and Jomo Kwame Sundaram | Global
Pompeo's New "Human Rights" Commission Is Up To No Good
Jamil Dakwar and Sonia Gill | Global
NEXT STOP - SDGs
Tracking global progress towards a sustainable world


text:
Elizabeth May: Debate on Electoral Reform and MyDemocracy.ca
On Thursday, December 8th, 2016 in Debate, Parliament
Elizabeth May: Mr. Speaker, I thank all my colleagues.
I share the view of my colleagues from Skeena—Bulkley Valley and Louis-Saint-Laurent and all the others who mentioned the incredible work done by the hon. member for Lac-Saint-Louis as committee chair, as well as all of the committee members.
Liberals, Conservatives, New Democrats, members of the Bloc and I worked together as a family, like a real team. We were willing to work hard in the interest of real democracy in Canada, and not in the interest of our party or to make political gains.
It is clear that electoral reform is a complicated issue, but at its essence it is about making democracy work for Canadians. Our goal in finding our values was to set aside our partisanship and to say, okay, what do voters want? This is the fundamental question, and Canadians participated in droves in this process.
We have had a discussion in Parliament, and I certainly accepted the hon. minister's apology. She knows we worked hard, but to me the essence of it is that we delivered on our mandate and got a very impressive report out on time and on deadline. It was not just the members of the committee who worked hard, but thousands of Canadians. We received unsolicited briefs that showed an enormous amount of effort by hundreds of Canadians who toiled to produce them. We would talk about it among ourselves as members of Parliament, the work in the briefs that were hundreds of pages long, as Canadians attempted to come up with the very best system, a made-in-Canada solution to ensure fair voting.
We also had hundreds of people come to our hearings across Canada, many of whom did not get up in the open-mike sessions but sat through hours of testimony just because they were interested in the subject and showed their support for those who spoke. I do agree with the member for Lac-Saint-Louis that we heard people call overwhelmingly for electoral reform, as our report notes. We heard them call for an end to first past the post and for fair proportional voting.
In my own case, I held many town halls across Canada as leader of the Green Party, but I also sent every single household in my riding of Saanich—Gulf Islands a special newsletter on electoral reform. I gave as much of the background as I could in explaining why it meant so much to me as a member of Parliament to know that the Speech from the Throne committed to ensuring that every vote would count and that 2015 would be the last election held under first past the post.
I polled the residents of my riding through a direct questionnaire mailed to them, and hundreds of people responded. I would like to share what my constituents said. I have never been able to do this publicly, but 82% of the voters in Saanich—Gulf Islands who responded to my questionnaire said, yes, they supported proportional representation. In response to the question, "Do you believe it can be accomplished without a referendum?", there was more of a split, with 62% saying yes they definitely wanted a referendum, and others not being sure.
In response to, "What do you think about mandatory voting?", there was a split, with 40% thinking it was a good idea, and 44% thinking it was not a good idea, and prepared to dive into the details. Of the voters in Saanich—Gulf Islands who responded, 44% said they liked hybrid proportional representation, 16% liked MMP, 17% STV, and 12% wanted to keep first past the post. That is the kind of engaged electorate I am so honoured and privileged to represent here in Parliament.
Not only did citizens come to the MP town halls and to our electoral reform committee meetings, they wanted to participate and wanted to be further engaged, so I was one of those, when called by the media about the MyDemocracy.ca survey, who said, "Well let us give it a chance", but I want to see it build on the success of the committee's work.
That is why this motion, Motion No. 2 from the electoral reform committee, is so important. I am very gratified to know that finally in the House of Commons we are discussing and debating electoral reform. We are talking about the content of the report. As for the member for Coast of Bays—Central—Notre Dame, I did not get a chance to thank him at the time because his question period was up, but what a great engagement it was by a member who was not on the committee, but who was able to say, "I am interested in mixed member proportional. It looks like a good system". He stopped short of endorsing it.
We took a big step forward in the Green Party over the weekend. We had a large gathering, a special meeting of members, to address the committee report and to deal with what I came down in favour of, a referendum. I did not think I could find a consensus, but I did. As a result, our party has now changed its opposition to a referendum to being open to one in some circumstances. These would not be the circumstances the Conservative Party wants. It would not favour a referendum that included an option for first past the post before we moved to PR. However, we moved as a party towards a view that we could hold a plebiscite like Prince Edward Island did, with multiple PR choices in advance of the next election, or we could go through two elections and then hold a referendum. This is a significant shift.
We also decided that our preferred voting method is mixed member proportional, another big move, in light of Prince Edward Island's voters choosing mixed member proportional in their plebiscite and the Law Commission report of 2004 picking mixed member proportional. In deference to my colleagues in the NDP, they have favoured mixed member proportional as well.
Let us try to focus on a solution, and encourage the government to live up to the promise to ensure that first past the post is never used again in Canada. Why would we feel so strongly? It is because it is a threat to democracy if a minority of voters can elect majority of the seats. This is the fundamental fairness question.
I want to quote from the report, in which Bernard Colas, a lawyer who worked on the Law Commission report in 2004, put it in very straightforward language:
One basic instinct of a human being is about fairness. If you have young kids, the kids will say it's not fair. The first question you ask Canadians is whether it's fair for someone to be elected with 30% of the vote, or 40%….They will answer "no". Then you say, "Okay, we're here to make a proposal to correct this system and to improve its fairness."
That is my big complaint with the MyDemocracy.ca survey. It is interesting as far as it goes, but that is the fundamental question. None of the questions put to voters in MyDemocracy.ca go to the value of fairness. We have a lot of questions on online voting, but without information upfront on why our committee recommended against it at this time. There are a lot of questions about mandatory voting, but nothing about why it is the right thing to do, and we hold the government to account that it was the right thing for the Prime Minister to promise that first past the post would not be used in 2019.
Our committee found that ranked ballots was the only system worse than first past the post. We recommended proportional representation to the government, but not through a pure list system.
We did our job. Please, I urge the government to accept the report of our committee, improve the online questionnaire, and live up to the promise of electoral reform.


Lennie's Ride is the remarkable story of Lennie Gwyther, a nine-year-old farmer's son from Leongatha in Gippsland, Victoria, so excited about the opening of the Sydney Harbour Bridge he rode his pony, Ginger Mick, 600 miles to witness the event himself.
However, Lennie's Ride is more than a story of a boy. It is the story of his family, rural community life and the social history of Australia in the inter-war period. Lennie's feat is astounding. Allowing my own nine-year-old son to walk home from school (ten minutes and he doesn't even have to cross a road) is a leap of faith, let alone sending him off on a trek of this nature. Lennie's parents took that leap of faith. Stays with friends along the route were organised and as the fame of Lennie's journey grew, he certainly was not alone in his ride, being feted on his arrival in Canberra and Sydney among other places. The biggest testament to Lennie is that his parents felt safe in the knowledge that their son was capable of such a journey despite his youth.
Life on the Gwyther farm was not easy despite the ideal climate and soil. Lennie's father was a decorated returned serviceman from the trenches of Gallipoli and the Western Front. However, he also returned with injuries that would affect him for the rest of his life. Add to that the difficulties of the Great Depression. Lennie's parents relied extensively on him to help on the farm and, when his father broke his leg, Lennie worked the farm as well as any grown man.
1932 was a time of economic and social uncertainty and the excitement surrounding the Sydney Harbour Bridge was intense. It was an achievement of national significance and Lennie wanted to be a part of it. Lennie's interest in the bridge stemmed from his love of drawing, design and construction. As reward for all his hard work Lennie asked to be allowed to ride to Sydney for the opening. Hazards along the way included bushfires and Lennie's adventures in Sydney included entering the Easter Show.
Marion Wilcocks' black and white illustrations give us the feel of times past and complement the text beautifully. The book also includes numerous photographs of Lennie, the Gwyther family, and people and places of the 1930s and a brief section telling sister Beryl's story, and a facts section about the building of the bridge.
Lennie's Ride is recommended reading for Australians of all ages. It opens a window into a vastly different Australia in the not too distant past, it is a tale of the excitement surrounding the bridge opening, but most of all it tells of the wonders of a childhood fully lived and experienced.


text:
// Copyright (c) 2009-2021 The Regents of the University of Michigan
// This file is part of the HOOMD-blue project, released under the BSD 3-Clause License.

// Maintainer: joaander
#include "ParticleGroup.h"

#include "hoomd/RNGIdentifiers.h"
#include "hoomd/RandomNumbers.h"

#ifdef ENABLE_HIP
#include "CachedAllocator.h"
#include "ParticleGroup.cuh"

#include <hip/hip_runtime.h>
#endif

#include <algorithm>
#include <iostream>
using namespace std;
namespace py = pybind11;

/*! \param sysdef System the particles are to be selected from
    \param rigid true selects particles that are in bodies, false selects particles that are not
   part of a body
*/
ParticleFilterBody::ParticleFilterBody(bool body) : ParticleFilter(), m_body(body) { }

/*! \param tag Tag of the particle to check
    \returns true if the type of particle \a tag meets the body criteria selected
*/
std::vector<unsigned int>
ParticleFilterBody::getSelectedTags(std::shared_ptr<SystemDefinition> sysdef) const
    {
    std::vector<unsigned int> member_tags;
    auto pdata = sysdef->getParticleData();

    // loop through local particles and select those that match selection criterion
    ArrayHandle<unsigned int> h_tag(pdata->getTags(), access_location::host, access_mode::read);
    ArrayHandle<unsigned int> h_body(pdata->getBodies(), access_location::host, access_mode::read);
    for (unsigned int idx = 0; idx < pdata->getN(); ++idx)
        {
        unsigned int tag = h_tag.data[idx];

        // get position of particle
        unsigned int body = h_body.data[idx];

        // see if it matches the criteria
        bool result = false;
        if (m_body && body != NO_BODY)
            result = true;
        if (!m_body && body == NO_BODY)
            result = true;

        if (result)
            member_tags.push_back(tag);
        }
    return member_tags;
    }

//////////////////////////////////////////////////////////////////////////////
// ParticleFilterFloppy

/*! \param floppy true selects particles that are in floppy bodies, false selects particles that are
 * not part of a floppy (non-rigid body)
 */
ParticleFilterFloppy::ParticleFilterFloppy(bool floppy) : ParticleFilter(), m_floppy(floppy) { }

/*! \param tag Tag of the particle to check
    \returns true if the type of particle \a tag meets the rigid criteria selected
*/
std::vector<unsigned int>
ParticleFilterFloppy::getSelectedTags(std::shared_ptr<SystemDefinition> sysdef) const
    {
    std::vector<unsigned int> member_tags;
    auto pdata = sysdef->getParticleData();

    // loop through local particles and select those that match selection criterion
    ArrayHandle<unsigned int> h_tag(pdata->getTags(), access_location::host, access_mode::read);
    ArrayHandle<unsigned int> h_body(pdata->getBodies(), access_location::host, access_mode::read);
    for (unsigned int idx = 0; idx < pdata->getN(); ++idx)
        {
        unsigned int tag = h_tag.data[idx];

        // get position of particle
        unsigned int body = h_body.data[idx];

        // see if it matches the criteria
        bool result = false;
        if (m_floppy && body >= MIN_FLOPPY && body != NO_BODY)
            result = true;
        if (!m_floppy && (body < MIN_FLOPPY || body == NO_BODY))
            result = true;

        if (result)
            member_tags.push_back(tag);
        }
    return member_tags;
    }

ParticleFilterRigidCenter::ParticleFilterRigidCenter() : ParticleFilter() { }

/*! \returns true if the type of particle \a tag is a center particle of a rigid body
 */
std::vector<unsigned int>
ParticleFilterRigidCenter::getSelectedTags(std::shared_ptr<SystemDefinition> sysdef) const
    {
    std::vector<unsigned int> member_tags;
    auto pdata = sysdef->getParticleData();

    // loop through local particles and select those that match selection criterion
    ArrayHandle<unsigned int> h_tag(pdata->getTags(), access_location::host, access_mode::read);
    ArrayHandle<unsigned int> h_body(pdata->getBodies(), access_location::host, access_mode::read);
    for (unsigned int idx = 0; idx < pdata->getN(); ++idx)
        {
        unsigned int tag = h_tag.data[idx];

        // get position of particle
        unsigned int body = h_body.data[idx];

        if (body == tag)
            member_tags.push_back(tag);
        }
    return member_tags;
    }

ParticleFilterCuboid::ParticleFilterCuboid(Scalar3 min, Scalar3 max)
    : ParticleFilter(), m_min(min), m_max(max)
    {
    }

/*! \param tag Tag of the particle to check
    \returns true if the type of particle \a tag is in the cuboid

    Evaluation is performed by \a m_min.x <= x < \a m_max.x so that multiple cuboids stacked next to
   each other do not have overlapping sets of particles.
*/
std::vector<unsigned int>
ParticleFilterCuboid::getSelectedTags(std::shared_ptr<SystemDefinition> sysdef) const
    {
    std::vector<unsigned int> member_tags;
    auto pdata = sysdef->getParticleData();

    // loop through local particles and select those that match selection criterion
    ArrayHandle<unsigned int> h_tag(pdata->getTags(), access_location::host, access_mode::read);
    ArrayHandle<Scalar4> h_postype(pdata->getPositions(), access_location::host, access_mode::read);
    for (unsigned int idx = 0; idx < pdata->getN(); ++idx)
        {
        unsigned int tag = h_tag.data[idx];
        // get position of particle
        Scalar4 postype = h_postype.data[idx];

        // see if it matches the criteria
        bool result = (m_min.x <= postype.x && postype.x < m_max.x && m_min.y <= postype.y
                       && postype.y < m_max.y && m_min.z <= postype.z && postype.z < m_max.z);
        if (result)
            member_tags.push_back(tag);
        }

    return member_tags;
    }

//////////////////////////////////////////////////////////////////////////////
// ParticleGroup

/*! \param sysdef System definition to build the group from
    \param selector ParticleFilter used to choose the group members
    \param update_tags If true, update tags whenever global particle number changes

    Particles where criteria falls within the range [min,max] (inclusive) are added to the group.
*/
ParticleGroup::ParticleGroup(std::shared_ptr<SystemDefinition> sysdef,
                             std::shared_ptr<ParticleFilter> selector,
                             bool update_tags)
    : m_sysdef(sysdef), m_pdata(sysdef->getParticleData()), m_exec_conf(m_pdata->getExecConf()),
      m_num_local_members(0), m_particles_sorted(true), m_reallocated(false),
      m_global_ptl_num_change(false), m_selector(selector), m_update_tags(update_tags),
      m_warning_printed(false)
    {
#ifdef ENABLE_HIP
    if (m_pdata->getExecConf()->isCUDAEnabled())
        m_gpu_partition = GPUPartition(m_exec_conf->getGPUIds());
#endif

    // update member tag arrays
    updateMemberTags(true);

    // connect to the particle sort signal
    m_pdata->getParticleSortSignal().connect<ParticleGroup, &ParticleGroup::slotParticleSort>(this);

    // connect reallocate() method to maximum particle number change signal
    m_pdata->getMaxParticleNumberChangeSignal()
        .connect<ParticleGroup, &ParticleGroup::slotReallocate>(this);

    // connect updateMemberTags() method to maximum particle number change signal
    m_pdata->getGlobalParticleNumberChangeSignal()
        .connect<ParticleGroup, &ParticleGroup::slotGlobalParticleNumChange>(this);

    // update GPU memory hints
    updateGPUAdvice();
    }

/*! \param sysdef System definition to build the group from
    \param member_tags List of particle tags that belong to the group

    All particles specified in \a member_tags will be added to the group.
*/
ParticleGroup::ParticleGroup(std::shared_ptr<SystemDefinition> sysdef,
                             const std::vector<unsigned int>& member_tags)
    : m_sysdef(sysdef), m_pdata(sysdef->getParticleData()), m_exec_conf(m_pdata->getExecConf()),
      m_num_local_members(0), m_particles_sorted(true), m_reallocated(false),
      m_global_ptl_num_change(false), m_update_tags(false), m_warning_printed(false)
    {
    // check input
    unsigned int max_tag = m_pdata->getMaximumTag();
    for (std::vector<unsigned int>::const_iterator it = member_tags.begin();
         it != member_tags.end();
         ++it)
        {
        if (*it > max_tag)
            {
            m_exec_conf->msg->error()
                << "group.*: Member " << *it << " does not exist in particle data." << std::endl;
            throw std::runtime_error("Error creating ParticleGroup\n");
            }
        }

#ifdef ENABLE_MPI
    if (m_pdata->getDomainDecomposition())
        {
        // do a simple sanity check
        unsigned int nptl = (unsigned int)member_tags.size();
        bcast(nptl, 0, m_exec_conf->getMPICommunicator());

        if (nptl != member_tags.size())
            {
            m_exec_conf->msg->error()
                << "group.*: Member tag list is inconsistent among MPI ranks." << std::endl;
            throw std::runtime_error("Error creating ParticleGroup\n");
            }
        }
#endif

    // let's make absolutely sure that the tag order given from outside is sorted
    std::vector<unsigned int> sorted_member_tags = member_tags;
    sort(sorted_member_tags.begin(), sorted_member_tags.end());

    // store member tags
    GlobalArray<unsigned int> member_tags_array(member_tags.size(), m_exec_conf);
    m_member_tags.swap(member_tags_array);
    TAG_ALLOCATION(m_member_tags);

        {
        ArrayHandle<unsigned int> h_member_tags(m_member_tags,
                                                access_location::host,
                                                access_mode::overwrite);
        std::copy(sorted_member_tags.begin(), sorted_member_tags.end(), h_member_tags.data);
        }

    // one byte per particle to indicate membership in the group, initialize with current number of
    // local particles
    GlobalArray<unsigned int> is_member(m_pdata->getMaxN(), m_pdata->getExecConf());
    m_is_member.swap(is_member);
    TAG_ALLOCATION(m_is_member);

    GlobalArray<unsigned int> is_member_tag(m_pdata->getRTags().size(), m_pdata->getExecConf());
    m_is_member_tag.swap(is_member_tag);
    TAG_ALLOCATION(m_is_member_tag);

    // build the reverse lookup table for tags
    buildTagHash();

    GlobalArray<unsigned int> member_idx(member_tags.size(), m_pdata->getExecConf());
    m_member_idx.swap(member_idx);
    TAG_ALLOCATION(m_member_idx);

#ifdef ENABLE_HIP
    if (m_pdata->getExecConf()->isCUDAEnabled())
        m_gpu_partition = GPUPartition(m_exec_conf->getGPUIds());
#endif

    // now that the tag list is completely set up and all memory is allocated, rebuild the index
    // list
    rebuildIndexList();

    // connect to the particle sort signal
    m_pdata->getParticleSortSignal().connect<ParticleGroup, &ParticleGroup::slotParticleSort>(this);

    // connect reallocate() method to maximum particle number change signal
    m_pdata->getMaxParticleNumberChangeSignal()
        .connect<ParticleGroup, &ParticleGroup::slotReallocate>(this);

    // connect updateMemberTags() method to maximum particle number change signal
    m_pdata->getGlobalParticleNumberChangeSignal()
        .connect<ParticleGroup, &ParticleGroup::slotGlobalParticleNumChange>(this);

    // update GPU memory hints
    updateGPUAdvice();
    }

ParticleGroup::~ParticleGroup()
    {
    // disconnect the sort connection, but only if there was a particle data to connect it to in the
    // first place
    if (m_pdata)
        {
        m_pdata->getParticleSortSignal()
            .disconnect<ParticleGroup, &ParticleGroup::slotParticleSort>(this);
        m_pdata->getMaxParticleNumberChangeSignal()
            .disconnect<ParticleGroup, &ParticleGroup::slotReallocate>(this);
        m_pdata->getGlobalParticleNumberChangeSignal()
            .disconnect<ParticleGroup, &ParticleGroup::slotGlobalParticleNumChange>(this);
        }
    }

/*! \param force_update If true, always update member tags
 */
void ParticleGroup::updateMemberTags(bool force_update) const
    {
    if (m_selector && !(m_update_tags || force_update) && !m_warning_printed)
        {
        m_pdata->getExecConf()->msg->warning()
            << "Particle number change but group is static. Create group with update=True if it "
               "should be updated."
            << std::endl
            << "This warning is printed only once." << std::endl;
        m_warning_printed = true;
        }

    if (m_selector && (m_update_tags || force_update))
        {
        // notice message
        m_pdata->getExecConf()->msg->notice(7) << "ParticleGroup: rebuilding tags" << std::endl;

        // assign all of the particles that belong to the group
        // for each particle in the (global) data
        vector<unsigned int> member_tags = m_selector->getSelectedTags(m_sysdef);

#ifdef ENABLE_MPI
        if (m_pdata->getDomainDecomposition())
            {
            // combine lists from all processors
            std::vector<std::vector<unsigned int>> member_tags_proc(m_exec_conf->getNRanks());
            all_gather_v(member_tags, member_tags_proc, m_exec_conf->getMPICommunicator());

            assert(member_tags_proc.size() == m_exec_conf->getNRanks());

            // combine all tags into an ordered set
            unsigned int n_ranks = m_exec_conf->getNRanks();
            std::set<unsigned int> tag_set;
            for (unsigned int irank = 0; irank < n_ranks; ++irank)
                {
                tag_set.insert(member_tags_proc[irank].begin(), member_tags_proc[irank].end());
                }

            // construct list
            member_tags.clear();
            member_tags.insert(member_tags.begin(), tag_set.begin(), tag_set.end());
            }
#endif

        // store member tags in GlobalArray
        GlobalArray<unsigned int> member_tags_array(member_tags.size(), m_pdata->getExecConf());
        m_member_tags.swap(member_tags_array);
        TAG_ALLOCATION(m_member_tags);

        // sort member tags
        std::sort(member_tags.begin(), member_tags.end());

            {
            ArrayHandle<unsigned int> h_member_tags(m_member_tags,
                                                    access_location::host,
                                                    access_mode::overwrite);
            std::copy(member_tags.begin(), member_tags.end(), h_member_tags.data);
            }

        GlobalArray<unsigned int> member_idx(member_tags.size(), m_pdata->getExecConf());
        m_member_idx.swap(member_idx);
        TAG_ALLOCATION(m_member_idx);
        }

    // one byte per particle to indicate membership in the group, initialize with current number of
    // local particles
    GlobalArray<unsigned int> is_member(m_pdata->getMaxN(), m_pdata->getExecConf());
    m_is_member.swap(is_member);
    TAG_ALLOCATION(m_is_member);

    GlobalArray<unsigned int> is_member_tag(m_pdata->getRTags().size(), m_pdata->getExecConf());
    m_is_member_tag.swap(is_member_tag);
    TAG_ALLOCATION(m_is_member_tag);

    // build the reverse lookup table for tags
    buildTagHash();

    // now that the tag list is completely set up and all memory is allocated, rebuild the index
    // list
    rebuildIndexList();
    }

void ParticleGroup::reallocate() const
    {
    m_is_member.resize(m_pdata->getMaxN());

    if (m_is_member_tag.getNumElements() != m_pdata->getRTags().size())
        {
        // reallocate if necessary
        GlobalArray<unsigned int> is_member_tag(m_pdata->getRTags().size(), m_exec_conf);
        m_is_member_tag.swap(is_member_tag);
        TAG_ALLOCATION(m_is_member_tag);

        buildTagHash();
        }
    }

/*! \returns Total mass of all particles in the group
    \note This method acquires the ParticleData internally
*/
Scalar ParticleGroup::getTotalMass() const
    {
    // grab the particle data
    ArrayHandle<Scalar4> h_vel(m_pdata->getVelocities(), access_location::host, access_mode::read);

    // loop  through all indices in the group and total the mass
    Scalar total_mass = 0.0;
    for (unsigned int i = 0; i < getNumMembers(); i++)
        {
        unsigned int idx = getMemberIndex(i);
        total_mass += h_vel.data[idx].w;
        }
    return total_mass;
    }

/*! \returns The center of mass of the group, in unwrapped coordinates
    \note This method acquires the ParticleData internally
*/
Scalar3 ParticleGroup::getCenterOfMass() const
    {
    // grab the particle data
    ArrayHandle<Scalar4> h_vel(m_pdata->getVelocities(), access_location::host, access_mode::read);
    ArrayHandle<Scalar4> h_pos(m_pdata->getPositions(), access_location::host, access_mode::read);
    ArrayHandle<int3> h_image(m_pdata->getImages(), access_location::host, access_mode::read);

    // grab the box dimensions
    BoxDim box = m_pdata->getBox();

    // loop  through all indices in the group and compute the weighted average of the positions
    Scalar total_mass = 0.0;
    Scalar3 center_of_mass = make_scalar3(Scalar(0.0), Scalar(0.0), Scalar(0.0));
    for (unsigned int i = 0; i < getNumMembers(); i++)
        {
        unsigned int idx = getMemberIndex(i);
        Scalar mass = h_vel.data[idx].w;
        total_mass += mass;
        Scalar3 pos = make_scalar3(h_pos.data[idx].x, h_pos.data[idx].y, h_pos.data[idx].z);
        Scalar3 unwrapped = box.shift(pos, h_image.data[idx]);
        center_of_mass.x += mass * unwrapped.x;
        center_of_mass.y += mass * unwrapped.y;
        center_of_mass.z += mass * unwrapped.z;
        }
    center_of_mass.x /= total_mass;
    center_of_mass.y /= total_mass;
    center_of_mass.z /= total_mass;

    return center_of_mass;
    }

/*! \param a First particle group
    \param b Second particle group

    \returns A shared pointer to a newly created particle group that contains all the elements
   present in \a a and \a b
*/
std::shared_ptr<ParticleGroup> ParticleGroup::groupUnion(std::shared_ptr<ParticleGroup> a,
                                                         std::shared_ptr<ParticleGroup> b)
    {
    // vector to store the new list of tags
    vector<unsigned int> member_tags;

    if (a != b)
        {
        unsigned int n_a = a->getNumMembersGlobal();
        unsigned int n_b = b->getNumMembersGlobal();

        // make the union
        ArrayHandle<unsigned int> h_members_a(a->m_member_tags,
                                              access_location::host,
                                              access_mode::read);
        ArrayHandle<unsigned int> h_members_b(b->m_member_tags,
                                              access_location::host,
                                              access_mode::read);

        insert_iterator<vector<unsigned int>> ii(member_tags, member_tags.begin());
        set_union(h_members_a.data,
                  h_members_a.data + n_a,
                  h_members_b.data,
                  h_members_b.data + n_b,
                  ii);
        }
    else
        {
        unsigned int n_a = a->getNumMembersGlobal();

        // If the two arguments are the same, just return a copy of the whole group (we cannot
        // acquire the member_tags array twice)
        ArrayHandle<unsigned int> h_members_a(a->m_member_tags,
                                              access_location::host,
                                              access_mode::read);

        insert_iterator<vector<unsigned int>> ii(member_tags, member_tags.begin());
        std::copy(h_members_a.data, h_members_a.data + n_a, ii);
        }

    // create the new particle group
    std::shared_ptr<ParticleGroup> new_group(new ParticleGroup(a->m_sysdef, member_tags));

    // return the newly created group
    return new_group;
    }

/*! \param a First particle group
    \param b Second particle group

    \returns A shared pointer to a newly created particle group that contains only the elements
   present in both \a a and \a b
*/
std::shared_ptr<ParticleGroup> ParticleGroup::groupIntersection(std::shared_ptr<ParticleGroup> a,
                                                                std::shared_ptr<ParticleGroup> b)
    {
    // vector to store the new list of tags
    vector<unsigned int> member_tags;

    if (a != b)
        {
        unsigned int n_a = a->getNumMembersGlobal();
        unsigned int n_b = b->getNumMembersGlobal();

        // make the intersection
        ArrayHandle<unsigned int> h_members_a(a->m_member_tags,
                                              access_location::host,
                                              access_mode::read);
        ArrayHandle<unsigned int> h_members_b(b->m_member_tags,
                                              access_location::host,
                                              access_mode::read);

        insert_iterator<vector<unsigned int>> ii(member_tags, member_tags.begin());
        set_intersection(h_members_a.data,
                         h_members_a.data + n_a,
                         h_members_b.data,
                         h_members_b.data + n_b,
                         ii);
        }
    else
        {
        unsigned int n_a = a->getNumMembersGlobal();
        // If the two arguments are the same, just return a copy of the whole group (we cannot
        // acquire the member_tags array twice)
        ArrayHandle<unsigned int> h_members_a(a->m_member_tags,
                                              access_location::host,
                                              access_mode::read);

        insert_iterator<vector<unsigned int>> ii(member_tags, member_tags.begin());
        std::copy(h_members_a.data, h_members_a.data + n_a, ii);
        }

    // create the new particle group
    std::shared_ptr<ParticleGroup> new_group(new ParticleGroup(a->m_sysdef, member_tags));

    // return the newly created group
    return new_group;
    }

/*! \param a First particle group
    \param b Second particle group

    \returns A shared pointer to a newly created particle group that contains only the elements
   present in \a a, and not any present in \a b
*/
std::shared_ptr<ParticleGroup> ParticleGroup::groupDifference(std::shared_ptr<ParticleGroup> a,
                                                              std::shared_ptr<ParticleGroup> b)
    {
    // vector to store the new list of tags
    vector<unsigned int> member_tags;

    if (a != b)
        {
        unsigned int n_a = a->getNumMembersGlobal();
        unsigned int n_b = b->getNumMembersGlobal();
        // make the difference
        ArrayHandle<unsigned int> h_members_a(a->m_member_tags,
                                              access_location::host,
                                              access_mode::read);
        ArrayHandle<unsigned int> h_members_b(b->m_member_tags,
                                              access_location::host,
                                              access_mode::read);

        insert_iterator<vector<unsigned int>> ii(member_tags, member_tags.begin());
        set_difference(h_members_a.data,
                       h_members_a.data + n_a,
                       h_members_b.data,
                       h_members_b.data + n_b,
                       ii);
        }
    else
        {
        // If the two arguments are the same, just return an empty group (we cannot
        // acquire the member_tags array twice)
        }

    // create the new particle group
    std::shared_ptr<ParticleGroup> new_group(new ParticleGroup(a->m_sysdef, member_tags));

    // return the newly created group
    return new_group;
    }

/*! Builds the by-tag-lookup table for group membership
 */
void ParticleGroup::buildTagHash() const
    {
    ArrayHandle<unsigned int> h_is_member_tag(m_is_member_tag,
                                              access_location::host,
                                              access_mode::overwrite);
    ArrayHandle<unsigned int> h_member_tags(m_member_tags,
                                            access_location::host,
                                            access_mode::read);

    // reset member ship flags
    memset(h_is_member_tag.data, 0, sizeof(unsigned int) * (m_pdata->getRTags().size()));

    size_t num_members = m_member_tags.getNumElements();
    for (size_t member = 0; member < num_members; member++)
        {
        h_is_member_tag.data[h_member_tags.data[member]] = 1;
        }
    }

/*! \pre m_member_tags has been filled out, listing all particle tags in the group
    \pre memory has been allocated for m_is_member and m_member_idx
    \post m_is_member is updated so that it reflects the current indices of the particles in the
   group \post m_member_idx is updated listing all particle indices belonging to the group, in index
   order
*/
void ParticleGroup::rebuildIndexList() const
    {
    // notice message
    m_pdata->getExecConf()->msg->notice(10) << "ParticleGroup: rebuilding index" << std::endl;

#ifdef ENABLE_HIP
    if (m_pdata->getExecConf()->isCUDAEnabled())
        {
        rebuildIndexListGPU();
        }
    else
#endif
        {
        // rebuild the membership flags for the  indices in the group and construct member list
        ArrayHandle<unsigned int> h_is_member(m_is_member,
                                              access_location::host,
                                              access_mode::readwrite);
        ArrayHandle<unsigned int> h_is_member_tag(m_is_member_tag,
                                                  access_location::host,
                                                  access_mode::read);
        ArrayHandle<unsigned int> h_tag(m_pdata->getTags(),
                                        access_location::host,
                                        access_mode::read);
        ArrayHandle<unsigned int> h_member_idx(m_member_idx,
                                               access_location::host,
                                               access_mode::readwrite);
        unsigned int nparticles = m_pdata->getN();
        unsigned int cur_member = 0;
        for (unsigned int idx = 0; idx < nparticles; idx++)
            {
            assert(h_tag.data[idx] <= m_pdata->getMaximumTag());
            unsigned int is_member = h_is_member_tag.data[h_tag.data[idx]];
            h_is_member.data[idx] = is_member;
            if (is_member)
                {
                h_member_idx.data[cur_member] = idx;
                cur_member++;
                }
            }

        m_num_local_members = cur_member;
        assert(m_num_local_members <= m_member_tags.getNumElements());
        }

    // index has been rebuilt
    m_particles_sorted = false;

#ifdef ENABLE_HIP
    if (m_pdata->getExecConf()->isCUDAEnabled())
        {
        // Update GPU load balancing info
        m_gpu_partition.setN(m_num_local_members);
        }
#endif
    }

void ParticleGroup::updateGPUAdvice() const
    {
#if defined(ENABLE_HIP) && defined(__HIP_PLATFORM_NVCC__)
    if (m_exec_conf->isCUDAEnabled() && m_exec_conf->allConcurrentManagedAccess())
        {
        // split preferred location of group indices across GPUs
        auto gpu_map = m_exec_conf->getGPUIds();
        for (unsigned int idev = 0; idev < m_exec_conf->getNumActiveGPUs(); ++idev)
            {
            auto range = m_gpu_partition.getRange(idev);
            unsigned int nelem = range.second - range.first;

            if (!nelem)
                continue;

            cudaMemAdvise(m_member_idx.get() + range.first,
                          sizeof(unsigned int) * nelem,
                          cudaMemAdviseSetPreferredLocation,
                          gpu_map[idev]);
            cudaMemAdvise(m_is_member.get() + range.first,
                          sizeof(unsigned int) * nelem,
                          cudaMemAdviseSetPreferredLocation,
                          gpu_map[idev]);

            // migrate data to preferred location
            cudaMemPrefetchAsync(m_member_idx.get() + range.first,
                                 sizeof(unsigned int) * nelem,
                                 gpu_map[idev]);
            cudaMemPrefetchAsync(m_is_member.get() + range.first,
                                 sizeof(unsigned int) * nelem,
                                 gpu_map[idev]);
            }
        CHECK_CUDA_ERROR();
        }
#endif
    }

#ifdef ENABLE_HIP
//! rebuild index list on the GPU
void ParticleGroup::rebuildIndexListGPU() const
    {
    ArrayHandle<unsigned int> d_is_member(m_is_member,
                                          access_location::device,
                                          access_mode::overwrite);
    ArrayHandle<unsigned int> d_is_member_tag(m_is_member_tag,
                                              access_location::device,
                                              access_mode::read);
    ArrayHandle<unsigned int> d_member_idx(m_member_idx,
                                           access_location::device,
                                           access_mode::overwrite);
    ArrayHandle<unsigned int> d_tag(m_pdata->getTags(), access_location::device, access_mode::read);

    // get temporary buffer
    ScopedAllocation<unsigned int> d_tmp(m_pdata->getExecConf()->getCachedAllocator(),
                                         m_pdata->getN());

    // reset membership properties
    if (m_member_tags.getNumElements() > 0)
        {
        gpu_rebuild_index_list(m_pdata->getN(), d_is_member_tag.data, d_is_member.data, d_tag.data);
        if (m_exec_conf->isCUDAErrorCheckingEnabled())
            CHECK_CUDA_ERROR();

        gpu_compact_index_list(m_pdata->getN(),
                               d_is_member.data,
                               d_member_idx.data,
                               m_num_local_members,
                               d_tmp.data,
                               m_pdata->getExecConf()->getCachedAllocator());
        if (m_exec_conf->isCUDAErrorCheckingEnabled())
            CHECK_CUDA_ERROR();
        }
    else
        m_num_local_members = 0;
    }
#endif

unsigned int ParticleGroup::intersectionSize(std::shared_ptr<ParticleGroup> other)
    {
    unsigned int n = 0;

    for (unsigned int i = 0; i < this->getNumMembers(); i++)
        {
        unsigned int query_idx = this->getMemberIndex(i);
        if (other->isMember(query_idx))
            n++;
        }

#ifdef ENABLE_MPI
    MPI_Allreduce(MPI_IN_PLACE, &n, 1, MPI_UNSIGNED, MPI_SUM, m_exec_conf->getMPICommunicator());
#endif

    return n;
    }

void ParticleGroup::thermalizeParticleMomenta(Scalar kT, uint64_t timestep)
    {
    unsigned int group_size = this->getNumMembers();

    const unsigned int n_dimensions = m_sysdef->getNDimensions();

    ArrayHandle<Scalar4> h_vel(m_pdata->getVelocities(),
                               access_location::host,
                               access_mode::readwrite);

    ArrayHandle<Scalar4> h_orientation(m_pdata->getOrientationArray(),
                                       access_location::host,
                                       access_mode::read);

    ArrayHandle<Scalar4> h_angmom(m_pdata->getAngularMomentumArray(),
                                  access_location::host,
                                  access_mode::readwrite);

    ArrayHandle<Scalar3> h_inertia(m_pdata->getMomentsOfInertiaArray(),
                                   access_location::host,
                                   access_mode::read);

    ArrayHandle<unsigned int> h_tag(m_pdata->getTags(), access_location::host, access_mode::read);

    // Total the system's linear momentum
    vec3<Scalar> tot_momentum(0, 0, 0);

    // Loop over all particles in the group
    for (unsigned int group_idx = 0; group_idx < group_size; group_idx++)
        {
        unsigned int j = this->getMemberIndex(group_idx);
        unsigned int ptag = h_tag.data[j];

        // Seed the RNG
        hoomd::RandomGenerator rng(hoomd::Seed(hoomd::RNGIdentifier::ParticleGroupThermalize,
                                               timestep,
                                               m_sysdef->getSeed()),
                                   hoomd::Counter(ptag));

        // Generate a random velocity
        Scalar mass = h_vel.data[j].w;
        Scalar sigma = slow::sqrt(kT / mass);
        hoomd::NormalDistribution<Scalar> normal(sigma);
        h_vel.data[j].x = normal(rng);
        h_vel.data[j].y = normal(rng);
        if (n_dimensions > 2)
            h_vel.data[j].z = normal(rng);
        else
            h_vel.data[j].z = 0; // For 2D systems

        tot_momentum += mass * vec3<Scalar>(h_vel.data[j]);

        // Generate random angular momentum if the particle has rotational degrees of freedom.
        vec3<Scalar> p_vec(0, 0, 0);
        quat<Scalar> q(h_orientation.data[j]);
        vec3<Scalar> I(h_inertia.data[j]);

        if (I.x > 0)
            p_vec.x = hoomd::NormalDistribution<Scalar>(slow::sqrt(kT * I.x))(rng);
        if (I.y > 0)
            p_vec.y = hoomd::NormalDistribution<Scalar>(slow::sqrt(kT * I.y))(rng);
        if (I.z > 0)
            p_vec.z = hoomd::NormalDistribution<Scalar>(slow::sqrt(kT * I.z))(rng);

        // Store the angular momentum quaternion
        quat<Scalar> p = Scalar(2.0) * q * p_vec;
        h_angmom.data[j] = quat_to_scalar4(p);
        }

    // Remove the center of mass momentum

#ifdef ENABLE_MPI
    // Reduce the total momentum from all MPI ranks
    if (m_pdata->getDomainDecomposition())
        {
        MPI_Allreduce(MPI_IN_PLACE,
                      &tot_momentum,
                      3,
                      MPI_HOOMD_SCALAR,
                      MPI_SUM,
                      m_exec_conf->getMPICommunicator());
        }
#endif

    vec3<Scalar> com_momentum(tot_momentum / Scalar(this->getNumMembersGlobal()));

    for (unsigned int group_idx = 0; group_idx < group_size; group_idx++)
        {
        unsigned int j = this->getMemberIndex(group_idx);
        Scalar mass = h_vel.data[j].w;
        h_vel.data[j].x = h_vel.data[j].x - com_momentum.x / mass;
        h_vel.data[j].y = h_vel.data[j].y - com_momentum.y / mass;
        if (n_dimensions > 2)
            h_vel.data[j].z = h_vel.data[j].z - com_momentum.z / mass;
        else
            h_vel.data[j].z = 0; // For 2D systems
        }
    }

void export_ParticleGroup(py::module& m)
    {
    py::class_<ParticleGroup, std::shared_ptr<ParticleGroup>>(m, "ParticleGroup")
        .def(py::init<std::shared_ptr<SystemDefinition>, std::shared_ptr<ParticleFilter>, bool>())
        .def(py::init<std::shared_ptr<SystemDefinition>, std::shared_ptr<ParticleFilter>>())
        .def(py::init<std::shared_ptr<SystemDefinition>, const std::vector<unsigned int>&>())
        .def(py::init<>())
        .def("getNumMembersGlobal", &ParticleGroup::getNumMembersGlobal)
        .def("getMemberTag", &ParticleGroup::getMemberTag)
        .def("getTotalMass", &ParticleGroup::getTotalMass)
        .def("getCenterOfMass", &ParticleGroup::getCenterOfMass)
        .def("groupUnion", &ParticleGroup::groupUnion)
        .def("groupIntersection", &ParticleGroup::groupIntersection)
        .def("groupDifference", &ParticleGroup::groupDifference)
        .def("updateMemberTags", &ParticleGroup::updateMemberTags)
        .def("setTranslationalDOF", &ParticleGroup::setTranslationalDOF)
        .def("getTranslationalDOF", &ParticleGroup::getTranslationalDOF)
        .def("setRotationalDOF", &ParticleGroup::setRotationalDOF)
        .def("getRotationalDOF", &ParticleGroup::getRotationalDOF)
        .def("thermalizeParticleMomenta", &ParticleGroup::thermalizeParticleMomenta)
        .def_property_readonly("member_tags", &ParticleGroup::getMemberTags);
    }

redpajama_set_name: RedPajamaGithub


With more than $289,000,000 in development projects to its credit, the Town of Hempstead Industrial Development Agency recorded the most successful year in its history in 2005, it was announced by Town Supervisor Kate Murray.
"I can think of no better demonstration of the towns robust economy than this outstanding accomplishment," Supervisor Murray said. "It shows the absolute confidence that the business community has in the town, its people and its institutions."
Fred Parola, the IDA's executive director, said the record-shattering year is especially significant in view of the fact that Hempstead is the most densely developed town on Long Island. "We donҒt have a lot of open land to develop, but the business community chooses to work with us to renovate, expand, rehabilitate and refinance existing businesses."
In 2005, the IDA assisted 15 businesses to develop projects worth $289,163,5244, which will provide nearly 1,000 new jobs for the town as well as numerous construction jobs. The IDA offers incentives to qualifying businesses in an effort to attract projects to the town and to retain existing firms.
Eligible businesses in 2005 ranged from Adelphi University, with a $42 million project to expand residential and educational facilities on its Garden City campus, to Circuits and Systems, which is investing $543,000 to expand its East Rockaway headquarters where it manufactures industrial scales.
The Town of Hempstead IDA is a non-profit, public benefit agency with special powers authorized by New York State to promote economic development with financial assistance and tax relief. The town, largest in population in the United States, is committed to responsible development, emphasizing its stable tax base, highly educated work force and access to major airports, New York City and world markets.


%^$The Buckeyes will try to secure the 300th victory in Russ Hellickson's coaching career when Ohio State plays host to the Buckeye Duals, Jan. 5. The event starts at Noon in St. John Arena when OSU takes on Buffalo. The Buckeyes also will meet Northern Illinois at 1:30 p.m., Eastern Michigan at 3 p.m. and Eastern Illinois at 4:30 p.m. Indiana and Tennessee-Chattanooga also will compete in the duals.


text:
The Chronicle of the Lodz Ghetto, 1941-1944 (Paperback)
By Lucjan Dobroszycki, Lucjan Dobroszycki (Editor)
Yale University Press, 9780300039245, 565pp.
A devastating, day-by-day record of life in the second-largest Jewish ghetto in Nazi Europe—a community that was reduced from 163,177 people in 1941 to 877 by 1944. Compiled by inhabitants of the ghetto and illustrated with more than seventy haunting photographs, the Chronicle is a document unparalleled among writings on the Holocaust.
"A remarkable piece of testimony. To read it is to pay the dead the small tribute of remembrance, and to be devastated by a picture of a particular and terrible hell."—Michiko Kakutani, The New York Times
"The Chronicle of the Lodz Ghetto tears at the mind and heart and leaves a dark and numbing rage in the center of the soul."—Chaim Potok, The Philadelphia Inquirer
"Fascinating, disturbing."—Elie Wiesel, The New York Times Book Review
"[Dobroszycki] has done a major service not only to historians and students of the Holocaust, but to all those, both Jews and non-Jews, who are interested in how a tyrannical regime can exploit, starve, and deceive tens of thousands of intelligent, articulate people in time of war."—Martin Gilbert, The New York Review of Books
"Sober yet unforgettably vivid."—S.S. Prawer, Times Literary Supplement
"A milestone in Holocaust studies. Its wealth of information and accuracy, and the systematic manner in which it was compiled, makes in an unequalled source on the history of the destruction of European Jewry."—Alexander Zvielli, The Jerusalem Post Magazine
"Well worth reading as a record of extremes of human experience."—Majorie Meehan, M.D., American Journal of Psychiatry
"Dr. Dobroszycki is a survivor of the ghetto. He is also a trained historian with a sophisticated, finely honed mind. No one knows as much about these records as he does. No one understands them better."—Raul Hilberg
Lucjan Dobroszycki is a historian at YIVO Institute for Jewish Research and Yeshiva University.


DUBAI: A Boeing 707 military cargo plane crashed in bad weather on Monday west of the Iranian capital, killing 15 out of the 16 people on board, the Iranian army said.
A flight engineer survived and was taken to hospital, the army said in a statement carried by the semi-official Fars news agency. The aircraft's black box – a cockpit voice recorder (CVR) – had been recovered at the crash site, Fars said.
The plane went down near Fath airport, which belongs to Iran's elite Revolutionary Guards Corps and is located near Karaj in the central Iranian province of Alborz.
"A Boeing cargo 707 place carrying meat from Bishkek in Kyrgyzstan had an emergency landing at Fath airport today … the flight engineer has been dispatched to the hospital," the army said in the statement.
"It exited the runway during the landing and caught fire after hitting the wall at the end of the runway," it said.
An army spokesman, Shahin Taghikhani, told state TV that the plane belonged to Iran and that all on board were Iranian citizens. The army's statement came after conflicting reports over who owned the plane.
State TV said rescue teams had been sent to the area, between the airports of Fath and Payam International Airport, where the plane had been meant to land.