text:
TAIKOO PLACE/ WHAT'S ON/ THE MAG
ART & STYLE
Why you should add a little drama to your life
There is something magical about going to the theatre. Even though we are living in the golden era of television, cinema and Netflix, there's still nothing like the raw energy of a live performance. So why should you add a little drama to your life?
Firstly, unlike seeing a film on the big screen, no two performances are exactly the same with theatre. This is mainly due to the live interaction that manifests during each show. As the audience reacts to the actor's performance – by laughing or applauding, for example – the actor will also respond to this interaction, creating an engaging experience for both sides. Brian Zeilinger, curator of the ArtisTree Selects: Theatre Bites festival and Tony Award-winning, West End and Broadway producer, can attest to this: "The audience member is able to develop a personal connection to the artist on stage without the barrier of a screen," he says. "There is a way of making a story seem more 'real' when you're a part of it."
Brian Zeilinger, photography by Nathan Johnson
It you're ever feeling stuck in a rut, an interesting play can open up your mind to new ideas, too. "People come [to the theatre] to be transported," Zeilinger says. "They can escape their daily life and be inspired by the stories of others." As you immerse yourself in a good theatre production, one with a strong plot, relatable characters and a unique perspective to tell the story, you'll find yourself forgetting about any nagging problems, or your mundane everyday routine for a moment, and emerge feeling refreshed and re-energised, ready to tackle new challenges…
…which brings us to the next benefit of theatre: sparking creativity. "Theatre productions can provoke you to think differently," he continues. Whether it's a big production with elaborate costumes, set and props, or one that focuses solely on the actor, it requires you to use your imagination, and that helps reboot your creative mind. A great theatre piece also makes it easy for you to step into the shoes of the characters, inspiring you to consider an issue from a new perspective.
Bradley Cooper & Alessandro Nivola & Patricia Clarkson, The Elephant Man (Broadway & West End), photogtaphy by Annie Leibowitz
Scarlett Johansson, Cat on a Hot Tin Roof (Broadway)
Tom Hanks, Lucky Guy (Broadway)
More than just entertainment, a play can leave you thinking long after the curtain falls. By highlighting human conflicts or issues in the plots, many plays inspire us to reflect on our personal relationships and the social issues around us. Take Zeilinger's latest production, Sitting, to be staged at ArtisTree this month, which aims to speak to interpersonal connections and individual responsibilities as people. "I hope it will provoke thought and discussion," Zeilinger says, in anticipation of the performance. "We as people thrive on and grow from the sharing of thoughts and ideas, and I think that's one of the reasons why people keep coming back to the theatre – to be challenged intellectually."
Want to spice up your day at Taikoo Place? See a bite-sized play at ArtisTree Selects: Theatre Bites at lunch or after work from 10 to 22 June!
Véronique Lo
ART & STYLE, ARTISTREE
What to know before you go – ArtisTree Selects: Theatre Bites
Find Your Way Through Art
Behind the Scenes with Ivana Wong and Shin Wong – ArtisTree Selects: The Missing Something - The Singing Canvases
ArtisTree 2021 in Review: 5 Moments to Look Back On
Take Your Time: The Art of Slow Looking


Save on the In Your Wildest Dreams Painted Wall Fountain with Earth Inspired Products and enjoy free shipping and no sales tax on all hanging water walls.
The In Your Wildest Dreams Painted Wall Fountain, manufactured by Henry Harvey is a magnificently vibrant mounted waterfall. Hand painted onto the inside of a clear, Lexan panel the actual painting never contacts the waterfall, keeping it protected and operational for several years. Enjoy the living colors and soothing sounds as this hanging water feature dances to life inspiring a calm energy anywhere it is hung. Custom build the hanging waterfall by having it built to any specific dimensions you need.


*THIS WEEKEND* Free pictures with Santa Saturday from 12 to 4 photos by Capture the Moment photography!
Save the Date! Please call One Sweet Ride at 609-208-0544 to reserve your spot to decorate Homemade Gingerbread House with Terry Miguel Veiga.


This Coke gift box holds 6 mini bottles of Kraken Black Spiced Rum (50ml) tied to 6 bottles of refreshing Coca-Cola. All is placed inside the actual 6 pack Coca-Cola Box. Arrives wrapped in cello and topped with a themed Coca-Cola Bow.
Perfect for Birthday Parties, Bachelor Parties, Bachelorette Parties or for anyone who loves Jack and Coke!


text:
Employee-shareholdersEconomics, government & business
Budget 2016: NI payable on termination payments, tax threshold rises
by Jo Faragher 16 Mar 2016
by Jo Faragher 16 Mar 2016 REX/Shutterstock
Chancellor George Osborne revealed few surprises in today's Budget - on the one hand bullish about jobs growth and on the other cautiously revising down the UK's growth prospects for this year. The key announcements for employers were the introduction of compulsory national insurance contributions (NICs) on termination payments over £30,000, and an increase in the threshold for personal tax contributions.
XpertHR pay award forecasts and analysis
Pay trends March 2016: analysis of current level of pay awards Pay forecasts for the private sector Gender pay gap reporting survey: employer plans Latest pay settlements: March 2017
Osborne announced that 150,000 more jobs have been created during this Parliament than the Office for Budget Responsibility (OBR) predicted, with 90% of those in skilled jobs, and three-quarters full time. In addition, the OBR predicted another 1 million jobs will be created this Parliament, Osborne said. Figures from the Office for National Statistics released today revealed that employment, at a rate of 74.1%, was at its joint-highest level since records began in 1971. The Chancellor claimed this was "a budget for working people" and announced that from April 2017, the tax threshold will rise to £11,500 - on target to reach the £12,500 threshold promised in the Conservative manifesto before the party came to power. The threshold for employees paying the 40% tax rate will also be increased, to �
Jo Faragher
Jo Faragher has been an employment and business journalist for 20 years. She regularly contributes to Personnel Today and writes features for a number of national business and membership magazines.
Are Tier 2 migrants no longer welcome in Britain?
Six interesting facts about employment law in Ireland
HR processes delay Sue Gray Downing Street lockdown...
Ministers look to propel people on Universal Credit...
What's driving the upward pressure on pay?
Starting pay rockets but fall in staff supply...
Myth of rapid labour market change exposed by...
Employer confidence in UK economy falls amid Omicron...
Response to Sunak measures: New Covid funding 'just...
Treasury could afford more business support, says economics...
Pressure grows on ministers to support businesses as...

redpajama_set_name: RedPajamaCommonCrawl


text:
Socialist Plymouth 400 Years Later
Precisely 400 years ago, on December 16, 1620 (according to the Gregorian calendar, December 26), the ship Mayflower anchored in Plymouth Bay in the New World, and on December 18 (28), daredevils landed on a deserted, cold coast, which is now in the state of Massachusetts. The Plymouth Rock now symbolizes the approximate landing site. The city of the same name still exists, as, in fact, does the country founded by the Puritans: the United States of America.
One hundred and two people set off by ship from Plymouth in the Old World, but on the way, one man died and one boy was born. One of the team members also died. Among the travelers were the Puritans, religious dissidents, adventurers, and merchants. All the passengers of the Mayflower were daring and brave people. They can be safely referred to as the pioneers – but not only in the geographical sense.
They were the first to establish socialism in North America.
The word "socialism" had not yet been invented, but we know all the details of the Puritans' socialist epic from the diaries of William Bradford, one of the Plymouth colony leaders for a third of a century. By the time the pilgrims landed, Thomas More's Utopia had already gone through dozens of editions (the English translation of Utopia was published in 1551), and ersatz-socialist ideas were widespread in Europe. As it is known, Utopia's hypothetical state was based on the primitive idea of the monastic community. While still in exile in Holland before sailing to the New World, the Puritans had already begun introducing commune elements. They arrived in the New World with a clear plan for a collective community.
The Spaniards, who established colonies In the New World long before the British, also made several attempts to extend communal monastic rules to their territories in South and Central America. The Spaniards viewed the discovery of America as Divine Providence, and it was America that was to become the place for the creation of the ideal, utopian-like state-community. All such communities they established have sunk into oblivion, but the idea itself persists. That may perhaps explain why South America still has a disproportionate number of leftist regimes.
The Puritans had signed an agreement on what the community would be like before landing. The Plymouth colony's beginning was traditionally socialist – anyone who refused to sign the document was prohibited from landing. There is nothing extraordinary in this one-page document by modern standards, but it was the first document establishing democratic self-government in the New World. The Puritans agreed that the power in the community should belong to the Law. However, the problem was which laws were adopted in this utterly democratic way.
Understanding why the colonists chose the socialist way of organizing the commune is pretty straightforward; it should be noted that after Thomas More, the ideas of the commune spread so widely in Europe that many of his followers and many other utopian models were born. For example, in 1619, even before the Puritans' landing, Johann André's Reipublicae Christianopolitanae (known as Protestant Utopia) was published, and in 1623 – The City of the Sun by Tommaso Campanella.
These utopias bore all the features that were fully manifested when the wave of socialist upheavals swept the planet in the 20th century – total control, brutal social engineering, political power that belongs to the intellectual elite, and forceful egalitarianism (which, of course, did not extend to the elite).
Like the Spaniards, the Puritans viewed America as the second Promised Land. From a religious point of view – from the Anglican and Catholic churches' perspective – they were dissidents. Still, their initial beliefs on society's economic structure did not go beyond the commune with its primitive collectivism.
In the Plymouth Colony, collective ownership of everything except women was established, and the concept of private property did not exist at all. The harvest and prey of the hunters were distributed equally among the colonists. Women were required to cook for all men and wash all their clothes, and men had to work to provide for other people's wives and children.
For the next two years, each colonist worked for everyone else and not for himself. Labor productivity was disastrously low, and the result was not long in coming – by the summer of 1621, about half of the colonists had died of hunger and disease.
It should be noted that this experience is not unusual in human history; it has been endlessly and unsuccessfully repeated, and with the same devastating results – for example, collective farms in Russia and the first kibbutzim in Israel. The statistics here are unambiguous – all egalitarian communes have collapsed sooner or later. Nevertheless, the Plymouth collective farm differs from all the others in that the Puritans realized and corrected their mistake rather quickly, in a few years, unlike other social experiments that lasted for decades.
In the spring of 1623, after two and a half years of hunger, poverty, and despair, the colonists' wives rebelled. They did not want to cook food for the husbands of other women anymore. They regarded the forced service of other men as de facto slavery. As a result, after a lengthy debate, the colonists made a decision that laid the foundation for modern American society – each family received its piece of land. Furthermore, only 70 years after these events, John Locke intellectually substantiated the right to private property.
As soon as the colonists abandoned collectivism and allowed private property, prosperity came. The first harvest in 1623 was a celebration of abundance. The colony became so thriving that it even welcomed a new wave of emigrants. Contrary to the myth, it was not the Indians who fed the colonists in 1623, but the colonists saved the Indians from starvation. Thanksgiving, which America now celebrates every year, is, in fact, the 1623 harvest festival of the Plymouth Colony based on private property.
As a religious people, the Puritans believed Divine Providence showed them the right way out of a difficult situation. Therefore, Thanksgiving Day is not as much gratitude for a bountiful harvest as gratitude for the pointing out from Heaven the correct economic solution to the problem.
If the Plymouth Colony's rejection of socialism was almost instantaneous on a historical scale, then the reverse transformation – from capitalism to socialism – has been brewing in America for precisely 400 years. If Donald Trump loses his quest for the second term, then the transition to a socialist America seems inevitable.
The commune planned for America is by no means as primitive as the Plymouth Plantation. The commune in America is intended as an American version of Maoism, which allows for the temporary coexistence of private, collective, and government enterprises. However, all of them will have to be under the control of the "intellectual elite" – the Communist Party in China — that operates in America under a completely different name.
In America, of course, there are communists, but they prefer Marxist-Leninist, not Maoist, positions. Therefore, the road to power in openly pro-Chinese Washington is closed to them, but for the so-called "Democrats" (like Joe Biden), doors are wide open. The second serious attempt in the past 400 years to introduce the religion of collectivism in America is the exclusively the work of "Democrats.".
Has Donald Trump stopped America's slide into oblivion, or has he barely slowed it down? The answer to this question depends on who will reside in the White House for the next four years. The phrase many attributed to Churchill best describes the current moment: "You can always count on Americans to do the right thing – after they have tried everything else."
[Originally published at American Thinker]
Author Gary GPosted on December 16, 2020 December 16, 2020 Tags Socialism Capitalism
3 thoughts on "Socialist Plymouth 400 Years Later"
Kenneth Robbins says:
Truth, is never a trivial matter. As scripture points out Cretans are always liars.
K.L.Robbins says:
The people that came into what is now the the New England states did not found America! Socialism was tried in Jamestown in 1607 for a couple of years it did not work. Thanksgiving was celebrated in Jamestown well before it was done in Plymouth.
William Slaughter says:
I think therefore I am. If we pick on the minutia and lead others away from the main point, what have we gained?
Previous Previous post: Социалистический Плимут 400 лет спустя
Next Next post: Political Desperation and Conservatives' Dunkirk Moment


text:
At least 30 killed in match factory fire in Indonesia
(WDBJ)
Published: Jun. 21, 2019 at 4:39 AM EDT
An Indonesia disaster official says at least 30 people were killed in a fire that swept through a house that doubled as a match factory in North Sumatra province.
Irwan Syahri, from the local disaster mitigation agency in Langkap district, said Friday the dead included three children. He says many of the victims are burned beyond recognition.
Indonesian TV footage showed the burned-out structure, its floor littered with twisted metal, blackened corrugated iron roofing and other debris.
North Sumatra police spokesman M.P. Nainggolan says the cause of the fire is still unclear.


text:
Bennie J. Swans Jr. Scholarship Fund
Bennie Swans Scholarship Fund
Ten Reasons to Join the Chamber
Membership Information Request Form
Investor Referral Program
Diversity-Owned Business Resources
Entrepreneur Business Resources
Business Development Guide
Business Interruption Planning
Before a Business Interruption
After a Business Interruption
MBACC Investors Offering Planning/Recovery Resources
Post Emergency Business Survey
Hurricane Information Center
Shelter Locations
Reentry & Recovery
Steering Committee and Ambassadors
GSYP Sponsors
GSYP Member Discounts
Bill Pritchard Scholarship Fund
Leadership Trainer
Ann DeBock Leadership Award
LGS Staff
The Myrtle Beach Area Chamber of Commerce Educational Foundation, in conjunction with the chamber's Diversity, Equity and Inclusion Council, offers an annual scholarship to Leadership Grand Strand (LGS) to provide full-tuition for one person from an underrepresented or marginalized group.
The Bennie Swans Scholarship is funded by the chamber's educational foundation which is funded by local business contributions. The foundation will continue to award scholarships to local high school students in addition to the new Bennie Swans Scholarship.
The scholarship will cover the cost of the current LGS program tuition. The recipient must be accepted to the program and come from an underrepresented or marginalized group. The chamber's DEI Council will form a selection committee to choose the scholarship winner.
About Bennie J. Swans Jr.
The scholarship is named after Bennie J. Swans Jr., a longtime community and civil rights activist. Swans is best known as the driving force behind the formation of Freedom Week - the annual Martin Luther King Jr. celebrations in Myrtle Beach. He is former chair of the Horry County Democratic Party. Swans was a decorated United States Army veteran who fought during the Vietnam War. He passed in September 2020.
About MBACC Diversity Equity & Inclusion Council
The mission of the MBACC Diversity Equity & Inclusion Council is to promote growth and enhance community awareness about the value and advantages of creating and sustaining diverse and inclusive businesses and workplace environments. Diversity is defined as any respect in which people or groups may differ, including race, ethnicity, sex, gender identity and expression, sexual orientation, national origin, age, ability status and veteran status. Our goals are to encourage entrepreneurship, support the growth and development of businesses owned by individuals from underrepresented and marginalized groups, cultivate diversity leadership by providing resources and services for our diverse business community and help the community recognize the importance of all consumers.
PROMOTE YOUR BUSINESS IN A POWERFUL WAY!
Sponsorship provides our investors the opportunity for recognition and publicity. For some events, sponsorship will also include tickets to the event, the opportunity to speak to attendees or to distribute promotional items. Check out the Investment and Sponsorship Program and stretch your marketing budget.
MBACC Unveils New Logo
The Myrtle Beach Area Chamber of Commerce (MBACC) today unveiled a new logo that embraces a more modern and vibrant brand identity all while honoring the organization's 83-year commitment to representing the region's businesses.
Getting to Know 2022 Board Chair Alex Husner
Alex Husner was elected to serve as the 2022 Myrtle Beach Area Chamber of Commerce Board Chair. She took some time to answer our questions helping to get to know her better.


ing elected District Clerk in 1998,1 served ?
as Deputy Clerk and Chief Deputy.
ate your vote and your continued support.
Your vote will be greatly appreciated.
cent to the Medina County jail.
with a controlled bum," said Vidaurri.
which to spend the $350,000.
siding in the Ney Unit.
to 120 days, estimated Vidaurri.
ing out candy to children.
a free Christmas Concert teaturing 1 ?
ally will be in town Christmas Eve.
PPAby each individual candidate listed.
Yancey 7th Day Adventist Church.
It is located in Yancey on FM 462.
debris at the Castro Ave. location.
which passed by unanimous vote.
unteers could play in the cleanup.
state. But, so be it," the mayor said.
V Christmas Music is playing.
Mon. - Sat. 7 am - 2 pm & Fri. Nites 5-8 p.m.
You've got questions We've got answers."
businesses. See credit agreement for details.
Hondo Anvil Herald (Hondo, Tex.), Vol. 115, No. 51, Ed. 1 Thursday, December 20, 2001, newspaper, December 20, 2001; Hondo, Texas. (https://texashistory.unt.edu/ark:/67531/metapth819736/m1/3/: accessed April 20, 2019), University of North Texas Libraries, The Portal to Texas History, https://texashistory.unt.edu; crediting Hondo Public Library.


text:
88 fork lift trucks for pfenning logistics
Logistics fleet meets the highest demands
In the 20-hectare logistics centre owned by pfenning logistics, a fleet of our fork lift trucks forms the basis for efficient material flows. At peak times, the operator increases the already 88-strong fleet at multicube rhein-neckar with rental trucks.
Optimal use of space in narrow aisles
pfenning logistics GmbH is a logistics specialist from Baden-Württemberg. With a capex volume of 100 million euros, pfenning logistics set up a new corporate headquarters and a 20-hectare logistics centre in Heddesheim, the multicube rhein-neckar, in 2013. The goods are stored in two areas of the building: The northern section mainly contains food and other everyday necessities, while chemicals are stored in the southern section. The narrow aisle warehouses account for well over 5,000 pallet movements a day.
In order to use the space optimally, we were involved at an early stage in the development of the space and fleet concept. pfenning logistics had already decided on the rough planning for a concept that focuses on narrow aisle warehouses. For the narrow aisle truck, long operating distances with a single battery charge were important due to the demands of handling food products.
Even faster thanks to telescopic forks
At the heart of the fleet of fork lift trucks are 23 EKX 515 electric high level combination picker/stackers, which are mechanically guided in the aisles. Christopher Granath, Head of Process Engineering at pfenning logistics, explains: "Jungheinrich has kept the aisles very tight at our request, in order to achieve even better use of space. In addition, the narrow aisles in the north and south sections are the same width, so they can also be accessed by the EKX 515".
The EKX 515 narrow aisle trucks are adapted to different requirement profiles and work with energy recovery. The power of these vehicles is based on their 80-volt 3-phase AC technology and their high torque, which ensures effective acceleration. With a lift height of 8.4 metres, the vehicles store goods on Euro pallets or industrial pallets in the north section. For the south section, they were equipped with triplex masts to enable stacking of chemical pallets up to 14.4 metres in height. "We had 16 of them equipped with telescopic forks for a major customer from the food industry. This allows us to benefit from faster warehouse operations and fulfil high throughput levels", says Granath.
The fleet also includes 65 ETV 216, EFG 220 and ERE 225 standard trucks, some of which also provide energy recovery when lowering the load. At peak times, additional rental trucks can be obtained.
Powerful battery management
Christopher Granath says: "Based on selecting the finest technology, we decided in favour of Jungheinrich narrow aisle trucks, of which we already had experience at other locations. Long run times with a single battery charge were fundamental for the purchase. The devices cope easily with two shifts. At times, they even manage three-shift operation around the clock. Energy recovery also contributes to this. This factor was decisive for us when making a purchase".
For us as a supplier, the very short delivery times for rental equipment also worked in our favour according to Granath. Furthermore, we provided flexible support to the company during the implementation phases. For example, when adjusting the speed profiles and lift heights of the 16 EKX 515 vehicles in the north sector — a task that was tackled separately for each of the 66 aisles.
Christopher Granath
Head of Process Engineering at pfenning logistics
"The devices cope easily with two shifts. Energy recovery also contributes to this. This factor was decisive for us when making a purchase."
Do you also want to increase reliability and performance?
Contact us to make an appointment for a consultation.
HelloFresh dishes up with Jungheinrich
Out of the box: Highly efficient food logistics
Thanks to an agile and powerful Jungheinrich rental fleet, HelloFresh Australia delivers its famous cooking boxes with fresh ingredients always in time.
Book logistics with EKX 516 high rack stackers.
Samdistribution in Sweden embraces the latest technology.
At height or on the ground: The EKX 516 high rack stacker with patented "Floor Pro" vibration damping transports every book from A to B safely and efficiently.
Pallet and order-picking warehouse under one roof.
All flowing: intelligent high-bay warehouse integration.
Fully automated processing, 23 metres high: the innovative high-bay and small parts warehousing for KRACHT creates room for growth and maximum productivity.
Central spare parts warehouse in Kaltenkirchen
State-of-the-art central warehouse for spare parts
Due to automated warehouse systems and material handling equipment, Jungheinrich dispatches more than 11,000 spare parts worldwide every day.
Improving logistics at RedMart Singapore
Online grocery shopping the future-proof way
Offline logistics for Online shoppers: RedMart counts on Jungheinrich to deliver a wide range of groceries and daily essentials throughout Singapore.


Spectrum 48kb, 128kb and Pentagon Compatible.
from his fingers. Also Einar Saukas for his marvelous Nirvana Library!
This is my christmas gift to all the Spectrum lovers!
Git clone if you will regularly update z88dk.
Nightly build if you just want to unzip the current build.
Pietro Bros uses zsdcc so linux users should make sure they also build zsdcc.
zsdcc is included among the pre-built Windows and OSX binaries already.
Change "define(`__NIRVANAP_TOTAL_ROWS', 23)" to "define(`__NIRVANAP_TOTAL_ROWS', 19)"
You can also disable wide tiles from Nirvana by changing, to save 300 bytes aprox.
Change "define(`__SPECTRUM', 1)" to "define(`__SPECTRUM', 32)"
Open a shell and go to directory "z88dk/libsrc/_DEVELOPMENT"
-Fix enemies flip, they we're staying on air.


text:
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <vector>

#include <cudnn.h>
#include "nmsPluginOpt.h"
#include "ssdOpt.h"
#include "ssdOptMacros.h"

using namespace nvinfer1;
using nvinfer1::plugin::NMSOptPluginCreator;
using nvinfer1::plugin::DetectionOutputOpt;
using nvinfer1::plugin::DetectionOutputParameters;

namespace
{
const char* NMS_OPT_PLUGIN_STATIC_VERSION{"1"};
const char* NMS_OPT_PLUGIN_DYNAMIC_VERSION{"2"};
const char* NMS_OPT_PLUGIN_NAME{"NMS_OPT_TRT"};
}

REGISTER_TENSORRT_PLUGIN(NMSOptPluginDynamicCreator);
REGISTER_TENSORRT_PLUGIN(NMSOptPluginStaticCreator);

template <class T>
PluginFieldCollection NMSOptPluginCreator<T>::mFC{};
template <class T>
std::vector<PluginField> NMSOptPluginCreator<T>::mPluginAttributes;

template <class T>
DetectionOutputOpt<T>::DetectionOutputOpt(DetectionOutputParameters params,
    bool confSoftmax, int numLayers)
    : param(params), mConfSoftmax(confSoftmax), mNumLayers(numLayers)
{
}

template <class T>
DetectionOutputOpt<T>::DetectionOutputOpt(const void* data, size_t length)
{
    const char* d = reinterpret_cast<const char *>(data);
    const char* a = d;
    param = read<DetectionOutputParameters>(d);
    mConfSoftmax = read<bool>(d);
    mNumLayers = read<int>(d);
    C1 = read<int>(d);
    C2 = read<int>(d);
    numPriors = read<int>(d);
    mFeatureSize.resize(mNumLayers);
    mNumAnchors.resize(mNumLayers);
    mBoxChannels.resize(mNumLayers);
    mConfChannels.resize(mNumLayers);
    for(int i = 0; i < mNumLayers; i++){
        mFeatureSize[i] = read<int>(d);
        mNumAnchors[i] = read<int>(d);
        mBoxChannels[i] = read<int>(d);
        mConfChannels[i] = read<int>(d);
    }
    mPacked32NCHW = read<bool>(d);
    ASSERT(d == a + length);
}

template <class T>
int DetectionOutputOpt<T>::getNbOutputs() const
{
    return 1;
}

template <class T>
int DetectionOutputOpt<T>::initialize()
{
    if (!mInitialized)
    {
        cudnnStatus_t status;
        status = cudnnCreate(&mCudnn);
        ASSERT(status == CUDNN_STATUS_SUCCESS);
        status = cudnnCreateTensorDescriptor(&mInScoreTensorDesc);
        ASSERT(status == CUDNN_STATUS_SUCCESS);
        status = cudnnCreateTensorDescriptor(&mOutScoreTensorDesc);
        ASSERT(status == CUDNN_STATUS_SUCCESS);
    }
    mInitialized = true;
    return 0;
}

template <class T>
void DetectionOutputOpt<T>::terminate()
{
    if (mInitialized)
    {
        cudnnStatus_t status;
        status = cudnnDestroyTensorDescriptor(mInScoreTensorDesc);
        ASSERT(status == CUDNN_STATUS_SUCCESS);
        status = cudnnDestroyTensorDescriptor(mOutScoreTensorDesc);
        ASSERT(status == CUDNN_STATUS_SUCCESS);
        status = cudnnDestroy(mCudnn);
        ASSERT(status == CUDNN_STATUS_SUCCESS);
    }
}

Dims DetectionOutputOptStatic::getOutputDimensions(int index, const Dims* inputs, int nbInputDims)
{
    return DimsCHW(1, param.keepTopK*7 + 1, 1); //detections and keepCount
}

DimsExprs DetectionOutputOptDynamic::getOutputDimensions(int outputIndex, const DimsExprs* inputs, int nbInputs, IExprBuilder& exprBuilder)
{
    const DimsExprs *mergedBoxConfInputs = &inputs[param.inputOrder[0]];
    DimsExprs outDims{4, {mergedBoxConfInputs[0].d[0], exprBuilder.constant(1), exprBuilder.constant(1), exprBuilder.constant(param.keepTopK * 7 + 1)}}; //detections and keepCount

    return outDims;
}

size_t DetectionOutputOptStatic::getWorkspaceSize(int maxBatchSize) const
{
    return detectionInferenceWorkspaceSize(param.shareLocation, maxBatchSize, C1, C2, param.numClasses, numPriors, param.topK, DataType::kFLOAT, DataType::kFLOAT);
}

size_t DetectionOutputOptDynamic::getWorkspaceSize(const PluginTensorDesc* inputs, int nbInputs, const PluginTensorDesc* outputs, int nbOutputs) const
{
    int batchSize = inputs[param.inputOrder[0]].dims.d[0];
    return detectionInferenceWorkspaceSize(param.shareLocation, batchSize, C1, C2, param.numClasses, numPriors, param.topK, DataType::kFLOAT, DataType::kFLOAT);
}

template<class T>
int DetectionOutputOpt<T>::enqueueBase(int batchSize, const void* const* inputs, void* const* outputs, void* workspace, cudaStream_t stream)
{
    const void* const* locData = &inputs[param.inputOrder[0]];
    const void* const* confData = &inputs[param.inputOrder[1]];
    const void* priorData = inputs[param.inputOrder[2]];
    void* topDetections = outputs[0];

    ssdStatus_t status = detectionInferenceOpt(stream,
                                            batchSize,
                                            C1,
                                            C2,
                                            param.shareLocation,
                                            param.varianceEncodedInTarget,
                                            param.backgroundLabelId,
                                            numPriors,
                                            param.numClasses,
                                            param.topK,
                                            param.keepTopK,
                                            param.confidenceThreshold,
                                            param.nmsThreshold,
                                            param.codeType,
                                            DataType::kFLOAT,
                                            locData,
                                            priorData,
                                            DataType::kFLOAT,
                                            confData,
                                            topDetections,
                                            workspace,
                                            param.isNormalized,
                                            param.confSigmoid,
                                            mConfSoftmax,
                                            mNumLayers,
                                            mFeatureSize.data(),
                                            mNumAnchors.data(),
                                            mBoxChannels.data(),
                                            mConfChannels.data(),
                                            mPacked32NCHW,
                                            mCudnn,
                                            mInScoreTensorDesc,
                                            mOutScoreTensorDesc);
    ASSERT(status == STATUS_SUCCESS);
    return 0;
}

int DetectionOutputOptStatic::enqueue(
    int batchSize, const void* const* inputs, void** outputs, void* workspace, cudaStream_t stream)
{
    return enqueueBase(batchSize, inputs, outputs, workspace, stream);
}

int DetectionOutputOptDynamic::enqueue(const PluginTensorDesc* inputDesc, const PluginTensorDesc* outputDesc, const void* const* inputs,
        void* const* outputs, void* workspace, cudaStream_t stream)
{
    return enqueueBase(inputDesc[param.inputOrder[0]].dims.d[0], inputs, outputs, workspace, stream);
}

template <class T>
size_t DetectionOutputOpt<T>::getSerializationSize() const
{
    // DetectionOutputParameters, mConfSoftmax, mNumLayers,C1,C2,numPriors
    return sizeof(DetectionOutputParameters) + sizeof(int) * 4 + sizeof(bool)
        //std::vector<int> mFeatureSize
        //std::vector<int> mNumAnchors
        //std::vector<int> mBoxChannels
        //std::vector<int> mConfChannels
        + sizeof(int)*mNumLayers*4
        //mPacked32NCHW
        + sizeof(bool);
}

template <class T>
void DetectionOutputOpt<T>::serialize(void* buffer) const
{
    char *d = reinterpret_cast<char *>(buffer), *a = d;
    write(d, param);
    write(d, mConfSoftmax);
    write(d, mNumLayers);
    write(d, C1);
    write(d, C2);
    write(d, numPriors);
    for(int i = 0; i < mNumLayers; i++) {
       write(d, mFeatureSize[i]);
       write(d, mNumAnchors[i]);
       write(d, mBoxChannels[i]);
       write(d, mConfChannels[i]);
    }
    write(d, mPacked32NCHW);
    ASSERT(d == a + getSerializationSize());
}

template <class T>
void DetectionOutputOpt<T>::configurePluginBase(const PluginTensorDesc* in, int nbInputs, const PluginTensorDesc* out, int nbOutputs)
{
    constexpr int NB_DIMS = std::is_same<T, IPluginV2IOExt>::value ? 3 : 4;
    constexpr int C_DIM = NB_DIMS - 3;
    constexpr int H_DIM = NB_DIMS - 2;
    constexpr int W_DIM = NB_DIMS - 1;

    ASSERT(out && nbOutputs == 1);
    ASSERT(out[0].dims.nbDims == NB_DIMS);

    ASSERT(in && nbInputs == mNumLayers * 2 + 1); //mNumLayers each for conf/box + 1 for prior

    //prior
    ASSERT(in[param.inputOrder[2]].dims.nbDims == 3);
    numPriors = in[param.inputOrder[2]].dims.d[1] / 4;

    // box and conf are in a single input tensor, merged in C dims
    // box channels come first, then conf channels
    // they should always have same H/W dims
    const PluginTensorDesc* mergedBoxConfInputs = &in[param.inputOrder[0]];

    C1 = 0;
    C2 = 0;
    mFeatureSize.resize(mNumLayers);
    mNumAnchors.resize(mNumLayers);
    mBoxChannels.resize(mNumLayers);
    mConfChannels.resize(mNumLayers);

    // Math to infer #channels only cover shareLocation = true:
    ASSERT(param.shareLocation);
    for(int i = 0; i < mNumLayers; i++) {
        const Dims &mergedBoxConfInputDims = mergedBoxConfInputs[i].dims;
        ASSERT(mergedBoxConfInputDims.nbDims == NB_DIMS);

        // Math to infer #channels:
        // box channels = numAnchors * 4
        // conf channels = numAnchors * numClasses
        // merged channel = box channels + conf channels = numAnchors * (numClasses + 4)
        int mergedChannels = mergedBoxConfInputDims.d[C_DIM];
        ASSERT(mergedChannels % (param.numClasses + 4) == 0);
        mNumAnchors[i] = mergedChannels / (param.numClasses + 4);
        mBoxChannels[i] = mNumAnchors[i] * 4;
        mConfChannels[i] = mNumAnchors[i] * param.numClasses;
        int flattenBoxInput = mBoxChannels[i] * mergedBoxConfInputDims.d[H_DIM] * mergedBoxConfInputDims.d[W_DIM];
        int flattenConfInput = mConfChannels[i] * mergedBoxConfInputDims.d[H_DIM] * mergedBoxConfInputDims.d[W_DIM];
        C1 += flattenBoxInput;
        C2 += flattenConfInput;

        ASSERT(mBoxChannels[i] / 4 == mConfChannels[i] / param.numClasses);

        mFeatureSize[i] = mergedBoxConfInputDims.d[H_DIM]; //ASSERT H=W
    }

    const int numLocClasses = param.shareLocation ? 1 : param.numClasses;
    ASSERT(numPriors * numLocClasses * 4 == C1);
    ASSERT(numPriors * param.numClasses == C2);

    //Check types and format
    for(int i = 0; i < mNumLayers; i++) {
        const auto inputType = mergedBoxConfInputs[i].type;
        const auto inputFormat = mergedBoxConfInputs[i].format;
        if(i == 0) {
            ASSERT(inputType == DataType::kFLOAT && (inputFormat == TensorFormat::kCHW32 || inputFormat == TensorFormat::kLINEAR));
            mPacked32NCHW = (inputFormat == TensorFormat::kCHW32);
        }
        else {
            ASSERT(inputType == DataType::kFLOAT && inputFormat == mergedBoxConfInputs[0].format);
        }

    }
    ASSERT(in[param.inputOrder[2]].type == DataType::kFLOAT && in[param.inputOrder[2]].format == TensorFormat::kLINEAR);
    ASSERT(out[0].type == DataType::kFLOAT && out[0].format == TensorFormat::kLINEAR);
}

void DetectionOutputOptStatic::configurePlugin(const PluginTensorDesc* in, int nbInputs, const PluginTensorDesc* out, int nbOutputs)
{
    configurePluginBase(in, nbInputs, out, nbOutputs);
}

void DetectionOutputOptDynamic::configurePlugin(const DynamicPluginTensorDesc* in, int nbInputs, const DynamicPluginTensorDesc* out, int nbOutputs)
{
    std::vector<PluginTensorDesc> inDesc(nbInputs);
    std::transform(in, in + nbInputs, inDesc.begin(), [](const DynamicPluginTensorDesc& i){ return i.desc; });
    std::vector<PluginTensorDesc> outDesc(nbOutputs);
    std::transform(out, out + nbOutputs, outDesc.begin(), [](const DynamicPluginTensorDesc& i){ return i.desc; });
    configurePluginBase(inDesc.data(), nbInputs, outDesc.data(), nbOutputs);
}

template <class T>
bool DetectionOutputOpt<T>::supportsFormatCombinationBase(int pos, const PluginTensorDesc* inOut, int nbInputs, int nbOutputs) const
{
    ASSERT(nbInputs == mNumLayers * 2 + 1); //mNumLayers each for conf/box + 1 for prior
    ASSERT(nbOutputs == 1);

    bool rtn;
    if((pos >= param.inputOrder[0] && pos < param.inputOrder[0] + mNumLayers) //boxInput
        || (pos >= param.inputOrder[1] && pos < param.inputOrder[1] + mNumLayers)) //confInput
    {
        //use fp32 NC/32HW32
        rtn = inOut[pos].type == DataType::kFLOAT && (inOut[pos].format == TensorFormat::kCHW32 || inOut[pos].format == TensorFormat::kLINEAR);
        if(param.inputOrder[0] < param.inputOrder[1]) {
            rtn &= (inOut[pos].format == inOut[param.inputOrder[0]].format);
        }
        else {
            rtn &= (inOut[pos].format == inOut[param.inputOrder[1]].format);
        }
    }
    else if(pos == param.inputOrder[2]) //prior, just uses fp32 NCHW
    {
        rtn = inOut[pos].type == DataType::kFLOAT && inOut[pos].format == TensorFormat::kLINEAR;
    }
    else {
        ASSERT(pos == nbInputs); // output
        rtn = inOut[pos].type == DataType::kFLOAT && inOut[pos].format == TensorFormat::kLINEAR;
    }

    return rtn;
}

bool DetectionOutputOptStatic::supportsFormatCombination(int pos, const PluginTensorDesc* inOut, int nbInputs, int nbOutputs) const
{
    return supportsFormatCombinationBase(pos, inOut, nbInputs, nbOutputs);
}

bool DetectionOutputOptDynamic::supportsFormatCombination(int pos, const PluginTensorDesc* inOut, int nbInputs, int nbOutputs)
{
    return supportsFormatCombinationBase(pos, inOut, nbInputs, nbOutputs);
}

template <class T>
DataType DetectionOutputOpt<T>::getOutputDataType(int index, const DataType* inputTypes, int nbInputs) const
{
    ASSERT(index == 0);
    ASSERT(nbInputs == mNumLayers * 2 + 1);
    return DataType::kFLOAT;
}

template <class T>
const char* DetectionOutputOpt<T>::getPluginType() const { return NMS_OPT_PLUGIN_NAME; }

const char* DetectionOutputOptStatic::getPluginVersion() const { return NMS_OPT_PLUGIN_STATIC_VERSION; }
const char* DetectionOutputOptDynamic::getPluginVersion() const { return NMS_OPT_PLUGIN_DYNAMIC_VERSION; }

template <class T>
void DetectionOutputOpt<T>::destroy() { delete this; }

template <class T>
template <class Derived>
T* DetectionOutputOpt<T>::cloneBase() const
{
    Derived* plugin = new Derived(*static_cast<const Derived*>(this));
    return plugin;
}

IPluginV2Ext* DetectionOutputOptStatic::clone() const
{
    return cloneBase<DetectionOutputOptStatic>();
}

IPluginV2DynamicExt* DetectionOutputOptDynamic::clone() const
{
    return cloneBase<DetectionOutputOptDynamic>();
}

bool DetectionOutputOptStatic::isOutputBroadcastAcrossBatch(int outputIndex, const bool* inputIsBroadcasted, int nbInputs) const
{
    return false;
}

bool DetectionOutputOptStatic::canBroadcastInputAcrossBatch(int inputIndex) const
{
    return inputIndex == param.inputOrder[2]; // prior
}

template <class T>
NMSOptPluginCreator<T>::NMSOptPluginCreator()
{
    mPluginAttributes.emplace_back(PluginField("shareLocation", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("varianceEncodedInTarget", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("backgroundLabelId", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("numClasses", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("topK", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("keepTopK", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("confidenceThreshold", nullptr, PluginFieldType::kFLOAT32, 1));
    mPluginAttributes.emplace_back(PluginField("nmsThreshold", nullptr, PluginFieldType::kFLOAT32, 1));
    mPluginAttributes.emplace_back(PluginField("inputOrder", nullptr, PluginFieldType::kINT32, 3));
    mPluginAttributes.emplace_back(PluginField("confSigmoid", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("confSoftmax", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("isNormalized", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("codeType", nullptr, PluginFieldType::kINT32, 1));
    mPluginAttributes.emplace_back(PluginField("numLayers", nullptr, PluginFieldType::kINT32, 1));

    mFC.nbFields = mPluginAttributes.size();
    mFC.fields = mPluginAttributes.data();
}

template <class T>
const char* NMSOptPluginCreator<T>::getPluginName() const
{
    return NMS_OPT_PLUGIN_NAME;
}

template <class T>
const char* NMSOptPluginCreator<T>::getPluginVersion() const
{
    if (std::is_same<T, DetectionOutputOptStatic>::value)
    {
        return NMS_OPT_PLUGIN_STATIC_VERSION;
    }
    if (std::is_same<T, DetectionOutputOptDynamic>::value)
    {
        return NMS_OPT_PLUGIN_DYNAMIC_VERSION;
    }
    return "";
}

template <class T>
const PluginFieldCollection* NMSOptPluginCreator<T>::getFieldNames()
{
    return &mFC;
}

template <class T>
IPluginV2* NMSOptPluginCreator<T>::createPlugin(const char* name, const PluginFieldCollection* fc)
{
    const PluginField* fields = fc->fields;
    //Default init values for TF SSD network
    params.codeType = CodeTypeSSD::TF_CENTER;
    params.inputOrder[0] = 0;
    params.inputOrder[1] = 7;
    params.inputOrder[2] = 6;

    for (int i = 0; i < fc->nbFields; ++i)
    {
        const char* attrName = fields[i].name;
        if (!strcmp(attrName, "shareLocation"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            params.shareLocation = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "varianceEncodedInTarget"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            params.varianceEncodedInTarget = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "backgroundLabelId"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            params.backgroundLabelId = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "numClasses"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            params.numClasses = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "topK"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            params.topK = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "keepTopK"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            params.keepTopK = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "confidenceThreshold"))
        {
            ASSERT(fields[i].type == PluginFieldType::kFLOAT32);
            params.confidenceThreshold = static_cast<float>(*(static_cast<const float*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "nmsThreshold"))
        {
            ASSERT(fields[i].type == PluginFieldType::kFLOAT32);
            params.nmsThreshold = static_cast<float>(*(static_cast<const float*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "confSigmoid"))
        {
            params.confSigmoid = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "confSoftmax"))
        {
            mConfSoftmax = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "isNormalized"))
        {
            params.isNormalized = static_cast<int>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "inputOrder"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            int size = fields[i].length;
            const int* o = static_cast<const int*>(fields[i].data);
            for (int j = 0; j < size; j++)
            {
                params.inputOrder[j] = *o;
                o++;
            }
        }
        else if (!strcmp(attrName, "codeType"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            params.codeType = static_cast<CodeTypeSSD>(*(static_cast<const int*>(fields[i].data)));
        }
        else if (!strcmp(attrName, "numLayers"))
        {
            ASSERT(fields[i].type == PluginFieldType::kINT32);
            mNumLayers = *(static_cast<const bool*>(fields[i].data));
        }

    }

    return new T(params, mConfSoftmax, mNumLayers);
}

template <class T>
IPluginV2* NMSOptPluginCreator<T>::deserializePlugin(const char* name, const void* serialData, size_t serialLength)
{
    //This object will be deleted when the network is destroyed, which will
    //call NMS::destroy()
    return new T(serialData, serialLength);
}

redpajama_set_name: RedPajamaGithub


The legendary indoor shoe will take your game to the next level.
Full grain leather upper with brushed nylon quarter lining and half-molded tongue.
Lace-up closure provides a snug fit.
Soft textile lining feels great on your feet.
Low-profile gum rubber outsole gives the elite player ultimate control.