text:
WHO Alarm: Zika Virus on the Rise in Angola
22 de December de 2017 Maka Angola
The World Health Organization (WHO) has issued a health emergency alert about a possible Zika outbreak in Angola, urging the Angola Ministry of Health to immediately begin implementing its planned interventions to minimize the impact. The WHO's alert is particularly alarming because it is issued in response to a growing number of cases of microcephaly among newborns in Angola particularly in Luanda. Microcephaly is a rare neurological condition in which an infant's head is significantly smaller than the heads of other children of the same age and sex. Sometimes detected at birth, microcephaly is usually the result of the brain developing abnormally in the womb or not growing as it should after birth. An infected pregnant women can transmit Zika to her fetus, which can lead to brain abnormalities. As of 29 November 2017, a total of 42 cases of microcephaly had been reported, of which 39 occurred in live […]
Tales from the Crypt: Angola's Hidden Hospital Horrors
5 de May de 2016 Rafael Marques de Morais
Morgue Tax "Sick people don't have to pay. Only the dead." At face value, this remark from one of the administrators of the Regional Hospital in Cafunfo, in the province of Lunda Norte seems to make no sense. Then clarity emerges: the town does not have electricity. The living have to put up with no electricity. But the families of the recently deceased are forced to pay "for a day or two's refrigeration in the morgue" or deal with the gruesome consequences of a decomposing corpse. Cecilia Matias was only sixteen when she died from yellow fever. Her Aunt, Madalena Matias revealed that that the grieving family had to find the equivalent of nearly four hundred dollars for Cecilia's body to be preserved while they arranged her funeral. "We bought two {200 litre) barrels of diesel at the pump, at a cost of 64.000 kwanzas, to keep Cecilia's body preserved […]
The Morgue.
24 de March de 2016 Rafael Marques de Morais
It's barely 2am at Luanda's Josina Machel Hospital, the largest in Angola, but already vehicles are queuing in a long line at the entrance. Most carry coffins. Others bear the unboxed bodies. Over the next five hours they will remove the mortal remains of 235 luckless Angolans for burial. It will be at a rate of a coffin for each 1.20 minutes. This macabre harvest is routine. The Angolan government can massage the statistics but it only takes one observer to stand and count, as, one by one, grim-faced morticians and weeping relatives carry away the dead. Angola is in the grip of a yellow fever epidemic that the authorities would prefer to downplay. Malaria too is reaping a rich harvest. This year, these two treatable conditions are the main causes of death in Luanda, an overcrowded metropolis of more than six million souls. The tiny few who make it […]
The Children's Corridor of Death in Angola's Second Hospital
7 de March de 2016 Rafael Marques de Morais
There are more than 40 people in the room, most of them sitting or lying on their cotton wraps on the floor. The heat is unbearable, as is the stink of sweat and dirt. The windows are permanently left wide open to try to offset the stifling, oppressive atmosphere. It doesn't help. Just outside the windows at the back of the building, broken sewers add a horrible, nauseating stench to the air. This sorry scene is repeated in every ward in the paediatric block, where relatives lie prostrate the length of the corridors, unable for lack of space to get any closer to their sick children. Welcome to the Paediatric Unit of Américo Boavida Hospital in Luanda, named for a doctor turned freedom fighter, known in the field as 'Ngola Kimbanda' (the chief healer). He must be turning in his grave. It's the second largest hospital in Angola – only […]
Yellow Fever Epidemic in Luanda Claims Three Siblings
An epidemic of yellow fever on the outskirts of the Angolan capital, Luanda, which has already claimed an estimated 100 lives, has scythed through one family , taking three of their four children in a single day. The siblings, Mauro Julião dos Santos (7), Sofia Juliao dos Santos (5) and Lucrécia Julião dos Santos (3) succumbed to the fever within 24 hours of showing symptoms. The youngest sister, Natália Julião dos Santos (1) is fighting for her life. The cause of death has been confirmed by Cajueiros hospital, which issued death certificates stating that the children died from yellow fever. Tragically, the family – despite sharing a name with the Angolan President, Jose Eduardo dos Santos – is so poor that they cannot even afford makeshift coffins for the tiny victims. The grandparents put out an appeal to the authorities to show compassion: "Can the government please help us with […]
Nair's Death
22 de December de 2015 Rafael Marques de Morais
I have often asked myself about the cost of a human life in Angola. Nair's death pained me, but it was the pain of someone who is powerless and not able to do anything about it. In the last few days, I have been following the tragedy of a mother. After Nair complained of headache and a backache, her mother took her to Samba Healthcare Center in Luanda. Tests were carried out and turned out positive for malaria. The staff at the clinic decided to give her a combined doze of Coartem and Paracetamol. She was also given two packets of serum "to drink at will" and folic acid. After that, they sent her home. The family concluded that the treatment was not sufficient and, on the same day, went to the David Bernardino Pediatric Hospital. Here the doctor ordered a test in the laboratory for sickle cell anemia. The doctor […]
The Absent President and Angola's Future
26 de November de 2013 Rafael Marques de Morais
In the last few months, health concerns have prompted President José Eduardo dos Santos to make several trips to Spain for medical treatment. According to sources who spoke to Maka Angola on condition of anonymity, the President was evacuated to Barcelona on November 9 after falling in the Presidential Palace. Maka Angola has established that the President suffered a prostatic renal crisis, which required him to spend at least 30 days under observation. This is why he missed the Independence Day celebrations on November 11 for the first time ever. A medical expert explained to Maka Angola that a prostatic renal crisis is a condition in which the urine flow is obstructed by an enlarged prostate and production of urine ceases, necessitating dialysis in the case of kidney failure. "In the case of kidney failure, a very serious and often fatal situation, patients need regular dialysis. The failure of one […]


Oreos have few or no bones, rounded fillets and a light, delicate flavour. They are a durable fish that holds together well under most cooking methods. Although Oreos are much like Dory and can be cooked in a similar way, their skin is usually very tough and must be removed.When choosing a wine to accompany Oreo, seasonings play a large part in deciding what wine to choose. With seasonings consisting simply of rice and dried aromatic herbs, choose lighter-bodied wines such as sauvignon blanc, Semillon or a blend of the two. With more strongly flavoured seasonings, select dry wines made from Chardonnay or Chardonnay blends.


text:
A guide to Sri Lanka in pictures
Things to do in Sri Lanka
Back to Sri Lanka Holidays
2nd Week Free
Endless beaches, friendly people, delicious food, stunning landscapes and amazing wildlife can all be found on the idyllic island of Sri Lanka. This paradise is home to no fewer than eight of the world's UNESCO World Heritage Sites, and more than 2000 years of culture have shaped Sri Lanka into a completely unforgettable destination for travellers.
Thankfully, Sri Lanka is affordable and easy to navigate, so the opportunity to see as much as possible isn't a problem. However, if you really had to narrow it down to just a few must-see experiences, here are a few things that you really shouldn't miss.
The incredible artworks of Dambulla cave
The Golden Temple of Dambulla is a World Heritage Site approximately 70km north of Kandy, and is the largest and best preserved cave temple complex in Sri Lanka. There are five main caves in this jaw-dropping complex, which house countless relics, such as statues of the Hindu gods Vishnu and Ganesh, as well as wall paintings and some incredible murals that span 2000 square metres. Be sure to keep an eye out for the monkeys that roam the top of the cave.
A visit to the city of Kandy
Kandy was Sri Lanka's last capital in the time that the ancient kings ruled the island, and is surrounded by sweeping hills that draw the eye to the magnificent lake that the city envelops. Visiting here makes for a more relaxed experience in contrast to the bright lights and fast tempo of Sri Lanka's other main city of Colombo. The temperature is milder in Kandy, making it the perfect place to take a walk. Highlights of a visit include a stroll around Garrison Cemetery or a visit to the surrounding jungle, where you'll find a great deal of wildlife - including monkeys - clinging to the canopy.
There's plenty to see and do in Kandy, including a visit to the Temple of the Tooth, which is one of the most treasured Buddhist sites in the world. In July and August, the Esala Perahera festival comes alive, with a parade featuring traditional fire and whip dances, and lavishly adorned elephants.
Taking the train to Colombo
From Kandy, the train ride to the nearby city of Colombo is an unforgettable experience. Considered to be one of the world's most picturesque train rides, the scenic views of the mountainous areas and tea plantations will definitely make an impression. Riding the rail network anywhere in Sri Lanka is one of the easiest (not to mention the cheapest) ways to see lots of the island.
The Pettah in Colombo
Pettah is one of the most famous neighbourhoods in Colombo, and the helter-skelter bazaar is unlike anything else in Sri Lanka. Pettah Market on Main Street is one of the most important trading centres in Colombo, and sells all manner of merchandise from textiles and ornaments, to spices and fish. This vibrant bazaar is utterly chaotic, but is truly an experience that shouldn't be missed.
The colonial town of Galle
Once a major trading post on the spice trade route, Galle shifted hands between the Dutch and the English throughout its history, resulting in interesting architecture that's unique to the town. The quaint colonial streets of Galle feature old warehouses, boutique shops and beautiful homes, and a simple stroll is a pleasure in itself.
Iconic shot
End the day by taking a walk around Old Town and the fort walls, whilst there you could visit the Maritime Museum, and then finally, watch the stilt fishermen at work as the sun sets over the sea.
Beautiful beaches
The entire island of Sri Lanka is surrounded by blue crystal clear ocean, so it has its fair share of beaches. Beaches such as Arugam Bay and Bentota are lined with picture-perfect scenes of coconut trees and white sands, offering the tranquillity and relaxation you'd expect from a tropical paradise.
The unspoilt Mirissa beach along the south coast is worthy of particular mention, because asides from the toppling palms and pristine sand, this intimate beach is renowned for whale watching. Take a boat ride from here and you can catch a glimpse of blue whales and dolphins in their natural environment, which makes for an unforgettable experience.
The Sigiriya Rock Fortress
No trip to Sri Lanka is complete without a visit to the ancient palace of Sigiriya. This incredible place was built in to a vast column of rock (known as the 'Lion's Rock') by King Kassapa some 1700 years ago. The trip to the summit is by no means an easy one, but along the way you'll see the colossal pair of lion's paws carved in the rock, and the surrounding landscape of lily covered moats and water gardens is well worth exploring.
Adam's Peak
In Hill Country to the south of Sri Lanka, the imposing sight of Adam's Peak has inspired pilgrimage for more than a thousand years. Named as such as it was believed to be the site of where Adam first set foot on earth after being cast out of the Garden of Eden, and if you can face the trek, the views from the top are simply breath-taking.
Established in 1975, the Pinnawela Elephant Orphanage originally set out to provide care and shelter for orphaned baby elephants that were found in the wild. Since then, the organisation has grown to house 3 generations of elephants, and the work being done continues to maintain a safe environment for these majestic animals.
Visitors can come and see the elephants, with the best time being around 9 in the morning when they are being fed. Afterwards the elephants make their way to the water, and it's amazing to see them splashing around and playing.
That pretty much wraps up our guide for the must sees of Sri Lanka, but in reality there is so much more. It's worth mentioning Yala National Park as a place to visit in order to see wildlife and wonderful landscape, as well as the colourful night ceremonies held at the sacred site of Kataragame.
There really is just so much to Sri Lanka, and a trip here offers both relaxation and exploration. The range of landscapes, cultural sites and history is perfectly complimented by the friendly locals and pleasing climate, so why not plan a trip to Sri Lanka this year?
Similar articles you might like...
A truly educational trip to Sri Lanka
Discover Sri Lanka through the eyes of our travel experts on an education...
Sri Lanka's most delicious traditional dishes
Sample some of Sri Lanka's most delicious...
With so much to see in Sri Lanka, we have narrowed down a few of the real...
Choose from a great selection
of 3, 4 and 5 star hotels.
With everything included
there's nothing to do but relax!
Travel solo with no supplements.
Why pay more? Book today.
Get an extra week FREE
with our long stay holiday offers.
Avani Kalutara Resort
Kalutara, Sri Lanka
The Fortress Resort and Spa
Koggala, Sri Lanka
fr £1050pp View
Beruwala, Sri Lanka
Mahaweli Reach

redpajama_set_name: RedPajamaCommonCrawl


text:
The Need for Conflict Resolution in the Caucasus
Ambassador Edward Djerejian, director of the Baker Institute for Public Policy, recently attended the inaugural ceremony of the Aurora Prize for Awakening Humanity, given annually to an individual "whose actions have had an exceptional impact on preserving human life and advancing humanitarian causes."
The ceremony held in Yerevan, Armenia, celebrated the work of Marguerite Barankitse, who has assisted tens of thousands of refugees over more than two decades of violence and humanitarian crisis in Burundi. Protecting human lives from crimes against humanity is a critical issue to Armenians around the world, as 1.5 million Armenians were killed in the 1915 genocide.
Ambassador Djerejian views the Aurora Prize as an important step for Armenians to move beyond victimhood to a role of activism in preventing similar crimes against humanity around the world. His visit came at a tense moment in the Caucasus, as hostilities broke out along the Nagorno-Karabakh ceasefire line.
As a veteran of a number of conflict negotiations, the ambassador addressed a group of Armenian diplomats at the Foreign Ministry and emphasized the importance of resolving frozen conflicts such as Nagorno-Karabakh, stressing the interest of all parties to move from conflict management to conflict resolution. The ambassador also met with Armenian President Serzh Sargsyan, Armenian Catholicos Karekin II and Armenian Foreign Minister Edward Nalbandian, as well as students from the American University of Armenia.
To read Ambassador Djerejian's interview with the Armenian media outlet MediaMax, click here.
A Russian translation of the interview is available here.


text:
package devopsapi

import original "github.com/Azure/azure-sdk-for-go/services/preview/devops/mgmt/2019-07-01-preview/devops/devopsapi"

type OperationsClientAPI = original.OperationsClientAPI
type PipelineTemplateDefinitionsClientAPI = original.PipelineTemplateDefinitionsClientAPI
type PipelinesClientAPI = original.PipelinesClientAPI

redpajama_set_name: RedPajamaGithub


This entry was posted in humor, language, photography, toddlers and tagged Arizona, children, humor, life, Parenting, photography, quotes, summer activities, Wildlife World Zoo, zoo by Betsy Andrews Etchart. Bookmark the permalink.
Aw, congrats to Gbot for opening that door! It's amazing to see the pride they feel when they can finally do something they couldn't do before.
Yeah! It was quite a moment for both of us!


The floors in your house or any other real estate property deserve the best care considering that it is most exposed to wear and tear. A good flooring will give your house a polished and well maintained look to make it look more appealing. It will also increase the market value in case you plan to sell it in the future.
This is where Green Environmental can definitely help you! We have a team of skilled flooring replacement workers under the expert guidance of a flooring contractor team lead.
Our highly trained technicians provides the best flooring service starting from planning up to execution. We make sure that our specialists properly trained and certified for every flooring system methodology in order to be precise with every type of flooring project.
Our skills and expertise are our core ingredients to provide top quality and lasting floor installations for your home and property. We listen to your flooring ideas and also share our own recommendations. You can also choose from our wide range of readily available floor designs.
Green Environmental provides a variety of floor related services such as wood floor installations as well as basic services like carpet replacement. You may also consider marble flooring as an option.
Our marble flooring contractor will explain everything you need to know about this service and how it is beneficial for your home. You can also opt for the more popular tile floor option. Our tile flooring contractor will also discuss all details associated with tile floors to help you decide on design, color, style, size, and more.
Call us at 888 998-6588 now and request for an inspection and assessment of your home along with a budget estimate. We will closely work with you in every step of the way and will definitely keep your preferences and budget in mind.


Let's do this thing. Together.
Our projects are bound by commitment.
Milverstead Publishing is committed to helping departments, organizations and individuals put together the highest quality applications, publications and storefronts. It is our goal to build and foster successful relationships and make you successful, no matter what your project may be. If you're interested in working with together, please Contact Us to find out more.


This month marked the beginning of 41 promising tech careers.
On May 5th, the first cohort of apprentices in the Apprenti™ program gathered at the World Trade Center, where they were honored by Governor Jay Inslee with a pinning ceremony. The invite-only event was a celebration of this first wave of the hundreds of Washington apprentices that will start work over the next few years. Governor Inslee declared the week of May 1-5 Registered Technology Apprenticeship Week.
Apprenti is the only technology industry apprenticeship program registered with the Washington State Department of Labor and Industries and also the US Department of Labor. The program focuses on recruiting under-represented groups including women, people of color, and veterans. Apprenti helps bridge the skills and diversity gap while also providing urgently needed talent to the state's high-wage tech sector.
Each apprentice receives up to five months of technical training and then a one-year paid apprenticeship with a mentor and additional training provided by WTIA member companies. The first cohort of apprentices will be working in technology jobs at Amazon, Microsoft, Avvo, Comtech, F5 and Silicon Mechanics. The jobs for this cohort include web developer, software developer, network security administrator, Windows system administrator, Linux system administrator, cloud support associate, and IT support professional.
These 41 apprentices are pioneering a bright and more egalitarian future for the Washington tech industry. We can't wait to see where each of them ends up.


text:
Q: eclipse change native language to english I'm just a beginner and installed eclipse php few days back. Today I just setup debugger in Eclipse and when I start debugging my first project I noticed that the values of variables is shown in Chinese or Japanese but not in English and the same is in Browser Output and Debug Output tabs. Please let me know how to change this to English.

A: Thanks everyone for your support and information.
I just found the solution of this problem. I just changed some settings in windows->preferences->php->debug.
Screenshot http://img545.imageshack.us/img545/6617/eclipsesolution.jpg
And i don't know what are the effects of Enable CLI Debug. If anyone knows about it please let me know so that I could know its consequences.

redpajama_set_name: RedPajamaStackExchange


text:
State Aerospace Days
2019 ASA Policy Summit
Hobson Aerospace Award
2019 Awards Dinner
LT. GOVERNOR DIANNE PRIMAVERA CHAIR
To advance the Colorado aerospace community and facilitate state economic development within Colorado through industry networking, policy development, educational discussions, and focused events, involving state elected and other government officials.
ASA STATEMENT OF POLICY (CLICK HERE)
STACEY DEFORE, CITIZENS FOR SPACE EXPLORATION- COLORADO, VICE CHAIR
ROBERT CONE, COLORADO SPACE BUSINESS ROUNDTABLE, VICE CHAIR
MICHAEL GLASS,COLORADO SPACE COALITION, VICE CHAIR
TOM MARSH VICE CHAIR
Colorado AEROSPACE INTERNSHIP PROGRAM
The 2023 Colorado Aerospace Summer Internship Program is for high school and college students interested in pursuing careers in the aerospace industry. All students pursuing STEM- (Science, Technology, Engineering, and Mathematics) related disciplines are encouraged to apply.
The 2023 Internship Program will run for two weeks The 2023 Internship Program will run for two weeks, a virtual week, June 12-16, followed by an in-person week, July 17-22, which gives students ample time to experience what it's like to work in various facets of the aerospace industry. Students will spend time at various aerospace facilities where they will have a chance to meet the best and the brightest in the aerospace industry, participate in hands-on activities, and get an exclusive behind the-scenes look at what each company does and some of the exciting projects they are working on.
2023 COLORADO AEROSPACE DAY
Photo credit:Colorado Space Business Roundtable
Copyright © 2023 aerostates.org - All Rights Reserved.


Aiming to compose well all on your own is hard enough as it is without needing to manage your very own editing and your own checking.
There is a reason professional authors ALWAYS have a little team of editors and proofreaders combing over every single word that they compose in an effort to make sure that it is picture-perfect, concise, and as crystal-clear as humanly possible.
Each and every single significant word processor out there on the market today (along with every email client tool, mobile application, and anything else you may utilize to produce written content on a computer system or electronic gadget) is enabled with your basic spellcheck function– and it's crucial not to confuse that important but fairly easy and simple "standard" of word processing today with the power behind Grammarly.
Not just is the Grammarly platform going to review each word that you compose, however it's likewise going to review each letter that you write in every word in addition to the general context of exactly what you are writing. That's right, this software is smart enough to not just recognize letter patterns however also to analyze what you are writing, how you are writing, and whether your grammar is rock solid in addition to your spelling.
You'll never ever once again have to fret about spelling something ideal or wrong, but you're likewise never going to need to fret about your grammar not being picture-perfect, either. Grammarly is going to offer you with an entire host of services that you can choose from to creates error complimentary content anywhere you write, cleaning up any mistakes on the fly so that you do not have to stress over spending a mountain of time modifying later on down the line.
Best of all, you can make the most of the Grammarly sign-up area on their site today and login free of charge to try it out and "test drive" these fantastic tools today.
As we highlighted above, the tools that are constructed right into the Grammarly platform are going to allow you to easily clean-up your writing without any problem whatsoever, however they are also going to enable you to produce error totally free material on ANY platform you can picture.
Thanks to the advancement team behind Grammarly, there are Grammarly solutions that can be used on your cellular phone, Grammarly tools that can be used on your tablet, and Grammarly tools that can undoubtedly be utilized on your computer– whether you are connected to the web.
You can utilize Grammarly with Microsoft Word, Gmail, Twitter, Facebook, WordPress, and other content production software or option online or off. This is a set of tools that will always work, will scan every aspect of your writing, and will not only make sure that your content is cleaned up from the spelling and grammar viewpoint, however will likewise suggest methods to enhance your syntax, too.
This is not your everyday piece of editing software, that's for sure. Armed with your Grammarly login and password details, you have a whole modifying team and proofreaders all set to rock 'n roll on every piece of material you ever produce!
Each and every single influential author (and every other author out there, for that matter) has an extremely unique and extremely recognizable style– a voice, if you will– that encounters in print as clear as a church bell.
If you lean to more colloquial sort of writing, Grammarly is going to learn that kind of style and will not recommend that you opt for more "uptight" in boardroom focused corrections. If you're more technical focused, Grammarly is going to try and supply you with tips and edits that assistance get you to that style of writing, too.
Since Grammarly utilizes a network of authors to enhance its own abilities, and because it is updated on a consistent basis, you're constantly getting the very best outcomes from this option– and those results are just getting much better more you utilize it (the more that the Grammarly neighborhood utilizes it too).
At the end of the day, you need to make certain that you have someone (or, in the case of Grammarly, something) examining your shoulder and reviewing your writing prior to you go and submit it.
Unless you're going to fork over a small fortune on editors and proofreaders it's a good idea to take advantage of the Grammarly opportunity. The Grammarly sign up student discount rates allow you to take advantage of this tool at a considerable saving, and you can constantly opt for the Grammarly totally free download trial to provide it a "test drive" before you fully devote.
The Grammarly app can be downloaded and made use of in Chrome (and on Android and iOS gadgets) totally free right now. That's a fantastic method to try out the Grammarly solutions prior to you commit.


text:
At the end of the day, Christianity trumps white evangelicalism
May 15, 2019 May 15, 2019 Lisa Spencer
Over at the Washington Post, Eugene Scott has written an interesting opinion piece regarding Mike Pence's commencement speech at Liberty University. Scott is concerned that warnings about Christian persecution fall into a victim complex that is not all that helpful for navigating through fruitful citizenship. Now, I do agree with some of what he says. But the more I read through it, the more I think some parsing is in order to get to the real concern. He says;
Religious persecution is real. The congregations of three black Louisiana churches that were recently burned down for reasons that some suspect were racially motivated know this. And so do the congregants of the synagogue that was attacked last month by a gunman; the suspect pointed to his conservative evangelical theology as justification for his hatred of racial minorities.
But accusing "Hollywood liberals," the media and "the secular left" of persecuting Trump-supporting evangelicals might do little, if anything, to prepare the next generation of leaders to be good citizens working toward the common good in a religiously diverse nation. At worst, it could perpetuate the victim mentality that is so pervasive in our culture wars and that some believe has made this country more politically divided than at any other point in recent history. Such a framing may win you some political battles, but in the long term, it makes it much more difficult for the United States to become "one nation under God," as Pence and so many others often pledge.
Now, I do think he's right in that we can form a persecution complex and engage in fear mongering. After all, Jesus did say that we would have trouble in this world. We can't surely expect that a secular culture will align with Christian values. Even though religious liberty was ensconced in the framework of this country's founding, we do need to consider it is also not a guarantee to live out faithful Christianity. That's not to say we should not care or make efforts to preserve it. But we can at least expect a Christianity believed and lived faithfully will be at odds with a culture that seeks to live for self.
I also think we need to consider the many expressions of religious persecution that occur both locally and globally and not be so limited in our perspective. I see terror on black churches and synagogues as a product of hate more than a product of religious persecution but we do need to think about why places of worship are targeted to express such hate.
But there is something else going on in this piece that I think is deserving of some attention and some brief analysis. Scott highlights Falwell's enthusiastic endorsement of Trump and indicates that Pence criticism is really only directed towards "how it makes people like him feel." And by that he means "conservative white evangelicals who backed Donald Trump in the 2016 presidential race." By making this association, what he is really saying is that Pence's proclamation is a product of white evangelicalism, and by implication only impacts white Christians who align with Trump. So the white evangelical Trump voter who cares about the unborn or that freedom of conscience might be violated with an ever growing agenda for Christianity to conform with secular culture regarding sexual ethics is really just doing so because they want to preserve whiteness. He didn't use those words but it's what I hear in this description. He then highlights Christian progressive voices against this concern to reinforce the idea that it is really only a product of white evangelicalism.
I've heard this before and think it too is a growing problem regarding all threats to Christian freedom. By racializing expressions of concern about religious liberty and tying it into alignment with Trump, is a way to minimize the real issue. The real issue is that we do in fact have a increasingly growing opposition to Christian values regarding sexual ethics and enforcement of an LGBTQ agenda. Christians are being faced with its support under the guise of non-discrimination or risk economic marginalization. That doesn't exactly measure up to government crack downs against churches in China, or mass executions in Nigeria or Burkina Faso, or church bombings in Louisiana but it is nonetheless a growing threat.
On a side note, I wish we could dispense with the charge that 81% of white evangelicals supported Trump as proof that white evangelicals only care about so called white concerns. Not all Trump voters were his supporters but thought the alternative to be detrimental to religious liberty especially with a candidate who would enthusiastically endorse violations of Christian conscience to support the LGBTQ community.
Christians committed to the orthodox teaching of Scripture and the supremacy of Christ in their personal lives and his reign in the world care first and foremost about upholding those values and the right to not violate their conscience. It's not a white thing, but a Christian thing. Now it's true that the issue gets conflated with a politically cultural alignment but we can't let that dismiss the reality on its face value. And let's be clear, progressive voices who align with the cultural acceptance of homosexuality, same sex marriage, transgenderism only add fuel to the cultural case against Christians who uphold these values.
While there may be some legitimate grievances against the white evangelical industrial complex, I promise you, concerns about the religious liberty Pence referred to is not one of them. At the end of the day adherence to faithful Christianity transcends race and politics.
Christian living, culture, politics, reflections and musings
Previous Article Some more questions I'm asking while off to my white evangelical church
Next Article Deconversion and Dilemmas
2 thoughts on "At the end of the day, Christianity trumps white evangelicalism"
Pingback: Saturday Sampler: May 12 — May 18 | The Outspoken TULIP
TEP336 September 23, 2019 / 1:50 pm
Some good points, marred by racial politics. There is only one race, the human race. We are all children of Adam and Eve, which means we are all the same. Race is nothing more than a social construct that was based on pseudoscience, and used to justify the oppression of one group over another. If we want the issue of racism to go the way of the dinosaur, we need to pull the plug on it and let it die. Let's leave racism in the past, push racists off to the side as unhelpful, and move forward. Let's address the very real ethnic issues that exist in our country, take back the power reserved to We, the People, and make the government work for us again. Skin color is immaterial to the growth and strength of our nation, and the more time we spend arguing over skin color, the less is accomplished.


Whether you're on a broken down A Train or at an overcrowded rooftop party, a flask can be a lifesaver and is always a good conversation starter.
This stainless steel flask is a time-honored accessory to men of all different cultures and social classes, the flask has proven itself to be a necessity of the times and we guarantee it's a prime gift that fits any occasion. Salut!


Released on September 19, 2014, this 4.7" screen iPhone is the smaller version of the iPhone 6 Plus. Identifiable by the model numbers A1549, A1586, and A1589.
I broke my original screen and replaced it with the Ifixit front panel assembly. After installing the front panel assembly the sensor seems to think it's dark all the time. I'm not sure if it was something I did during installation or if it was faulty before installing the front panel. Everything else seems to work fine.
I finally took the time to swap the cables from the original screen to the new one. Everything is now working as it should. Thanks for all the help.
I would suggest to double check you did everything properly, the light sensor is very tiny and might have ended up misplaced unwillingly. Check the connector on the board too just to make sure no debris is present. If these don't work I don't see any alternative to buying a new flat cable.
Change the front camera cable, chances are it's defective. A dark screen with no change in brightness occurs when the ambient light sensor is faulty or no front camera cable is connected.
Depends on the quality screens your using.
Original quality screens never have this problem.
So please check if your sensor is perfectly seated. Either way iT your screen or your proximity sensor.
I will take it apart and make sure all the connectors are seated properly but everything else seems to be working. The front panel came assembled already. I still have the original screen with a known good sensor.
Yes try that, my experience with assembled screens is that they are not always assembled the right way.
Aaron Krentler zal eeuwig dankbaar zijn.


(Host) The Stowe Mountain Resort has agreed to pay about a quarter of a million dollars to help develop affordable housing in the Lamoille County region. Stowe promised to make the housing payment during a recent Act 250 hearing that examined the economic impact of the resort's $220 million expansion.
(Dillon) Four other Vermont ski resorts – Stratton, Okemo, Mount Snow and Killington – have also paid to offset the impact of their developments on a tight housing market. In Stowe's case, the resort plans a major expansion that includes new snowmaking, a new base lodge, and more than 400 new housing units.
But as the resort grows, hundreds of new workers will also need a place to live. State officials told a recent Act 250 hearing that there's already a shortage of affordable housing in the area. The average sales price of a house in Stowe last year was $327,000. Yet the cost of affordable housing in Lamoille County is around $70,000. Stowe resort planning director Rob Apple says the company can be part of the solution.
(Dillon) Apple says the resort has agreed to expand its own employee housing by 24 rooms. It has also promised to pay about $250,000 into a fund to help develop affordable housing in the area.
The fund will be administered by the state Housing and Conservation Board. Jim Libby is the board's general counsel. He says the money can be leveraged with other funds to help subsidize housing projects.
(Dillon) Libby said the Housing Conservation Board has participated in similar programs with other resort expansion projects.


MACLA participants will learn how to create a storyboard, write a script, film and direct their own stories. All films will be showcased as part of SoFA District's South First Fridays artwalk. A one time $25 registration fee to apply.


text:
De Audi Q2 is een compacte Sports Utility Vehicle van het Duitse automerk Audi. De cross-over is na de Q7, Q5 en Q3 het vierde "Q-model" van Audi. Hij deelt zijn platform met de Audi A3.

Uiterlijk
De Q2 wijkt enigszins af van andere Audi (Q) modellen qua uiterlijk. Met name de grille en koplampen zijn anders dan bij andere Q modellen. Er zijn twee uitvoeringen: sport en design. Bij design zijn de bumpers, spatborden en grille in contrastkleur Manhattangrijs gespoten. Standaard staat de Q2 op 17 inch lichtmetalen velgen, dit is uit te breiden naar 19 inch. Optioneel zijn er LED-koplampen. Ook is er een S-line exterieurpakket beschikbaar, met andere bumpers en diffuser, en standaard vollak. Typisch aan de Q2 zijn de c-stijlen, die Audi zelf blades noemt. Deze kunnen mee gespoten worden met de rest van de auto, maar ook in een contrastkleur. Opties hiervoor zijn ibiswit, manhattangrijs, mat titaangrijs en ijszilver (alleen bij sport).

Interieur
Het interieur is in de basis dat van de A3, maar met meer personalisatiemogelijkheden. Er zijn normale stoelen en sportstoelen te krijgen, welke in verschillende soorten leder en stof te krijgen zijn, veelal met contrasterende stiksels. De decoratielijsten kunnen bij het designpakket in wit, oranje en aluminium worden uitgevoerd, bij het sportpakket kan dit in rood, geel en aluminium. De Audi Virtual Cockpit is ook in de Q2 een optie en een Bang & Olufsen speakersysteem van 705 watt is ook optioneel.

Technisch
Bij de introductie waren drie motoren beschikbaar, de 1.4 TFSI benzine met cilinderuitschakeling en twee diesels; de 1.6 TDI met 116 pk en 2.0 TDI met 190 pk. Laatstgenoemde heeft altijd quattro en S tronic. Later kwam als nieuwe instapper de 1.0 TFSI driecilinder met 116 pk en als nieuwe topper de 2.0 TFSI met 190 pk. Deze gaat in 6,5 seconden naar de 100 km/u en is voorlopig de snelste Q2, tot het verschijnen van de SQ2, die 310 pk zal krijgen.

Benzine

Diesel

Gegevens vanaf modeljaar 2019

Benzine

Diesel

Q2
Audi Q2

redpajama_set_name: RedPajamaWikipedia


text:
Q: Why can't I get a List from a database with Linq I've got a weird problem. I can use LINQ to get all of the rows in my database, but I can't get a List of the contents of one of the columns.
In the code below, "Derfus" is ends up being a List object and I can use the debugger to look at the list contents. "NewsItem" is the class name for the elements of the database. In each element of the Derfus list, the m_ItemId member variable is set to a non-zero value that I can see with the debugger. This is what I want, and I could use a loop to get these values. But I seem to have something wrong with my LINQ syntax on the second line because IdList, which is a List as expected, contains all zeros. IdList contains the right number of elements, the same as Derfus contains, but not the values that I expect.
var Derfus = ( from e in Context.Table select e ).ToList();
var IdList = ( from e in Context.Table select e.m_ItemId ).ToList();

These lines are one after another in the code. The table does contain m_ItemId as a column and it is a "long".
I am not sure what other code to show. Since the lines both compile, and lots of other functions work properly with this database, I don't know what else could be relevant. Here's the NewsItem definition:
public class NewsItem
{
    [SQLite.PrimaryKey, SQLite.AutoIncrement, SQLite.Indexed]
    public int m_Id { get; set; }
    public long m_ItemId { get; set; }
    public String m_Title { get; set; }
    public String m_Subtitle { get; set; }
    ...
}

Note that I am using SQLite but it should not cause me problems like this, should it?


This year's Rode-Reim 2016 Property Conference to be held in Cape Town and Johannesburg at the end of September has as its topic "Glocalisation" - The practice of conducting business according to both local and global considerations.
With 30 interested tenants per listed property, the rental game can prove as difficult for agents as it is admin intensive. And as any rental specialist will tell you, the secret to a successful rental division is personalised service and good relationships.
So why then is Just Property, which rebranded a month or so ago, encouraging its tenants to get themselves bond fit, equipping them with educational tools and services to do just this, and potentially losing them forever to homeownership?
It all started in February this year when Paul Stevens, CEO of Just Property, read a story about My Bond Fitness – the brainchild of attorney Meyer de Waal – which aims to assist consumers in their desire of fulfilling their homeownership aspirations. Whether consumers are battling bad credit scores, needing help with their budgets to get themselves bond fit, or if they simply need advice on how to raise their required deposit amounts, MBF aims to bridge the gap between renting and homeownership.
When a sectional title unit is sold, the pro rata ordinary or general levies for the period remaining of the current financial year automatically becomes the responsibility of the new owner, according to the Sectional Titles Act.
What happens, however, if there is a special levy due?
There is no provision in the Act that caters for the change of ownership during a period of special levy raising and payment, and this lack of provision sometimes makes a situation such as this complicated, says Mandi Hanekom, operations manager of sectional title finance company Propell.
The Act simply says that the person who is the registered owner of a unit on the date that the trustees raise a special levy is liable to pay it. There could be complications though when special levies are paid off over a period of time in instalments and during this time a unit (or units) changes hands.
Commercial properties can host a variety of different tenants. What makes the property successful for both landlord and tenant will be whether the tenant mix works for everyone. "A question often asked by investors when renting out premises," says Leon Breytenbach, National Manager of the Rawson Property Group's commercial division, "is, 'What is the ideal mix of tenants for my commercial property?'" National tenants, comprising large companies found nationwide, are considered ideal tenants because they are household names, e.g. Pick 'n Pay, Shoprite, Mr. Price, etc., but they carry a cost. Due to their wide customer-base, attracting large numbers of consumers, national tenants often demand a lower rental. Similarly, office based tenants which are strong, secure and reputable, will expect a similar reduction.
When a national tenant demands a lower rental, this reduces the return on the property. "There is a trade-off, however," says Breytenbach, "as you gain greater confidence and stability in your tenant base and therefore, in your income. When a national tenant occupies a commercial property,other tenants in the same property will pay a higher rental as a means of offsetting the lower rental offered to the national tenant." In Claremont, for example, current rental rates for a commercial property are about R180 per square metre for stand-alone premises, but near a national tenant the cost may rise to R220 or R250 per square metre, while in exceptional cases rent has been known to go as high as R500 per square metre.


text:
LOOK: This Viral Video's Song Made Us Cry!
Remember the song that was used on a fast food chain's viral video, "Crush"? With a long history of renditions, it has become the theme song of torpes in Filipino pop culture.
Video Courtesy:Jollibee Philippines
You may have heard Erik Santos' version of "Don't Know What To Say (Don't Know What To Do)" on the recently-concluded Kapamilya teleserye Till I Met You, but it has been recorded by various OPM artists before.
The song was composed by legendary songwriter Odette Quesada, the same woman behind the most iconic anthems from the 80s including Sharon Cuneta's "To Love Again", Kuh Ledesma's "Till I Met You", Raymond Launchengco's "I Need You Back", and Gary Valenciano's "Growing Up" from the classic teen flick Bagets!
"Don't Know What To Say (Don't Know What To Do)" was originally sung by Ric Segreto who died in a motorcycle accident in Makati back in 1998. Among those who have covered the song are Lea Salonga, Rachel Alejandro, and Richard Yap. Give it a listen below:
Are you one of those people who "never gave up on love"? Tell us in the comments!


text:
10/27/15 Chicago Cubs outrighted C Taylor Teagarden from the 40-man roster.
10/22/15 Chicago Cubs changed C Taylor Teagarden's roster status.
10/11/15 Chicago Cubs selected the contract of C Taylor Teagarden from Triple-A Iowa (Pacific Coast).
8/4/15 Chicago Cubs outrighted C Taylor Teagarden from the 40-man roster.
8/2/15 Chicago Cubs designated C Taylor Teagarden for assignment.
7/4/15 Chicago Cubs called up C Taylor Teagarden from Triple-A Iowa (Pacific Coast).
7/4/15 Chicago Cubs selected the contract of C Taylor Teagarden from Triple-A Iowa (Pacific Coast).
3/5/15 Chicago Cubs assigned C Taylor Teagarden to the major league roster.
12/28/14 Chicago Cubs signed C Taylor Teagarden.
7/31/14 New York Mets optioned C Taylor Teagarden to Triple-A Las Vegas (Pacific Coast).
7/31/14 New York Mets outrighted C Taylor Teagarden from the 40-man roster.
7/19/14 New York Mets assigned C Taylor Teagarden to Triple-A Las Vegas (Pacific Coast).
7/17/14 New York Mets assigned C Taylor Teagarden to Advanced-A St. Lucie (Florida State).
7/12/14 New York Mets assigned C Taylor Teagarden to Rookie GCL (Gulf Coast).
6/24/14 New York Mets placed C Taylor Teagarden on the 15-day disabled list (n/a).
6/8/14 New York Mets selected the contract of C Taylor Teagarden from Triple-A Las Vegas (Pacific Coast). Analysis
1/6/14 New York Mets signed C Taylor Teagarden. Analysis
9/5/13 Baltimore Orioles outrighted C Taylor Teagarden from the 40-man roster.
9/1/13 Baltimore Orioles designated C Taylor Teagarden for assignment.
6/4/13 Baltimore Orioles activated C Taylor Teagarden from the 15-day disabled list (n/a; went on 4/28).
5/31/13 changed C Taylor Teagarden's roster status.
4/28/13 Baltimore Orioles placed C Taylor Teagarden on the 15-day disabled list (n/a).
4/28/13 Baltimore Orioles changed C Taylor Teagarden's roster status.
7/14/12 Baltimore Orioles activated C Taylor Teagarden from the 60-day disabled list (n/a; went on 5/9).
5/9/12 Baltimore Orioles placed C Taylor Teagarden on the 60-day disabled list (n/a). Analysis
4/4/12 Baltimore Orioles placed C Taylor Teagarden on the 15-day disabled list (n/a).
12/1/11 Texas Rangers traded C Taylor Teagarden to Baltimore Orioles.
11/2/11 Texas Rangers changed C Taylor Teagarden's roster status.
8/24/11 Texas Rangers optioned C Taylor Teagarden to Triple-A Round Rock (Pacific Coast). Analysis
7/28/11 Texas Rangers called up C Taylor Teagarden from Triple-A Round Rock (Pacific Coast).
7/4/11 Texas Rangers optioned C Taylor Teagarden to Triple-A Round Rock (Pacific Coast).
6/12/11 Texas Rangers called up C Taylor Teagarden from Triple-A Round Rock (Pacific Coast). Analysis
3/29/11 Texas Rangers optioned C Taylor Teagarden to Triple-A Round Rock (Pacific Coast).
9/3/10 Texas Rangers called up C Taylor Teagarden from Triple-A Oklahoma (Pacific Coast).
8/23/10 Texas Rangers optioned C Taylor Teagarden to Triple-A Oklahoma (Pacific Coast).
7/24/10 Texas Rangers called up C Taylor Teagarden from Double-A Frisco (Texas). Analysis


While our members concentrate on their businesses, they know they can rely on Arizona Trucking Association's staff of experts and ATA's many services to help simplify their day-to-day operations. Altogether, our staff brings a combined 318 years of experience in business, operations, law enforcement, safety training, government advocacy, vehicle title and registration, human resources and other know-how to our members each and every day!
Download an application to join us!


text:
Home › Data Centre
Global pay-TV to peak at $200 billion
James Groves ⋅ May 8, 2017
Global pay-TV revenues will peak at $202 billion in 2017, before plateauing at around $200 billion for the next five years, according to the latest Digital TV Research study.
The analyst's 'Global Pay-TV Revenue Forecasts' report studied pay-TV trends in over 138 countries and found that revenues are set to decline in 33 countries between 2016 and 2022, even though they will likely more than double for 13 territories in this period. US revenues are forecast to plunge by a $12 billion over this time while Western Europe will likely see revenues slip by $566 million and Eastern Europe by only $28 million in this time.
The US is set to command 47.5 per cent of global pay-TV revenues – or $94.82 billion – by 2022, although this is way down from the 58.3 per cent recorded in 2010. In contrast, Digital TV Research expects Asia Pacific to record a $5.75 billion increase to $40 billion in 2022. Asia Pacific overtook Western Europe in 2013, and will be larger than the whole of Europe in 2017.
Revenues in Sub-Saharan Africa are projected to rocket by 57 per cent to $6.59 billion and by 17 per cent in Middle East & North Africa, up by $0.59 billion to $4.12 billion.
Looking at platforms, Digital TV Research forecasts that global analogue cable revenues will fall by $8.77 billion between 2016 and 2022 as most the remaining subscribers finally go digital. Digital cable TV are though forecast to fall by $3.14 billion, due mainly to subscribers converting from standalone status to bundles, which provide higher overall revenues for operators but lower TV ones. IPTV revenues will likely climb by $2.34 billion.
Satellite TV will add more than any other platform from 2016 to 2022, the $6.66 billion rise meaning that the total will be $89 billion. DTH and DBS satellite TV revenues are set to overtake total cable TV revenues in 2020, having passed digital cable a year earlier.
Tags ⋅ digital tv research ⋅ pay TV
Global TV revenues to hit $265 billion in 2018
Vodafone and Liberty Global agree €18.4 billion takeover deal
Global pay-TV operators 'to lose $20 billion in revenues'
Liberty Global acquires Cable and Wireless for £3.5 billion
Global pay-TV market to exceed one billion by 2017
Quickplay continues global expansion reaching one billion addressable viewers
Global pay TV market to make $280.4 billion in 2014
Global connected TV device ownership exceeds 1 billion


Visitors no longer access your website only from a desktop computer. Devices people take with them, like smartphones, tablets, laptops, even watches are used to view your website. Website design has had to advance with advancing mobile technology. Responsive web design will let you optimize your website for all devices and maintain uniform user experience, regardless of which device your site is being viewed on.
Responsive web design is the approach that suggests that design and development should respond to the user's behavior and environment based on screen size, platform and orientation. In other words, the website should have the technology to automatically respond to the user's preferences. This completely eliminates the need for a different design and development phase for each new gadget on the market, even devices that haven't been invented yet.
Adopting responsive design will help you tell your target audience that you are driven by a vision for the future. Contact us for a free responsive website design quote now.


text:
PUERTO RICO FORUM REFLECTION #3: Cultivating a Hermeneutics of "El Grito" in the Eye of the Storm
Melissa Pagán
Mount Saint Mary's University
Read MoreCollapse
On September 20, 2017, Hurricane María made landfall in Puerto Rico. Just a few weeks prior, many Puerto Ricans had breathed a sigh of relief because, while Hurricane Irma delivered rain and flooding, cut off power from much of the grid, and took several lives, its eye had missed La Isla. But María's scale was massive and no part of the island was spared the darkness, destruction, despair, and death that ravaged and settled on the island that day.
We Puerto Ricans in diaspora wept for our Isla. But with virtually no communication channels open, initially we did not even know the fate of our family members there, nor could we do anything to help them. Day and night we waited for news from Puerto Rico. When finally the first few images and news stories appeared, we were in a state of disbelief: this cannot be our island! This cannot be happening!, we thought. More shocking and painful was listening to the cries from our fellow Puerto Ricans on the island, and the recognition that, again, the US had neglected our people—as it would continue to do for the following months. Indeed, the structures of "US citizenship" makes little or no difference when the US considers the particular citizens in question not to be fully human. In short, we saw a graphic retelling and amplification of our history.
The conference panel through which these reflections were first presented was organized so we could be truth tellers to this history, to raise awareness about the past and present context of Puerto Rico, and to construct pathways forward.[1] In part, my task on the panel was to think about theological and ethical frameworks that could structure a decolonial future for Puerto Rico. This was an arduous task. It is doubly taxing to perceive and grasp the radical, decolonized hope necessary to envision a better, liberated, future when one is overcome with grief. However, this was our task. All of us on the panel were Puerto Ricans, either living in Puerto Rico or in diaspora. We are also all in some way associated either with the Academy as scholars of religion and/or theology or with organizations working on the ground in Puerto Rico. So, naturally, we began to think about the ways our own work could function toward bringing about this better future. I came to this task humbled, not certain I was the best person for it, but ablaze with a loving rage as I watch my fellow Boricuas struggle to survive, to be heard, to see in the darkness, to find adequate food, water, shelter, to be considered human, to have their cries addressed.
Nuyorican artist, Caridad De La Luz, also known as La Bruja, poetically put into words what many of us are experiencing because, in the wake of María, "it seems as if it is 1492 all over again."[2] Indeed, it does seem that it is 1492 as much as it is 1898 (the year of the US invasion of Puerto Rico during the Spanish-American War) and, yet, it was 2017 when that hurricane hit. Though the eye of María left Puerto Rico in darkness, it sharpened our vision and focus. We could see and tell how what followed this meteorological ravaging of Puerto Rico and Puerto Ricans was only the most recent manifestation of colonial logics and practices. These most recent iterations of forced dependency, the repeated transfer of Puerto Ricans and their affairs from colonizer to colonizer with no regard for human lives, the imposed debts where requested repayment functions as blood dowries,[3] all enable the continuation of an unbalanced and abusive relationship. La Bruja rightly characterizes the continuous "whoring of our people," the unbridled "rape culture" of our land, our resources, and of the people and dignity of Borinquen as masquerading as paternalistic care. Such "care" is needed, our colonizers have suggested, because we suffer from an intractable laziness.[4] They say we are incorrigible, and our only worth as persons is instrumental. Puerto Ricans are those made to sustain violence and death by fighting in US wars. We suffer under the plight of global coloniality. Yet we are deemed not worthy of agency, voice, and representation. These same colonizers mockingly throw paper towels at us,[5] as if to suggest this ought to be sufficient for us to mop up the tears and to soak up the incessant rains of oppression that have befallen Puerto Ricans for centuries. The eye of the storms – whether of Spain, of the United States, or of hurricanes like María – has laid bare the logics of coloniality in the United States' relationship to Puerto Rico. We must not look away.
In our original panel in November 2017, we heard the cries of seemingly unending grief that haunts Boricuas both on the island and in diaspora.[6] I suggest that such grief stems from what decolonial theorist, Nelson Maldonado-Torres terms the "sub-ontological or ontological colonial difference."[7] He claims that this space is characterized by interminable violence (epistemic, physical, and sexual). "Ontological colonial difference" is the "difference between Being and what lies below Being or that which is negatively marked as dispensable as well as a target of rape and murder."[8] This colonial difference was created, legitimized, and has been maintained via concurrent processes that construct and then relegate persons to a subhuman/subontological status by virtue of their race, ethnicity, class, gender, and sexuality. With these constructs, ontological colonial difference creates and sustains bodies as subhuman in order to justify the unending enactment of violence upon them.[9] Maldonado-Torres's theorizing of the ontological colonial difference must, of necessity, be coupled with his analysis of what he terms the "phenomenology of the cry."[10] This "cry" he understands as "the first marker of an enslaved and suffering subjectivity…a sound uttered as a call for attention, as a demand for immediate action or remedy, or as an expression of pain that points to an injustice committed or something that is lacking."[11] Maldonado-Torres indicates that the cries of those at the colonial difference are rooted in the grief of knowing that we are not recognized as human, at least not in the same way as others are. It is a lament imbued with love and rage, which beseeches the Other to recognize our humanity.[12] This space and the cries that emerge from it have characterized our existence as colonial subjects and as colonial migrants. Since María, these wounds have been put on full display before the world. They are a bitter reminder of our disposability, of how we do not matter.
When I think about the fact that we are still deemed not to matter, I think about a particular Twitter hashtag linked with the Black Lives Matter movement called #LastWords.[13] #LastWords record the last utterances of Black persons prior to being killed by police officers. They include the cries of Eric Garner, "I can't breathe," of Michael Brown, "I don't have a gun, stop shooting," and of Kimani Gray, "Please don't let me die."[14] The list goes on and on, and grows each day. Along with them, let's recall how the mayor of San Juan, Carmen Yulín Cruz, displayed the cries for our people on her tee shirts as she conducted interviews and press conferences. These included the cries of "Help us, we are dying," cries that still have not been answered. I think, too, of her comments indicating that the inaction of the US in the aftermath of Maria was "close to genocide," and her tearful pleas to the Trump administration at a press conference:
We are dying here…I cannot fathom the thought that the greatest nation in the world cannot figure out the logistics for a small island of 100 miles by 35 miles. So, mayday, we are in trouble…So, Mr. Trump, I am begging you to take charge and save lives. After all, that is one of the founding principles of the United States of America. If not, the world will see how we are treated not as second-class citizens but as animals that can be disposed of. Enough is enough.[15]
Puerto Ricans continue shouting from the place of colonial difference, and the lack of response to them is no accident. When I consider the cries and the laments stemming from this colonial difference—actually, this colonial indifference— as an ethicist I find myself feeling that we must amplify these voices, we must amplify the cries stemming from such indifference. How to do that?
Clearly, our current theo-ethical frameworks are insufficient. As I pondered to which set of frameworks and theories I could turn to provide us with such an theo-ethical framework, it became apparent that we cannot rely upon categories that were never created with persons like us in mind.[16] These frameworks were not created with any critical awareness of global coloniality, and yet are indebted to it. By this I mean that our theological and ethical frameworks are rooted in the very logics that perpetually replay history, whether of 1492, 1898, or now of 2017, and our particular subservient place in it. So, I ask you: What do our anthropologies and epistemologies look like? And how do they contribute to the neo-liberal logics of coloniality? For we will be hard-pressed to deny that this is the case.
Yet, there is work to do, and we are the only ones who will put our shoulders to the task. So how can we move forward? How can we imagine a decolonial future for Puerto Rico, and indeed for all of us? How can we refuse to be indifferent about the colonial difference? We can start, of course, by addressing the immediate material needs of Puerto Ricans, as affected by María. We can make donations to those organizations that we know will actually route that money to vulnerable persons. We can continue to work towards the restoration of power on the island and resist disaster capitalists who seek to profit from our despair, who seek to create a "Puerto Rico without Puerto Ricans." We can also continue to be in touch with our congresspersons, we can march, and we can advocate for a repeal of the Jones Act. We should advocate for independence for Puerto Rico, but we cannot pretend that this alone will amount to real freedom or liberation. It is a point, but not the end point. There is more work that we need to do – epistemological work and anthropological work—and everyone is responsible for doing it.
One of the first steps that we can take as theologians and ethicists is to privilege a hermeneutics of el grito.[17] This privileging builds upon the work of María Pilar Aquino and Maricel Mena-López, who name the importance of a "hermeneutics of lament" that can function as an "epistemological break with kyriarchal epistemologies," but only when individuals consider a "whole history, not just a moment of suffering."[18] It is necessary that we begin to break through colonial ways of knowing that ground so much of our thinking about the human person in relation to one another and in relation to God. In the context of the indifference to suffering and violence produced at the colonial difference/indifference, as evidenced by the phenomenology of the cry, the past and present sufferings of our people must become the locus of our work as theologians, ethicists, and educators. Naming the importance of a hermeneutics of el grito reminds us of the history of the processes of global coloniality that continue to relegate subjects to a subhuman status. It challenges us to listen and recognize how our current categories inhibit rather than facilitate liberative possibilities. It reminds us of our long history of struggle against colonial powers and invites us to imagine the ways that "El Grito de Lares" can be repeated. "El Grito de Lares" ("The Cry of Lares," a mountain town in central-western Puerto Rico) names the 1868 uprising against Spanish colonial rule, motivated by the desire of Boricuas to be free for self-determination, agency, and personhood. A hermeneutics of el grito is one way that we can recall the history of our struggle to survive and resist the logics of coloniality. To revive El Grito de Lares resonates with the advice of Lola Rodriguez de Tío, who wrote a revolutionary version of the Puerto Rican national anthem La Borinqueña, including the line, "El Grito de Lares se ha de repetir, y entonces sabremos vencer o morir" ("The Cry of Lares shall be repeated, and then we will know victory or death"). Such a hermeneutics compels us to consider how we can bring to our classrooms cries of freedom that stem from this colonial difference, and how we can incorporate them into our pedagogies and into our ways of being in the world.
A hermeneutics of el grito demands that we critique the theological categories that perpetuate neo-liberal, global coloniality. Such a critique requires not a simple reimagining of our theological categories but a complete obliteration of them. Only once we have done that can we rebuild.[19] I admit that I do not fully know what this might look like, but that is all right. Such an admission is in line with Otto Maduro's reminder that when we do not exercise epistemological humility, we tend to perpetuate violence against persons and deny their humanity "without wanting, without knowing, without wanting to know."[20] We may not know precisely what the future looks like for Puerto Rico, but we will not be without wanting, or without wanting to know. The type of hubris that knows it all already is one we must avoid in order to attend to the gritos in our midst. That is the work that lies ahead of us.
Written by hti
[1] This essay is based on my panel presentation in the Forum entitled, "Puerto Rico and María: Histories and Vulnerabilities in the Eye of the Storm," at the Annual Meetings of the American Academy of Religion and the Society of Biblical Literature in Boston on November 19, 2017.
[2] Caridad De La Luz, "Poor to Rico," performed at the "Poets for Oscar Marathon" at La Marqueta in New York City on May 28, 2016.
[3] In a series of tweets sent out on September 26, 2017, Donald Trump, reflecting on the total destruction of Puerto Rico and its need for federal aid, seemed to suggest that such aid should only come after Puerto Rico has paid its "debts." He claimed that Puerto Rico has "billions of dollars owed to Wall Street and the banks, which, sadly must be dealt with."
[4] In a series of tweets sent out on September 30, 2017, Donald Trump critiqued San Juan Mayor, Carmen Yulín Cruz, and others in Puerto Rico for their "poor leadership ability…who are not able to get their workers to help." He also claimed that Puerto Ricans "want everything done for them…."
[5] During his brief visit to Puerto Rico on October 3, 2017, Donald Trump was filmed throwing paper towels, along with other supplies, at a chosen group of Puerto Ricans. Some of these supplies he absurdly declared as no longer necessary (e.g., flashlights).
[6] This comment makes direct reference to the content presented by panelists prior to my speaking, especially the introductory remarks by Dr. María Teresa Dávila, the powerful reflection by Yara González-Justiniano on the instances of desperation and suicides in Puerto Rico since the hurricane, and the historical background of colonial logics in Puerto Rico, offered by Dr. Jean-Pierre Ruiz and Dr. Loida Martell.
[7] Nelson Maldonado-Torres, "On the Coloniality of Being," in Cultural Studies 21:2–3 (2007): 254.
[8] Maldonado-Torres (2007): 254.
[9] In fact, Maldonado-Torres notes that the colonial difference normalizes the extraordinary violence against persons that is typically experienced in war. See especially his Against War: Views from the Underside of Modernity (Durham, NC: Duke University Press, 2008).
[10] Maldonado-Torres (2008), 133.
[12] See Maldonado-Torres (2008), 123–32.
[13] While #LastWords trends with the last words of Black persons, the hashtag has also been used by a variety of other entities since it initially began trending. For a snapshot of the #LastWords that I reference here, see https://mic.com/articles/123973/15-drawings-capture-the-last-words-spoken-by-black-victims-of-state-violence#.XeUuHhdgD.
[14] I note that among the #LastWords, the last words of Black women killed at the hands of police officers are significantly underrepresented. This speaks to a broader problem of the invisibility of violence against women of color.
[15] Amanda Holpuch and Lauren Gambino. " 'Close to Genocide': San Juan Mayor's Dire Appeal to US for Puerto Rico Relief," in The Guardian (September 29, 2017) https://www.theguardian.com/world/2017/sep/29/san-juan-mayor-criticizes-us-officials-for-calling-puerto-rico-relief-effort-good-news.
[16] I am grateful and indebted to my colleague, Dr. Teresa Delgado, for this insight. In a conversation on November 17, 2017, just a few days prior to the "Histories and Vulnerabilities in the Eye of the Storm," panel, Teresa and I, who were both responsible for imagining a decolonial future for Puerto Rico, were discussing just how we might be able to accomplish such a monumental task. I explained that my initial impulse was to turn to norms of solidarity and love in a decolonial vein, that I also felt it necessary to speak of hope, but I was struggling deeply to make this turn. We discussed that our own sense of feeling incapacitated is related to the fact that our thought categories are not sufficient and must be dismantled. This conversation moved me towards embracing the overarching claim that our theo-ethical categories themselves must be destroyed and only then can they be rebuilt and shaped by decolonial feminist commitments.
[17] A hermeneutics of el grito builds upon the call to incorporate a hermeneutics of lament.
[18] María Pilar Aquino and Maricel Mena-López, "Feminist Intercultural Theology: Religion, Culture, Feminism, and Power," in María Pilar Aquino and Maria Rosado-Nunes, eds., Feminist Intercultural Theology: Latina Explorations for a Just World (Maryknoll, NY: Orbis Books, 2007), xxii.
[19] After my presentation of this piece, Dr. Loida Martell brought to my attention that the work of obliterating our current theological categories only to rebuild them mirrors the conditions of Puerto Rico post-María.
[20] Otto Maduro, "Once Again Liberating Theology? Towards a Latin American Liberation Theological Self-Criticism" in Marcella Althaus-Reid, ed., Liberating Theology and Sexuality, 2nd Edition, (London & New York: Routledge, 2009). On "epistemological humility," see Maduro, "An(other) Invitation to Epistemological Humility: Notes Toward a Self-Critical Approach to Counter Knowledges," in Ada María Isasi-Díaz and Eduardo Mendieta, eds., Decolonizing Epistemologies: Latina/o Theology and Philosophy (New York: Fordham University Press, 2012).


Save AED 0 (0%) Earn 28 Shukrans What is Shukran? Shukran is the Landmark Group's award-winning loyalty programme in the Middle East, which allows you to earn Shukrans when you shop any of our brands.
Designed to lend a fun appeal to your kid's room, this attractive nightstand not only adds style, but also brings purpose to the room. It has a single drawer for storage and the frame has a scratch, stain, and water resistant finish.


text:
/******************************************************************************
 * How to build:
 *
 * VC++
 *      cl.exe mergebased_spmv.cpp /fp:strict /MT /O2 /openmp
 *
 * GCC (OMP is terrible)
 *      g++ mergebased_spmv.cpp -lm -ffloat-store -O3 -fopenmp
 *
 * Intel
 *      icpc mergebased_spmv.cpp -openmp -O3 -lrt -fno-alias -xHost -lnuma
 *      export KMP_AFFINITY=granularity=core,scatter
 *
 *
 ******************************************************************************/

//---------------------------------------------------------------------
// SpMV comparison tool
//---------------------------------------------------------------------

#include <omp.h>

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <fstream>
#include <sstream>
#include <iostream>
#include <limits>

#include <mkl.h>

#include "sparse_matrix.h"
#include "utils.h"

//---------------------------------------------------------------------
// Globals, constants, and type declarations
//---------------------------------------------------------------------

bool                    g_quiet             = false;        // Whether to display stats in CSV format
bool                    g_verbose           = false;        // Whether to display output to console
bool                    g_verbose2          = false;        // Whether to display input to console
int                     g_omp_threads       = -1;           // Number of openMP threads
int                     g_expected_calls    = 1000000;

//---------------------------------------------------------------------
// Utility types
//---------------------------------------------------------------------

struct int2
{
    int x;
    int y;
};

/**
 * Counting iterator
 */
template <
    typename ValueType,
    typename OffsetT = ptrdiff_t>
struct CountingInputIterator
{
    // Required iterator traits
    typedef CountingInputIterator               self_type;              ///< My own type
    typedef OffsetT                             difference_type;        ///< Type to express the result of subtracting one iterator from another
    typedef ValueType                           value_type;             ///< The type of the element the iterator can point to
    typedef ValueType*                          pointer;                ///< The type of a pointer to an element the iterator can point to
    typedef ValueType                           reference;              ///< The type of a reference to an element the iterator can point to
    typedef std::random_access_iterator_tag     iterator_category;      ///< The iterator category

    ValueType val;

    /// Constructor
    inline CountingInputIterator(
        const ValueType &val)          ///< Starting value for the iterator instance to report
    :
        val(val)
    {}

    /// Postfix increment
    inline self_type operator++(int)
    {
        self_type retval = *this;
        val++;
        return retval;
    }

    /// Prefix increment
    inline self_type operator++()
    {
        val++;
        return *this;
    }

    /// Indirection
    inline reference operator*() const
    {
        return val;
    }

    /// Addition
    template <typename Distance>
    inline self_type operator+(Distance n) const
    {
        self_type retval(val + n);
        return retval;
    }

    /// Addition assignment
    template <typename Distance>
    inline self_type& operator+=(Distance n)
    {
        val += n;
        return *this;
    }

    /// Subtraction
    template <typename Distance>
    inline self_type operator-(Distance n) const
    {
        self_type retval(val - n);
        return retval;
    }

    /// Subtraction assignment
    template <typename Distance>
    inline self_type& operator-=(Distance n)
    {
        val -= n;
        return *this;
    }

    /// Distance
    inline difference_type operator-(self_type other) const
    {
        return val - other.val;
    }

    /// Array subscript
    template <typename Distance>
    inline reference operator[](Distance n) const
    {
        return val + n;
    }

    /// Structure dereference
    inline pointer operator->()
    {
        return &val;
    }

    /// Equal to
    inline bool operator==(const self_type& rhs)
    {
        return (val == rhs.val);
    }

    /// Not equal to
    inline bool operator!=(const self_type& rhs)
    {
        return (val != rhs.val);
    }

    /// ostream operator
    friend std::ostream& operator<<(std::ostream& os, const self_type& itr)
    {
        os << "[" << itr.val << "]";
        return os;
    }
};

//---------------------------------------------------------------------
// MergePath Search
//---------------------------------------------------------------------

/**
 * Computes the begin offsets into A and B for the specific diagonal
 */
template <
    typename AIteratorT,
    typename BIteratorT,
    typename OffsetT,
    typename CoordinateT>
inline void MergePathSearch(
    OffsetT         diagonal,           ///< [in]The diagonal to search
    AIteratorT      a,                  ///< [in]List A
    BIteratorT      b,                  ///< [in]List B
    OffsetT         a_len,              ///< [in]Length of A
    OffsetT         b_len,              ///< [in]Length of B
    CoordinateT&    path_coordinate)    ///< [out] (x,y) coordinate where diagonal intersects the merge path
{
    OffsetT x_min = std::max(diagonal - b_len, 0);
    OffsetT x_max = std::min(diagonal, a_len);

    while (x_min < x_max)
    {
        OffsetT x_pivot = (x_min + x_max) >> 1;
        if (a[x_pivot] <= b[diagonal - x_pivot - 1])
            x_min = x_pivot + 1;    // Contract range up A (down B)
        else
            x_max = x_pivot;        // Contract range down A (up B)
    }

    path_coordinate.x = std::min(x_min, a_len);
    path_coordinate.y = diagonal - x_min;
}

//---------------------------------------------------------------------
// SpMV verification
//---------------------------------------------------------------------

// Compute reference SpMV y = Ax
template <
    typename ValueT,
    typename OffsetT>
void SpmvGold(
    CsrMatrix<ValueT, OffsetT>&     a,
    ValueT*                         vector_x,
    ValueT*                         vector_y_in,
    ValueT*                         vector_y_out,
    ValueT                          alpha,
    ValueT                          beta)
{
    for (OffsetT row = 0; row < a.num_rows; ++row)
    {
        ValueT partial = beta * vector_y_in[row];
        for (
            OffsetT offset = a.row_offsets[row];
            offset < a.row_offsets[row + 1];
            ++offset)
        {
            partial += alpha * a.values[offset] * vector_x[a.column_indices[offset]];
        }
        vector_y_out[row] = partial;
    }
}

//---------------------------------------------------------------------
// CPU merge-based SpMV
//---------------------------------------------------------------------

/**
 * OpenMP CPU merge-based SpMV
 */
template <
    typename ValueT,
    typename OffsetT>
void OmpMergeCsrmv(
    int                             num_threads,
    CsrMatrix<ValueT, OffsetT>&     a,
    OffsetT*    __restrict        row_end_offsets,    ///< Merge list A (row end-offsets)
    OffsetT*    __restrict        column_indices,
    ValueT*     __restrict        values,
    ValueT*     __restrict        vector_x,
    ValueT*     __restrict        vector_y_out)
{
    // Temporary storage for inter-thread fix-up after load-balanced work
    OffsetT     row_carry_out[256];     // The last row-id each worked on by each thread when it finished its path segment
    ValueT      value_carry_out[256];   // The running total within each thread when it finished its path segment

    #pragma omp parallel for schedule(static) num_threads(num_threads)
    for (int tid = 0; tid < num_threads; tid++)
    {
        // Merge list B (NZ indices)
        CountingInputIterator<OffsetT>  nonzero_indices(0);

        OffsetT num_merge_items     = a.num_rows + a.num_nonzeros;                          // Merge path total length
        OffsetT items_per_thread    = (num_merge_items + num_threads - 1) / num_threads;    // Merge items per thread

        // Find starting and ending MergePath coordinates (row-idx, nonzero-idx) for each thread
        int2    thread_coord;
        int2    thread_coord_end;
        int     start_diagonal      = std::min(items_per_thread * tid, num_merge_items);
        int     end_diagonal        = std::min(start_diagonal + items_per_thread, num_merge_items);

        MergePathSearch(start_diagonal, row_end_offsets, nonzero_indices, a.num_rows, a.num_nonzeros, thread_coord);
        MergePathSearch(end_diagonal, row_end_offsets, nonzero_indices, a.num_rows, a.num_nonzeros, thread_coord_end);

        // Consume whole rows
        for (; thread_coord.x < thread_coord_end.x; ++thread_coord.x)
        {
            ValueT running_total = 0.0;
            for (; thread_coord.y < row_end_offsets[thread_coord.x]; ++thread_coord.y)
            {
                running_total += values[thread_coord.y] * vector_x[column_indices[thread_coord.y]];
            }

            vector_y_out[thread_coord.x] = running_total;
        }

        // Consume partial portion of thread's last row
        ValueT running_total = 0.0;
        for (; thread_coord.y < thread_coord_end.y; ++thread_coord.y)
        {
            running_total += values[thread_coord.y] * vector_x[column_indices[thread_coord.y]];
        }

        // Save carry-outs
        row_carry_out[tid] = thread_coord_end.x;
        value_carry_out[tid] = running_total;
    }

    // Carry-out fix-up (rows spanning multiple threads)
    for (int tid = 0; tid < num_threads - 1; ++tid)
    {
        if (row_carry_out[tid] < a.num_rows)
            vector_y_out[row_carry_out[tid]] += value_carry_out[tid];
    }
}

/**
 * Run OmpMergeCsrmv
 */
template <
    typename ValueT,
    typename OffsetT>
float TestOmpMergeCsrmv(
    CsrMatrix<ValueT, OffsetT>&     a,
    ValueT*                         vector_x,
    ValueT*                         reference_vector_y_out,
    ValueT*                         vector_y_out,
    int                             timing_iterations,
    float                           &setup_ms)
{
    setup_ms = 0.0;

    if (g_omp_threads == -1)
        g_omp_threads = omp_get_num_procs();
    int num_threads = g_omp_threads;

    if (!g_quiet)
        printf("\tUsing %d threads on %d procs\n", g_omp_threads, omp_get_num_procs());

    // Warmup/correctness
    memset(vector_y_out, -1, sizeof(ValueT) * a.num_rows);
    OmpMergeCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    if (!g_quiet)
    {
        // Check answer
        int compare = CompareResults(reference_vector_y_out, vector_y_out, a.num_rows, true);
        printf("\t%s\n", compare ? "FAIL" : "PASS"); fflush(stdout);
    }

    // Re-populate caches, etc.
    OmpMergeCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    OmpMergeCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    OmpMergeCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);

    // Timing
    float elapsed_ms = 0.0;
    CpuTimer timer;
    timer.Start();
    for(int it = 0; it < timing_iterations; ++it)
    {
        OmpMergeCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    }
    timer.Stop();
    elapsed_ms += timer.ElapsedMillis();

    return elapsed_ms / timing_iterations;
}

//---------------------------------------------------------------------
// MKL SpMV
//---------------------------------------------------------------------

/**
 * MKL CPU SpMV (specialized for fp32)
 */
template <typename OffsetT>
void MklCsrmv(
    int                           num_threads,
    CsrMatrix<float, OffsetT>&    a,
    OffsetT*    __restrict        row_end_offsets,    ///< Merge list A (row end-offsets)
    OffsetT*    __restrict        column_indices,
    float*      __restrict        values,
    float*      __restrict        vector_x,
    float*      __restrict        vector_y_out)
{
    mkl_cspblas_scsrgemv("n", &a.num_rows, a.values, a.row_offsets, a.column_indices, vector_x, vector_y_out);
}

/**
 * MKL CPU SpMV (specialized for fp64)
 */
template <typename OffsetT>
void MklCsrmv(
    int                           num_threads,
    CsrMatrix<double, OffsetT>&   a,
    OffsetT*    __restrict        row_end_offsets,    ///< Merge list A (row end-offsets)
    OffsetT*    __restrict        column_indices,
    double*     __restrict        values,
    double*     __restrict        vector_x,
    double*     __restrict        vector_y_out)
{
    mkl_cspblas_dcsrgemv("n", &a.num_rows, a.values, a.row_offsets, a.column_indices, vector_x, vector_y_out);
}

/**
 * Run MKL CsrMV
 */
template <
    typename ValueT,
    typename OffsetT>
float TestMklCsrmv(
    CsrMatrix<ValueT, OffsetT>&     a,
    ValueT*                         vector_x,
    ValueT*                         reference_vector_y_out,
    ValueT*                         vector_y_out,
    int                             timing_iterations,
    float                           &setup_ms)
{
    setup_ms = 0.0;

    // Warmup/correctness
    memset(vector_y_out, -1, sizeof(ValueT) * a.num_rows);
    MklCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    if (!g_quiet)
    {
        // Check answer
        int compare = CompareResults(reference_vector_y_out, vector_y_out, a.num_rows, true);
        printf("\t%s\n", compare ? "FAIL" : "PASS"); fflush(stdout);

//        memset(vector_y_out, -1, sizeof(ValueT) * a.num_rows);
    }

    // Re-populate caches, etc.
    MklCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    MklCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    MklCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);

    // Timing
    float elapsed_ms = 0.0;
    CpuTimer timer;
    timer.Start();
    for(int it = 0; it < timing_iterations; ++it)
    {
        MklCsrmv(g_omp_threads, a, a.row_offsets + 1, a.column_indices, a.values, vector_x, vector_y_out);
    }
    timer.Stop();
    elapsed_ms += timer.ElapsedMillis();

    return elapsed_ms / timing_iterations;
}

//---------------------------------------------------------------------
// Test generation
//---------------------------------------------------------------------

/**
 * Display perf
 */
template <typename ValueT, typename OffsetT>
void DisplayPerf(
    double                          setup_ms,
    double                          avg_ms,
    CsrMatrix<ValueT, OffsetT>&     csr_matrix)
{
    double nz_throughput, effective_bandwidth;
    size_t total_bytes = (csr_matrix.num_nonzeros * (sizeof(ValueT) * 2 + sizeof(OffsetT))) +
        (csr_matrix.num_rows) * (sizeof(OffsetT) + sizeof(ValueT));

    nz_throughput       = double(csr_matrix.num_nonzeros) / avg_ms / 1.0e6;
    effective_bandwidth = double(total_bytes) / avg_ms / 1.0e6;

    if (!g_quiet)
        printf("fp%d: %.4f setup ms, %.4f avg ms, %.5f gflops, %.3lf effective GB/s\n",
            int(sizeof(ValueT) * 8),
            setup_ms,
            avg_ms,
            2 * nz_throughput,
            effective_bandwidth);
    else
        printf("%.5f, %.5f, %.6f, %.3lf, ",
            setup_ms, avg_ms,
            2 * nz_throughput,
            effective_bandwidth);

    fflush(stdout);
}

/**
 * Run tests
 */
template <
    typename ValueT,
    typename OffsetT>
void RunTests(
    ValueT              alpha,
    ValueT              beta,
    const std::string&  mtx_filename,
    int                 grid2d,
    int                 grid3d,
    int                 wheel,
    int                 dense,
    int                 timing_iterations,
    CommandLineArgs&    args)
{
    // Initialize matrix in COO form
    CooMatrix<ValueT, OffsetT> coo_matrix;

    if (!mtx_filename.empty())
    {
        // Parse matrix market file
        coo_matrix.InitMarket(mtx_filename, 1.0, !g_quiet);

        if ((coo_matrix.num_rows == 1) || (coo_matrix.num_cols == 1) || (coo_matrix.num_nonzeros == 1))
        {
            if (!g_quiet) printf("Trivial dataset\n");
            exit(0);
        }
        printf("%s, ", mtx_filename.c_str()); fflush(stdout);
    }
    else if (grid2d > 0)
    {
        // Generate 2D lattice
        printf("grid2d_%d, ", grid2d); fflush(stdout);
        coo_matrix.InitGrid2d(grid2d, false);
    }
    else if (grid3d > 0)
    {
        // Generate 3D lattice
        printf("grid3d_%d, ", grid3d); fflush(stdout);
        coo_matrix.InitGrid3d(grid3d, false);
    }
    else if (wheel > 0)
    {
        // Generate wheel graph
        printf("wheel_%d, ", grid2d); fflush(stdout);
        coo_matrix.InitWheel(wheel);
    }
    else if (dense > 0)
    {
        // Generate dense graph
        OffsetT rows = (1<<24) / dense;               // 16M nnz
        printf("dense_%d_x_%d, ", rows, dense); fflush(stdout);
        coo_matrix.InitDense(rows, dense);
    }
    else
    {
        fprintf(stderr, "No graph type specified.\n");
        exit(1);
    }

    CsrMatrix<ValueT, OffsetT> csr_matrix(coo_matrix);
    coo_matrix.Clear();

    // Display matrix info
    csr_matrix.Stats().Display(!g_quiet);
    if (!g_quiet)
    {
        printf("\n");
        csr_matrix.DisplayHistogram();
        printf("\n");
        if (g_verbose2)
            csr_matrix.Display();
        printf("\n");
    }
    fflush(stdout);

    // Determine # of timing iterations (aim to run 16 billion nonzeros through, total)
    if (timing_iterations == -1)
    {
        timing_iterations = std::min(200000ull, std::max(100ull, ((16ull << 30) / csr_matrix.num_nonzeros)));
        if (!g_quiet)
            printf("\t%d timing iterations\n", timing_iterations);
    }

    // Allocate input and output vectors (if available, use NUMA allocation to force storage on the
    // sockets for performance consistency)
    ValueT *vector_x, *vector_y_in, *reference_vector_y_out, *vector_y_out;
    if (csr_matrix.IsNumaMalloc())
    {
        vector_x                = (ValueT*) numa_alloc_onnode(sizeof(ValueT) * csr_matrix.num_cols, 0);
        vector_y_in             = (ValueT*) numa_alloc_onnode(sizeof(ValueT) * csr_matrix.num_rows, 0);
        reference_vector_y_out  = (ValueT*) numa_alloc_onnode(sizeof(ValueT) * csr_matrix.num_rows, 0);
        vector_y_out            = (ValueT*) numa_alloc_onnode(sizeof(ValueT) * csr_matrix.num_rows, 0);
    }
    else
    {
        vector_x                = (ValueT*) mkl_malloc(sizeof(ValueT) * csr_matrix.num_cols, 4096);
        vector_y_in             = (ValueT*) mkl_malloc(sizeof(ValueT) * csr_matrix.num_rows, 4096);
        reference_vector_y_out  = (ValueT*) mkl_malloc(sizeof(ValueT) * csr_matrix.num_rows, 4096);
        vector_y_out            = (ValueT*) mkl_malloc(sizeof(ValueT) * csr_matrix.num_rows, 4096);
    }

    for (int col = 0; col < csr_matrix.num_cols; ++col)
        vector_x[col] = 1.0;

    for (int row = 0; row < csr_matrix.num_rows; ++row)
        vector_y_in[row] = 1.0;

    // Compute reference answer
    SpmvGold(csr_matrix, vector_x, vector_y_in, reference_vector_y_out, alpha, beta);

    float avg_ms, setup_ms;

    // MKL SpMV
    if (!g_quiet) printf("\n\n");
    printf("MKL CsrMV, "); fflush(stdout);
    avg_ms = TestMklCsrmv(csr_matrix, vector_x, reference_vector_y_out, vector_y_out, timing_iterations, setup_ms);
    DisplayPerf(setup_ms, avg_ms, csr_matrix);

    // Merge SpMV
    if (!g_quiet) printf("\n\n");
    printf("Merge CsrMV, "); fflush(stdout);
    avg_ms = TestOmpMergeCsrmv(csr_matrix, vector_x, reference_vector_y_out, vector_y_out, timing_iterations, setup_ms);
    DisplayPerf(setup_ms, avg_ms, csr_matrix);

    // Cleanup
    if (csr_matrix.IsNumaMalloc())
    {
        if (vector_x)                   numa_free(vector_x, sizeof(ValueT) * csr_matrix.num_cols);
        if (vector_y_in)                numa_free(vector_y_in, sizeof(ValueT) * csr_matrix.num_rows);
        if (reference_vector_y_out)     numa_free(reference_vector_y_out, sizeof(ValueT) * csr_matrix.num_rows);
        if (vector_y_out)               numa_free(vector_y_out, sizeof(ValueT) * csr_matrix.num_rows);
    }
    else
    {
        if (vector_x)                   mkl_free(vector_x);
        if (vector_y_in)                mkl_free(vector_y_in);
        if (reference_vector_y_out)     mkl_free(reference_vector_y_out);
        if (vector_y_out)               mkl_free(vector_y_out);
    }

}

/**
 * Main
 */
int main(int argc, char **argv)
{
    // Initialize command line
    CommandLineArgs args(argc, argv);
    if (args.CheckCmdLineFlag("help"))
    {
        printf(
            "%s "
            "[--quiet] "
            "[--v] "
            "[--threads=<OMP threads>] "
            "[--i=<timing iterations>] "
            "[--fp64 (default) | --fp32] "
            "[--alpha=<alpha scalar (default: 1.0)>] "
            "[--beta=<beta scalar (default: 0.0)>] "
            "\n\t"
                "--mtx=<matrix market file> "
            "\n\t"
                "--dense=<cols>"
            "\n\t"
                "--grid2d=<width>"
            "\n\t"
                "--grid3d=<width>"
            "\n\t"
                "--wheel=<spokes>"
            "\n", argv[0]);
        exit(0);
    }

    bool                fp32;
    std::string         mtx_filename;
    int                 grid2d              = -1;
    int                 grid3d              = -1;
    int                 wheel               = -1;
    int                 dense               = -1;
    int                 timing_iterations   = -1;
    float               alpha               = 1.0;
    float               beta                = 0.0;

    g_verbose = args.CheckCmdLineFlag("v");
    g_verbose2 = args.CheckCmdLineFlag("v2");
    g_quiet = args.CheckCmdLineFlag("quiet");
    fp32 = args.CheckCmdLineFlag("fp32");
    args.GetCmdLineArgument("i", timing_iterations);
    args.GetCmdLineArgument("mtx", mtx_filename);
    args.GetCmdLineArgument("grid2d", grid2d);
    args.GetCmdLineArgument("grid3d", grid3d);
    args.GetCmdLineArgument("dense", dense);
    args.GetCmdLineArgument("alpha", alpha);
    args.GetCmdLineArgument("beta", beta);
    args.GetCmdLineArgument("threads", g_omp_threads);

    // Run test(s)
    if (fp32)
    {
        RunTests<float, int>(alpha, beta, mtx_filename, grid2d, grid3d, wheel, dense, timing_iterations, args);
    }
    else
    {
        RunTests<double, int>(alpha, beta, mtx_filename, grid2d, grid3d, wheel, dense, timing_iterations, args);
    }

    printf("\n");

    return 0;
}